ZGlmZiAtLWdpdCBhL0FOTk9VTkNFIGIvQU5OT1VOQ0UKaW5kZXggOTkzODdmYi4uM2ViMDJlNCAxMDA2NDQKLS0tIGEvQU5OT1VOQ0UKKysrIGIvQU5OT1VOQ0UKQEAgLTEsMTMgKzEsMTQgQEAKLVRoaXMgaXMgcmVsZWFzZSA5ODAzMDEgb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKK1RoaXMgaXMgcmVsZWFzZSA5ODAzMTUgb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKIGRldmVsb3BlcidzIG9ubHkgcmVsZWFzZS4gIFRoZXJlIGFyZSBtYW55IGJ1Z3MgYW5kIG1hbnkgdW5pbXBsZW1lbnRlZCBBUEkKIGZlYXR1cmVzLiAgTW9zdCBhcHBsaWNhdGlvbnMgc3RpbGwgZG8gbm90IHdvcmsgY29ycmVjdGx5LgogCiBQYXRjaGVzIHNob3VsZCBiZSBzdWJtaXR0ZWQgdG8gImp1bGxpYXJkQGxyYy5lcGZsLmNoIi4gIFBsZWFzZSBkb24ndAogZm9yZ2V0IHRvIGluY2x1ZGUgYSBDaGFuZ2VMb2cgZW50cnkuCiAKLVdIQVQnUyBORVcgd2l0aCBXaW5lLTk4MDMwMTogKHNlZSBDaGFuZ2VMb2cgZm9yIGRldGFpbHMpCi0JLSBOZXcgZGVidWdnaW5nIHByaW50ZnMgc2NoZW1lLgotCS0gQmV0dGVyIERPUyBkZXZpY2UgaGFuZGxpbmcuCitXSEFUJ1MgTkVXIHdpdGggV2luZS05ODAzMTU6IChzZWUgQ2hhbmdlTG9nIGZvciBkZXRhaWxzKQorCS0gUHJlbGltaW5hcnkgSW1hZ2VMaXN0cyBzdXBwb3J0LgorCS0gQmVnaW5uaW5ncyBvZiBlbmhhbmNlZCBtZXRhZmlsZXMuCisJLSBNb3JlIGRlYnVnZ2luZyBtYWNyb3MgY2hhbmdlcy4KIAktIExvdHMgb2YgYnVnIGZpeGVzLgogCiBTZWUgdGhlIFJFQURNRSBmaWxlIGluIHRoZSBkaXN0cmlidXRpb24gZm9yIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMuCkBAIC0xNiwxMCArMTcsMTAgQEAKIHRoZSByZWxlYXNlIGlzIGF2YWlsYWJsZSBhdCB0aGUgZnRwIHNpdGVzLiAgVGhlIHNvdXJjZXMgd2lsbCBiZSBhdmFpbGFibGUKIGZyb20gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6CiAKLSAgZnRwOi8vc3Vuc2l0ZS51bmMuZWR1L3B1Yi9MaW51eC9BTFBIQS93aW5lL2RldmVsb3BtZW50L1dpbmUtOTgwMzAxLnRhci5negotICBmdHA6Ly90c3gtMTEubWl0LmVkdS9wdWIvbGludXgvQUxQSEEvV2luZS9kZXZlbG9wbWVudC9XaW5lLTk4MDMwMS50YXIuZ3oKLSAgZnRwOi8vZnRwLmluZm9tYWdpYy5jb20vcHViL21pcnJvcnMvbGludXgvd2luZS9kZXZlbG9wbWVudC9XaW5lLTk4MDMwMS50YXIuZ3oKLSAgZnRwOi8vZnRwLnByb2dzb2MudXRzLmVkdS5hdS9wdWIvV2luZS9kZXZlbG9wbWVudC9XaW5lLTk4MDMwMS50YXIuZ3oKKyAgZnRwOi8vc3Vuc2l0ZS51bmMuZWR1L3B1Yi9MaW51eC9BTFBIQS93aW5lL2RldmVsb3BtZW50L1dpbmUtOTgwMzE1LnRhci5negorICBmdHA6Ly90c3gtMTEubWl0LmVkdS9wdWIvbGludXgvQUxQSEEvV2luZS9kZXZlbG9wbWVudC9XaW5lLTk4MDMxNS50YXIuZ3oKKyAgZnRwOi8vZnRwLmluZm9tYWdpYy5jb20vcHViL21pcnJvcnMvbGludXgvd2luZS9kZXZlbG9wbWVudC9XaW5lLTk4MDMxNS50YXIuZ3oKKyAgZnRwOi8vZnRwLnByb2dzb2MudXRzLmVkdS5hdS9wdWIvV2luZS9kZXZlbG9wbWVudC9XaW5lLTk4MDMxNS50YXIuZ3oKIAogSXQgc2hvdWxkIGFsc28gYmUgYXZhaWxhYmxlIGZyb20gYW55IHNpdGUgdGhhdCBtaXJyb3JzIHRzeC0xMSBvciBzdW5zaXRlLgogCmRpZmYgLS1naXQgYS9BVVRIT1JTIGIvQVVUSE9SUwppbmRleCA0NTgwODQ1Li40MDJkZWQ5IDEwMDY0NAotLS0gYS9BVVRIT1JTCisrKyBiL0FVVEhPUlMKQEAgLTU1LDExICs1NSwxMyBAQAogSm9jaGVuIEthcnJlciwKIEFuZHJlYXMgS2lyc2NoYmF1bSwKIEFsYnJlY2h0IEtsZWluZSwKK0VyaWMgS29obCwKIEpvbiBLb25yYXRoLAogQWxleCBLb3JvYmthLAogR3JlZyBLcmVpZGVyLAogQW5hbmQgS3VtcmlhLAogU2NvdHQgQS4gTGFpcmQsCitEYXZpZCBMZWUgTGFtYmVydCwKIEFuZHJldyBMZXd5Y2t5LAogTWFydGluIHZvbiBMb2V3aXMsCiBNaWNoaWVsIHZhbiBMb29uLApAQCAtMTMxLDQgKzEzMyw1IEBACiBKYW1lcyBZb3VuZ21hbiwKIE5pa2l0YSBWLiBZb3VzaGNoZW5rbywKIE1pa29sYWogWmFsZXdza2ksCi1hbmQgSm9obiBaZXJvLgorSm9obiBaZXJvLAorYW5kIEx1aXogT3RhdmlvIEwuIFpvcnplbGxhLgpkaWZmIC0tZ2l0IGEvQ2hhbmdlTG9nIGIvQ2hhbmdlTG9nCmluZGV4IGE3N2NkYzMuLjcxZDZlYzIgMTAwNjQ0Ci0tLSBhL0NoYW5nZUxvZworKysgYi9DaGFuZ2VMb2cKQEAgLTEsNSArMSwxMzUgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVN1biBGZWIgMjkgMTA6NDU6MjMgMTk5NyAgQW5kcmVhcyBNb2hyIDwxMDAuMzA5MzZAZ2VybWFueS5uZXQ+CitTdW4gTWFyIDE1IDAzOjQ2OjUwIDE5OTggIERpbWl0cmllIE8uIFBhdW4gIDxkaW1pQG1haWwuY3MudG9yb250by5lZHU+CisKKwkqIFsqLypdCisJRml4ZWQgc29tZSBkcHJpbnRmXyBzdWNoIHRoYXQgdGhlcmUgaXMgb25lIGFuZCBvbmx5IG9uZQorCW5ldyBsaW5lIGZvciBlYWNoIGRwcmludGYgYW5kIHRoYXQgbmV3IGxpbmUgb2NjdXJzIGF0IHRoZSBlbmQuCisJVHJhbnNmb3JtZWQgc29tZSBmcHJpbnRmcyBpbnRvIHByb3BlciBkZWJ1ZyBzdGF0ZW1lbnRzLgorCVJlbW92ZWQgbXVjaCByZWR1bmRhbmN5IGZyb20gbW9zdCBvZiB0aGUgZGVidWcgc3RhdGVtZW50cy4gVGhlCisJcmVkdW5kYW5jeSBhcHBlYXJlZCBiZWNhdXNlIG5vdyB0aGUgY29tcG9uZW50IGFuZCBmdW5jdGlvbgorCW5hbWUgaXMgb3V0cHV0IGF1dG9tYXRpY2FsbHkuIE1vc3QgZGVidWcgc3RhdGVtZW50cyBhbHNvIHVzZWQgdG8KKwlvdXRwdXQgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLgorCUFsbCB0aGVzZSBjaGFuZ2VzIHByZXBhcmVkIHRoZSBzb3VyY2UgdG8gc3dpdGNoIGNvbXBsZXRlbHkgdG8KKwl0aGUgbmV3IGRlYnVnZ2luZyBpbnRlcmZhY2UuCisJRm9yIG1vcmUgaW5mbywgcmVmZXIgdG8gLi9kb2N1bWVudGF0aW9uL2RlYnVnLW1zZworCitTYXQgTWFyIDE0IDE5OjQ1OjIzIDE5OTcgIEFuZHJlYXMgTW9ociA8MTAwLjMwOTM2QGdlcm1hbnkubmV0PgorCisJKiBbbWlzYy9zaGVsbC5jXSBbaWYxNjMyL2tlcm5lbC5zcGVjXQorCUNoYW5nZWQgcGFyYW1ldGVycyBvZiBGVU5DMDA0KCkgdG8gZml4IGEgY3Jhc2guCisJTm90IHN1cmUgaWYgdGhpcyBmaXggaXMgY29ycmVjdCAoZG9jIHdhbnRlZCkuCisKKwkqIFt3aW5kb3dzL3VzZXIuY10gW2lmMTYzMi91c2VyLnNwZWNdIFtpbmNsdWRlL3VzZXIuaF0KKwlJbXBsZW1lbnRlZCBVc2VyU2VlVXNlckRvLgorCisJKiBbbXNkb3MvaW50MjEuY10gW2luY2x1ZGUvbXNkb3MuaF0KKwlBZGRlZCAiR0VUIExJU1QgT0YgTElTVFMiIChJTlQgMjEvNTJoKS4KKworU2F0IE1hciAxNCAxNTo0ODowMiAxOTk4ICBEb3VnbGFzIFJpZGd3YXkgPHJpZGd3YXlAZ21jbC5jb20+CisKKwkqIFtpbmNsdWRlL3dpbmRvd3MuaF0gW3JlbGF5MzIvZ2RpMzIuc3BlY10gW29iamVjdHMvZW5obWV0YWZpbGUuY10KKwlCZWdpbm5pbmdzIG9mIGVuaGFuY2VkIG1ldGFmaWxlIHN1cHBvcnQuCisKK0ZyaSBNYXIgMTMgMjA6NTM6MDkgMTk5OCAgSm9obiBSaWNoYXJkc29uIDxqcmljaGFyZEB6a28uZGVjLmNvbT4KKworCSogW3dpbjMyL2NvbnNvbGUuY10KKwlSZXN0YXJ0IGludGVycnVwdGVkIGNvbnNvbGUgd3JpdGVzLgorCitGcmkgTWFyIDEzIDE4OjU5OjI0IDE5OTggIE1hdHRoZXcgQmVja2VyIDxtYmVja2VyQGdsYXNzY2l0eS5uZXQ+CisKKwkqIFsqLyouY10KKwlVcGRhdGVkIGRvY3VtZW50YXRpb24gZm9yIEFQSSBtYW5wYWdlcy4KKworCSogW3dpbmRvd3MvZGNlLmNdCisJUmVsZWFzZURDMTY6IEZpeGVkIGNhc3QuCisKKwkqIFtpbmNsdWRlL3dpbmRvd3MuaF0gW21lbW9yeS92aXJ0dWFsLmNdCisJVmlydHVhbFF1ZXJ5e0V4fSBzaG91bGQgcmV0dXJuIERXT1JEIGluc3RlYWQgb2YgQk9PTDMyLgorCitGcmkgTWFyIDEzIDEzOjAzOjA2IDE5OTggIE1hcmN1cyBNZWlzc25lciA8bXNtZWlzc25AY2lwLmluZm9ybWF0aWsudW5pLWVybGFuZ2VuLmRlPgorCisJKiBbUkVBRE1FXVtkb2N1bWVudGF0aW9uL3N0YXR1cy9dCisJUkVBRE1FIHVwZGF0ZWQsIGFkZGVkIGx6ZXhwYW5kLHZlcnNpb24gYW5kIG11bHRpbWVkaWEKKwlzdGF0dXMgbm90ZXMgdG8gbmV3IGRvY3VtZW50YXRpb24vc3RhdHVzIGRpcmVjdG9yeS4KKworCSogW29sZS8qLmNdW2lmMTYzMi90eXBlbGliLnNwZWNdCisJQWRkZWQgdHlwZWxpYiBzdHVicywgc2V2ZXJhbCBzbWFsbCBhZGRpdGlvbnMgYW5kIGZpeGVzLgorCisJKiBbbG9hZGVyL3BlX2ltYWdlLmNdCisJRml4ZWQgYSBzbWFsbCBidWcgKGZpeHVwX2ltcG9ydHMgZ290IHBhc3NlZCB0aGUgd3JvbmcgaE1vZHVsZSBpbiBhCisJcmVtYXBjYXNlKS4KKworCSogW2xvYWRlci9zaWduYWwuY11baWYxNjMyL3NpZ25hbC5jXVttaXNjL3dpbnNvY2tfZG5zLmNdCisJICBbbG9hZGVyL21vZHVsZS5jXQorCUZpeGVkIHNvbWUgcmVjdXJzaXZlIGRlYnVnZ2VyIGNyYXNoZXMgKGNhdXNlZCBieSBpbnZhbGlkIEZTKS4KKworCSogW21pc2MvcmVnaXN0cnkuY10KKwlUd28gYnVncyBmaXhlZC4KKworRnJpIE1hciAxMyAwNDo1NTowMSAxOTk4ICBEYXZpZCBMZWUgTGFtYmVydCA8bGFtYmVyNDVAZWdyLm1zdS5lZHU+CisKKwkqIFtpbmNsdWRlL3dpbm50LmhdIFtpbmNsdWRlL3dpbm5scy5oXQorCU1vdmVkIExBTkdfeHh4IGZsYWdzIHRvIHdpbm5scy5oCisKKwkqIFtpbmNsdWRlL3dpbm5scy5oXQorCUFkZGVkIGZsYWdzIGZvciBHZXREYXRlRm9ybWF0KCk7IGZpeGVkIHZhbGlkaXR5IG9mCisJTE9DQUxFX1NZU1RFTV9ERUZBVUxULgorCisJKiBbaW5jbHVkZS93aW5kb3dzLmhdIAorCUFkZGVkIEdldFRpbWVGb3JtYXQoKSBwcm90b3R5cGVzLgorCisJKiBbb2xlL29sZTJubHMuY10KKwlJbXBsZW1lbnRlZCBBU0NJSSBkYXRlLSBhbmQgdGltZS1mdW5jdGlvbnMsICB1c2luZyBhbgorCW9wdGltaXplZCBjb21tb24gY29yZTsgIGFkZGVkIHN0dWJzIGZvciBVbmljb2RlIHZlcnNpb25zOyAgCisJc3RhcnRlZCB3b3JrIG9uIGEgVW5pY29kZSBjb3JlLgorCisJKiBbQVVUSE9SU10KKwlBZGRlZCBteSBuYW1lLgorCitNb24gTWFyICA5IDIwOjEwOjE1IDE5OTggIEVyaWMgS29obCA8ZWtvaGxAYWJvLnJoZWluLXplaXR1bmcuZGU+CisKKwkqIFtyZWxheTMyL2NvbWN0bDMyLnNwZWNdIFtpbmNsdWRlL2ltYWdlbGlzdC5oXQorCSAgW2luY2x1ZGUvY29tbWN0cmwuaF0gW21pc2MvaW1hZ2VsaXN0LmNdIFttaXNjL01ha2VmaWxlLmluXQorCUZpcnN0IGF0dGVtcHQgYXQgaW1wbGVtZW50aW5nIEltYWdlTGlzdHMuCisKK1N1biBNYXIgIDggMjA6MTk6NDkgMTk5OCAgVXdlIEJvbm5lcyAgPGJvbkBlbGVrdHJvbi5pa3AucGh5c2lrLnR1LWRhcm1zdGFkdC5kZT4KKworCSogW2ZpbGVzL2Rvc19mcy5jXSBbY29uZmlndXJlLmluXQorCVRyeSB0byBnZXQgRmlsZVRpbWVUb0xvY2FsRmlsZVRpbWUsRmlsZVRpbWVUb1N5c3RlbVRpbWUgYW5kCisJU3lzdGVtVGltZVRvRmlsZVRpbWUgcmlnaHQuCisJVXNlIHRpbWVnbSgpIHdoZXJlIGF2YWlsYWJsZS4KKworCSogW21pc2MvbHN0ci5jXQorCUZpeCBhbiBvZmYgYnkgb25lIGVycm9yIGluIEZvcm1hdE1lc3NhZ2UgYW5kIGhhbmRsZSB0aGUgY2FzZSAKKwl3aGVuIGFyZ3MgPSBOVUxMICh1c2VkIGJ5IHByb2dyYW1zIHRvIGdldCB0aGUgbGVuZ3RoIG9mIHRoZSAKKwlzdHJpbmcpLgorCisJKiBbd2luMzIvY29uc29sZS5jXQorCUFjdHVhbCBkaXNwbGF5IGEgcGVyLXByb2Nlc3MgVGl0bGUgc3RyaW5nLCBiZXR0ZXIgd29ya2luZworCWF0dGVtcHQgZm9yIFdyaXRlQ29uc29sZTMyVyBhbmQgUmVhZENvbnNvbGUzMlcuCisKK0ZyaSBNYXIgIDYgMjA6MzM6NDUgMTk5OCAgU2xhdmVuIFJlemljICA8ZXNlcnRlQGNzLnR1LWJlcmxpbi5kZT4KKworCSogW2luY2x1ZGUvY29uZmlnLmguaW5dW2NvbmZpZ3VyZS5pbl1bbXVsdGltZWRpYS9hdWRpby5jXQorCSAgW211bHRpbWVkaWEvZHNvdW5kLmNdCisJQWRkZWQgY2hlY2sgZm9yIEZyZWVCU0Qgc291bmQgc3lzdGVtLgorCitTdW4gTWFyICAxIDE3OjQwOjEwIDE5OTggIEphc29uIFNjaG9uYmVyZyA8c2Nob25AbXRpLnNnaS5jb20+CisKKwkqIFtjb250cm9scy9lZGl0LmNdIFtpbmNsdWRlL29sZS5oXSBbaW5jbHVkZS9zaGxvYmouaF0KKwlSZW1vdmVkIGZpbmFsIGNvbW1hcyBpbiBlbnVtIHR5cGVzLgorCitNb24gRmViIDIzIDA3OjUyOjE4IDE5OTggIEx1aXogT3RhdmlvIEwuIFpvcnplbGxhICA8em9yemVsbGFAbnIuY29uZXh3YXJlLmNvbT4KKworCSogW211bHRpbWVkaWEvdGltZS5jXQorCVdvcmthcm91bmQgdG8gYXZvaWQgaW5maW5pdGUgcmVjdXJzaW9uIGluc2lkZSB0aW1lR2V0VGltZS4KKworCSogW211bHRpbWVkaWEvYXVkaW8uY10KKwlXT0RNX0dFVE5VTURFVlMgYW5kIFdJRE1fR0VUTlVNREVWUyBvbmx5IHJldHVybiAxIG5vdyBpZiB0aGUKKwlTT1VORF9ERVYgY2FuIGJlIG9wZW5lZCwgb3IgaWYgaXQncyBidXN5LgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTdW4gTWFyICAxIDEwOjQ1OjIzIDE5OTggIEFuZHJlYXMgTW9ociA8MTAwLjMwOTM2QGdlcm1hbnkubmV0PgogCiAJKiBbbG9hZGVyL25lX2ltYWdlLmNdCiAJRml4ZWQgcHJvYmxlbSB3aXRoIHdlaXJkIERMTHMgKE5FX0ZGTEFHU19TSU5HTEVEQVRBICYmIERHUk9VUCA9IDApLgpkaWZmIC0tZ2l0IGEvUkVBRE1FIGIvUkVBRE1FCmluZGV4IGJkOTAwZTIuLmRkNTZiYTEgMTAwNjQ0Ci0tLSBhL1JFQURNRQorKysgYi9SRUFETUUKQEAgLTExLDE3ICsxMSwyMCBAQAogCiAyLiBDT01QSUxBVElPTgogCi1Zb3UgbXVzdCBoYXZlIG9uZSBvZjoKK1RvIGNvbXBpbGUgdGhlIGVtdWxhdG9yLCB5b3UgbXVzdCBoYXZlIG9uZSBvZjoKIAogCUxpbnV4IHZlcnNpb24gMC45OS4xMyBvciBhYm92ZQogCU5ldEJTRC1jdXJyZW50CiAJRnJlZUJTRC1jdXJyZW50IG9yIEZyZWVCU0QgMS4xCiAJT3BlbkJTRC9pMzg2IDIuMSBvciBsYXRlcgorCVNvbGFyaXMgeDg2IDIuNSBvciBsYXRlcgogCiBZb3UgYWxzbyBuZWVkIHRvIGhhdmUgbGliWHBtIGluc3RhbGxlZCBvbiB5b3VyIHN5c3RlbS4gVGhlIHNvdXJjZXMgZm9yCiBpdCBhcmUgcHJvYmFibHkgYXZhaWxhYmxlIG9uIHRoZSBmdHAgc2l0ZSB3aGVyZSB5b3UgZ290IFdpbmUuIFRoZXkgY2FuCiBhbHNvIGJlIGZvdW5kIG9uIGZ0cC54Lm9yZyBhbmQgYWxsIGl0cyBtaXJyb3Igc2l0ZXMuCiAKK09uIHg4NiBTeXN0ZW1zIGdjYyA+PSAyLjcuMCBpcyByZXF1aXJlZC4gWW91IHdpbGwgcHJvYmFibHkgbmVlZCBmbGV4IHRvby4KKwogVG8gYnVpbGQgV2luZSwgZmlyc3QgZG8gYSAiLi9jb25maWd1cmUiIGFuZCB0aGVuIGEgIm1ha2UgZGVwZW5kOyBtYWtlIi4KIFRoaXMgd2lsbCBidWlsZCB0aGUgbGlicmFyeSAibGlid2luZS5hIiBhbmQgdGhlIHByb2dyYW0gIndpbmUiLgogCmRpZmYgLS1naXQgYS9jb25maWd1cmUgYi9jb25maWd1cmUKaW5kZXggMGFhZGZhMy4uZjFhMmU2ZiAxMDA3NTUKLS0tIGEvY29uZmlndXJlCisrKyBiL2NvbmZpZ3VyZQpAQCAtMjA2OSwyMiArMjA2OSw2MSBAQAogCiBlY2hvICIkYWNfdCIiJGFjX2N2X2Nfb3BlbnNvdW5kc3lzdGVtIiAxPiY2CiAKLWlmIHRlc3QgIiRhY19jdl9jX29wZW5zb3VuZHN5c3RlbSIgPSAieWVzIgorZWNobyAkYWNfbiAiY2hlY2tpbmcgImZvciBPcGVuIFNvdW5kIFN5c3RlbSBvbiAqQlNEIiIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjA3NDogY2hlY2tpbmcgImZvciBPcGVuIFNvdW5kIFN5c3RlbSBvbiAqQlNEIiIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19vcGVuc291bmRzeXN0ZW1fYnNkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjA3OSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8bWFjaGluZS9zb3VuZGNhcmQuaD4KK2ludCBtYWluKCkgeworCisvKiBjaGVjayBmb3Igb25lIG9mIHRoZSBPcGVuIFNvdW5kIFN5c3RlbSBzcGVjaWZpYyBTTkRDVExfIGRlZmluZXMgKi8KKyNpZiAhZGVmaW5lZChTTkRDVExfRFNQX1NURVJFTykKKyNlcnJvciBObyBvcGVuIHNvdW5kIHN5c3RlbQorI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDkxOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfY19vcGVuc291bmRzeXN0ZW1fYnNkPSJ5ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2Nfb3BlbnNvdW5kc3lzdGVtX2JzZD0ibm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2Nfb3BlbnNvdW5kc3lzdGVtX2JzZCIgMT4mNgorCitpZiB0ZXN0ICIkYWNfY3ZfY19vcGVuc291bmRzeXN0ZW0iID0gInllcyIgLW8gIiRhY19jdl9jX29wZW5zb3VuZHN5c3RlbV9ic2QiID0gInllcyIKIHRoZW4KICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKICNkZWZpbmUgSEFWRV9PU1MgMQogRU9GCiAKKyAgICBpZiB0ZXN0ICIkYWNfY3ZfY19vcGVuc291bmRzeXN0ZW1fYnNkIiA9ICJ5ZXMiCisgICAgdGhlbgorICAgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9NQUNISU5FX1NPVU5EQ0FSRF9IIDEKK0VPRgorCisgICAgZmkKIGZpCiAKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgImZvciB1bmlvbiBzZW11biIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwODM6IGNoZWNraW5nICJmb3IgdW5pb24gc2VtdW4iIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyMTIyOiBjaGVja2luZyAiZm9yIHVuaW9uIHNlbXVuIiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY191bmlvbl9zZW11bicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIwODggImNvbmZpZ3VyZSIKKyNsaW5lIDIxMjcgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9zZW0uaD4KQEAgLTIwOTIsNyArMjEzMSw3IEBACiB1bmlvbiBzZW11biBmb28KIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDk2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxMzU6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBhY19jdl9jX3VuaW9uX3NlbXVuPSJ5ZXMiCiBlbHNlCkBAIC0yMTIwLDcgKzIxNTksNyBAQAogdGhlbgogICBDRkxBR1M9IiRDRkxBR1MgLVdhbGwiCiAgIGVjaG8gJGFjX24gImNoZWNraW5nICJmb3IgZ2NjIHN0cmVuZ3RoLXJlZHVjZSBidWciIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTI0OiBjaGVja2luZyAiZm9yIGdjYyBzdHJlbmd0aC1yZWR1Y2UgYnVnIiIgPiY1CitlY2hvICJjb25maWd1cmU6MjE2MzogY2hlY2tpbmcgImZvciBnY2Mgc3RyZW5ndGgtcmVkdWNlIGJ1ZyIiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfZ2NjX3N0cmVuZ3RoX2J1Zycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC0yMTI4LDcgKzIxNjcsNyBAQAogICBhY19jdl9jX2djY19zdHJlbmd0aF9idWc9InllcyIKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjEzMiAiY29uZmlndXJlIgorI2xpbmUgMjE3MSAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAKIGludCBtYWluKHZvaWQpIHsKQEAgLTIxMzksNyArMjE3OCw3IEBACiAgIGV4aXQoIEFycmF5WzFdICE9IC0yICk7CiB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjE0MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTgyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QgJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCiB0aGVuCiAgIGFjX2N2X2NfZ2NjX3N0cmVuZ3RoX2J1Zz0ibm8iCiBlbHNlCkBAIC0yMTYyLDcgKzIyMDEsNyBAQAogCiAKIGVjaG8gJGFjX24gImNoZWNraW5nICJ3aGV0aGVyIGV4dGVybmFsIHN5bWJvbHMgbmVlZCBhbiB1bmRlcnNjb3JlIHByZWZpeCIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxNjY6IGNoZWNraW5nICJ3aGV0aGVyIGV4dGVybmFsIHN5bWJvbHMgbmVlZCBhbiB1bmRlcnNjb3JlIHByZWZpeCIiID4mNQorZWNobyAiY29uZmlndXJlOjIyMDU6IGNoZWNraW5nICJ3aGV0aGVyIGV4dGVybmFsIHN5bWJvbHMgbmVlZCBhbiB1bmRlcnNjb3JlIHByZWZpeCIiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfZXh0ZXJuX3ByZWZpeCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC0yMTc0LDE0ICsyMjEzLDE0IEBACiAJLmxvbmcgMAogRU9GCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTc4ICJjb25maWd1cmUiCisjbGluZSAyMjE3ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIGV4dGVybiBpbnQgYWNfdGVzdDsKIGludCBtYWluKCkgewogaWYgKGFjX3Rlc3QpIHJldHVybiAxCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjE4NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyMjQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGFjX2N2X2NfZXh0ZXJuX3ByZWZpeD0ieWVzIgogZWxzZQpAQCAtMjIwNSw3ICsyMjQ0LDcgQEAKIAogCiBlY2hvICRhY19uICJjaGVja2luZyAid2hldGhlciBhc3NlbWJsZXIgYWNjZXB0cyAuc3RyaW5nIiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjIwOTogY2hlY2tpbmcgIndoZXRoZXIgYXNzZW1ibGVyIGFjY2VwdHMgLnN0cmluZyIiID4mNQorZWNobyAiY29uZmlndXJlOjIyNDg6IGNoZWNraW5nICJ3aGV0aGVyIGFzc2VtYmxlciBhY2NlcHRzIC5zdHJpbmciIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2FzbV9zdHJpbmcnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtMjIxNSwxNCArMjI1NCwxNCBAQAogCS5zdHJpbmcgInRlc3QiCiBFT0YKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyMTkgImNvbmZpZ3VyZSIKKyNsaW5lIDIyNTggImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiBpbnQgbWFpbigpIHsKIAogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyMjY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjY1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBhY19jdl9jX2FzbV9zdHJpbmc9InllcyIKIGVsc2UKQEAgLTIyNDksMjEgKzIyODgsMjEgQEAKIGlmIHRlc3QgIiRMSUJfVEFSR0VUIiA9ICJsaWJ3aW5lLnNvLjEuMCIKIHRoZW4KICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgIndoZXRoZXIgd2UgY2FuIGJ1aWxkIGEgZGxsIiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjI1MzogY2hlY2tpbmcgIndoZXRoZXIgd2UgY2FuIGJ1aWxkIGEgZGxsIiIgPiY1CitlY2hvICJjb25maWd1cmU6MjI5MjogY2hlY2tpbmcgIndoZXRoZXIgd2UgY2FuIGJ1aWxkIGEgZGxsIiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19kbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBzYXZlZF9jZmxhZ3M9JENGTEFHUwogICBDRkxBR1M9IiRDRkxBR1MgLWZQSUMgLXNoYXJlZCAtV2wsLXNvbmFtZSxjb25mdGVzdC5zby4xLjAiCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyNjAgImNvbmZpZ3VyZSIKKyNsaW5lIDIyOTkgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiBpbnQgbWFpbigpIHsKIHJldHVybiAxCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjI2NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzMDY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGFjX2N2X2NfZGxsPSJ5ZXMiCiBlbHNlCkBAIC0yMjg5LDcgKzIzMjgsNyBAQAogCiAKIGVjaG8gJGFjX24gImNoZWNraW5nICJmb3IgcmVlbnRyYW50IFggbGlicmFyaWVzIiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjI5MzogY2hlY2tpbmcgImZvciByZWVudHJhbnQgWCBsaWJyYXJpZXMiIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyMzMyOiBjaGVja2luZyAiZm9yIHJlZW50cmFudCBYIGxpYnJhcmllcyIiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J3dpbmVfY3ZfeF9yZWVudHJhbnQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtMjMzMCwxNSArMjM2OSwxNSBAQAogZmkKIAogCi1mb3IgYWNfZnVuYyBpbiBjbG9uZSBtZW1tb3ZlIHN0cmVycm9yIHRjZ2V0YXR0ciB1c2xlZXAgd2FpdDQgd2FpdHBpZAorZm9yIGFjX2Z1bmMgaW4gY2xvbmUgbWVtbW92ZSBzdHJlcnJvciB0Y2dldGF0dHIgdGltZWdtIHVzbGVlcCB3YWl0NCB3YWl0cGlkCiBkbwogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzM3OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQorZWNobyAiY29uZmlndXJlOjIzNzY6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzNDIgImNvbmZpZ3VyZSIKKyNsaW5lIDIzODEgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAogICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwpAQCAtMjM2MSw3ICsyNDAwLDcgQEAKIAogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzNjU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDA0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKIGVsc2UKQEAgLTIzODksMTcgKzI0MjgsMTcgQEAKIGRvCiBhY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzkzOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitlY2hvICJjb25maWd1cmU6MjQzMjogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzOTggImNvbmZpZ3VyZSIKKyNsaW5lIDI0MzcgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPCRhY19oZHI+CiBFT0YKIGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI0MDM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Cit7IChldmFsIGVjaG8gY29uZmlndXJlOjI0NDI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CiBhY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dGAKIGlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKQEAgLTI0MjYsMTIgKzI0NjUsMTIgQEAKIGRvbmUKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBzdGF0IGZpbGUtbW9kZSBtYWNyb3MgYXJlIGJyb2tlbiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQzMDogY2hlY2tpbmcgd2hldGhlciBzdGF0IGZpbGUtbW9kZSBtYWNyb3MgYXJlIGJyb2tlbiIgPiY1CitlY2hvICJjb25maWd1cmU6MjQ2OTogY2hlY2tpbmcgd2hldGhlciBzdGF0IGZpbGUtbW9kZSBtYWNyb3MgYXJlIGJyb2tlbiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N0YXRfYnJva2VuJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQzNSAiY29uZmlndXJlIgorI2xpbmUgMjQ3NCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KQEAgLTI0ODIsMTIgKzI1MjEsMTIgQEAKIGZpCiAKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDg2OiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1CitlY2hvICJjb25maWd1cmU6MjUyNTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfY29uc3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNDkxICJjb25maWd1cmUiCisjbGluZSAyNTMwICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogaW50IG1haW4oKSB7CkBAIC0yNTM2LDcgKzI1NzUsNyBAQAogCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjU0MDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTc5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgYWNfY3ZfY19jb25zdD15ZXMKIGVsc2UKQEAgLTI1NTcsMTIgKzI1OTYsMTIgQEAKIGZpCiAKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNTYxOiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1CitlY2hvICJjb25maWd1cmU6MjYwMDogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjU2NiAiY29uZmlndXJlIgorI2xpbmUgMjYwNSAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RkYXJnLmg+CkBAIC0yNTcwLDcgKzI2MDksNyBAQAogI2luY2x1ZGUgPGZsb2F0Lmg+CiBFT0YKIGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI1NzQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Cit7IChldmFsIGVjaG8gY29uZmlndXJlOjI2MTM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CiBhY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dGAKIGlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKQEAgLTI1ODcsNyArMjYyNiw3IEBACiBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgogICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNTkxICJjb25maWd1cmUiCisjbGluZSAyNjMwICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDxzdHJpbmcuaD4KIEVPRgpAQCAtMjYwNSw3ICsyNjQ0LDcgQEAKIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCiAgICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI2MDkgImNvbmZpZ3VyZSIKKyNsaW5lIDI2NDggImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogRU9GCkBAIC0yNjI2LDcgKzI2NjUsNyBAQAogICA6CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI2MzAgImNvbmZpZ3VyZSIKKyNsaW5lIDI2NjkgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPGN0eXBlLmg+CiAjZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKQEAgLTI2MzcsNyArMjY3Niw3IEBACiBleGl0ICgwKTsgfQogCiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjY0MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNjgwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QgJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCiB0aGVuCiAgIDoKIGVsc2UKQEAgLTI2NjEsMTIgKzI3MDAsMTIgQEAKIGZpCiAKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaXplX3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI2NjU6IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQorZWNobyAiY29uZmlndXJlOjI3MDQ6IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfc2l6ZV90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjY3MCAiY29uZmlndXJlIgorI2xpbmUgMjcwOSAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaWYgU1REQ19IRUFERVJTCmRpZmYgLS1naXQgYS9jb25maWd1cmUuaW4gYi9jb25maWd1cmUuaW4KaW5kZXggZjAyZTMwYy4uNzhhMmM5NiAxMDA2NDQKLS0tIGEvY29uZmlndXJlLmluCisrKyBiL2NvbmZpZ3VyZS5pbgpAQCAtNjcsOSArNjcsMjIgQEAKICNlbmRpZgogXSxhY19jdl9jX29wZW5zb3VuZHN5c3RlbT0ieWVzIixhY19jdl9jX29wZW5zb3VuZHN5c3RlbT0ibm8iKSkKIAotaWYgdGVzdCAiJGFjX2N2X2Nfb3BlbnNvdW5kc3lzdGVtIiA9ICJ5ZXMiCitBQ19DQUNIRV9DSEVDSygiZm9yIE9wZW4gU291bmQgU3lzdGVtIG9uICpCU0QiLAorCWFjX2N2X2Nfb3BlbnNvdW5kc3lzdGVtX2JzZCwKKwlBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPG1hY2hpbmUvc291bmRjYXJkLmg+XSxbCisvKiBjaGVjayBmb3Igb25lIG9mIHRoZSBPcGVuIFNvdW5kIFN5c3RlbSBzcGVjaWZpYyBTTkRDVExfIGRlZmluZXMgKi8KKyNpZiAhZGVmaW5lZChTTkRDVExfRFNQX1NURVJFTykKKyNlcnJvciBObyBvcGVuIHNvdW5kIHN5c3RlbQorI2VuZGlmCitdLGFjX2N2X2Nfb3BlbnNvdW5kc3lzdGVtX2JzZD0ieWVzIixhY19jdl9jX29wZW5zb3VuZHN5c3RlbV9ic2Q9Im5vIikpCisKK2lmIHRlc3QgIiRhY19jdl9jX29wZW5zb3VuZHN5c3RlbSIgPSAieWVzIiAtbyAiJGFjX2N2X2Nfb3BlbnNvdW5kc3lzdGVtX2JzZCIgPSAieWVzIgogdGhlbgogICAgIEFDX0RFRklORShIQVZFX09TUykKKyAgICBpZiB0ZXN0ICIkYWNfY3ZfY19vcGVuc291bmRzeXN0ZW1fYnNkIiA9ICJ5ZXMiCisgICAgdGhlbgorICAgICAgICBBQ19ERUZJTkUoSEFWRV9NQUNISU5FX1NPVU5EQ0FSRF9IKQorICAgIGZpCiBmaQogCiBkbmwgKioqKiBDaGVjayBmb3IgdW5pb24gc2VtdW4gKioqKgpAQCAtMjA0LDcgKzIxNyw3IEBACiAKIGRubCAqKioqIENoZWNrIGZvciBmdW5jdGlvbnMgYW5kIGhlYWRlciBmaWxlcyAqKioqCiAKLUFDX0NIRUNLX0ZVTkNTKGNsb25lIG1lbW1vdmUgc3RyZXJyb3IgdGNnZXRhdHRyIHVzbGVlcCB3YWl0NCB3YWl0cGlkKQorQUNfQ0hFQ0tfRlVOQ1MoY2xvbmUgbWVtbW92ZSBzdHJlcnJvciB0Y2dldGF0dHIgdGltZWdtIHVzbGVlcCB3YWl0NCB3YWl0cGlkKQogQUNfQ0hFQ0tfSEVBREVSUyh3Y3R5cGUuaCkKIEFDX0hFQURFUl9TVEFUKCkKIEFDX0NfQ09OU1QoKQpkaWZmIC0tZ2l0IGEvY29udHJvbHMvY29tYm8uYyBiL2NvbnRyb2xzL2NvbWJvLmMKaW5kZXggNGNhY2VjNy4uOGM4NGVhNiAxMDA2NDQKLS0tIGEvY29udHJvbHMvY29tYm8uYworKysgYi9jb250cm9scy9jb21iby5jCkBAIC02Miw3ICs2Miw3IEBACiAgICAgICBDQml0SGVpZ2h0ID0gYm0uYm1IZWlnaHQ7CiAgICAgICBDQml0V2lkdGggID0gYm0uYm1XaWR0aDsKIAotICAgICAgZHByaW50Zl9pbmZvKGNvbWJvLCAiY29tYm8gYml0bWFwIFslaSwlaV1cbiIsIENCaXRXaWR0aCwgQ0JpdEhlaWdodCApOworICAgICAgVFJBQ0UoY29tYm8sICJjb21ibyBiaXRtYXAgWyVpLCVpXVxuIiwgQ0JpdFdpZHRoLCBDQml0SGVpZ2h0ICk7CiAKICAgICAgIGhQcmV2QiA9IFNlbGVjdE9iamVjdDE2KCBoREMsIGhDb21ib0JtcCk7CiAgICAgICBTZXRSZWN0MTYoICZyLCAwLCAwLCBDQml0V2lkdGgsIENCaXRIZWlnaHQgKTsKQEAgLTEwMSw4ICsxMDEsOCBAQAogCWlmKCAhKHduZC0+ZHdFeFN0eWxlICYgV1NfRVhfTk9QQVJFTlROT1RJRlkpICkKIAkgICAgICBscGhjLT53U3RhdGUgfD0gQ0JGX05PVElGWTsKIAotCWRwcmludGZfaW5mbyhjb21ibywgIkNPTUJPX05DQ3JlYXRlOiBbMHglMDh4XSwgc3R5bGUgPSAlMDh4XG4iLCAKLQkJCQkJCShVSU5UMzIpbHBoYywgbHBoYy0+ZHdTdHlsZSApOworCVRSQUNFKGNvbWJvLCAiWzB4JTA4eF0sIHN0eWxlID0gJTA4eFxuIiwgCisJCSAgICAgKFVJTlQzMilscGhjLCBscGhjLT5kd1N0eWxlICk7CiAKIAlyZXR1cm4gKExSRVNVTFQpKFVJTlQzMil3bmQtPmh3bmRTZWxmOyAKICAgICB9CkBAIC0xMTksNyArMTE5LDcgQEAKICAgIHsKICAgICAgICBXTkQqCQl3bmQgPSBscGhjLT5zZWxmOwogCi0gICAgICAgZHByaW50Zl9pbmZvKGNvbWJvLCJDb21ibyBbJTA0eF06IGZyZWVpbmcgc3RvcmFnZVxuIiwgQ0JfSFdORChscGhjKSk7CisgICAgICAgVFJBQ0UoY29tYm8sIlslMDR4XTogZnJlZWluZyBzdG9yYWdlXG4iLCBDQl9IV05EKGxwaGMpKTsKIAogICAgICAgIGlmKCAoQ0JfR0VUVFlQRShscGhjKSAhPSBDQlNfU0lNUExFKSAmJiBscGhjLT5oV25kTEJveCApIAogICAgCSAgIERlc3Ryb3lXaW5kb3czMiggbHBoYy0+aFduZExCb3ggKTsKQEAgLTIxOCwxMyArMjE4LDE4IEBACiAgICBpZiggbHBoYy0+ZHJvcHBlZFdpZHRoID4gKGxwckxCLT5yaWdodCAtIGxwckxCLT5sZWZ0KSApCiAgICAgICAgbHByTEItPnJpZ2h0ID0gbHByTEItPmxlZnQgKyAoSU5UMTYpbHBoYy0+ZHJvcHBlZFdpZHRoOwogCi1kcHJpbnRmX2luZm8oY29tYm8sIkNvbWJvIFslMDR4XTogKCVpLCVpLSVpLCVpKSBwbGFjZW1lbnRcblx0dGV4dFx0PSAoJWksJWktJWksJWkpXAotXG5cdGJ1dHRvblx0PSAoJWksJWktJWksJWkpXG5cdGxib3hcdD0gKCVpLCVpLSVpLCVpKVxuIiwgQ0JfSFdORChscGhjKSwKLWxwaGMtPlJlY3RDb21iby5sZWZ0LCBscGhjLT5SZWN0Q29tYm8udG9wLCBscGhjLT5SZWN0Q29tYm8ucmlnaHQsIGxwaGMtPlJlY3RDb21iby5ib3R0b20sCi1scHJFZGl0LT5sZWZ0LCBscHJFZGl0LT50b3AsIGxwckVkaXQtPnJpZ2h0LCBscHJFZGl0LT5ib3R0b20sCi1scHJCdXR0b24tPmxlZnQsIGxwckJ1dHRvbi0+dG9wLCBscHJCdXR0b24tPnJpZ2h0LCBscHJCdXR0b24tPmJvdHRvbSwgCi1scHJMQi0+bGVmdCwgbHByTEItPnRvcCwgbHByTEItPnJpZ2h0LCBscHJMQi0+Ym90dG9tICk7CisgICBUUkFDRShjb21ibywiWyUwNHhdOiAoJWksJWktJWksJWkpIHBsYWNlbWVudFxuIiwKKwkJQ0JfSFdORChscGhjKSwgbHBoYy0+UmVjdENvbWJvLmxlZnQsIGxwaGMtPlJlY3RDb21iby50b3AsIAorCQlscGhjLT5SZWN0Q29tYm8ucmlnaHQsIGxwaGMtPlJlY3RDb21iby5ib3R0b20pOwogCisgICBUUkFDRShjb21ibywiXHR0ZXh0XHQ9ICglaSwlaS0laSwlaSlcbiIsCisJCWxwckVkaXQtPmxlZnQsIGxwckVkaXQtPnRvcCwgbHByRWRpdC0+cmlnaHQsIGxwckVkaXQtPmJvdHRvbSk7CisKKyAgIFRSQUNFKGNvbWJvLCJcdGJ1dHRvblx0PSAoJWksJWktJWksJWkpXG4iLAorCQlscHJCdXR0b24tPmxlZnQsIGxwckJ1dHRvbi0+dG9wLCBscHJCdXR0b24tPnJpZ2h0LCBscHJCdXR0b24tPmJvdHRvbSk7CisKKyAgIFRSQUNFKGNvbWJvLCJcdGxib3hcdD0gKCVpLCVpLSVpLCVpKVxuIiwgCisJCWxwckxCLT5sZWZ0LCBscHJMQi0+dG9wLCBscHJMQi0+cmlnaHQsIGxwckxCLT5ib3R0b20gKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0zMzcsMTIgKzM0MiwxMiBAQAogCQkJCVNXUF9OT01PVkUgfCBTV1BfTk9aT1JERVIgfCBTV1BfTk9BQ1RJVkFURSApOwogCQlscGhjLT53U3RhdGUgJj0gfkNCRl9OT1JFU0laRTsKIAkgICAgICB9Ci0JICAgICAgZHByaW50Zl9pbmZvKGNvbWJvLCJDT01CT19DcmVhdGU6IGluaXQgZG9uZVxuIik7CisJICAgICAgVFJBQ0UoY29tYm8sImluaXQgZG9uZVxuIik7CiAJICAgICAgcmV0dXJuIHduZC0+aHduZFNlbGY7CiAJICB9Ci0JICBkcHJpbnRmX2Vycihjb21ibywgIkNPTUJPX0NyZWF0ZTogZWRpdCBjb250cm9sIGZhaWx1cmUuXG4iKTsKLSAgICAgIH0gZWxzZSBkcHJpbnRmX2Vycihjb21ibywgIkNPTUJPX0NyZWF0ZTogbGlzdGJveCBmYWlsdXJlLlxuIik7Ci0gIH0gZWxzZSBkcHJpbnRmX2Vycihjb21ibywgIkNPTUJPX0NyZWF0ZTogbm8gb3duZXIgZm9yIHZpc2libGUgY29tYm8uXG4iKTsKKwkgIEVSUihjb21ibywgImVkaXQgY29udHJvbCBmYWlsdXJlLlxuIik7CisgICAgICB9IGVsc2UgRVJSKGNvbWJvLCAibGlzdGJveCBmYWlsdXJlLlxuIik7CisgIH0gZWxzZSBFUlIoY29tYm8sICJubyBvd25lciBmb3IgdmlzaWJsZSBjb21iby5cbiIpOwogCiAgIC8qIENyZWF0ZVdpbmRvdygpIHdpbGwgc2VuZCBXTV9OQ0RFU1RST1kgdG8gY2xlYW51cCAqLwogCkBAIC01NjEsNyArNTY2LDcgQEAKICAgIGlmKCBsZW5ndGggPiAwICkgCiAgICAgICAgcFRleHQgPSAoTFBTVFIpIEhlYXBBbGxvYyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbGVuZ3RoICsgMSk7CiAKLSAgIGRwcmludGZfaW5mbyhjb21ibywiXHRDQlVwZGF0ZUxCb3g6IGVkaXQgdGV4dCBsZW5ndGggJWlcbiIsIGxlbmd0aCApOworICAgVFJBQ0UoY29tYm8sIlx0IGVkaXQgdGV4dCBsZW5ndGggJWlcbiIsIGxlbmd0aCApOwogCiAgICBpZiggcFRleHQgKQogICAgewpAQCAtNTk3LDcgKzYwMiw3IEBACiAgICBJTlQzMglsZW5ndGg7CiAgICBMUFNUUglwVGV4dCA9IE5VTEw7CiAKLSAgIGRwcmludGZfaW5mbyhjb21ibywiXHRDQlVwZGF0ZUVkaXQ6ICVpXG4iLCBpbmRleCApOworICAgVFJBQ0UoY29tYm8sIlx0ICVpXG4iLCBpbmRleCApOwogCiAgICBpZiggaW5kZXggPT0gLTEgKQogICAgewpAQCAtNjQyLDcgKzY0Nyw3IEBACiAgICBSRUNUMTYJcmVjdDsKICAgIExQUkVDVDE2CXBSZWN0ID0gTlVMTDsKIAotICAgZHByaW50Zl9pbmZvKGNvbWJvLCJDb21ibyBbJTA0eF06IGRyb3AgZG93blxuIiwgQ0JfSFdORChscGhjKSk7CisgICBUUkFDRShjb21ibywiWyUwNHhdOiBkcm9wIGRvd25cbiIsIENCX0hXTkQobHBoYykpOwogCiAgICBDQl9OT1RJRlkoIGxwaGMsIENCTl9EUk9QRE9XTiApOwogCkBAIC02OTgsNyArNzAzLDcgQEAKICAgIGlmKCBJc1dpbmRvdzMyKCBoV25kICkgJiYgQ0JfR0VUVFlQRShscGhjKSAhPSBDQlNfU0lNUExFICkKICAgIHsKIAotICAgICAgIGRwcmludGZfaW5mbyhjb21ibywiQ29tYm8gWyUwNHhdOiByb2xsIHVwIFslaV1cbiIsIENCX0hXTkQobHBoYyksIChJTlQzMilvayApOworICAgICAgIFRSQUNFKGNvbWJvLCJbJTA0eF06IHJvbGwgdXAgWyVpXVxuIiwgQ0JfSFdORChscGhjKSwgKElOVDMyKW9rICk7CiAKICAgICAgICAvKiBhbHdheXMgc2VuZCBXTV9MQlVUVE9OVVA/ICovCiAgICAgICAgU2VuZE1lc3NhZ2UzMkEoIGxwaGMtPmhXbmRMQm94LCBXTV9MQlVUVE9OVVAsIDAsIChMUEFSQU0pKC0xKSApOwpAQCAtODM5LDE2ICs4NDQsMTYgQEAKICAgICAgICB7ICAgCiAJICAgY2FzZSAoRU5fU0VURk9DVVMgPj4gOCk6CiAKLQkJZHByaW50Zl9pbmZvKGNvbWJvLCJDb21ibyBbJTA0eF06IGVkaXQgWyUwNHhdIGdvdCBmb2N1c1xuIiwgCi0JCQkJICAgICBDQl9IV05EKGxwaGMpLCAoSFdORDE2KWxwaGMtPmhXbmRFZGl0ICk7CisJCVRSQUNFKGNvbWJvLCJbJTA0eF06IGVkaXQgWyUwNHhdIGdvdCBmb2N1c1xuIiwgCisJCQkgICAgIENCX0hXTkQobHBoYyksIChIV05EMTYpbHBoYy0+aFduZEVkaXQgKTsKIAogCQlpZiggIShscGhjLT53U3RhdGUgJiBDQkZfRk9DVVNFRCkgKSBDT01CT19TZXRGb2N1cyggbHBoYyApOwogCSAgICAgICAgYnJlYWs7CiAKIAkgICBjYXNlIChFTl9LSUxMRk9DVVMgPj4gOCk6CiAKLQkJZHByaW50Zl9pbmZvKGNvbWJvLCJDb21ibyBbJTA0eF06IGVkaXQgWyUwNHhdIGxvc3QgZm9jdXNcbiIsCi0JCQkJICAgICAgQ0JfSFdORChscGhjKSwgKEhXTkQxNilscGhjLT5oV25kRWRpdCApOworCQlUUkFDRShjb21ibywiWyUwNHhdOiBlZGl0IFslMDR4XSBsb3N0IGZvY3VzXG4iLAorCQkJICAgICBDQl9IV05EKGxwaGMpLCAoSFdORDE2KWxwaGMtPmhXbmRFZGl0ICk7CiAKIAkJLyogTk9URTogaXQgc2VlbXMgdGhhdCBXaW5kb3dzJyBlZGl0IGNvbnRyb2wgc2VuZHMgYW4KIAkJICogdW5kb2N1bWVudGVkIG1lc3NhZ2UgV01fVVNFUiArIDB4MUIgaW5zdGVhZCBvZiB0aGlzCkBAIC04ODgsOCArODkzLDggQEAKIAkgICBjYXNlIExCTl9TRUxDSEFOR0U6CiAJICAgY2FzZSBMQk5fU0VMQ0FOQ0VMOgogCi0JCWRwcmludGZfaW5mbyhjb21ibywiQ29tYm8gWyUwNHhdOiBsYm94IHNlbGVjdGlvbiBjaGFuZ2UgWyUwNHhdXG4iLCAKLQkJCQkJCSAgICAgIENCX0hXTkQobHBoYyksIGxwaGMtPndTdGF0ZSApOworCQlUUkFDRShjb21ibywiWyUwNHhdOiBsYm94IHNlbGVjdGlvbiBjaGFuZ2UgWyUwNHhdXG4iLCAKKwkJCSAgICAgQ0JfSFdORChscGhjKSwgbHBoYy0+d1N0YXRlICk7CiAKIAkJLyogZG8gbm90IHJvbGwgdXAgaWYgc2VsZWN0aW9uIGlzIGJlaW5nIHRyYWNrZWQgCiAJCSAqIGJ5IGFycm93a2V5cyBpbiB0aGUgZHJvcGRvd24gbGlzdGJveCAqLwpAQCAtOTIyLDggKzkyNyw4IEBACiB7CiAgICBIV05EMzIJaFduZCA9IGxwaGMtPnNlbGYtPmh3bmRTZWxmOwogCi0gICBkcHJpbnRmX2luZm8oY29tYm8sIkNvbWJvIFslMDR4XTogb3duZXJkcmF3IG9wICUwNHhcbiIsIAotCQkJCSAgICAgICBDQl9IV05EKGxwaGMpLCAoVUlOVDE2KW1zZyApOworICAgVFJBQ0UoY29tYm8sIlslMDR4XTogb3duZXJkcmF3IG9wICUwNHhcbiIsIAorCQlDQl9IV05EKGxwaGMpLCAoVUlOVDE2KW1zZyApOwogCiAjZGVmaW5lIGxwSVMgICAgKChMUERFTEVURUlURU1TVFJVQ1QzMilsUGFyYW0pCiAKQEAgLTEwNjAsNyArMTA2NSw3IEBACiAgIEdldFdpbmRvd1JlY3QxNiggbHBoYy0+c2VsZi0+aHduZFNlbGYsICZyZWN0ICk7CiAgIHcgPSByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0OyBoID0gcmVjdC5ib3R0b20gLSByZWN0LnRvcDsKIAotICBkcHJpbnRmX2luZm8oY29tYm8sIkNPTUJPX1NpemU6IHcgPSAlaSwgaCA9ICVpXG4iLCB3LCBoICk7CisgIFRSQUNFKGNvbWJvLCJ3ID0gJWksIGggPSAlaVxuIiwgdywgaCApOwogCiAgIC8qIENyZWF0ZVdpbmRvdygpIG1heSBzZW5kIGEgYm9ndXMgV01fU0laRSwgaWdub3JlIGl0ICovCiAKQEAgLTEyNTcsOCArMTI2Miw4IEBACiAgICAgewogICAgICAgTFBIRUFEQ09NQk8JbHBoYyA9IENCX0dFVFBUUihwV25kKTsKIAotICAgICAgZHByaW50Zl9pbmZvKGNvbWJvLCAiQ29tYm8gWyUwNHhdOiBtc2cgJXMgd3AgJTA4eCBscCAlMDhseFxuIiwKLSAgICAgICAgICAgICAgICAgICAgIHBXbmQtPmh3bmRTZWxmLCBTUFlfR2V0TXNnTmFtZShtZXNzYWdlKSwgd1BhcmFtLCBsUGFyYW0gKTsKKyAgICAgIFRSQUNFKGNvbWJvLCAiWyUwNHhdOiBtc2cgJXMgd3AgJTA4eCBscCAlMDhseFxuIiwKKwkJICAgcFduZC0+aHduZFNlbGYsIFNQWV9HZXRNc2dOYW1lKG1lc3NhZ2UpLCB3UGFyYW0sIGxQYXJhbSApOwogCiAgICAgICBpZiggbHBoYyB8fCBtZXNzYWdlID09IFdNX05DQ1JFQVRFICkKICAgICAgIHN3aXRjaChtZXNzYWdlKSAKQEAgLTE1NTksNyArMTU2NCw3IEBACiAJCXJldHVybiAobHBoYy0+d1N0YXRlICYgQ0JGX0VVSSkgPyBUUlVFIDogRkFMU0U7CiAKIAljYXNlIChXTV9VU0VSICsgMHgxQik6Ci0JICAgICAgICBkcHJpbnRmX3dhcm4oY29tYm8sICJDb21ibyBbJTA0eF06IHVuZG9jdW1lbnRlZCBtc2chXG4iLCAoSFdORDE2KWh3bmQgKTsKKwkgICAgICAgIFdBUk4oY29tYm8sICJbJTA0eF06IHVuZG9jdW1lbnRlZCBtc2chXG4iLCAoSFdORDE2KWh3bmQgKTsKICAgICB9CiAgICAgcmV0dXJuIERlZldpbmRvd1Byb2MzMkEoaHduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOwogICB9CmRpZmYgLS1naXQgYS9jb250cm9scy9lZGl0LmMgYi9jb250cm9scy9lZGl0LmMKaW5kZXggMzViNzc0Zi4uYWIxMTc3NiAxMDA2NDQKLS0tIGEvY29udHJvbHMvZWRpdC5jCisrKyBiL2NvbnRyb2xzL2VkaXQuYwpAQCAtNDksNyArNDksNyBAQAogCUVORF8wID0gMCwJLyogbGluZSBlbmRzIHdpdGggdGVybWluYXRpbmcgJ1wwJyBjaGFyYWN0ZXIgKi8KIAlFTkRfV1JBUCwJLyogbGluZSBpcyB3cmFwcGVkICovCiAJRU5EX0hBUkQsCS8qIGxpbmUgZW5kcyB3aXRoIGEgaGFyZCByZXR1cm4gJ1xyXG4nICovCi0JRU5EX1NPRlQsCS8qIGxpbmUgZW5kcyB3aXRoIGEgc29mdCByZXR1cm4gJ1xyXHJcbicgKi8KKwlFTkRfU09GVAkvKiBsaW5lIGVuZHMgd2l0aCBhIHNvZnQgcmV0dXJuICdcclxyXG4nICovCiB9IExJTkVfRU5EOwogCiB0eXBlZGVmIHN0cnVjdCB0YWdMSU5FREVGIHsKQEAgLTEwOSw5ICsxMDksOCBAQAogI2RlZmluZSBPUkRFUl9VSU5UMzIoeCx5KSBkbyB7IGlmICgoVUlOVDMyKSh5KSA8IChVSU5UMzIpKHgpKSBTV0FQX1VJTlQzMigoeCksKHkpKTsgfSB3aGlsZSgwKQogCiAjZGVmaW5lIERQUklOVEZfRURJVF9OT1RJRlkoaHduZCwgc3RyKSBcCi0JKHtkcHJpbnRmX2luZm8oZWRpdCwgXAotCQkJImVkaXQ6IG5vdGlmaWNhdGlvbiAiIHN0ciAiIHNlbnQgdG8gaHduZD0lMDh4XG4iLCBcCi0JCQkoVUlOVDMyKShod25kKSk7fSkKKwkoe1RSQUNFKGVkaXQsICJub3RpZmljYXRpb24gIiBzdHIgIiBzZW50IHRvIGh3bmQ9JTA4eFxuIiwgXAorCQkgICAgICAgKFVJTlQzMikoaHduZCkpO30pCiAKICNkZWZpbmUgRURJVF9TRU5EX0NUTENPTE9SKHduZCxoZGMpIFwKIAkoU2VuZE1lc3NhZ2UzMkEoKHduZCktPnBhcmVudC0+aHduZFNlbGYsIFdNX0NUTENPTE9SRURJVCwgXApAQCAtMTIyLDE0ICsxMjEsMTMgQEAKIAkJCU1BS0VXUEFSQU0oKHduZCktPndJRG1lbnUsIHdOb3RpZnlDb2RlKSwgXAogCQkJKExQQVJBTSkod25kKS0+aHduZFNlbGYpKQogI2RlZmluZSBEUFJJTlRGX0VESVRfTVNHMTYoc3RyKSBcCi0JZHByaW50Zl9pbmZvKGVkaXQsIFwKLQkJCSJlZGl0OiAxNiBiaXQgOiAiIHN0ciAiOiBod25kPSUwOHgsIHdQYXJhbT0lMDh4LCBsUGFyYW09JTA4eFxuIiwgXAotCQkJKFVJTlQzMilod25kLCAoVUlOVDMyKXdQYXJhbSwgKFVJTlQzMilsUGFyYW0pCisJVFJBQ0UoZWRpdCwgXAorCQkgICAgICIxNiBiaXQgOiAiIHN0ciAiOiBod25kPSUwOHgsIHdQYXJhbT0lMDh4LCBsUGFyYW09JTA4eFxuIiwgXAorCQkgICAgIChVSU5UMzIpaHduZCwgKFVJTlQzMil3UGFyYW0sIChVSU5UMzIpbFBhcmFtKQogI2RlZmluZSBEUFJJTlRGX0VESVRfTVNHMzIoc3RyKSBcCi0JZHByaW50Zl9pbmZvKGVkaXQsIFwKLQkJCSJlZGl0OiAzMiBiaXQgOiAiIHN0ciAiOiBod25kPSUwOHgsIHdQYXJhbT0lMDh4LCBsUGFyYW09JTA4eFxuIiwgXAotCQkJKFVJTlQzMilod25kLCAoVUlOVDMyKXdQYXJhbSwgKFVJTlQzMilsUGFyYW0pCi0KKwlUUkFDRShlZGl0LCBcCisJCSAgICAgIjMyIGJpdCA6ICIgc3RyICI6IGh3bmQ9JTA4eCwgd1BhcmFtPSUwOHgsIGxQYXJhbT0lMDh4XG4iLCBcCisJCSAgICAgKFVJTlQzMilod25kLCAoVUlOVDMyKXdQYXJhbSwgKFVJTlQzMilsUGFyYW0pCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC05ODYsNyArOTg0LDcgQEAKIAl9CiAgICAgICAgIGVsc2UgaWYgKGVzLT53b3JkX2JyZWFrX3Byb2MzMkEpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGRwcmludGZfaW5mbyhyZWxheSwgIkNhbGxUbzMyKHdvcmRicms9JXAsc3RyPSclcycsaWR4PSVkLGNudD0lZCxhY3Q9JWQpXG4iLAorICAgICAgICAgICAgVFJBQ0UocmVsYXksICIod29yZGJyaz0lcCxzdHI9JyVzJyxpZHg9JWQsY250PSVkLGFjdD0lZClcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcy0+d29yZF9icmVha19wcm9jMzJBLCBlcy0+dGV4dCArIHN0YXJ0LCBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50LCBhY3Rpb24gKTsKICAgICAgICAgICAgIHJldHVybiAoSU5UMzIpZXMtPndvcmRfYnJlYWtfcHJvYzMyQSggZXMtPnRleHQgKyBzdGFydCwgaW5kZXgsCkBAIC0xMTY4LDcgKzExNjYsNyBAQAogc3RhdGljIHZvaWQgRURJVF9Mb2NrQnVmZmVyKFdORCAqd25kLCBFRElUU1RBVEUgKmVzKQogewogCWlmICghZXMpIHsKLQkJZnByaW50ZihzdGRlcnIsICJlZGl0OiBMb2NrQnVmZmVyKCkgd2l0aG91dCBhbiBFRElUU1RBVEUgLi4uIHBsZWFzZSByZXBvcnRcbiIpOworCQlFUlIoZWRpdCwgIm5vIEVESVRTVEFURSAuLi4gcGxlYXNlIHJlcG9ydFxuIik7CiAJCXJldHVybjsKIAl9CiAJaWYgKCEoZXMtPnN0eWxlICYgRVNfTVVMVElMSU5FKSkKQEAgLTExNzksNyArMTE3Nyw3IEBACiAJCWVsc2UgaWYgKGVzLT5obG9jMTYpCiAJCQllcy0+dGV4dCA9IExPQ0FMX0xvY2sod25kLT5oSW5zdGFuY2UsIGVzLT5obG9jMTYpOwogCQllbHNlIHsKLQkJCWZwcmludGYoc3RkZXJyLCAiZWRpdDogTG9ja0J1ZmZlcigpIHdpdGhvdXQgYSBidWZmZXIgLi4uIHBsZWFzZSByZXBvcnRcbiIpOworCQkJRVJSKGVkaXQsICJubyBidWZmZXIgLi4uIHBsZWFzZSByZXBvcnRcbiIpOwogCQkJcmV0dXJuOwogCQl9CiAJfQpAQCAtMTMxOCw3ICsxMzE2LDcgQEAKIAlpZiAoc2l6ZSA+IGVzLT5idWZmZXJfbGltaXQpCiAJCXNpemUgPSBlcy0+YnVmZmVyX2xpbWl0OwogCi0JZHByaW50Zl9pbmZvKGVkaXQsICJlZGl0OiBFRElUX01ha2VGaXQ6IHRyeWluZyB0byBSZUFsbG9jIHRvICVkKzFcbiIsIHNpemUpOworCVRSQUNFKGVkaXQsICJ0cnlpbmcgdG8gUmVBbGxvYyB0byAlZCsxXG4iLCBzaXplKTsKIAogCUVESVRfVW5sb2NrQnVmZmVyKHduZCwgZXMsIFRSVUUpOwogCWlmIChlcy0+dGV4dCkgewpAQCAtMTMyOCwyNSArMTMyNiwyNSBAQAogCQkJZXMtPmJ1ZmZlcl9zaXplID0gMDsKIAl9IGVsc2UgaWYgKGVzLT5obG9jMzIpIHsKIAkJaWYgKChoTmV3MzIgPSBMb2NhbFJlQWxsb2MzMihlcy0+aGxvYzMyLCBzaXplICsgMSwgMCkpKSB7Ci0JCQlkcHJpbnRmX2luZm8oZWRpdCwgImVkaXQ6IEVESVRfTWFrZUZpdDogT2xkIDMyIGJpdCBoYW5kbGUgJTA4eCwgbmV3IGhhbmRsZSAlMDh4XG4iLCBlcy0+aGxvYzMyLCBoTmV3MzIpOworCQkJVFJBQ0UoZWRpdCwgIk9sZCAzMiBiaXQgaGFuZGxlICUwOHgsIG5ldyBoYW5kbGUgJTA4eFxuIiwgZXMtPmhsb2MzMiwgaE5ldzMyKTsKIAkJCWVzLT5obG9jMzIgPSBoTmV3MzI7CiAJCQllcy0+YnVmZmVyX3NpemUgPSBNSU4oTG9jYWxTaXplMzIoZXMtPmhsb2MzMikgLSAxLCBlcy0+YnVmZmVyX2xpbWl0KTsKIAkJfQogCX0gZWxzZSBpZiAoZXMtPmhsb2MxNikgewogCQlpZiAoKGhOZXcxNiA9IExPQ0FMX1JlQWxsb2Mod25kLT5oSW5zdGFuY2UsIGVzLT5obG9jMTYsIHNpemUgKyAxLCBMTUVNX01PVkVBQkxFKSkpIHsKLQkJCWRwcmludGZfaW5mbyhlZGl0LCAiZWRpdDogRURJVF9NYWtlRml0OiBPbGQgMTYgYml0IGhhbmRsZSAlMDh4LCBuZXcgaGFuZGxlICUwOHhcbiIsIGVzLT5obG9jMTYsIGhOZXcxNik7CisJCQlUUkFDRShlZGl0LCAiT2xkIDE2IGJpdCBoYW5kbGUgJTA4eCwgbmV3IGhhbmRsZSAlMDh4XG4iLCBlcy0+aGxvYzE2LCBoTmV3MTYpOwogCQkJZXMtPmhsb2MxNiA9IGhOZXcxNjsKIAkJCWVzLT5idWZmZXJfc2l6ZSA9IE1JTihMT0NBTF9TaXplKHduZC0+aEluc3RhbmNlLCBlcy0+aGxvYzE2KSAtIDEsIGVzLT5idWZmZXJfbGltaXQpOwogCQl9CiAJfQogCWlmIChlcy0+YnVmZmVyX3NpemUgPCBzaXplKSB7CiAJCUVESVRfTG9ja0J1ZmZlcih3bmQsIGVzKTsKLQkJZHByaW50Zl93YXJuKGVkaXQsICJlZGl0OiBFRElUX01ha2VGaXQ6IEZBSUxFRCAhICBXZSBub3cgaGF2ZSAlZCsxXG4iLCBlcy0+YnVmZmVyX3NpemUpOworCQlXQVJOKGVkaXQsICJGQUlMRUQgISAgV2Ugbm93IGhhdmUgJWQrMVxuIiwgZXMtPmJ1ZmZlcl9zaXplKTsKIAkJRURJVF9OT1RJRllfUEFSRU5UKHduZCwgRU5fRVJSU1BBQ0UsICJFTl9FUlJTUEFDRSIpOwogCQlyZXR1cm4gRkFMU0U7CiAJfSBlbHNlIHsKIAkJRURJVF9Mb2NrQnVmZmVyKHduZCwgZXMpOwotCQlkcHJpbnRmX2luZm8oZWRpdCwgImVkaXQ6IEVESVRfTWFrZUZpdDogV2Ugbm93IGhhdmUgJWQrMVxuIiwgZXMtPmJ1ZmZlcl9zaXplKTsKKwkJVFJBQ0UoZWRpdCwgIldlIG5vdyBoYXZlICVkKzFcbiIsIGVzLT5idWZmZXJfc2l6ZSk7CiAJCXJldHVybiBUUlVFOwogCX0KIH0KQEAgLTEzNjUsMTIgKzEzNjMsMTIgQEAKIAkJcmV0dXJuIFRSVUU7CiAJc2l6ZSA9ICgoc2l6ZSAvIEdST1dMRU5HVEgpICsgMSkgKiBHUk9XTEVOR1RIOwogCi0JZHByaW50Zl9pbmZvKGVkaXQsICJlZGl0OiBFRElUX01ha2VVbmRvRml0OiB0cnlpbmcgdG8gUmVBbGxvYyB0byAlZCsxXG4iLCBzaXplKTsKKwlUUkFDRShlZGl0LCAidHJ5aW5nIHRvIFJlQWxsb2MgdG8gJWQrMVxuIiwgc2l6ZSk7CiAKIAlpZiAoKGVzLT51bmRvX3RleHQgPSBIZWFwUmVBbGxvYyhlcy0+aGVhcCwgMCwgZXMtPnVuZG9fdGV4dCwgc2l6ZSArIDEpKSkgewogCQllcy0+dW5kb19idWZmZXJfc2l6ZSA9IEhlYXBTaXplKGVzLT5oZWFwLCAwLCBlcy0+dW5kb190ZXh0KSAtIDE7CiAJCWlmIChlcy0+dW5kb19idWZmZXJfc2l6ZSA8IHNpemUpIHsKLQkJCWRwcmludGZfd2FybihlZGl0LCAiZWRpdDogRURJVF9NYWtlVW5kb0ZpdDogRkFJTEVEICEgIFdlIG5vdyBoYXZlICVkKzFcbiIsIGVzLT51bmRvX2J1ZmZlcl9zaXplKTsKKwkJCVdBUk4oZWRpdCwgIkZBSUxFRCAhICBXZSBub3cgaGF2ZSAlZCsxXG4iLCBlcy0+dW5kb19idWZmZXJfc2l6ZSk7CiAJCQlyZXR1cm4gRkFMU0U7CiAJCX0KIAkJcmV0dXJuIFRSVUU7CkBAIC0xNjU4LDcgKzE2NTYsNyBAQAogCX0gZWxzZSBpZiAobGluZSkKIAkJcmV0dXJuOwogCi0JZHByaW50Zl9pbmZvKGVkaXQsICJlZGl0OiBFRElUX1BhaW50TGluZTogbGluZT0lZFxuIiwgbGluZSk7CisJVFJBQ0UoZWRpdCwgImxpbmU9JWRcbiIsIGxpbmUpOwogCiAJcG9zID0gRURJVF9FTV9Qb3NGcm9tQ2hhcih3bmQsIGVzLCBFRElUX0VNX0xpbmVJbmRleCh3bmQsIGVzLCBsaW5lKSwgRkFMU0UpOwogCXggPSBTTE9XT1JEKHBvcyk7CkBAIC0xODI2LDE3ICsxODI0LDE3IEBACiBzdGF0aWMgdm9pZCBFRElUX1VubG9ja0J1ZmZlcihXTkQgKnduZCwgRURJVFNUQVRFICplcywgQk9PTDMyIGZvcmNlKQogewogCWlmICghZXMpIHsKLQkJZnByaW50ZihzdGRlcnIsICJlZGl0OiBVbmxvY2tCdWZmZXIoKSB3aXRob3V0IGFuIEVESVRTVEFURSAuLi4gcGxlYXNlIHJlcG9ydFxuIik7CisJCUVSUihlZGl0LCAibm8gRURJVFNUQVRFIC4uLiBwbGVhc2UgcmVwb3J0XG4iKTsKIAkJcmV0dXJuOwogCX0KIAlpZiAoIShlcy0+c3R5bGUgJiBFU19NVUxUSUxJTkUpKQogCQlyZXR1cm47CiAJaWYgKCFlcy0+bG9ja19jb3VudCkgewotCQlmcHJpbnRmKHN0ZGVyciwgImVkaXQ6IFVubG9ja0J1ZmZlcigpIHdpdGggbG9ja19jb3VudCA9PSAwIC4uLiBwbGVhc2UgcmVwb3J0XG4iKTsKKwkJRVJSKGVkaXQsICJsb2NrX2NvdW50ID09IDAgLi4uIHBsZWFzZSByZXBvcnRcbiIpOwogCQlyZXR1cm47CiAJfQogCWlmICghZXMtPnRleHQpIHsKLQkJZnByaW50ZihzdGRlcnIsICJlZGl0OiBVbmxvY2tCdWZmZXIoKSB3aXRoIGVzLT50ZXh0ID09IDAgLi4uIHBsZWFzZSByZXBvcnRcbiIpOworCQlFUlIoZWRpdCwgImVzLT50ZXh0ID09IDAgLi4uIHBsZWFzZSByZXBvcnRcbiIpOwogCQlyZXR1cm47CiAJfQogCWlmIChmb3JjZSB8fCAoZXMtPmxvY2tfY291bnQgPT0gMSkpIHsKQEAgLTE4NjcsOCArMTg2NSw4IEBACiB7CiAJSU5UMzIgcmV0ID0gMDsKIAotCWRwcmludGZfaW5mbyhlZGl0LCAiZWRpdDogRURJVF9Xb3JkQnJlYWtQcm9jOiBzPSVwLCBpbmRleD0ldSIKLQkJCSIsIGNvdW50PSV1LCBhY3Rpb249JWRcbiIsIHMsIGluZGV4LCBjb3VudCwgYWN0aW9uKTsKKwlUUkFDRShlZGl0LCAicz0lcCwgaW5kZXg9JXUsIGNvdW50PSV1LCBhY3Rpb249JWRcbiIsIAorCQkgICAgIHMsIGluZGV4LCBjb3VudCwgYWN0aW9uKTsKIAogCXN3aXRjaCAoYWN0aW9uKSB7CiAJY2FzZSBXQl9MRUZUOgpAQCAtMTkxMSw3ICsxOTA5LDcgQEAKIAkJcmV0ID0gKHNbaW5kZXhdID09ICcgJyk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWZwcmludGYoc3RkZXJyLCAiZWRpdDogRURJVF9Xb3JkQnJlYWtQcm9jOiB1bmtub3duIGFjdGlvbiBjb2RlLCBwbGVhc2UgcmVwb3J0ICFcbiIpOworCQlFUlIoZWRpdCwgInVua25vd24gYWN0aW9uIGNvZGUsIHBsZWFzZSByZXBvcnQgIVxuIik7CiAJCWJyZWFrOwogCX0KIAlyZXR1cm4gcmV0OwpAQCAtMTk1Myw3ICsxOTUxLDcgQEAKICAqLwogc3RhdGljIEJPT0wzMiBFRElUX0VNX0ZtdExpbmVzKFdORCAqd25kLCBFRElUU1RBVEUgKmVzLCBCT09MMzIgYWRkX2VvbCkKIHsKLQlmcHJpbnRmKHN0ZG5pbXAsICJlZGl0OiBFTV9GTVRMSU5FUzogbWVzc2FnZSBub3QgaW1wbGVtZW50ZWRcbiIpOworCUZJWE1FKGVkaXQsICJtZXNzYWdlIG5vdCBpbXBsZW1lbnRlZFxuIik7CiAJcmV0dXJuIGFkZF9lb2w7CiB9CiAKQEAgLTE5ODksMTIgKzE5ODcsMTIgQEAKIAkJcmV0dXJuIChITE9DQUwzMillcy0+aGxvYzE2OwogCiAJaWYgKCEobmV3QnVmID0gTG9jYWxBbGxvYzMyKExNRU1fTU9WRUFCTEUsIGxzdHJsZW4zMkEoZXMtPnRleHQpICsgMSkpKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiZWRpdDogRU1fR0VUSEFORExFOiBjb3VsZCBub3QgYWxsb2NhdGUgbmV3IDMyIGJpdCBidWZmZXJcbiIpOworCQlFUlIoZWRpdCwgImNvdWxkIG5vdCBhbGxvY2F0ZSBuZXcgMzIgYml0IGJ1ZmZlclxuIik7CiAJCXJldHVybiAwOwogCX0KIAluZXdTaXplID0gTUlOKExvY2FsU2l6ZTMyKG5ld0J1ZikgLSAxLCBlcy0+YnVmZmVyX2xpbWl0KTsKIAlpZiAoIShuZXdUZXh0ID0gTG9jYWxMb2NrMzIobmV3QnVmKSkpIHsKLQkJZnByaW50ZihzdGRlcnIsICJlZGl0OiBFTV9HRVRIQU5ETEU6IGNvdWxkIG5vdCBsb2NrIG5ldyAzMiBiaXQgYnVmZmVyXG4iKTsKKwkJRVJSKGVkaXQsICJjb3VsZCBub3QgbG9jayBuZXcgMzIgYml0IGJ1ZmZlclxuIik7CiAJCUxvY2FsRnJlZTMyKG5ld0J1Zik7CiAJCXJldHVybiAwOwogCX0KQEAgLTIwMDcsNyArMjAwNSw3IEBACiAJZXMtPmJ1ZmZlcl9zaXplID0gbmV3U2l6ZTsKIAllcy0+dGV4dCA9IG5ld1RleHQ7CiAJRURJVF9Mb2NrQnVmZmVyKHduZCwgZXMpOwotCWRwcmludGZfaW5mbyhlZGl0LCAiZWRpdDogRU1fR0VUSEFORExFOiBzd2l0Y2hlZCB0byAzMiBiaXQgbG9jYWwgaGVhcFxuIik7CisJVFJBQ0UoZWRpdCwgInN3aXRjaGVkIHRvIDMyIGJpdCBsb2NhbCBoZWFwXG4iKTsKIAogCXJldHVybiBlcy0+aGxvYzMyOwogfQpAQCAtMjA0MywxOCArMjA0MSwxOCBAQAogCWlmICghTE9DQUxfSGVhcFNpemUod25kLT5oSW5zdGFuY2UpKSB7CiAJCWlmICghTG9jYWxJbml0KHduZC0+aEluc3RhbmNlLCAwLAogCQkJCUdsb2JhbFNpemUxNih3bmQtPmhJbnN0YW5jZSkpKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgImVkaXQ6IEVNX0dFVEhBTkRMRTogY291bGQgbm90IGluaXRpYWxpemUgbG9jYWwgaGVhcFxuIik7CisJCQlFUlIoZWRpdCwgImNvdWxkIG5vdCBpbml0aWFsaXplIGxvY2FsIGhlYXBcbiIpOwogCQkJcmV0dXJuIDA7CiAJCX0KLQkJZHByaW50Zl9pbmZvKGVkaXQsICJlZGl0OiBFTV9HRVRIQU5ETEU6IGxvY2FsIGhlYXAgaW5pdGlhbGl6ZWRcbiIpOworCQlUUkFDRShlZGl0LCAibG9jYWwgaGVhcCBpbml0aWFsaXplZFxuIik7CiAJfQogCWlmICghKG5ld0J1ZiA9IExPQ0FMX0FsbG9jKHduZC0+aEluc3RhbmNlLCBMTUVNX01PVkVBQkxFLCBsc3RybGVuMzJBKGVzLT50ZXh0KSArIDEpKSkgewotCQlmcHJpbnRmKHN0ZGVyciwgImVkaXQ6IEVNX0dFVEhBTkRMRTogY291bGQgbm90IGFsbG9jYXRlIG5ldyAxNiBiaXQgYnVmZmVyXG4iKTsKKwkJRVJSKGVkaXQsICJjb3VsZCBub3QgYWxsb2NhdGUgbmV3IDE2IGJpdCBidWZmZXJcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAJbmV3U2l6ZSA9IE1JTihMT0NBTF9TaXplKHduZC0+aEluc3RhbmNlLCBuZXdCdWYpIC0gMSwgZXMtPmJ1ZmZlcl9saW1pdCk7CiAJaWYgKCEobmV3VGV4dCA9IExPQ0FMX0xvY2sod25kLT5oSW5zdGFuY2UsIG5ld0J1ZikpKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiZWRpdDogRU1fR0VUSEFORExFOiBjb3VsZCBub3QgbG9jayBuZXcgMTYgYml0IGJ1ZmZlclxuIik7CisJCUVSUihlZGl0LCAiY291bGQgbm90IGxvY2sgbmV3IDE2IGJpdCBidWZmZXJcbiIpOwogCQlMT0NBTF9GcmVlKHduZC0+aEluc3RhbmNlLCBuZXdCdWYpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0yMDcxLDcgKzIwNjksNyBAQAogCWVzLT5idWZmZXJfc2l6ZSA9IG5ld1NpemU7CiAJZXMtPnRleHQgPSBuZXdUZXh0OwogCUVESVRfTG9ja0J1ZmZlcih3bmQsIGVzKTsKLQlkcHJpbnRmX2luZm8oZWRpdCwgImVkaXQ6IEVNX0dFVEhBTkRMRTogc3dpdGNoZWQgdG8gMTYgYml0IGJ1ZmZlclxuIik7CisJVFJBQ0UoZWRpdCwgInN3aXRjaGVkIHRvIDE2IGJpdCBidWZmZXJcbiIpOwogCiAJcmV0dXJuIGVzLT5obG9jMTY7CiB9CkBAIC0yNTA0LDcgKzI1MDIsNyBAQAogCQlyZXR1cm47CiAKIAlpZiAoIWhsb2MpIHsKLQkJZnByaW50ZihzdGRlcnIsICJlZGl0OiBFTV9TRVRIQU5ETEUgY2FsbGVkIHdpdGggTlVMTCBoYW5kbGVcbiIpOworCQlXQVJOKGVkaXQsICJjYWxsZWQgd2l0aCBOVUxMIGhhbmRsZVxuIik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTI1NDcsNyArMjU0NSw3IEBACiAJCXJldHVybjsKIAogCWlmICghaGxvYykgewotCQlmcHJpbnRmKHN0ZGVyciwgImVkaXQ6IEVNX1NFVEhBTkRMRSBjYWxsZWQgd2l0aCBOVUxMIGhhbmRsZVxuIik7CisJCVdBUk4oZWRpdCwgImNhbGxlZCB3aXRoIE5VTEwgaGFuZGxlXG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMjYyMyw3ICsyNjIxLDcgQEAKIAkJaWYgKGFjdGlvbiAmIEVDX1JJR0hUTUFSR0lOKQogCQkJZXMtPnJpZ2h0X21hcmdpbiA9IHJpZ2h0OwogCX0KLQlkcHJpbnRmX2luZm8oZWRpdCwgIkVESVRfRU1fU2V0TWFyZ2luczogbGVmdD0lZCwgcmlnaHQ9JWRcbiIsIGVzLT5sZWZ0X21hcmdpbiwgZXMtPnJpZ2h0X21hcmdpbik7CisJVFJBQ0UoZWRpdCwgImxlZnQ9JWQsIHJpZ2h0PSVkXG4iLCBlcy0+bGVmdF9tYXJnaW4sIGVzLT5yaWdodF9tYXJnaW4pOwogfQogCiAKQEAgLTI4MDksOCArMjgwNyw4IEBACiAKIAlsc3RyY3B5MzJBKHV0ZXh0LCBlcy0+dW5kb190ZXh0KTsKIAotCWRwcmludGZfaW5mbyhlZGl0LCAiZWRpdDogYmVmb3JlIFVORE86aW5zZXJ0aW9uIGxlbmd0aCA9ICVkLCBkZWxldGlvbiBidWZmZXIgPSAlc1xuIiwKLQkJCWVzLT51bmRvX2luc2VydF9jb3VudCwgdXRleHQpOworCVRSQUNFKGVkaXQsICJiZWZvcmUgVU5ETzppbnNlcnRpb24gbGVuZ3RoID0gJWQsIGRlbGV0aW9uIGJ1ZmZlciA9ICVzXG4iLAorCQkgICAgIGVzLT51bmRvX2luc2VydF9jb3VudCwgdXRleHQpOwogCiAJRURJVF9FTV9TZXRTZWwod25kLCBlcywgZXMtPnVuZG9fcG9zaXRpb24sIGVzLT51bmRvX3Bvc2l0aW9uICsgZXMtPnVuZG9faW5zZXJ0X2NvdW50LCBGQUxTRSk7CiAJRURJVF9FTV9FbXB0eVVuZG9CdWZmZXIod25kLCBlcyk7CkBAIC0yODE4LDcgKzI4MTYsNyBAQAogCUVESVRfRU1fU2V0U2VsKHduZCwgZXMsIGVzLT51bmRvX3Bvc2l0aW9uLCBlcy0+dW5kb19wb3NpdGlvbiArIGVzLT51bmRvX2luc2VydF9jb3VudCwgRkFMU0UpOwogCUhlYXBGcmVlKGVzLT5oZWFwLCAwLCB1dGV4dCk7CiAKLQlkcHJpbnRmX2luZm8oZWRpdCwgImVkaXQ6IGFmdGVyIFVORE86IGluc2VydGlvbiBsZW5ndGggPSAlZCwgZGVsZXRpb24gYnVmZmVyID0gJXNcbiIsCisJVFJBQ0UoZWRpdCwgImFmdGVyIFVORE86aW5zZXJ0aW9uIGxlbmd0aCA9ICVkLCBkZWxldGlvbiBidWZmZXIgPSAlc1xuIiwKIAkJCWVzLT51bmRvX2luc2VydF9jb3VudCwgZXMtPnVuZG9fdGV4dCk7CiAKIAlyZXR1cm4gVFJVRTsKQEAgLTI4OTAsNyArMjg4OCw3IEBACiAJCQlFRElUX0VNX1Njcm9sbENhcmV0KHduZCwgZXMpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlkcHJpbnRmX2VycihlZGl0LCAiZWRpdDogdW5rbm93biBtZW51IGl0ZW0sIHBsZWFzZSByZXBvcnRcbiIpOworCQkJRVJSKGVkaXQsICJ1bmtub3duIG1lbnUgaXRlbSwgcGxlYXNlIHJlcG9ydFxuIik7CiAJCQlicmVhazsKIAl9CiB9CkBAIC0zMTM1LDkgKzMxMzMsOSBAQAogCUxSRVNVTFQgcmV0ID0gMDsKIAogCWlmICghKGVzLT5mbGFncyAmIEVGX0hTQ1JPTExfSEFDSykpIHsKLQkJZnByaW50ZihzdGRlcnIsICJlZGl0OiBoYWNrZWQgV01fSFNDUk9MTCBoYW5kbGVyIGludm9rZWRcbiIpOwotCQlmcHJpbnRmKHN0ZGVyciwgIiAgICAgIGlmIHlvdSBhcmUgX25vdF8gcnVubmluZyAxNiBiaXQgbm90ZXBhZCwgcGxlYXNlIHJlcG9ydFxuIik7Ci0JCWZwcmludGYoc3RkZXJyLCAiICAgICAgKHRoaXMgbWVzc2FnZSBpcyBvbmx5IGRpc3BsYXllZCBvbmNlIHBlciBlZGl0IGNvbnRyb2wpXG4iKTsKKwkJRVJSKGVkaXQsICJoYWNrZWQgV01fSFNDUk9MTCBoYW5kbGVyIGludm9rZWRcbiIpOworCQlFUlIoZWRpdCwgIiAgICAgIGlmIHlvdSBhcmUgX25vdF8gcnVubmluZyAxNiBiaXQgbm90ZXBhZCwgcGxlYXNlIHJlcG9ydFxuIik7CisJCUVSUihlZGl0LCAiICAgICAgKHRoaXMgbWVzc2FnZSBpcyBvbmx5IGRpc3BsYXllZCBvbmNlIHBlciBlZGl0IGNvbnRyb2wpXG4iKTsKIAkJZXMtPmZsYWdzIHw9IEVGX0hTQ1JPTExfSEFDSzsKIAl9CiAKQEAgLTMxOTIsNyArMzE5MCw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJZHByaW50Zl9lcnIoZWRpdCwgImVkaXQ6IHVuZG9jdW1lbnRlZCAoaGFja2VkKSBXTV9IU0NST0xMIHBhcmFtZXRlciwgcGxlYXNlIHJlcG9ydFxuIik7CisJCUVSUihlZGl0LCAidW5kb2N1bWVudGVkIChoYWNrZWQpIFdNX0hTQ1JPTEwgcGFyYW1ldGVyLCBwbGVhc2UgcmVwb3J0XG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCWlmIChkeCkKQEAgLTMyNjIsNyArMzI2MCw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJZnByaW50ZihzdGRlcnIsICJlZGl0OiB1bmRvY3VtZW50ZWQgV01fSFNDUk9MTCBwYXJhbWV0ZXIsIHBsZWFzZSByZXBvcnRcbiIpOworCQlFUlIoZWRpdCwgInVuZG9jdW1lbnRlZCBXTV9IU0NST0xMIHBhcmFtZXRlciwgcGxlYXNlIHJlcG9ydFxuIik7CiAJCXJldHVybiAwOwogCX0KIAlpZiAoZHgpCkBAIC0zMjg1LDggKzMyODMsOCBAQAogCQlIV05EMzIgaENvbWJvID0gd25kLT5wYXJlbnQtPmh3bmRTZWxmOwogCQlCT09MMzIgYlVJRmxpcCA9IFRSVUU7CiAKLQkJZHByaW50Zl9pbmZvKGNvbWJvLCAiRURJVF9DaGVja0NvbWJvIFslMDR4XTogaGFuZGxpbmcgbXNnICUwNHggKCUwNHgpXG4iLAotCQkJCQl3bmQtPmh3bmRTZWxmLCAoVUlOVDE2KW1zZywgKFVJTlQxNilrZXkpOworCQlUUkFDRShjb21ibywgIlslMDR4XTogaGFuZGxpbmcgbXNnICUwNHggKCUwNHgpXG4iLAorCQkJICAgICB3bmQtPmh3bmRTZWxmLCAoVUlOVDE2KW1zZywgKFVJTlQxNilrZXkpOwogCiAJCXN3aXRjaCAobXNnKSB7CiAJCWNhc2UgV01fS0VZRE9XTjogLyogSGFuZGxlIEY0IGFuZCBhcnJvdyBrZXlzICovCkBAIC0zNzE4LDcgKzM3MTYsNyBAQAogewogCUVESVRfRU1fU2V0U2VsKHduZCwgZXMsIDAsIC0xLCBGQUxTRSk7CiAJaWYgKHRleHQpIHsKLQkJZHByaW50Zl9pbmZvKGVkaXQsICJcdCclcydcbiIsIHRleHQpOworCQlUUkFDRShlZGl0LCAiXHQnJXMnXG4iLCB0ZXh0KTsKIAkJRURJVF9FTV9SZXBsYWNlU2VsKHduZCwgZXMsIEZBTFNFLCB0ZXh0KTsKIAkJZXMtPnhfb2Zmc2V0ID0gMDsKIAl9CkBAIC0zNzk2LDkgKzM3OTQsOSBAQAogCUxSRVNVTFQgcmV0ID0gMDsKIAogCWlmICghKGVzLT5mbGFncyAmIEVGX1ZTQ1JPTExfSEFDSykpIHsKLQkJZnByaW50ZihzdGRlcnIsICJlZGl0OiBoYWNrZWQgV01fVlNDUk9MTCBoYW5kbGVyIGludm9rZWRcbiIpOwotCQlmcHJpbnRmKHN0ZGVyciwgIiAgICAgIGlmIHlvdSBhcmUgX25vdF8gcnVubmluZyAxNiBiaXQgbm90ZXBhZCwgcGxlYXNlIHJlcG9ydFxuIik7Ci0JCWZwcmludGYoc3RkZXJyLCAiICAgICAgKHRoaXMgbWVzc2FnZSBpcyBvbmx5IGRpc3BsYXllZCBvbmNlIHBlciBlZGl0IGNvbnRyb2wpXG4iKTsKKwkJRVJSKGVkaXQsICJoYWNrZWQgV01fVlNDUk9MTCBoYW5kbGVyIGludm9rZWRcbiIpOworCQlFUlIoZWRpdCwgIiAgICAgIGlmIHlvdSBhcmUgX25vdF8gcnVubmluZyAxNiBiaXQgbm90ZXBhZCwgcGxlYXNlIHJlcG9ydFxuIik7CisJCUVSUihlZGl0LCAiICAgICAgKHRoaXMgbWVzc2FnZSBpcyBvbmx5IGRpc3BsYXllZCBvbmNlIHBlciBlZGl0IGNvbnRyb2wpXG4iKTsKIAkJZXMtPmZsYWdzIHw9IEVGX1ZTQ1JPTExfSEFDSzsKIAl9CiAKQEAgLTM4NDEsNyArMzgzOSw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJZnByaW50ZihzdGRlcnIsICJlZGl0OiB1bmRvY3VtZW50ZWQgKGhhY2tlZCkgV01fVlNDUk9MTCBwYXJhbWV0ZXIsIHBsZWFzZSByZXBvcnRcbiIpOworCQlFUlIoZWRpdCwgInVuZG9jdW1lbnRlZCAoaGFja2VkKSBXTV9WU0NST0xMIHBhcmFtZXRlciwgcGxlYXNlIHJlcG9ydFxuIik7CiAJCXJldHVybiAwOwogCX0KIAlpZiAoZHkpCkBAIC0zODk4LDcgKzM4OTYsNyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCWZwcmludGYoc3RkZXJyLCAiZWRpdDogdW5kb2N1bWVudGVkIFdNX1ZTQ1JPTEwgcGFyYW1ldGVyLCBwbGVhc2UgcmVwb3J0XG4iKTsKKwkJRVJSKGVkaXQsICJ1bmRvY3VtZW50ZWQgV01fVlNDUk9MTCBwYXJhbWV0ZXIsIHBsZWFzZSByZXBvcnRcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAJaWYgKGR5KQpkaWZmIC0tZ2l0IGEvY29udHJvbHMvbGlzdGJveC5jIGIvY29udHJvbHMvbGlzdGJveC5jCmluZGV4IGMxNTEyZTcuLmE5ODU1MjAgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL2xpc3Rib3guYworKysgYi9jb250cm9scy9saXN0Ym94LmMKQEAgLTMwOCw5ICszMDgsOSBAQAogICAgICAgICBpZiAoKGRlc2NyLT5oZWlnaHQgPiBkZXNjci0+aXRlbV9oZWlnaHQpICYmCiAgICAgICAgICAgICAoZGVzY3ItPmhlaWdodCAlIGRlc2NyLT5pdGVtX2hlaWdodCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGRwcmludGZfaW5mbyhsaXN0Ym94LCAiTGlzdGJveCAlMDR4OiBjaGFuZ2luZyBoZWlnaHQgJWQgLT4gJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd25kLT5od25kU2VsZiwgZGVzY3ItPmhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjci0+aGVpZ2h0IC0gZGVzY3ItPmhlaWdodCVkZXNjci0+aXRlbV9oZWlnaHQgKTsKKyAgICAgICAgICAgIFRSQUNFKGxpc3Rib3gsICJbJTA0eF06IGNoYW5naW5nIGhlaWdodCAlZCAtPiAlZFxuIiwKKwkJCSB3bmQtPmh3bmRTZWxmLCBkZXNjci0+aGVpZ2h0LAorCQkJIGRlc2NyLT5oZWlnaHQgLSBkZXNjci0+aGVpZ2h0JWRlc2NyLT5pdGVtX2hlaWdodCApOwogICAgICAgICAgICAgU2V0V2luZG93UG9zMzIoIHduZC0+aHduZFNlbGYsIDAsIDAsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd25kLT5yZWN0V2luZG93LnJpZ2h0IC0gd25kLT5yZWN0V2luZG93LmxlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd25kLT5yZWN0V2luZG93LmJvdHRvbSAtIHduZC0+cmVjdFdpbmRvdy50b3AgLQpAQCAtMzE5LDggKzMxOSw4IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICB9Ci0gICAgZHByaW50Zl9pbmZvKGxpc3Rib3gsICJMaXN0Ym94ICUwNHg6IG5ldyBzaXplID0gJWQsJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICB3bmQtPmh3bmRTZWxmLCBkZXNjci0+d2lkdGgsIGRlc2NyLT5oZWlnaHQgKTsKKyAgICBUUkFDRShsaXN0Ym94LCAiWyUwNHhdOiBuZXcgc2l6ZSA9ICVkLCVkXG4iLAorCQkgd25kLT5od25kU2VsZiwgZGVzY3ItPndpZHRoLCBkZXNjci0+aGVpZ2h0ICk7CiAgICAgTElTVEJPWF9VcGRhdGVQYWdlKCB3bmQsIGRlc2NyICk7CiAgICAgTElTVEJPWF9VcGRhdGVTY3JvbGwoIHduZCwgZGVzY3IgKTsKIH0KQEAgLTQ1NywxMSArNDU3LDExIEBACiAgICAgICAgIGlmICh3bmQtPmR3U3R5bGUgJiBXU19ESVNBQkxFRCkgZGlzLml0ZW1TdGF0ZSB8PSBPRFNfRElTQUJMRUQ7CiAgICAgICAgIGRpcy5pdGVtRGF0YSAgICAgPSBpdGVtID8gaXRlbS0+ZGF0YSA6IDA7CiAgICAgICAgIGRpcy5yY0l0ZW0gICAgICAgPSAqcmVjdDsKLSAgICAgICAgZHByaW50Zl9pbmZvKGxpc3Rib3gsICJMaXN0Ym94ICUwNHg6IGRyYXdpdGVtICVkICglcykgYWN0aW9uPSUwMnggIgotICAgICAgICAgICAgICAgICAgICAgICAgICJzdGF0ZT0lMDJ4IHJlY3Q9JWQsJWQtJWQsJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgd25kLT5od25kU2VsZiwgaW5kZXgsIGl0ZW0gPyBpdGVtLT5zdHIgOiAiIiwgYWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgIGRpcy5pdGVtU3RhdGUsIHJlY3QtPmxlZnQsIHJlY3QtPnRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LT5yaWdodCwgcmVjdC0+Ym90dG9tICk7CisgICAgICAgIFRSQUNFKGxpc3Rib3gsICJbJTA0eF06IGRyYXdpdGVtICVkICglcykgYWN0aW9uPSUwMnggIgorCQkgICAgICJzdGF0ZT0lMDJ4IHJlY3Q9JWQsJWQtJWQsJWRcbiIsCisJCSAgICAgd25kLT5od25kU2VsZiwgaW5kZXgsIGl0ZW0gPyBpdGVtLT5zdHIgOiAiIiwgYWN0aW9uLAorCQkgICAgIGRpcy5pdGVtU3RhdGUsIHJlY3QtPmxlZnQsIHJlY3QtPnRvcCwKKwkJICAgICByZWN0LT5yaWdodCwgcmVjdC0+Ym90dG9tICk7CiAgICAgICAgIFNlbmRNZXNzYWdlMzJBKGRlc2NyLT5vd25lciwgV01fRFJBV0lURU0sIGlkLCAoTFBBUkFNKSZkaXMpOwogICAgIH0KICAgICBlbHNlCkBAIC00NzksMTAgKzQ3OSwxMCBAQAogICAgICAgICAgICAgb2xkVGV4dCA9IFNldFRleHRDb2xvcjMyKCBoZGMsIEdldFN5c0NvbG9yMzIoQ09MT1JfSElHSExJR0hUVEVYVCkpOwogICAgICAgICB9CiAKLSAgICAgICAgZHByaW50Zl9pbmZvKGxpc3Rib3gsICJMaXN0Ym94ICUwNHg6IHBhaW50aW5nICVkICglcykgYWN0aW9uPSUwMnggIgotICAgICAgICAgICAgICAgICAgICAgICAgICJyZWN0PSVkLCVkLSVkLCVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgIHduZC0+aHduZFNlbGYsIGluZGV4LCBpdGVtID8gaXRlbS0+c3RyIDogIiIsIGFjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LT5sZWZ0LCByZWN0LT50b3AsIHJlY3QtPnJpZ2h0LCByZWN0LT5ib3R0b20gKTsKKyAgICAgICAgVFJBQ0UobGlzdGJveCwgIlslMDR4XTogcGFpbnRpbmcgJWQgKCVzKSBhY3Rpb249JTAyeCAiCisJCSAgICAgInJlY3Q9JWQsJWQtJWQsJWRcbiIsCisJCSAgICAgd25kLT5od25kU2VsZiwgaW5kZXgsIGl0ZW0gPyBpdGVtLT5zdHIgOiAiIiwgYWN0aW9uLAorCQkgICAgIHJlY3QtPmxlZnQsIHJlY3QtPnRvcCwgcmVjdC0+cmlnaHQsIHJlY3QtPmJvdHRvbSApOwogICAgICAgICBpZiAoIWl0ZW0pCiAgICAgICAgICAgICBFeHRUZXh0T3V0MzJBKCBoZGMsIHJlY3QtPmxlZnQgKyAxLCByZWN0LT50b3AgKyAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRVRPX09QQVFVRSB8IEVUT19DTElQUEVELCByZWN0LCBOVUxMLCAwLCBOVUxMICk7CkBAIC02MDYsMTEgKzYwNiwxMSBAQAogCiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkZXNjci0+bmJfdGFiczsgaSsrKSB7CiAJICAgIGRlc2NyLT50YWJzW2ldID0gKnArKzw8MTsgLyogRklYTUUgKi8KLQkgICAgaWYoZGVidWdnaW5nX2luZm8obGlzdGJveCkpCisJICAgIGlmKFRSQUNFX09OKGxpc3Rib3gpKQogICAgICAgICAgICAgICBkc3ByaW50ZihsaXN0Ym94LCAiJWhkICIsIGRlc2NyLT50YWJzW2ldKTsKIAl9Ci0gICAgICAgIGRwcmludGZfaW5mbyhsaXN0Ym94LCAiTGlzdGJveCAlMDR4OiBzZXR0YWJzdG9wcyAlc1xuIiwgCi0JCQkgd25kLT5od25kU2VsZiwgZGJnX3N0cihsaXN0Ym94KSk7CisgICAgICAgIFRSQUNFKGxpc3Rib3gsICJbJTA0eF06IHNldHRhYnN0b3BzICVzXG4iLCAKKwkJICAgICB3bmQtPmh3bmRTZWxmLCBkYmdfc3RyKGxpc3Rib3gpKTsKICAgICB9CiAgICAgZWxzZSBtZW1jcHkoIGRlc2NyLT50YWJzLCB0YWJzLCBkZXNjci0+bmJfdGFicyAqIHNpemVvZihJTlQzMikgKTsKICAgICAvKiBGSVhNRTogcmVwYWludCB0aGUgd2luZG93PyAqLwpAQCAtOTg4LDE2ICs5ODgsMTYgQEAKICAgICBpZiAoZGVzY3ItPnN0eWxlICYgTEJTX09XTkVSRFJBV1ZBUklBQkxFKQogICAgIHsKICAgICAgICAgaWYgKChpbmRleCA8IDApIHx8IChpbmRleCA+PSBkZXNjci0+bmJfaXRlbXMpKSByZXR1cm4gTEJfRVJSOwotICAgICAgICBkcHJpbnRmX2luZm8obGlzdGJveCwgIkxpc3Rib3ggJTA0eDogaXRlbSAlZCBoZWlnaHQgPSAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICB3bmQtPmh3bmRTZWxmLCBpbmRleCwgaGVpZ2h0ICk7CisgICAgICAgIFRSQUNFKGxpc3Rib3gsICJbJTA0eF06IGl0ZW0gJWQgaGVpZ2h0ID0gJWRcbiIsCisJCSAgICAgd25kLT5od25kU2VsZiwgaW5kZXgsIGhlaWdodCApOwogICAgICAgICBkZXNjci0+aXRlbXNbaW5kZXhdLmhlaWdodCA9IGhlaWdodDsKICAgICAgICAgTElTVEJPWF9VcGRhdGVTY3JvbGwoIHduZCwgZGVzY3IgKTsKICAgICAgICAgTElTVEJPWF9JbnZhbGlkYXRlSXRlbXMoIHduZCwgZGVzY3IsIGluZGV4ICk7CiAgICAgfQogICAgIGVsc2UgaWYgKGhlaWdodCAhPSBkZXNjci0+aXRlbV9oZWlnaHQpCiAgICAgewotICAgICAgICBkcHJpbnRmX2luZm8obGlzdGJveCwgIkxpc3Rib3ggJTA0eDogbmV3IGhlaWdodCA9ICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgIHduZC0+aHduZFNlbGYsIGhlaWdodCApOworICAgICAgICBUUkFDRShsaXN0Ym94LCAiWyUwNHhdOiBuZXcgaGVpZ2h0ID0gJWRcbiIsCisJCSAgICAgd25kLT5od25kU2VsZiwgaGVpZ2h0ICk7CiAgICAgICAgIGRlc2NyLT5pdGVtX2hlaWdodCA9IGhlaWdodDsKICAgICAgICAgTElTVEJPWF9VcGRhdGVQYWdlKCB3bmQsIGRlc2NyICk7CiAgICAgICAgIExJU1RCT1hfVXBkYXRlU2Nyb2xsKCB3bmQsIGRlc2NyICk7CkBAIC0xMDE4LDggKzEwMTgsOCBAQAogICAgICAgICBwb3MgPSBkZXNjci0+aG9yel9leHRlbnQgLSBkZXNjci0+d2lkdGg7CiAgICAgaWYgKHBvcyA8IDApIHBvcyA9IDA7CiAgICAgaWYgKCEoZGlmZiA9IGRlc2NyLT5ob3J6X3BvcyAtIHBvcykpIHJldHVybjsKLSAgICBkcHJpbnRmX2luZm8obGlzdGJveCwgIkxpc3Rib3ggJTA0eDogbmV3IGhvcnogcG9zID0gJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICB3bmQtPmh3bmRTZWxmLCBwb3MgKTsKKyAgICBUUkFDRShsaXN0Ym94LCAiWyUwNHhdOiBuZXcgaG9yeiBwb3MgPSAlZFxuIiwKKwkJIHduZC0+aHduZFNlbGYsIHBvcyApOwogICAgIGRlc2NyLT5ob3J6X3BvcyA9IHBvczsKICAgICBMSVNUQk9YX1VwZGF0ZVNjcm9sbCggd25kLCBkZXNjciApOwogICAgIGlmIChhYnMoZGlmZikgPCBkZXNjci0+d2lkdGgpCkBAIC0xMDQwLDggKzEwNDAsOCBAQAogICAgICAgICByZXR1cm4gTEJfT0tBWTsKICAgICBpZiAoZXh0ZW50IDw9IDApIGV4dGVudCA9IDE7CiAgICAgaWYgKGV4dGVudCA9PSBkZXNjci0+aG9yel9leHRlbnQpIHJldHVybiBMQl9PS0FZOwotICAgIGRwcmludGZfaW5mbyhsaXN0Ym94LCAiTGlzdGJveCAlMDR4OiBuZXcgaG9yeiBleHRlbnQgPSAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgIHduZC0+aHduZFNlbGYsIGV4dGVudCApOworICAgIFRSQUNFKGxpc3Rib3gsICJbJTA0eF06IG5ldyBob3J6IGV4dGVudCA9ICVkXG4iLAorCQkgd25kLT5od25kU2VsZiwgZXh0ZW50ICk7CiAgICAgZGVzY3ItPmhvcnpfZXh0ZW50ID0gZXh0ZW50OwogICAgIGlmIChkZXNjci0+aG9yel9wb3MgPiBleHRlbnQgLSBkZXNjci0+d2lkdGgpCiAgICAgICAgIExJU1RCT1hfU2V0SG9yaXpvbnRhbFBvcyggd25kLCBkZXNjciwgZXh0ZW50IC0gZGVzY3ItPndpZHRoICk7CkBAIC0xMDU4LDggKzEwNTgsOCBAQAogewogICAgIHdpZHRoICs9IDI7ICAvKiBGb3IgbGVmdCBhbmQgcmlnaHQgbWFyZ2luICovCiAgICAgaWYgKHdpZHRoID09IGRlc2NyLT5jb2x1bW5fd2lkdGgpIHJldHVybiBMQl9PS0FZOwotICAgIGRwcmludGZfaW5mbyhsaXN0Ym94LCAiTGlzdGJveCAlMDR4OiBuZXcgY29sdW1uIHdpZHRoID0gJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICB3bmQtPmh3bmRTZWxmLCB3aWR0aCApOworICAgIFRSQUNFKGxpc3Rib3gsICJbJTA0eF06IG5ldyBjb2x1bW4gd2lkdGggPSAlZFxuIiwKKwkJIHduZC0+aHduZFNlbGYsIHdpZHRoICk7CiAgICAgZGVzY3ItPmNvbHVtbl93aWR0aCA9IHdpZHRoOwogICAgIExJU1RCT1hfVXBkYXRlUGFnZSggd25kLCBkZXNjciApOwogICAgIHJldHVybiBMQl9PS0FZOwpAQCAtMTA4MSw3ICsxMDgxLDcgQEAKIAogICAgIGlmICghKGhkYyA9IEdldERDRXgzMiggd25kLT5od25kU2VsZiwgMCwgRENYX0NBQ0hFICkpKQogICAgIHsKLSAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiTElTVEJPWF9TZXRGb250OiB1bmFibGUgdG8gZ2V0IERDXG4iICk7CisgICAgICAgIEVSUihsaXN0Ym94LCAidW5hYmxlIHRvIGdldCBEQy5cbiIgKTsKICAgICAgICAgcmV0dXJuIDE2OwogICAgIH0KICAgICBpZiAoZm9udCkgb2xkRm9udCA9IFNlbGVjdE9iamVjdDMyKCBoZGMsIGZvbnQgKTsKQEAgLTEzMDcsOCArMTMwNyw4IEBACiAgICAgICAgIG1pcy5pdGVtSGVpZ2h0ID0gZGVzY3ItPml0ZW1faGVpZ2h0OwogICAgICAgICBTZW5kTWVzc2FnZTMyQSggZGVzY3ItPm93bmVyLCBXTV9NRUFTVVJFSVRFTSwgaWQsIChMUEFSQU0pJm1pcyApOwogICAgICAgICBpdGVtLT5oZWlnaHQgPSBtaXMuaXRlbUhlaWdodCA/IG1pcy5pdGVtSGVpZ2h0IDogMTsKLSAgICAgICAgZHByaW50Zl9pbmZvKGxpc3Rib3gsICJMaXN0Ym94ICUwNHg6IG1lYXN1cmUgaXRlbSAlZCAoJXMpID0gJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgd25kLT5od25kU2VsZiwgaW5kZXgsIHN0ciA/IHN0ciA6ICIiLCBpdGVtLT5oZWlnaHQgKTsKKyAgICAgICAgVFJBQ0UobGlzdGJveCwgIlslMDR4XTogbWVhc3VyZSBpdGVtICVkICglcykgPSAlZFxuIiwKKwkJICAgICB3bmQtPmh3bmRTZWxmLCBpbmRleCwgc3RyID8gc3RyIDogIiIsIGl0ZW0tPmhlaWdodCApOwogICAgIH0KIAogICAgIC8qIFJlcGFpbnQgdGhlIGl0ZW1zICovCkBAIC0xMzU5LDggKzEzNTksOCBAQAogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIAotICAgIGRwcmludGZfaW5mbyhsaXN0Ym94LCAiTGlzdGJveCAlMDR4OiBhZGRlZCBpdGVtICVkICclcydcbiIsCi0gICAgICAgICAgICAgICAgICAgICB3bmQtPmh3bmRTZWxmLCBpbmRleCwgSEFTX1NUUklOR1MoZGVzY3IpID8gbmV3X3N0ciA6ICIiICk7CisgICAgVFJBQ0UobGlzdGJveCwgIlslMDR4XTogYWRkZWQgaXRlbSAlZCAnJXMnXG4iLAorCQkgd25kLT5od25kU2VsZiwgaW5kZXgsIEhBU19TVFJJTkdTKGRlc2NyKSA/IG5ld19zdHIgOiAiIiApOwogICAgIHJldHVybiBpbmRleDsKIH0KIApAQCAtMTY5Niw4ICsxNjk2LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdQQVJBTTMyIHdQYXJhbSwgSU5UMzIgeCwgSU5UMzIgeSApCiB7CiAgICAgSU5UMzIgaW5kZXggPSBMSVNUQk9YX0dldEl0ZW1Gcm9tUG9pbnQoIHduZCwgZGVzY3IsIHgsIHkgKTsKLSAgICBkcHJpbnRmX2luZm8obGlzdGJveCwgIkxpc3Rib3ggJTA0eDogbGJ1dHRvbmRvd24gJWQsJWQgaXRlbSAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgIHduZC0+aHduZFNlbGYsIHgsIHksIGluZGV4ICk7CisgICAgVFJBQ0UobGlzdGJveCwgIlslMDR4XTogbGJ1dHRvbmRvd24gJWQsJWQgaXRlbSAlZFxuIiwKKwkJIHduZC0+aHduZFNlbGYsIHgsIHksIGluZGV4ICk7CiAgICAgaWYgKCFkZXNjci0+Y2FyZXRfb24gJiYgKEdldEZvY3VzMzIoKSA9PSB3bmQtPmh3bmRTZWxmKSkgcmV0dXJuIDA7CiAgICAgaWYgKGluZGV4ICE9IC0xKQogICAgIHsKQEAgLTIwMzEsOCArMjAzMSw4IEBACiAKICAgICBpZiggbHBoYyApCiAgICAgewotCWRwcmludGZfaW5mbyhjb21ibywiQ29tYm9MQm94IFslMDR4XTogcmVzZXR0aW5nIG93bmVyICUwNHggLT4gJTA0eFxuIiwKLQkJCSAgICAgIHduZC0+aHduZFNlbGYsIGRlc2NyLT5vd25lciwgbHBoYy0+c2VsZi0+aHduZFNlbGYgKTsKKwlUUkFDRShjb21ibywiWyUwNHhdOiByZXNldHRpbmcgb3duZXIgJTA0eCAtPiAlMDR4XG4iLAorCQkgICAgIHduZC0+aHduZFNlbGYsIGRlc2NyLT5vd25lciwgbHBoYy0+c2VsZi0+aHduZFNlbGYgKTsKIAlkZXNjci0+b3duZXIgPSBscGhjLT5zZWxmLT5od25kU2VsZjsKICAgICB9CiAKQEAgLTIxMDAsMTYgKzIxMDAsMTYgQEAKICAgICAgICAgaWYgKG1zZyA9PSBXTV9DUkVBVEUpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICghTElTVEJPWF9DcmVhdGUoIHduZCwgTlVMTCApKSByZXR1cm4gLTE7Ci0gICAgICAgICAgICBkcHJpbnRmX2luZm8obGlzdGJveCwgIkxpc3Rib3g6IGNyZWF0aW5nIHduZD0lMDR4IGRlc2NyPSVwXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBod25kLCAqKExCX0RFU0NSICoqKXduZC0+d0V4dHJhICk7CisgICAgICAgICAgICBUUkFDRShsaXN0Ym94LCAiY3JlYXRpbmcgd25kPSUwNHggZGVzY3I9JXBcbiIsCisJCQkgaHduZCwgKihMQl9ERVNDUiAqKil3bmQtPndFeHRyYSApOwogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KICAgICAgICAgLyogSWdub3JlIGFsbCBvdGhlciBtZXNzYWdlcyBiZWZvcmUgd2UgZ2V0IGEgV01fQ1JFQVRFICovCiAgICAgICAgIHJldHVybiBEZWZXaW5kb3dQcm9jMzJBKCBod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtICk7CiAgICAgfQogCi0gICAgZHByaW50Zl9pbmZvKGxpc3Rib3gsICJMaXN0Ym94ICUwNHg6IG1zZyAlcyB3cCAlMDh4IGxwICUwOGx4XG4iLAotICAgICAgICAgICAgICAgICAgICAgd25kLT5od25kU2VsZiwgU1BZX0dldE1zZ05hbWUobXNnKSwgd1BhcmFtLCBsUGFyYW0gKTsKKyAgICBUUkFDRShsaXN0Ym94LCAiWyUwNHhdOiBtc2cgJXMgd3AgJTA4eCBscCAlMDhseFxuIiwKKwkJIHduZC0+aHduZFNlbGYsIFNQWV9HZXRNc2dOYW1lKG1zZyksIHdQYXJhbSwgbFBhcmFtICk7CiAgICAgc3dpdGNoKG1zZykKICAgICB7CiAgICAgY2FzZSBMQl9SRVNFVENPTlRFTlQxNjoKQEAgLTI0NzgsOCArMjQ3OCw4IEBACiAKICAgICBkZWZhdWx0OgogICAgICAgICBpZiAoKG1zZyA+PSBXTV9VU0VSKSAmJiAobXNnIDwgMHhjMDAwKSkKLSAgICAgICAgICAgIGRwcmludGZfd2FybihsaXN0Ym94LCAiTGlzdGJveCAlMDR4OiB1bmtub3duIG1zZyAlMDR4IHdwICUwOHggbHAgJTA4bHhcbiIsCi0gICAgICAgICAgICAgICAgICAgIGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0gKTsKKyAgICAgICAgICAgIFdBUk4obGlzdGJveCwgIlslMDR4XTogdW5rbm93biBtc2cgJTA0eCB3cCAlMDh4IGxwICUwOGx4XG4iLAorCQkJIGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0gKTsKICAgICAgICAgcmV0dXJuIERlZldpbmRvd1Byb2MzMkEoIGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0gKTsKICAgICB9CiAgICAgcmV0dXJuIDA7CkBAIC0yNTIzLDggKzI1MjMsOCBAQAogICAgIHsKIAlMQl9ERVNDUiAqZGVzY3IgPSAqKExCX0RFU0NSICoqKXduZC0+d0V4dHJhOwogCi0gICAgICAgIGRwcmludGZfaW5mbyhjb21ibywgIkNvbWJvTEJveCBbJTA0eF06IG1zZyAlcyB3cCAlMDh4IGxwICUwOGx4XG4iLAotICAgICAgICAgICAgICAgICAgICAgICB3bmQtPmh3bmRTZWxmLCBTUFlfR2V0TXNnTmFtZShtc2cpLCB3UGFyYW0sIGxQYXJhbSApOworICAgICAgICBUUkFDRShjb21ibywgIlslMDR4XTogbXNnICVzIHdwICUwOHggbHAgJTA4bHhcbiIsCisJCSAgICAgd25kLT5od25kU2VsZiwgU1BZX0dldE1zZ05hbWUobXNnKSwgd1BhcmFtLCBsUGFyYW0gKTsKIAogCWlmKCBkZXNjciB8fCBtc2cgPT0gV01fQ1JFQVRFICkKICAgICAgICAgewpAQCAtMjUzNCw4ICsyNTM0LDggQEAKIAkgICAgewogCQljYXNlIFdNX0NSRUFURToKICNkZWZpbmUgbHBjcwkoKExQQ1JFQVRFU1RSVUNUMzJBKWxQYXJhbSkKLQkJICAgICBkcHJpbnRmX2luZm8oY29tYm8sICJcdHBhc3NlZCBwYXJlbnQgaGFuZGxlID0gMHglMDh4XG4iLCAKLQkJCQkJICAgICAgICAgKFVJTlQzMilscGNzLT5scENyZWF0ZVBhcmFtcyk7CisJCSAgICAgVFJBQ0UoY29tYm8sICJcdHBhc3NlZCBwYXJlbnQgaGFuZGxlID0gMHglMDh4XG4iLCAKKwkJCQkgIChVSU5UMzIpbHBjcy0+bHBDcmVhdGVQYXJhbXMpOwogCiAJCSAgICAgbHBoYyA9IChMUEhFQURDT01CTykobHBjcy0+bHBDcmVhdGVQYXJhbXMpOwogI3VuZGVmICBscGNzCkBAIC0yNTgwLDcgKzI1ODAsNyBAQAogICAgICAgICB9CiAgICAgICAgIGxSZXQgPSBEZWZXaW5kb3dQcm9jMzJBKCBod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtICk7CiAKLSAgICAgICAgZHByaW50Zl9pbmZvKGNvbWJvLCJcdENvbWJvTEJveDogZGVmYXVsdCBvbiBtc2cgWyUwNHhdXG4iLCAoVUlOVDE2KW1zZyApOworICAgICAgICBUUkFDRShjb21ibywiXHQgZGVmYXVsdCBvbiBtc2cgWyUwNHhdXG4iLCAoVUlOVDE2KW1zZyApOwogICAgIH0KIAogICAgIHJldHVybiBsUmV0OwpkaWZmIC0tZ2l0IGEvY29udHJvbHMvbWVudS5jIGIvY29udHJvbHMvbWVudS5jCmluZGV4IDI0YWVjZDQuLjEyZGUwOWIgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL21lbnUuYworKysgYi9jb250cm9scy9tZW51LmMKQEAgLTE2NCw3ICsxNjQsNyBAQAogICovCiAKICNkZWZpbmUgZGVidWdfcHJpbnRfbWVudWl0ZW0ocHJlLCBtcCwgcG9zdCkgXAotICBpZighZGVidWdnaW5nX2luZm8obWVudSkpIDsgZWxzZSBkb19kZWJ1Z19wcmludF9tZW51aXRlbShwcmUsIG1wLCBwb3N0KQorICBpZighVFJBQ0VfT04obWVudSkpIDsgZWxzZSBkb19kZWJ1Z19wcmludF9tZW51aXRlbShwcmUsIG1wLCBwb3N0KQogCiAjZGVmaW5lIE1FTlVPVVQodGV4dCkgXAogICBkc3ByaW50ZihtZW51LCAiJXMlcyIsIChjb3VudCsrID8gIiwiIDogIiIpLCAodGV4dCkpCkBAIC0yNDMsNyArMjQzLDcgQEAKIAlkc3ByaW50ZihtZW51LCAiTlVMTCIpOwogICAgIH0KIAotICAgIGRwcmludGZfaW5mbyhtZW51LCAiJXMgJXMgJXNcbiIsIHByZWZpeCwgZGJnX3N0cihtZW51KSwgcG9zdGZpeCk7CisgICAgVFJBQ0UobWVudSwgIiVzICVzICVzXG4iLCBwcmVmaXgsIGRiZ19zdHIobWVudSksIHBvc3RmaXgpOwogfQogCiAjdW5kZWYgTUVOVU9VVApAQCAtMjY0LDEwICsyNjQsMTAgQEAKICAgICB9CiAgICAgZWxzZSB7CiAJaE1lbnUgPSAwOwotCWZwcmludGYoIHN0ZGVyciwgIlVuYWJsZSB0byBsb2FkIGRlZmF1bHQgc3lzdGVtIG1lbnVcbiIgKTsKKwlFUlIobWVudSwgIlVuYWJsZSB0byBsb2FkIGRlZmF1bHQgc3lzdGVtIG1lbnVcbiIgKTsKICAgICB9CiAKLSAgICBkcHJpbnRmX2luZm8obWVudSwgIk1FTlVfQ29weVN5c1BvcHVwOiByZXR1cm5pbmcgJXguXG4iLCBoTWVudSApOworICAgIFRSQUNFKG1lbnUsICJyZXR1cm5pbmcgJXguXG4iLCBoTWVudSApOwogCiAgICAgcmV0dXJuIGhNZW51OwogfQpAQCAtMzA1LDEyICszMDUsMTIgQEAKIAkgICAgbWVudSA9IChQT1BVUE1FTlUqKSBVU0VSX0hFQVBfTElOX0FERFIoaFBvcHVwTWVudSk7CiAJICAgIG1lbnUtPndGbGFncyB8PSBNRl9TWVNNRU5VOwogCi0JICAgIGRwcmludGZfaW5mbyhtZW51LCJHZXRTeXNNZW51IGhNZW51PSUwNHggKCUwNHgpXG4iLCBoTWVudSwgaFBvcHVwTWVudSApOworCSAgICBUUkFDRShtZW51LCJHZXRTeXNNZW51IGhNZW51PSUwNHggKCUwNHgpXG4iLCBoTWVudSwgaFBvcHVwTWVudSApOwogCSAgICByZXR1cm4gaE1lbnU7CiAJfQogCURlc3Ryb3lNZW51MzIoIGhNZW51ICk7CiAgICAgfQotICAgIGZwcmludGYoc3RkZXJyLCAiZmFpbGVkIHRvIGxvYWQgc3lzdGVtIG1lbnUhXG4iKTsKKyAgICBFUlIobWVudSwgImZhaWxlZCB0byBsb2FkIHN5c3RlbSBtZW51IVxuIik7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTQ1Myw3ICs0NTMsNyBAQAogCSAgICBicmVhazsKICAgICB9CiAKLSAgICBkcHJpbnRmX2luZm8obWVudSwgIk1FTlVfR2V0U3RhcnRPZlByZXZDb2x1bW46IHJldCAlZC5cbiIsIGkgKTsKKyAgICBUUkFDRShtZW51LCAicmV0ICVkLlxuIiwgaSApOwogCiAgICAgcmV0dXJuIGk7CiB9CkBAIC01NTIsNyArNTUyLDcgQEAKIHN0YXRpYyBVSU5UMzIgTUVOVV9GaW5kSXRlbUJ5S2V5KCBIV05EMzIgaHduZE93bmVyLCBITUVOVTMyIGhtZW51LCAKIAkJCQkgIFVJTlQzMiBrZXksIEJPT0wzMiBmb3JjZU1lbnVDaGFyICkKIHsKLSAgICBkcHJpbnRmX2luZm8obWVudSwiXHRsb29raW5nIGZvciAnJWMnIGluIFslMDR4XVxuIiwgKGNoYXIpa2V5LCAoVUlOVDE2KWhtZW51ICk7CisgICAgVFJBQ0UobWVudSwiXHRsb29raW5nIGZvciAnJWMnIGluIFslMDR4XVxuIiwgKGNoYXIpa2V5LCAoVUlOVDE2KWhtZW51ICk7CiAKICAgICBpZiAoIUlzTWVudTMyKCBobWVudSApKSAKICAgICB7CkBAIC02MDAsNyArNjAwLDcgQEAKICAgICBEV09SRCBkd1NpemU7CiAgICAgY2hhciAqcDsKIAotICAgIGRwcmludGZfaW5mbyhtZW51LCAiTUVOVV9DYWxjSXRlbVNpemU6IEhEQyAweCV4IGF0ICglZCwlZClcbiIsCisgICAgVFJBQ0UobWVudSwgIkhEQyAweCV4IGF0ICglZCwlZClcbiIsCiAgICAgICAgICAgICAgICAgIGhkYywgb3JnWCwgb3JnWSk7CiAgICAgZGVidWdfcHJpbnRfbWVudWl0ZW0oIk1FTlVfQ2FsY0l0ZW1TaXplOiBtZW51aXRlbToiLCBscGl0ZW0sIAogCQkJIChtZW51QmFyID8gIiAoTWVudUJhcikiIDogIiIpKTsKQEAgLTYxOCw3ICs2MTgsNyBAQAogICAgICAgICBTZW5kTWVzc2FnZTMyQSggaHduZE93bmVyLCBXTV9NRUFTVVJFSVRFTSwgMCwgKExQQVJBTSkmbWlzICk7CiAgICAgICAgIGxwaXRlbS0+cmVjdC5ib3R0b20gKz0gbWlzLml0ZW1IZWlnaHQ7CiAgICAgICAgIGxwaXRlbS0+cmVjdC5yaWdodCAgKz0gbWlzLml0ZW1XaWR0aDsKLSAgICAgICAgZHByaW50Zl9pbmZvKG1lbnUsICJNRU5VX0NhbGNJdGVtU2l6ZTogJTA4eCAlZHglZFxuIiwKKyAgICAgICAgVFJBQ0UobWVudSwgIiUwOHggJWR4JWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICBscGl0ZW0tPndJRCwgbWlzLml0ZW1XaWR0aCwgbWlzLml0ZW1IZWlnaHQpOwogICAgICAgICByZXR1cm47CiAgICAgfSAKQEAgLTc1Myw3ICs3NTMsNyBAQAogCiAgICAgaWYgKChscHJlY3QgPT0gTlVMTCkgfHwgKGxwcG9wID09IE5VTEwpKSByZXR1cm47CiAgICAgaWYgKGxwcG9wLT5uSXRlbXMgPT0gMCkgcmV0dXJuOwotICAgIGRwcmludGZfaW5mbyhtZW51LCJNRU5VX01lbnVCYXJDYWxjU2l6ZSBsZWZ0PSVkIHRvcD0lZCByaWdodD0lZCBib3R0b209JWRcbiIsIAorICAgIFRSQUNFKG1lbnUsIk1FTlVfTWVudUJhckNhbGNTaXplIGxlZnQ9JWQgdG9wPSVkIHJpZ2h0PSVkIGJvdHRvbT0lZFxuIiwgCiAgICAgICAgICAgICAgICAgIGxwcmVjdC0+bGVmdCwgbHByZWN0LT50b3AsIGxwcmVjdC0+cmlnaHQsIGxwcmVjdC0+Ym90dG9tKTsKICAgICBscHBvcC0+V2lkdGggID0gbHByZWN0LT5yaWdodCAtIGxwcmVjdC0+bGVmdDsKICAgICBscHBvcC0+SGVpZ2h0ID0gMDsKQEAgLTc3Myw5ICs3NzMsOCBAQAogCSAgICBpZiAoKGkgIT0gc3RhcnQpICYmCiAJCShscGl0ZW0tPmZUeXBlICYgKE1GX01FTlVCUkVBSyB8IE1GX01FTlVCQVJCUkVBSykpKSBicmVhazsKIAotCSAgICBkcHJpbnRmX2luZm8obWVudSwKLQkJCSAgIk1FTlVfTWVudUJhckNhbGNTaXplOiBjYWxsaW5nIE1FTlVfQ2FsY0l0ZW1TaXplIgotCQkJICAiIG9yZz0oJWQsICVkKVxuIiwgb3JnWCwgb3JnWSApOworCSAgICBUUkFDRShtZW51LCAiY2FsbGluZyBNRU5VX0NhbGNJdGVtU2l6ZSBvcmc9KCVkLCAlZClcbiIsIAorCQkJIG9yZ1gsIG9yZ1kgKTsKIAkgICAgZGVidWdfcHJpbnRfbWVudWl0ZW0gKCIgIGl0ZW06ICIsIGxwaXRlbSwgIiIpOwogCSAgICBNRU5VX0NhbGNJdGVtU2l6ZSggaGRjLCBscGl0ZW0sIGh3bmRPd25lciwgb3JnWCwgb3JnWSwgVFJVRSApOwogCSAgICBpZiAobHBpdGVtLT5yZWN0LnJpZ2h0ID4gbHByZWN0LT5yaWdodCkKQEAgLTg0NCw3ICs4NDMsNyBAQAogICAgIHsKICAgICAgICAgRFJBV0lURU1TVFJVQ1QzMiBkaXM7CiAKLSAgICAgICAgZHByaW50Zl9pbmZvKG1lbnUsICJEcmF3TWVudUl0ZW06IE93bmVyZHJhdyFcbiIgKTsKKyAgICAgICAgVFJBQ0UobWVudSwgIk93bmVyZHJhdyFcbiIgKTsKICAgICAgICAgZGlzLkN0bFR5cGUgICA9IE9EVF9NRU5VOwogICAgICAgICBkaXMuaXRlbUlEICAgID0gbHBpdGVtLT53SUQ7CiAgICAgICAgIGRpcy5pdGVtRGF0YSAgPSAoRFdPUkQpbHBpdGVtLT50ZXh0OwpAQCAtMTEzNyw3ICsxMTM2LDcgQEAKICAgICAKICAgICBscHBvcCA9IChMUFBPUFVQTUVOVSkgVVNFUl9IRUFQX0xJTl9BRERSKCAoSE1FTlUxNil3bmRQdHItPndJRG1lbnUgKTsKICAgICBpZiAobHBwb3AgPT0gTlVMTCB8fCBscHJlY3QgPT0gTlVMTCkgcmV0dXJuIFNZU01FVFJJQ1NfQ1lNRU5VOwotICAgIGRwcmludGZfaW5mbyhtZW51LCJNRU5VX0RyYXdNZW51QmFyKCUwNHgsICVwLCAlcCk7ICFcbiIsIAorICAgIFRSQUNFKG1lbnUsIiglMDR4LCAlcCwgJXApOyAhXG4iLCAKIAkJIGhEQywgbHByZWN0LCBscHBvcCk7CiAgICAgaWYgKGxwcG9wLT5IZWlnaHQgPT0gMCkgTUVOVV9NZW51QmFyQ2FsY1NpemUoaERDLCBscHJlY3QsIGxwcG9wLCBod25kKTsKICAgICBscHJlY3QtPmJvdHRvbSA9IGxwcmVjdC0+dG9wICsgbHBwb3AtPkhlaWdodDsKQEAgLTExNzIsNyArMTE3MSw3IEBACiAgICAgewogCUhUQVNLMTYgaFRhc2sgPSAwOwogCi0JZHByaW50Zl9pbmZvKG1lbnUsInBhdGNoaW5nIHJlc2lkZW50IHBvcHVwOiAlMDR4ICUwNHggWyUwNHggJTA0eF1cbiIsIAorCVRSQUNFKG1lbnUsInBhdGNoaW5nIHJlc2lkZW50IHBvcHVwOiAlMDR4ICUwNHggWyUwNHggJTA0eF1cbiIsIAogCQljaGVja1F1ZXVlLCBjaGVja1duZCA/IGNoZWNrV25kLT5od25kU2VsZiA6IDAsIHBUb3BQb3B1cFduZC0+aG1lbVRhc2tRLCAKIAkJcFRvcFBvcHVwV25kLT5vd25lciA/IHBUb3BQb3B1cFduZC0+b3duZXItPmh3bmRTZWxmIDogMCk7CiAKQEAgLTEyMTAsNyArMTIwOSw3IEBACiAJCXBUb3BQb3B1cFduZC0+aG1lbVRhc2tRID0gdGFzay0+aFF1ZXVlOwogCQlyZXR1cm4gVFJVRTsKIAkgICAgfSAKLQkgICAgZWxzZSBkcHJpbnRmX3dhcm4obWVudSwiZmFpbGVkIHRvIHBhdGNoIHJlc2lkZW50IHBvcHVwLlxuIik7CisJICAgIGVsc2UgV0FSTihtZW51LCJmYWlsZWQgdG8gcGF0Y2ggcmVzaWRlbnQgcG9wdXAuXG4iKTsKIAl9IAogICAgIH0KICAgICByZXR1cm4gRkFMU0U7CkBAIC0xNDg4LDcgKzE0ODcsNyBAQAogCiAgICAgaWYgKCEobWVudSA9IChQT1BVUE1FTlUgKilVU0VSX0hFQVBfTElOX0FERFIoaE1lbnUpKSkgCiAgICAgewotICAgICAgICBkcHJpbnRmX3dhcm4obWVudSwgIk1FTlVfSW5zZXJ0SXRlbTogJTA0eCBub3QgYSBtZW51IGhhbmRsZVxuIiwKKyAgICAgICAgV0FSTihtZW51LCAiJTA0eCBub3QgYSBtZW51IGhhbmRsZVxuIiwKICAgICAgICAgICAgICAgICAgICAgICBoTWVudSApOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC0xNTA2LDEzICsxNTA1LDEzIEBACiAgICAgewogICAgICAgICBpZiAoIU1FTlVfRmluZEl0ZW0oICZoTWVudSwgJnBvcywgZmxhZ3MgKSkgCiAgICAgICAgIHsKLSAgICAgICAgICAgIGRwcmludGZfd2FybihtZW51LCAiTUVOVV9JbnNlcnRJdGVtOiBpdGVtICV4IG5vdCBmb3VuZFxuIiwKKyAgICAgICAgICAgIFdBUk4obWVudSwgIml0ZW0gJXggbm90IGZvdW5kXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MgKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAgICAgICAgIGlmICghKG1lbnUgPSAoTFBQT1BVUE1FTlUpIFVTRVJfSEVBUF9MSU5fQUREUihoTWVudSkpKQogICAgICAgICB7Ci0gICAgICAgICAgICBkcHJpbnRmX3dhcm4obWVudSwiTUVOVV9JbnNlcnRJdGVtOiAlMDR4IG5vdCBhIG1lbnUgaGFuZGxlXG4iLAorICAgICAgICAgICAgV0FSTihtZW51LCIlMDR4IG5vdCBhIG1lbnUgaGFuZGxlXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgIGhNZW51KTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CkBAIC0xNTIzLDcgKzE1MjIsNyBAQAogICAgIG5ld0l0ZW1zID0gSGVhcEFsbG9jKCBTeXN0ZW1IZWFwLCAwLCBzaXplb2YoTUVOVUlURU0pICogKG1lbnUtPm5JdGVtcysxKSApOwogICAgIGlmICghbmV3SXRlbXMpCiAgICAgewotICAgICAgICBkcHJpbnRmX3dhcm4obWVudSwgIk1FTlVfSW5zZXJ0SXRlbTogYWxsb2NhdGlvbiBmYWlsZWRcbiIgKTsKKyAgICAgICAgV0FSTihtZW51LCAiYWxsb2NhdGlvbiBmYWlsZWRcbiIgKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIGlmIChtZW51LT5uSXRlbXMgPiAwKQpAQCAtMTU2Miw4ICsxNTYxLDcgQEAKICAgICAgICAgICAgIHJlcyArPSBzaXplb2YoV09SRCk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFJU19TVFJJTkdfSVRFTShmbGFncykpCi0gICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJNRU5VX1BhcnNlUmVzb3VyY2U6IG5vdCBhIHN0cmluZyBpdGVtICUwNHhcbiIsCi0gICAgICAgICAgICAgICAgICAgICBmbGFncyApOworICAgICAgICAgICAgRVJSKG1lbnUsICJub3QgYSBzdHJpbmcgaXRlbSAlMDR4XG4iLCBmbGFncyApOwogICAgICAgICBzdHIgPSByZXM7CiAgICAgICAgIGlmICghdW5pY29kZSkgcmVzICs9IHN0cmxlbihzdHIpICsgMTsKICAgICAgICAgZWxzZSByZXMgKz0gKGxzdHJsZW4zMlcoKExQQ1dTVFIpc3RyKSArIDEpICogc2l6ZW9mKFdDSEFSKTsKQEAgLTE2MjAsOSArMTYxOCw5IEBACiAJewogCSAgICBMUFNUUiBuZXdzdHIgPSBIRUFQX3N0cmR1cFd0b0EoR2V0UHJvY2Vzc0hlYXAoKSwKIAkJCQkJICAgMCwgbWlpLmR3VHlwZURhdGEpOwotCSAgICBkcHJpbnRmX2luZm8obWVudSwgIk1lbnUgaXRlbTogWyUwOHgsJTA4eCwlMDR4LCUwNHgsJXNdXG4iLAorCSAgICBUUkFDRShtZW51LCAiTWVudSBpdGVtOiBbJTA4eCwlMDh4LCUwNHgsJTA0eCwlc11cbiIsCiAJCQkgbWlpLmZUeXBlLCBtaWkuZlN0YXRlLCBtaWkud0lELCByZXNpbmZvLCBuZXdzdHIpOwotCSAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIG5ld3N0ciApOworCSAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbmV3c3RyICk7CiAJfQogCiAJaWYgKHJlc2luZm8gJiAxKSB7CS8qIFBvcC11cD8gKi8KQEAgLTE4MzQsNyArMTgzMiw3IEBACiAKICAgICBpdGVtID0gJm1lbnUtPml0ZW1zW21lbnUtPkZvY3VzZWRJdGVtXTsKIAotICAgIGRwcmludGZfaW5mbyhtZW51LCAiTUVOVV9FeGVjRm9jdXNlZEl0ZW06ICUwOHggJTA4eCAlMDh4XG4iLAorICAgIFRSQUNFKG1lbnUsICIlMDh4ICUwOHggJTA4eFxuIiwKICAgICAgICAgICAgICAgICAgaE1lbnUsIGl0ZW0tPndJRCwgaXRlbS0+aFN1Yk1lbnUpOwogCiAgICAgaWYgKCEoaXRlbS0+ZlR5cGUgJiBNRl9QT1BVUCkpCkBAIC0xOTI5LDcgKzE5MjcsNyBAQAogCSAgICBwbXQtPmhDdXJyZW50TWVudSA9IE1FTlVfU2hvd1N1YlBvcHVwKCBwbXQtPmhPd25lclduZCwgaFB0TWVudSwgRkFMU0UgKTsKIAkgICAgcmV0dXJuIFRSVUU7CiAJfSAKLQllbHNlIGRwcmludGZfd2FybihtZW51LCAiXHR1bmFibGUgdG8gZmluZCBjbGlja2VkIGl0ZW0hXG4iKTsKKwllbHNlIFdBUk4obWVudSwgIlx0dW5hYmxlIHRvIGZpbmQgY2xpY2tlZCBpdGVtIVxuIik7CiAgICAgfQogICAgIHJldHVybiBGQUxTRTsKIH0KQEAgLTIwMjMsNyArMjAyMSw3IEBACiAJTFJFU1VMVCBsID0gU2VuZE1lc3NhZ2UxNiggcG10LT5oT3duZXJXbmQsIFdNX05FWFRNRU5VLCAoV1BBUkFNMTYpdmssIAogCQkoSVNfU1lTVEVNX01FTlUobWVudSkpID8gR2V0U3ViTWVudTE2KHBtdC0+aFRvcE1lbnUsMCkgOiBwbXQtPmhUb3BNZW51ICk7CiAKLQlkcHJpbnRmX2luZm8obWVudSwiTmV4dE1lbnU6ICUwNHggWyUwNHhdIC0+ICUwNHggWyUwNHhdXG4iLAorCVRSQUNFKG1lbnUsIiUwNHggWyUwNHhdIC0+ICUwNHggWyUwNHhdXG4iLAogCQkgICAgIChVSU5UMTYpcG10LT5oQ3VycmVudE1lbnUsIChVSU5UMTYpcG10LT5oT3duZXJXbmQsIExPV09SRChsKSwgSElXT1JEKGwpICk7CiAKIAlpZiggbCA9PSAwICkKQEAgLTIwNzEsNyArMjA2OSw3IEBACiAJCSAgICAvKiBGSVhNRTogTm90IHN1cmUgd2hhdCB0byBkbyBoZXJlLCBwZXJoYXBzLAogCQkgICAgICogdHJ5IHRvIHRyYWNrIGhOZXdNZW51IGFzIGEgcG9wdXA/ICovCiAKLQkJICAgIGRwcmludGZfaW5mbyhtZW51LCJNRU5VX0RvTmV4dE1lbnUoKSBnb3QgY29uZnVzZWQuXG4iKTsKKwkJICAgIFRSQUNFKG1lbnUsIiAtLSBnb3QgY29uZnVzZWQuXG4iKTsKIAkJICAgIHJldHVybiBGQUxTRTsKIAkJfQogCSAgICB9CkBAIC0yMjAyLDcgKzIyMDAsNyBAQAogICAgIFBPUFVQTUVOVSAqbWVudSA9IChQT1BVUE1FTlUgKikgVVNFUl9IRUFQX0xJTl9BRERSKCBwbXQtPmhUb3BNZW51ICk7CiAgICAgVUlOVDMyICBuZXh0Y29sOwogCi0gICAgZHByaW50Zl9pbmZvKG1lbnUsICJNRU5VX0tleVJpZ2h0IGNhbGxlZCwgY3VyICV4ICglcyksIHRvcCAleCAoJXMpLlxuIiwKKyAgICBUUkFDRShtZW51LCAiTUVOVV9LZXlSaWdodCBjYWxsZWQsIGN1ciAleCAoJXMpLCB0b3AgJXggKCVzKS5cbiIsCiAJCSAgcG10LT5oQ3VycmVudE1lbnUsCiAJCSAgKChQT1BVUE1FTlUgKilVU0VSX0hFQVBfTElOX0FERFIocG10LT5oQ3VycmVudE1lbnUpKS0+CiAJCSAgICAgaXRlbXNbMF0udGV4dCwKQEAgLTIyMjIsNyArMjIyMCw3IEBACiAgICAgLyogQ2hlY2sgdG8gc2VlIGlmIHRoZXJlJ3MgYW5vdGhlciBjb2x1bW4gKi8KICAgICBpZiggKG5leHRjb2wgPSBNRU5VX0dldFN0YXJ0T2ZOZXh0Q29sdW1uKCBwbXQtPmhDdXJyZW50TWVudSApKSAhPSAKIAlOT19TRUxFQ1RFRF9JVEVNICkgewotCWRwcmludGZfaW5mbyhtZW51LCAiS2V5UmlnaHQ6IEdvaW5nIHRvICVkLlxuIiwgbmV4dGNvbCApOworCVRSQUNFKG1lbnUsICJHb2luZyB0byAlZC5cbiIsIG5leHRjb2wgKTsKIAlNRU5VX1NlbGVjdEl0ZW0oIHBtdC0+aE93bmVyV25kLCBwbXQtPmhDdXJyZW50TWVudSwKIAkJCSBuZXh0Y29sLCBUUlVFICk7CiAJcmV0dXJuOwpAQCAtMjU2NSw3ICsyNTYzLDcgQEAKIEJPT0wzMiBXSU5BUEkgVHJhY2tQb3B1cE1lbnVFeCggSE1FTlUzMiBoTWVudSwgVUlOVDMyIHdGbGFncywgSU5UMzIgeCwgSU5UMzIgeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFdORDMyIGhXbmQsIExQVFBNUEFSQU1TIGxwVHBtICkKIHsKLSAgICBmcHJpbnRmKCBzdGRlcnIsICJUcmFja1BvcHVwTWVudUV4OiBub3QgZnVsbHkgaW1wbGVtZW50ZWRcbiIgKTsKKyAgICBGSVhNRShtZW51LCAibm90IGZ1bGx5IGltcGxlbWVudGVkXG4iICk7CiAgICAgcmV0dXJuIFRyYWNrUG9wdXBNZW51MzIoIGhNZW51LCB3RmxhZ3MsIHgsIHksIDAsIGhXbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwVHBtID8gJmxwVHBtLT5yY0V4Y2x1ZGUgOiBOVUxMICk7CiB9CkBAIC0yNjExLDcgKzI2MDksNyBAQAogCiAJaWYoIGh3bmQgPT0gcFRvcFBvcHVwV25kLT5od25kU2VsZiApCiAJewkKLQkgICAgZHByaW50Zl9lcnIobWVudSwgInJlc2lkZW50IHBvcHVwIGRlc3Ryb3llZCFcbiIpOworCSAgICBFUlIobWVudSwgInJlc2lkZW50IHBvcHVwIGRlc3Ryb3llZCFcbiIpOwogCiAJICAgIHBUb3BQb3B1cFduZCA9IE5VTEw7IAogCSAgICB1U3ViUFduZExldmVsID0gMDsgCkBAIC0yNjI1LDcgKzI2MjMsNyBAQAogCWlmKCB3UGFyYW0gKQogCXsKIAkgICAgaWYoICEoKihITUVOVTMyKil3bmRQdHItPndFeHRyYSkgKQotCQlmcHJpbnRmKHN0ZGVyciwiTWVudVduZFByb2M6IG5vIG1lbnUgdG8gZGlzcGxheVxuIik7CisJCUVSUihtZW51LCJubyBtZW51IHRvIGRpc3BsYXlcbiIpOwogCX0KIAllbHNlCiAJICAgICooSE1FTlUzMiopd25kUHRyLT53RXh0cmEgPSAwOwpAQCAtMjY2MCw3ICsyNjU4LDcgQEAKICAgICBXTkQgKnduZFB0cjsKICAgICBMUFBPUFVQTUVOVSBscHBvcDsKIAotICAgIGRwcmludGZfaW5mbyhtZW51LCAiTUVOVV9HZXRNZW51QmFySGVpZ2h0OiBIV05EIDB4JXgsIHdpZHRoICVkLCAiCisgICAgVFJBQ0UobWVudSwgIkhXTkQgMHgleCwgd2lkdGggJWQsICIKIAkJICAiYXQgKCVkLCAlZCkuXG4iLCBod25kLCBtZW51YmFyV2lkdGgsIG9yZ1gsIG9yZ1kgKTsKICAgICAKICAgICBpZiAoISh3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApKSkgcmV0dXJuIDA7CkBAIC0yNjgwLDcgKzI2NzgsNyBAQAogQk9PTDE2IFdJTkFQSSBDaGFuZ2VNZW51MTYoIEhNRU5VMTYgaE1lbnUsIFVJTlQxNiBwb3MsIFNFR1BUUiBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiBpZCwgVUlOVDE2IGZsYWdzICkKIHsKLSAgICBkcHJpbnRmX2luZm8obWVudSwiQ2hhbmdlTWVudTE2OiBtZW51PSUwNHggcG9zPSVkIGRhdGE9JTA4bHggaWQ9JTA0eCBmbGFncz0lMDR4XG4iLAorICAgIFRSQUNFKG1lbnUsIm1lbnU9JTA0eCBwb3M9JWQgZGF0YT0lMDhseCBpZD0lMDR4IGZsYWdzPSUwNHhcbiIsCiAgICAgICAgICAgICAgICAgICBoTWVudSwgcG9zLCAoRFdPUkQpZGF0YSwgaWQsIGZsYWdzICk7CiAgICAgaWYgKGZsYWdzICYgTUZfQVBQRU5EKSByZXR1cm4gQXBwZW5kTWVudTE2KCBoTWVudSwgZmxhZ3MgJiB+TUZfQVBQRU5ELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsIGRhdGEgKTsKQEAgLTI3MDYsNyArMjcwNCw3IEBACiBCT09MMzIgV0lOQVBJIENoYW5nZU1lbnUzMkEoIEhNRU5VMzIgaE1lbnUsIFVJTlQzMiBwb3MsIExQQ1NUUiBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMzIgaWQsIFVJTlQzMiBmbGFncyApCiB7Ci0gICAgZHByaW50Zl9pbmZvKG1lbnUsIkNoYW5nZU1lbnUzMkE6IG1lbnU9JTA4eCBwb3M9JWQgZGF0YT0lMDhseCBpZD0lMDh4IGZsYWdzPSUwOHhcbiIsCisgICAgVFJBQ0UobWVudSwibWVudT0lMDh4IHBvcz0lZCBkYXRhPSUwOGx4IGlkPSUwOHggZmxhZ3M9JTA4eFxuIiwKICAgICAgICAgICAgICAgICAgIGhNZW51LCBwb3MsIChEV09SRClkYXRhLCBpZCwgZmxhZ3MgKTsKICAgICBpZiAoZmxhZ3MgJiBNRl9BUFBFTkQpIHJldHVybiBBcHBlbmRNZW51MzJBKCBoTWVudSwgZmxhZ3MgJiB+TUZfQVBQRU5ELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLCBkYXRhICk7CkBAIC0yNzI3LDcgKzI3MjUsNyBAQAogQk9PTDMyIFdJTkFQSSBDaGFuZ2VNZW51MzJXKCBITUVOVTMyIGhNZW51LCBVSU5UMzIgcG9zLCBMUENXU1RSIGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiBpZCwgVUlOVDMyIGZsYWdzICkKIHsKLSAgICBkcHJpbnRmX2luZm8obWVudSwiQ2hhbmdlTWVudTMyVzogbWVudT0lMDh4IHBvcz0lZCBkYXRhPSUwOGx4IGlkPSUwOHggZmxhZ3M9JTA4eFxuIiwKKyAgICBUUkFDRShtZW51LCJtZW51PSUwOHggcG9zPSVkIGRhdGE9JTA4bHggaWQ9JTA4eCBmbGFncz0lMDh4XG4iLAogICAgICAgICAgICAgICAgICAgaE1lbnUsIHBvcywgKERXT1JEKWRhdGEsIGlkLCBmbGFncyApOwogICAgIGlmIChmbGFncyAmIE1GX0FQUEVORCkgcmV0dXJuIEFwcGVuZE1lbnUzMlcoIGhNZW51LCBmbGFncyAmIH5NRl9BUFBFTkQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsIGRhdGEgKTsKQEAgLTI3NTksNyArMjc1Nyw3IEBACiAgICAgTUVOVUlURU0gKml0ZW07CiAgICAgRFdPUkQgcmV0OwogCi0gICAgZHByaW50Zl9pbmZvKG1lbnUsIkNoZWNrTWVudUl0ZW06ICUwNHggJTA0eCAlMDR4XG4iLCBoTWVudSwgaWQsIGZsYWdzICk7CisgICAgVFJBQ0UobWVudSwiJTA0eCAlMDR4ICUwNHhcbiIsIGhNZW51LCBpZCwgZmxhZ3MgKTsKICAgICBpZiAoIShpdGVtID0gTUVOVV9GaW5kSXRlbSggJmhNZW51LCAmaWQsIGZsYWdzICkpKSByZXR1cm4gLTE7CiAgICAgcmV0ID0gaXRlbS0+ZlN0YXRlICYgTUZfQ0hFQ0tFRDsKICAgICBpZiAoZmxhZ3MgJiBNRl9DSEVDS0VEKSBpdGVtLT5mU3RhdGUgfD0gTUZfQ0hFQ0tFRDsKQEAgLTI3ODUsOCArMjc4Myw4IEBACiAgICAgQk9PTDMyICAgIGJSZXQgPSBGQUxTRTsKICAgICBNRU5VSVRFTSAqaXRlbSwgKmZpcnN0ID0gTlVMTDsKIAotICAgIGRwcmludGZfaW5mbyhtZW51LCJFbmFibGVNZW51SXRlbSAoJTA0eCwgJTA0WCwgJTA0WCkgIVxuIiwgCi0JCSAgICAgICAgICAgICAgICAgICAgICAgIGhNZW51LCB3SXRlbUlELCB3RmxhZ3MpOworICAgIFRSQUNFKG1lbnUsIiglMDR4LCAlMDRYLCAlMDRYKSAhXG4iLCAKKwkJIGhNZW51LCB3SXRlbUlELCB3RmxhZ3MpOwogCiAgICAgd2hpbGUoIChpdGVtID0gTUVOVV9GaW5kSXRlbSggJmhNZW51LCAmd0l0ZW1JRCwgd0ZsYWdzICkpICkKICAgICB7CkBAIC0yODMzLDE0ICsyODMxLDE0IEBACiB7CiAgICAgTUVOVUlURU0gKml0ZW07CiAKLSAgICBkcHJpbnRmX2luZm8obWVudSwgIkdldE1lbnVTdHJpbmczMkE6IG1lbnU9JTA0eCBpdGVtPSUwNHggcHRyPSVwIGxlbj0lZCBmbGFncz0lMDR4XG4iLAorICAgIFRSQUNFKG1lbnUsICJtZW51PSUwNHggaXRlbT0lMDR4IHB0cj0lcCBsZW49JWQgZmxhZ3M9JTA0eFxuIiwKICAgICAgICAgICAgICAgICAgaE1lbnUsIHdJdGVtSUQsIHN0ciwgbk1heFNpeiwgd0ZsYWdzICk7CiAgICAgaWYgKCFzdHIgfHwgIW5NYXhTaXopIHJldHVybiAwOwogICAgIHN0clswXSA9ICdcMCc7CiAgICAgaWYgKCEoaXRlbSA9IE1FTlVfRmluZEl0ZW0oICZoTWVudSwgJndJdGVtSUQsIHdGbGFncyApKSkgcmV0dXJuIDA7CiAgICAgaWYgKCFJU19TVFJJTkdfSVRFTShpdGVtLT5mVHlwZSkpIHJldHVybiAwOwogICAgIGxzdHJjcHluMzJBKCBzdHIsIGl0ZW0tPnRleHQsIG5NYXhTaXogKTsKLSAgICBkcHJpbnRmX2luZm8obWVudSwgIkdldE1lbnVTdHJpbmczMkE6IHJldHVybmluZyAnJXMnXG4iLCBzdHIgKTsKKyAgICBUUkFDRShtZW51LCAicmV0dXJuaW5nICclcydcbiIsIHN0ciApOwogICAgIHJldHVybiBzdHJsZW4oc3RyKTsKIH0KIApAQCAtMjg1Myw3ICsyODUxLDcgQEAKIHsKICAgICBNRU5VSVRFTSAqaXRlbTsKIAotICAgIGRwcmludGZfaW5mbyhtZW51LCAiR2V0TWVudVN0cmluZzMyVzogbWVudT0lMDR4IGl0ZW09JTA0eCBwdHI9JXAgbGVuPSVkIGZsYWdzPSUwNHhcbiIsCisgICAgVFJBQ0UobWVudSwgIm1lbnU9JTA0eCBpdGVtPSUwNHggcHRyPSVwIGxlbj0lZCBmbGFncz0lMDR4XG4iLAogICAgICAgICAgICAgICAgICBoTWVudSwgd0l0ZW1JRCwgc3RyLCBuTWF4U2l6LCB3RmxhZ3MgKTsKICAgICBpZiAoIXN0ciB8fCAhbk1heFNpeikgcmV0dXJuIDA7CiAgICAgc3RyWzBdID0gJ1wwJzsKQEAgLTI4ODEsNyArMjg3OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiB3SGlsaXRlICkKIHsKICAgICBMUFBPUFVQTUVOVSBtZW51OwotICAgIGRwcmludGZfaW5mbyhtZW51LCJIaWxpdGVNZW51SXRlbSglMDR4LCAlMDR4LCAlMDR4LCAlMDR4KTtcbiIsIAorICAgIFRSQUNFKG1lbnUsIiglMDR4LCAlMDR4LCAlMDR4LCAlMDR4KTtcbiIsIAogICAgICAgICAgICAgICAgICBoV25kLCBoTWVudSwgd0l0ZW1JRCwgd0hpbGl0ZSk7CiAgICAgaWYgKCFNRU5VX0ZpbmRJdGVtKCAmaE1lbnUsICZ3SXRlbUlELCB3SGlsaXRlICkpIHJldHVybiBGQUxTRTsKICAgICBpZiAoIShtZW51ID0gKExQUE9QVVBNRU5VKSBVU0VSX0hFQVBfTElOX0FERFIoaE1lbnUpKSkgcmV0dXJuIEZBTFNFOwpAQCAtMjkwNyw3ICsyOTA1LDcgQEAKIFVJTlQzMiBXSU5BUEkgR2V0TWVudVN0YXRlMzIoIEhNRU5VMzIgaE1lbnUsIFVJTlQzMiB3SXRlbUlELCBVSU5UMzIgd0ZsYWdzICkKIHsKICAgICBNRU5VSVRFTSAqaXRlbTsKLSAgICBkcHJpbnRmX2luZm8obWVudSwiR2V0TWVudVN0YXRlKCUwNHgsICUwNHgsICUwNHgpO1xuIiwgCisgICAgVFJBQ0UobWVudSwiKCUwNHgsICUwNHgsICUwNHgpO1xuIiwgCiAJCSBoTWVudSwgd0l0ZW1JRCwgd0ZsYWdzKTsKICAgICBpZiAoIShpdGVtID0gTUVOVV9GaW5kSXRlbSggJmhNZW51LCAmd0l0ZW1JRCwgd0ZsYWdzICkpKSByZXR1cm4gLTE7CiAgICAgZGVidWdfcHJpbnRfbWVudWl0ZW0gKCIgIGl0ZW06ICIsIGl0ZW0sICIiKTsKQEAgLTI5MzQsNyArMjkzMiw3IEBACiB7CiAgICAgTFBQT1BVUE1FTlUJbWVudSA9IChMUFBPUFVQTUVOVSkgVVNFUl9IRUFQX0xJTl9BRERSKGhNZW51KTsKICAgICBpZiAoIUlTX0FfTUVOVShtZW51KSkgcmV0dXJuIC0xOwotICAgIGRwcmludGZfaW5mbyhtZW51LCJHZXRNZW51SXRlbUNvdW50MTYoJTA0eCkgcmV0dXJuaW5nICVkXG4iLCAKKyAgICBUUkFDRShtZW51LCIoJTA0eCkgcmV0dXJuaW5nICVkXG4iLCAKICAgICAgICAgICAgICAgICAgIGhNZW51LCBtZW51LT5uSXRlbXMgKTsKICAgICByZXR1cm4gbWVudS0+bkl0ZW1zOwogfQpAQCAtMjk0Nyw3ICsyOTQ1LDcgQEAKIHsKICAgICBMUFBPUFVQTUVOVQltZW51ID0gKExQUE9QVVBNRU5VKSBVU0VSX0hFQVBfTElOX0FERFIoaE1lbnUpOwogICAgIGlmICghSVNfQV9NRU5VKG1lbnUpKSByZXR1cm4gLTE7Ci0gICAgZHByaW50Zl9pbmZvKG1lbnUsIkdldE1lbnVJdGVtQ291bnQzMiglMDR4KSByZXR1cm5pbmcgJWRcbiIsIAorICAgIFRSQUNFKG1lbnUsIiglMDR4KSByZXR1cm5pbmcgJWRcbiIsIAogICAgICAgICAgICAgICAgICAgaE1lbnUsIG1lbnUtPm5JdGVtcyApOwogICAgIHJldHVybiBtZW51LT5uSXRlbXM7CiB9CkBAIC0zMDA0LDEwICszMDAyLDEwIEBACiAgICAgTUVOVUlURU0gKml0ZW07CiAKICAgICBpZiAoSVNfU1RSSU5HX0lURU0oZmxhZ3MpICYmIHN0cikKLSAgICAgICAgZHByaW50Zl9pbmZvKG1lbnUsICJJbnNlcnRNZW51OiBoTWVudSAlMDR4LCBwb3MgJWQsIGZsYWdzICUwOHgsICIKKyAgICAgICAgVFJBQ0UobWVudSwgImhNZW51ICUwNHgsIHBvcyAlZCwgZmxhZ3MgJTA4eCwgIgogCQkgICAgICAiaWQgJTA0eCwgc3RyICclcydcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgaE1lbnUsIHBvcywgZmxhZ3MsIGlkLCBzdHIgKTsKLSAgICBlbHNlIGRwcmludGZfaW5mbyhtZW51LCAiSW5zZXJ0TWVudTogaE1lbnUgJTA0eCwgcG9zICVkLCBmbGFncyAlMDh4LCAiCisgICAgZWxzZSBUUkFDRShtZW51LCAiaE1lbnUgJTA0eCwgcG9zICVkLCBmbGFncyAlMDh4LCAiCiAJCSAgICAgICAiaWQgJTA0eCwgc3RyICUwOGx4IChub3QgYSBzdHJpbmcpXG4iLAogICAgICAgICAgICAgICAgICAgICAgICBoTWVudSwgcG9zLCBmbGFncywgaWQsIChEV09SRClzdHIgKTsKIApAQCAtMzA5Myw3ICszMDkxLDcgQEAKICAgICBMUFBPUFVQTUVOVQltZW51OwogICAgIE1FTlVJVEVNICppdGVtOwogCi0gICAgZHByaW50Zl9pbmZvKG1lbnUsIlJlbW92ZU1lbnUgKCUwNHgsICUwNHgsICUwNHgpXG4iLGhNZW51LCBuUG9zLCB3RmxhZ3MpOworICAgIFRSQUNFKG1lbnUsIiglMDR4LCAlMDR4LCAlMDR4KVxuIixoTWVudSwgblBvcywgd0ZsYWdzKTsKICAgICBpZiAoIShpdGVtID0gTUVOVV9GaW5kSXRlbSggJmhNZW51LCAmblBvcywgd0ZsYWdzICkpKSByZXR1cm4gRkFMU0U7CiAgICAgaWYgKCEobWVudSA9IChMUFBPUFVQTUVOVSkgVVNFUl9IRUFQX0xJTl9BRERSKGhNZW51KSkpIHJldHVybiBGQUxTRTsKICAgICAKQEAgLTMxNjcsMTMgKzMxNjUsMTMgQEAKIAogICAgIGlmIChJU19TVFJJTkdfSVRFTShmbGFncykpCiAgICAgewotCWRwcmludGZfaW5mbyhtZW51LCAiTW9kaWZ5TWVudTogJTA0eCAlZCAlMDR4ICUwNHggJyVzJ1xuIiwKKwlUUkFDRShtZW51LCAiJTA0eCAlZCAlMDR4ICUwNHggJyVzJ1xuIiwKICAgICAgICAgICAgICAgICAgICAgICBoTWVudSwgcG9zLCBmbGFncywgaWQsIHN0ciA/IHN0ciA6ICIjTlVMTCMiICk7CiAgICAgICAgIGlmICghc3RyKSByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0JZHByaW50Zl9pbmZvKG1lbnUsICJNb2RpZnlNZW51OiAlMDR4ICVkICUwNHggJTA0eCAlMDhseFxuIiwKKwlUUkFDRShtZW51LCAiJTA0eCAlZCAlMDR4ICUwNHggJTA4bHhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgaE1lbnUsIHBvcywgZmxhZ3MsIGlkLCAoRFdPUkQpc3RyICk7CiAgICAgfQogCkBAIC0zMjUxLDcgKzMyNDksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEJJVE1BUDMyIGhOZXdVbkNoZWNrLCBIQklUTUFQMzIgaE5ld0NoZWNrKQogewogICAgIE1FTlVJVEVNICppdGVtOwotICAgIGRwcmludGZfaW5mbyhtZW51LCJTZXRNZW51SXRlbUJpdG1hcHMoJTA0eCwgJTA0eCwgJTA0eCwgJTA0eCwgJTA0eClcbiIsCisgICAgVFJBQ0UobWVudSwiKCUwNHgsICUwNHgsICUwNHgsICUwNHgsICUwNHgpXG4iLAogICAgICAgICAgICAgICAgICBoTWVudSwgblBvcywgd0ZsYWdzLCBoTmV3Q2hlY2ssIGhOZXdVbkNoZWNrKTsKICAgICBpZiAoIShpdGVtID0gTUVOVV9GaW5kSXRlbSggJmhNZW51LCAmblBvcywgd0ZsYWdzICkpKSByZXR1cm4gRkFMU0U7CiAKQEAgLTMyOTYsNyArMzI5NCw3IEBACiAgICAgbWVudS0+aFduZCAgID0gMDsKICAgICBtZW51LT5pdGVtcyAgPSBOVUxMOwogICAgIG1lbnUtPkZvY3VzZWRJdGVtID0gTk9fU0VMRUNURURfSVRFTTsKLSAgICBkcHJpbnRmX2luZm8obWVudSwgIkNyZWF0ZU1lbnU6IHJldHVybiAlMDR4XG4iLCBoTWVudSApOworICAgIFRSQUNFKG1lbnUsICJyZXR1cm4gJTA0eFxuIiwgaE1lbnUgKTsKICAgICByZXR1cm4gaE1lbnU7CiB9CiAKQEAgLTMzMTUsNyArMzMxMyw3IEBACiAgKi8KIEJPT0wzMiBXSU5BUEkgRGVzdHJveU1lbnUzMiggSE1FTlUzMiBoTWVudSApCiB7Ci0gICAgZHByaW50Zl9pbmZvKG1lbnUsIkRlc3Ryb3lNZW51KCUwNHgpXG4iLCBoTWVudSk7CisgICAgVFJBQ0UobWVudSwiKCUwNHgpXG4iLCBoTWVudSk7CiAKICAgICAvKiBTaWxlbnRseSBpZ25vcmUgYXR0ZW1wdHMgdG8gZGVzdHJveSBkZWZhdWx0IHN5c3RlbSBwb3B1cCAqLwogCkBAIC0zNDYzLDcgKzM0NjEsNyBAQAogewogICAgIFdORCAqIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGhXbmQpOwogCi0gICAgZHByaW50Zl9pbmZvKG1lbnUsIlNldE1lbnUoJTA0eCwgJTA0eCk7XG4iLCBoV25kLCBoTWVudSk7CisgICAgVFJBQ0UobWVudSwiKCUwNHgsICUwNHgpO1xuIiwgaFduZCwgaE1lbnUpOwogCiAgICAgaWYgKHduZFB0ciAmJiAhKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0NISUxEKSkKICAgICB7CkBAIC0zNTc1LDExICszNTczLDExIEBACiAgICAgaWYgKEhJV09SRChuYW1lKSkKICAgICB7CiAgICAgICAgIGNoYXIgKnN0ciA9IChjaGFyICopUFRSX1NFR19UT19MSU4oIG5hbWUgKTsKLSAgICAgICAgZHByaW50Zl9pbmZvKG1lbnUsICJMb2FkTWVudSglMDR4LCclcycpXG4iLCBpbnN0YW5jZSwgc3RyICk7CisgICAgICAgIFRSQUNFKG1lbnUsICIoJTA0eCwnJXMnKVxuIiwgaW5zdGFuY2UsIHN0ciApOwogICAgICAgICBpZiAoc3RyWzBdID09ICcjJykgbmFtZSA9IChTRUdQVFIpYXRvaSggc3RyICsgMSApOwogICAgIH0KICAgICBlbHNlCi0gICAgICAgIGRwcmludGZfaW5mbyhyZXNvdXJjZSwiTG9hZE1lbnUoJTA0eCwlMDR4KVxuIixpbnN0YW5jZSxMT1dPUkQobmFtZSkpOworICAgICAgICBUUkFDRShyZXNvdXJjZSwiKCUwNHgsJTA0eClcbiIsaW5zdGFuY2UsTE9XT1JEKG5hbWUpKTsKIAogICAgIGlmICghbmFtZSkgcmV0dXJuIDA7CiAgICAgCkBAIC0zNjI3LDEyICszNjI1LDEyIEBACiAgICAgV09SRCB2ZXJzaW9uLCBvZmZzZXQ7CiAgICAgTFBDU1RSIHAgPSAoTFBDU1RSKXRlbXBsYXRlOwogCi0gICAgZHByaW50Zl9pbmZvKG1lbnUsIkxvYWRNZW51SW5kaXJlY3QxNjogJXBcbiIsIHRlbXBsYXRlICk7CisgICAgVFJBQ0UobWVudSwiKCVwKVxuIiwgdGVtcGxhdGUgKTsKICAgICB2ZXJzaW9uID0gR0VUX1dPUkQocCk7CiAgICAgcCArPSBzaXplb2YoV09SRCk7CiAgICAgaWYgKHZlcnNpb24pCiAgICAgewotICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJMb2FkTWVudUluZGlyZWN0MTY6IHZlcnNpb24gbXVzdCBiZSAwIGZvciBXaW4xNlxuIiApOworICAgICAgICBXQVJOKG1lbnUsICJ2ZXJzaW9uIG11c3QgYmUgMCBmb3IgV2luMTZcbiIgKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIG9mZnNldCA9IEdFVF9XT1JEKHApOwpAQCAtMzY1Niw3ICszNjU0LDcgQEAKICAgICBXT1JEIHZlcnNpb24sIG9mZnNldDsKICAgICBMUENTVFIgcCA9IChMUENTVFIpdGVtcGxhdGU7CiAKLSAgICBkcHJpbnRmX2luZm8obWVudSwiTG9hZE1lbnVJbmRpcmVjdDMyQTogJXBcbiIsIHRlbXBsYXRlICk7CisgICAgVFJBQ0UobWVudSwiJXBcbiIsIHRlbXBsYXRlICk7CiAgICAgdmVyc2lvbiA9IEdFVF9XT1JEKHApOwogICAgIHAgKz0gc2l6ZW9mKFdPUkQpOwogICAgIHN3aXRjaCAodmVyc2lvbikKQEAgLTM2ODIsOCArMzY4MCw3IEBACiAJICB9CiAJcmV0dXJuIGhNZW51OwogICAgICAgZGVmYXVsdDoKLSAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiTG9hZE1lbnVJbmRpcmVjdDMyQTogdmVyc2lvbiAlZCBub3Qgc3VwcG9ydGVkLlxuIiwKLSAgICAgICAgICAgICAgICAgdmVyc2lvbiApOworICAgICAgICBFUlIobWVudSwgInZlcnNpb24gJWQgbm90IHN1cHBvcnRlZC5cbiIsIHZlcnNpb24pOwogICAgICAgICByZXR1cm4gMDsKICAgICAgIH0KIH0KQEAgLTM4NjcsOCArMzg2NCw4IEBACiAgICAgTUVOVUlURU0gKm1lbnUgPSBNRU5VX0ZpbmRJdGVtKCZobWVudSwgJml0ZW0sIGJ5cG9zKTsKICAgICBpZiAoIW1lbnUpIHJldHVybiBGQUxTRTsKICAgICBkZWJ1Z19wcmludF9tZW51aXRlbSgiU2V0TWVudURlZmF1bHRJdGVtMzI6ICIsIG1lbnUsICIiKTsKLSAgICBmcHJpbnRmKHN0ZG5pbXAsICJTZXRNZW51RGVmYXVsdEl0ZW0zMiAoMHgleCwlZCwlZCksIGVtcHR5IHN0dWIhXG4iLAotCSAgICBobWVudSwgaXRlbSwgYnlwb3MpOworICAgIEZJWE1FKG1lbnUsICIoMHgleCwlZCwlZCksIGVtcHR5IHN0dWIhXG4iLAorCQkgIGhtZW51LCBpdGVtLCBieXBvcyk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKQEAgLTM5MzEsOSArMzkyOCw4IEBACiAgICAgIE1FTlVJVEVNICptaWZpcnN0LCAqbWlsYXN0LCAqbWljaGVjazsKICAgICAgSE1FTlUzMiBtZmlyc3QgPSBoTWVudSwgbWxhc3QgPSBoTWVudSwgbWNoZWNrID0gaE1lbnU7CiAKLSAgICAgZHByaW50Zl9pbmZvKG1lbnUsCi0JCSAgICJDaGVja01lbnVSYWRpb0l0ZW0zMjogb3gleDogJWQtJWQsIGNoZWNrICVkLCBieXBvcz0lZFxuIiwKLQkJICAgaE1lbnUsIGZpcnN0LCBsYXN0LCBjaGVjaywgYnlwb3MpOworICAgICBUUkFDRShtZW51LCAib3gleDogJWQtJWQsIGNoZWNrICVkLCBieXBvcz0lZFxuIiwKKwkJICBoTWVudSwgZmlyc3QsIGxhc3QsIGNoZWNrLCBieXBvcyk7CiAKICAgICAgbWlmaXJzdCA9IE1FTlVfRmluZEl0ZW0gKCZtZmlyc3QsICZmaXJzdCwgYnlwb3MpOwogICAgICBtaWxhc3QgPSBNRU5VX0ZpbmRJdGVtICgmbWxhc3QsICZsYXN0LCBieXBvcyk7CkBAIC0zOTg1LDggKzM5ODEsOCBAQAogICAgICBNRU5VSVRFTSAqaXRlbTsKICAgICAgSE1FTlUzMiBvcmdoTWVudSA9IGhNZW51OwogCi0gICAgIGRwcmludGZfaW5mbyhtZW51LCAiR2V0TWVudUl0ZW1SZWN0MzIgKDB4JXgsMHgleCwlZCwlcClcbiIsCi0JCSAgIGh3bmQsIGhNZW51LCB1SXRlbSwgcmVjdCk7CisgICAgIFRSQUNFKG1lbnUsICIoMHgleCwweCV4LCVkLCVwKVxuIiwKKwkJICBod25kLCBoTWVudSwgdUl0ZW0sIHJlY3QpOwogCiAgICAgIGl0ZW0gPSBNRU5VX0ZpbmRJdGVtICgmaE1lbnUsICZ1SXRlbSwgTUZfQllQT1NJVElPTik7CiAgICAgIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyIChod25kKTsKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL3Byb2dyZXNzLmMgYi9jb250cm9scy9wcm9ncmVzcy5jCmluZGV4IDQyNmMyYzQuLjM4ODEyYTAgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL3Byb2dyZXNzLmMKKysrIGIvY29udHJvbHMvcHJvZ3Jlc3MuYwpAQCAtMjYsOCArMjYsOCBAQAogCiAvKiBXb3JrIGNvbnN0YW50cyAqLwogCi0jZGVmaW5lIFVOS05PV05fUEFSQU0obXNnLCB3UGFyYW0sIGxQYXJhbSkgZHByaW50Zl93YXJuKHByb2dyZXNzLCBcCi0gICAgICAgICJQcm9ncmVzcyBDdHJsOiBVbmtub3duIHBhcmFtZXRlcihzKSBmb3IgbWVzc2FnZSAiICNtc2cgICAgIFwKKyNkZWZpbmUgVU5LTk9XTl9QQVJBTShtc2csIHdQYXJhbSwgbFBhcmFtKSBXQVJOKHByb2dyZXNzLCBcCisgICAgICAgICJVbmtub3duIHBhcmFtZXRlcihzKSBmb3IgbWVzc2FnZSAiICNtc2cgICAgIFwKIAkiKCUwNHgpOiB3cD0lMDR4IGxwPSUwOGx4XG4iLCBtc2csIHdQYXJhbSwgbFBhcmFtKTsgCiAKICNkZWZpbmUgUFJPR1JFU1NfR2V0SW5mb1B0cih3bmRQdHIpICgoUFJPR1JFU1NfSU5GTyAqKXduZFB0ci0+d0V4dHJhKQpAQCAtNDcsOCArNDcsOCBAQAogICBSRUNUMzIgcmVjdDsKICAgSERDMzIgaGRjOwogCi0gIGRwcmludGZfaW5mbyhwcm9ncmVzcywgIlByb2dyZXNzIEJhcjogcGFpbnQgcG9zPSVkIG1pbj0lZCwgbWF4PSVkXG4iLAotCQkgICBpbmZvUHRyLT5DdXJWYWwsIGluZm9QdHItPk1pblZhbCwgaW5mb1B0ci0+TWF4VmFsKTsKKyAgVFJBQ0UocHJvZ3Jlc3MsICJwYWludCBwb3M9JWQgbWluPSVkLCBtYXg9JWRcbiIsCisJICAgICAgIGluZm9QdHItPkN1clZhbCwgaW5mb1B0ci0+TWluVmFsLCBpbmZvUHRyLT5NYXhWYWwpOwogCiAgIC8qIGdldCBhIGRjICovCiAgIGhkYyA9IGRjPT0wID8gQmVnaW5QYWludDMyKHduZFB0ci0+aHduZFNlbGYsICZwcykgOiBkYzsKQEAgLTExNCwxMSArMTE0LDExIEBACiAgICAgICBpbmZvUHRyLT5NYXhWYWw9MTAwOwogICAgICAgaW5mb1B0ci0+Q3VyVmFsPTA7IAogICAgICAgaW5mb1B0ci0+U3RlcD0xMDsKLSAgICAgIGRwcmludGZfaW5mbyh1cGRvd24sICJQcm9ncmVzcyBDdHJsIGNyZWF0aW9uLCBod25kPSUwNHhcbiIsIGh3bmQpOworICAgICAgVFJBQ0UodXBkb3duLCAiUHJvZ3Jlc3MgQ3RybCBjcmVhdGlvbiwgaHduZD0lMDR4XG4iLCBod25kKTsKICAgICAgIGJyZWFrOwogICAgIAogICAgIGNhc2UgV01fREVTVFJPWToKLSAgICAgIGRwcmludGZfaW5mbyh1cGRvd24sICJQcm9ncmVzcyBDdHJsIGRlc3RydWN0aW9uLCBod25kPSUwNHhcbiIsIGh3bmQpOworICAgICAgVFJBQ0UodXBkb3duLCAiUHJvZ3Jlc3MgQ3RybCBkZXN0cnVjdGlvbiwgaHduZD0lMDR4XG4iLCBod25kKTsKICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBXTV9FUkFTRUJLR05EOgpAQCAtMTk0LDggKzE5NCw4IEBACiAgICAgCiAgICAgZGVmYXVsdDogCiAgICAgICBpZiAobWVzc2FnZSA+PSBXTV9VU0VSKSAKLQlmcHJpbnRmKCBzdGRlcnIsICJQcm9ncmVzcyBDdHJsOiB1bmtub3duIG1zZyAlMDR4IHdwPSUwNHggbHA9JTA4bHhcbiIsIAotCQkgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0gKTsKKwlFUlIocHJvZ3Jlc3MsICJ1bmtub3duIG1zZyAlMDR4IHdwPSUwNHggbHA9JTA4bHhcbiIsIAorCQkgICAgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0gKTsKICAgICAgIHJldHVybiBEZWZXaW5kb3dQcm9jMzJBKCBod25kLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSApOyAKICAgICB9IAogCmRpZmYgLS1naXQgYS9jb250cm9scy9zY3JvbGwuYyBiL2NvbnRyb2xzL3Njcm9sbC5jCmluZGV4IDk1NmYzNTkuLmEzYTUzM2IgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL3Njcm9sbC5jCisrKyBiL2NvbnRyb2xzL3Njcm9sbC5jCkBAIC02MTUsOCArNjE1LDggQEAKICAgICAgICAgICByZXR1cm47ICAvKiBTaG91bGQgbmV2ZXIgaGFwcGVuICovCiAgICAgfQogCi0gICAgZHByaW50Zl9pbmZvKHNjcm9sbCwgIlNjcm9sbEJhciBFdmVudDogaHduZD0lMDR4IGJhcj0lZCBtc2c9JXggcHQ9JWQsJWQgaGl0PSVkXG4iLAotICAgICAgICAgICAgICAgICAgICBod25kLCBuQmFyLCBtc2csIHB0LngsIHB0LnksIGhpdHRlc3QgKTsKKyAgICBUUkFDRShzY3JvbGwsICJFdmVudDogaHduZD0lMDR4IGJhcj0lZCBtc2c9JXggcHQ9JWQsJWQgaGl0PSVkXG4iLAorCQkgaHduZCwgbkJhciwgbXNnLCBwdC54LCBwdC55LCBoaXR0ZXN0ICk7CiAKICAgICBzd2l0Y2godHJhY2tIaXRUZXN0KQogICAgIHsKQEAgLTc2Niw4ICs3NjYsOCBAQAogCSAgICBDUkVBVEVTVFJVQ1QzMkEgKmxwQ3JlYXQgPSAoQ1JFQVRFU1RSVUNUMzJBICopbFBhcmFtOwogICAgICAgICAgICAgaWYgKGxwQ3JlYXQtPnN0eWxlICYgU0JTX1NJWkVCT1gpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnByaW50Ziggc3RkbmltcCwgIlVuaW1wbGVtZW50ZWQgc3R5bGUgU0JTX1NJWkVCT1guXG4iICk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7ICAvKiBGSVhNRSAqLworICAgICAgICAgICAgICAgIEZJWE1FKHNjcm9sbCwgIlVuaW1wbGVtZW50ZWQgc3R5bGUgU0JTX1NJWkVCT1guXG4iICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAKIAkgICAgaWYgKGxwQ3JlYXQtPnN0eWxlICYgU0JTX1ZFUlQpCkBAIC03OTQsNyArNzk0LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAoIWhVcEFycm93KSBTQ1JPTExfTG9hZEJpdG1hcHMoKTsKLSAgICAgICAgZHByaW50Zl9pbmZvKHNjcm9sbCwgIlNjcm9sbEJhciBjcmVhdGlvbiwgaHduZD0lMDR4XG4iLCBod25kICk7CisgICAgICAgIFRSQUNFKHNjcm9sbCwgIlNjcm9sbEJhciBjcmVhdGlvbiwgaHduZD0lMDR4XG4iLCBod25kICk7CiAgICAgICAgIHJldHVybiAwOwogCQogICAgIGNhc2UgV01fTEJVVFRPTkRPV046CkBAIC04NDUsOSArODQ1LDcgQEAKICAgICAgICAgcmV0dXJuIDA7ICAvKiBGSVhNRTogcmV0dXJuIHByZXZpb3VzIHBvc2l0aW9uICovCiAKICAgICBjYXNlIFNCTV9HRVRSQU5HRTE2OgotICAgICAgICAvKiBGSVhNRSAqLwotICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJTY3JvbGxCYXI6IGRvbid0IGtub3cgaG93IHRvIGhhbmRsZSBTQk1fR0VUUkFOR0UxNiAod3A9JTA0eCxscD0lMDhseClcbiIsCi0gICAgICAgICAgICAgICAgIHdQYXJhbSwgbFBhcmFtICk7CisgICAgICAgIEZJWE1FKHNjcm9sbCwgImRvbid0IGtub3cgaG93IHRvIGhhbmRsZSBTQk1fR0VUUkFOR0UxNiAod3A9JTA0eCxscD0lMDhseClcbiIsIHdQYXJhbSwgbFBhcmFtICk7CiAgICAgICAgIHJldHVybiAwOwogCiAgICAgY2FzZSBTQk1fR0VUUkFOR0UzMjoKQEAgLTg3NiwxNCArODc0LDE0IEBACiAgICAgY2FzZSAweDAwZWQ6CiAgICAgY2FzZSAweDAwZWU6CiAgICAgY2FzZSAweDAwZWY6Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiU2Nyb2xsQmFyOiB1bmtub3duIFdpbjMyIG1zZyAlMDR4IHdwPSUwOHggbHA9JTA4bHhcbiIsCi0gICAgICAgICAgICAgICAgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0gKTsKKyAgICAgICAgRVJSKHNjcm9sbCwgInVua25vd24gV2luMzIgbXNnICUwNHggd3A9JTA4eCBscD0lMDhseFxuIiwKKwkJICAgIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtICk7CiAgICAgICAgIGJyZWFrOwogCiAgICAgZGVmYXVsdDoKICAgICAgICAgaWYgKG1lc3NhZ2UgPj0gV01fVVNFUikKLSAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIlNjcm9sbEJhcjogdW5rbm93biBtc2cgJTA0eCB3cD0lMDR4IGxwPSUwOGx4XG4iLAotICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0gKTsKKyAgICAgICAgICAgIFdBUk4oc2Nyb2xsLCAidW5rbm93biBtc2cgJTA0eCB3cD0lMDR4IGxwPSUwOGx4XG4iLAorCQkJIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtICk7CiAgICAgICAgIHJldHVybiBEZWZXaW5kb3dQcm9jMzJBKCBod25kLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSApOwogICAgIH0KICAgICByZXR1cm4gMDsKQEAgLTk1Miw3ICs5NTAsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgZHByaW50Zl9pbmZvKHNjcm9sbCwgIlNldFNjcm9sbEluZm86IGh3bmQ9JTA0eCBiYXI9JWQgJXNcbiIsIAorICAgIFRSQUNFKHNjcm9sbCwgImh3bmQ9JTA0eCBiYXI9JWQgJXNcbiIsIAogCQkgICAgaHduZCwgbkJhciwgZGJnX3N0cihzY3JvbGwpKTsKIAogICAgIC8qIE1ha2Ugc3VyZSB0aGUgcGFnZSBzaXplIGlzIHZhbGlkICovCkBAIC05NjgsOSArOTY2LDkgQEAKICAgICBlbHNlIGlmIChpbmZvUHRyLT5DdXJWYWwgPiBpbmZvUHRyLT5NYXhWYWwgLSBNQVgoIGluZm9QdHItPlBhZ2UtMSwgMCApKQogICAgICAgICBpbmZvUHRyLT5DdXJWYWwgPSBpbmZvUHRyLT5NYXhWYWwgLSBNQVgoIGluZm9QdHItPlBhZ2UtMSwgMCApOwogCi0gICAgZHByaW50Zl9pbmZvKHNjcm9sbCwgIlxuICAgbmV3IHZhbHVlczogcGFnZT0lZCBwb3M9JWQgbWluPSVkIG1heD0lZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgaW5mb1B0ci0+UGFnZSwgaW5mb1B0ci0+Q3VyVmFsLAotICAgICAgICAgICAgICAgICAgICBpbmZvUHRyLT5NaW5WYWwsIGluZm9QdHItPk1heFZhbCApOworICAgIFRSQUNFKHNjcm9sbCwgIiAgICBuZXcgdmFsdWVzOiBwYWdlPSVkIHBvcz0lZCBtaW49JWQgbWF4PSVkXG4iLAorCQkgaW5mb1B0ci0+UGFnZSwgaW5mb1B0ci0+Q3VyVmFsLAorCQkgaW5mb1B0ci0+TWluVmFsLCBpbmZvUHRyLT5NYXhWYWwgKTsKIAogICAgIC8qIENoZWNrIGlmIHRoZSBzY3JvbGxiYXIgc2hvdWxkIGJlIGhpZGRlbiBvciBkaXNhYmxlZCAqLwogCkBAIC0xMjA5LDcgKzEyMDcsNyBAQAogICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKIAogICAgIGlmICghd25kUHRyKSByZXR1cm4gRkFMU0U7Ci0gICAgZHByaW50Zl9pbmZvKHNjcm9sbCwgIlNob3dTY3JvbGxCYXI6IGh3bmQ9JTA0eCBiYXI9JWQgb249JWRcbiIsCisgICAgVFJBQ0Uoc2Nyb2xsLCAiaHduZD0lMDR4IGJhcj0lZCBvbj0lZFxuIiwKICAgICAgICAgICAgICAgICAgICAgaHduZCwgbkJhciwgZlNob3cgKTsKIAogICAgIHN3aXRjaChuQmFyKQpAQCAtMTI4NSw3ICsxMjgzLDcgQEAKICAgICBTQ1JPTExCQVJfSU5GTyAqaW5mb1B0cjsKIAogICAgIGlmICghKGluZm9QdHIgPSBTQ1JPTExfR2V0U2Nyb2xsSW5mbyggaHduZCwgbkJhciApKSkgcmV0dXJuIEZBTFNFOwotICAgIGRwcmludGZfaW5mbyhzY3JvbGwsICJFbmFibGVTY3JvbGxCYXI6ICUwNHggJWQgJWRcbiIsCisgICAgVFJBQ0Uoc2Nyb2xsLCAiJTA0eCAlZCAlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgaHduZCwgbkJhciwgZmxhZ3MgKTsKICAgICBmbGFncyAmPSBFU0JfRElTQUJMRV9CT1RIOwogICAgIGlmIChpbmZvUHRyLT5mbGFncyA9PSBmbGFncykgcmV0dXJuIEZBTFNFOwpkaWZmIC0tZ2l0IGEvY29udHJvbHMvc3RhdGljLmMgYi9jb250cm9scy9zdGF0aWMuYwppbmRleCA5ZjFlNjgwLi5lMDg4ZDI3IDEwMDY0NAotLS0gYS9jb250cm9scy9zdGF0aWMuYworKysgYi9jb250cm9scy9zdGF0aWMuYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgImN1cnNvcmljb24uaCIKICNpbmNsdWRlICJzdGF0aWMuaCIKICNpbmNsdWRlICJoZWFwLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKIAogc3RhdGljIHZvaWQgU1RBVElDX1BhaW50VGV4dGZuKCBXTkQgKnduZFB0ciwgSERDMzIgaGRjICk7CiBzdGF0aWMgdm9pZCBTVEFUSUNfUGFpbnRSZWN0Zm4oIFdORCAqd25kUHRyLCBIREMzMiBoZGMgKTsKQEAgLTYxLDcgKzYyLDcgQEAKIAogICAgIGlmICgod25kUHRyLT5kd1N0eWxlICYgU1NfVFlQRU1BU0spICE9IFNTX0lDT04pIHJldHVybiAwOwogICAgIGlmIChoaWNvbiAmJiAhaW5mbykgewotCWZwcmludGYoc3RkZXJyLCJTVEFUSUNfU2V0SWNvbjogaHVoPyBoaWNvbiE9MCwgYnV0IGluZm89MD8/P1xuIik7CisJRVJSKHN0YXRpYywgImh1aD8gaGljb24hPTAsIGJ1dCBpbmZvPTA/Pz9cbiIpOwogICAgIAlyZXR1cm4gMDsKICAgICB9CiAgICAgcHJldkljb24gPSBpbmZvUHRyLT5oSWNvbjsKQEAgLTg4LDcgKzg5LDcgQEAKIAogICAgIGlmICgod25kUHRyLT5kd1N0eWxlICYgU1NfVFlQRU1BU0spICE9IFNTX0JJVE1BUCkgcmV0dXJuIDA7CiAgICAgaWYgKGhpY29uICYmICFpbmZvKSB7Ci0JZnByaW50ZihzdGRlcnIsIlNUQVRJQ19TZXRCaXRtYXA6IGh1aD8gaGljb24hPTAsIGJ1dCBpbmZvPTA/Pz9cbiIpOworCUVSUihzdGF0aWMsICJodWg/IGhpY29uIT0wLCBidXQgaW5mbz0wPz8/XG4iKTsKICAgICAJcmV0dXJuIDA7CiAgICAgfQogICAgIHByZXZJY29uID0gaW5mb1B0ci0+aEljb247CkBAIC0xODQsNyArMTg1LDggQEAKICAgICAgICAgICAgIGlmIChjcy0+bHBzek5hbWUpCiAgICAgICAgICAgICAgICAgU1RBVElDX1NldEJpdG1hcCggd25kUHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFUSUNfTG9hZEJpdG1hcCggd25kUHRyLCBjcy0+bHBzek5hbWUgKSk7Ci0JICAgIGZwcmludGYoc3RkZXJyLCJTVEFUSUM6c3R5bGUgU1NfQklUTUFQLCBkd1N0eWxlIGlzIDB4JTA4bHhcbiIsd25kUHRyLT5kd1N0eWxlKTsKKwkgICAgV0FSTihzdGF0aWMsICJzdHlsZSBTU19CSVRNQVAsIGR3U3R5bGUgaXMgMHglMDhseFxuIiwKKwkJCXduZFB0ci0+ZHdTdHlsZSk7CiAgICAgICAgICAgICByZXR1cm4gMTsKIAl9CiAgICAgICAgIHJldHVybiBEZWZXaW5kb3dQcm9jMzJBKCBoV25kLCB1TXNnLCB3UGFyYW0sIGxQYXJhbSApOwpAQCAtMTkyLDcgKzE5NCw3IEBACiAgICAgY2FzZSBXTV9DUkVBVEU6CiAgICAgICAgIGlmIChzdHlsZSA8IDBMIHx8IHN0eWxlID4gU1NfVFlQRU1BU0spCiAgICAgICAgIHsKLSAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIlNUQVRJQzogVW5rbm93biBzdHlsZSAweCUwMmx4XG4iLCBzdHlsZSApOworICAgICAgICAgICAgRVJSKHN0YXRpYywgIlVua25vd24gc3R5bGUgMHglMDJseFxuIiwgc3R5bGUgKTsKICAgICAgICAgICAgIGxSZXN1bHQgPSAtMUw7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29udHJvbHMvdWl0b29scy5jIGIvY29udHJvbHMvdWl0b29scy5jCmluZGV4IDg4NzJhMTEuLmQzZjgxNGUgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL3VpdG9vbHMuYworKysgYi9jb250cm9scy91aXRvb2xzLmMKQEAgLTU3NCw3ICs1NzQsNyBAQAogICovCiBCT09MMzIgV0lOQVBJIERyYXdFZGdlMzIoIEhEQzMyIGhkYywgTFBSRUNUMzIgcmMsIFVJTlQzMiBlZGdlLCBVSU5UMzIgZmxhZ3MgKQogewotICAgIGRwcmludGZfaW5mbyhncmFwaGljcywgIkRyYXdFZGdlOiAlMDR4ICVkLCVkLSVkLCVkICUwNHggJTA0eFxuIiwKKyAgICBUUkFDRShncmFwaGljcywgIiUwNHggJWQsJWQtJWQsJWQgJTA0eCAlMDR4XG4iLAogICAgICAgICAgICAgICAgICAgICAgIGhkYywgcmMtPmxlZnQsIHJjLT50b3AsIHJjLT5yaWdodCwgcmMtPmJvdHRvbSwKICAgICAgICAgICAgICAgICAgICAgICBlZGdlLCBmbGFncyApOwogCkBAIC05NDEsNyArOTQxLDcgQEAKICAgICAgICAgcmV0dXJuIFVJVE9PTFNfREZDX0J1dHRvblJhZGlvKGhkYywgcmMsIHVTdGF0ZSk7CiAKICAgICBkZWZhdWx0OgotICAgICAgICBmcHJpbnRmKHN0ZG5pbXAsICJVSVRPT0xTX0RyYXdGcmFtZUJ1dHRvbjogUmVwb3J0IHRoaXM6IEludmFsaWQgYnV0dG9uIHN0YXRlOiAweCUwNHhcbiIsIHVTdGF0ZSk7CisgICAgICAgIFdBUk4odWl0b29scywgIkludmFsaWQgYnV0dG9uIHN0YXRlOiAweCUwNHhcbiIsIHVTdGF0ZSk7CiAgICAgfQogCiAgICAgcmV0dXJuIEZBTFNFOwpAQCAtMTA3Nyw3ICsxMDc3LDcgQEAKICAgICAgICAgYnJlYWs7CiAKICAgICBkZWZhdWx0OgotICAgICAgICBmcHJpbnRmKHN0ZG5pbXAsICJVSVRPT0xTX0RyYXdGcmFtZUNhcHRpb246IFJlcG9ydCB0aGlzOiBJbnZhbGlkIGNhcHRpb247IGZsYWdzOiAweCUwNHhcbiIsIHVGbGFncyk7CisgICAgICAgIFdBUk4odWl0b29scywgIkludmFsaWQgY2FwdGlvbjsgZmxhZ3M6IDB4JTA0eFxuIiwgdUZsYWdzKTsKICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIApAQCAtMTI0Nyw3ICsxMjQ3LDcgQEAKICAgICAgICAgcmV0dXJuIFRSVUU7CiAKICAgICBkZWZhdWx0OgotICAgICAgICBmcHJpbnRmKHN0ZG5pbXAsICJVSVRPT0xTX0RyYXdGcmFtZVNjcm9sbDogUmVwb3J0IHRoaXM6IEludmFsaWQgc2Nyb2xsOyBmbGFnczogMHglMDR4XG4iLCB1RmxhZ3MpOworICAgICAgICBXQVJOKHVpdG9vbHMsICJJbnZhbGlkIHNjcm9sbDsgZmxhZ3M6IDB4JTA0eFxuIiwgdUZsYWdzKTsKICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIApAQCAtMTM0OSw3ICsxMzQ5LDcgQEAKICAgICAgICAgYnJlYWs7CiAKICAgICBkZWZhdWx0OgotICAgICAgICBmcHJpbnRmKHN0ZG5pbXAsICJVSVRPT0xTX0RyYXdGcmFtZU1lbnU6IFJlcG9ydCB0aGlzOiBJbnZhbGlkIG1lbnU7IGZsYWdzOiAweCUwNHhcbiIsIHVGbGFncyk7CisgICAgICAgIFdBUk4odWl0b29scywgIkludmFsaWQgbWVudTsgZmxhZ3M6IDB4JTA0eFxuIiwgdUZsYWdzKTsKICAgICAgICAgcmV0dmFsID0gRkFMU0U7CiAgICAgICAgIGJyZWFrOwogICAgIH0KQEAgLTEzOTcsOCArMTM5Nyw4IEBACiAgICAgY2FzZSBERkNfU0NST0xMOgogICAgICAgcmV0dXJuIFVJVE9PTFNfRHJhd0ZyYW1lU2Nyb2xsKGhkYywgcmMsIHVTdGF0ZSk7CiAgICAgZGVmYXVsdDoKLSAgICAgIGZwcmludGYoIHN0ZG5pbXAsIkRyYXdGcmFtZUNvbnRyb2wzMigleCwlcCwlZCwleCksIGJhZCB0eXBlIVxuIiwKLQkgICAgICAgaGRjLHJjLHVUeXBlLHVTdGF0ZSApOworICAgICAgV0FSTih1aXRvb2xzLCAiKCV4LCVwLCVkLCV4KSwgYmFkIHR5cGUhXG4iLAorCQkgIGhkYyxyYyx1VHlwZSx1U3RhdGUgKTsKICAgICB9CiAgICAgcmV0dXJuIEZBTFNFOwogfQpkaWZmIC0tZ2l0IGEvY29udHJvbHMvdXBkb3duLmMgYi9jb250cm9scy91cGRvd24uYwppbmRleCA4YTgzMDJhLi5lM2I5NWNiIDEwMDY0NAotLS0gYS9jb250cm9scy91cGRvd24uYworKysgYi9jb250cm9scy91cGRvd24uYwpAQCAtNjAsNyArNjAsNyBAQAogCiBzdGF0aWMgaW50IGFjY2VsSW5kZXggPSAtMTsKIAotI2RlZmluZSBVTktOT1dOX1BBUkFNKG1zZywgd1BhcmFtLCBsUGFyYW0pIGRwcmludGZfd2Fybih1cGRvd24sIFwKKyNkZWZpbmUgVU5LTk9XTl9QQVJBTShtc2csIHdQYXJhbSwgbFBhcmFtKSBXQVJOKHVwZG93biwgXAogICAgICAgICAiVXBEb3duIEN0cmw6IFVua25vd24gcGFyYW1ldGVyKHMpIGZvciBtZXNzYWdlICIgI21zZyAgICAgXAogCSIoJTA0eCk6IHdwPSUwNHggbHA9JTA4bHhcbiIsIG1zZywgd1BhcmFtLCBsUGFyYW0pOwogCkBAIC0yMDcsOCArMjA3LDggQEAKICAgICBpZigqc3JjIHx8ICFVUERPV05fSW5Cb3VuZHMod25kUHRyLCBuZXdWYWwpKSAKICAgICAgIHJldHVybiBGQUxTRTsKIAotICAgIGRwcmludGZfaW5mbyh1cGRvd24sICJVcERvd24gQ3RybDogbmV3IHZhbHVlKCVkKSByZWFkIGZyb20gYnVkZHkgIgotCQkgICAiKG9sZD0lZClcbiIsICBuZXdWYWwsIGluZm9QdHItPkN1clZhbCk7CisgICAgVFJBQ0UodXBkb3duLCAibmV3IHZhbHVlKCVkKSByZWFkIGZyb20gYnVkZHkgKG9sZD0lZClcbiIsIAorCQkgbmV3VmFsLCBpbmZvUHRyLT5DdXJWYWwpOwogICB9CiAgIAogICBpbmZvUHRyLT5DdXJWYWwgPSBuZXdWYWw7CkBAIC0yMzIsOCArMjMyLDggQEAKICAgaWYgKCFJc1dpbmRvdzMyKGluZm9QdHItPkJ1ZGR5KSkgCiAgICAgcmV0dXJuIEZBTFNFOwogCi0gIGRwcmludGZfaW5mbyh1cGRvd24sICJVcERvd24gQ3RybDogc2V0IG5ldyB2YWx1ZSglZCkgdG8gYnVkZHkuXG4iLAotCQkgaW5mb1B0ci0+Q3VyVmFsKTsKKyAgVFJBQ0UodXBkb3duLCAic2V0IG5ldyB2YWx1ZSglZCkgdG8gYnVkZHkuXG4iLAorCSAgICAgICBpbmZvUHRyLT5DdXJWYWwpOwogCiAgIC8qaWYgdGhlIGJ1ZGR5IGlzIGEgbGlzdCB3aW5kb3csIHdlIG11c3Qgc2V0IGN1cnIgaW5kZXggKi8KICAgaWYoV0lER0VUU19Jc0NvbnRyb2wzMihXSU5fRmluZFduZFB0cihpbmZvUHRyLT5CdWRkeSksIEJJQzMyX0xJU1RCT1gpKXsKQEAgLTMyNiw4ICszMjYsNyBAQAogICAgIHJldHVybiBGQUxTRTsKIAogICBpZih3bmRQdHItPmR3U3R5bGUgJiBVRFNfQVJST1dLRVlTKXsKLSAgICAvKiBGSVhNRTogd2UgbmVlZCB0byBzdWJjbGFzcyB0aGUgYnVkZHkgdG8gcHJvY2VzcyB0aGUgYXJyb3cga2V5cy4gKi8KLSAgICBmcHJpbnRmKHN0ZGVyciwgIlVwRG93biBDdHJsOiB3ZSBzaG91bGQgc3ViY2xhc3MgdGhlIGJ1ZGR5IHdpbmRvdyFcbiIpOworICAgIEZJWE1FKHVwZG93biwgIndlIG5lZWQgdG8gc3ViY2xhc3MgdGhlIGJ1ZGR5IHRvIHByb2Nlc3MgdGhlIGFycm93IGtleXMuXG4iKTsKICAgfQogCiAgIC8qIGRvIHdlIG5lZWQgdG8gZG8gYW55IGFkanVzdG1lbnRzPyAqLwpAQCAtMzc5LDggKzM3OCw3IEBACiAgIGludCBvbGRfdmFsID0gaW5mb1B0ci0+Q3VyVmFsOwogICBOTV9VUERPV04gbmk7CiAKLSAgZHByaW50Zl9pbmZvKHVwZG93biwgIlVwRG93biBDdHJsIGFjdGlvbjogJXMgYnkgJWRcbiIsCi0JCSBpbmNyID8gImluYyIgOiAiZGVjIiwgZGVsdGEpOworICBUUkFDRSh1cGRvd24sICIlcyBieSAlZFxuIiwgaW5jciA/ICJpbmMiIDogImRlYyIsIGRlbHRhKTsKIAogICAvKiBjaGVjayBpZiB3ZSBjYW4gZG8gdGhlIG1vZGlmaWNhdGlvbiBmaXJzdCAqLwogICBkZWx0YSAqPSAoaW5jciA/IDEgOiAtMSkgKiAoaW5mb1B0ci0+TWF4VmFsIDwgaW5mb1B0ci0+TWluVmFsID8gLTEgOiAxKTsKQEAgLTU0OCw4ICs1NDYsNyBAQAogICAgICAgYnJlYWs7CiAKICAgICAgIGRlZmF1bHQ6Ci0JZnByaW50ZihzdGRlcnIsICJVcERvd246IEltcG9zc2libGUgY2FzZSBpbiBwcm9jICIKLQkJIlVQRE9XTl9IYW5kbGVNb3VzZUV2ZW50Iik7CisJRVJSKHVwZG93biwgIkltcG9zc2libGUgY2FzZSFcbiIpOwogICAgIH0KIAogfQpAQCAtNTgxLDEzICs1NzgsMTMgQEAKICAgICAgIGlmKHduZFB0ci0+ZHdTdHlsZSAmIFVEU19BVVRPQlVERFkpCiAJVVBET1dOX1NldEJ1ZGR5KHduZFB0ciwgR2V0V2luZG93MzIod25kUHRyLT5od25kU2VsZiwgR1dfSFdORFBSRVYpKTsKIAkKLSAgICAgIGRwcmludGZfaW5mbyh1cGRvd24sICJVcERvd24gQ3RybCBjcmVhdGlvbiwgaHduZD0lMDR4XG4iLCBod25kKTsKKyAgICAgIFRSQUNFKHVwZG93biwgIlVwRG93biBDdHJsIGNyZWF0aW9uLCBod25kPSUwNHhcbiIsIGh3bmQpOwogICAgICAgYnJlYWs7CiAgICAgCiAgICAgY2FzZSBXTV9ERVNUUk9ZOgogICAgICAgaWYoaW5mb1B0ci0+QWNjZWxWZWN0KQogCWZyZWUoaW5mb1B0ci0+QWNjZWxWZWN0KTsKLSAgICAgIGRwcmludGZfaW5mbyh1cGRvd24sICJVcERvd24gQ3RybCBkZXN0cnVjdGlvbiwgaHduZD0lMDR4XG4iLCBod25kKTsKKyAgICAgIFRSQUNFKHVwZG93biwgIlVwRG93biBDdHJsIGRlc3RydWN0aW9uLCBod25kPSUwNHhcbiIsIGh3bmQpOwogICAgICAgYnJlYWs7CiAJCiAgICAgY2FzZSBXTV9FTkFCTEU6CkBAIC02NzcsNyArNjc0LDcgQEAKICAgICAgIHJldHVybiB0ZW1wOwogCiAgICAgY2FzZSBVRE1fU0VUQUNDRUw6Ci0gICAgICBkcHJpbnRmX2luZm8odXBkb3duLCAiVXBEb3duIEN0cmwgbmV3IGFjY2VsIGluZm8sIGh3bmQ9JTA0eFxuIiwgaHduZCk7CisgICAgICBUUkFDRSh1cGRvd24sICJVcERvd24gQ3RybCBuZXcgYWNjZWwgaW5mbywgaHduZD0lMDR4XG4iLCBod25kKTsKICAgICAgIGlmKGluZm9QdHItPkFjY2VsVmVjdCl7CiAJZnJlZShpbmZvUHRyLT5BY2NlbFZlY3QpOwogCWluZm9QdHItPkFjY2VsQ291bnQgPSAwOwpAQCAtNjk3LDcgKzY5NCw3IEBACiAgICAgICByZXR1cm4gaW5mb1B0ci0+QmFzZTsKIAogICAgIGNhc2UgVURNX1NFVEJBU0U6Ci0gICAgICBkcHJpbnRmX2luZm8odXBkb3duLCAiVXBEb3duIEN0cmwgbmV3IGJhc2UoJWQpLCBod25kPSUwNHhcbiIsIAorICAgICAgVFJBQ0UodXBkb3duLCAiVXBEb3duIEN0cmwgbmV3IGJhc2UoJWQpLCBod25kPSUwNHhcbiIsIAogCQkgICAgIHdQYXJhbSwgaHduZCk7CiAgICAgICBpZiAoICEod1BhcmFtPT0xMCB8fCB3UGFyYW09PTE2KSB8fCBsUGFyYW0pCiAJVU5LTk9XTl9QQVJBTShVRE1fU0VUQkFTRSwgd1BhcmFtLCBsUGFyYW0pOwpAQCAtNzE5LDcgKzcxNiw3IEBACiAgICAgICB0ZW1wID0gaW5mb1B0ci0+QnVkZHk7CiAgICAgICBpbmZvUHRyLT5CdWRkeSA9IHdQYXJhbTsKICAgICAgIFVQRE9XTl9TZXRCdWRkeSh3bmRQdHIsIHdQYXJhbSk7Ci0gICAgICBkcHJpbnRmX2luZm8odXBkb3duLCAiVXBEb3duIEN0cmwgbmV3IGJ1ZGR5KCUwNHgpLCBod25kPSUwNHhcbiIsIAorICAgICAgVFJBQ0UodXBkb3duLCAiVXBEb3duIEN0cmwgbmV3IGJ1ZGR5KCUwNHgpLCBod25kPSUwNHhcbiIsIAogCQkgICAgIGluZm9QdHItPkJ1ZGR5LCBod25kKTsKICAgICAgIHJldHVybiB0ZW1wOwogCkBAIC03MzMsNyArNzMwLDcgQEAKICAgICAgIGlmICh3UGFyYW0gfHwgSElXT1JEKGxQYXJhbSkpCiAJVU5LTk9XTl9QQVJBTShVRE1fR0VUUE9TLCB3UGFyYW0sIGxQYXJhbSk7CiAgICAgICB0ZW1wID0gU0xPV09SRChsUGFyYW0pOwotICAgICAgZHByaW50Zl9pbmZvKHVwZG93biwgIlVwRG93biBDdHJsIG5ldyB2YWx1ZSglZCksIGh3bmQ9JTA0eFxuIiwKKyAgICAgIFRSQUNFKHVwZG93biwgIlVwRG93biBDdHJsIG5ldyB2YWx1ZSglZCksIGh3bmQ9JTA0eFxuIiwKIAkJICAgICB0ZW1wLCBod25kKTsKICAgICAgIGlmKCFVUERPV05fSW5Cb3VuZHMod25kUHRyLCB0ZW1wKSl7CiAJaWYodGVtcCA8IGluZm9QdHItPk1pblZhbCkgIApAQCAtNzU4LDE0ICs3NTUsMTQgQEAKICAgICAgIGluZm9QdHItPk1heFZhbCA9IFNMT1dPUkQobFBhcmFtKTsgLyogVURfTUlOVkFMIDw9IE1heCA8PSBVRF9NQVhWQUwgKi8KICAgICAgIGluZm9QdHItPk1pblZhbCA9IFNISVdPUkQobFBhcmFtKTsgLyogVURfTUlOVkFMIDw9IE1pbiA8PSBVRF9NQVhWQUwgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogfE1heC1NaW58IDw9IFVEX01BWFZBTCAgICAgICAgKi8KLSAgICAgIGRwcmludGZfaW5mbyh1cGRvd24sICJVcERvd24gQ3RybCBuZXcgcmFuZ2UoJWQgdG8gJWQpLCBod25kPSUwNHhcbiIsIAorICAgICAgVFJBQ0UodXBkb3duLCAiVXBEb3duIEN0cmwgbmV3IHJhbmdlKCVkIHRvICVkKSwgaHduZD0lMDR4XG4iLCAKIAkJICAgICBpbmZvUHRyLT5NaW5WYWwsIGluZm9QdHItPk1heFZhbCwgaHduZCk7CiAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCiAgICAgZGVmYXVsdDogCiAgICAgICBpZiAobWVzc2FnZSA+PSBXTV9VU0VSKSAKLQlmcHJpbnRmKCBzdGRlcnIsICJVcERvd24gQ3RybDogdW5rbm93biBtc2cgJTA0eCB3cD0lMDR4IGxwPSUwOGx4XG4iLCAKLQkJIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtICk7CisJV0FSTih1cGRvd24sICJ1bmtub3duIG1zZyAlMDR4IHdwPSUwNHggbHA9JTA4bHhcbiIsIAorCQkgICAgIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtICk7CiAgICAgICByZXR1cm4gRGVmV2luZG93UHJvYzMyQSggaHduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0gKTsgCiAgICAgfSAKIApkaWZmIC0tZ2l0IGEvZG9jdW1lbnRhdGlvbi9jb25zb2xlIGIvZG9jdW1lbnRhdGlvbi9jb25zb2xlCmluZGV4IGY2YzcxYzYuLmUxN2NmYTIgMTAwNjQ0Ci0tLSBhL2RvY3VtZW50YXRpb24vY29uc29sZQorKysgYi9kb2N1bWVudGF0aW9uL2NvbnNvbGUKQEAgLTQwLDYgKzQwLDcgQEAKIEZyZWVDb25zb2xlIGlzIGNhbGxlZCBvbiBwcm9jZXNzIGV4aXQgKGluIEV4aXRQcm9jZXNzKSBpZiAKIHBkYi0+Y29uc29sZSBpcyBub3QgTlVMTC4KIAorCiBCVUdTCiAtLS0tCiBDb25zb2xlIHByb2Nlc3NlcyBkbyBub3QgaW5oZXJpdCB0aGVpciBwYXJlbnQncyBoYW5kbGVzLiAgSSB0aGluawpAQCAtNDcsNiArNDgsMTMgQEAKIHRoZSBzdGRpbi9zdGRvdXQvc3RkZXJyIGZyb20gdW5peCwgYW5kIG9uZSB3aGVyZSB0aGV5IGhhdmUgdG8KIGluaGVyaXQgZnJvbSBhbm90aGVyIHdpbmRvd3MgYXBwLgogCitTZXRDb25zb2xlTW9kZSAtLSBVTklYIG9ubHkgaGFzIElDQU5PTiBhbmQgdmFyaW91cyBFQ0hPcwordG8gcGxheSBhcm91bmQgd2l0aCBmb3IgcHJvY2Vzc2luZyBpbnB1dC4gIFdpbjMyIGhhcworbGluZS1hdC1hLXRpbWUgcHJvY2Vzc2luZywgY2hhcmFjdGVyIHByb2Nlc3NpbmcsIGFuZAorZWNoby4gIEknbSBwdXR0aW5nIHRvZ2V0aGVyIGFuIGludGVybWVkaWF0ZSBkcml2ZXIKK3RoYXQgd2lsbCBoYW5kbGUgdGhpcyAoYW5kIGhvcGVmdWxseSB3b24ndCBiZSBhbnkgbW9yZQorYnVnZ3kgdGhlbiB0aGUgTlQ0IGNvbnNvbGUgaW1wbGVtZW50YXRpb24pLgorCiAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtODAsMyArODgsNyBAQAogCW8gZXZlbiB3aGVuIGFsbCB0aGUgaGFuZGxlcyB0byBpdCBhcmUgZnJlZWQsIHRoZSB3aW4zMiBjb25zb2xlCiAJICBzdGF5cyB2aXNpYmxlLCB0aGUgb25seSB3YXkgSSBjb3VsZCBmaW5kIHRvIGZyZWUgaXQKIAkgIHdhcyB2aWEgdGhlIEZyZWVDb25zb2xlCisKKworSXMgaXQgcG9zc2libGUgdG8gaW50ZXJydXB0IHdpbjMyJ3MgRmlsZVdyaXRlPyAgSSdtIG5vdCBzdXJlLgorSXQgbWF5IG5vdCBiZSBwb3NzaWJsZSB0byBpbnRlcnJ1cHQgYW55IHN5c3RlbSBjYWxscy4KZGlmZiAtLWdpdCBhL2RvY3VtZW50YXRpb24vZGVidWctbXNncyBiL2RvY3VtZW50YXRpb24vZGVidWctbXNncwppbmRleCAzOTUzYTY4Li4wODEzNDY1IDEwMDY0NAotLS0gYS9kb2N1bWVudGF0aW9uL2RlYnVnLW1zZ3MKKysrIGIvZG9jdW1lbnRhdGlvbi9kZWJ1Zy1tc2dzCkBAIC0xLDMzICsxLDM1IEBACi1Ob3RlOiB0aGUgZGVidWdnaW5nIGludGVyZmFjZSBpcyB1bmRlciBkZXZlbG9wbWVudC4gUGxlYXNlIGRvIG5vdCBtYWtlCi0gICAgICBjaGFuZ2VzIHRvIGl0IHlldCBhcyBJIHdpbGwgZG8gbWFqb3IgY2hhbmdlcyBpbiB0aGUgbmV4dCBmZXcgd2Vla3MuCi0gICAgICBUbyBtYWtlIG15IGxpZmUgZWFzaWVyLCBQTEVBU0UgZm9sbG93IHRoZSBndWlkZWxpbmVzIGRlc2NyaWJlZCBpbgotICAgICAgdGhpcyBkb2N1bWVudC4gSWYgeW91IGhhdmUgc29tZSBpZGVhcyB0aGF0IHlvdSB3b3VsZCBsaWtlIHRvCi0gICAgICBpbmNvcnBvcmF0ZSwgcGxlYXNlIGNvbnRhY3QgbWUgZmlyc3QuCi0gICAgICBQbGVhc2UgcmVhZCB0aGUgZG9jdW1lbnQgYmVmb3JlIHdyaXRpbmcgbmV3IGNvZGUuCitOb3RlOiBUaGUgbmV3IGRlYnVnZ2luZyBpbnRlcmZhY2UgaXMgc3RhcnRpbmcgdG8gdGFrZSBzaGFwZS4KKyAgICAgIEluIGdlbmVyYWwsIEkgdGhpbmsgaXQgY2FuIGJlIGNvbnNpZGVyZWQgdG8gYmUgc3RhYmxlLAorICAgICAgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBpbi1tZW1vcnkgbWVzc2FnZSBjb25zdHJ1Y3Rpb24gZnVuY3Rpb25zLgorICAgICAgSG93ZXZlciwgdGhlcmUgaXMgc3RpbGwgYSBsb3Qgb2Ygd29yayB0byBiZSBkb25lIHRvIHBvbGlzaAorICAgICAgdGhpbmdzIHVwIGFuZCB0byBjb252ZXJ0IHRoZSByZW1haW5pbmcgZnByaW50Zi4gVG8gbWFrZSBteSBsaWZlIAorICAgICAgZWFzaWVyLCBwbGVhc2UgZm9sbG93IHRoZSBndWlkZWxpbmVzIGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiAKKworICAgICAgUmVhZCB0aGlzIGRvY3VtZW50IGJlZm9yZSB3cml0aW5nIG5ldyBjb2RlLgogICAgICAgQWxzbywgRE8gTk9UIFVTRSBmcHJpbnRmIChvciBwcmludGYpIHRvIG91dHB1dCB0aGluZ3MuIEFsbCB0aGVzZQotICAgICAgd2lsbCBoYXZlIHRvIGJlIHRyYW5zbGF0ZWQgdG8gZHByaW50Zl8gY2FsbHMgYW5kIHRoZXJlIGFyZSBhbHJlYWR5CisgICAgICB3aWxsIGhhdmUgdG8gYmUgdHJhbnNsYXRlZCB0byB0aGUgbmV3IGludGVyZmFjZSBhbmQgdGhlcmUgYXJlIGFscmVhZHkKICAgICAgIGFib3V0IDMwMDAgb2YgdGhlbSEgQWxzbywgaW5zdGVhZCBvZiB3cml0aW5nIEZJWE1FcyBpbiB0aGUgc291cmNlLAotICAgICAgb3V0cHV0IGEgZHByaW50Zl9maXhtZSBtZXNzYWdlLiBCdXQgcmVhZCBvbi4uLgotMjUgRmViIDE5OTgsIERpbWl0cmllIE8uIFBhdW4gPGRpbWlAY3MudG9yb250by5lZHU+CisgICAgICBvdXRwdXQgYSBGSVhNRSBtZXNzYWdlIGlmIHlvdSBjYW4uIEJ1dCByZWFkIG9uLi4uCisxNCBNYXIgMTk5OCwgRGltaXRyaWUgTy4gUGF1biA8ZGltaUBjcy50b3JvbnRvLmVkdT4KIAogCiBEZWJ1Z2dpbmcgY2xhc3NlcwogLS0tLS0tLS0tLS0tLS0tLS0KIAotVGhlIGRlYnVnZ2luZyBtZXNzYWdlcyBhcmUgZGl2aWRlZCBpbnRvIDQgY2xhc3NlczoKK1RoZXJlIGFyZSA0IHR5cGVzIChvciBjbGFzc2VzKSBvZiBkZWJ1Z2dpbmcgbWVzc2FnZXM6CiAKLWZpeG1lIC0tIE1lc3NhZ2VzIGluIHRoaXMgY2xhc3MgcmVsYXRlIHRvIGJlaGF2aW9yIG9mIFdpbmUgdGhhdCBkb2VzCitGSVhNRSAtLSBNZXNzYWdlcyBpbiB0aGlzIGNsYXNzIHJlbGF0ZSB0byBiZWhhdmlvciBvZiBXaW5lIHRoYXQgZG9lcwogICAgICAgICAgbm90IGNvcnJlc3BvbmQgdG8gc3RhbmRhcmQgV2luZG93cyBiZWhhdmlvciBhbmQgdGhhdCBzaG91bGQKICAgICAgICAgIGJlIGZpeGVkLiAKICAgICAgICAgIEV4YW1wbGVzOiBzdHVicywgc2VtaS1pbXBsZW1lbnRlZCBmZWF0dXJlcywgZXRjLgogCi1lcnIgICAtLSBNZXNzYWdlcyBpbiB0aGlzIGNsYXNzIHJlbGF0ZSB0byBzZXJpb3VzIGVycm9ycyBpbiBXaW5lLgorRVJSICAgLS0gTWVzc2FnZXMgaW4gdGhpcyBjbGFzcyByZWxhdGUgdG8gc2VyaW91cyBlcnJvcnMgaW4gV2luZS4KICAgICAgICAgIFRoaXMgc29ydCBvZiBtZXNzYWdlcyBhcmUgY2xvc2UgdG8gYXNzZXJ0cyAtLSB0aGF0IGlzLAotICAgICAgICAgeW91IHNob3VsZCBvdXRwdXQgYSAnZXJyJyBtZXNzYWdlIHdoZW4gdGhlIGNvZGUgZGV0ZWN0cyBhCisgICAgICAgICB5b3Ugc2hvdWxkIG91dHB1dCBhIGVycm9yIG1lc3NhZ2Ugd2hlbiB0aGUgY29kZSBkZXRlY3RzIGEKICAgICAgICAgIGNvbmRpdGlvbiB3aGljaCBzaG91bGQgbm90IGhhcHBlbi4KIAkgRXhhbXBsZXM6IHVuZXhwZWN0ZWQgY2hhbmdlIGluIGludGVybmFsIHN0YXRlLCBldGMuCiAKLXdhcm4gIC0tIFRoaXMgYXJlIHdhcm5pbmcgbWVzc2FnZXMuIFlvdSBzaG91bGQgcmVwb3J0IGEgd2FybmluZyB3aGVuCitXQVJOICAtLSBUaGVzZSBhcmUgd2FybmluZyBtZXNzYWdlcy4gWW91IHNob3VsZCByZXBvcnQgYSB3YXJuaW5nIHdoZW4KICAgICAgICAgIHNvbWV0aGluZyB1bndhbnRlZCBoYXBwZW4gYnV0IHRoZSBmdW5jdGlvbiBiZWhhdmVzIHByb3Blcmx5LgogICAgICAgICAgVGhhdCBpcywgb3V0cHV0IGEgd2FybmluZyB3aGVuIHlvdSBlbmNvdW50ZXIgc29tZXRoaW5nCiAgICAgICAgICB1bmV4cGVjdGVkIChleDogY291bGQgbm90IG9wZW4gYSBmaWxlKSBidXQgdGhlIGZ1bmN0aW9uIGRlYWxzCkBAIC0zNSwyOCArMzcsMjQgQEAKICAgICAgICAgIElmIHlvdSBkbyBub3QgZGVhbCBjb3JyZWN0bHkgd2l0aCBpdCwgb3V0cHV0IGEgZml4bWUuCiAJIEV4YW1wbGVzOiBmYWlsIHRvIGFjY2VzcyBhIHJlc291cmNlIHJlcXVpcmVkIGJ5IHRoZSBhcHAsIGV0Yy4KIAotaW5mbyAgLS0gVGhpcyBhcmUgZGV0YWlsZWQgZGVidWdnaW5nIG1lc3NhZ2VzIHRoYXQgYXJlIG1haW5seSB1c2VmdWwgCi0gICAgICAgICB0byBkZWJ1ZyBhIGNvbXBvbmVudC4gVGhpcyBhcmUgdXN1YWxseSB0dXJuZWQgb2ZmLgorVFJBQ0UgLS0gVGhlc2UgYXJlIGRldGFpbGVkIGRlYnVnZ2luZyBtZXNzYWdlcyB0aGF0IGFyZSBtYWlubHkgdXNlZnVsIAorICAgICAgICAgdG8gZGVidWcgYSBjb21wb25lbnQuIFRoZXNlIGFyZSB1c3VhbGx5IHR1cm5lZCBvZmYuCiAgICAgICAgICBFeGFtcGxlczogZXZlcnl0aGluZyBlbHNlIHRoYXQgZG9lcyBub3QgZmFsbCBpbiBvbmUgb2YgdGhlCiAgICAgICAgICAgICAgICAgICAgYWJvdmUgbWVudGlvbmVkIGNhdGVnb3JpZXMgYW5kIHRoZSB1c2VyIGRvZXMgbm90Ci0gICAgICAgICAgICAgICAgICAgbmVlZCB0byBrbm93IGFib3V0IGl0LiBUaGlzIHNvcnQgb2YgbWVzc2FnZXMgc2ltcGx5Ci0gICAgICAgICAgICAgICAgICAgb3V0cHV0cyBzb21ldGhpbmcgYWJvdXQgdGhlIHN0YXRlIG9mIHNvbWUgY29tcG9uZW50IAotICAgICAgICAgICAgICAgICAgIHRoYXQgaXMgb2YgaW50ZXJlc3QgbWFpbmx5IHRvIHRoZSBkZXZlbG9wZXIgb2YgdGhhdAotICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC4KLSAgICAgICAgICAgIAotV2Ugd2lsbCByZWZlciB0byBhIGdlbmVyaWMgY2xhc3MgYXMgeXl5LgorICAgICAgICAgICAgICAgICAgIG5lZWQgdG8ga25vdyBhYm91dCBpdC4KIAotVGhlIHVzZXIgaGFzIHRoZSBjYXBhYmlsaXR5IHRvIHR1cm4gb24gb3Igb2ZmIG1lc3NhZ2VzIGluIGEgcGFydGljdWxhcgotY2xhc3MuIFlvdSBjYW4gZXhwZWN0IHRoZSBmb2xsb3dpbmcgcGF0dGVycyBvZiB1c2FnZSAoYnV0IG5vdGUgdGhhdCAKKyAgICAgICAgICAgIAorVGhlIHVzZXIgaGFzIHRoZSBjYXBhYmlsaXR5IHRvIHR1cm4gb24gb3Igb2ZmIG1lc3NhZ2VzIG9mIGEgcGFydGljdWxhcgordHlwZS4gWW91IGNhbiBleHBlY3QgdGhlIGZvbGxvd2luZyBwYXR0ZXJucyBvZiB1c2FnZSAoYnV0IG5vdGUgdGhhdCAKIGFueSBjb21iaW5hdGlvbiBpcyBwb3NzaWJsZSk6Ci0gIC0tIHdoZW4geW91IGRlYnVnIGEgY29tcG9uZW50LCBhbGwgY2xhc3NlcyAoaW5mbyx3YXJuLGVycixmaXhtZSkKKyAgLS0gd2hlbiB5b3UgZGVidWcgYSBjb21wb25lbnQsIGFsbCB0eXBlcyAoVFJBQ0UsV0FSTixFUlIsRklYTUUpCiAgICAgIHdpbGwgYmUgZW5hYmxlZC4KICAgLS0gZHVyaW5nIHRoZSBwcmUtYWxwaGEgKG1heWJlIGFscGhhKSBzdGFnZSBvZiBXaW5lLCBtb3N0IGxpa2VseQotICAgICB0aGUgaW5mbyBjbGFzcyB3aWxsIGJlIGRpc2FibGVkIGJ5IGRlZmF1bHQsIGJ1dCBhbGwgb3RoZXJzCi0gICAgICh3YXJuLGVycixmaXhtZSkgd2lsbCBiZSBlbmFibGVkIGJ5IGRlZmF1bHQuCi0gIC0tIHdoZW4gV2luZSB3aWxsIGJlY29tZSBzdGFibGUsIG1vc3QgbGlrZWx5IHRoZSBpbmZvIGFuZCB3YXJuCi0gICAgIGNsYXNzZXMgd2lsbCBiZSBkaXNhYmxlZCBieSBkZWZhdWx0LCBidXQgYWxsIGVyciBhbmQgZml4bWUgCi0gICAgIHdpbGwgYmUgZW5hYmxlZCBieSBkZWZhdWx0LgorICAgICB0aGUgVFJBQ0UgY2xhc3Mgd2lsbCBiZSBkaXNhYmxlZCBieSBkZWZhdWx0LCBidXQgYWxsIG90aGVycworICAgICAoV0FSTixFUlIsRklYTUUpIHdpbGwgYmUgZW5hYmxlZCBieSBkZWZhdWx0LgorICAtLSB3aGVuIFdpbmUgd2lsbCBiZWNvbWUgc3RhYmxlLCBtb3N0IGxpa2VseSB0aGUgVFJBQ0UgYW5kIFdBUk4KKyAgICAgY2xhc3NlcyB3aWxsIGJlIGRpc2FibGVkIGJ5IGRlZmF1bHQsIGJ1dCBhbGwgRVJScyBhbmQgRklYTUVzIAorICAgICB3aWxsIGJlIGVuYWJsZWQuCiAgIC0tIGluIHNvbWUgaW5zdGFsbGF0aW9ucyB0aGF0IHdhbnQgdGhlIHNtYWxsZXN0IGZvb3RwcmludAogICAgICBhbmQgd2hlcmUgdGhlIGRlYnVnIGluZm9ybWF0aW9uIGlzIG9mIG5vIGludGVyZXN0LCAKICAgICAgYWxsIGNsYXNzZXMgbWF5IGJlIGRpc2FibGVkIGJ5IGRlZmF1bHQuCkBAIC03MCwxMSArNjgsMTEgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLQogCiBBbHNvLCB3ZSBkaXZpZGUgdGhlIGRlYnVnZ2luZyBtZXNzYWdlcyBwZXIgY29tcG9uZW50LiBFYWNoIGNvbXBvbmVudAotaXMgYXNzaWduZWQgYSBkZWJ1Z2dpbmcgY2hhbm5lbCAob3IgdHlwZSkuIFRoZSBpZGVudGlmaWVyIG9mIHRoZQoraXMgYXNzaWduZWQgYSBkZWJ1Z2dpbmcgY2hhbm5lbC4gVGhlIGlkZW50aWZpZXIgb2YgdGhlCiBjaGFubmVsIG11c3QgYmUgYSB2YWxpZCBDIGlkZW50aWZpZXIgYnV0IG5vdGUgdGhhdCBpdCBtYXkgYWxzbyBiZSBhCiByZXNlcnZlIHdvcmQgbGlrZSBpbnQgb3Igc3RhdGljLgogCi1FeGFtcGxlcyBvZiBkZWJ1Z2dpbmcgY2hhbm5lbHMvdHlwZXM6CitFeGFtcGxlcyBvZiBkZWJ1Z2dpbmcgY2hhbm5lbHM6CiByZWcsIHVwZG93biwgc3RyaW5nCiAKIFdlIHdpbGwgcmVmZXIgdG8gYSBnZW5lcmljIGNoYW5uZWwgYXMgeHh4LgpAQCAtODksMjYgKzg3LDI4IEBACiAgICAgICBJbiB0aGUgbmV3IGludGVyZmFjZSwgd2UgZHJvcCB0aGUgc3RkZGViIGFzIGl0IGlzIGltcGxpY2l0LgogICAgICAgSG93ZXZlciwgd2UgYWRkIGFuIG9ydGhvZ29uYWwgcGllY2Ugb2YgaW5mb3JtYXRpb24gdG8gdGhlCiAgICAgICBtZXNzYWdlOiBpdHMgY2xhc3MuIFRoaXMgaXMgdmVyeSBpbXBvcnRhbnQgYXMgaXQgd2lsbCBhbGxvdwotICAgICAgdXMgdG8gc2VsZWN0aXZlbHkgdHVybiBvbiBvciBvZmYgY2VydGFpbiBtZXNzYWdlcyBiYXNlZCBvbgorICAgICAgdXMgdG8gc2VsZWN0aXZlbHkgdHVybiBvbiBvciBvZmYgY2VydGFpbiBtZXNzYWdlcyBiYXNlZCBvbiB0aGUKICAgICAgIHR5cGUgb2YgaW5mb3JtYXRpb24gdGhleSByZXBvcnQuIEZvciB0aGlzIHJlYXNvbiBpdCBpcyBWRVJZCiAgICAgICBpbXBvcnRhbnQgdG8gY2hvb3NlIHRoZSByaWdodCBjbGFzcyBmb3IgdGhlIG1lc3NhZ2UuIAogICAgICAgQW55aG93LCBzdXBwb3NlIHdlIGZpZ3VyZWQgdGhhdCB0aGlzIG1lc3NhZ2Ugc2hvdWxkIGJlbG9uZwotICAgICAgaW4gdGhlIHdhcm4gY2xhc3MsIHNvIGluIHRoZSBuZXcgaW50ZXJmYWNlLCB5b3Ugd3JpdGU6CisgICAgICBpbiB0aGUgV0FSTiBjbGFzcywgc28gaW4gdGhlIG5ldyBpbnRlcmZhY2UsIHlvdSB3cml0ZToKIAotICAgICAgZHByaW50Zl93YXJuKHJlZywgIkNvdWxkIG5vdCBhY2Nlc3Mga2V5IVxuIik7CisgICAgICBXQVJOKHJlZywgIkNvdWxkIG5vdCBhY2Nlc3Mga2V5ISIpOworCisgICAgICBOb3RpY2UgdGhlIFxuIGlzIG5vIGxvbmdlciByZXF1aXJlZC4KIAogLS0tCiAKIEhvdyB0byB1c2UgaXQKIC0tLS0tLS0tLS0tLS0KIAotU28sIHRvIG91dHB1dCBhIG1lc3NhZ2UgKGNsYXNzIHl5eSkgb24gY2hhbm5lbCB4eHgsIGRvOgorU28sIHRvIG91dHB1dCBhIG1lc3NhZ2UgKGNsYXNzIFlZWSkgb24gY2hhbm5lbCB4eHgsIGRvOgogCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogLi4uLgogCi1kcHJpbnRmX3l5eSh4eHgsICI8bWVzc2FnZT4iLCAuLi4pOworWVlZKHh4eCwgIjxtZXNzYWdlPiIsIC4uLik7CiAKIAogU29tZSBleGFtcGxlcyBmcm9tIHRoZSBjb2RlOgpAQCAtMTE3LDE0ICsxMTcsMTQgQEAKIAogLi4uCiAKLSAgZHByaW50Zl9pbmZvKGNydGRsbCwKLQkgICAgICAgIkNSVERMTF9zZXRidWYoZmlsZSAlcCBidWYgJXApXG4iLAorICBUUkFDRShjcnRkbGwsICJDUlRETExfc2V0YnVmKGZpbGUgJXAgYnVmICVwKSIsCiAJICAgICAgIGZpbGUsIGJ1Zik7CiAKLSAgZHByaW50Zl93YXJuKGFzcGksICJFcnJvciBvcGVuaW5nIGRldmljZSBlcnJubz0lZFxuIiwgc2F2ZV9lcnJvcik7CisgIFdBUk4oYXNwaSwgIkVycm9yIG9wZW5pbmcgZGV2aWNlIGVycm5vPSVkIiwgc2F2ZV9lcnJvcik7CiAKIAotSWYgeW91IG5lZWQgdG8gZGVjbGFyZSBhIG5ldyBkZWJ1Z2dpbmcgY2hhbm5lbCwgZG86CitJZiB5b3UgbmVlZCB0byBkZWNsYXJlIGEgbmV3IGRlYnVnZ2luZyBjaGFubmVsLCB1c2UgaXQgaW4geW91ciBjb2RlCithbmQgdGhlbiBkbzoKICV0b29scy9tYWtlX2RlYnVnCiBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgV2luZS4KIApAQCAtMTMyLDIwICsxMzIsMjAgQEAKIAogTm90ZXM6CiAgICAxLiBQbGVhc2UgcGF5IGF0dGVudGlvbiB0byB3aGljaCBjbGFzcyB5b3UgYXNzaWduIHRoZSBtZXNzYWdlLgotICAgICAgSXQgaXMgdmVyeSwgVmVyeSwgVkVSWSBpbXBvcnRhbnQgdG8gZ2V0IHRoZSBjbGFzcyByaWdodC4KICAgICAgIFRoZXJlIGFyZSBvbmx5IDQgY2xhc3Nlcywgc28gaXQgaXMgbm90IGhhcmQuIFRoZSByZWFzb24KICAgICAgIGl0IGlzIGltcG9ydGFudCB0byBnZXQgaXQgcmlnaHQgaXMgdGhhdCB0b28gbXVjaCBpbmZvcm1hdGlvbgogICAgICAgaXMgbm8gaW5mb3JtYXRpb24uIEZvciBleGFtcGxlLCBpZiB5b3UgcHV0IHRoaW5ncyBpbnRvIHRoZSAKLSAgICAgIHdhcm4gY2xhc3MgdGhhdCBzaG91bGQgcmVhbGx5IGJlIGluIHRoZSBpbmZvIGNsYXNzLCB0aGUgCisgICAgICBXQVJOIGNsYXNzIHRoYXQgc2hvdWxkIHJlYWxseSBiZSBpbiB0aGUgVFJBQ0UgY2xhc3MsIHRoZSAKICAgICAgIG91dHB1dCB3aWxsIGJlIHRvbyBiaWcgYW5kIHRoaXMgd2lsbCBmb3JjZSB0aGUgdXNlciB0byAKLSAgICAgIHR1cm4gb2Ygd2FybmluZ3MuIEJ1dCB0aGlzIHdheSBoZSB3aWxsIGZhaWwgdG8gc2VlIHRoZSBpbXBvcnRhbnQKLSAgICAgIG9uZXMuIEFsc28sIGlmIHlvdSBwdXQgd2FybmluZ3MgaW50byB0aGUgaW5mbyBjbGFzcyBsZXRzIHNheSwKLSAgICAgIGhlIHdpbGwgbW9zdCBsaWtlbHkgbWlzcyB0aG9zZSBiZWNhdXNlIHVzdWFsbHkgdGhlIGluZm8gY2xhc3MKKyAgICAgIHR1cm4gd2FybmluZ3Mgb2ZmLiBCdXQgdGhpcyB3YXkgaGUgd2lsbCBmYWlsIHRvIHNlZSB0aGUgaW1wb3J0YW50CisgICAgICBvbmVzLiBBbHNvLCBpZiB5b3UgcHV0IHdhcm5pbmdzIGludG8gdGhlIFRSQUNFIGNsYXNzIGxldHMgc2F5LAorICAgICAgaGUgd2lsbCBtb3N0IGxpa2VseSBtaXNzIHRob3NlIGJlY2F1c2UgdXN1YWxseSB0aGUgVFJBQ0UgY2xhc3MKICAgICAgIGlzIHR1cm5lZCBvZmYuIEEgc2ltaWxhciBhcmd1bWVudCBjYW4gYmUgbWFkZSBpZiB5b3UgbWl4IGFueQogICAgICAgb3RoZXIgdHdvIGNsYXNzZXMuCi0gICAyLiBBTEwgTElORVMgTVVTVCBFTkQgV0lUSCBBIE5FV0xJTkUhISEgSWYgeW91IGNhbiBOT1Qgb3V0cHV0Ci0gICAgICBldmVyeXRoaW5nIHRoYXQgeW91IHdhbnQgaW4gdGhlIGxpbmUgd2l0aCBvbmx5IG9uZSBkcHJpbnRmX3h4eAotICAgICAgc3RhdGVtZW50LCB0aGVuIHlvdSBuZWVkIHRvIGJ1aWxkIHRoZSBzdHJpbmcgaW4gbWVtb3J5LgorICAgMi4gQWxsIGxpbmVzIGVuZCBieSBkZWZhdWx0IHdpdGggYSBuZXdsaW5lLiBTbyB5b3Ugc2hvdWxkIG5vdAorICAgICAgYWRkIG9uZSBtb3JlLiAgSWYgeW91IGNhbiBOT1Qgb3V0cHV0IGV2ZXJ5dGhpbmcgdGhhdCB5b3Ugd2FudCBpbiAKKyAgICAgIHRoZSBsaW5lIHdpdGggb25seSBvbmUgc3RhdGVtZW50LCB0aGVuIHlvdSBuZWVkIHRvIGJ1aWxkIHRoZSBzdHJpbmcKKyAgICAgIGluIG1lbW9yeS4KICAgICAgIFBsZWFzZSByZWFkIHRoZSBzZWN0aW9uIGJlbG93ICJJbi1tZW1vcnkgbWVzc2FnZXMiIG9uIHRoZQogICAgICAgcHJlZmVycmVkIHdheSB0byBkbyBpdC4gUExFQVNFIFVTRSBUSEFUIElOVEVSRkFDRSBUTyBCVUlMRAogICAgICAgTUVTU0FHRVMgSU4gTUVNT1JZLiBUaGUgcmVhc29uIGlzIHRoYXQgd2UgYXJlIG5vdCBzdXJlIHRoYXQKQEAgLTE1OCwxNyArMTU4LDIyIEBACiAtLS0tLS0tLS0tLS0tLS0tLQogCiBUbyB0ZXN0IHdoZXRoZXIgdGhlIGRlYnVnZ2luZyBvdXRwdXQgb2YgY2xhc3MgeXl5IG9uIGNoYW5uZWwgeHh4IGlzCi1lbmFibGVkLCBkbzoKK2VuYWJsZWQsIHVzZToKIAotZGVidWdnaW5nX3l5eSh4eHgpCitUUkFDSU5HICB0byB0ZXN0IGlmIFRSQUNFIGlzIGVuYWJsZWQKK1dBUk5JTkcgIHRvIHRlc3QgaWYgV0FSTiBpcyBlbmFibGVkCitGSVhNSU5HICB0byB0ZXN0IGlmIEZJWE1FIGlzIGVuYWJsZWQKK0VSUklORyAgIHRvIHRlc3QgaWYgRVJSIGlzIGVuYWJsZWQKIAogRXhhbXBsZXM6CiAKLWlmKGRlYnVnZ2luZ19pbmZvKGF0b20pKXsKK2lmKFRSQUNJTkcoYXRvbSkpewogICAuLi5ibGFoLi4uCiB9CiAKLQorTm90ZSB0aGF0IHlvdSBzaG91bGQgbm9ybWFseSBuZWVkIHRvIHRlc3Qgb25seSBpZiBUUkFDSU5HLiBBdCBwcmVzZW50LAorbm9uZSBvZiB0aGUgb3RoZXIgMyB0ZXN0cyAoZXhjZXB0IGZvciBFUlJJTkcgd2hpY2ggaXMgdXNlZCBvbmx5IG9uY2UhKQorYXJlIHVzZWQgaW4gV2luZS4KIAogSW4tbWVtb3J5IG1lc3NhZ2VzCiAtLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTIwNCwxMSArMjA5LDExIEBACiAKICAgZm9yIChpID0gMDsgaSA8IGRlc2NyLT5uYl90YWJzOyBpKyspIHsKICAgICBkZXNjci0+dGFic1tpXSA9ICpwKys8PDE7IAotICAgIGlmKGRlYnVnZ2luZ19pbmZvKGxpc3Rib3gpKSAgICAgICAgICAgICAgICAgIC8qIHdyaXRlIGluIGl0IG9ubHkgaWYKKyAgICBpZihUUkFDSU5HKGxpc3Rib3gpKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3cml0ZSBpbiBpdCBvbmx5IGlmCiAgICAgICBkc3ByaW50ZihsaXN0Ym94LCAiJWhkICIsIGRlc2NyLT50YWJzW2ldKTsgLyogd2UgYXJlIGdvbm5hIG91dHB1dCBpdCAqLwogICB9Ci0gIGRwcmludGZfaW5mbyhsaXN0Ym94LCAiTGlzdGJveCAlMDR4OiBzZXR0YWJzdG9wcyAlc1xuIiwgCi0JICAgICAgIHduZC0+aHduZFNlbGYsIGRiZ19zdHIobGlzdGJveCkpOyAvKiBvdXRwdXQgdGhlIHdob2xlIHRoaW5nICovCisgIFRSQUNFKGxpc3Rib3gsICJMaXN0Ym94ICUwNHg6IHNldHRhYnN0b3BzICVzIiwgCisJd25kLT5od25kU2VsZiwgZGJnX3N0cihsaXN0Ym94KSk7ICAgICAgICAvKiBvdXRwdXQgdGhlIHdob2xlIHRoaW5nICovCiB9CiAKIElmIHlvdSBuZWVkIHRvIHVzZSBpdCB0d28gdGltZXMgaW4gdGhlIHNhbWUgc2NvcGUgZG8gbGlrZSB0aGlzOgpAQCAtMjIxLDIxICsyMjYsMjEgQEAKIAogICBmb3IgKGkgPSAwOyBpIDwgZGVzY3ItPm5iX3RhYnM7IGkrKykgewogICAgIGRlc2NyLT50YWJzW2ldID0gKnArKzw8MTsgIAotICAgIGlmKGRlYnVnZ2luZ19pbmZvKGxpc3Rib3gpKSAgICAgICAgICAgICAgICAgIC8qIHdyaXRlIGluIGl0IG9ubHkgaWYKKyAgICBpZihUUkFDSU5HKGxpc3Rib3gpKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3cml0ZSBpbiBpdCBvbmx5IGlmCiAgICAgICBkc3ByaW50ZihsaXN0Ym94LCAiJWhkICIsIGRlc2NyLT50YWJzW2ldKTsgLyogd2UgYXJlIGdvbm5hIG91dHB1dCBpdCAqLwogICB9Ci0gIGRwcmludGZfaW5mbyhsaXN0Ym94LCAiTGlzdGJveCAlMDR4OiBzZXR0YWJzdG9wcyAlc1xuIiwgCi0JICAgICAgIHduZC0+aHduZFNlbGYsIGRiZ19zdHIobGlzdGJveCkpOyAvKiBvdXRwdXQgdGhlIHdob2xlIHRoaW5nICovCisgIFRSQUNFKGxpc3Rib3gsICJMaXN0Ym94ICUwNHg6IHNldHRhYnN0b3BzICVzXG4iLCAKKwl3bmQtPmh3bmRTZWxmLCBkYmdfc3RyKGxpc3Rib3gpKTsgICAgICAgIC8qIG91dHB1dCB0aGUgd2hvbGUgdGhpbmcgKi8KIAogICBkYmdfcmVzZXRfc3RyKGxpc3Rib3gpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qICEhIXJlc2V0IHRoZSBzdHJpbmchISEgKi8KICAgZm9yIChpID0gMDsgaSA8IGRlc2NyLT5leHRyYWluZm9fbnI7IGkrKykgewogICAgIGRlc2NyLT5leHRyYWluZm8gPSAqcCsxOyAKLSAgICBpZihkZWJ1Z2dpbmdfaW5mbyhsaXN0Ym94KSkgICAgICAgICAgICAgICAgICAvKiB3cml0ZSBpbiBpdCBvbmx5IGlmCisgICAgaWYoVFJBQ0lORyhsaXN0Ym94KSkgICAgICAgICAgICAgICAgICAgICAgICAgLyogd3JpdGUgaW4gaXQgb25seSBpZgogICAgICAgZHNwcmludGYobGlzdGJveCwiJTNkICIsZGVzY3ItPmV4dHJhaW5mbyk7IC8qIHdlIGFyZSBnb25uYSBvdXRwdXQgaXQgKi8KICAgfQogCi0gIGRwcmludGZfaW5mbyhsaXN0Ym94LCAiTGlzdGJveCAlMDR4OiBleHRyYWluZm8gJXNcbiIsIAotCSAgICAgICB3bmQtPmh3bmRTZWxmLCBkYmdfc3RyKGxpc3Rib3gpKTsgLyogb3V0cHV0IHRoZSB3aG9sZSB0aGluZyAqLworICBUUkFDRShsaXN0Ym94LCAiTGlzdGJveCAlMDR4OiBleHRyYWluZm8gJXNcbiIsIAorCXduZC0+aHduZFNlbGYsIGRiZ19zdHIobGlzdGJveCkpOyAgICAgICAgLyogb3V0cHV0IHRoZSB3aG9sZSB0aGluZyAqLwogCiB9CiAKQEAgLTI0OSwxMiArMjU0LDEyIEBACiAgIGludGVyZmFjZSAod2hlbiBpdCB3aWxsIGJlY29tZSBhdmFpbGFibGUpLiBTbywgaWYgeW91IG5lZWQgdG8gdXNlIGlmLAogICB0aGVuIGZvbGxvdyB0aGUgZm9sbG93aW5nIGd1aWRlbGluZXM6CiAgICAtLSB3cmFwIGNhbGxzIHRvIGRzcHJpbnRmIHdpdGggYSAKLSAgICAgIGlmKGRlYnVnZ2luZ195eXkoeHh4KSkKKyAgICAgIGlmKFlZWSh4eHgpKQogICAgICAgICBkc3ByaW50Zih4eHgsLi4uKTsKICAgICAgIE9mIGNvdXJzZSwgaWYgdGhlIGNhbGwgdG8gZHNwcmludGYgaXMgbWFkZSBmcm9tIHdpdGhpbiBhIGZ1bmN0aW9uIAotICAgICAgd2hpY2ggeW91IGtub3cgaXMgY2FsbGVkIG9ubHkgaWYgZGVidWdnaW5nX3l5eSh4eHgpIGlzIHRydWUKKyAgICAgIHdoaWNoIHlvdSBrbm93IGlzIGNhbGxlZCBvbmx5IGlmIFlZWSh4eHgpIGlzIHRydWUKICAgICAgIChzYXkgeW91IGNhbGwgaXQgb25seSBsaWtlIHRoaXM6Ci0gICAgICAgIGlmKGRlYnVnZ2luZ195eXkoeHh4KSkKKyAgICAgICAgaWYoWVlZKHh4eCkpCiAgICAgICAgICAgcHJpbnRfc29tZV9kZWJ1Z19pbmZvKCk7CiAgICAgICApCiAgICAgICB0aGVuIHlvdSBuZWVkIG5vdCAoYW5kIHNob3VsZCBub3QpIHdyYXAgY2FsbHMgdG8gZHNwcmludGYgd2l0aApAQCAtMjk4LDcgKzMwMyw3IEBACiAKIC4uLgogCi0gICBkcHJpbnRmX3l5eSh4eHgsICJyZXNvdXJjZSBpcyAlcyIsIGRlYnVncmVzKG15cmVzb3VyY2UpKTsKKyAgIFlZWSh4eHgsICJyZXNvdXJjZSBpcyAlcyIsIGRlYnVncmVzKG15cmVzb3VyY2UpKTsKIAogCiBUaGUgLWRlYnVnbXNnIGNvbW1hbmQgbGluZSBvcHRpb24KQEAgLTMxNiwxNSArMzIxLDE1IEBACiAgICAKICAgICBlbmFibGVzIGFsbCBtZXNzYWdlcyBvbiB0aGUgcmVnIGNoYW5uZWwgYW5kIGRpc2FibGVzIGFsbAogICAgIG1lc3NhZ2VzIG9uIHRoZSBmaWxlIGNoYW5uZWwuCi0gICAgVGhpcyBpcyB2ZXJ5IGNsb3NlIChhY3R1YWxseSBpZGVudGljYWwpIHRvIHRoZSBvbGQgc2VtYW50aWNzLgorICAgIFRoaXMgaXMgc2FtZSBhcyB0aGUgb2xkIHNlbWFudGljcy4KIAogICAtIHdoZW4gdGhlIG9wdGlvbmFsIGNsYXNzIGFyZ3VtZW50ICh5eXkpIGlzIHByZXNlbnQsIAogICAgIHRoZW4gdGhlIHN0YXRlbWVudCB3aWxsIGVuYWJsZSgrKS9kaXNhYmxlKC0pIG1lc3NhZ2VzIGZvcgogICAgIHRoZSBnaXZlbiBjaGFubmVsICh4eHgpIG9ubHkgb24gdGhlIGdpdmVuIGNsYXNzLiBGb3IgZXhhbXBsZToKICAgIAotICAgIC1kZWJ1Z21zZyBpbmZvK3JlZyx3YXJuLWZpbGUKKyAgICAtZGVidWdtc2cgdHJhY2UrcmVnLHdhcm4tZmlsZQogICAgCi0gICAgZW5hYmxlcyBpbmZvIG1lc3NhZ2VzIG9uIHRoZSByZWcgY2hhbm5lbCBhbmQgZGlzYWJsZXMgd2FybmluZworICAgIGVuYWJsZXMgdHJhY2UgbWVzc2FnZXMgb24gdGhlIHJlZyBjaGFubmVsIGFuZCBkaXNhYmxlcyB3YXJuaW5nCiAgICAgbWVzc2FnZXMgb24gdGhlIGZpbGUgY2hhbm5lbC4KIAogICAtIGFsc28sIHRoZSBwc2V1ZG8tY2hhbm5lbCBhbGwgaXMgYWxzbyBzdXBwb3J0ZWQgYW5kIGl0IGhhcyB0aGUgCkBAIC0zNDMsOCArMzQ4LDggQEAKIAogCiBBbHNvLCBub3RlIHRoYXQgYXQgdGhlIG1vbWVudDoKLSAgIC0gdGhlIGZpeG1lLCBlcnIsIHdhcm4gY2xhc3NlcyBhcmUgYWxsIGVuYWJsZWQgYnkgZGVmYXVsdAotICAgLSB0aGUgaW5mbyBjbGFzcyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0CisgICAtIHRoZSBmaXhtZSBhbmQgZXJyIGNsYXNzZXMgYXJlIGVuYWJsZWQgYnkgZGVmYXVsdAorICAgLSB0aGUgdHJhY2UgYW5kIHdhcm4gIGNsYXNzZXMgYXJlIGRpc2FibGVkIGJ5IGRlZmF1bHQKICAgIC0gdGhlcmUgaXMgbm8gd2F5IHRvIGNvbXBpbGUgb3V0IHRoZSBtZXNzYWdlcy4gQWxsIGFyZSAKICAgICAgcnVudGltZSBjb25maWd1cmFibGUuIFRoaXMgd2lsbCBjb21lIG5leHQgcmVsZWFzZS4KIApkaWZmIC0tZ2l0IGEvZG9jdW1lbnRhdGlvbi9zdGF0dXMvbHpleHBhbmQgYi9kb2N1bWVudGF0aW9uL3N0YXR1cy9semV4cGFuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODllMzU0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jdW1lbnRhdGlvbi9zdGF0dXMvbHpleHBhbmQKQEAgLTAsMCArMSwyMCBAQAorVGhpcyBmaWxlIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBMWiBmaWxlIGRlY29tcHJlc3Npb24gbGlicmFyaWVzLgorCitUaGUgTFogKExlbXBlbCBaaXYpIGRlY29tcHJlc3Npb24gd2FzIHVzZWQgaW4gd2luMTYgaW5zdGFsbGF0aW9uIHByb2dyYW1zLgorKFdpbjMyIGluc3RhbGxhdGlvbiBwcm9ncmFtcyBub3cgdXNlIG1vc3RseSBDQUIgb3IgV0lOWklQIHNlbGZleHRyYWN0b3JzIAorIG9yIHNvbWV0aGluZyBzaW1pbGFpci4pCitJdCBpcyBhIHNpbXBsZSB0YWJsZWRyaXZlbiBkZWNvbXByZXNzaW9uIGVuZ2luZSwgdGhlIGFsZ29yaXRobSBpcyBub3QKK2RvY3VtZW50ZWQgYXMgZmFyIGFzIEkga25vdy4gV0lORSBkb2VzIG5vdCBjb250YWluIGEgY29tcHJlc3NvciBmb3IKK3RoaXMgZm9ybWF0LgorCitUaGUgbGlicmFyaWVzIGNvbnNpc3Qgb2YgTFpFWFBBTkQuRExMICh3aW4xNikgYW5kIExaMzIuRExMICh3aW4zMiksIHRoZSAKK2ltcGxlbWVudGF0aW9uIGNhbiBiZSBmb3VuZCBpbiBtaXNjL2x6ZXhwYW5kLmMgYW5kIHRoZXJlIGlzIGEgc21hbGwKK2V4YW1wbGUgcHJvZ3JhbSBpbiBsaWJ0ZXN0L2V4cGFuZC5jLgorCitUaGUgaW1wbGVtZW50YXRpb24gaXMgY29tcGxldGUgYW5kIHRoZXJlIGhhdmUgYmVlbiBubyByZXBvcnRzIG9mIGZhaWx1cmVzCitmb3Igc29tZSB0aW1lLgorCitGSVhNRXM6CisJLSBDaGVjayBmb3IgY29ycmVjdCBpbmNsdWRlIGZpbGVzCisJLSBDaGVjayB3aGV0aGVyIHRoZSByZXR1cm4gdmFsdWVzIGFyZSBjb3JyZWN0CisJLSBXcml0ZSBhIGNvbXByZXNzb3IgZm9yIHRoaXMgZm9ybWF0LgpkaWZmIC0tZ2l0IGEvZG9jdW1lbnRhdGlvbi9zdGF0dXMvbXVsdGltZWRpYSBiL2RvY3VtZW50YXRpb24vc3RhdHVzL211bHRpbWVkaWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRhZmNhOQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3VtZW50YXRpb24vc3RhdHVzL211bHRpbWVkaWEKQEAgLTAsMCArMSwxNzYgQEAKK1RoaXMgZmlsZSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIG11bHRpbWVkaWEKK2xheWVyIG9mIFdJTkUuCisKK1RoZSBsaWJyYXJpZXMgY29uc2lzdCBvZiBNTVNZU1RFTS5ETEwgKHdpbjE2KSwgV0lOTU0uRExMICh3aW4zMikgYW5kIHNvbWUKKyhhYnN0cmFjdGVkLCBub3QgV2luZG93cyBjb21wYXRpYmxlKSBsb3dsZXZlbCBkcml2ZXJzLiBUaGUgaW1wbGVtZW50YXRpb24KK2NhbiBiZSBmb3VuZCBpbiB0aGUgbXVsdGltZWRpYS8gc3ViZGlyZWN0b3J5LgorCitUaGUgbXVsdGltZWRpYSBzdHVmZiBpcyBzcGxpdCBpbnRvIDMgbGF5ZXJzLiBUaGUgbG93bGV2ZWwgKGRldmljZSBkcml2ZXJzKSwKK21pZGxldmVsIChNQ0kgY29tbWFuZHMpIGFuZCBoaWdobGV2ZWwgYWJzdHJhY3Rpb24gbGF5ZXJzLgorCisxLiBMb3dsZXZlbCBsYXllcnMKKworICAgRm9sbG93aW5nIGxvd2xldmVsIGxheWVycyBhcmUgaW1wbGVtZW50ZWQ6CisxLjEgKFdhdmVmb3JtKSBBdWRpbworCisgICBUaGUgQVBJIGNvbnNpc3RzIG9mIHRoZSB3YXZlSW4qL3dhdmVPdXQqIGZ1bmN0aW9ucyBmb3VuZCBpbgorICAgbXVsdGltZWRpYS9tbXN5c3RlbS5jLiBUaGV5IGNhbGwgdGhlIHJlYWwgbG93bGV2ZWwgYXVkaW9kcml2ZXIgdXNpbmcKKyAgIHRoZSB3b2RNZXNzYWdlL3dpZE1lc3NhZ2UgZnVuY3Rpb24gaW4gbXVsdGltZWRpYS9hdWRpby5jLCB3aGljaCBoYW5kbGVzCisgICB0aGUgZGlmZmVyZW50IHJlcXVlc3RzLgorCisgICBUaGUgbG93bGV2ZWwgYXVkaW8gZHJpdmVyIGlzIGN1cnJlbnRseSBvbmx5IGltcGxlbWVudGVkIGZvciB0aGUKKyAgIE9wZW5Tb3VuZFN5c3RlbSAoT1NTKSBhcyBzdXBwbGllZCBpbiB0aGUgTGludXggYW5kIEZyZWVCU0Qga2VybmVscyBieQorICAgNEZyb250IFRlY2hub2xvZ2llcyAoaHR0cDovL3d3dy40ZnJvbnQtdGVjaC5jb20vKS4gVGhlIHByZXNlbmNlIG9mIHRoaXMKKyAgIGRyaXZlciBpcyBjaGVja2VkIGJ5IGNvbmZpZ3VyZSAoZGVwZW5kcyBvbiB0aGUgPHN5cy9zb3VuZGNhcmQuaD4gZmlsZSkuCisKKyAgIFRoZSBpbXBsZW1lbnRhdGlvbiBjb250YWlucyBhbGwgZmVhdHVyZXMgY29tbW9ubHkgdXNlZCwgYnV0IGhhcyBzZXZlcmFsCisgICBwcm9ibGVtcy4gRm9yIGluc3RhbmNlOgorICAgICAgV3JpdGVzIGFuZCByZWFkcyBhcmUgbm90IGRvbmUgYXN5bmNocm9ub3VzbHkgYXMgdGhleSBhcmUgc3VwcG9zZWQgdG8KKyAgIGJlIGRvbmUuIFRoaXMgYnJlYWtzIHNvbWUgcHJvZ3JhbXMgKHNvdW5kcmVjLmV4ZSBmcm9tIHRoZSBXaW5kb3dzIGFwcGxldHMpLAorICAgYnV0IGRvZXNuJ3Qgd29ycnkgb3RoZXIgcHJvZ3JhbXMuIFNvbWUgY2FsbGJhY2tzIGFyZSBwcm9iYWJseSBkb25lCisgICBpbmNvcnJlY3RseSAodGhlcmUgYXJlIHJlcG9ydHMgb2Ygc29tZSBicm9rZW4gbXVsdGltZWRpYSBhcHBsaWNhdGlvbnMsCisgICBidXQgSSBoYXZlbid0IGZvdW5kIG9uZSB5ZXQuKQorCisgICBUT0RPOgorICAgCS0gYWRkIGFzeW5jaHJvbm91cyB3cml0ZXMgYW5kIHJlYWRzIChtdXN0IHVzZSB0aHJlYWRzKQorCS0gY2hlY2sgdGhlIGNhbGxiYWNrIGZ1bmN0aW9ucworCS0gdmVyaWZ5IGFsbCBmdW5jdGlvbnMgZm9yIGNvcnJlY3RuZXNzCisJLSBhZGQgZHJpdmVycyBmb3Igb3RoZXIgc291bmRzeXN0ZW1zIChTdW4gQXVkaW8sIHJlbW90ZSBhdWRpbyBzeXN0ZW1zCisJICAodXNpbmcgWCBleHRlbnNpb25zLCAuLi4pCisKKzEuMiBNaXhlcgorCisgICBUaGUgQVBJIGNvbnNpc3RzIG9mIHRoZSBtaXhlciogZnVuY3Rpb25zIGZvdW5kIGluIG11bHRpbWVkaWEvbW1zeXN0ZW0uYy4KKyAgIFRoZXkgY2FsbCB0aGUgbG93bGV2ZWwgZHJpdmVyIGZ1bmN0aW9ucyBpbiBtdWx0aW1lZGlhL21peGVyLmMgdXNpbmcgdGhlCisgICBtaXhNZXNzYWdlIGZ1bmN0aW9uLgorCisgICBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiB0cmllcyB0byB1c2UgdGhlIE9wZW5Tb3VuZFN5c3RlbSBtaXhlciwgYnV0IGlzCisgICBtaXNzaW5nIG5lYXJseSBldmVyeXRoaW5nLiBUaGVyZSBpcyBubyByZXBvcnQgb2YgYSB3b3JraW5nIGFwcGxpY2F0aW9uLgorICAgCisgICBUT0RPOgorICAgCS0gaW1wbGVtZW50IG1peGluZyBmdW5jdGlvbmFsaXR5IGZvciBPU1MgY29ycmVjdGx5LgorCS0gaW1wbGVtZW50IG1peGluZyBsb3dsZXZlbCBkcml2ZXJzIGZvciBvdGhlciBtaXhlcnMuCisKKzEuMyBNSURJCisJCisgICBUaGUgQVBJIGNvbnNpc3RzIG9mIHRoZSBtaWRpKiBmdW5jdGlvbnMgZm91bmQgaW4gbXVsdGltZWRpYS9tbXN5c3RlbS5jLgorICAgVGhleSBjYWxsIHRoZSBsb3dsZXZlbCBkcml2ZXIgZnVuY3Rpb25zIGluIG11bHRpbWVkaWEvbWlkaS5jIHVzaW5nIHRoZQorICAgbWlkTWVzc2FnZSBhbmQgdGhlIG1vZE1lc3NhZ2UgZnVuY3Rpb25zLgorCisgICBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBpcyBjb21wbGV0ZWx5IGJyb2tlbi4gKEkgdGhpbmsgb3BlbigpLCByZWFkKCkKKyAgIGFuZCB3cml0ZSgpIG9mIHRoZSAvZGV2L21pZGkgZGV2aWNlIHdvdWxkIG1ha2UgdGhpcyBpbXBsZW1lbnRhdGlvbiBuZWFybHkKKyAgIGNvbXBsZXRlLi4uKQorCisgICBUT0RPOgorICAgCS0gSW1wbGVtZW50IGNvcnJlY3QgTUlESSBvdXRwdXQKKwktIERvIG5vdCBpbXBsZW1lbnQgYSBzb2Z0d2FyZSBzeW50aGVzaXplci4gVGhpcyBzaG91bGQgYmUgZG9uZQorCSAgdXNpbmcgTUlESSBsb29wYmFjayBkZXZpY2VzIGluIGFuIGV4dGVybmFsIHByb2dyYW0gKGxpa2UgdGltaWRpdHkpLgorCisxLjQgVGltZXJzCisKKyAgIFRoZSBBUEkgY29uc2lzdHMgb2YgdGhlIHRpbWVyKiBmdW5jdGlvbnMgZm91bmQgaW4gbXVsdGltZWRpYS90aW1lci5jLiAKKyAgIFRoZXJlIGlzIGN1cnJlbnRseSBvbmx5IG9uZSBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggdXNlcyBub3JtYWwgd2luZG93cyB0aW1lcnMuCisgICBUaGUgaW1wbGVtZW50YXRpb24gd29ya3MgZm9yIG1vc3QgY2FzZXMgZm91bmQuIFRoZSBvbmx5IHByb2JsZW0gaXMgdGhhdAorICAgaXQgZG9lc24ndCBzdXBwb3J0IGFzeW5jaHJvbm91cyB0aW1lciBldmVudHMgKGFzIGl0IGlzIHN1cHBvc2VkIHRvIGRvKS4KKworICAgVGhlcmUgaXMgYSB3b3JrYXJvdW5kIGZvciB0aGlzIGxhY2sgaW4gdGltZUdldFRpbWUoKSB0byBtYWtlIERpYWJsbyB3b3JrCisgICBhbmQgJ1BpbmJhbGwhIFNwYWNlQ2FkZXQnIGF0IGxlYXN0IHN0YXJ0IHVwLgorCisgICBUT0RPOgorICAgCS0gSW1wbGVtZW50ZWQgYXN5bmNocm9ub3VzIHRpbWVycyAodXNpbmcgYSB0aHJlYWQgcHJvYmFibHkpCisKKzEuNSBNTUlPCisgICAKKyAgIFRoZSBBUEkgY29uc2lzdHMgb2YgdGhlIG1taW8qIGZ1bmN0aW9ucyBmb3VuZCBpbiBtdWx0aW1lZGlhL21taW8uYy4KKworICAgRklYTUU6IEkgYW0gbm90IHN1cmUgYWJvdXQgdGhlIHN0YXR1cyBvZiB0aGlzIGltcGxlbWVudGF0aW9uLgorCisgICBUT0RPOgorICAgCS0gYWRkIHdpbjMyIHN1cHBvcnQuCisJLSAuLi4KKworMS42IEFVWAorICAgCisgICBUaGUgQVBJIGNvbnNpc3RzIG9mIHRoZSBhdXgqIGZ1bmN0aW9ucyBmb3VuZCBpbiBtdWx0aW1lZGlhL21tc3lzdGVtLmMuCisgICBUaGV5IGNhbGwgYXV4TWVzc2FnZSBpbiBtdWx0aW1lZGlhL21tYXV4LmMuCisKKyAgIFRoZSBhdXgqIGZ1bmN0aW9ucyBhcmUgdGhlIHByZWRlY2Vzc29yIG9mIHRoZSBtaXhlciogZnVuY3Rpb25zLgorCisgICBUaGUgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUgT1NTIG1peGVyIEFQSSwgYW5kIGlzIGluY29tcGxldGUuCisKKyAgIFRPRE86CisgICAJLSB2ZXJpZnkgdGhlIGltcGxlbWVudGF0aW9uCisKKzEuNyBKT1lTVElDSworICAgCisgICBUaGUgQVBJIGNvbnNpc3RzIG9mIHRoZSBqb3kqIGZ1bmN0aW9ucyBmb3VuZCBpbiBtdWx0aW1lZGlhL2pveXN0aWNrLmMuCisgICBUaGUgaW1wbGVtZW50YXRpb24gY3VycmVudGx5IHVzZXMgdGhlIExpbnV4IGpveXN0aWNrIGRldmljZSBkcml2ZXIgQVBJLgorICAgSXQgaXMgbGFja2luZyBzdXBwb3J0IGZvciBlbmhhbmNlZCBqb3lzdGlja3MgYW5kIGhhcyBub3QgYmVlbiBleHRlbnNpdmVseQorICAgdGVzdGVkLgorCisgICBUT0RPOgorICAgCS0gYmV0dGVyIHN1cHBvcnQgb2YgZW5oYW5jZWQgam95c3RpY2tzCisJLSBzdXBwb3J0IG1vcmUgam95c3RpY2sgZHJpdmVycyAobGlrZSB0aGUgWElucHV0IGV4dGVuc2lvbikKKworMi4gTWlkbGV2ZWwgZHJpdmVycyAoTUNJKQorICAgCisgICBUaGUgbWlkbGV2ZWwgZHJpdmVycyBhcmUgcmVwcmVzZW50ZWQgYnkgc29tZSBjb21tb24gQVBJIGZ1bmN0aW9ucywgCisgICBtb3N0bHkgbWNpU2VuZENvbW1hbmQgYW5kIG1jaVNlbmRTdHJpbmcuIFRoZSBtY2lTZW5kU3RyaW5nIGZ1bmN0aW9uCisgICB1c2VzIGNvbW1hbmRzdHJpbmdzLCB3aGljaCBhcmUgdHJhbnNsYXRlZCBpbnRvIG5vcm1hbCBNQ0kgY29tbWFuZHMgYXMKKyAgIHVzZWQgYnkgbWNpU2VuZENvbW1hbmQuIFRoZSBBUEkgY2FuIGJlIGZvdW5kIGluIG11bHRpbWVkaWEvbW1zeXN0ZW0uYworICAgYW5kIG11bHRpbWVkaWEvbWNpc3RyaW5nLmMuCisgICBUaGUgZnVuY3Rpb25zIHRoZXJlIChtY2lPcGVuLG1jaVN5c0luZm8pIGhhbmRsZSBtaWRsZXZlbCBkcml2ZXIKKyAgIGFsbG9jYXRpb24gYW5kIGNhbGxzLgorCisgICBUaGUgaW1wbGVtZW50YXRpb24gaXMgbm90IGNvbXBsZXRlLCBidXQgd29ya3MgZm9yIG1vc3QgY2FzZXMuCisgICBXaW4zMiBzdXBwb3J0IGZvciBtY2lTZW5kQ29tbWFuZCBpcyBtaXNzaW5nIChtY2lTZW5kU3RyaW5nIHdvcmtzCisgICBpbiB0aGUgV2luMzIgY2FzZSwgc2luY2UgdGhlIHVzZSBvZiBzdHJpbmdzIGRvZXNuJ3QgZGlmZmVyIGJldHdlZW4KKyAgIHdpbjE2IGFuZCB3aW4zMikuCisKKyAgIFRPRE86CisgICAJLSBXaW4zMiBzdXBwb3J0CisJLSBzdXBwb3J0IHdpbmRvd3MgTUNJIGRyaXZlcnMgKHNob3VsZCBiZSBwb3NzaWJsZSBmb3IgdGhleSB1c3VhbGx5IAorCSAgZG8gbm90IHVzZSBsb3dsZXZlbCBjYWxscykKKwktIE1DSSBjb21tYW5kIGxvYWRpbmcgc3VwcG9ydAorCS0gaW1wbGVtZW50IG90aGVyIHN0dWZmIGFzIHlldCB1bmtub3duCisKKyAgIFdJTkUgaW1wbGVtZW50cyBzZXZlcmFsIE1DSSBtaWRsZXZlbCBkcml2ZXJzOgorCisyLjEgQ0RBVURJTworICAgCisgICBUaGUgY3VycmVudGx5IGJlc3QgaW1wbGVtZW50YXRpb24gaXMgdGhlIE1DSSBDREFVRElPIGRyaXZlciB0aGF0IGNhbgorICAgYmUgZm91bmQgaW4gbXVsdGltZWRpYS9tY2ljZGEuYy4gVGhlIGltcGxlbWVudGF0aW9uIGlzIG1vc3RseSBjb21wbGV0ZSwKKyAgIHRoZXJlIGhhdmUgYmVlbiBubyByZXBvcnRzIG9mIGVycm9ycy4KKyAgIFRoZSBpbXBsZW1lbnRhdGlvbiBjdXJyZW50bHkgdXNlcyBvbmx5IHRoZSBMaW51eCAvZGV2L2Nkcm9tIGNvbnRyb2xsaW5nCisgICBmdW5jdGlvbnMuIChTdW4gYW5kIEJTRCBsaWtlIHNob3VsZCBiZSBzaW1pbGFpciwgYnV0IGFyZSBub3QgaW1wbGVtZW50ZWQuKQorCisgICBBIHZlcnkgc21hbGwgZXhhbXBsZSBvZiBhIGNkcGxheWVyIGNvbnNpc3RzIGp1c3Qgb2YgdGhlIGxpbmUKKyAgIG1jaVNlbmRTdHJpbmcoInBsYXkgY2RhdWRpbyIsTlVMTCwwLDApOworCisgICBUT0RPOgorICAgCS0gYWRkIHN1cHBvcnQgZm9yIG90aGVyIGNkYXVkaW8gZHJpdmVycworCisyLjIgTUNJV0FWRQorICAgCisgICBUaGUgaW1wbGVtZW50YXRpb24gaXMgcmF0aGVyIGNvbXBsZXRlIGFuZCBjYW4gYmUgZm91bmQgaW4gbXVsdGltZWRpYS9hdWRpby5jLgorICAgSXQgdXNlcyB0aGUgbG93bGV2ZWwgYXVkaW8gQVBJIChhbHRob3VnaCBub3QgYWJzdHJhY3RlZCBjb3JyZWN0bHkpLgorICAgRklYTUU6IFRoZSBNQ0lfU1RBVFVTIGNvbW1hbmQgaXMgYnJva2VuLgorCisgICBUT0RPOiAtIGNoZWNrIGZvciBjb3JyZWN0bmVzcworCisyLjMgTUlESS9TRVFVRU5DRVIKKyAgIAorICAgVGhlIGltcGxlbWVudGF0aW9uIGNhbiBiZSBmb3VuZCBpbiBtdWx0aW1lZGlhL21pZGkuYy4gSSBhbSBub3Qgc3VyZQorICAgYWJvdXQgdGhlIGNvbXBsZXRlbmVzcy4KKyAgIEl0IHVzZXMgdGhlIGxvd2xldmVsIG1pZGkgZHJpdmVyIGFuZCBpcyBwcm9iYWJseSBicm9rZW4gdG9vLgorCisgICBUT0RPOiAKKyAgIAktIGltcGxlbWVudCBpdCBjb3JyZWN0bHkKKworMi40IE1DSUFOSU0KKworICAgVGhlIGltcGxlbWVudGF0aW9uIGNvbnNpc3RzIG9mIHN0dWJzIGFuZCBpcyBpbiBtdWx0aW1lZGlhL21jaWFuaW0uYy4KKworICAgVE9ETzogCisgICAJLSBpbXBsZW1lbnQgaXQsIHByb2JhYmx5IHVzaW5nIHhhbmltIG9yIHNvbWV0aGluZyBzaW1pbGFpci4gQ291bGQKKwkgIGFsc28gYmUgaW1wbGVtZW50ZWQgYnkgdXNpbmcgdGhlIFdpbmRvd3MgTUNJIHZpZGVvIGRyaXZlcnMuCmRpZmYgLS1naXQgYS9kb2N1bWVudGF0aW9uL3N0YXR1cy92ZXJzaW9uIGIvZG9jdW1lbnRhdGlvbi9zdGF0dXMvdmVyc2lvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzg3MDRmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jdW1lbnRhdGlvbi9zdGF0dXMvdmVyc2lvbgpAQCAtMCwwICsxLDIwIEBACitUaGlzIGZpbGUgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHZlcnNpb25pbmcgbGlicmFyaWVzLgorVGhleSBjb25zaXN0IG9mIFZFUi5ETEwgKHdpbjE2KSBhbmQgVkVSU0lPTi5ETEwgKHdpbjMyKS4KK1RoZSBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgZm91bmQgaW4gbWlzYy92ZXIuYy4KKworVGhlIHB1cnBvc2Ugb2YgdGhpcyBsaWJyYXJ5IGlzIHRvOgorCS0gRXh0cmFjdCByZXNvdXJjZSBpbmZvcm1hdGlvbiBmcm9tIHBvc3NpYmx5IGNvbXByZXNzZWQgZmlsZXMKKwktIEluc3RhbGwgZGxscyBpbmNsdWRpbmcgdmVyc2lvbmNoZWNraW5nCisJLSBRdWVyeSB2ZXJzaW9uIGRlcGVuZGVuZCB2YXJpYWJsZXMuCisKK1RoZSByZXNvdXJjZSBleHRyYWN0aW9uIGlzIGFsbW9zdCBjb21wbGV0ZS4gVGhlcmUgaGF2ZSBiZWVuIG5vIHJlcG9ydHMgb2YKK21pc3NpbmcgZnVuY3Rpb25hbGl0eSwgYnV0IEkgYW0gbm90IHN1cmUgYWJvdXQgYWJzb2x1dGUgY29tcGxldGVuZXNzLiAKKworVGhlIERMTCBpbnN0YWxsYXRpb24gQVBJcyBkbyB3b3JrLCBidXQgaXMgcHJvYmFibHkgbm90IGNvcnJlY3QuCisKK1RoZSBBUEkgdG8gcXVlcnkgdmVyc2lvbiBkZXBlbmRlbmQgdmFyaWFibGVzIChWZXJRdWVyeVZhbHVlKSB3b3JrcyBmb3IKK2JvdGggd2luMTYvd2luMzIgcmVzb3VyY2VzLCBidXQgaXMgcHJvYmFibHkgbm90IGNvcnJlY3QgZm9yIHNvbWUgY2FzZXMuCisKK0ZJWE1FOgorCS0gQ2hlY2sgdGhlIGluc3RhbGxhdGlvbiBmdW5jdGlvbnMuCisJLSBWZXJpZnkgVmVyUXVlcnlWYWx1ZS4KZGlmZiAtLWdpdCBhL2ZpbGVzL2RpcmVjdG9yeS5jIGIvZmlsZXMvZGlyZWN0b3J5LmMKaW5kZXggZGFmZWM5Ni4uOGFiMjcyMCAxMDA2NDQKLS0tIGEvZmlsZXMvZGlyZWN0b3J5LmMKKysrIGIvZmlsZXMvZGlyZWN0b3J5LmMKQEAgLTk2LDEwICs5NiwxMCBAQAogICAgICAgICBESVJfUGF0aEVsZW1lbnRzKys7CiAgICAgfQogCi0gICAgaWYgKGRlYnVnZ2luZ19pbmZvKGRvc2ZzKSkKKyAgICBpZiAoVFJBQ0VfT04oZG9zZnMpKQogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRElSX1BhdGhFbGVtZW50czsgaSsrKQogICAgICAgICB7Ci0gICAgICAgICAgICBkcHJpbnRmX2luZm8oZG9zZnMsICJQYXRoWyVkXTogJXMgPSAlc1xuIiwKKyAgICAgICAgICAgIFRSQUNFKGRvc2ZzLCAiUGF0aFslZF06ICVzID0gJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBESVJfRG9zUGF0aFtpXSwgRElSX1VuaXhQYXRoW2ldICk7CiAgICAgICAgIH0KIH0KQEAgLTE1NSwxMCArMTU1LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgsIHNpemVvZihwYXRoKSApOwogICAgIERJUl9QYXJzZVdpbmRvd3NQYXRoKCBwYXRoICk7CiAKLSAgICBkcHJpbnRmX2luZm8oZG9zZnMsICJXaW5kb3dzRGlyID0gJXNcblN5c3RlbURpciAgPSAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICBESVJfV2luZG93c0Rvc0RpciwgRElSX1N5c3RlbURvc0RpciApOwotICAgIGRwcmludGZfaW5mbyhkb3NmcywgIlRlbXBEaXIgICAgPSAlc1xuQ3dkICAgICAgICA9ICVjOlxcJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgRElSX1RlbXBEb3NEaXIsICdBJyArIGRyaXZlLCBEUklWRV9HZXREb3NDd2QoIGRyaXZlICkgKTsKKyAgICBUUkFDRShkb3NmcywgIldpbmRvd3NEaXIgPSAlc1xuIiwgRElSX1dpbmRvd3NEb3NEaXIpOworICAgIFRSQUNFKGRvc2ZzLCAiU3lzdGVtRGlyICA9ICVzXG4iLCBESVJfU3lzdGVtRG9zRGlyKTsKKyAgICBUUkFDRShkb3NmcywgIlRlbXBEaXIgICAgPSAlc1xuIiwgRElSX1RlbXBEb3NEaXIpOworICAgIFRSQUNFKGRvc2ZzLCAiQ3dkICAgICAgICA9ICVjOlxcJXNcbiIsCisJCSAnQScgKyBkcml2ZSwgRFJJVkVfR2V0RG9zQ3dkKCBkcml2ZSApICk7CiAKICAgICAvKiBQdXQgdGhlIHRlbXAgYW5kIFdpbmRvd3MgYW5kIHN5c3RlbSBkaXJlY3RvcmllcyBpbnRvIHRoZSBlbnZpcm9ubWVudCAqLwogCkBAIC0zMjcsNyArMzI4LDcgQEAKICAqLwogQk9PTDE2IFdJTkFQSSBDcmVhdGVEaXJlY3RvcnkxNiggTFBDU1RSIHBhdGgsIExQVk9JRCBkdW1teSApCiB7Ci0gICAgZHByaW50Zl9pbmZvKGZpbGUsIkNyZWF0ZURpcmVjdG9yeTE2KCVzLCVwKVxuIiwgcGF0aCwgZHVtbXkgKTsKKyAgICBUUkFDRShmaWxlLCIoJXMsJXApXG4iLCBwYXRoLCBkdW1teSApOwogICAgIHJldHVybiAoQk9PTDE2KUNyZWF0ZURpcmVjdG9yeTMyQSggcGF0aCwgTlVMTCApOwogfQogCkBAIC0zNDAsMTAgKzM0MSwxMCBAQAogewogICAgIERPU19GVUxMX05BTUUgZnVsbF9uYW1lOwogCi0gICAgZHByaW50Zl9pbmZvKGZpbGUsICJDcmVhdGVEaXJlY3RvcnkzMkEoJXMsJXApXG4iLCBwYXRoLCBscHNlY2F0dHJpYnMgKTsKKyAgICBUUkFDRShmaWxlLCAiKCVzLCVwKVxuIiwgcGF0aCwgbHBzZWNhdHRyaWJzICk7CiAgICAgaWYgKERPU0ZTX0lzRGV2aWNlKCBwYXRoICkpCiAgICAgewotICAgICAgICBkcHJpbnRmX2luZm8oZmlsZSwgIkNyZWF0ZURpcmVjdG9yeTogY2Fubm90IHVzZSBkZXZpY2UgJyVzJyFcbiIscGF0aCk7CisgICAgICAgIFRSQUNFKGZpbGUsICJjYW5ub3QgdXNlIGRldmljZSAnJXMnIVxuIixwYXRoKTsKICAgICAgICAgRE9TX0VSUk9SKCBFUl9BY2Nlc3NEZW5pZWQsIEVDX0FjY2Vzc0RlbmllZCwgU0FfQWJvcnQsIEVMX0Rpc2sgKTsKICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KQEAgLTQwNiwxMSArNDA3LDExIEBACiB7CiAgICAgRE9TX0ZVTExfTkFNRSBmdWxsX25hbWU7CiAKLSAgICBkcHJpbnRmX2luZm8oZmlsZSwgIlJlbW92ZURpcmVjdG9yeTogJyVzJ1xuIiwgcGF0aCApOworICAgIFRSQUNFKGZpbGUsICInJXMnXG4iLCBwYXRoICk7CiAKICAgICBpZiAoRE9TRlNfSXNEZXZpY2UoIHBhdGggKSkKICAgICB7Ci0gICAgICAgIGRwcmludGZfaW5mbyhmaWxlLCAiUmVtb3ZlRGlyZWN0b3J5OiBjYW5ub3QgcmVtb3ZlIGRldmljZSAnJXMnIVxuIiwgcGF0aCk7CisgICAgICAgIFRSQUNFKGZpbGUsICJjYW5ub3QgcmVtb3ZlIGRldmljZSAnJXMnIVxuIiwgcGF0aCk7CiAgICAgICAgIERPU19FUlJPUiggRVJfRmlsZU5vdEZvdW5kLCBFQ19Ob3RGb3VuZCwgU0FfQWJvcnQsIEVMX0Rpc2sgKTsKICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KZGlmZiAtLWdpdCBhL2ZpbGVzL2Rvc19mcy5jIGIvZmlsZXMvZG9zX2ZzLmMKaW5kZXggNDE2YzVjMC4uOGNhM2ZiOSAxMDA2NDQKLS0tIGEvZmlsZXMvZG9zX2ZzLmMKKysrIGIvZmlsZXMvZG9zX2ZzLmMKQEAgLTUwMCwxMyArNTAwLDEzIEBACiAgICAgaWYgKChwID0gc3RyY2hyKCBuYW1lLCAnXFwnICkpKSBsZW4gPSBNSU4oIChpbnQpKHAgLSBuYW1lKSwgbGVuICk7CiAgICAgaWYgKGxvbmdfbGVuIDwgbGVuICsgMSkgcmV0dXJuIEZBTFNFOwogCi0gICAgZHByaW50Zl9pbmZvKGRvc2ZzLCAiRE9TRlNfRmluZFVuaXhOYW1lOiAlcywlc1xuIiwgcGF0aCwgbmFtZSApOworICAgIFRSQUNFKGRvc2ZzLCAiJXMsJXNcbiIsIHBhdGgsIG5hbWUgKTsKIAogICAgIGlmICghRE9TRlNfVG9Eb3NGQ0JGb3JtYXQoIG5hbWUsIGRvc19uYW1lICkpIGRvc19uYW1lWzBdID0gJ1wwJzsKIAogICAgIGlmICghKGRpciA9IERPU0ZTX09wZW5EaXIoIHBhdGggKSkpCiAgICAgewotICAgICAgICBkcHJpbnRmX3dhcm4oZG9zZnMsICJET1NGU19GaW5kVW5peE5hbWUoJXMsJXMpOiBjYW4ndCBvcGVuIGRpcjogJXNcbiIsCisgICAgICAgIFdBUk4oZG9zZnMsICIoJXMsJXMpOiBjYW4ndCBvcGVuIGRpcjogJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgsIG5hbWUsIHN0cmVycm9yKGVycm5vKSApOwogICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQpAQCAtNTQ2LDExICs1NDYsMTEgQEAKICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICBET1NGU19IYXNoKCBsb25nX25hbWUsIHNob3J0X2J1ZiwgRkFMU0UsIGlnbm9yZV9jYXNlICk7CiAgICAgICAgIH0KLSAgICAgICAgZHByaW50Zl9pbmZvKGRvc2ZzLCAiKCVzLCVzKSAtPiAlcyAoJXMpXG4iLAorICAgICAgICBUUkFDRShkb3NmcywgIiglcywlcykgLT4gJXMgKCVzKVxuIiwKIAkJICAgICBwYXRoLCBuYW1lLCBsb25nX25hbWUsIHNob3J0X2J1ZiA/IHNob3J0X2J1ZiA6ICIqKioiKTsKICAgICB9CiAgICAgZWxzZQotICAgICAgICBkcHJpbnRmX3dhcm4oZG9zZnMsICJmaWxlOiAnJXMnIE5PVCBGT1VORCBpbiBkaXI6ICclcydcbiIsIG5hbWUsIHBhdGgpOworICAgICAgICBXQVJOKGRvc2ZzLCAiJyVzJyBub3QgZm91bmQgaW4gJyVzJ1xuIiwgbmFtZSwgcGF0aCk7CiAgICAgRE9TRlNfQ2xvc2VEaXIoIGRpciApOwogICAgIHJldHVybiByZXQ7CiB9CkBAIC02MTMsNyArNjEzLDcgQEAKIAkJCQlyZXR1cm4gR2V0U3RkSGFuZGxlKCBTVERfT1VUUFVUX0hBTkRMRSApOwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKLQkJCQlmcHJpbnRmKHN0ZGVyciwiRE9TRlNfT3BlbkRldmljZTogQ09OIGNhbm5vdCBiZSBvcGVuZWQgcmVhZC93cml0ZSBjdXJyZW50bHksIEZJWE1FLlxuIik7CisJCQkJRklYTUUoZG9zZnMsImNhbid0IG9wZW4gQ09OIHJlYWQvd3JpdGVcbiIpOwogCQkJCXJldHVybiBIRklMRV9FUlJPUjMyOwogCQkJCWJyZWFrOwogCQkJfQpAQCAtNjc5LDcgKzY3OSw3IEBACiAgICAgVUlOVDMyIGZsYWdzOwogICAgIGNoYXIgKnBfbCwgKnBfcywgKnJvb3Q7CiAKLSAgICBkcHJpbnRmX2luZm8oZG9zZnMsICJET1NGU19HZXRGdWxsTmFtZTogJXMgKGxhc3Q9JWQpXG4iLAorICAgIFRSQUNFKGRvc2ZzLCAiJXMgKGxhc3Q9JWQpXG4iLAogICAgICAgICAgICAgICAgICAgIG5hbWUsIGNoZWNrX2xhc3QgKTsKIAogICAgIGlmICgoZnVsbC0+ZHJpdmUgPSBET1NGU19HZXRQYXRoRHJpdmUoICZuYW1lICkpID09IC0xKSByZXR1cm4gRkFMU0U7CkBAIC03ODcsNyArNzg3LDcgQEAKICAgICB9CiAgICAgaWYgKCFmdWxsLT5sb25nX25hbWVbMF0pIHN0cmNweSggZnVsbC0+bG9uZ19uYW1lLCAiLyIgKTsKICAgICBpZiAoIWZ1bGwtPnNob3J0X25hbWVbMl0pIHN0cmNweSggZnVsbC0+c2hvcnRfbmFtZSArIDIsICJcXCIgKTsKLSAgICBkcHJpbnRmX2luZm8oZG9zZnMsICJET1NGU19HZXRGdWxsTmFtZTogcmV0dXJuaW5nICVzID0gJXNcbiIsCisgICAgVFJBQ0UoZG9zZnMsICJyZXR1cm5pbmcgJXMgPSAlc1xuIiwKICAgICAgICAgICAgICAgICAgICBmdWxsLT5sb25nX25hbWUsIGZ1bGwtPnNob3J0X25hbWUgKTsKICAgICByZXR1cm4gVFJVRTsKIH0KQEAgLTg3Nyw3ICs4NzcsNyBAQAogICAgIGludCBkcml2ZTsKICAgICBjaGFyICpwOwogCi0gICAgZHByaW50Zl9pbmZvKGRvc2ZzLCAiR2V0RnVsbFBhdGhOYW1lOiBjb252ZXJ0aW5nICVzXG4iLCBuYW1lICk7CisgICAgVFJBQ0UoZG9zZnMsICJjb252ZXJ0aW5nICVzXG4iLCBuYW1lICk7CiAKICAgICBpZiAoIW5hbWUgfHwgIXJlc3VsdCkgcmV0dXJuIDA7CiAKQEAgLTk0MSw3ICs5NDEsNyBAQAogICAgIGlmICh1bmljb2RlKSBsc3RyY3B5bkF0b1coIChMUFdTVFIpcmVzdWx0LCBidWZmZXIsIGxlbiApOwogICAgIGVsc2UgbHN0cmNweW4zMkEoIHJlc3VsdCwgYnVmZmVyLCBsZW4gKTsKIAotICAgIGRwcmludGZfaW5mbyhkb3NmcywgIkdldEZ1bGxQYXRoTmFtZTogcmV0dXJuaW5nICVzXG4iLCBidWZmZXIgKTsKKyAgICBUUkFDRShkb3NmcywgInJldHVybmluZyAlc1xuIiwgYnVmZmVyICk7CiAgICAgcmV0dXJuIHN0cmxlbihidWZmZXIpOwogfQogCkBAIC0xMDI2LDcgKzEwMjYsNyBAQAogICAgIGVsc2UgIC8qIE5vdCBpbiB0aGUgY2FjaGUsIG9wZW4gaXQgYW5ldyAqLwogICAgIHsKICAgICAgICAgY29uc3QgY2hhciAqZHJpdmVfcGF0aDsKLSAgICAgICAgZHByaW50Zl9pbmZvKGRvc2ZzLCAiRE9TRlNfRmluZE5leHQ6IGNhY2hlIG1pc3MsIHBhdGg9JXMgc2tpcD0lZCBidWY9JXMgY3VyPSVkXG4iLAorICAgICAgICBUUkFDRShkb3NmcywgImNhY2hlIG1pc3MsIHBhdGg9JXMgc2tpcD0lZCBidWY9JXMgY3VyPSVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICBwYXRoLCBza2lwLCBidWZmZXIsIGN1cl9wb3MgKTsKICAgICAgICAgY3VyX3BvcyA9IHNraXA7CiAgICAgICAgIGlmIChkaXIpIERPU0ZTX0Nsb3NlRGlyKGRpcik7CkBAIC0xMDM1LDcgKzEwMzUsNyBAQAogICAgICAgICBkcml2ZV9wYXRoID0gcGF0aCArIHN0cmxlbihEUklWRV9HZXRSb290KGRyaXZlKSk7CiAgICAgICAgIHdoaWxlICgoKmRyaXZlX3BhdGggPT0gJy8nKSB8fCAoKmRyaXZlX3BhdGggPT0gJ1xcJykpIGRyaXZlX3BhdGgrKzsKICAgICAgICAgZHJpdmVfcm9vdCA9ICEqZHJpdmVfcGF0aDsKLSAgICAgICAgZHByaW50Zl9pbmZvKGRvc2ZzLCAiRE9TRlNfRmluZE5leHQ6IGRyaXZlX3Jvb3QgPSAlZFxuIiwgZHJpdmVfcm9vdCk7CisgICAgICAgIFRSQUNFKGRvc2ZzLCAiZHJpdmVfcm9vdCA9ICVkXG4iLCBkcml2ZV9yb290KTsKICAgICAgICAgbHN0cmNweW4zMkEoIGJ1ZmZlciwgcGF0aCwgc2l6ZW9mKGJ1ZmZlcikgLSAxICk7CiAgICAgfQogICAgIHN0cmNhdCggYnVmZmVyLCAiLyIgKTsKQEAgLTEwNzksNyArMTA3OSw3IEBACiAgICAgICAgIGxzdHJjcHluMzJBKCBwLCBsb25nX25hbWUsIHNpemVvZihidWZmZXIpIC0gKGludCkocCAtIGJ1ZmZlcikgKTsKICAgICAgICAgaWYgKCFGSUxFX1N0YXQoIGJ1ZmZlciwgJmluZm8gKSkKICAgICAgICAgewotICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiRE9TRlNfRmluZE5leHQ6IGNhbid0IHN0YXQgJXNcbiIsIGJ1ZmZlciApOworICAgICAgICAgICAgV0FSTihkb3NmcywgImNhbid0IHN0YXQgJXNcbiIsIGJ1ZmZlcik7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgICBpZiAoaW5mby5kd0ZpbGVBdHRyaWJ1dGVzICYgfmF0dHIpIGNvbnRpbnVlOwpAQCAtMTEwMSw3ICsxMTAxLDcgQEAKIAogICAgICAgICBsc3RyY3B5bjMyQSggZW50cnktPmNGaWxlTmFtZSwgbG9uZ19uYW1lLCBzaXplb2YoZW50cnktPmNGaWxlTmFtZSkgKTsKICAgICAgICAgaWYgKCEoZmxhZ3MgJiBEUklWRV9DQVNFX1BSRVNFUlZJTkcpKSBDaGFyTG93ZXIzMkEoIGVudHJ5LT5jRmlsZU5hbWUgKTsKLSAgICAgICAgZHByaW50Zl9pbmZvKGRvc2ZzLCAiRE9TRlNfRmluZE5leHQ6IHJldHVybmluZyAlcyAoJXMpICUwMmx4ICVsZFxuIiwKKyAgICAgICAgVFJBQ0UoZG9zZnMsICJyZXR1cm5pbmcgJXMgKCVzKSAlMDJseCAlbGRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LT5jRmlsZU5hbWUsIGVudHJ5LT5jQWx0ZXJuYXRlRmlsZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LT5kd0ZpbGVBdHRyaWJ1dGVzLCBlbnRyeS0+bkZpbGVTaXplTG93ICk7CiAgICAgICAgIGN1cl9wb3MgKz0gY291bnQ7CkBAIC0xNTQ3LDEzICsxNTQ3LDI2IEBACiBCT09MMzIgV0lOQVBJIEZpbGVUaW1lVG9Mb2NhbEZpbGVUaW1lKCBjb25zdCBGSUxFVElNRSAqdXRjZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEZJTEVUSU1FIGxvY2FsZnQgKQogewotICAgIHN0cnVjdCB0bSAqeHRtOwogICAgIERXT1JEIHJlbWFpbmRlcjsKLQogICAgIC8qIGNvbnZlcnQgZnJvbSBVVEMgdG8gbG9jYWwuIFBlcmhhcHMgbm90IGNvcnJlY3QuIEZJWE1FICovCiAgICAgdGltZV90IHVuaXh0aW1lID0gRE9TRlNfRmlsZVRpbWVUb1VuaXhUaW1lKCB1dGNmdCwgJnJlbWFpbmRlciApOworI2lmZGVmIEhBVkVfVElNRUdNCisgICAgc3RydWN0IHRtICp4dG0gPSBsb2NhbHRpbWUoICZ1bml4dGltZSApOworICAgIHRpbWVfdCBsb2NhbHRpbWU7CisKKyAgICBsb2NhbHRpbWUgPSB0aW1lZ20oeHRtKTsKKyAgICBET1NGU19Vbml4VGltZVRvRmlsZVRpbWUoIGxvY2FsdGltZSwgbG9jYWxmdCwgcmVtYWluZGVyICk7CisKKyNlbHNlCisgICAgc3RydWN0IHRtICp4dG0sKmd0bTsKKyAgICB0aW1lX3QgdGltZTEsdGltZTI7CisKICAgICB4dG0gPSBsb2NhbHRpbWUoICZ1bml4dGltZSApOwotICAgIERPU0ZTX1VuaXhUaW1lVG9GaWxlVGltZSggbWt0aW1lKHh0bSksIGxvY2FsZnQsIHJlbWFpbmRlciApOworICAgIGd0bSA9IGdtdGltZSggJnVuaXh0aW1lICk7CisgICAgdGltZTEgPSBta3RpbWUoeHRtKTsKKyAgICB0aW1lMiA9IG1rdGltZShndG0pOworICAgIERPU0ZTX1VuaXhUaW1lVG9GaWxlVGltZSggMip0aW1lMS10aW1lMiwgbG9jYWxmdCwgcmVtYWluZGVyICk7CisjZW5kaWYKICAgICByZXR1cm4gVFJVRTsgCiB9CiAKQEAgLTE1NjcsNyArMTU4MCw3IEBACiAgICAgRFdPUkQgcmVtYWluZGVyOwogICAgIHRpbWVfdCB4dGltZSA9IERPU0ZTX0ZpbGVUaW1lVG9Vbml4VGltZSggZnQsICZyZW1haW5kZXIgKTsKICAgICB4dG0gPSBnbXRpbWUoJnh0aW1lKTsKLSAgICBzeXN0LT53WWVhciAgICAgICAgID0geHRtLT50bV95ZWFyOworICAgIHN5c3QtPndZZWFyICAgICAgICAgPSB4dG0tPnRtX3llYXIrMTkwMDsKICAgICBzeXN0LT53TW9udGggICAgICAgID0geHRtLT50bV9tb24gKyAxOwogICAgIHN5c3QtPndEYXlPZldlZWsgICAgPSB4dG0tPnRtX3dkYXk7CiAgICAgc3lzdC0+d0RheQkgICAgICAgID0geHRtLT50bV9tZGF5OwpAQCAtMTU4OCw3ICsxNjAxLDcgQEAKICAgICBMUFNUUiBzOwogICAgIGNoYXIgIGJ1ZmZlclsyMDBdOwogCi0gICAgZHByaW50Zl9pbmZvKGRvc2ZzLCJRdWVyeURvc0RldmljZSglcywuLi4pXG4iLGRldm5hbWU/ZGV2bmFtZToiPG51bGw+Iik7CisgICAgVFJBQ0UoZG9zZnMsIiglcywuLi4pXG4iLGRldm5hbWU/ZGV2bmFtZToiPG51bGw+Iik7CiAgICAgaWYgKCFkZXZuYW1lKSB7CiAJLyogcmV0dXJuIGtub3duIE1TRE9TIGRldmljZXMgKi8KIAlsc3RyY3B5MzJBKGJ1ZmZlciwiQ09OIENPTTEgQ09NMiBMUFQxIE5VTCAiKTsKQEAgLTE2MjksMTUgKzE2NDIsMzMgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBTeXN0ZW1UaW1lVG9GaWxlVGltZSggY29uc3QgU1lTVEVNVElNRSAqc3lzdCwgTFBGSUxFVElNRSBmdCApCiB7CisjaWZkZWYgSEFWRV9USU1FR00KICAgICBzdHJ1Y3QgdG0geHRtOworICAgIHRpbWVfdCB1dGN0aW1lOworI2Vsc2UKKyAgICBzdHJ1Y3QgdG0geHRtLCpsb2NhbF90bSwqdXRjX3RtOworICAgIHRpbWVfdCBsb2NhbHRpbSx1dGN0aW1lOworI2VuZGlmCiAKLSAgICB4dG0udG1feWVhcgk9IHN5c3QtPndZZWFyOworICAgIHh0bS50bV95ZWFyCT0gc3lzdC0+d1llYXItMTkwMDsKICAgICB4dG0udG1fbW9uCT0gc3lzdC0+d01vbnRoIC0gMTsKICAgICB4dG0udG1fd2RheQk9IHN5c3QtPndEYXlPZldlZWs7CiAgICAgeHRtLnRtX21kYXkJPSBzeXN0LT53RGF5OwogICAgIHh0bS50bV9ob3VyCT0gc3lzdC0+d0hvdXI7CiAgICAgeHRtLnRtX21pbgk9IHN5c3QtPndNaW51dGU7Ci0gICAgeHRtLnRtX3NlYwk9IHN5c3QtPndTZWNvbmQ7Ci0gICAgRE9TRlNfVW5peFRpbWVUb0ZpbGVUaW1lKCBta3RpbWUoJnh0bSksIGZ0LCBzeXN0LT53TWlsbGlzZWNvbmRzICogMTAwMDAgKTsKKyAgICB4dG0udG1fc2VjCT0gc3lzdC0+d1NlY29uZDsgLyogdGhpcyBpcyBVVEMgKi8KKyAgICB4dG0udG1faXNkc3QgPSAtMTsKKyNpZmRlZiBIQVZFX1RJTUVHTQorICAgIHV0Y3RpbWUgPSB0aW1lZ20oJnh0bSk7CisgICAgRE9TRlNfVW5peFRpbWVUb0ZpbGVUaW1lKCB1dGN0aW1lLCBmdCwgCisJCQkgICAgICBzeXN0LT53TWlsbGlzZWNvbmRzICogMTAwMDAgKTsKKyNlbHNlCisgICAgbG9jYWx0aW0gPSBta3RpbWUoJnh0bSk7ICAgIC8qIG5vdyB3ZSd2ZSBnb3QgbG9jYWwgdGltZSAqLworICAgIGxvY2FsX3RtID0gbG9jYWx0aW1lKCZsb2NhbHRpbSk7CisgICAgdXRjX3RtID0gZ210aW1lKCZsb2NhbHRpbSk7CisgICAgdXRjdGltZSA9IG1rdGltZSh1dGNfdG0pOworICAgIERPU0ZTX1VuaXhUaW1lVG9GaWxlVGltZSggMipsb2NhbHRpbSAtdXRjdGltZSwgZnQsIAorCQkJICAgICAgc3lzdC0+d01pbGxpc2Vjb25kcyAqIDEwMDAwICk7CisjZW5kaWYKICAgICByZXR1cm4gVFJVRTsgCiB9CmRpZmYgLS1naXQgYS9maWxlcy9kcml2ZS5jIGIvZmlsZXMvZHJpdmUuYwppbmRleCAzNTI2NmNkLi42OGRmZWI2IDEwMDY0NAotLS0gYS9maWxlcy9kcml2ZS5jCisrKyBiL2ZpbGVzL2RyaXZlLmMKQEAgLTE5MywxMiArMTkzLDEyIEBACiAgICAgICAgICAgICAgICAgRFJJVkVfQ3VyRHJpdmUgPSBpOwogCiAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgZHByaW50Zl9pbmZvKGRvc2ZzLCAiJXM6IHBhdGg9JXMgdHlwZT0lcyBsYWJlbD0nJXMnIHNlcmlhbD0lMDhseCBmbGFncz0lMDh4IGRldj0leCBpbm89JXhcbiIsCisgICAgICAgICAgICBUUkFDRShkb3NmcywgIiVzOiBwYXRoPSVzIHR5cGU9JXMgbGFiZWw9JyVzJyBzZXJpYWw9JTA4bHggZmxhZ3M9JTA4eCBkZXY9JXggaW5vPSV4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgcGF0aCwgRFJJVkVfVHlwZXNbZHJpdmUtPnR5cGVdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJpdmUtPmxhYmVsLCBkcml2ZS0+c2VyaWFsLCBkcml2ZS0+ZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KWRyaXZlLT5kZXYsIChpbnQpZHJpdmUtPmlubyApOwogICAgICAgICB9Ci0gICAgICAgIGVsc2UgZHByaW50Zl93YXJuKGRvc2ZzLCAiJXM6IG5vdCBkZWZpbmVkXG4iLCBuYW1lICk7CisgICAgICAgIGVsc2UgV0FSTihkb3NmcywgIiVzOiBub3QgZGVmaW5lZFxuIiwgbmFtZSApOwogICAgIH0KIAogICAgIGlmICghY291bnQpIApAQCAtMjY1LDcgKzI2NSw3IEBACiAgICAgICAgIERPU19FUlJPUiggRVJfSW52YWxpZERyaXZlLCBFQ19NZWRpYUVycm9yLCBTQV9BYm9ydCwgRUxfRGlzayApOwogICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgZHByaW50Zl9pbmZvKGRvc2ZzLCAiRFJJVkVfU2V0Q3VycmVudERyaXZlOiAlYzpcbiIsICdBJyArIGRyaXZlICk7CisgICAgVFJBQ0UoZG9zZnMsICIlYzpcbiIsICdBJyArIGRyaXZlICk7CiAgICAgRFJJVkVfQ3VyRHJpdmUgPSBkcml2ZTsKICAgICBpZiAocFRhc2spIHBUYXNrLT5jdXJkcml2ZSA9IGRyaXZlIHwgMHg4MDsKICAgICByZXR1cm4gMTsKQEAgLTMyNSw3ICszMjUsNyBAQAogICAgICpuZXh0ID0gMDsKIAogICAgIGlmIChyb290ZHJpdmUgIT0gLTEpCi0gICAgICAgIGRwcmludGZfaW5mbyhkb3NmcywgIkRSSVZFX0ZpbmREcml2ZVJvb3Q6ICVzIC0+IGRyaXZlICVjOiwgcm9vdD0nJXMnLCBuYW1lPSclcydcbiIsCisgICAgICAgIFRSQUNFKGRvc2ZzLCAiJXMgLT4gZHJpdmUgJWM6LCByb290PSclcycsIG5hbWU9JyVzJ1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCAnQScgKyByb290ZHJpdmUsCiAgICAgICAgICAgICAgICAgICAgICAgIERPU0RyaXZlc1tyb290ZHJpdmVdLnJvb3QsICpwYXRoICk7CiAgICAgcmV0dXJuIHJvb3Rkcml2ZTsKQEAgLTQ0Niw3ICs0NDYsNyBAQAogICAgIEJZX0hBTkRMRV9GSUxFX0lORk9STUFUSU9OIGluZm87CiAgICAgVERCICpwVGFzayA9IChUREIgKilHbG9iYWxMb2NrMTYoIEdldEN1cnJlbnRUYXNrKCkgKTsKIAotICAgIGRwcmludGZfaW5mbyhkb3NmcywgIkRSSVZFX0NoZGlyKCVjOiwlcylcbiIsICdBJyArIGRyaXZlLCBwYXRoICk7CisgICAgVFJBQ0UoZG9zZnMsICIoJWM6LCVzKVxuIiwgJ0EnICsgZHJpdmUsIHBhdGggKTsKICAgICBzdHJjcHkoIGJ1ZmZlciwgIkE6IiApOwogICAgIGJ1ZmZlclswXSArPSBkcml2ZTsKICAgICBsc3RyY3B5bjMyQSggYnVmZmVyICsgMiwgcGF0aCwgc2l6ZW9mKGJ1ZmZlcikgLSAyICk7CkBAIC00NjEsNyArNDYxLDcgQEAKICAgICB1bml4X2N3ZCA9IGZ1bGxfbmFtZS5sb25nX25hbWUgKyBzdHJsZW4oIERPU0RyaXZlc1tkcml2ZV0ucm9vdCApOwogICAgIHdoaWxlICgqdW5peF9jd2QgPT0gJy8nKSB1bml4X2N3ZCsrOwogCi0gICAgZHByaW50Zl9pbmZvKGRvc2ZzLCAiRFJJVkVfQ2hkaXIoJWM6KTogdW5peF9jd2Q9JXMgZG9zX2N3ZD0lc1xuIiwKKyAgICBUUkFDRShkb3NmcywgIiglYzopOiB1bml4X2N3ZD0lcyBkb3NfY3dkPSVzXG4iLAogICAgICAgICAgICAgICAgICAgICdBJyArIGRyaXZlLCB1bml4X2N3ZCwgZnVsbF9uYW1lLnNob3J0X25hbWUgKyAzICk7CiAKICAgICBIZWFwRnJlZSggU3lzdGVtSGVhcCwgMCwgRE9TRHJpdmVzW2RyaXZlXS5kb3NfY3dkICk7CkBAIC01MzQsNyArNTM0LDcgQEAKIAogICAgIGlmICggbmV3LT5yb290ICkKICAgICB7Ci0gICAgICAgIGRwcmludGZfaW5mbyhkb3NmcywgIkNhblwndCBtYXAgZHJpdmUgJWMgdG8gZHJpdmUgJWMgLSAiCisgICAgICAgIFRSQUNFKGRvc2ZzLCAiQ2FuXCd0IG1hcCBkcml2ZSAlYyB0byBkcml2ZSAlYyAtICIKIAkgICAgICAgICAgICAgICAgICAgICAgICAiZHJpdmUgJWMgYWxyZWFkeSBleGlzdHNcbiIsCiAJCQknQScgKyBleGlzdGluZ19kcml2ZSwgJ0EnICsgbmV3X2RyaXZlLAogCQkJJ0EnICsgbmV3X2RyaXZlICk7CkBAIC01NTEsNyArNTUxLDcgQEAKICAgICBuZXctPmRldiA9IG9sZC0+ZGV2OwogICAgIG5ldy0+aW5vID0gb2xkLT5pbm87CiAKLSAgICBkcHJpbnRmX2luZm8oZG9zZnMsICJEcml2ZSAlYyBpcyBub3cgZXF1YWwgdG8gZHJpdmUgJWNcbiIsCisgICAgVFJBQ0UoZG9zZnMsICJEcml2ZSAlYyBpcyBub3cgZXF1YWwgdG8gZHJpdmUgJWNcbiIsCiAgICAgICAgICAgICAgICAgICAgICdBJyArIG5ld19kcml2ZSwgJ0EnICsgZXhpc3RpbmdfZHJpdmUgKTsKIAogICAgIHJldHVybiAxOwpAQCAtNzM0LDcgKzczNCw3IEBACiAgKi8KIFVJTlQxNiBXSU5BUEkgR2V0RHJpdmVUeXBlMTYoIFVJTlQxNiBkcml2ZSApCiB7Ci0gICAgZHByaW50Zl9pbmZvKGRvc2ZzLCAiR2V0RHJpdmVUeXBlMTYoJWM6KVxuIiwgJ0EnICsgZHJpdmUgKTsKKyAgICBUUkFDRShkb3NmcywgIiglYzopXG4iLCAnQScgKyBkcml2ZSApOwogICAgIHN3aXRjaChEUklWRV9HZXRUeXBlKGRyaXZlKSkKICAgICB7CiAgICAgY2FzZSBUWVBFX0ZMT1BQWTogIHJldHVybiBEUklWRV9SRU1PVkFCTEU7CkBAIC03NTIsNyArNzUyLDcgQEAKICAqLwogVUlOVDMyIFdJTkFQSSBHZXREcml2ZVR5cGUzMkEoIExQQ1NUUiByb290ICkKIHsKLSAgICBkcHJpbnRmX2luZm8oZG9zZnMsICJHZXREcml2ZVR5cGUzMkEoJXMpXG4iLCByb290ICk7CisgICAgVFJBQ0UoZG9zZnMsICIoJXMpXG4iLCByb290ICk7CiAgICAgaWYgKChyb290WzFdKSAmJiAocm9vdFsxXSAhPSAnOicpKQogICAgIHsKICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiR2V0RHJpdmVUeXBlMzJBOiBpbnZhbGlkIHJvb3QgJyVzJ1xuIiwgcm9vdCApOwpkaWZmIC0tZ2l0IGEvZmlsZXMvZmlsZS5jIGIvZmlsZXMvZmlsZS5jCmluZGV4IGUxZGUyMTguLjFkNmI5N2UgMTAwNjQ0Ci0tLSBhL2ZpbGVzL2ZpbGUuYworKysgYi9maWxlcy9maWxlLmMKQEAgLTEwNCw3ICsxMDQsNyBAQAogCUZJTEVfT0JKRUNUICpmaWxlID0gKEZJTEVfT0JKRUNUICopcHRyOwogCWludCByZXN1bHQ7CiAKLQlkcHJpbnRmX2luZm8oZmlsZSwgIkZJTEVfUmVhZDogJXAgJXAgJWxkXG4iLCBwdHIsIGxwQnVmZmVyLAorCVRSQUNFKGZpbGUsICIlcCAlcCAlbGRcbiIsIHB0ciwgbHBCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICBuTnVtYmVyT2ZDaGFycyk7CiAKIAlpZiAobk51bWJlck9mQ2hhcnMgPT0gMCkgewpAQCAtMTM0LDE1ICsxMzQsMTQgQEAKIAlGSUxFX09CSkVDVCAqZmlsZSA9IChGSUxFX09CSkVDVCAqKXB0cjsKIAlpbnQgcmVzdWx0OwogCi0JZHByaW50Zl9pbmZvKGZpbGUsICJGSUxFX1dyaXRlOiAlcCAlcCAlbGRcbiIsIHB0ciwgbHBCdWZmZXIsCisJVFJBQ0UoZmlsZSwgIiVwICVwICVsZFxuIiwgcHRyLCBscEJ1ZmZlciwKIAkJICAgICAgbk51bWJlck9mQ2hhcnMpOwogCiAJKmxwTnVtYmVyT2ZDaGFycyA9IDA7IAogCi0JLyogRklYTUU6IHRoZXJlIHdhcyBhIGxvb3AgaGVyZSBiZWZvcmUgdGhhdCAKLQkgKiByZXRyaWVkIHdyaXRlcyBhZnRlciBFQUdBSU4sIHdoeT8/PyAtLSBJIGFzc3VtZQotCSAqIGl0IGlzIGJlY2F1c2Ugd2luMzIgZG9lc24ndCBoYXZlIGludGVycnVwdGVkCi0JICogc3lzdGVtIGNhbGxzIAorCS8qIAorCSAqIEkgYXNzdW1lIHRoaXMgbG9vcCBhcm91bmQgRUFHQUlOIGlzIGhlcmUgYmVjYXVzZQorCSAqIHdpbjMyIGRvZXNuJ3QgaGF2ZSBpbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbHMgCiAJICovCiAKIAlmb3IgKDs7KQpAQCAtMjI5LDcgKzIyOCw3IEBACiB7CiAgICAgaW50IHNhdmVfZXJybm8gPSBlcnJubzsgLyogZXJybm8gZ2V0cyBvdmVyd3JpdHRlbiBieSBwcmludGYgKi8KIAotICAgIGRwcmludGZfaW5mbyhmaWxlLCAiRklMRV9TZXREb3NFcnJvcjogZXJybm8gPSAlZCAlc1xuIiwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CisgICAgVFJBQ0UoZmlsZSwgImVycm5vID0gJWQgJXNcbiIsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOwogICAgIHN3aXRjaCAoc2F2ZV9lcnJubykKICAgICB7CiAgICAgY2FzZSBFQUdBSU46CkBAIC0yNjMsNiArMjYyLDcgQEAKICAgICAgICAgRE9TX0VSUk9SKCBFUl9GaWxlRXhpc3RzLCBFQ19FeGlzdHMsIFNBX0Fib3J0LCBFTF9EaXNrICk7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgRUlOVkFMOgorICAgIGNhc2UgRVNQSVBFOgogICAgICAgICBET1NfRVJST1IoIEVSX1NlZWtFcnJvciwgRUNfTm90Rm91bmQsIFNBX0lnbm9yZSwgRUxfRGlzayApOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEVOT1RFTVBUWToKQEAgLTM0NSw3ICszNDUsNyBAQAogICAgIERPU19GVUxMX05BTUUgZnVsbF9uYW1lOwogICAgIGNvbnN0IGNoYXIgKnVuaXhOYW1lOwogCi0gICAgZHByaW50Zl9pbmZvKGZpbGUsICJGSUxFX09wZW46ICclcycgJTA0eFxuIiwgcGF0aCwgbW9kZSApOworICAgIFRSQUNFKGZpbGUsICInJXMnICUwNHhcbiIsIHBhdGgsIG1vZGUgKTsKIAogICAgIGlmICghcGF0aCkgcmV0dXJuIEhGSUxFX0VSUk9SMzI7CiAKQEAgLTM1Myw3ICszNTMsNyBAQAogICAgIHsKICAgICAJSEZJTEUzMglyZXQ7CiAKLSAgICAgICAgZHByaW50Zl9pbmZvKGZpbGUsICJGSUxFX09wZW46IG9wZW5pbmcgZGV2aWNlICclcydcbiIsIHBhdGggKTsKKyAgICAgICAgVFJBQ0UoZmlsZSwgIm9wZW5pbmcgZGV2aWNlICclcydcbiIsIHBhdGggKTsKIAogCWlmIChIRklMRV9FUlJPUjMyIT0ocmV0PURPU0ZTX09wZW5EZXZpY2UoIHBhdGgsIG1vZGUgKSkpCiAJCXJldHVybiByZXQ7CkBAIC0zODMsNyArMzgzLDcgQEAKICAgICBGSUxFX09CSkVDVCAqZmlsZTsKICAgICBET1NfRlVMTF9OQU1FIGZ1bGxfbmFtZTsKIAotICAgIGRwcmludGZfaW5mbyhmaWxlLCAiRklMRV9DcmVhdGU6ICclcycgJTA0eCAlZFxuIiwgcGF0aCwgbW9kZSwgdW5pcXVlICk7CisgICAgVFJBQ0UoZmlsZSwgIiclcycgJTA0eCAlZFxuIiwgcGF0aCwgbW9kZSwgdW5pcXVlICk7CiAKICAgICBpZiAoIXBhdGgpIHJldHVybiBJTlZBTElEX0hBTkRMRV9WQUxVRTMyOwogCkBAIC01ODIsMTEgKzU4MiwxMSBAQAogICAgIEZJTEVfT0JKRUNUICpmaWxlOwogICAgIEhGSUxFMzIgaGFuZGxlOwogCi0gICAgZHByaW50Zl9pbmZvKGZpbGUsICJGSUxFX0R1cCBmb3IgaGFuZGxlICVkXG4iLCBoRmlsZSApOworICAgIFRSQUNFKGZpbGUsICJGSUxFX0R1cCBmb3IgaGFuZGxlICVkXG4iLCBoRmlsZSApOwogICAgIGlmICghKGZpbGUgPSBGSUxFX0dldEZpbGUoIGhGaWxlICkpKSByZXR1cm4gSEZJTEVfRVJST1IzMjsKICAgICBoYW5kbGUgPSBIQU5ETEVfQWxsb2MoICZmaWxlLT5oZWFkZXIsIEZJTEVfQUxMX0FDQ0VTUyAvKkZJWE1FKi8sIEZBTFNFICk7CiAgICAgRklMRV9SZWxlYXNlRmlsZSggZmlsZSApOwotICAgIGRwcmludGZfaW5mbyhmaWxlLCAiRklMRV9EdXAgcmV0dXJuIGhhbmRsZSAlZFxuIiwgaGFuZGxlICk7CisgICAgVFJBQ0UoZmlsZSwgIkZJTEVfRHVwIHJldHVybiBoYW5kbGUgJWRcbiIsIGhhbmRsZSApOwogICAgIHJldHVybiBoYW5kbGU7CiB9CiAKQEAgLTYwMCw3ICs2MDAsNyBAQAogewogICAgIEZJTEVfT0JKRUNUICpmaWxlOwogCi0gICAgZHByaW50Zl9pbmZvKGZpbGUsICJGSUxFX0R1cDIgZm9yIGhhbmRsZSAlZFxuIiwgaEZpbGUxICk7CisgICAgVFJBQ0UoZmlsZSwgIkZJTEVfRHVwMiBmb3IgaGFuZGxlICVkXG4iLCBoRmlsZTEgKTsKICAgICAvKiBGSVhNRTogc2hvdWxkIHVzZSBEdXBsaWNhdGVIYW5kbGUgKi8KICAgICBpZiAoIShmaWxlID0gRklMRV9HZXRGaWxlKCBoRmlsZTEgKSkpIHJldHVybiBIRklMRV9FUlJPUjMyOwogICAgIGlmICghSEFORExFX1NldE9ialB0ciggaEZpbGUyLCAmZmlsZS0+aGVhZGVyLCAwICkpIGhGaWxlMiA9IEhGSUxFX0VSUk9SMzI7CkBAIC02NzIsNyArNjcyLDcgQEAKICAgICAgICAgICAgIEhGSUxFMzIgaGFuZGxlID0gRklMRV9DcmVhdGUoIGJ1ZmZlciwgMDY2NiwgVFJVRSApOwogICAgICAgICAgICAgaWYgKGhhbmRsZSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRTMyKQogICAgICAgICAgICAgeyAgLyogV2UgY3JlYXRlZCBpdCAqLwotICAgICAgICAgICAgICAgIGRwcmludGZfaW5mbyhmaWxlLCAiR2V0VGVtcEZpbGVOYW1lMzJBOiBjcmVhdGVkICVzXG4iLAorICAgICAgICAgICAgICAgIFRSQUNFKGZpbGUsICJjcmVhdGVkICVzXG4iLAogCQkJICAgICAgYnVmZmVyKTsKICAgICAgICAgICAgICAgICBDbG9zZUhhbmRsZSggaGFuZGxlICk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC02OTYsNyArNjk2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICJQbGVhc2UgY2hlY2sgeW91ciBjb25maWd1cmF0aW9uIGZpbGUgaWYgdGhpcyBnZW5lcmF0ZXMgYSBmYWlsdXJlLlxuIiwKICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcik7CiAgICAgfQotICAgIGRwcmludGZfaW5mbyhmaWxlLCAiR2V0VGVtcEZpbGVOYW1lMzJBOiByZXR1cm5pbmcgJXNcbiIsIGJ1ZmZlciApOworICAgIFRSQUNFKGZpbGUsICJyZXR1cm5pbmcgJXNcbiIsIGJ1ZmZlciApOwogICAgIHJldHVybiB1bmlxdWUgPyB1bmlxdWUgOiBudW07CiB9CiAKQEAgLTc1MCw3ICs3NTAsNyBAQAogCXJldHVybiBIRklMRV9FUlJPUjMyOwogICAgIH0KIAotICAgIGRwcmludGZfaW5mbyhmaWxlLCAiT3BlbkZpbGU6ICVzICUwNHhcbiIsIG5hbWUsIG1vZGUgKTsKKyAgICBUUkFDRShmaWxlLCAiJXMgJTA0eFxuIiwgbmFtZSwgbW9kZSApOwogCiAgICAgLyogdGhlIHdhdGNvbSAxMC42IElERSByZWxpZXMgb24gYSB2YWxpZCBwYXRoIHJldHVybmVkIGluIG9mcy0+c3pQYXRoTmFtZQogICAgICAgIEFyZSB0aGVyZSBhbnkgY2FzZXMgd2hlcmUgZ2V0dGluZyB0aGUgcGF0aCBoZXJlIGlzIHdyb25nPyAKQEAgLTc2NCw3ICs3NjQsNyBAQAogICAgIHsKICAgICAgICAgb2ZzLT5mRml4ZWREaXNrID0gKEdldERyaXZlVHlwZTE2KCBvZnMtPnN6UGF0aE5hbWVbMF0tJ0EnICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IERSSVZFX1JFTU9WQUJMRSk7Ci0gICAgICAgIGRwcmludGZfaW5mbyhmaWxlLCAiT3BlbkZpbGUoJXMpOiBPRl9QQVJTRSwgcmVzID0gJyVzJ1xuIiwKKyAgICAgICAgVFJBQ0UoZmlsZSwgIiglcyk6IE9GX1BBUlNFLCByZXMgPSAnJXMnXG4iLAogICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIG9mcy0+c3pQYXRoTmFtZSApOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CkBAIC03OTcsNyArNzk3LDcgQEAKICAgICBpZiAoIURJUl9TZWFyY2hQYXRoKCBOVUxMLCBuYW1lLCBOVUxMLCAmZnVsbF9uYW1lLCB3aW4zMiApKSBnb3RvIG5vdF9mb3VuZDsKIAogZm91bmQ6Ci0gICAgZHByaW50Zl9pbmZvKGZpbGUsICJPcGVuRmlsZTogZm91bmQgJXMgPSAlc1xuIiwKKyAgICBUUkFDRShmaWxlLCAiZm91bmQgJXMgPSAlc1xuIiwKICAgICAgICAgICAgICAgICAgIGZ1bGxfbmFtZS5sb25nX25hbWUsIGZ1bGxfbmFtZS5zaG9ydF9uYW1lICk7CiAgICAgbHN0cmNweW4zMkEoIG9mcy0+c3pQYXRoTmFtZSwgZnVsbF9uYW1lLnNob3J0X25hbWUsCiAgICAgICAgICAgICAgICAgIHNpemVvZihvZnMtPnN6UGF0aE5hbWUpICk7CkBAIC04MDUsNyArODA1LDcgQEAKICAgICBpZiAobW9kZSAmIE9GX0RFTEVURSkKICAgICB7CiAgICAgICAgIGlmICh1bmxpbmsoIGZ1bGxfbmFtZS5sb25nX25hbWUgKSA9PSAtMSkgZ290byBub3RfZm91bmQ7Ci0gICAgICAgIGRwcmludGZfaW5mbyhmaWxlLCAiT3BlbkZpbGUoJXMpOiBPRl9ERUxFVEUgcmV0dXJuID0gT0tcbiIsIG5hbWUpOworICAgICAgICBUUkFDRShmaWxlLCAiKCVzKTogT0ZfREVMRVRFIHJldHVybiA9IE9LXG4iLCBuYW1lKTsKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQogCkBAIC04MjksNyArODI5LDcgQEAKICAgICAgICAgaWYgKG1lbWNtcCggb2ZzLT5yZXNlcnZlZCwgZmlsZWRhdGV0aW1lLCBzaXplb2Yob2ZzLT5yZXNlcnZlZCkgKSkKICAgICAgICAgewogICAgICAgICAgICAgQ2xvc2VIYW5kbGUoIGhGaWxlUmV0ICk7Ci0gICAgICAgICAgICBkcHJpbnRmX3dhcm4oZmlsZSwgIk9wZW5GaWxlKCVzKTogT0ZfVkVSSUZZIGZhaWxlZFxuIiwgbmFtZSApOworICAgICAgICAgICAgV0FSTihmaWxlLCAiKCVzKTogT0ZfVkVSSUZZIGZhaWxlZFxuIiwgbmFtZSApOwogICAgICAgICAgICAgLyogRklYTUU6IHdoYXQgZXJyb3IgaGVyZT8gKi8KICAgICAgICAgICAgIERPU19FUlJPUiggRVJfRmlsZU5vdEZvdW5kLCBFQ19Ob3RGb3VuZCwgU0FfQWJvcnQsIEVMX0Rpc2sgKTsKICAgICAgICAgICAgIGdvdG8gZXJyb3I7CkBAIC04MzgsMTkgKzgzOCwxOSBAQAogICAgIG1lbWNweSggb2ZzLT5yZXNlcnZlZCwgZmlsZWRhdGV0aW1lLCBzaXplb2Yob2ZzLT5yZXNlcnZlZCkgKTsKIAogc3VjY2VzczogIC8qIFdlIGdldCBoZXJlIGlmIHRoZSBvcGVuIHdhcyBzdWNjZXNzZnVsICovCi0gICAgZHByaW50Zl9pbmZvKGZpbGUsICJPcGVuRmlsZSglcyk6IE9LLCByZXR1cm4gPSAlZFxuIiwgbmFtZSwgaEZpbGVSZXQgKTsKKyAgICBUUkFDRShmaWxlLCAiKCVzKTogT0ssIHJldHVybiA9ICVkXG4iLCBuYW1lLCBoRmlsZVJldCApOwogICAgIGlmIChtb2RlICYgT0ZfRVhJU1QpIC8qIFJldHVybiB0aGUgaGFuZGxlLCBidXQgY2xvc2UgaXQgZmlyc3QgKi8KICAgICAgICAgQ2xvc2VIYW5kbGUoIGhGaWxlUmV0ICk7CiAgICAgcmV0dXJuIGhGaWxlUmV0OwogCiBub3RfZm91bmQ6ICAvKiBXZSBnZXQgaGVyZSBpZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCAqLwotICAgIGRwcmludGZfd2FybihmaWxlLCAiT3BlbkZpbGU6ICclcycgbm90IGZvdW5kXG4iLCBuYW1lICk7CisgICAgV0FSTihmaWxlLCAiJyVzJyBub3QgZm91bmRcbiIsIG5hbWUgKTsKICAgICBET1NfRVJST1IoIEVSX0ZpbGVOb3RGb3VuZCwgRUNfTm90Rm91bmQsIFNBX0Fib3J0LCBFTF9EaXNrICk7CiAgICAgLyogZmFsbCB0aHJvdWdoICovCiAKIGVycm9yOiAgLyogV2UgZ2V0IGhlcmUgaWYgdGhlcmUgd2FzIGFuIGVycm9yIG9wZW5pbmcgdGhlIGZpbGUgKi8KICAgICBvZnMtPm5FcnJDb2RlID0gRE9TX0V4dGVuZGVkRXJyb3I7Ci0gICAgZHByaW50Zl93YXJuKGZpbGUsICJPcGVuRmlsZSglcyk6IHJldHVybiA9IEhGSUxFX0VSUk9SIGVycm9yPSAlZFxuIiwgCisgICAgV0FSTihmaWxlLCAiKCVzKTogcmV0dXJuID0gSEZJTEVfRVJST1IgZXJyb3I9ICVkXG4iLCAKIAkJICBuYW1lLG9mcy0+bkVyckNvZGUgKTsKICAgICByZXR1cm4gSEZJTEVfRVJST1IzMjsKIH0KQEAgLTg3OSw3ICs4NzksNyBAQAogICovCiBIRklMRTE2IFdJTkFQSSBfbGNsb3NlMTYoIEhGSUxFMTYgaEZpbGUgKQogewotICAgIGRwcmludGZfaW5mbyhmaWxlLCAiX2xjbG9zZTE2OiBoYW5kbGUgJWRcbiIsIGhGaWxlICk7CisgICAgVFJBQ0UoZmlsZSwgImhhbmRsZSAlZFxuIiwgaEZpbGUgKTsKICAgICByZXR1cm4gQ2xvc2VIYW5kbGUoIGhGaWxlICkgPyAwIDogSEZJTEVfRVJST1IxNjsKIH0KIApAQCAtODg5LDcgKzg4OSw3IEBACiAgKi8KIEhGSUxFMzIgV0lOQVBJIF9sY2xvc2UzMiggSEZJTEUzMiBoRmlsZSApCiB7Ci0gICAgZHByaW50Zl9pbmZvKGZpbGUsICJfbGNsb3NlMzI6IGhhbmRsZSAlZFxuIiwgaEZpbGUgKTsKKyAgICBUUkFDRShmaWxlLCAiaGFuZGxlICVkXG4iLCBoRmlsZSApOwogICAgIHJldHVybiBDbG9zZUhhbmRsZSggaEZpbGUgKSA/IDAgOiBIRklMRV9FUlJPUjMyOwogfQogCkBAIC05MDEsNyArOTAxLDcgQEAKIHsKICAgICBMT05HIG1heGxlbjsKIAotICAgIGRwcmludGZfaW5mbyhmaWxlLCAiV0lOMTZfaHJlYWQ6ICVkICUwOGx4ICVsZFxuIiwKKyAgICBUUkFDRShmaWxlLCAiJWQgJTA4bHggJWxkXG4iLAogICAgICAgICAgICAgICAgICAgaEZpbGUsIChEV09SRClidWZmZXIsIGNvdW50ICk7CiAKICAgICAvKiBTb21lIHByb2dyYW1zIHBhc3MgYSBjb3VudCBsYXJnZXIgdGhhbiB0aGUgYWxsb2NhdGVkIGJ1ZmZlciAqLwpAQCAtOTI5LDcgKzkyOSw3IEBACiAgICAgRFdPUkQgbnVtV3JpdHRlbjsKICAgICBCT09MMzIgcmVzdWx0ID0gRkFMU0U7CiAKLSAgICBkcHJpbnRmX2luZm8oIGZpbGUsICJfbHJlYWQzMjogJWQgJXAgJWRcbiIsIGhhbmRsZSwgYnVmZmVyLCBjb3VudCk7CisgICAgVFJBQ0UoIGZpbGUsICIlZCAlcCAlZFxuIiwgaGFuZGxlLCBidWZmZXIsIGNvdW50KTsKICAgICBpZiAoIShwdHIgPSBIQU5ETEVfR2V0T2JqUHRyKCBoYW5kbGUsIEszMk9CSl9VTktOT1dOLCAwKSkpIHJldHVybiAtMTsKICAgICBpZiAoSzMyT0JKX09QUyhwdHIpLT5yZWFkKQogICAgICAgICByZXN1bHQgPSBLMzJPQkpfT1BTKHB0ciktPnJlYWQocHRyLCBidWZmZXIsIGNvdW50LCAmbnVtV3JpdHRlbiwgTlVMTCk7CkBAIC05NTQsNyArOTU0LDcgQEAKIEhGSUxFMTYgV0lOQVBJIF9sY3JlYXQxNiggTFBDU1RSIHBhdGgsIElOVDE2IGF0dHIgKQogewogICAgIGludCBtb2RlID0gKGF0dHIgJiAxKSA/IDA0NDQgOiAwNjY2OwotICAgIGRwcmludGZfaW5mbyhmaWxlLCAiX2xjcmVhdDE2OiAlcyAlMDJ4XG4iLCBwYXRoLCBhdHRyICk7CisgICAgVFJBQ0UoZmlsZSwgIiVzICUwMnhcbiIsIHBhdGgsIGF0dHIgKTsKICAgICByZXR1cm4gKEhGSUxFMTYpRklMRV9DcmVhdGUoIHBhdGgsIG1vZGUsIEZBTFNFICk7CiB9CiAKQEAgLTk2NSw3ICs5NjUsNyBAQAogSEZJTEUzMiBXSU5BUEkgX2xjcmVhdDMyKCBMUENTVFIgcGF0aCwgSU5UMzIgYXR0ciApCiB7CiAgICAgaW50IG1vZGUgPSAoYXR0ciAmIDEpID8gMDQ0NCA6IDA2NjY7Ci0gICAgZHByaW50Zl9pbmZvKGZpbGUsICJfbGNyZWF0MzI6ICVzICUwMnhcbiIsIHBhdGgsIGF0dHIgKTsKKyAgICBUUkFDRShmaWxlLCAiJXMgJTAyeFxuIiwgcGF0aCwgYXR0ciApOwogICAgIHJldHVybiBGSUxFX0NyZWF0ZSggcGF0aCwgbW9kZSwgRkFMU0UgKTsKIH0KIApAQCAtOTc2LDcgKzk3Niw3IEBACiBIRklMRTMyIF9sY3JlYXRfdW5pcSggTFBDU1RSIHBhdGgsIElOVDMyIGF0dHIgKQogewogICAgIGludCBtb2RlID0gKGF0dHIgJiAxKSA/IDA0NDQgOiAwNjY2OwotICAgIGRwcmludGZfaW5mbyhmaWxlLCAiX2xjcmVhdF91bmlxOiAlcyAlMDJ4XG4iLCBwYXRoLCBhdHRyICk7CisgICAgVFJBQ0UoZmlsZSwgIiVzICUwMnhcbiIsIHBhdGgsIGF0dHIgKTsKICAgICByZXR1cm4gRklMRV9DcmVhdGUoIHBhdGgsIG1vZGUsIFRSVUUgKTsKIH0KIApAQCAtOTk2LDcgKzk5Niw3IEBACiAgICAgICAgIFNldExhc3RFcnJvciggRVJST1JfSU5WQUxJRF9QQVJBTUVURVIgKTsKICAgICAgICAgcmV0dXJuIDB4ZmZmZmZmZmY7CiAgICAgfQotICAgIGRwcmludGZfaW5mbyhmaWxlLCAiU2V0RmlsZVBvaW50ZXI6IGhhbmRsZSAlZCBvZmZzZXQgJWxkIG9yaWdpbiAlbGRcbiIsCisgICAgVFJBQ0UoZmlsZSwgImhhbmRsZSAlZCBvZmZzZXQgJWxkIG9yaWdpbiAlbGRcbiIsCiAgICAgICAgICAgICAgICAgICBoRmlsZSwgZGlzdGFuY2UsIG1ldGhvZCApOwogCiAgICAgaWYgKCEoZmlsZSA9IEZJTEVfR2V0RmlsZSggaEZpbGUgKSkpIHJldHVybiAweGZmZmZmZmZmOwpAQCAtMTA0OCw3ICsxMDQ4LDcgQEAKIHsKICAgICBJTlQzMiB1bml4TW9kZTsKIAotICAgIGRwcmludGZfaW5mbyhmaWxlLCAiX2xvcGVuMzIoJyVzJywlMDR4KVxuIiwgcGF0aCwgbW9kZSApOworICAgIFRSQUNFKGZpbGUsICIoJyVzJywlMDR4KVxuIiwgcGF0aCwgbW9kZSApOwogCiAgICAgc3dpdGNoKG1vZGUgJiAzKQogICAgIHsKQEAgLTExMjcsNyArMTEyNyw3IEBACiAJRFdPUkQgcmVzdWx0OwogCUJPT0wzMiBzdGF0dXMgPSBGQUxTRTsKIAkKLQlkcHJpbnRmX2luZm8oZmlsZSwgIl9od3JpdGUzMjogJWQgJXAgJWxkXG4iLCBoYW5kbGUsIGJ1ZmZlciwgY291bnQgKTsKKwlUUkFDRShmaWxlLCAiJWQgJXAgJWxkXG4iLCBoYW5kbGUsIGJ1ZmZlciwgY291bnQgKTsKIAogCWlmIChjb3VudCA9PSAwKSB7ICAgICAgIC8qIEV4cGFuZCBvciB0cnVuY2F0ZSBhdCBjdXJyZW50IHBvc2l0aW9uICovCiAJCUZJTEVfT0JKRUNUICpmaWxlID0gRklMRV9HZXRGaWxlKGhhbmRsZSk7CkBAIC0xMTYyLDcgKzExNjIsNyBAQAogICAgIFBEQiAqcGRiID0gKFBEQiAqKUdsb2JhbExvY2sxNiggaFBEQiApOwogICAgIEJZVEUgKmZpbGVzID0gUFRSX1NFR19UT19MSU4oIHBkYi0+ZmlsZUhhbmRsZXNQdHIgKTsKIAotICAgIGRwcmludGZfaW5mbyhmaWxlLCAiU2V0SGFuZGxlQ291bnQxNiglZClcbiIsIGNvdW50ICk7CisgICAgVFJBQ0UoZmlsZSwgIiglZClcbiIsIGNvdW50ICk7CiAKICAgICBpZiAoY291bnQgPCAyMCkgY291bnQgPSAyMDsgIC8qIE5vIHBvaW50IGluIGdvaW5nIGJlbG93IDIwICovCiAgICAgZWxzZSBpZiAoY291bnQgPiAyNTQpIGNvdW50ID0gMjU0OwpAQCAtMTIyMiw3ICsxMjIyLDcgQEAKICAgICBGSUxFX09CSkVDVCAqZmlsZTsKICAgICBCT09MMzIgcmV0OwogCi0gICAgZHByaW50Zl9pbmZvKGZpbGUsICJGbHVzaEZpbGVCdWZmZXJzKCVkKVxuIiwgaEZpbGUgKTsKKyAgICBUUkFDRShmaWxlLCAiKCVkKVxuIiwgaEZpbGUgKTsKICAgICBpZiAoIShmaWxlID0gRklMRV9HZXRGaWxlKCBoRmlsZSApKSkgcmV0dXJuIEZBTFNFOwogICAgIGlmIChmc3luYyggZmlsZS0+dW5peF9oYW5kbGUgKSAhPSAtMSkgcmV0ID0gVFJVRTsKICAgICBlbHNlCkBAIC0xMjQzLDcgKzEyNDMsNyBAQAogICAgIEZJTEVfT0JKRUNUICpmaWxlOwogICAgIEJPT0wzMiByZXQgPSBUUlVFOwogCi0gICAgZHByaW50Zl9pbmZvKGZpbGUsICJTZXRFbmRPZkZpbGUoJWQpXG4iLCBoRmlsZSApOworICAgIFRSQUNFKGZpbGUsICIoJWQpXG4iLCBoRmlsZSApOwogICAgIGlmICghKGZpbGUgPSBGSUxFX0dldEZpbGUoIGhGaWxlICkpKSByZXR1cm4gRkFMU0U7CiAgICAgaWYgKGZ0cnVuY2F0ZSggZmlsZS0+dW5peF9oYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgbHNlZWsoIGZpbGUtPnVuaXhfaGFuZGxlLCAwLCBTRUVLX0NVUiApICkpCkBAIC0xMjcyLDcgKzEyNzIsNyBAQAogewogICAgIERPU19GVUxMX05BTUUgZnVsbF9uYW1lOwogCi0gICAgZHByaW50Zl9pbmZvKGZpbGUsICJEZWxldGVGaWxlOiAnJXMnXG4iLCBwYXRoICk7CisgICAgVFJBQ0UoZmlsZSwgIiclcydcbiIsIHBhdGggKTsKIAogICAgIGlmIChET1NGU19Jc0RldmljZSggcGF0aCApKQogICAgIHsKQEAgLTE0NDUsNyArMTQ0NSw3IEBACiAgICAgRE9TX0ZVTExfTkFNRSBmdWxsX25hbWUxLCBmdWxsX25hbWUyOwogICAgIGludCBtb2RlPTA7IC8qIG1vZGUgPT0gMTogdXNlIGNvcHkgKi8KIAotICAgIGRwcmludGZfaW5mbyhmaWxlLCAiTW92ZUZpbGVFeDMyQSglcywlcywlMDRseClcbiIsIGZuMSwgZm4yLCBmbGFnKTsKKyAgICBUUkFDRShmaWxlLCAiKCVzLCVzLCUwNGx4KVxuIiwgZm4xLCBmbjIsIGZsYWcpOwogCiAgICAgaWYgKCFET1NGU19HZXRGdWxsTmFtZSggZm4xLCBUUlVFLCAmZnVsbF9uYW1lMSApKSByZXR1cm4gRkFMU0U7CiAgICAgaWYgKGZuMikgeyAvKiAhZm4yIG1lYW5zIGRlbGV0ZSBmbjEgKi8KQEAgLTE1NDUsNyArMTU0NSw3IEBACiAgICAgRE9TX0ZVTExfTkFNRSBmdWxsX25hbWUxLCBmdWxsX25hbWUyOwogICAgIHN0cnVjdCBzdGF0IGZzdGF0OwogCi0gICAgZHByaW50Zl9pbmZvKGZpbGUsICJNb3ZlRmlsZTMyQSglcywlcylcbiIsIGZuMSwgZm4yICk7CisgICAgVFJBQ0UoZmlsZSwgIiglcywlcylcbiIsIGZuMSwgZm4yICk7CiAKICAgICBpZiAoIURPU0ZTX0dldEZ1bGxOYW1lKCBmbjEsIFRSVUUsICZmdWxsX25hbWUxICkpIHJldHVybiBGQUxTRTsKICAgICBpZiAoRE9TRlNfR2V0RnVsbE5hbWUoIGZuMiwgVFJVRSwgJmZ1bGxfbmFtZTIgKSkgCkBAIC0xNTYzLDcgKzE1NjMsNyBAQAogICAgIGVsc2UgLypjb3B5ICovIHsKICAgICAgIGlmIChzdGF0KCAgZnVsbF9uYW1lMS5sb25nX25hbWUsICZmc3RhdCApKQogCXsKLQkgIGRwcmludGZfd2FybihmaWxlLCAiSW52YWxpZCBzb3VyY2UgZmlsZSAlc1xuIiwKKwkgIFdBUk4oZmlsZSwgIkludmFsaWQgc291cmNlIGZpbGUgJXNcbiIsCiAJCQlmdWxsX25hbWUxLmxvbmdfbmFtZSk7CiAJICBGSUxFX1NldERvc0Vycm9yKCk7CiAJICByZXR1cm4gRkFMU0U7CkBAIC0xNjY0LDcgKzE2NjQsNyBAQAogICAgIHN0cnVjdCB1dGltYnVmIHV0aW1idWY7CiAgICAgCiAgICAgaWYgKCFmaWxlKSByZXR1cm4gRklMRV9UWVBFX1VOS05PV047IC8qIEZJWE1FOiBjb3JyZWN0PyAqLwotICAgIGRwcmludGZfaW5mbyhmaWxlLCJTZXRGaWxlVGltZSglcywlcCwlcCwlcClcbiIsCisgICAgVFJBQ0UoZmlsZSwiKCVzLCVwLCVwLCVwKVxuIiwKIAlmaWxlLT51bml4X25hbWUsCiAJbHBDcmVhdGlvblRpbWUsCiAJbHBMYXN0QWNjZXNzVGltZSwKQEAgLTE3ODEsMTIgKzE3ODEsMTIgQEAKICAgc3RydWN0IGZsb2NrIGY7CiAgIEZJTEVfT0JKRUNUICpmaWxlOwogCi0gIGRwcmludGZfaW5mbyhmaWxlLCAiTG9ja0ZpbGUzMjogaGFuZGxlICVkIG9mZnNldGxvdz0lbGQgb2Zmc2V0aGlnaD0lbGQgbmJ5dGVzbG93PSVsZCBuYnl0ZXNoaWdoPSVsZFxuIiwKKyAgVFJBQ0UoZmlsZSwgImhhbmRsZSAlZCBvZmZzZXRsb3c9JWxkIG9mZnNldGhpZ2g9JWxkIG5ieXRlc2xvdz0lbGQgbmJ5dGVzaGlnaD0lbGRcbiIsCiAJICAgICAgIGhGaWxlLCBkd0ZpbGVPZmZzZXRMb3csIGR3RmlsZU9mZnNldEhpZ2gsCiAJICAgICAgIG5OdW1iZXJPZkJ5dGVzVG9Mb2NrTG93LCBuTnVtYmVyT2ZCeXRlc1RvTG9ja0hpZ2gpOwogCiAgIGlmIChkd0ZpbGVPZmZzZXRIaWdoIHx8IG5OdW1iZXJPZkJ5dGVzVG9Mb2NrSGlnaCkgewotICAgIGRwcmludGZfZml4bWUoZmlsZSwgIkxvY2tGaWxlMzI6IFVuaW1wbGVtZW50ZWQgYnl0ZXMgPiAzMmJpdHNcbiIpOworICAgIEZJWE1FKGZpbGUsICJVbmltcGxlbWVudGVkIGJ5dGVzID4gMzJiaXRzXG4iKTsKICAgICByZXR1cm4gRkFMU0U7CiAgIH0KIApAQCAtMTgzMiwxMiArMTgzMiwxMiBAQAogICBGSUxFX09CSkVDVCAqZmlsZTsKICAgc3RydWN0IGZsb2NrIGY7CiAKLSAgZHByaW50Zl9pbmZvKGZpbGUsICJVbmxvY2tGaWxlMzI6IGhhbmRsZSAlZCBvZmZzZXRsb3c9JWxkIG9mZnNldGhpZ2g9JWxkIG5ieXRlc2xvdz0lbGQgbmJ5dGVzaGlnaD0lbGRcbiIsCisgIFRSQUNFKGZpbGUsICJoYW5kbGUgJWQgb2Zmc2V0bG93PSVsZCBvZmZzZXRoaWdoPSVsZCBuYnl0ZXNsb3c9JWxkIG5ieXRlc2hpZ2g9JWxkXG4iLAogCSAgICAgICBoRmlsZSwgZHdGaWxlT2Zmc2V0TG93LCBkd0ZpbGVPZmZzZXRIaWdoLAogCSAgICAgICBuTnVtYmVyT2ZCeXRlc1RvVW5sb2NrTG93LCBuTnVtYmVyT2ZCeXRlc1RvVW5sb2NrSGlnaCk7CiAKICAgaWYgKGR3RmlsZU9mZnNldEhpZ2ggfHwgbk51bWJlck9mQnl0ZXNUb1VubG9ja0hpZ2gpIHsKLSAgICBkcHJpbnRmX3dhcm4oZmlsZSwgIlVubG9ja0ZpbGUzMjogVW5pbXBsZW1lbnRlZCBieXRlcyA+IDMyYml0c1xuIik7CisgICAgV0FSTihmaWxlLCAiVW5pbXBsZW1lbnRlZCBieXRlcyA+IDMyYml0c1xuIik7CiAgICAgcmV0dXJuIEZBTFNFOwogICB9CiAKZGlmZiAtLWdpdCBhL2ZpbGVzL3Byb2ZpbGUuYyBiL2ZpbGVzL3Byb2ZpbGUuYwppbmRleCAyYjZmN2ViLi4yOWUyZjA2IDEwMDY0NAotLS0gYS9maWxlcy9wcm9maWxlLmMKKysrIGIvZmlsZXMvcHJvZmlsZS5jCkBAIC0yMTUsMTIgKzIxNSwxMiBAQAogICAgICAgICAqcHJldl9rZXkgID0ga2V5OwogICAgICAgICBwcmV2X2tleSA9ICZrZXktPm5leHQ7CiAgICAgfQotICAgIGlmIChkZWJ1Z2dpbmdfaW5mbyhwcm9maWxlKSkKKyAgICBpZiAoVFJBQ0VfT04ocHJvZmlsZSkpCiAgICAgewotICAgICAgICBkcHJpbnRmX2luZm8ocHJvZmlsZSwgIlBST0ZJTEVfTG9hZDpcbiIgKTsKKyAgICAgICAgVFJBQ0UocHJvZmlsZSwgImR1bXA6XG4iICk7CiAJLyogRklYTUU6IGltcHJvcGVyIHVzZSBvZiBzdGRkZWIhICovCiAgICAgICAgIFBST0ZJTEVfU2F2ZShzdGRkZWIsIGZpcnN0X3NlY3Rpb24gKTsKLSAgICAgICAgZHByaW50Zl9pbmZvKHByb2ZpbGUsICJQUk9GSUxFX0xvYWQgZmluaXNoZWQuXG4iICk7CisgICAgICAgIFRSQUNFKHByb2ZpbGUsICJmaW5pc2hlZC5cbiIgKTsKICAgICB9CiAgICAgcmV0dXJuIGZpcnN0X3NlY3Rpb247CiB9CkBAIC0zNTcsNyArMzU3LDcgQEAKICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIAotICAgIGRwcmludGZfaW5mbyhwcm9maWxlLCAiU2F2aW5nICclcycgaW50byAnJXMnXG4iLAorICAgIFRSQUNFKHByb2ZpbGUsICJTYXZpbmcgJyVzJyBpbnRvICclcydcbiIsCiAgICAgICAgICAgICAgICAgICAgICBDdXJQcm9maWxlLmRvc19uYW1lLCB1bml4X25hbWUgKTsKICAgICBQUk9GSUxFX1NhdmUoIGZpbGUsIEN1clByb2ZpbGUuc2VjdGlvbiApOwogICAgIGZjbG9zZSggZmlsZSApOwpAQCAtMzgwLDcgKzM4MCw3IEBACiAKICAgICBpZiAoQ3VyUHJvZmlsZS5maWxlbmFtZSAmJiAhc3RyY21wKCBmaWxlbmFtZSwgQ3VyUHJvZmlsZS5maWxlbmFtZSApKQogICAgIHsKLSAgICAgICAgZHByaW50Zl9pbmZvKHByb2ZpbGUsICJQUk9GSUxFX09wZW4oJXMpOiBhbHJlYWR5IG9wZW5lZFxuIiwKKyAgICAgICAgVFJBQ0UocHJvZmlsZSwgIiglcyk6IGFscmVhZHkgb3BlbmVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lICk7CiAgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KQEAgLTQwMCw3ICs0MDAsNyBAQAogICAgIGlmIChDdXJQcm9maWxlLmRvc19uYW1lICYmCiAgICAgICAgICFzdHJjbXAoIGZ1bGxfbmFtZS5zaG9ydF9uYW1lLCBDdXJQcm9maWxlLmRvc19uYW1lICkpCiAgICAgewotICAgICAgICBkcHJpbnRmX2luZm8ocHJvZmlsZSwgIlBST0ZJTEVfT3Blbiglcyk6IGFscmVhZHkgb3BlbmVkXG4iLAorICAgICAgICBUUkFDRShwcm9maWxlLCAiKCVzKTogYWxyZWFkeSBvcGVuZWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgKTsKICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQpAQCAtNDI5LDcgKzQyOSw3IEBACiAgICAgICAgIENoYXJMb3dlcjMyQSggcCApOwogICAgICAgICBpZiAoKGZpbGUgPSBmb3BlbiggYnVmZmVyLCAiciIgKSkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGRwcmludGZfaW5mbyhwcm9maWxlLCAiUFJPRklMRV9PcGVuKCVzKTogZm91bmQgaXQgaW4gJXNcbiIsCisgICAgICAgICAgICBUUkFDRShwcm9maWxlLCAiKCVzKTogZm91bmQgaXQgaW4gJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBidWZmZXIgKTsKICAgICAgICAgICAgIEN1clByb2ZpbGUudW5peF9uYW1lID0gSEVBUF9zdHJkdXBBKCBTeXN0ZW1IZWFwLCAwLCBidWZmZXIgKTsKICAgICAgICAgfQpAQCAtNDQwLDcgKzQ0MCw3IEBACiAgICAgICAgIEN1clByb2ZpbGUudW5peF9uYW1lID0gSEVBUF9zdHJkdXBBKCBTeXN0ZW1IZWFwLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbF9uYW1lLmxvbmdfbmFtZSApOwogICAgICAgICBpZiAoKGZpbGUgPSBmb3BlbiggZnVsbF9uYW1lLmxvbmdfbmFtZSwgInIiICkpKQotICAgICAgICAgICAgZHByaW50Zl9pbmZvKHByb2ZpbGUsICJQUk9GSUxFX09wZW4oJXMpOiBmb3VuZCBpdCBpbiAlc1xuIiwKKyAgICAgICAgICAgIFRSQUNFKHByb2ZpbGUsICIoJXMpOiBmb3VuZCBpdCBpbiAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUsIGZ1bGxfbmFtZS5sb25nX25hbWUgKTsKICAgICB9CiAKQEAgLTUwNiw3ICs1MDYsNyBAQAogICAgICAgICBrZXkgPSBQUk9GSUxFX0ZpbmQoICZDdXJQcm9maWxlLnNlY3Rpb24sIHNlY3Rpb24sIGtleV9uYW1lLCBGQUxTRSApOwogICAgICAgICBQUk9GSUxFX0NvcHlFbnRyeSggYnVmZmVyLCAoa2V5ICYmIGtleS0+dmFsdWUpID8ga2V5LT52YWx1ZSA6IGRlZl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIEZBTFNFICk7Ci0gICAgICAgIGRwcmludGZfaW5mbyhwcm9maWxlLCAiUFJPRklMRV9HZXRTdHJpbmcoJyVzJywnJXMnLCclcycpOiByZXR1cm5pbmcgJyVzJ1xuIiwKKyAgICAgICAgVFJBQ0UocHJvZmlsZSwgIignJXMnLCclcycsJyVzJyk6IHJldHVybmluZyAnJXMnXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24sIGtleV9uYW1lLCBkZWZfdmFsLCBidWZmZXIgKTsKICAgICAgICAgcmV0dXJuIHN0cmxlbiggYnVmZmVyICk7CiAgICAgfQpAQCAtNTI0LDcgKzUyNCw3IEBACiB7CiAgICAgaWYgKCFrZXlfbmFtZSkgIC8qIERlbGV0ZSBhIHdob2xlIHNlY3Rpb24gKi8KICAgICB7Ci0gICAgICAgIGRwcmludGZfaW5mbyhwcm9maWxlLCAiUFJPRklMRV9EZWxldGVTZWN0aW9uKCclcycpXG4iLCBzZWN0aW9uX25hbWUpOworICAgICAgICBUUkFDRShwcm9maWxlLCAiKCclcycpXG4iLCBzZWN0aW9uX25hbWUpOwogICAgICAgICBDdXJQcm9maWxlLmNoYW5nZWQgfD0gUFJPRklMRV9EZWxldGVTZWN0aW9uKCAmQ3VyUHJvZmlsZS5zZWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uX25hbWUgKTsKICAgICAgICAgcmV0dXJuIFRSVUU7ICAgICAgICAgLyogRXZlbiBpZiBQUk9GSUxFX0RlbGV0ZVNlY3Rpb24oKSBoYXMgZmFpbGVkLApAQCAtNTMyLDcgKzUzMiw3IEBACiAgICAgfQogICAgIGVsc2UgaWYgKCF2YWx1ZSkgIC8qIERlbGV0ZSBhIGtleSAqLwogICAgIHsKLSAgICAgICAgZHByaW50Zl9pbmZvKHByb2ZpbGUsICJQUk9GSUxFX0RlbGV0ZUtleSgnJXMnLCclcycpXG4iLAorICAgICAgICBUUkFDRShwcm9maWxlLCAiKCclcycsJyVzJylcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbl9uYW1lLCBrZXlfbmFtZSApOwogICAgICAgICBDdXJQcm9maWxlLmNoYW5nZWQgfD0gUFJPRklMRV9EZWxldGVLZXkoICZDdXJQcm9maWxlLnNlY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbl9uYW1lLCBrZXlfbmFtZSApOwpAQCAtNTQyLDIwICs1NDIsMjAgQEAKICAgICB7CiAgICAgICAgIFBST0ZJTEVLRVkgKmtleSA9IFBST0ZJTEVfRmluZCggJkN1clByb2ZpbGUuc2VjdGlvbiwgc2VjdGlvbl9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9uYW1lLCBUUlVFICk7Ci0gICAgICAgIGRwcmludGZfaW5mbyhwcm9maWxlLCAiUFJPRklMRV9TZXRTdHJpbmcoJyVzJywnJXMnLCclcycpOiBcbiIsCisgICAgICAgIFRSQUNFKHByb2ZpbGUsICIoJyVzJywnJXMnLCclcycpOiBcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbl9uYW1lLCBrZXlfbmFtZSwgdmFsdWUgKTsKICAgICAgICAgaWYgKCFrZXkpIHJldHVybiBGQUxTRTsKICAgICAgICAgaWYgKGtleS0+dmFsdWUpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICghc3RyY21wKCBrZXktPnZhbHVlLCB2YWx1ZSApKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRwcmludGZfaW5mbyhwcm9maWxlLCAiICBubyBjaGFuZ2UgbmVlZGVkXG4iICk7CisgICAgICAgICAgICAgICAgVFJBQ0UocHJvZmlsZSwgIiAgbm8gY2hhbmdlIG5lZWRlZFxuIiApOwogICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOyAgLyogTm8gY2hhbmdlIG5lZWRlZCAqLwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZHByaW50Zl9pbmZvKHByb2ZpbGUsICIgIHJlcGxhY2luZyAnJXMnXG4iLCBrZXktPnZhbHVlICk7CisgICAgICAgICAgICBUUkFDRShwcm9maWxlLCAiICByZXBsYWNpbmcgJyVzJ1xuIiwga2V5LT52YWx1ZSApOwogICAgICAgICAgICAgSGVhcEZyZWUoIFN5c3RlbUhlYXAsIDAsIGtleS0+dmFsdWUgKTsKICAgICAgICAgfQotICAgICAgICBlbHNlIGRwcmludGZfaW5mbyhwcm9maWxlLCAiICBjcmVhdGluZyBrZXlcbiIgKTsKKyAgICAgICAgZWxzZSBUUkFDRShwcm9maWxlLCAiICBjcmVhdGluZyBrZXlcbiIgKTsKICAgICAgICAga2V5LT52YWx1ZSA9IEhFQVBfc3RyZHVwQSggU3lzdGVtSGVhcCwgMCwgdmFsdWUgKTsKICAgICAgICAgQ3VyUHJvZmlsZS5jaGFuZ2VkID0gVFJVRTsKICAgICB9CkBAIC01NzYsNyArNTc2LDcgQEAKICAgICAgICAgUFJPRklMRUtFWSAqa2V5ID0gUFJPRklMRV9GaW5kKCZXaW5lUHJvZmlsZSwgc2VjdGlvbiwga2V5X25hbWUsIEZBTFNFKTsKICAgICAgICAgUFJPRklMRV9Db3B5RW50cnkoIGJ1ZmZlciwgKGtleSAmJiBrZXktPnZhbHVlKSA/IGtleS0+dmFsdWUgOiBkZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIFRSVUUgKTsKLSAgICAgICAgZHByaW50Zl9pbmZvKHByb2ZpbGUsICJQUk9GSUxFX0dldFdpbmVJbmlTdHJpbmcoJyVzJywnJXMnLCclcycpOiByZXR1cm5pbmcgJyVzJ1xuIiwKKyAgICAgICAgVFJBQ0UocHJvZmlsZSwgIignJXMnLCclcycsJyVzJyk6IHJldHVybmluZyAnJXMnXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24sIGtleV9uYW1lLCBkZWYsIGJ1ZmZlciApOwogICAgICAgICByZXR1cm4gc3RybGVuKCBidWZmZXIgKTsKICAgICB9CkBAIC03MDcsNyArNzA3LDcgQEAKIAlyZXR2YWwgPSBkZWY7CiAgICAgfQogCi0gICAgZHByaW50Zl9pbmZvKHByb2ZpbGUsICJQUk9GSUxFX0dldFdpbmVJbmlCb29sKFwiJXNcIiwgXCIlc1wiLCAlcyksICIKKyAgICBUUkFDRShwcm9maWxlLCAiKFwiJXNcIiwgXCIlc1wiLCAlcyksICIKIAkJICAgICJbJWNdLCByZXQgJXMuXG4iLCBzZWN0aW9uLCBrZXlfbmFtZSwKIAkJICAgIGRlZiA/ICJUUlVFIiA6ICJGQUxTRSIsIGtleV92YWx1ZVswXSwKIAkJICAgIHJldHZhbCA/ICJUUlVFIiA6ICJGQUxTRSIpOwpAQCAtMTAzMSwxMSArMTAzMSwxMSBAQAogewogICAgIGNoYXIgKnAgPShjaGFyKilzdHJpbmc7CiAKLSAgICBkcHJpbnRmX2ZpeG1lKHByb2ZpbGUsICJXcml0ZVByaXZhdGVQcm9maWxlU2VjdGlvbjMyQSBlbXB0eSBzdHVwXG4iKTsKLSAgICBpZiAoZGVidWdnaW5nX2luZm8ocHJvZmlsZSkpIHsKLSAgICAgIGRwcmludGZfaW5mbyhwcm9maWxlLCAiZmlsZSglcykgPT4gWyVzXVxuIiwgZmlsZW5hbWUsIHNlY3Rpb24pOworICAgIEZJWE1FKHByb2ZpbGUsICJXcml0ZVByaXZhdGVQcm9maWxlU2VjdGlvbjMyQSBlbXB0eSBzdHVwXG4iKTsKKyAgICBpZiAoVFJBQ0VfT04ocHJvZmlsZSkpIHsKKyAgICAgIFRSQUNFKHByb2ZpbGUsICIoJXMpID0+IFslc11cbiIsIGZpbGVuYW1lLCBzZWN0aW9uKTsKICAgICAgIHdoaWxlICgqKHArMSkpIHsKLQlkcHJpbnRmX2luZm8ocHJvZmlsZSwgIiVzXG4iLCBwKTsKKwlUUkFDRShwcm9maWxlLCAiJXNcbiIsIHApOwogICAgICAgICBwICs9IHN0cmxlbihwKTsKIAlwICs9IDE7CiAgICAgICB9CmRpZmYgLS1naXQgYS9ncmFwaGljcy9iaXRibHQuYyBiL2dyYXBoaWNzL2JpdGJsdC5jCmluZGV4IGY3NzlkZmQuLjJjMjQ1M2IgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2JpdGJsdC5jCisrKyBiL2dyYXBoaWNzL2JpdGJsdC5jCkBAIC0xNyw3ICsxNyw3IEBACiAgICAgREMgKiBkYyA9IERDX0dldERDUHRyKCBoZGMgKTsKICAgICBpZiAoIWRjIHx8ICFkYy0+ZnVuY3MtPnBQYXRCbHQpIHJldHVybiBGQUxTRTsKIAotICAgIGRwcmludGZfaW5mbyhiaXRibHQsICJQYXRCbHQxNjogJTA0eCAlZCwlZCAlZHglZCAlMDZseFxuIiwKKyAgICBUUkFDRShiaXRibHQsICIlMDR4ICVkLCVkICVkeCVkICUwNmx4XG4iLAogICAgICAgICAgICAgICAgICAgICBoZGMsIGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCwgcm9wICk7CiAgICAgcmV0dXJuIGRjLT5mdW5jcy0+cFBhdEJsdCggZGMsIGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCwgcm9wICk7CiB9CkBAIC0zMiw3ICszMiw3IEBACiAgICAgREMgKiBkYyA9IERDX0dldERDUHRyKCBoZGMgKTsKICAgICBpZiAoIWRjIHx8ICFkYy0+ZnVuY3MtPnBQYXRCbHQpIHJldHVybiBGQUxTRTsKIAotICAgIGRwcmludGZfaW5mbyhiaXRibHQsICJQYXRCbHQzMjogJTA0eCAlZCwlZCAlZHglZCAlMDZseFxuIiwKKyAgICBUUkFDRShiaXRibHQsICIlMDR4ICVkLCVkICVkeCVkICUwNmx4XG4iLAogICAgICAgICAgICAgICAgICAgICBoZGMsIGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCwgcm9wICk7CiAgICAgcmV0dXJuIGRjLT5mdW5jcy0+cFBhdEJsdCggZGMsIGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCwgcm9wICk7CiB9CkBAIC01MSwxMCArNTEsOSBAQAogICAgIGlmICghZGNEc3QtPmZ1bmNzLT5wQml0Qmx0KSByZXR1cm4gRkFMU0U7CiAgICAgZGNTcmMgPSBEQ19HZXREQ1B0ciggaGRjU3JjICk7CiAKLSAgICBkcHJpbnRmX2luZm8oYml0Ymx0LAotICAgICAgICAgICAgICAgICJCaXRCbHQxNjogaGRjU3JjPSUwNHggJWQsJWQgJWQgYnBwIC0+IGhkY0Rlc3Q9JTA0eCAlZCwlZCAlZHglZHglZCByb3A9JTA2bHhcbiIsCi0gICAgICAgICAgICAgICAgaGRjU3JjLCB4U3JjLCB5U3JjLCBkY1NyYyA/IGRjU3JjLT53LmJpdHNQZXJQaXhlbCA6IDAsCi0gICAgICAgICAgICAgICAgaGRjRHN0LCB4RHN0LCB5RHN0LCB3aWR0aCwgaGVpZ2h0LCBkY0RzdC0+dy5iaXRzUGVyUGl4ZWwsIHJvcCk7CisgICAgVFJBQ0UoYml0Ymx0LCAiaGRjU3JjPSUwNHggJWQsJWQgJWQgYnBwIC0+IGhkY0Rlc3Q9JTA0eCAlZCwlZCAlZHglZHglZCByb3A9JTA2bHhcbiIsCisJCSBoZGNTcmMsIHhTcmMsIHlTcmMsIGRjU3JjID8gZGNTcmMtPncuYml0c1BlclBpeGVsIDogMCwKKwkJIGhkY0RzdCwgeERzdCwgeURzdCwgd2lkdGgsIGhlaWdodCwgZGNEc3QtPncuYml0c1BlclBpeGVsLCByb3ApOwogICAgIHJldHVybiBkY0RzdC0+ZnVuY3MtPnBCaXRCbHQoIGRjRHN0LCB4RHN0LCB5RHN0LCB3aWR0aCwgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjU3JjLCB4U3JjLCB5U3JjLCByb3AgKTsKIH0KQEAgLTczLDEwICs3Miw5IEBACiAgICAgaWYgKCFkY0RzdC0+ZnVuY3MtPnBCaXRCbHQpIHJldHVybiBGQUxTRTsKICAgICBkY1NyYyA9IERDX0dldERDUHRyKCBoZGNTcmMgKTsKIAotICAgIGRwcmludGZfaW5mbyhiaXRibHQsCi0gICAgICAgICAgICAgICAgIkJpdEJsdDMyOiBoZGNTcmM9JTA0eCAlZCwlZCAlZCBicHAgLT4gaGRjRGVzdD0lMDR4ICVkLCVkICVkeCVkeCVkIHJvcD0lMDZseFxuIiwKLSAgICAgICAgICAgICAgICBoZGNTcmMsIHhTcmMsIHlTcmMsIGRjU3JjID8gZGNTcmMtPncuYml0c1BlclBpeGVsIDogMCwKLSAgICAgICAgICAgICAgICBoZGNEc3QsIHhEc3QsIHlEc3QsIHdpZHRoLCBoZWlnaHQsIGRjRHN0LT53LmJpdHNQZXJQaXhlbCwgcm9wKTsKKyAgICBUUkFDRShiaXRibHQsICJoZGNTcmM9JTA0eCAlZCwlZCAlZCBicHAgLT4gaGRjRGVzdD0lMDR4ICVkLCVkICVkeCVkeCVkIHJvcD0lMDZseFxuIiwKKwkJIGhkY1NyYywgeFNyYywgeVNyYywgZGNTcmMgPyBkY1NyYy0+dy5iaXRzUGVyUGl4ZWwgOiAwLAorCQkgaGRjRHN0LCB4RHN0LCB5RHN0LCB3aWR0aCwgaGVpZ2h0LCBkY0RzdC0+dy5iaXRzUGVyUGl4ZWwsIHJvcCk7CiAgICAgcmV0dXJuIGRjRHN0LT5mdW5jcy0+cEJpdEJsdCggZGNEc3QsIHhEc3QsIHlEc3QsIHdpZHRoLCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGNTcmMsIHhTcmMsIHlTcmMsIHJvcCApOwogfQpAQCAtOTYsMTEgKzk0LDEwIEBACiAgICAgaWYgKCFkY0RzdC0+ZnVuY3MtPnBTdHJldGNoQmx0KSByZXR1cm4gRkFMU0U7CiAgICAgZGNTcmMgPSBEQ19HZXREQ1B0ciggaGRjU3JjICk7CiAKLSAgICBkcHJpbnRmX2luZm8oYml0Ymx0LAotICAgICAgICAiU3RyZXRjaEJsdDE2OiAlMDR4ICVkLCVkICVkeCVkeCVkIC0+ICUwNHggJWQsJWQgJWR4JWR4JWQgcm9wPSUwNmx4XG4iLAotICAgICAgICAgICAgICAgICAgIGhkY1NyYywgeFNyYywgeVNyYywgd2lkdGhTcmMsIGhlaWdodFNyYywKLSAgICAgICAgICAgICAgICAgICBkY1NyYyA/IGRjU3JjLT53LmJpdHNQZXJQaXhlbCA6IDAsIGhkY0RzdCwgeERzdCwgeURzdCwKLSAgICAgICAgICAgICAgICAgICB3aWR0aERzdCwgaGVpZ2h0RHN0LCBkY0RzdC0+dy5iaXRzUGVyUGl4ZWwsIHJvcCApOworICAgIFRSQUNFKGJpdGJsdCwgIiUwNHggJWQsJWQgJWR4JWR4JWQgLT4gJTA0eCAlZCwlZCAlZHglZHglZCByb3A9JTA2bHhcbiIsCisJCSBoZGNTcmMsIHhTcmMsIHlTcmMsIHdpZHRoU3JjLCBoZWlnaHRTcmMsCisJCSBkY1NyYyA/IGRjU3JjLT53LmJpdHNQZXJQaXhlbCA6IDAsIGhkY0RzdCwgeERzdCwgeURzdCwKKwkJIHdpZHRoRHN0LCBoZWlnaHREc3QsIGRjRHN0LT53LmJpdHNQZXJQaXhlbCwgcm9wICk7CiAgICAgcmV0dXJuIGRjRHN0LT5mdW5jcy0+cFN0cmV0Y2hCbHQoIGRjRHN0LCB4RHN0LCB5RHN0LCB3aWR0aERzdCwgaGVpZ2h0RHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkY1NyYywgeFNyYywgeVNyYywgd2lkdGhTcmMsIGhlaWdodFNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9wICk7CkBAIC0xMjEsMTEgKzExOCwxMCBAQAogICAgIGlmICghZGNEc3QtPmZ1bmNzLT5wU3RyZXRjaEJsdCkgcmV0dXJuIEZBTFNFOwogICAgIGRjU3JjID0gRENfR2V0RENQdHIoIGhkY1NyYyApOwogCi0gICAgZHByaW50Zl9pbmZvKGJpdGJsdCwKLSAgICAgICAgIlN0cmV0Y2hCbHQzMjogJTA0eCAlZCwlZCAlZHglZHglZCAtPiAlMDR4ICVkLCVkICVkeCVkeCVkIHJvcD0lMDZseFxuIiwKLSAgICAgICAgICAgICAgICAgICBoZGNTcmMsIHhTcmMsIHlTcmMsIHdpZHRoU3JjLCBoZWlnaHRTcmMsCi0gICAgICAgICAgICAgICAgICAgZGNTcmMgPyBkY1NyYy0+dy5iaXRzUGVyUGl4ZWwgOiAwLCBoZGNEc3QsIHhEc3QsIHlEc3QsCi0gICAgICAgICAgICAgICAgICAgd2lkdGhEc3QsIGhlaWdodERzdCwgZGNEc3QtPncuYml0c1BlclBpeGVsLCByb3AgKTsKKyAgICBUUkFDRShiaXRibHQsICIlMDR4ICVkLCVkICVkeCVkeCVkIC0+ICUwNHggJWQsJWQgJWR4JWR4JWQgcm9wPSUwNmx4XG4iLAorCQkgaGRjU3JjLCB4U3JjLCB5U3JjLCB3aWR0aFNyYywgaGVpZ2h0U3JjLAorCQkgZGNTcmMgPyBkY1NyYy0+dy5iaXRzUGVyUGl4ZWwgOiAwLCBoZGNEc3QsIHhEc3QsIHlEc3QsCisJCSB3aWR0aERzdCwgaGVpZ2h0RHN0LCBkY0RzdC0+dy5iaXRzUGVyUGl4ZWwsIHJvcCApOwogICAgIHJldHVybiBkY0RzdC0+ZnVuY3MtPnBTdHJldGNoQmx0KCBkY0RzdCwgeERzdCwgeURzdCwgd2lkdGhEc3QsIGhlaWdodERzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGNTcmMsIHhTcmMsIHlTcmMsIHdpZHRoU3JjLCBoZWlnaHRTcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvcCApOwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvZGRyYXcuYyBiL2dyYXBoaWNzL2RkcmF3LmMKaW5kZXggM2IxMzUwNy4uMzNjN2QxYiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvZGRyYXcuYworKysgYi9ncmFwaGljcy9kZHJhdy5jCkBAIC0zMzYsMTQgKzMzNiwxNCBAQAogc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZV9Mb2NrKAogICAgIExQRElSRUNURFJBV1NVUkZBQ0UgdGhpcyxMUFJFQ1QzMiBscHJlY3QsTFBERFNVUkZBQ0VERVNDIGxwZGRzZCxEV09SRCBmbGFncywgSEFORExFMzIgaG5kCiApIHsKLSAgICAgICAgZHByaW50Zl9pbmZvKGRkcmF3LCAiSURpcmVjdERyYXdTdXJmYWNlKCVwKS0+TG9jayglcCwlcCwlMDhseCwlMDhseClcbiIsCisgICAgICAgIFRSQUNFKGRkcmF3LCAiKCVwKS0+TG9jayglcCwlcCwlMDhseCwlMDhseClcbiIsCiAJCXRoaXMsbHByZWN0LGxwZGRzZCxmbGFncywoRFdPUkQpaG5kKTsKIAlpZiAoZmxhZ3MgJiB+KERETE9DS19XQUlUfERETE9DS19SRUFET05MWXxERExPQ0tfV1JJVEVPTkxZKSkKLQkgICAgZHByaW50Zl93YXJuKGRkcmF3LCAiSURpcmVjdERyYXdTdXJmYWNlKCVwKS0+TG9jayglcCwlcCwlMDhseCwlMDhseClcbiIsCisJICAgIFdBUk4oZGRyYXcsICIoJXApLT5Mb2NrKCVwLCVwLCUwOGx4LCUwOGx4KVxuIiwKIAkJCSB0aGlzLGxwcmVjdCxscGRkc2QsZmxhZ3MsKERXT1JEKWhuZCk7CiAKIAlpZiAobHByZWN0KSB7Ci0JCWRwcmludGZfaW5mbyhkZHJhdywiCWxwcmVjdDogJWR4JWQtJWR4JWRcbiIsCisJCVRSQUNFKGRkcmF3LCIJbHByZWN0OiAlZHglZC0lZHglZFxuIiwKIAkJCWxwcmVjdC0+dG9wLGxwcmVjdC0+bGVmdCxscHJlY3QtPmJvdHRvbSxscHJlY3QtPnJpZ2h0CiAJCSk7CiAJCWxwZGRzZC0+eS5scFN1cmZhY2UgPQl0aGlzLT5zLnN1cmZhY2UrCkBAIC0zNjIsMTQgKzM2MiwxNCBAQAogc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZV9VbmxvY2soCiAJTFBESVJFQ1REUkFXU1VSRkFDRSB0aGlzLExQVk9JRCBzdXJmYWNlCiApIHsKLQlkcHJpbnRmX2luZm8oZGRyYXcsIklEaXJlY3REcmF3U3VyZmFjZSglcCktPlVubG9jayglcClcbiIsdGhpcyxzdXJmYWNlKTsKKwlUUkFDRShkZHJhdywiKCVwKS0+VW5sb2NrKCVwKVxuIix0aGlzLHN1cmZhY2UpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlX0ZsaXAoCiAJTFBESVJFQ1REUkFXU1VSRkFDRSB0aGlzLExQRElSRUNURFJBV1NVUkZBQ0UgZmxpcHRvLERXT1JEIGR3RmxhZ3MKICkgewotCWRwcmludGZfaW5mbyhkZHJhdywiSURpcmVjdERyYXdTdXJmYWNlKCVwKS0+RmxpcCglcCwlMDhseClcbiIsdGhpcyxmbGlwdG8sZHdGbGFncyk7CisJVFJBQ0UoZGRyYXcsIiglcCktPkZsaXAoJXAsJTA4bHgpXG4iLHRoaXMsZmxpcHRvLGR3RmxhZ3MpOwogCWlmICghZmxpcHRvKSB7CiAJCWlmICh0aGlzLT5zLmJhY2tidWZmZXIpCiAJCQlmbGlwdG8gPSB0aGlzLT5zLmJhY2tidWZmZXI7CkBAIC0zOTksNyArMzk5LDcgQEAKIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2VfU2V0UGFsZXR0ZSgKIAlMUERJUkVDVERSQVdTVVJGQUNFIHRoaXMsTFBESVJFQ1REUkFXUEFMRVRURSBwYWwKICkgewotCWRwcmludGZfaW5mbyhkZHJhdywiSURpcmVjdERyYXdTdXJmYWNlKCVwKS0+U2V0UGFsZXR0ZSglcClcbiIsdGhpcyxwYWwpOworCVRSQUNFKGRkcmF3LCIoJXApLT5TZXRQYWxldHRlKCVwKVxuIix0aGlzLHBhbCk7CiAJdGhpcy0+cy5wYWxldHRlID0gcGFsOyAvKiBwcm9iYWJseSBhZGRyZWYgaXQgdG9vICovCiAJcmV0dXJuIDA7CiB9CkBAIC00NzUsNyArNDc1LDcgQEAKIAlMUERJUkVDVERSQVdTVVJGQUNFIHRoaXMsRFdPUkQgZHN0eCxEV09SRCBkc3R5LExQRElSRUNURFJBV1NVUkZBQ0Ugc3JjLExQUkVDVDMyIHJzcmMsRFdPUkQgdHJhbnMKICkgewogCWludAlpLGJwcDsKLQlpZiAoZGVidWdnaW5nX2luZm8oZGRyYXcpKSB7CisJaWYgKFRSQUNFX09OKGRkcmF3KSkgewogCSAgICBmcHJpbnRmKHN0ZGVyciwiSURpcmVjdERyYXdTdXJmYWNlKCVwKS0+Qmx0RmFzdCglbGQsJWxkLCVwLCVwLCUwOGx4KSxzdHViIVxuIiwKIAkJICAgIHRoaXMsZHN0eCxkc3R5LHNyYyxyc3JjLHRyYW5zCiAJICAgICk7CkBAIC01MDQsNyArNTA0LDcgQEAKIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2VfR2V0Q2FwcygKIAlMUERJUkVDVERSQVdTVVJGQUNFIHRoaXMsTFBERFNDQVBTIGNhcHMKICkgewotCWRwcmludGZfaW5mbyhkZHJhdywiSURpcmVjdERyYXdTdXJmYWNlKCVwKS0+R2V0Q2FwcyglcClcbiIsdGhpcyxjYXBzKTsKKwlUUkFDRShkZHJhdywiKCVwKS0+R2V0Q2FwcyglcClcbiIsdGhpcyxjYXBzKTsKIAljYXBzLT5kd0NhcHMgPSBERENBUFNfUEFMRVRURTsgLyogcHJvYmFibHkgbW9yZSAqLwogCXJldHVybiAwOwogfQpAQCAtNTEyLDggKzUxMiw4IEBACiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlX0dldFN1cmZhY2VEZXNjKAogCUxQRElSRUNURFJBV1NVUkZBQ0UgdGhpcyxMUEREU1VSRkFDRURFU0MgZGRzZAogKSB7IAotCWlmIChkZWJ1Z2dpbmdfaW5mbyhkZHJhdykpIHsKLQkJZHByaW50Zl9pbmZvKGRkcmF3LCAiSURpcmVjdERyYXdTdXJmYWNlKCVwKS0+R2V0U3VyZmFjZURlc2MoJXApXG4iLAorCWlmIChUUkFDRV9PTihkZHJhdykpIHsKKwkJVFJBQ0UoZGRyYXcsICIoJXApLT5HZXRTdXJmYWNlRGVzYyglcClcbiIsCiAJCQkgICAgIHRoaXMsZGRzZCk7CiAJCWZwcmludGYoc3RkZXJyLCIJZmxhZ3M6ICIpOwogCQlfZHVtcF9ERFNEKGRkc2QtPmR3RmxhZ3MpOwpAQCAtNTM0LDEyICs1MzQsMTIgQEAKIH0KIAogc3RhdGljIFVMT05HIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2VfQWRkUmVmKExQRElSRUNURFJBV1NVUkZBQ0UgdGhpcykgewotCWRwcmludGZfaW5mbyhkZHJhdywiSURpcmVjdERyYXdTdXJmYWNlKCVwKS0+QWRkUmVmKClcbiIsdGhpcyk7CisJVFJBQ0UoZGRyYXcsIiglcCktPkFkZFJlZigpXG4iLHRoaXMpOwogCXJldHVybiArKyh0aGlzLT5yZWYpOwogfQogCiBzdGF0aWMgVUxPTkcgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZV9SZWxlYXNlKExQRElSRUNURFJBV1NVUkZBQ0UgdGhpcykgewotCWRwcmludGZfaW5mbyhkZHJhdywiSURpcmVjdERyYXdTdXJmYWNlKCVwKS0+UmVsZWFzZSgpXG4iLHRoaXMpOworCVRSQUNFKGRkcmF3LCIoJXApLT5SZWxlYXNlKClcbiIsdGhpcyk7CiAJaWYgKCEtLSh0aGlzLT5yZWYpKSB7CiAJCXRoaXMtPnMuZGRyYXctPmxwdnRibC0+Zm5SZWxlYXNlKHRoaXMtPnMuZGRyYXcpOwogCQkvKiBjbGVhciBvdXQgb2Ygc3VyZmFjZSBsaXN0ICovCkBAIC01NTcsOSArNTU3LDkgQEAKIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2VfR2V0QXR0YWNoZWRTdXJmYWNlKAogCUxQRElSRUNURFJBV1NVUkZBQ0UgdGhpcyxMUEREU0NBUFMgbHBkZHNkLExQRElSRUNURFJBV1NVUkZBQ0UgKmxwZHNmCiApIHsKLSAgICAgICAgZHByaW50Zl9pbmZvKGRkcmF3LCAiSURpcmVjdERyYXdTdXJmYWNlKCVwKS0+R2V0QXR0YWNoZWRTdXJmYWNlKCVwLCVwKVxuIiwKKyAgICAgICAgVFJBQ0UoZGRyYXcsICIoJXApLT5HZXRBdHRhY2hlZFN1cmZhY2UoJXAsJXApXG4iLAogCQkgICAgIHRoaXMsIGxwZGRzZCwgbHBkc2YpOwotCWlmIChkZWJ1Z2dpbmdfaW5mbyhkZHJhdykpIHsKKwlpZiAoVFJBQ0VfT04oZGRyYXcpKSB7CiAJCWZwcmludGYoc3RkZXJyLCIJY2FwcyAiKTsKIAkJX2R1bXBfRERTQ0FQUyhscGRkc2QtPmR3Q2Fwcyk7CiAJCWZwcmludGYoc3RkZXJyLCJcbiIpOwpAQCAtNjI1LDcgKzYyNSw3IEBACiAgICAgICAgIGNoYXIgICAgeHJlZmlpZFs1MF07CiAKICAgICAgICAgV0lORV9TdHJpbmdGcm9tQ0xTSUQoKExQQ0xTSUQpcmVmaWlkLHhyZWZpaWQpOwotICAgICAgICBkcHJpbnRmX2luZm8oZGRyYXcsIklEaXJlY3REcmF3U3VyZmFjZSglcCktPlF1ZXJ5SW50ZXJmYWNlKCVzLCVwKVxuIix0aGlzLHhyZWZpaWQsb2JqKTsKKyAgICAgICAgVFJBQ0UoZGRyYXcsIiglcCktPlF1ZXJ5SW50ZXJmYWNlKCVzLCVwKVxuIix0aGlzLHhyZWZpaWQsb2JqKTsKIAkKIAkvKiB0aGF0cyB2ZXJzaW9uIDMgKERpcmVjdFggNSkgKi8KIAlpZiAoCSFtZW1jbXAoJklJRF9JRGlyZWN0RHJhd1N1cmZhY2UzLHJlZmlpZCxzaXplb2YoSUlEX0lEaXJlY3REcmF3U3VyZmFjZTMpKSkgewpAQCAtNzA4LDcgKzcwOCw3IEBACiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlMl9VbmxvY2soCiAJTFBESVJFQ1REUkFXU1VSRkFDRTIgdGhpcyxMUFZPSUQgc3VyZmFjZQogKSB7Ci0JZHByaW50Zl9pbmZvKGRkcmF3LCJJRGlyZWN0RHJhd1N1cmZhY2UyKCVwKS0+VW5sb2NrKCVwKVxuIix0aGlzLHN1cmZhY2UpOworCVRSQUNFKGRkcmF3LCIoJXApLT5VbmxvY2soJXApXG4iLHRoaXMsc3VyZmFjZSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTcxOSw3ICs3MTksNyBAQAogfQogCiBzdGF0aWMgVUxPTkcgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTJfQWRkUmVmKExQRElSRUNURFJBV1NVUkZBQ0UyIHRoaXMpIHsKLQlkcHJpbnRmX2luZm8oZGRyYXcsIklEaXJlY3REcmF3U3VyZmFjZTIoJXApLT5BZGRSZWYoKVxuIix0aGlzKTsKKwlUUkFDRShkZHJhdywiKCVwKS0+QWRkUmVmKClcbiIsdGhpcyk7CiAJcmV0dXJuICsrKHRoaXMtPnJlZik7CiB9CiAKQEAgLTgyMSwxMiArODIxLDEyIEBACiB9CiAKIHN0YXRpYyBVTE9ORyBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlM19BZGRSZWYoTFBESVJFQ1REUkFXU1VSRkFDRTMgdGhpcykgewotCWRwcmludGZfaW5mbyhkZHJhdywiSURpcmVjdERyYXdTdXJmYWNlMyglcCktPkFkZFJlZigpXG4iLHRoaXMpOworCVRSQUNFKGRkcmF3LCIoJXApLT5BZGRSZWYoKVxuIix0aGlzKTsKIAlyZXR1cm4gKysodGhpcy0+cmVmKTsKIH0KIAogc3RhdGljIFVMT05HIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2UzX1JlbGVhc2UoTFBESVJFQ1REUkFXU1VSRkFDRTMgdGhpcykgewotCWRwcmludGZfaW5mbyhkZHJhdywiSURpcmVjdERyYXdTdXJmYWNlMyglcCktPlJlbGVhc2UoKVxuIix0aGlzKTsKKwlUUkFDRShkZHJhdywiKCVwKS0+UmVsZWFzZSgpXG4iLHRoaXMpOwogCWlmICghLS0odGhpcy0+cmVmKSkgewogCQl0aGlzLT5zLmRkcmF3LT5scHZ0YmwtPmZuUmVsZWFzZSh0aGlzLT5zLmRkcmF3KTsKIAkJdGhpcy0+cy5kZHJhdy0+ZC52cG1hc2sgJj0gfigxPDwodGhpcy0+cy5mYl9oZWlnaHQvdGhpcy0+cy5kZHJhdy0+ZC5mYl9oZWlnaHQpKTsKQEAgLTk5MSw3ICs5OTEsNyBAQAogCVhDb2xvcgkJeGM7CiAJaW50CQlpOwogCi0JZHByaW50Zl9pbmZvKGRkcmF3LCJJRGlyZWN0RHJhd1BhbGV0dGUoJXApLT5TZXRFbnRyaWVzKCUwOGx4LCVsZCwlbGQsJXApXG4iLAorCVRSQUNFKGRkcmF3LCIoJXApLT5TZXRFbnRyaWVzKCUwOGx4LCVsZCwlbGQsJXApXG4iLAogCQl0aGlzLHgsc3RhcnQsZW5kLHBhbGVudAogCSk7CiAJaWYgKCF0aGlzLT5jbSkgLyogc2hvdWxkIG5vdCBoYXBwZW4gKi8gewpAQCAtMTEyMyw5ICsxMTIzLDkgQEAKICkgewogCWludAlpOwogCi0JZHByaW50Zl9pbmZvKGRkcmF3LCAiSURpcmVjdERyYXcoJXApLT5DcmVhdGVTdXJmYWNlKCVwLCVwLCVwKVxuIiwKKwlUUkFDRShkZHJhdywgIiglcCktPkNyZWF0ZVN1cmZhY2UoJXAsJXAsJXApXG4iLAogCQkgICAgIHRoaXMsbHBkZHNkLGxwZHNmLGxwdW5rKTsKLQlpZiAoZGVidWdnaW5nX2luZm8oZGRyYXcpKSB7CisJaWYgKFRSQUNFX09OKGRkcmF3KSkgewogCQlmcHJpbnRmKHN0ZGVyciwiW3c9JWxkLGg9JWxkLGZsYWdzICIsbHBkZHNkLT5kd1dpZHRoLGxwZGRzZC0+ZHdIZWlnaHQpOwogCQlfZHVtcF9ERFNEKGxwZGRzZC0+ZHdGbGFncyk7CiAJCWZwcmludGYoc3RkZXJyLCJjYXBzICIpOwpAQCAtMTE0NywxMiArMTE0NywxMiBAQAogCQkoKmxwZHNmKS0+cy5zdXJmYWNlID0gKExQQllURSlIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLGxwZGRzZC0+ZHdXaWR0aCpscGRkc2QtPmR3SGVpZ2h0KnRoaXMtPmQuZGVwdGgvOCk7CiAJCSgqbHBkc2YpLT5zLmZiX2hlaWdodCA9IC0xOwogCQkoKmxwZHNmKS0+cy5scGl0Y2ggPSBscGRkc2QtPmR3V2lkdGgqdGhpcy0+ZC5kZXB0aC84OwotCQlkcHJpbnRmX2luZm8oZGRyYXcsInVzaW5nIHN5c3RlbSBtZW1vcnkgZm9yIGEgcHJpbWFyeSBzdXJmYWNlXG4iKTsKKwkJVFJBQ0UoZGRyYXcsInVzaW5nIHN5c3RlbSBtZW1vcnkgZm9yIGEgcHJpbWFyeSBzdXJmYWNlXG4iKTsKIAl9IGVsc2UgewogCQlmb3IgKGk9MDtpPDMyO2krKykKIAkJCWlmICghKHRoaXMtPmQudnBtYXNrICYgKDE8PGkpKSkKIAkJCQlicmVhazsKLQkJZHByaW50Zl9pbmZvKGRkcmF3LCJ1c2luZyB2aWV3cG9ydCAlZCBmb3IgYSBwcmltYXJ5IHN1cmZhY2VcbiIsaSk7CisJCVRSQUNFKGRkcmF3LCJ1c2luZyB2aWV3cG9ydCAlZCBmb3IgYSBwcmltYXJ5IHN1cmZhY2VcbiIsaSk7CiAJCS8qIGlmIGkgPT0gMzIgb3IgbWF4aW11bSAuLi4gcmV0dXJuIGVycm9yICovCiAJCXRoaXMtPmQudnBtYXNrfD0oMTw8aSk7CiAJCSgqbHBkc2YpLT5zLnN1cmZhY2UgPSB0aGlzLT5kLmZiX2FkZHIrKChpKnRoaXMtPmQuZmJfaGVpZ2h0KSp0aGlzLT5kLmZiX3dpZHRoKnRoaXMtPmQuZGVwdGgvOCk7CkBAIC0xMTc5LDcgKzExNzksNyBAQAogCQlmb3IgKGk9MDtpPDMyO2krKykKIAkJCWlmICghKHRoaXMtPmQudnBtYXNrICYgKDE8PGkpKSkKIAkJCQlicmVhazsKLQkJZHByaW50Zl9pbmZvKGRkcmF3LCJ1c2luZyB2aWV3cG9ydCAlZCBmb3IgYmFja2J1ZmZlclxuIixpKTsKKwkJVFJBQ0UoZGRyYXcsInVzaW5nIHZpZXdwb3J0ICVkIGZvciBiYWNrYnVmZmVyXG4iLGkpOwogCQkvKiBpZiBpID09IDMyIG9yIG1heGltdW0gLi4uIHJldHVybiBlcnJvciAqLwogCQl0aGlzLT5kLnZwbWFza3w9KDE8PGkpOwogCQliYWNrLT5zLnN1cmZhY2UgPSB0aGlzLT5kLmZiX2FkZHIrKChpKnRoaXMtPmQuZmJfaGVpZ2h0KSp0aGlzLT5kLmZiX3dpZHRoKnRoaXMtPmQuZGVwdGgvOCk7CkBAIC0xMTk4LDcgKzExOTgsNyBAQAogc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3X0R1cGxpY2F0ZVN1cmZhY2UoCiAJTFBESVJFQ1REUkFXIHRoaXMsTFBESVJFQ1REUkFXU1VSRkFDRSBzcmMsTFBESVJFQ1REUkFXU1VSRkFDRSAqZHN0CiApIHsKLQlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdERyYXcoJXApLT5EdXBsaWNhdGVTdXJmYWNlKCVwLCVwKVxuIix0aGlzLHNyYyxkc3QpOworCWZwcmludGYoc3RkZXJyLCIoJXApLT5EdXBsaWNhdGVTdXJmYWNlKCVwLCVwKVxuIix0aGlzLHNyYyxkc3QpOwogCSpkc3QgPSBzcmM7IC8qIEZJWE1FICovCiAJcmV0dXJuIDA7CiB9CkBAIC0xMjIyLDE1ICsxMjIyLDE1IEBACiAJCUZFKEREU0NMX0NSRUFURURFVklDRVdJTkRPVykKIAl9OwogCi0JZHByaW50Zl9pbmZvKGRkcmF3LCJJRGlyZWN0RHJhdyglcCktPlNldENvb3BlcmF0aXZlTGV2ZWwoJTA4bHgsJTA4bHgpXG4iLAorCVRSQUNFKGRkcmF3LCIoJXApLT5TZXRDb29wZXJhdGl2ZUxldmVsKCUwOGx4LCUwOGx4KVxuIiwKIAkJdGhpcywoRFdPUkQpaHduZCxjb29wbGV2ZWwKIAkpOwotCWlmKGRlYnVnZ2luZ19pbmZvKGRkcmF3KSl7CisJaWYoVFJBQ0VfT04oZGRyYXcpKXsKIAkgIGRiZ19kZWNsX3N0cihkZHJhdywgNTEyKTsKIAkgIGZvciAoaT0wO2k8c2l6ZW9mKGZsYWdtYXApL3NpemVvZihmbGFnbWFwWzBdKTtpKyspCiAJICAgIGlmIChmbGFnbWFwW2ldLm1hc2sgJiBjb29wbGV2ZWwpCiAJICAgICAgZHNwcmludGYoZGRyYXcsICIlcyAiLCBmbGFnbWFwW2ldLm5hbWUpOwotCSAgZHByaW50Zl9pbmZvKGRkcmF3LCIJY29vcGVyYXRpdmUgbGV2ZWwgJXNcbiIsIGRiZ19zdHIoZGRyYXcpKTsKKwkgIFRSQUNFKGRkcmF3LCIJY29vcGVyYXRpdmUgbGV2ZWwgJXNcbiIsIGRiZ19zdHIoZGRyYXcpKTsKIAl9CiAJdGhpcy0+ZC5tYWlud2luZG93ID0gaHduZDsKIAlyZXR1cm4gMDsKQEAgLTEyNDMsNyArMTI0Myw3IEBACiAJaW50CWksKmRlcHRocyxkZXBjb3VudDsKIAljaGFyCWJ1ZlsyMDBdOwogCi0JZHByaW50Zl9maXhtZShkZHJhdywgIklEaXJlY3REcmF3KCVwKS0+U2V0RGlzcGxheU1vZGUoJWxkLCVsZCwlbGQpLHN0dWIhXG4iLAorCVRSQUNFKGRkcmF3LCAiKCVwKS0+U2V0RGlzcGxheU1vZGUoJWxkLCVsZCwlbGQpXG4iLAogCQkgICAgICB0aGlzLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCk7CiAKIAlkZXB0aHMgPSBUU1hMaXN0RGVwdGhzKGRpc3BsYXksRGVmYXVsdFNjcmVlbihkaXNwbGF5KSwmZGVwY291bnQpOwpAQCAtMTI3Myw3ICsxMjczLDEwIEBACiAJICogaXQgd29ya3MgZm9yIHRoZSBsaWJyYXJ5IHRvbz8KIAkgKi8KIAlYRjg2REdBRGlyZWN0VmlkZW8oZGlzcGxheSxEZWZhdWx0U2NyZWVuKGRpc3BsYXkpLFhGODZER0FEaXJlY3RHcmFwaGljcyk7CisvKgogCVhGODZER0FTZXRWaWV3UG9ydChkaXNwbGF5LERlZmF1bHRTY3JlZW4oZGlzcGxheSksMCx0aGlzLT5kLmZiX2hlaWdodCk7CisgKi8KKwogI2lmZGVmIFJFU1RPUkVfU0lHTkFMUwogCVNJR05BTF9Jbml0RW11bGF0b3IoKTsKICNlbmRpZgpAQCAtMTI4Myw3ICsxMjg2LDcgQEAKIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd19HZXRDYXBzKAogCUxQRElSRUNURFJBVyB0aGlzLExQRERDQVBTIGNhcHMxLExQRERDQVBTIGNhcHMyCiApICB7Ci0JZHByaW50Zl9pbmZvKGRkcmF3LCJJRGlyZWN0RHJhdyglcCktPkdldENhcHMoJXAsJXApXG4iLHRoaXMsY2FwczEsY2FwczIpOworCVRSQUNFKGRkcmF3LCIoJXApLT5HZXRDYXBzKCVwLCVwKVxuIix0aGlzLGNhcHMxLGNhcHMyKTsKIAljYXBzMS0+ZHdWaWRNZW1Ub3RhbCA9IHRoaXMtPmQuZmJfbWVtc2l6ZTsKIAljYXBzMS0+ZHdDYXBzID0gMHhmZmZmZmZmZiZ+KEREQ0FQU19CQU5LU1dJVENIRUQpOwkJLyogd2UgY2FuIGRvIGFueXRoaW5nICovCiAJY2FwczEtPmRkc0NhcHMuZHdDYXBzID0gMHhmZmZmZmZmZjsJLyogd2UgY2FuIGRvIGFueXRoaW5nICovCkBAIC0xMjk4LDcgKzEzMDEsNyBAQAogc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3X0NyZWF0ZUNsaXBwZXIoCiAJTFBESVJFQ1REUkFXIHRoaXMsRFdPUkQgeCxMUERJUkVDVERSQVdDTElQUEVSICpscGRkY2xpcCxMUFVOS05PV04gbHB1bmsKICkgewotCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0RHJhdyglcCktPkNyZWF0ZUNsaXBwZXIoJTA4bHgsJXAsJXApLHN0dWIhXG4iLAorCWZwcmludGYoc3RkZXJyLCIoJXApLT5DcmVhdGVDbGlwcGVyKCUwOGx4LCVwLCVwKSxzdHViIVxuIiwKIAkJdGhpcyx4LGxwZGRjbGlwLGxwdW5rCiAJKTsKIAkqbHBkZGNsaXAgPSAoTFBESVJFQ1REUkFXQ0xJUFBFUilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSxIRUFQX1pFUk9fTUVNT1JZLHNpemVvZihJRGlyZWN0RHJhd0NsaXBwZXIpKTsKQEAgLTEzMTAsNyArMTMxMyw3IEBACiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdfQ3JlYXRlUGFsZXR0ZSgKIAlMUERJUkVDVERSQVcgdGhpcyxEV09SRCB4LExQUEFMRVRURUVOVFJZIHBhbGVudCxMUERJUkVDVERSQVdQQUxFVFRFICpscGRkcGFsLExQVU5LTk9XTiBscHVuawogKSB7Ci0JZHByaW50Zl9pbmZvKGRkcmF3LCJJRGlyZWN0RHJhdyglcCktPkNyZWF0ZVBhbGV0dGUoJTA4bHgsJXAsJXAsJXApXG4iLAorCVRSQUNFKGRkcmF3LCIoJXApLT5DcmVhdGVQYWxldHRlKCUwOGx4LCVwLCVwLCVwKVxuIiwKIAkJdGhpcyx4LHBhbGVudCxscGRkcGFsLGxwdW5rCiAJKTsKIAkqbHBkZHBhbCA9IChMUERJUkVDVERSQVdQQUxFVFRFKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLEhFQVBfWkVST19NRU1PUlksc2l6ZW9mKElEaXJlY3REcmF3UGFsZXR0ZSkpOwpAQCAtMTMyNiw3ICsxMzI5LDcgQEAKIH0KIAogc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3X1Jlc3RvcmVEaXNwbGF5TW9kZShMUERJUkVDVERSQVcgdGhpcykgewotCWRwcmludGZfZml4bWUoZGRyYXcsICJJRGlyZWN0RHJhdyglcCktPlJlc3RvcmVEaXNwbGF5TW9kZSgpLHN0dWIhXG4iLCAKKwlUUkFDRShkZHJhdywgIiglcCktPlJlc3RvcmVEaXNwbGF5TW9kZSgpXG4iLCAKIAkJICAgICAgdGhpcyk7CiAJU2xlZXAoMTAwMCk7CiAJWEY4NkRHQURpcmVjdFZpZGVvKGRpc3BsYXksRGVmYXVsdFNjcmVlbihkaXNwbGF5KSwwKTsKQEAgLTEzNDAsNyArMTM0Myw3IEBACiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdfV2FpdEZvclZlcnRpY2FsQmxhbmsoCiAJTFBESVJFQ1REUkFXIHRoaXMsRFdPUkQgeCxIQU5ETEUzMiBoCiApIHsKLQlkcHJpbnRmX2luZm8oZGRyYXcsIklEaXJlY3REcmF3KCVwKS0+V2FpdEZvclZlcnRpY2FsQmxhbmsoMHglMDhseCwweCUwOHgpLHN0dWIhXG4iLHRoaXMseCxoKTsKKwlUUkFDRShkZHJhdywiKCVwKS0+V2FpdEZvclZlcnRpY2FsQmxhbmsoMHglMDhseCwweCUwOHgpXG4iLHRoaXMseCxoKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTM2Niw3ICsxMzY5LDcgQEAKICAgICAgICAgY2hhciAgICB4cmVmaWlkWzUwXTsKIAogICAgICAgICBXSU5FX1N0cmluZ0Zyb21DTFNJRCgoTFBDTFNJRClyZWZpaWQseHJlZmlpZCk7Ci0gICAgICAgIGRwcmludGZfaW5mbyhkZHJhdywiSURpcmVjdERyYXcoJXApLT5RdWVyeUludGVyZmFjZSglcywlcClcbiIsdGhpcyx4cmVmaWlkLG9iaik7CisgICAgICAgIFRSQUNFKGRkcmF3LCIoJXApLT5RdWVyeUludGVyZmFjZSglcywlcClcbiIsdGhpcyx4cmVmaWlkLG9iaik7CiAgICAgICAgIGlmICghbWVtY21wKCZJSURfSVVua25vd24scmVmaWlkLHNpemVvZihJSURfSVVua25vd24pKSkgewogICAgICAgICAgICAgICAgICpvYmogPSB0aGlzOwogCQl0aGlzLT5scHZ0YmwtPmZuQWRkUmVmKHRoaXMpOwpAQCAtMTQwNSwxNCArMTQwOCwxNCBAQAogCQkqb2JqID0gZDNkOwogCQlyZXR1cm4gMDsKIAl9Ci0JZnByaW50ZihzdGRlcnIsIklEaXJlY3REcmF3KCVwKTppbnRlcmZhY2UgZm9yIElJRCAlcyBfTk9UXyBmb3VuZCFcbiIsdGhpcyx4cmVmaWlkKTsKKwlmcHJpbnRmKHN0ZGVyciwiKCVwKTppbnRlcmZhY2UgZm9yIElJRCAlcyBfTk9UXyBmb3VuZCFcbiIsdGhpcyx4cmVmaWlkKTsKICAgICAgICAgcmV0dXJuIE9MRV9FX0VOVU1fTk9NT1JFOwogfQogCiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdfR2V0VmVydGljYWxCbGFua1N0YXR1cygKIAlMUERJUkVDVERSQVcgdGhpcyxCT09MMzIgKnN0YXR1cwogKSB7Ci0gICAgICAgIGRwcmludGZfaW5mbyhkZHJhdywiSURpcmVjdERyYXcoJXApLT5HZXRWZXJ0aWNhbEJsYW5rU2F0dXMoJXApXG4iLHRoaXMsc3RhdHVzKTsKKyAgICAgICAgVFJBQ0UoZGRyYXcsIiglcCktPkdldFZlcnRpY2FsQmxhbmtTYXR1cyglcClcbiIsdGhpcyxzdGF0dXMpOwogCSpzdGF0dXMgPSBUUlVFOwogCXJldHVybiAwOwogfQpAQCAtMTQyMiw3ICsxNDI1LDcgQEAKICkgewogCUREU1VSRkFDRURFU0MJZGRzZmQ7CiAKLQlkcHJpbnRmX2luZm8oZGRyYXcsIklEaXJlY3REcmF3KCVwKS0+RW51bURpc3BsYXlNb2RlcygweCUwOGx4LCVwLCVwLCVwKVxuIix0aGlzLGR3RmxhZ3MsbHBkZHNmZCxjb250ZXh0LG1vZGVzY2IpOworCVRSQUNFKGRkcmF3LCIoJXApLT5FbnVtRGlzcGxheU1vZGVzKDB4JTA4bHgsJXAsJXAsJXApXG4iLHRoaXMsZHdGbGFncyxscGRkc2ZkLGNvbnRleHQsbW9kZXNjYik7CiAKIAogCV9nZXRwaXhlbGZvcm1hdCh0aGlzLCYoZGRzZmQuZGRwZlBpeGVsRm9ybWF0KSk7CkBAIC0xNDU3LDcgKzE0NjAsNyBAQAogc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3X0dldERpc3BsYXlNb2RlKAogCUxQRElSRUNURFJBVyB0aGlzLExQRERTVVJGQUNFREVTQyBscGRkc2ZkCiApIHsKLQlkcHJpbnRmX2luZm8oZGRyYXcsIklEaXJlY3REcmF3KCVwKS0+R2V0RGlzcGxheU1vZGUoJXApXG4iLHRoaXMsbHBkZHNmZCk7CisJVFJBQ0UoZGRyYXcsIiglcCktPkdldERpc3BsYXlNb2RlKCVwKVxuIix0aGlzLGxwZGRzZmQpOwogCWxwZGRzZmQtPmR3RmxhZ3MgPSBERFNEX0hFSUdIVHxERFNEX1dJRFRIfEREU0RfUElUQ0h8RERTRF9CQUNLQlVGRkVSQ09VTlR8RERTRF9QSVhFTEZPUk1BVHxERFNEX0NBUFM7CiAJbHBkZHNmZC0+ZHdIZWlnaHQgPSBzY3JlZW5IZWlnaHQ7CiAJbHBkZHNmZC0+ZHdXaWR0aCA9IHNjcmVlbldpZHRoOwpAQCAtMTQ3MCwxNCArMTQ3MywxNCBAQAogfQogCiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdfRmxpcFRvR0RJU3VyZmFjZShMUERJUkVDVERSQVcgdGhpcykgewotCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0RHJhdyglcCktPkZsaXBUb0dESVN1cmZhY2UoKSxzdHViIVxuIix0aGlzKTsKKwlmcHJpbnRmKHN0ZGVyciwiKCVwKS0+RmxpcFRvR0RJU3VyZmFjZSgpXG4iLHRoaXMpOwogCXJldHVybiBERF9PSzsKIH0KIAogc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3X0dldE1vbml0b3JGcmVxdWVuY3koCiAJTFBESVJFQ1REUkFXIHRoaXMsTFBEV09SRCBmcmVxCiApIHsKLQlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdERyYXcoJXApLT5HZXRNb25pdG9yRnJlcXVlbmN5KCVwKVxuIix0aGlzLGZyZXEpOworCWZwcmludGYoc3RkZXJyLCIoJXApLT5HZXRNb25pdG9yRnJlcXVlbmN5KCVwKVxuIix0aGlzLGZyZXEpOwogCSpmcmVxID0gNjAqMTAwOyAvKiA2MCBIeiAqLwogCXJldHVybiAwOwogfQpAQCAtMTU2MCw3ICsxNTYzLDcgQEAKIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhdzJfU2V0RGlzcGxheU1vZGUoCiAJTFBESVJFQ1REUkFXMiB0aGlzLERXT1JEIHdpZHRoLERXT1JEIGhlaWdodCxEV09SRCBkZXB0aCxEV09SRCB4eCxEV09SRCB5eQogKSB7Ci0JZHByaW50Zl9maXhtZShkZHJhdywiSURpcmVjdERyYXcyKCVwKS0+U2V0RGlzcGxheU1vZGUoJWxkLCVsZCwlbGQsJTA4bHgsJTA4bHgpLHN0dWIhXG4iLAorCVRSQUNFKGRkcmF3LCJJRGlyZWN0RHJhdzIoJXApLT5TZXREaXNwbGF5TW9kZSglbGQsJWxkLCVsZCwlMDhseCwlMDhseClcbiIsCiAJCSAgICAgIHRoaXMsIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCB4eCwgeXkpOwogCiAJcmV0dXJuIElEaXJlY3REcmF3X1NldERpc3BsYXlNb2RlKChMUERJUkVDVERSQVcpdGhpcyx3aWR0aCxoZWlnaHQsZGVwdGgpOwpAQCAtMTY2MSw3ICsxNjY0LDcgQEAKIAllbHNlCiAJCXN0cmNweSh4Y2xzaWQsIjxudWxsPiIpOwogCi0JZHByaW50Zl9pbmZvKGRkcmF3LCJEaXJlY3REcmF3Q3JlYXRlKCVzLCVwLCVwKVxuIix4Y2xzaWQsbHBscERELHBVbmtPdXRlcik7CisJVFJBQ0UoZGRyYXcsIiglcywlcCwlcClcbiIseGNsc2lkLGxwbHBERCxwVW5rT3V0ZXIpOwogCWlmIChnZXR1aWQoKSkgewogCQlNZXNzYWdlQm94MzJBKDAsIlVzaW5nIHRoZSBYRjg2REdBIGV4dGVuc2lvbiByZXF1aXJlcyB0aGUgcHJvZ3JhbSB0byBiZSBydW4gdXNpbmcgVUlEIDAuIiwiV0lORSBEaXJlY3REcmF3IixNQl9PS3xNQl9JQ09OU1RPUCk7CiAJCXJldHVybiBFX1VORVhQRUNURUQ7CkBAIC0xNjc0LDEyICsxNjc3LDEyIEBACiAJCXJldHVybiAwOwogCX0KIAlYRjg2REdBUXVlcnlWZXJzaW9uKGRpc3BsYXksJm1ham9yLCZtaW5vcik7Ci0JZHByaW50Zl9pbmZvKGRkcmF3LCJYRjg2REdBIGlzIHZlcnNpb24gJWQuJWRcbiIsbWFqb3IsbWlub3IpOworCVRSQUNFKGRkcmF3LCJYRjg2REdBIGlzIHZlcnNpb24gJWQuJWRcbiIsbWFqb3IsbWlub3IpOwogCVhGODZER0FRdWVyeURpcmVjdFZpZGVvKGRpc3BsYXksRGVmYXVsdFNjcmVlbihkaXNwbGF5KSwmZmxhZ3MpOwogCWlmICghKGZsYWdzICYgWEY4NkRHQURpcmVjdFByZXNlbnQpKQogCQlmcHJpbnRmKHN0ZGVyciwiZGlyZWN0IHZpZGVvIGlzIE5PVCBFTkFCTEVELlxuIik7CiAJWEY4NkRHQUdldFZpZGVvKGRpc3BsYXksRGVmYXVsdFNjcmVlbihkaXNwbGF5KSwmYWRkciwmd2lkdGgsJmJhbmtzaXplLCZtZW1zaXplKTsKLQlkcHJpbnRmX2luZm8oZGRyYXcsInZpZGVvIGZyYW1lYnVmZmVyOiBiZWdpbiAlcCwgd2lkdGggJWQsYmFua3NpemUgJWQsbWVtc2l6ZSAlZFxuIiwKKwlUUkFDRShkZHJhdywidmlkZW8gZnJhbWVidWZmZXI6IGJlZ2luICVwLCB3aWR0aCAlZCxiYW5rc2l6ZSAlZCxtZW1zaXplICVkXG4iLAogCQlhZGRyLHdpZHRoLGJhbmtzaXplLG1lbXNpemUKIAkpOwogCSgqbHBscEREKS0+ZC5mYl93aWR0aCA9IHdpZHRoOwpAQCAtMTY5Miw3ICsxNjk1LDcgQEAKIAkoKmxwbHBERCktPmQudnBfd2lkdGggPSB3aWR0aDsKIAkoKmxwbHBERCktPmQudnBfaGVpZ2h0ID0gaGVpZ2h0OwogCSgqbHBscEREKS0+ZC5mYl9oZWlnaHQgPSBzY3JlZW5IZWlnaHQ7Ci0JKCpscGxwREQpLT5kLnZwbWFzayA9IDE7CisJKCpscGxwREQpLT5kLnZwbWFzayA9IDA7CiAKIAkvKiBqdXN0IGFzc3VtZSB0aGUgZGVmYXVsdCBkZXB0aCBpcyB0aGUgREdBIGRlcHRoIHRvbyAqLwogCSgqbHBscEREKS0+ZC5kZXB0aCA9IERlZmF1bHREZXB0aE9mU2NyZWVuKHNjcmVlbik7CmRpZmYgLS1naXQgYS9ncmFwaGljcy9tYXBwaW5nLmMgYi9ncmFwaGljcy9tYXBwaW5nLmMKaW5kZXggOGFkMTk4ZC4uMDYwMGU5NCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvbWFwcGluZy5jCisrKyBiL2dyYXBoaWNzL21hcHBpbmcuYwpAQCAtMTYzLDcgKzE2Myw3IEBACiAgICAgaWYgKCFkYykgcmV0dXJuIDA7CiAgICAgaWYgKGRjLT5mdW5jcy0+cFNldE1hcE1vZGUpIHJldHVybiBkYy0+ZnVuY3MtPnBTZXRNYXBNb2RlKCBkYywgbW9kZSApOwogCi0gICAgZHByaW50Zl9pbmZvKGdkaSwgIlNldE1hcE1vZGU6ICUwNHggJWRcbiIsIGhkYywgbW9kZSApOworICAgIFRSQUNFKGdkaSwgIiUwNHggJWRcbiIsIGhkYywgbW9kZSApOwogICAgIAogICAgIHByZXZNb2RlID0gZGMtPncuTWFwTW9kZTsKICAgICBzd2l0Y2gobW9kZSkKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL21ldGFmaWxlZHJ2L2luaXQuYyBiL2dyYXBoaWNzL21ldGFmaWxlZHJ2L2luaXQuYwppbmRleCA5ZDIzMmJjLi5hMDJkN2ZmIDEwMDY0NAotLS0gYS9ncmFwaGljcy9tZXRhZmlsZWRydi9pbml0LmMKKysrIGIvZ3JhcGhpY3MvbWV0YWZpbGVkcnYvaW5pdC5jCkBAIC0xNTAsNyArMTUwLDcgQEAKICAgICBNRVRBRklMRURSVl9QREVWSUNFICpwaHlzRGV2OwogICAgIEhGSUxFMzIgaEZpbGU7CiAKLSAgICBkcHJpbnRmX2luZm8obWV0YWZpbGUsICJDcmVhdGVNZXRhRmlsZTE2OiAnJXMnXG4iLCBmaWxlbmFtZSApOworICAgIFRSQUNFKG1ldGFmaWxlLCAiJyVzJ1xuIiwgZmlsZW5hbWUgKTsKIAogICAgIGlmICghKGRjID0gTUZEUlZfQWxsb2NNZXRhRmlsZSgpKSkgcmV0dXJuIDA7CiAgICAgcGh5c0RldiA9IChNRVRBRklMRURSVl9QREVWSUNFICopZGMtPnBoeXNEZXY7CkBAIC0xNzUsNyArMTc1LDcgQEAKICAgICBlbHNlICAvKiBtZW1vcnkgYmFzZWQgbWV0YWZpbGUgKi8KIAlwaHlzRGV2LT5taC0+bXRUeXBlID0gTUVUQUZJTEVfTUVNT1JZOwogCi0gICAgZHByaW50Zl9pbmZvKG1ldGFmaWxlLCAiQ3JlYXRlTWV0YUZpbGUxNjogcmV0dXJuaW5nICUwNHhcbiIsIGRjLT5oU2VsZik7CisgICAgVFJBQ0UobWV0YWZpbGUsICJyZXR1cm5pbmcgJTA0eFxuIiwgZGMtPmhTZWxmKTsKICAgICByZXR1cm4gZGMtPmhTZWxmOwogfQogCkBAIC0xOTgsNyArMTk4LDcgQEAKICAgICBIRklMRTMyIGhGaWxlOwogICAgIE1FVEFGSUxFRFJWX1BERVZJQ0UgKnBoeXNEZXY7CiAgICAgCi0gICAgZHByaW50Zl9pbmZvKG1ldGFmaWxlLCAiQ2xvc2VNZXRhRmlsZSglMDR4KVxuIiwgaGRjICk7CisgICAgVFJBQ0UobWV0YWZpbGUsICIoJTA0eClcbiIsIGhkYyApOwogCiAgICAgaWYgKCEoZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBNRVRBRklMRV9EQ19NQUdJQyApKSkgcmV0dXJuIDA7CiAgICAgcGh5c0RldiA9IChNRVRBRklMRURSVl9QREVWSUNFICopZGMtPnBoeXNEZXY7CmRpZmYgLS1naXQgYS9ncmFwaGljcy9tZXRhZmlsZWRydi9vYmplY3RzLmMgYi9ncmFwaGljcy9tZXRhZmlsZWRydi9vYmplY3RzLmMKaW5kZXggZGU4YmJjNi4uNjQ4OGRmOCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvbWV0YWZpbGVkcnYvb2JqZWN0cy5jCisrKyBiL2dyYXBoaWNzL21ldGFmaWxlZHJ2L29iamVjdHMuYwpAQCAtODUsNyArODUsNyBAQAogICAgIEhHRElPQkozMiByZXQgPSAwOwogCiAgICAgaWYgKCFwdHIpIHJldHVybiAwOwotICAgIGRwcmludGZfaW5mbyhnZGksICJTZWxlY3RPYmplY3Q6IGhkYz0lMDR4ICUwNHhcbiIsIGRjLT5oU2VsZiwgaGFuZGxlICk7CisgICAgVFJBQ0UoZ2RpLCAiaGRjPSUwNHggJTA0eFxuIiwgZGMtPmhTZWxmLCBoYW5kbGUgKTsKICAgICAKICAgICBzd2l0Y2gocHRyLT53TWFnaWMpCiAgICAgewpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvcGF0aC5jIGIvZ3JhcGhpY3MvcGF0aC5jCmluZGV4IGQ1M2FjZDkuLjA5ZGJjNWYgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3BhdGguYworKysgYi9ncmFwaGljcy9wYXRoLmMKQEAgLTIyNyw4ICsyMjcsNyBAQAogSU5UMTYgV0lOQVBJIEdldFBhdGgxNihIREMxNiBoZGMsIExQUE9JTlQxNiBwUG9pbnRzLCBMUEJZVEUgcFR5cGVzLAogICAgSU5UMTYgblNpemUpCiB7Ci0gICAvKiBGSVhNRTogTm90IGltcGxlbWVudGVkICovCi0gICBmcHJpbnRmKHN0ZG5pbXAsICJHZXRQYXRoMTY6IFVuaW1wbGVtZW50ZWQgc3R1YlxuIik7CisgICBGSVhNRShnZGksICJVbmltcGxlbWVudGVkIHN0dWJcbiIpOwogCiAgICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3dpbjE2ZHJ2L2JydXNoLmMgYi9ncmFwaGljcy93aW4xNmRydi9icnVzaC5jCmluZGV4IDdmMzk3ZGUuLmE0MzdkMjEgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3dpbjE2ZHJ2L2JydXNoLmMKKysrIGIvZ3JhcGhpY3Mvd2luMTZkcnYvYnJ1c2guYwpAQCAtMjUsNyArMjUsNyBAQAogCiAgICAgaWYgKCBwaHlzRGV2LT5CcnVzaEluZm8gKQogICAgIHsKLSAgICAgICAgZHByaW50Zl9pbmZvKHdpbjE2ZHJ2LCAiVW5SZWFsaXppbmcgQnJ1c2hJbmZvXG4iKTsKKyAgICAgICAgVFJBQ0Uod2luMTZkcnYsICJVblJlYWxpemluZyBCcnVzaEluZm9cbiIpOwogICAgICAgICBuU2l6ZSA9IFBSVERSVl9SZWFsaXplT2JqZWN0IChwaHlzRGV2LT5zZWdwdHJQREVWSUNFLCAtRFJWT0JKX0JSVVNILAogCQkJCSAgICAgIHBoeXNEZXYtPkJydXNoSW5mbywKIAkJCQkgICAgICBwaHlzRGV2LT5CcnVzaEluZm8sIDApOwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3Mvd2luMTZkcnYvZm9udC5jIGIvZ3JhcGhpY3Mvd2luMTZkcnYvZm9udC5jCmluZGV4IGYwYzhkY2UuLmY3MzVlZmYgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3dpbjE2ZHJ2L2ZvbnQuYworKysgYi9ncmFwaGljcy93aW4xNmRydi9mb250LmMKQEAgLTI0LDcgKzI0LDcgQEAKICAgICBXSU4xNkRSVl9QREVWSUNFICpwaHlzRGV2ID0gKFdJTjE2RFJWX1BERVZJQ0UgKilkYy0+cGh5c0RldjsKICAgICBEV09SRCBkd1JldDsKICAgICAKLSAgICBkcHJpbnRmX2luZm8od2luMTZkcnYsICJXSU4xNkRSVl9HZXRUZXh0RXh0UG9pbnQ6ICUwNHggJXMgJWQgJXBcbiIsCisgICAgVFJBQ0Uod2luMTZkcnYsICIlMDR4ICVzICVkICVwXG4iLAogCQkgICAgICAgICAgICAgICAgZGMtPmhTZWxmLCBzdHIsIGNvdW50LCBzaXplKTsKIAogICAgIGR3UmV0ID0gUFJURFJWX0V4dFRleHRPdXQocGh5c0Rldi0+c2VncHRyUERFVklDRSwgMCwgMCwgCkBAIC0zNCw3ICszNCw3IEBACiAJCQkgICAgICB3aW4xNmRydl9TZWdQdHJfVGV4dFhGb3JtLCBOVUxMLCBOVUxMLCAwKTsKICAgICBzaXplLT5jeCA9IFhEU1RPTFMoZGMsTE9XT1JEKGR3UmV0KSk7CiAgICAgc2l6ZS0+Y3kgPSBZRFNUT0xTKGRjLEhJV09SRChkd1JldCkpOwotICAgIGRwcmludGZfaW5mbyh3aW4xNmRydiwgIldJTjE2RFJWX0dldFRleHRFeHRQb2ludDogY3g9MHgleCwgY3k9MHgleFxuIiwKKyAgICBUUkFDRSh3aW4xNmRydiwgImN4PTB4JXgsIGN5PTB4JXhcbiIsCiAJCXNpemUtPmN4LCBzaXplLT5jeSApOwogICAgIHJldHVybiBUUlVFOwogfQpAQCAtNDcsMTIgKzQ3LDExIEBACiB7CiAgICAgV0lOMTZEUlZfUERFVklDRSAqcGh5c0RldiA9IChXSU4xNkRSVl9QREVWSUNFICopZGMtPnBoeXNEZXY7CiAKLSAgICBkcHJpbnRmX2luZm8od2luMTZkcnYsICJXSU4xNkRSVl9HZXRUZXh0TWV0cmljczogJTA0eCBcbiIsIGRjLT5oU2VsZik7CisgICAgVFJBQ0Uod2luMTZkcnYsICIlMDR4IFxuIiwgZGMtPmhTZWxmKTsKIAogICAgIEZPTlRfVGV4dE1ldHJpYzE2dG8zMkEoICZwaHlzRGV2LT50bSwgbWV0cmljcyApOwogCi0gICAgZHByaW50Zl9pbmZvKHdpbjE2ZHJ2LAotCSAgICJIICVkLCBBICVkLCBEICVkLCBJbnQgJWQsIEV4dCAlZCwgQVcgJWQsIE1XICVkLCBXICVkXG4iLAorICAgIFRSQUNFKHdpbjE2ZHJ2LCAiSCAlZCwgQSAlZCwgRCAlZCwgSW50ICVkLCBFeHQgJWQsIEFXICVkLCBNVyAlZCwgVyAlZFxuIiwKICAgICAgICAgICAgbWV0cmljcy0+dG1IZWlnaHQsCiAgICAgICAgICAgIG1ldHJpY3MtPnRtQXNjZW50LAogICAgICAgICAgICBtZXRyaWNzLT50bURlc2NlbnQsCkBAIC03MywxMyArNzIsMTMgQEAKIAogICAgIGRjLT53LmhGb250ID0gaGZvbnQ7CiAKLSAgICBkcHJpbnRmX2luZm8od2luMTZkcnYsICJXSU4xNkRSVl9GT05UX1NlbGVjdE9iamVjdCAnJXMnIGg9JWRcbiIsCisgICAgVFJBQ0Uod2luMTZkcnYsICJXSU4xNkRSVl9GT05UX1NlbGVjdE9iamVjdCAnJXMnIGg9JWRcbiIsCiAJCSAgICAgZm9udC0+bG9nZm9udC5sZkZhY2VOYW1lLCBmb250LT5sb2dmb250LmxmSGVpZ2h0KTsKIAogCiAgICAgaWYoIHBoeXNEZXYtPkZvbnRJbmZvICkKICAgICB7Ci0gICAgICAgIGRwcmludGZfaW5mbyh3aW4xNmRydiwgIlVuUmVhbGl6aW5nIEZvbnRJbmZvXG4iKTsKKyAgICAgICAgVFJBQ0Uod2luMTZkcnYsICJVblJlYWxpemluZyBGb250SW5mb1xuIik7CiAgICAgICAgIG5TaXplID0gUFJURFJWX1JlYWxpemVPYmplY3QgKHBoeXNEZXYtPnNlZ3B0clBERVZJQ0UsIC1EUlZPQkpfRk9OVCwKIAkJCQkgICAgICBwaHlzRGV2LT5Gb250SW5mbywKIAkJCQkgICAgICBwaHlzRGV2LT5Gb250SW5mbywgMCk7CkBAIC0xMjksOCArMTI4LDcgQEAKICAgICBwaHlzRGV2LT50bS50bUNoYXJTZXQgICAgICAgICAgPSBmaS0+ZGZDaGFyU2V0OwogI3VuZGVmIGZpCiAKLSAgICBkcHJpbnRmX2luZm8od2luMTZkcnYsCi0gICAgICAgICAgICJIICVkLCBBICVkLCBEICVkLCBJbnQgJWQsIEV4dCAlZCwgQVcgJWQsIE1XICVkLCBXICVkXG4iLAorICAgIFRSQUNFKHdpbjE2ZHJ2LCAiSCAlZCwgQSAlZCwgRCAlZCwgSW50ICVkLCBFeHQgJWQsIEFXICVkLCBNVyAlZCwgVyAlZFxuIiwKICAgICAgICAgICAgcGh5c0Rldi0+dG0udG1IZWlnaHQsCiAgICAgICAgICAgIHBoeXNEZXYtPnRtLnRtQXNjZW50LAogICAgICAgICAgICBwaHlzRGV2LT50bS50bURlc2NlbnQsCkBAIC0xNTQsMTYgKzE1MiwxNiBAQAogCiAgICAgV0lOMTZEUlZfUERFVklDRSAqcGh5c0RldiA9IChXSU4xNkRSVl9QREVWSUNFICopZGMtPnBoeXNEZXY7CiAgICAgCi0gICAgZHByaW50Zl9pbmZvKHdpbjE2ZHJ2LCAiV0lOMTZEUlZfR2V0Q2hhcldpZHRoOiAlZCAtICVkIGludG8gJXBcbiIsCisgICAgVFJBQ0Uod2luMTZkcnYsICIlZCAtICVkIGludG8gJXBcbiIsCiAJCSAgICAgIGZpcnN0Q2hhciwgbGFzdENoYXIsIGJ1ZmZlciApOwogCiAgICAgd1JldCA9IFBSVERSVl9HZXRDaGFyV2lkdGgoIHBoeXNEZXYtPnNlZ3B0clBERVZJQ0UsIGJ1ZmZlciwgZmlyc3RDaGFyLCAKIAkJCQlsYXN0Q2hhciwgcGh5c0Rldi0+Rm9udEluZm8sIAogCQkJCXdpbjE2ZHJ2X1NlZ1B0cl9EcmF3TW9kZSwgCiAJCQkJd2luMTZkcnZfU2VnUHRyX1RleHRYRm9ybSApOwotICAgIGlmKCBkZWJ1Z2dpbmdfaW5mbyh3aW4xNmRydikgKXsKKyAgICBpZiggVFJBQ0VfT04od2luMTZkcnYpICl7CiAgICAgICAgIGZvcihpID0gMDsgaSA8PSBsYXN0Q2hhciAtIGZpcnN0Q2hhcjsgaSsrKQotCSAgICBkcHJpbnRmX2luZm8od2luMTZkcnYsICJDaGFyICV4OiB3aWR0aCAlZFxuIiwgaSArIGZpcnN0Q2hhciwKKwkgICAgVFJBQ0Uod2luMTZkcnYsICJDaGFyICV4OiB3aWR0aCAlZFxuIiwgaSArIGZpcnN0Q2hhciwKIAkJCSAgICAgICAgICAgICAgICAgYnVmZmVyW2ldKTsKICAgICB9CiAKQEAgLTIwNyw3ICsyMDUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVEVYVE1FVFJJQzE2IGxwVGV4dE1ldHJpY3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV09SRCB3Rm9udFR5cGUsIExPTkcgbHBDbGllbnREYXRhKSAKIHsKLSAgICBkcHJpbnRmX2luZm8od2luMTZkcnYsICJJbiBXaW5lRW51bURGb250Q2FsbGJhY2sgcGxmPSVwXG4iLCBscExvZ0ZvbnQpOworICAgIFRSQUNFKHdpbjE2ZHJ2LCAiSW4gV2luZUVudW1ERm9udENhbGxiYWNrIHBsZj0lcFxuIiwgbHBMb2dGb250KTsKICAgICByZXR1cm4gKCooKChXRVBGQyAqKWxwQ2xpZW50RGF0YSktPnByb2MpKSggbHBMb2dGb250LCBscFRleHRNZXRyaWNzLCAKIAkJCQkgICAgIHdGb250VHlwZSwgKChXRVBGQyAqKWxwQ2xpZW50RGF0YSktPmxwICk7CiB9CmRpZmYgLS1naXQgYS9ncmFwaGljcy93aW4xNmRydi9ncmFwaGljcy5jIGIvZ3JhcGhpY3Mvd2luMTZkcnYvZ3JhcGhpY3MuYwppbmRleCA2M2YzNGFiLi40MzM1MjllIDEwMDY0NAotLS0gYS9ncmFwaGljcy93aW4xNmRydi9ncmFwaGljcy5jCisrKyBiL2dyYXBoaWNzL3dpbjE2ZHJ2L2dyYXBoaWNzLmMKQEAgLTYwLDkgKzYwLDkgQEAKICAgICBCT09MMzIgYlJldCA9IDA7CiAgICAgUE9JTlQxNiBwb2ludHNbMl07CiAKLSAgICBkcHJpbnRmX2luZm8od2luMTZkcnYsICJJbiBXSU4xNkRSVl9SZWN0YW5nbGUsIHggJWQgeSAlZCBEQ09yZ1ggJWQgeSAlZFxuIiwKKyAgICBUUkFDRSh3aW4xNmRydiwgIkluIFdJTjE2RFJWX1JlY3RhbmdsZSwgeCAlZCB5ICVkIERDT3JnWCAlZCB5ICVkXG4iLAogICAgICAgICAgICBsZWZ0LCB0b3AsIGRjLT53LkRDT3JnWCwgZGMtPncuRENPcmdZKTsKLSAgICBkcHJpbnRmX2luZm8od2luMTZkcnYsICJJbiBXSU4xNkRSVl9SZWN0YW5nbGUsIFZQb3J0T3JnWCAlZCB5ICVkXG4iLAorICAgIFRSQUNFKHdpbjE2ZHJ2LCAiSW4gV0lOMTZEUlZfUmVjdGFuZ2xlLCBWUG9ydE9yZ1ggJWQgeSAlZFxuIiwKICAgICAgICAgICAgZGMtPnZwb3J0T3JnWCwgZGMtPnZwb3J0T3JnWSk7CiAgICAgcG9pbnRzWzBdLnggPSBYTFBUT0RQKGRjLCBsZWZ0KTsKICAgICBwb2ludHNbMF0ueSA9IFlMUFRPRFAoZGMsIHRvcCk7CkBAIC0xNTIsOSArMTUyLDkgQEAKICAgICBXSU4xNkRSVl9QREVWSUNFICpwaHlzRGV2ID0gKFdJTjE2RFJWX1BERVZJQ0UgKilkYy0+cGh5c0RldjsKICAgICBCT09MMzIgYlJldCA9IDA7CiAgICAgUE9JTlQxNiBwb2ludHNbMl07Ci0gICAgZHByaW50Zl9pbmZvKHdpbjE2ZHJ2LCAiSW4gV0lOMTZEUlZfRWxsaXBzZSwgeCAlZCB5ICVkIERDT3JnWCAlZCB5ICVkXG4iLAorICAgIFRSQUNFKHdpbjE2ZHJ2LCAiSW4gV0lOMTZEUlZfRWxsaXBzZSwgeCAlZCB5ICVkIERDT3JnWCAlZCB5ICVkXG4iLAogICAgICAgICAgICBsZWZ0LCB0b3AsIGRjLT53LkRDT3JnWCwgZGMtPncuRENPcmdZKTsKLSAgICBkcHJpbnRmX2luZm8od2luMTZkcnYsICJJbiBXSU4xNkRSVl9FbGxpcHNlLCBWUG9ydE9yZ1ggJWQgeSAlZFxuIiwKKyAgICBUUkFDRSh3aW4xNmRydiwgIkluIFdJTjE2RFJWX0VsbGlwc2UsIFZQb3J0T3JnWCAlZCB5ICVkXG4iLAogICAgICAgICAgICBkYy0+dnBvcnRPcmdYLCBkYy0+dnBvcnRPcmdZKTsKICAgICBwb2ludHNbMF0ueCA9IFhMUFRPRFAoZGMsIGxlZnQpOwogICAgIHBvaW50c1swXS55ID0gWUxQVE9EUChkYywgdG9wKTsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3dpbjE2ZHJ2L2luaXQuYyBiL2dyYXBoaWNzL3dpbjE2ZHJ2L2luaXQuYwppbmRleCA2NzAzY2Y1Li44YjFhODk2IDEwMDY0NAotLS0gYS9ncmFwaGljcy93aW4xNmRydi9pbml0LmMKKysrIGIvZ3JhcGhpY3Mvd2luMTZkcnYvaW5pdC5jCkBAIC0xNzcsNyArMTc3LDcgQEAKICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIAotICAgIGRwcmludGZfaW5mbyh3aW4xNmRydiwgIkluIGNyZWF0ZGMgZm9yICglcywlcywlcykgaW5pdERhdGEgMHglcFxuIixkcml2ZXIsIGRldmljZSwgb3V0cHV0LCBpbml0RGF0YSk7CisgICAgVFJBQ0Uod2luMTZkcnYsICJJbiBjcmVhdGRjIGZvciAoJXMsJXMsJXMpIGluaXREYXRhIDB4JXBcbiIsZHJpdmVyLCBkZXZpY2UsIG91dHB1dCwgaW5pdERhdGEpOwogCiAgICAgcGh5c0RldiA9IChXSU4xNkRSVl9QREVWSUNFICopSGVhcEFsbG9jKCBTeXN0ZW1IZWFwLCAwLCBzaXplb2YoKnBoeXNEZXYpICk7CiAgICAgaWYgKCFwaHlzRGV2KSByZXR1cm4gRkFMU0U7CkBAIC0xODYsMTEgKzE4NiwxMSBAQAogICAgIHBMUEQgPSBMb2FkUHJpbnRlckRyaXZlcihkcml2ZXIpOwogICAgIGlmIChwTFBEID09IE5VTEwpCiAgICAgewotCWRwcmludGZfd2Fybih3aW4xNmRydiwgIkxQR0RJX0NyZWF0ZURDOiBGYWlsZWQgdG8gZmluZCBwcmludGVyIGRyaXZlclxuIik7CisJV0FSTih3aW4xNmRydiwgIkZhaWxlZCB0byBmaW5kIHByaW50ZXIgZHJpdmVyXG4iKTsKICAgICAgICAgSGVhcEZyZWUoIFN5c3RlbUhlYXAsIDAsIHBoeXNEZXYgKTsKICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICBkcHJpbnRmX2luZm8od2luMTZkcnYsICJ3aW5kZXZDcmVhdGVEQyBwTFBEIDB4JXBcbiIsIHBMUEQpOworICAgIFRSQUNFKHdpbjE2ZHJ2LCAid2luZGV2Q3JlYXRlREMgcExQRCAweCVwXG4iLCBwTFBEKTsKIAogICAgIC8qIE5vdyBHZXQgdGhlIGRldmljZSBjYXBhYmlsaXRpZXMgZnJvbSB0aGUgcHJpbnRlciBkcml2ZXIgKi8KICAgICAKQEAgLTIyNiw3ICsyMjYsNyBAQAogICAgIHBQREggPSAoUERFVklDRV9IRUFERVIgKikoKEJZVEUqKVBUUl9TRUdfVE9fTElOKHBoeXNEZXYtPnNlZ3B0clBERVZJQ0UpIC0gc2l6ZW9mKFBERVZJQ0VfSEVBREVSKSk7IAogICAgIHBQREgtPnBMUEQgPSBwTFBEOwogICAgIAotICAgIGRwcmludGZfaW5mbyh3aW4xNmRydiwgIlBSVERSVl9FbmFibGU6IFBERVZJQ0UgYWxsb2NhdGVkICUwOGx4XG4iLChEV09SRCkocGh5c0Rldi0+c2VncHRyUERFVklDRSkpOworICAgIFRSQUNFKHdpbjE2ZHJ2LCAiUERFVklDRSBhbGxvY2F0ZWQgJTA4bHhcbiIsKERXT1JEKShwaHlzRGV2LT5zZWdwdHJQREVWSUNFKSk7CiAgICAgCiAgICAgLyogTm93IGdldCB0aGUgcHJpbnRlciBkcml2ZXIgdG8gaW5pdGlhbGlzZSB0aGlzIGRhdGEgKi8KICAgICB3UmV0ID0gUFJURFJWX0VuYWJsZSgoTFBWT0lEKXBoeXNEZXYtPnNlZ3B0clBERVZJQ0UsIElOSVRQREVWSUNFLCBkZXZpY2UsIGRyaXZlciwgb3V0cHV0LCBOVUxMKTsgCkBAIC01MzgsNyArNTM4LDcgQEAKICAgICBIQU5ETEUxNiBoSGFuZGxlID0gKEhBTkRMRTE2KVNQX0VSUk9SOwogICAgIFBQUklOVEpPQiBwUHJpbnRKb2I7CiAKLSAgICBkcHJpbnRmX2luZm8od2luMTZkcnYsICJPcGVuSm9iOiBcIiVzXCIgXCIlc1wiICUwNHhcbiIsIGxwT3V0cHV0LCBscFRpdGxlLCBoREMpOworICAgIFRSQUNFKHdpbjE2ZHJ2LCAiXCIlc1wiIFwiJXNcIiAlMDR4XG4iLCBscE91dHB1dCwgbHBUaXRsZSwgaERDKTsKIAogICAgIHBQcmludEpvYiA9IGdQcmludEpvYnNUYWJsZVswXTsKICAgICBpZiAocFByaW50Sm9iID09IE5VTEwpCkBAIC01NjMsNyArNTYzLDcgQEAKIAkgICAgZ1ByaW50Sm9ic1RhYmxlW3BQcmludEpvYi0+bkluZGV4XSA9IHBQcmludEpvYjsgCiAJfQogICAgIH0KLSAgICBkcHJpbnRmX2luZm8od2luMTZkcnYsICJPcGVuSm9iOiByZXR1cm4gJTA0eFxuIiwgaEhhbmRsZSk7CisgICAgVFJBQ0Uod2luMTZkcnYsICJyZXR1cm4gJTA0eFxuIiwgaEhhbmRsZSk7CiAgICAgcmV0dXJuIGhIYW5kbGU7CiB9CiAKQEAgLTU3Miw3ICs1NzIsNyBAQAogICAgIGludCBuUmV0ID0gU1BfRVJST1I7CiAgICAgUFBSSU5USk9CIHBQcmludEpvYiA9IE5VTEw7CiAKLSAgICBkcHJpbnRmX2luZm8od2luMTZkcnYsICJDbG9zZUpvYjogJTA0eFxuIiwgaEpvYik7CisgICAgVFJBQ0Uod2luMTZkcnYsICIlMDR4XG4iLCBoSm9iKTsKIAogICAgIHBQcmludEpvYiA9IEZpbmRQcmludEpvYkZyb21IYW5kbGUoaEpvYik7CiAgICAgaWYgKHBQcmludEpvYiAhPSBOVUxMKQpAQCAtNTkwLDcgKzU5MCw3IEBACiAgICAgaW50IG5SZXQgPSBTUF9FUlJPUjsKICAgICBQUFJJTlRKT0IgcFByaW50Sm9iID0gTlVMTDsKIAotICAgIGRwcmludGZfaW5mbyh3aW4xNmRydiwgIldyaXRlU3Bvb2w6ICUwNHggJTA4bHggJTA0eFxuIiwgaEpvYiwgKERXT1JEKWxwRGF0YSwgY2NoKTsKKyAgICBUUkFDRSh3aW4xNmRydiwgIiUwNHggJTA4bHggJTA0eFxuIiwgaEpvYiwgKERXT1JEKWxwRGF0YSwgY2NoKTsKIAogICAgIHBQcmludEpvYiA9IEZpbmRQcmludEpvYkZyb21IYW5kbGUoaEpvYik7CiAgICAgaWYgKHBQcmludEpvYiAhPSBOVUxMICYmIHBQcmludEpvYi0+ZmQgPj0gMCAmJiBjY2gpCkBAIC02MDcsNyArNjA3LDcgQEAKIHsKICAgICBpbnQgblJldCA9IDA7CiAKLSAgICBkcHJpbnRmX2luZm8od2luMTZkcnYsICJXcml0ZURpYWxvZzogJTA0eCAlMDR4IFwiJXNcIlxuIiwgaEpvYiwgIGNjaE1zZywgbHBNc2cpOworICAgIFRSQUNFKHdpbjE2ZHJ2LCAiJTA0eCAlMDR4ICclcydcbiIsIGhKb2IsICBjY2hNc2csIGxwTXNnKTsKIAogICAgIG5SZXQgPSBNZXNzYWdlQm94MTYoMCwgbHBNc2csICJQcmludGluZyBFcnJvciIsIE1CX09LQ0FOQ0VMKTsKICAgICByZXR1cm4gblJldDsKQEAgLTYxNyw3ICs2MTcsNyBAQAogewogICAgIGludCBuUmV0OwogCi0gICAgZHByaW50Zl9pbmZvKHdpbjE2ZHJ2LCAiRGVsZXRlSm9iOiAlMDR4XG4iLCBoSm9iKTsKKyAgICBUUkFDRSh3aW4xNmRydiwgIiUwNHhcbiIsIGhKb2IpOwogCiAgICAgblJldCA9IEZyZWVQcmludEpvYihoSm9iKTsKICAgICByZXR1cm4gblJldDsKQEAgLTYzMCwxMyArNjMwLDEzIEBACiAgKi8KIGludCBXSU5BUEkgU3RhcnRTcG9vbFBhZ2UoSEFORExFMTYgaEpvYikKIHsKLSAgICBkcHJpbnRmX2ZpeG1lKHdpbjE2ZHJ2LCAiU3RhcnRTcG9vbFBhZ2UgR0RJLjI0NiB1bmltcGxlbWVudGVkXG4iKTsKKyAgICBGSVhNRSh3aW4xNmRydiwgIlN0YXJ0U3Bvb2xQYWdlIEdESS4yNDYgdW5pbXBsZW1lbnRlZFxuIik7CiAgICAgcmV0dXJuIDE7CiAKIH0KIGludCBXSU5BUEkgRW5kU3Bvb2xQYWdlKEhBTkRMRTE2IGhKb2IpCiB7Ci0gICAgZHByaW50Zl9maXhtZSh3aW4xNmRydiwgIkVuZFNwb29sUGFnZSBHREkuMjQ3IHVuaW1wbGVtZW50ZWRcbiIpOworICAgIEZJWE1FKHdpbjE2ZHJ2LCAiRW5kU3Bvb2xQYWdlIEdESS4yNDcgdW5pbXBsZW1lbnRlZFxuIik7CiAgICAgcmV0dXJuIDE7CiB9CiAKQEAgLTY0NCw2ICs2NDQsNiBAQAogRFdPUkQgV0lOQVBJIEdldFNwb29sSm9iKGludCBuT3B0aW9uLCBMT05HIHBhcmFtKQogewogICAgIERXT1JEIHJldHZhbCA9IDA7Ci0gICAgZHByaW50Zl9pbmZvKHdpbjE2ZHJ2LCAiSW4gR2V0U3Bvb2xKb2IgcGFyYW0gMHglbHggbm9wdGlvbiAlZFxuIixwYXJhbSwgbk9wdGlvbik7CisgICAgVFJBQ0Uod2luMTZkcnYsICJJbiBHZXRTcG9vbEpvYiBwYXJhbSAweCVseCBub3B0aW9uICVkXG4iLHBhcmFtLCBuT3B0aW9uKTsKICAgICByZXR1cm4gcmV0dmFsOwogfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3Mvd2luMTZkcnYvb2JqZWN0cy5jIGIvZ3JhcGhpY3Mvd2luMTZkcnYvb2JqZWN0cy5jCmluZGV4IGE5YTllNmUuLjcwOWJkODAgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3dpbjE2ZHJ2L29iamVjdHMuYworKysgYi9ncmFwaGljcy93aW4xNmRydi9vYmplY3RzLmMKQEAgLTMxLDcgKzMxLDcgQEAKICAgICBIR0RJT0JKMzIgcmV0ID0gMDsKIAogICAgIGlmICghcHRyKSByZXR1cm4gMDsKLSAgICBkcHJpbnRmX2luZm8oZ2RpLCAiU2VsZWN0T2JqZWN0OiBoZGM9JTA0eCAlMDR4XG4iLCBkYy0+aFNlbGYsIGhhbmRsZSApOworICAgIFRSQUNFKGdkaSwgImhkYz0lMDR4ICUwNHhcbiIsIGRjLT5oU2VsZiwgaGFuZGxlICk7CiAgICAgCiAgICAgc3dpdGNoKHB0ci0+d01hZ2ljKQogICAgIHsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3dpbjE2ZHJ2L3Blbi5jIGIvZ3JhcGhpY3Mvd2luMTZkcnYvcGVuLmMKaW5kZXggNDU5ZGNmZS4uODI3MWY3NCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3Mvd2luMTZkcnYvcGVuLmMKKysrIGIvZ3JhcGhpY3Mvd2luMTZkcnYvcGVuLmMKQEAgLTIwLDcgKzIwLDcgQEAKICAgICBpbnQJCSBuU2l6ZTsKICAgICBMT0dQRU4xNiAJIGxQZW4xNjsKICAgICBkYy0+dy5oUGVuID0gaHBlbjsKLSAgICBkcHJpbnRmX2luZm8od2luMTZkcnYsICJJbiBXSU4xNkRSVl9QRU5fU2VsZWN0T2JqZWN0XG4iKTsKKyAgICBUUkFDRSh3aW4xNmRydiwgIkluIFdJTjE2RFJWX1BFTl9TZWxlY3RPYmplY3RcbiIpOwogICAgIGxQZW4xNi5sb3BuU3R5bGUgICA9IHBlbi0+bG9ncGVuLmxvcG5TdHlsZTsKICAgICBsUGVuMTYubG9wbldpZHRoLnggPSBwZW4tPmxvZ3Blbi5sb3BuV2lkdGgueDsKICAgICBsUGVuMTYubG9wbldpZHRoLnkgPSBwZW4tPmxvZ3Blbi5sb3BuV2lkdGgueTsKQEAgLTI4LDcgKzI4LDcgQEAKIAogICAgIGlmICggcGh5c0Rldi0+UGVuSW5mbyApCiAgICAgewotICAgICAgICBkcHJpbnRmX2luZm8od2luMTZkcnYsICJVblJlYWxpemluZyBQZW5JbmZvXG4iKTsKKyAgICAgICAgVFJBQ0Uod2luMTZkcnYsICJVblJlYWxpemluZyBQZW5JbmZvXG4iKTsKICAgICAgICAgblNpemUgPSBQUlREUlZfUmVhbGl6ZU9iamVjdCAocGh5c0Rldi0+c2VncHRyUERFVklDRSwgLURSVk9CSl9QRU4sCiAJCQkJICAgICAgcGh5c0Rldi0+UGVuSW5mbywKIAkJCQkgICAgICBwaHlzRGV2LT5QZW5JbmZvLCAwKTsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3dpbjE2ZHJ2L3BydGRydi5jIGIvZ3JhcGhpY3Mvd2luMTZkcnYvcHJ0ZHJ2LmMKaW5kZXggYzY4NmEwYS4uNjk2OGYwOSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3Mvd2luMTZkcnYvcHJ0ZHJ2LmMKKysrIGIvZ3JhcGhpY3Mvd2luMTZkcnYvcHJ0ZHJ2LmMKQEAgLTU1LDcgKzU1LDcgQEAKICAgICAgIExvYWRQcmludGVyRHJ2RnVuYyhBRFZBTkNFRFNFVFVQRElBTE9HKTsKICAgICAgIExvYWRQcmludGVyRHJ2RnVuYyhESUFMT0dGTik7CiAgICAgICBMb2FkUHJpbnRlckRydkZ1bmMoUFNFVURPRURJVCk7Ci0gICAgICBkcHJpbnRmX2luZm8od2luMTZkcnYsImdvdCBmdW5jIENPTlRST0wgMHglcCBlbmFibGUgMHglcCBlbnVtRGZvbnRzIDB4JXAgcmVhbGl6ZW9iamVjdCAweCVwIGV4dGV4dG91dCAweCVwXG4iLAorICAgICAgVFJBQ0Uod2luMTZkcnYsImdvdCBmdW5jIENPTlRST0wgMHglcCBlbmFibGUgMHglcCBlbnVtRGZvbnRzIDB4JXAgcmVhbGl6ZW9iamVjdCAweCVwIGV4dGV4dG91dCAweCVwXG4iLAogICAgICAgICAgICAgICBwTFBELT5mbltGVU5DX0NPTlRST0xdLAogICAgICAgICAgICAgICBwTFBELT5mbltGVU5DX0VOQUJMRV0sCiAgICAgICAgICAgICAgIHBMUEQtPmZuW0ZVTkNfRU5VTURGT05UU10sCkBAIC03OCw3ICs3OCw3IEBACiAJcHRtcExQRCA9IGdhcExvYWRlZFByaW50ZXJEcml2ZXJzW25Ecml2ZXJTbG90KytdOwogCWlmIChwdG1wTFBEICE9IE5VTEwpCiAJewotCSAgICBkcHJpbnRmX2luZm8od2luMTZkcnYsICJDb21wYXJpbmcgJXMsJXNcbiIscHRtcExQRC0+c3pEcml2ZXIscHN6RHJpdmVyKTsKKwkgICAgVFJBQ0Uod2luMTZkcnYsICJDb21wYXJpbmcgJXMsJXNcbiIscHRtcExQRC0+c3pEcml2ZXIscHN6RHJpdmVyKTsKIAkgICAgLyogRm91bmQgZHJpdmVyIHN0b3JlIGluZm8sIGV4aXQgbG9vcCAqLwogCSAgICBpZiAobHN0cmNtcGkzMkEocHRtcExQRC0+c3pEcml2ZXIsIHBzekRyaXZlcikgPT0gMCkKIAkgICAgICBwTFBEID0gcHRtcExQRDsKQEAgLTE1MCw3ICsxNTAsNyBAQAogCS8qIEZhaWxlZCB0byBsb2FkIGRyaXZlciAqLwogCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGxvYWQgcHJpbnRlciBkcml2ZXIgJXNcbiIsIHBzekRyaXZlcik7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgZHByaW50Zl9pbmZvKHdpbjE2ZHJ2LCAiTG9hZGVkIHRoZSBsaWJyYXJ5XG4iKTsKKyAgICAgICAgVFJBQ0Uod2luMTZkcnYsICJMb2FkZWQgdGhlIGxpYnJhcnlcbiIpOwogCS8qIEFsbG9jYXRlIHNvbWUgbWVtb3J5IGZvciBwcmludGVyIGRyaXZlciBpbmZvICovCiAJcExQRCA9IG1hbGxvYyhzaXplb2YoTE9BREVEX1BSSU5URVJfRFJJVkVSKSk7CiAJbWVtc2V0KHBMUEQsIDAgLCBzaXplb2YoTE9BREVEX1BSSU5URVJfRFJJVkVSKSk7CkBAIC0xNjEsNyArMTYxLDcgQEAKIAkvKiBHZXQgRFMgZm9yIHRoZSBwcmludGVyIG1vZHVsZSAqLwogCXBMUEQtPmRzX3JlZwk9IGhJbnN0OwogCi0JZHByaW50Zl9pbmZvKHdpbjE2ZHJ2LCAiRFMgZm9yICVzIGlzICV4XG4iLCBwc3pEcml2ZXIsIHBMUEQtPmRzX3JlZyk7CisJVFJBQ0Uod2luMTZkcnYsICJEUyBmb3IgJXMgaXMgJXhcbiIsIHBzekRyaXZlciwgcExQRC0+ZHNfcmVnKTsKIAogCS8qIEdldCBhZGRyZXNzIG9mIHByaW50ZXIgZHJpdmVyIGZ1bmN0aW9ucyAqLwogCUdldFByaW50ZXJEcml2ZXJGdW5jdGlvbnMoaEluc3QsIHBMUEQpOwpAQCAtMTg4LDIwICsxODgsMjAgQEAKICAgICBXT1JEIHdSZXQgPSAwOwogICAgIExPQURFRF9QUklOVEVSX0RSSVZFUiAqcExQRCA9IE5VTEw7CiAKLSAgICBkcHJpbnRmX2luZm8od2luMTZkcnYsICJQUlREUlZfQ29udHJvbDogJTA4eCAweCV4ICUwOGx4ICUwOGx4XG4iLCAodW5zaWduZWQgaW50KWxwRGVzdERldiwgd2Z1bmN0aW9uLCBscEluRGF0YSwgbHBPdXREYXRhKTsKKyAgICBUUkFDRSh3aW4xNmRydiwgIiUwOHggMHgleCAlMDhseCAlMDhseFxuIiwgKHVuc2lnbmVkIGludClscERlc3REZXYsIHdmdW5jdGlvbiwgbHBJbkRhdGEsIGxwT3V0RGF0YSk7CiAKICAgICBpZiAoKHBMUEQgPSBGaW5kUHJpbnRlckRyaXZlckZyb21QREVWSUNFKGxwRGVzdERldikpICE9IE5VTEwpCiAgICAgewogCWlmIChwTFBELT5mbltGVU5DX0NPTlRST0xdID09IE5VTEwpCiAJewotCSAgICBkcHJpbnRmX3dhcm4od2luMTZkcnYsICJQUlREUlZfQ29udHJvbDogTm90IHN1cHBvcnRlZCBieSBkcml2ZXJcbiIpOworCSAgICBXQVJOKHdpbjE2ZHJ2LCAiTm90IHN1cHBvcnRlZCBieSBkcml2ZXJcbiIpOwogCSAgICByZXR1cm4gMDsKIAl9CiAJd1JldCA9IENhbGxiYWNrcy0+Q2FsbERydkNvbnRyb2xQcm9jKCBwTFBELT5mbltGVU5DX0NPTlRST0xdLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU0VHUFRSKWxwRGVzdERldiwgd2Z1bmN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwSW5EYXRhLCBscE91dERhdGEgKTsKICAgICB9Ci0gICAgZHByaW50Zl9pbmZvKHdpbjE2ZHJ2LCAiUFJURFJWX0NvbnRyb2w6IHJldHVybiAleFxuIiwgd1JldCk7CisgICAgVFJBQ0Uod2luMTZkcnYsICJyZXR1cm4gJXhcbiIsIHdSZXQpOwogICAgIHJldHVybiB3UmV0OwogfQogCkBAIC0yMTQsNyArMjE0LDcgQEAKICAgICBXT1JEIHdSZXQgPSAwOwogICAgIExPQURFRF9QUklOVEVSX0RSSVZFUiAqcExQRCA9IE5VTEw7CiAKLSAgICBkcHJpbnRmX2luZm8od2luMTZkcnYsICJQUlREUlZfRW5hYmxlOiAlcyAlc1xuIixscERlc3REZXZUeXBlLCBscE91dHB1dEZpbGUpOworICAgIFRSQUNFKHdpbjE2ZHJ2LCAiJXMgJXNcbiIsbHBEZXN0RGV2VHlwZSwgbHBPdXRwdXRGaWxlKTsKIAogICAgIC8qIEdldCB0aGUgcHJpbnRlciBkcml2ZXIgaW5mbyAqLwogICAgIGlmICh3U3R5bGUgPT0gSU5JVFBERVZJQ0UpCkBAIC0yMjgsNyArMjI4LDcgQEAKIAlXT1JECQl3UDI7CiAKIAlpZiAoIXBMUEQtPmZuW0ZVTkNfRU5BQkxFXSkgewotCSAgICBkcHJpbnRmX3dhcm4od2luMTZkcnYsICJQUlREUlZfRW5hYmxlOiBOb3Qgc3VwcG9ydGVkIGJ5IGRyaXZlclxuIik7CisJICAgIFdBUk4od2luMTZkcnYsICJOb3Qgc3VwcG9ydGVkIGJ5IGRyaXZlclxuIik7CiAJICAgIHJldHVybiAwOwogCX0KIApAQCAtMjU5LDcgKzI1OSw3IEBACiAJICAgIFNFR1BUUl9GUkVFKGxQMSk7CiAJfQogICAgIH0KLSAgICBkcHJpbnRmX2luZm8od2luMTZkcnYsICJQUlREUlZfRW5hYmxlOiByZXR1cm4gJXhcbiIsIHdSZXQpOworICAgIFRSQUNFKHdpbjE2ZHJ2LCAicmV0dXJuICV4XG4iLCB3UmV0KTsKICAgICByZXR1cm4gd1JldDsKIH0KIApAQCAtMjczLDcgKzI3Myw3IEBACiAgICAgV09SRCB3UmV0ID0gMDsKICAgICBMT0FERURfUFJJTlRFUl9EUklWRVIgKnBMUEQgPSBOVUxMOwogCi0gICAgZHByaW50Zl9pbmZvKHdpbjE2ZHJ2LCAiUFJURFJWX0VudW1ERm9udHM6ICUwOGx4ICVzICVwICVwXG4iLAorICAgIFRSQUNFKHdpbjE2ZHJ2LCAiJTA4bHggJXMgJXAgJXBcbiIsCiAJCSAgICAgbHBEZXN0RGV2LCBscEZhY2VOYW1lLCBscENhbGxiYWNrRnVuYywgbHBDbGllbnREYXRhKTsKIAogICAgIGlmICgocExQRCA9IEZpbmRQcmludGVyRHJpdmVyRnJvbVBERVZJQ0UobHBEZXN0RGV2KSkgIT0gTlVMTCkKQEAgLTI4Miw3ICsyODIsNyBAQAogCUxQQllURSBsUDI7CiAKIAlpZiAocExQRC0+Zm5bRlVOQ19FTlVNREZPTlRTXSA9PSBOVUxMKSB7Ci0JICAgIGRwcmludGZfd2Fybih3aW4xNmRydiwgIlBSVERSVl9FbnVtREZvbnRzOiBOb3Qgc3VwcG9ydGVkIGJ5IGRyaXZlclxuIik7CisJICAgIFdBUk4od2luMTZkcnYsICJOb3Qgc3VwcG9ydGVkIGJ5IGRyaXZlclxuIik7CiAJICAgIHJldHVybiAwOwogCX0KIApAQCAtMjk5LDcgKzI5OSw3IEBACiAgICAgfSBlbHNlIAogICAgICAgICBmcHJpbnRmKHN0ZGVyciwiRmFpbGVkIHRvIGZpbmQgZGV2aWNlXG4iKTsKICAgICAKLSAgICBkcHJpbnRmX2luZm8od2luMTZkcnYsICJQUlREUlZfRW51bURGb250czogcmV0dXJuICV4XG4iLCB3UmV0KTsKKyAgICBUUkFDRSh3aW4xNmRydiwgInJldHVybiAleFxuIiwgd1JldCk7CiAgICAgcmV0dXJuIHdSZXQ7CiB9CiAvKgpAQCAtMzExLDcgKzMxMSw3IEBACiAgICAgV09SRCB3UmV0ID0gMDsKICAgICBMT0FERURfUFJJTlRFUl9EUklWRVIgKnBMUEQgPSBOVUxMOwogCi0gICAgZHByaW50Zl9pbmZvKHdpbjE2ZHJ2LCAiUFJURFJWX0VudW1PYmo6XG4iKTsKKyAgICBUUkFDRSh3aW4xNmRydiwgIihzb21lIHBhcmFtcyAtIGZpeG1lKVxuIik7CiAKICAgICBpZiAoKHBMUEQgPSBGaW5kUHJpbnRlckRyaXZlckZyb21QREVWSUNFKGxwRGVzdERldikpICE9IE5VTEwpCiAgICAgewpAQCAtMzIxLDcgKzMyMSw3IEBACiAKIAlpZiAocExQRC0+Zm5bRlVOQ19FTlVNT0JKXSA9PSBOVUxMKQogCXsKLQkgICAgZHByaW50Zl93YXJuKHdpbjE2ZHJ2LCAiUFJURFJWX0VudW1PYmo6IE5vdCBzdXBwb3J0ZWQgYnkgZHJpdmVyXG4iKTsKKwkgICAgV0FSTih3aW4xNmRydiwgIk5vdCBzdXBwb3J0ZWQgYnkgZHJpdmVyXG4iKTsKIAkgICAgcmV0dXJuIDA7CiAJfQogCkBAIC0zNDIsNyArMzQyLDcgQEAKICAgICBlbHNlIAogICAgICAgICBmcHJpbnRmKHN0ZGVyciwiRmFpbGVkIHRvIGZpbmQgZGV2aWNlXG4iKTsKICAgICAKLSAgICBkcHJpbnRmX2luZm8od2luMTZkcnYsICJQUlREUlZfRW51bU9iajogcmV0dXJuICV4XG4iLCB3UmV0KTsKKyAgICBUUkFDRSh3aW4xNmRydiwgInJldHVybiAleFxuIiwgd1JldCk7CiAgICAgcmV0dXJuIHdSZXQ7CiB9CiAKQEAgLTM2MSw3ICszNjEsNyBAQAogICAgIFdPUkQgd1JldCA9IDA7CiAgICAgTE9BREVEX1BSSU5URVJfRFJJVkVSICpwTFBEID0gTlVMTDsKICAgICAKLSAgICBkcHJpbnRmX2luZm8od2luMTZkcnYsICJQUlREUlZfT1VUUFVUICVkXG4iLCB3U3R5bGUgKTsKKyAgICBUUkFDRSh3aW4xNmRydiwgIlBSVERSVl9PVVRQVVQgJWRcbiIsIHdTdHlsZSApOwogICAgIAogICAgIGlmICgocExQRCA9IEZpbmRQcmludGVyRHJpdmVyRnJvbVBERVZJQ0UobHBEZXN0RGV2KSkgIT0gTlVMTCkKICAgICB7CkBAIC0zNzIsNyArMzcyLDcgQEAKIAlpbnQgICBuU2l6ZTsKIAlpZiAocExQRC0+Zm5bRlVOQ19PVVRQVVRdID09IE5VTEwpCiAJewotCSAgICBkcHJpbnRmX3dhcm4od2luMTZkcnYsICJQUlREUlZfT3V0cHV0OiBOb3Qgc3VwcG9ydGVkIGJ5IGRyaXZlclxuIik7CisJICAgIFdBUk4od2luMTZkcnYsICJOb3Qgc3VwcG9ydGVkIGJ5IGRyaXZlclxuIik7CiAJICAgIHJldHVybiAwOwogCX0KIApAQCAtNDE1LDcgKzQxNSw3IEBACiAJICAgICAgICB7CiAJCSAgICBDT05WX1JFQ1QzMlRPMTYoIHBSZWN0LCBsUDggKTsKIAotCQkgICAgZHByaW50Zl9pbmZvKHdpbjE2ZHJ2LCAicmVjdCA9ICVkLCVkIC0gJWQsJWRcbiIsCisJCSAgICBUUkFDRSh3aW4xNmRydiwgInJlY3QgPSAlZCwlZCAtICVkLCVkXG4iLAogCQkJICAgIGxQOC0+bGVmdCwgbFA4LT50b3AsIGxQOC0+cmlnaHQsIGxQOC0+Ym90dG9tICk7CiAJCSAgICB3UmV0ID0gQ2FsbGJhY2tzLT5DYWxsRHJ2T3V0cHV0UHJvYyhwTFBELT5mbltGVU5DX09VVFBVVF0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsUDEsIHdQMiwgd1AzLCBTRUdQVFJfR0VUKGxQNCksCkBAIC00MzMsNyArNDMzLDcgQEAKIAl9CiAgICAgICAgIFNFR1BUUl9GUkVFKGxQNCk7CiAgICAgfQotICAgIGRwcmludGZfaW5mbyh3aW4xNmRydiwgIlBSVERSVl9PdXRwdXQgcmV0dXJuICVkXG4iLCB3UmV0KTsKKyAgICBUUkFDRSh3aW4xNmRydiwgIlBSVERSVl9PdXRwdXQgcmV0dXJuICVkXG4iLCB3UmV0KTsKICAgICByZXR1cm4gd1JldDsKIH0KIApAQCAtNDQ3LDkgKzQ0Nyw4IEBACiAgICAgV09SRCBkd1JldCA9IDA7CiAgICAgTE9BREVEX1BSSU5URVJfRFJJVkVSICpwTFBEID0gTlVMTDsKICAgICAKLSAgICBkcHJpbnRmX2luZm8od2luMTZkcnYsCi0JCSAgICAgIlBSVERSVl9SZWFsaXplT2JqZWN0OiAlMDhseCAlMDR4ICVwICVwICUwOGx4XG4iLAotCQkgICAgIGxwRGVzdERldiwgd1N0eWxlLCBscEluT2JqLCBscE91dE9iaiwgbHBUZXh0WEZvcm0pOworICAgIFRSQUNFKHdpbjE2ZHJ2LCAiJTA4bHggJTA0eCAlcCAlcCAlMDhseFxuIiwKKwkJIGxwRGVzdERldiwgd1N0eWxlLCBscEluT2JqLCBscE91dE9iaiwgbHBUZXh0WEZvcm0pOwogICAgIAogICAgIGlmICgocExQRCA9IEZpbmRQcmludGVyRHJpdmVyRnJvbVBERVZJQ0UobHBEZXN0RGV2KSkgIT0gTlVMTCkKICAgICB7CkBAIC00NjAsOCArNDU5LDcgQEAKIAogCWlmIChwTFBELT5mbltGVU5DX1JFQUxJWkVPQkpFQ1RdID09IE5VTEwpCiAJewotCSAgICBkcHJpbnRmX3dhcm4od2luMTZkcnYsCi0JCQkgICAgIlBSVERSVl9SZWFsaXplT2JqZWN0OiBOb3Qgc3VwcG9ydGVkIGJ5IGRyaXZlclxuIik7CisJICAgIFdBUk4od2luMTZkcnYsICJOb3Qgc3VwcG9ydGVkIGJ5IGRyaXZlclxuIik7CiAJICAgIHJldHVybiAwOwogCX0KIApAQCAtNTA2LDE2ICs1MDQsMTUgQEAKIAlsUDQgPSBTRUdQVFJfR0VUKCBscE91dE9iaiApOwogCiAgICAgICAgIGxQNSA9IGxwVGV4dFhGb3JtOwotCWRwcmludGZfaW5mbyh3aW4xNmRydiwKLQkJCSAiQ2FsbGluZyBSZWFsaXplICUwOGx4ICUwNHggJTA4bHggJTA4bHggJTA4bHhcbiIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsUDEsIHdQMiwgbFAzLCBsUDQsIGxQNSk7CisJVFJBQ0Uod2luMTZkcnYsICJDYWxsaW5nIFJlYWxpemUgJTA4bHggJTA0eCAlMDhseCAlMDhseCAlMDhseFxuIiwKKwkJICAgICBsUDEsIHdQMiwgbFAzLCBsUDQsIGxQNSk7CiAJZHdSZXQgPSBDYWxsYmFja3MtPkNhbGxEcnZSZWFsaXplUHJvYyhwTFBELT5mbltGVU5DX1JFQUxJWkVPQkpFQ1RdLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsUDEsIHdQMiwgbFAzLCBsUDQsIGxQNSk7CiAJaWYobHBCdWYpCiAJICAgIFNFR1BUUl9GUkVFKGxwQnVmKTsKIAogICAgIH0KLSAgICBkcHJpbnRmX2luZm8od2luMTZkcnYsICJQUlREUlZfUmVhbGl6ZU9iamVjdDogcmV0dXJuICV4XG4iLCBkd1JldCk7CisgICAgVFJBQ0Uod2luMTZkcnYsICJyZXR1cm4gJXhcbiIsIGR3UmV0KTsKICAgICByZXR1cm4gZHdSZXQ7CiB9CiAKQEAgLTUzNiw3ICs1MzMsNyBAQAogICAgIFdPUkQgd1JldCA9IDA7CiAgICAgTE9BREVEX1BSSU5URVJfRFJJVkVSICpwTFBEID0gTlVMTDsKICAgICAKLSAgICBkcHJpbnRmX2luZm8od2luMTZkcnYsICJQUlREUlZfU3RyZXRjaEJsdDpcbiIpOworICAgIFRSQUNFKHdpbjE2ZHJ2LCAiKGxvdHMgb2YgcGFyYW1zIC0gZml4bWUpXG4iKTsKICAgICAKICAgICBpZiAoKHBMUEQgPSBGaW5kUHJpbnRlckRyaXZlckZyb21QREVWSUNFKGxwRGVzdERldikpICE9IE5VTEwpCiAgICAgewpAQCAtNTQ2LDcgKzU0Myw3IEBACiAKIAlpZiAocExQRC0+Zm5bRlVOQ19TVFJFVENIQkxUXSA9PSBOVUxMKQogCXsKLQkgICAgZHByaW50Zl93YXJuKHdpbjE2ZHJ2LCAiUFJURFJWX1N0cmV0Y2hCbHQ6IE5vdCBzdXBwb3J0ZWQgYnkgZHJpdmVyXG4iKTsKKwkgICAgV0FSTih3aW4xNmRydiwgIk5vdCBzdXBwb3J0ZWQgYnkgZHJpdmVyXG4iKTsKIAkgICAgcmV0dXJuIDA7CiAJfQogCWxQMSAgPSBscERlc3REZXY7CkBAIC01OTAsNyArNTg3LDcgQEAKICAgICBEV09SRCBkd1JldCA9IDA7CiAgICAgTE9BREVEX1BSSU5URVJfRFJJVkVSICpwTFBEID0gTlVMTDsKICAgICAKLSAgICBkcHJpbnRmX2luZm8od2luMTZkcnYsICJQUlREUlZfRXh0VGV4dE91dDpcbiIpOworICAgIFRSQUNFKHdpbjE2ZHJ2LCAiKGxvdHMgb2YgcGFyYW1zIC0gZml4bWUpXG4iKTsKICAgICAKICAgICBpZiAoKHBMUEQgPSBGaW5kUHJpbnRlckRyaXZlckZyb21QREVWSUNFKGxwRGVzdERldikpICE9IE5VTEwpCiAgICAgewpAQCAtNjAzLDcgKzYwMCw3IEBACiAKIAlpZiAocExQRC0+Zm5bRlVOQ19FWFRURVhUT1VUXSA9PSBOVUxMKQogCXsKLQkgICAgZHByaW50Zl93YXJuKHdpbjE2ZHJ2LCAiUFJURFJWX0V4dFRleHRPdXQ6IE5vdCBzdXBwb3J0ZWQgYnkgZHJpdmVyXG4iKTsKKwkgICAgV0FSTih3aW4xNmRydiwgIk5vdCBzdXBwb3J0ZWQgYnkgZHJpdmVyXG4iKTsKIAkgICAgcmV0dXJuIDA7CiAJfQogCkBAIC02MTMsNyArNjEwLDcgQEAKIAkKIAlpZiAobHBDbGlwUmVjdCAhPSBOVUxMKSB7CiAJICAgIGxQNCA9IFNFR1BUUl9ORVcoUkVDVDE2KTsKLSAgICAgICAgICAgIGRwcmludGZfaW5mbyh3aW4xNmRydiwgIkFkZGluZyBscENsaXBSZWN0XG4iKTsKKyAgICAgICAgICAgIFRSQUNFKHdpbjE2ZHJ2LCAiQWRkaW5nIGxwQ2xpcFJlY3RcbiIpOwogCSAgICBtZW1jcHkobFA0LGxwQ2xpcFJlY3Qsc2l6ZW9mKFJFQ1QxNikpOwogCX0gZWxzZQogCSAgbFA0ID0gMEw7CkBAIC02MjMsNyArNjIwLDcgQEAKIAkgICAgaWYgKG5TaXplPmFicyh3Q291bnQpKQogCSAgICAJblNpemUgPSBhYnMod0NvdW50KTsKIAkgICAgbFA1ID0gU0VHUFRSX0FMTE9DKG5TaXplKzEpOwotICAgICAgICAgICAgZHByaW50Zl9pbmZvKHdpbjE2ZHJ2LCAiQWRkaW5nIGxwU3RyaW5nIChuU2l6ZSBpcyAlZClcbiIsblNpemUpOworICAgICAgICAgICAgVFJBQ0Uod2luMTZkcnYsICJBZGRpbmcgbHBTdHJpbmcgKG5TaXplIGlzICVkKVxuIixuU2l6ZSk7CiAJICAgIG1lbWNweShsUDUsbHBTdHJpbmcsblNpemUpOwogCSAgICAqKChjaGFyICopbFA1ICsgblNpemUpID0gJ1wwJzsKIAl9IGVsc2UKQEAgLTYzNywyMSArNjM0LDIzIEBACiAgICAgICAgIGxQOSA9IGxwVGV4dFhGb3JtOwogCQogCWlmIChscENoYXJXaWR0aHMgIT0gTlVMTCkgCi0JICBkcHJpbnRmX2ZpeG1lKHdpbjE2ZHJ2LCAiUFJURFJWX0V4dFRleHRPdXQ6IENoYXIgd2lkdGhzIG5vdCBzdXBwb3J0ZWRcbiIpOworCSAgRklYTUUod2luMTZkcnYsICJDaGFyIHdpZHRocyBub3Qgc3VwcG9ydGVkXG4iKTsKIAlsUDEwID0gMDsKIAkKIAlpZiAobHBPcGFxdWVSZWN0ICE9IE5VTEwpIHsKIAkgICAgbFAxMSA9IFNFR1BUUl9ORVcoUkVDVDE2KTsKLSAgICAgICAgICAgIGRwcmludGZfaW5mbyh3aW4xNmRydiwgIkFkZGluZyBscE9wYXF1ZVJlY3RcbiIpOworICAgICAgICAgICAgVFJBQ0Uod2luMTZkcnYsICJBZGRpbmcgbHBPcGFxdWVSZWN0XG4iKTsKIAkgICAgbWVtY3B5KGxQMTEsbHBPcGFxdWVSZWN0LHNpemVvZihSRUNUMTYpKTsJCiAJfSBlbHNlCiAJICBsUDExID0gMEw7CiAJCiAJd1AxMiA9IHdPcHRpb25zOwotCWRwcmludGZfaW5mbyh3aW4xNmRydiwgIkNhbGxpbmcgRXh0VGV4dE91dCAweCVseCAweCV4IDB4JXggJXBcbiUqcyAweCV4IDB4JWx4IDB4JWx4XG4iCi0gICAgICAgICAgICAgICAiMHglbHggMHglbHggJXAgMHgleFxuIixsUDEsIHdQMiwgd1AzLCBsUDQsIAotCQkJCQkgICBuU2l6ZSxsUDUsIGlQNiwgbFA3LCBsUDgsIGxQOSwgbFAxMCwKLQkJCQkJICAgbFAxMSwgd1AxMik7CisJVFJBQ0Uod2luMTZkcnYsICJDYWxsaW5nIEV4dFRleHRPdXQgMHglbHggMHgleCAweCV4ICVwXG4iLAorCQkgICAgIGxQMSwgd1AyLCB3UDMsIGxQNCk7CisgICAgICAgIFRSQUNFKHdpbjE2ZHJ2LCAiJSpzIDB4JXggMHglbHggMHglbHhcbiIsCisJCSAgICAgblNpemUsbFA1LCBpUDYsIGxQNywgbFA4KTsKKyAgICAgICAgVFJBQ0Uod2luMTZkcnYsICIweCVseCAweCVseCAlcCAweCV4XG4iLAorCQkgICAgIGxQOSwgbFAxMCwgbFAxMSwgd1AxMik7CiAJZHdSZXQgPSBDYWxsYmFja3MtPkNhbGxEcnZFeHRUZXh0T3V0UHJvYyhwTFBELT5mbltGVU5DX0VYVFRFWFRPVVRdLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsUDEsIHdQMiwgd1AzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFR1BUUl9HRVQobFA0KSwKQEAgLTY1OSw3ICs2NTgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxQOCwgbFA5LCBsUDEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFR1BUUl9HRVQobFAxMSksIHdQMTIpOwogICAgIH0KLSAgICBkcHJpbnRmX2luZm8od2luMTZkcnYsICJQUlREUlZfRXh0VGV4dE91dDogcmV0dXJuICVseFxuIiwgZHdSZXQpOworICAgIFRSQUNFKHdpbjE2ZHJ2LCAicmV0dXJuICVseFxuIiwgZHdSZXQpOwogICAgIHJldHVybiBkd1JldDsKIH0KIApAQCAtNzU2LDcgKzc1NSw3IEBACiAgICAgV09SRCB3UmV0ID0gMDsKICAgICBMT0FERURfUFJJTlRFUl9EUklWRVIgKnBMUEQgPSBOVUxMOwogICAgIAotICAgIGRwcmludGZfaW5mbyh3aW4xNmRydiwgIlBSVERSVl9HZXRDaGFyV2lkdGg6XG4iKTsKKyAgICBUUkFDRSh3aW4xNmRydiwgIihsb3RzIG9mIHBhcmFtcyAtIGZpeG1lKVxuIik7CiAgICAgCiAgICAgaWYgKChwTFBEID0gRmluZFByaW50ZXJEcml2ZXJGcm9tUERFVklDRShscERlc3REZXYpKSAhPSBOVUxMKQogICAgIHsKQEAgLTc2Niw4ICs3NjUsNyBAQAogCQogCWlmIChwTFBELT5mbltGVU5DX0dFVENIQVJXSURUSF0gPT0gTlVMTCkKIAl7Ci0JICAgIGRwcmludGZfd2Fybih3aW4xNmRydiwKLQkJIlBSVERSVl9HZXRDaGFyV2lkdGg6IE5vdCBzdXBwb3J0ZWQgYnkgZHJpdmVyXG4iKTsKKwkgICAgV0FSTih3aW4xNmRydiwgIk5vdCBzdXBwb3J0ZWQgYnkgZHJpdmVyXG4iKTsKIAkgICAgcmV0dXJuIDA7CiAJfQogCmRpZmYgLS1naXQgYS9ncmFwaGljcy93aW4xNmRydi90ZXh0LmMgYi9ncmFwaGljcy93aW4xNmRydi90ZXh0LmMKaW5kZXggMmJiZDJhYS4uNjA5ZWNhZiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3Mvd2luMTZkcnYvdGV4dC5jCisrKyBiL2dyYXBoaWNzL3dpbjE2ZHJ2L3RleHQuYwpAQCAtMzEsNyArMzEsNyBAQAogICAgIGlmIChjb3VudCA9PSAwKQogICAgICAgcmV0dXJuIEZBTFNFOwogCi0gICAgZHByaW50Zl9pbmZvKHdpbjE2ZHJ2LCAiV0lOMTZEUlZfRXh0VGV4dE91dDogJTA0eCAlZCAlZCAleCAlcCAlKnMgJXBcbiIsCisgICAgVFJBQ0Uod2luMTZkcnYsICIlMDR4ICVkICVkICV4ICVwICUqcyAlcFxuIiwKIAkgICBkYy0+aFNlbGYsIHgsIHksIGZsYWdzLCAgbHByZWN0LCBjb3VudCA+IDAgPyBjb3VudCA6IDgsIHN0ciwgbHBEeCk7CiAKIApAQCAtNTQsNyArNTQsNyBAQAogICAgICAgICAgICAgCiAgICAgICAgIH0KICAgICAgICAgCi0JZHByaW50Zl9pbmZvKHdpbjE2ZHJ2LCAidGV4dGFsaWduID0gJWRcbiIsIGRjLT53LnRleHRBbGlnbik7CisJVFJBQ0Uod2luMTZkcnYsICJ0ZXh0YWxpZ24gPSAlZFxuIiwgZGMtPncudGV4dEFsaWduKTsKIAogCWlmIChkYy0+dy50ZXh0QWxpZ24gJiBUQV9VUERBVEVDUCkKIAl7CmRpZmYgLS1naXQgYS9ncmFwaGljcy94MTFkcnYvYml0Ymx0LmMgYi9ncmFwaGljcy94MTFkcnYvYml0Ymx0LmMKaW5kZXggZDcxY2VmYi4uZGU2ODEwMyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MveDExZHJ2L2JpdGJsdC5jCisrKyBiL2dyYXBoaWNzL3gxMWRydi9iaXRibHQuYwpAQCAtMTExOSwxMiArMTExOSwxMiBAQAogICAgIHdpZHRoRHN0ICA9IHdpZHRoRHN0ICogZGNEc3QtPnZwb3J0RXh0WCAvIGRjRHN0LT53bmRFeHRYOwogICAgIGhlaWdodERzdCA9IGhlaWdodERzdCAqIGRjRHN0LT52cG9ydEV4dFkgLyBkY0RzdC0+d25kRXh0WTsKIAotICAgIGRwcmludGZfaW5mbyhiaXRibHQsICIgICAgdnBvcnRkc3Q9JWQsJWQtJWQsJWQgd25kZHN0PSVkLCVkLSVkLCVkXG4iLAorICAgIFRSQUNFKGJpdGJsdCwgIiAgICB2cG9ydGRzdD0lZCwlZC0lZCwlZCB3bmRkc3Q9JWQsJWQtJWQsJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgIGRjRHN0LT52cG9ydE9yZ1gsIGRjRHN0LT52cG9ydE9yZ1ksCiAgICAgICAgICAgICAgICAgICAgIGRjRHN0LT52cG9ydEV4dFgsIGRjRHN0LT52cG9ydEV4dFksCiAgICAgICAgICAgICAgICAgICAgIGRjRHN0LT53bmRPcmdYLCBkY0RzdC0+d25kT3JnWSwKICAgICAgICAgICAgICAgICAgICAgZGNEc3QtPnduZEV4dFgsIGRjRHN0LT53bmRFeHRZICk7Ci0gICAgZHByaW50Zl9pbmZvKGJpdGJsdCwgIiAgICByZWN0ZHN0PSVkLCVkLSVkLCVkIG9yZ2RzdD0lZCwlZFxuIiwKKyAgICBUUkFDRShiaXRibHQsICIgICAgcmVjdGRzdD0lZCwlZC0lZCwlZCBvcmdkc3Q9JWQsJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgIHhEc3QsIHlEc3QsIHdpZHRoRHN0LCBoZWlnaHREc3QsCiAgICAgICAgICAgICAgICAgICAgIGRjRHN0LT53LkRDT3JnWCwgZGNEc3QtPncuRENPcmdZICk7CiAKQEAgLTExMzUsMTkgKzExMzUsMTkgQEAKICAgICAgICAgd2lkdGhTcmMgID0gd2lkdGhTcmMgKiBkY1NyYy0+dnBvcnRFeHRYIC8gZGNTcmMtPnduZEV4dFg7CiAgICAgICAgIGhlaWdodFNyYyA9IGhlaWdodFNyYyAqIGRjU3JjLT52cG9ydEV4dFkgLyBkY1NyYy0+d25kRXh0WTsKICAgICAgICAgZlN0cmV0Y2ggID0gKHdpZHRoU3JjICE9IHdpZHRoRHN0KSB8fCAoaGVpZ2h0U3JjICE9IGhlaWdodERzdCk7Ci0gICAgICAgIGRwcmludGZfaW5mbyhiaXRibHQsIiAgICB2cG9ydHNyYz0lZCwlZC0lZCwlZCB3bmRzcmM9JWQsJWQtJWQsJWRcbiIsCisgICAgICAgIFRSQUNFKGJpdGJsdCwiICAgIHZwb3J0c3JjPSVkLCVkLSVkLCVkIHduZHNyYz0lZCwlZC0lZCwlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGRjU3JjLT52cG9ydE9yZ1gsIGRjU3JjLT52cG9ydE9yZ1ksCiAgICAgICAgICAgICAgICAgICAgICAgICBkY1NyYy0+dnBvcnRFeHRYLCBkY1NyYy0+dnBvcnRFeHRZLAogICAgICAgICAgICAgICAgICAgICAgICAgZGNTcmMtPnduZE9yZ1gsIGRjU3JjLT53bmRPcmdZLAogICAgICAgICAgICAgICAgICAgICAgICAgZGNTcmMtPnduZEV4dFgsIGRjU3JjLT53bmRFeHRZICk7Ci0gICAgICAgIGRwcmludGZfaW5mbyhiaXRibHQsICIgICAgcmVjdHNyYz0lZCwlZC0lZCwlZCBvcmdzcmM9JWQsJWRcbiIsCisgICAgICAgIFRSQUNFKGJpdGJsdCwgIiAgICByZWN0c3JjPSVkLCVkLSVkLCVkIG9yZ3NyYz0lZCwlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIHhTcmMsIHlTcmMsIHdpZHRoU3JjLCBoZWlnaHRTcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICBkY1NyYy0+dy5EQ09yZ1gsIGRjU3JjLT53LkRDT3JnWSApOwogICAgICAgICBpZiAoIUJJVEJMVF9HZXRWaXNSZWN0YW5nbGVzKCBkY0RzdCwgeERzdCwgeURzdCwgd2lkdGhEc3QsIGhlaWdodERzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGNTcmMsIHhTcmMsIHlTcmMsIHdpZHRoU3JjLCBoZWlnaHRTcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2aXNSZWN0U3JjLCAmdmlzUmVjdERzdCApKQogICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIGRwcmludGZfaW5mbyhiaXRibHQsICIgICAgdmlzc3JjPSVkLCVkLSVkLCVkIHZpc2RzdD0lZCwlZC0lZCwlZFxuIiwKKyAgICAgICAgVFJBQ0UoYml0Ymx0LCAiICAgIHZpc3NyYz0lZCwlZC0lZCwlZCB2aXNkc3Q9JWQsJWQtJWQsJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICB2aXNSZWN0U3JjLmxlZnQsIHZpc1JlY3RTcmMudG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgdmlzUmVjdFNyYy5yaWdodCwgdmlzUmVjdFNyYy5ib3R0b20sCiAgICAgICAgICAgICAgICAgICAgICAgICB2aXNSZWN0RHN0LmxlZnQsIHZpc1JlY3REc3QudG9wLApAQCAtMTE1OSw3ICsxMTU5LDcgQEAKICAgICAgICAgaWYgKCFCSVRCTFRfR2V0VmlzUmVjdGFuZ2xlcyggZGNEc3QsIHhEc3QsIHlEc3QsIHdpZHRoRHN0LCBoZWlnaHREc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIDAsIDAsIE5VTEwsICZ2aXNSZWN0RHN0ICkpCiAgICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgZHByaW50Zl9pbmZvKGJpdGJsdCwgIiAgICB2aXNzcmM9bm9uZSB2aXNkc3Q9JWQsJWQtJWQsJWRcbiIsCisgICAgICAgIFRSQUNFKGJpdGJsdCwgIiAgICB2aXNzcmM9bm9uZSB2aXNkc3Q9JWQsJWQtJWQsJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICB2aXNSZWN0RHN0LmxlZnQsIHZpc1JlY3REc3QudG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgdmlzUmVjdERzdC5yaWdodCwgdmlzUmVjdERzdC5ib3R0b20gKTsKICAgICB9CmRpZmYgLS1naXQgYS9ncmFwaGljcy94MTFkcnYvYnJ1c2guYyBiL2dyYXBoaWNzL3gxMWRydi9icnVzaC5jCmluZGV4IDkwZmY2MGEuLjc4NmQ4YjIgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3gxMWRydi9icnVzaC5jCisrKyBiL2dyYXBoaWNzL3gxMWRydi9icnVzaC5jCkBAIC0yMDgsNyArMjA4LDcgQEAKICAgICBCSVRNQVBJTkZPICogYm1wSW5mbzsKICAgICBIQlJVU0gxNiBwcmV2SGFuZGxlID0gZGMtPncuaEJydXNoOwogCi0gICAgZHByaW50Zl9pbmZvKGdkaSwgIkJydXNoX1NlbGVjdE9iamVjdDogaGRjPSUwNHggaGJydXNoPSUwNHhcbiIsCisgICAgVFJBQ0UoZ2RpLCAiaGRjPSUwNHggaGJydXNoPSUwNHhcbiIsCiAgICAgICAgICAgICAgICAgZGMtPmhTZWxmLGhicnVzaCk7CiAjaWZkZWYgTk9UREVGCiAgICAgaWYgKGRjLT5oZWFkZXIud01hZ2ljID09IE1FVEFGSUxFX0RDX01BR0lDKQpAQCAtMjQzLDE2ICsyNDMsMTYgQEAKICAgICBzd2l0Y2goYnJ1c2gtPmxvZ2JydXNoLmxiU3R5bGUpCiAgICAgewogICAgICAgY2FzZSBCU19OVUxMOgotCWRwcmludGZfaW5mbyhnZGksIkJTX05VTExcbiIgKTsKKwlUUkFDRShnZGksIkJTX05VTExcbiIgKTsKIAlicmVhazsKIAogICAgICAgY2FzZSBCU19TT0xJRDoKLSAgICAgICAgZHByaW50Zl9pbmZvKGdkaSwiQlNfU09MSURcbiIgKTsKKyAgICAgICAgVFJBQ0UoZ2RpLCJCU19TT0xJRFxuIiApOwogCUJSVVNIX1NlbGVjdFNvbGlkQnJ1c2goIGRjLCBicnVzaC0+bG9nYnJ1c2gubGJDb2xvciApOwogCWJyZWFrOwogCQogICAgICAgY2FzZSBCU19IQVRDSEVEOgotCWRwcmludGZfaW5mbyhnZGksICJCU19IQVRDSEVEXG4iICk7CisJVFJBQ0UoZ2RpLCAiQlNfSEFUQ0hFRFxuIiApOwogCWRjLT51LnguYnJ1c2gucGl4ZWwgPSBDT0xPUl9Ub1BoeXNpY2FsKCBkYywgYnJ1c2gtPmxvZ2JydXNoLmxiQ29sb3IgKTsKIAlkYy0+dS54LmJydXNoLnBpeG1hcCA9IFRTWENyZWF0ZUJpdG1hcEZyb21EYXRhKCBkaXNwbGF5LCByb290V2luZG93LAogCQkJCSBIYXRjaEJydXNoZXNbYnJ1c2gtPmxvZ2JydXNoLmxiSGF0Y2hdLCA4LCA4ICk7CkBAIC0yNjAsMTIgKzI2MCwxMiBAQAogCWJyZWFrOwogCQogICAgICAgY2FzZSBCU19QQVRURVJOOgotCWRwcmludGZfaW5mbyhnZGksICJCU19QQVRURVJOXG4iKTsKKwlUUkFDRShnZGksICJCU19QQVRURVJOXG4iKTsKIAlCUlVTSF9TZWxlY3RQYXR0ZXJuQnJ1c2goIGRjLCAoSEJSVVNIMTYpYnJ1c2gtPmxvZ2JydXNoLmxiSGF0Y2ggKTsKIAlicmVhazsKIAogICAgICAgY2FzZSBCU19ESUJQQVRURVJOOgotCWRwcmludGZfaW5mbyhnZGksICJCU19ESUJQQVRURVJOXG4iKTsKKwlUUkFDRShnZGksICJCU19ESUJQQVRURVJOXG4iKTsKIAlpZiAoKGJtcEluZm8gPSAoQklUTUFQSU5GTyAqKSBHbG9iYWxMb2NrMTYoIChIR0xPQkFMMTYpYnJ1c2gtPmxvZ2JydXNoLmxiSGF0Y2ggKSkpCiAJewogCSAgICBpbnQgc2l6ZSA9IERJQl9CaXRtYXBJbmZvU2l6ZSggYm1wSW5mbywgYnJ1c2gtPmxvZ2JydXNoLmxiQ29sb3IgKTsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3gxMWRydi9ncmFwaGljcy5jIGIvZ3JhcGhpY3MveDExZHJ2L2dyYXBoaWNzLmMKaW5kZXggMDkxODI5ZS4uMDgzYzZiYSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MveDExZHJ2L2dyYXBoaWNzLmMKKysrIGIvZ3JhcGhpY3MveDExZHJ2L2dyYXBoaWNzLmMKQEAgLTI3MCw3ICsyNzAsNyBAQAogWDExRFJWX1JvdW5kUmVjdCggREMgKmRjLCBJTlQzMiBsZWZ0LCBJTlQzMiB0b3AsIElOVDMyIHJpZ2h0LAogICAgICAgICAgICAgICAgICAgSU5UMzIgYm90dG9tLCBJTlQzMiBlbGxfd2lkdGgsIElOVDMyIGVsbF9oZWlnaHQgKQogewotICAgIGRwcmludGZfaW5mbyhncmFwaGljcywgIlgxMURSVl9Sb3VuZFJlY3QoJWQgJWQgJWQgJWQgICVkICVkXG4iLCAKKyAgICBUUkFDRShncmFwaGljcywgIiglZCAlZCAlZCAlZCAgJWQgJWRcbiIsIAogICAgIAlsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIGVsbF93aWR0aCwgZWxsX2hlaWdodCk7CiAKICAgICBsZWZ0ICAgPSBYTFBUT0RQKCBkYywgbGVmdCApOwpAQCAtNjk0LDcgKzY5NCw3IEBACiAgICAgQk9PTDMyIHJlc3VsdDsKICAgICBzdHJ1Y3QgRmxvb2RGaWxsX3BhcmFtcyBwYXJhbXMgPSB7IGRjLCB4LCB5LCBjb2xvciwgZmlsbFR5cGUgfTsKIAotICAgIGRwcmludGZfaW5mbyhncmFwaGljcywgIlgxMURSVl9FeHRGbG9vZEZpbGwgJWQsJWQgJTA2bHggJWRcbiIsCisgICAgVFJBQ0UoZ3JhcGhpY3MsICJYMTFEUlZfRXh0Rmxvb2RGaWxsICVkLCVkICUwNmx4ICVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgIHgsIHksIGNvbG9yLCBmaWxsVHlwZSApOwogCiAgICAgaWYgKCFQdFZpc2libGUzMiggZGMtPmhTZWxmLCB4LCB5ICkpIHJldHVybiBGQUxTRTsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3gxMWRydi9vYmplY3RzLmMgYi9ncmFwaGljcy94MTFkcnYvb2JqZWN0cy5jCmluZGV4IDFhOGZhN2UuLjhmYzc3YmQgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3gxMWRydi9vYmplY3RzLmMKKysrIGIvZ3JhcGhpY3MveDExZHJ2L29iamVjdHMuYwpAQCAtMzEsNyArMzEsNyBAQAogICAgIEhHRElPQkozMiByZXQgPSAwOwogCiAgICAgaWYgKCFwdHIpIHJldHVybiAwOwotICAgIGRwcmludGZfaW5mbyhnZGksICJTZWxlY3RPYmplY3Q6IGhkYz0lMDR4ICUwNHhcbiIsIGRjLT5oU2VsZiwgaGFuZGxlICk7CisgICAgVFJBQ0UoZ2RpLCAiaGRjPSUwNHggJTA0eFxuIiwgZGMtPmhTZWxmLCBoYW5kbGUgKTsKICAgICAKICAgICBzd2l0Y2gocHRyLT53TWFnaWMpCiAgICAgewpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MveDExZHJ2L3RleHQuYyBiL2dyYXBoaWNzL3gxMWRydi90ZXh0LmMKaW5kZXggYTIwNjg2MC4uYTA1NmQ5NSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MveDExZHJ2L3RleHQuYworKysgYi9ncmFwaGljcy94MTFkcnYvdGV4dC5jCkBAIC00MywxMCArNDMsMTAgQEAKICAgICBsZlVuZGVybGluZSA9IChwZm8tPmZvX2ZsYWdzICYgRk9fU1lOVEhfVU5ERVJMSU5FKSA/IDEgOiAwOwogICAgIGxmU3RyaWtlT3V0ID0gKHBmby0+Zm9fZmxhZ3MgJiBGT19TWU5USF9TVFJJS0VPVVQpID8gMSA6IDA7CiAKLSAgICBkcHJpbnRmX2luZm8odGV4dCwiRXh0VGV4dE91dDogaGRjPSUwNHggZGY9JTA0eCAlZCwlZCAnJS4qcycsICVkICBmbGFncz0lZFxuIiwKKyAgICBUUkFDRSh0ZXh0LCJoZGM9JTA0eCBkZj0lMDR4ICVkLCVkICclLipzJywgJWQgIGZsYWdzPSVkXG4iLAogICAgICAgICAgICAgICAgICBkYy0+aFNlbGYsIChVSU5UMTYpKGRjLT51LnguZm9udCksIHgsIHksIChpbnQpY291bnQsIHN0ciwgY291bnQsIGZsYWdzKTsKIAotICAgIGlmIChscHJlY3QgIT0gTlVMTCkgZHByaW50Zl9pbmZvKHRleHQsICJcdHJlY3Q9KCVkLCVkLSAlZCwlZClcbiIsCisgICAgaWYgKGxwcmVjdCAhPSBOVUxMKSBUUkFDRSh0ZXh0LCAiXHRyZWN0PSglZCwlZC0gJWQsJWQpXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwcmVjdC0+bGVmdCwgbHByZWN0LT50b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHByZWN0LT5yaWdodCwgbHByZWN0LT5ib3R0b20gKTsKICAgICAgIC8qIFNldHVwIGNvb3JkaW5hdGVzICovCkBAIC04NSw3ICs4NSw3IEBACiAgICAgeCA9IFhMUFRPRFAoIGRjLCB4ICk7CiAgICAgeSA9IFlMUFRPRFAoIGRjLCB5ICk7CiAKLSAgICBkcHJpbnRmX2luZm8odGV4dCwiXHRyZWFsIGNvb3JkOiB4PSVpLCB5PSVpLCByZWN0PSglZCwlZC0lZCwlZClcbiIsCisgICAgVFJBQ0UodGV4dCwiXHRyZWFsIGNvb3JkOiB4PSVpLCB5PSVpLCByZWN0PSglZCwlZC0lZCwlZClcbiIsCiAJCQkgIHgsIHksIHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tKTsKIAogICAgICAgLyogRHJhdyB0aGUgcmVjdGFuZ2xlICovCmRpZmYgLS1naXQgYS9ncmFwaGljcy94MTFkcnYveGZvbnQuYyBiL2dyYXBoaWNzL3gxMWRydi94Zm9udC5jCmluZGV4IDc1NmJmYzIuLjU2MWZjOWUgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3gxMWRydi94Zm9udC5jCisrKyBiL2dyYXBoaWNzL3gxMWRydi94Zm9udC5jCkBAIC01MjMsNyArNTIzLDcgQEAKIAkgICAgc3ByaW50ZiggbHBjaCwgIiVpLSotKi0qLSotKi0lcyoiLCBmby0+ZmktPmxmZF9oZWlnaHQsIGxwRW5jb2RpbmcgKTsKICAgIH0KIAotICAgZHByaW50Zl9pbmZvKGZvbnQsIlx0TEZEOiAlc1xuIiwgbHBMRkQgKTsKKyAgIFRSQUNFKGZvbnQsIlx0TEZEOiAlc1xuIiwgbHBMRkQgKTsKICAgIHJldHVybiBUUlVFOwogfQogCkBAIC04MjUsNyArODI1LDcgQEAKIAl9CiAKICNpZmRlZiBERUJVR19GT05UX0lOSVQKLQlkcHJpbnRmX2luZm8oZm9udCwidHlwZWZhY2UgXCclc1wnXG4iLCBmci0+bGZGYWNlTmFtZSk7CisJVFJBQ0UoZm9udCwidHlwZWZhY2UgXCclc1wnXG4iLCBmci0+bGZGYWNlTmFtZSk7CiAjZW5kaWYKIAlmci0+ZnJfZmxhZ3MgfD0gRlJfTkFNRVNFVDsKICAgICB9CkBAIC04NjYsNyArODY2LDcgQEAKIAlpZiggIWxzdHJjbXBpMzJBKCBwZmEtPmZhVHlwZUZhY2UsIGxwQWxpYXMgKSApCiAJewogI2lmZGVmIERFQlVHX0ZPTlRfSU5JVAotCSAgICBkcHJpbnRmX2luZm8oZm9udCwiXHRyZWR1bmRhbnQgYWxpYXMgJyVzJyAtPiAnJXMnXG4iLCBscEFsaWFzLCBscFR5cGVGYWNlICk7CisJICAgIFRSQUNFKGZvbnQsIlx0cmVkdW5kYW50IGFsaWFzICclcycgLT4gJyVzJ1xuIiwgbHBBbGlhcywgbHBUeXBlRmFjZSApOwogI2VuZGlmCiAJICAgIHJldHVybiBOVUxMOwogCX0gCkBAIC04ODYsNyArODg2LDcgQEAKICAgICAgICAgbHN0cmNweTMyQSggcGZhLT5mYUFsaWFzLCBscEFsaWFzICk7CiAKICNpZmRlZiBERUJVR19GT05UX0lOSVQKLSAgICAgICAgZHByaW50Zl9pbmZvKGZvbnQsICJcdGFkZGVkIGFsaWFzICclcycgZm9yICVzXG4iLCBscEFsaWFzLCBscFR5cGVGYWNlICk7CisgICAgICAgIFRSQUNFKGZvbnQsICJcdGFkZGVkIGFsaWFzICclcycgZm9yICVzXG4iLCBscEFsaWFzLCBscFR5cGVGYWNlICk7CiAjZW5kaWYKIAlyZXR1cm4gcGZhOwogICAgIH0KQEAgLTk4OCw3ICs5ODgsNyBAQAogCQkJfQogCQkJCQkJCiAjaWZkZWYgREVCVUdfRk9OVF9JTklUCi0gICAgICAgICAgICAgICAgICAgICAgICBkcHJpbnRmX2luZm8oZm9udCwgIlx0c3Vic3RpdHV0ZWQgJyVzJyB3aXRoICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0UoZm9udCwgIlx0c3Vic3RpdHV0ZWQgJyVzJyB3aXRoICVzXG4iLAogCQkJCQkJZnJNYXRjaC0+bGZGYWNlTmFtZSwgbHBBbGlhcyApOwogI2VuZGlmCiAJCQlsc3RyY3B5bjMyQSggZnJNYXRjaC0+bGZGYWNlTmFtZSwgbHBBbGlhcywgTEZfRkFDRVNJWkUgKTsKQEAgLTEwNjIsNyArMTA2Miw3IEBACiAJCSAgICBmb250UmVzb3VyY2UqIAlwZnIgPSBmb250TGlzdDsKIAkJICAgIGZvbnRJbmZvKiAJCXBmaSA9IE5VTEw7CiAKLQkJICAgIGRwcmludGZfaW5mbyhmb250LCJSZWFkaW5nIGNhY2hlZCBmb250IG1ldHJpY3M6XG4iKTsKKwkJICAgIFRSQUNFKGZvbnQsIlJlYWRpbmcgY2FjaGVkIGZvbnQgbWV0cmljczpcbiIpOwogCiAJCSAgICByZWFkKCBmZCwgZm9udExpc3QsIGkpOyAvKiByZWFkIGFsbCBtZXRyaWNzIGF0IG9uY2UgKi8KIAkJICAgIHdoaWxlKCBvZmZzZXQgPCBsZW5ndGggKQpAQCAtMTEwMiw3ICsxMTAyLDcgQEAKIAkJCW9mZnNldCArPSBzaXplb2YoaW50KTsKIAkJCWZvciggcGZyID0gZm9udExpc3Q7IHBmcjsgcGZyID0gcGZyLT5uZXh0ICkKIAkJCXsKLQkJCSAgICBkcHJpbnRmX2luZm8oZm9udCwiXHQlcywgJWkgaW5zdGFuY2VzXG4iLCBscGNoLCBwZnItPmNvdW50ICk7CisJCQkgICAgVFJBQ0UoZm9udCwiXHQlcywgJWkgaW5zdGFuY2VzXG4iLCBscGNoLCBwZnItPmNvdW50ICk7CiAJCQkgICAgcGZyLT5yZXNvdXJjZSA9IGxwY2g7CiAJCQkgICAgd2hpbGUoIFRSVUUgKQogCQkJICAgIHsgCkBAIC0xMTU4LDEzICsxMTU4LDEzIEBACiAgICAgICAgIGkgKz0gbl9mZiAqIHNpemVvZihmb250UmVzb3VyY2UpICsgaiAqIHNpemVvZihmb250SW5mbykgKyBzaXplb2YoaW50KTsKIAl3cml0ZSggZmQsICZpLCBzaXplb2YoaW50KSApOwogCi0JZHByaW50Zl9pbmZvKGZvbnQsIldyaXRpbmcgZm9udCBjYWNoZTpcbiIpOworCVRSQUNFKGZvbnQsIldyaXRpbmcgZm9udCBjYWNoZTpcbiIpOwogCiAJZm9yKCBwZnIgPSBmb250TGlzdDsgcGZyOyBwZnIgPSBwZnItPm5leHQgKQogCXsKIAkgICAgZm9udEluZm8gZmk7CiAKLQkgICAgZHByaW50Zl9pbmZvKGZvbnQsIlx0JXMsICVpIGluc3RhbmNlc1xuIiwgcGZyLT5yZXNvdXJjZSwgcGZyLT5jb3VudCApOworCSAgICBUUkFDRShmb250LCJcdCVzLCAlaSBpbnN0YW5jZXNcbiIsIHBmci0+cmVzb3VyY2UsIHBmci0+Y291bnQgKTsKIAogCSAgICBpID0gd3JpdGUoIGZkLCBwZnIsIHNpemVvZihmb250UmVzb3VyY2UpICk7CiAJICAgIGlmKCBpID09IHNpemVvZihmb250UmVzb3VyY2UpICkgCkBAIC0xMzIzLDcgKzEzMjMsNyBAQAogICAgICAgCiAgIHhfcGF0dGVybiA9IFRTWExpc3RGb250cyhkaXNwbGF5LCAiKiIsIE1BWF9GT05UX0ZBTUlMSUVTICogMTYsICZ4X2NvdW50ICk7CiAKLSAgZHByaW50Zl9pbmZvKGZvbnQsIkZvbnQgTWFwcGVyOiBpbml0aWFsaXppbmcgJWkgZm9udHMgW0xQWT0laSwgWERSPSVpLCBEUj0laV1cbiIsIAorICBUUkFDRShmb250LCJGb250IE1hcHBlcjogaW5pdGlhbGl6aW5nICVpIGZvbnRzIFtMUFk9JWksIFhEUj0laSwgRFI9JWldXG4iLCAKIAkJCQkgICAgeF9jb3VudCwgcERldkNhcHMtPmxvZ1BpeGVsc1ksIERlZlJlc29sdXRpb24sIHJlcyk7CiAgIGZvciggaSA9IHhfY2hlY2tzdW0gPSAwOyBpIDwgeF9jb3VudDsgaSsrICkKICAgewpAQCAtMTM5Niw3ICsxMzk2LDcgQEAKIAkgICBsc3RyY3B5bjMyQSggZnItPnJlc291cmNlLCB0eXBlZmFjZSwgaiArIDEgKTsKIAogI2lmZGVmIERFQlVHX0ZPTlRfSU5JVAotCSAgIGRwcmludGZfaW5mbyhmb250LCIgICAgZmFtaWx5OiAlc1xuIiwgZnItPnJlc291cmNlICk7CisJICAgVFJBQ0UoZm9udCwiICAgIGZhbWlseTogJXNcbiIsIGZyLT5yZXNvdXJjZSApOwogI2VuZGlmCiAKIAkgICBpZiggcGZyICkgcGZyLT5uZXh0ID0gZnI7CkBAIC0xNDQwLDcgKzE0NDAsNyBAQAogICAgICAgICAgICBUU1hGcmVlRm9udCggZGlzcGxheSwgeF9mcyApOwogCiAjaWZkZWYgREVCVUdfRk9OVF9JTklUCi0JICAgZHByaW50Zl9pbmZvKGZvbnQsIlx0WyUgMmlwdF0gJyVzJ1xuIiwgZmktPmRmLmRmUG9pbnRzLCB0eXBlZmFjZSApOworCSAgIFRSQUNFKGZvbnQsIlx0WyUgMmlwdF0gJyVzJ1xuIiwgZmktPmRmLmRmUG9pbnRzLCB0eXBlZmFjZSApOwogI2VuZGlmCiAJICAgWEZPTlRfQ2hlY2tGSUxpc3QoIGZyLCBmaSwgUkVNT1ZFX1NVQlNFVFMgKTsKIAkgICBmaSA9IE5VTEw7CS8qIHByZXZlbnRpbmcgcmV1c2UgKi8KQEAgLTE0ODUsNyArMTQ4NSw3IEBACiAgIFhGT05UX0dyb3dGcmVlTGlzdCgwLCBmb250Q2FjaGVTaXplIC0gMSk7CiAKICNpZmRlZiBERUJVR19GT05UX0lOSVQKLSAgICAgICAgZHByaW50Zl9pbmZvKGZvbnQsImRvbmUhXG4iKTsKKyAgICAgICAgVFJBQ0UoZm9udCwiZG9uZSFcbiIpOwogI2VuZGlmCiAKICAgLyogdXBkYXRlIHRleHQgY2FwcyBwYXJhbWV0ZXIgKi8KQEAgLTE1NDksNyArMTU0OSw3IEBACiAgICBCT09MMzIgICAgICAgYlNjYWxlID0gcGZpLT5maV9mbGFncyAmIEZJX1NDQUxBQkxFOwogICAgSU5UMzIgICAgICAgIGQsIGg7CiAKLSAgIGRwcmludGZfaW5mbyhmb250LCJcdFsgJS0yaXB0IGg9JS0zaSB3PSUtM2kgJXMlc11cbiIsIHBmaS0+ZGYuZGZQb2ludHMsCisgICBUUkFDRShmb250LCJcdFsgJS0yaXB0IGg9JS0zaSB3PSUtM2kgJXMlc11cbiIsIHBmaS0+ZGYuZGZQb2ludHMsCiAJCSBwZmktPmRmLmRmUGl4SGVpZ2h0LCBwZmktPmRmLmRmQXZnV2lkdGgsCiAJCShwZmktPmRmLmRmV2VpZ2h0ID4gNDAwKSA/ICJCb2xkICIgOiAiTm9ybWFsICIsCiAJCShwZmktPmRmLmRmSXRhbGljKSA/ICJJdGFsaWMiIDogIiIgKTsKQEAgLTE2MzksNyArMTYzOSw3IEBACiAgICBpZiggcGVuYWx0eSAmJiBwZmktPmxmZF9yZXNvbHV0aW9uICE9IERlZlJlc29sdXRpb24gKSAKICAgICAgICBwZW5hbHR5Kys7CiAKLSAgIGRwcmludGZfaW5mbyhmb250LCIgIHJldHVybmluZyAlaVxuIiwgcGVuYWx0eSApOworICAgVFJBQ0UoZm9udCwiICByZXR1cm5pbmcgJWlcbiIsIHBlbmFsdHkgKTsKIAogICAgcmV0dXJuIHBlbmFsdHk7CiB9CkBAIC0xNzE3LDcgKzE3MTcsNyBAQAogICB9CiAKICNpZmRlZiBERUJVR19GT05UX0lOSVQKLSAgaWYoIGkgKSBkcHJpbnRmX2luZm8oZm9udCwiXHQgICAgcHVyZ2VkICVpIHN1YnNldHMgWyVpXVxuIiwgaSAsIGZyLT5jb3VudCk7CisgIGlmKCBpICkgVFJBQ0UoZm9udCwiXHQgICAgcHVyZ2VkICVpIHN1YnNldHMgWyVpXVxuIiwgaSAsIGZyLT5jb3VudCk7CiAjZW5kaWYKIH0KIApAQCAtMTc2MCw3ICsxNzYwLDcgQEAKIAogICAgIGlmKCBmbS5wZnIgKSAgICAgICAgLyogbWF0Y2ggZmFtaWx5ICovCiAgICAgewotCWRwcmludGZfaW5mbyhmb250LCAiJXNcbiIsIGZtLnBmci0+bGZGYWNlTmFtZSApOworCVRSQUNFKGZvbnQsICIlc1xuIiwgZm0ucGZyLT5sZkZhY2VOYW1lICk7CiAKICAgICAgICAgWEZPTlRfTWF0Y2hGSUxpc3QoICZmbSApOwogICAgICAgICAqcGZtID0gZm07CkBAIC0xNzc0LDcgKzE3NzQsNyBAQAogICAgICAgICBmb3IoIHN0YXJ0ID0gZm9udExpc3Q7IHN0YXJ0ICYmIHNjb3JlOyBzdGFydCA9IHN0YXJ0LT5uZXh0ICkKICAgICAgICAgewogICAgICAgICAgICAgZm0ucGZyID0gc3RhcnQ7Ci0JICAgIGRwcmludGZfaW5mbyhmb250LCAiJXNcbiIsIGZtLnBmci0+bGZGYWNlTmFtZSApOworCSAgICBUUkFDRShmb250LCAiJXNcbiIsIGZtLnBmci0+bGZGYWNlTmFtZSApOwogCiAgICAgICAgICAgICBjdXJyZW50X3Njb3JlID0gWEZPTlRfTWF0Y2hGSUxpc3QoICZmbSApOwogICAgICAgICAgICAgaWYoIGN1cnJlbnRfc2NvcmUgPCBzY29yZSApCkBAIC0xODQ5LDcgKzE4NDksNyBAQAogICAgIHsKIAlpbnQJcHJldl9pLCBwcmV2X2osIGo7CiAKLQlkcHJpbnRmX2luZm8oZm9udCwiZm9udCBjYWNoZSBpcyBmdWxsXG4iKTsKKwlUUkFDRShmb250LCJmb250IGNhY2hlIGlzIGZ1bGxcbiIpOwogCiAJLyogbG9va3VwIHRoZSBsZWFzdCByZWNlbnRseSB1c2VkIGZvbnQgKi8KIApAQCAtMTg2OCw3ICsxODY4LDcgQEAKIAl7CiAJICAgIC8qIGRldGFjaCBmcm9tIHRoZSBscnUgbGlzdCAqLwogCi0JICAgIGRwcmludGZfaW5mbyhmb250LCJcdGZyZWVpbmcgZW50cnkgJWlcbiIsIGogKTsKKwkgICAgVFJBQ0UoZm9udCwiXHRmcmVlaW5nIGVudHJ5ICVpXG4iLCBqICk7CiAKIAkgICAgaWYoIHByZXZfaiA+PSAwICkKIAkJZm9udENhY2hlW3ByZXZfal0ubHJ1ID0gZm9udENhY2hlW2pdLmxydTsKQEAgLTE4ODYsNyArMTg4Niw3IEBACiAKIAkgICAgcHJldl9pID0gZm9udENhY2hlU2l6ZSArIEZPTlRDQUNIRTsKIAotCSAgICBkcHJpbnRmX2luZm8oZm9udCwiXHRncm93aW5nIGZvbnQgY2FjaGUgZnJvbSAlaSB0byAlaVxuIiwgZm9udENhY2hlU2l6ZSwgcHJldl9pICk7CisJICAgIFRSQUNFKGZvbnQsIlx0Z3Jvd2luZyBmb250IGNhY2hlIGZyb20gJWkgdG8gJWlcbiIsIGZvbnRDYWNoZVNpemUsIHByZXZfaSApOwogCiAJICAgIGlmKCAobmV3Q2FjaGUgPSAoZm9udE9iamVjdCopSGVhcFJlQWxsb2MoU3lzdGVtSGVhcCwgMCwgIAogCQkJCQkJICAgICBmb250Q2FjaGUsIHByZXZfaSkpICkKQEAgLTE5NDEsOSArMTk0MSw5IEBACiAJICAgIHsKIAkJVUlOVDMyCXVSZWxheExldmVsID0gMDsKIAotCQlkcHJpbnRmX2luZm8oZm9udCwiWFJlYWxpemVGb250OiAoJXUpICclcycgaD0laSB3ZWlnaHQ9JWkgJXNcbiIsCi0JCQkJICAgICBwbGYtPmxmQ2hhclNldCwgcGxmLT5sZkZhY2VOYW1lLCBwbGYtPmxmSGVpZ2h0LCAKLQkJCQkgICAgIHBsZi0+bGZXZWlnaHQsIChwbGYtPmxmSXRhbGljKSA/ICJJdGFsaWMiIDogIiIgKTsKKwkJVFJBQ0UoZm9udCwiKCV1KSAnJXMnIGg9JWkgd2VpZ2h0PSVpICVzXG4iLAorCQkJICAgICBwbGYtPmxmQ2hhclNldCwgcGxmLT5sZkZhY2VOYW1lLCBwbGYtPmxmSGVpZ2h0LCAKKwkJCSAgICAgcGxmLT5sZldlaWdodCwgKHBsZi0+bGZJdGFsaWMpID8gIkl0YWxpYyIgOiAiIiApOwogCiAJCVhGT05UX01hdGNoRGV2aWNlRm9udCggZm9udExpc3QsICZmbSApOwogCkBAIC0yMDE5LDcgKzIwMTksNyBAQAogICAgIHBmby0+bHJ1ID0gZm9udE1SVTsKICAgICBmb250TVJVID0gKHBmbyAtIGZvbnRDYWNoZSk7CiAKLSAgICBkcHJpbnRmX2luZm8oZm9udCwicGh5c2ZvbnQgJWlcbiIsIGZvbnRNUlUpOworICAgIFRSQUNFKGZvbnQsInBoeXNmb250ICVpXG4iLCBmb250TVJVKTsKIAogICAgIHJldHVybiAoWF9QSFlTRk9OVCkoWF9QRk9OVF9NQUdJQyB8IGZvbnRNUlUpOwogfQpkaWZmIC0tZ2l0IGEvaWYxNjMyL01ha2VmaWxlLmluIGIvaWYxNjMyL01ha2VmaWxlLmluCmluZGV4IDI2ZTFlN2EuLjllOWZlOGYgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9NYWtlZmlsZS5pbgorKysgYi9pZjE2MzIvTWFrZWZpbGUuaW4KQEAgLTI5LDYgKzI5LDcgQEAKIAlzdHJlc3Muc3BlYyBcCiAJc3lzdGVtLnNwZWMgXAogCXRvb2xoZWxwLnNwZWMgXAorCXR5cGVsaWIuc3BlYyBcCiAJdXNlci5zcGVjIFwKIAl2ZXIuc3BlYyBcCiAJdzMyc3lzLnNwZWMgXApkaWZmIC0tZ2l0IGEvaWYxNjMyL2J1aWx0aW4uYyBiL2lmMTYzMi9idWlsdGluLmMKaW5kZXggZTU2MTgzZC4uOTA1Yzk4MiAxMDA2NDQKLS0tIGEvaWYxNjMyL2J1aWx0aW4uYworKysgYi9pZjE2MzIvYnVpbHRpbi5jCkBAIC02Nyw2ICs2Nyw3IEBACiBleHRlcm4gY29uc3QgV0lOMTZfREVTQ1JJUFRPUiBTVFJFU1NfRGVzY3JpcHRvcjsKIGV4dGVybiBjb25zdCBXSU4xNl9ERVNDUklQVE9SIFNZU1RFTV9EZXNjcmlwdG9yOwogZXh0ZXJuIGNvbnN0IFdJTjE2X0RFU0NSSVBUT1IgVE9PTEhFTFBfRGVzY3JpcHRvcjsKK2V4dGVybiBjb25zdCBXSU4xNl9ERVNDUklQVE9SIFRZUEVMSUJfRGVzY3JpcHRvcjsKIGV4dGVybiBjb25zdCBXSU4xNl9ERVNDUklQVE9SIFVTRVJfRGVzY3JpcHRvcjsKIGV4dGVybiBjb25zdCBXSU4xNl9ERVNDUklQVE9SIFZFUl9EZXNjcmlwdG9yOwogZXh0ZXJuIGNvbnN0IFdJTjE2X0RFU0NSSVBUT1IgVzMyU1lTX0Rlc2NyaXB0b3I7CkBAIC0xMDgsNiArMTA5LDcgQEAKICAgICB7ICZTVE9SQUdFX0Rlc2NyaXB0b3IsICBETExfRkxBR19OT1RfVVNFRCB9LAogICAgIHsgJlNUUkVTU19EZXNjcmlwdG9yLCAgIDAgfSwKICAgICB7ICZUT09MSEVMUF9EZXNjcmlwdG9yLCAwIH0sCisgICAgeyAmVFlQRUxJQl9EZXNjcmlwdG9yLCAgMCB9LAogICAgIHsgJlZFUl9EZXNjcmlwdG9yLCAgICAgIDAgfSwKICAgICB7ICZXMzJTWVNfRGVzY3JpcHRvciwgICAwIH0sCiAgICAgeyAmV0lOMzJTMTZfRGVzY3JpcHRvciwgMCB9LApAQCAtMTQxLDcgKzE0Myw3IEBACiAgICAgaWYgKCFoTW9kdWxlKSByZXR1cm4gMDsKICAgICBGYXJTZXRPd25lciggaE1vZHVsZSwgaE1vZHVsZSApOwogCi0gICAgZHByaW50Zl9pbmZvKG1vZHVsZSwgIkJ1aWx0LWluICVzOiBobW9kdWxlPSUwNHhcbiIsCisgICAgVFJBQ0UobW9kdWxlLCAiQnVpbHQtaW4gJXM6IGhtb2R1bGU9JTA0eFxuIiwKICAgICAgICAgICAgICAgICAgICAgZGVzY3ItPm5hbWUsIGhNb2R1bGUgKTsKICAgICBwTW9kdWxlID0gKE5FX01PRFVMRSAqKUdsb2JhbExvY2sxNiggaE1vZHVsZSApOwogICAgIHBNb2R1bGUtPnNlbGYgPSBoTW9kdWxlOwpkaWZmIC0tZ2l0IGEvaWYxNjMyL2NvbXBvYmouc3BlYyBiL2lmMTYzMi9jb21wb2JqLnNwZWMKaW5kZXggZjBjZTNjOS4uZDM3YmJlZiAxMDA2NDQKLS0tIGEvaWYxNjMyL2NvbXBvYmouc3BlYworKysgYi9pZjE2MzIvY29tcG9iai5zcGVjCkBAIC0zNCw3ICszNCw3IEBACiAzMSBwYXNjYWwgQ29Eb3NEYXRlVGltZVRvRmlsZVRpbWUod29yZCB3b3JkIHB0cikgRG9zRGF0ZVRpbWVUb0ZpbGVUaW1lCiAzMiBzdHViIENPTUFSU0hBTEhSRVNVTFQKIDMzIHN0dWIgQ09VTk1BUlNIQUxIUkVTVUxUCi0zNCBzdHViIENPR0VUQ1VSUkVOVFBST0NFU1MKKzM0IHBhc2NhbCBDb0dldEN1cnJlbnRQcm9jZXNzKCkgQ29HZXRDdXJyZW50UHJvY2VzcwogIzM1IF9fX0VYUE9SVEVEU1RVQgogMzYgc3R1YiBDT0lTT0xFMUNMQVNTCiAzNyBzdHViIF9HVUlEX05VTEwKQEAgLTYzLDcgKzYzLDcgQEAKIDYwIHN0dWIgX0lJRF9JTUVTU0FHRUZJTFRFUgogNjEgcGFzY2FsIENMU0lERnJvbVByb2dJRChzdHIgcHRyKSBDTFNJREZyb21Qcm9nSUQxNgogNjIgc3R1YiBQUk9HSURGUk9NQ0xTSUQKLTYzIHN0dWIgQ09MT0NLT0JKRUNURVhURVJOQUwKKzYzIHBhc2NhbCBDb0xvY2tPYmplY3RFeHRlcm5hbChzZWdwdHIgd29yZCB3b3JkKSBDb0xvY2tPYmplY3RFeHRlcm5hbDE2CiA2NCBzdHViIF9DTFNJRF9TVERNQVJTSEFMCiA2NSBzdHViIENPR0VUVFJFQVRBU0NMQVNTCiA2NiBzdHViIENPVFJFQVRBU0NMQVNTCkBAIC03NSw3ICs3NSw3IEBACiA3MiBzdHViIF9JSURfSUVYVEVSTkFMQ09OTkVDVElPTgogNzMgc3R1YiBDT0NSRUFURUdVSUQKIDc1IHN0dWIgRk5BU1NFUlQKLTc2IHN0dWIgU1RSSU5HRlJPTUdVSUQyCis3NiBwYXNjYWwgU1RSSU5HRlJPTUdVSUQyKHB0ciBwdHIgd29yZCkgU3RyaW5nRnJvbUdVSUQyCiA3NyBzdHViIENPR0VUQ0xBU1NFWFQKIDc4IHN0dWIgT0xFMUNMQVNTRlJPTUNMU0lEMgogNzkgc3R1YiBDTFNJREZST01PTEUxQ0xBU1MKZGlmZiAtLWdpdCBhL2lmMTYzMi9rZXJuZWwuc3BlYyBiL2lmMTYzMi9rZXJuZWwuc3BlYwppbmRleCBhYmIwYmZmLi44NzYzOTdmIDEwMDY0NAotLS0gYS9pZjE2MzIva2VybmVsLnNwZWMKKysrIGIvaWYxNjMyL2tlcm5lbC5zcGVjCkBAIC0zMDEsNiArMzAxLDcgQEAKIDQyMiBwYXNjYWwxNiBHZXREaXNrRnJlZVNwYWNlKHB0ciBwdHIgcHRyIHB0ciBwdHIpIEdldERpc2tGcmVlU3BhY2UxNiAKIDQzMSBwYXNjYWwxNiBLRVJORUxfNDMxKHN0ciB3b3JkKSBLRVJORUxfNDMxCiA0MzIgc3R1YiBGaWxlVGltZVRvTG9jYWxGaWxlVGltZQorNDM0IHN0dWIgS0VSTkVMXzQzNAogNDM1IHN0dWIgS0VSTkVMXzQzNQogNDM5IHN0dWIgS0VSTkVMXzQzOQogNDQwIHN0dWIgS0VSTkVMXzQ0MApAQCAtMzU1LDYgKzM1Niw2IEBACiA2MjEgc3R1YiBLRVJORUxfNjIxCiA2Mjcgc3R1YiBJc0JhZEZsYXRSZWFkV3JpdGVQdHIKIDYzMCBzdHViIEtFUk5FTF82MzAKLTYzMSBwYXNjYWwgRlVOQzAwNCh3b3JkIHdvcmQgbG9uZykgRlVOQzAwNAkjQzE2VGhrU2wwMT8KKzYzMSBwYXNjYWwgRlVOQzAwNCh3b3JkIHdvcmQgd29yZCkgRlVOQzAwNAkjQzE2VGhrU2wwMT8KIDY1MSBzdHViIEtFUk5FTF82NTEJCQkJI1RodW5rQ29ubmVjdDE2PwogNzAwIHBhc2NhbCBLRVJORUxfNzAwKCkgc3R1Yl9LRVJORUxfNzAwCmRpZmYgLS1naXQgYS9pZjE2MzIvb2xlMi5zcGVjIGIvaWYxNjMyL29sZTIuc3BlYwppbmRleCA1Mjg5OTI5Li5iYzU0ZmRjIDEwMDY0NAotLS0gYS9pZjE2MzIvb2xlMi5zcGVjCisrKyBiL2lmMTYzMi9vbGUyLnNwZWMKQEAgLTI4LDE0ICsyOCwxNCBAQAogMjUgc3R1YiBPTEVMT0FERlJPTVNUUkVBTQogMjYgc3R1YiBDUkVBVEVCSU5EQ1RYCiAyNyBzdHViIENSRUFURUlURU1NT05JS0VSCi0yOCBzdHViIENSRUFURUZJTEVNT05JS0VSCisyOCBwYXNjYWwgQ3JlYXRlRmlsZU1vbmlrZXIoc3RyIHB0cikgQ3JlYXRlRmlsZU1vbmlrZXIxNgogMjkgc3R1YiBDUkVBVEVHRU5FUklDQ09NUE9TSVRFCi0zMCBzdHViIEdFVFJVTk5JTkdPQkpFQ1RUQUJMRQorMzAgcGFzY2FsIEdldFJ1bm5pbmdPYmplY3RUYWJsZShsb25nIHB0cikgR2V0UnVubmluZ09iamVjdFRhYmxlMTYKIDMxIHN0dWIgT0xFR0VUTUFMTE9DCiAzMiBzdHViIFJFTEVBU0VTVEdNRURJVU0KIDMzIHN0dWIgUkVBRFNUUklOR1NUUkVBTQogMzQgc3R1YiBXUklURVNUUklOR1NUUkVBTQotMzUgc3R1YiBSRUdJU1RFUkRSQUdEUk9QCiszNSBwYXNjYWwgUmVnaXN0ZXJEcmFnRHJvcCh3b3JkIHNlZ3B0cikgUmVnaXN0ZXJEcmFnRHJvcDE2CiAzNiBzdHViIFJFVk9LRURSQUdEUk9QCiAzNyBzdHViIERPRFJBR0RST1AKIDM4IHN0dWIgQ1JFQVRFT0xFQURWSVNFSE9MREVSCmRpZmYgLS1naXQgYS9pZjE2MzIvb2xlMmRpc3Auc3BlYyBiL2lmMTYzMi9vbGUyZGlzcC5zcGVjCmluZGV4IDc5ODVhYTIuLjNjMzZjOWUgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9vbGUyZGlzcC5zcGVjCisrKyBiL2lmMTYzMi9vbGUyZGlzcC5zcGVjCkBAIC0yLDEyICsyLDEyIEBACiB0eXBlCXdpbjE2CiAKIDEgc3R1YiBETExHRVRDTEFTU09CSkVDVAotMiBwYXNjYWwgU3lzQWxsb2NTdHJpbmcocHRyKQlTeXNBbGxvY1N0cmluZwotMyBwYXNjYWwgU3lzUmVhbGxvY1N0cmluZyhwdHIgcHRyKQlTeXNSZUFsbG9jU3RyaW5nCi00IHBhc2NhbCBTeXNBbGxvY1N0cmluZ0xlbihwdHIgd29yZCkJU3lzQWxsb2NTdHJpbmdMZW4KLTUgcGFzY2FsIFN5c1JlQWxsb2NTdHJpbmdMZW4ocHRyIHB0ciB3b3JkKSBTeXNSZUFsbG9jU3RyaW5nTGVuCi02IHBhc2NhbCBTeXNGcmVlU3RyaW5nKGxvbmcpCVN5c0ZyZWVTdHJpbmcKLTcgcGFzY2FsIFN5c1N0cmluZ0xlbihsb25nKQlTeXNTdHJpbmdMZW4KKzIgcGFzY2FsIFN5c0FsbG9jU3RyaW5nKHN0cikJCVN5c0FsbG9jU3RyaW5nCiszIHBhc2NhbCBTeXNSZWFsbG9jU3RyaW5nKHB0ciBzdHIpCVN5c1JlQWxsb2NTdHJpbmcKKzQgcGFzY2FsIFN5c0FsbG9jU3RyaW5nTGVuKHN0ciB3b3JkKQlTeXNBbGxvY1N0cmluZ0xlbgorNSBwYXNjYWwgU3lzUmVBbGxvY1N0cmluZ0xlbihwdHIgc3RyIHdvcmQpIFN5c1JlQWxsb2NTdHJpbmdMZW4KKzYgcGFzY2FsIFN5c0ZyZWVTdHJpbmcoc2Vnc3RyKQkJU3lzRnJlZVN0cmluZworNyBwYXNjYWwgU3lzU3RyaW5nTGVuKHNlZ3N0cikJCVN5c1N0cmluZ0xlbgogOCBzdHViIFZBUklBTlRJTklUCiA5IHN0dWIgVkFSSUFOVENMRUFSCiAxMCBzdHViIFZBUklBTlRDT1BZCmRpZmYgLS1naXQgYS9pZjE2MzIvb2xlMm5scy5zcGVjIGIvaWYxNjMyL29sZTJubHMuc3BlYwppbmRleCBjYTBmZWJjLi4zYjFhODQ2IDEwMDY0NAotLS0gYS9pZjE2MzIvb2xlMm5scy5zcGVjCisrKyBiL2lmMTYzMi9vbGUybmxzLnNwZWMKQEAgLTcsOCArNyw4IEBACiA0IHBhc2NhbCBHZXRTeXN0ZW1EZWZhdWx0TGFuZ0lEKCkgIEdldFN5c3RlbURlZmF1bHRMYW5nSUQKIDUgcGFzY2FsIEdldExvY2FsZUluZm9BKGxvbmcgbG9uZyBwdHIgd29yZCkgR2V0TG9jYWxlSW5mbzE2CiA2IHN0dWIgTENNQVBTVFJJTkdBCi03IHBhc2NhbDE2IEdldFN0cmluZ1R5cGVBKGxvbmcgbG9uZyBwdHIgd29yZCBwdHIpIEdldFN0cmluZ1R5cGUxNgotOCBwYXNjYWwxNiBDb21wYXJlU3RyaW5nQShsb25nIGxvbmcgcHRyIHdvcmQgcHRyIHdvcmQpIENvbXBhcmVTdHJpbmcxNgorNyBwYXNjYWwxNiBHZXRTdHJpbmdUeXBlQShsb25nIGxvbmcgc3RyIHdvcmQgcHRyKSBHZXRTdHJpbmdUeXBlMTYKKzggcGFzY2FsMTYgQ29tcGFyZVN0cmluZ0EobG9uZyBsb25nIHN0ciB3b3JkIHN0ciB3b3JkKSBDb21wYXJlU3RyaW5nMTYKICM5IFdFUAogMTAgc3R1YiBMSUJNQUlOCiAxMSBzdHViIE5PVElGWVdJTkRPV1BST0MKZGlmZiAtLWdpdCBhL2lmMTYzMi9vbGVjbGkuc3BlYyBiL2lmMTYzMi9vbGVjbGkuc3BlYwppbmRleCA2NWM3N2E0Li42NTYyNzRmIDEwMDY0NAotLS0gYS9pZjE2MzIvb2xlY2xpLnNwZWMKKysrIGIvaWYxNjMyL29sZWNsaS5zcGVjCkBAIC01Niw3ICs1Niw3IEBACiA1NyBzdHViIE9MRUVYRUNVVEUKIDU4IHN0dWIgT0xFQ1JFQVRFSU5WSVNJQkxFCiA1OSBzdHViIE9MRVFVRVJZQ0xJRU5UVkVSU0lPTgotNjAgcGFzY2FsMTYgT2xlSXNEY01ldGEod29yZCkgT2xlSXNEY01ldGEKKzYwIHBhc2NhbDE2IE9sZUlzRGNNZXRhKHdvcmQpIE9sZUlzRGNNZXRhMTYKIDEwMCBzdHViIERPQ1dORFBST0MKIDEwMSBzdHViIFNSVlJXTkRQUk9DCiAxMDIgc3R1YiBNRkNBTExCQUNLRlVOQwpkaWZmIC0tZ2l0IGEvaWYxNjMyL3JlbGF5LmMgYi9pZjE2MzIvcmVsYXkuYwppbmRleCAzY2M1YjBkLi4wOTc1ZTA4IDEwMDY0NAotLS0gYS9pZjE2MzIvcmVsYXkuYworKysgYi9pZjE2MzIvcmVsYXkuYwpAQCAtMTcsNyArMTcsNyBAQAogCiAjaWYgMAogLyogTWFrZSBtYWtlX2RlYnVnIHRoaW5rIHRoZXNlIHdlcmUgcmVhbGx5IHVzZWQgKi8KLWRwcmludGZfaW5mbyhyZWxheSwgInRlc3QgLSBkdW1teSIpOworVFJBQ0UocmVsYXksICJ0ZXN0IC0gZHVtbXkiKTsKICNlbmRpZgogCiAKQEAgLTgxLDcgKzgxLDcgQEAKICAgICBjaGFyICphcmdzMTY7CiAgICAgaW50IGk7CiAKLSAgICBpZiAoIWRlYnVnZ2luZ19pbmZvKHJlbGF5KSkgcmV0dXJuOworICAgIGlmICghVFJBQ0VfT04ocmVsYXkpKSByZXR1cm47CiAKICAgICBmcmFtZSA9IENVUlJFTlRfU1RBQ0sxNjsKICAgICBwcmludGYoICJDYWxsICVzKCIsIEJVSUxUSU5fR2V0RW50cnlQb2ludDE2KCBmcmFtZS0+ZW50cnlfY3MsCkBAIC0xOTksNyArMTk5LDcgQEAKICAgICBTVEFDSzE2RlJBTUUgKmZyYW1lOwogICAgIFdPUkQgb3JkaW5hbDsKIAotICAgIGlmICghZGVidWdnaW5nX2luZm8ocmVsYXkpKSByZXR1cm47CisgICAgaWYgKCFUUkFDRV9PTihyZWxheSkpIHJldHVybjsKICAgICBmcmFtZSA9IENVUlJFTlRfU1RBQ0sxNjsKICAgICBwcmludGYoICJSZXQgICVzKCkgIiwgQlVJTFRJTl9HZXRFbnRyeVBvaW50MTYoIGZyYW1lLT5lbnRyeV9jcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5lbnRyeV9pcCwKQEAgLTI1Nyw3ICsyNTcsNyBAQAogewogICAgIFRIREIgKnRoZGI7CiAKLSAgICBpZiAoIWRlYnVnZ2luZ19pbmZvKHJlbGF5KSkgcmV0dXJuOworICAgIGlmICghVFJBQ0VfT04ocmVsYXkpKSByZXR1cm47CiAgICAgdGhkYiA9IFRIUkVBRF9DdXJyZW50KCk7CiAKICAgICBpZiAobmJfYXJncyA9PSAtMSkgIC8qIFJlZ2lzdGVyIGZ1bmN0aW9uICovCkBAIC0zODMsNyArMzgzLDcgQEAKICAgICBpZiAobHBidWZbOF0gIT0gU1NfcmVnKGNvbnRleHQpKQogICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJTd2l0Y2hpbmcgc3RhY2sgc2VnbWVudCB3aXRoIFRocm93KCkgbm90IHN1cHBvcnRlZDsgZXhwZWN0IGNyYXNoIG5vd1xuIiApOwogCi0gICAgaWYgKGRlYnVnZ2luZ19pbmZvKHJlbGF5KSkgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgdmFsaWQgZW50cnkgcG9pbnQgYWRkcmVzcyAqLworICAgIGlmIChUUkFDRV9PTihyZWxheSkpICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIHZhbGlkIGVudHJ5IHBvaW50IGFkZHJlc3MgKi8KICAgICB7CiAgICAgICAgIHN0YXRpYyBGQVJQUk9DMTYgZW50cnlQb2ludCA9IE5VTEw7CiAKQEAgLTQ2OCw3ICs0NjgsNyBAQAogICAgICAgICBpZiAoIUV4KSBTVEFDSzE2X1BPUCggVEhSRUFEX0N1cnJlbnQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgzICsgbnJvZmFyZ3MpICogc2l6ZW9mKERXT1JEKSApOwogCi0JZHByaW50Zl9pbmZvKHJlbGF5LCIlcyAtIHJldHVybnMgJTA4bHhcbiIsZGJnX3N0cihyZWxheSkscmV0KTsKKwlUUkFDRShyZWxheSwiJXMgLSByZXR1cm5zICUwOGx4XG4iLGRiZ19zdHIocmVsYXkpLHJldCk7CiAJSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIGFyZ3MgKTsKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvaWYxNjMyL3NpZ25hbC5jIGIvaWYxNjMyL3NpZ25hbC5jCmluZGV4IGQxZGY3YzUuLjA2YTM2ZDMgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9zaWduYWwuYworKysgYi9pZjE2MzIvc2lnbmFsLmMKQEAgLTQ0LDYgKzQ0LDcgQEAKICAqLwogc3RhdGljIEhBTkRMRVJfREVGKFNJR05BTF9icmVhaykKIHsKKyAgICBIQU5ETEVSX0lOSVQoKTsKICAgICBpZiAoT3B0aW9ucy5kZWJ1ZykKICAgICAgICAgd2luZV9kZWJ1Zyggc2lnbmFsLCBIQU5ETEVSX0NPTlRFWFQgKTsgIC8qIEVudGVyIG91ciBkZWJ1Z2dlciAqLwogICAgIGVsc2UgZXhpdCgwKTsKQEAgLTU3LDYgKzU4LDcgQEAKICAqLwogc3RhdGljIEhBTkRMRVJfREVGKFNJR05BTF90cmFwKQogeworICAgIEhBTkRMRVJfSU5JVCgpOwogICAgIHdpbmVfZGVidWcoIHNpZ25hbCwgSEFORExFUl9DT05URVhUICk7ICAvKiBFbnRlciBvdXIgZGVidWdnZXIgKi8KIH0KIApAQCAtNzAsNiArNzIsNyBAQAogewogICAgIFdPUkQgY3M7CiAgICAgR0VUX0NTKGNzKTsKKyAgICBIQU5ETEVSX0lOSVQoKTsKICAgICBpZiAoQ1Nfc2lnKEhBTkRMRVJfQ09OVEVYVCkgPT0gY3MpCiAgICAgewogICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJTZWdtZW50YXRpb24gZmF1bHQgaW4gMzItYml0IGNvZGUgKDB4JTA4bHgpLlxuIiwKZGlmZiAtLWdpdCBhL2lmMTYzMi9zdHJlc3Muc3BlYyBiL2lmMTYzMi9zdHJlc3Muc3BlYwppbmRleCBkZWM2NWZjLi5lZWZhNDMzIDEwMDY0NAotLS0gYS9pZjE2MzIvc3RyZXNzLnNwZWMKKysrIGIvaWYxNjMyL3N0cmVzcy5zcGVjCkBAIC0xNCw0ICsxNCw2IEBACiAxMyAgcGFzY2FsIGZyZWVhbGx1c2VybWVtKCkJCUZyZWVBbGxVc2VyTWVtCiAxNCAgcGFzY2FsIGFsbG9jZ2RpbWVtKHdvcmQpCQlBbGxvY0dESU1lbQogMTUgIHBhc2NhbCBmcmVlYWxsZ2RpbWVtKCkJCUZyZWVBbGxHRElNZW0KLQorMTYgIHN0dWIgICBHRVRGUkVFSEVBUDMyU1BBQ0UKKzE3ICBzdHViICAgQUxMT0NIRUFQMzJNRU0KKzE4ICBzdHViICAgRlJFRUFMTEhFQVAzMk1FTQpkaWZmIC0tZ2l0IGEvaWYxNjMyL3RodW5rLmMgYi9pZjE2MzIvdGh1bmsuYwppbmRleCAwNWVhZWY3Li41N2FkN2NlIDEwMDY0NAotLS0gYS9pZjE2MzIvdGh1bmsuYworKysgYi9pZjE2MzIvdGh1bmsuYwpAQCAtMjI2LDcgKzIyNiw3IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICB9Ci0gICAgZHByaW50Zl9lcnIodGh1bmssICJUSFVOS19GcmVlOiBpbnZhbGlkIHRodW5rIGFkZHIgJXBcbiIsIHRodW5rICk7CisgICAgRVJSKHRodW5rLCAiaW52YWxpZCB0aHVuayBhZGRyICVwXG4iLCB0aHVuayApOwogfQogCiAKQEAgLTYyNSw3ICs2MjUsNyBAQAogICAgIExQRFdPUkQgICAgIGFyZ3MgPSAoTFBEV09SRCl4YXJnczsKICAgICBEV09SRCAgICAgICByZXQsaTsKIAotICAgIGRwcmludGZfaW5mbyhyZWxheSwiV09XQ2FsbGJhY2sxNkV4KCVwLDB4JTA4bHgsJWxkLCVwLCVwKVxuIiwKKyAgICBUUkFDRShyZWxheSwiKCVwLDB4JTA4bHgsJWxkLCVwLCVwKVxuIiwKICAgICAJcHJvYyxkd0ZsYWdzLGNiQXJncyx4YXJncyxwZHdyZXQKICAgICApOwogICAgIGlmIChkd0ZsYWdzID09IFdDQjE2X0NERUNMKSB7CmRpZmYgLS1naXQgYS9pZjE2MzIvdG9vbGhlbHAuc3BlYyBiL2lmMTYzMi90b29saGVscC5zcGVjCmluZGV4IGEwNmYzNzUuLjhmNTZjOGIgMTAwNjQ0Ci0tLSBhL2lmMTYzMi90b29saGVscC5zcGVjCisrKyBiL2lmMTYzMi90b29saGVscC5zcGVjCkBAIC0zNSwzICszNSw2IEBACiA4MSBzdHViIFRBU0tTRVRDU0lQCiA4MiBzdHViIFRBU0tHRVRDU0lQCiA4MyBzdHViIFRBU0tTV0lUQ0gKKzg0IHN0dWIgTE9DQUwzMklORk8KKzg1IHN0dWIgTE9DQUwzMkZJUlNUCis4NiBzdHViIExPQ0FMMzJORVhUCmRpZmYgLS1naXQgYS9pZjE2MzIvdHlwZWxpYi5zcGVjIGIvaWYxNjMyL3R5cGVsaWIuc3BlYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzg3NmU4Ci0tLSAvZGV2L251bGwKKysrIGIvaWYxNjMyL3R5cGVsaWIuc3BlYwpAQCAtMCwwICsxLDE1IEBACituYW1lIHR5cGVsaWIKK3R5cGUgd2luMTYKKworMiAgc3R1YiBDUkVBVEVUWVBFTElCICAgICAgICAgICAgICAgIAorMyAgc3R1YiBMT0FEVFlQRUxJQiAgICAgICAgICAgICAgICAgIAorNCAgc3R1YiBMSEFTSFZBTE9GTkFNRVNZUyAgICAgICAgICAgIAorNSAgc3R1YiBfSUlEX0lDUkVBVEVUWVBFSU5GTyAgICAgICAgIAorNiAgc3R1YiBfSUlEX0lDUkVBVEVUWVBFTElCICAgICAgICAgIAorNyAgc3R1YiBfSUlEX0lUWVBFQ09NUCAgICAgICAgICAgICAgIAorOCAgc3R1YiBfSUlEX0lUWVBFSU5GTyAgICAgICAgICAgICAgIAorOSAgc3R1YiBfSUlEX0lUWVBFTElCICAgICAgICAgICAgICAgIAorMTAgc3R1YiBSRUdJU1RFUlRZUEVMSUIgICAgICAgICAgICAgIAorMTEgc3R1YiBMT0FEUkVHVFlQRUxJQiAgICAgICAgICAgICAgIAorMTQgcGFzY2FsIFF1ZXJ5UGF0aE9mUmVnVHlwZUxpYihwdHIgd29yZCB3b3JkIHdvcmQgcHRyKSBRdWVyeVBhdGhPZlJlZ1R5cGVMaWIKKzE1IHN0dWIgT0FCVUlMRFZFUlNJT04gICAgICAgICAgICAgICAKZGlmZiAtLWdpdCBhL2lmMTYzMi91c2VyLnNwZWMgYi9pZjE2MzIvdXNlci5zcGVjCmluZGV4IDMzZDhjM2MuLjQxYmIwNDUgMTAwNjQ0Ci0tLSBhL2lmMTYzMi91c2VyLnNwZWMKKysrIGIvaWYxNjMyL3VzZXIuc3BlYwpAQCAtMjE4LDcgKzIxOCw3IEBACiAyMTMgcGFzY2FsMTYgQnVpbGRDb21tRENCKHB0ciBwdHIpIEJ1aWxkQ29tbURDQjE2CiAyMTQgcGFzY2FsICAgRXNjYXBlQ29tbUZ1bmN0aW9uKHdvcmQgd29yZCkgRXNjYXBlQ29tbUZ1bmN0aW9uMTYKIDIxNSBwYXNjYWwxNiBGbHVzaENvbW0od29yZCB3b3JkKSBGbHVzaENvbW0KLTIxNiBzdHViIFVTRVJTRUVVU0VSRE8KKzIxNiBwYXNjYWwgICBVc2VyU2VlVXNlckRvKHdvcmQgd29yZCB3b3JkIHdvcmQpIFVzZXJTZWVVc2VyRG8KIDIxNyBwYXNjYWwxNiBMb29rdXBNZW51SGFuZGxlKHdvcmQgc193b3JkKSBMb29rdXBNZW51SGFuZGxlCiAyMTggcGFzY2FsMTYgRGlhbG9nQm94SW5kaXJlY3Qod29yZCB3b3JkIHdvcmQgc2VncHRyKSBEaWFsb2dCb3hJbmRpcmVjdDE2CiAyMTkgcGFzY2FsMTYgQ3JlYXRlRGlhbG9nSW5kaXJlY3Qod29yZCBwdHIgd29yZCBzZWdwdHIpIENyZWF0ZURpYWxvZ0luZGlyZWN0MTYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNjb25maWcuaCBiL2luY2x1ZGUvYWNjb25maWcuaAppbmRleCBkYWNjMzQ1Li41MTIzNjRiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjY29uZmlnLmgKKysrIGIvaW5jbHVkZS9hY2NvbmZpZy5oCkBAIC0yMCwzICsyMCw2IEBACiAKIC8qIERlZmluZSBpZiBYIGxpYnJhcmllcyBhcmUgbm90IHJlZW50cmFudCAoY29tcGlsZWQgd2l0aG91dCAtRF9SRUVOVFJBTlQpLiAgKi8KICN1bmRlZiBOT19SRUVOVFJBTlRfWDExCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSBtYWNoaW5lL3NvdW5kY2FyZC5oIGluc3RlYWQgb2Ygc3lzL3NvdW5kY2FyZC5oLiAgKi8KKyN1bmRlZiBIQVZFX01BQ0hJTkVfU09VTkRDQVJEX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29tbWN0cmwuaCBiL2luY2x1ZGUvY29tbWN0cmwuaAppbmRleCBhOGIwYWUxLi4zOGVhOTU5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbW1jdHJsLmgKKysrIGIvaW5jbHVkZS9jb21tY3RybC5oCkBAIC0xMDgsNCArMTA4LDg0IEBACiBWT0lEICAgICAgIFdJTkFQSSBEcmF3U3RhdHVzVGV4dDMyVyhIREMzMixMUFJFQ1QzMixMUENXU1RSLFVJTlQzMik7CiAjZGVmaW5lICAgIERyYXdTdGF0dXNUZXh0IFdJTkVMSUJfTkFNRV9BVyhEcmF3U3RhdHVzVGV4dCkKIAorCisvKiBJbWFnZUxpc3QgKi8KKworI2lmIGRlZmluZWQoX19XSU5FX18pICYmIGRlZmluZWQoX19XSU5FX0lNQUdFTElTVF9DKQorI2Vsc2UKK3N0cnVjdCBfSU1BR0VMSVNUOwordHlwZWRlZiBzdHJ1Y3QgX0lNQUdFTElTVCAqSElNQUdFTElTVDsKKyNlbmRpZiAgLyogX19XSU5FX18gKi8KKworI2RlZmluZSBDTFJfTk9ORSAgICAgIDB4RkZGRkZGRkYKKyNkZWZpbmUgQ0xSX0RFRkFVTFQgICAweDAwMDAwMDAwCisjZGVmaW5lIENMUl9ISUxJR0hUICAgQ0xSX0RFRkFVTFQKKworI2RlZmluZSBJTENfTUFTSyAgICAgICAweDAwMDEKKyNkZWZpbmUgSUxDX0NPTE9SICAgICAgMHgwMDAwCisjZGVmaW5lIElMQ19DT0xPUkREQiAgIDB4MDBGRQorI2RlZmluZSBJTENfQ09MT1I0ICAgICAweDAwMDQKKyNkZWZpbmUgSUxDX0NPTE9SOCAgICAgMHgwMDA4CisjZGVmaW5lIElMQ19DT0xPUjE2ICAgIDB4MDAxMAorI2RlZmluZSBJTENfQ09MT1IyNCAgICAweDAwMTgKKyNkZWZpbmUgSUxDX0NPTE9SMzIgICAgMHgwMDIwCisjZGVmaW5lIElMQ19QQUxFVFRFICAgIDB4MDgwMAorCisjZGVmaW5lIElMRF9OT1JNQUwgICAgICAgMHgwMDAwCisjZGVmaW5lIElMRF9UUkFOU1BBUkVOVCAgMHgwMDAxCisjZGVmaW5lIElMRF9CTEVORDI1ICAgICAgMHgwMDAyCisjZGVmaW5lIElMRF9CTEVORDUwICAgICAgMHgwMDA0CisjZGVmaW5lIElMRF9NQVNLICAgICAgICAgMHgwMDEwCisjZGVmaW5lIElMRF9JTUFHRSAgICAgICAgMHgwMDIwCisjZGVmaW5lIElMRF9ST1AgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIElMRF9PVkVSTEFZTUFTSyAgMHgwRjAwCisKKyNkZWZpbmUgSUxEX1NFTEVDVEVEICAgICBJTERfQkxFTkQ1MAorI2RlZmluZSBJTERfRk9DVVMgICAgICAgIElMRF9CTEVORDI1CisjZGVmaW5lIElMRF9CTEVORCAgICAgICAgSUxEX0JMRU5ENTAKKworI2RlZmluZSBJTkRFWFRPT1ZFUkxBWU1BU0soaSkgICgoaSk8PDgpCisKK3R5cGVkZWYgc3RydWN0IF9JTUFHRUlORk8KK3sKKyAgICBIQklUTUFQMzIgaGJtSW1hZ2U7CisgICAgSEJJVE1BUDMyIGhibU1hc2s7CisgICAgSU5UMzIgICAgIFVudXNlZDE7CisgICAgSU5UMzIgICAgIFVudXNlZDI7CisgICAgUkVDVDMyICAgIHJjSW1hZ2U7Cit9IElNQUdFSU5GTzsKKworCitJTlQzMiAgICAgIFdJTkFQSSBJbWFnZUxpc3RfQWRkKEhJTUFHRUxJU1QsSEJJVE1BUDMyLEhCSVRNQVAzMik7CitJTlQzMiAgICAgIFdJTkFQSSBJbWFnZUxpc3RfQWRkTWFza2VkKEhJTUFHRUxJU1QsSEJJVE1BUDMyLENPTE9SUkVGKTsKKworSElNQUdFTElTVCBXSU5BUEkgSW1hZ2VMaXN0X0NyZWF0ZShJTlQzMixJTlQzMixVSU5UMzIsSU5UMzIsSU5UMzIpOworQk9PTDMyICAgICBXSU5BUEkgSW1hZ2VMaXN0X0Rlc3Ryb3koSElNQUdFTElTVCk7CisKK0JPT0wzMiAgICAgV0lOQVBJIEltYWdlTGlzdF9EcmF3KEhJTUFHRUxJU1QsSU5UMzIsSERDMzIsSU5UMzIsSU5UMzIsVUlOVDMyKTsKKworQ09MT1JSRUYgICBXSU5BUEkgSW1hZ2VMaXN0X0dldEJrQ29sb3IoSElNQUdFTElTVCk7CisKK0JPT0wzMiAgICAgV0lOQVBJIEltYWdlTGlzdF9HZXRJY29uU2l6ZShISU1BR0VMSVNULElOVDMyKixJTlQzMiopOworSU5UMzIgICAgICBXSU5BUEkgSW1hZ2VMaXN0X0dldEltYWdlQ291bnQoSElNQUdFTElTVCk7CitCT09MMzIgICAgIFdJTkFQSSBJbWFnZUxpc3RfR2V0SW1hZ2VJbmZvKEhJTUFHRUxJU1QsSU5UMzIsSU1BR0VJTkZPKik7CisKK0hJTUFHRUxJU1QgV0lOQVBJIEltYWdlTGlzdF9Mb2FkSW1hZ2UzMkEoSElOU1RBTkNFMzIsTFBDU1RSLElOVDMyLElOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xPUlJFRixVSU5UMzIsVUlOVDMyKTsKK0hJTUFHRUxJU1QgV0lOQVBJIEltYWdlTGlzdF9Mb2FkSW1hZ2UzMlcoSElOU1RBTkNFMzIsTFBDV1NUUixJTlQzMixJTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MT1JSRUYsVUlOVDMyLFVJTlQzMik7CisjZGVmaW5lICAgIEltYWdlTGlzdF9Mb2FkSW1hZ2UgV0lORUxJQl9OQU1FX0FXKEltYWdlTGlzdF9Mb2FkSW1hZ2UpCitISU1BR0VMSVNUIFdJTkFQSSBJbWFnZUxpc3RfTWVyZ2UoSElNQUdFTElTVCxJTlQzMixISU1BR0VMSVNULElOVDMyLElOVDMyLElOVDMyKTsKKworQk9PTDMyICAgICBXSU5BUEkgSW1hZ2VMaXN0X1JlcGxhY2UoSElNQUdFTElTVCxJTlQzMixIQklUTUFQMzIsSEJJVE1BUDMyKTsKK0lOVDMyICAgICAgV0lOQVBJIEltYWdlTGlzdF9SZXBsYWNlSWNvbihISU1BR0VMSVNULElOVDMyLEhJQ09OMzIpOworCitDT0xPUlJFRiAgIFdJTkFQSSBJbWFnZUxpc3RfU2V0QmtDb2xvcihISU1BR0VMSVNULENPTE9SUkVGKTsKKworQk9PTDMyICAgICBXSU5BUEkgSW1hZ2VMaXN0X1NldE92ZXJsYXlJbWFnZShISU1BR0VMSVNULElOVDMyLElOVDMyKTsKKworI2RlZmluZSBJbWFnZUxpc3RfQWRkSWNvbihoaW1sLGhpY29uKSBJbWFnZUxpc3RfUmVwbGFjZUljb24oaGltbCwtMSxoaWNvbikKKyNkZWZpbmUgSW1hZ2VMaXN0X0xvYWRCaXRtYXAoaGksbHBibXAsY3gsY0dyb3csY3JNYXNrKSBcCisgIEltYWdlTGlzdF9Mb2FkSW1hZ2UoaGksbHBibXAsY3gsY0dyb3csY3JNYXNrLElNQUdFX0JJVE1BUCwwKQorCiAjZW5kaWYgIC8qIF9fV0lORV9DT01NQ1RSTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZy5oLmluIGIvaW5jbHVkZS9jb25maWcuaC5pbgppbmRleCA1YmQ5NGQyLi5kZTNlYzY1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZy5oLmluCisrKyBiL2luY2x1ZGUvY29uZmlnLmguaW4KQEAgLTMzLDYgKzMzLDkgQEAKIC8qIERlZmluZSBpZiBYIGxpYnJhcmllcyBhcmUgbm90IHJlZW50cmFudCAoY29tcGlsZWQgd2l0aG91dCAtRF9SRUVOVFJBTlQpLiAgKi8KICN1bmRlZiBOT19SRUVOVFJBTlRfWDExCiAKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSBtYWNoaW5lL3NvdW5kY2FyZC5oIGluc3RlYWQgb2Ygc3lzL3NvdW5kY2FyZC5oLiAgKi8KKyN1bmRlZiBIQVZFX01BQ0hJTkVfU09VTkRDQVJEX0gKKwogLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBjbG9uZSBmdW5jdGlvbi4gICovCiAjdW5kZWYgSEFWRV9DTE9ORQogCkBAIC00NSw2ICs0OCw5IEBACiAvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHRjZ2V0YXR0ciBmdW5jdGlvbi4gICovCiAjdW5kZWYgSEFWRV9UQ0dFVEFUVFIKIAorLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB0aW1lZ20gZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfVElNRUdNCisKIC8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdXNsZWVwIGZ1bmN0aW9uLiAgKi8KICN1bmRlZiBIQVZFX1VTTEVFUAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RlYnVnLmggYi9pbmNsdWRlL2RlYnVnLmgKaW5kZXggZjAwZmY1Ny4uY2RlMTg5MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kZWJ1Zy5oCisrKyBiL2luY2x1ZGUvZGVidWcuaApAQCAtMSw5ICsxLDEwIEBACiAvKiBEbyBub3QgbW9kaWZ5IHRoaXMgZmlsZSAtLSBpdCBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCEgKi8KIAotI2lmbmRlZiBfX0RFQlVHVE9PTFNfSAorI2lmbmRlZiBfX1dJTkVfREVCVUdUT09MU19ICiAjaW5jbHVkZSAiZGVidWd0b29scy5oIgogI2VuZGlmCiAKKy8qIERlZmluaXRpb25zIGZvciBjaGFubmVscyBpZGVudGlmaWVycyAqLwogI2RlZmluZSBkYmNoX2FjY2VsIDAKICNkZWZpbmUgZGJjaF9hc3BpIDEKICNkZWZpbmUgZGJjaF9hdG9tIDIKQEAgLTIyLDc0ICsyMyw4MiBAQAogI2RlZmluZSBkYmNoX2N1cnNvciAxNQogI2RlZmluZSBkYmNoX2RjIDE2CiAjZGVmaW5lIGRiY2hfZGRlIDE3Ci0jZGVmaW5lIGRiY2hfZGRyYXcgMTgKLSNkZWZpbmUgZGJjaF9kaWFsb2cgMTkKLSNkZWZpbmUgZGJjaF9kbGwgMjAKLSNkZWZpbmUgZGJjaF9kb3NmcyAyMQotI2RlZmluZSBkYmNoX2RyaXZlciAyMgotI2RlZmluZSBkYmNoX2Rzb3VuZCAyMwotI2RlZmluZSBkYmNoX2VkaXQgMjQKLSNkZWZpbmUgZGJjaF9ldmVudCAyNQotI2RlZmluZSBkYmNoX2V4ZWMgMjYKLSNkZWZpbmUgZGJjaF9maWxlIDI3Ci0jZGVmaW5lIGRiY2hfZml4dXAgMjgKLSNkZWZpbmUgZGJjaF9mb250IDI5Ci0jZGVmaW5lIGRiY2hfZ2RpIDMwCi0jZGVmaW5lIGRiY2hfZ2xvYmFsIDMxCi0jZGVmaW5lIGRiY2hfZ3JhcGhpY3MgMzIKLSNkZWZpbmUgZGJjaF9oZWFwIDMzCi0jZGVmaW5lIGRiY2hfaG9vayAzNAotI2RlZmluZSBkYmNoX2ljb24gMzUKLSNkZWZpbmUgZGJjaF9pbnQgMzYKLSNkZWZpbmUgZGJjaF9rZXkgMzcKLSNkZWZpbmUgZGJjaF9rZXlib2FyZCAzOAotI2RlZmluZSBkYmNoX2xkdCAzOQotI2RlZmluZSBkYmNoX2xpc3Rib3ggNDAKLSNkZWZpbmUgZGJjaF9sb2NhbCA0MQotI2RlZmluZSBkYmNoX21jaSA0MgotI2RlZmluZSBkYmNoX21jaWFuaW0gNDMKLSNkZWZpbmUgZGJjaF9tY2l3YXZlIDQ0Ci0jZGVmaW5lIGRiY2hfbWRpIDQ1Ci0jZGVmaW5lIGRiY2hfbWVudSA0NgotI2RlZmluZSBkYmNoX21lc3NhZ2UgNDcKLSNkZWZpbmUgZGJjaF9tZXRhZmlsZSA0OAotI2RlZmluZSBkYmNoX21pZGkgNDkKLSNkZWZpbmUgZGJjaF9tbWF1eCA1MAotI2RlZmluZSBkYmNoX21taW8gNTEKLSNkZWZpbmUgZGJjaF9tbXN5cyA1MgotI2RlZmluZSBkYmNoX21tdGltZSA1MwotI2RlZmluZSBkYmNoX21vZHVsZSA1NAotI2RlZmluZSBkYmNoX21zZyA1NQotI2RlZmluZSBkYmNoX25vbmNsaWVudCA1NgotI2RlZmluZSBkYmNoX29sZSA1NwotI2RlZmluZSBkYmNoX3BhbGV0dGUgNTgKLSNkZWZpbmUgZGJjaF9wcm9maWxlIDU5Ci0jZGVmaW5lIGRiY2hfcHJvZ3Jlc3MgNjAKLSNkZWZpbmUgZGJjaF9wcm9wIDYxCi0jZGVmaW5lIGRiY2hfcmVnIDYyCi0jZGVmaW5lIGRiY2hfcmVnaW9uIDYzCi0jZGVmaW5lIGRiY2hfcmVsYXkgNjQKLSNkZWZpbmUgZGJjaF9yZXNvdXJjZSA2NQotI2RlZmluZSBkYmNoX3Njcm9sbCA2NgotI2RlZmluZSBkYmNoX3NlbGVjdG9yIDY3Ci0jZGVmaW5lIGRiY2hfc2VtIDY4Ci0jZGVmaW5lIGRiY2hfc2VuZG1zZyA2OQotI2RlZmluZSBkYmNoX3NobSA3MAotI2RlZmluZSBkYmNoX3N0ZGRlYiA3MQotI2RlZmluZSBkYmNoX3N0cmVzcyA3MgotI2RlZmluZSBkYmNoX3N0cmluZyA3MwotI2RlZmluZSBkYmNoX3Rhc2sgNzQKLSNkZWZpbmUgZGJjaF90ZXh0IDc1Ci0jZGVmaW5lIGRiY2hfdGh1bmsgNzYKLSNkZWZpbmUgZGJjaF90aW1lciA3NwotI2RlZmluZSBkYmNoX3Rvb2xoZWxwIDc4Ci0jZGVmaW5lIGRiY2hfdHdlYWsgNzkKLSNkZWZpbmUgZGJjaF91cGRvd24gODAKLSNkZWZpbmUgZGJjaF92ZXIgODEKLSNkZWZpbmUgZGJjaF92aXJ0dWFsIDgyCi0jZGVmaW5lIGRiY2hfdnhkIDgzCi0jZGVmaW5lIGRiY2hfd2luIDg0Ci0jZGVmaW5lIGRiY2hfd2luMTZkcnYgODUKLSNkZWZpbmUgZGJjaF93aW4zMiA4NgotI2RlZmluZSBkYmNoX3dpbnNvY2sgODcKLSNkZWZpbmUgZGJjaF94MTEgODgKKyNkZWZpbmUgZGJjaF9kZGVtbCAxOAorI2RlZmluZSBkYmNoX2RkcmF3IDE5CisjZGVmaW5lIGRiY2hfZGlhbG9nIDIwCisjZGVmaW5lIGRiY2hfZGxsIDIxCisjZGVmaW5lIGRiY2hfZG9zZnMgMjIKKyNkZWZpbmUgZGJjaF9kcml2ZXIgMjMKKyNkZWZpbmUgZGJjaF9kc291bmQgMjQKKyNkZWZpbmUgZGJjaF9lZGl0IDI1CisjZGVmaW5lIGRiY2hfZXZlbnQgMjYKKyNkZWZpbmUgZGJjaF9leGVjIDI3CisjZGVmaW5lIGRiY2hfZmlsZSAyOAorI2RlZmluZSBkYmNoX2ZpeHVwIDI5CisjZGVmaW5lIGRiY2hfZm9udCAzMAorI2RlZmluZSBkYmNoX2dkaSAzMQorI2RlZmluZSBkYmNoX2dsb2JhbCAzMgorI2RlZmluZSBkYmNoX2dyYXBoaWNzIDMzCisjZGVmaW5lIGRiY2hfaGVhcCAzNAorI2RlZmluZSBkYmNoX2hvb2sgMzUKKyNkZWZpbmUgZGJjaF9pY29uIDM2CisjZGVmaW5lIGRiY2hfaW50IDM3CisjZGVmaW5lIGRiY2hfaW50MjEgMzgKKyNkZWZpbmUgZGJjaF9rZXkgMzkKKyNkZWZpbmUgZGJjaF9rZXlib2FyZCA0MAorI2RlZmluZSBkYmNoX2xkdCA0MQorI2RlZmluZSBkYmNoX2xpc3Rib3ggNDIKKyNkZWZpbmUgZGJjaF9sb2NhbCA0MworI2RlZmluZSBkYmNoX21jaSA0NAorI2RlZmluZSBkYmNoX21jaWFuaW0gNDUKKyNkZWZpbmUgZGJjaF9tY2l3YXZlIDQ2CisjZGVmaW5lIGRiY2hfbWRpIDQ3CisjZGVmaW5lIGRiY2hfbWVudSA0OAorI2RlZmluZSBkYmNoX21lc3NhZ2UgNDkKKyNkZWZpbmUgZGJjaF9tZXRhZmlsZSA1MAorI2RlZmluZSBkYmNoX21pZGkgNTEKKyNkZWZpbmUgZGJjaF9tbWF1eCA1MgorI2RlZmluZSBkYmNoX21taW8gNTMKKyNkZWZpbmUgZGJjaF9tbXN5cyA1NAorI2RlZmluZSBkYmNoX21tdGltZSA1NQorI2RlZmluZSBkYmNoX21vZHVsZSA1NgorI2RlZmluZSBkYmNoX21zZyA1NworI2RlZmluZSBkYmNoX25vbmNsaWVudCA1OAorI2RlZmluZSBkYmNoX29sZSA1OQorI2RlZmluZSBkYmNoX3BhbGV0dGUgNjAKKyNkZWZpbmUgZGJjaF9wcm9maWxlIDYxCisjZGVmaW5lIGRiY2hfcHJvZ3Jlc3MgNjIKKyNkZWZpbmUgZGJjaF9wcm9wIDYzCisjZGVmaW5lIGRiY2hfcmVnIDY0CisjZGVmaW5lIGRiY2hfcmVnaW9uIDY1CisjZGVmaW5lIGRiY2hfcmVsYXkgNjYKKyNkZWZpbmUgZGJjaF9yZXNvdXJjZSA2NworI2RlZmluZSBkYmNoX3Njcm9sbCA2OAorI2RlZmluZSBkYmNoX3NlbGVjdG9yIDY5CisjZGVmaW5lIGRiY2hfc2VtIDcwCisjZGVmaW5lIGRiY2hfc2VuZG1zZyA3MQorI2RlZmluZSBkYmNoX3NobSA3MgorI2RlZmluZSBkYmNoX3N0YXRpYyA3MworI2RlZmluZSBkYmNoX3N0cmVzcyA3NAorI2RlZmluZSBkYmNoX3N0cmluZyA3NQorI2RlZmluZSBkYmNoX3Rhc2sgNzYKKyNkZWZpbmUgZGJjaF90ZXh0IDc3CisjZGVmaW5lIGRiY2hfdGh1bmsgNzgKKyNkZWZpbmUgZGJjaF90aW1lciA3OQorI2RlZmluZSBkYmNoX3Rvb2xoZWxwIDgwCisjZGVmaW5lIGRiY2hfdHdlYWsgODEKKyNkZWZpbmUgZGJjaF91aXRvb2xzIDgyCisjZGVmaW5lIGRiY2hfdXBkb3duIDgzCisjZGVmaW5lIGRiY2hfdmVyIDg0CisjZGVmaW5lIGRiY2hfdmlydHVhbCA4NQorI2RlZmluZSBkYmNoX3Z4ZCA4NgorI2RlZmluZSBkYmNoX3dpbiA4NworI2RlZmluZSBkYmNoX3dpbjE2ZHJ2IDg4CisjZGVmaW5lIGRiY2hfd2luMzIgODkKKyNkZWZpbmUgZGJjaF93aW5zb2NrIDkwCisjZGVmaW5lIGRiY2hfeDExIDkxCisvKiBEZWZpbml0aW9ucyBmb3IgY2xhc3NlcyBpZGVudGlmaWVycyAqLworI2RlZmluZSBkYmNsX2ZpeG1lIDAKKyNkZWZpbmUgZGJjbF9lcnIgMQorI2RlZmluZSBkYmNsX3dhcm4gMgorI2RlZmluZSBkYmNsX3RyYWNlIDMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZGVidWdkZWZzLmggYi9pbmNsdWRlL2RlYnVnZGVmcy5oCmluZGV4IGVmYTYzNzEuLjkzZjUwOTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZGVidWdkZWZzLmgKKysrIGIvaW5jbHVkZS9kZWJ1Z2RlZnMuaApAQCAtMSwxMCArMSwxMCBAQAogLyogRG8gbm90IG1vZGlmeSB0aGlzIGZpbGUgLS0gaXQgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQhICovCiAKLSNpZm5kZWYgX19ERUJVR1RPT0xTX0gKKyNpZm5kZWYgX19XSU5FX0RFQlVHVE9PTFNfSAogI2luY2x1ZGUgImRlYnVndG9vbHMuaCIKICNlbmRpZgogCi0jZGVmaW5lIERFQlVHX0NIQU5ORUxfQ09VTlQgODkKKyNkZWZpbmUgREVCVUdfQ0hBTk5FTF9DT1VOVCA5MgogI2lmZGVmIERFQlVHX1JVTlRJTUUKIHNob3J0IGRlYnVnX21zZ19lbmFibGVkW11bREVCVUdfQ0xBU1NfQ09VTlRdID0gewogezEsIDEsIDAsIDB9LApAQCAtOTYsNiArOTYsOSBAQAogezEsIDEsIDAsIDB9LAogezEsIDEsIDAsIDB9LAogezEsIDEsIDAsIDB9LAorezEsIDEsIDAsIDB9LAorezEsIDEsIDAsIDB9LAorezEsIDEsIDAsIDB9LAogfTsKIGNvbnN0IGNoYXIqIGRlYnVnX2NoX25hbWVbXSA9IHsKICJhY2NlbCIsCkBAIC0xMTYsNiArMTE5LDcgQEAKICJjdXJzb3IiLAogImRjIiwKICJkZGUiLAorImRkZW1sIiwKICJkZHJhdyIsCiAiZGlhbG9nIiwKICJkbGwiLApAQCAtMTM1LDYgKzEzOSw3IEBACiAiaG9vayIsCiAiaWNvbiIsCiAiaW50IiwKKyJpbnQyMSIsCiAia2V5IiwKICJrZXlib2FyZCIsCiAibGR0IiwKQEAgLTE2OSw3ICsxNzQsNyBAQAogInNlbSIsCiAic2VuZG1zZyIsCiAic2htIiwKLSJzdGRkZWIiLAorInN0YXRpYyIsCiAic3RyZXNzIiwKICJzdHJpbmciLAogInRhc2siLApAQCAtMTc4LDYgKzE4Myw3IEBACiAidGltZXIiLAogInRvb2xoZWxwIiwKICJ0d2VhayIsCisidWl0b29scyIsCiAidXBkb3duIiwKICJ2ZXIiLAogInZpcnR1YWwiLApAQCAtMTg4LDkgKzE5NCwxMiBAQAogIndpbnNvY2siLAogIngxMSIsCiB9OwotCi1jb25zdCBjaGFyKiBkZWJ1Z19jbF9uYW1lW10gPQoteyAiZml4bWUiLCAiZXJyIiwgIndhcm4iLCAiaW5mbyIgfTsKK2NvbnN0IGNoYXIqIGRlYnVnX2NsX25hbWVbXSA9IHsKKyJmaXhtZSIsCisiZXJyIiwKKyJ3YXJuIiwKKyJ0cmFjZSIsCit9OwogCiAjZW5kaWYgLypERUJVR19SVU5USU1FKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kZWJ1Z3Rvb2xzLmggYi9pbmNsdWRlL2RlYnVndG9vbHMuaAppbmRleCAzOTNkZDI1Li5iMTMzODA5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2RlYnVndG9vbHMuaAorKysgYi9pbmNsdWRlL2RlYnVndG9vbHMuaApAQCAtMSw2ICsxLDYgQEAKIAotI2lmbmRlZiBfX0RFQlVHVE9PTFNfSAotI2RlZmluZSBfX0RFQlVHVE9PTFNfSAorI2lmbmRlZiBfX1dJTkVfREVCVUdUT09MU19ICisjZGVmaW5lIF9fV0lORV9ERUJVR1RPT0xTX0gKIAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAKQEAgLTExLDggKzExLDYgQEAKICNkZWZpbmUgREVCVUdfQ0xBU1NfQ09VTlQgNAogCiBleHRlcm4gc2hvcnQgZGVidWdfbXNnX2VuYWJsZWRbXVtERUJVR19DTEFTU19DT1VOVF07Ci1leHRlcm4gY29uc3QgY2hhciogZGVidWdfY2hfbmFtZVtdOwotZXh0ZXJuIGNvbnN0IGNoYXIqIGRlYnVnX2NsX25hbWVbXTsKIAogI2RlZmluZSBkYmdfc3RyKG5hbWUpIGRlYnVnX3N0cl8jI25hbWUKICNkZWZpbmUgZGJnX2J1ZihuYW1lKSBkZWJ1Z19idWZfIyNuYW1lCkBAIC0yOSwzOCArMjcsMjUgQEAKICNkZWZpbmUgZGJnX2NoX2luZGV4KGNoKSAoZGJjaF8jI2NoKQogI2RlZmluZSBkYmdfY2xfaW5kZXgoY2wpIChkYmNsXyMjY2wpCiAKLSNkZWZpbmUgZGVidWdnaW5nXyhjbCwgY2gpIFwKKyNkZWZpbmUgREVCVUdHSU5HKGNsLCBjaCkgXAogICAoZGJnX2NoX2luZGV4KGNoKSA+PTAgJiYgZGJnX2NsX2luZGV4KGNsKSA+PSAwICYmIFwKICAgIGRlYnVnX21zZ19lbmFibGVkW2RiZ19jaF9pbmRleChjaCldW2RiZ19jbF9pbmRleChjbCldKQogCi0jZGVmaW5lIGRwcmludGYoZm9ybWF0LCBhcmdzLi4uKSBcCisjZGVmaW5lIERQUklOVEYoZm9ybWF0LCBhcmdzLi4uKSBcCiAgIGZwcmludGYoc3RkZGViLCBmb3JtYXQsICMjIGFyZ3MpCiAKLSNkZWZpbmUgZHByaW50Zl8oY2wsIGNoLCBmb3JtYXQsIGFyZ3MuLi4pIFwKLSAgICAgICAgICAgIGlmKCFkZWJ1Z2dpbmdfKGNsLCBjaCkpIDsgXAotICAgICAgICAgICAgZWxzZSBkcHJpbnRmKCIlczolczolczolZDolczogImZvcm1hdCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX2NsX25hbWVbZGJnX2NsX2luZGV4KGNsKV0sIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19jaF9uYW1lW2RiZ19jaF9pbmRleChjaCldLCBcCi0JICAgICAgICAgICAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIF9fRlVOQ1RJT05fXyAsICMjIGFyZ3MpCisjZGVmaW5lIERQUklOVEZfKGNsLCBjaCwgZm9ybWF0LCBhcmdzLi4uKSBcCisgIGlmKCFERUJVR0dJTkcoY2wsIGNoKSkgOyBcCisgIGVsc2UgRFBSSU5URigjIGNsICI6IiAjIGNoICI6JXMgIiBmb3JtYXQsIF9fRlVOQ1RJT05fXyAsICMjIGFyZ3MpCiAKKyNkZWZpbmUgVFJBQ0UoY2gsIGZtdCwgYXJncy4uLikgRFBSSU5URl8odHJhY2UsIGNoLCBmbXQsICMjIGFyZ3MpCisjZGVmaW5lIFdBUk4oY2gsIGZtdCwgYXJncy4uLikgIERQUklOVEZfKHdhcm4sICBjaCwgZm10LCAjIyBhcmdzKQorI2RlZmluZSBGSVhNRShjaCwgZm10LCBhcmdzLi4uKSBEUFJJTlRGXyhmaXhtZSwgY2gsIGZtdCwgIyMgYXJncykKKyNkZWZpbmUgRVJSKGNoLCBmbXQsIGFyZ3MuLi4pICAgRFBSSU5URl8oZXJyLCBjaCwgZm10LCAjIyBhcmdzKQogCisjZGVmaW5lIEZJWE1FX09OKGNoKSAgREVCVUdHSU5HKGZpeG1lLCBjaCkKKyNkZWZpbmUgRVJSX09OKGNoKSAgICBERUJVR0dJTkcoZXJyLCBjaCkKKyNkZWZpbmUgV0FSTl9PTihjaCkgICBERUJVR0dJTkcod2FybiwgY2gpCisjZGVmaW5lIFRSQUNFX09OKGNoKSAgREVCVUdHSU5HKHRyYWNlLCBjaCkKIAotI2RlZmluZSBkZWJ1Z2dpbmdfZml4bWUoY2gpIGRlYnVnZ2luZ18oZml4bWUsIGNoKQotI2RlZmluZSBkZWJ1Z2dpbmdfZXJyKGNoKSBkZWJ1Z2dpbmdfKGVyciwgY2gpCi0jZGVmaW5lIGRlYnVnZ2luZ193YXJuKGNoKSBkZWJ1Z2dpbmdfKHdhcm4sIGNoKQotI2RlZmluZSBkZWJ1Z2dpbmdfaW5mbyhjaCkgZGVidWdnaW5nXyhpbmZvLCBjaCkKLQotI2RlZmluZSBkcHJpbnRmX2ZpeG1lKGNoLCBmb3JtYXQsIGFyZ3MuLi4pIGRwcmludGZfKGZpeG1lLCBjaCwgZm9ybWF0LCAjIyBhcmdzKQotI2RlZmluZSBkcHJpbnRmX2VycihjaCwgZm9ybWF0LCBhcmdzLi4uKSBkcHJpbnRmXyhlcnIsIGNoLCBmb3JtYXQsICMjIGFyZ3MpCi0jZGVmaW5lIGRwcmludGZfd2FybihjaCwgZm9ybWF0LCBhcmdzLi4uKSBkcHJpbnRmXyh3YXJuLCBjaCwgZm9ybWF0LCAjIyBhcmdzKQotI2RlZmluZSBkcHJpbnRmX2luZm8oY2gsIGZvcm1hdCwgYXJncy4uLikgZHByaW50Zl8oaW5mbywgY2gsIGZvcm1hdCwgIyMgYXJncykKLQotI2RlZmluZSBkYmNsX2ZpeG1lIDAKLSNkZWZpbmUgZGJjbF9lcnIgICAxCi0jZGVmaW5lIGRiY2xfd2FybiAgMgotI2RlZmluZSBkYmNsX2luZm8gIDMKLQotI2VuZGlmCi0KLQotCisjZW5kaWYgIC8qIF9fV0lORV9ERUJVR1RPT0xTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvaW1hZ2VsaXN0LmggYi9pbmNsdWRlL2ltYWdlbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MTMyMmIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2ltYWdlbGlzdC5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBJbWFnZUxpc3QgZGVmaW5pdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgMTk5OCBFcmljIEtvaGwKKyAqLworIAorI2lmbmRlZiBfX1dJTkVfSU1BR0VMSVNUX0gKKyNkZWZpbmUgX19XSU5FX0lNQUdFTElTVF9ICisgCitzdHJ1Y3QgX0lNQUdFTElTVAoreworICAgIEhBTkRMRTMyICBoSGVhcDsKKyAgICBIQklUTUFQMzIgaGJtSW1hZ2U7CisgICAgSEJJVE1BUDMyIGhibU1hc2s7CisgICAgQ09MT1JSRUYgIGNsckJrOworICAgIElOVDMyICAgICBjR3JvdzsKKyAgICBJTlQzMiAgICAgY01heEltYWdlOworICAgIElOVDMyICAgICBjQ3VySW1hZ2U7CisgICAgSU5UMzIgICAgIGN4OworICAgIElOVDMyICAgICBjeTsKKyAgICBVSU5UMzIgICAgZmxhZ3M7CisgICAgSU5UMzIgICAgIG5PdmxJZHhbNF07Cit9OworIAordHlwZWRlZiBzdHJ1Y3QgX0lNQUdFTElTVCAqSElNQUdFTElTVDsKKyAKKyAKKyNlbmRpZiAgLyogX19XSU5FX0lNQUdFTElTVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21zZG9zLmggYi9pbmNsdWRlL21zZG9zLmgKaW5kZXggOWE5MDE3YS4uYmE4NmZlNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tc2Rvcy5oCisrKyBiL2luY2x1ZGUvbXNkb3MuaApAQCAtNTYsNiArNTYsNDIgQEAKICAgICBEV09SRCAgZmlsZXNpemU7ICAgICAgICAgICAgIC8qIDFjIGZpbGUgc2l6ZSAqLwogfSBET1NfRElSRU5UUllfTEFZT1VUOwogCit0eXBlZGVmIHN0cnVjdAoreworICAgIFdPUkQgIENYX0ludDIxXzVlMDE7CS8qIGNvbnRlbnRzIG9mIENYIGZyb20gSU5UIDIxL0FYPTVFMDFoICovCisgICAgV09SRCAgTFJVX2NvdW50X0ZDQl9jYWNoZTsJCisgICAgV09SRCAgTFJVX2NvdW50X0ZDQl9vcGVuOworICAgIERXT1JEIE9FTV9mdW5jX2hhbmRsZXIgV0lORV9QQUNLRUQ7IC8qIE9FTSBmdW5jdGlvbiBvZiBJTlQgMjEvQUg9RjhoICovCisgICAgV09SRCAgSU5UMjFfb2Zmc2V0Oy8qIG9mZnNldCBpbiBET1MgQ1Mgb2YgY29kZSB0byByZXR1cm4gZnJvbSBJTlQgMjEgY2FsbCAqLworICAgIFdPUkQgIHNoYXJpbmdfcmV0cnlfY291bnQ7CisgICAgV09SRCAgc2hhcmluZ19yZXRyeV9kZWxheTsKKyAgICBEV09SRCBwdHJfZGlza19idWY7CQkvKiBwdHIgdG8gY3VycmVudCBkaXNrIGJ1ZiAqLworICAgIFdPUkQgIG9mZnNfdW5yZWFkX0NPTjsJLyogcG9pbnRlciBpbiBET1MgZGF0YSBzZWdtZW50IG9mIHVucmVhZCBDT04gaW5wdXQgKi8KKyAgICBXT1JEICBzZWdfZmlyc3RfTUNCOworICAgIERXT1JEIHB0cl9maXJzdF9EUEI7CisgICAgRFdPUkQgcHRyX2ZpcnN0X1N5c0ZpbGVUYWJsZTsKKyAgICBEV09SRCBwdHJfY2xvY2tfZGV2X2hkcjsKKyAgICBEV09SRCBwdHJfQ09OX2Rldl9oZHI7CisgICAgV09SRCAgbWF4X2J5dGVfcGVyX3NlYzsgICAvKiBtYXhpbXVtIGJ5dGVzIHBlciBzZWN0b3Igb2YgYW55IGJsb2NrIGRldmljZSAqLworICAgIERXT1JEIHB0cl9kaXNrX2J1Zl9pbmZvIFdJTkVfUEFDS0VEOworICAgIERXT1JEIHB0cl9hcnJheV9DRFMgV0lORV9QQUNLRUQ7IC8qIGN1cnJlbnQgZGlyZWN0b3J5IHN0cnVjdHVyZSAqLworICAgIERXT1JEIHB0cl9zeXNfRkNCIFdJTkVfUEFDS0VEOworICAgIFdPUkQgIG5yX3Byb3RlY3RfRkNCOworICAgIEJZVEUgIG5yX2Jsb2NrX2RldjsKKyAgICBCWVRFICBucl9hdmFpbF9kcml2ZV9sZXR0ZXJzOworICAgIEJZVEUgIE5VTF9kZXZfaGVhZGVyWzE4XTsKKyAgICBCWVRFICBucl9kcml2ZXNfSk9JTmVkOworICAgIFdPUkQgIHB0cl9zcGVjX3ByZ19uYW1lcyBXSU5FX1BBQ0tFRDsKKyAgICBEV09SRCBwdHJfU0VUVkVSX3ByZ19saXN0IFdJTkVfUEFDS0VEOworICAgIFdPUkQgRE9TX0hJR0hfQTIwX2Z1bmNfb2ZmcyBXSU5FX1BBQ0tFRDsKKyAgICBXT1JEIFBTUF9sYXN0X2V4ZWMgV0lORV9QQUNLRUQ7IC8qIGlmIERPUyBpbiBITUE6IFBTUCBvZiBwcm9ncmFtIGV4ZWN1dGVkIGxhc3Q7IGlmIERPUyBsb3c6IDAwMDBoICovCisgICAgV09SRCBCVUZGRVJTX3ZhbCBXSU5FX1BBQ0tFRDsKKyAgICBXT1JEIEJVRkZFUlNfbnJfbG9va2FoZWFkIFdJTkVfUEFDS0VEOworICAgIEJZVEUgYm9vdF9kcml2ZSBXSU5FX1BBQ0tFRDsKKyAgICBCWVRFIGZsYWdfRFdPUkRfbW92ZXMgV0lORV9QQUNLRUQ7IC8qIDAxaCBmb3IgMzg2KywgMDBoIG90aGVyd2lzZSAqLworICAgIFdPUkQgc2l6ZV9leHRlbmRlZF9tZW0gV0lORV9QQUNLRUQ7IC8qIHNpemUgb2YgZXh0ZW5kZWQgbWVtIGluIEtCICovCit9IERPU19MSVNUT0ZMSVNUUzsKKwogI2RlZmluZSBNQVhfRE9TX0RSSVZFUwkyNgogCiBleHRlcm4gc3RydWN0IERvc0RldmljZVN0cnVjdCBDT01bTUFYX1BPUlRTXTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmVleGUuaCBiL2luY2x1ZGUvbmVleGUuaAppbmRleCA1Mzc4ZmQ5Li5jNWMyNjNmIDEwMDY0NAotLS0gYS9pbmNsdWRlL25lZXhlLmgKKysrIGIvaW5jbHVkZS9uZWV4ZS5oCkBAIC0xMywyNSArMTMsMjcgQEAKICAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKLQlXT1JECWVfbWFnaWM7CS8qIE1aIEhlYWRlciBzaWduYXR1cmUgKi8KLQlXT1JECWVfY2JscDsJCS8qIEJ5dGVzIG9uIGxhc3QgcGFnZSBvZiBmaWxlICovCi0JV09SRAllX2NwOwkJLyogUGFnZXMgaW4gZmlsZSAqLwotCVdPUkQJZV9jcmxjOwkJLyogUmVsb2NhdGlvbnMgKi8KLQlXT1JECWVfY3BhcmhkcjsJLyogU2l6ZSBvZiBoZWFkZXIgaW4gcGFyYWdyYXBocyAqLwotCVdPUkQJZV9taW5hbGxvYzsJLyogTWluaW11bSBleHRyYSBwYXJhZ3JhcGhzIG5lZWRlZCAqLwotCVdPUkQJZV9tYXhhbGxvYzsJLyogTWF4aW11bSBleHRyYSBwYXJhZ3JhcGhzIG5lZWRlZCAqLwotCVdPUkQJZV9zczsJCS8qIEluaXRpYWwgKHJlbGF0aXZlKSBTUyB2YWx1ZSAqLwotCVdPUkQJZV9zcDsJCS8qIEluaXRpYWwgU1AgdmFsdWUgKi8KLQlXT1JECWVfY3N1bTsJCS8qIENoZWNrc3VtICovCi0JV09SRAllX2lwOwkJLyogSW5pdGlhbCBJUCB2YWx1ZSAqLwotCVdPUkQJZV9jczsJCS8qIEluaXRpYWwgKHJlbGF0aXZlKSBDUyB2YWx1ZSAqLwotCVdPUkQJZV9sZmFybGM7CS8qIEZpbGUgYWRkcmVzcyBvZiByZWxvY2F0aW9uIHRhYmxlICovCi0JV09SRAllX292bm87CQkvKiBPdmVybGF5IG51bWJlciAqLwotCVdPUkQJZV9yZXNbNF07CS8qIFJlc2VydmVkIHdvcmRzICovCi0JV09SRAllX29lbWlkOwkvKiBPRU0gaWRlbnRpZmllciAoZm9yIGVfb2VtaW5mbykgKi8KLQlXT1JECWVfb2VtaW5mbzsJLyogT0VNIGluZm9ybWF0aW9uOyBlX29lbWlkIHNwZWNpZmljICovCi0JV09SRAllX3JlczJbMTBdOwkvKiBSZXNlcnZlZCB3b3JkcyAqLwotCVdPUkQJZV9sZmFuZXc7CS8qIE9mZnNldCB0byBleHRlbmRlZCBoZWFkZXIgKi8KKyAgICBXT1JEICBlX21hZ2ljOyAgICAgIC8qIDAwOiBNWiBIZWFkZXIgc2lnbmF0dXJlICovCisgICAgV09SRCAgZV9jYmxwOyAgICAgICAvKiAwMjogQnl0ZXMgb24gbGFzdCBwYWdlIG9mIGZpbGUgKi8KKyAgICBXT1JEICBlX2NwOyAgICAgICAgIC8qIDA0OiBQYWdlcyBpbiBmaWxlICovCisgICAgV09SRCAgZV9jcmxjOyAgICAgICAvKiAwNjogUmVsb2NhdGlvbnMgKi8KKyAgICBXT1JEICBlX2NwYXJoZHI7ICAgIC8qIDA4OiBTaXplIG9mIGhlYWRlciBpbiBwYXJhZ3JhcGhzICovCisgICAgV09SRCAgZV9taW5hbGxvYzsgICAvKiAwYTogTWluaW11bSBleHRyYSBwYXJhZ3JhcGhzIG5lZWRlZCAqLworICAgIFdPUkQgIGVfbWF4YWxsb2M7ICAgLyogMGM6IE1heGltdW0gZXh0cmEgcGFyYWdyYXBocyBuZWVkZWQgKi8KKyAgICBXT1JEICBlX3NzOyAgICAgICAgIC8qIDBlOiBJbml0aWFsIChyZWxhdGl2ZSkgU1MgdmFsdWUgKi8KKyAgICBXT1JEICBlX3NwOyAgICAgICAgIC8qIDEwOiBJbml0aWFsIFNQIHZhbHVlICovCisgICAgV09SRCAgZV9jc3VtOyAgICAgICAvKiAxMjogQ2hlY2tzdW0gKi8KKyAgICBXT1JEICBlX2lwOyAgICAgICAgIC8qIDE0OiBJbml0aWFsIElQIHZhbHVlICovCisgICAgV09SRCAgZV9jczsgICAgICAgICAvKiAxNjogSW5pdGlhbCAocmVsYXRpdmUpIENTIHZhbHVlICovCisgICAgV09SRCAgZV9sZmFybGM7ICAgICAvKiAxODogRmlsZSBhZGRyZXNzIG9mIHJlbG9jYXRpb24gdGFibGUgKi8KKyAgICBXT1JEICBlX292bm87ICAgICAgIC8qIDFhOiBPdmVybGF5IG51bWJlciAqLworICAgIFdPUkQgIGVfcmVzWzRdOyAgICAgLyogMWM6IFJlc2VydmVkIHdvcmRzICovCisgICAgV09SRCAgZV9vZW1pZDsgICAgICAvKiAyNDogT0VNIGlkZW50aWZpZXIgKGZvciBlX29lbWluZm8pICovCisgICAgV09SRCAgZV9vZW1pbmZvOyAgICAvKiAyNjogT0VNIGluZm9ybWF0aW9uOyBlX29lbWlkIHNwZWNpZmljICovCisgICAgV09SRCAgZV9yZXMyWzEwXTsgICAvKiAyODogUmVzZXJ2ZWQgd29yZHMgKi8KKyAgICBXT1JEICBlX2xmYW5ldzsgICAgIC8qIDNjOiBPZmZzZXQgdG8gZXh0ZW5kZWQgaGVhZGVyICovCisgICAgV09SRCAgZV94eHg7ICAgICAgICAvKiAzZTogV2luZSBpbnRlcm5hbCBwYWQgKHNvbWUgcHJvZ3JhbXMgZXhwZWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgdGhpcyB0byBiZSAwKSAqLwogfSBJTUFHRV9ET1NfSEVBREVSLCpMUElNQUdFX0RPU19IRUFERVI7CiAKICNkZWZpbmUJSU1BR0VfRE9TX1NJR05BVFVSRQkweDVBNEQJCS8qIE1aICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29sZS5oIGIvaW5jbHVkZS9vbGUuaAppbmRleCBjZjA1MTkwLi5mZDY3MWJlIDEwMDY0NAotLS0gYS9pbmNsdWRlL29sZS5oCisrKyBiL2luY2x1ZGUvb2xlLmgKQEAgLTExOSw3ICsxMTksNyBAQAogCW9sZXVwZGF0ZV9hbHdheXMsCiAJb2xldXBkYXRlX29uc2F2ZSwKIAlvbGV1cGRhdGVfb25jYWxsLAotCW9sZXVwZGF0ZV9vbmNsb3NlLAorCW9sZXVwZGF0ZV9vbmNsb3NlCiB9IE9MRU9QVF9VUERBVEU7CiAKIHR5cGVkZWYJTE9ORwlMSFNFUlZFUjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb2xlMi5oIGIvaW5jbHVkZS9vbGUyLmgKaW5kZXggMzkxODQzZi4uZjY2OTkyOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9vbGUyLmgKKysrIGIvaW5jbHVkZS9vbGUyLmgKQEAgLTcsNyArNywxMCBAQAogCiB0eXBlZGVmIExPTkcgSFJFU1VMVDsKIAorLyogdG8gYmUgaW1wbGVtZW50ZWQgKi8KIHR5cGVkZWYgTFBWT0lEIExQTUVTU0FHRUZJTFRFUjsKK3R5cGVkZWYgTFBWT0lEIExQRFJPUFRBUkdFVDsKK3R5cGVkZWYgTFBWT0lEIExQTU9OSUtFUjsKIAogI2RlZmluZSBTX09LCTAKICNkZWZpbmUgU19GQUxTRQkxCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NobG9iai5oIGIvaW5jbHVkZS9zaGxvYmouaAppbmRleCBmM2NmZjBhLi45ZDI3N2MxIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NobG9iai5oCisrKyBiL2luY2x1ZGUvc2hsb2JqLmgKQEAgLTk2LDcgKzk2LDcgQEAKIHsKICAgICBTSEdETl9OT1JNQUwgICAgICAgICAgICA9IDAsICAgICAgICAvKiBkZWZhdWx0IChkaXNwbGF5IHB1cnBvc2UpICovCiAgICAgU0hHRE5fSU5GT0xERVIgICAgICAgICAgPSAxLCAgICAgICAgLyogZGlzcGxheWVkIHVuZGVyIGEgZm9sZGVyIChyZWxhdGl2ZSkqLwotICAgIFNIR0ROX0ZPUlBBUlNJTkcgICAgICAgID0gMHg4MDAwLCAgIC8qIGZvciBQYXJzZURpc3BsYXlOYW1lIG9yIHBhdGggKi8KKyAgICBTSEdETl9GT1JQQVJTSU5HICAgICAgICA9IDB4ODAwMCAgICAvKiBmb3IgUGFyc2VEaXNwbGF5TmFtZSBvciBwYXRoICovCiB9IFNIR05POwogCiAvKiBJU2hlbGxGb2xkZXI6OkVudW1PYmplY3RzICovCkBAIC0xMDQsNyArMTA0LDcgQEAKIHsKICAgICBTSENPTlRGX0ZPTERFUlMgICAgICAgICA9IDMyLCAgICAgICAvKiBmb3Igc2hlbGwgYnJvd3NlciAqLwogICAgIFNIQ09OVEZfTk9ORk9MREVSUyAgICAgID0gNjQsICAgICAgIC8qIGZvciBkZWZhdWx0IHZpZXcgKi8KLSAgICBTSENPTlRGX0lOQ0xVREVISURERU4gICA9IDEyOCwgICAgICAvKiBmb3IgaGlkZGVuL3N5c3RlbSBvYmplY3RzICovCisgICAgU0hDT05URl9JTkNMVURFSElEREVOICAgPSAxMjggICAgICAgLyogZm9yIGhpZGRlbi9zeXN0ZW0gb2JqZWN0cyAqLwogfSBTSENPTlRGOwogCiAvKiBmcm9tIG9sZWlkbC5oICovCkBAIC0xODMsMTMgKzE4MywxMyBAQAogdHlwZWRlZiBlbnVtIHsKICAgICBTTFJfTk9fVUkgICAgICAgICAgID0gMHgwMDAxLAogICAgIFNMUl9BTllfTUFUQ0ggICAgICAgPSAweDAwMDIsCi0gICAgU0xSX1VQREFURSAgICAgICAgICA9IDB4MDAwNCwKKyAgICBTTFJfVVBEQVRFICAgICAgICAgID0gMHgwMDA0CiB9IFNMUl9GTEFHUzsKIAogLyogSVNoZWxsTGluazo6R2V0UGF0aCBmRmxhZ3MgKi8KIHR5cGVkZWYgZW51bSB7CiAgICAgU0xHUF9TSE9SVFBBVEggICAgICA9IDB4MDAwMSwKLSAgICBTTEdQX1VOQ1BSSU9SSVRZICAgID0gMHgwMDAyLAorICAgIFNMR1BfVU5DUFJJT1JJVFkgICAgPSAweDAwMDIKIH0gU0xHUF9GTEFHUzsKIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NpZ19jb250ZXh0LmggYi9pbmNsdWRlL3NpZ19jb250ZXh0LmgKaW5kZXggMGU3YjAxZS4uM2RiMThlYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zaWdfY29udGV4dC5oCisrKyBiL2luY2x1ZGUvc2lnX2NvbnRleHQuaApAQCAtMjE0LDYgKzIxNCwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogI2RlZmluZSBGTF9zaWcoY29udGV4dCkgICAgICAoKihXT1JEKikmRUZMX3NpZyhjb250ZXh0KSkKIAorI2lmZGVmIEZTX3NpZworI2RlZmluZSBIQU5ETEVSX0lOSVQoKSBTRVRfRlMoRlNfc2lnKEhBTkRMRVJfQ09OVEVYVCkpCisjZWxzZSBGU19zaWcKKyNkZWZpbmUgSEFORExFUl9JTklUKCkgLyogbm90aGluZyAqLworI2VuZGlmCisKKyNlbHNlIC8qIF9faTM4Nl9fICovCisKKyNkZWZpbmUgSEFORExFUl9ERUYobmFtZSkgdm9pZCBuYW1lIChpbnQgc2lnbmFsKQorI2RlZmluZSBIQU5ETEVSX0lOSVQoKSAvKiBub3RoaW5nICovCisKICNlbmRpZiAvKiBfX2kzODZfXyAqLwogCiAjZW5kaWYgLyogX19XSU5FX1NJR19DT05URVhUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXNlci5oIGIvaW5jbHVkZS91c2VyLmgKaW5kZXggYjIzNWI3Ni4uZDFmODkxYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS91c2VyLmgKKysrIGIvaW5jbHVkZS91c2VyLmgKQEAgLTIzLDYgKzIzLDEyIEBACiAjZGVmaW5lIFVTRVJfSEVBUF9TRUdfQUREUihoYW5kbGUpICBcCiAgICAgICAgICAoKGhhbmRsZSkgPyBQVFJfU0VHX09GRl9UT19TRUdQVFIoVVNFUl9IZWFwU2VsLCAoaGFuZGxlKSkgOiAoU0VHUFRSKTApCiAKKyNkZWZpbmUgVVNVRF9MT0NBTEFMTE9DICAgICAgICAweDAwMDEKKyNkZWZpbmUgVVNVRF9MT0NBTEZSRUUgICAgICAgICAweDAwMDIKKyNkZWZpbmUgVVNVRF9MT0NBTENPTVBBQ1QgICAgICAweDAwMDMKKyNkZWZpbmUgVVNVRF9MT0NBTEhFQVAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgVVNVRF9GSVJTVENMQVNTICAgICAgICAweDAwMDUKKwogdm9pZCBVU0VSX1NpZ25hbFByb2MoSEFORExFMTYsIFVJTlQxNiwgVUlOVDE2LCBISU5TVEFOQ0UxNiwgSFFVRVVFMTYpOwogdm9pZCBVU0VSX0V4aXRXaW5kb3dzKHZvaWQpOwogSEdMT0JBTDE2IFVTRVJfQ2FsbERlZmF1bHRSc3JjSGFuZGxlciggSEdMT0JBTDE2IGhNZW1PYmosIEhNT0RVTEUxNiBoTW9kdWxlLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS92ZXJzaW9uLmggYi9pbmNsdWRlL3ZlcnNpb24uaAppbmRleCBjMjI0YTdhLi44ZjUyMDJhIDEwMDY0NAotLS0gYS9pbmNsdWRlL3ZlcnNpb24uaAorKysgYi9pbmNsdWRlL3ZlcnNpb24uaApAQCAtMSArMSBAQAotI2RlZmluZSBXSU5FX1JFTEVBU0VfSU5GTyAiV2luZSByZWxlYXNlIDk4MDMwMSIKKyNkZWZpbmUgV0lORV9SRUxFQVNFX0lORk8gIldpbmUgcmVsZWFzZSA5ODAzMTUiCmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbmRvd3MuaCBiL2luY2x1ZGUvd2luZG93cy5oCmluZGV4IGI0MzkzZGUuLjU5NDRmODMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvd2luZG93cy5oCisrKyBiL2luY2x1ZGUvd2luZG93cy5oCkBAIC0yMTAxLDggKzIxMDEsOCBAQAogLyogNjQgYml0IG51bWJlciBvZiAxMDAgbmFub3NlY29uZHMgaW50ZXJ2YWxzIHNpbmNlIEphbnVhcnkgMSwgMTYwMSAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgSU5UMzIgIGR3TG93RGF0ZVRpbWU7Ci0gIElOVDMyICBkd0hpZ2hEYXRlVGltZTsKKyAgRFdPUkQgIGR3TG93RGF0ZVRpbWU7CisgIERXT1JEICBkd0hpZ2hEYXRlVGltZTsKIH0gRklMRVRJTUUsICpMUEZJTEVUSU1FOwogCiAvKiBGaW5kKiBzdHJ1Y3R1cmVzICovCkBAIC00NDI5LDYgKzQ0MjksMTQ3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMixMUEFSQU0pOwogREVDTF9XSU5FTElCX1RZUEUoTUZFTlVNUFJPQyk7CiAKKy8qIGVuaGFuY2VkIG1ldGFmaWxlIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9ucyAqLworCisvKiBub3RlIHRoYXQgRU5ITUVUQUhFQURFUiBpcyBqdXN0IGEgcGFydGljdWxhciBraW5kIG9mIEVOSE1FVEFSRUNPUkQsCisgICBpZS4gdGhlIGhlYWRlciBpcyBqdXN0IHRoZSBmaXJzdCByZWNvcmQgaW4gdGhlIG1ldGFmaWxlICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRFdPUkQgaVR5cGU7IAorICAgIERXT1JEIG5TaXplOyAKKyAgICBSRUNUMzIgcmNsQm91bmRzOyAKKyAgICBSRUNUMzIgcmNsRnJhbWU7IAorICAgIERXT1JEIGRTaWduYXR1cmU7IAorICAgIERXT1JEIG5WZXJzaW9uOyAKKyAgICBEV09SRCBuQnl0ZXM7IAorICAgIERXT1JEIG5SZWNvcmRzOyAKKyAgICBXT1JEICBuSGFuZGxlczsgCisgICAgV09SRCAgc1Jlc2VydmVkOyAKKyAgICBEV09SRCBuRGVzY3JpcHRpb247IAorICAgIERXT1JEIG9mZkRlc2NyaXB0aW9uOyAKKyAgICBEV09SRCBuUGFsRW50cmllczsgCisgICAgU0laRTMyIHN6bERldmljZTsgCisgICAgU0laRTMyIHN6bE1pbGxpbWV0ZXJzOworICAgIERXT1JEIGNiUGl4ZWxGb3JtYXQ7CisgICAgRFdPUkQgb2ZmUGl4ZWxGb3JtYXQ7CisgICAgRFdPUkQgYk9wZW5HTDsKK30gRU5ITUVUQUhFQURFUiwgKkxQRU5ITUVUQUhFQURFUjsgCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBEV09SRCBpVHlwZTsgCisgICAgRFdPUkQgblNpemU7IAorICAgIERXT1JEIGRQYXJtWzFdOyAKK30gRU5ITUVUQVJFQ09SRCwgKkxQRU5ITUVUQVJFQ09SRDsgCisKK3R5cGVkZWYgSU5UMzIgKENBTExCQUNLICpFTkhNRkVOVU1QUk9DMzIpKEhEQzMyLCBMUEhBTkRMRVRBQkxFMzIsIAorCQkJCQkgIExQRU5ITUVUQVJFQ09SRCwgSU5UMzIsIExQVk9JRCk7CisKKyNkZWZpbmUgRU1SX0hFQURFUgkxCisjZGVmaW5lIEVNUl9QT0xZQkVaSUVSCTIKKyNkZWZpbmUgRU1SX1BPTFlHT04JMworI2RlZmluZSBFTVJfUE9MWUxJTkUJNAorI2RlZmluZSBFTVJfUE9MWUJFWklFUlRPCTUKKyNkZWZpbmUgRU1SX1BPTFlMSU5FVE8JNgorI2RlZmluZSBFTVJfUE9MWVBPTFlMSU5FCTcKKyNkZWZpbmUgRU1SX1BPTFlQT0xZR09OCTgKKyNkZWZpbmUgRU1SX1NFVFdJTkRPV0VYVEVYCTkKKyNkZWZpbmUgRU1SX1NFVFdJTkRPV09SR0VYCTEwCisjZGVmaW5lIEVNUl9TRVRWSUVXUE9SVEVYVEVYCTExCisjZGVmaW5lIEVNUl9TRVRWSUVXUE9SVE9SR0VYCTEyCisjZGVmaW5lIEVNUl9TRVRCUlVTSE9SR0VYCTEzCisjZGVmaW5lIEVNUl9FT0YJMTQKKyNkZWZpbmUgRU1SX1NFVFBJWEVMVgkxNQorI2RlZmluZSBFTVJfU0VUTUFQUEVSRkxBR1MJMTYKKyNkZWZpbmUgRU1SX1NFVE1BUE1PREUJMTcKKyNkZWZpbmUgRU1SX1NFVEJLTU9ERQkxOAorI2RlZmluZSBFTVJfU0VUUE9MWUZJTExNT0RFCTE5CisjZGVmaW5lIEVNUl9TRVRST1AyCTIwCisjZGVmaW5lIEVNUl9TRVRTVFJFVENIQkxUTU9ERQkyMQorI2RlZmluZSBFTVJfU0VUVEVYVEFMSUdOCTIyCisjZGVmaW5lIEVNUl9TRVRDT0xPUkFESlVTVE1FTlQJMjMKKyNkZWZpbmUgRU1SX1NFVFRFWFRDT0xPUgkyNAorI2RlZmluZSBFTVJfU0VUQktDT0xPUgkyNQorI2RlZmluZSBFTVJfT0ZGU0VUQ0xJUFJHTgkyNgorI2RlZmluZSBFTVJfTU9WRVRPRVgJMjcKKyNkZWZpbmUgRU1SX1NFVE1FVEFSR04JMjgKKyNkZWZpbmUgRU1SX0VYQ0xVREVDTElQUkVDVAkyOQorI2RlZmluZSBFTVJfSU5URVJTRUNUQ0xJUFJFQ1QJMzAKKyNkZWZpbmUgRU1SX1NDQUxFVklFV1BPUlRFWFRFWAkzMQorI2RlZmluZSBFTVJfU0NBTEVXSU5ET1dFWFRFWAkzMgorI2RlZmluZSBFTVJfU0FWRURDCTMzCisjZGVmaW5lIEVNUl9SRVNUT1JFREMJMzQKKyNkZWZpbmUgRU1SX1NFVFdPUkxEVFJBTlNGT1JNCTM1CisjZGVmaW5lIEVNUl9NT0RJRllXT1JMRFRSQU5TRk9STQkzNgorI2RlZmluZSBFTVJfU0VMRUNUT0JKRUNUCTM3CisjZGVmaW5lIEVNUl9DUkVBVEVQRU4JMzgKKyNkZWZpbmUgRU1SX0NSRUFURUJSVVNISU5ESVJFQ1QJMzkKKyNkZWZpbmUgRU1SX0RFTEVURU9CSkVDVAk0MAorI2RlZmluZSBFTVJfQU5HTEVBUkMJNDEKKyNkZWZpbmUgRU1SX0VMTElQU0UJNDIKKyNkZWZpbmUgRU1SX1JFQ1RBTkdMRQk0MworI2RlZmluZSBFTVJfUk9VTkRSRUNUCTQ0CisjZGVmaW5lIEVNUl9BUkMJNDUKKyNkZWZpbmUgRU1SX0NIT1JECTQ2CisjZGVmaW5lIEVNUl9QSUUJNDcKKyNkZWZpbmUgRU1SX1NFTEVDVFBBTEVUVEUJNDgKKyNkZWZpbmUgRU1SX0NSRUFURVBBTEVUVEUJNDkKKyNkZWZpbmUgRU1SX1NFVFBBTEVUVEVFTlRSSUVTCTUwCisjZGVmaW5lIEVNUl9SRVNJWkVQQUxFVFRFCTUxCisjZGVmaW5lIEVNUl9SRUFMSVpFUEFMRVRURQk1MgorI2RlZmluZSBFTVJfRVhURkxPT0RGSUxMCTUzCisjZGVmaW5lIEVNUl9MSU5FVE8JNTQKKyNkZWZpbmUgRU1SX0FSQ1RPCTU1CisjZGVmaW5lIEVNUl9QT0xZRFJBVwk1NgorI2RlZmluZSBFTVJfU0VUQVJDRElSRUNUSU9OCTU3CisjZGVmaW5lIEVNUl9TRVRNSVRFUkxJTUlUCTU4CisjZGVmaW5lIEVNUl9CRUdJTlBBVEgJNTkKKyNkZWZpbmUgRU1SX0VORFBBVEgJNjAKKyNkZWZpbmUgRU1SX0NMT1NFRklHVVJFCTYxCisjZGVmaW5lIEVNUl9GSUxMUEFUSAk2MgorI2RlZmluZSBFTVJfU1RST0tFQU5ERklMTFBBVEgJNjMKKyNkZWZpbmUgRU1SX1NUUk9LRVBBVEgJNjQKKyNkZWZpbmUgRU1SX0ZMQVRURU5QQVRICTY1CisjZGVmaW5lIEVNUl9XSURFTlBBVEgJNjYKKyNkZWZpbmUgRU1SX1NFTEVDVENMSVBQQVRICTY3CisjZGVmaW5lIEVNUl9BQk9SVFBBVEgJNjgKKyNkZWZpbmUgRU1SX0dESUNPTU1FTlQJNzAKKyNkZWZpbmUgRU1SX0ZJTExSR04JNzEKKyNkZWZpbmUgRU1SX0ZSQU1FUkdOCTcyCisjZGVmaW5lIEVNUl9JTlZFUlRSR04JNzMKKyNkZWZpbmUgRU1SX1BBSU5UUkdOCTc0CisjZGVmaW5lIEVNUl9FWFRTRUxFQ1RDTElQUkdOCTc1CisjZGVmaW5lIEVNUl9CSVRCTFQJNzYKKyNkZWZpbmUgRU1SX1NUUkVUQ0hCTFQJNzcKKyNkZWZpbmUgRU1SX01BU0tCTFQJNzgKKyNkZWZpbmUgRU1SX1BMR0JMVAk3OQorI2RlZmluZSBFTVJfU0VURElCSVRTVE9ERVZJQ0UJODAKKyNkZWZpbmUgRU1SX1NUUkVUQ0hESUJJVFMJODEKKyNkZWZpbmUgRU1SX0VYVENSRUFURUZPTlRJTkRJUkVDVFcJODIKKyNkZWZpbmUgRU1SX0VYVFRFWFRPVVRBCTgzCisjZGVmaW5lIEVNUl9FWFRURVhUT1VUVwk4NAorI2RlZmluZSBFTVJfUE9MWUJFWklFUjE2CTg1CisjZGVmaW5lIEVNUl9QT0xZR09OMTYJODYKKyNkZWZpbmUgRU1SX1BPTFlMSU5FMTYJODcKKyNkZWZpbmUgRU1SX1BPTFlCRVpJRVJUTzE2CTg4CisjZGVmaW5lIEVNUl9QT0xZTElORVRPMTYJODkKKyNkZWZpbmUgRU1SX1BPTFlQT0xZTElORTE2CTkwCisjZGVmaW5lIEVNUl9QT0xZUE9MWUdPTjE2CTkxCisjZGVmaW5lIEVNUl9QT0xZRFJBVzE2CTkyCisjZGVmaW5lIEVNUl9DUkVBVEVNT05PQlJVU0gJOTMKKyNkZWZpbmUgRU1SX0NSRUFURURJQlBBVFRFUk5CUlVTSFBUCTk0CisjZGVmaW5lIEVNUl9FWFRDUkVBVEVQRU4JOTUKKyNkZWZpbmUgRU1SX1BPTFlURVhUT1VUQQk5NgorI2RlZmluZSBFTVJfUE9MWVRFWFRPVVRXCTk3CisjZGVmaW5lIEVNUl9TRVRJQ01NT0RFCTk4CisjZGVmaW5lIEVNUl9DUkVBVEVDT0xPUlNQQUNFCTk5CisjZGVmaW5lIEVNUl9TRVRDT0xPUlNQQUNFCTEwMAorI2RlZmluZSBFTVJfREVMRVRFQ09MT1JTUEFDRQkxMDEKKyNkZWZpbmUgRU1SX0dMU1JFQ09SRAkxMDIKKyNkZWZpbmUgRU1SX0dMU0JPVU5ERURSRUNPUkQJMTAzCisjZGVmaW5lIEVNUl9QSVhFTEZPUk1BVCAxMDQKKworI2RlZmluZSBFTkhNRVRBX1NJR05BVFVSRQkxMTc5NDY5MDg4CisKKwogI2lmbmRlZiBOT0xPR0VSUk9SCiAKIC8qIExvZ1BhcmFtRXJyb3IgYW5kIExvZ0Vycm9yIHZhbHVlcyAqLwpAQCAtNDkzNSw2ICs1MDc2LDcgQEAKIH0gUFJJTlRFUl9ERUZBVUxUUzMyVywgKkxQUFJJTlRFUl9ERUZBVUxUUzMyVzsKIAogREVDTF9XSU5FTElCX1RZUEVfQVcoUFJJTlRFUl9ERUZBVUxUUyk7CitERUNMX1dJTkVMSUJfVFlQRV9BVyhMUFBSSU5URVJfREVGQVVMVFMpOwogCiB0eXBlZGVmIHN0cnVjdCBfU1lTVEVNX1BPV0VSX1NUQVRVUwogewpAQCAtNTgxNyw2ICs1OTU5LDkgQEAKIEJPT0wzMiAgICAgIFdJTkFQSSBHZXRUZXh0RXh0ZW50RXhQb2ludDMyVyhIREMzMixMUENXU1RSLElOVDMyLElOVDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQSU5UMzIsTFBJTlQzMixMUFNJWkUzMik7CiAjZGVmaW5lICAgICBHZXRUZXh0RXh0ZW50RXhQb2ludCBXSU5FTElCX05BTUVfQVcoR2V0VGV4dEV4dGVudEV4UG9pbnQpCitJTlQzMiAgICAgICBXSU5BUEkgR2V0VGltZUZvcm1hdDMyQShMQ0lELERXT1JELExQU1lTVEVNVElNRSxMUENTVFIsTFBTVFIsSU5UMzIpOworSU5UMzIgICAgICAgV0lOQVBJIEdldFRpbWVGb3JtYXQzMlcoTENJRCxEV09SRCxMUFNZU1RFTVRJTUUsTFBDV1NUUixMUFdTVFIsSU5UMzIpOworI2RlZmluZSAgICAgR2V0VGltZUZvcm1hdCBXSU5FTElCX05BTUVfQVcoR2V0VGltZUZvcm1hdCkKIExDSUQgICAgICAgIFdJTkFQSSBHZXRUaHJlYWRMb2NhbGUoKTsKIElOVDMyICAgICAgIFdJTkFQSSBHZXRUaHJlYWRQcmlvcml0eShIQU5ETEUzMik7CiBCT09MMzIgICAgICBXSU5BUEkgR2V0VGhyZWFkU2VsZWN0b3JFbnRyeShIQU5ETEUzMixEV09SRCxMUExEVF9FTlRSWSk7CkBAIC01OTU3LDggKzYxMDIsOCBAQAogQk9PTDMyICAgICAgV0lOQVBJIFZpcnR1YWxMb2NrKExQVk9JRCxEV09SRCk7CiBCT09MMzIgICAgICBXSU5BUEkgVmlydHVhbFByb3RlY3QoTFBWT0lELERXT1JELERXT1JELExQRFdPUkQpOwogQk9PTDMyICAgICAgV0lOQVBJIFZpcnR1YWxQcm90ZWN0RXgoSEFORExFMzIsTFBWT0lELERXT1JELERXT1JELExQRFdPUkQpOwotQk9PTDMyICAgICAgV0lOQVBJIFZpcnR1YWxRdWVyeShMUENWT0lELExQTUVNT1JZX0JBU0lDX0lORk9STUFUSU9OLERXT1JEKTsKLUJPT0wzMiAgICAgIFdJTkFQSSBWaXJ0dWFsUXVlcnlFeChIQU5ETEUzMixMUENWT0lELExQTUVNT1JZX0JBU0lDX0lORk9STUFUSU9OLERXT1JEKTsKK0RXT1JEICAgICAgIFdJTkFQSSBWaXJ0dWFsUXVlcnkoTFBDVk9JRCxMUE1FTU9SWV9CQVNJQ19JTkZPUk1BVElPTixEV09SRCk7CitEV09SRCAgICAgICBXSU5BUEkgVmlydHVhbFF1ZXJ5RXgoSEFORExFMzIsTFBDVk9JRCxMUE1FTU9SWV9CQVNJQ19JTkZPUk1BVElPTixEV09SRCk7CiBCT09MMzIgICAgICBXSU5BUEkgVmlydHVhbFVubG9jayhMUFZPSUQsRFdPUkQpOwogRFdPUkQgICAgICAgV0lOQVBJIFdhaXRGb3JNdWx0aXBsZU9iamVjdHMoRFdPUkQsY29uc3QgSEFORExFMzIqLEJPT0wzMixEV09SRCk7CiBEV09SRCAgICAgICBXSU5BUEkgV2FpdEZvck11bHRpcGxlT2JqZWN0c0V4KERXT1JELGNvbnN0IEhBTkRMRTMyKixCT09MMzIsRFdPUkQsQk9PTDMyKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2lubmxzLmggYi9pbmNsdWRlL3dpbm5scy5oCmluZGV4IDExNzA0YWIuLmQwOWJjOTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvd2lubmxzLmgKKysrIGIvaW5jbHVkZS93aW5ubHMuaApAQCAtMTI3LDggKzEyNyw2MSBAQAogI2RlZmluZSBNQUtFTENJRChsLCBzKSAgICAoTUFLRUxPTkcobCwgcykpCiAjZGVmaW5lIE1BS0VMQU5HSUQocCwgcykgICgoKChXT1JEKShzKSk8PDEwKSB8IChXT1JEKShwKSkKIAorLyogTGFuZ3VhZ2UgSURzICh3ZXJlIGluIHdpbm50LmgsICBmb3Igc29tZSByZWFzb24pICovCisKKworLyogTGFuZ3VhZ2UgSURzICovCisKKyNkZWZpbmUgTEFOR19ORVVUUkFMICAgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBMQU5HX0FSQUJJQyAgICAgICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIExBTkdfQUZSSUtBQU5TICAgICAgICAgICAgICAgICAgIDB4MzYKKyNkZWZpbmUgTEFOR19BTEJBTklBTiAgICAgICAgICAgICAgICAgICAgMHgxYworI2RlZmluZSBMQU5HX0JBU1FVRSAgICAgICAgICAgICAgICAgICAgICAweDJkCisjZGVmaW5lIExBTkdfQlVMR0FSSUFOICAgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgTEFOR19CWUVMT1JVU1NJQU4gICAgICAgICAgICAgICAgMHgyMworI2RlZmluZSBMQU5HX0NBVEFMQU4gICAgICAgICAgICAgICAgICAgICAweDAzCisjZGVmaW5lIExBTkdfQ0hJTkVTRSAgICAgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgTEFOR19DUk9BVElBTiAgICAgICAgICAgICAgICAgICAgMHgxYQorI2RlZmluZSBMQU5HX0NaRUNIICAgICAgICAgICAgICAgICAgICAgICAweDA1CisjZGVmaW5lIExBTkdfREFOSVNIICAgICAgICAgICAgICAgICAgICAgIDB4MDYKKyNkZWZpbmUgTEFOR19EVVRDSCAgICAgICAgICAgICAgICAgICAgICAgMHgxMworI2RlZmluZSBMQU5HX0VOR0xJU0ggICAgICAgICAgICAgICAgICAgICAweDA5CisjZGVmaW5lIExBTkdfRVNUT05JQU4gICAgICAgICAgICAgICAgICAgIDB4MjUKKyNkZWZpbmUgTEFOR19GQUVST0VTRSAgICAgICAgICAgICAgICAgICAgMHgzOAorI2RlZmluZSBMQU5HX0ZBUlNJICAgICAgICAgICAgICAgICAgICAgICAweDI5CisjZGVmaW5lIExBTkdfRklOTklTSCAgICAgICAgICAgICAgICAgICAgIDB4MGIKKyNkZWZpbmUgTEFOR19GUkVOQ0ggICAgICAgICAgICAgICAgICAgICAgMHgwYworI2RlZmluZSBMQU5HX0dFUk1BTiAgICAgICAgICAgICAgICAgICAgICAweDA3CisjZGVmaW5lIExBTkdfR1JFRUsgICAgICAgICAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgTEFOR19IRUJSRVcgICAgICAgICAgICAgICAgICAgICAgMHgwRAorI2RlZmluZSBMQU5HX0hVTkdBUklBTiAgICAgICAgICAgICAgICAgICAweDBlCisjZGVmaW5lIExBTkdfSUNFTEFORElDICAgICAgICAgICAgICAgICAgIDB4MGYKKyNkZWZpbmUgTEFOR19JTkRPTkVTSUFOICAgICAgICAgICAgICAgICAgMHgyMQorI2RlZmluZSBMQU5HX0lUQUxJQU4gICAgICAgICAgICAgICAgICAgICAweDEwCisjZGVmaW5lIExBTkdfSkFQQU5FU0UgICAgICAgICAgICAgICAgICAgIDB4MTEKKyNkZWZpbmUgTEFOR19LT1JFQU4gICAgICAgICAgICAgICAgICAgICAgMHgxMgorI2RlZmluZSBMQU5HX0xBVFZJQU4gICAgICAgICAgICAgICAgICAgICAweDI2CisjZGVmaW5lIExBTkdfTElUSFVBTklBTiAgICAgICAgICAgICAgICAgIDB4MjcKKyNkZWZpbmUgTEFOR19OT1JXRUdJQU4gICAgICAgICAgICAgICAgICAgMHgxNAorI2RlZmluZSBMQU5HX1BPTElTSCAgICAgICAgICAgICAgICAgICAgICAweDE1CisjZGVmaW5lIExBTkdfUE9SVFVHVUVTRSAgICAgICAgICAgICAgICAgIDB4MTYKKyNkZWZpbmUgTEFOR19ST01BTklBTiAgICAgICAgICAgICAgICAgICAgMHgxOAorI2RlZmluZSBMQU5HX1JVU1NJQU4gICAgICAgICAgICAgICAgICAgICAweDE5CisjZGVmaW5lIExBTkdfU0xPVkFLICAgICAgICAgICAgICAgICAgICAgIDB4MWIKKyNkZWZpbmUgTEFOR19TTE9WRU5JQU4gICAgICAgICAgICAgICAgICAgMHgyNAorI2RlZmluZSBMQU5HX1NPUkJJQU4gICAgICAgICAgICAgICAgICAgICAweDJlCisjZGVmaW5lIExBTkdfU1BBTklTSCAgICAgICAgICAgICAgICAgICAgIDB4MGEKKyNkZWZpbmUgTEFOR19TV0VESVNIICAgICAgICAgICAgICAgICAgICAgMHgxZAorI2RlZmluZSBMQU5HX1RIQUkgICAgICAgICAgICAgICAgICAgICAgICAweDFlCisjZGVmaW5lIExBTkdfVFVSS0lTSCAgICAgICAgICAgICAgICAgICAgIDB4MWYKKyNkZWZpbmUgTEFOR19VS1JBSU5JQU4gICAgICAgICAgICAgICAgICAgMHgyMgorCisvKiAiZGVmYXVsdCJpc2ggdmFsdWVzICovCisKICNkZWZpbmUgU09SVF9ERUZBVUxUICAgICAgMAogI2RlZmluZSBTVUJMQU5HX0RFRkFVTFQgICAxCisjZGVmaW5lIFNVQkxBTkdfU1lTX0RFRkFVTFQgMSAvKiBGSVhNRTogSSBkb24ndCBrbm93IGlmIHRoaXMgaXMgcmlnaHQgKi8KKwogCiAjZGVmaW5lIExBTkdfU1lTVEVNX0RFRkFVTFQgICAoTUFLRUxBTkdJRChMQU5HX05FVVRSQUwsIFNVQkxBTkdfU1lTX0RFRkFVTFQpKQogI2RlZmluZSBMQU5HX1VTRVJfREVGQVVMVCAgICAgKE1BS0VMQU5HSUQoTEFOR19ORVVUUkFMLCBTVUJMQU5HX0RFRkFVTFQpKQpAQCAtMTQ2LDQgKzE5OSwxMiBAQAogI2RlZmluZSBMQ01BUF9IQUxGV0lEVEgJMHgwMDQwMDAwMAkvKiBtYXAgZG91YmxlIGJ5dGUgdG8gc2luZ2xlIGJ5dGUgKi8KICNkZWZpbmUgTENNQVBfRlVMTFdJRFRICTB4MDA4MDAwMDAJLyogbWFwIHNpbmdsZSBieXRlIHRvIGRvdWJsZSBieXRlICovCiAKKy8qIERhdGUgRmxhZ3MgZm9yIEdldERhdGVGb3JtYXQuICovCisKKyNkZWZpbmUgREFURV9TSE9SVERBVEUgICAgICAgICAweDAwMDAwMDAxICAvKiB1c2Ugc2hvcnQgZGF0ZSBwaWN0dXJlICovCisjZGVmaW5lIERBVEVfTE9OR0RBVEUgICAgICAgICAgMHgwMDAwMDAwMiAgLyogdXNlIGxvbmcgZGF0ZSBwaWN0dXJlICovCisjZGVmaW5lIERBVEVfVVNFX0FMVF9DQUxFTkRBUiAgMHgwMDAwMDAwNCAgLyogdXNlIGFsdGVybmF0ZSBjYWxlbmRhciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbHQuIGNhbGVuZGFyIHN1cHBvcnQgaXMgYnJva2VuIGFueXdheSAqLworCisKICNlbmRpZiAgLyogX19XSU5FX1dJTk5MU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbm50LmggYi9pbmNsdWRlL3dpbm50LmgKaW5kZXggOGQ1YTIyNi4uMGRjYTNmNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW5udC5oCisrKyBiL2luY2x1ZGUvd2lubnQuaApAQCAtMjcyLDUxICsyNzIsNyBAQAogTFBUT1BfTEVWRUxfRVhDRVBUSU9OX0ZJTFRFUgogV0lOQVBJIFNldFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlciggTFBUT1BfTEVWRUxfRVhDRVBUSU9OX0ZJTFRFUiBmaWx0ZXIgKTsKIAotLyogTGFuZ3VhZ2UgSURzICovCi0KLSNkZWZpbmUgTEFOR19ORVVUUkFMICAgICAgICAgICAgICAgICAgICAgMHgwMAotI2RlZmluZSBMQU5HX0FSQUJJQyAgICAgICAgICAgICAgICAgICAgICAweDAxCi0jZGVmaW5lIExBTkdfQUZSSUtBQU5TICAgICAgICAgICAgICAgICAgIDB4MzYKLSNkZWZpbmUgTEFOR19BTEJBTklBTiAgICAgICAgICAgICAgICAgICAgMHgxYwotI2RlZmluZSBMQU5HX0JBU1FVRSAgICAgICAgICAgICAgICAgICAgICAweDJkCi0jZGVmaW5lIExBTkdfQlVMR0FSSUFOICAgICAgICAgICAgICAgICAgIDB4MDIKLSNkZWZpbmUgTEFOR19CWUVMT1JVU1NJQU4gICAgICAgICAgICAgICAgMHgyMwotI2RlZmluZSBMQU5HX0NBVEFMQU4gICAgICAgICAgICAgICAgICAgICAweDAzCi0jZGVmaW5lIExBTkdfQ0hJTkVTRSAgICAgICAgICAgICAgICAgICAgIDB4MDQKLSNkZWZpbmUgTEFOR19DUk9BVElBTiAgICAgICAgICAgICAgICAgICAgMHgxYQotI2RlZmluZSBMQU5HX0NaRUNIICAgICAgICAgICAgICAgICAgICAgICAweDA1Ci0jZGVmaW5lIExBTkdfREFOSVNIICAgICAgICAgICAgICAgICAgICAgIDB4MDYKLSNkZWZpbmUgTEFOR19EVVRDSCAgICAgICAgICAgICAgICAgICAgICAgMHgxMwotI2RlZmluZSBMQU5HX0VOR0xJU0ggICAgICAgICAgICAgICAgICAgICAweDA5Ci0jZGVmaW5lIExBTkdfRVNUT05JQU4gICAgICAgICAgICAgICAgICAgIDB4MjUKLSNkZWZpbmUgTEFOR19GQUVST0VTRSAgICAgICAgICAgICAgICAgICAgMHgzOAotI2RlZmluZSBMQU5HX0ZBUlNJICAgICAgICAgICAgICAgICAgICAgICAweDI5Ci0jZGVmaW5lIExBTkdfRklOTklTSCAgICAgICAgICAgICAgICAgICAgIDB4MGIKLSNkZWZpbmUgTEFOR19GUkVOQ0ggICAgICAgICAgICAgICAgICAgICAgMHgwYwotI2RlZmluZSBMQU5HX0dFUk1BTiAgICAgICAgICAgICAgICAgICAgICAweDA3Ci0jZGVmaW5lIExBTkdfR1JFRUsgICAgICAgICAgICAgICAgICAgICAgIDB4MDgKLSNkZWZpbmUgTEFOR19IRUJSRVcgICAgICAgICAgICAgICAgICAgICAgMHgwRAotI2RlZmluZSBMQU5HX0hVTkdBUklBTiAgICAgICAgICAgICAgICAgICAweDBlCi0jZGVmaW5lIExBTkdfSUNFTEFORElDICAgICAgICAgICAgICAgICAgIDB4MGYKLSNkZWZpbmUgTEFOR19JTkRPTkVTSUFOICAgICAgICAgICAgICAgICAgMHgyMQotI2RlZmluZSBMQU5HX0lUQUxJQU4gICAgICAgICAgICAgICAgICAgICAweDEwCi0jZGVmaW5lIExBTkdfSkFQQU5FU0UgICAgICAgICAgICAgICAgICAgIDB4MTEKLSNkZWZpbmUgTEFOR19LT1JFQU4gICAgICAgICAgICAgICAgICAgICAgMHgxMgotI2RlZmluZSBMQU5HX0xBVFZJQU4gICAgICAgICAgICAgICAgICAgICAweDI2Ci0jZGVmaW5lIExBTkdfTElUSFVBTklBTiAgICAgICAgICAgICAgICAgIDB4MjcKLSNkZWZpbmUgTEFOR19OT1JXRUdJQU4gICAgICAgICAgICAgICAgICAgMHgxNAotI2RlZmluZSBMQU5HX1BPTElTSCAgICAgICAgICAgICAgICAgICAgICAweDE1Ci0jZGVmaW5lIExBTkdfUE9SVFVHVUVTRSAgICAgICAgICAgICAgICAgIDB4MTYKLSNkZWZpbmUgTEFOR19ST01BTklBTiAgICAgICAgICAgICAgICAgICAgMHgxOAotI2RlZmluZSBMQU5HX1JVU1NJQU4gICAgICAgICAgICAgICAgICAgICAweDE5Ci0jZGVmaW5lIExBTkdfU0xPVkFLICAgICAgICAgICAgICAgICAgICAgIDB4MWIKLSNkZWZpbmUgTEFOR19TTE9WRU5JQU4gICAgICAgICAgICAgICAgICAgMHgyNAotI2RlZmluZSBMQU5HX1NPUkJJQU4gICAgICAgICAgICAgICAgICAgICAweDJlCi0jZGVmaW5lIExBTkdfU1BBTklTSCAgICAgICAgICAgICAgICAgICAgIDB4MGEKLSNkZWZpbmUgTEFOR19TV0VESVNIICAgICAgICAgICAgICAgICAgICAgMHgxZAotI2RlZmluZSBMQU5HX1RIQUkgICAgICAgICAgICAgICAgICAgICAgICAweDFlCi0jZGVmaW5lIExBTkdfVFVSS0lTSCAgICAgICAgICAgICAgICAgICAgIDB4MWYKLSNkZWZpbmUgTEFOR19VS1JBSU5JQU4gICAgICAgICAgICAgICAgICAgMHgyMgorLyogSSBtb3ZlZCB0aGUgTGFuZ3VhZ2UgSURzIHRvIHdpbm5scy5oIChEYXZpZCBMZWUgTGFtYmVydCkgKi8KIAogCiAvKiBBY2Nlc3MgcmlnaHRzICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbnR5cGVzLmggYi9pbmNsdWRlL3dpbnR5cGVzLmgKaW5kZXggNTI3ZmJjYi4uM2RhYzUyZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW50eXBlcy5oCisrKyBiL2luY2x1ZGUvd2ludHlwZXMuaApAQCAtMTU1LDYgKzE1NSw3IEBACiBERUNMQVJFX0hBTkRMRShIRFJPUCk7CiBERUNMQVJFX0hBTkRMRShIRFJWUik7CiBERUNMQVJFX0hBTkRMRShIRFdQKTsKK0RFQ0xBUkVfSEFORExFKEhFTkhNRVRBRklMRSk7CiBERUNMQVJFX0hBTkRMRShIRklMRSk7CiBERUNMQVJFX0hBTkRMRShIRk9OVCk7CiBERUNMQVJFX0hBTkRMRShIR0RJT0JKKTsKQEAgLTI2Miw2ICsyNjMsNyBAQAogREVDTF9XSU5FTElCX1RZUEUoSERST1ApOwogREVDTF9XSU5FTElCX1RZUEUoSERSVlIpOwogREVDTF9XSU5FTElCX1RZUEUoSERXUCk7CitERUNMX1dJTkVMSUJfVFlQRShIRU5ITUVUQUZJTEUpOwogREVDTF9XSU5FTElCX1RZUEUoSEZJTEUpOwogREVDTF9XSU5FTElCX1RZUEUoSEZPTlQpOwogREVDTF9XSU5FTElCX1RZUEUoSEdESU9CSik7CmRpZmYgLS1naXQgYS9pcGMvZGRlX2F0b20uYyBiL2lwYy9kZGVfYXRvbS5jCmluZGV4IDQ1ODU2NWEuLjUwNDI4MGYgMTAwNjQ0Ci0tLSBhL2lwYy9kZGVfYXRvbS5jCisrKyBiL2lwYy9kZGVfYXRvbS5jCkBAIC0xMjksNyArMTI5LDcgQEAKICAgICAgcmV0dXJuIChhdG9tPE1JTl9TVFJfQVRPTSkgPyBhdG9tIDogMDsKICAgfQogCi0gIGRwcmludGZfaW5mbyhhdG9tLCJHbG9iYWxBZGRBdG9tKFwiJXNcIilcbiIsc3RyKTsKKyAgVFJBQ0UoYXRvbSwiKFwiJXNcIilcbiIsc3RyKTsKIAogICBEREVfSVBDX2luaXQoKTsJCS8qIHdpbGwgaW5pdGlhbGl6ZSBvbmx5IGlmIG5lZWRlZCAqLwogICAKQEAgLTE3NCw3ICsxNzQsNyBAQAogICBBdG9tRGF0YV9wdHIgYXRvbV9wdHI7CiAgIEFUT00gcmV0dmFsPShBVE9NKSAwOwogICAKLSAgZHByaW50Zl9pbmZvKGF0b20sIkdsb2JhbERlbGV0ZUF0b20oXCIlZFwiKVxuIiwoaW50KWF0b20pOworICBUUkFDRShhdG9tLCIoXCIlZFwiKVxuIiwoaW50KWF0b20pOwogICBhdG9tX2lkeD0oaW50KWF0b20gLSBNSU5fU1RSX0FUT007CiAgIAogICBpZiAoYXRvbV9pZHggPCAwICkKQEAgLTIxMSw3ICsyMTEsNyBAQAogICBpbnQgYXRvbV9vZnM7CiAgIGNoYXIgKnN0cjsKIAotICBkcHJpbnRmX2luZm8oYXRvbSwiR2xvYmFsRmluZEF0b20oJTA4bHgpXG4iLCBuYW1lICk7CisgIFRSQUNFKGF0b20sIiglMDhseClcbiIsIG5hbWUgKTsKIAogICAvKiBGaXJzdCBjaGVjayBmb3IgaW50ZWdlciBhdG9tICovCiAKQEAgLTIyMyw3ICsyMjMsNyBAQAogICAgICBBVE9NIGF0b209IChBVE9NKSBhdG9pKCZzdHJbMV0pOwogICAgICByZXR1cm4gKGF0b208TUlOX1NUUl9BVE9NKSA/IGF0b20gOiAwOwogICB9Ci0gIGRwcmludGZfaW5mbyhhdG9tLCJHbG9iYWxGaW5kQXRvbShcIiVzXCIpXG4iLHN0cik7CisgIFRSQUNFKGF0b20sIihcIiVzXCIpXG4iLHN0cik7CiAKICAgRERFX0lQQ19pbml0KCk7CQkvKiB3aWxsIGluaXRpYWxpemUgb25seSBpZiBuZWVkZWQgKi8KIApkaWZmIC0tZ2l0IGEvaXBjL2RkZV9hdG9tX3Rlc3QuYyBiL2lwYy9kZGVfYXRvbV90ZXN0LmMKaW5kZXggYjBkMDM0MS4uNDM5MTU2OSAxMDA2NDQKLS0tIGEvaXBjL2RkZV9hdG9tX3Rlc3QuYworKysgYi9pcGMvZGRlX2F0b21fdGVzdC5jCkBAIC0yNCw5ICsyNCw5IEBACiAgIGludCBpLGosYXRvbV9uOwogICBpbnQgYXRvbV9sZW5bVE9HRVRIRVJdOwogICAKLSAgZGVidWdnaW5nX2luZm8oc2htKT0xOwotICBkZWJ1Z2dpbmdfaW5mbyhhdG9tKT0wOwotICBkZWJ1Z2dpbmdfaW5mbyhzZW0pPTA7CisgIFRSQUNFX09OKHNobSk9MTsKKyAgVFJBQ0VfT04oYXRvbSk9MDsKKyAgVFJBQ0VfT04oc2VtKT0wOwogICAKICAgZm9yIChpPTAgOyBpPD0xMDAwMC9UT0dFVEhFUiA7IGkrKykgewogICAgICBmb3IgKGF0b21fbj0wIDsgYXRvbV9uPFRPR0VUSEVSIDsgYXRvbV9uKyspIHsKZGlmZiAtLWdpdCBhL2lwYy9kZGVfbWVtLmMgYi9pcGMvZGRlX21lbS5jCmluZGV4IGFjMjljNzAuLjUwNGIzMzAgMTAwNjQ0Ci0tLSBhL2lwYy9kZGVfbWVtLmMKKysrIGIvaXBjL2RkZV9tZW0uYwpAQCAtNTgsMTggKzU4LDE4IEBACiB7CiAgIHN0cnVjdCBzaG1fYmxvY2sgKmJsb2NrOwogICAKLSAgZHByaW50Zl9pbmZvKGdsb2JhbCwic2htOmxvY2F0ZV9oYW5kbGUoMHglMDR4KVxuIiwgaCk7CisgIFRSQUNFKGdsb2JhbCwic2htOiAoMHglMDR4KVxuIiwgaCk7CiAKIAogICBpZiAoU2FtcGxlQml0KCAmZnJlZV9oYW5kbGVzLCBEREVfTUVNX0lEWChoKSkgPT0gMCkgewotICAgICBkcHJpbnRmX2luZm8oZ2xvYmFsLCAic2htOmxvY2F0ZV9oYW5kbGU6IHJldHVybiBOVUxMXG4iKTsKKyAgICAgVFJBQ0UoZ2xvYmFsLCAic2htOiByZXR1cm4gTlVMTFxuIik7CiAgICAgIHJldHVybiBOVUxMOwkJICAgLyogZnJlZSEhISAqLwogICB9CiAgIAogICBibG9jaz0gc2htX2xvY2F0ZV9ibG9jayhEREVfTUVNX0lORk8oaCkuc2htaWQsIG1hcCk7CiAgIGlmIChibG9jayA9PSBOVUxMKSB7CiAgICAgICAvKiBub3RoaW5nIGZvdW5kICovCi0gICAgICBkcHJpbnRmX2luZm8oZ2xvYmFsLCAic2htOmxvY2F0ZV9oYW5kbGU6IHJldHVybiBOVUxMXG4iKTsKKyAgICAgIFRSQUNFKGdsb2JhbCwgInNobTogcmV0dXJuIE5VTExcbiIpOwogICAgICAgcmV0dXJuIE5VTEw7CiAgIH0KIApAQCAtODcsNyArODcsNyBAQAogICBpZiAoYml0X25yICE9IC0xKQogICAgICByZXR1cm4gRERFX01FTV9IQU5ETEUoYml0X25yKTsKIAotICBkcHJpbnRmX2luZm8oZ2xvYmFsLCJkZGVfYWxsb2NfaGFuZGxlOiBubyBmcmVlIERERSBoYW5kbGUgZm91bmRcbiIpOworICBUUkFDRShnbG9iYWwsImRkZV9hbGxvY19oYW5kbGU6IG5vIGZyZWUgRERFIGhhbmRsZSBmb3VuZFxuIik7CiAgIHJldHVybiAwOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTEwMiw3ICsxMDIsNyBAQAogICAgIHN0cnVjdCBsb2NhbF9zaG1fbWFwICpjdXJyOwogICAgIEhHTE9CQUwxNiBoYW5kbGU7CiAgICAgCi0gICAgZHByaW50Zl9pbmZvKGdsb2JhbCwiRERFX21hbGxvYyBmbGFncyAlNFgsIHNpemUgJWxkXG4iLCBmbGFncywgc2l6ZSk7CisgICAgVFJBQ0UoZ2xvYmFsLCJEREVfbWFsbG9jIGZsYWdzICU0WCwgc2l6ZSAlbGRcbiIsIGZsYWdzLCBzaXplKTsKICAgICBEREVfSVBDX2luaXQoKTsJCS8qIG1ha2Ugc3VyZSBtYWluIHNobSBibG9jayBhbGxvY2F0ZWQgKi8gCiAKICAgICBzaG1fd3JpdGVfd2FpdChtYWluX2Jsb2NrLT5wcm9jW2N1cnJfcHJvY19pZHhdLnNlbSk7CkBAIC0xNTEsMTQgKzE1MSwxMyBAQAogICAgIGhhbmRsZT0gZGRlX2FsbG9jX2hhbmRsZSgpOwogICAgIAogICAgIGlmIChoYW5kbGUpIHsKLSAgICAgICBkcHJpbnRmX2luZm8oZ2xvYmFsLAotCQkgICAgICAiRERFX21hbGxvYyByZXR1cm5pbmcgaGFuZGxlPTB4JTR4LCBwdHI9MHglMDhseFxuIiwKKyAgICAgICBUUkFDRShnbG9iYWwsICJyZXR1cm5pbmcgaGFuZGxlPTB4JTR4LCBwdHI9MHglMDhseFxuIiwKIAkJICAgICAgKGludCloYW5kbGUsIChsb25nKSBISU5GTzJEQVRBUFRSKGhfaW5mbykpOwogICAgICAgIERERV9NRU1fSU5GTyhoYW5kbGUpLnJlbD0gIFBUUjJSRUwoYmxvY2ssIGhfaW5mbyk7CiAgICAgICAgRERFX01FTV9JTkZPKGhhbmRsZSkuc2htaWQ9IHNobWlkOwogICAgIH0KICAgICBlbHNlCi0gICAgICAgZHByaW50Zl93YXJuKGdsb2JhbCwgIkRERV9tYWxsb2MgZmFpbGVkXG4iKTsKKyAgICAgICBXQVJOKGdsb2JhbCwgImZhaWxlZFxuIik7CiAKICAgICBzaG1fd3JpdGVfc2lnbmFsKG1haW5fYmxvY2stPnByb2NbY3Vycl9wcm9jX2lkeF0uc2VtKTsKICAgICAKQEAgLTE3Miw3ICsxNzEsNyBAQAogICBpbnQgaGFuZGxlX2luZGV4PSBoICYgMHg3ZmZmOwogICBzdHJ1Y3QgbG9jYWxfc2htX21hcCBtYXA7CiAKLSAgZHByaW50Zl9pbmZvKGdsb2JhbCwiRERFX0dsb2JhbEZyZWUoMHglMDR4KVxuIixoKTsKKyAgVFJBQ0UoZ2xvYmFsLCIoMHglMDR4KVxuIixoKTsKIAogICBpZiAoaD09MCkKICAgICAgcmV0dXJuIDA7CkBAIC0yMzgsMTggKzIzNywxOCBAQAogICBpZiAoc2VncHRyICE9IE5VTEwpCiAgICAgICAqc2VncHRyPTA7CiAKLSAgZHByaW50Zl9pbmZvKGdsb2JhbCwiRERFX0F0dGFjaEhhbmRsZSglMDR4KVxuIixoYW5kbGUpOworICBUUkFDRShnbG9iYWwsIiglMDR4KVxuIixoYW5kbGUpOwogICBoX2luZm89bG9jYXRlX2hhbmRsZShoYW5kbGUsIE5VTEwpOwogCiAgIGlmIChoX2luZm8gPT0gTlVMTCkgCiAgICAgICByZXR1cm4gTlVMTDsKIAogICBpZiAoICEoaF9pbmZvLT5mbGFncyAmIEdNRU1fRERFU0hBUkUpICkgewotICAgICAgZnByaW50ZihzdGRlcnIsIkRERV9BdHRhY2hIYW5kbGU6IENvcnJ1cHRlZCBtZW1vcnkgaGFuZGxlIGluZm9cbiIpOworICAgICAgRVJSKGdsb2JhbCwiQ29ycnVwdGVkIG1lbW9yeSBoYW5kbGUgaW5mb1xuIik7CiAgICAgICByZXR1cm4gTlVMTDsKICAgfQogICAKLSAgZHByaW50Zl9pbmZvKGdsb2JhbCwiRERFX0F0dGFjaEhhbmRsZTogaF9pbmZvPSUwNmx4XG4iLChsb25nKWhfaW5mbyk7CisgIFRSQUNFKGdsb2JhbCwiaF9pbmZvPSUwNmx4XG4iLChsb25nKWhfaW5mbyk7CiAKICAgc2htZGF0YS5oYW5kbGU9IGhhbmRsZTsKICAgc2htZGF0YS5zaG1pZD0gRERFX01FTV9JTkZPKGhhbmRsZSkuc2htaWQ7CkBAIC0yNjMsMTAgKzI2MiwxMCBAQAogICBpZiAoc2VncHRyICE9IE5VTEwpIAogICAgICAgKnNlZ3B0cj0gKFNFR1BUUilNQUtFTE9ORyggMCwgc2htZGF0YS5zZWwpOwogCi0gIGlmIChkZWJ1Z2dpbmdfaW5mbyhkZGUpKQorICBpZiAoVFJBQ0VfT04oZGRlKSkKICAgICAgIGRlYnVnX2xhc3RfaGFuZGxlX3NpemU9IGhfaW5mby0+c2l6ZTsKIAotICBkcHJpbnRmX2luZm8oZ2xvYmFsLCJEREVfQXR0YWNoSGFuZGxlIHJldHVybnMgcHRyPTB4JTA4bHhcbiIsIChsb25nKXB0cik7CisgIFRSQUNFKGdsb2JhbCwiRERFX0F0dGFjaEhhbmRsZSByZXR1cm5zIHB0cj0weCUwOGx4XG4iLCAobG9uZylwdHIpOwogCiAgIHJldHVybiAoTFBTVFIpcHRyOwogCmRpZmYgLS1naXQgYS9pcGMvZGRlX3Byb2MuYyBiL2lwYy9kZGVfcHJvYy5jCmluZGV4IGEwOGIwNjkuLjVkNGFlMWQgMTAwNjQ0Ci0tLSBhL2lwYy9kZGVfcHJvYy5jCisrKyBiL2lwYy9kZGVfcHJvYy5jCkBAIC0xMjMsNyArMTIzLDcgQEAKIHsKICAgZGRlX3Byb2MgcHJvYzsKICAgaW50IHByb2NfaWR4OwotICBkcHJpbnRmX2luZm8oZGRlLCJkZGVfcHJvY19hZGQoLi4pXG4iKTsKKyAgVFJBQ0UoZGRlLCIoLi4pXG4iKTsKICAgc2htX3dyaXRlX3dhaXQobWFpbl9ibG9jay0+c2VtKTsKIAogICAvKiBmaW5kIGZyZWUgcHJvY19pZHggYW5kIGFsbG9jYXRlIGl0ICovCkBAIC0xNjQsNyArMTY0LDcgQEAKICAgICAgICBzaXplPSBtc2dyY3YoIG1haW5fYmxvY2stPnByb2NbY3Vycl9wcm9jX2lkeF0ubXNnICwgJmFja19idWZmLmRhdCwKIAkJICAgICAxLCBEREVfQUNLLCBJUENfTk9XQUlUKTsKICAgICAgICBpZiAoc2l6ZT49MCkgewotCSAgZHByaW50Zl9pbmZvKG1zZywiZ2V0X2FjazogcmVjZWl2ZWQgRERFX0FDSyBtZXNzYWdlXG4iKTsKKwkgIFRSQUNFKG1zZywiZ2V0X2FjazogcmVjZWl2ZWQgRERFX0FDSyBtZXNzYWdlXG4iKTsKIAkgIHJldHVybiBUUlVFOwogICAgICAgIH0KICAgICAgICBpZiAoRERFX0dldFJlbW90ZU1lc3NhZ2UoKSkgewpAQCAtMTk3LDcgKzE5Nyw3IEBACiAgICAgIHJldHVybiBGQUxTRTsKICAgfQogCi0gIGlmIChkZWJ1Z2dpbmdfaW5mbyhkZGUpIHx8IGRlYnVnZ2luZ193YXJuX2RkZSkgeworICBpZiAoVFJBQ0VfT04oZGRlKSB8fCBXQVJOX09OX2RkZSkgewogICAgICBNU0cxNiAqbXNnPShNU0cxNiopICZtc2didWYtPm10ZXh0OwogICAgICBjaGFyICp0aXRsZTsKICAgICAgaWYgKG1zZ2J1Zi0+bXR5cGU9PURERV9TRU5EKQpAQCAtMjA5LDE0ICsyMDksMTIgQEAKICAgICAgaWYgKHRpdGxlKQogCSBwcmludF9kZGVfbWVzc2FnZSh0aXRsZSwgbXNnKTsKICAgICAgZWxzZQotICAgICAgIGRwcmludGZfd2FybihkZGUsICJVbmtub3duIG1lc3NhZ2UgdHlwZT0weCVseFxuIiwgbXNnYnVmLT5tdHlwZSk7CisgICAgICAgV0FSTihkZGUsICJVbmtub3duIG1lc3NhZ2UgdHlwZT0weCVseFxuIiwgbXNnYnVmLT5tdHlwZSk7CiAgIH0KLSAgZHByaW50Zl9pbmZvKG1zZywKLQkgICAgICAiRERFX0RvT25lTWVzc2FnZTogdG8gcHJvY19pZHg9JWQgKHBpZD0lZCksIHF1ZXVlPSV1XG4iLAotCSAgICAgIHByb2NfaWR4LCBwcm9jLT5waWQsICh1bnNpZ25lZClwcm9jLT5tc2cpOworICBUUkFDRShtc2csICJ0byBwcm9jX2lkeD0lZCAocGlkPSVkKSwgcXVldWU9JXVcbiIsCisJICAgICAgIHByb2NfaWR4LCBwcm9jLT5waWQsICh1bnNpZ25lZClwcm9jLT5tc2cpOwogICBpZiAoIHByb2MtPm1zZyAhPSAtMSkgewotICAgICBkcHJpbnRmX2luZm8obXNnLCAiRERFX0RvT25lTWVzc2FnZTogZG9pbmcuLi4odHlwZT0lcylcbiIsCi0JCSBtc2dfdHlwZVttc2didWYtPm10eXBlXSk7CisgICAgIFRSQUNFKG1zZywgImRvaW5nLi4uKHR5cGU9JXMpXG4iLCBtc2dfdHlwZVttc2didWYtPm10eXBlXSk7CiAgICAgIHNpemU9bXNnc25kIChwcm9jLT5tc2csIG1zZ2J1Ziwgc2l6ZSwgMCk7CiAKICAgICAgaWYgKHNpemU8MCkgewpAQCAtMjI1LDkgKzIyMyw4IEBACiAgICAgIH0KICAgICAga2lsbChwcm9jLT5waWQsU0lHVVNSMik7CSAgIC8qIHRlbGwgdGhlIHByb2Nlc3MgdGhlcmUgaXMgYSBtZXNzYWdlICovCiAKLSAgICAgZHByaW50Zl9pbmZvKG1zZywiRERFX0RvT25lTWVzc2FnZTogIgotCQkgIlRyeWluZyB0byBnZXQgYWNrbm93bGVkZ21lbnQgZnJvbSBtc2cgcXVldWU9JWRcbiIsCi0JCSBwcm9jLT5tc2cpOworICAgICBUUkFDRShtc2csICJUcnlpbmcgdG8gZ2V0IGFja25vd2xlZGdtZW50IGZyb20gbXNnIHF1ZXVlPSVkXG4iLAorCQkgIHByb2MtPm1zZyk7CiAgICAgIFlpZWxkMTYoKTsJCQkvKiBmb3JjZSB0YXNrIHN3aXRjaCwgYW5kICovCiAJCQkJLyogYWNrbm93bGVkZ21lbnQgc2VuZGluZyAqLwogICAgICBpZiAoZ2V0X2FjaygpKSB7CkBAIC0yMzksOCArMjM2LDcgQEAKICAgICAgfQogICB9CiAgIGVsc2UgewotICAgICBkcHJpbnRmX3dhcm4obXNnLCAiRERFX0RvT25lTWVzc2FnZTogbWVzc2FnZSBub3Qgc2VudCwgIgotCQkgInRhcmdldCBoYXMgbm8gbWVzc2FnZSBxdWV1ZVxuIik7CisgICAgIFdBUk4obXNnLCAibWVzc2FnZSBub3Qgc2VudCwgdGFyZ2V0IGhhcyBubyBtZXNzYWdlIHF1ZXVlXG4iKTsKICAgICAgcmV0dXJuIEZBTFNFOwogICB9CiB9CkBAIC0zMTIsMTMgKzMwOCwxMiBAQAogICBpZiAoICEgRERFX0lzUmVtb3RlV2luZG93KG1zZy0+aHduZCkgJiYgbXNnLT5od25kIT0gKEhXTkQxNiktMSkKICAgICAgcmV0dXJuIEZBTFNFOwogCi0gIGRwcmludGZfaW5mbyhtc2csICIlczogRERFX0RvTWVzc2FnZShod25kPTB4JXgsbXNnPTB4JXgsLi4pXG4iLAotCSAgICAgIG1zZ190eXBlW3R5cGVdLCAoaW50KW1zZy0+aHduZCwoaW50KW1zZy0+bWVzc2FnZSk7CisgIFRSQUNFKG1zZywgIihod25kPTB4JXgsbXNnPTB4JXgsLi4pIC0gJXNcbiIsCisJICAgICAgIChpbnQpbXNnLT5od25kLChpbnQpbXNnLT5tZXNzYWdlLG1zZ190eXBlW3R5cGVdKTsKKyAgCiAKLQotICBkcHJpbnRmX2luZm8obXNnLAotCSAgICAgICJEREVfRG9NZXNzYWdlKGh3bmQ9MHgleCxtc2c9MHgleCwuLikgLy8gSFdORF9CUk9BRENBU1QgIVxuIiwKLQkgICAgICAoaW50KW1zZy0+aHduZCwoaW50KW1zZy0+bWVzc2FnZSk7CisgIFRSQUNFKG1zZywgIihod25kPTB4JXgsbXNnPTB4JXgsLi4pIC0tIEhXTkRfQlJPQURDQVNUICFcbiIsCisJICAgICAgIChpbnQpbXNnLT5od25kLChpbnQpbXNnLT5tZXNzYWdlKTsKICAgcmVtb3RlX21lc3NhZ2U9KHZvaWQqKSZtc2dfZGF0LmRhdC5tdGV4dDsKICAgCiAgIG1lbWNweShyZW1vdGVfbWVzc2FnZSwgbXNnLCBzaXplb2YoKm1zZykpOwpAQCAtMzYxLDEwICszNTYsOCBAQAogCiAgICBwcm9jPURERV9XSU4yUFJPQyh3bmQpOwogICAgbXNnPW1haW5fYmxvY2stPnByb2NbcHJvY10ubXNnOwotICAgZHByaW50Zl9pbmZvKG1zZywiRERFX0dldFJlbW90ZU1lc3NhZ2U6IHNlbmRpbmcgQUNLICIKLQkgICAgICAgInRvIHduZD0lNHgsIHByb2M9JWQsbXNnPSVkLCBwaWQ9JWRcbiIsd25kLHByb2MsbXNnLAotCSAgICAgICBtYWluX2Jsb2NrLT5wcm9jW3Byb2NdLnBpZAotICAgICApOworICAgVFJBQ0UobXNnLCJzZW5kaW5nIEFDSyB0byB3bmQ9JTR4LCBwcm9jPSVkLG1zZz0lZCwgcGlkPSVkXG4iLAorCQl3bmQscHJvYyxtc2csbWFpbl9ibG9jay0+cHJvY1twcm9jXS5waWQpOwogCiAgICBtc2dfYWNrLm10ZXh0WzBdPXZhbDsKICAgIG1zZ3NuZCAobXNnLCAmbXNnX2FjaywgMSwgMCk7CkBAIC0zOTAsNyArMzgzLDcgQEAKIAogICBpZiAobmVzdGluZz4xMCkgewogICAgICBmZmx1c2goc3Rkb3V0KTsKLSAgICAgZnByaW50ZihzdGRlcnIsIkRERV9HZXRSZW1vdGVNZXNzYWdlOiBzdXNwZWN0aW5nIGluZmluaXRlIHJlY3Vyc2lvbiwgZXhpdGluZyIpOworICAgICBFUlIobXNnLCAic3VzcGVjdGluZyBpbmZpbml0ZSByZWN1cnNpb24sIGV4aXRpbmciKTsKICAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtNDAyLDE5ICszOTUsMTcgQEAKIAogICBpZiAoc2l6ZT09RERFX01TR19TSVpFKSB7CSAgIC8qIGlzIHRoaXMgYSBjb3JyZWN0IG1lc3NhZ2UgKGlmIGFueSkgPyovCiAgICAgIHdhc19zZW50PVRSVUU7Ci0gICAgIGRwcmludGZfaW5mbyhtc2csCi0JCSAiRERFOnJlY2VpdmUgc2VudCBtZXNzYWdlLiBtc2c9JTA0eCB3UGFyPSUwNHgiCi0JCSAiIGxQYXI9JTA4bHhcbiIsCi0JCSByZW1vdGVfbWVzc2FnZS0+bWVzc2FnZSwgcmVtb3RlX21lc3NhZ2UtPndQYXJhbSwKLQkJIHJlbW90ZV9tZXNzYWdlLT5sUGFyYW0pOworICAgICBUUkFDRShtc2csICJEREU6cmVjZWl2ZSBzZW50IG1lc3NhZ2UuIG1zZz0lMDR4IHdQYXI9JTA0eCIKKwkJICAiIGxQYXI9JTA4bHhcbiIsCisJCSAgcmVtb3RlX21lc3NhZ2UtPm1lc3NhZ2UsIHJlbW90ZV9tZXNzYWdlLT53UGFyYW0sCisJCSAgcmVtb3RlX21lc3NhZ2UtPmxQYXJhbSk7CiAgIH0gZWxzZSB7CiAgICAgIHNpemU9IG1zZ3JjdiggbWFpbl9ibG9jay0+cHJvY1tjdXJyX3Byb2NfaWR4XS5tc2cgLCAmbXNnX2RhdC5kYXQsCiAJCSAgIERERV9NU0dfU0laRSwgRERFX1BPU1QsIElQQ19OT1dBSVQpOwogCiAgICAgIGlmIChzaXplPT1EREVfTVNHX1NJWkUpIHsJICAgLyogaXMgdGhpcyBhIGNvcnJlY3QgbWVzc2FnZSAoaWYgYW55KSA/Ki8KIAl3YXNfc2VudD1GQUxTRTsKLQlkcHJpbnRmX2luZm8obXNnLAotCQkgICAgIkRERTpyZWNlaXZlIHBvc3RlZCBtZXNzYWdlLiAiCisJVFJBQ0UobXNnLCAiRERFOnJlY2VpdmUgcG9zdGVkIG1lc3NhZ2UuICIKIAkJICAgICJtc2c9JTA0eCB3UGFyPSUwNHggbFBhcj0lMDhseFxuIiwKIAkJICAgIHJlbW90ZV9tZXNzYWdlLT5tZXNzYWdlLCByZW1vdGVfbWVzc2FnZS0+d1BhcmFtLAogCQkgICAgcmVtb3RlX21lc3NhZ2UtPmxQYXJhbSk7CkBAIC00MjksNyArNDIwLDcgQEAKIAogICBuZXN0aW5nKys7CiAKLSAgaWYgKGRlYnVnZ2luZ19pbmZvKGRkZSkpIHsKKyAgaWYgKFRSQUNFX09OKGRkZSkpIHsKICAgICAgY2hhciAqdGl0bGU7CiAgICAgIGlmICh3YXNfc2VudCkKIAl0aXRsZT0icmVjZWl2ZSBzZW50IGRkZToiOwpAQCAtNDQyLDEwICs0MzMsOCBAQAogICAgIEhXTkQxNiBkZGVfd2luZG93PSBEREVfV0lOX0lORk8ocmVtb3RlX21lc3NhZ2UtPmh3bmQpLnduZDsKICAgICAgLyogd2Ugc2hvdWxkIGtub3cgZXhhY3RseSB3aGVyZSB0byBzZW5kIHRoZSBtZXNzYWdlIChsb2NhbGx5KSovCiAgICAgIGlmICh3YXNfc2VudCkgewotCWRwcmludGZfaW5mbyhkZGUsCi0JCSAgICAiU2VuZE1lc3NhZ2Uod25kPTB4JTA0eCwgbXNnPTB4JTA0eCwgd1Bhcj0weCUwNHgsIgotCQkgICAgImxQYXI9MHglMDh4XG4iLAotCQkgICAgZGRlX3dpbmRvdywgcmVtb3RlX21lc3NhZ2UtPm1lc3NhZ2UsCisJVFJBQ0UoZGRlLCAiU2VuZE1lc3NhZ2Uod25kPTB4JTA0eCwgbXNnPTB4JTA0eCwgd1Bhcj0weCUwNHgsIgorCQkgICAgImxQYXI9MHglMDh4XG4iLCBkZGVfd2luZG93LCByZW1vdGVfbWVzc2FnZS0+bWVzc2FnZSwKIAkJICAgIHJlbW90ZV9tZXNzYWdlLT53UGFyYW0sIChpbnQpcmVtb3RlX21lc3NhZ2UtPmxQYXJhbSk7CiAKIAkvKiBleGVjdXRlIHRoZSByZWNpZXZlZCBtZXNzYWdlICovCkBAIC01MjQsNyArNTEzLDcgQEAKICAgICAgaW5fdGVzdC0tOwogICAgICByZXR1cm47CiAgIH0KLSAgZHByaW50Zl9pbmZvKG1zZywiRERFX1Rlc3REREUoMHglMDR4KVxuIiwgaHduZCk7CisgIFRSQUNFKG1zZywiKDB4JTA0eClcbiIsIGh3bmQpOwogICBpZiAoaHduZD09MCkKICAgICAgIGh3bmQ9LTE7CiAgIC8qIGp1c3Qgc2VuZCBhIG1lc3NhZ2UgdG8gc2VlIGhvdyB0aGluZ3MgYXJlIGdvaW5nICovCkBAIC02MzEsNyArNjIwLDcgQEAKIAlkc3ByaW50ZihkZGUsIiBhdG9tPTB4JTA0eCIsaFdvcmQpOwogCWJyZWFrOwogICAgIH0KLSAgICBkcHJpbnRmX2luZm8oZGRlLCIlc1xuIiwgZGJnX3N0cihkZGUpKTsKKyAgICBUUkFDRShkZGUsIiVzXG4iLCBkYmdfc3RyKGRkZSkpOwogfQogCiB2b2lkIGRkZV9wcm9jX2RvbmUoZGRlX3Byb2MgcHJvYykKZGlmZiAtLWdpdCBhL2lwYy9zaG1fYmxvY2suYyBiL2lwYy9zaG1fYmxvY2suYwppbmRleCA1ZjU1NzBmLi42ZmVhYmQ1IDEwMDY0NAotLS0gYS9pcGMvc2htX2Jsb2NrLmMKKysrIGIvaXBjL3NobV9ibG9jay5jCkBAIC0zNyw3ICszNyw3IEBACiAgKi8KIHZvaWQgc2htX3NldHVwX2Jsb2NrKHN0cnVjdCBzaG1fYmxvY2sgKmJsb2NrLCBpbnQgZmlyc3QsIGludCBzaXplKQogewotICBkcHJpbnRmX2luZm8oc2htLCJTZXR0aW5nIHVwIHNobSBibG9jayBhdCAweCUwOHhcbiIsKGludCApYmxvY2spOworICBUUkFDRShzaG0sIlNldHRpbmcgdXAgc2htIGJsb2NrIGF0IDB4JTA4eFxuIiwoaW50IClibG9jayk7CiAgIC8qIHNldHVwIGJsb2NrIGludGVybmFsIGRhdGEgc3RydWN0dXJlICovCiAgIGlmIChmaXJzdCA8PSAwKSB7CiAgICAgIGZpcnN0PXNpemVvZigqYmxvY2spOwpAQCAtNTMsOCArNTMsNyBAQAogICAvKiBibG9jay0+c2l6ZSBpcyBpbml0aWFsaXplZCBpbiBzaG1fRnJhZ21lbnRJbml0ICovCiAgIHNobV9GcmFnbWVudEluaXQoYmxvY2ssIGZpcnN0LCBzaXplKTsgIC8qIGZpcnN0IGl0ZW0gaW4gdGhlIGZyZWUgbGlzdCAqLwogICAKLSAgZHByaW50Zl9pbmZvKHNobSwKLQkgICAgICAiYmxvY2sgd2FzIHNldCB1cCBhdCAweCUwOHgsIHNpemU9MHglMDR4S0IsIDFzdCB1c2FibGU9JTAyeFxuIiwKKyAgVFJBQ0Uoc2htLCAiYmxvY2sgd2FzIHNldCB1cCBhdCAweCUwOHgsIHNpemU9MHglMDR4S0IsIDFzdCB1c2FibGU9JTAyeFxuIiwKIAkgICAgICAoaW50IClibG9jayxzaXplLzEwMjQsZmlyc3QpOwogfQogCmRpZmYgLS1naXQgYS9pcGMvc2htX21haW5fYmxrLmMgYi9pcGMvc2htX21haW5fYmxrLmMKaW5kZXggNzQwMjQ3NS4uN2M2ZTkwZSAxMDA2NDQKLS0tIGEvaXBjL3NobV9tYWluX2Jsay5jCisrKyBiL2lwYy9zaG1fbWFpbl9ibGsuYwpAQCAtNzksNyArNzksNyBAQAogLyogc2V0dXAgYSBuZXcgbWFpbiBzaG0gYmxvY2sgKG9ubHkgY29uc3RydWN0IGEgc2htIGJsb2NrIG9iamVjdCkuICovCiBzdGF0aWMgdm9pZCBzaG1fc2V0dXBfbWFpbl9ibG9jaygpCiB7Ci0gIGRwcmludGZfaW5mbyhzaG0sImNyZWF0aW5nIGRhdGEgc3RydWN0dXJlXG4iKTsKKyAgVFJBQ0Uoc2htLCJjcmVhdGluZyBkYXRhIHN0cnVjdHVyZVxuIik7CiAgIG1haW5fYmxvY2stPmJ1aWxkX2xvY2s9MTsKICAgc3RyY3B5KG1haW5fYmxvY2stPm1hZ2ljLCBzaG1faGVhZGVyKTsKIApAQCAtMTMzLDI5ICsxMzMsMjkgQEAKIAogICAvKiBNYWtlIHN1cmUgd2UgZG9uJ3Qgd29yayBvbiBzb21lYm9keSBlbHNlJ3MgYmxvY2sgKi8KICAgaWYgKHNobV9pbmZvLnNobV9wZXJtLmN1aWQgIT0gZ2V0dWlkKCkpIHsgLyogY3JlYXRvciBpcyBub3QgbWUgKi8KLSAgICAgZHByaW50Zl93YXJuKHNobSwgIkNyZWF0b3IgaXMgbm90IG1lIVxuIik7CisgICAgIFdBUk4oc2htLCAiQ3JlYXRvciBpcyBub3QgbWUhXG4iKTsKICAgICAgcmV0dXJuIDA7CiAgIH0KIAotICBkcHJpbnRmX2luZm8oc2htLCJzaGFyZWQgbWVtb3J5IGV4aXN0LCBhdHRhY2hpbmcgYW55d2hlcmVcbiIpOworICBUUkFDRShzaG0sInNoYXJlZCBtZW1vcnkgZXhpc3QsIGF0dGFjaGluZyBhbnl3aGVyZVxuIik7CiAgIG1haW5fYmxvY2s9KHN0cnVjdCBzaG1fbWFpbl9ibG9jayAqKXNobWF0KHNobV9pZCwgMCwgMCk7CiAgIGlmICggKGludCltYWluX2Jsb2NrPT0tMSkgewotICAgICBkcHJpbnRmX3dhcm4oc2htLCAiQXR0YWNoIGZhaWxlZFxuIik7CisgICAgIFdBUk4oc2htLCAiQXR0YWNoIGZhaWxlZFxuIik7CiAgICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKHN0cmNtcChtYWluX2Jsb2NrLT5tYWdpYywgc2htX2hlYWRlcikgIT0gMCkgewotICAgICBkcHJpbnRmX2luZm8oc2htLCJEZXRhY2hpbmcsIHdyb25nIG1hZ2ljXG4iKTsKKyAgICAgVFJBQ0Uoc2htLCJEZXRhY2hpbmcsIHdyb25nIG1hZ2ljXG4iKTsKICAgICAgc2htZHQoKHZvaWQgKiltYWluX2Jsb2NrKTsKICAgICAgcmV0dXJuIDA7CiAgIH0KIAotICBpZiAoZGVidWdnaW5nX2luZm8oc2htKSkKKyAgaWYgKFRSQUNFX09OKHNobSkpCiAgICAgIHByaW50X3NobV9pbmZvKHNobV9pZCk7CiAKICAgLyogSXMgaXQgYW4gb2xkIHVudXNlZCBibG9jayA/ICovCiAgIGlmIChzaG1faW5mby5zaG1fbmF0dGNoID09IDApIHsKLSAgICAgZHByaW50Zl9pbmZvKHNobSwiTm8gYXR0YWNoZXMsIGRlbGV0aW5nIG9sZCBkYXRhXG4iKTsKKyAgICAgVFJBQ0Uoc2htLCJObyBhdHRhY2hlcywgZGVsZXRpbmcgb2xkIGRhdGFcbiIpOwogICAgICBzaG1fZGVsZXRlX2FsbChzaG1faWQpOwogICAgICByZXR1cm4gMDsKICAgfQpAQCAtMTgwLDEwICsxODAsMTAgQEAKICAgICBpbnQgc2htX2lkOwkJCS8qIERlc2NyaXB0b3IgdG8gdGhpcyBzaGFyZWQgbWVtb3J5ICovCiAgICAgaW50IGk7CiAKLSAgICBkcHJpbnRmX2luZm8oc2htLCJzaG1fbG9jYXRlX01haW5CbG9jazogdHJ5aW5nIHRvIGF0dGFjaCwga2V5PTB4JXhcbiIsCisgICAgVFJBQ0Uoc2htLCJ0cnlpbmcgdG8gYXR0YWNoLCBrZXk9MHgleFxuIiwKIAkJc2htX2tleSk7CiAgICAgZm9yIChpPTAgOyBpIDwgU0hNX0tFWV9SQU5HRSA7IGkrKykgewotICAgICAgIGRwcmludGZfaW5mbyhzaG0sIml0ZXJhdGlvbj0lZFxuIiwgaSk7CisgICAgICAgVFJBQ0Uoc2htLCJpdGVyYXRpb249JWRcbiIsIGkpOwogCiAgICAgICAgc2htX2lkPSBzaG1nZXQgKCBzaG1fa2V5K2ksIFNITV9NSU5CTE9DSyAsMDcwMCk7CiAKQEAgLTIwMiw3ICsyMDIsNyBAQAogCSAgICBjYXNlIEVOT01FTToJICAgLyogbm8gZnJlZSBtZW1vcnkgKi8KIAkgICAgY2FzZSBFTk9FTlQ6CSAgIC8qIHRoaXMga2V5IGRvZXMgbm90IGV4aXN0ICovCiAJICAgIGRlZmF1bHQgOgotCSAgICAgIGRwcmludGZfd2FybihzaG0sInNobWdldCBmYWlsZWQsIGVycm5vPSVkLCAlc1xuIiwKKwkgICAgICBXQVJOKHNobSwic2htZ2V0IGZhaWxlZCwgZXJybm89JWQsICVzXG4iLAogCQkgICAgIGVycm5vLCBzdHJlcnJvcihlcnJubykgKTsKIAkgICAgICByZXR1cm4gMDsJCSAgIC8qIEZhaWxlZCAqLwogCSAgfQpAQCAtMjIyLDcgKzIyMiw3IEBACiAgIGludCBmbGFncz0gMDcwMCB8IElQQ19DUkVBVCB8IElQQ19FWENMOwogICBpbnQgaTsKIAotICBkcHJpbnRmX2luZm8oc2htLCJjcmVhdGluZyBzaGFyZWQgbWVtb3J5XG4iKTsKKyAgVFJBQ0Uoc2htLCJjcmVhdGluZyBzaGFyZWQgbWVtb3J5XG4iKTsKIAogICAvKiB0cnkgdG8gYWxsb2NhdGUgc2hhcmVkIG1lbW9yeSB3aXRoIGtleT0iV2luZSIsIHNpemU9U0hNX01JTkJMT0NLLCAqLwogICAvKiBjb21wbGV0ZSB1c2VyIHBlcm1pc3Npb24gKi8KQEAgLTIzMiwxMiArMjMyLDEyIEBACiAJYnJlYWs7CiAgIH0KICAgaWYgKHNobV9pZCA9PSAtMSkgewotICAgICBkcHJpbnRmX3dhcm4oc2htLCAiZmFpbGVkIHRvIGNyZWF0ZSBzaGFyZWQgbWVtb3J5XG4iKTsKKyAgICAgV0FSTihzaG0sICJmYWlsZWQgdG8gY3JlYXRlIHNoYXJlZCBtZW1vcnlcbiIpOwogICAgICByZXR1cm4gMDsKICAgfQotICBkcHJpbnRmX2luZm8oc2htLCJzaGFyZWQgbWVtb3J5IGNyZWF0ZWQsIGF0dGFjaGluZ1xuIik7CisgIFRSQUNFKHNobSwic2hhcmVkIG1lbW9yeSBjcmVhdGVkLCBhdHRhY2hpbmdcbiIpOwogICBtYWluX2Jsb2NrPShzdHJ1Y3Qgc2htX21haW5fYmxvY2sqKSBzaG1hdChzaG1faWQsIDAsMCk7Ci0gIGlmIChkZWJ1Z2dpbmdfaW5mbyhzaG0pKQorICBpZiAoVFJBQ0VfT04oc2htKSkKICAgICAgcHJpbnRfc2htX2luZm8oc2htX2lkKTsKICAgbWFpbl9zaG1faWQ9IHNobV9pZDsKICAgc2htX3NldHVwX21haW5fYmxvY2soKTsKZGlmZiAtLWdpdCBhL2lwYy9zaG1fc2VtYXBoLmMgYi9pcGMvc2htX3NlbWFwaC5jCmluZGV4IDZkMDIxYmIuLjNmYmUwYWQgMTAwNjQ0Ci0tLSBhL2lwYy9zaG1fc2VtYXBoLmMKKysrIGIvaXBjL3NobV9zZW1hcGguYwpAQCAtMjgsNyArMjgsNyBAQAogICBzdHJ1Y3Qgc2VtYnVmIHNvcFsyXTsKICAgaW50IHJldDsKICAgCi0gIGRwcmludGZfaW5mbyhzZW0sInNobV9yZWFkX3dhaXQoJWQpXG4iLHNlbWlkKTsKKyAgVFJBQ0Uoc2VtLCIoJWQpXG4iLHNlbWlkKTsKICAgc29wWzBdLnNlbV9udW09U0VNX1JFQUQ7CiAgIHNvcFswXS5zZW1fb3A9MTsJCSAgIC8qIGFkZCB0aGlzIHJlYWQgaW5zdGFuY2UgKi8KICAgc29wWzBdLnNlbV9mbGc9U0VNX1VORE87CSAgIC8qIHVuZG8gaW4gY2FzZSBwcm9jZXNzIGRpZXMgKi8KQEAgLTUwLDcgKzUwLDcgQEAKICAgc3RydWN0IHNlbWJ1ZiBzb3BbM107CiAgIGludCByZXQ7CiAgIAotICBkcHJpbnRmX2luZm8oc2VtLCJzaG1fd3JpdGVfd2FpdCglZClcbiIsc2VtaWQpOworICBUUkFDRShzZW0sIiglZClcbiIsc2VtaWQpOwogICBzb3BbMF0uc2VtX251bT1TRU1fUkVBRDsKICAgc29wWzBdLnNlbV9vcD0wOwkJICAgLyogd2FpdCB1bnRpbCBubyByZWFkaW5nIGluc3RhbmNlIGV4aXN0ICovCiAgIHNvcFswXS5zZW1fZmxnPVNFTV9VTkRPOwkJICAgCkBAIC03Niw3ICs3Niw3IEBACiAgIHN0cnVjdCBzZW1idWYgc29wWzJdOwogICBpbnQgcmV0OwogCi0gIGRwcmludGZfaW5mbyhzZW0sInNobV93cml0ZV9zaWduYWwoJWQpXG4iLHNlbWlkKTsKKyAgVFJBQ0Uoc2VtLCIoJWQpXG4iLHNlbWlkKTsKICAgc29wWzBdLnNlbV9udW09U0VNX1JFQUQ7CiAgIHNvcFswXS5zZW1fb3A9LTE7CQogICBzb3BbMF0uc2VtX2ZsZz1JUENfTk9XQUlUIHwgU0VNX1VORE87CS8qIG5vIHJlYXNvbiB0byB3YWl0ICovCkBAIC05OSw3ICs5OSw3IEBACiAgIHN0cnVjdCBzZW1idWYgc29wWzJdOwogICBpbnQgcmV0OwogCi0gIGRwcmludGZfaW5mbyhzZW0sInNobV9yZWFkX3NpZ25hbCglZClcbiIsc2VtaWQpOworICBUUkFDRShzZW0sIiglZClcbiIsc2VtaWQpOwogICBzb3BbMF0uc2VtX251bT1TRU1fUkVBRDsKICAgc29wWzBdLnNlbV9vcD0tMTsJCiAgIHNvcFswXS5zZW1fZmxnPUlQQ19OT1dBSVQgfCBTRU1fVU5ETzsJLyogbm8gcmVhc29uIHRvIHdhaXQgKi8KZGlmZiAtLWdpdCBhL2xvYWRlci9tb2R1bGUuYyBiL2xvYWRlci9tb2R1bGUuYwppbmRleCA4YmMwNzgzLi43YThkNTg1IDEwMDY0NAotLS0gYS9sb2FkZXIvbW9kdWxlLmMKKysrIGIvbG9hZGVyL21vZHVsZS5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSAibW9kdWxlLmgiCiAjaW5jbHVkZSAibmVleGUuaCIKICNpbmNsdWRlICJwcm9jZXNzLmgiCisjaW5jbHVkZSAidGhyZWFkLmgiCiAjaW5jbHVkZSAicmVzb3VyY2UuaCIKICNpbmNsdWRlICJzZWxlY3RvcnMuaCIKICNpbmNsdWRlICJzdGFja2ZyYW1lLmgiCkBAIC0yOSw2ICszMCw4IEBACiAKIGV4dGVybiBISU5TVEFOQ0UxNiBQRV9Mb2FkTW9kdWxlKCBIRklMRTMyIGhmLCBPRlNUUlVDVCAqb2ZzLCBMT0FEUEFSQU1TKiBwYXJhbXMgKTsKIAorZXh0ZXJuIEJPT0wzMiBUSFJFQURfSW5pdERvbmU7CisKIHN0YXRpYyBITU9EVUxFMTYgaEZpcnN0TW9kdWxlID0gMDsKIHN0YXRpYyBITU9EVUxFMTYgaENhY2hlZE1vZHVsZSA9IDA7ICAvKiBNb2R1bGUgY2FjaGVkIGJ5IE1PRFVMRV9PcGVuRmlsZSAqLwogCkBAIC0yNjksNyArMjcyLDcgQEAKICAgICBzdGF0aWMgaW50IGNhY2hlZGZkID0gLTE7CiAKICAgICBoTW9kdWxlID0gTU9EVUxFX0hBTkRMRXRvSE1PRFVMRTE2KGhNb2R1bGUpOwotICAgIGRwcmludGZfaW5mbyhtb2R1bGUsICJNT0RVTEVfT3BlbkZpbGUoJTA0eCkgY2FjaGU6IG1vZD0lMDR4IGZkPSVkXG4iLAorICAgIFRSQUNFKG1vZHVsZSwgIiglMDR4KSBjYWNoZTogbW9kPSUwNHggZmQ9JWRcbiIsCiAgICAgICAgICAgICAgICAgICAgIGhNb2R1bGUsIGhDYWNoZWRNb2R1bGUsIGNhY2hlZGZkICk7CiAgICAgaWYgKCEocE1vZHVsZSA9IE1PRFVMRV9HZXRQdHIoIGhNb2R1bGUgKSkpIHJldHVybiAtMTsKICAgICBpZiAoaENhY2hlZE1vZHVsZSA9PSBoTW9kdWxlKSByZXR1cm4gY2FjaGVkZmQ7CkBAIC0yODAsNyArMjgzLDcgQEAKICAgICAgICAgKGNhY2hlZGZkID0gb3BlbiggZnVsbF9uYW1lLmxvbmdfbmFtZSwgT19SRE9OTFkgKSkgPT0gLTEpCiAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIk1PRFVMRV9PcGVuRmlsZTogY2FuJ3Qgb3BlbiBmaWxlICclcycgZm9yIG1vZHVsZSAlMDR4XG4iLAogICAgICAgICAgICAgICAgICBuYW1lLCBoTW9kdWxlICk7Ci0gICAgZHByaW50Zl9pbmZvKG1vZHVsZSwgIk1PRFVMRV9PcGVuRmlsZTogb3BlbmVkICclcycgLT4gJWRcbiIsCisgICAgVFJBQ0UobW9kdWxlLCAib3BlbmVkICclcycgLT4gJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGNhY2hlZGZkICk7CiAgICAgcmV0dXJuIGNhY2hlZGZkOwogfQpAQCAtNTYxLDcgKzU2NCw3IEBACiAKICAgICAvKiBDbGVhciBpbnRlcm5hbCBXaW5lIGZsYWdzIGluIGNhc2UgdGhleSBhcmUgc2V0IGluIHRoZSBFWEUgZmlsZSAqLwogCi0gICAgcE1vZHVsZS0+ZmxhZ3MgJj0gfihORV9GRkxBR1NfQlVJTFRJTiB8IE5FX0ZGTEFHU19XSU4zMik7CisgICAgcE1vZHVsZS0+ZmxhZ3MgJj0gfihORV9GRkxBR1NfQlVJTFRJTnxORV9GRkxBR1NfV0lOMzJ8TkVfRkZMQUdTX0lNUExJQ0lUKTsKIAogICAgIC8qIFJlYWQgdGhlIGZhc3QtbG9hZCBhcmVhICovCiAKQEAgLTU2OSw3ICs1NzIsNyBAQAogICAgIHsKICAgICAgICAgZmFzdGxvYWRfb2Zmc2V0PW5lX2hlYWRlci5mYXN0bG9hZF9vZmZzZXQ8PG5lX2hlYWRlci5hbGlnbl9zaGlmdF9jb3VudDsKICAgICAgICAgZmFzdGxvYWRfbGVuZ3RoPW5lX2hlYWRlci5mYXN0bG9hZF9sZW5ndGg8PG5lX2hlYWRlci5hbGlnbl9zaGlmdF9jb3VudDsKLSAgICAgICAgZHByaW50Zl9pbmZvKG1vZHVsZSwgIlVzaW5nIGZhc3QtbG9hZCBhcmVhIG9mZnNldD0leCBsZW49JWRcbiIsCisgICAgICAgIFRSQUNFKG1vZHVsZSwgIlVzaW5nIGZhc3QtbG9hZCBhcmVhIG9mZnNldD0leCBsZW49JWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBmYXN0bG9hZF9vZmZzZXQsIGZhc3Rsb2FkX2xlbmd0aCApOwogICAgICAgICBpZiAoKGZhc3Rsb2FkID0gSGVhcEFsbG9jKCBTeXN0ZW1IZWFwLCAwLCBmYXN0bG9hZF9sZW5ndGggKSkgIT0gTlVMTCkKICAgICAgICAgewpAQCAtNzU2LDcgKzc1OSw3IEBACiAKICAgICBpZiAoIShwTW9kdWxlID0gTU9EVUxFX0dldFB0ciggaE1vZHVsZSApKSkgcmV0dXJuIDA7CiAKLSAgICBkcHJpbnRmX2luZm8obW9kdWxlLCAiTU9EVUxFX0dldE9yZGluYWwoJTA0eCwnJXMnKVxuIiwKKyAgICBUUkFDRShtb2R1bGUsICIoJTA0eCwnJXMnKVxuIiwKICAgICAgICAgICAgICAgICAgICAgaE1vZHVsZSwgbmFtZSApOwogCiAgICAgICAvKiBGaXJzdCBoYW5kbGUgbmFtZXMgb2YgdGhlIGZvcm0gJyN4eHh4JyAqLwpAQCAtNzc5LDcgKzc4Miw3IEBACiAgICAgewogICAgICAgICBpZiAoKChCWVRFKSpjcG50ID09IGxlbikgJiYgIW1lbWNtcCggY3BudCsxLCBidWZmZXIsIGxlbiApKQogICAgICAgICB7Ci0gICAgICAgICAgICBkcHJpbnRmX2luZm8obW9kdWxlLCAiICBGb3VuZDogb3JkaW5hbD0lZFxuIiwKKyAgICAgICAgICAgIFRSQUNFKG1vZHVsZSwgIiAgRm91bmQ6IG9yZGluYWw9JWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihXT1JEICopKGNwbnQgKyAqY3BudCArIDEpICk7CiAgICAgICAgICAgICByZXR1cm4gKihXT1JEICopKGNwbnQgKyAqY3BudCArIDEpOwogICAgICAgICB9CkBAIC03OTcsNyArODAwLDcgQEAKICAgICB7CiAgICAgICAgIGlmICgoKEJZVEUpKmNwbnQgPT0gbGVuKSAmJiAhbWVtY21wKCBjcG50KzEsIGJ1ZmZlciwgbGVuICkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGRwcmludGZfaW5mbyhtb2R1bGUsICIgIEZvdW5kOiBvcmRpbmFsPSVkXG4iLAorICAgICAgICAgICAgVFJBQ0UobW9kdWxlLCAiICBGb3VuZDogb3JkaW5hbD0lZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKFdPUkQgKikoY3BudCArICpjcG50ICsgMSkgKTsKICAgICAgICAgICAgIHJldHVybiAqKFdPUkQgKikoY3BudCArICpjcG50ICsgMSk7CiAgICAgICAgIH0KQEAgLTEwNDQsNyArMTA0Nyw3IEBACiAgICAgaWYgKG9yZGluYWwpIFdFUCA9IE1PRFVMRV9HZXRFbnRyeVBvaW50KCBoTW9kdWxlLCBvcmRpbmFsICk7CiAgICAgaWYgKCFXRVApCiAgICAgewotCWRwcmludGZfd2Fybihtb2R1bGUsICJtb2R1bGUgJTA0eCBkb2Vzbid0IGhhdmUgYSBXRVBcbiIsIGhNb2R1bGUgKTsKKwlXQVJOKG1vZHVsZSwgIm1vZHVsZSAlMDR4IGRvZXNuJ3QgaGF2ZSBhIFdFUFxuIiwgaE1vZHVsZSApOwogCXJldHVybiBGQUxTRTsKICAgICB9CiAgICAgcmV0dXJuIENhbGxiYWNrcy0+Q2FsbFdpbmRvd3NFeGl0UHJvYyggV0VQLCBXRVBfRlJFRV9ETEwgKTsKQEAgLTEzMDcsNyArMTMxMCw3IEBACiAgICAgTkVfTU9EVUxFICpwTW9kdWxlOwogCiAgICAgaWYgKCEocE1vZHVsZSA9IE1PRFVMRV9HZXRQdHIoIGhNb2R1bGUgKSkpIHJldHVybiBGQUxTRTsKLSAgICBkcHJpbnRmX2luZm8obW9kdWxlLCAiRnJlZU1vZHVsZTE2OiAlcyBjb3VudCAlZFxuIiwgCisgICAgVFJBQ0UobW9kdWxlLCAiJXMgY291bnQgJWRcbiIsIAogCQkgICAgTU9EVUxFX0dldE1vZHVsZU5hbWUoaE1vZHVsZSksIHBNb2R1bGUtPmNvdW50ICk7CiAKICAgICByZXR1cm4gTU9EVUxFX0ZyZWVNb2R1bGUoIGhNb2R1bGUsIEdsb2JhbExvY2sxNihHZXRDdXJyZW50VGFzaygpKSApOwpAQCAtMTMzNSw3ICsxMzM4LDcgQEAKIHsKICAgICBITU9EVUxFMzIJaE1vZHVsZTsKIAotICAgIGRwcmludGZfaW5mbyh3aW4zMiwgIkdldE1vZHVsZUhhbmRsZUE6ICVzXG4iLCBtb2R1bGUgPyBtb2R1bGUgOiAiTlVMTCIpOworICAgIFRSQUNFKHdpbjMyLCAiJXNcbiIsIG1vZHVsZSA/IG1vZHVsZSA6ICJOVUxMIik7CiAvKiBGcmVlY2VsbCB1c2VzIHRoZSByZXN1bHQgb2YgR2V0TW9kdWxlSGFuZGxlQSgwKSBhcyB0aGUgaEluc3RhbmNlIGluCiBhbGwgY2FsbHMgdG8gZS5nLiBDcmVhdGVXaW5kb3dFeC4gKi8KICAgICBpZiAobW9kdWxlID09IE5VTEwpIHsKQEAgLTEzNjQsNyArMTM2Nyw3IEBACiAgICAgTkVfTU9EVUxFICpwTW9kdWxlOwogCiAgICAgaWYgKCEocE1vZHVsZSA9IE1PRFVMRV9HZXRQdHIoIGhNb2R1bGUgKSkpIHJldHVybiAwOwotICAgIGRwcmludGZfaW5mbyhtb2R1bGUsICJHZXRNb2R1bGVVc2FnZSglMDR4KTogcmV0dXJuaW5nICVkXG4iLAorICAgIFRSQUNFKG1vZHVsZSwgIiglMDR4KTogcmV0dXJuaW5nICVkXG4iLAogICAgICAgICAgICAgICAgICAgICBoTW9kdWxlLCBwTW9kdWxlLT5jb3VudCApOwogICAgIHJldHVybiBwTW9kdWxlLT5jb3VudDsKIH0KQEAgLTEzODEsNyArMTM4NCw3IEBACiAgICAgaWYgKCFoTW9kdWxlKSBoTW9kdWxlID0gR2V0Q3VycmVudFRhc2soKTsKICAgICBpZiAoIShwTW9kdWxlID0gTU9EVUxFX0dldFB0ciggaE1vZHVsZSApKSkgcmV0dXJuIDA7CiAgICAgbHN0cmNweW4zMkEoIGxwRmlsZU5hbWUsIE5FX01PRFVMRV9OQU1FKHBNb2R1bGUpLCBuU2l6ZSApOwotICAgIGRwcmludGZfaW5mbyhtb2R1bGUsICJHZXRNb2R1bGVGaWxlTmFtZTE2OiAlc1xuIiwgbHBGaWxlTmFtZSApOworICAgIFRSQUNFKG1vZHVsZSwgIiVzXG4iLCBscEZpbGVOYW1lICk7CiAgICAgcmV0dXJuIHN0cmxlbihscEZpbGVOYW1lKTsKIH0KIApAQCAtMTQwMSw3ICsxNDA0LDcgQEAKICAgICB9CiAgICAgaWYgKCEocE1vZHVsZSA9IE1PRFVMRV9HZXRQdHIoIGhNb2R1bGUgKSkpIHJldHVybiAwOwogICAgIGxzdHJjcHluMzJBKCBscEZpbGVOYW1lLCBORV9NT0RVTEVfTkFNRShwTW9kdWxlKSwgc2l6ZSApOwotICAgIGRwcmludGZfaW5mbyhtb2R1bGUsICJHZXRNb2R1bGVGaWxlTmFtZTMyQTogJXNcbiIsIGxwRmlsZU5hbWUgKTsKKyAgICBUUkFDRShtb2R1bGUsICIlc1xuIiwgbHBGaWxlTmFtZSApOwogICAgIHJldHVybiBzdHJsZW4obHBGaWxlTmFtZSk7CiB9ICAgICAgICAgICAgICAgICAgIAogIApAQCAtMTQ5Niw3ICsxNDk5LDcgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBGcmVlTGlicmFyeTMyKEhJTlNUQU5DRTMyIGhMaWJNb2R1bGUpCiB7Ci0JZHByaW50Zl9pbmZvKG1vZHVsZSwiRnJlZUxpYnJhcnk6IGhMaWJNb2R1bGU6ICUwOHhcbiIsIGhMaWJNb2R1bGUpOworCVRSQUNFKG1vZHVsZSwiaExpYk1vZHVsZT0lMDh4XG4iLCBoTGliTW9kdWxlKTsKIAlyZXR1cm4gTU9EVUxFX0ZyZWVNb2R1bGUoaExpYk1vZHVsZSwgCiAJICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbExvY2sxNihHZXRDdXJyZW50VGFzaygpKSApOwogfQpAQCAtMTUxNCw3ICsxNTE3LDcgQEAKICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiTG9hZExpYnJhcnkgbm90IHN1cHBvcnRlZCBpbiBXaW5lbGliXG4iICk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICBkcHJpbnRmX2luZm8obW9kdWxlLCAiTG9hZExpYnJhcnk6ICglMDh4KSAlc1xuIiwgKGludClsaWJuYW1lLCBsaWJuYW1lKTsKKyAgICBUUkFDRShtb2R1bGUsICIoJTA4eCkgJXNcbiIsIChpbnQpbGlibmFtZSwgbGlibmFtZSk7CiAKICAgICBoYW5kbGUgPSBNT0RVTEVfTG9hZCggbGlibmFtZSwgKExQVk9JRCktMSwgMCApOwogICAgIGlmIChoYW5kbGUgPT0gKEhJTlNUQU5DRTE2KTIpICAvKiBmaWxlIG5vdCBmb3VuZCAqLwpAQCAtMTU0NCw3ICsxNTQ3LDcgQEAKICAqLwogdm9pZCBXSU5BUEkgRnJlZUxpYnJhcnkxNiggSElOU1RBTkNFMTYgaGFuZGxlICkKIHsKLSAgICBkcHJpbnRmX2luZm8obW9kdWxlLCJGcmVlTGlicmFyeTogJTA0eFxuIiwgaGFuZGxlICk7CisgICAgVFJBQ0UobW9kdWxlLCIlMDR4XG4iLCBoYW5kbGUgKTsKICAgICBGcmVlTW9kdWxlMTYoIGhhbmRsZSApOwogfQogCkBAIC0xNjgzLDYgKzE2ODYsNyBAQAogCQlpbnQgaWNvbmljID0gKG5DbWRTaG93ID09IFNXX1NIT1dNSU5JTUlaRUQgfHwKIAkJCSAgICAgIG5DbWRTaG93ID09IFNXX1NIT1dNSU5OT0FDVElWRSk7CiAKKwkJVEhSRUFEX0luaXREb25lID0gRkFMU0U7IC8qIHdlIGRpZG4ndCBpbml0IHRoaXMgcHJvY2VzcyAqLwogCQkvKiBnZXQgdW5peGZpbGVuYW1lICovCiAJCWlmIChzdHJjaHIoZmlsZW5hbWUsICcvJykgfHwKIAkJICAgIHN0cmNocihmaWxlbmFtZSwgJzonKSB8fApAQCAtMTc1OCwxNiArMTc2MiwxNiBAQAogICAgIGhNb2R1bGUgPSBNT0RVTEVfSEFORExFdG9ITU9EVUxFMTYoaE1vZHVsZSk7CiAgICAgaWYgKEhJV09SRChuYW1lKSkgewogICAgICAgICBvcmRpbmFsID0gTU9EVUxFX0dldE9yZGluYWwoIGhNb2R1bGUsIG5hbWUgKTsKLSAgICAgICAgZHByaW50Zl9pbmZvKG1vZHVsZSwgIldJTjMyX0dldFByb2NBZGRyZXNzMTY6ICUwNHggJyVzJ1xuIiwKKyAgICAgICAgVFJBQ0UobW9kdWxlLCAiJTA0eCAnJXMnXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgaE1vZHVsZSwgbmFtZSApOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG9yZGluYWwgPSBMT1dPUkQobmFtZSk7Ci0gICAgICAgIGRwcmludGZfaW5mbyhtb2R1bGUsICJHZXRQcm9jQWRkcmVzczogJTA0eCAlMDR4XG4iLAorICAgICAgICBUUkFDRShtb2R1bGUsICIlMDR4ICUwNHhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBoTW9kdWxlLCBvcmRpbmFsICk7CiAgICAgfQogICAgIGlmICghb3JkaW5hbCkgcmV0dXJuIChGQVJQUk9DMTYpMDsKICAgICByZXQgPSBNT0RVTEVfR2V0RW50cnlQb2ludCggaE1vZHVsZSwgb3JkaW5hbCApOwotICAgIGRwcmludGZfaW5mbyhtb2R1bGUsIldJTjMyX0dldFByb2NBZGRyZXNzMTY6IHJldHVybmluZyAlMDh4XG4iLChVSU5UMzIpcmV0KTsKKyAgICBUUkFDRShtb2R1bGUsInJldHVybmluZyAlMDh4XG4iLChVSU5UMzIpcmV0KTsKICAgICByZXR1cm4gcmV0OwogfQogCkBAIC0xNzg1LDIwICsxNzg5LDIwIEBACiAgICAgaWYgKEhJV09SRChuYW1lKSAhPSAwKQogICAgIHsKICAgICAgICAgb3JkaW5hbCA9IE1PRFVMRV9HZXRPcmRpbmFsKCBoTW9kdWxlLCAoTFBTVFIpUFRSX1NFR19UT19MSU4obmFtZSkgKTsKLSAgICAgICAgZHByaW50Zl9pbmZvKG1vZHVsZSwgIkdldFByb2NBZGRyZXNzOiAlMDR4ICclcydcbiIsCisgICAgICAgIFRSQUNFKG1vZHVsZSwgIiUwNHggJyVzJ1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGhNb2R1bGUsIChMUFNUUilQVFJfU0VHX1RPX0xJTihuYW1lKSApOwogICAgIH0KICAgICBlbHNlCiAgICAgewogICAgICAgICBvcmRpbmFsID0gTE9XT1JEKG5hbWUpOwotICAgICAgICBkcHJpbnRmX2luZm8obW9kdWxlLCAiR2V0UHJvY0FkZHJlc3M6ICUwNHggJTA0eFxuIiwKKyAgICAgICAgVFJBQ0UobW9kdWxlLCAiJTA0eCAlMDR4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgaE1vZHVsZSwgb3JkaW5hbCApOwogICAgIH0KICAgICBpZiAoIW9yZGluYWwpIHJldHVybiAoRkFSUFJPQzE2KTA7CiAKICAgICByZXQgPSBNT0RVTEVfR2V0RW50cnlQb2ludCggaE1vZHVsZSwgb3JkaW5hbCApOwogCi0gICAgZHByaW50Zl9pbmZvKG1vZHVsZSwgIkdldFByb2NBZGRyZXNzOiByZXR1cm5pbmcgJTA4eFxuIiwgKFVJTlQzMilyZXQgKTsKKyAgICBUUkFDRShtb2R1bGUsICJyZXR1cm5pbmcgJTA4eFxuIiwgKFVJTlQzMilyZXQgKTsKICAgICByZXR1cm4gcmV0OwogfQogCkBAIC0xODExLDkgKzE4MTUsOSBAQAogICAgIE5FX01PRFVMRSAqcE1vZHVsZTsKIAogICAgIGlmIChISVdPUkQoZnVuY3Rpb24pKQotCWRwcmludGZfaW5mbyh3aW4zMiwiR2V0UHJvY0FkZHJlc3MzMiglMDhseCwlcylcbiIsKERXT1JEKWhNb2R1bGUsZnVuY3Rpb24pOworCVRSQUNFKHdpbjMyLCIoJTA4bHgsJXMpXG4iLChEV09SRCloTW9kdWxlLGZ1bmN0aW9uKTsKICAgICBlbHNlCi0JZHByaW50Zl9pbmZvKHdpbjMyLCJHZXRQcm9jQWRkcmVzczMyKCUwOGx4LCVwKVxuIiwoRFdPUkQpaE1vZHVsZSxmdW5jdGlvbik7CisJVFJBQ0Uod2luMzIsIiglMDhseCwlcClcbiIsKERXT1JEKWhNb2R1bGUsZnVuY3Rpb24pOwogICAgIGlmICghKHBNb2R1bGUgPSBNT0RVTEVfR2V0UHRyKCBoTW9kdWxlICkpKQogICAgICAgICByZXR1cm4gKEZBUlBST0MzMikwOwogICAgIGlmICghcE1vZHVsZS0+bW9kdWxlMzIpCmRpZmYgLS1naXQgYS9sb2FkZXIvbmVfaW1hZ2UuYyBiL2xvYWRlci9uZV9pbWFnZS5jCmluZGV4IDdiMTNiYWIuLmM0N2ZkNGMgMTAwNjQ0Ci0tLSBhL2xvYWRlci9uZV9pbWFnZS5jCisrKyBiL2xvYWRlci9uZV9pbWFnZS5jCkBAIC01NCw3ICs1NCw3IEBACiAgICAgaWYgKCFwU2VnLT5maWxlcG9zKSByZXR1cm4gVFJVRTsgIC8qIE5vIGZpbGUgaW1hZ2UsIGp1c3QgcmV0dXJuICovCiAJCiAgICAgZmQgPSBNT0RVTEVfT3BlbkZpbGUoIHBNb2R1bGUtPnNlbGYgKTsKLSAgICBkcHJpbnRmX2luZm8obW9kdWxlLCAiTG9hZGluZyBzZWdtZW50ICVkLCBzZWxlY3Rvcj0lMDR4LCBmbGFncz0lMDR4XG4iLAorICAgIFRSQUNFKG1vZHVsZSwgIkxvYWRpbmcgc2VnbWVudCAlZCwgc2VsZWN0b3I9JTA0eCwgZmxhZ3M9JTA0eFxuIiwKICAgICAgICAgICAgICAgICAgICAgc2VnbnVtLCBwU2VnLT5zZWxlY3RvciwgcFNlZy0+ZmxhZ3MgKTsKICAgICBsc2VlayggZmQsIHBTZWctPmZpbGVwb3MgPDwgcE1vZHVsZS0+YWxpZ25tZW50LCBTRUVLX1NFVCApOwogICAgIGlmIChwU2VnLT5zaXplKSBzaXplID0gcFNlZy0+c2l6ZTsKQEAgLTExNSw3ICsxMTUsNyBAQAogICAgICAgLyoKIAkgVGhlIGZvbGxvd2luZyBiaXQgb2YgY29kZSBmb3IgIml0ZXJhdGVkIHNlZ21lbnRzIiB3YXMgd3JpdHRlbiB3aXRob3V0CiAJIGFueSBkb2N1bWVudGF0aW9uIG9uIHRoZSBmb3JtYXQgb2YgdGhlc2Ugc2VnbWVudHMuIEl0IHNlZW1zIHRvIHdvcmssCi0JIGJ1dCBtYXkgYmUgbWlzc2luZyBzb21ldGhpbmcuIElmIHlvdSBoYXZlIGFueSBkb2NvIHBsZWFzZSBlaXRoZXIgc2VuZAorCSBidXQgbWF5IGJlIG1pc3Npbmcgc29tZXRoaW5nLiBJZiB5b3UgaGF2ZSBhbnkgZG9jIHBsZWFzZSBlaXRoZXIgc2VuZAogCSBpdCB0byBtZSBvciBmaXggdGhlIGNvZGUgeW91cnNlbGYuIGdmbUB3ZXJwbGUubWlyYS5uZXQuYXUKICAgICAgICovCiAgICAgICBjaGFyKiBidWZmID0geG1hbGxvYyhzaXplKTsKQEAgLTE0Miw3ICsxNDIsNyBAQAogICAgIHJlYWQoIGZkLCAmY291bnQsIHNpemVvZihjb3VudCkgKTsKICAgICBpZiAoIWNvdW50KSByZXR1cm4gVFJVRTsKIAotICAgIGRwcmludGZfaW5mbyhmaXh1cCwgIkZpeHVwcyBmb3IgJSouKnMsIHNlZ21lbnQgJWQsIHNlbGVjdG9yICUwNHhcbiIsCisgICAgVFJBQ0UoZml4dXAsICJGaXh1cHMgZm9yICUqLipzLCBzZWdtZW50ICVkLCBzZWxlY3RvciAlMDR4XG4iLAogICAgICAgICAgICAgICAgICAgICooKEJZVEUgKilwTW9kdWxlICsgcE1vZHVsZS0+bmFtZV90YWJsZSksCiAgICAgICAgICAgICAgICAgICAgKigoQllURSAqKXBNb2R1bGUgKyBwTW9kdWxlLT5uYW1lX3RhYmxlKSwKICAgICAgICAgICAgICAgICAgICAoY2hhciAqKXBNb2R1bGUgKyBwTW9kdWxlLT5uYW1lX3RhYmxlICsgMSwKQEAgLTE1MiwxMiArMTUyLDEyIEBACiAgICAgaWYgKHJlYWQoIGZkLCByZWxvY19lbnRyaWVzLCBjb3VudCAqIHNpemVvZihzdHJ1Y3QgcmVsb2NhdGlvbl9lbnRyeV9zKSkgIT0KICAgICAgICAgICAgIGNvdW50ICogc2l6ZW9mKHN0cnVjdCByZWxvY2F0aW9uX2VudHJ5X3MpKQogICAgIHsKLSAgICAgICAgZHByaW50Zl93YXJuKGZpeHVwLCAiVW5hYmxlIHRvIHJlYWQgcmVsb2NhdGlvbiBpbmZvcm1hdGlvblxuIiApOworICAgICAgICBXQVJOKGZpeHVwLCAiVW5hYmxlIHRvIHJlYWQgcmVsb2NhdGlvbiBpbmZvcm1hdGlvblxuIiApOwogICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogCiAgICAgLyoKLSAgICAgKiBHbyB0aHJvdWdoIHRoZSByZWxvY2F0aW9uIHRhYmxlIG9uIGVudHJ5IGF0IGEgdGltZS4KKyAgICAgKiBHbyB0aHJvdWdoIHRoZSByZWxvY2F0aW9uIHRhYmxlIG9uZSBlbnRyeSBhdCBhIHRpbWUuCiAgICAgICovCiAgICAgcmVwID0gcmVsb2NfZW50cmllczsKICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKywgcmVwKyspCkBAIC0xOTMsMTAgKzE5MywxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopcFRhcmdldCArIHBUYXJnZXQtPm5hbWVfdGFibGUgKyAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGluYWwgKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkZWJ1Z2dpbmdfaW5mbyhmaXh1cCkpCisgICAgICAgICAgICBpZiAoVFJBQ0VfT04oZml4dXApKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIE5FX01PRFVMRSAqcFRhcmdldCA9IE1PRFVMRV9HZXRQdHIoIG1vZHVsZSApOwotICAgICAgICAgICAgICAgIGRwcmludGZfaW5mbyhmaXh1cCwgIiVkOiAlKi4qcy4lZD0lMDR4OiUwNHhcbiIsIGkgKyAxLCAKKyAgICAgICAgICAgICAgICBUUkFDRShmaXh1cCwgIiVkOiAlKi4qcy4lZD0lMDR4OiUwNHhcbiIsIGkgKyAxLCAKIAkJCSAgICAgKigoQllURSAqKXBUYXJnZXQgKyBwVGFyZ2V0LT5uYW1lX3RhYmxlKSwKIAkJCSAgICAgKigoQllURSAqKXBUYXJnZXQgKyBwVGFyZ2V0LT5uYW1lX3RhYmxlKSwKIAkJCSAgICAgKGNoYXIgKilwVGFyZ2V0ICsgcFRhcmdldC0+bmFtZV90YWJsZSArIDEsCkBAIC0yMTQsMTcgKzIxNCwxNyBAQAogCiAgICAgICAgICAgICBhZGRyZXNzID0gTU9EVUxFX0dldEVudHJ5UG9pbnQoIG1vZHVsZSwgb3JkaW5hbCApOwogCi0gICAgICAgICAgICBpZiAoZGVidWdnaW5nX2VycihmaXh1cCkgJiYgIWFkZHJlc3MpCisgICAgICAgICAgICBpZiAoRVJSX09OKGZpeHVwKSAmJiAhYWRkcmVzcykKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBORV9NT0RVTEUgKnBUYXJnZXQgPSBNT0RVTEVfR2V0UHRyKCBtb2R1bGUgKTsKLSAgICAgICAgICAgICAgICBkcHJpbnRmX2VycihmaXh1cCwgIldhcm5pbmc6IG5vIGhhbmRsZXIgZm9yICUuKnMuJXMsIHNldHRpbmcgdG8gMDowXG4iLAorICAgICAgICAgICAgICAgIEVSUihmaXh1cCwgIldhcm5pbmc6IG5vIGhhbmRsZXIgZm9yICUuKnMuJXMsIHNldHRpbmcgdG8gMDowXG4iLAogCQkJICAgICooKEJZVEUgKilwVGFyZ2V0ICsgcFRhcmdldC0+bmFtZV90YWJsZSksCiAJCQkgICAgKGNoYXIgKilwVGFyZ2V0ICsgcFRhcmdldC0+bmFtZV90YWJsZSArIDEsIGZ1bmNfbmFtZSApOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGRlYnVnZ2luZ19pbmZvKGZpeHVwKSkKKyAgICAgICAgICAgIGlmIChUUkFDRV9PTihmaXh1cCkpCiAgICAgICAgICAgICB7CiAJICAgICAgICBORV9NT0RVTEUgKnBUYXJnZXQgPSBNT0RVTEVfR2V0UHRyKCBtb2R1bGUgKTsKLSAgICAgICAgICAgICAgICBkcHJpbnRmX2luZm8oZml4dXAsICIlZDogJS4qcy4lcz0lMDR4OiUwNHhcbiIsIGkgKyAxLCAKKyAgICAgICAgICAgICAgICBUUkFDRShmaXh1cCwgIiVkOiAlLipzLiVzPSUwNHg6JTA0eFxuIiwgaSArIDEsIAogCQkJICAgICAqKChCWVRFICopcFRhcmdldCArIHBUYXJnZXQtPm5hbWVfdGFibGUpLAogCQkJICAgICAoY2hhciAqKXBUYXJnZXQgKyBwVGFyZ2V0LT5uYW1lX3RhYmxlICsgMSwKIAkJCSAgICAgZnVuY19uYW1lLCBISVdPUkQoYWRkcmVzcyksIExPV09SRChhZGRyZXNzKSApOwpAQCAtMjQxLDcgKzI0MSw3IEBACiAgICAgICAgICAgICAgICAgYWRkcmVzcyA9IChGQVJQUk9DMTYpUFRSX1NFR19PRkZfVE9fU0VHUFRSKCBwU2VnVGFibGVbcmVwLT50YXJnZXQxLTFdLnNlbGVjdG9yLCByZXAtPnRhcmdldDIgKTsKIAkgICAgfQogCSAgICAKLQkgICAgZHByaW50Zl9pbmZvKGZpeHVwLCIlZDogJTA0eDolMDR4XG4iLCAKKwkgICAgVFJBQ0UoZml4dXAsIiVkOiAlMDR4OiUwNHhcbiIsIAogCQkJICBpICsgMSwgSElXT1JEKGFkZHJlc3MpLCBMT1dPUkQoYWRkcmVzcykgKTsKIAkgICAgYnJlYWs7CiAKQEAgLTI1NCwxNCArMjU0LDEzIEBACiAJICAgICAqIHN1Y2Nlc3NmdWxseSBlbXVsYXRlIHRoZSBjb3Byb2Nlc3NvciBpZiBpdCBkb2Vzbid0CiAJICAgICAqIGV4aXN0LgogCSAgICAgKi8KLQkgICAgZHByaW50Zl9pbmZvKGZpeHVwLAotICAgICAgICAgICAgICAgICAgICIlZDogQUREUiBUWVBFICVkLCAgVFlQRSAlZCwgIE9GRlNFVCAlMDR4LCAgVEFSR0VUICUwNHggJTA0eFxuIiwKLQkJICAgaSArIDEsIHJlcC0+YWRkcmVzc190eXBlLCByZXAtPnJlbG9jYXRpb25fdHlwZSwgCi0JCSAgIHJlcC0+b2Zmc2V0LCByZXAtPnRhcmdldDEsIHJlcC0+dGFyZ2V0Mik7CisJICAgIFRSQUNFKGZpeHVwLCAiJWQ6IEFERFIgVFlQRSAlZCwgIFRZUEUgJWQsICBPRkZTRVQgJTA0eCwgICIKKwkJCSAiVEFSR0VUICUwNHggJTA0eFxuIiwgaSArIDEsIHJlcC0+YWRkcmVzc190eXBlLCAKKwkJCSByZXAtPnJlbG9jYXRpb25fdHlwZSwgcmVwLT5vZmZzZXQsIHJlcC0+dGFyZ2V0MSwgcmVwLT50YXJnZXQyKTsKIAkgICAgY29udGludWU7CiAJICAgIAogCSAgZGVmYXVsdDoKLQkgICAgZHByaW50Zl93YXJuKGZpeHVwLCAiV0FSTklORzogJWQ6IEFERFIgVFlQRSAlZCwgICIKKwkgICAgV0FSTihmaXh1cCwgIldBUk5JTkc6ICVkOiBBRERSIFRZUEUgJWQsICAiCiAJCQkgICJ1bmtub3duIFRZUEUgJWQsIE9GRlNFVCAlMDR4LCBUQVJHRVQgJTA0eCAlMDR4XG4iLAogCQkJICBpICsgMSwgcmVwLT5hZGRyZXNzX3R5cGUsIHJlcC0+cmVsb2NhdGlvbl90eXBlLCAKIAkJCSAgcmVwLT5vZmZzZXQsIHJlcC0+dGFyZ2V0MSwgcmVwLT50YXJnZXQyKTsKQEAgLTI4Miw3ICsyODEsNyBAQAogCSAgY2FzZSBORV9SQUREUl9MT1dCWVRFOgogICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgIHNwID0gUFRSX1NFR19PRkZfVE9fTElOKCBwU2VnLT5zZWxlY3Rvciwgb2Zmc2V0ICk7Ci0gICAgICAgICAgICAgICAgZHByaW50Zl9pbmZvKGZpeHVwLCIgICAgJTA0eDolMDR4OiUwNHggQllURSVzXG4iLAorICAgICAgICAgICAgICAgIFRSQUNFKGZpeHVwLCIgICAgJTA0eDolMDR4OiUwNHggQllURSVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlZy0+c2VsZWN0b3IsIG9mZnNldCwgKnNwLCBhZGRpdGl2ZSA/ICIgYWRkaXRpdmUiOiIiKTsKICAgICAgICAgICAgICAgICBvZmZzZXQgPSAqc3A7CiAJCWlmKGFkZGl0aXZlKQpAQCAtMjk2LDcgKzI5NSw3IEBACiAJICBjYXNlIE5FX1JBRERSX09GRlNFVDE2OgogCSAgICBkbyB7CiAgICAgICAgICAgICAgICAgc3AgPSBQVFJfU0VHX09GRl9UT19MSU4oIHBTZWctPnNlbGVjdG9yLCBvZmZzZXQgKTsKLQkJZHByaW50Zl9pbmZvKGZpeHVwLCIgICAgJTA0eDolMDR4OiUwNHggT0ZGU0VUMTYlc1xuIiwKKwkJVFJBQ0UoZml4dXAsIiAgICAlMDR4OiUwNHg6JTA0eCBPRkZTRVQxNiVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlZy0+c2VsZWN0b3IsIG9mZnNldCwgKnNwLCBhZGRpdGl2ZSA/ICIgYWRkaXRpdmUiIDogIiIgKTsKIAkJb2Zmc2V0ID0gKnNwOwogCQkqc3AgPSBMT1dPUkQoYWRkcmVzcyk7CkBAIC0zMDgsNyArMzA3LDcgQEAKIAkgIGNhc2UgTkVfUkFERFJfUE9JTlRFUjMyOgogCSAgICBkbyB7CiAgICAgICAgICAgICAgICAgc3AgPSBQVFJfU0VHX09GRl9UT19MSU4oIHBTZWctPnNlbGVjdG9yLCBvZmZzZXQgKTsKLQkJZHByaW50Zl9pbmZvKGZpeHVwLCIgICAgJTA0eDolMDR4OiUwNHggUE9JTlRFUjMyJXNcbiIsCisJCVRSQUNFKGZpeHVwLCIgICAgJTA0eDolMDR4OiUwNHggUE9JTlRFUjMyJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2VnLT5zZWxlY3Rvciwgb2Zmc2V0LCAqc3AsIGFkZGl0aXZlID8gIiBhZGRpdGl2ZSIgOiAiIiApOwogCQlvZmZzZXQgPSAqc3A7CiAJCSpzcCAgICA9IExPV09SRChhZGRyZXNzKTsKQEAgLTMyMSw3ICszMjAsNyBAQAogCSAgY2FzZSBORV9SQUREUl9TRUxFQ1RPUjoKIAkgICAgZG8gewogICAgICAgICAgICAgICAgIHNwID0gUFRSX1NFR19PRkZfVE9fTElOKCBwU2VnLT5zZWxlY3Rvciwgb2Zmc2V0ICk7Ci0JCWRwcmludGZfaW5mbyhmaXh1cCwiICAgICUwNHg6JTA0eDolMDR4IFNFTEVDVE9SJXNcbiIsCisJCVRSQUNFKGZpeHVwLCIgICAgJTA0eDolMDR4OiUwNHggU0VMRUNUT1Ilc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZWctPnNlbGVjdG9yLCBvZmZzZXQsICpzcCwgYWRkaXRpdmUgPyAiIGFkZGl0aXZlIiA6ICIiICk7CiAJCW9mZnNldCA9ICpzcDsKIAkJKnNwICAgID0gSElXT1JEKGFkZHJlc3MpOwpAQCAtMzM0LDEwICszMzMsMTAgQEAKIAkgICAgYnJlYWs7CiAJICAgIAogCSAgZGVmYXVsdDoKLQkgICAgZHByaW50Zl93YXJuKGZpeHVwLCAiV0FSTklORzogJWQ6IHVua25vd24gQUREUiBUWVBFICVkLCAgIgotCQkJICAiVFlQRSAlZCwgIE9GRlNFVCAlMDR4LCAgVEFSR0VUICUwNHggJTA0eFxuIiwKLQkJICAgaSArIDEsIHJlcC0+YWRkcmVzc190eXBlLCByZXAtPnJlbG9jYXRpb25fdHlwZSwgCi0JCSAgIHJlcC0+b2Zmc2V0LCByZXAtPnRhcmdldDEsIHJlcC0+dGFyZ2V0Mik7CisJICAgIFdBUk4oZml4dXAsICJXQVJOSU5HOiAlZDogdW5rbm93biBBRERSIFRZUEUgJWQsICAiCisJCQkgIlRZUEUgJWQsICBPRkZTRVQgJTA0eCwgIFRBUkdFVCAlMDR4ICUwNHhcbiIsCisJCQkgaSArIDEsIHJlcC0+YWRkcmVzc190eXBlLCByZXAtPnJlbG9jYXRpb25fdHlwZSwgCisJCQkgcmVwLT5vZmZzZXQsIHJlcC0+dGFyZ2V0MSwgcmVwLT50YXJnZXQyKTsKIAkgICAgZnJlZShyZWxvY19lbnRyaWVzKTsKIAkgICAgcmV0dXJuIEZBTFNFOwogCX0KQEAgLTM2Nyw5ICszNjYsOSBAQAogICAgICAgICBEV09SRCBvbGRzdGFjazsKICAgICAgICAgV09SRCBzYXZlZF9kZ3JvdXAgPSBwU2VnVGFibGVbcE1vZHVsZS0+ZGdyb3VwIC0gMV0uc2VsZWN0b3I7CiAKLSAgICAgICAgZHByaW50Zl9pbmZvKG1vZHVsZSwgIk5FX0xvYWRBbGxTZWdtZW50czogJS4qcyBpcyBhIHNlbGYtbG9hZGluZyBtb2R1bGUhXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAqKChCWVRFKilwTW9kdWxlICsgcE1vZHVsZS0+bmFtZV90YWJsZSksCi0gICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopcE1vZHVsZSArIHBNb2R1bGUtPm5hbWVfdGFibGUgKyAxKTsKKyAgICAgICAgVFJBQ0UobW9kdWxlLCAiJS4qcyBpcyBhIHNlbGYtbG9hZGluZyBtb2R1bGUhXG4iLAorCQkgICAgICooKEJZVEUqKXBNb2R1bGUgKyBwTW9kdWxlLT5uYW1lX3RhYmxlKSwKKwkJICAgICAoY2hhciAqKXBNb2R1bGUgKyBwTW9kdWxlLT5uYW1lX3RhYmxlICsgMSk7CiAgICAgICAgIGlmICghTkVfTG9hZFNlZ21lbnQoIHBNb2R1bGUsIDEgKSkgcmV0dXJuIEZBTFNFOwogICAgICAgICBzZWxmbG9hZGhlYWRlciA9IChTRUxGTE9BREhFQURFUiAqKQogICAgICAgICAgICAgICAgICAgICAgICAgICBQVFJfU0VHX09GRl9UT19MSU4ocFNlZ1RhYmxlLT5zZWxlY3RvciwgMCk7CkBAIC00MjQsNyArNDIzLDcgQEAKICAgICAgICAgQllURSAqcHN0ciA9IChCWVRFICopcE1vZHVsZSArIHBNb2R1bGUtPmltcG9ydF90YWJsZSArICpwTW9kUmVmOwogICAgICAgICBtZW1jcHkoIGJ1ZmZlciwgcHN0ciArIDEsICpwc3RyICk7CiAgICAgICAgIHN0cmNweSggYnVmZmVyICsgKnBzdHIsICIuZGxsIiApOwotICAgICAgICBkcHJpbnRmX2luZm8obW9kdWxlLCAiTG9hZGluZyAnJXMnXG4iLCBidWZmZXIgKTsKKyAgICAgICAgVFJBQ0UobW9kdWxlLCAiTG9hZGluZyAnJXMnXG4iLCBidWZmZXIgKTsKICAgICAgICAgaWYgKCEoKnBNb2RSZWYgPSBNT0RVTEVfRmluZE1vZHVsZSggYnVmZmVyICkpKQogICAgICAgICB7CiAgICAgICAgICAgICAvKiBJZiB0aGUgRExMIGlzIG5vdCBsb2FkZWQgeWV0LCBsb2FkIGl0IGFuZCBzdG9yZSAqLwpAQCAtNDgyLDcgKzQ4MSw3IEBACiAgICAgaWYgKHBNb2R1bGUtPmZsYWdzICYgTkVfRkZMQUdTX1NJTkdMRURBVEEpCiAgICAgICAgIGRncm91cCA9IHBTZWdUYWJsZVtwTW9kdWxlLT5kZ3JvdXAtMV0uc2VsZWN0b3I7CiAKLSAgICBkcHJpbnRmX2luZm8obW9kdWxlLCAiTU9EVUxFX0ZpeHVwUHJvbG9ncyglMDR4KVxuIiwgcE1vZHVsZS0+c2VsZiApOworICAgIFRSQUNFKG1vZHVsZSwgIiglMDR4KVxuIiwgcE1vZHVsZS0+c2VsZiApOwogICAgIHAgPSAoQllURSAqKXBNb2R1bGUgKyBwTW9kdWxlLT5lbnRyeV90YWJsZTsKICAgICB3aGlsZSAoKnApCiAgICAgewpAQCAtNTE3LDcgKzUxNiw3IEBACiAJCWZpeHVwX3B0ciA9IChjaGFyICopR0VUX1NFTF9CQVNFKHBTZWdUYWJsZVtzZWwtMV0uc2VsZWN0b3IpICsgCiAJCSAgKihXT1JEICopKHAgKyAxKTsKIAkgICAgfQotCSAgICBkcHJpbnRmX2luZm8obW9kdWxlLCAiJXMgU2lnbmF0dXJlOiAlMDJ4ICUwMnggJTAyeCxmZiAleFxuIiwKKwkgICAgVFJBQ0UobW9kdWxlLCAiJXMgU2lnbmF0dXJlOiAlMDJ4ICUwMnggJTAyeCxmZiAleFxuIiwKIAkJCSAgICBkYmdfc3RyKG1vZHVsZSksIGZpeHVwX3B0clswXSwgZml4dXBfcHRyWzFdLCAKIAkJCSAgICBmaXh1cF9wdHJbMl0sIHBNb2R1bGUtPmZsYWdzICk7CiAgICAgICAgICAgICBpZiAoKnAgJiAweDAwMDEpCkBAIC01NDksMTEgKzU0OCwxMSBAQAogCQkJfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLQkJICAgIGRwcmludGZfd2FybihmaXh1cCwgIlVua25vd24gc2lnbmF0dXJlXG4iICk7CisJCSAgICBXQVJOKGZpeHVwLCAiVW5rbm93biBzaWduYXR1cmVcbiIgKTsKIAkJfQogICAgICAgICAgICAgfQogCSAgICBlbHNlCi0JICAgICAgZHByaW50Zl9pbmZvKG1vZHVsZSwiXG4iKTsKKwkgICAgICBUUkFDRShtb2R1bGUsIlxuIik7CiAgICAgICAgICAgICBwICs9IChzZWwgPT0gMHhmZikgPyA2IDogMzsgIAogICAgICAgICB9CiAgICAgfQpAQCAtNjM1LDcgKzYzNCw3IEBACiAKIAogICAgIHBNb2R1bGUtPmNzID0gMDsgIC8qIERvbid0IGluaXRpYWxpemUgaXQgdHdpY2UgKi8KLSAgICBkcHJpbnRmX2luZm8oZGxsLCAiQ2FsbGluZyBMaWJNYWluLCBjczppcD0lMDRseDolMDR4IGRzPSUwNGx4IGRpPSUwNHggY3g9JTA0eFxuIiwgCisgICAgVFJBQ0UoZGxsLCAiQ2FsbGluZyBMaWJNYWluLCBjczppcD0lMDRseDolMDR4IGRzPSUwNGx4IGRpPSUwNHggY3g9JTA0eFxuIiwgCiAgICAgICAgICAgICAgICAgIENTX3JlZygmY29udGV4dCksIElQX3JlZygmY29udGV4dCksIERTX3JlZygmY29udGV4dCksCiAgICAgICAgICAgICAgICAgIERJX3JlZygmY29udGV4dCksIENYX3JlZygmY29udGV4dCkgKTsKICAgICBDYWxsYmFja3MtPkNhbGxSZWdpc3RlclNob3J0UHJvYyggJmNvbnRleHQsIDAgKTsKZGlmZiAtLWdpdCBhL2xvYWRlci9uZV9yZXNvdXJjZS5jIGIvbG9hZGVyL25lX3Jlc291cmNlLmMKaW5kZXggYjA5MTQxMS4uMDA1ZjgyOCAxMDA2NDQKLS0tIGEvbG9hZGVyL25lX3Jlc291cmNlLmMKKysrIGIvbG9hZGVyL25lX3Jlc291cmNlLmMKQEAgLTQ2LDEzICs0NiwxMyBAQAogCXBOYW1lSW5mbyA9IChORV9OQU1FSU5GTyAqKShwVHlwZUluZm8gKyAxKTsKIAlmb3IgKGNvdW50ID0gcFR5cGVJbmZvLT5jb3VudDsgY291bnQgPiAwOyBjb3VudC0tLCBwTmFtZUluZm8rKykKIAl7Ci0gICAgICAgICAgICBkcHJpbnRmX2luZm8ocmVzb3VyY2UsICJOYW1lVGFibGUgZW50cnk6IHR5cGU9JTA0eCBpZD0lMDR4XG4iLAorICAgICAgICAgICAgVFJBQ0UocmVzb3VyY2UsICJOYW1lVGFibGUgZW50cnk6IHR5cGU9JTA0eCBpZD0lMDR4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFR5cGVJbmZvLT50eXBlX2lkLCBwTmFtZUluZm8tPmlkICk7CiAgICAgICAgICAgICBoYW5kbGUgPSBMb2FkUmVzb3VyY2UxNiggcE1vZHVsZS0+c2VsZiwgCiAJCQkJICAgKEhSU1JDMTYpKChpbnQpcE5hbWVJbmZvIC0gKGludClwTW9kdWxlKSApOwogICAgICAgICAgICAgZm9yKHAgPSAoV09SRCopTG9ja1Jlc291cmNlMTYoaGFuZGxlKTsgcCAmJiAqcDsgcCA9IChXT1JEICopKChjaGFyKilwKypwKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkcHJpbnRmX2luZm8ocmVzb3VyY2UsIiAgdHlwZT0lMDR4ICclcycgaWQ9JTA0eCAnJXMnXG4iLAorICAgICAgICAgICAgICAgIFRSQUNFKHJlc291cmNlLCIgIHR5cGU9JTA0eCAnJXMnIGlkPSUwNHggJyVzJ1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwWzFdLCAoY2hhciAqKShwKzMpLCBwWzJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopKHArMykrc3RybGVuKChjaGFyICopKHArMykpKzEgKTsKICAgICAgICAgICAgICAgICAvKiBDaGVjayBmb3IgY29ycmVjdCB0eXBlICovCkBAIC04MCw3ICs4MCw3IEBACiAKICAgICAgICAgICAgICAgICAvKiBJZiB3ZSBnZXQgaGVyZSwgd2UndmUgZm91bmQgdGhlIGVudHJ5ICovCiAKLSAgICAgICAgICAgICAgICBkcHJpbnRmX2luZm8ocmVzb3VyY2UsICIgIEZvdW5kIVxuIiApOworICAgICAgICAgICAgICAgIFRSQUNFKHJlc291cmNlLCAiICBGb3VuZCFcbiIgKTsKICAgICAgICAgICAgICAgICByZXQgPSBNQUtFTE9ORyggcFsxXSwgcFsyXSApOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMTEyLDExICsxMTIsMTEgQEAKIAkJQllURSAqcCA9IChCWVRFKilwTW9kdWxlICsgcE1vZHVsZS0+cmVzX3RhYmxlICsgcFR5cGVJbmZvLT50eXBlX2lkOwogCQlpZiAoKCpwID09IGxlbikgJiYgIWxzdHJuY21waTMyQSggcCsxLCBzdHIsIGxlbiApKQogCQl7Ci0JCSAgICBkcHJpbnRmX2luZm8ocmVzb3VyY2UsICIgIEZvdW5kIHR5cGUgJyVzJ1xuIiwgc3RyICk7CisJCSAgICBUUkFDRShyZXNvdXJjZSwgIiAgRm91bmQgdHlwZSAnJXMnXG4iLCBzdHIgKTsKIAkJICAgIHJldHVybiBwVHlwZUluZm87CiAJCX0KIAkgICAgfQotCSAgICBkcHJpbnRmX2luZm8ocmVzb3VyY2UsICIgIFNraXBwaW5nIHR5cGUgJTA0eFxuIiwgcFR5cGVJbmZvLT50eXBlX2lkICk7CisJICAgIFRSQUNFKHJlc291cmNlLCAiICBTa2lwcGluZyB0eXBlICUwNHhcbiIsIHBUeXBlSW5mby0+dHlwZV9pZCApOwogCSAgICBwVHlwZUluZm8gPSBORVhUX1RZUEVJTkZPKHBUeXBlSW5mbyk7CiAJfQogICAgIH0KQEAgLTEyNywxMCArMTI3LDEwIEBACiAJewogICAgICAgICAgICAgaWYgKHBUeXBlSW5mby0+dHlwZV9pZCA9PSBpZCkKIAkgICAgewotCQlkcHJpbnRmX2luZm8ocmVzb3VyY2UsICIgIEZvdW5kIHR5cGUgJTA0eFxuIiwgaWQgKTsKKwkJVFJBQ0UocmVzb3VyY2UsICIgIEZvdW5kIHR5cGUgJTA0eFxuIiwgaWQgKTsKIAkJcmV0dXJuIHBUeXBlSW5mbzsKIAkgICAgfQotCSAgICBkcHJpbnRmX2luZm8ocmVzb3VyY2UsICIgIFNraXBwaW5nIHR5cGUgJTA0eFxuIiwgcFR5cGVJbmZvLT50eXBlX2lkICk7CisJICAgIFRSQUNFKHJlc291cmNlLCAiICBTa2lwcGluZyB0eXBlICUwNHhcbiIsIHBUeXBlSW5mby0+dHlwZV9pZCApOwogCSAgICBwVHlwZUluZm8gPSBORVhUX1RZUEVJTkZPKHBUeXBlSW5mbyk7CiAJfQogICAgIH0KQEAgLTE4OCw5ICsxODgsOSBAQAogCVdPUkQgc2l6ZVNoaWZ0ID0gKihXT1JEICopKChjaGFyICopcE1vZHVsZSArIHBNb2R1bGUtPnJlc190YWJsZSk7CiAJTkVfTkFNRUlORk8qIHBOYW1lSW5mbyA9IChORV9OQU1FSU5GTyopKChjaGFyKilwTW9kdWxlICsgaFJzcmMpOwogCi0gICAgICAgIGRwcmludGZfaW5mbyhyZXNvdXJjZSwgIk5FUmVzb3VyY2VIYW5kbGVyOiBsb2FkaW5nLCBwb3M9JWQsIGxlbj0lZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KXBOYW1lSW5mby0+b2Zmc2V0IDw8IHNpemVTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KXBOYW1lSW5mby0+bGVuZ3RoIDw8IHNpemVTaGlmdCApOworICAgICAgICBUUkFDRShyZXNvdXJjZSwgImxvYWRpbmcsIHBvcz0lZCwgbGVuPSVkXG4iLAorCQkgICAgIChpbnQpcE5hbWVJbmZvLT5vZmZzZXQgPDwgc2l6ZVNoaWZ0LAorCQkgICAgIChpbnQpcE5hbWVJbmZvLT5sZW5ndGggPDwgc2l6ZVNoaWZ0ICk7CiAJaWYoIGhNZW1PYmogKQogCSAgICBoYW5kbGUgPSBHbG9iYWxSZUFsbG9jMTYoIGhNZW1PYmosIHBOYW1lSW5mby0+bGVuZ3RoIDw8IHNpemVTaGlmdCwgMCApOwogCWVsc2UKQEAgLTIxNiw3ICsyMTYsNyBAQAogICAgIE5FX01PRFVMRSAqcE1vZHVsZSA9IE1PRFVMRV9HZXRQdHIoIGhNb2R1bGUgKTsKICAgICBORV9UWVBFSU5GTyAqcFR5cGVJbmZvID0gKE5FX1RZUEVJTkZPICopKChjaGFyICopcE1vZHVsZSArIHBNb2R1bGUtPnJlc190YWJsZSArIDIpOwogCi0gICAgZHByaW50Zl9pbmZvKHJlc291cmNlLCJJbml0UmVzb3VyY2VIYW5kbGVyWyUwNHhdXG4iLCBoTW9kdWxlICk7CisgICAgVFJBQ0UocmVzb3VyY2UsIkluaXRSZXNvdXJjZUhhbmRsZXJbJTA0eF1cbiIsIGhNb2R1bGUgKTsKIAogICAgIHdoaWxlKHBUeXBlSW5mby0+dHlwZV9pZCkKICAgICB7CkBAIC0yNzksMTUgKzI3OSwxNSBAQAogCSAgICBoUnNyYyA9IE5FX0ZpbmRSZXNvdXJjZUZyb21UeXBlKHBNb2R1bGUsIHBUeXBlSW5mbywgcmVzSWQpOwogCSAgICBpZiggaFJzcmMgKQogCSAgICB7Ci0JCWRwcmludGZfaW5mbyhyZXNvdXJjZSwgIiAgICBGb3VuZCBpZCAlMDhseFxuIiwgcmVzSWQgKTsKKwkJVFJBQ0UocmVzb3VyY2UsICIgICAgRm91bmQgaWQgJTA4bHhcbiIsIHJlc0lkICk7CiAJCXJldHVybiBoUnNyYzsKIAkgICAgfQotCSAgICBkcHJpbnRmX2luZm8ocmVzb3VyY2UsICIgICAgTm90IGZvdW5kLCBnb2luZyBvblxuIiApOworCSAgICBUUkFDRShyZXNvdXJjZSwgIiAgICBOb3QgZm91bmQsIGdvaW5nIG9uXG4iICk7CiAJICAgIHBUeXBlSW5mbyA9IE5FWFRfVFlQRUlORk8ocFR5cGVJbmZvKTsKIAl9CiAgICAgfSB3aGlsZSggcFR5cGVJbmZvICk7CiAKLSAgICBkcHJpbnRmX3dhcm4ocmVzb3VyY2UsICJmYWlsZWQhXG4iKTsKKyAgICBXQVJOKHJlc291cmNlLCAiZmFpbGVkIVxuIik7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTM4OCw3ICszODgsNyBAQAogCSAgICAmJiAhKEdsb2JhbEZsYWdzMTYocE5hbWVJbmZvLT5oYW5kbGUpICYgR01FTV9ESVNDQVJERUQpKQogCXsKIAkgICAgcE5hbWVJbmZvLT51c2FnZSsrOwotCSAgICBkcHJpbnRmX2luZm8ocmVzb3VyY2UsICIgIEFscmVhZHkgbG9hZGVkLCBuZXcgY291bnQ9JWRcbiIsCisJICAgIFRSQUNFKHJlc291cmNlLCAiICBBbHJlYWR5IGxvYWRlZCwgbmV3IGNvdW50PSVkXG4iLAogCQkJICAgICAgcE5hbWVJbmZvLT51c2FnZSApOwogCX0KIAllbHNlCkBAIC00NTksOCArNDU5LDggQEAKICAgICAgICAgcFR5cGVJbmZvID0gKE5FX1RZUEVJTkZPICopcE5hbWVJbmZvOwogICAgIH0KIAotICAgIGRwcmludGZfaW5mbyhyZXNvdXJjZSwgIk5FX0ZyZWVSZXNvdXJjZVslMDR4XTogbm8gaW50cmluc2ljIHJlc291cmNlIGZvciAlMDR4XG4iLCAKLQkJCSAgICAgIGhNb2R1bGUsIGhhbmRsZSApOworICAgIFRSQUNFKHJlc291cmNlLCAiWyUwNHhdOiBubyBpbnRyaW5zaWMgcmVzb3VyY2UgZm9yICUwNHhcbiIsIAorCQkgaE1vZHVsZSwgaGFuZGxlICk7CiAgICAgR2xvYmFsRnJlZTE2KCBoYW5kbGUgKTsgLyogaXQgY291bGQgaGF2ZSBiZWVuIERpcmVjdFJlc0FsbG9jKCknZWQgKi8KICAgICByZXR1cm4gaGFuZGxlOwogfQpkaWZmIC0tZ2l0IGEvbG9hZGVyL3BlX2ltYWdlLmMgYi9sb2FkZXIvcGVfaW1hZ2UuYwppbmRleCA4NDJjN2Y3Li5lMTkyM2YxIDEwMDY0NAotLS0gYS9sb2FkZXIvcGVfaW1hZ2UuYworKysgYi9sb2FkZXIvcGVfaW1hZ2UuYwpAQCAtNzQsMjAgKzc0LDE5IEBACiAgIElNQUdFX0VYUE9SVF9ESVJFQ1RPUlkgKnBlX2V4cG9ydHMgPSAoSU1BR0VfRVhQT1JUX0RJUkVDVE9SWSopUlZBKHJ2YV9zdGFydCk7CiAKICAgTW9kdWxlID0gKGNoYXIqKVJWQShwZV9leHBvcnRzLT5OYW1lKTsKLSAgZHByaW50Zl9pbmZvKHdpbjMyLCJcbioqKioqKipFWFBPUlQgREFUQSoqKioqKipcbk1vZHVsZSBuYW1lIGlzICVzLCAlbGQgZnVuY3Rpb25zLCAlbGQgbmFtZXNcbiIsIAotCSBNb2R1bGUsCi0JIHBlX2V4cG9ydHMtPk51bWJlck9mRnVuY3Rpb25zLAotCSBwZV9leHBvcnRzLT5OdW1iZXJPZk5hbWVzKTsKKyAgVFJBQ0Uod2luMzIsIioqKioqKipFWFBPUlQgREFUQSoqKioqKipcbiIpOworICBUUkFDRSh3aW4zMiwiTW9kdWxlIG5hbWUgaXMgJXMsICVsZCBmdW5jdGlvbnMsICVsZCBuYW1lc1xuIiwgCisJICAgICAgIE1vZHVsZSwgcGVfZXhwb3J0cy0+TnVtYmVyT2ZGdW5jdGlvbnMsIHBlX2V4cG9ydHMtPk51bWJlck9mTmFtZXMpOwogCiAgIG9yZGluYWw9KHVfc2hvcnQqKSBSVkEocGVfZXhwb3J0cy0+QWRkcmVzc09mTmFtZU9yZGluYWxzKTsKICAgZnVuY3Rpb25zPWZ1bmN0aW9uPSh1X2xvbmcqKSBSVkEocGVfZXhwb3J0cy0+QWRkcmVzc09mRnVuY3Rpb25zKTsKICAgbmFtZT0odV9jaGFyKiopIFJWQShwZV9leHBvcnRzLT5BZGRyZXNzT2ZOYW1lcyk7CiAKLSAgZHByaW50Zl9pbmZvKHdpbjMyLCIgT3JkICAgIFJWQSAgICAgQWRkciAgIE5hbWVcbiIgKTsKKyAgVFJBQ0Uod2luMzIsIiBPcmQgICAgUlZBICAgICBBZGRyICAgTmFtZVxuIiApOwogICBmb3IgKGk9MDtpPHBlX2V4cG9ydHMtPk51bWJlck9mRnVuY3Rpb25zO2krKywgZnVuY3Rpb24rKykKICAgewogICAgICAgaWYgKCEqZnVuY3Rpb24pIGNvbnRpbnVlOyAgLyogTm8gc3VjaCBmdW5jdGlvbiAqLwotICAgICAgaWYgKGRlYnVnZ2luZ19pbmZvKHdpbjMyKSl7CisgICAgICBpZiAoVFJBQ0VfT04od2luMzIpKXsKIAlkYmdfZGVjbF9zdHIod2luMzIsIDEwMjQpOwogCiAJZHNwcmludGYod2luMzIsIiU0bGQgJTA4bHggJTA4eCIsCkBAIC05OCw3ICs5Nyw3IEBACiAJICAgIGRzcHJpbnRmKHdpbjMyLCAiICAlcyIsIChjaGFyKilSVkEobmFtZVtqXSkgKTsKIAlpZiAoKCpmdW5jdGlvbiA+PSBydmFfc3RhcnQpICYmICgqZnVuY3Rpb24gPD0gcnZhX2VuZCkpCiAJICBkc3ByaW50Zih3aW4zMiwgIiAoZm9yd2FyZGVkIC0+ICVzKSIsIChjaGFyICopUlZBKCpmdW5jdGlvbikpOwotCWRwcmludGZfaW5mbyh3aW4zMiwiJXNcbiIsIGRiZ19zdHIod2luMzIpKTsKKwlUUkFDRSh3aW4zMiwiJXNcbiIsIGRiZ19zdHIod2luMzIpKTsKICAgICAgIH0KICAgfQogfQpAQCAtMTM1LDkgKzEzNCw5IEBACiAJZXhwb3J0cyAgID0gcGVtLT5wZV9leHBvcnQ7CiAKIAlpZiAoSElXT1JEKGZ1bmNOYW1lKSkKLQkJZHByaW50Zl9pbmZvKHdpbjMyLCJQRV9GaW5kRXhwb3J0ZWRGdW5jdGlvbiglcylcbiIsZnVuY05hbWUpOworCQlUUkFDRSh3aW4zMiwiKCVzKVxuIixmdW5jTmFtZSk7CiAJZWxzZQotCQlkcHJpbnRmX2luZm8od2luMzIsIlBFX0ZpbmRFeHBvcnRlZEZ1bmN0aW9uKCVkKVxuIiwoaW50KWZ1bmNOYW1lKTsKKwkJVFJBQ0Uod2luMzIsIiglZClcbiIsKGludClmdW5jTmFtZSk7CiAJaWYgKCFleHBvcnRzKSB7CiAJCWZwcmludGYoc3RkZXJyLCJNb2R1bGUgJTA4eC9NT0RSRUYgJXAgZG9lc24ndCBoYXZlIGEgZXhwb3J0cyB0YWJsZS5cbiIsaE1vZHVsZSxwZW0pOwogCQlyZXR1cm4gTlVMTDsKQEAgLTE2OCw3ICsxNjcsNyBAQAogCQl9CiAJfSBlbHNlIHsKIAkJaWYgKExPV09SRChmdW5jTmFtZSktZXhwb3J0cy0+QmFzZSA+IGV4cG9ydHMtPk51bWJlck9mRnVuY3Rpb25zKSB7Ci0JCQlkcHJpbnRmX2luZm8od2luMzIsIglvcmRpbmFsICVkIG91dCBvZiByYW5nZSFcbiIsCisJCQlUUkFDRSh3aW4zMiwiCW9yZGluYWwgJWQgb3V0IG9mIHJhbmdlIVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9XT1JEKGZ1bmNOYW1lKSk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQpAQCAtMTkyLDcgKzE5MSw3IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLURXT1JEIGZpeHVwX2ltcG9ydHMgKFBEQjMyICpwcm9jZXNzLFBFX01PRFJFRiAqcGVtLEhNT0RVTEUzMiBoTW9kdWxlKQorRFdPUkQgZml4dXBfaW1wb3J0cyAoUERCMzIgKnByb2Nlc3MsUEVfTU9EUkVGICpwZW0pCiB7CiAgICAgSU1BR0VfSU1QT1JUX0RFU0NSSVBUT1IJKnBlX2ltcDsKICAgICBpbnQJZml4dXBfZmFpbGVkCQk9IDA7CkBAIC0yMDYsMTIgKzIwNSwxMiBAQAogICAgICAgICBtb2RuYW1lID0gIjx1bmtub3duPiI7CiAKICAgICAvKiBPSywgbm93IGR1bXAgdGhlIGltcG9ydCBsaXN0ICovCi0gICAgZHByaW50Zl9pbmZvKHdpbjMyLCAiXG5EdW1waW5nIGltcG9ydHMgbGlzdFxuIik7CisgICAgVFJBQ0Uod2luMzIsICJEdW1waW5nIGltcG9ydHMgbGlzdFxuIik7CiAKICAgICAvKiBmaXJzdCwgY291bnQgdGhlIG51bWJlciBvZiBpbXBvcnRlZCBub24taW50ZXJuYWwgbW9kdWxlcyAqLwogICAgIHBlX2ltcCA9IHBlbS0+cGVfaW1wb3J0OwogICAgIGlmICghcGVfaW1wKSAKLSAgICAJZnByaW50ZihzdGRlcnIsIm5vIGltcG9ydCBkaXJlY3Rvcnk/Pz8/XG4iKTsKKyAgICAJRVJSKHdpbjMyLCAibm8gaW1wb3J0IGRpcmVjdG9yeT8/Pz9cbiIpOwogCiAgICAgLyogRklYTUU6IHNob3VsZCB0ZXJtaW5hdGUgb24gMCBDaGFyYWN0ZXJpc3RpY3MgKi8KICAgICBmb3IgKGkgPSAwOyBwZV9pbXAtPk5hbWU7IHBlX2ltcCsrKQpAQCAtMjMyLDE0ICsyMzEsMTggQEAKIAkvKiBkb24ndCB1c2UgTU9EVUxFX0xvYWQsIFdpbjMyIGNyZWF0ZXMgbmV3IHRhc2sgZGlmZmVyZW50bHkgKi8KIAlyZXMgPSBQRV9Mb2FkTGlicmFyeUV4MzJBKCBuYW1lLCBwcm9jZXNzLCAwLCAwICk7CiAJaWYgKHJlcyA8PSAoSE1PRFVMRTMyKSAzMikgewotCSAgICBjaGFyICpwLCBidWZmZXJbMTAyNF07CisJICAgIGNoYXIgYnVmZmVyWzEwMjRdOwogCiAJICAgIC8qIFRyeSB3aXRoIHByZXBlbmRpbmcgdGhlIHBhdGggb2YgdGhlIGN1cnJlbnQgbW9kdWxlICovCi0JICAgIEdldE1vZHVsZUZpbGVOYW1lMzJBKCBoTW9kdWxlLCBidWZmZXIsIHNpemVvZiAoYnVmZmVyKSk7Ci0JICAgIGlmICghKHAgPSBzdHJyY2hyIChidWZmZXIsICdcXCcpKSkKLQkJcCA9IGJ1ZmZlcjsKLQkgICAgc3RyY3B5IChwICsgMSwgbmFtZSk7Ci0JICAgIHJlcyA9IFBFX0xvYWRMaWJyYXJ5RXgzMkEoIGJ1ZmZlciwgcHJvY2VzcywgMCwgMCApOworCSAgICBpZiAoR2V0TW9kdWxlRmlsZU5hbWUzMkEoIHBlbS0+bW9kdWxlLCBidWZmZXIsIHNpemVvZiAoYnVmZmVyKSkpIHsKKwkgICAgICAgIGNoYXIgKnA7CisKKwkJaWYgKCEocCA9IHN0cnJjaHIgKGJ1ZmZlciwgJ1xcJykpKQorCQkgICAgcCA9IGJ1ZmZlcjsKKwkJc3RyY3B5IChwICsgMSwgbmFtZSk7CisJCXJlcyA9IFBFX0xvYWRMaWJyYXJ5RXgzMkEoIGJ1ZmZlciwgcHJvY2VzcywgMCwgMCApOworCSAgICB9IGVsc2UKKwkgICAgCUVSUih3aW4zMiwiY2Fubm90IGZpbmQgdGhlIG1vZHVsZSBqdXN0IGxvYWRlZCFcbiIpOwogCX0KIAlpZiAocmVzIDw9IChITU9EVUxFMzIpIDMyKSB7CiAJICAgIGZwcmludGYgKHN0ZGVyciwgIk1vZHVsZSAlcyBub3QgZm91bmRcbiIsIG5hbWUpOwpAQCAtMjg1LDEyICsyODgsMTIgQEAKIAogCU1vZHVsZSA9IChjaGFyICopIFJWQShwZV9pbXAtPk5hbWUpOwogICAgICAgICBoSW1wTW9kdWxlID0gTU9EVUxFX0hBTkRMRXRvSE1PRFVMRTMyKCBNT0RVTEVfRmluZE1vZHVsZShNb2R1bGUpICk7Ci0JZHByaW50Zl9pbmZvKHdpbjMyLCAiJXNcbiIsIE1vZHVsZSk7CisJVFJBQ0Uod2luMzIsICIlc1xuIiwgTW9kdWxlKTsKIAogCS8qIEZJWE1FOiBmb3J3YXJkZXIgZW50cmllcyAuLi4gKi8KIAogCWlmIChwZV9pbXAtPnUuT3JpZ2luYWxGaXJzdFRodW5rICE9IDApIHsgLyogb3JpZ2luYWwgTVMgc3R5bGUgKi8KLQkgICAgZHByaW50Zl9pbmZvKHdpbjMyLCAiTWljcm9zb2Z0IHN0eWxlIGltcG9ydHMgdXNlZFxuIik7CisJICAgIFRSQUNFKHdpbjMyLCAiTWljcm9zb2Z0IHN0eWxlIGltcG9ydHMgdXNlZFxuIik7CiAJICAgIGltcG9ydF9saXN0ID0oTFBJTUFHRV9USFVOS19EQVRBKSBSVkEocGVfaW1wLT51Lk9yaWdpbmFsRmlyc3RUaHVuayk7CiAJICAgIHRodW5rX2xpc3QgPSAoTFBJTUFHRV9USFVOS19EQVRBKSBSVkEocGVfaW1wLT5GaXJzdFRodW5rKTsKIApAQCAtMjk4LDcgKzMwMSw3IEBACiAJCWlmIChJTUFHRV9TTkFQX0JZX09SRElOQUwoaW1wb3J0X2xpc3QtPnUxLk9yZGluYWwpKSB7CiAJCSAgICBpbnQgb3JkaW5hbCA9IElNQUdFX09SRElOQUwoaW1wb3J0X2xpc3QtPnUxLk9yZGluYWwpOwogCi0JCSAgICBkcHJpbnRmX2luZm8od2luMzIsICItLS0gT3JkaW5hbCAlcywlZFxuIiwgTW9kdWxlLCBvcmRpbmFsKTsKKwkJICAgIFRSQUNFKHdpbjMyLCAiLS0tIE9yZGluYWwgJXMsJWRcbiIsIE1vZHVsZSwgb3JkaW5hbCk7CiAJCSAgICB0aHVua19saXN0LT51MS5GdW5jdGlvbj0oTFBEV09SRClQRV9GaW5kRXhwb3J0ZWRGdW5jdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MsIGhJbXBNb2R1bGUsIChMUENTVFIpb3JkaW5hbCk7CiAJCSAgICBpZiAoIXRodW5rX2xpc3QtPnUxLkZ1bmN0aW9uKSB7CkBAIC0zMDgsNyArMzExLDcgQEAKIAkJICAgIH0KIAkJfSBlbHNlIHsJCS8qIGltcG9ydCBieSBuYW1lICovCiAJCSAgICBwZV9uYW1lID0gKExQSU1BR0VfSU1QT1JUX0JZX05BTUUpUlZBKGltcG9ydF9saXN0LT51MS5BZGRyZXNzT2ZEYXRhKTsKLQkJICAgIGRwcmludGZfaW5mbyh3aW4zMiwgIi0tLSAlcyAlcy4lZFxuIiwgcGVfbmFtZS0+TmFtZSwgTW9kdWxlLCBwZV9uYW1lLT5IaW50KTsKKwkJICAgIFRSQUNFKHdpbjMyLCAiLS0tICVzICVzLiVkXG4iLCBwZV9uYW1lLT5OYW1lLCBNb2R1bGUsIHBlX25hbWUtPkhpbnQpOwogCQkgICAgdGh1bmtfbGlzdC0+dTEuRnVuY3Rpb249KExQRFdPUkQpUEVfRmluZEV4cG9ydGVkRnVuY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLCBoSW1wTW9kdWxlLCBwZV9uYW1lLT5OYW1lKTsKIAkJICAgIGlmICghdGh1bmtfbGlzdC0+dTEuRnVuY3Rpb24pIHsKQEAgLTMyMSwxNCArMzI0LDE0IEBACiAJCXRodW5rX2xpc3QrKzsKIAkgICAgfQogCX0gZWxzZSB7CS8qIEJvcmxhbmQgc3R5bGUgKi8KLQkgICAgZHByaW50Zl9pbmZvKHdpbjMyLCAiQm9ybGFuZCBzdHlsZSBpbXBvcnRzIHVzZWRcbiIpOworCSAgICBUUkFDRSh3aW4zMiwgIkJvcmxhbmQgc3R5bGUgaW1wb3J0cyB1c2VkXG4iKTsKIAkgICAgdGh1bmtfbGlzdCA9IChMUElNQUdFX1RIVU5LX0RBVEEpIFJWQShwZV9pbXAtPkZpcnN0VGh1bmspOwogCSAgICB3aGlsZSAodGh1bmtfbGlzdC0+dTEuT3JkaW5hbCkgewogCQlpZiAoSU1BR0VfU05BUF9CWV9PUkRJTkFMKHRodW5rX2xpc3QtPnUxLk9yZGluYWwpKSB7CiAJCSAgICAvKiBub3Qgc3VyZSBhYm91dCB0aGlzIGJyYW5jaCwgYnV0IGl0IHNlZW1zIHRvIHdvcmsgKi8KIAkJICAgIGludCBvcmRpbmFsID0gSU1BR0VfT1JESU5BTCh0aHVua19saXN0LT51MS5PcmRpbmFsKTsKIAotCQkgICAgZHByaW50Zl9pbmZvKHdpbjMyLCItLS0gT3JkaW5hbCAlcy4lZFxuIixNb2R1bGUsb3JkaW5hbCk7CisJCSAgICBUUkFDRSh3aW4zMiwiLS0tIE9yZGluYWwgJXMuJWRcbiIsTW9kdWxlLG9yZGluYWwpOwogCQkgICAgdGh1bmtfbGlzdC0+dTEuRnVuY3Rpb249KExQRFdPUkQpUEVfRmluZEV4cG9ydGVkRnVuY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLCBoSW1wTW9kdWxlLCAoTFBDU1RSKSBvcmRpbmFsKTsKIAkJICAgIGlmICghdGh1bmtfbGlzdC0+dTEuRnVuY3Rpb24pIHsKQEAgLTMzOCw3ICszNDEsNyBAQAogCQkgICAgfQogCQl9IGVsc2UgewogCQkgICAgcGVfbmFtZT0oTFBJTUFHRV9JTVBPUlRfQllfTkFNRSkgUlZBKHRodW5rX2xpc3QtPnUxLkFkZHJlc3NPZkRhdGEpOwotCQkgICAgZHByaW50Zl9pbmZvKHdpbjMyLCItLS0gJXMgJXMuJWRcbiIsCisJCSAgICBUUkFDRSh3aW4zMiwiLS0tICVzICVzLiVkXG4iLAogCQkgICAJCSAgcGVfbmFtZS0+TmFtZSxNb2R1bGUscGVfbmFtZS0+SGludCk7CiAJCSAgICB0aHVua19saXN0LT51MS5GdW5jdGlvbj0oTFBEV09SRClQRV9GaW5kRXhwb3J0ZWRGdW5jdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MsIGhJbXBNb2R1bGUsIHBlX25hbWUtPk5hbWUgKTsKQEAgLTM2MiwxMSArMzY1LDExIEBACiAgICAgaW50IGksdm1hX3NpemUgPSAwOwogICAgIElNQUdFX1NFQ1RJT05fSEVBREVSICpwZV9zZWcgPSBQRV9TRUNUSU9OUyhoTW9kdWxlKTsKIAotICAgIGRwcmludGZfaW5mbyh3aW4zMiwgIkR1bXAgb2Ygc2VnbWVudCB0YWJsZVxuIik7Ci0gICAgZHByaW50Zl9pbmZvKHdpbjMyLCAiICAgTmFtZSAgICBWU3ogIFZhZGRyICAgICBTelJhdyAgIEZpbGVhZHIgICpSZWxvYyAqTGluZXVtICNSZWxvYyAjTGludW0gQ2hhclxuIik7CisgICAgVFJBQ0Uod2luMzIsICJEdW1wIG9mIHNlZ21lbnQgdGFibGVcbiIpOworICAgIFRSQUNFKHdpbjMyLCAiICAgTmFtZSAgICBWU3ogIFZhZGRyICAgICBTelJhdyAgIEZpbGVhZHIgICpSZWxvYyAqTGluZXVtICNSZWxvYyAjTGludW0gQ2hhclxuIik7CiAgICAgZm9yIChpID0gMDsgaTwgUEVfSEVBREVSKGhNb2R1bGUpLT5GaWxlSGVhZGVyLk51bWJlck9mU2VjdGlvbnM7IGkrKykKICAgICB7Ci0gICAgICAgIGRwcmludGZfaW5mbyh3aW4zMiwgIiU4czogJTQuNGx4ICU4LjhseCAlOC44bHggJTguOGx4ICU4LjhseCAlOC44bHggJTQuNHggJTQuNHggJTguOGx4XG4iLCAKKyAgICAgICAgVFJBQ0Uod2luMzIsICIlOHM6ICU0LjRseCAlOC44bHggJTguOGx4ICU4LjhseCAlOC44bHggJTguOGx4ICU0LjR4ICU0LjR4ICU4LjhseFxuIiwgCiAgICAgICAgICAgICAgICAgICAgICAgcGVfc2VnLT5OYW1lLCAKICAgICAgICAgICAgICAgICAgICAgICBwZV9zZWctPk1pc2MuVmlydHVhbFNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgcGVfc2VnLT5WaXJ0dWFsQWRkcmVzcywKQEAgLTQwMSwxNCArNDA0LDE0IEBACiAJCWNoYXIgKnBhZ2UgPSAoY2hhciopIFJWQShyLT5WaXJ0dWFsQWRkcmVzcyk7CiAJCWludCBjb3VudCA9IChyLT5TaXplT2ZCbG9jayAtIDgpLzI7CiAJCWludCBpOwotCQlkcHJpbnRmX2luZm8oZml4dXAsICIleCByZWxvY2F0aW9ucyBmb3IgcGFnZSAlbHhcbiIsCisJCVRSQUNFKGZpeHVwLCAiJXggcmVsb2NhdGlvbnMgZm9yIHBhZ2UgJWx4XG4iLAogCQkJY291bnQsIHItPlZpcnR1YWxBZGRyZXNzKTsKIAkJLyogcGF0Y2hpbmcgaW4gcmV2ZXJzZSBvcmRlciAqLwogCQlmb3IoaT0wO2k8Y291bnQ7aSsrKQogCQl7CiAJCQlpbnQgb2Zmc2V0ID0gci0+VHlwZU9mZnNldFtpXSAmIDB4RkZGOwogCQkJaW50IHR5cGUgPSByLT5UeXBlT2Zmc2V0W2ldID4+IDEyOwotCQkJZHByaW50Zl9pbmZvKGZpeHVwLCJwYXRjaGluZyAleCB0eXBlICV4XG4iLCBvZmZzZXQsIHR5cGUpOworCQkJVFJBQ0UoZml4dXAsInBhdGNoaW5nICV4IHR5cGUgJXhcbiIsIG9mZnNldCwgdHlwZSk7CiAJCQlzd2l0Y2godHlwZSkKIAkJCXsKIAkJCWNhc2UgSU1BR0VfUkVMX0JBU0VEX0FCU09MVVRFOiBicmVhazsKQEAgLTU0NSw3ICs1NDgsNyBAQAogCiAJbG9hZF9hZGRyID0gbnRfaGVhZGVyLT5PcHRpb25hbEhlYWRlci5JbWFnZUJhc2U7CiAJdm1hX3NpemUgPSBjYWxjX3ZtYV9zaXplKCBoTW9kdWxlICk7Ci0JZHByaW50Zl9pbmZvKHdpbjMyLCAiTG9hZCBhZGRyIGlzICVseFxuIixsb2FkX2FkZHIpOworCVRSQUNFKHdpbjMyLCAiTG9hZCBhZGRyIGlzICVseFxuIixsb2FkX2FkZHIpOwogCWxvYWRfYWRkciA9IChEV09SRClWaXJ0dWFsQWxsb2MoICh2b2lkKilsb2FkX2FkZHIsIHZtYV9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRU1fUkVTRVJWRSB8IE1FTV9DT01NSVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0VfRVhFQ1VURV9SRUFEV1JJVEUgKTsKQEAgLTU1OSw3ICs1NjIsNyBAQAogCSAqLwogCXBlbS0+bW9kdWxlID0gKnBoTW9kdWxlID0gKEhNT0RVTEUzMilsb2FkX2FkZHI7CiAKLQlkcHJpbnRmX2luZm8od2luMzIsICJMb2FkIGFkZHIgaXMgcmVhbGx5ICVseCwgcmFuZ2UgJXhcbiIsCisJVFJBQ0Uod2luMzIsICJMb2FkIGFkZHIgaXMgcmVhbGx5ICVseCwgcmFuZ2UgJXhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgbG9hZF9hZGRyLCB2bWFfc2l6ZSk7CiAJCiAgICAgICAgIC8qIFN0b3JlIHRoZSBOVCBoZWFkZXIgYXQgdGhlIGxvYWQgYWRkcgpAQCAtNjM1LDEwICs2MzgsMTAgQEAKIAl9CiAKIAlpZihudF9oZWFkZXItPk9wdGlvbmFsSGVhZGVyLkRhdGFEaXJlY3RvcnlbSU1BR0VfRElSRUNUT1JZX0VOVFJZX0VYQ0VQVElPTl0uU2l6ZSkKLQkJZHByaW50Zl9maXhtZSh3aW4zMiwiRXhjZXB0aW9uIGRpcmVjdG9yeSBpZ25vcmVkXG4iKTsKKwkJRklYTUUod2luMzIsIkV4Y2VwdGlvbiBkaXJlY3RvcnkgaWdub3JlZFxuIik7CiAKIAlpZihudF9oZWFkZXItPk9wdGlvbmFsSGVhZGVyLkRhdGFEaXJlY3RvcnlbSU1BR0VfRElSRUNUT1JZX0VOVFJZX1NFQ1VSSVRZXS5TaXplKQotCQlkcHJpbnRmX2ZpeG1lKHdpbjMyLCJTZWN1cml0eSBkaXJlY3RvcnkgaWdub3JlZFxuIik7CisJCUZJWE1FKHdpbjMyLCJTZWN1cml0eSBkaXJlY3RvcnkgaWdub3JlZFxuIik7CiAKIAogCkBAIC02NTIsMzQgKzY1NSwzNCBAQAogCiAJaWYobnRfaGVhZGVyLT5PcHRpb25hbEhlYWRlci5EYXRhRGlyZWN0b3J5CiAJCVtJTUFHRV9ESVJFQ1RPUllfRU5UUllfQ09QWVJJR0hUXS5TaXplKQotCQlkcHJpbnRmX2ZpeG1lKHdpbjMyLCJDb3B5cmlnaHQgc3RyaW5nIGlnbm9yZWRcbiIpOworCQlGSVhNRSh3aW4zMiwiQ29weXJpZ2h0IHN0cmluZyBpZ25vcmVkXG4iKTsKIAogCWlmKG50X2hlYWRlci0+T3B0aW9uYWxIZWFkZXIuRGF0YURpcmVjdG9yeQogCQlbSU1BR0VfRElSRUNUT1JZX0VOVFJZX0dMT0JBTFBUUl0uU2l6ZSkKLQkJZHByaW50Zl9maXhtZSh3aW4zMiwiR2xvYmFsIFBvaW50ZXIgKE1JUFMpIGlnbm9yZWRcbiIpOworCQlGSVhNRSh3aW4zMiwiR2xvYmFsIFBvaW50ZXIgKE1JUFMpIGlnbm9yZWRcbiIpOwogCiAJaWYobnRfaGVhZGVyLT5PcHRpb25hbEhlYWRlci5EYXRhRGlyZWN0b3J5CiAJCVtJTUFHRV9ESVJFQ1RPUllfRU5UUllfTE9BRF9DT05GSUddLlNpemUpCi0JCWRwcmludGZfZml4bWUod2luMzIsIkxvYWQgQ29uZmlndXJhdGlvbiBkaXJlY3RvcnkgaWdub3JlZFxuIik7CisJCUZJWE1FKHdpbjMyLCJMb2FkIENvbmZpZ3VyYXRpb24gZGlyZWN0b3J5IGlnbm9yZWRcbiIpOwogCiAJaWYobnRfaGVhZGVyLT5PcHRpb25hbEhlYWRlci5EYXRhRGlyZWN0b3J5CiAJCVtJTUFHRV9ESVJFQ1RPUllfRU5UUllfQk9VTkRfSU1QT1JUXS5TaXplKQotCQlkcHJpbnRmX2ZpeG1lKHdpbjMyLCJCb3VuZCBJbXBvcnQgZGlyZWN0b3J5IGlnbm9yZWRcbiIpOworCQlGSVhNRSh3aW4zMiwiQm91bmQgSW1wb3J0IGRpcmVjdG9yeSBpZ25vcmVkXG4iKTsKIAogCWlmKG50X2hlYWRlci0+T3B0aW9uYWxIZWFkZXIuRGF0YURpcmVjdG9yeQogCQlbSU1BR0VfRElSRUNUT1JZX0VOVFJZX0lBVF0uU2l6ZSkKLQkJZHByaW50Zl9maXhtZSh3aW4zMiwiSW1wb3J0IEFkZHJlc3MgVGFibGUgZGlyZWN0b3J5IGlnbm9yZWRcbiIpOworCQlGSVhNRSh3aW4zMiwiSW1wb3J0IEFkZHJlc3MgVGFibGUgZGlyZWN0b3J5IGlnbm9yZWRcbiIpOwogCWlmKG50X2hlYWRlci0+T3B0aW9uYWxIZWFkZXIuRGF0YURpcmVjdG9yeVsxM10uU2l6ZSkKLQkJZHByaW50Zl9maXhtZSh3aW4zMiwiVW5rbm93biBkaXJlY3RvcnkgMTMgaWdub3JlZFxuIik7CisJCUZJWE1FKHdpbjMyLCJVbmtub3duIGRpcmVjdG9yeSAxMyBpZ25vcmVkXG4iKTsKIAlpZihudF9oZWFkZXItPk9wdGlvbmFsSGVhZGVyLkRhdGFEaXJlY3RvcnlbMTRdLlNpemUpCi0JCWRwcmludGZfZml4bWUod2luMzIsIlVua25vd24gZGlyZWN0b3J5IDE0IGlnbm9yZWRcbiIpOworCQlGSVhNRSh3aW4zMiwiVW5rbm93biBkaXJlY3RvcnkgMTQgaWdub3JlZFxuIik7CiAJaWYobnRfaGVhZGVyLT5PcHRpb25hbEhlYWRlci5EYXRhRGlyZWN0b3J5WzE1XS5TaXplKQotCQlkcHJpbnRmX2ZpeG1lKHdpbjMyLCJVbmtub3duIGRpcmVjdG9yeSAxNSBpZ25vcmVkXG4iKTsKKwkJRklYTUUod2luMzIsIlVua25vd24gZGlyZWN0b3J5IDE1IGlnbm9yZWRcbiIpOwogCiAJaWYocGVtLT5wZV9yZWxvYykJZG9fcmVsb2NhdGlvbnMocGVtKTsKIAlpZihwZW0tPnBlX2V4cG9ydCkJZHVtcF9leHBvcnRzKHBlbS0+bW9kdWxlKTsKIAlpZihwZW0tPnBlX2ltcG9ydCkJewotCQlpZiAoZml4dXBfaW1wb3J0cyhwcm9jZXNzLHBlbSxoTW9kdWxlKSkgeworCQlpZiAoZml4dXBfaW1wb3J0cyhwcm9jZXNzLHBlbSkpIHsKIAkJCVBFX01PRFJFRgkqKnhwZW07CiAKIAkJCS8qIHJlbW92ZSBlbnRyeSBmcm9tIG1vZHJlZiBjaGFpbiAqLwpAQCAtODY5LDcgKzg3Miw3IEBACiAgICAgKSB7CiAgICAgICAgIEZBUlBST0MzMiBlbnRyeSA9IChGQVJQUk9DMzIpUlZBX1BUUiggcGVtLT5tb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbEhlYWRlci5BZGRyZXNzT2ZFbnRyeVBvaW50ICk7Ci0gICAgICAgIGRwcmludGZfaW5mbyhyZWxheSwgIkNhbGxUbzMyKGVudHJ5cHJvYz0lcCxtb2R1bGU9JTA4eCx0eXBlPSVsZCxyZXM9JXApXG4iLAorICAgICAgICBUUkFDRShyZWxheSwgIkNhbGxUbzMyKGVudHJ5cHJvYz0lcCxtb2R1bGU9JTA4eCx0eXBlPSVsZCxyZXM9JXApXG4iLAogICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSwgcGVtLT5tb2R1bGUsIHR5cGUsIGxwUmVzZXJ2ZWQgKTsKICAgICAgICAgZW50cnkoIHBlbS0+bW9kdWxlLCB0eXBlLCBscFJlc2VydmVkICk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbG9hZGVyL3Jlc291cmNlLmMgYi9sb2FkZXIvcmVzb3VyY2UuYwppbmRleCA4ZDdhZDgxLi4zMjE5ZDc4IDEwMDY0NAotLS0gYS9sb2FkZXIvcmVzb3VyY2UuYworKysgYi9sb2FkZXIvcmVzb3VyY2UuYwpAQCAtNDUsNyArNDUsNyBAQAogCWNoYXIgKnB0ciA9IFBUUl9TRUdfVE9fTElOKCBuYW1lICk7CiAJaWYgKHB0clswXSA9PSAnIycpCiAJICAgIGlmICghKG5hbWUgPSAoU0VHUFRSKWF0b2koIHB0ciArIDEgKSkpIHsKLQkgICAgICBkcHJpbnRmX3dhcm4ocmVzb3VyY2UsICJJbmNvcnJlY3QgcmVzb3VyY2UgbmFtZTogJXNcbiIsIHB0cik7CisJICAgICAgV0FSTihyZXNvdXJjZSwgIkluY29ycmVjdCByZXNvdXJjZSBuYW1lOiAlc1xuIiwgcHRyKTsKIAkgICAgICByZXR1cm4gMDsKIAkgICAgfQogICAgIH0KQEAgLTU1LDEyICs1NSwxMiBAQAogCWNoYXIgKnB0ciA9IFBUUl9TRUdfVE9fTElOKCB0eXBlICk7CiAJaWYgKHB0clswXSA9PSAnIycpCiAJICBpZiAoISh0eXBlID0gKFNFR1BUUilhdG9pKCBwdHIgKyAxICkpKXsKLQkgICAgZHByaW50Zl93YXJuKHJlc291cmNlLCAiSW5jb3JyZWN0IHJlc291cmNlIHR5cGU6ICVzXG4iLCBwdHIpOworCSAgICBXQVJOKHJlc291cmNlLCAiSW5jb3JyZWN0IHJlc291cmNlIHR5cGU6ICVzXG4iLCBwdHIpOwogCSAgICByZXR1cm4gMDsKIAkgIH0KICAgICB9CiAKLSAgICBkcHJpbnRmX2luZm8ocmVzb3VyY2UsICJGaW5kUmVzb3VyY2UxNjogbW9kdWxlPSUwNHggbmFtZT0lcyB0eXBlPSVzXG4iLCAKKyAgICBUUkFDRShyZXNvdXJjZSwgIm1vZHVsZT0lMDR4IG5hbWU9JXMgdHlwZT0lc1xuIiwgCiAJCSBoTW9kdWxlLCBkZWJ1Z3JlcyhQVFJfU0VHX1RPX0xJTihuYW1lKSksIAogCQkgZGVidWdyZXMoUFRSX1NFR19UT19MSU4odHlwZSkpICk7CiAKQEAgLTEyNSw3ICsxMjUsNyBAQAogCiAgICAgICAgIGlmICghaE1vZHVsZSkgaE1vZHVsZSA9IEdldFRhc2tEUygpOwogICAgICAgICBoTW9kdWxlID0gTU9EVUxFX0hBTkRMRXRvSE1PRFVMRTMyKCBoTW9kdWxlICk7Ci0gICAgICAgIGRwcmludGZfaW5mbyhyZXNvdXJjZSwgIkZpbmRSZXNvdXJjZTMyVzogbW9kdWxlPSUwOHggIgorICAgICAgICBUUkFDRShyZXNvdXJjZSwgIm1vZHVsZT0lMDh4ICIKIAkJCSAidHlwZT0lcyVwIG5hbWU9JXMlcFxuIiwgaE1vZHVsZSwKIAkJCSAoSElXT1JEKHR5cGUpKT8gIiIgOiAiIyIsIHR5cGUsIAogCQkJIChISVdPUkQobmFtZSkpPyAiIiA6ICIjIiwgbmFtZSk7CkBAIC0xNTQsNyArMTU0LDcgQEAKICAgICBORV9NT0RVTEUgKnBNb2R1bGU7CiAKICAgICBoTW9kdWxlID0gTU9EVUxFX0hBTkRMRXRvSE1PRFVMRTE2KCBoTW9kdWxlICk7Ci0gICAgZHByaW50Zl9pbmZvKHJlc291cmNlLCAiTG9hZFJlc291cmNlMTY6IG1vZHVsZT0lMDR4IHJlcz0lMDR4XG4iLAorICAgIFRSQUNFKHJlc291cmNlLCAibW9kdWxlPSUwNHggcmVzPSUwNHhcbiIsCiAgICAgICAgICAgICAgICAgICAgICBoTW9kdWxlLCBoUnNyYyApOwogICAgIGlmICghaFJzcmMpIHJldHVybiAwOwogICAgIGlmICgocE1vZHVsZSA9IE1PRFVMRV9HZXRQdHIoIGhNb2R1bGUgKSkpCkBAIC0xODIsNyArMTgyLDcgQEAKIAogICAgICAgICBpZiAoIWhNb2R1bGUpIGhNb2R1bGUgPSBHZXRUYXNrRFMoKTsgLyogRklYTUU6IHNlZSBGaW5kUmVzb3VyY2UzMlcgKi8KICAgICAgICAgaE1vZHVsZSA9IE1PRFVMRV9IQU5ETEV0b0hNT0RVTEUzMiggaE1vZHVsZSApOwotICAgICAgICBkcHJpbnRmX2luZm8ocmVzb3VyY2UsICJMb2FkUmVzb3VyY2UzMjogbW9kdWxlPSUwNHggcmVzPSUwNHhcbiIsCisgICAgICAgIFRSQUNFKHJlc291cmNlLCAibW9kdWxlPSUwNHggcmVzPSUwNHhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaE1vZHVsZSwgaFJzcmMgKTsKICAgICAgICAgaWYgKCFoUnNyYykgcmV0dXJuIDA7CiAKQEAgLTIwNyw3ICsyMDcsNyBAQAogICAgIEhNT0RVTEUxNiBoTW9kdWxlOwogICAgIE5FX01PRFVMRSAqcE1vZHVsZTsKIAotICAgIGRwcmludGZfaW5mbyhyZXNvdXJjZSwgIkxvY2tSZXNvdXJjZTogaGFuZGxlPSUwNHhcbiIsIGhhbmRsZSApOworICAgIFRSQUNFKHJlc291cmNlLCAiaGFuZGxlPSUwNHhcbiIsIGhhbmRsZSApOwogICAgIGlmICghaGFuZGxlKSByZXR1cm4gKFNFR1BUUikwOwogICAgIGhNb2R1bGUgPSBNT0RVTEVfSEFORExFdG9ITU9EVUxFMTYoIGhhbmRsZSApOwogICAgIGlmICghKHBNb2R1bGUgPSBNT0RVTEVfR2V0UHRyKCBoTW9kdWxlICkpKSByZXR1cm4gMDsKQEAgLTIyNyw3ICsyMjcsNyBAQAogICAgICAgICBITU9EVUxFMTYgaE1vZHVsZTsKICAgICAgICAgTkVfTU9EVUxFICpwTW9kdWxlOwogCi0gICAgICAgIGRwcmludGZfaW5mbyhyZXNvdXJjZSwgIkxvY2tSZXNvdXJjZTogaGFuZGxlPSUwNHhcbiIsIGhhbmRsZSApOworICAgICAgICBUUkFDRShyZXNvdXJjZSwgImhhbmRsZT0lMDR4XG4iLCBoYW5kbGUgKTsKICAgICAgICAgaWYgKCFoYW5kbGUpIHJldHVybiBOVUxMOwogICAgICAgICBoTW9kdWxlID0gTU9EVUxFX0hBTkRMRXRvSE1PRFVMRTE2KCBoYW5kbGUgKTsKICAgICAgICAgaWYgKCEocE1vZHVsZSA9IE1PRFVMRV9HZXRQdHIoIGhNb2R1bGUgKSkpIHJldHVybiAwOwpAQCAtMjYxLDcgKzI2MSw3IEBACiAgICAgICAgIEhNT0RVTEUxNiBoTW9kdWxlOwogICAgICAgICBORV9NT0RVTEUgKnBNb2R1bGU7CiAKLSAgICAgICAgZHByaW50Zl9pbmZvKHJlc291cmNlLCAiRnJlZVJlc291cmNlMTY6IGhhbmRsZT0lMDR4XG4iLCBoYW5kbGUgKTsKKyAgICAgICAgVFJBQ0UocmVzb3VyY2UsICJoYW5kbGU9JTA0eFxuIiwgaGFuZGxlICk7CiAgICAgICAgIGlmICghaGFuZGxlKSByZXR1cm4gRkFMU0U7CiAgICAgICAgIGhNb2R1bGUgPSBNT0RVTEVfSEFORExFdG9ITU9EVUxFMTYoIGhhbmRsZSApOwogICAgICAgICBpZiAoIShwTW9kdWxlID0gTU9EVUxFX0dldFB0ciggaE1vZHVsZSApKSkgcmV0dXJuIDA7CkBAIC0yOTMsNyArMjkzLDcgQEAKICAgICBORV9NT0RVTEUgKnBNb2R1bGU7CiAKICAgICBoTW9kdWxlID0gTU9EVUxFX0hBTkRMRXRvSE1PRFVMRTE2KCBoTW9kdWxlICk7Ci0gICAgZHByaW50Zl9pbmZvKHJlc291cmNlLCAiQWNjZXNzUmVzb3VyY2UxNjogbW9kdWxlPSUwNHggcmVzPSUwNHhcbiIsCisgICAgVFJBQ0UocmVzb3VyY2UsICJtb2R1bGU9JTA0eCByZXM9JTA0eFxuIiwKICAgICAgICAgICAgICAgICAgICAgIGhNb2R1bGUsIGhSc3JjICk7CiAgICAgaWYgKCFoUnNyYykgcmV0dXJuIDA7CiAgICAgaWYgKCEocE1vZHVsZSA9IE1PRFVMRV9HZXRQdHIoIGhNb2R1bGUgKSkpIHJldHVybiAwOwpAQCAtMzE2LDcgKzMxNiw3IEBACiBJTlQzMiBXSU5BUEkgQWNjZXNzUmVzb3VyY2UzMiggSElOU1RBTkNFMzIgaE1vZHVsZSwgSFJTUkMzMiBoUnNyYyApCiB7CiAgICAgaE1vZHVsZSA9IE1PRFVMRV9IQU5ETEV0b0hNT0RVTEUzMiggaE1vZHVsZSApOwotICAgIGRwcmludGZfaW5mbyhyZXNvdXJjZSwgIkFjY2Vzc1Jlc291cmNlOiBtb2R1bGU9JTA0eCByZXM9JTA0eFxuIiwKKyAgICBUUkFDRShyZXNvdXJjZSwgIm1vZHVsZT0lMDR4IHJlcz0lMDR4XG4iLAogICAgICAgICAgICAgICAgICAgICAgaE1vZHVsZSwgaFJzcmMgKTsKICAgICBpZiAoIWhSc3JjKSByZXR1cm4gMDsKICAgICBmcHJpbnRmKHN0ZGVyciwiQWNjZXNzUmVzb3VyY2UzMjogbm90IGltcGxlbWVudGVkXG4iKTsKQEAgLTMzMiw3ICszMzIsNyBAQAogICAgIE5FX01PRFVMRSAqcE1vZHVsZTsKIAogICAgIGhNb2R1bGUgPSBNT0RVTEVfSEFORExFdG9ITU9EVUxFMTYoIGhNb2R1bGUgKTsKLSAgICBkcHJpbnRmX2luZm8ocmVzb3VyY2UsICJTaXplb2ZSZXNvdXJjZTE2OiBtb2R1bGU9JTA0eCByZXM9JTA0eFxuIiwKKyAgICBUUkFDRShyZXNvdXJjZSwgIm1vZHVsZT0lMDR4IHJlcz0lMDR4XG4iLAogICAgICAgICAgICAgICAgICAgICAgaE1vZHVsZSwgaFJzcmMgKTsKICAgICBpZiAoIShwTW9kdWxlID0gTU9EVUxFX0dldFB0ciggaE1vZHVsZSApKSkgcmV0dXJuIDA7CiAgICAgaWYgKCFfX3dpbmVsaWIpCkBAIC0zNTQsNyArMzU0LDcgQEAKIERXT1JEIFdJTkFQSSBTaXplb2ZSZXNvdXJjZTMyKCBISU5TVEFOQ0UzMiBoTW9kdWxlLCBIUlNSQzMyIGhSc3JjICkKIHsKICAgICBoTW9kdWxlID0gTU9EVUxFX0hBTkRMRXRvSE1PRFVMRTMyKCBoTW9kdWxlICk7Ci0gICAgZHByaW50Zl9pbmZvKHJlc291cmNlLCAiU2l6ZW9mUmVzb3VyY2UzMjogbW9kdWxlPSUwNHggcmVzPSUwNHhcbiIsCisgICAgVFJBQ0UocmVzb3VyY2UsICJtb2R1bGU9JTA0eCByZXM9JTA0eFxuIiwKICAgICAgICAgICAgICAgICAgICAgIGhNb2R1bGUsIGhSc3JjICk7CiAgICAgaWYgKCFfX3dpbmVsaWIpIHJldHVybiBQRV9TaXplb2ZSZXNvdXJjZTMyKGhNb2R1bGUsaFJzcmMpOwogICAgIGVsc2UKQEAgLTM3Myw3ICszNzMsNyBAQAogICAgIE5FX01PRFVMRSAqcE1vZHVsZTsKIAogICAgIGhNb2R1bGUgPSBNT0RVTEVfSEFORExFdG9ITU9EVUxFMTYoIGhNb2R1bGUgKTsKLSAgICBkcHJpbnRmX2luZm8ocmVzb3VyY2UsICJBbGxvY1Jlc291cmNlOiBtb2R1bGU9JTA0eCByZXM9JTA0eCBzaXplPSVsZFxuIiwKKyAgICBUUkFDRShyZXNvdXJjZSwgIm1vZHVsZT0lMDR4IHJlcz0lMDR4IHNpemU9JWxkXG4iLAogICAgICAgICAgICAgICAgICAgICAgaE1vZHVsZSwgaFJzcmMsIHNpemUgKTsKICAgICBpZiAoIWhSc3JjKSByZXR1cm4gMDsKICAgICBpZiAoIShwTW9kdWxlID0gTU9EVUxFX0dldFB0ciggaE1vZHVsZSApKSkgcmV0dXJuIDA7CkBAIC0zOTcsNyArMzk3LDcgQEAKIEhHTE9CQUwxNiBXSU5BUEkgRGlyZWN0UmVzQWxsb2MoIEhJTlNUQU5DRTE2IGhJbnN0YW5jZSwgV09SRCB3VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiB3U2l6ZSApCiB7Ci0gICAgZHByaW50Zl9pbmZvKHJlc291cmNlLCJEaXJlY3RSZXNBbGxvYyglMDR4LCUwNHgsJTA0eClcbiIsCisgICAgVFJBQ0UocmVzb3VyY2UsIiglMDR4LCUwNHgsJTA0eClcbiIsCiAgICAgICAgICAgICAgICAgICAgICBoSW5zdGFuY2UsIHdUeXBlLCB3U2l6ZSApOwogICAgIGhJbnN0YW5jZSA9IE1PRFVMRV9IQU5ETEV0b0hNT0RVTEUxNihoSW5zdGFuY2UpOwogICAgIGlmKCFoSW5zdGFuY2UpcmV0dXJuIDA7CkBAIC00MTYsMTAgKzQxNiwxMCBAQAogICAgIEhSU1JDMTYJaFJzcmM7CiAKICAgICBpZiAoSElXT1JEKGxwVGFibGVOYW1lKSkKLSAgICAgICAgZHByaW50Zl9pbmZvKGFjY2VsLCAiTG9hZEFjY2VsZXJhdG9yczogJTA0eCAnJXMnXG4iLAorICAgICAgICBUUkFDRShhY2NlbCwgIiUwNHggJyVzJ1xuIiwKICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwgKGNoYXIgKilQVFJfU0VHX1RPX0xJTiggbHBUYWJsZU5hbWUgKSApOwogICAgIGVsc2UKLSAgICAgICAgZHByaW50Zl9pbmZvKGFjY2VsLCAiTG9hZEFjY2VsZXJhdG9yczogJTA0eCAlMDR4XG4iLAorICAgICAgICBUUkFDRShhY2NlbCwgIiUwNHggJTA0eFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsIExPV09SRChscFRhYmxlTmFtZSkgKTsKIAogICAgIGlmICghKGhSc3JjID0gRmluZFJlc291cmNlMTYoIGluc3RhbmNlLCBscFRhYmxlTmFtZSwgUlRfQUNDRUxFUkFUT1IgKSkpCkBAIC00NDEsMTAgKzQ0MSwxMCBAQAogICAgIEhSU1JDMzIgaFJzcmM7CiAKICAgICBpZiAoSElXT1JEKGxwVGFibGVOYW1lKSkKLSAgICAgICAgZHByaW50Zl9pbmZvKGFjY2VsLCAiTG9hZEFjY2VsZXJhdG9yczogJTA0eCAnJXMnXG4iLAorICAgICAgICBUUkFDRShhY2NlbCwgIiUwNHggJyVzJ1xuIiwKICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwgKGNoYXIgKikoIGxwVGFibGVOYW1lICkgKTsKICAgICBlbHNlCi0gICAgICAgIGRwcmludGZfaW5mbyhhY2NlbCwgIkxvYWRBY2NlbGVyYXRvcnM6ICUwNHggJTA0eFxuIiwKKyAgICAgICAgVFJBQ0UoYWNjZWwsICIlMDR4ICUwNHhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLCBMT1dPUkQobHBUYWJsZU5hbWUpICk7CiAKICAgICBpZiAoIShoUnNyYyA9IEZpbmRSZXNvdXJjZTMyVyggaW5zdGFuY2UsIGxwVGFibGVOYW1lLCAKQEAgLTUwNSw3ICs1MDUsNyBAQAogICAgIGludCBzdHJpbmdfbnVtOwogICAgIGludCBpOwogCi0gICAgZHByaW50Zl9pbmZvKHJlc291cmNlLCJMb2FkU3RyaW5nOiBpbnN0PSUwNHggaWQ9JTA0eCBidWZmPSUwOHggbGVuPSVkXG4iLAorICAgIFRSQUNFKHJlc291cmNlLCJpbnN0PSUwNHggaWQ9JTA0eCBidWZmPSUwOHggbGVuPSVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsIHJlc291cmNlX2lkLCAoaW50KSBidWZmZXIsIGJ1Zmxlbik7CiAKICAgICBocnNyYyA9IEZpbmRSZXNvdXJjZTE2KCBpbnN0YW5jZSwgKFNFR1BUUikoKHJlc291cmNlX2lkPj40KSsxKSwgUlRfU1RSSU5HICk7CkBAIC01MTgsNyArNTE4LDcgQEAKICAgICBmb3IgKGkgPSAwOyBpIDwgc3RyaW5nX251bTsgaSsrKQogCXAgKz0gKnAgKyAxOwogICAgIAotICAgIGRwcmludGZfaW5mbyhyZXNvdXJjZSwgInN0cmxlbiA9ICVkXG4iLCAoaW50KSpwICk7CisgICAgVFJBQ0UocmVzb3VyY2UsICJzdHJsZW4gPSAlZFxuIiwgKGludCkqcCApOwogICAgIAogICAgIGkgPSBNSU4oYnVmbGVuIC0gMSwgKnApOwogICAgIGlmIChidWZmZXIgPT0gTlVMTCkKQEAgLTUzNiw3ICs1MzYsNyBAQAogICAgIH0KICAgICBGcmVlUmVzb3VyY2UxNiggaG1lbSApOwogCi0gICAgZHByaW50Zl9pbmZvKHJlc291cmNlLCJMb2FkU3RyaW5nIC8vICclcycgY29waWVkICFcbiIsIGJ1ZmZlcik7CisgICAgVFJBQ0UocmVzb3VyY2UsIiclcycgY29waWVkICFcbiIsIGJ1ZmZlcik7CiAgICAgcmV0dXJuIGk7CiB9CiAKQEAgLTU1NCw3ICs1NTQsNyBAQAogCiAgICAgaWYgKEhJV09SRChyZXNvdXJjZV9pZCk9PTB4RkZGRikgLyogbmV0c2NhcGUgMyBwYXNzZXMgdGhpcyAqLwogCXJlc291cmNlX2lkID0gKFVJTlQzMikoLSgoSU5UMzIpcmVzb3VyY2VfaWQpKTsKLSAgICBkcHJpbnRmX2luZm8ocmVzb3VyY2UsICJMb2FkU3RyaW5nOiBpbnN0YW5jZSA9ICUwNHgsIGlkID0gJTA0eCwgYnVmZmVyID0gJTA4eCwgIgorICAgIFRSQUNFKHJlc291cmNlLCAiaW5zdGFuY2UgPSAlMDR4LCBpZCA9ICUwNHgsIGJ1ZmZlciA9ICUwOHgsICIKIAkgICAibGVuZ3RoID0gJWRcbiIsIGluc3RhbmNlLCAoaW50KXJlc291cmNlX2lkLCAoaW50KSBidWZmZXIsIGJ1Zmxlbik7CiAKICAgICBocnNyYyA9IEZpbmRSZXNvdXJjZTMyVyggaW5zdGFuY2UsIChMUENXU1RSKSgocmVzb3VyY2VfaWQ+PjQpKzEpLCAKQEAgLTU2OCw3ICs1NjgsNyBAQAogICAgIGZvciAoaSA9IDA7IGkgPCBzdHJpbmdfbnVtOyBpKyspCiAJcCArPSAqcCArIDE7CiAgICAgCi0gICAgZHByaW50Zl9pbmZvKHJlc291cmNlLCAic3RybGVuID0gJWRcbiIsIChpbnQpKnAgKTsKKyAgICBUUkFDRShyZXNvdXJjZSwgInN0cmxlbiA9ICVkXG4iLCAoaW50KSpwICk7CiAgICAgCiAgICAgaSA9IE1JTihidWZsZW4gLSAxLCAqcCk7CiAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKQpAQCAtNTg3LDcgKzU4Nyw3IEBACiAjZW5kaWYKICAgICB9CiAjaWYgMAotICAgIGRwcmludGZfaW5mbyhyZXNvdXJjZSwiTG9hZFN0cmluZyAvLyAnJXMnIGNvcGllZCAhXG4iLCBidWZmZXIpOworICAgIFRSQUNFKHJlc291cmNlLCInJXMnIGNvcGllZCAhXG4iLCBidWZmZXIpOwogI2VuZGlmCiAgICAgcmV0dXJuIGk7CiB9CkBAIC02NTgsNyArNjU4LDcgQEAKIAlDSEFSCXN0clsxXTsKICAgICB9ICpzdHJlOwogCi0gICAgZHByaW50Zl9pbmZvKHJlc291cmNlLCAiTG9hZE1lc3NhZ2U6IGluc3RhbmNlID0gJTA4bHgsIGlkID0gJTA4bHgsIGJ1ZmZlciA9ICVwLCBsZW5ndGggPSAlbGRcbiIsIChEV09SRClpbnN0YW5jZSwgKERXT1JEKWlkLCBidWZmZXIsIChEV09SRClidWZsZW4pOworICAgIFRSQUNFKHJlc291cmNlLCAiaW5zdGFuY2UgPSAlMDhseCwgaWQgPSAlMDhseCwgYnVmZmVyID0gJXAsIGxlbmd0aCA9ICVsZFxuIiwgKERXT1JEKWluc3RhbmNlLCAoRFdPUkQpaWQsIGJ1ZmZlciwgKERXT1JEKWJ1Zmxlbik7CiAKICAgICAvKkZJWE1FOiBJIGFtIG5vdCBzdXJlIGFib3V0IHRoZSAnMScgLi4uIEJ1dCBJJ3ZlIG9ubHkgc2VlbiB0aG9zZSBlbnRyaWVzKi8KICAgICBocnNyYyA9IEZpbmRSZXNvdXJjZUV4MzJXKGluc3RhbmNlLChMUFdTVFIpMSwoTFBDV1NUUilSVF9NRVNTQUdFTElTVCxsYW5nKTsKQEAgLTY4Niw3ICs2ODYsNyBAQAogICAgIAlzdHJlID0gKHN0cnVjdCBfc3RyaW5nZW50cnkqKSgoKGNoYXIqKXN0cmUpK3NsZW4pOwogICAgIH0KICAgICBzbGVuPXN0cmUtPmxlbjsKLSAgICBkcHJpbnRmX2luZm8ocmVzb3VyY2UsIgktIHN0cmxlbj0lZFxuIixzbGVuKTsKKyAgICBUUkFDRShyZXNvdXJjZSwiCS0gc3RybGVuPSVkXG4iLHNsZW4pOwogICAgIGkgPSBNSU4oYnVmbGVuIC0gMSwgc2xlbik7CiAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKQogCXJldHVybiBzbGVuOyAvKiBkaWZmZXJlbnQgdG8gTG9hZFN0cmluZyAqLwpAQCAtNzAwLDcgKzcwMCw3IEBACiAJfQogICAgIH0KICAgICBpZiAoYnVmZmVyKQotCSAgICBkcHJpbnRmX2luZm8ocmVzb3VyY2UsIkxvYWRNZXNzYWdlIC8vICclcycgY29waWVkICFcbiIsIGJ1ZmZlcik7CisJICAgIFRSQUNFKHJlc291cmNlLCInJXMnIGNvcGllZCAhXG4iLCBidWZmZXIpOwogICAgIHJldHVybiBpOwogfQogCkBAIC03MzcsNyArNzM3LDcgQEAKIAogICAgIGhNb2R1bGUgPSBHZXRFeGVQdHIoIGhNb2R1bGUgKTsKIAotICAgIGRwcmludGZfaW5mbyhyZXNvdXJjZSwgIlNldFJlc291cmNlSGFuZGxlcjogbW9kdWxlPSUwNHggdHlwZT0lc1xuIiwgCisgICAgVFJBQ0UocmVzb3VyY2UsICJtb2R1bGU9JTA0eCB0eXBlPSVzXG4iLCAKIAkJIGhNb2R1bGUsIGRlYnVncmVzKFBUUl9TRUdfVE9fTElOKHMpKSApOwogCiAgICAgaWYgKChwTW9kdWxlID0gTU9EVUxFX0dldFB0ciggaE1vZHVsZSApKSkKZGlmZiAtLWdpdCBhL2xvYWRlci9zaWduYWwuYyBiL2xvYWRlci9zaWduYWwuYwppbmRleCAwMDkyYjIyLi5lZjg1MGFkIDEwMDY0NAotLS0gYS9sb2FkZXIvc2lnbmFsLmMKKysrIGIvbG9hZGVyL3NpZ25hbC5jCkBAIC0yNiw2ICsyNiw4IEBACiAjZW5kaWYKIAogI2luY2x1ZGUgIm1pc2NlbXUuaCIKKyNpbmNsdWRlICJzZWxlY3RvcnMuaCIKKyNpbmNsdWRlICJzaWdfY29udGV4dC5oIgogI2luY2x1ZGUgIndpbnNvY2suaCIKIAogCkBAIC04Myw4ICs4NSw5IEBACiAgKiAKICAqIHdhaXQ0IHRlcm1pbmF0ZWQgY2hpbGQgcHJvY2Vzc2VzCiAgKi8KLXN0YXRpYyB2b2lkIFNJR05BTF9jaGlsZCh2b2lkKQorc3RhdGljIEhBTkRMRVJfREVGKFNJR05BTF9jaGlsZCkKIHsKKyAgICBIQU5ETEVSX0lOSVQoKTsKICNpZmRlZiBIQVZFX1dBSVQ0CiAgICAgd2FpdDQoIDAsIE5VTEwsIFdOT0hBTkcsIE5VTEwpOwogI2VsaWYgZGVmaW5lZCAoSEFWRV9XQUlUUElEKQpkaWZmIC0tZ2l0IGEvbG9hZGVyL3Rhc2suYyBiL2xvYWRlci90YXNrLmMKaW5kZXggY2U1NmIwYS4uYmRhNDYyNiAxMDA2NDQKLS0tIGEvbG9hZGVyL3Rhc2suYworKysgYi9sb2FkZXIvdGFzay5jCkBAIC0xNzYsOSArMTc2LDkgQEAKICAgICAvKiBEaXNwbGF5IGl0ICovCiAKICAgICBwID0gKGNoYXIgKikgR2xvYmFsTG9jazE2KCBoYW5kbGUgKTsKLSAgICBkcHJpbnRmX2luZm8odGFzaywgIk1hc3RlciBET1MgZW52aXJvbm1lbnQgYXQgJXBcbiIsIHApOwotICAgIGZvciAoOyAqcDsgcCArPSBzdHJsZW4ocCkgKyAxKSBkcHJpbnRmX2luZm8odGFzaywgIiAgICAlc1xuIiwgcCk7Ci0gICAgZHByaW50Zl9pbmZvKHRhc2ssICJQcm9nbmFtZTogJXNcbiIsIHArMyApOworICAgIFRSQUNFKHRhc2ssICJNYXN0ZXIgRE9TIGVudmlyb25tZW50IGF0ICVwXG4iLCBwKTsKKyAgICBmb3IgKDsgKnA7IHAgKz0gc3RybGVuKHApICsgMSkgVFJBQ0UodGFzaywgIiAgICAlc1xuIiwgcCk7CisgICAgVFJBQ0UodGFzaywgIlByb2duYW1lOiAlc1xuIiwgcCszICk7CiAKICAgICByZXR1cm4gaGFuZGxlOwogfQpAQCAtMzQ3LDcgKzM0Nyw3IEBACiAKICAgICAgICAgSW5pdEFwcCggcFRhc2stPmhNb2R1bGUgKTsKICAgICAgICAgUEVfSW5pdGlhbGl6ZURMTHMoIFBST0NFU1NfQ3VycmVudCgpLCBETExfUFJPQ0VTU19BVFRBQ0gsIChMUFZPSUQpLTEgKTsKLSAgICAgICAgZHByaW50Zl9pbmZvKHJlbGF5LCAiQ2FsbFRvMzIoZW50cnlwcm9jPSVwKVxuIiwgZW50cnkgKTsKKyAgICAgICAgVFJBQ0UocmVsYXksICIoZW50cnlwcm9jPSVwKVxuIiwgZW50cnkgKTsKICAgICAgICAgZXhpdF9jb2RlID0gZW50cnkoKTsKICAgICAgICAgVEFTS19LaWxsQ3VycmVudFRhc2soIGV4aXRfY29kZSApOwogICAgIH0KQEAgLTM3Niw3ICszNzYsNyBAQAogICAgICAgICBFQ1hfcmVnKCZjb250ZXh0KSA9IHBNb2R1bGUtPmhlYXBfc2l6ZTsKICAgICAgICAgRURJX3JlZygmY29udGV4dCkgPSBjb250ZXh0LlNlZ0RzOwogCi0gICAgICAgIGRwcmludGZfaW5mbyh0YXNrLCAiU3RhcnRpbmcgbWFpbiBwcm9ncmFtOiBjczppcD0lMDRseDolMDR4IGRzPSUwNGx4IHNzOnNwPSUwNHg6JTA0eFxuIiwKKyAgICAgICAgVFJBQ0UodGFzaywgIlN0YXJ0aW5nIG1haW4gcHJvZ3JhbTogY3M6aXA9JTA0bHg6JTA0eCBkcz0lMDRseCBzczpzcD0lMDR4OiUwNHhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgQ1NfcmVnKCZjb250ZXh0KSwgSVBfcmVnKCZjb250ZXh0KSwgRFNfcmVnKCZjb250ZXh0KSwKICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1RPUk9GKHBUYXNrLT50aGRiLT5jdXJfc3RhY2spLAogICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVE9GKHBUYXNrLT50aGRiLT5jdXJfc3RhY2spICk7CkBAIC01NjMsNyArNTYzLDcgQEAKIAogICAgIFRBU0tfTGlua1Rhc2soIGhUYXNrICk7CiAKLSAgICBkcHJpbnRmX2luZm8odGFzaywgIkNyZWF0ZVRhc2s6IG1vZHVsZT0nJXMnIGNtZGxpbmU9JyVzJyB0YXNrPSUwNHhcbiIsCisgICAgVFJBQ0UodGFzaywgIm1vZHVsZT0nJXMnIGNtZGxpbmU9JyVzJyB0YXNrPSUwNHhcbiIsCiAgICAgICAgICAgICAgICAgICBuYW1lLCBjbWRMaW5lLCBoVGFzayApOwogCiAgICAgcmV0dXJuIGhUYXNrOwpAQCAtNjIxLDcgKzYyMSw3IEBACiAgICAgVERCKiBwVGFzayA9IChUREIqKSBHbG9iYWxMb2NrMTYoIGhDdXJyZW50VGFzayApOwogICAgIGlmICghcFRhc2spIFVTRVJfRXhpdFdpbmRvd3MoKTsgIC8qIE5vIGN1cnJlbnQgdGFzayB5ZXQgKi8KIAotICAgIGRwcmludGZfaW5mbyh0YXNrLCAiS2lsbGluZyB0YXNrICUwNHhcbiIsIGhDdXJyZW50VGFzayApOworICAgIFRSQUNFKHRhc2ssICJLaWxsaW5nIHRhc2sgJTA0eFxuIiwgaEN1cnJlbnRUYXNrICk7CiAKICAgICAvKiBEZWxldGUgYWN0aXZlIHNvY2tldHMgKi8KIApAQCAtNjQzLDcgKzY0Myw3IEBACiAKICAgICBpZiAoblRhc2tDb3VudCA8PSAxKQogICAgIHsKLSAgICAgICAgZHByaW50Zl9pbmZvKHRhc2ssICJcbnRoaXMgaXMgdGhlIGxhc3QgdGFzaywgZXhpdGluZ1xuIiApOworICAgICAgICBUUkFDRSh0YXNrLCAidGhpcyBpcyB0aGUgbGFzdCB0YXNrLCBleGl0aW5nXG4iICk7CiAgICAgICAgIFVTRVJfRXhpdFdpbmRvd3MoKTsKICAgICB9CiAKQEAgLTcyNCw3ICs3MjQsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBwTmV3VGFzayA9IChUREIgKilHbG9iYWxMb2NrMTYoIGhUYXNrICk7CiAKLQkgICAgZHByaW50Zl9pbmZvKHRhc2ssICJcdHRhc2sgPSAlMDR4LCBldmVudHMgPSAlaVxuIiwgaFRhc2ssIHBOZXdUYXNrLT5uRXZlbnRzKTsKKwkgICAgVFJBQ0UodGFzaywgIlx0dGFzayA9ICUwNHgsIGV2ZW50cyA9ICVpXG4iLCBoVGFzaywgcE5ld1Rhc2stPm5FdmVudHMpOwogCiAgICAgICAgICAgICBpZiAocE5ld1Rhc2stPm5FdmVudHMpIGJyZWFrOwogICAgICAgICAgICAgaFRhc2sgPSBwTmV3VGFzay0+aE5leHQ7CkBAIC03MzksMTEgKzczOSwxMSBAQAogCiAgICAgaWYgKGhUYXNrID09IGhDdXJyZW50VGFzaykgCiAgICAgewotICAgICAgIGRwcmludGZfaW5mbyh0YXNrLCAicmV0dXJuaW5nIHRvIHRoZSBjdXJyZW50IHRhc2soJTA0eClcbiIsIGhUYXNrICk7CisgICAgICAgVFJBQ0UodGFzaywgInJldHVybmluZyB0byB0aGUgY3VycmVudCB0YXNrKCUwNHgpXG4iLCBoVGFzayApOwogICAgICAgIHJldHVybjsgIC8qIE5vdGhpbmcgdG8gZG8gKi8KICAgICB9CiAgICAgcE5ld1Rhc2sgPSAoVERCICopR2xvYmFsTG9jazE2KCBoVGFzayApOwotICAgIGRwcmludGZfaW5mbyh0YXNrLCAiU3dpdGNoaW5nIHRvIHRhc2sgJTA0eCAoJS44cylcbiIsCisgICAgVFJBQ0UodGFzaywgIlN3aXRjaGluZyB0byB0YXNrICUwNHggKCUuOHMpXG4iLAogICAgICAgICAgICAgICAgICAgaFRhc2ssIHBOZXdUYXNrLT5tb2R1bGVfbmFtZSApOwogCiAgICAgIC8qIE1ha2UgdGhlIHRhc2sgdGhlIGxhc3QgaW4gdGhlIGxpbmtlZCBsaXN0IChyb3VuZC1yb2JpbiBzY2hlZHVsaW5nKSAqLwpAQCAtMTAxMiw3ICsxMDEyLDcgQEAKICAgICB0aHVuayA9IFBUUl9TRUdfVE9fTElOKCB0aHVua2FkZHIgKTsKICAgICBsZnVuYyA9IFBUUl9TRUdfVE9fTElOKCBmdW5jICk7CiAKLSAgICBkcHJpbnRmX2luZm8odGFzaywgIk1ha2VQcm9jSW5zdGFuY2UoJTA4bHgsJTA0eCk6IGdvdCB0aHVuayAlMDhseFxuIiwKKyAgICBUUkFDRSh0YXNrLCAiKCUwOGx4LCUwNHgpOiBnb3QgdGh1bmsgJTA4bHhcbiIsCiAgICAgICAgICAgICAgICAgICAoRFdPUkQpZnVuYywgaEluc3RhbmNlLCAoRFdPUkQpdGh1bmthZGRyICk7CiAgICAgaWYgKCgobGZ1bmNbMF09PTB4OGMpICYmIChsZnVuY1sxXT09MHhkOCkpIHx8CiAgICAgCSgobGZ1bmNbMF09PTB4MWUpICYmIChsZnVuY1sxXT09MHg1OCkpCkBAIC0xMDM2LDcgKzEwMzYsNyBAQAogICovCiB2b2lkIFdJTkFQSSBGcmVlUHJvY0luc3RhbmNlMTYoIEZBUlBST0MxNiBmdW5jICkKIHsKLSAgICBkcHJpbnRmX2luZm8odGFzaywgIkZyZWVQcm9jSW5zdGFuY2UoJTA4bHgpXG4iLCAoRFdPUkQpZnVuYyApOworICAgIFRSQUNFKHRhc2ssICIoJTA4bHgpXG4iLCAoRFdPUkQpZnVuYyApOwogICAgIGlmICghX193aW5lbGliKSBUQVNLX0ZyZWVUaHVuayggaEN1cnJlbnRUYXNrLCAoU0VHUFRSKWZ1bmMgKTsKIH0KIApAQCAtMTExOCw3ICsxMTE4LDcgQEAKIAogICAgIGlmICghKHBUYXNrID0gKFREQiAqKUdsb2JhbExvY2sxNiggaEN1cnJlbnRUYXNrICkpKSByZXR1cm47CiAgICAgaWYgKCEocERhdGEgPSAoSU5TVEFOQ0VEQVRBICopR2xvYmFsTG9jazE2KCBzZWcgKSkpIHJldHVybjsKLSAgICBkcHJpbnRmX2luZm8odGFzaywgIlN3aXRjaFN0YWNrVG86IG9sZD0lMDR4OiUwNHggbmV3PSUwNHg6JTA0eFxuIiwKKyAgICBUUkFDRSh0YXNrLCAib2xkPSUwNHg6JTA0eCBuZXc9JTA0eDolMDR4XG4iLAogICAgICAgICAgICAgICAgICAgU0VMRUNUT1JPRiggcFRhc2stPnRoZGItPmN1cl9zdGFjayApLAogICAgICAgICAgICAgICAgICAgT0ZGU0VUT0YoIHBUYXNrLT50aGRiLT5jdXJfc3RhY2sgKSwgc2VnLCBwdHIgKTsKIApAQCAtMTE2Nyw4ICsxMTY3LDggQEAKICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiU3dpdGNoU3RhY2tCYWNrOiBubyBwcmV2aW91cyBTd2l0Y2hTdGFja1RvXG4iICk7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgZHByaW50Zl9pbmZvKHRhc2ssICJTd2l0Y2hTdGFja0JhY2s6IHJlc3RvcmluZyBzdGFjayAlMDR4OiUwNHhcbiIsCi0gICAgICAgICAgICAgICAgICBTRUxFQ1RPUk9GKHBEYXRhLT5vbGRfc3Nfc3ApLCBPRkZTRVRPRihwRGF0YS0+b2xkX3NzX3NwKSApOworICAgIFRSQUNFKHRhc2ssICJyZXN0b3Jpbmcgc3RhY2sgJTA0eDolMDR4XG4iLAorCQkgU0VMRUNUT1JPRihwRGF0YS0+b2xkX3NzX3NwKSwgT0ZGU0VUT0YocERhdGEtPm9sZF9zc19zcCkgKTsKIAogICAgIG9sZEZyYW1lID0gKFNUQUNLMTZGUkFNRSAqKVBUUl9TRUdfVE9fTElOKCBwVGFzay0+dGhkYi0+Y3VyX3N0YWNrICk7CiAKQEAgLTExODEsNyArMTE4MSw3IEBACiAKICAgICBuZXdGcmFtZSA9IChTVEFDSzE2RlJBTUUgKilQVFJfU0VHX1RPX0xJTiggcFRhc2stPnRoZGItPmN1cl9zdGFjayApOwogICAgIG5ld0ZyYW1lLT5mcmFtZTMyID0gb2xkRnJhbWUtPmZyYW1lMzI7Ci0gICAgaWYgKGRlYnVnZ2luZ19pbmZvKHJlbGF5KSkKKyAgICBpZiAoVFJBQ0VfT04ocmVsYXkpKQogICAgIHsKICAgICAgICAgbmV3RnJhbWUtPmVudHJ5X2lwID0gb2xkRnJhbWUtPmVudHJ5X2lwOwogICAgICAgICBuZXdGcmFtZS0+ZW50cnlfY3MgPSBvbGRGcmFtZS0+ZW50cnlfY3M7CkBAIC0xNDQ2LDcgKzE0NDYsNyBAQAogICAgIFREQiAqcFRhc2s7CiAgICAgSU5TVEFOQ0VEQVRBICpwSW5zdERhdGE7CiAKLSAgICBkcHJpbnRmX2luZm8odG9vbGhlbHAsICJUYXNrTmV4dCglcCk6IHRhc2s9JTA0eFxuIiwgbHB0ZSwgbHB0ZS0+aE5leHQgKTsKKyAgICBUUkFDRSh0b29saGVscCwgIiglcCk6IHRhc2s9JTA0eFxuIiwgbHB0ZSwgbHB0ZS0+aE5leHQgKTsKICAgICBpZiAoIWxwdGUtPmhOZXh0KSByZXR1cm4gRkFMU0U7CiAgICAgcFRhc2sgPSAoVERCICopR2xvYmFsTG9jazE2KCBscHRlLT5oTmV4dCApOwogICAgIGlmICghcFRhc2sgfHwgcFRhc2stPm1hZ2ljICE9IFREQl9NQUdJQykgcmV0dXJuIEZBTFNFOwpkaWZmIC0tZ2l0IGEvbWVtb3J5L2dsb2JhbC5jIGIvbWVtb3J5L2dsb2JhbC5jCmluZGV4IGFmMzNjZTAuLjk2MGUzZGEgMTAwNjQ0Ci0tLSBhL21lbW9yeS9nbG9iYWwuYworKysgYi9tZW1vcnkvZ2xvYmFsLmMKQEAgLTE4Niw3ICsxODYsNyBAQAogICAgIEhHTE9CQUwxNiBoYW5kbGU7CiAgICAgU0hNREFUQSBzaG1kYXRhOwogCi0gICAgZHByaW50Zl9pbmZvKGdsb2JhbCwgIkdsb2JhbEFsbG9jOiAlbGQgZmxhZ3M9JTA0eFxuIiwgc2l6ZSwgZmxhZ3MgKTsKKyAgICBUUkFDRShnbG9iYWwsICIlbGQgZmxhZ3M9JTA0eFxuIiwgc2l6ZSwgZmxhZ3MgKTsKIAogICAgIC8qIElmIHNpemUgaXMgMCwgY3JlYXRlIGEgZGlzY2FyZGVkIGJsb2NrICovCiAKQEAgLTI5Myw3ICsyOTMsNyBAQAogICAgIEdMT0JBTEFSRU5BICpwQXJlbmEsICpwTmV3QXJlbmE7CiAgICAgV09SRCBzZWwgPSBHbG9iYWxIYW5kbGVUb1NlbCggaGFuZGxlICk7CiAKLSAgICBkcHJpbnRmX2luZm8oZ2xvYmFsLCAiR2xvYmFsUmVBbGxvYzE2OiAlMDR4ICVsZCBmbGFncz0lMDR4XG4iLAorICAgIFRSQUNFKGdsb2JhbCwgIiUwNHggJWxkIGZsYWdzPSUwNHhcbiIsCiAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwgc2l6ZSwgZmxhZ3MgKTsKICAgICBpZiAoIWhhbmRsZSkgcmV0dXJuIDA7CiAgICAgCkBAIC0zNTAsNyArMzUwLDcgQEAKIAogICAgIHB0ciA9ICh2b2lkICopcEFyZW5hLT5iYXNlOwogICAgIG9sZHNpemUgPSBwQXJlbmEtPnNpemU7Ci0gICAgZHByaW50Zl9pbmZvKGdsb2JhbCwib2xkc2l6ZSAlMDhseFxuIixvbGRzaXplKTsKKyAgICBUUkFDRShnbG9iYWwsIm9sZHNpemUgJTA4bHhcbiIsb2xkc2l6ZSk7CiAgICAgaWYgKHB0ciAmJiAoc2l6ZSA9PSBvbGRzaXplKSkgcmV0dXJuIGhhbmRsZTsgIC8qIE5vdGhpbmcgdG8gZG8gKi8KIAogICAgIHB0ciA9IEhlYXBSZUFsbG9jKCBTeXN0ZW1IZWFwLCAwLCBwdHIsIHNpemUgKTsKQEAgLTQwOSw3ICs0MDksNyBAQAogICAgIH0KICAgICBwdHIgPSAodm9pZCAqKUdFVF9BUkVOQV9QVFIoaGFuZGxlKS0+YmFzZTsKIAotICAgIGRwcmludGZfaW5mbyhnbG9iYWwsICJHbG9iYWxGcmVlMTY6ICUwNHhcbiIsIGhhbmRsZSApOworICAgIFRSQUNFKGdsb2JhbCwgIiUwNHhcbiIsIGhhbmRsZSApOwogICAgIGlmICghR0xPQkFMX0ZyZWVCbG9jayggaGFuZGxlICkpIHJldHVybiBoYW5kbGU7ICAvKiBmYWlsZWQgKi8KICNpZmRlZiBDT05GSUdfSVBDCiAgICAgaWYgKGlzX2RkZV9oYW5kbGUoaGFuZGxlKSkgcmV0dXJuIERERV9HbG9iYWxGcmVlKGhhbmRsZSk7CkBAIC00MjYsNyArNDI2LDcgQEAKICAqLwogU0VHUFRSIFdJTkFQSSBXSU4xNl9HbG9iYWxMb2NrMTYoIEhHTE9CQUwxNiBoYW5kbGUgKQogewotICAgIGRwcmludGZfaW5mbyhnbG9iYWwsICJXSU4xNl9HbG9iYWxMb2NrMTYoJTA0eCkgLT4gJTA4bHhcbiIsCisgICAgVFJBQ0UoZ2xvYmFsLCAiKCUwNHgpIC0+ICUwOGx4XG4iLAogICAgICAgICAgICAgICAgICAgICBoYW5kbGUsIE1BS0VMT05HKCAwLCBHbG9iYWxIYW5kbGVUb1NlbChoYW5kbGUpKSApOwogICAgIGlmIChoYW5kbGUpCiAgICAgewpAQCAtNDc4LDcgKzQ3OCw3IEBACiAJZnByaW50ZihzdGRlcnIsIkludmFsaWQgaGFuZGxlIDB4JTA0eCBwYXNzZWQgdG8gR2xvYmFsVW5sb2NrMTYhXG4iLGhhbmRsZSk7CiAJcmV0dXJuIDA7CiAgICAgfQotICAgIGRwcmludGZfaW5mbyhnbG9iYWwsICJHbG9iYWxVbmxvY2sxNjogJTA0eFxuIiwgaGFuZGxlICk7CisgICAgVFJBQ0UoZ2xvYmFsLCAiJTA0eFxuIiwgaGFuZGxlICk7CiAgICAgaWYgKHBBcmVuYS0+bG9ja0NvdW50KSBwQXJlbmEtPmxvY2tDb3VudC0tOwogICAgIHJldHVybiBwQXJlbmEtPmxvY2tDb3VudDsKIH0KQEAgLTQ4OSw3ICs0ODksNyBAQAogICovCiBEV09SRCBXSU5BUEkgR2xvYmFsU2l6ZTE2KCBIR0xPQkFMMTYgaGFuZGxlICkKIHsKLSAgICBkcHJpbnRmX2luZm8oZ2xvYmFsLCAiR2xvYmFsU2l6ZTE2OiAlMDR4XG4iLCBoYW5kbGUgKTsKKyAgICBUUkFDRShnbG9iYWwsICIlMDR4XG4iLCBoYW5kbGUgKTsKICAgICBpZiAoIWhhbmRsZSkgcmV0dXJuIDA7CiAgICAgaWYgKCFWQUxJRF9IQU5ETEUoaGFuZGxlKSkKIAlyZXR1cm4gMDsKQEAgLTUwMiw3ICs1MDIsNyBAQAogICovCiBEV09SRCBXSU5BUEkgR2xvYmFsSGFuZGxlMTYoIFdPUkQgc2VsICkKIHsKLSAgICBkcHJpbnRmX2luZm8oZ2xvYmFsLCAiR2xvYmFsSGFuZGxlMTY6ICUwNHhcbiIsIHNlbCApOworICAgIFRSQUNFKGdsb2JhbCwgIiUwNHhcbiIsIHNlbCApOwogICAgIGlmICghVkFMSURfSEFORExFKHNlbCkpIHsKIAlmcHJpbnRmKHN0ZGVyciwiSW52YWxpZCBoYW5kbGUgMHglMDR4IHBhc3NlZCB0byBHbG9iYWxIYW5kbGUxNiFcbiIsc2VsKTsKIAlyZXR1cm4gMDsKQEAgLTUzMCw3ICs1MzAsNyBAQAogewogICAgIEdMT0JBTEFSRU5BICpwQXJlbmE7CiAKLSAgICBkcHJpbnRmX2luZm8oZ2xvYmFsLCAiR2xvYmFsRmxhZ3MxNjogJTA0eFxuIiwgaGFuZGxlICk7CisgICAgVFJBQ0UoZ2xvYmFsLCAiJTA0eFxuIiwgaGFuZGxlICk7CiAgICAgaWYgKCFWQUxJRF9IQU5ETEUoaGFuZGxlKSkgewogCWZwcmludGYoc3RkZXJyLCJJbnZhbGlkIGhhbmRsZSAweCUwNHggcGFzc2VkIHRvIEdsb2JhbEZsYWdzMTYhXG4iLGhhbmRsZSk7CiAJcmV0dXJuIDA7CkBAIC01NDcsNyArNTQ3LDcgQEAKICAqLwogSEdMT0JBTDE2IFdJTkFQSSBMb2NrU2VnbWVudDE2KCBIR0xPQkFMMTYgaGFuZGxlICkKIHsKLSAgICBkcHJpbnRmX2luZm8oZ2xvYmFsLCAiTG9ja1NlZ21lbnQ6ICUwNHhcbiIsIGhhbmRsZSApOworICAgIFRSQUNFKGdsb2JhbCwgIiUwNHhcbiIsIGhhbmRsZSApOwogICAgIGlmIChoYW5kbGUgPT0gKEhHTE9CQUwxNiktMSkgaGFuZGxlID0gQ1VSUkVOVF9EUzsKICAgICBpZiAoIVZBTElEX0hBTkRMRShoYW5kbGUpKSB7CiAJZnByaW50ZihzdGRlcnIsIkludmFsaWQgaGFuZGxlIDB4JTA0eCBwYXNzZWQgdG8gTG9ja1NlZ21lbnQxNiFcbiIsaGFuZGxlKTsKQEAgLTU2Myw3ICs1NjMsNyBAQAogICovCiB2b2lkIFdJTkFQSSBVbmxvY2tTZWdtZW50MTYoIEhHTE9CQUwxNiBoYW5kbGUgKQogewotICAgIGRwcmludGZfaW5mbyhnbG9iYWwsICJVbmxvY2tTZWdtZW50OiAlMDR4XG4iLCBoYW5kbGUgKTsKKyAgICBUUkFDRShnbG9iYWwsICIlMDR4XG4iLCBoYW5kbGUgKTsKICAgICBpZiAoaGFuZGxlID09IChIR0xPQkFMMTYpLTEpIGhhbmRsZSA9IENVUlJFTlRfRFM7CiAgICAgaWYgKCFWQUxJRF9IQU5ETEUoaGFuZGxlKSkgewogCWZwcmludGYoc3RkZXJyLCJJbnZhbGlkIGhhbmRsZSAweCUwNHggcGFzc2VkIHRvIFVubG9ja1NlZ21lbnQxNiFcbiIsaGFuZGxlKTsKQEAgLTYyMyw3ICs2MjMsNyBAQAogICovCiBMT05HIFdJTkFQSSBTZXRTd2FwQXJlYVNpemUxNiggV09SRCBzaXplICkKIHsKLSAgICBkcHJpbnRmX2ZpeG1lKGdsb2JhbCwgIlNUVUI6IFNldFN3YXBBcmVhU2l6ZSglZClcbiIsIHNpemUgKTsKKyAgICBGSVhNRShnbG9iYWwsICIoJWQpIC0gc3R1YiFcbiIsIHNpemUgKTsKICAgICByZXR1cm4gTUFLRUxPTkcoIHNpemUsIDB4ZmZmZiApOwogfQogCkBAIC02MzMsNyArNjMzLDcgQEAKICAqLwogSEdMT0JBTDE2IFdJTkFQSSBHbG9iYWxMUlVPbGRlc3QoIEhHTE9CQUwxNiBoYW5kbGUgKQogewotICAgIGRwcmludGZfaW5mbyhnbG9iYWwsICJHbG9iYWxMUlVPbGRlc3Q6ICUwNHhcbiIsIGhhbmRsZSApOworICAgIFRSQUNFKGdsb2JhbCwgIiUwNHhcbiIsIGhhbmRsZSApOwogICAgIGlmIChoYW5kbGUgPT0gKEhHTE9CQUwxNiktMSkgaGFuZGxlID0gQ1VSUkVOVF9EUzsKICAgICByZXR1cm4gaGFuZGxlOwogfQpAQCAtNjQ0LDcgKzY0NCw3IEBACiAgKi8KIEhHTE9CQUwxNiBXSU5BUEkgR2xvYmFsTFJVTmV3ZXN0KCBIR0xPQkFMMTYgaGFuZGxlICkKIHsKLSAgICBkcHJpbnRmX2luZm8oZ2xvYmFsLCAiR2xvYmFsTFJVTmV3ZXN0OiAlMDR4XG4iLCBoYW5kbGUgKTsKKyAgICBUUkFDRShnbG9iYWwsICIlMDR4XG4iLCBoYW5kbGUgKTsKICAgICBpZiAoaGFuZGxlID09IChIR0xPQkFMMTYpLTEpIGhhbmRsZSA9IENVUlJFTlRfRFM7CiAgICAgcmV0dXJuIGhhbmRsZTsKIH0KQEAgLTcwMiw3ICs3MDIsNyBAQAogICovCiBXT1JEIFdJTkFQSSBHbG9iYWxQYWdlTG9jayggSEdMT0JBTDE2IGhhbmRsZSApCiB7Ci0gICAgZHByaW50Zl9pbmZvKGdsb2JhbCwgIkdsb2JhbFBhZ2VMb2NrOiAlMDR4XG4iLCBoYW5kbGUgKTsKKyAgICBUUkFDRShnbG9iYWwsICIlMDR4XG4iLCBoYW5kbGUgKTsKICAgICBpZiAoIVZBTElEX0hBTkRMRShoYW5kbGUpKSB7CiAJZnByaW50ZihzdGRlcnIsIkludmFsaWQgaGFuZGxlIDB4JTA0eCBwYXNzZWQgdG8gR2xvYmFsUGFnZUxvY2shXG4iLGhhbmRsZSk7CiAJcmV0dXJuIDA7CkBAIC03MTYsNyArNzE2LDcgQEAKICAqLwogV09SRCBXSU5BUEkgR2xvYmFsUGFnZVVubG9jayggSEdMT0JBTDE2IGhhbmRsZSApCiB7Ci0gICAgZHByaW50Zl9pbmZvKGdsb2JhbCwgIkdsb2JhbFBhZ2VVbmxvY2s6ICUwNHhcbiIsIGhhbmRsZSApOworICAgIFRSQUNFKGdsb2JhbCwgIiUwNHhcbiIsIGhhbmRsZSApOwogICAgIGlmICghVkFMSURfSEFORExFKGhhbmRsZSkpIHsKIAlmcHJpbnRmKHN0ZGVyciwiSW52YWxpZCBoYW5kbGUgMHglMDR4IHBhc3NlZCB0byBHbG9iYWxQYWdlVW5sb2NrIVxuIixoYW5kbGUpOwogCXJldHVybiAwOwpAQCAtNzMwLDcgKzczMCw3IEBACiAgKi8KIHZvaWQgV0lOQVBJIEdsb2JhbEZpeDE2KCBIR0xPQkFMMTYgaGFuZGxlICkKIHsKLSAgICBkcHJpbnRmX2luZm8oZ2xvYmFsLCAiR2xvYmFsRml4MTY6ICUwNHhcbiIsIGhhbmRsZSApOworICAgIFRSQUNFKGdsb2JhbCwgIiUwNHhcbiIsIGhhbmRsZSApOwogICAgIGlmICghVkFMSURfSEFORExFKGhhbmRsZSkpIHsKIAlmcHJpbnRmKHN0ZGVyciwiSW52YWxpZCBoYW5kbGUgMHglMDR4IHBhc3NlZCB0byBHbG9iYWxGaXgxNiFcbiIsaGFuZGxlKTsKIAlyZXR1cm47CkBAIC03NDQsNyArNzQ0LDcgQEAKICAqLwogdm9pZCBXSU5BUEkgR2xvYmFsVW5maXgxNiggSEdMT0JBTDE2IGhhbmRsZSApCiB7Ci0gICAgZHByaW50Zl9pbmZvKGdsb2JhbCwgIkdsb2JhbFVuZml4MTY6ICUwNHhcbiIsIGhhbmRsZSApOworICAgIFRSQUNFKGdsb2JhbCwgIiUwNHhcbiIsIGhhbmRsZSApOwogICAgIGlmICghVkFMSURfSEFORExFKGhhbmRsZSkpIHsKIAlmcHJpbnRmKHN0ZGVyciwiSW52YWxpZCBoYW5kbGUgMHglMDR4IHBhc3NlZCB0byBHbG9iYWxVbmZpeDE2IVxuIixoYW5kbGUpOwogCXJldHVybjsKQEAgLTc4NCw3ICs3ODQsNyBAQAogICovCiBXT1JEIFdJTkFQSSBHbG9iYWxIYW5kbGVUb1NlbCggSEdMT0JBTDE2IGhhbmRsZSApCiB7Ci0gICAgZHByaW50Zl9pbmZvKHRvb2xoZWxwLCAiR2xvYmFsSGFuZGxlVG9TZWw6ICUwNHhcbiIsIGhhbmRsZSApOworICAgIFRSQUNFKHRvb2xoZWxwLCAiJTA0eFxuIiwgaGFuZGxlICk7CiAgICAgaWYgKCFoYW5kbGUpIHJldHVybiAwOwogI2lmZGVmIENPTkZJR19JUEMKICAgICBpZiAoaXNfZGRlX2hhbmRsZShoYW5kbGUpKSByZXR1cm4gRERFX0dsb2JhbEhhbmRsZVRvU2VsKGhhbmRsZSk7CkBAIC0xMDI5LDcgKzEwMjksNyBAQAogICAgfQogICAgZWxzZQogICAgewotICAgICAgZHByaW50Zl93YXJuKGdsb2JhbCwgIkdsb2JhbExvY2szMjogaW52YWxpZCBoYW5kbGVcbiIpOworICAgICAgV0FSTihnbG9iYWwsICJpbnZhbGlkIGhhbmRsZVxuIik7CiAgICAgICBwYWxsb2M9KExQVk9JRCkgTlVMTDsKICAgIH0KICAgIC8qIEhlYXBVbmxvY2soR2V0UHJvY2Vzc0hlYXAoKSk7ICovOwpAQCAtMTA2MCw3ICsxMDYwLDcgQEAKICAgIH0KICAgIGVsc2UKICAgIHsKLSAgICAgIGRwcmludGZfd2FybihnbG9iYWwsICJHbG9iYWxVbmxvY2szMjogaW52YWxpZCBoYW5kbGVcbiIpOworICAgICAgV0FSTihnbG9iYWwsICJpbnZhbGlkIGhhbmRsZVxuIik7CiAgICAgICBsb2NrZWQ9RkFMU0U7CiAgICB9CiAgICAvKiBIZWFwVW5sb2NrKEdldFByb2Nlc3NIZWFwKCkpOyAqLwpAQCAtMTIzMyw3ICsxMjMzLDcgQEAKICAgICAgIH0KICAgICAgIGVsc2UKICAgICAgIHsKLQkgZHByaW50Zl93YXJuKGdsb2JhbCwgIkdsb2JhbFNpemUzMjogaW52YWxpZCBoYW5kbGVcbiIpOworCSBXQVJOKGdsb2JhbCwgImludmFsaWQgaGFuZGxlXG4iKTsKIAkgcmV0dmFsPTA7CiAgICAgICB9CiAgICAgICAvKiBIZWFwVW5sb2NrKEdldFByb2Nlc3NIZWFwKCkpOyAqLwpAQCAtMTMwMiw3ICsxMzAyLDcgQEAKICAgICAgIH0KICAgICAgIGVsc2UKICAgICAgIHsKLQkgZHByaW50Zl93YXJuKGdsb2JhbCwiR2xvYmFsRmxhZ3MzMjogaW52YWxpZCBoYW5kbGVcbiIpOworCSBXQVJOKGdsb2JhbCwiaW52YWxpZCBoYW5kbGVcbiIpOwogCSByZXR2YWw9MDsKICAgICAgIH0KICAgICAgIC8qIEhlYXBVbmxvY2soR2V0UHJvY2Vzc0hlYXAoKSk7ICovCmRpZmYgLS1naXQgYS9tZW1vcnkvaGVhcC5jIGIvbWVtb3J5L2hlYXAuYwppbmRleCA2NDk5MTcyLi5lNjU3ZDM4IDEwMDY0NAotLS0gYS9tZW1vcnkvaGVhcC5jCisrKyBiL21lbW9yeS9oZWFwLmMKQEAgLTE4OCw3ICsxODgsNyBAQAogICAgICAgICBTZXRMYXN0RXJyb3IoIEVSUk9SX0lOVkFMSURfSEFORExFICk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBpZiAoZGVidWdnaW5nX2luZm8oaGVhcCkgJiYgIUhlYXBWYWxpZGF0ZSggaGVhcCwgMCwgTlVMTCApKQorICAgIGlmIChUUkFDRV9PTihoZWFwKSAmJiAhSGVhcFZhbGlkYXRlKCBoZWFwLCAwLCBOVUxMICkpCiAgICAgewogICAgICAgICBIRUFQX0R1bXAoIGhlYXBQdHIgKTsKICAgICAgICAgYXNzZXJ0KCBGQUxTRSApOwpAQCAtMzAyLDcgKzMwMiw3IEBACiAKICAgICAvKiBJZiBkZWJ1Z2dpbmcsIGVyYXNlIHRoZSBmcmVlZCBibG9jayBjb250ZW50ICovCiAKLSAgICBpZiAoZGVidWdnaW5nX2luZm8oaGVhcCkpCisgICAgaWYgKFRSQUNFX09OKGhlYXApKQogICAgIHsKICAgICAgICAgY2hhciAqcEVuZCA9IChjaGFyICopcHRyICsgc2l6ZTsKICAgICAgICAgaWYgKHBFbmQgPiAoY2hhciAqKXN1YmhlYXAgKyBzdWJoZWFwLT5jb21taXRTaXplKQpAQCAtMzIxLDcgKzMyMSw3IEBACiAgICAgICAgIHBOZXh0LT5uZXh0LT5wcmV2ID0gcE5leHQtPnByZXY7CiAgICAgICAgIHBOZXh0LT5wcmV2LT5uZXh0ID0gcE5leHQtPm5leHQ7CiAgICAgICAgIHNpemUgKz0gKHBOZXh0LT5zaXplICYgQVJFTkFfU0laRV9NQVNLKSArIHNpemVvZigqcE5leHQpOwotICAgICAgICBpZiAoZGVidWdnaW5nX2luZm8oaGVhcCkpCisgICAgICAgIGlmIChUUkFDRV9PTihoZWFwKSkKICAgICAgICAgICAgIG1lbXNldCggcE5leHQsIEFSRU5BX0ZSRUVfRklMTEVSLCBzaXplb2YoQVJFTkFfRlJFRSkgKTsKICAgICB9CiAKQEAgLTU0MCw3ICs1NDAsNyBAQAogICAgIHN1YmhlYXAtPm5leHQgPSBoZWFwLT5zdWJoZWFwLm5leHQ7CiAgICAgaGVhcC0+c3ViaGVhcC5uZXh0ID0gc3ViaGVhcDsKICAgICBzaXplID0gc3ViaGVhcC0+c2l6ZTsKLSAgICBkcHJpbnRmX2luZm8oaGVhcCwgIkhFQVBfRmluZEZyZWVCbG9jazogY3JlYXRlZCBuZXcgc3ViLWhlYXAgJTA4bHggb2YgJTA4bHggYnl0ZXMgZm9yIGhlYXAgJTA4bHhcbiIsCisgICAgVFJBQ0UoaGVhcCwgImNyZWF0ZWQgbmV3IHN1Yi1oZWFwICUwOGx4IG9mICUwOGx4IGJ5dGVzIGZvciBoZWFwICUwOGx4XG4iLAogICAgICAgICAgICAgICAgICAgKERXT1JEKXN1YmhlYXAsIHNpemUsIChEV09SRCloZWFwICk7CiAKICAgICBIRUFQX0NyZWF0ZUZyZWVCbG9jayggc3ViaGVhcCwgc3ViaGVhcCArIDEsIHNpemUgLSBzaXplb2YoKnN1YmhlYXApICk7CkBAIC04NTAsNyArODUwLDcgQEAKICAgICBIRUFQICpoZWFwUHRyID0gSEVBUF9HZXRQdHIoIGhlYXAgKTsKICAgICBTVUJIRUFQICpzdWJoZWFwOwogCi0gICAgZHByaW50Zl9pbmZvKGhlYXAsICJIZWFwRGVzdHJveTogJTA4eFxuIiwgaGVhcCApOworICAgIFRSQUNFKGhlYXAsICIlMDh4XG4iLCBoZWFwICk7CiAgICAgaWYgKCFoZWFwUHRyKSByZXR1cm4gRkFMU0U7CiAKICAgICBEZWxldGVDcml0aWNhbFNlY3Rpb24oICZoZWFwUHRyLT5jcml0U2VjdGlvbiApOwpAQCAtODg5LDcgKzg4OSw3IEBACiAKICAgICBpZiAoIShwQXJlbmEgPSBIRUFQX0ZpbmRGcmVlQmxvY2soIGhlYXBQdHIsIHNpemUsICZzdWJoZWFwICkpKQogICAgIHsKLSAgICAgICAgZHByaW50Zl9pbmZvKGhlYXAsICJIZWFwQWxsb2MoJTA4eCwlMDhseCwlMDhseCk6IHJldHVybmluZyBOVUxMXG4iLAorICAgICAgICBUUkFDRShoZWFwLCAiKCUwOHgsJTA4bHgsJTA4bHgpOiByZXR1cm5pbmcgTlVMTFxuIiwKICAgICAgICAgICAgICAgICAgIGhlYXAsIGZsYWdzLCBzaXplICApOwogICAgICAgICBpZiAoIShmbGFncyAmIEhFQVBfTk9fU0VSSUFMSVpFKSkgSGVhcFVubG9jayggaGVhcCApOwogICAgICAgICBTZXRMYXN0RXJyb3IoIEVSUk9SX0NPTU1JVE1FTlRfTElNSVQgKTsKQEAgLTkxNSwxMSArOTE1LDExIEBACiAgICAgSEVBUF9TaHJpbmtCbG9jayggc3ViaGVhcCwgcEluVXNlLCBzaXplICk7CiAKICAgICBpZiAoZmxhZ3MgJiBIRUFQX1pFUk9fTUVNT1JZKSBtZW1zZXQoIHBJblVzZSArIDEsIDAsIHNpemUgKTsKLSAgICBlbHNlIGlmIChkZWJ1Z2dpbmdfaW5mbyhoZWFwKSkgbWVtc2V0KCBwSW5Vc2UgKyAxLCBBUkVOQV9JTlVTRV9GSUxMRVIsIHNpemUgKTsKKyAgICBlbHNlIGlmIChUUkFDRV9PTihoZWFwKSkgbWVtc2V0KCBwSW5Vc2UgKyAxLCBBUkVOQV9JTlVTRV9GSUxMRVIsIHNpemUgKTsKIAogICAgIGlmICghKGZsYWdzICYgSEVBUF9OT19TRVJJQUxJWkUpKSBIZWFwVW5sb2NrKCBoZWFwICk7CiAKLSAgICBkcHJpbnRmX2luZm8oaGVhcCwgIkhlYXBBbGxvYyglMDh4LCUwOGx4LCUwOGx4KTogcmV0dXJuaW5nICUwOGx4XG4iLAorICAgIFRSQUNFKGhlYXAsICIoJTA4eCwlMDhseCwlMDhseCk6IHJldHVybmluZyAlMDhseFxuIiwKICAgICAgICAgICAgICAgICAgIGhlYXAsIGZsYWdzLCBzaXplLCAoRFdPUkQpKHBJblVzZSArIDEpICk7CiAgICAgcmV0dXJuIChMUFZPSUQpKHBJblVzZSArIDEpOwogfQpAQCAtOTQ0LDcgKzk0NCw3IEBACiAgICAgewogICAgICAgICBpZiAoIShmbGFncyAmIEhFQVBfTk9fU0VSSUFMSVpFKSkgSGVhcFVubG9jayggaGVhcCApOwogICAgICAgICBTZXRMYXN0RXJyb3IoIEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSICk7Ci0gICAgICAgIGRwcmludGZfaW5mbyhoZWFwLCAiSGVhcEZyZWUoJTA4eCwlMDhseCwlMDhseCk6IHJldHVybmluZyBGQUxTRVxuIiwKKyAgICAgICAgVFJBQ0UoaGVhcCwgIiglMDh4LCUwOGx4LCUwOGx4KTogcmV0dXJuaW5nIEZBTFNFXG4iLAogICAgICAgICAgICAgICAgICAgICAgIGhlYXAsIGZsYWdzLCAoRFdPUkQpcHRyICk7CiAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CkBAIC05NTgsNyArOTU4LDcgQEAKICAgICBpZiAoIShmbGFncyAmIEhFQVBfTk9fU0VSSUFMSVpFKSkgSGVhcFVubG9jayggaGVhcCApOwogLyogICAgU2V0TGFzdEVycm9yKCAwICk7ICovCiAKLSAgICBkcHJpbnRmX2luZm8oaGVhcCwgIkhlYXBGcmVlKCUwOHgsJTA4bHgsJTA4bHgpOiByZXR1cm5pbmcgVFJVRVxuIiwKKyAgICBUUkFDRShoZWFwLCAiKCUwOHgsJTA4bHgsJTA4bHgpOiByZXR1cm5pbmcgVFJVRVxuIiwKICAgICAgICAgICAgICAgICAgIGhlYXAsIGZsYWdzLCAoRFdPUkQpcHRyICk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CkBAIC05OTAsNyArOTkwLDcgQEAKICAgICB7CiAgICAgICAgIGlmICghKGZsYWdzICYgSEVBUF9OT19TRVJJQUxJWkUpKSBIZWFwVW5sb2NrKCBoZWFwICk7CiAgICAgICAgIFNldExhc3RFcnJvciggRVJST1JfSU5WQUxJRF9QQVJBTUVURVIgKTsKLSAgICAgICAgZHByaW50Zl9pbmZvKGhlYXAsICJIZWFwUmVBbGxvYyglMDh4LCUwOGx4LCUwOGx4LCUwOGx4KTogcmV0dXJuaW5nIE5VTExcbiIsCisgICAgICAgIFRSQUNFKGhlYXAsICIoJTA4eCwlMDhseCwlMDhseCwlMDhseCk6IHJldHVybmluZyBOVUxMXG4iLAogICAgICAgICAgICAgICAgICAgICAgIGhlYXAsIGZsYWdzLCAoRFdPUkQpcHRyLCBzaXplICk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTEwNjQsNyArMTA2NCw3IEBACiAgICAgICAgIGlmIChmbGFncyAmIEhFQVBfWkVST19NRU1PUlkpCiAgICAgICAgICAgICBtZW1zZXQoIChjaGFyICopKHBBcmVuYSArIDEpICsgb2xkU2l6ZSwgMCwKICAgICAgICAgICAgICAgICAgICAgKHBBcmVuYS0+c2l6ZSAmIEFSRU5BX1NJWkVfTUFTSykgLSBvbGRTaXplICk7Ci0gICAgICAgIGVsc2UgaWYgKGRlYnVnZ2luZ19pbmZvKGhlYXApKQorICAgICAgICBlbHNlIGlmIChUUkFDRV9PTihoZWFwKSkKICAgICAgICAgICAgIG1lbXNldCggKGNoYXIgKikocEFyZW5hICsgMSkgKyBvbGRTaXplLCBBUkVOQV9JTlVTRV9GSUxMRVIsCiAgICAgICAgICAgICAgICAgICAgIChwQXJlbmEtPnNpemUgJiBBUkVOQV9TSVpFX01BU0spIC0gb2xkU2l6ZSApOwogICAgIH0KQEAgLTEwNzQsNyArMTA3NCw3IEBACiAgICAgcEFyZW5hLT5jYWxsZXJFSVAgPSAqKChEV09SRCAqKSZoZWFwIC0gMSk7ICAvKiBoYWNrIGhhY2sgKi8KICAgICBpZiAoIShmbGFncyAmIEhFQVBfTk9fU0VSSUFMSVpFKSkgSGVhcFVubG9jayggaGVhcCApOwogCi0gICAgZHByaW50Zl9pbmZvKGhlYXAsICJIZWFwUmVBbGxvYyglMDh4LCUwOGx4LCUwOGx4LCUwOGx4KTogcmV0dXJuaW5nICUwOGx4XG4iLAorICAgIFRSQUNFKGhlYXAsICIoJTA4eCwlMDhseCwlMDhseCwlMDhseCk6IHJldHVybmluZyAlMDhseFxuIiwKICAgICAgICAgICAgICAgICAgIGhlYXAsIGZsYWdzLCAoRFdPUkQpcHRyLCBzaXplLCAoRFdPUkQpKHBBcmVuYSArIDEpICk7CiAgICAgcmV0dXJuIChMUFZPSUQpKHBBcmVuYSArIDEpOwogfQpAQCAtMTEzNyw3ICsxMTM3LDcgQEAKICAgICB9CiAgICAgaWYgKCEoZmxhZ3MgJiBIRUFQX05PX1NFUklBTElaRSkpIEhlYXBVbmxvY2soIGhlYXAgKTsKIAotICAgIGRwcmludGZfaW5mbyhoZWFwLCAiSGVhcFNpemUoJTA4eCwlMDhseCwlMDhseCk6IHJldHVybmluZyAlMDhseFxuIiwKKyAgICBUUkFDRShoZWFwLCAiKCUwOHgsJTA4bHgsJTA4bHgpOiByZXR1cm5pbmcgJTA4bHhcbiIsCiAgICAgICAgICAgICAgICAgICBoZWFwLCBmbGFncywgKERXT1JEKXB0ciwgcmV0ICk7CiAgICAgcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL21lbW9yeS9sZHQuYyBiL21lbW9yeS9sZHQuYwppbmRleCA1NWEyODc1Li42NGI4ZGQ2IDEwMDY0NAotLS0gYS9tZW1vcnkvbGR0LmMKKysrIGIvbWVtb3J5L2xkdC5jCkBAIC0xNDcsMTUgKzE0NywxNCBAQAogewogICAgIGludCByZXQgPSAwOwogCi0gICAgZHByaW50Zl9pbmZvKGxkdCwKLQkgICJMRFRfU2V0RW50cnk6IGVudHJ5PSUwNHggYmFzZT0lMDhseCBsaW1pdD0lMDVseCAlcyAlZC1iaXQgZmxhZ3M9JWMlYyVjXG4iLAotICAgICAgICAgIGVudHJ5LCBjb250ZW50LT5iYXNlLCBjb250ZW50LT5saW1pdCwKLSAgICAgICAgICBjb250ZW50LT5saW1pdF9pbl9wYWdlcyA/ICJwYWdlcyIgOiAiYnl0ZXMiLAotICAgICAgICAgIGNvbnRlbnQtPnNlZ18zMmJpdCA/IDMyIDogMTYsCi0gICAgICAgICAgY29udGVudC0+cmVhZF9vbmx5ICYmIChjb250ZW50LT50eXBlICYgU0VHTUVOVF9DT0RFKSA/ICctJyA6ICdyJywKLSAgICAgICAgICBjb250ZW50LT5yZWFkX29ubHkgfHwgKGNvbnRlbnQtPnR5cGUgJiBTRUdNRU5UX0NPREUpID8gJy0nIDogJ3cnLAotICAgICAgICAgIChjb250ZW50LT50eXBlICYgU0VHTUVOVF9DT0RFKSA/ICd4JyA6ICctJyApOwotCisgICAgVFJBQ0UobGR0LCAiZW50cnk9JTA0eCBiYXNlPSUwOGx4IGxpbWl0PSUwNWx4ICVzICVkLWJpdCAiCisJCSAiZmxhZ3M9JWMlYyVjXG4iLCBlbnRyeSwgY29udGVudC0+YmFzZSwgY29udGVudC0+bGltaXQsCisJCSBjb250ZW50LT5saW1pdF9pbl9wYWdlcyA/ICJwYWdlcyIgOiAiYnl0ZXMiLAorCQkgY29udGVudC0+c2VnXzMyYml0ID8gMzIgOiAxNiwKKwkJIGNvbnRlbnQtPnJlYWRfb25seSAmJiAoY29udGVudC0+dHlwZSAmIFNFR01FTlRfQ09ERSkgPyAnLScgOiAncicsCisJCSBjb250ZW50LT5yZWFkX29ubHkgfHwgKGNvbnRlbnQtPnR5cGUgJiBTRUdNRU5UX0NPREUpID8gJy0nIDogJ3cnLAorCQkgKGNvbnRlbnQtPnR5cGUgJiBTRUdNRU5UX0NPREUpID8gJ3gnIDogJy0nICk7CisgICAgCiAgICAgLyogRW50cnkgMCBtdXN0IG5vdCBiZSBtb2RpZmllZDsgaXRzIGJhc2UgYW5kIGxpbWl0IGFyZSBhbHdheXMgMCAqLwogICAgIGlmICghZW50cnkpIHJldHVybiAwOwogCmRpZmYgLS1naXQgYS9tZW1vcnkvbG9jYWwuYyBiL21lbW9yeS9sb2NhbC5jCmluZGV4IDJlYmNhMzAuLjQ3OWQzODIgMTAwNjQ0Ci0tLSBhL21lbW9yeS9sb2NhbC5jCisrKyBiL21lbW9yeS9sb2NhbC5jCkBAIC0xMjUsNyArMTI1LDcgQEAKIHsKICAgICBMT0NBTEhFQVBJTkZPICpwSW5mbzsKICAgICBJTlNUQU5DRURBVEEgKnB0ciA9IChJTlNUQU5DRURBVEEgKilQVFJfU0VHX09GRl9UT19MSU4oIGRzLCAwICk7Ci0gICAgZHByaW50Zl9pbmZvKGxvY2FsLCAiSGVhcCBhdCAlcCwgJTA0eFxuIiwgcHRyLCBwdHItPmhlYXAgKTsKKyAgICBUUkFDRShsb2NhbCwgIkhlYXAgYXQgJXAsICUwNHhcbiIsIHB0ciwgcHRyLT5oZWFwICk7CiAgICAgaWYgKCFwdHIgfHwgIXB0ci0+aGVhcCkgcmV0dXJuIE5VTEw7CiAgICAgaWYgKElzQmFkUmVhZFB0cjE2KCAoU0VHUFRSKU1BS0VMT05HKHB0ci0+aGVhcCxkcyksIHNpemVvZihMT0NBTEhFQVBJTkZPKSkpCiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMTYzLDcgKzE2Myw3IEBACiAgICAgICAgIG5leHQgPSBwTmV4dC0+bmV4dDsKICAgICB9CiAKLSAgICBkcHJpbnRmX2luZm8obG9jYWwsICJMb2NhbF9NYWtlQmxvY2tGcmVlICUwNHgsIG5leHQgJTA0eFxuIiwgYmxvY2ssIG5leHQgKTsKKyAgICBUUkFDRShsb2NhbCwgIkxvY2FsX01ha2VCbG9ja0ZyZWUgJTA0eCwgbmV4dCAlMDR4XG4iLCBibG9jaywgbmV4dCApOwogICAgICAgLyogSW5zZXJ0IHRoZSBmcmVlIGJsb2NrIGluIHRoZSBmcmVlLWxpc3QgKi8KIAogICAgIHBBcmVuYS0+ZnJlZV9wcmV2ID0gcE5leHQtPmZyZWVfcHJldjsKQEAgLTIyOCw3ICsyMjgsNyBAQAogCiAgICAgICAvKiBSZW1vdmUgdGhlIGJsb2NrIGZyb20gdGhlIGZyZWUtbGlzdCAqLwogCi0gICAgZHByaW50Zl9pbmZvKGxvY2FsLCAiTG9jYWxfUmVtb3ZlQmxvY2tcbiIpOworICAgIFRSQUNFKGxvY2FsLCAiTG9jYWxfUmVtb3ZlQmxvY2tcbiIpOwogICAgIHBBcmVuYSA9IEFSRU5BX1BUUiggYmFzZXB0ciwgYmxvY2sgKTsKICAgICBpZiAoKHBBcmVuYS0+cHJldiAmIDMpID09IExPQ0FMX0FSRU5BX0ZSRUUpCiAgICAgICAgIExPQ0FMX1JlbW92ZUZyZWVCbG9jayggYmFzZXB0ciwgYmxvY2sgKTsKQEAgLTI1OCw4ICsyNTgsOCBAQAogCiAgICAgLyogRklYTUUgLSB0aGUgdGVzdCBzaG91bGQgYmUgZG9uZSB3aGVuIGNhbGxpbmcgdGhlIGZ1bmN0aW9uISAKICAgICAgICAgICAgICAgIHBsdXMgaXMgbm90IGNsZWFyIHRoYXQgd2Ugc2hvdWxkIHByaW50IHRoaXMgaW5mbwotICAgICAgICAgICAgICAgb25seSB3aGVuIGRlYnVnZ2luZ19pbmZvIGlzIG9uISAqLwotICAgIGlmKCFkZWJ1Z2dpbmdfaW5mbyhsb2NhbCkpIHJldHVybjsKKyAgICAgICAgICAgICAgIG9ubHkgd2hlbiBUUkFDRV9PTiBpcyBvbiEgKi8KKyAgICBpZighVFJBQ0VfT04obG9jYWwpKSByZXR1cm47CiAKICAgICBwdHIgPSBQVFJfU0VHX09GRl9UT19MSU4oIGRzLCAwICk7CiAgICAgcEluZm8gPSBMT0NBTF9HZXRIZWFwKCBkcyApOwpAQCAtMzI3LDEyICszMjcsMTIgQEAKICAgICAgIC8qIC0gbGFyZ2UgZnJlZSBibG9jayAgICAoRlJFRSkgICAgICAgKi8KICAgICAgIC8qIC0gbGFzdCBhcmVuYSAgICAgICAgICAoRlJFRSkgICAgICAgKi8KIAotICAgIGRwcmludGZfaW5mbyhsb2NhbCwgIkxvY2FsSW5pdDogJTA0eCAlMDR4LSUwNHhcbiIsIHNlbGVjdG9yLCBzdGFydCwgZW5kKTsKKyAgICBUUkFDRShsb2NhbCwgIiUwNHggJTA0eC0lMDR4XG4iLCBzZWxlY3Rvciwgc3RhcnQsIGVuZCk7CiAgICAgaWYgKCFzZWxlY3Rvcikgc2VsZWN0b3IgPSBDVVJSRU5UX0RTOwogCi0gICAgaWYgKGRlYnVnZ2luZ19pbmZvKGhlYXApKQorICAgIGlmIChUUkFDRV9PTihoZWFwKSkKICAgICB7Ci0gICAgICAgIC8qIElmIGRlYnVnZ2luZ19pbmZvKGhlYXApIGlzIHNldCwgdGhlIGdsb2JhbCBoZWFwIGJsb2NrcyBhcmUgKi8KKyAgICAgICAgLyogSWYgVFJBQ0VfT04oaGVhcCkgaXMgc2V0LCB0aGUgZ2xvYmFsIGhlYXAgYmxvY2tzIGFyZSAqLwogICAgICAgICAvKiBjbGVhcmVkIGJlZm9yZSB1c2UsIHNvIHdlIGNhbiB0ZXN0IGZvciBkb3VibGUgaW5pdGlhbGl6YXRpb24uICovCiAgICAgICAgIGlmIChMT0NBTF9HZXRIZWFwKHNlbGVjdG9yKSkKICAgICAgICAgewpAQCAtMzU1LDcgKzM1NSw3IEBACiAJCXN0YXJ0ID0gR2xvYmFsU2l6ZTE2KCBHbG9iYWxIYW5kbGUxNiggc2VsZWN0b3IgKSApOwogCQlzdGFydCAtPSBlbmQ7CiAJCWVuZCArPSBzdGFydDsKLQkJZHByaW50Zl9pbmZvKGxvY2FsLCIgbmV3IHN0YXJ0ICUwNHgsIG1pbnN0YXJ0OiAlMDR4XG4iLCBzdGFydCwgcFNlZy0+bWluc2l6ZSArIHBNb2R1bGUtPnN0YWNrX3NpemUpOworCQlUUkFDRShsb2NhbCwiIG5ldyBzdGFydCAlMDR4LCBtaW5zdGFydDogJTA0eFxuIiwgc3RhcnQsIHBTZWctPm1pbnNpemUgKyBwTW9kdWxlLT5zdGFja19zaXplKTsKIAkgICAgfQogCX0KICAgICB9CkBAIC00NzcsNyArNDc3LDcgQEAKICAgICAgICAgcEhlYXBJbmZvLT5pdGVtcy0tOwogICAgIH0KIAotICAgIGRwcmludGZfaW5mbyhsb2NhbCwgIkhlYXAgZXhwYW5kZWRcbiIgKTsKKyAgICBUUkFDRShsb2NhbCwgIkhlYXAgZXhwYW5kZWRcbiIgKTsKICAgICBMT0NBTF9QcmludEhlYXAoIGRzICk7CiB9CiAKQEAgLTQ5MSw3ICs0OTEsNyBAQAogICAgIExPQ0FMSEVBUElORk8gKnBJbmZvOwogICAgIExPQ0FMQVJFTkEgKnBBcmVuYSwgKnBQcmV2LCAqcE5leHQ7CiAKLSAgICBkcHJpbnRmX2luZm8obG9jYWwsICJMb2NhbEZyZWVBcmVuYTogJTA0eCBkcz0lMDR4XG4iLCBhcmVuYSwgZHMgKTsKKyAgICBUUkFDRShsb2NhbCwgIiUwNHggZHM9JTA0eFxuIiwgYXJlbmEsIGRzICk7CiAgICAgaWYgKCEocEluZm8gPSBMT0NBTF9HZXRIZWFwKCBkcyApKSkgcmV0dXJuIGFyZW5hOwogCiAgICAgcEFyZW5hID0gQVJFTkFfUFRSKCBwdHIsIGFyZW5hICk7CkBAIC02NjAsMTYgKzY2MCwxNSBAQAogICAgICAgICBMT0NBTF9QcmludEhlYXAoZHMpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgZHByaW50Zl9pbmZvKGxvY2FsLAotICAgICAgICAgICAgICAgICAgIkxPQ0FMX0NvbXBhY3Q6IGRzID0gJTA0eCwgbWluZnJlZSA9ICUwNHgsIGZsYWdzID0gJTA0eFxuIiwKLSAgICAgICAgICAgICAgICAgIGRzLCBtaW5mcmVlLCBmbGFncyk7CisgICAgVFJBQ0UobG9jYWwsICJkcyA9ICUwNHgsIG1pbmZyZWUgPSAlMDR4LCBmbGFncyA9ICUwNHhcbiIsCisJCSBkcywgbWluZnJlZSwgZmxhZ3MpOwogICAgIGZyZWVzcGFjZSA9IExPQ0FMX0dldEZyZWVTcGFjZShkcywgbWluZnJlZSA/IDAgOiAxKTsKICAgICBpZihmcmVlc3BhY2UgPj0gbWluZnJlZSB8fCAoZmxhZ3MgJiBMTUVNX05PQ09NUEFDVCkpCiAgICAgewotICAgICAgICBkcHJpbnRmX2luZm8obG9jYWwsICJSZXR1cm5pbmcgJTA0eC5cbiIsIGZyZWVzcGFjZSk7CisgICAgICAgIFRSQUNFKGxvY2FsLCAiUmV0dXJuaW5nICUwNHguXG4iLCBmcmVlc3BhY2UpOwogICAgICAgICByZXR1cm4gZnJlZXNwYWNlOwogICAgIH0KLSAgICBkcHJpbnRmX2luZm8obG9jYWwsICJMb2NhbF9Db21wYWN0OiBDb21wYWN0aW5nIGhlYXAgJTA0eC5cbiIsIGRzKTsKKyAgICBUUkFDRShsb2NhbCwgIkNvbXBhY3RpbmcgaGVhcCAlMDR4LlxuIiwgZHMpOwogICAgIHRhYmxlID0gcEluZm8tPmh0YWJsZTsKICAgICB3aGlsZSh0YWJsZSkKICAgICB7CkBAIC02NzksOSArNjc4LDggQEAKICAgICAgICAgICAgIGlmKChwRW50cnktPmxvY2sgPT0gMCkgJiYgKHBFbnRyeS0+ZmxhZ3MgIT0gKExNRU1fRElTQ0FSREVEID4+IDgpKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvKiBPSyB3ZSBjYW4gbW92ZSB0aGlzIG9uZSBpZiB3ZSB3YW50ICovCi0gICAgICAgICAgICAgICAgZHByaW50Zl9pbmZvKGxvY2FsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhhbmRsZSAlMDR4IChibG9jayAlMDR4KSBjYW4gYmUgbW92ZWQuXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdPUkQpKChjaGFyICopcEVudHJ5IC0gcHRyKSwgcEVudHJ5LT5hZGRyKTsKKyAgICAgICAgICAgICAgICBUUkFDRShsb2NhbCwgImhhbmRsZSAlMDR4IChibG9jayAlMDR4KSBjYW4gYmUgbW92ZWQuXG4iLAorCQkJICAgICAoV09SRCkoKGNoYXIgKilwRW50cnkgLSBwdHIpLCBwRW50cnktPmFkZHIpOwogICAgICAgICAgICAgICAgIG1vdmVhcmVuYSA9IEFSRU5BX0hFQURFUihwRW50cnktPmFkZHIpOwogICAgICAgICAgICAgICAgIHBNb3ZlQXJlbmEgPSBBUkVOQV9QVFIocHRyLCBtb3ZlYXJlbmEpOwogICAgICAgICAgICAgICAgIG1vdmVzaXplID0gcE1vdmVBcmVuYS0+bmV4dCAtIG1vdmVhcmVuYTsKQEAgLTcwNyw3ICs3MDUsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoZmluYWxhcmVuYSkgLyogQWN0dWFsbHkgZ290IHNvbWV3aGVyZSB0byBtb3ZlICovCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBkcHJpbnRmX2luZm8obG9jYWwsICJNb3ZpbmcgaXQgdG8gJTA0eC5cbiIsIGZpbmFsYXJlbmEpOworICAgICAgICAgICAgICAgICAgICBUUkFDRShsb2NhbCwgIk1vdmluZyBpdCB0byAlMDR4LlxuIiwgZmluYWxhcmVuYSk7CiAgICAgICAgICAgICAgICAgICAgIHBGaW5hbEFyZW5hID0gQVJFTkFfUFRSKHB0ciwgZmluYWxhcmVuYSk7CiAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBwRmluYWxBcmVuYS0+c2l6ZTsKICAgICAgICAgICAgICAgICAgICAgTE9DQUxfUmVtb3ZlRnJlZUJsb2NrKHB0ciwgZmluYWxhcmVuYSk7CkBAIC03MzgsNyArNzM2LDcgQEAKICAgICBmcmVlc3BhY2UgPSBMT0NBTF9HZXRGcmVlU3BhY2UoZHMsIG1pbmZyZWUgPyAwIDogMSk7CiAgICAgaWYoZnJlZXNwYWNlID49IG1pbmZyZWUgfHwgKGZsYWdzICYgTE1FTV9OT0RJU0NBUkQpKQogICAgIHsKLSAgICAgICAgZHByaW50Zl9pbmZvKGxvY2FsLCAiUmV0dXJuaW5nICUwNHguXG4iLCBmcmVlc3BhY2UpOworICAgICAgICBUUkFDRShsb2NhbCwgIlJldHVybmluZyAlMDR4LlxuIiwgZnJlZXNwYWNlKTsKICAgICAgICAgcmV0dXJuIGZyZWVzcGFjZTsKICAgICB9CiAKQEAgLTc1MSw3ICs3NDksNyBAQAogICAgICAgICAgICAgaWYocEVudHJ5LT5hZGRyICYmIHBFbnRyeS0+bG9jayA9PSAwICYmCiAJICAgICAocEVudHJ5LT5mbGFncyAmIChMTUVNX0RJU0NBUkRBQkxFID4+IDgpKSkKIAkgICAgewotICAgICAgICAgICAgICAgIGRwcmludGZfaW5mbyhsb2NhbCwgIkRpc2NhcmRpbmcgaGFuZGxlICUwNHggKGJsb2NrICUwNHgpLlxuIiwKKyAgICAgICAgICAgICAgICBUUkFDRShsb2NhbCwgIkRpc2NhcmRpbmcgaGFuZGxlICUwNHggKGJsb2NrICUwNHgpLlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopcEVudHJ5IC0gcHRyLCBwRW50cnktPmFkZHIpOwogICAgICAgICAgICAgICAgIExPQ0FMX0ZyZWVBcmVuYShkcywgQVJFTkFfSEVBREVSKHBFbnRyeS0+YWRkcikpOwogICAgICAgICAgICAgICAgIHBFbnRyeS0+YWRkciA9IDA7CkBAIC03OTAsNyArNzg4LDcgQEAKIAlpZiAoYXJlbmEgPT0gcEFyZW5hLT5mcmVlX25leHQpIGJyZWFrOwogICAgICAgICBpZiAocEFyZW5hLT5zaXplID49IHNpemUpIHJldHVybiBhcmVuYTsKICAgICB9Ci0gICAgZHByaW50Zl93YXJuKGxvY2FsLCAiTG9jYWxfRmluZEZyZWVCbG9jazogbm90IGVub3VnaCBzcGFjZVxuIiApOworICAgIFdBUk4obG9jYWwsICJub3QgZW5vdWdoIHNwYWNlXG4iICk7CiAgICAgTE9DQUxfUHJpbnRIZWFwKGRzKTsKICAgICByZXR1cm4gMDsKIH0KQEAgLTgzMywyNCArODMxLDIxIEBACiAgICAgfQogICAgIGlmIChhcmVuYSA9PSAwKSB7CiAgICAgICAgIGlmIChkcyA9PSBHRElfSGVhcFNlbCkgeyAKLQkgICAgZHByaW50Zl93YXJuKGxvY2FsLCAKLQkgICAgICAgIkxvY2FsX0dldEJsb2NrOiBub3QgZW5vdWdoIHNwYWNlIGluIEdESSBsb2NhbCBoZWFwICglMDR4KSBmb3IgJWQgYnl0ZXNcbiIsCi0JCSAgICAgZHMsIHNpemUgKTsKKwkgICAgV0FSTihsb2NhbCwgIm5vdCBlbm91Z2ggc3BhY2UgaW4gR0RJIGxvY2FsIGhlYXAgIgorCQkJICIoJTA0eCkgZm9yICVkIGJ5dGVzXG4iLCBkcywgc2l6ZSApOwogCX0gZWxzZSBpZiAoZHMgPT0gVVNFUl9IZWFwU2VsKSB7Ci0JICAgIGRwcmludGZfd2Fybihsb2NhbCwgCi0JICAgICAgICJMb2NhbF9HZXRCbG9jazogbm90IGVub3VnaCBzcGFjZSBpbiBVU0VSIGxvY2FsIGhlYXAgKCUwNHgpIGZvciAlZCBieXRlc1xuIiwKLQkJICAgICBkcywgc2l6ZSApOworCSAgICBXQVJOKGxvY2FsLCAibm90IGVub3VnaCBzcGFjZSBpbiBVU0VSIGxvY2FsIGhlYXAgIgorCQkJICIoJTA0eCkgZm9yICVkIGJ5dGVzXG4iLCBkcywgc2l6ZSApOwogCX0gZWxzZSB7Ci0JICAgIGRwcmludGZfd2Fybihsb2NhbCwgCi0JICAgICAgICJMb2NhbF9HZXRCbG9jazogbm90IGVub3VnaCBzcGFjZSBpbiBsb2NhbCBoZWFwICUwNHggZm9yICVkIGJ5dGVzXG4iLAotCQkgICAgIGRzLCBzaXplICk7CisJICAgIFdBUk4obG9jYWwsICJub3QgZW5vdWdoIHNwYWNlIGluIGxvY2FsIGhlYXAgIgorCQkJICIlMDR4IGZvciAlZCBieXRlc1xuIiwgZHMsIHNpemUgKTsKIAl9CiAJcmV0dXJuIDA7CiAgICAgfQogCiAgICAgICAvKiBNYWtlIGEgYmxvY2sgb3V0IG9mIHRoZSBmcmVlIGFyZW5hICovCiAgICAgcEFyZW5hID0gQVJFTkFfUFRSKCBwdHIsIGFyZW5hICk7Ci0gICAgZHByaW50Zl9pbmZvKGxvY2FsLCAiTE9DQUxfR2V0QmxvY2sgc2l6ZSA9ICUwNHgsIGFyZW5hICUwNHggc2l6ZSAlMDR4XG4iLAorICAgIFRSQUNFKGxvY2FsLCAiTE9DQUxfR2V0QmxvY2sgc2l6ZSA9ICUwNHgsIGFyZW5hICUwNHggc2l6ZSAlMDR4XG4iLAogICAgICAgICAgICAgICAgICAgc2l6ZSwgYXJlbmEsIHBBcmVuYS0+c2l6ZSApOwogICAgIExPQ0FMX1JlbW92ZUZyZWVCbG9jayggcHRyLCBhcmVuYSApOwogICAgIExPQ0FMX1Nocmlua0FyZW5hKCBkcywgYXJlbmEsIHNpemUgKTsKQEAgLTg3Miw3ICs4NjcsNyBAQAogICAgIEhMT0NBTDE2IGhhbmRsZTsKICAgICBpbnQgaTsKIAotICAgIGRwcmludGZfaW5mbyhsb2NhbCwgIkxvY2FsX05ld0hUYWJsZVxuIiApOworICAgIFRSQUNFKGxvY2FsLCAiTG9jYWxfTmV3SFRhYmxlXG4iICk7CiAgICAgaWYgKCEocEluZm8gPSBMT0NBTF9HZXRIZWFwKCBkcyApKSkKICAgICB7CiAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIkxvY2FsIGhlYXAgbm90IGZvdW5kXG4iKTsKQEAgLTk0NCw3ICs5MzksNyBAQAogCiAgICAgcEVudHJ5LT5sb2NrID0gMDsKICAgICBwRW50cnktPmZsYWdzID0gMDsKLSAgICBkcHJpbnRmX2luZm8obG9jYWwsICJMT0NBTF9HZXROZXdIYW5kbGVFbnRyeSglMDR4KTogJTA0eFxuIiwKKyAgICBUUkFDRShsb2NhbCwgIiglMDR4KTogJTA0eFxuIiwKICAgICAgICAgICAgICAgICAgICBkcywgKChjaGFyICopcEVudHJ5IC0gcHRyKSApOwogICAgIHJldHVybiAoSExPQ0FMMTYpKChjaGFyICopcEVudHJ5IC0gcHRyKTsKIH0KQEAgLTk5Niw3ICs5OTEsNyBAQAogICAgIAogICAgIC8qIFJlbW92ZSB0aGUgdGFibGUgZnJvbSB0aGUgbGlua2VkIGxpc3QgYW5kIGZyZWUgaXQgKi8KIAotICAgIGRwcmludGZfaW5mbyhsb2NhbCwgIkxPQ0FMX0ZyZWVIYW5kbGVFbnRyeSglMDR4KTogZnJlZWluZyB0YWJsZSAlMDR4XG4iLAorICAgIFRSQUNFKGxvY2FsLCAiKCUwNHgpOiBmcmVlaW5nIHRhYmxlICUwNHhcbiIsCiAgICAgICAgICAgICAgICAgICAgZHMsIHRhYmxlKTsKICAgICAqcFRhYmxlID0gKihXT1JEICopcEVudHJ5OwogICAgIExPQ0FMX0ZyZWVBcmVuYSggZHMsIEFSRU5BX0hFQURFUiggdGFibGUgKSApOwpAQCAtMTAxMiw3ICsxMDA3LDcgQEAKIHsKICAgICBjaGFyICpwdHIgPSBQVFJfU0VHX09GRl9UT19MSU4oIGRzLCAwICk7CiAKLSAgICBkcHJpbnRmX2luZm8obG9jYWwsICJMb2NhbEZyZWU6ICUwNHggZHM9JTA0eFxuIiwgaGFuZGxlLCBkcyApOworICAgIFRSQUNFKGxvY2FsLCAiJTA0eCBkcz0lMDR4XG4iLCBoYW5kbGUsIGRzICk7CiAgICAgCiAgICAgaWYgKCFoYW5kbGUpIHsgZnByaW50Ziggc3RkZXJyLCAiTE9DQUxfRnJlZTogaGFuZGxlIGlzIDAuXG4iICk7IHJldHVybiAwOyB9CiAgICAgaWYgKEhBTkRMRV9GSVhFRCggaGFuZGxlICkpCkBAIC0xMDI1LDcgKzEwMjAsNyBAQAogICAgICAgICBMT0NBTEhBTkRMRUVOVFJZICpwRW50cnkgPSAoTE9DQUxIQU5ETEVFTlRSWSAqKShwdHIgKyBoYW5kbGUpOwogICAgICAgICBpZiAocEVudHJ5LT5mbGFncyAhPSAoTE1FTV9ESVNDQVJERUQgPj4gOCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGRwcmludGZfaW5mbyhsb2NhbCwgIkxvY2FsRnJlZTogcmVhbCBibG9jayBhdCAlMDR4XG4iLAorICAgICAgICAgICAgVFJBQ0UobG9jYWwsICJyZWFsIGJsb2NrIGF0ICUwNHhcbiIsCiAJCQkgICBwRW50cnktPmFkZHIgKTsKICAgICAgICAgICAgIGlmIChMT0NBTF9GcmVlQXJlbmEoIGRzLCBBUkVOQV9IRUFERVIocEVudHJ5LT5hZGRyKSApKQogICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGU7IC8qIGNvdWxkbid0IGZyZWUgaXQgKi8KQEAgLTEwNDcsNyArMTA0Miw3IEBACiAgICAgY2hhciAqcHRyOwogICAgIEhMT0NBTDE2IGhhbmRsZTsKICAgICAKLSAgICBkcHJpbnRmX2luZm8obG9jYWwsICJMb2NhbEFsbG9jOiAlMDR4ICVkIGRzPSUwNHhcbiIsIGZsYWdzLCBzaXplLCBkcyApOworICAgIFRSQUNFKGxvY2FsLCAiJTA0eCAlZCBkcz0lMDR4XG4iLCBmbGFncywgc2l6ZSwgZHMgKTsKIAogICAgIGlmKHNpemUgPiAwICYmIHNpemUgPD0gNCkgc2l6ZSA9IDU7CiAgICAgaWYgKGZsYWdzICYgTE1FTV9NT1ZFQUJMRSkKQEAgLTExMTQsNyArMTEwOSw3IEBACiAgICAgICgoTE9DQUxIQU5ETEVFTlRSWSAqKShwdHIgKyBoYW5kbGUpKS0+bG9jayA9PSAweGZmKSAvKiBBbiB1bnVzZWQgaGFuZGxlICovCiAJcmV0dXJuIDA7CiAKLSAgICBkcHJpbnRmX2luZm8obG9jYWwsICJMb2NhbFJlQWxsb2M6ICUwNHggJWQgJTA0eCBkcz0lMDR4XG4iLAorICAgIFRSQUNFKGxvY2FsLCAiJTA0eCAlZCAlMDR4IGRzPSUwNHhcbiIsCiAgICAgICAgICAgICAgICAgICAgaGFuZGxlLCBzaXplLCBmbGFncywgZHMgKTsKICAgICBpZiAoIShwSW5mbyA9IExPQ0FMX0dldEhlYXAoIGRzICkpKSByZXR1cm4gMDsKICAgICAKQEAgLTExMjksNyArMTEyNCw3IEBACiAJICAgIGlmKHBFbnRyeS0+YWRkcikKIAkJZnByaW50ZihzdGRlcnIsCiAJCQkiTE9DQUxfUmVBbGxvYzogRGljYXJkZWQgYmxvY2sgaGFzIG5vbi16ZXJvIGFkZHIuXG4iKTsKLQkgICAgZHByaW50Zl9pbmZvKGxvY2FsLCAiUmVBbGxvY2F0aW5nIGRpc2NhcmRlZCBibG9ja1xuIik7CisJICAgIFRSQUNFKGxvY2FsLCAiUmVBbGxvY2F0aW5nIGRpc2NhcmRlZCBibG9ja1xuIik7CiAJICAgIGlmKHNpemUgPD0gNCkgc2l6ZSA9IDU7CiAJICAgIGlmICghKGhsID0gTE9DQUxfR2V0QmxvY2soIGRzLCBzaXplICsgc2l6ZW9mKEhMT0NBTDE2KSwgZmxhZ3MpKSkKIAkJcmV0dXJuIDA7CkBAIC0xMTU5LDcgKzExNTQsNyBAQAogCXsKIAkgICAgcEVudHJ5ID0gKExPQ0FMSEFORExFRU5UUlkgKikocHRyICsgaGFuZGxlKTsKIAkgICAgcEVudHJ5LT5mbGFncyA9IChmbGFncyAmIDB4MGYwMCkgPj4gODsKLQkgICAgZHByaW50Zl9pbmZvKGxvY2FsLCAiQ2hhbmdpbmcgZmxhZ3MgdG8gJXguXG4iLCBwRW50cnktPmZsYWdzKTsKKwkgICAgVFJBQ0UobG9jYWwsICJDaGFuZ2luZyBmbGFncyB0byAleC5cbiIsIHBFbnRyeS0+ZmxhZ3MpOwogCX0KIAlyZXR1cm4gaGFuZGxlOwogICAgIH0KQEAgLTExNzAsNyArMTE2NSw3IEBACiAgICAgICAgIHsKIAkgICAgaWYgKEhBTkRMRV9GSVhFRChoYW5kbGUpKQogCSAgICB7Ci0gICAgICAgICAgICAgICAgZHByaW50Zl9pbmZvKGxvY2FsLCAiRnJlZWluZyBmaXhlZCBibG9jay5cbiIpOworICAgICAgICAgICAgICAgIFRSQUNFKGxvY2FsLCAiRnJlZWluZyBmaXhlZCBibG9jay5cbiIpOwogICAgICAgICAgICAgICAgIHJldHVybiBMT0NBTF9GcmVlKCBkcywgaGFuZGxlICk7CiAgICAgICAgICAgICB9CiAJICAgIGVsc2UgLyogTW92ZWFibGUgYmxvY2sgKi8KQEAgLTExNzksNyArMTE3NCw3IEBACiAJCWlmIChwRW50cnktPmxvY2sgPT0gMCkKIAkJewogCQkgICAgLyogZGlzY2FyZHMgbW92ZWFibGUgYmxvY2tzICovCi0gICAgICAgICAgICAgICAgICAgIGRwcmludGZfaW5mbyhsb2NhbCwiRGlzY2FyZGluZyBibG9ja1xuIik7CisgICAgICAgICAgICAgICAgICAgIFRSQUNFKGxvY2FsLCJEaXNjYXJkaW5nIGJsb2NrXG4iKTsKICAgICAgICAgICAgICAgICAgICAgTE9DQUxfRnJlZUFyZW5hKGRzLCBBUkVOQV9IRUFERVIocEVudHJ5LT5hZGRyKSk7CiAgICAgICAgICAgICAgICAgICAgIHBFbnRyeS0+YWRkciA9IDA7CiAgICAgICAgICAgICAgICAgICAgIHBFbnRyeS0+ZmxhZ3MgPSAoTE1FTV9ESVNDQVJERUQgPj4gOCk7CkBAIC0xMjAxLDcgKzExOTYsNyBAQAogICAgIH0KIAogICAgIGFyZW5hID0gQVJFTkFfSEVBREVSKCBibG9ja2hhbmRsZSApOwotICAgIGRwcmludGZfaW5mbyhsb2NhbCwgIkxvY2FsUmVBbGxvYzogYXJlbmEgaXMgJTA0eFxuIiwgYXJlbmEgKTsKKyAgICBUUkFDRShsb2NhbCwgImFyZW5hIGlzICUwNHhcbiIsIGFyZW5hICk7CiAgICAgcEFyZW5hID0gQVJFTkFfUFRSKCBwdHIsIGFyZW5hICk7CiAKICAgICBpZihzaXplIDw9IDQpIHNpemUgPSA1OwpAQCAtMTIxMiw5ICsxMjA3LDkgQEAKIAogICAgIGlmIChuZXh0YXJlbmEgPD0gcEFyZW5hLT5uZXh0KQogICAgIHsKLQlkcHJpbnRmX2luZm8obG9jYWwsICJzaXplIHJlZHVjdGlvbiwgbWFraW5nIG5ldyBmcmVlIGJsb2NrXG4iKTsKKwlUUkFDRShsb2NhbCwgInNpemUgcmVkdWN0aW9uLCBtYWtpbmcgbmV3IGZyZWUgYmxvY2tcbiIpOwogCUxPQ0FMX1Nocmlua0FyZW5hKGRzLCBhcmVuYSwgbmV4dGFyZW5hIC0gYXJlbmEpOwotICAgICAgICBkcHJpbnRmX2luZm8obG9jYWwsICJMb2NhbFJlQWxsb2M6IHJldHVybmluZyAlMDR4XG4iLCBoYW5kbGUgKTsKKyAgICAgICAgVFJBQ0UobG9jYWwsICJyZXR1cm5pbmcgJTA0eFxuIiwgaGFuZGxlICk7CiAgICAgICAgIHJldHVybiBoYW5kbGU7CiAgICAgfQogCkBAIC0xMjI0LDkgKzEyMTksOSBAQAogICAgIGlmICgoKHBOZXh0LT5wcmV2ICYgMykgPT0gTE9DQUxfQVJFTkFfRlJFRSkgJiYKICAgICAgICAgKG5leHRhcmVuYSA8PSBwTmV4dC0+bmV4dCkpCiAgICAgewotCWRwcmludGZfaW5mbyhsb2NhbCwgInNpemUgaW5jcmVhc2UsIG1ha2luZyBuZXcgZnJlZSBibG9ja1xuIik7CisJVFJBQ0UobG9jYWwsICJzaXplIGluY3JlYXNlLCBtYWtpbmcgbmV3IGZyZWUgYmxvY2tcbiIpOwogICAgICAgICBMT0NBTF9Hcm93QXJlbmFVcHdhcmQoZHMsIGFyZW5hLCBuZXh0YXJlbmEgLSBhcmVuYSk7Ci0gICAgICAgIGRwcmludGZfaW5mbyhsb2NhbCwgIkxvY2FsUmVBbGxvYzogcmV0dXJuaW5nICUwNHhcbiIsIGhhbmRsZSApOworICAgICAgICBUUkFDRShsb2NhbCwgInJldHVybmluZyAlMDR4XG4iLCBoYW5kbGUgKTsKICAgICAgICAgcmV0dXJuIGhhbmRsZTsKICAgICB9CiAKQEAgLTEyMzcsMTYgKzEyMzIsMTQgQEAKICAgICB7CiAJaWYgKEhBTkRMRV9GSVhFRChoYW5kbGUpKQogICAgICAgICB7Ci0gICAgICAgICAgICBkcHJpbnRmX3dhcm4obG9jYWwsCi0JICAgICAiTmVlZGVkIHRvIG1vdmUgZml4ZWQgYmxvY2ssIGJ1dCBMTUVNX01PVkVBQkxFIG5vdCBzcGVjaWZpZWQuXG4iKTsKKyAgICAgICAgICAgIFdBUk4obG9jYWwsICJOZWVkZWQgdG8gbW92ZSBmaXhlZCBibG9jaywgYnV0IExNRU1fTU9WRUFCTEUgbm90IHNwZWNpZmllZC5cbiIpOwogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KIAllbHNlCiAJewogCSAgICBpZigoKExPQ0FMSEFORExFRU5UUlkgKikocHRyICsgaGFuZGxlKSktPmxvY2sgIT0gMCkKIAkgICAgewotCQlkcHJpbnRmX3dhcm4obG9jYWwsCi0JICAgICAgICJOZWVkZWQgdG8gbW92ZSBsb2NrZWQgYmxvY2ssIGJ1dCBMTUVNX01PVkVBQkxFIG5vdCBzcGVjaWZpZWQuXG4iKTsKKwkJV0FSTihsb2NhbCwgIk5lZWRlZCB0byBtb3ZlIGxvY2tlZCBibG9jaywgYnV0IExNRU1fTU9WRUFCTEUgbm90IHNwZWNpZmllZC5cbiIpOwogCQlyZXR1cm4gMDsKIAkgICAgfQogICAgICAgICB9CkBAIC0xMjgyLDcgKzEyNzUsNyBAQAogICAgIH0KICAgICBpZiAoSEFORExFX01PVkVBQkxFKCBoYW5kbGUgKSkKICAgICB7Ci0JZHByaW50Zl9pbmZvKGxvY2FsLCAiTG9jYWxSZUFsbG9jOiBmaXhpbmcgaGFuZGxlXG4iKTsKKwlUUkFDRShsb2NhbCwgImZpeGluZyBoYW5kbGVcbiIpOwogICAgICAgICBwRW50cnkgPSAoTE9DQUxIQU5ETEVFTlRSWSAqKShwdHIgKyBoYW5kbGUpOwogICAgICAgICBwRW50cnktPmFkZHIgPSBobWVtICsgc2l6ZW9mKEhMT0NBTDE2KTsKIAkvKiBCYWNrIHB0ciBzaG91bGQgc3RpbGwgYmUgY29ycmVjdCAqLwpAQCAtMTI5MSw3ICsxMjg0LDcgQEAKIAlobWVtID0gaGFuZGxlOwogICAgIH0KICAgICBpZiAoc2l6ZSA9PSBvbGRzaXplKSBobWVtID0gMDsgIC8qIFJlYWxsb2MgZmFpbGVkICovCi0gICAgZHByaW50Zl9pbmZvKGxvY2FsLCAiTG9jYWxSZUFsbG9jOiByZXR1cm5pbmcgJTA0eFxuIiwgaG1lbSApOworICAgIFRSQUNFKGxvY2FsLCAicmV0dXJuaW5nICUwNHhcbiIsIGhtZW0gKTsKICAgICByZXR1cm4gaG1lbTsKIH0KIApAQCAtMTMxMCw3ICsxMzAzLDcgQEAKICAgICAgICAgaWYgKHBFbnRyeS0+bG9jayA8IDB4ZmUpIHBFbnRyeS0+bG9jaysrOwogICAgICAgICBoYW5kbGUgPSBwRW50cnktPmFkZHI7CiAgICAgfQotICAgIGRwcmludGZfaW5mbyhsb2NhbCwgIkxvY2FsTG9jazogJTA0eCByZXR1cm5pbmcgJTA0eFxuIiwgCisgICAgVFJBQ0UobG9jYWwsICIlMDR4IHJldHVybmluZyAlMDR4XG4iLCAKIAkJICAgb2xkX2hhbmRsZSwgaGFuZGxlICk7CiAgICAgcmV0dXJuIGhhbmRsZTsKIH0KQEAgLTEzNDMsNyArMTMzNiw3IEBACiB7CiAgICAgY2hhciAqcHRyID0gUFRSX1NFR19PRkZfVE9fTElOKCBkcywgMCApOwogCi0gICAgZHByaW50Zl9pbmZvKGxvY2FsLCAiTG9jYWxVbmxvY2s6ICUwNHhcbiIsIGhhbmRsZSApOworICAgIFRSQUNFKGxvY2FsLCAiJTA0eFxuIiwgaGFuZGxlICk7CiAgICAgaWYgKEhBTkRMRV9NT1ZFQUJMRShoYW5kbGUpKQogICAgIHsKICAgICAgICAgTE9DQUxIQU5ETEVFTlRSWSAqcEVudHJ5ID0gKExPQ0FMSEFORExFRU5UUlkgKikocHRyICsgaGFuZGxlKTsKQEAgLTEzNjYsNyArMTM1OSw3IEBACiAgICAgY2hhciAqcHRyID0gUFRSX1NFR19PRkZfVE9fTElOKCBDVVJSRU5UX0RTLCAwICk7CiAgICAgTE9DQUxBUkVOQSAqcEFyZW5hOwogCi0gICAgZHByaW50Zl9pbmZvKGxvY2FsLCAiTG9jYWxTaXplOiAlMDR4IGRzPSUwNHhcbiIsIGhhbmRsZSwgZHMgKTsKKyAgICBUUkFDRShsb2NhbCwgIiUwNHggZHM9JTA0eFxuIiwgaGFuZGxlLCBkcyApOwogCiAgICAgaWYgKEhBTkRMRV9NT1ZFQUJMRSggaGFuZGxlICkpIGhhbmRsZSA9ICooV09SRCAqKShwdHIgKyBoYW5kbGUpOwogICAgIGlmICghaGFuZGxlKSByZXR1cm4gMDsKQEAgLTEzODcsMTMgKzEzODAsMTMgQEAKICAgICBpZiAoSEFORExFX01PVkVBQkxFKGhhbmRsZSkpCiAgICAgewogICAgICAgICBMT0NBTEhBTkRMRUVOVFJZICpwRW50cnkgPSAoTE9DQUxIQU5ETEVFTlRSWSAqKShwdHIgKyBoYW5kbGUpOwotICAgICAgICBkcHJpbnRmX2luZm8obG9jYWwsICJMT0NBTF9GbGFncyglMDR4LCUwNHgpOiByZXR1cm5pbmcgJTA0eFxuIiwKKyAgICAgICAgVFJBQ0UobG9jYWwsICIoJTA0eCwlMDR4KTogcmV0dXJuaW5nICUwNHhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGRzLCBoYW5kbGUsIHBFbnRyeS0+bG9jayB8IChwRW50cnktPmZsYWdzIDw8IDgpICk7CiAgICAgICAgIHJldHVybiBwRW50cnktPmxvY2sgfCAocEVudHJ5LT5mbGFncyA8PCA4KTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKLSAgICAgICAgZHByaW50Zl9pbmZvKGxvY2FsLCAiTE9DQUxfRmxhZ3MoJTA0eCwlMDR4KTogcmV0dXJuaW5nIDBcbiIsCisgICAgICAgIFRSQUNFKGxvY2FsLCAiKCUwNHgsJTA0eCk6IHJldHVybmluZyAwXG4iLAogICAgICAgICAgICAgICAgICAgICAgICBkcywgaGFuZGxlICk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KQEAgLTE0NDIsNyArMTQzNSw3IEBACiAJaWYgKGFyZW5hID09IHBBcmVuYS0+ZnJlZV9uZXh0KSBicmVhazsKICAgICAgICAgdG90YWwgKz0gcEFyZW5hLT5zaXplOwogICAgIH0KLSAgICBkcHJpbnRmX2luZm8obG9jYWwsICJMT0NBTF9Db3VudEZyZWUoJTA0eCk6IHJldHVybmluZyAlZFxuIiwgZHMsIHRvdGFsKTsKKyAgICBUUkFDRShsb2NhbCwgIiglMDR4KTogcmV0dXJuaW5nICVkXG4iLCBkcywgdG90YWwpOwogICAgIHJldHVybiB0b3RhbDsKIH0KIApAQCAtMTU2MCw3ICsxNTUzLDcgQEAKICAqLwogVUlOVDE2IFdJTkFQSSBMb2NhbENvbXBhY3QxNiggVUlOVDE2IG1pbmZyZWUgKQogewotICAgIGRwcmludGZfaW5mbyhsb2NhbCwgIkxvY2FsQ29tcGFjdDogJTA0eFxuIiwgbWluZnJlZSApOworICAgIFRSQUNFKGxvY2FsLCAiJTA0eFxuIiwgbWluZnJlZSApOwogICAgIHJldHVybiBMT0NBTF9Db21wYWN0KCBDVVJSRU5UX0RTLCBtaW5mcmVlLCAwICk7CiB9CiAKQEAgLTE1ODAsNyArMTU3Myw3IEBACiAJTE9DQUxfUHJpbnRIZWFwKCBkcyApOwogCXJldHVybiAwOwogICAgIH0KLSAgICBkcHJpbnRmX2luZm8obG9jYWwsICJMb2NhbE5vdGlmeSglMDR4KTogJTA4bHhcbiIsIGRzLCAoRFdPUkQpZnVuYyApOworICAgIFRSQUNFKGxvY2FsLCAiKCUwNHgpOiAlMDhseFxuIiwgZHMsIChEV09SRClmdW5jICk7CiAgICAgZnByaW50ZihzdGRuaW1wLCAiTG9jYWxOb3RpZnkoKTogSGFsZiBpbXBsZW1lbnRlZFxuIik7CiAgICAgb2xkTm90aWZ5ID0gcEluZm8tPm5vdGlmeTsKICAgICBwSW5mby0+bm90aWZ5ID0gZnVuYzsKQEAgLTE1OTMsNyArMTU4Niw3IEBACiAgKi8KIFVJTlQxNiBXSU5BUEkgTG9jYWxTaHJpbmsxNiggSEdMT0JBTDE2IGhhbmRsZSwgVUlOVDE2IG5ld3NpemUgKQogewotICAgIGRwcmludGZfaW5mbyhsb2NhbCwgIkxvY2FsU2hyaW5rOiAlMDR4ICUwNHhcbiIsIGhhbmRsZSwgbmV3c2l6ZSApOworICAgIFRSQUNFKGxvY2FsLCAiJTA0eCAlMDR4XG4iLCBoYW5kbGUsIG5ld3NpemUgKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMTYyNiw3ICsxNjE5LDcgQEAKICAqLwogV09SRCBXSU5BUEkgTG9jYWxIZWFwU2l6ZSh2b2lkKQogewotICAgIGRwcmludGZfaW5mbyhsb2NhbCwgIkxvY2FsSGVhcFNpemU6XG4iICk7CisgICAgVFJBQ0UobG9jYWwsICIodm9pZClcbiIgKTsKICAgICByZXR1cm4gTE9DQUxfSGVhcFNpemUoIENVUlJFTlRfRFMgKTsKIH0KIApAQCAtMTY0NSw3ICsxNjM4LDcgQEAKIAlyZXR1cm4gMDsKICAgICB9CiAgICAgaWYgKGRlbHRhKSBwSW5mby0+aGRlbHRhID0gZGVsdGE7Ci0gICAgZHByaW50Zl9pbmZvKGxvY2FsLCAiTG9jYWxIYW5kbGVEZWx0YTogcmV0dXJuaW5nICUwNHhcbiIsIHBJbmZvLT5oZGVsdGEpOworICAgIFRSQUNFKGxvY2FsLCAicmV0dXJuaW5nICUwNHhcbiIsIHBJbmZvLT5oZGVsdGEpOwogICAgIHJldHVybiBwSW5mby0+aGRlbHRhOwogfQogCmRpZmYgLS1naXQgYS9tZW1vcnkvc2VsZWN0b3IuYyBiL21lbW9yeS9zZWxlY3Rvci5jCmluZGV4IDkxODhmNTUuLmUyNzdlYTUgMTAwNjQ0Ci0tLSBhL21lbW9yeS9zZWxlY3Rvci5jCisrKyBiL21lbW9yeS9zZWxlY3Rvci5jCkBAIC01OSw3ICs1OSw3IEBACiAKICAgICBjb3VudCA9IHNlbCA/ICgoR0VUX1NFTF9MSU1JVChzZWwpID4+IDE2KSArIDEpIDogMTsKICAgICBuZXdzZWwgPSBBbGxvY1NlbGVjdG9yQXJyYXkoIGNvdW50ICk7Ci0gICAgZHByaW50Zl9pbmZvKHNlbGVjdG9yLCAiQWxsb2NTZWxlY3RvciglMDR4KTogcmV0dXJuaW5nICUwNHhcbiIsCisgICAgVFJBQ0Uoc2VsZWN0b3IsICIoJTA0eCk6IHJldHVybmluZyAlMDR4XG4iLAogICAgICAgICAgICAgICAgICAgICAgIHNlbCwgbmV3c2VsICk7CiAgICAgaWYgKCFuZXdzZWwpIHJldHVybiAwOwogICAgIGlmICghc2VsKSByZXR1cm4gbmV3c2VsOyAgLyogbm90aGluZyB0byBjb3B5ICovCkBAIC0xNDgsNyArMTQ4LDcgQEAKICAgICBsZHRfZW50cnkgZW50cnk7CiAgICAgU1RBQ0sxNkZSQU1FICpmcmFtZTsKIAotICAgIGRwcmludGZfaW5mbyhzZWxlY3RvciwgIlNFTEVDVE9SX0ZyZWVCbG9jayglMDR4LCVkKVxuIiwgc2VsLCBjb3VudCApOworICAgIFRSQUNFKHNlbGVjdG9yLCAiKCUwNHgsJWQpXG4iLCBzZWwsIGNvdW50ICk7CiAgICAgc2VsICY9IH4oX19BSElOQ1IgLSAxKTsgIC8qIGNsZWFyIGJvdHRvbSBiaXRzIG9mIHNlbGVjdG9yICovCiAgICAgbmV4dHNlbCA9IHNlbCArIChjb3VudCA8PCBfX0FIU0hJRlQpOwogCkBAIC0yNTIsNyArMjUyLDcgQEAKICAgICBsZHRfZW50cnkgZW50cnk7CiAKICAgICBuZXdzZWwgPSBBbGxvY1NlbGVjdG9yQXJyYXkoIDEgKTsKLSAgICBkcHJpbnRmX2luZm8oc2VsZWN0b3IsICJBbGxvY0NTdG9EU0FsaWFzKCUwNHgpOiByZXR1cm5pbmcgJTA0eFxuIiwKKyAgICBUUkFDRShzZWxlY3RvciwgIiglMDR4KTogcmV0dXJuaW5nICUwNHhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgc2VsLCBuZXdzZWwgKTsKICAgICBpZiAoIW5ld3NlbCkgcmV0dXJuIDA7CiAgICAgTERUX0dldEVudHJ5KCBTRUxFQ1RPUl9UT19FTlRSWShzZWwpLCAmZW50cnkgKTsKQEAgLTI3MSw3ICsyNzEsNyBAQAogICAgIGxkdF9lbnRyeSBlbnRyeTsKIAogICAgIG5ld3NlbCA9IEFsbG9jU2VsZWN0b3JBcnJheSggMSApOwotICAgIGRwcmludGZfaW5mbyhzZWxlY3RvciwgIkFsbG9jRFN0b0NTQWxpYXMoJTA0eCk6IHJldHVybmluZyAlMDR4XG4iLAorICAgIFRSQUNFKHNlbGVjdG9yLCAiKCUwNHgpOiByZXR1cm5pbmcgJTA0eFxuIiwKICAgICAgICAgICAgICAgICAgICAgICBzZWwsIG5ld3NlbCApOwogICAgIGlmICghbmV3c2VsKSByZXR1cm4gMDsKICAgICBMRFRfR2V0RW50cnkoIFNFTEVDVE9SX1RPX0VOVFJZKHNlbCksICZlbnRyeSApOwpkaWZmIC0tZ2l0IGEvbWVtb3J5L3N0cmluZy5jIGIvbWVtb3J5L3N0cmluZy5jCmluZGV4IDhhNGExOGEuLjY1ZTU3MDkgMTAwNjQ0Ci0tLSBhL21lbW9yeS9zdHJpbmcuYworKysgYi9tZW1vcnkvc3RyaW5nLmMKQEAgLTc3LDcgKzc3LDcgQEAKICAqLwogTFBTVFIgV0lOQVBJIGxzdHJjYXQzMkEoIExQU1RSIGRzdCwgTFBDU1RSIHNyYyApCiB7Ci0gICAgZHByaW50Zl9pbmZvKHN0cmluZywic3RyY2F0OiBBcHBlbmQgJXMgdG8gJXNcbiIsCisgICAgVFJBQ0Uoc3RyaW5nLCJBcHBlbmQgJXMgdG8gJXNcbiIsCiAJCSAgIGRlYnVnc3RyX2EgKHNyYyksIGRlYnVnc3RyX2EgKGRzdCkpOwogICAgIC8qIFdpbmRvd3MgZG9lcyBub3QgY2hlY2sgZm9yIE5VTEwgcG9pbnRlcnMgaGVyZSwgc28gd2UgZG9uJ3QgZWl0aGVyICovCiAgICAgc3RyY2F0KCBkc3QsIHNyYyApOwpAQCAtOTEsNyArOTEsNyBAQAogTFBXU1RSIFdJTkFQSSBsc3RyY2F0MzJXKCBMUFdTVFIgZHN0LCBMUENXU1RSIHNyYyApCiB7CiAgICAgcmVnaXN0ZXIgTFBXU1RSIHAgPSBkc3Q7Ci0gICAgZHByaW50Zl9pbmZvKHN0cmluZywic3RyY2F0OiBBcHBlbmQgTCVzIHRvIEwlc1xuIiwKKyAgICBUUkFDRShzdHJpbmcsIkFwcGVuZCBMJXMgdG8gTCVzXG4iLAogCQkgICBkZWJ1Z3N0cl93IChzcmMpLCBkZWJ1Z3N0cl93IChkc3QpKTsKICAgICAvKiBXaW5kb3dzIGRvZXMgbm90IGNoZWNrIGZvciBOVUxMIHBvaW50ZXJzIGhlcmUsIHNvIHdlIGRvbid0IGVpdGhlciAqLwogICAgIHdoaWxlICgqcCkgcCsrOwpAQCAtMTE2LDcgKzExNiw3IEBACiBMUFNUUiBXSU5BUEkgbHN0cmNhdG4zMkEoIExQU1RSIGRzdCwgTFBDU1RSIHNyYywgSU5UMzIgbiApCiB7CiAgICAgcmVnaXN0ZXIgTFBTVFIgcCA9IGRzdDsKLSAgICBkcHJpbnRmX2luZm8oc3RyaW5nLCJzdHJjYXRuIGFkZCAlZCBjaGFycyBmcm9tICVzIHRvICVzXG4iLAorICAgIFRSQUNFKHN0cmluZywic3RyY2F0biBhZGQgJWQgY2hhcnMgZnJvbSAlcyB0byAlc1xuIiwKIAkJICAgbiwgZGVidWdzdHJfYW4gKHNyYywgbiksIGRlYnVnc3RyX2EgKGRzdCkpOwogICAgIHdoaWxlICgqcCkgcCsrOwogICAgIGlmICgobiAtPSAoSU5UMzIpKHAgLSBkc3QpKSA8PSAwKSByZXR1cm4gZHN0OwpAQCAtMTMxLDcgKzEzMSw3IEBACiBMUFdTVFIgV0lOQVBJIGxzdHJjYXRuMzJXKCBMUFdTVFIgZHN0LCBMUENXU1RSIHNyYywgSU5UMzIgbiApCiB7CiAgICAgcmVnaXN0ZXIgTFBXU1RSIHAgPSBkc3Q7Ci0gICAgZHByaW50Zl9pbmZvKHN0cmluZywic3RyY2F0biBhZGQgJWQgY2hhcnMgZnJvbSBMJXMgdG8gTCVzXG4iLAorICAgIFRSQUNFKHN0cmluZywic3RyY2F0biBhZGQgJWQgY2hhcnMgZnJvbSBMJXMgdG8gTCVzXG4iLAogCQkgICBuLCBkZWJ1Z3N0cl93biAoc3JjLCBuKSwgZGVidWdzdHJfdyAoZHN0KSk7CiAgICAgd2hpbGUgKCpwKSBwKys7CiAgICAgaWYgKChuIC09IChJTlQzMikocCAtIGRzdCkpIDw9IDApIHJldHVybiBkc3Q7CkBAIC0xNTQsNyArMTU0LDcgQEAKICAqLwogSU5UMzIgV0lOQVBJIGxzdHJjbXAzMkEoIExQQ1NUUiBzdHIxLCBMUENTVFIgc3RyMiApCiB7Ci0gICAgZHByaW50Zl9pbmZvKHN0cmluZywic3RyY21wOiAlcyBhbmQgJXNcbiIsCisgICAgVFJBQ0Uoc3RyaW5nLCIlcyBhbmQgJXNcbiIsCiAJCSAgIGRlYnVnc3RyX2EgKHN0cjEpLCBkZWJ1Z3N0cl9hIChzdHIyKSk7CiAgICAgLyogV2luOTUgS0VSTkVMMzIuRExMIGRvZXMgaXQgdGhhdCB3YXkuIEhhbmRzIG9mZiEgKi8KICAgICBpZiAoIXN0cjEgfHwgIXN0cjIpIHsKQEAgLTE3MCw3ICsxNzAsNyBAQAogICovCiBJTlQzMiBXSU5BUEkgbHN0cmNtcDMyVyggTFBDV1NUUiBzdHIxLCBMUENXU1RSIHN0cjIgKQogewotICAgIGRwcmludGZfaW5mbyhzdHJpbmcsInN0cmNtcDogTCVzIGFuZCBMJXNcbiIsCisgICAgVFJBQ0Uoc3RyaW5nLCJMJXMgYW5kIEwlc1xuIiwKIAkJICAgZGVidWdzdHJfdyAoc3RyMSksIGRlYnVnc3RyX3cgKHN0cjIpKTsKICAgICBpZiAoIXN0cjEgfHwgIXN0cjIpIHsKICAgICAJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKQEAgLTE5Nyw3ICsxOTcsNyBAQAogewogICAgIElOVDMyIHJlczsKIAotICAgIGRwcmludGZfaW5mbyhzdHJpbmcsInN0cmNtcGkgJXMgYW5kICVzXG4iLAorICAgIFRSQUNFKHN0cmluZywic3RyY21waSAlcyBhbmQgJXNcbiIsCiAJCSAgIGRlYnVnc3RyX2EgKHN0cjEpLCBkZWJ1Z3N0cl9hIChzdHIyKSk7CiAgICAgaWYgKCFzdHIxIHx8ICFzdHIyKSB7CiAgICAgCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CkBAIC0yMjIsNyArMjIyLDcgQEAKIAogI2lmIDAKICAgICAvKiBUb28gbXVjaCEgIChGcm9tIHJlZ2lzdHJ5IGxvYWRpbmcuKSAgKi8KLSAgICBkcHJpbnRmX2luZm8oc3RyaW5nLCJzdHJjbXBpIEwlcyBhbmQgTCVzXG4iLAorICAgIFRSQUNFKHN0cmluZywic3RyY21waSBMJXMgYW5kIEwlc1xuIiwKIAkJICAgZGVidWdzdHJfdyAoc3RyMSksIGRlYnVnc3RyX3cgKHN0cjIpKTsKICNlbmRpZgogICAgIGlmICghc3RyMSB8fCAhc3RyMikgewpAQCAtMjU1LDcgKzI1NSw3IEBACiAgKi8KIExQU1RSIFdJTkFQSSBsc3RyY3B5MzJBKCBMUFNUUiBkc3QsIExQQ1NUUiBzcmMgKQogewotICAgIGRwcmludGZfaW5mbyhzdHJpbmcsInN0cmNweSAlc1xuIiwgZGVidWdzdHJfYSAoc3JjKSk7CisgICAgVFJBQ0Uoc3RyaW5nLCJzdHJjcHkgJXNcbiIsIGRlYnVnc3RyX2EgKHNyYykpOwogICAgIC8qIFdpbmRvd3MgZG9lcyBub3QgY2hlY2sgZm9yIE5VTEwgcG9pbnRlcnMgaGVyZSwgc28gd2UgZG9uJ3QgZWl0aGVyICovCiAgICAgc3RyY3B5KCBkc3QsIHNyYyApOwogICAgIHJldHVybiBkc3Q7CkBAIC0yNjgsNyArMjY4LDcgQEAKIExQV1NUUiBXSU5BUEkgbHN0cmNweTMyVyggTFBXU1RSIGRzdCwgTFBDV1NUUiBzcmMgKQogewogICAgIHJlZ2lzdGVyIExQV1NUUiBwID0gZHN0OwotICAgIGRwcmludGZfaW5mbyhzdHJpbmcsInN0cmNweSBMJXNcbiIsIGRlYnVnc3RyX3cgKHNyYykpOworICAgIFRSQUNFKHN0cmluZywic3RyY3B5IEwlc1xuIiwgZGVidWdzdHJfdyAoc3JjKSk7CiAgICAgLyogV2luZG93cyBkb2VzIG5vdCBjaGVjayBmb3IgTlVMTCBwb2ludGVycyBoZXJlLCBzbyB3ZSBkb24ndCBlaXRoZXIgKi8KICAgICB3aGlsZSAoKCpwKysgPSAqc3JjKyspKTsKICAgICByZXR1cm4gZHN0OwpAQCAtMjg3LDExICsyODcsMTMgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgbHN0cmNweW4zMkEgICAoS0VSTkVMMzIuNjExKQorICogTm90ZTogdGhpcyBmdW5jdGlvbiBkaWZmZXJzIGZyb20gdGhlIFVOSVggc3RybmNweSwgaXQgX2Fsd2F5c18gd3JpdGVzCisgKiBhIHRlcm1pbmF0aW5nIFwwCiAgKi8KIExQU1RSIFdJTkFQSSBsc3RyY3B5bjMyQSggTFBTVFIgZHN0LCBMUENTVFIgc3JjLCBJTlQzMiBuICkKIHsKICAgICBMUFNUUiBwID0gZHN0OwotICAgIGRwcmludGZfaW5mbyhzdHJpbmcsInN0cmNweW4gJXMgZm9yICVkIGNoYXJzXG4iLAorICAgIFRSQUNFKHN0cmluZywic3RyY3B5biAlcyBmb3IgJWQgY2hhcnNcbiIsCiAJCSAgIGRlYnVnc3RyX2FuIChzcmMsbiksIG4pOwogICAgIC8qIFdpbmRvd3MgZG9lcyBub3QgY2hlY2sgZm9yIE5VTEwgcG9pbnRlcnMgaGVyZSwgc28gd2UgZG9uJ3QgZWl0aGVyICovCiAgICAgd2hpbGUgKChuLS0gPiAxKSAmJiAqc3JjKSAqcCsrID0gKnNyYysrOwpAQCAtMzAyLDExICszMDQsMTMgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgbHN0cmNweW4zMlcgICAoS0VSTkVMMzIuNjEyKQorICogTm90ZTogdGhpcyBmdW5jdGlvbiBkaWZmZXJzIGZyb20gdGhlIFVOSVggc3RybmNweSwgaXQgX2Fsd2F5c18gd3JpdGVzCisgKiBhIHRlcm1pbmF0aW5nIFwwCiAgKi8KIExQV1NUUiBXSU5BUEkgbHN0cmNweW4zMlcoIExQV1NUUiBkc3QsIExQQ1dTVFIgc3JjLCBJTlQzMiBuICkKIHsKICAgICBMUFdTVFIgcCA9IGRzdDsKLSAgICBkcHJpbnRmX2luZm8oc3RyaW5nLCJzdHJjcHluIEwlcyBmb3IgJWQgY2hhcnNcbiIsCisgICAgVFJBQ0Uoc3RyaW5nLCJzdHJjcHluIEwlcyBmb3IgJWQgY2hhcnNcbiIsCiAJCSAgIGRlYnVnc3RyX3duIChzcmMsbiksIG4pOwogICAgIC8qIFdpbmRvd3MgZG9lcyBub3QgY2hlY2sgZm9yIE5VTEwgcG9pbnRlcnMgaGVyZSwgc28gd2UgZG9uJ3QgZWl0aGVyICovCiAgICAgd2hpbGUgKChuLS0gPiAxKSAmJiAqc3JjKSAqcCsrID0gKnNyYysrOwpAQCAtMzMzLDcgKzMzNyw3IEBACiAgICAgICogaW4gbHN0cmxlbigpIC4uLiB3ZSBjaGVjayBvbmx5IGZvciBOVUxMIHBvaW50ZXIgcmVmZXJlbmNlLgogICAgICAqIC0gTWFyY3VzIE1laXNzbmVyCiAgICAgICovCi0gICAgZHByaW50Zl9pbmZvKHN0cmluZywic3RybGVuICVzXG4iLCBkZWJ1Z3N0cl9hIChzdHIpKTsKKyAgICBUUkFDRShzdHJpbmcsInN0cmxlbiAlc1xuIiwgZGVidWdzdHJfYSAoc3RyKSk7CiAgICAgaWYgKCFzdHIpIHJldHVybiAwOwogICAgIHJldHVybiAoSU5UMzIpc3RybGVuKHN0cik7CiB9CkBAIC0zNDUsNyArMzQ5LDcgQEAKIElOVDMyIFdJTkFQSSBsc3RybGVuMzJXKCBMUENXU1RSIHN0ciApCiB7CiAgICAgSU5UMzIgbGVuID0gMDsKLSAgICBkcHJpbnRmX2luZm8oc3RyaW5nLCJzdHJsZW4gTCVzXG4iLCBkZWJ1Z3N0cl93IChzdHIpKTsKKyAgICBUUkFDRShzdHJpbmcsInN0cmxlbiBMJXNcbiIsIGRlYnVnc3RyX3cgKHN0cikpOwogICAgIGlmICghc3RyKSByZXR1cm4gMDsKICAgICB3aGlsZSAoKnN0cisrKSBsZW4rKzsKICAgICByZXR1cm4gbGVuOwpAQCAtMzU3LDcgKzM2MSw3IEBACiAgKi8KIElOVDMyIFdJTkFQSSBsc3RybmNtcDMyQSggTFBDU1RSIHN0cjEsIExQQ1NUUiBzdHIyLCBJTlQzMiBuICkKIHsKLSAgICBkcHJpbnRmX2luZm8oc3RyaW5nLCJzdHJuY21wICVzIGFuZCAlcyBmb3IgJWQgY2hhcnNcbiIsCisgICAgVFJBQ0Uoc3RyaW5nLCJzdHJuY21wICVzIGFuZCAlcyBmb3IgJWQgY2hhcnNcbiIsCiAJCSAgIGRlYnVnc3RyX2FuIChzdHIxLCBuKSwgZGVidWdzdHJfYW4gKHN0cjIsIG4pLCBuKTsKICAgICByZXR1cm4gKElOVDMyKXN0cm5jbXAoIHN0cjEsIHN0cjIsIG4gKTsKIH0KQEAgLTM2OCw3ICszNzIsNyBAQAogICovCiBJTlQzMiBXSU5BUEkgbHN0cm5jbXAzMlcoIExQQ1dTVFIgc3RyMSwgTFBDV1NUUiBzdHIyLCBJTlQzMiBuICkKIHsKLSAgICBkcHJpbnRmX2luZm8oc3RyaW5nLCJzdHJuY21wIEwlcyBhbmQgTCVzIGZvciAlZCBjaGFyc1xuIiwKKyAgICBUUkFDRShzdHJpbmcsInN0cm5jbXAgTCVzIGFuZCBMJXMgZm9yICVkIGNoYXJzXG4iLAogCQkgICBkZWJ1Z3N0cl93biAoc3RyMSwgbiksIGRlYnVnc3RyX3duIChzdHIyLCBuKSwgbik7CiAgICAgaWYgKCFuKSByZXR1cm4gMDsKICAgICB3aGlsZSAoKC0tbiA+IDApICYmICpzdHIxICYmICgqc3RyMSA9PSAqc3RyMikpIHsgc3RyMSsrOyBzdHIyKys7IH0KQEAgLTM4Myw3ICszODcsNyBAQAogewogICAgIElOVDMyIHJlczsKIAotICAgIGRwcmludGZfaW5mbyhzdHJpbmcsInN0cm5jbXBpICVzIGFuZCAlcyBmb3IgJWQgY2hhcnNcbiIsCisgICAgVFJBQ0Uoc3RyaW5nLCJzdHJuY21waSAlcyBhbmQgJXMgZm9yICVkIGNoYXJzXG4iLAogCQkgICBkZWJ1Z3N0cl9hbiAoc3RyMSwgbiksIGRlYnVnc3RyX2FuIChzdHIyLCBuKSwgbik7CiAgICAgaWYgKCFuKSByZXR1cm4gMDsKICAgICB3aGlsZSAoKC0tbiA+IDApICYmICpzdHIxKQpAQCAtNDAwLDcgKzQwNCw3IEBACiB7CiAgICAgSU5UMzIgcmVzOwogCi0gICAgZHByaW50Zl9pbmZvKHN0cmluZywic3RybmNtcGkgTCVzIGFuZCBMJXMgZm9yICVkIGNoYXJzXG4iLAorICAgIFRSQUNFKHN0cmluZywic3RybmNtcGkgTCVzIGFuZCBMJXMgZm9yICVkIGNoYXJzXG4iLAogCQkgICBkZWJ1Z3N0cl93biAoc3RyMSwgbiksIGRlYnVnc3RyX3duIChzdHIyLCBuKSwgbik7CiAgICAgaWYgKCFuKSByZXR1cm4gMDsKICAgICB3aGlsZSAoKC0tbiA+IDApICYmICpzdHIxKQpAQCAtNDM4LDYgKzQ0Miw4IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIGxzdHJjcHluQXRvVyAgIChOb3QgYSBXaW5kb3dzIEFQSSkKKyAqIE5vdGU6IHRoaXMgZnVuY3Rpb24gZGlmZmVycyBmcm9tIHRoZSBVTklYIHN0cm5jcHksIGl0IF9hbHdheXNfIHdyaXRlcworICogYSB0ZXJtaW5hdGluZyBcMAogICovCiBMUFdTVFIgV0lOQVBJIGxzdHJjcHluQXRvVyggTFBXU1RSIGRzdCwgTFBDU1RSIHNyYywgSU5UMzIgbiApCiB7CkBAIC00NTAsNiArNDU2LDggQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgbHN0cmNweW5XdG9BICAgKE5vdCBhIFdpbmRvd3MgQVBJKQorICogTm90ZTogdGhpcyBmdW5jdGlvbiBkaWZmZXJzIGZyb20gdGhlIFVOSVggc3RybmNweSwgaXQgX2Fsd2F5c18gd3JpdGVzCisgKiBhIHRlcm1pbmF0aW5nIFwwCiAgKi8KIExQU1RSIFdJTkFQSSBsc3RyY3B5bld0b0EoIExQU1RSIGRzdCwgTFBDV1NUUiBzcmMsIElOVDMyIG4gKQogewpAQCAtNTQxLDkgKzU0OSw5IEBACiB7CiAgICAgTFBTVFIgb2xkZCA9IGQ7CiAgICAgaWYgKCFzIHx8ICFkKSByZXR1cm4gVFJVRTsKLSAgICBkcHJpbnRmX2luZm8oc3RyaW5nLCJDaGFyVG9PZW0gJXNcbiIsIGRlYnVnc3RyX2EgKHMpKTsKKyAgICBUUkFDRShzdHJpbmcsIkNoYXJUb09lbSAlc1xuIiwgZGVidWdzdHJfYSAocykpOwogICAgIHdoaWxlICgoKmQrKyA9IEFOU0lfVE9fT0VNKCpzKyspKSk7Ci0gICAgZHByaW50Zl9pbmZvKHN0cmluZywiICAgICAgIHRvICVzXG4iLCBkZWJ1Z3N0cl9hIChvbGRkKSk7CisgICAgVFJBQ0Uoc3RyaW5nLCIgICAgICAgdG8gJXNcbiIsIGRlYnVnc3RyX2EgKG9sZGQpKTsKICAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtNTc1LDkgKzU4Myw5IEBACiB7CiAgICAgTFBTVFIgb2xkZCA9IGQ7CiAgICAgaWYgKCFzIHx8ICFkKSByZXR1cm4gVFJVRTsKLSAgICBkcHJpbnRmX2luZm8oc3RyaW5nLCJDaGFyVG9PZW0gTCVzXG4iLCBkZWJ1Z3N0cl93IChzKSk7CisgICAgVFJBQ0Uoc3RyaW5nLCJDaGFyVG9PZW0gTCVzXG4iLCBkZWJ1Z3N0cl93IChzKSk7CiAgICAgd2hpbGUgKCgqZCsrID0gQU5TSV9UT19PRU0oKnMrKykpKTsKLSAgICBkcHJpbnRmX2luZm8oc3RyaW5nLCIgICAgICAgdG8gJXNcbiIsIGRlYnVnc3RyX2EgKG9sZGQpKTsKKyAgICBUUkFDRShzdHJpbmcsIiAgICAgICB0byAlc1xuIiwgZGVidWdzdHJfYSAob2xkZCkpOwogICAgIHJldHVybiBUUlVFOwogfQogCkBAIC01ODgsOSArNTk2LDkgQEAKIEJPT0wzMiBXSU5BUEkgT2VtVG9DaGFyMzJBKCBMUENTVFIgcywgTFBTVFIgZCApCiB7CiAgICAgTFBTVFIgb2xkZCA9IGQ7Ci0gICAgZHByaW50Zl9pbmZvKHN0cmluZywiT2VtVG9DaGFyICVzXG4iLCBkZWJ1Z3N0cl9hIChzKSk7CisgICAgVFJBQ0Uoc3RyaW5nLCJPZW1Ub0NoYXIgJXNcbiIsIGRlYnVnc3RyX2EgKHMpKTsKICAgICB3aGlsZSAoKCpkKysgPSBPRU1fVE9fQU5TSSgqcysrKSkpOwotICAgIGRwcmludGZfaW5mbyhzdHJpbmcsIiAgICAgICB0byAlc1xuIiwgZGVidWdzdHJfYSAob2xkZCkpOworICAgIFRSQUNFKHN0cmluZywiICAgICAgIHRvICVzXG4iLCBkZWJ1Z3N0cl9hIChvbGRkKSk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKQEAgLTYwMCw3ICs2MDgsNyBAQAogICovCiBCT09MMzIgV0lOQVBJIE9lbVRvQ2hhckJ1ZmYzMkEoIExQQ1NUUiBzLCBMUFNUUiBkLCBEV09SRCBsZW4gKQogewotICAgIGRwcmludGZfaW5mbyhzdHJpbmcsIk9lbVRvQ2hhckJ1ZmYgJXNcbiIsIGRlYnVnc3RyX2FuIChzLCBsZW4pKTsKKyAgICBUUkFDRShzdHJpbmcsIk9lbVRvQ2hhckJ1ZmYgJXNcbiIsIGRlYnVnc3RyX2FuIChzLCBsZW4pKTsKICAgICB3aGlsZSAobGVuLS0pICpkKysgPSBPRU1fVE9fQU5TSSgqcysrKTsKICAgICByZXR1cm4gVFJVRTsKIH0KQEAgLTYxMSw3ICs2MTksNyBAQAogICovCiBCT09MMzIgV0lOQVBJIE9lbVRvQ2hhckJ1ZmYzMlcoIExQQ1NUUiBzLCBMUFdTVFIgZCwgRFdPUkQgbGVuICkKIHsKLSAgICBkcHJpbnRmX2luZm8oc3RyaW5nLCJPZW1Ub0NoYXJCdWZmICVzXG4iLCBkZWJ1Z3N0cl9hbiAocywgbGVuKSk7CisgICAgVFJBQ0Uoc3RyaW5nLCJPZW1Ub0NoYXJCdWZmICVzXG4iLCBkZWJ1Z3N0cl9hbiAocywgbGVuKSk7CiAgICAgd2hpbGUgKGxlbi0tKSAqZCsrID0gKFdDSEFSKU9FTV9UT19BTlNJKCpzKyspOwogICAgIHJldHVybiBUUlVFOwogfQpkaWZmIC0tZ2l0IGEvbWVtb3J5L3ZpcnR1YWwuYyBiL21lbW9yeS92aXJ0dWFsLmMKaW5kZXggMGVlNGYyMS4uOTM3ZTQ4MiAxMDA2NDQKLS0tIGEvbWVtb3J5L3ZpcnR1YWwuYworKysgYi9tZW1vcnkvdmlydHVhbC5jCkBAIC0xMDksNyArMTA5LDcgQEAKIH07CiAKICNkZWZpbmUgVklSVFVBTF9ERUJVR19EVU1QX1ZJRVcodmlldykgXAotICAgaWYgKCFkZWJ1Z2dpbmdfaW5mbyh2aXJ0dWFsKSk7IGVsc2UgVklSVFVBTF9EdW1wVmlldyh2aWV3KQorICAgaWYgKCFUUkFDRV9PTih2aXJ0dWFsKSk7IGVsc2UgVklSVFVBTF9EdW1wVmlldyh2aWV3KQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBWSVJUVUFMX0dldFByb3RTdHIKQEAgLTM0NSw3ICszNDUsNyBAQAogc3RhdGljIEJPT0wzMiBWSVJUVUFMX1NldFByb3QoIEZJTEVfVklFVyAqdmlldywgVUlOVDMyIGJhc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIHNpemUsIEJZVEUgdnByb3QgKQogewotICAgIGRwcmludGZfaW5mbyh2aXJ0dWFsLCAiVklSVFVBTF9TZXRQcm90OiAlMDh4LSUwOHggJXNcbiIsCisgICAgVFJBQ0UodmlydHVhbCwgIiUwOHgtJTA4eCAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgIGJhc2UsIGJhc2UgKyBzaXplIC0gMSwgVklSVFVBTF9HZXRQcm90U3RyKCB2cHJvdCApICk7CiAKICAgICBpZiAobXByb3RlY3QoICh2b2lkICopYmFzZSwgc2l6ZSwgVklSVFVBTF9HZXRVbml4UHJvdCh2cHJvdCkgKSkKQEAgLTQzNywxNCArNDM3LDIzIEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgVmlydHVhbEFsbG9jICAgKEtFUk5FTDMyLjU0OCkKKyAqIFJlc2VydmVzIG9yIGNvbW1pdHMgYSByZWdpb24gb2YgcGFnZXMgaW4gdmlydHVhbCBhZGRyZXNzIHNwYWNlCisgKgorICogUkVUVVJOUworICoJQmFzZSBhZGRyZXNzIG9mIGFsbG9jYXRlZCByZWdpb24gb2YgcGFnZXMKKyAqCU5VTEw6IEZhaWx1cmUKICAqLwotTFBWT0lEIFdJTkFQSSBWaXJ0dWFsQWxsb2MoIExQVk9JRCBhZGRyLCBEV09SRCBzaXplLCBEV09SRCB0eXBlLCBEV09SRCBwcm90ZWN0KQoteworTFBWT0lEIFdJTkFQSSBWaXJ0dWFsQWxsb2MoCisgICAgICAgICAgICAgIExQVk9JRCBhZGRyLCAgLyogQWRkcmVzcyBvZiByZWdpb24gdG8gcmVzZXJ2ZSBvciBjb21taXQgKi8KKyAgICAgICAgICAgICAgRFdPUkQgc2l6ZSwgICAvKiBTaXplIG9mIHJlZ2lvbiAqLworICAgICAgICAgICAgICBEV09SRCB0eXBlLCAgIC8qIFR5cGUgb2YgYWxsb2NhdGlvbiAqLworICAgICAgICAgICAgICBEV09SRCBwcm90ZWN0IC8qIFR5cGUgb2YgYWNjZXNzIHByb3RlY3Rpb24gKi8KKykgewogICAgIEZJTEVfVklFVyAqdmlldzsKICAgICBVSU5UMzIgYmFzZSwgcHRyLCB2aWV3X3NpemU7CiAgICAgQllURSB2cHJvdDsKIAotICAgIGRwcmludGZfaW5mbyh2aXJ0dWFsLCAiVmlydHVhbEFsbG9jOiAlMDh4ICUwOGx4ICVseCAlMDhseFxuIiwKKyAgICBUUkFDRSh2aXJ0dWFsLCAiJTA4eCAlMDhseCAlbHggJTA4bHhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAoVUlOVDMyKWFkZHIsIHNpemUsIHR5cGUsIHByb3RlY3QgKTsKIAogICAgIC8qIFJvdW5kIHBhcmFtZXRlcnMgdG8gYSBwYWdlIGJvdW5kYXJ5ICovCkBAIC01NTIsMTMgKzU2MSwyMSBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgIFZpcnR1YWxGcmVlICAgKEtFUk5FTDMyLjU1MCkKKyAqIFJlbGVhc2Ugb3IgZGVjb21taXRzIGEgcmVnaW9uIG9mIHBhZ2VzIGluIHZpcnR1YWwgYWRkcmVzcyBzcGFjZS4KKyAqIAorICogUkVUVVJOUworICoJVFJVRTogU3VjY2VzcworICoJRkFMU0U6IEZhaWx1cmUKICAqLwotQk9PTDMyIFdJTkFQSSBWaXJ0dWFsRnJlZSggTFBWT0lEIGFkZHIsIERXT1JEIHNpemUsIERXT1JEIHR5cGUgKQoteworQk9PTDMyIFdJTkFQSSBWaXJ0dWFsRnJlZSgKKyAgICAgICAgICAgICAgTFBWT0lEIGFkZHIsIC8qIEFkZHJlc3Mgb2YgcmVnaW9uIG9mIGNvbW1pdHRlZCBwYWdlcyAqLworICAgICAgICAgICAgICBEV09SRCBzaXplLCAgLyogU2l6ZSBvZiByZWdpb24gKi8KKyAgICAgICAgICAgICAgRFdPUkQgdHlwZSAgIC8qIFR5cGUgb2Ygb3BlcmF0aW9uICovCispIHsKICAgICBGSUxFX1ZJRVcgKnZpZXc7CiAgICAgVUlOVDMyIGJhc2U7CiAKLSAgICBkcHJpbnRmX2luZm8odmlydHVhbCwgIlZpcnR1YWxGcmVlOiAlMDh4ICUwOGx4ICVseFxuIiwKKyAgICBUUkFDRSh2aXJ0dWFsLCAiJTA4eCAlMDhseCAlbHhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAoVUlOVDMyKWFkZHIsIHNpemUsIHR5cGUgKTsKIAogICAgIC8qIEZpeCB0aGUgcGFyYW1ldGVycyAqLwpAQCAtNjAyLDMzICs2MTksNjEgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICBWaXJ0dWFsTG9jayAgIChLRVJORUwzMi41NTEpCisgKiBMb2NrcyB0aGUgc3BlY2lmaWVkIHJlZ2lvbiBvZiB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UKKyAqIAorICogTk9URQorICoJQWx3YXlzIHJldHVybnMgVFJVRQorICoKKyAqIFJFVFVSTlMKKyAqCVRSVUU6IFN1Y2Nlc3MKKyAqCUZBTFNFOiBGYWlsdXJlCiAgKi8KLUJPT0wzMiBXSU5BUEkgVmlydHVhbExvY2soIExQVk9JRCBhZGRyLCBEV09SRCBzaXplICkKLXsKK0JPT0wzMiBXSU5BUEkgVmlydHVhbExvY2soCisgICAgICAgICAgICAgIExQVk9JRCBhZGRyLCAvKiBBZGRyZXNzIG9mIGZpcnN0IGJ5dGUgb2YgcmFuZ2UgdG8gbG9jayAqLworICAgICAgICAgICAgICBEV09SRCBzaXplICAgLyogTnVtYmVyIG9mIGJ5dGVzIGluIHJhbmdlIHRvIGxvY2sgKi8KKykgewogICAgIHJldHVybiBUUlVFOwogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgVmlydHVhbFVubG9jayAgIChLRVJORUwzMi41NTYpCisgKiBVbmxvY2tzIGEgcmFuZ2Ugb2YgcGFnZXMgaW4gdGhlIHZpcnR1YWwgYWRkcmVzcyBzcGFjZQorICoKKyAqIE5PVEUKKyAqCUFsd2F5cyByZXR1cm5zIFRSVUUKKyAqCisgKiBSRVRVUk5TCisgKglUUlVFOiBTdWNjZXNzCisgKglGQUxTRTogRmFpbHVyZQogICovCi1CT09MMzIgV0lOQVBJIFZpcnR1YWxVbmxvY2soIExQVk9JRCBhZGRyLCBEV09SRCBzaXplICkKLXsKK0JPT0wzMiBXSU5BUEkgVmlydHVhbFVubG9jaygKKyAgICAgICAgICAgICAgTFBWT0lEIGFkZHIsIC8qIEFkZHJlc3Mgb2YgZmlyc3QgYnl0ZSBvZiByYW5nZSAqLworICAgICAgICAgICAgICBEV09SRCBzaXplICAgLyogTnVtYmVyIG9mIGJ5dGVzIGluIHJhbmdlICovCispIHsKICAgICByZXR1cm4gVFJVRTsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgIFZpcnR1YWxQcm90ZWN0ICAgKEtFUk5FTDMyLjU1MikKKyAqIENoYW5nZXMgdGhlIGFjY2VzcyBwcm90ZWN0aW9uIG9uIGEgcmVnaW9uIG9mIGNvbW1pdHRlZCBwYWdlcworICoKKyAqIFJFVFVSTlMKKyAqCVRSVUU6IFN1Y2Nlc3MKKyAqCUZBTFNFOiBGYWlsdXJlCiAgKi8KLUJPT0wzMiBXSU5BUEkgVmlydHVhbFByb3RlY3QoIExQVk9JRCBhZGRyLCBEV09SRCBzaXplLCBEV09SRCBuZXdfcHJvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRFdPUkQgb2xkX3Byb3QgKQoteworQk9PTDMyIFdJTkFQSSBWaXJ0dWFsUHJvdGVjdCgKKyAgICAgICAgICAgICAgTFBWT0lEIGFkZHIsICAgICAvKiBBZGRyZXNzIG9mIHJlZ2lvbiBvZiBjb21taXR0ZWQgcGFnZXMgKi8KKyAgICAgICAgICAgICAgRFdPUkQgc2l6ZSwgICAgICAvKiBTaXplIG9mIHJlZ2lvbiAqLworICAgICAgICAgICAgICBEV09SRCBuZXdfcHJvdCwgIC8qIERlc2lyZWQgYWNjZXNzIHByb3RlY3Rpb24gKi8KKyAgICAgICAgICAgICAgTFBEV09SRCBvbGRfcHJvdCAvKiBBZGRyZXNzIG9mIHZhcmlhYmxlIHRvIGdldCBvbGQgcHJvdGVjdGlvbiAqLworKSB7CiAgICAgRklMRV9WSUVXICp2aWV3OwogICAgIFVJTlQzMiBiYXNlLCBpOwogICAgIEJZVEUgdnByb3QsICpwOwogCi0gICAgZHByaW50Zl9pbmZvKHZpcnR1YWwsICJWaXJ0dWFsUHJvdGVjdDogJTA4eCAlMDhseCAlMDhseFxuIiwKKyAgICBUUkFDRSh2aXJ0dWFsLCAiJTA4eCAlMDhseCAlMDhseFxuIiwKICAgICAgICAgICAgICAgICAgICAgIChVSU5UMzIpYWRkciwgc2l6ZSwgbmV3X3Byb3QgKTsKIAogICAgIC8qIEZpeCB0aGUgcGFyYW1ldGVycyAqLwpAQCAtNjYzLDEwICs3MDgsMjAgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICBWaXJ0dWFsUHJvdGVjdEV4ICAgKEtFUk5FTDMyLjU1MykKKyAqIENoYW5nZXMgdGhlIGFjY2VzcyBwcm90ZWN0aW9uIG9uIGEgcmVnaW9uIG9mIGNvbW1pdHRlZCBwYWdlcyBpbiB0aGUKKyAqIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSBvZiBhIHNwZWNpZmllZCBwcm9jZXNzCisgKgorICogUkVUVVJOUworICoJVFJVRTogU3VjY2VzcworICoJRkFMU0U6IEZhaWx1cmUKICAqLwotQk9PTDMyIFdJTkFQSSBWaXJ0dWFsUHJvdGVjdEV4KCBIQU5ETEUzMiBoYW5kbGUsIExQVk9JRCBhZGRyLCBEV09SRCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBuZXdfcHJvdCwgTFBEV09SRCBvbGRfcHJvdCApCi17CitCT09MMzIgV0lOQVBJIFZpcnR1YWxQcm90ZWN0RXgoCisgICAgICAgICAgICAgIEhBTkRMRTMyIGhhbmRsZSwgLyogSGFuZGxlIG9mIHByb2Nlc3MgKi8KKyAgICAgICAgICAgICAgTFBWT0lEIGFkZHIsICAgICAvKiBBZGRyZXNzIG9mIHJlZ2lvbiBvZiBjb21taXR0ZWQgcGFnZXMgKi8KKyAgICAgICAgICAgICAgRFdPUkQgc2l6ZSwgICAgICAvKiBTaXplIG9mIHJlZ2lvbiAqLworICAgICAgICAgICAgICBEV09SRCBuZXdfcHJvdCwgIC8qIERlc2lyZWQgYWNjZXNzIHByb3RlY3Rpb24gKi8KKwkgICAgICBMUERXT1JEIG9sZF9wcm90IC8qIEFkZHJlc3Mgb2YgdmFyaWFibGUgdG8gZ2V0IG9sZCBwcm90ZWN0aW9uICovCispIHsKICAgICBCT09MMzIgcmV0ID0gRkFMU0U7CiAKICAgICBQREIzMiAqcGRiID0gUFJPQ0VTU19HZXRQdHIoIGhhbmRsZSwgUFJPQ0VTU19WTV9PUEVSQVRJT04gKTsKQEAgLTY4NCwxMCArNzM5LDE2IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgVmlydHVhbFF1ZXJ5ICAgKEtFUk5FTDMyLjU1NCkKKyAqIFByb3ZpZGVzIGluZm8gYWJvdXQgYSByYW5nZSBvZiBwYWdlcyBpbiB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UKKyAqCisgKiBSRVRVUk5TCisgKglOdW1iZXIgb2YgYnl0ZXMgcmV0dXJuZWQgaW4gaW5mb3JtYXRpb24gYnVmZmVyCiAgKi8KLUJPT0wzMiBXSU5BUEkgVmlydHVhbFF1ZXJ5KCBMUENWT0lEIGFkZHIsIExQTUVNT1JZX0JBU0lDX0lORk9STUFUSU9OIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgbGVuICkKLXsKK0RXT1JEIFdJTkFQSSBWaXJ0dWFsUXVlcnkoCisgICAgICAgICAgICAgTFBDVk9JRCBhZGRyLCAvKiBBZGRyZXNzIG9mIHJlZ2lvbiAqLworICAgICAgICAgICAgIExQTUVNT1JZX0JBU0lDX0lORk9STUFUSU9OIGluZm8sIC8qIEFkZHJlc3Mgb2YgaW5mbyBidWZmZXIgKi8KKyAgICAgICAgICAgICBEV09SRCBsZW4gICAgIC8qIFNpemUgb2YgYnVmZmVyICovCispIHsKICAgICBGSUxFX1ZJRVcgKnZpZXcgPSBWSVJUVUFMX0ZpcnN0VmlldzsKICAgICBVSU5UMzIgYmFzZSA9IFJPVU5EX0FERFIoIGFkZHIgKTsKICAgICBVSU5UMzIgYWxsb2NfYmFzZSA9IDA7CkBAIC03NDAsMTcgKzgwMSwyNSBAQAogICAgIGluZm8tPkJhc2VBZGRyZXNzICAgID0gKExQVk9JRCliYXNlOwogICAgIGluZm8tPkFsbG9jYXRpb25CYXNlID0gKExQVk9JRClhbGxvY19iYXNlOwogICAgIGluZm8tPlJlZ2lvblNpemUgICAgID0gc2l6ZSAtIChiYXNlIC0gYWxsb2NfYmFzZSk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHNpemVvZigqaW5mbyk7CiB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICBWaXJ0dWFsUXVlcnlFeCAgIChLRVJORUwzMi41NTUpCisgKiBQcm92aWRlcyBpbmZvIGFib3V0IGEgcmFuZ2Ugb2YgcGFnZXMgaW4gdmlydHVhbCBhZGRyZXNzIHNwYWNlIG9mIGEKKyAqIHNwZWNpZmllZCBwcm9jZXNzCisgKgorICogUkVUVVJOUworICoJTnVtYmVyIG9mIGJ5dGVzIHJldHVybmVkIGluIGluZm9ybWF0aW9uIGJ1ZmZlcgogICovCi1CT09MMzIgV0lOQVBJIFZpcnR1YWxRdWVyeUV4KCBIQU5ETEUzMiBoYW5kbGUsIExQQ1ZPSUQgYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQTUVNT1JZX0JBU0lDX0lORk9STUFUSU9OIGluZm8sIERXT1JEIGxlbiApCi17Ci0gICAgQk9PTDMyIHJldCA9IEZBTFNFOworRFdPUkQgV0lOQVBJIFZpcnR1YWxRdWVyeUV4KAorICAgICAgICAgICAgIEhBTkRMRTMyIGhhbmRsZSwgLyogSGFuZGxlIG9mIHByb2Nlc3MgKi8KKyAgICAgICAgICAgICBMUENWT0lEIGFkZHIsICAgIC8qIEFkZHJlc3Mgb2YgcmVnaW9uICovCisgICAgICAgICAgICAgTFBNRU1PUllfQkFTSUNfSU5GT1JNQVRJT04gaW5mbywgLyogQWRkcmVzcyBvZiBpbmZvIGJ1ZmZlciAqLworICAgICAgICAgICAgIERXT1JEIGxlbiAgICAgICAgLyogU2l6ZSBvZiBidWZmZXIgKi8KKykgeworICAgIERXT1JEIHJldCA9IGxlbjsKIAogICAgIFBEQjMyICpwZGIgPSBQUk9DRVNTX0dldFB0ciggaGFuZGxlLCBQUk9DRVNTX1FVRVJZX0lORk9STUFUSU9OICk7CiAgICAgaWYgKHBkYikKQEAgLTc2Nyw5ICs4MzYsMTUgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICBJc0JhZFJlYWRQdHIzMiAgIChLRVJORUwzMi4zNTQpCisgKgorICogUkVUVVJOUworICoJRkFMU0U6IFByb2Nlc3MgaGFzIHJlYWQgYWNjZXNzIHRvIGVudGlyZSBibG9jaworICogICAgICBUUlVFOiBPdGhlcndpc2UKICAqLwotQk9PTDMyIFdJTkFQSSBJc0JhZFJlYWRQdHIzMiggTFBDVk9JRCBwdHIsIFVJTlQzMiBzaXplICkKLXsKK0JPT0wzMiBXSU5BUEkgSXNCYWRSZWFkUHRyMzIoCisgICAgICAgICAgICAgIExQQ1ZPSUQgcHRyLCAvKiBBZGRyZXNzIG9mIG1lbW9yeSBibG9jayAqLworICAgICAgICAgICAgICBVSU5UMzIgc2l6ZSAgLyogU2l6ZSBvZiBibG9jayAqLworKSB7CiAgICAgcmV0dXJuICFWSVJUVUFMX0NoZWNrRmxhZ3MoIChVSU5UMzIpcHRyLCBzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUFJPVF9SRUFEIHwgVlBST1RfQ09NTUlUVEVEICk7CiB9CkBAIC03NzcsOSArODUyLDE1IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgSXNCYWRXcml0ZVB0cjMyICAgKEtFUk5FTDMyLjM1NykKKyAqCisgKiBSRVRVUk5TCisgKglGQUxTRTogUHJvY2VzcyBoYXMgd3JpdGUgYWNjZXNzIHRvIGVudGlyZSBibG9jaworICogICAgICBUUlVFOiBPdGhlcndpc2UKICAqLwotQk9PTDMyIFdJTkFQSSBJc0JhZFdyaXRlUHRyMzIoIExQVk9JRCBwdHIsIFVJTlQzMiBzaXplICkKLXsKK0JPT0wzMiBXSU5BUEkgSXNCYWRXcml0ZVB0cjMyKAorCSAgICAgIExQVk9JRCBwdHIsIC8qIGFkZHJlc3Mgb2YgbWVtb3J5IGJsb2NrICovCisJICAgICAgVUlOVDMyIHNpemUgLyogc2l6ZSBvZiBibG9jayAqLworKSB7CiAgICAgcmV0dXJuICFWSVJUVUFMX0NoZWNrRmxhZ3MoIChVSU5UMzIpcHRyLCBzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUFJPVF9XUklURSB8IFZQUk9UX0NPTU1JVFRFRCApOwogfQpAQCAtODE0LDkgKzg5NSwxNSBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgIElzQmFkU3RyaW5nUHRyMzJBICAgKEtFUk5FTDMyLjM1NSkKKyAqCisgKiBSRVRVUk5TCisgKglGQUxTRTogUmVhZCBhY2Nlc3MgdG8gYWxsIGJ5dGVzIGluIHN0cmluZworICoJVFJVRTogRWxzZQogICovCi1CT09MMzIgV0lOQVBJIElzQmFkU3RyaW5nUHRyMzJBKCBMUENTVFIgc3RyLCBVSU5UMzIgbWF4ICkKLXsKK0JPT0wzMiBXSU5BUEkgSXNCYWRTdHJpbmdQdHIzMkEoCisgICAgICAgICAgICAgIExQQ1NUUiBzdHIsIC8qIEFkZHJlc3Mgb2Ygc3RyaW5nICovCisgICAgICAgICAgICAgIFVJTlQzMiBtYXggIC8qIE1heGltdW0gc2l6ZSBvZiBzdHJpbmcgKi8KKykgewogICAgIEZJTEVfVklFVyAqdmlldzsKICAgICBVSU5UMzIgcGFnZSwgY291bnQ7CiAKQEAgLTg0Miw5ICs5MjksMTUgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICBJc0JhZFN0cmluZ1B0cjMyVyAgIChLRVJORUwzMi4zNTYpCisgKgorICogUkVUVVJOUworICoJRkFMU0U6IFJlYWQgYWNjZXNzIHRvIGFsbCBieXRlcyBpbiBzdHJpbmcKKyAqCVRSVUU6IEVsc2UKICAqLwotQk9PTDMyIFdJTkFQSSBJc0JhZFN0cmluZ1B0cjMyVyggTFBDV1NUUiBzdHIsIFVJTlQzMiBtYXggKQoteworQk9PTDMyIFdJTkFQSSBJc0JhZFN0cmluZ1B0cjMyVygKKyAgICAgICAgICAgICAgTFBDV1NUUiBzdHIsIC8qIEFkZHJlc3Mgb2Ygc3RyaW5nICovCisgICAgICAgICAgICAgIFVJTlQzMiBtYXggICAvKiBNYXhpbXVtIHNpemUgb2Ygc3RyaW5nICovCispIHsKICAgICBGSUxFX1ZJRVcgKnZpZXc7CiAgICAgVUlOVDMyIHBhZ2UsIGNvdW50OwogCkBAIC04NzAsMTEgKzk2MywyMSBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgIENyZWF0ZUZpbGVNYXBwaW5nMzJBICAgKEtFUk5FTDMyLjQ2KQorICogQ3JlYXRlcyBhIG5hbWVkIG9yIHVubmFtZWQgZmlsZS1tYXBwaW5nIG9iamVjdCBmb3IgdGhlIHNwZWNpZmllZCBmaWxlCisgKgorICogUkVUVVJOUworICoJSGFuZGxlIG9mIHRoZSBmaWxlLW1hcHBpbmcgb2JqZWN0CisgKgkwOiBNYXBwaW5nIG9iamVjdCBkaWQgbm90IGV4aXN0CisgKglOVUxMOiBGYWlsdXJlCiAgKi8KLUhBTkRMRTMyIFdJTkFQSSBDcmVhdGVGaWxlTWFwcGluZzMyQShIRklMRTMyIGhGaWxlLCBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBwcm90ZWN0LCBEV09SRCBzaXplX2hpZ2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgc2l6ZV9sb3csIExQQ1NUUiBuYW1lICkKLXsKK0hBTkRMRTMyIFdJTkFQSSBDcmVhdGVGaWxlTWFwcGluZzMyQSgKKyAgICAgICAgICAgICAgICBIRklMRTMyIGhGaWxlLCAgIC8qIEhhbmRsZSBvZiBmaWxlIHRvIG1hcCAqLworICAgICAgICAgICAgICAgIExQU0VDVVJJVFlfQVRUUklCVVRFUyBhdHRyLCAvKiBPcHRpb25hbCBzZWN1cml0eSBhdHRyaWJ1dGVzICovCisgICAgICAgICAgICAgICAgRFdPUkQgcHJvdGVjdCwgICAvKiBQcm90ZWN0aW9uIGZvciBtYXBwaW5nIG9iamVjdCAqLworICAgICAgICAgICAgICAgIERXT1JEIHNpemVfaGlnaCwgLyogSGlnaC1vcmRlciAzMiBiaXRzIG9mIG9iamVjdCBzaXplICovCisgICAgICAgICAgICAgICAgRFdPUkQgc2l6ZV9sb3csICAvKiBMb3ctb3JkZXIgMzIgYml0cyBvZiBvYmplY3Qgc2l6ZSAqLworICAgICAgICAgICAgICAgIExQQ1NUUiBuYW1lICAgICAgLyogTmFtZSBvZiBmaWxlLW1hcHBpbmcgb2JqZWN0ICovCispIHsKICAgICBGSUxFX01BUFBJTkcgKm1hcHBpbmcgPSBOVUxMOwogICAgIEhBTkRMRTMyIGhhbmRsZTsKICAgICBCWVRFIHZwcm90OwpAQCAtOTAwLDcgKzEwMDMsNyBAQAogCiAgICAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLwogCi0gICAgZHByaW50Zl9pbmZvKHZpcnR1YWwsIkNyZWF0ZUZpbGVNYXBwaW5nMzJBKCV4LCVwLCUwOGx4LCUwOGx4JTA4bHgsJXMpXG4iLAorICAgIFRSQUNFKHZpcnR1YWwsIigleCwlcCwlMDhseCwlMDhseCUwOGx4LCVzKVxuIiwKICAgICAgICAgICAgICAgICAgICAgaEZpbGUsIGF0dHIsIHByb3RlY3QsIHNpemVfaGlnaCwgc2l6ZV9sb3csIG5hbWUgKTsKIAogICAgIHZwcm90ID0gVklSVFVBTF9HZXRQcm90KCBwcm90ZWN0ICk7CkBAIC05OTYsOSArMTA5OSwxNyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgIE9wZW5GaWxlTWFwcGluZzMyQSAgIChLRVJORUwzMi4zOTcpCisgKiBPcGVucyBhIG5hbWVkIGZpbGUtbWFwcGluZyBvYmplY3QKKyAqCisgKiBSRVRVUk5TCisgKglPcGVuIGhhbmRsZSB0byBzcGVjaWZpZWQgZmlsZS1tYXBwaW5nIG9iamVjdAorICoJTlVMTDogRmFpbHVyZQogICovCi1IQU5ETEUzMiBXSU5BUEkgT3BlbkZpbGVNYXBwaW5nMzJBKCBEV09SRCBhY2Nlc3MsIEJPT0wzMiBpbmhlcml0LCBMUENTVFIgbmFtZSApCi17CitIQU5ETEUzMiBXSU5BUEkgT3BlbkZpbGVNYXBwaW5nMzJBKAorICAgICAgICAgICAgICAgIERXT1JEIGFjY2VzcywgICAvKiBBY2Nlc3MgbW9kZSAqLworICAgICAgICAgICAgICAgIEJPT0wzMiBpbmhlcml0LCAvKiBJbmhlcml0IGZsYWcgKi8KKyAgICAgICAgICAgICAgICBMUENTVFIgbmFtZSAgICAgLyogTmFtZSBvZiBmaWxlLW1hcHBpbmcgb2JqZWN0ICovCispIHsKICAgICBIQU5ETEUzMiBoYW5kbGUgPSAwOwogICAgIEszMk9CSiAqb2JqOwogICAgIFNZU1RFTV9MT0NLKCk7CkBAIC0xMDQyLDEwICsxMTUzLDE5IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgTWFwVmlld09mRmlsZSAgIChLRVJORUwzMi4zODUpCisgKiBNYXBzIGEgdmlldyBvZiBhIGZpbGUgaW50byB0aGUgYWRkcmVzcyBzcGFjZQorICoKKyAqIFJFVFVSTlMKKyAqCVN0YXJ0aW5nIGFkZHJlc3Mgb2YgbWFwcGVkIHZpZXcKKyAqCU5VTEw6IEZhaWx1cmUKICAqLwotTFBWT0lEIFdJTkFQSSBNYXBWaWV3T2ZGaWxlKCBIQU5ETEUzMiBtYXBwaW5nLCBEV09SRCBhY2Nlc3MsIERXT1JEIG9mZnNldF9oaWdoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBvZmZzZXRfbG93LCBEV09SRCBjb3VudCApCi17CitMUFZPSUQgV0lOQVBJIE1hcFZpZXdPZkZpbGUoCisgICAgICAgICAgICAgIEhBTkRMRTMyIG1hcHBpbmcsICAvKiBGaWxlLW1hcHBpbmcgb2JqZWN0IHRvIG1hcCAqLworICAgICAgICAgICAgICBEV09SRCBhY2Nlc3MsICAgICAgLyogQWNjZXNzIG1vZGUgKi8KKyAgICAgICAgICAgICAgRFdPUkQgb2Zmc2V0X2hpZ2gsIC8qIEhpZ2gtb3JkZXIgMzIgYml0cyBvZiBmaWxlIG9mZnNldCAqLworICAgICAgICAgICAgICBEV09SRCBvZmZzZXRfbG93LCAgLyogTG93LW9yZGVyIDMyIGJpdHMgb2YgZmlsZSBvZmZzZXQgKi8KKyAgICAgICAgICAgICAgRFdPUkQgY291bnQgICAgICAgIC8qIE51bWJlciBvZiBieXRlcyB0byBtYXAgKi8KKykgewogICAgIHJldHVybiBNYXBWaWV3T2ZGaWxlRXgoIG1hcHBpbmcsIGFjY2Vzcywgb2Zmc2V0X2hpZ2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0X2xvdywgY291bnQsIE5VTEwgKTsKIH0KQEAgLTEwNTMsMTAgKzExNzMsMjAgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICBNYXBWaWV3T2ZGaWxlRXggICAoS0VSTkVMMzIuMzg2KQorICogTWFwcyBhIHZpZXcgb2YgYSBmaWxlIGludG8gdGhlIGFkZHJlc3Mgc3BhY2UKKyAqCisgKiBSRVRVUk5TCisgKglTdGFydGluZyBhZGRyZXNzIG9mIG1hcHBlZCB2aWV3CisgKglOVUxMOiBGYWlsdXJlCiAgKi8KLUxQVk9JRCBXSU5BUEkgTWFwVmlld09mRmlsZUV4KEhBTkRMRTMyIGhhbmRsZSwgRFdPUkQgYWNjZXNzLCBEV09SRCBvZmZzZXRfaGlnaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIG9mZnNldF9sb3csIERXT1JEIGNvdW50LCBMUFZPSUQgYWRkciApCi17CitMUFZPSUQgV0lOQVBJIE1hcFZpZXdPZkZpbGVFeCgKKyAgICAgICAgICAgICAgSEFORExFMzIgaGFuZGxlLCAgIC8qIEZpbGUtbWFwcGluZyBvYmplY3QgdG8gbWFwICovCisgICAgICAgICAgICAgIERXT1JEIGFjY2VzcywgICAgICAvKiBBY2Nlc3MgbW9kZSAqLworICAgICAgICAgICAgICBEV09SRCBvZmZzZXRfaGlnaCwgLyogSGlnaC1vcmRlciAzMiBiaXRzIG9mIGZpbGUgb2Zmc2V0ICovCisgICAgICAgICAgICAgIERXT1JEIG9mZnNldF9sb3csICAvKiBMb3ctb3JkZXIgMzIgYml0cyBvZiBmaWxlIG9mZnNldCAqLworICAgICAgICAgICAgICBEV09SRCBjb3VudCwgICAgICAgLyogTnVtYmVyIG9mIGJ5dGVzIHRvIG1hcCAqLworICAgICAgICAgICAgICBMUFZPSUQgYWRkciAgICAgICAgLyogU3VnZ2VzdGVkIHN0YXJ0aW5nIGFkZHJlc3MgZm9yIG1hcHBlZCB2aWV3ICovCispIHsKICAgICBGSUxFX01BUFBJTkcgKm1hcHBpbmc7CiAgICAgRklMRV9WSUVXICp2aWV3OwogICAgIFVJTlQzMiBwdHIgPSAoVUlOVDMyKS0xLCBzaXplID0gMDsKQEAgLTExMTIsNyArMTI0Miw3IEBACiAKICAgICAvKiBNYXAgdGhlIGZpbGUgKi8KIAotICAgIGRwcmludGZfaW5mbyh2aXJ0dWFsLCAiTWFwVmlld09mRmlsZTogaGFuZGxlPSV4IHNpemU9JXggb2Zmc2V0PSVseFxuIiwKKyAgICBUUkFDRSh2aXJ0dWFsLCAiaGFuZGxlPSV4IHNpemU9JXggb2Zmc2V0PSVseFxuIiwKICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwgc2l6ZSwgb2Zmc2V0X2xvdyApOwogCiAgICAgcHRyID0gKFVJTlQzMilGSUxFX2RvbW1hcCggbWFwcGluZy0+ZmlsZSwgYWRkciwgMCwgc2l6ZSwgMCwgb2Zmc2V0X2xvdywKQEAgLTExNDEsMTMgKzEyNzEsMjAgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICBGbHVzaFZpZXdPZkZpbGUgICAoS0VSTkVMMzIuMjYyKQorICogV3JpdGVzIHRvIHRoZSBkaXNrIGEgYnl0ZSByYW5nZSB3aXRoaW4gYSBtYXBwZWQgdmlldyBvZiBhIGZpbGUKKyAqCisgKiBSRVRVUk5TCisgKglUUlVFOiBTdWNjZXNzCisgKglGQUxTRTogRmFpbHVyZQogICovCi1CT09MMzIgV0lOQVBJIEZsdXNoVmlld09mRmlsZSggTFBDVk9JRCBiYXNlLCBEV09SRCBjYkZsdXNoICkKLXsKK0JPT0wzMiBXSU5BUEkgRmx1c2hWaWV3T2ZGaWxlKAorICAgICAgICAgICAgICBMUENWT0lEIGJhc2UsIC8qIFN0YXJ0IGFkZHJlc3Mgb2YgYnl0ZSByYW5nZSB0byBmbHVzaCAqLworICAgICAgICAgICAgICBEV09SRCBjYkZsdXNoIC8qIE51bWJlciBvZiBieXRlcyBpbiByYW5nZSAqLworKSB7CiAgICAgRklMRV9WSUVXICp2aWV3OwogICAgIFVJTlQzMiBhZGRyID0gUk9VTkRfQUREUiggYmFzZSApOwogCi0gICAgZHByaW50Zl9pbmZvKHZpcnR1YWwsICJGbHVzaFZpZXdPZkZpbGUgYXQgJXAgZm9yICVsZCBieXRlc1xuIiwKKyAgICBUUkFDRSh2aXJ0dWFsLCAiRmx1c2hWaWV3T2ZGaWxlIGF0ICVwIGZvciAlbGQgYnl0ZXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICBiYXNlLCBjYkZsdXNoICk7CiAKICAgICBpZiAoISh2aWV3ID0gVklSVFVBTF9GaW5kVmlldyggYWRkciApKSkKQEAgLTExNTksOCArMTI5Niw4IEBACiAgICAgaWYgKCFtc3luYyggKHZvaWQgKilhZGRyLCBjYkZsdXNoLCBNU19TWU5DICkpIHJldHVybiBUUlVFOwogICAgIFNldExhc3RFcnJvciggRVJST1JfSU5WQUxJRF9QQVJBTUVURVIgKTsKICAgICByZXR1cm4gRkFMU0U7Ci0KIH0KKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICBVbm1hcFZpZXdPZkZpbGUgICAoS0VSTkVMMzIuNTQwKQogICovCmRpZmYgLS1naXQgYS9taXNjL01ha2VmaWxlLmluIGIvbWlzYy9NYWtlZmlsZS5pbgppbmRleCBmOTcyMmRiLi4zMTkyNjRjIDEwMDY0NAotLS0gYS9taXNjL01ha2VmaWxlLmluCisrKyBiL21pc2MvTWFrZWZpbGUuaW4KQEAgLTE1LDYgKzE1LDcgQEAKIAlkZGVtbC5jIFwKIAlkZWJ1Z3N0ci5jIFwKIAllcnJvci5jIFwKKwlpbWFnZWxpc3QuYyBcCiAJbHN0ci5jIFwKIAlsemV4cGFuZC5jIFwKIAltYWluLmMgXApkaWZmIC0tZ2l0IGEvbWlzYy9hc3BpLmMgYi9taXNjL2FzcGkuYwppbmRleCAzNjNjNDI0Li44YmU0NTQwIDEwMDY0NAotLS0gYS9taXNjL2FzcGkuYworKysgYi9taXNjL2FzcGkuYwpAQCAtMTIyLDE2ICsxMjIsMTYgQEAKICAgICBzcHJpbnRmKGlkc3RyLCAic2NzaSBjJTFkdCUxZGQlMWQiLCBwcmItPlNSQl9IYUlkLCBwcmItPlNSQl9UYXJnZXQsIHByYi0+U1JCX0x1bik7CiAKICAgICBpZiAoIVBST0ZJTEVfR2V0V2luZUluaVN0cmluZyhpZHN0ciwgIkRldmljZSIsICIiLCBkZXZpY2Vfc3RyLCBzaXplb2YoZGV2aWNlX3N0cikpKSB7Ci0JZHByaW50Zl9pbmZvKGFzcGksICJUcnlpbmcgdG8gb3BlbiB1bmxpc3RlZCBzY3NpIGRldmljZSAlc1xuIiwgaWRzdHIpOworCVRSQUNFKGFzcGksICJUcnlpbmcgdG8gb3BlbiB1bmxpc3RlZCBzY3NpIGRldmljZSAlc1xuIiwgaWRzdHIpOwogCXJldHVybiAtMTsKICAgICB9CiAKLSAgICBkcHJpbnRmX2luZm8oYXNwaSwgIk9wZW5pbmcgZGV2aWNlICVzPSVzXG4iLCBpZHN0ciwgZGV2aWNlX3N0cik7CisgICAgVFJBQ0UoYXNwaSwgIk9wZW5pbmcgZGV2aWNlICVzPSVzXG4iLCBpZHN0ciwgZGV2aWNlX3N0cik7CiAKICAgICBmZCA9IG9wZW4oZGV2aWNlX3N0ciwgT19SRFdSKTsKICAgICBpZiAoZmQgPT0gLTEpIHsKIAlpbnQgc2F2ZV9lcnJvciA9IGVycm5vOwotCWRwcmludGZfd2Fybihhc3BpLCAiRXJyb3Igb3BlbmluZyBkZXZpY2UgZXJybm89JWRcbiIsIHNhdmVfZXJyb3IpOworCVdBUk4oYXNwaSwgIkVycm9yIG9wZW5pbmcgZGV2aWNlIGVycm5vPSVkXG4iLCBzYXZlX2Vycm9yKTsKIAlyZXR1cm4gLTE7CiAgICAgfQogCkBAIC0xNjIsNTIgKzE2Miw1MiBAQAogCiAgIHN3aXRjaCAocHJiLT5DREJCeXRlWzBdKSB7CiAgIGNhc2UgQ01EX0lOUVVJUlk6Ci0gICAgZHByaW50Zl9pbmZvKGFzcGksICJ7XG4iKTsKLSAgICBkcHJpbnRmX2luZm8oYXNwaSwgIlx0RVZQRDogJWRcbiIsIHByYi0+Q0RCQnl0ZVsxXSAmIDEpOwotICAgIGRwcmludGZfaW5mbyhhc3BpLCAiXHRMVU46ICVkXG4iLCAocHJiLT5DREJCeXRlWzFdICYgMHhjKSA+PiAxKTsKLSAgICBkcHJpbnRmX2luZm8oYXNwaSwgIlx0UEFHRSBDT0RFOiAlZFxuIiwgcHJiLT5DREJCeXRlWzJdKTsKLSAgICBkcHJpbnRmX2luZm8oYXNwaSwgIlx0QUxMT0NBVElPTiBMRU5HVEg6ICVkXG4iLCBwcmItPkNEQkJ5dGVbNF0pOwotICAgIGRwcmludGZfaW5mbyhhc3BpLCAiXHRDT05UUk9MOiAlZFxuIiwgcHJiLT5DREJCeXRlWzVdKTsKLSAgICBkcHJpbnRmX2luZm8oYXNwaSwgIn1cbiIpOworICAgIFRSQUNFKGFzcGksICJ7XG4iKTsKKyAgICBUUkFDRShhc3BpLCAiXHRFVlBEOiAlZFxuIiwgcHJiLT5DREJCeXRlWzFdICYgMSk7CisgICAgVFJBQ0UoYXNwaSwgIlx0TFVOOiAlZFxuIiwgKHByYi0+Q0RCQnl0ZVsxXSAmIDB4YykgPj4gMSk7CisgICAgVFJBQ0UoYXNwaSwgIlx0UEFHRSBDT0RFOiAlZFxuIiwgcHJiLT5DREJCeXRlWzJdKTsKKyAgICBUUkFDRShhc3BpLCAiXHRBTExPQ0FUSU9OIExFTkdUSDogJWRcbiIsIHByYi0+Q0RCQnl0ZVs0XSk7CisgICAgVFJBQ0UoYXNwaSwgIlx0Q09OVFJPTDogJWRcbiIsIHByYi0+Q0RCQnl0ZVs1XSk7CisgICAgVFJBQ0UoYXNwaSwgIn1cbiIpOwogICAgIGJyZWFrOwogICBjYXNlIENNRF9TQ0FOX1NDQU46Ci0gICAgZHByaW50Zl9pbmZvKGFzcGksICJUcmFuc2ZlciBMZW5ndGg6ICVkXG4iLCBwcmItPkNEQkJ5dGVbNF0pOworICAgIFRSQUNFKGFzcGksICJUcmFuc2ZlciBMZW5ndGg6ICVkXG4iLCBwcmItPkNEQkJ5dGVbNF0pOwogICAgIGJyZWFrOwogICB9CiAKLSAgZHByaW50Zl9pbmZvKGFzcGksICJIb3N0IEFkYXB0ZXI6ICVkXG4iLCBwcmItPlNSQl9IYUlkKTsKLSAgZHByaW50Zl9pbmZvKGFzcGksICJGbGFnczogJWRcbiIsIHByYi0+U1JCX0ZsYWdzKTsKKyAgVFJBQ0UoYXNwaSwgIkhvc3QgQWRhcHRlcjogJWRcbiIsIHByYi0+U1JCX0hhSWQpOworICBUUkFDRShhc3BpLCAiRmxhZ3M6ICVkXG4iLCBwcmItPlNSQl9GbGFncyk7CiAgIGlmIChUQVJHRVRfVE9fSE9TVChwcmIpKSB7Ci0gICAgZHByaW50Zl9pbmZvKGFzcGksICJcdERhdGEgdHJhbnNmZXI6IFRhcmdldCB0byBob3N0LiBMZW5ndGggY2hlY2tlZC5cbiIpOworICAgIFRSQUNFKGFzcGksICJcdERhdGEgdHJhbnNmZXI6IFRhcmdldCB0byBob3N0LiBMZW5ndGggY2hlY2tlZC5cbiIpOwogICB9CiAgIGVsc2UgaWYgKEhPU1RfVE9fVEFSR0VUKHByYikpIHsKLSAgICBkcHJpbnRmX2luZm8oYXNwaSwgIlx0RGF0YSB0cmFuc2ZlcjogSG9zdCB0byB0YXJnZXQuIExlbmd0aCBjaGVja2VkLlxuIik7CisgICAgVFJBQ0UoYXNwaSwgIlx0RGF0YSB0cmFuc2ZlcjogSG9zdCB0byB0YXJnZXQuIExlbmd0aCBjaGVja2VkLlxuIik7CiAgIH0KICAgZWxzZSBpZiAoTk9fREFUQV9UUkFOU0ZFUkVEKHByYikpIHsKLSAgICBkcHJpbnRmX2luZm8oYXNwaSwgIlx0RGF0YSB0cmFuc2Zlcjogbm9uZVxuIik7CisgICAgVFJBQ0UoYXNwaSwgIlx0RGF0YSB0cmFuc2Zlcjogbm9uZVxuIik7CiAgIH0KICAgZWxzZSB7Ci0gICAgZHByaW50Zl93YXJuKGFzcGksICJcdFRyYW5zZmVyIGJ5IHNjc2kgY21kLiBMZW5ndGggbm90IGNoZWNrZWRcbiIpOworICAgIFdBUk4oYXNwaSwgIlx0VHJhbnNmZXIgYnkgc2NzaSBjbWQuIExlbmd0aCBub3QgY2hlY2tlZFxuIik7CiAgIH0KIAotICBkcHJpbnRmX2luZm8oYXNwaSwgIlx0UmVzaWR1YWwgYnl0ZSBsZW5ndGggcmVwb3J0aW5nICVzXG4iLCBwcmItPlNSQl9GbGFncyAmIDB4NCA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOwotICBkcHJpbnRmX2luZm8oYXNwaSwgIlx0TGlua2luZyAlc1xuIiwgcHJiLT5TUkJfRmxhZ3MgJiAweDIgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKLSAgZHByaW50Zl9pbmZvKGFzcGksICJcdFBvc3RpbmcgJXNcbiIsIHByYi0+U1JCX0ZsYWdzICYgMHgxID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7Ci0gIGRwcmludGZfaW5mbyhhc3BpLCAiVGFyZ2V0OiAlZFxuIiwgcHJiLT5TUkJfVGFyZ2V0KTsKLSAgZHByaW50Zl9pbmZvKGFzcGksICJMdW46ICVkXG4iLCBwcmItPlNSQl9MdW4pOwotICBkcHJpbnRmX2luZm8oYXNwaSwgIkJ1ZkxlbjogJWxkXG4iLCBwcmItPlNSQl9CdWZMZW4pOwotICBkcHJpbnRmX2luZm8oYXNwaSwgIlNlbnNlTGVuOiAlZFxuIiwgcHJiLT5TUkJfU2Vuc2VMZW4pOwotICBkcHJpbnRmX2luZm8oYXNwaSwgIkJ1ZlB0cjogJWx4ICglcClcbiIsIHByYi0+U1JCX0J1ZlBvaW50ZXIsIGxwQnVmKTsKLSAgZHByaW50Zl9pbmZvKGFzcGksICJMaW5rUG9pbnRlciAlbHhcbiIsIHByYi0+U1JCX1JzdmQxKTsKLSAgZHByaW50Zl9pbmZvKGFzcGksICJDREIgTGVuZ3RoOiAlZFxuIiwgcHJiLT5TUkJfQ0RCTGVuKTsKLSAgZHByaW50Zl9pbmZvKGFzcGksICJQT1NUIFByb2M6ICVseFxuIiwgKERXT1JEKSBwcmItPlNSQl9Qb3N0UHJvYyk7CisgIFRSQUNFKGFzcGksICJcdFJlc2lkdWFsIGJ5dGUgbGVuZ3RoIHJlcG9ydGluZyAlc1xuIiwgcHJiLT5TUkJfRmxhZ3MgJiAweDQgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKyAgVFJBQ0UoYXNwaSwgIlx0TGlua2luZyAlc1xuIiwgcHJiLT5TUkJfRmxhZ3MgJiAweDIgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKyAgVFJBQ0UoYXNwaSwgIlx0UG9zdGluZyAlc1xuIiwgcHJiLT5TUkJfRmxhZ3MgJiAweDEgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKyAgVFJBQ0UoYXNwaSwgIlRhcmdldDogJWRcbiIsIHByYi0+U1JCX1RhcmdldCk7CisgIFRSQUNFKGFzcGksICJMdW46ICVkXG4iLCBwcmItPlNSQl9MdW4pOworICBUUkFDRShhc3BpLCAiQnVmTGVuOiAlbGRcbiIsIHByYi0+U1JCX0J1Zkxlbik7CisgIFRSQUNFKGFzcGksICJTZW5zZUxlbjogJWRcbiIsIHByYi0+U1JCX1NlbnNlTGVuKTsKKyAgVFJBQ0UoYXNwaSwgIkJ1ZlB0cjogJWx4ICglcClcbiIsIHByYi0+U1JCX0J1ZlBvaW50ZXIsIGxwQnVmKTsKKyAgVFJBQ0UoYXNwaSwgIkxpbmtQb2ludGVyICVseFxuIiwgcHJiLT5TUkJfUnN2ZDEpOworICBUUkFDRShhc3BpLCAiQ0RCIExlbmd0aDogJWRcbiIsIHByYi0+U1JCX0NEQkxlbik7CisgIFRSQUNFKGFzcGksICJQT1NUIFByb2M6ICVseFxuIiwgKERXT1JEKSBwcmItPlNSQl9Qb3N0UHJvYyk7CiAgIGNkYiA9ICZwcmItPkNEQkJ5dGVbMF07CiAgIGNtZCA9IHByYi0+Q0RCQnl0ZVswXTsKICAgZm9yIChpID0gMDsgaSA8IHByYi0+U1JCX0NEQkxlbjsgaSsrKSB7CiAgICAgaWYgKGkgIT0gMCkgZHNwcmludGYoYXNwaSwgIiwiKTsKICAgICBkc3ByaW50Zihhc3BpLCAiJTAyeCIsICpjZGIrKyk7CiAgIH0KLSAgZHByaW50Zl9pbmZvKGFzcGksICJDREIgYnVmZmVyWyVzXVxuIiwgZGJnX3N0cihhc3BpKSk7CisgIFRSQUNFKGFzcGksICJDREIgYnVmZmVyWyVzXVxuIiwgZGJnX3N0cihhc3BpKSk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0yMjIsNyArMjIyLDcgQEAKICAgICBpZiAoaSkgZHNwcmludGYoYXNwaSwgIiwiKTsKICAgICBkc3ByaW50Zihhc3BpLCAiJTAyeCIsICpjZGIrKyk7CiAgIH0KLSAgZHByaW50Zl9pbmZvKGFzcGksICJTZW5zZUFyZWFbJXNdXG4iLCBkYmdfc3RyKGFzcGkpKTsKKyAgVFJBQ0UoYXNwaSwgIlNlbnNlQXJlYVslc11cbiIsIGRiZ19zdHIoYXNwaSkpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMjM0LDcgKzIzNCw3IEBACiAKICAgc3dpdGNoIChwcmItPkNEQkJ5dGVbMF0pIHsKICAgY2FzZSBDTURfSU5RVUlSWToKLSAgICBkcHJpbnRmX2luZm8oYXNwaSwgIlZlbmRvcjogJXNcbiIsIGxwQnVmICsgSU5RVUlSWV9WRU5ET1IpOworICAgIFRSQUNFKGFzcGksICJWZW5kb3I6ICVzXG4iLCBscEJ1ZiArIElOUVVJUllfVkVORE9SKTsKICAgICBicmVhazsKICAgY2FzZSBDTURfVEVTVF9VTklUX1JFQURZOgogICAgIFByaW50U2Vuc2VBcmVhMTYocHJiKTsKQEAgLTMxMiwyMCArMzEyLDIwIEBACiAJaWYgKG15ZXJyb3IgPT0gRU5PTUVNKSB7CiAJICAgIGZwcmludGYoc3RkZXJyLCAiQVNQSTogTGludXggZ2VuZXJpYyBzY3NpIGRyaXZlclxuICBZb3UgcHJvYmFibHkgbmVlZCB0byByZS1jb21waWxlIHlvdXIga2VybmVsIHdpdGggYSBsYXJnZXIgU0dfQklHX0JVRkYgdmFsdWUgKHNnLmgpXG4gIFN1Z2dlc3QgMTMwNTYwXG4iKTsKIAl9Ci0JZHByaW50Zl93YXJuKGFzcGksICJlcnJubzogPSAlZFxuIiwgbXllcnJvcik7CisJV0FSTihhc3BpLCAiZXJybm86ID0gJWRcbiIsIG15ZXJyb3IpOwogICAgIH0KICAgICBnb3RvIGVycm9yX2V4aXQ7CiAgIH0KIAogICBzdGF0dXMgPSByZWFkKGZkLCBzZ19yZXBseV9oZHIsIG91dF9sZW4pOwogICBpZiAoc3RhdHVzIDwgMCB8fCBzdGF0dXMgIT0gb3V0X2xlbikgewotICAgIGRwcmludGZfd2Fybihhc3BpLCAibm90IGVub3VnaCBieXRlcyByZWFkIGZyb20gc2NzaSBkZXZpY2UlZFxuIiwgc3RhdHVzKTsKKyAgICBXQVJOKGFzcGksICJub3QgZW5vdWdoIGJ5dGVzIHJlYWQgZnJvbSBzY3NpIGRldmljZSVkXG4iLCBzdGF0dXMpOwogICAgIGdvdG8gZXJyb3JfZXhpdDsKICAgfQogCiAgIGlmIChzZ19yZXBseV9oZHItPnJlc3VsdCAhPSAwKSB7CiAgICAgZXJyb3JfY29kZSA9IHNnX3JlcGx5X2hkci0+cmVzdWx0OwotICAgIGRwcmludGZfd2Fybihhc3BpLCAicmVwbHkgaGVhZGVyIGVycm9yICglZClcbiIsIHNnX3JlcGx5X2hkci0+cmVzdWx0KTsKKyAgICBXQVJOKGFzcGksICJyZXBseSBoZWFkZXIgZXJyb3IgKCVkKVxuIiwgc2dfcmVwbHlfaGRyLT5yZXN1bHQpOwogICAgIGdvdG8gZXJyb3JfZXhpdDsKICAgfQogCkBAIC0zNDksNyArMzQ5LDcgQEAKICAgLyogbm93IGRvICBwb3N0aW5nICovCiAKICAgaWYgKEFTUElfUE9TVElORyhwcmIpICYmIHByYi0+U1JCX1Bvc3RQcm9jKSB7Ci0gICAgZHByaW50Zl9pbmZvKGFzcGksICJBU1BJOiBQb3N0IFJvdXRpbmUgKCVseCkgY2FsbGVkXG4iLCAoRFdPUkQpIHByYi0+U1JCX1Bvc3RQcm9jKTsKKyAgICBUUkFDRShhc3BpLCAiUG9zdCBSb3V0aW5lICglbHgpIGNhbGxlZFxuIiwgKERXT1JEKSBwcmItPlNSQl9Qb3N0UHJvYyk7CiAgICAgQ2FsbGJhY2tzLT5DYWxsQVNQSVBvc3RQcm9jKHByYi0+U1JCX1Bvc3RQcm9jLCBzZWdwdHJfcHJiKTsKICAgfQogCkBAIC0zNjEsMTcgKzM2MSwxNyBAQAogZXJyb3JfZXhpdDoKICAgaWYgKGVycm9yX2NvZGUgPT0gRUJVU1kpIHsKICAgICAgIHByYi0+U1JCX1N0YXR1cyA9IFNTX0FTUElfSVNfQlVTWTsKLSAgICAgIGRwcmludGZfaW5mbyhhc3BpLCAiQVNQSTogRGV2aWNlIGJ1c3lcbiIpOworICAgICAgVFJBQ0UoYXNwaSwgIkRldmljZSBidXN5XG4iKTsKICAgfQogICBlbHNlIHsKLSAgICAgIGRwcmludGZfd2Fybihhc3BpLCAiQVNQSV9HZW5lcmljSGFuZGxlU2NzaUNtZCBmYWlsZWRcbiIpOworICAgICAgV0FSTihhc3BpLCAiQVNQSV9HZW5lcmljSGFuZGxlU2NzaUNtZCBmYWlsZWRcbiIpOwogICAgICAgcHJiLT5TUkJfU3RhdHVzID0gU1NfRVJSOwogICB9CiAKICAgLyogSSdtIG5vdCBzdXJlIGV4YWN0bHkgZXJyb3IgY29kZXMgd29yayBoZXJlCiAgICAqIFdlIHByb2JhYmx5IHNob3VsZCBzZXQgcHJiLT5TUkJfVGFyZ1N0YXQsIFNSQl9IYVN0YXQgPwogICAgKi8KLSAgZHByaW50Zl93YXJuKGFzcGksICJBU1BJX0dlbmVyaWNIYW5kbGVTY3NpQ21kOiBlcnJvcl9leGl0XG4iKTsKKyAgV0FSTihhc3BpLCAiQVNQSV9HZW5lcmljSGFuZGxlU2NzaUNtZDogZXJyb3JfZXhpdFxuIik7CiAgIGZyZWUoc2dfcmVwbHlfaGRyKTsKICAgZnJlZShzZ19oZCk7CiAgIHJldHVybiBwcmItPlNSQl9TdGF0dXM7CkBAIC0zODUsNyArMzg1LDcgQEAKIFdPUkQgV0lOQVBJIEdldEFTUElTdXBwb3J0SW5mbzE2KCkKIHsKICNpZmRlZiBsaW51eAotICAgIGRwcmludGZfaW5mbyhhc3BpLCAiR0VUQVNQSVN1cHBvcnRJbmZvXG4iKTsKKyAgICBUUkFDRShhc3BpLCAiR0VUQVNQSVN1cHBvcnRJbmZvXG4iKTsKICAgICAvKiBoaWdoIGJ5dGUgU1NfQ09NUCAtIGxvdyBieXRlIG51bWJlciBvZiBob3N0IGFkYXB0ZXJzLgogICAgICAqIEZJWE1FISEhIFRoZSBudW1iZXIgb2YgaG9zdCBhZGFwdGVycyBpcyBpbmNvcnJlY3QuCiAgICAgICogSSdtIG5vdCBzdXJlIGhvdyB0byBkZXRlcm1pbmUgdGhpcyB1bmRlciBsaW51eCBldGMuCkBAIC00MDcsMTkgKzQwNywxOSBAQAogCiAgIHN3aXRjaCAobHBTUkItPmNvbW1vbi5TUkJfY21kKSB7CiAgIGNhc2UgU0NfSEFfSU5RVUlSWToKLSAgICBkcHJpbnRmX2ZpeG1lKGFzcGksICJBU1BJOiBOb3QgaW1wbGVtZW50ZWQgU0NfSEFfSU5RVUlSWVxuIik7CisgICAgRklYTUUoYXNwaSwgIk5vdCBpbXBsZW1lbnRlZCBTQ19IQV9JTlFVSVJZXG4iKTsKICAgICBicmVhazsKICAgY2FzZSBTQ19HRVRfREVWX1RZUEU6Ci0gICAgZHByaW50Zl9maXhtZShhc3BpLCAiQVNQSTogTm90IGltcGxlbWVudGVkIFNDX0dFVF9ERVZfVFlQRVxuIik7CisgICAgRklYTUUoYXNwaSwgIk5vdCBpbXBsZW1lbnRlZCBTQ19HRVRfREVWX1RZUEVcbiIpOwogICAgIGJyZWFrOwogICBjYXNlIFNDX0VYRUNfU0NTSV9DTUQ6CiAgICAgcmV0dXJuIEFTUElfRXhlY1Njc2lDbWQxNigmbHBTUkItPmNtZCwgc2VncHRyX3NyYik7CiAgICAgYnJlYWs7CiAgIGNhc2UgU0NfUkVTRVRfREVWOgotICAgIGRwcmludGZfZml4bWUoYXNwaSwgIkFTUEk6IE5vdCBpbXBsZW1lbnRlZCBTQ19SRVNFVF9ERVZcbiIpOworICAgIEZJWE1FKGFzcGksICJOb3QgaW1wbGVtZW50ZWQgU0NfUkVTRVRfREVWXG4iKTsKICAgICBicmVhazsKICAgZGVmYXVsdDoKLSAgICBkcHJpbnRmX3dhcm4oYXNwaSwgIkFTUEk6IFVua25vd24gY29tbWFuZCAlZFxuIiwgbHBTUkItPmNvbW1vbi5TUkJfY21kKTsKKyAgICBXQVJOKGFzcGksICJVbmtub3duIGNvbW1hbmQgJWRcbiIsIGxwU1JCLT5jb21tb24uU1JCX2NtZCk7CiAgIH0KICAgcmV0dXJuIFNTX0lOVkFMSURfU1JCOwogI2Vsc2UKZGlmZiAtLWdpdCBhL21pc2MvY29tbS5jIGIvbWlzYy9jb21tLmMKaW5kZXggZDQxODk5NC4uMWZiMzZjNyAxMDA2NDQKLS0tIGEvbWlzYy9jb21tLmMKKysrIGIvbWlzYy9jb21tLmMKQEAgLTgzLDggKzgzLDcgQEAKIAkJCQkJQ09NW3hdLmZkID0gMDsKIAkJCQkJc3RyY3B5KENPTVt4XS5kZXZpY2VuYW1lLCB0ZW1wKTsKIAkJCQl9Ci0gICAgICAgICAgICAgICAgZHByaW50Zl9pbmZvKGNvbW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAiQ29tbV9Jbml0OiAlcyA9ICVzXG4iLCBvcHRpb24sIENPTVt4XS5kZXZpY2VuYW1lKTsKKyAgICAgICAgICAgICAgICBUUkFDRShjb21tLCAiJXMgPSAlc1xuIiwgb3B0aW9uLCBDT01beF0uZGV2aWNlbmFtZSk7CiAgCQl9CiAKIAkJc3RyY3B5KG9wdGlvbiwgIkxQVHgiKTsKQEAgLTEwNiw4ICsxMDUsNyBAQAogCQkJCQlMUFRbeF0uZmQgPSAwOwogCQkJCQlzdHJjcHkoTFBUW3hdLmRldmljZW5hbWUsIHRlbXApOwogCQkJCX0KLSAgICAgICAgICAgICAgICBkcHJpbnRmX2luZm8oY29tbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJDb21tX0luaXQ6ICVzID0gJXNcbiIsIG9wdGlvbiwgTFBUW3hdLmRldmljZW5hbWUpOworICAgICAgICAgICAgICAgIFRSQUNFKGNvbW0sICIlcyA9ICVzXG4iLCBvcHRpb24sIExQVFt4XS5kZXZpY2VuYW1lKTsKIAkJfQogCiAJfQpAQCAtMTUyLDcgKzE1MCw3IEBACiAKIGludCBXaW5FcnJvcih2b2lkKQogewotICAgICAgICBkcHJpbnRmX2luZm8oY29tbSwgIldpbkVycm9yOiBlcnJubyA9ICVkXG4iLCBlcnJubyk7CisgICAgICAgIFRSQUNFKGNvbW0sICJlcnJubyA9ICVkXG4iLCBlcnJubyk7CiAJc3dpdGNoIChlcnJubykgewogCQlkZWZhdWx0OgogCQkJcmV0dXJuIENFX0lPRTsKQEAgLTE2OSw4ICsxNjcsNyBAQAogCWludCBwb3J0OwogCWNoYXIgKnB0ciwgdGVtcFsyNTZdOwogCi0JZHByaW50Zl9pbmZvKGNvbW0sCi0JCSJCdWlsZENvbW1EQ0I6ICglcyksIHB0ciAlcFxuIiwgZGV2aWNlLCBscGRjYik7CisJVFJBQ0UoY29tbSwgIiglcyksIHB0ciAlcFxuIiwgZGV2aWNlLCBscGRjYik7CiAJY29tbWVycm9yID0gMDsKIAogCWlmICghbHN0cm5jbXBpMzJBKGRldmljZSwiQ09NIiwzKSkgewpAQCAtMjA3LDEzICsyMDQsMTMgQEAKIAkJCWxwZGNiLT5CYXVkUmF0ZSA9IENPTVtwb3J0XS5iYXVkcmF0ZTsKIAkJZWxzZQogCQkJbHBkY2ItPkJhdWRSYXRlID0gYXRvaShwdHIpOwotICAgICAgICAJZHByaW50Zl9pbmZvKGNvbW0sIkJ1aWxkQ29tbURDQjogYmF1ZHJhdGUgKCVkKVxuIiwgbHBkY2ItPkJhdWRSYXRlKTsKKyAgICAgICAgCVRSQUNFKGNvbW0sImJhdWRyYXRlICglZClcbiIsIGxwZGNiLT5CYXVkUmF0ZSk7CiAKIAkJcHRyID0gc3RydG9rKE5VTEwsICIsICIpOwogCQlpZiAoaXNsb3dlcigqcHRyKSkKIAkJCSpwdHIgPSB0b3VwcGVyKCpwdHIpOwogCi0gICAgICAgIAlkcHJpbnRmX2luZm8oY29tbSwiQnVpbGRDb21tRENCOiBwYXJpdHkgKCVjKVxuIiwgKnB0cik7CisgICAgICAgIAlUUkFDRShjb21tLCJwYXJpdHkgKCVjKVxuIiwgKnB0cik7CiAJCWxwZGNiLT5mUGFyaXR5ID0gMTsKIAkJc3dpdGNoICgqcHRyKSB7CiAJCQljYXNlICdOJzoKQEAgLTIzNSwxMSArMjMyLDExIEBACiAJCX0KIAogCQlwdHIgPSBzdHJ0b2soTlVMTCwgIiwgIik7IAotICAgICAgICAgCWRwcmludGZfaW5mbyhjb21tLCAiQnVpbGRDb21tRENCOiBjaGFyc2l6ZSAoJWMpXG4iLCAqcHRyKTsKKyAgICAgICAgIAlUUkFDRShjb21tLCAiY2hhcnNpemUgKCVjKVxuIiwgKnB0cik7CiAJCWxwZGNiLT5CeXRlU2l6ZSA9ICpwdHIgLSAnMCc7CiAKIAkJcHRyID0gc3RydG9rKE5VTEwsICIsICIpOwotICAgICAgICAJZHByaW50Zl9pbmZvKGNvbW0sICJCdWlsZENvbW1EQ0I6IHN0b3BiaXRzICglYylcbiIsICpwdHIpOworICAgICAgICAJVFJBQ0UoY29tbSwgInN0b3BiaXRzICglYylcbiIsICpwdHIpOwogCQlzd2l0Y2ggKCpwdHIpIHsKIAkJCWNhc2UgJzEnOgogCQkJCWxwZGNiLT5TdG9wQml0cyA9IE9ORVNUT1BCSVQ7CkBAIC0yNzMsNyArMjcwLDcgQEAKIAlpbnQJcG9ydDsKIAljaGFyCSpwdHIsKnRlbXA7CiAKLQlkcHJpbnRmX2luZm8oY29tbSwiQnVpbGRDb21tRENCQW5kVGltZW91dHMzMkEoJXMsJXAsJXApXG4iLGRldmljZSxscGRjYixscHRpbWVvdXRzKTsKKwlUUkFDRShjb21tLCIoJXMsJXAsJXApXG4iLGRldmljZSxscGRjYixscHRpbWVvdXRzKTsKIAljb21tZXJyb3IgPSAwOwogCiAJaWYgKCFsc3RybmNtcGkzMkEoZGV2aWNlLCJDT00iLDMpKSB7CkBAIC00MDAsNyArMzk3LDcgQEAKIAlMUFNUUglkZXZpZEE7CiAJQk9PTDMyCXJldDsKIAotCWRwcmludGZfaW5mbyhjb21tLCJCdWlsZENvbW1EQ0JBbmRUaW1lb3V0czMyVyglcCwlcCwlcClcbiIsZGV2aWQsbHBkY2IsbHB0aW1lb3V0cyk7CisJVFJBQ0UoY29tbSwiKCVwLCVwLCVwKVxuIixkZXZpZCxscGRjYixscHRpbWVvdXRzKTsKIAlkZXZpZEEgPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIGRldmlkICk7CiAJcmV0PUJ1aWxkQ29tbURDQkFuZFRpbWVvdXRzMzJBKGRldmlkQSxscGRjYixscHRpbWVvdXRzKTsKICAgICAgICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIGRldmlkQSApOwpAQCAtNDIyLDggKzQxOSw3IEBACiB7CiAJaW50IHBvcnQsZmQ7CiAKLSAgICAJZHByaW50Zl9pbmZvKGNvbW0sCi0JCSJPcGVuQ29tbTogJXMsICVkLCAlZFxuIiwgZGV2aWNlLCBjYkluUXVldWUsIGNiT3V0UXVldWUpOworICAgIAlUUkFDRShjb21tLCAiJXMsICVkLCAlZFxuIiwgZGV2aWNlLCBjYkluUXVldWUsIGNiT3V0UXVldWUpOwogCWNvbW1lcnJvciA9IDA7CiAKIAlpZiAoIWxzdHJuY21waTMyQShkZXZpY2UsIkNPTSIsMykpIHsKQEAgLTQzNCw4ICs0MzAsNyBAQAogCQkJY29tbWVycm9yID0gSUVfQkFESUQ7CiAJCX0KIAotICAgICAgICAgICAgICAgIGRwcmludGZfaW5mbyhjb21tLAotICAgICAgICAgICAgICAgICAgICAgICAiT3BlbkNvbW06ICVzID0gJXNcbiIsIGRldmljZSwgQ09NW3BvcnRdLmRldmljZW5hbWUpOworICAgICAgICAgICAgICAgIFRSQUNFKGNvbW0sICIlcyA9ICVzXG4iLCBkZXZpY2UsIENPTVtwb3J0XS5kZXZpY2VuYW1lKTsKIAogCQlpZiAoIVZhbGlkQ09NUG9ydChwb3J0KSkgewogCQkJY29tbWVycm9yID0gSUVfQkFESUQ7CkBAIC00ODcsNyArNDgyLDcgQEAKIElOVDE2IFdJTkFQSSBDbG9zZUNvbW0oSU5UMTYgZmQpCiB7CiAgICAgICAgIGludCBwb3J0OwotICAgIAlkcHJpbnRmX2luZm8oY29tbSwiQ2xvc2VDb21tOiBmZCAlZFxuIiwgZmQpOworICAgIAlUUkFDRShjb21tLCJmZCAlZFxuIiwgZmQpOwogICAgICAgIAlpZiAoKHBvcnQgPSBHZXRDb21tUG9ydChmZCkpICE9LTEpIHsgIC8qIFtMV10gICAgICAgKi8KICAgICAJICAgICAgICBTRUdQVFJfRlJFRSh1bmtub3duW3BvcnRdKTsgCiAgICAgCSAgICAgICAgQ09NW3BvcnRdLmZkID0gMDsgICAgICAgLyogIG15IGFkYXB0YXRpb24gb2YgUkVSJ3MgZml4ICAgKi8gIApAQCAtNTEyLDcgKzUwNyw3IEBACiB7CiAJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwogCi0JZHByaW50Zl9pbmZvKGNvbW0sIlNldENvbW1CcmVhazogZmQ6ICVkXG4iLCBmZCk7CisJVFJBQ0UoY29tbSwiZmQ9JWRcbiIsIGZkKTsKIAlpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChmZCkpID09IE5VTEwpIHsKIAkJY29tbWVycm9yID0gSUVfQkFESUQ7CiAJCXJldHVybiAtMTsKQEAgLTUzMSw3ICs1MjYsNyBAQAogCiAJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwogCi0JZHByaW50Zl9pbmZvKGNvbW0sIlNldENvbW1CcmVhazogZmQ6ICVkXG4iLCBmZCk7CisJVFJBQ0UoY29tbSwiZmQ9JWRcbiIsIGZkKTsKIAlpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChmZCkpID09IE5VTEwpIHsKIAkJY29tbWVycm9yID0gSUVfQkFESUQ7CiAJCXJldHVybiBGQUxTRTsKQEAgLTU0OSw3ICs1NDQsNyBAQAogewogCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKIAotICAgIAlkcHJpbnRmX2luZm8oY29tbSwiQ2xlYXJDb21tQnJlYWs6IGZkOiAlZFxuIiwgZmQpOworICAgIAlUUkFDRShjb21tLCJmZD0lZFxuIiwgZmQpOwogCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGZkKSkgPT0gTlVMTCkgewogCQljb21tZXJyb3IgPSBJRV9CQURJRDsKIAkJcmV0dXJuIC0xOwpAQCAtNTY3LDcgKzU2Miw3IEBACiB7CiAJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwogCi0gICAgCWRwcmludGZfaW5mbyhjb21tLCJDbGVhckNvbW1CcmVhazogZmQ6ICVkXG4iLCBmZCk7CisgICAgCVRSQUNFKGNvbW0sImZkPSVkXG4iLCBmZCk7CiAJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoZmQpKSA9PSBOVUxMKSB7CiAJCWNvbW1lcnJvciA9IElFX0JBRElEOwogCQlyZXR1cm4gRkFMU0U7CkBAIC01ODYsNyArNTgxLDcgQEAKIAlpbnQJbWF4OwogCXN0cnVjdCB0ZXJtaW9zIHBvcnQ7CiAKLSAgICAJZHByaW50Zl9pbmZvKGNvbW0sIkVzY2FwZUNvbW1GdW5jdGlvbiBmZDogJWQsIGZ1bmN0aW9uOiAlZFxuIiwgZmQsIG5GdW5jdGlvbik7CisgICAgCVRSQUNFKGNvbW0sImZkPSVkLCBmdW5jdGlvbj0lZFxuIiwgZmQsIG5GdW5jdGlvbik7CiAJaWYgKHRjZ2V0YXR0cihmZCwmcG9ydCkgPT0gLTEpIHsKIAkJY29tbWVycm9yPVdpbkVycm9yKCk7CQogCQlyZXR1cm4gLTE7CkBAIC02NjIsNyArNjU3LDcgQEAKIAlzdHJ1Y3QgdGVybWlvcwlwb3J0OwogCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKIAotICAgIAlkcHJpbnRmX2luZm8oY29tbSwiRXNjYXBlQ29tbUZ1bmN0aW9uIGZkOiAlZCwgZnVuY3Rpb246ICVkXG4iLCBmZCwgbkZ1bmN0aW9uKTsKKyAgICAJVFJBQ0UoY29tbSwiZmQ9JWQsIGZ1bmN0aW9uPSVkXG4iLCBmZCwgbkZ1bmN0aW9uKTsKIAlpZiAodGNnZXRhdHRyKGZkLCZwb3J0KSA9PSAtMSkgewogCQljb21tZXJyb3I9V2luRXJyb3IoKTsJCiAJCXJldHVybiBGQUxTRTsKQEAgLTczNCw3ICs3MjksNyBAQAogewogCWludCBxdWV1ZTsKIAotICAgIAlkcHJpbnRmX2luZm8oY29tbSwiRmx1c2hDb21tIGZkOiAlZCwgcXVldWU6ICVkXG4iLCBmZCwgZm5RdWV1ZSk7CisgICAgCVRSQUNFKGNvbW0sImZkPSVkLCBxdWV1ZT0lZFxuIiwgZmQsIGZuUXVldWUpOwogCXN3aXRjaCAoZm5RdWV1ZSkgewogCQljYXNlIDA6CXF1ZXVlID0gVENPRkxVU0g7CiAJCQlicmVhazsKQEAgLTc1OSw3ICs3NTQsNyBAQAogICovCiBCT09MMzIgV0lOQVBJIFB1cmdlQ29tbSggSEFORExFMzIgaEZpbGUsIERXT1JEIGZsYWdzKSAKIHsKLSAgICBkcHJpbnRmX2ZpeG1lKGNvbW0sICJQdXJnZUNvbW0oJTA4eCAlMDhseCkgdW5pbXBsZW1lbnRlZCBzdHViXG4iLAorICAgIEZJWE1FKGNvbW0sICIoJTA4eCAlMDhseCkgdW5pbXBsZW1lbnRlZCBzdHViXG4iLAogICAgICAgICAgICAgICAgICBoRmlsZSwgZmxhZ3MpOwogICAgIHJldHVybiAwOwogfQpAQCAtNzg0LDE1ICs3NzksMTMgQEAKICAgICAgICAgICAgICAgICBpZiAocmMpIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgIVxuIik7CiAJCWxwU3RhdC0+Y2JJblF1ZSA9IGNudDsKIAotICAgIAkJZHByaW50Zl9pbmZvKGNvbW0sCi0JCSAgICAgICAiR2V0Q29tbUVycm9yOiBmZCAlZCwgZXJyb3IgJWQsIGxwU3RhdCAlZCAlZCAlZFxuIiwKLQkJICAgICAgIGZkLCBjb21tZXJyb3IsIGxwU3RhdC0+c3RhdHVzLCBscFN0YXQtPmNiSW5RdWUsIAotCQkgICAgICAgbHBTdGF0LT5jYk91dFF1ZSk7CisgICAgCQlUUkFDRShjb21tLCAiZmQgJWQsIGVycm9yICVkLCBscFN0YXQgJWQgJWQgJWRcbiIsCisJCQkgICAgIGZkLCBjb21tZXJyb3IsIGxwU3RhdC0+c3RhdHVzLCBscFN0YXQtPmNiSW5RdWUsIAorCQkJICAgICBscFN0YXQtPmNiT3V0UXVlKTsKIAl9CiAJZWxzZQotCQlkcHJpbnRmX2luZm8oY29tbSwKLQkJICAgICAgICJHZXRDb21tRXJyb3I6IGZkICVkLCBlcnJvciAlZCwgbHBTdGF0IE5VTExcbiIsCi0JCSAgICAgICBmZCwgY29tbWVycm9yKTsKKwkJVFJBQ0UoY29tbSwgImZkICVkLCBlcnJvciAlZCwgbHBTdGF0IE5VTExcbiIsCisJCQkgICAgIGZkLCBjb21tZXJyb3IpOwogCiAJLyoKIAkgKiBbUkVSXSBJIGhhdmUgbm8gaWRlYSB3aGF0IHRoZSBmb2xsb3dpbmcgaXMgdHJ5aW5nIHRvIGFjY29tcGxpc2guCkBAIC04MTAsNyArODAzLDcgQEAKIHsKIAlpbnQgdGVtcGVycm9yOwogCi0gICAgCWRwcmludGZfaW5mbyhjb21tLCAiQ2xlYXJDb21tRXJyb3I6IGZkICVkIChjdXJyZW50IGVycm9yICVkKVxuIiwgCisgICAgCVRSQUNFKGNvbW0sICJmZCAlZCAoY3VycmVudCBlcnJvciAlZClcbiIsIAogCSAgICAgICBmZCwgY29tbWVycm9yKTsKIAl0ZW1wZXJyb3IgPSBjb21tZXJyb3I7CiAJY29tbWVycm9yID0gMDsKQEAgLTgyNiwxOCArODE5LDE4IEBACiAgICAgICAgIGludCBhY3Q7CiAgICAgICAgIGludCByZXBpZDsKICAgICAgICAgdW5zaWduZWQgaW50IG1zdGF0OwotICAgIAlkcHJpbnRmX2luZm8oY29tbSwiU2V0Q29tbUV2ZW50TWFzazpmZCAlZCxtYXNrICVkXG4iLGZkLGZ1RXZ0TWFzayk7CisgICAgCVRSQUNFKGNvbW0sImZkICVkLG1hc2sgJWRcbiIsZmQsZnVFdnRNYXNrKTsKIAlldmVudG1hc2sgfD0gZnVFdnRNYXNrOwogICAgICAgICBpZiAoKGFjdCA9IEdldENvbW1Qb3J0KGZkKSkgPT0gLTEpIHsKLSAgICAgICAgICAgIGRwcmludGZfd2Fybihjb21tLCIgZmQgJWQgbm90IGNvbW0gcG9ydFxuIixhY3QpOworICAgICAgICAgICAgV0FSTihjb21tLCIgZmQgJWQgbm90IGNvbW0gcG9ydFxuIixhY3QpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7fQogICAgICAgICBzdG9sID0gIHVua25vd25bYWN0XTsKICAgICAgICAgc3RvbCArPSBtc3I7ICAgIAogCXJlcGlkID0gaW9jdGwoZmQsVElPQ01HRVQsJm1zdGF0KTsKLQlkcHJpbnRmX2luZm8oY29tbSwgIiBpb2N0bCAgJWQsIG1zciAleCBhdCAlcCAlcFxuIixyZXBpZCxtc3RhdCxzdG9sLHVua25vd25bYWN0XSk7CisJVFJBQ0UoY29tbSwgIiBpb2N0bCAgJWQsIG1zciAleCBhdCAlcCAlcFxuIixyZXBpZCxtc3RhdCxzdG9sLHVua25vd25bYWN0XSk7CiAJaWYgKChtc3RhdCZUSU9DTV9DQVIpKSB7KnN0b2wgfD0gMHg4MDt9CiAJICAgICBlbHNlIHsqc3RvbCAmPTB4N2Y7fQotCWRwcmludGZfaW5mbyhjb21tLCIgbW9kZW0gZGNkIGNvbnN0cnVjdCAleFxuIiwqc3RvbCk7CisJVFJBQ0UoY29tbSwiIG1vZGVtIGRjZCBjb25zdHJ1Y3QgJXhcbiIsKnN0b2wpOwogCXJldHVybiBTRUdQVFJfR0VUKHVua25vd25bYWN0XSk7CQogfQogCkBAIC04NDgsOCArODQxLDcgQEAKIHsKIAlpbnQJZXZlbnRzID0gMDsKIAotICAgIAlkcHJpbnRmX2luZm8oY29tbSwKLQkJIkdldENvbW1FdmVudE1hc2s6IGZkICVkLCBtYXNrICVkXG4iLCBmZCwgZm5FdnRDbGVhcik7CisgICAgCVRSQUNFKGNvbW0sICJmZCAlZCwgbWFzayAlZFxuIiwgZmQsIGZuRXZ0Q2xlYXIpOwogCiAJLyoKIAkgKglEZXRlcm1pbmUgaWYgYW55IGNoYXJhY3RlcnMgYXJlIGF2YWlsYWJsZQpAQCAtODYyLDggKzg1NCw3IEBACiAJCXJjID0gaW9jdGwoZmQsIFRJT0NJTlEsICZjbnQpOwogCQlpZiAoY250KSBldmVudHMgfD0gRVZfUlhDSEFSOwogCi0JCWRwcmludGZfaW5mbyhjb21tLAotCQkJIkdldENvbW1FdmVudE1hc2s6IHJ4Y2hhciAlbGRcbiIsIGNudCk7CisJCVRSQUNFKGNvbW0sICJyeGNoYXIgJWxkXG4iLCBjbnQpOwogCX0KIAogCS8qCkBAIC04NzEsOCArODYyLDcgQEAKIAkgKi8KIAkvKiBUT0RPICovCiAKLQlkcHJpbnRmX2luZm8oY29tbSwKLQkJIkdldENvbW1FdmVudE1hc2s6IHJldHVybiBldmVudHMgJWRcbiIsIGV2ZW50cyk7CisJVFJBQ0UoY29tbSwgInJldHVybiBldmVudHMgJWRcbiIsIGV2ZW50cyk7CiAJcmV0dXJuIGV2ZW50czsKIAogCS8qCkBAIC04OTAsNyArODgwLDcgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBTZXR1cENvbW0oIEhBTkRMRTMyIGhGaWxlLCBEV09SRCBpbnNpemUsIERXT1JEIG91dHNpemUpCiB7Ci0gICAgICAgIGRwcmludGZfZml4bWUoY29tbSwgIlNldHVwQ29tbTogaW5zaXplICVsZCBvdXRzaXplICVsZCB1bmltcGxlbWVudGVkIHN0dWJcbiIsIGluc2l6ZSwgb3V0c2l6ZSk7CisgICAgICAgIEZJWE1FKGNvbW0sICJpbnNpemUgJWxkIG91dHNpemUgJWxkIHVuaW1wbGVtZW50ZWQgc3R1YlxuIiwgaW5zaXplLCBvdXRzaXplKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiB9IAogCkBAIC04OTksOCArODg5LDcgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBHZXRDb21tTWFzayhJTlQzMiBmZCxMUERXT1JEIGV2dG1hc2spCiB7Ci0gICAgCWRwcmludGZfaW5mbyhjb21tLAotCQkiR2V0Q29tbU1hc2s6IGZkICVkLCBtYXNrICVwXG4iLCBmZCwgZXZ0bWFzayk7CisgICAgCVRSQUNFKGNvbW0sICJmZCAlZCwgbWFzayAlcFxuIiwgZmQsIGV2dG1hc2spOwogCSpldnRtYXNrID0gZXZlbnRtYXNrOwogCXJldHVybiBUUlVFOwogfQpAQCAtOTEwLDggKzg5OSw3IEBACiAgKi8KIEJPT0wzMiBXSU5BUEkgU2V0Q29tbU1hc2soSU5UMzIgZmQsRFdPUkQgZXZ0bWFzaykKIHsKLSAgICAJZHByaW50Zl9pbmZvKGNvbW0sCi0JCSJTZXRDb21tTWFzazogZmQgJWQsIG1hc2sgJWx4XG4iLCBmZCwgZXZ0bWFzayk7CisgICAgCVRSQUNFKGNvbW0sICJmZCAlZCwgbWFzayAlbHhcbiIsIGZkLCBldnRtYXNrKTsKIAlldmVudG1hc2sgPSBldnRtYXNrOwogCXJldHVybiBUUlVFOwogfQpAQCAtOTI0LDggKzkxMiw3IEBACiAJc3RydWN0IHRlcm1pb3MgcG9ydDsKIAlzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CiAKLSAgICAJZHByaW50Zl9pbmZvKGNvbW0sCi0JCSJTZXRDb21tU3RhdGUxNjogZmQgJWQsIHB0ciAlcFxuIiwgbHBkY2ItPklkLCBscGRjYik7CisgICAgCVRSQUNFKGNvbW0sICJmZCAlZCwgcHRyICVwXG4iLCBscGRjYi0+SWQsIGxwZGNiKTsKIAlpZiAodGNnZXRhdHRyKGxwZGNiLT5JZCwgJnBvcnQpID09IC0xKSB7CiAJCWNvbW1lcnJvciA9IFdpbkVycm9yKCk7CQogCQlyZXR1cm4gLTE7CkBAIC05NTUsNyArOTQyLDcgQEAKIAl9CiAJaWYgKHB0ci0+YmF1ZHJhdGUgPiAwKQogCSAgCWxwZGNiLT5CYXVkUmF0ZSA9IHB0ci0+YmF1ZHJhdGU7Ci0gICAgCWRwcmludGZfaW5mbyhjb21tLCJTZXRDb21tU3RhdGU6IGJhdWRyYXRlICVkXG4iLGxwZGNiLT5CYXVkUmF0ZSk7CisgICAgCVRSQUNFKGNvbW0sImJhdWRyYXRlICVkXG4iLGxwZGNiLT5CYXVkUmF0ZSk7CiAjaWZkZWYgQ0JBVUQKIAlwb3J0LmNfY2ZsYWcgJj0gfkNCQVVEOwogCXN3aXRjaCAobHBkY2ItPkJhdWRSYXRlKSB7CkBAIC0xMDQ5LDcgKzEwMzYsNyBAQAogICAgICAgICB9CiAgICAgICAgIHBvcnQuY19pc3BlZWQgPSBwb3J0LmNfb3NwZWVkOwogI2VuZGlmCi0gICAgCWRwcmludGZfaW5mbyhjb21tLCJTZXRDb21tU3RhdGU6IGJ5dGVzaXplICVkXG4iLGxwZGNiLT5CeXRlU2l6ZSk7CisgICAgCVRSQUNFKGNvbW0sImJ5dGVzaXplICVkXG4iLGxwZGNiLT5CeXRlU2l6ZSk7CiAJcG9ydC5jX2NmbGFnICY9IH5DU0laRTsKIAlzd2l0Y2ggKGxwZGNiLT5CeXRlU2l6ZSkgewogCQljYXNlIDU6CkBAIC0xMDY5LDcgKzEwNTYsNyBAQAogCQkJcmV0dXJuIC0xOwogCX0KIAotICAgIAlkcHJpbnRmX2luZm8oY29tbSwiU2V0Q29tbVN0YXRlOiBwYXJpdHkgJWRcbiIsbHBkY2ItPlBhcml0eSk7CisgICAgCVRSQUNFKGNvbW0sInBhcml0eSAlZFxuIixscGRjYi0+UGFyaXR5KTsKIAlwb3J0LmNfY2ZsYWcgJj0gfihQQVJFTkIgfCBQQVJPREQpOwogCWlmIChscGRjYi0+ZlBhcml0eSkKIAkJc3dpdGNoIChscGRjYi0+UGFyaXR5KSB7CkBAIC0xMDkwLDcgKzEwNzcsNyBAQAogCQl9CiAJCiAKLSAgICAJZHByaW50Zl9pbmZvKGNvbW0sIlNldENvbW1TdGF0ZTogc3RvcGJpdHMgJWRcbiIsbHBkY2ItPlN0b3BCaXRzKTsKKyAgICAJVFJBQ0UoY29tbSwic3RvcGJpdHMgJWRcbiIsbHBkY2ItPlN0b3BCaXRzKTsKIAogCXN3aXRjaCAobHBkY2ItPlN0b3BCaXRzKSB7CiAJCWNhc2UgT05FU1RPUEJJVDoKQEAgLTExMzcsNyArMTEyNCw3IEBACiAJc3RydWN0IHRlcm1pb3MgcG9ydDsKIAlzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CiAKLSAgICAJZHByaW50Zl9pbmZvKGNvbW0sIlNldENvbW1TdGF0ZTMyOiBmZCAlZCwgcHRyICVwXG4iLGZkLGxwZGNiKTsKKyAgICAJVFJBQ0UoY29tbSwiZmQgJWQsIHB0ciAlcFxuIixmZCxscGRjYik7CiAJaWYgKHRjZ2V0YXR0cihmZCwmcG9ydCkgPT0gLTEpIHsKIAkJY29tbWVycm9yID0gV2luRXJyb3IoKTsJCiAJCXJldHVybiBGQUxTRTsKQEAgLTExNjcsNyArMTE1NCw3IEBACiAJfQogCWlmIChwdHItPmJhdWRyYXRlID4gMCkKIAkgIAlscGRjYi0+QmF1ZFJhdGUgPSBwdHItPmJhdWRyYXRlOwotICAgIAlkcHJpbnRmX2luZm8oY29tbSwiU2V0Q29tbVN0YXRlOiBiYXVkcmF0ZSAlbGRcbiIsbHBkY2ItPkJhdWRSYXRlKTsKKyAgICAJVFJBQ0UoY29tbSwiYmF1ZHJhdGUgJWxkXG4iLGxwZGNiLT5CYXVkUmF0ZSk7CiAjaWZkZWYgQ0JBVUQKIAlwb3J0LmNfY2ZsYWcgJj0gfkNCQVVEOwogCXN3aXRjaCAobHBkY2ItPkJhdWRSYXRlKSB7CkBAIC0xMjU1LDcgKzEyNDIsNyBAQAogICAgICAgICB9CiAgICAgICAgIHBvcnQuY19pc3BlZWQgPSBwb3J0LmNfb3NwZWVkOwogI2VuZGlmCi0gICAgCWRwcmludGZfaW5mbyhjb21tLCJTZXRDb21tU3RhdGU6IGJ5dGVzaXplICVkXG4iLGxwZGNiLT5CeXRlU2l6ZSk7CisgICAgCVRSQUNFKGNvbW0sImJ5dGVzaXplICVkXG4iLGxwZGNiLT5CeXRlU2l6ZSk7CiAJcG9ydC5jX2NmbGFnICY9IH5DU0laRTsKIAlzd2l0Y2ggKGxwZGNiLT5CeXRlU2l6ZSkgewogCQljYXNlIDU6CkBAIC0xMjc1LDcgKzEyNjIsNyBAQAogCQkJcmV0dXJuIEZBTFNFOwogCX0KIAotICAgIAlkcHJpbnRmX2luZm8oY29tbSwiU2V0Q29tbVN0YXRlOiBwYXJpdHkgJWRcbiIsbHBkY2ItPlBhcml0eSk7CisgICAgCVRSQUNFKGNvbW0sInBhcml0eSAlZFxuIixscGRjYi0+UGFyaXR5KTsKIAlwb3J0LmNfY2ZsYWcgJj0gfihQQVJFTkIgfCBQQVJPREQpOwogCWlmIChscGRjYi0+ZlBhcml0eSkKIAkJc3dpdGNoIChscGRjYi0+UGFyaXR5KSB7CkBAIC0xMjk2LDcgKzEyODMsNyBAQAogCQl9CiAJCiAKLSAgICAJZHByaW50Zl9pbmZvKGNvbW0sIlNldENvbW1TdGF0ZTogc3RvcGJpdHMgJWRcbiIsbHBkY2ItPlN0b3BCaXRzKTsKKyAgICAJVFJBQ0UoY29tbSwic3RvcGJpdHMgJWRcbiIsbHBkY2ItPlN0b3BCaXRzKTsKIAlzd2l0Y2ggKGxwZGNiLT5TdG9wQml0cykgewogCQljYXNlIE9ORVNUT1BCSVQ6CiAJCQkJcG9ydC5jX2NmbGFnICY9IH5DU1RPUEI7CkBAIC0xMzQ0LDcgKzEzMzEsNyBAQAogewogCXN0cnVjdCB0ZXJtaW9zIHBvcnQ7CiAKLSAgICAJZHByaW50Zl9pbmZvKGNvbW0sIkdldENvbW1TdGF0ZTE2OiBmZCAlZCwgcHRyICVwXG4iLCBmZCwgbHBkY2IpOworICAgIAlUUkFDRShjb21tLCJmZCAlZCwgcHRyICVwXG4iLCBmZCwgbHBkY2IpOwogCWlmICh0Y2dldGF0dHIoZmQsICZwb3J0KSA9PSAtMSkgewogCQljb21tZXJyb3IgPSBXaW5FcnJvcigpOwkKIAkJcmV0dXJuIC0xOwpAQCAtMTQ2OSw3ICsxNDU2LDcgQEAKIHsKIAlzdHJ1Y3QgdGVybWlvcwlwb3J0OwogCi0gICAgCWRwcmludGZfaW5mbyhjb21tLCJHZXRDb21tU3RhdGUzMjogZmQgJWQsIHB0ciAlcFxuIiwgZmQsIGxwZGNiKTsKKyAgICAJVFJBQ0UoY29tbSwiZmQgJWQsIHB0ciAlcFxuIiwgZmQsIGxwZGNiKTsKICAgICAgICAgaWYgKEdldERldmljZVN0cnVjdChmZCkgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOwogCWlmICh0Y2dldGF0dHIoZmQsICZwb3J0KSA9PSAtMSkgewogCQljb21tZXJyb3IgPSBXaW5FcnJvcigpOwkKQEAgLTE1ODUsOCArMTU3Miw3IEBACiB7CiAJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwogCi0gICAgCWRwcmludGZfaW5mbyhjb21tLAotCQkiVHJhbnNtaXRDb21tQ2hhcjogZmQgJWQsIGRhdGEgJWQgXG4iLCBmZCwgY2hUcmFuc21pdCk7CisgICAgCVRSQUNFKGNvbW0sICJmZCAlZCwgZGF0YSAlZCBcbiIsIGZkLCBjaFRyYW5zbWl0KTsKIAlpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChmZCkpID09IE5VTEwpIHsKIAkJY29tbWVycm9yID0gSUVfQkFESUQ7CiAJCXJldHVybiAtMTsKQEAgLTE2MTMsNyArMTU5OSw3IEBACiB7CiAJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwogCi0gICAgCWRwcmludGZfaW5mbyhjb21tLCJUcmFuc21pdENvbW1DaGFyMzIoJWQsJyVjJylcbiIsZmQsY2hUcmFuc21pdCk7CisgICAgCVRSQUNFKGNvbW0sIiglZCwnJWMnKVxuIixmZCxjaFRyYW5zbWl0KTsKIAlpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChmZCkpID09IE5VTEwpIHsKIAkJY29tbWVycm9yID0gSUVfQkFESUQ7CiAJCXJldHVybiBGQUxTRTsKQEAgLTE2MzksNyArMTYyNSw3IEBACiB7CiAJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwogCi0gICAgCWRwcmludGZfaW5mbyhjb21tLCJVbmdldENvbW1DaGFyOiBmZCAlZCAoY2hhciAlZClcbiIsIGZkLCBjaFVuZ2V0KTsKKyAgICAJVFJBQ0UoY29tbSwiZmQgJWQgKGNoYXIgJWQpXG4iLCBmZCwgY2hVbmdldCk7CiAJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoZmQpKSA9PSBOVUxMKSB7CiAJCWNvbW1lcnJvciA9IElFX0JBRElEOwogCQlyZXR1cm4gLTE7CkBAIC0xNjY0LDggKzE2NTAsNyBAQAogCWludCBzdGF0dXMsIGxlbmd0aDsKIAlzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CiAKLSAgICAJZHByaW50Zl9pbmZvKGNvbW0sCi0JICAgICJSZWFkQ29tbTogZmQgJWQsIHB0ciAlcCwgbGVuZ3RoICVkXG4iLCBmZCwgbHB2QnVmLCBjYlJlYWQpOworICAgIAlUUkFDRShjb21tLCAiZmQgJWQsIHB0ciAlcCwgbGVuZ3RoICVkXG4iLCBmZCwgbHB2QnVmLCBjYlJlYWQpOwogCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGZkKSkgPT0gTlVMTCkgewogCQljb21tZXJyb3IgPSBJRV9CQURJRDsKIAkJcmV0dXJuIC0xOwpAQCAtMTY5Niw3ICsxNjgxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsZW5ndGg7CiAgICAgICAgICAgICAgICAgfQogIAl9IGVsc2UgewotCSAgICAgICAgZHByaW50Zl9pbmZvKGNvbW0sIiUqc1xuIiwgbGVuZ3RoK3N0YXR1cywgbHB2QnVmKTsKKwkgICAgICAgIFRSQUNFKGNvbW0sIiUqc1xuIiwgbGVuZ3RoK3N0YXR1cywgbHB2QnVmKTsKIAkJY29tbWVycm9yID0gMDsKIAkJcmV0dXJuIGxlbmd0aCArIHN0YXR1czsKIAl9CkBAIC0xNzEwLDcgKzE2OTUsNyBAQAogCWludCBsZW5ndGg7CiAJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwogCi0gICAgCWRwcmludGZfaW5mbyhjb21tLCJXcml0ZUNvbW06IGZkICVkLCBwdHIgJXAsIGxlbmd0aCAlZFxuIiwgCisgICAgCVRSQUNFKGNvbW0sImZkICVkLCBwdHIgJXAsIGxlbmd0aCAlZFxuIiwgCiAJCWZkLCBscHZCdWYsIGNiV3JpdGUpOwogCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGZkKSkgPT0gTlVMTCkgewogCQljb21tZXJyb3IgPSBJRV9CQURJRDsKQEAgLTE3MjIsNyArMTcwNyw3IEBACiAJCXJldHVybiAtMTsKIAl9CQogCQotCWRwcmludGZfaW5mbyhjb21tLCIlKnNcbiIsIGNiV3JpdGUsIGxwdkJ1ZiApOworCVRSQUNFKGNvbW0sIiUqc1xuIiwgY2JXcml0ZSwgbHB2QnVmICk7CiAJbGVuZ3RoID0gd3JpdGUoZmQsICh2b2lkICopIGxwdkJ1ZiwgY2JXcml0ZSk7CiAJCiAJaWYgKGxlbmd0aCA9PSAtMSkgewpkaWZmIC0tZ2l0IGEvbWlzYy9jb21tZGxnLmMgYi9taXNjL2NvbW1kbGcuYwppbmRleCBjMGYyYTEyLi44NWMwZjJiIDEwMDY0NAotLS0gYS9taXNjL2NvbW1kbGcuYworKysgYi9taXNjL2NvbW1kbGcuYwpAQCAtMTM3LDcgKzEzNyw3IEBACiAJCSAgICBGcmVlUmVzb3VyY2UxNiggaERsZ1RtcGwgKTsKICAgICB9CiAKLSAgICBkcHJpbnRmX2luZm8oY29tbWRsZywiR2V0T3BlbkZpbGVOYW1lIC8vIHJldHVybiBscHN0ckZpbGU9JyVzJyAhXG4iLCAKKyAgICBUUkFDRShjb21tZGxnLCJyZXR1cm4gbHBzdHJGaWxlPSclcycgIVxuIiwgCiAgICAgICAgICAgIChMUFNUUilQVFJfU0VHX1RPX0xJTihscG9mbi0+bHBzdHJGaWxlKSk7CiAgICAgcmV0dXJuIGJSZXQ7CiB9CkBAIC0yMzEsNyArMjMxLDcgQEAKIAkJICAgIEZyZWVSZXNvdXJjZTE2KCBoRGxnVG1wbCApOwogICAgIH0KIAotICAgIGRwcmludGZfaW5mbyhjb21tZGxnLCAiR2V0U2F2ZUZpbGVOYW1lIC8vIHJldHVybiBscHN0ckZpbGU9JyVzJyAhXG4iLCAKKyAgICBUUkFDRShjb21tZGxnLCAicmV0dXJuIGxwc3RyRmlsZT0nJXMnICFcbiIsIAogICAgICAgICAgICAgKExQU1RSKVBUUl9TRUdfVE9fTElOKGxwb2ZuLT5scHN0ckZpbGUpKTsKICAgICByZXR1cm4gYlJldDsKIH0KQEAgLTQ4Myw3ICs0ODMsNyBAQAogICAgIHsKICAgICAgIHBzdHIgPSAoTFBTVFIpUFRSX1NFR19UT19MSU4obHBvZm4tPmxwc3RyQ3VzdG9tRmlsdGVyKTsKICAgICAgIG4gPSAwOwotICAgICAgZHByaW50Zl9pbmZvKGNvbW1kbGcsImxwc3RyQ3VzdG9tRmlsdGVyID0gJXBcbiIsIHBzdHIpOworICAgICAgVFJBQ0UoY29tbWRsZywibHBzdHJDdXN0b21GaWx0ZXIgPSAlcFxuIiwgcHN0cik7CiAgICAgICB3aGlsZSgqcHN0cikKIAl7CiAJICBvbGRfcHN0ciA9IHBzdHI7CkBAIC00OTEsNyArNDkxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQQVJBTSlscG9mbi0+bHBzdHJDdXN0b21GaWx0ZXIgKyBuICk7CiAgICAgICAgICAgbiArPSBzdHJsZW4ocHN0cikgKyAxOwogCSAgcHN0ciArPSBzdHJsZW4ocHN0cikgKyAxOwotCSAgZHByaW50Zl9pbmZvKGNvbW1kbGcsImxwc3RyQ3VzdG9tRmlsdGVyIC8vIGFkZCBzdHI9JyVzJyAiCisJICBUUkFDRShjb21tZGxnLCJhZGQgc3RyPSclcycgIgogCQkJICAiYXNzb2NpYXRlZCB0byAnJXMnXG4iLCBvbGRfcHN0ciwgcHN0cik7CiAgICAgICAgICAgU2VuZERsZ0l0ZW1NZXNzYWdlMTYoaFduZCwgY21iMSwgQ0JfU0VUSVRFTURBVEExNiwgaSwgKExQQVJBTSlwc3RyKTsKICAgICAgICAgICBuICs9IHN0cmxlbihwc3RyKSArIDE7CkBAIC01MDgsNyArNTA4LDcgQEAKIAkJCQkgICAgICAgKExQQVJBTSlscG9mbi0+bHBzdHJGaWx0ZXIgKyBuICk7CiAJICBuICs9IHN0cmxlbihwc3RyKSArIDE7CiAJICBwc3RyICs9IHN0cmxlbihwc3RyKSArIDE7Ci0JICBkcHJpbnRmX2luZm8oY29tbWRsZywibHBzdHJGaWx0ZXIgLy8gYWRkIHN0cj0nJXMnICIKKwkgIFRSQUNFKGNvbW1kbGcsImFkZCBzdHI9JyVzJyAiCiAJCQkgICJhc3NvY2lhdGVkIHRvICclcydcbiIsIG9sZF9wc3RyLCBwc3RyKTsKIAkgIFNlbmREbGdJdGVtTWVzc2FnZTE2KGhXbmQsIGNtYjEsIENCX1NFVElURU1EQVRBMTYsIGksIChMUEFSQU0pcHN0cik7CiAJICBuICs9IHN0cmxlbihwc3RyKSArIDE7CkBAIC01MjIsNyArNTIyLDcgQEAKICAgc3RybmNweSh0bXBzdHIsIEZJTEVETEdfR2V0RmlsZVR5cGUoUFRSX1NFR19UT19MSU4obHBvZm4tPmxwc3RyQ3VzdG9tRmlsdGVyKSwKIAkgICAgIFBUUl9TRUdfVE9fTElOKGxwb2ZuLT5scHN0ckZpbHRlciksIGxwb2ZuLT5uRmlsdGVySW5kZXggLSAxKSw1MTEpOwogICB0bXBzdHJbNTExXT0wOwotICBkcHJpbnRmX2luZm8oY29tbWRsZywibkZpbHRlckluZGV4ID0gJWxkIC8vIFNldFRleHQgb2YgZWR0MSB0byAnJXMnXG4iLCAKKyAgVFJBQ0UoY29tbWRsZywibkZpbHRlckluZGV4ID0gJWxkLCBTZXRUZXh0IG9mIGVkdDEgdG8gJyVzJ1xuIiwgCiAgIAkJCWxwb2ZuLT5uRmlsdGVySW5kZXgsIHRtcHN0cik7CiAgIFNldERsZ0l0ZW1UZXh0MzJBKCBoV25kLCBlZHQxLCB0bXBzdHIgKTsKICAgLyogZ2V0IGRyaXZlIGxpc3QgKi8KQEAgLTYzNyw3ICs2MzcsNyBAQAogICAgICAgaWYgKGxSZXQgPT0gTEJfRVJSKQogCXJldHVybiBUUlVFOwogICAgICAgcHN0ciA9IChMUFNUUilTZW5kRGxnSXRlbU1lc3NhZ2UxNihoV25kLCBjbWIxLCBDQl9HRVRJVEVNREFUQTE2LCBsUmV0LCAwKTsKLSAgICAgIGRwcmludGZfaW5mbyhjb21tZGxnLCJTZWxlY3RlZCBmaWx0ZXIgOiAlc1xuIiwgcHN0cik7CisgICAgICBUUkFDRShjb21tZGxnLCJTZWxlY3RlZCBmaWx0ZXIgOiAlc1xuIiwgcHN0cik7CiAgICAgICBTZXREbGdJdGVtVGV4dDMyQSggaFduZCwgZWR0MSwgcHN0ciApOwogICAgICAgRklMRURMR19TY2FuRGlyKGhXbmQsIHRtcHN0cik7CiAgICAgICByZXR1cm4gVFJVRTsKQEAgLTY2NSw3ICs2NjUsNyBAQAogCSAgICAgIHN0cmNweSh0bXBzdHIyLCB0bXBzdHIpOwogCSAgICAgICp0bXBzdHI9MDsKIAkgICAgfQotCSAgZHByaW50Zl9pbmZvKGNvbW1kbGcsImNvbW1kbGc6ICVzLCAlc1xuIiwgdG1wc3RyLCB0bXBzdHIyKTsKKwkgIFRSQUNFKGNvbW1kbGcsInRtcHN0cj0lcywgdG1wc3RyMj0lc1xuIiwgdG1wc3RyLCB0bXBzdHIyKTsKICAgICAgICAgICBTZXREbGdJdGVtVGV4dDMyQSggaFduZCwgZWR0MSwgdG1wc3RyMiApOwogCSAgRklMRURMR19TY2FuRGlyKGhXbmQsIHRtcHN0cik7CiAJICByZXR1cm4gVFJVRTsKQEAgLTY3OCw3ICs2NzgsNyBAQAogICAgICAgbFJldCA9IFNlbmREbGdJdGVtTWVzc2FnZTE2KGhXbmQsIGNtYjEsIENCX0dFVENVUlNFTDE2LCAwLCAwKTsKICAgICAgIGlmIChsUmV0ID09IExCX0VSUikgcmV0dXJuIFRSVUU7CiAgICAgICBscG9mbi0+bkZpbHRlckluZGV4ID0gbFJldCArIDE7Ci0gICAgICBkcHJpbnRmX2luZm8oY29tbWRsZywiY29tbWRsZzogbHBvZm4tPm5GaWx0ZXJJbmRleD0lbGRcbiIsIGxwb2ZuLT5uRmlsdGVySW5kZXgpOworICAgICAgVFJBQ0UoY29tbWRsZywibHBvZm4tPm5GaWx0ZXJJbmRleD0lbGRcbiIsIGxwb2ZuLT5uRmlsdGVySW5kZXgpOwogICAgICAgbHN0cmNweW4zMkEodG1wc3RyMiwgCiAJICAgICBGSUxFRExHX0dldEZpbGVUeXBlKFBUUl9TRUdfVE9fTElOKGxwb2ZuLT5scHN0ckN1c3RvbUZpbHRlciksCiAJCQkJIFBUUl9TRUdfVE9fTElOKGxwb2ZuLT5scHN0ckZpbHRlciksCkBAIC0xMTI4LDcgKzExMjgsNyBAQAogICAgIEhXTkQzMiBod25kRGlhbG9nOwogICAgIExQUFJJTlRETEcxNiBscFByaW50ID0gKExQUFJJTlRETEcxNilQVFJfU0VHX1RPX0xJTihwcmludGRsZyk7CiAKLSAgICBkcHJpbnRmX2luZm8oY29tbWRsZywiUHJpbnREbGcoJXApIC8vIEZsYWdzPSUwOGxYXG4iLCBscFByaW50LCBscFByaW50LT5GbGFncyApOworICAgIFRSQUNFKGNvbW1kbGcsIiglcCkgLS0gRmxhZ3M9JTA4bFhcbiIsIGxwUHJpbnQsIGxwUHJpbnQtPkZsYWdzICk7CiAKICAgICBpZiAobHBQcmludC0+RmxhZ3MgJiBQRF9SRVRVUk5ERUZBVUxUKQogICAgICAgICAvKiBGSVhNRTogc2hvdWxkIGZpbGwgbHBQcmludC0+aERldk1vZGUgYW5kIGxwUHJpbnQtPmhEZXZOYW1lcyBoZXJlICovCkBAIC0xMTgwLDcgKzExODAsNyBAQAogICBzd2l0Y2ggKHdNc2cpCiAgICAgewogICAgIGNhc2UgV01fSU5JVERJQUxPRzoKLSAgICAgIGRwcmludGZfaW5mbyhjb21tZGxnLCJQcmludERsZ1Byb2MgLy8gV01fSU5JVERJQUxPRyBsUGFyYW09JTA4bFhcbiIsIGxQYXJhbSk7CisgICAgICBUUkFDRShjb21tZGxnLCJXTV9JTklURElBTE9HIGxQYXJhbT0lMDhsWFxuIiwgbFBhcmFtKTsKICAgICAgIFNob3dXaW5kb3cxNihoV25kLCBTV19TSE9XTk9STUFMKTsKICAgICAgIHJldHVybiAoVFJVRSk7CiAgICAgY2FzZSBXTV9DT01NQU5EOgpAQCAtMTIwOCw3ICsxMjA4LDcgQEAKICAgc3dpdGNoICh3TXNnKQogICAgIHsKICAgICBjYXNlIFdNX0lOSVRESUFMT0c6Ci0gICAgICBkcHJpbnRmX2luZm8oY29tbWRsZywiUHJpbnRTZXR1cERsZ1Byb2MgLy8gV01fSU5JVERJQUxPRyBsUGFyYW09JTA4bFhcbiIsIGxQYXJhbSk7CisgICAgICBUUkFDRShjb21tZGxnLCJXTV9JTklURElBTE9HIGxQYXJhbT0lMDhsWFxuIiwgbFBhcmFtKTsKICAgICAgIFNob3dXaW5kb3cxNihoV25kLCBTV19TSE9XTk9STUFMKTsKICAgICAgIHJldHVybiAoVFJVRSk7CiAgICAgY2FzZSBXTV9DT01NQU5EOgpAQCAtMTI0MCw3ICsxMjQwLDcgQEAKIHNob3J0IFdJTkFQSSBHZXRGaWxlVGl0bGUzMkEoTFBDU1RSIGxwRmlsZSwgTFBTVFIgbHBUaXRsZSwgVUlOVDMyIGNiQnVmKQogewogICAgIGludCBpLCBsZW47Ci0gICAgZHByaW50Zl9pbmZvKGNvbW1kbGcsIkdldEZpbGVUaXRsZSglcCAlcCAlZCk7IFxuIiwgbHBGaWxlLCBscFRpdGxlLCBjYkJ1Zik7CisgICAgVFJBQ0UoY29tbWRsZywiKCVwICVwICVkKTsgXG4iLCBscEZpbGUsIGxwVGl0bGUsIGNiQnVmKTsKICAgICBpZiAobHBGaWxlID09IE5VTEwgfHwgbHBUaXRsZSA9PSBOVUxMKQogICAgIAlyZXR1cm4gLTE7CiAgICAgbGVuID0gc3RybGVuKGxwRmlsZSk7CkBAIC0xMjU3LDcgKzEyNTcsNyBAQAogCWkrKzsKIAlicmVhazsKICAgICB9Ci0gICAgZHByaW50Zl9pbmZvKGNvbW1kbGcsIi0tLT4gJyVzJyBcbiIsICZscEZpbGVbaV0pOworICAgIFRSQUNFKGNvbW1kbGcsIi0tLT4gJyVzJyBcbiIsICZscEZpbGVbaV0pOwogICAgIAogICAgIGxlbiA9IHN0cmxlbihscEZpbGUraSkrMTsKICAgICBpZiAoY2JCdWYgPCBsZW4pCkBAIC0xMzA2LDcgKzEzMDYsNyBAQAogICAgIExQQ1ZPSUQgdGVtcGxhdGU7CiAgICAgSFdORDMyIGh3bmREaWFsb2c7CiAKLSAgICBkcHJpbnRmX2luZm8oY29tbWRsZywiQ2hvb3NlQ29sb3JcbiIpOworICAgIFRSQUNFKGNvbW1kbGcsIkNob29zZUNvbG9yXG4iKTsKICAgICBpZiAoIWxwQ2hDb2wpIHJldHVybiBGQUxTRTsgICAgCiAKICAgICBpZiAobHBDaENvbC0+RmxhZ3MgJiBDQ19FTkFCTEVURU1QTEFURUhBTkRMRSkKQEAgLTIwNzAsNyArMjA3MCw3IEBACiAgICBQT0lOVDE2IHBvaW50OwogICAgc3RydWN0IENDUFJJVkFURSAqIGxwcDsgCiAgICAKLSAgIGRwcmludGZfaW5mbyhjb21tZGxnLCJDb2xvckRsZ1Byb2MgLy8gV01fSU5JVERJQUxPRyBsUGFyYW09JTA4bFhcbiIsIGxQYXJhbSk7CisgICBUUkFDRShjb21tZGxnLCJXTV9JTklURElBTE9HIGxQYXJhbT0lMDhsWFxuIiwgbFBhcmFtKTsKICAgIGxwcD1jYWxsb2MoMSxzaXplb2Yoc3RydWN0IENDUFJJVkFURSkpOwogICAgbHBwLT5scGNjPShMUENIT09TRUNPTE9SKWxQYXJhbTsKICAgIGlmIChscHAtPmxwY2MtPmxTdHJ1Y3RTaXplICE9IHNpemVvZihDSE9PU0VDT0xPUikpCkBAIC0yMTM5LDcgKzIxMzksNyBAQAogICAgIEhEQzMyIGhkYzsKICAgICBDT0xPUlJFRiAqY3I7CiAgICAgc3RydWN0IENDUFJJVkFURSAqIGxwcD0oc3RydWN0IENDUFJJVkFURSAqKUdldFdpbmRvd0xvbmczMkEoaERsZywgRFdMX1VTRVIpOyAKLSAgICBkcHJpbnRmX2luZm8oY29tbWRsZywiQ0NfV01Db21tYW5kIHdQYXJhbT0leCBsUGFyYW09JWx4XG4iLHdQYXJhbSxsUGFyYW0pOworICAgIFRSQUNFKGNvbW1kbGcsIkNDX1dNQ29tbWFuZCB3UGFyYW09JXggbFBhcmFtPSVseFxuIix3UGFyYW0sbFBhcmFtKTsKICAgICBzd2l0Y2ggKHdQYXJhbSkKICAgICB7CiAgICAgICAgICAgY2FzZSAweDJjMjogIC8qIGVkaXQgbm90aWZ5IFJHQiAqLwpAQCAtMjQwMSw3ICsyNDAxLDcgQEAKICAgICBMUENWT0lEIHRlbXBsYXRlOwogICAgIEhXTkQzMiBod25kRGlhbG9nOwogCi0gICAgZHByaW50Zl9pbmZvKGNvbW1kbGcsIkNob29zZUZvbnRcbiIpOworICAgIFRSQUNFKGNvbW1kbGcsIkNob29zZUZvbnRcbiIpOwogICAgIGlmICghbHBDaEZvbnQpIHJldHVybiBGQUxTRTsgICAgCiAKICAgICBpZiAobHBDaEZvbnQtPkZsYWdzICYgQ0ZfRU5BQkxFVEVNUExBVEVIQU5ETEUpCkBAIC0yNDgzLDggKzI0ODMsNyBAQAogICBMUENIT09TRUZPTlQgbHBjZj0oTFBDSE9PU0VGT05UKUdldFdpbmRvd0xvbmczMkEoaERsZywgRFdMX1VTRVIpOyAKICAgTE9HRk9OVDE2ICpscGxmID0gKExPR0ZPTlQxNiAqKVBUUl9TRUdfVE9fTElOKCBsb2dmb250ICk7CiAKLSAgZHByaW50Zl9pbmZvKGNvbW1kbGcsIkZvbnRGYW1pbHlFbnVtUHJvYzogZm9udD0lcyAobkZvbnRUeXBlPSVkKVxuIiwKLSAgICAgCQkJbHBsZi0+bGZGYWNlTmFtZSxuRm9udFR5cGUpOworICBUUkFDRShjb21tZGxnLCJmb250PSVzIChuRm9udFR5cGU9JWQpXG4iLCBscGxmLT5sZkZhY2VOYW1lLG5Gb250VHlwZSk7CiAKICAgaWYgKGxwY2YtPkZsYWdzICYgQ0ZfRklYRURQSVRDSE9OTFkpCiAgICBpZiAoIShscGxmLT5sZlBpdGNoQW5kRmFtaWx5ICYgRklYRURfUElUQ0gpKQpAQCAtMjYwMiwxMSArMjYwMSwxNCBAQAogICBURVhUTUVUUklDMTYgKmxwdG0gPSAoVEVYVE1FVFJJQzE2ICopUFRSX1NFR19UT19MSU4obWV0cmljcyk7CiAgIGludCBpOwogICAKLSAgZHByaW50Zl9pbmZvKGNvbW1kbGcsIkZvbnRTdHlsZUVudW1Qcm9jOiAobkZvbnRUeXBlPSVkKVxuIixuRm9udFR5cGUpOwotICBkcHJpbnRmX2luZm8oY29tbWRsZywiICAlcyBoPSVkIHc9JWQgZT0lZCBvPSVkIHdnPSVkIGk9JWQgdT0lZCBzPSVkIGNoPSVkIG9wPSVkIGNwPSVkIHE9JWQgcGY9JXhoXG4iLAotCWxwbGYtPmxmRmFjZU5hbWUsbHBsZi0+bGZIZWlnaHQsbHBsZi0+bGZXaWR0aCxscGxmLT5sZkVzY2FwZW1lbnQsbHBsZi0+bGZPcmllbnRhdGlvbiwKLQlscGxmLT5sZldlaWdodCxscGxmLT5sZkl0YWxpYyxscGxmLT5sZlVuZGVybGluZSxscGxmLT5sZlN0cmlrZU91dCxscGxmLT5sZkNoYXJTZXQsCi0JbHBsZi0+bGZPdXRQcmVjaXNpb24sbHBsZi0+bGZDbGlwUHJlY2lzaW9uLGxwbGYtPmxmUXVhbGl0eSxscGxmLT5sZlBpdGNoQW5kRmFtaWx5KTsKKyAgVFJBQ0UoY29tbWRsZywiKG5Gb250VHlwZT0lZClcbiIsbkZvbnRUeXBlKTsKKyAgVFJBQ0UoY29tbWRsZywiICAlcyBoPSVkIHc9JWQgZT0lZCBvPSVkIHdnPSVkIGk9JWQgdT0lZCBzPSVkIgorCSAgICAgICAiIGNoPSVkIG9wPSVkIGNwPSVkIHE9JWQgcGY9JXhoXG4iLAorCSAgICAgICBscGxmLT5sZkZhY2VOYW1lLGxwbGYtPmxmSGVpZ2h0LGxwbGYtPmxmV2lkdGgsCisJICAgICAgIGxwbGYtPmxmRXNjYXBlbWVudCxscGxmLT5sZk9yaWVudGF0aW9uLAorCSAgICAgICBscGxmLT5sZldlaWdodCxscGxmLT5sZkl0YWxpYyxscGxmLT5sZlVuZGVybGluZSwKKwkgICAgICAgbHBsZi0+bGZTdHJpa2VPdXQsbHBsZi0+bGZDaGFyU2V0LCBscGxmLT5sZk91dFByZWNpc2lvbiwKKwkgICAgICAgbHBsZi0+bGZDbGlwUHJlY2lzaW9uLGxwbGYtPmxmUXVhbGl0eSwgbHBsZi0+bGZQaXRjaEFuZEZhbWlseSk7CiAKICAgaWYgKFNldEZvbnRTaXplc1RvQ29tYm8zKGhjbWIzLCBscGxmICxscGNmKSkKICAgIHJldHVybiAwOwpAQCAtMjYzOSwxMSArMjY0MSwxMSBAQAogICBTZXRXaW5kb3dMb25nMzJBKGhEbGcsIERXTF9VU0VSLCBsUGFyYW0pOyAKICAgbHBjZj0oTFBDSE9PU0VGT05UKWxQYXJhbTsKICAgbHB4eD1QVFJfU0VHX1RPX0xJTihscGNmLT5scExvZ0ZvbnQpOwotICBkcHJpbnRmX2luZm8oY29tbWRsZywiRm9ybWF0Q2hhckRsZ1Byb2MgLy8gV01fSU5JVERJQUxPRyBsUGFyYW09JTA4bFhcbiIsIGxQYXJhbSk7CisgIFRSQUNFKGNvbW1kbGcsIldNX0lOSVRESUFMT0cgbFBhcmFtPSUwOGxYXG4iLCBsUGFyYW0pOwogCiAgIGlmIChscGNmLT5sU3RydWN0U2l6ZSAhPSBzaXplb2YoQ0hPT1NFRk9OVCkpCiAgIHsKLSAgICBkcHJpbnRmX2Vycihjb21tZGxnLCJXTV9JTklURElBTE9HOiBzdHJ1Y3R1cmUgc2l6ZSBmYWlsdXJlICEhIVxuIik7CisgICAgRVJSKGNvbW1kbGcsInN0cnVjdHVyZSBzaXplIGZhaWx1cmUgISEhXG4iKTsKICAgICBFbmREaWFsb2czMiAoaERsZywgMCk7IAogICAgIHJldHVybiBGQUxTRTsKICAgfQpAQCAtMjY4Miw3ICsyNjg0LDcgQEAKICAgewogICAgIGlmICghRW51bUZvbnRGYW1pbGllczE2KGhkYywgTlVMTCxGb250RmFtaWx5RW51bVByb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQQVJBTSlHZXREbGdJdGVtMzIoaERsZyxjbWIxKSkpCi0gICAgICBkcHJpbnRmX2luZm8oY29tbWRsZywiV01fSU5JVERJQUxPRzogRW51bUZvbnRGYW1pbGllcyByZXR1cm5zIDBcbiIpOworICAgICAgVFJBQ0UoY29tbWRsZywiRW51bUZvbnRGYW1pbGllcyByZXR1cm5zIDBcbiIpOwogICAgIGlmIChscGNmLT5GbGFncyAmIENGX0lOSVRUT0xPR0ZPTlRTVFJVQ1QpCiAgICAgewogICAgICAgLyogbG9vayBmb3IgZml0dGluZyBmb250IG5hbWUgaW4gY29tYm9ib3gxICovCkBAIC0yNzI5LDcgKzI3MzEsNyBAQAogICB9CiAgIGVsc2UKICAgewotICAgIGRwcmludGZfd2Fybihjb21tZGxnLCJXTV9JTklURElBTE9HOiBIREMgZmFpbHVyZSAhISFcbiIpOworICAgIFdBUk4oY29tbWRsZywiSERDIGZhaWx1cmUgISEhXG4iKTsKICAgICBFbmREaWFsb2czMiAoaERsZywgMCk7IAogICAgIHJldHVybiBGQUxTRTsKICAgfQpAQCAtMjc5NCw3ICsyNzk2LDcgQEAKICAgIGJ1ZmZlciA9IFNFR1BUUl9BTExPQyg0MCk7CiAgICBzd2l0Y2ggKGxwZGktPkN0bElEKQogICAgewotICAgIGNhc2UgY21iMToJLyogZHByaW50Zl9pbmZvKGNvbW1kbGcsIldNX0RyYXdpdGVtIGNtYjFcbiIpOyAqLworICAgIGNhc2UgY21iMToJLyogVFJBQ0UoY29tbWRsZywiV01fRHJhd2l0ZW0gY21iMVxuIik7ICovCiAJCVNlbmRNZXNzYWdlMTYobHBkaS0+aHduZEl0ZW0sIENCX0dFVExCVEVYVDE2LCBscGRpLT5pdGVtSUQsCiAJCQkoTFBBUkFNKVNFR1BUUl9HRVQoYnVmZmVyKSk7CSAgICAgICAgICAKIAkJR2V0T2JqZWN0MTYoIGhCaXRtYXBUVCwgc2l6ZW9mKGJtKSwgJmJtICk7CkBAIC0yODE1LDE0ICsyODE3LDE0IEBACiAjZW5kaWYKIAkJYnJlYWs7CiAgICAgY2FzZSBjbWIyOgotICAgIGNhc2UgY21iMzoJLyogZHByaW50Zl9pbmZvKGNvbW1kbGcsIldNX0RSQVdJVEVOIGNtYjIsY21iM1xuIik7ICovCisgICAgY2FzZSBjbWIzOgkvKiBUUkFDRShjb21tZGxnLCJXTV9EUkFXSVRFTiBjbWIyLGNtYjNcbiIpOyAqLwogCQlTZW5kTWVzc2FnZTE2KGxwZGktPmh3bmRJdGVtLCBDQl9HRVRMQlRFWFQxNiwgbHBkaS0+aXRlbUlELAogCQkJKExQQVJBTSlTRUdQVFJfR0VUKGJ1ZmZlcikpOwogCQlUZXh0T3V0MTYobHBkaS0+aERDLCBscGRpLT5yY0l0ZW0ubGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBkaS0+cmNJdGVtLnRvcCwgYnVmZmVyLCBsc3RybGVuMTYoYnVmZmVyKSk7CiAJCWJyZWFrOwogCi0gICAgY2FzZSBjbWI0OgkvKiBkcHJpbnRmX2luZm8oY29tbWRsZywiV01fRFJBV0lURU0gY21iNCAoPUNPTE9SKVxuIik7ICovCisgICAgY2FzZSBjbWI0OgkvKiBUUkFDRShjb21tZGxnLCJXTV9EUkFXSVRFTSBjbWI0ICg9Q09MT1IpXG4iKTsgKi8KIAkJU2VuZE1lc3NhZ2UxNihscGRpLT5od25kSXRlbSwgQ0JfR0VUTEJURVhUMTYsIGxwZGktPml0ZW1JRCwKICAgICAJCSAgICAoTFBBUkFNKVNFR1BUUl9HRVQoYnVmZmVyKSk7CiAJCVRleHRPdXQxNihscGRpLT5oREMsIGxwZGktPnJjSXRlbS5sZWZ0ICsgIDI1KzUsCkBAIC0yODgxLDcgKzI4ODMsNyBAQAogICBMUENIT09TRUZPTlQgbHBjZj0oTFBDSE9PU0VGT05UKUdldFdpbmRvd0xvbmczMkEoaERsZywgRFdMX1VTRVIpOyAKICAgTFBMT0dGT05UMTYgbHB4eD1QVFJfU0VHX1RPX0xJTihscGNmLT5scExvZ0ZvbnQpOwogICAKLSAgZHByaW50Zl9pbmZvKGNvbW1kbGcsIkZvcm1hdENoYXJEbGdQcm9jIC8vIFdNX0NPTU1BTkQgbFBhcmFtPSUwOGxYXG4iLCBsUGFyYW0pOworICBUUkFDRShjb21tZGxnLCJXTV9DT01NQU5EIGxQYXJhbT0lMDhsWFxuIiwgbFBhcmFtKTsKICAgc3dpdGNoICh3UGFyYW0pCiAgIHsKIAljYXNlIGNtYjE6aWYgKEhJV09SRChsUGFyYW0pPT1DQk5fU0VMQ0hBTkdFKQpAQCAtMjg5OCw3ICsyOTAwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnN0ciA9IFNFR1BUUl9BTExPQygyNTYpOwogICAgICAgICAgICAgICAgICAgICAgICAgU2VuZERsZ0l0ZW1NZXNzYWdlMTYoaERsZyxjbWIxLENCX0dFVExCVEVYVDE2LGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBBUkFNKVNFR1BUUl9HRVQoc3RyKSk7Ci0JICAgICAgICAgICAgICAgIGRwcmludGZfaW5mbyhjb21tZGxnLCJXTV9DT01NQU5EL2NtYjEgPT4lc1xuIixzdHIpOworCSAgICAgICAgICAgICAgICBUUkFDRShjb21tZGxnLCJXTV9DT01NQU5EL2NtYjEgPT4lc1xuIixzdHIpOwogICAgICAgIAkJICAgICAgICBFbnVtRm9udEZhbWlsaWVzMTYoaGRjLHN0cixGb250U3R5bGVFbnVtUHJvYywKIAkJICAgICAgICAgICAgIE1BS0VMT05HKEdldERsZ0l0ZW0zMihoRGxnLGNtYjIpLEdldERsZ0l0ZW0zMihoRGxnLGNtYjMpKSk7CiAJCSAgICAgICAgU2V0Q3Vyc29yMTYoaGN1cnNvcik7CkBAIC0yOTA5LDcgKzI5MTEsNyBAQAogIAkJICAgIH0KICAJCSAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICBkcHJpbnRmX3dhcm4oY29tbWRsZywiV01fQ09NTUFORDogSERDIGZhaWx1cmUgISEhXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICBXQVJOKGNvbW1kbGcsIkhEQyBmYWlsdXJlICEhIVxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgRW5kRGlhbG9nMzIgKGhEbGcsIDApOyAKICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMjkyMCw3ICsyOTIyLDcgQEAKIAljYXNlIGNtYjM6aWYgKEhJV09SRChsUGFyYW0pPT1DQk5fU0VMQ0hBTkdFIHx8IEhJV09SRChsUGFyYW0pPT0gQk5fQ0xJQ0tFRCApCiAJICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgY2hhciAqc3RyID0gU0VHUFRSX0FMTE9DKDI1Nik7Ci0gICAgICAgICAgICAgICAgICAgIGRwcmludGZfaW5mbyhjb21tZGxnLCJXTV9DT01NQU5EL2NtYjIsMyA9JTA4bFhcbiIsIGxQYXJhbSk7CisgICAgICAgICAgICAgICAgICAgIFRSQUNFKGNvbW1kbGcsIldNX0NPTU1BTkQvY21iMiwzID0lMDhsWFxuIiwgbFBhcmFtKTsKIAkJICAgIGk9U2VuZERsZ0l0ZW1NZXNzYWdlMTYoaERsZyxjbWIxLENCX0dFVENVUlNFTDE2LDAsMCk7CiAJCSAgICBpZiAoaT09Q0JfRVJSKQogICAgICAgICAgICAgICAgICAgICAgIGk9R2V0RGxnSXRlbVRleHQzMkEoIGhEbGcsIGNtYjEsIHN0ciwgMjU2ICk7CkBAIC0zMDM2LDkgKzMwMzgsOSBAQAogICAgICAgY2FzZSBXTV9DT01NQU5EOgogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENGbl9XTUNvbW1hbmQoaERsZyx3UGFyYW0sbFBhcmFtKTsKICAgICAgIGNhc2UgV01fQ0hPT1NFRk9OVF9HRVRMT0dGT05UOiAKLSAgICAgICAgICAgICAgICAgICAgICAgICBkcHJpbnRmX2luZm8oY29tbWRsZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIkZvcm1hdENoYXJEbGdQcm9jIC8vIFdNX0NIT09TRUZPTlRfR0VUTE9HRk9OVCBsUGFyYW09JTA4bFhcbiIsIGxQYXJhbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBGSVhNRTogIGN1cnJlbnQgbG9nZm9udCBiYWNrIHRvIGNhbGxlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFKGNvbW1kbGcsIldNX0NIT09TRUZPTlRfR0VUTE9HRk9OVCBsUGFyYW09JTA4bFhcbiIsCisJCQkJICAgICAgbFBhcmFtKTsKKwkJCSBGSVhNRShjb21tZGxnLCAiY3VycmVudCBsb2dmb250IGJhY2sgdG8gY2FsbGVyXG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KICAgcmV0dXJuIEZBTFNFOwpkaWZmIC0tZ2l0IGEvbWlzYy9jcnRkbGwuYyBiL21pc2MvY3J0ZGxsLmMKaW5kZXggN2NhOGZiOS4uYWM1YmVlYiAxMDA2NDQKLS0tIGEvbWlzYy9jcnRkbGwuYworKysgYi9taXNjL2NydGRsbC5jCkBAIC04MiwxMyArODIsMTIgQEAKIAlpbnQJeGFyZ2MsaSxhZnRlcmxhc3RzcGFjZTsKIAlEV09SRAl2ZXJzaW9uOwogCi0JZHByaW50Zl9pbmZvKGNydGRsbCwiQ1JURExMX19HZXRNYWluQXJncyglcCwlcCwlcCwlbGQpLlxuIiwKKwlUUkFDRShjcnRkbGwsIiglcCwlcCwlcCwlbGQpLlxuIiwKIAkJYXJnYyxhcmd2LGVudmlyb24sZmxhZwogCSk7CiAJQ1JURExMX2FjbWRsbl9kbGwgPSBjbWRsaW5lID0gSEVBUF9zdHJkdXBBKCBHZXRQcm9jZXNzSGVhcCgpLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldENvbW1hbmRMaW5lMzJBKCkgKTsKLSAJZHByaW50Zl9pbmZvKGNydGRsbCwiQ1JURExMX19HZXRNYWluQXJncyBnb3QgXCIlc1wiXG4iLAotCQljbWRsaW5lKTsKKyAJVFJBQ0UoY3J0ZGxsLCJnb3QgJyVzJ1xuIiwgY21kbGluZSk7CiAKIAl2ZXJzaW9uCT0gR2V0VmVyc2lvbjMyKCk7CiAJQ1JURExMX29zdmVyX2RsbCAgICAgICA9IHZlcnNpb24gPj4gMTY7CkBAIC0xMzAsNyArMTI5LDcgQEAKIAlDUlRETExfYXJndl9kbGwJPSB4YXJndjsKIAkqYXJndgkJPSB4YXJndjsKIAotCWRwcmludGZfaW5mbyhjcnRkbGwsIkNSVERMTF9fR2V0TWFpbkFyZ3MgZm91bmQgJWQgYXJndW1lbnRzXG4iLAorCVRSQUNFKGNydGRsbCwiZm91bmQgJWQgYXJndW1lbnRzXG4iLAogCQlDUlRETExfYXJnY19kbGwpOwogCUNSVERMTF9lbnZpcm9uX2RsbCA9ICplbnZpcm9uID0gR2V0RW52aXJvbm1lbnRTdHJpbmdzMzJBKCk7CiAJcmV0dXJuIDA7CkBAIC0xNDYsNyArMTQ1LDcgQEAKIHsKIAlfSU5JVFRFUk1GVU4JKmN1cnJlbnQ7CiAKLQlkcHJpbnRmX2luZm8oY3J0ZGxsLCJfaW5pdHRlcm0oJXAsJXApXG4iLHN0YXJ0LGVuZCk7CisJVFJBQ0UoY3J0ZGxsLCIoJXAsJXApXG4iLHN0YXJ0LGVuZCk7CiAJY3VycmVudD1zdGFydDsKIAl3aGlsZSAoY3VycmVudDxlbmQpIHsKIAkJaWYgKCpjdXJyZW50KSAoKmN1cnJlbnQpKCk7CkBAIC0xNzMsOSArMTcyLDggQEAKICAgICBkZWZhdWx0OgogICAgICAgZmlsZT1mZG9wZW4oaGFuZGxlLG1vZGUpOwogICAgIH0KLSAgZHByaW50Zl9pbmZvKGNydGRsbCwKLQkJICJDUlRETExfZmRvcGVuIG9wZW4gaGFuZGxlICVkIG1vZGUgJXMgIGdvdCBmaWxlICVwXG4iLAotCQkgaGFuZGxlLCBtb2RlLCBmaWxlKTsKKyAgVFJBQ0UoY3J0ZGxsLCAib3BlbiBoYW5kbGUgJWQgbW9kZSAlcyAgZ290IGZpbGUgJXBcbiIsCisJICAgICAgIGhhbmRsZSwgbW9kZSwgZmlsZSk7CiAgIHJldHVybiAoRFdPUkQpZmlsZTsKIH0KIApAQCAtMTk5LDcgKzE5Nyw3IEBACiAgICAgRFdPUkQgKmFyZ3MgPSAoRFdPUkQgKilFU1BfcmVnKGNvbnRleHQpOwogICAgIFBFWENFUFRJT05fRlJBTUUgZW5kZnJhbWUgPSAoUEVYQ0VQVElPTl9GUkFNRSlhcmdzWzFdOwogICAgIERXT1JEIG5yID0gYXJnc1syXTsKLSAgICBmcHJpbnRmKHN0ZGVyciwiQ1JURExMX19sb2NhbF91bndpbmQyKCVwLCVsZClcbiIsZW5kZnJhbWUsbnIpOworICAgIGZwcmludGYoc3RkZXJyLCIoJXAsJWxkKVxuIixlbmRmcmFtZSxucik7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTIxMyw3ICsyMTEsNyBAQAogICBET1NfRlVMTF9OQU1FIGZ1bGxfbmFtZTsKICAgCiAgIGlmICghRE9TRlNfR2V0RnVsbE5hbWUoIHBhdGgsIEZBTFNFLCAmZnVsbF9uYW1lICkpIHsKLSAgICBkcHJpbnRmX3dhcm4oY3J0ZGxsLCAiQ1JURExMX2ZvcGVuIGZpbGUgJXMgYmFkIG5hbWVcbiIscGF0aCk7CisgICAgV0FSTihjcnRkbGwsICJmaWxlICVzIGJhZCBuYW1lXG4iLHBhdGgpOwogICAgcmV0dXJuIDA7CiAgIH0KICAgCkBAIC0yMzQsMTUgKzIzMiwxMyBAQAogICBlbHNlIGlmIChzdHJzdHIobW9kZSwiYSsiKSkgZmxhZ21vZGU9IE9fUkRXUiB8IE9fQ1JFQVQgfCBPX0FQUEVORDsKICAgZWxzZSBpZiAoc3RyY2hyKG1vZGUsJ3cnKSkgZmxhZ21vZGUgPSBPX1JEV1IgfCBPX0NSRUFUIHwgT19BUFBFTkQ7CiAgIGVsc2UgaWYgKHN0cmNocihtb2RlLCdiJykpCi0gICAgZHByaW50Zl9pbmZvKGNydGRsbCwKLQkJICAgIkNSVERMTF9mb3BlbiAlcyBpbiBCSU5BUlkgbW9kZVxuIixwYXRoKTsKKyAgICBUUkFDRShjcnRkbGwsICIlcyBpbiBCSU5BUlkgbW9kZVxuIixwYXRoKTsKICAgICAgIAogICBkb3NfZmlsZGVzPUZJTEVfT3BlbihwYXRoLCBmbGFnbW9kZSk7CiAgIHVuaXhfZmlsZGVzPUZJTEVfR2V0VW5peEhhbmRsZShkb3NfZmlsZGVzKTsKICAgZmlsZSA9IGZkb3Blbih1bml4X2ZpbGRlcyxtb2RlKTsKIAotICBkcHJpbnRmX2luZm8oY3J0ZGxsLAotCQkgIkNSVERMTF9mb3BlbiBmaWxlICVzIG1vZGUgJXMgZ290IHVmaCAlZCBkZmggJWQgZmlsZSAlcFxuIiwKKyAgVFJBQ0UoY3J0ZGxsLCAiZmlsZSAlcyBtb2RlICVzIGdvdCB1ZmggJWQgZGZoICVkIGZpbGUgJXBcbiIsCiAJCSBwYXRoLG1vZGUsdW5peF9maWxkZXMsZG9zX2ZpbGRlcyxmaWxlKTsKICAgcmV0dXJuIChEV09SRClmaWxlOwogfQpAQCAtMjYyLDMyICsyNTgsMjkgQEAKICAgICAga25vd24gYmluYXJ5IGV4dGVuc2lvbnMgbXVzdCBiZSB1bmNoYW5nZWQgKi8KICAgd2hpbGUgKCAoaSA8IChubWVtYipzaXplKSkgJiYgKHJldD09MSkpIHsKICAgICByZXQ9ZnJlYWQodGVtcCwxLDEsZmlsZSk7Ci0gICAgZHByaW50Zl9pbmZvKGNydGRsbCwKLQkJICJDUlRETExfZnJlYWQgZ290ICVjIDB4JTAyeCByZXQgJWRcbiIsCi0JCSAgIChpc2FscGhhKCoodW5zaWduZWQgY2hhciopdGVtcCkpPyAqKHVuc2lnbmVkIGNoYXIqKXRlbXA6Ci0JCSAgICAnICcsKih1bnNpZ25lZCBjaGFyKil0ZW1wLCByZXQpOworICAgIFRSQUNFKGNydGRsbCwgImdvdCAlYyAweCUwMnggcmV0ICVkXG4iLAorCQkgKGlzYWxwaGEoKih1bnNpZ25lZCBjaGFyKil0ZW1wKSk/ICoodW5zaWduZWQgY2hhciopdGVtcDoKKwkJICcgJywqKHVuc2lnbmVkIGNoYXIqKXRlbXAsIHJldCk7CiAgICAgaWYgKCoodW5zaWduZWQgY2hhciopdGVtcCAhPSAweGQpIHsgLyogc2tpcCBDUiAqLwogICAgICAgdGVtcCsrOwogICAgICAgaSsrOwogICAgIH0KICAgICBlbHNlCi0gICAgICBkcHJpbnRmX2luZm8oY3J0ZGxsLCAiQ1JURExMX2ZyZWFkIHNraXBwaW5nIF5NXG4iKTsKKyAgICAgIFRSQUNFKGNydGRsbCwgInNraXBwaW5nIF5NXG4iKTsKICAgfQotICBkcHJpbnRmX2luZm8oY3J0ZGxsLAotCQkgIkNSVERMTF9mcmVhZCAweCUwOHggaXRlbXMgb2Ygc2l6ZSAlZCBmcm9tIGZpbGUgJXAgdG8gJXBcbiIsCi0JCSBubWVtYixzaXplLGZpbGUscHRyLCk7CisgIFRSQUNFKGNydGRsbCwgIjB4JTA4eCBpdGVtcyBvZiBzaXplICVkIGZyb20gZmlsZSAlcCB0byAlcFxuIiwKKwkgICAgICAgbm1lbWIsc2l6ZSxmaWxlLHB0ciwpOwogICBpZihpIT1ubWVtYikKLSAgICBkcHJpbnRmX3dhcm4oY3J0ZGxsLCAiIGZhaWxlZCFcbiIpOworICAgIFdBUk4oY3J0ZGxsLCAiIGZhaWxlZCFcbiIpOwogCiAgIHJldHVybiBpOwogI2Vsc2UKICAgICAKICAgcmV0PWZyZWFkKHB0cixzaXplLG5tZW1iLGZpbGUpOwotICBkcHJpbnRmX2luZm8oY3J0ZGxsLAotCSAgICAgICAiQ1JURExMX2ZyZWFkIDB4JTA4eCBpdGVtcyBvZiBzaXplICVkIGZyb20gZmlsZSAlcCB0byAlcFxuIiwKKyAgVFJBQ0UoY3J0ZGxsLCAiMHglMDh4IGl0ZW1zIG9mIHNpemUgJWQgZnJvbSBmaWxlICVwIHRvICVwXG4iLAogCSAgICAgICBubWVtYixzaXplLGZpbGUscHRyKTsKICAgaWYocmV0IT1ubWVtYikKLSAgICBkcHJpbnRmX3dhcm4oY3J0ZGxsLCAiIGZhaWxlZCFcbiIpOworICAgIFdBUk4oY3J0ZGxsLCAiIGZhaWxlZCFcbiIpOwogCiAgIHJldHVybiByZXQ7CiAjZW5kaWYKQEAgLTMwMSwxMyArMjk0LDEyIEBACiAgIGxvbmcgcmV0OwogCiAgIHJldD1mc2VlayhzdHJlYW0sb2Zmc2V0LHdoZW5jZSk7Ci0gIGRwcmludGZfaW5mbyhjcnRkbGwsCi0JCSAiQ1JURExMX2ZzZWVrIGZpbGUgJXAgdG8gMHglMDhseCBwb3MgJXNcbiIsCi0JCSBzdHJlYW0sb2Zmc2V0LCh3aGVuY2U9PVNFRUtfU0VUKT8iU0VFS19TRVQiOgotCQkgKHdoZW5jZT09U0VFS19DVVIpPyJTRUVLX0NVUiI6Ci0JCSAod2hlbmNlPT1TRUVLX0VORCk/IlNFRUtfRU5EIjoiVU5LTk9XTiIpOworICBUUkFDRShjcnRkbGwsICJmaWxlICVwIHRvIDB4JTA4bHggcG9zICVzXG4iLAorCSAgICAgICBzdHJlYW0sb2Zmc2V0LCh3aGVuY2U9PVNFRUtfU0VUKT8iU0VFS19TRVQiOgorCSAgICAgICAod2hlbmNlPT1TRUVLX0NVUik/IlNFRUtfQ1VSIjoKKwkgICAgICAgKHdoZW5jZT09U0VFS19FTkQpPyJTRUVLX0VORCI6IlVOS05PV04iKTsKICAgaWYocmV0KQotICAgIGRwcmludGZfd2FybihjcnRkbGwsICIgZmFpbGVkIVxuIik7CisgICAgV0FSTihjcnRkbGwsICIgZmFpbGVkIVxuIik7CiAKICAgcmV0dXJuIHJldDsKIH0KQEAgLTMyMCw5ICszMTIsOCBAQAogICBsb25nIHJldDsKIAogICByZXQ9ZnRlbGwoc3RyZWFtKTsKLSAgZHByaW50Zl9pbmZvKGNydGRsbCwKLQkJICJDUlRETExfZnRlbGwgZmlsZSAlcCBhdCAweCUwOGx4XG4iLAotCQkgc3RyZWFtLHJldCk7CisgIFRSQUNFKGNydGRsbCwgImZpbGUgJXAgYXQgMHglMDhseFxuIiwKKwkgICAgICAgc3RyZWFtLHJldCk7CiAgIHJldHVybiByZXQ7CiB9CiAgIApAQCAtMzM0LDExICszMjUsMTAgQEAKICAgc2l6ZV90IHJldDsKIAogICByZXQ9ZndyaXRlKHB0cixzaXplLG5tZW1iLGZpbGUpOwotICBkcHJpbnRmX2luZm8oY3J0ZGxsLAotCQkgIkNSVERMTF9md3JpdGUgMHglMDh4IGl0ZW1zIG9mIHNpemUgJWQgZnJvbSAlcCB0byBmaWxlICVwXG4iLAotCQkgbm1lbWIsc2l6ZSxwdHIsZmlsZSk7CisgIFRSQUNFKGNydGRsbCwgIjB4JTA4eCBpdGVtcyBvZiBzaXplICVkIGZyb20gJXAgdG8gZmlsZSAlcFxuIiwKKwkgICAgICAgbm1lbWIsc2l6ZSxwdHIsZmlsZSk7CiAgIGlmKHJldCE9bm1lbWIpCi0gICAgZHByaW50Zl93YXJuKGNydGRsbCwgIiBGYWlsZWQhXG4iKTsKKyAgICBXQVJOKGNydGRsbCwgIiBGYWlsZWQhXG4iKTsKIAogICByZXR1cm4gcmV0OwogfQpAQCAtMzQ4LDkgKzMzOCw3IEBACiAgKi8KIElOVDMyIF9fY2RlY2wgQ1JURExMX3NldGJ1ZihMUFZPSUQgZmlsZSwgTFBTVFIgYnVmKQogewotICBkcHJpbnRmX2luZm8oY3J0ZGxsLAotCQkgIkNSVERMTF9zZXRidWYoZmlsZSAlcCBidWYgJXApXG4iLAotCQkgZmlsZSxidWYpOworICBUUkFDRShjcnRkbGwsICIoZmlsZSAlcCBidWYgJXApXG4iLCBmaWxlLCBidWYpOwogICAvKiB0aGlzIGRvZXNuJ3Qgd29yazoidm9pZCB2YWx1ZSBub3QgaWdub3JlZCBhcyBpdCBvdWdodCB0byBiZSIgCiAgIHJldHVybiBzZXRidWYoZmlsZSxidWYpOyAKICAgKi8KQEAgLTM4MSw5ICszNjksOCBAQAogCWRlZmF1bHQ6CiAJICByZXR1cm4gKC0xKTsKIAl9Ci0JZHByaW50Zl9pbmZvKGNydGRsbCwKLQkJICAgICAgICJDUlRETExfb3Blbl9vc2ZoYW5kbGUoaGFuZGxlICUwOGx4LGZsYWdzICVkKSByZXR1cm4gJWRcbiIsCi0JCSAgICAgICBvc2ZoYW5kbGUsZmxhZ3MsaGFuZGxlKTsKKwlUUkFDRShjcnRkbGwsICIoaGFuZGxlICUwOGx4LGZsYWdzICVkKSByZXR1cm4gJWRcbiIsCisJCSAgICAgb3NmaGFuZGxlLGZsYWdzLGhhbmRsZSk7CiAJcmV0dXJuIGhhbmRsZTsKIAkKIH0KQEAgLTQ1NSw3ICs0NDIsNyBAQAogICovCiBCT09MMzIgX19jZGVjbCBDUlRETExfX2lzYXR0eShEV09SRCB4KQogewotCWRwcmludGZfaW5mbyhjcnRkbGwsIkNSVERMTF9faXNhdHR5KCVsZClcbiIseCk7CisJVFJBQ0UoY3J0ZGxsLCIoJWxkKVxuIix4KTsKIAlyZXR1cm4gVFJVRTsKIH0KIApAQCAtNDcyLDcgKzQ1OSw3IEBACiAJICBsZW4gPSAoVUlOVDMyKXdyaXRlKGZkLGJ1ZiwoTE9ORyljb3VudCk7CiAJZWxzZQogCSAgbGVuID0gX2x3cml0ZTMyKGZkLGJ1Zixjb3VudCk7Ci0JZHByaW50Zl9pbmZvKGNydGRsbCwiQ1JURExMX3dyaXRlICVkLyVkIGJ5dGUgdG8gZGZoICVkIGZyb20gJXAsXG4iLAorCVRSQUNFKGNydGRsbCwiJWQvJWQgYnl0ZSB0byBkZmggJWQgZnJvbSAlcCxcbiIsCiAJCSAgICAgICBsZW4sY291bnQsZmQsYnVmKTsKIAlyZXR1cm4gbGVuOwogfQpAQCAtNDkyLDcgKzQ3OSw3IEBACiAgKi8KIHZvaWQgX19jZGVjbCBDUlRETExfX2NleGl0KElOVDMyIHJldCkKIHsKLSAgICAgICAgZHByaW50Zl9pbmZvKGNydGRsbCwiQ1JURExMX19jZXhpdCglZClcbiIscmV0KTsKKyAgICAgICAgVFJBQ0UoY3J0ZGxsLCIoJWQpXG4iLHJldCk7CiAJRXhpdFByb2Nlc3MocmV0KTsKIH0KIApAQCAtNTAyLDcgKzQ4OSw3IEBACiAgKi8KIHZvaWQgX19jZGVjbCBDUlRETExfZXhpdChEV09SRCByZXQpCiB7Ci0gICAgICAgIGRwcmludGZfaW5mbyhjcnRkbGwsIkNSVERMTF9leGl0KCVsZClcbiIscmV0KTsKKyAgICAgICAgVFJBQ0UoY3J0ZGxsLCIoJWxkKVxuIixyZXQpOwogCUV4aXRQcm9jZXNzKHJldCk7CiB9CiAKQEAgLTUxMiw3ICs0OTksNyBAQAogICovCiBJTlQzMiBfX2NkZWNsIENSVERMTF9fYWJub3JtYWxfdGVybWluYXRpb24odm9pZCkKIHsKLSAgICAgICAgZHByaW50Zl9pbmZvKGNydGRsbCwiQ1JURExMX19hYm5vcm1hbF90ZXJtaW5hdGlvblxuIik7CisgICAgICAgIFRSQUNFKGNydGRsbCwiKHZvaWQpXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTI1LDkgKzUxMiw5IEBACiAgICAgaW50IHJldDsKIAogICAgIHJldCA9IGZmbHVzaChzdHJlYW0pOwotICAgIGRwcmludGZfaW5mbyhjcnRkbGwsIkNSVERMTF9mZmx1c2ggJXAgcmV0dXJuZCAlZFxuIixzdHJlYW0scmV0KTsKKyAgICBUUkFDRShjcnRkbGwsIiVwIHJldHVybmQgJWRcbiIsc3RyZWFtLHJldCk7CiAgICAgaWYocmV0KQotICAgICAgZHByaW50Zl93YXJuKGNydGRsbCwgIiBGYWlsZWQhXG4iKTsKKyAgICAgIFdBUk4oY3J0ZGxsLCAiIEZhaWxlZCFcbiIpOwogCiAgICAgcmV0dXJuIHJldDsKIH0KQEAgLTU0Myw3ICs1MzAsNyBAQAogICAgKiB3aW5kb3dzOTUncyBmdHAuZXhlLgogICAgKi8KICAgIHJldCA9IGdldHMoYnVmKTsKLSAgIGRwcmludGZfaW5mbyhjcnRkbGwsIkNSVERMTF9nZXRzIGdvdCAlc1xuIixyZXQpOworICAgVFJBQ0UoY3J0ZGxsLCJnb3QgJXNcbiIscmV0KTsKICAgIHJldHVybiByZXQ7CiB9CiAKQEAgLTU3MSw4ICs1NTgsNyBAQAogICovCiBJTlQzMiBfX2NkZWNsIENSVERMTF9mcHV0YyggSU5UMzIgYywgRklMRSAqc3RyZWFtICkKIHsKLSAgZHByaW50Zl9pbmZvKGNydGRsbCwKLQkJICJDUlRETExfZnB1dGMgJWMgdG8gZmlsZSAlcFxuIixjLHN0cmVhbSk7CisgICAgVFJBQ0UoY3J0ZGxsLCAiJWMgdG8gZmlsZSAlcFxuIixjLHN0cmVhbSk7CiAgICAgcmV0dXJuIGZwdXRjKGMsc3RyZWFtKTsKIH0KIApAQCAtNTgyLDggKzU2OCw3IEBACiAgKi8KIElOVDMyIF9fY2RlY2wgQ1JURExMX2ZwdXRzKCBMUENTVFIgcywgRklMRSAqc3RyZWFtICkKIHsKLSAgZHByaW50Zl9pbmZvKGNydGRsbCwKLQkJICJDUlRETExfZnB1dHMgJXMgdG8gZmlsZSAlcFxuIixzLHN0cmVhbSk7CisgICAgVFJBQ0UoY3J0ZGxsLCAiJXMgdG8gZmlsZSAlcFxuIixzLHN0cmVhbSk7CiAgICAgcmV0dXJuIGZwdXRzKHMsc3RyZWFtKTsKIH0KIApAQCAtNTkzLDggKzU3OCw3IEBACiAgKi8KIElOVDMyIF9fY2RlY2wgQ1JURExMX3B1dHMoTFBDU1RSIHMpCiB7Ci0gIGRwcmludGZfaW5mbyhjcnRkbGwsCi0JCSAiQ1JURExMX2ZwdXRzICVzIFxuIixzKTsKKyAgICBUUkFDRShjcnRkbGwsICIlcyBcbiIscyk7CiAgICAgcmV0dXJuIHB1dHMocyk7CiB9CiAKQEAgLTYwNCw4ICs1ODgsNyBAQAogICovCiBJTlQzMiBfX2NkZWNsIENSVERMTF9wdXRjKElOVDMyIGMsIEZJTEUgKnN0cmVhbSkKIHsKLSAgZHByaW50Zl9pbmZvKGNydGRsbCwKLQkJICJDUlRETExfcHV0YyAlYyB0byBmaWxlICVwXG4iLGMsc3RyZWFtKTsKKyAgICBUUkFDRShjcnRkbGwsICIgJWMgdG8gZmlsZSAlcFxuIixjLHN0cmVhbSk7CiAgICAgcmV0dXJuIGZwdXRjKGMsc3RyZWFtKTsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTYxNCw4ICs1OTcsNyBAQAogSU5UMzIgX19jZGVjbCBDUlRETExfZmdldGMoIEZJTEUgKnN0cmVhbSApCiB7CiAgIGludCByZXQ9IGZnZXRjKHN0cmVhbSk7Ci0gIGRwcmludGZfaW5mbyhjcnRkbGwsCi0JCSAiQ1JURExMX2ZnZXRjIGdvdCAlZFxuIixyZXQpOworICBUUkFDRShjcnRkbGwsICJnb3QgJWRcbiIscmV0KTsKICAgcmV0dXJuIHJldDsKIH0KIApAQCAtNjI2LDggKzYwOCw3IEBACiBJTlQzMiBfX2NkZWNsIENSVERMTF9nZXRjKCBGSUxFICpzdHJlYW0gKQogewogICBpbnQgcmV0PSBmZ2V0YyhzdHJlYW0pOwotICBkcHJpbnRmX2luZm8oY3J0ZGxsLAotCQkgIkNSVERMTF9nZXRjIGdvdCAlZFxuIixyZXQpOworICBUUkFDRShjcnRkbGwsICJnb3QgJWRcbiIscmV0KTsKICAgcmV0dXJuIHJldDsKIH0KIApAQCAtNjM4LDggKzYxOSw3IEBACiB7CiAgICB1bnNpZ25lZCBpbnQgcmV0ID0gKHggPj4gc2hpZnQpfCggeCA+Pigoc2l6ZW9mKHgpKS1zaGlmdCkpOwogCi0gICBkcHJpbnRmX2luZm8oY3J0ZGxsLAotCQkgICJDUlRETExfcm90bCBnb3QgMHglMDh4IHJvdCAlZCByZXQgMHglMDh4XG4iLAorICAgVFJBQ0UoY3J0ZGxsLCAiZ290IDB4JTA4eCByb3QgJWQgcmV0IDB4JTA4eFxuIiwKIAkJICB4LHNoaWZ0LHJldCk7CiAgICByZXR1cm4gcmV0OwogICAgIApAQCAtNjUxLDggKzYzMSw3IEBACiB7CiAgICB1bnNpZ25lZCBsb25nIHJldCA9ICh4ID4+IHNoaWZ0KXwoIHggPj4oKHNpemVvZih4KSktc2hpZnQpKTsKIAotICAgZHByaW50Zl9pbmZvKGNydGRsbCwKLQkJICAiQ1JURExMX2xyb3RsIGdvdCAweCUwOGx4IHJvdCAlZCByZXQgMHglMDhseFxuIiwKKyAgIFRSQUNFKGNydGRsbCwgImdvdCAweCUwOGx4IHJvdCAlZCByZXQgMHglMDhseFxuIiwKIAkJICB4LHNoaWZ0LHJldCk7CiAgICByZXR1cm4gcmV0OwogICAgIApAQCAtNjc2LDExICs2NTUsMTAgQEAKICAgICAgICpjb250cm9sX009J1xuJzsKICAgICAgICooY29udHJvbF9NKzEpPTA7CiAgICAgfQotICBkcHJpbnRmX2luZm8oY3J0ZGxsLAotCQkgIkNSVERMTF9mZ2V0cyBnb3QgJXMgZm9yICVkIGNoYXJzIGZyb20gZmlsZSAlcFxuIiwKKyAgVFJBQ0UoY3J0ZGxsLCAiZ290ICVzIGZvciAlZCBjaGFycyBmcm9tIGZpbGUgJXBcbiIsCiAJCSBzLHNpemUsc3RyZWFtKTsKICAgaWYocmV0KQotICAgIGRwcmludGZfd2FybihjcnRkbGwsICIgRmFpbGVkIVxuIik7CisgICAgV0FSTihjcnRkbGwsICIgRmFpbGVkIVxuIik7CiAKICAgcmV0dXJuIHJldDsKIH0KQEAgLTczNiw3ICs3MTQsNyBAQAogICovCiB1bnNpZ25lZCBjaGFyKiBfX2NkZWNsIENSVERMTF9fbWJzY3B5KHVuc2lnbmVkIGNoYXIgKngsdW5zaWduZWQgY2hhciAqeSkKIHsKLSAgICBkcHJpbnRmX2luZm8oY3J0ZGxsLCJDUlRETExfbWJzY3B5ICVzIGFuZCAlc1xuIix4LHkpOworICAgIFRSQUNFKGNydGRsbCwiQ1JURExMX21ic2NweSAlcyBhbmQgJXNcbiIseCx5KTsKICAgICByZXR1cm4gc3RyY3B5KHgseSk7CiB9CiAKQEAgLTc3NywxMyArNzU1LDEzIEBACiB7CiAgIHVuc2lnbmVkIGNoYXIgKnkgPXg7CiAgIAotICBkcHJpbnRmX2luZm8oY3J0ZGxsLCAiQ1JURExMX3N0cmx3ciBnb3QgJXNcbiIsIHgpOworICBUUkFDRShjcnRkbGwsICJDUlRETExfc3RybHdyIGdvdCAlc1xuIiwgeCk7CiAgIHdoaWxlICgqeSkgewogICAgIGlmICgoKnkgPiAweDQwKSAmJiAoKnk8IDB4NWIpKQogICAgICAgKnkgPSAqeSArIDB4MjA7CiAgICAgeSsrOwogICB9Ci0gIGRwcmludGZfaW5mbyhjcnRkbGwsICIgICByZXR1cm5lZCAlc1xuIiwgeCk7CisgIFRSQUNFKGNydGRsbCwgIiAgIHJldHVybmVkICVzXG4iLCB4KTsKIAkJIAogICByZXR1cm4geDsKIH0KQEAgLTgxMCw3ICs3ODgsNyBAQAogICB9CiAgIC8qIElmIGJ1ZmZlciB0b28gc2hvcnQsIGV4aXQuICAqLwogICBpZiAoaSA+IFNZU0JVRl9MRU5HVEgpIHsKLSAgICBkcHJpbnRmX2luZm8oY3J0ZGxsLCJfc3lzdGVtIGJ1ZmZlciB0byBzbWFsbFxuIik7CisgICAgVFJBQ0UoY3J0ZGxsLCJfc3lzdGVtIGJ1ZmZlciB0byBzbWFsbFxuIik7CiAgICAgcmV0dXJuIDEyNzsKICAgfQogICAKQEAgLTgyNyw4ICs4MDUsNyBAQAogICB9CiAgICpicCsrID0gJyInOwogICAqYnAgPSAwOwotICBkcHJpbnRmX2luZm8oY3J0ZGxsLAotCQkgIl9zeXN0ZW0gZ290IFwiJXNcIiwgZXhlY3V0aW5nIFwiJXNcIlxuIix4LGJ1ZmZlcik7CisgIFRSQUNFKGNydGRsbCwgIl9zeXN0ZW0gZ290ICclcycsIGV4ZWN1dGluZyAnJXMnXG4iLHgsYnVmZmVyKTsKIAogICByZXR1cm4gc3lzdGVtKGJ1ZmZlcik7CiB9CkBAIC04ODEsNyArODU4LDcgQEAKICAqLwogVk9JRCBfX2NkZWNsIENSVERMTF9sb25nam1wKGptcF9idWYgZW52LCBpbnQgdmFsKQogewotICAgIGRwcmludGZfZml4bWUoY3J0ZGxsLCJDUlRETExfbG9uZ2ptcCBzZW1pc3R1cCwgZXhwZWN0IGNyYXNoXG4iKTsKKyAgICBGSVhNRShjcnRkbGwsIkNSVERMTF9sb25nam1wIHNlbWlzdHVwLCBleHBlY3QgY3Jhc2hcbiIpOwogICAgIHJldHVybiBsb25nam1wKGVudiwgdmFsKTsKIH0KIApAQCAtOTcwLDExICs5NDcsMTEgQEAKICAgICAgIGZjbG9zZShzdHJlYW0pOwogICAgICAgcmV0ID0gX2xjbG9zZTMyKCBkb3NfaGFuZGxlKTsKICAgICB9Ci0gICAgZHByaW50Zl9pbmZvKGNydGRsbCwiQ1JURExMX2ZjbG9zZSglcCkgdWZoICVkIGRmaCAlZFxuIiwKKyAgICBUUkFDRShjcnRkbGwsIiglcCkgdWZoICVkIGRmaCAlZFxuIiwKIAkJICAgc3RyZWFtLHVuaXhfaGFuZGxlLGRvc19oYW5kbGUpOwogCiAgICAgaWYocmV0KQotICAgICAgZHByaW50Zl93YXJuKGNydGRsbCwgIiBGYWlsZWQhXG4iKTsKKyAgICAgIFdBUk4oY3J0ZGxsLCAiIEZhaWxlZCFcbiIpOwogCiAgICAgcmV0dXJuIHJldDsKIH0KQEAgLTk4OCwxNSArOTY1LDE1IEBACiAgICAgRE9TX0ZVTExfTkFNRSBmdWxsX25hbWU7CiAKICAgICBpZiAoIURPU0ZTX0dldEZ1bGxOYW1lKCBwYXRobmFtZSwgRkFMU0UsICZmdWxsX25hbWUgKSkgewotICAgICAgZHByaW50Zl93YXJuKGNydGRsbCwgIkNSVERMTF91bmxpbmsgZmlsZSAlcyBiYWQgbmFtZVxuIixwYXRobmFtZSk7CisgICAgICBXQVJOKGNydGRsbCwgIkNSVERMTF91bmxpbmsgZmlsZSAlcyBiYWQgbmFtZVxuIixwYXRobmFtZSk7CiAgICAgICByZXR1cm4gRU9GOwogICAgIH0KICAgCiAgICAgcmV0PXVubGluayhmdWxsX25hbWUubG9uZ19uYW1lKTsKLSAgICBkcHJpbnRmX2luZm8oY3J0ZGxsLCJDUlRETExfdW5saW5rKCVzIHVuaXggJXMpXG4iLAorICAgIFRSQUNFKGNydGRsbCwiKCVzIHVuaXggJXMpXG4iLAogCQkgICBwYXRobmFtZSxmdWxsX25hbWUubG9uZ19uYW1lKTsKICAgICBpZihyZXQpCi0gICAgICBkcHJpbnRmX3dhcm4oY3J0ZGxsLCAiIEZhaWxlZCFcbiIpOworICAgICAgV0FSTihjcnRkbGwsICIgRmFpbGVkIVxuIik7CiAKICAgICByZXR1cm4gcmV0OwogfQpAQCAtMTAzOCwxMyArMTAxNSwxMyBAQAogCiAgICAgaWYgKCFET1NGU19HZXRGdWxsTmFtZSggZmlsZW5hbWUsIFRSVUUsICZmdWxsX25hbWUgKSkKICAgICB7Ci0gICAgICBkcHJpbnRmX3dhcm4oY3J0ZGxsLCAiQ1JURExMX19zdGF0IGZpbGVuYW1lICVzIGJhZCBuYW1lXG4iLGZpbGVuYW1lKTsKKyAgICAgIFdBUk4oY3J0ZGxsLCAiQ1JURExMX19zdGF0IGZpbGVuYW1lICVzIGJhZCBuYW1lXG4iLGZpbGVuYW1lKTsKICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgcmV0PXN0YXQoZnVsbF9uYW1lLmxvbmdfbmFtZSwmbXlzdGF0KTsKLSAgICBkcHJpbnRmX2luZm8oY3J0ZGxsLCJDUlRETExfX3N0YXQgJXNcbiIsIGZpbGVuYW1lKTsKKyAgICBUUkFDRShjcnRkbGwsIkNSVERMTF9fc3RhdCAlc1xuIiwgZmlsZW5hbWUpOwogICAgIGlmKHJldCkgCi0gICAgICBkcHJpbnRmX3dhcm4oY3J0ZGxsLCAiIEZhaWxlZCFcbiIpOworICAgICAgV0FSTihjcnRkbGwsICIgRmFpbGVkIVxuIik7CiAKICAgICAvKiBGSVhNRTogc2hvdWxkIGNoZWNrIHdoYXQgV2luZG93cyByZXR1cm5zICovCiAKQEAgLTEwODMsMTEgKzEwNjAsMTEgQEAKICAgICBpZiAoZmxhZ3MgJiAweDAyMDAgKSB3aW5lZmxhZ3MgfD0gT19UUlVOQzsKICAgICBpZiAoZmxhZ3MgJiAweDA0MDAgKSB3aW5lZmxhZ3MgfD0gT19FWENMOwogICAgIGlmIChmbGFncyAmIDB4ZjBmNCApIAotICAgICAgZHByaW50Zl9pbmZvKGNydGRsbCwiQ1JURExMX29wZW4gZmlsZSB1bnN1cHBvcnRlZCBmbGFncyAweCUwNHhcbiIsZmxhZ3MpOworICAgICAgVFJBQ0UoY3J0ZGxsLCJDUlRETExfb3BlbiBmaWxlIHVuc3VwcG9ydGVkIGZsYWdzIDB4JTA0eFxuIixmbGFncyk7CiAgICAgLyogRW5kIEZpeG1lICovCiAKICAgICByZXQgPSBGSUxFX09wZW4ocGF0aCx3aW5lZmxhZ3MpOwotICAgIGRwcmludGZfaW5mbyhjcnRkbGwsIkNSVERMTF9vcGVuIGZpbGUgJXMgbW9kZSAweCUwNHggKGxjY21vZGUgMHglMDR4KSBnb3QgZGZoICVkXG4iLAorICAgIFRSQUNFKGNydGRsbCwiQ1JURExMX29wZW4gZmlsZSAlcyBtb2RlIDB4JTA0eCAobGNjbW9kZSAweCUwNHgpIGdvdCBkZmggJWRcbiIsCiAJCSAgIHBhdGgsd2luZWZsYWdzLGZsYWdzLHJldCk7CiAgICAgcmV0dXJuIHJldDsKIH0KQEAgLTEwOTksOSArMTA3Niw5IEBACiB7CiAgICAgaW50IHJldD1fbGNsb3NlMzIoZmQpOwogCi0gICAgZHByaW50Zl9pbmZvKGNydGRsbCwiQ1JURExMX2Nsb3NlKCVkKVxuIixmZCk7CisgICAgVFJBQ0UoY3J0ZGxsLCIoJWQpXG4iLGZkKTsKICAgICBpZihyZXQpCi0gICAgICBkcHJpbnRmX3dhcm4oY3J0ZGxsLCAiIEZhaWxlZCFcbiIpOworICAgICAgV0FSTihjcnRkbGwsICIgRmFpbGVkIVxuIik7CiAKICAgICByZXR1cm4gcmV0OwogfQpAQCAtMTExNCw3ICsxMDkxLDcgQEAKICAgICBpbnQgcmV0OwogICAgIAogICAgIHJldD1mZW9mKHN0cmVhbSk7Ci0gICAgZHByaW50Zl9pbmZvKGNydGRsbCwiQ1JURExMX2Zlb2YoJXApICVzXG4iLHN0cmVhbSwocmV0KT8idHJ1ZSI6ImZhbHNlIik7CisgICAgVFJBQ0UoY3J0ZGxsLCIoJXApICVzXG4iLHN0cmVhbSwocmV0KT8idHJ1ZSI6ImZhbHNlIik7CiAgICAgcmV0dXJuIHJldDsKIH0KIApAQCAtMTM2MCw5ICsxMzM3LDkgQEAKICNkZWZpbmUgT19URVhUICAgICAweDQwMDAKICNkZWZpbmUgT19CSU5BUlkgICAweDgwMDAKIAotCWRwcmludGZfZml4bWUoY3J0ZGxsLCAiQ1JURExMLl9zZXRtb2RlIG9uIGZoYW5kbGUgJWQgbW9kZSAlcywgU1RVQi5cbiIsCisJRklYTUUoY3J0ZGxsLCAib24gZmhhbmRsZSAlZCBtb2RlICVzLCBTVFVCLlxuIiwKIAkJICAgICAgZmgsKG1vZGU9T19URVhUKT8iT19URVhUIjoKLQkJICAgICAgICAgICAgICAgICAgICAgICAgKG1vZGU9T19CSU5BUlkpPyJPX0JJTkFSWSI6IlVOS05PV04iKTsKKwkJICAgICAgKG1vZGU9T19CSU5BUlkpPyJPX0JJTkFSWSI6IlVOS05PV04iKTsKIAlyZXR1cm4gLTE7CiB9CiAKQEAgLTEzOTIsNyArMTM2OSw3IEBACiAgICAgZWxzZSBpZiAoISgqbWIpKQogICAgICAgcmV0ID0wOwogICAgICAgCi0gICAgZHByaW50Zl9pbmZvKGNydGRsbCwiQ1JURExMX21sZW4gJXMgZm9yIG1heCAlZCBieXRlcyByZXQgJWRcbiIsbWIsc2l6ZSxyZXQpOworICAgIFRSQUNFKGNydGRsbCwiQ1JURExMX21sZW4gJXMgZm9yIG1heCAlZCBieXRlcyByZXQgJWRcbiIsbWIsc2l6ZSxyZXQpOwogCiAgICAgcmV0dXJuIHJldDsKIH0KQEAgLTE0MTksNyArMTM5Niw3IEBACiAgICAgcCsrOwogICAgIHJldCA9IChwIC13Y3MpOwogICAgICAgICAgIAotICAgIGRwcmludGZfaW5mbyhjcnRkbGwsIkNSVERMTF9tYnN0b3djcyAlcyBmb3IgJWQgY2hhcnMgcHV0ICVkIHdjaGFyc1xuIiwKKyAgICBUUkFDRShjcnRkbGwsIkNSVERMTF9tYnN0b3djcyAlcyBmb3IgJWQgY2hhcnMgcHV0ICVkIHdjaGFyc1xuIiwKIAkJICAgbWJzLHNpemUscmV0KTsKICAgICByZXR1cm4gcmV0OwogfQpAQCAtMTQ0Nyw3ICsxNDI0LDcgQEAKICAgICAgZWxzZQogICAgICAgIHJldCA9IC0xOwogICAgCi0gICBkcHJpbnRmX2luZm8oY3J0ZGxsLCJDUlRETExfbWJ0b3djICVzIGZvciAlZCBjaGFyc1xuIixtYixzaXplKTsKKyAgIFRSQUNFKGNydGRsbCwiQ1JURExMX21idG93YyAlcyBmb3IgJWQgY2hhcnNcbiIsbWIsc2l6ZSk7CiAgICAgICAgICAKICAgIHJldHVybiByZXQ7CiB9CkBAIC0xNTA4LDcgKzE0ODUsNyBAQAogICB9CiAgIGlmICghRE9TRlNfR2V0RnVsbE5hbWUoIG5hbWUsIEZBTFNFLCAmZnVsbF9uYW1lICkpIHJldHVybiBOVUxMOwogICBsc3RyY3B5bjMyQShidWYsZnVsbF9uYW1lLnNob3J0X25hbWUsc2l6ZSk7Ci0gIGRwcmludGZfaW5mbyhjcnRkbGwsIkNSVERMTF9mdWxscGF0aCBnb3QgJXNcbiIsYnVmKTsKKyAgVFJBQ0UoY3J0ZGxsLCJDUlRETExfZnVsbHBhdGggZ290ICVzXG4iLGJ1Zik7CiAgIHJldHVybiBidWY7CiB9CiAKQEAgLTE1MjQsNyArMTUwMSw3IEBACiAgICAgICovCiAgIGNoYXIgKiBkcml2ZWNoYXIsKmRpcmNoYXIsKm5hbWVjaGFyOwogCi0gIGRwcmludGZfaW5mbyhjcnRkbGwsIkNSVERMTF9fc3BsaXRwYXRoIGdvdCAlc1xuIixwYXRoKTsKKyAgVFJBQ0UoY3J0ZGxsLCJDUlRETExfX3NwbGl0cGF0aCBnb3QgJXNcbiIscGF0aCk7CiAKICAgZHJpdmVjaGFyICA9IHN0cmNocihwYXRoLCc6Jyk7CiAgIGRpcmNoYXIgICAgPSBzdHJyY2hyKHBhdGgsJy8nKTsKQEAgLTE1NjgsNyArMTU0NSw3IEBACiAJfQogICAgIH0KIAotICBkcHJpbnRmX2luZm8oY3J0ZGxsLCJDUlRETExfX3NwbGl0cGF0aCBmb3VuZCAlcyAlcyAlcyAlc1xuIixkcml2ZSxkaXJlY3RvcnksZmlsZW5hbWUsZXh0ZW5zaW9uKTsKKyAgVFJBQ0UoY3J0ZGxsLCJDUlRETExfX3NwbGl0cGF0aCBmb3VuZCAlcyAlcyAlcyAlc1xuIixkcml2ZSxkaXJlY3RvcnksZmlsZW5hbWUsZXh0ZW5zaW9uKTsKICAgCiB9CiAKQEAgLTE1OTgsNyArMTU3NSw3IEBACiAgIGlmIChsZW4gPiBzaXplKQogICAgIHsKICAgICAgIC8qIHNldCBlcnJvciB0byBFUkFOR0UgKi8KLSAgICAgIGRwcmludGZfaW5mbyhjcnRkbGwsIkNSVERMTF9nZXRjd2QgYnVmZmVyIHRvIHNtYWxsXG4iKTsKKyAgICAgIFRSQUNFKGNydGRsbCwiQ1JURExMX2dldGN3ZCBidWZmZXIgdG8gc21hbGxcbiIpOwogICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICByZXR1cm4gYnVmOwpAQCAtMTY0MCwyOCArMTYxNywyNSBAQAogICAgICBET1NfRlVMTF9OQU1FIHRlbXBuYW1lOwogICAgICAKICAgICAgaWYgKChyZXQgPSB0ZW1wbmFtKGRpcixwcmVmaXgpKT09TlVMTCkgewotICAgICAgIGRwcmludGZfd2FybihjcnRkbGwsICJVbmFibGUgdG8gZ2V0IHVuaXF1ZSBmaWxlbmFtZVxuIik7CisgICAgICAgV0FSTihjcnRkbGwsICJVbmFibGUgdG8gZ2V0IHVuaXF1ZSBmaWxlbmFtZVxuIik7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgIH0KICAgICAgaWYgKCFET1NGU19HZXRGdWxsTmFtZShyZXQsRkFMU0UsJnRlbXBuYW1lKSkKICAgICAgewotICAgICAgIGRwcmludGZfaW5mbyhjcnRkbGwsCi0JCSAgICAgICJDUlRETExfdGVtcG5hbSBXcm9uZyBwYXRoP1xuIik7CisgICAgICAgVFJBQ0UoY3J0ZGxsLCAiV3JvbmcgcGF0aD9cbiIpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgICB9CiAgICAgIGZyZWUocmV0KTsKICAgICAgaWYgKChyZXQgPSBDUlRETExfbWFsbG9jKHN0cmxlbih0ZW1wbmFtZS5zaG9ydF9uYW1lKSsxKSkgPT0gTlVMTCkgewotCSBkcHJpbnRmX3dhcm4oY3J0ZGxsLAotCQkJIkNSVERMTF90ZW1wbmFtIENSVERMX21hbGxvYyBmb3Igc2hvcnRuYW1lIGZhaWxlZFxuIik7CisJIFdBUk4oY3J0ZGxsLCAiQ1JURExfbWFsbG9jIGZvciBzaG9ydG5hbWUgZmFpbGVkXG4iKTsKIAkgcmV0dXJuIE5VTEw7CiAgICAgIH0KICAgICAgaWYgKChyZXQgPSBzdHJjcHkocmV0LHRlbXBuYW1lLnNob3J0X25hbWUpKSA9PSBOVUxMKSB7IAotICAgICAgIGRwcmludGZfd2FybihjcnRkbGwsCi0JCSAgICAgICJDUlRETExfdGVtcG5hbSBNYWxsb2MgZm9yIHNob3J0bmFtZSBmYWlsZWRcbiIpOworICAgICAgIFdBUk4oY3J0ZGxsLCAiTWFsbG9jIGZvciBzaG9ydG5hbWUgZmFpbGVkXG4iKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgfQogICAgICAKLSAgICAgZHByaW50Zl9pbmZvKGNydGRsbCwiQ1JURExMX3RlbXBuYW0gZGlyICVzIHByZWZpeCAlcyBnb3QgJXNcbiIsCisgICAgIFRSQUNFKGNydGRsbCwiZGlyICVzIHByZWZpeCAlcyBnb3QgJXNcbiIsCiAJCSAgICBkaXIscHJlZml4LHJldCk7CiAgICAgIHJldHVybiByZXQ7CiAKQEAgLTE2NzcsMTkgKzE2NTEsMTggQEAKICAgICAgY2hhciAqcmV0OwogCiAgICAgIGlmICgocmV0ID10bXBuYW0ocykpPT0gTlVMTCkgewotICAgICAgIGRwcmludGZfd2FybihjcnRkbGwsICJVbmFibGUgdG8gZ2V0IHVuaXF1ZSBmaWxlbmFtZVxuIik7CisgICAgICAgV0FSTihjcnRkbGwsICJVbmFibGUgdG8gZ2V0IHVuaXF1ZSBmaWxlbmFtZVxuIik7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgIH0KICAgICAgaWYgKCFET1NGU19HZXRGdWxsTmFtZShyZXQsRkFMU0UsJkNSVERMTF90bXBuYW1lKSkKICAgICAgewotICAgICAgIGRwcmludGZfaW5mbyhjcnRkbGwsCi0JCSAgICAgICJDUlRETExfdG1wbmFtIFdyb25nIHBhdGg/XG4iKTsKKyAgICAgICBUUkFDRShjcnRkbGwsICJXcm9uZyBwYXRoP1xuIik7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgIH0KICAgICAgc3RyY2F0KENSVERMTF90bXBuYW1lLnNob3J0X25hbWUsIi4iKTsKLSAgICAgZHByaW50Zl9pbmZvKGNydGRsbCwiQ1JURExMX3RtcG5hbSBmb3IgYnVmICVwIGdvdCAlc1xuIiwKKyAgICAgVFJBQ0UoY3J0ZGxsLCJmb3IgYnVmICVwIGdvdCAlc1xuIiwKIAkJICAgIHMsQ1JURExMX3RtcG5hbWUuc2hvcnRfbmFtZSk7Ci0gICAgIGRwcmludGZfaW5mbyhjcnRkbGwsIkNSVERMTF90bXBuYW0gbG9uZyBnb3QgJXNcbiIsCisgICAgIFRSQUNFKGNydGRsbCwibG9uZyBnb3QgJXNcbiIsCiAJCSAgICBDUlRETExfdG1wbmFtZS5sb25nX25hbWUpOwogICAgICBpZiAoIHMgIT0gTlVMTCkgCiAgICAgICAgcmV0dXJuIHN0cmNweShzLENSVERMTF90bXBuYW1lLnNob3J0X25hbWUpOwpAQCAtMTcxNCw3ICsxNjg3LDcgQEAKICAqLwogVk9JRCBfX2NkZWNsIENSVERMTF9zaWduYWwoaW50IHNpZywgc2lnX2hhbmRsZXJfdHlwZSBwdHIpCiB7Ci0gICAgZHByaW50Zl9maXhtZShjcnRkbGwsICJDUlRETExfc2lnbmFsICVkICVwOiBTVFVCIVxuIiwgc2lnLCBwdHIpOworICAgIEZJWE1FKGNydGRsbCwgIiglZCAlcCk6IFNUVUIhXG4iLCBzaWcsIHB0cik7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE3MjgsNiArMTcwMSw2IEBACiAgKi8KIFZPSUQgX19jZGVjbCBDUlRETExfX3NsZWVwKHVuc2lnbmVkIGxvbmcgdGltZW91dCkgCiB7Ci0gIGRwcmludGZfaW5mbyhjcnRkbGwsIkNSVERMTF9fc2xlZXAgZm9yICVsZCBtaWxsaXNlY29uZHNcbiIsdGltZW91dCk7CisgIFRSQUNFKGNydGRsbCwiQ1JURExMX19zbGVlcCBmb3IgJWxkIG1pbGxpc2Vjb25kc1xuIix0aW1lb3V0KTsKICAgU2xlZXAoKHRpbWVvdXQpP3RpbWVvdXQ6MSk7CiB9CmRpZmYgLS1naXQgYS9taXNjL2RkZW1sLmMgYi9taXNjL2RkZW1sLmMKaW5kZXggNDM2N2M1My4uZmI5NDI4NiAxMDA2NDQKLS0tIGEvbWlzYy9kZGVtbC5jCisrKyBiL21pc2MvZGRlbWwuYwpAQCAtMTgsNyArMTgsNyBAQAogVUlOVDE2IFdJTkFQSSBEZGVJbml0aWFsaXplMTYoIExQRFdPUkQgcGlkSW5zdCwgUEZOQ0FMTEJBQ0sxNiBwZm5DYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBhZkNtZCwgRFdPUkQgdWxSZXMpCiB7Ci0gICAgZnByaW50Ziggc3RkbmltcCwgIkRkZUluaXRpYWxpemUxNjogZW1wdHkgc3R1YlxuIiApOworICAgIEZJWE1FKCBkZGVtbCwgImVtcHR5IHN0dWJcbiIgKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMjksNyArMjksNyBAQAogVUlOVDMyIFdJTkFQSSBEZGVJbml0aWFsaXplMzJBKCBMUERXT1JEIHBpZEluc3QsIFBGTkNBTExCQUNLMzIgcGZuQ2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGFmQ21kLCBEV09SRCB1bFJlcyApCiB7Ci0gICAgZnByaW50Ziggc3RkbmltcCwgIkRkZUluaXRpYWxpemUzMkE6IGVtcHR5IHN0dWJcbiIgKTsKKyAgICBGSVhNRSggZGRlbWwsICJlbXB0eSBzdHViXG4iICk7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTQwLDcgKzQwLDcgQEAKIFVJTlQzMiBXSU5BUEkgRGRlSW5pdGlhbGl6ZTMyVyggTFBEV09SRCBwaWRJbnN0LCBQRk5DQUxMQkFDSzMyIHBmbkNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBhZkNtZCwgRFdPUkQgdWxSZXMgKQogewotICAgIGZwcmludGYoIHN0ZG5pbXAsICJEZGVJbml0aWFsaXplMzJXOiBlbXB0eSBzdHViXG4iICk7CisgICAgRklYTUUoIGRkZW1sLCAiZW1wdHkgc3R1YlxuIiApOwogICAgIHJldHVybiAwOwogfQogCkBAIC01OSw3ICs1OSw3IEBACiAgKi8KIEJPT0wzMiBXSU5BUEkgRGRlVW5pbml0aWFsaXplMzIoIERXT1JEIGlkSW5zdCApCiB7Ci0gICAgZnByaW50Ziggc3RkbmltcCwgIkRkZVVuaW5pdGlhbGl6ZTogZW1wdHkgc3R1YlxuIiApOworICAgIEZJWE1FKCBkZGVtbCwgImVtcHR5IHN0dWJcbiIgKTsKICAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtNjksNyArNjksNyBAQAogSENPTlZMSVNUIFdJTkFQSSBEZGVDb25uZWN0TGlzdCggRFdPUkQgaWRJbnN0LCBIU1ogaHN6U2VydmljZSwgSFNaIGhzelRvcGljLAogICAgICAgICBIQ09OVkxJU1QgaENvbnZMaXN0LCBMUENPTlZDT05URVhUMTYgcENDICkKIHsKLSAgICBmcHJpbnRmKCBzdGRuaW1wLCAiRGRlQ29ubmVjdExpc3Q6IGVtcHR5IHN0dWJcbiIgKTsKKyAgICBGSVhNRSggZGRlbWwsICJlbXB0eSBzdHViXG4iICk7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTc4LDcgKzc4LDcgQEAKICAqLwogSENPTlYgV0lOQVBJIERkZVF1ZXJ5TmV4dFNlcnZlciggSENPTlZMSVNUIGhDb252TGlzdCwgSENPTlYgaENvbnZQcmV2ICkKIHsKLSAgICBmcHJpbnRmKCBzdGRuaW1wLCAiRGRlUXVlcnlOZXh0U2VydmVyOiBlbXB0eSBzdHViXG4iICk7CisgICAgRklYTUUoIGRkZW1sLCAiZW1wdHkgc3R1YlxuIiApOwogICAgIHJldHVybiAwOwogfQogCkBAIC04Nyw3ICs4Nyw3IEBACiAgKi8KIEJPT0wxNiBXSU5BUEkgRGRlRGlzY29ubmVjdExpc3QoIEhDT05WTElTVCBoQ29udkxpc3QgKQogewotICAgIGZwcmludGYoIHN0ZG5pbXAsICJEZGVEaXNjb25uZWN0TGlzdDogZW1wdHkgc3R1YlxuIiApOworICAgIEZJWE1FKCBkZGVtbCwgImVtcHR5IHN0dWJcbiIgKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtOTcsNyArOTcsNyBAQAogSENPTlYgV0lOQVBJIERkZUNvbm5lY3QxNiggRFdPUkQgaWRJbnN0LCBIU1ogaHN6U2VydmljZSwgSFNaIGhzelRvcGljLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDT05WQ09OVEVYVDE2IHBDQyApCiB7Ci0gICAgZnByaW50Ziggc3RkbmltcCwgIkRkZUNvbm5lY3QxNjogZW1wdHkgc3R1YlxuIiApOworICAgIEZJWE1FKCBkZGVtbCwgImVtcHR5IHN0dWJcbiIgKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMTA4LDcgKzEwOCw3IEBACiBIQ09OViBXSU5BUEkgRGRlQ29ubmVjdDMyKCBEV09SRCBpZEluc3QsIEhTWiBoc3pTZXJ2aWNlLCBIU1ogaHN6VG9waWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENPTlZDT05URVhUMzIgcENDICkKIHsKLSAgICBmcHJpbnRmKCBzdGRuaW1wLCAiRGRlQ29ubmVjdDMyOiBlbXB0eSBzdHViXG4iICk7CisgICAgRklYTUUoIGRkZW1sLCAiZW1wdHkgc3R1YlxuIiApOwogICAgIHJldHVybiAwOwogfQogCkBAIC0xMjYsNyArMTI2LDcgQEAKICAqLwogQk9PTDE2IFdJTkFQSSBEZGVTZXRVc2VySGFuZGxlKCBIQ09OViBoQ29udiwgRFdPUkQgaWQsIERXT1JEIGhVc2VyICkKIHsKLSAgICBmcHJpbnRmKCBzdGRuaW1wLCAiRGRlU2V0VXNlckhhbmRsZTogZW1wdHkgc3R1YlxuIiApOworICAgIEZJWE1FKCBkZGVtbCwgImVtcHR5IHN0dWJcbiIgKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMTM1LDcgKzEzNSw3IEBACiAgKi8KIEhEREVEQVRBIFdJTkFQSSBEZGVDcmVhdGVEYXRhSGFuZGxlKCBEV09SRCBpZEluc3QsIExQQllURSBwU3JjLCBEV09SRCBjYiwgRFdPUkQgY2JPZmYsIEhTWiBoc3pJdGVtLCBVSU5UMTYgd0ZtdCwgVUlOVDE2IGFmQ21kICkKIHsKLSAgICBmcHJpbnRmKCBzdGRuaW1wLCAiRGRlQ3JlYXRlRGF0YUhhbmRsZTogZW1wdHkgc3R1YlxuIiApOworICAgIEZJWE1FKCBkZGVtbCwgImVtcHR5IHN0dWJcbiIgKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMTQ0LDcgKzE0NCw3IEBACiAgKi8KIEJPT0wzMiBXSU5BUEkgRGRlRGlzY29ubmVjdDMyKCBIQ09OViBoQ29udiApCiB7Ci0gICAgZnByaW50Ziggc3RkbmltcCwgIkRkZURpc2Nvbm5lY3Q6IGVtcHR5IHN0dWJcbiIgKTsKKyAgICBGSVhNRSggZGRlbWwsICJlbXB0eSBzdHViXG4iICk7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTE1NCw3ICsxNTQsNyBAQAogICovCiBIQ09OViBXSU5BUEkgRGRlUmVjb25uZWN0KCBIQ09OViBoQ29udiApCiB7Ci0gICAgZnByaW50Ziggc3RkbmltcCwgIkRkZVJlY29ubmVjdDogZW1wdHkgc3R1YlxuIiApOworICAgIEZJWE1FKCBkZGVtbCwgImVtcHR5IHN0dWJcbiIgKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMTczLDcgKzE3Myw3IEBACiAgKi8KIEhTWiBXSU5BUEkgRGRlQ3JlYXRlU3RyaW5nSGFuZGxlMzJBKCBEV09SRCBpZEluc3QsIExQQ1NUUiBwc3osIElOVDMyIGNvZGVwYWdlICkKIHsKLSAgICBmcHJpbnRmKCBzdGRuaW1wLCAiRGRlQ3JlYXRlU3RyaW5nSGFuZGxlMzJBOiBlbXB0eSBzdHViXG4iICk7CisgICAgRklYTUUoIGRkZW1sLCAiZW1wdHkgc3R1YlxuIiApOwogICAgIHJldHVybiAwOwogfQogCkBAIC0xODMsNyArMTgzLDcgQEAKICAqLwogSFNaIFdJTkFQSSBEZGVDcmVhdGVTdHJpbmdIYW5kbGUzMlcoIERXT1JEIGlkSW5zdCwgTFBDV1NUUiBwc3osIElOVDMyIGNvZGVwYWdlKQogewotICAgIGZwcmludGYoIHN0ZG5pbXAsICJEZGVDcmVhdGVTdHJpbmdIYW5kbGUzMlc6IGVtcHR5IHN0dWJcbiIgKTsKKyAgICBGSVhNRSggZGRlbWwsICJlbXB0eSBzdHViXG4iICk7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTIwMiw3ICsyMDIsNyBAQAogICovCiBCT09MMzIgV0lOQVBJIERkZUZyZWVTdHJpbmdIYW5kbGUzMiggRFdPUkQgaWRJbnN0LCBIU1ogaHN6ICkKIHsKLSAgICBmcHJpbnRmKCBzdGRuaW1wLCAiRGRlRnJlZVN0cmluZ0hhbmRsZTogZW1wdHkgc3R1YlxuIiApOworICAgIEZJWE1FKCBkZGVtbCwgImVtcHR5IHN0dWJcbiIgKTsKICAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtMjIxLDcgKzIyMSw3IEBACiAgKi8KIEJPT0wzMiBXSU5BUEkgRGRlRnJlZURhdGFIYW5kbGUzMiggSERERURBVEEgaERhdGEgKQogewotICAgIGZwcmludGYoIHN0ZG5pbXAsICJEZGVGcmVlRGF0YUhhbmRsZTogZW1wdHkgc3R1YlxuIiApOworICAgIEZJWE1FKCBkZGVtbCwgImVtcHR5IHN0dWJcbiIgKTsKICAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtMjQwLDcgKzI0MCw3IEBACiAgKi8KIEJPT0wzMiBXSU5BUEkgRGRlS2VlcFN0cmluZ0hhbmRsZTMyKCBEV09SRCBpZEluc3QsIEhTWiBoc3ogKQogewotICAgIGZwcmludGYoIHN0ZG5pbXAsICJEZGVLZWVwU3RyaW5nSGFuZGxlOiBlbXB0eSBzdHViXG4iICk7CisgICAgRklYTUUoIGRkZW1sLCAiZW1wdHkgc3R1YlxuIiApOwogICAgIHJldHVybiBUUlVFOwogfQogCkBAIC0yNjYsNyArMjY2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMzIgd1R5cGUsIERXT1JEIGR3VGltZW91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERXT1JEIHBkd1Jlc3VsdCApCiB7Ci0gICAgZnByaW50Ziggc3RkbmltcCwgIkRkZUNsaWVudFRyYW5zYWN0aW9uOiBlbXB0eSBzdHViXG4iICk7CisgICAgRklYTUUoIGRkZW1sLCAiZW1wdHkgc3R1YlxuIiApOwogICAgIHJldHVybiAwOwogfQogCkBAIC0yNzYsNyArMjc2LDcgQEAKIEJPT0wxNiBXSU5BUEkgRGRlQWJhbmRvblRyYW5zYWN0aW9uKCBEV09SRCBpZEluc3QsIEhDT05WIGhDb252LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBpZFRyYW5zYWN0aW9uICkKIHsKLSAgICBmcHJpbnRmKCBzdGRuaW1wLCAiRGRlQWJhbmRvblRyYW5zYWN0aW9uOiBlbXB0eSBzdHViXG4iICk7CisgICAgRklYTUUoIGRkZW1sLCAiZW1wdHkgc3R1YlxuIiApOwogICAgIHJldHVybiAwOwogfQogCkBAIC0yODUsNyArMjg1LDcgQEAKICAqLwogQk9PTDE2IFdJTkFQSSBEZGVQb3N0QWR2aXNlKCBEV09SRCBpZEluc3QsIEhTWiBoc3pUb3BpYywgSFNaIGhzekl0ZW0gKQogewotICAgIGZwcmludGYoIHN0ZG5pbXAsICJEZGVQb3N0QWR2aXNlOiBlbXB0eSBzdHViXG4iICk7CisgICAgRklYTUUoIGRkZW1sLCAiZW1wdHkgc3R1YlxuIiApOwogICAgIHJldHVybiAwOwogfQogCkBAIC0yOTUsNyArMjk1LDcgQEAKIEhEREVEQVRBIFdJTkFQSSBEZGVBZGREYXRhKCBIRERFREFUQSBoRGF0YSwgTFBCWVRFIHBTcmMsIERXT1JEIGNiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGNiT2ZmICkKIHsKLSAgICBmcHJpbnRmKCBzdGRuaW1wLCAiRGRlQWRkRGF0YTogZW1wdHkgc3R1YlxuIiApOworICAgIEZJWE1FKCBkZGVtbCwgImVtcHR5IHN0dWJcbiIgKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMzA1LDcgKzMwNSw3IEBACiBEV09SRCBXSU5BUEkgRGRlR2V0RGF0YSggSERERURBVEEgaERhdGEsIExQQllURSBwRHN0LCBEV09SRCBjYk1heCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgY2JPZmYgKQogewotICAgIGZwcmludGYoIHN0ZG5pbXAsICJEZGVHZXREYXRhOiBlbXB0eSBzdHViXG4iICk7CisgICAgRklYTUUoIGRkZW1sLCAiZW1wdHkgc3R1YlxuIiApOwogICAgIHJldHVybiAwOwogfQogCkBAIC0zMTQsNyArMzE0LDcgQEAKICAqLwogTFBCWVRFIFdJTkFQSSBEZGVBY2Nlc3NEYXRhKCBIRERFREFUQSBoRGF0YSwgTFBEV09SRCBwY2JEYXRhU2l6ZSApCiB7Ci0gICAgIGZwcmludGYoIHN0ZG5pbXAsICJEZGVBY2Nlc3NEYXRhOiBlbXB0eSBzdHViXG4iICk7CisgICAgIEZJWE1FKCBkZGVtbCwgImVtcHR5IHN0dWJcbiIgKTsKICAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTMyMyw3ICszMjMsNyBAQAogICovCiBCT09MMTYgV0lOQVBJIERkZVVuYWNjZXNzRGF0YSggSERERURBVEEgaERhdGEgKQogewotICAgICBmcHJpbnRmKCBzdGRuaW1wLCAiRGRlVW5hY2Nlc3NEYXRhOiBlbXB0eSBzdHViXG4iICk7CisgICAgIEZJWE1FKCBkZGVtbCwgImVtcHR5IHN0dWJcbiIgKTsKICAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTMzMiw3ICszMzIsNyBAQAogICovCiBCT09MMTYgV0lOQVBJIERkZUVuYWJsZUNhbGxiYWNrKCBEV09SRCBpZEluc3QsIEhDT05WIGhDb252LCBVSU5UMTYgd0NtZCApCiB7Ci0gICAgIGZwcmludGYoIHN0ZG5pbXAsICJEZGVFbmFibGVDYWxsYmFjazogZW1wdHkgc3R1YlxuIiApOworICAgICBGSVhNRSggZGRlbWwsICJlbXB0eSBzdHViXG4iICk7CiAgICAgIHJldHVybiAwOwogfQogCkBAIC0zNTIsNyArMzUyLDcgQEAKIEhEREVEQVRBIFdJTkFQSSBEZGVOYW1lU2VydmljZTMyKCBEV09SRCBpZEluc3QsIEhTWiBoc3oxLCBIU1ogaHN6MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMzIgYWZDbWQgKQogewotICAgIGZwcmludGYoIHN0ZG5pbXAsICJEZGVOYW1lU2VydmljZTogZW1wdHkgc3R1YlxuIiApOworICAgIEZJWE1FKCBkZGVtbCwgImVtcHR5IHN0dWJcbiIgKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMzcxLDcgKzM3MSw3IEBACiAgKi8KIFVJTlQzMiBXSU5BUEkgRGRlR2V0TGFzdEVycm9yMzIoIERXT1JEIGlkSW5zdCApCiB7Ci0gICAgZnByaW50Ziggc3RkbmltcCwgIkRkZUdldExhc3RFcnJvcjogZW1wdHkgc3R1YlxuIiApOworICAgIEZJWE1FKCBkZGVtbCwgImVtcHR5IHN0dWJcbiIgKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMzgwLDcgKzM4MCw3IEBACiAgKi8KIGludCBXSU5BUEkgRGRlQ21wU3RyaW5nSGFuZGxlcyggSFNaIGhzejEsIEhTWiBoc3oyICkKIHsKLSAgICAgZnByaW50Ziggc3RkbmltcCwgIkRkZUNtcFN0cmluZ0hhbmRsZXM6IGVtcHR5IHN0dWJcbiIgKTsKKyAgICAgRklYTUUoIGRkZW1sLCAiZW1wdHkgc3R1YlxuIiApOwogICAgICByZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvbWlzYy9pbWFnZWxpc3QuYyBiL21pc2MvaW1hZ2VsaXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIxMmE5YwotLS0gL2Rldi9udWxsCisrKyBiL21pc2MvaW1hZ2VsaXN0LmMKQEAgLTAsMCArMSw2NDcgQEAKKy8qCisgKiAgSW1hZ2VMaXN0IGltcGxlbWVudGF0aW9uCisgKgorICogIENvcHlyaWdodCAxOTk4IEVyaWMgS29obAorICoKKyAqICBUT0RPOgorICogICAgLSBVc2UgZGV2aWNlIGluZGVwZW5kZW50IGJpdG1hcHMgKERJQnMpIGluc3RlYWQgb2YgZGV2aWNlCisgKiAgICAgIGRlcGVuZGVudCBiaXRtYXBzIChEREJzKS4KKyAqICAgIC0gRml4IGltYWdlIHNlbGVjdGlvbiAoSW1hZ2VMaXN0X0RyYXcpLgorICogICAgLSBJbXByb3ZlIGVycm9yIGNoZWNraW5nLgorICogICAgLSBBZGQgbWlzc2luZyBmdW5jdGlvbnMuCisgKiAgICAtIE1hbnkgbWFueSBvdGhlciB0aGluZ3MuICh1bmRvY3VtZW50ZWQgZnVuY3Rpb25zKQorICovCisKKy8qIFRoaXMgbXVzdCBiZSBkZWZpbmVkIGJlY2F1c2UgdGhlIEhJTUFHRUxJU1QgdHlwZSBpcyBqdXN0IGEgcG9pbnRlcgorICogdG8gdGhlIF9JTUFHRUxJU1QgZGF0YSBzdHJ1Y3R1cmUuIEJ1dCBNUyBkb2VzIG5vdCB3YW50IHVzIHRvIGtub3cKKyAqIGFueXRoaW5nIGFib3V0IGl0cyBjb250ZW50cy4gQXBwbGljYXRpb25zIGp1c3Qgc2VlIGEgcG9pbnRlciB0bworICogYSBzdHJ1Y3Qgd2l0aG91dCBhbnkgY29udGVudC4gSXQncyBqdXN0IHRvIGtlZXAgY29tcGF0aWJpbGl0eS4KKyAqLworI2RlZmluZSBfX1dJTkVfSU1BR0VMSVNUX0MKKyAKKy8qIFRoaXMgbXVzdCBiZSBkZWZpbmVkIHVudGlsICJHZXRJY29uSW5mbyIgaXMgaW1wbGVtZW50ZWQgY29tcGxldGVseS4KKyAqIFRvIGRvIHRoYXQgdGhlIEN1cnNvciBhbmQgSWNvbiBjb2RlIGluIG9iamVjdHMvY3Vyc29yaWNvbi5jIG11c3QKKyAqIGJlIHJld3JpdHRlbi4KKyAqLworI2RlZmluZSBfX0dFVF9JQ09OX0lORk9fSEFDS19fIAorIAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIndpbmRvd3MuaCIKKyNpbmNsdWRlICJpbWFnZWxpc3QuaCIKKyNpbmNsdWRlICJjb21tY3RybC5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisKKyNpZmRlZiBfX0dFVF9JQ09OX0lORk9fSEFDS19fCisjaW5jbHVkZSAiYml0bWFwLmgiCisjZW5kaWYKKworCitzdGF0aWMgdm9pZAorSU1BR0VMSVNUX0dyb3dCaXRtYXBzIChISU1BR0VMSVNUIGhpbWwsIElOVDMyIG5JbWFnZUNvdW50KQoreworICAgIEhEQzMyICAgICBoZGNTY3JlZW4sIGhkY0ltYWdlTGlzdCwgaGRjQml0bWFwOworICAgIEhCSVRNQVAzMiBoYm1OZXdCaXRtYXA7CisgICAgSU5UMzIgICAgIG5OZXdXaWR0aDsKKworICAgIC8qIG5vIHNwYWNlIGxlZnQgZm9yIG5ldyBJbWFnZShzKSA9PT4gY3JlYXRlIG5ldyBCaXRtYXAocykgKi8KKyAgICBwcmludGYgKCJJTUFHRUxJU1RfR3Jvd0JpdG1hcHM6IENyZWF0ZSBncm93biBiaXRtYXBzISFcbiIpOworCisgICAgbk5ld1dpZHRoID0gKGhpbWwtPmNDdXJJbWFnZSArIG5JbWFnZUNvdW50ICsgaGltbC0+Y0dyb3cpICogaGltbC0+Y3g7CisKKyAgICBoZGNTY3JlZW4gPSBHZXREQzMyIChHZXREZXNrdG9wV2luZG93MzIgKCkpOworICAgIGhkY0ltYWdlTGlzdCA9IENyZWF0ZUNvbXBhdGlibGVEQzMyIChoZGNTY3JlZW4pOworICAgIGhkY0JpdG1hcCA9IENyZWF0ZUNvbXBhdGlibGVEQzMyIChoZGNTY3JlZW4pOworICAgIFJlbGVhc2VEQzMyIChoZGNTY3JlZW4sIEdldERlc2t0b3BXaW5kb3czMiAoKSk7CisKKyAgICBoYm1OZXdCaXRtYXAgPQorICAgICAgICBDcmVhdGVDb21wYXRpYmxlQml0bWFwMzIgKGhkY0ltYWdlTGlzdCwgbk5ld1dpZHRoLCBoaW1sLT5jeSk7CisKKyAgICBTZWxlY3RPYmplY3QzMiAoaGRjSW1hZ2VMaXN0LCBoaW1sLT5oYm1JbWFnZSk7CisgICAgU2VsZWN0T2JqZWN0MzIgKGhkY0JpdG1hcCwgaGJtTmV3Qml0bWFwKTsKKyAgICBCaXRCbHQzMiAoaGRjQml0bWFwLCAwLCAwLCBoaW1sLT5jQ3VySW1hZ2UgKiBoaW1sLT5jeCwgaGltbC0+Y3ksCisgICAgICAgICAgICAgIGhkY0ltYWdlTGlzdCwgMCwgMCwgU1JDQ09QWSk7CisKKyAgICBEZWxldGVPYmplY3QzMiAoaGltbC0+aGJtSW1hZ2UpOworICAgIGhpbWwtPmhibUltYWdlID0gaGJtTmV3Qml0bWFwOworCisgICAgaWYgKGhpbWwtPmhibU1hc2spIHsKKyAgICAgICAgaGJtTmV3Qml0bWFwID0gCisgICAgICAgICAgICBDcmVhdGVDb21wYXRpYmxlQml0bWFwMzIgKGhkY0ltYWdlTGlzdCwgbk5ld1dpZHRoLCBoaW1sLT5jeSk7IAorICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjSW1hZ2VMaXN0LCBoaW1sLT5oYm1NYXNrKTsKKyAgICAgICAgU2VsZWN0T2JqZWN0MzIgKGhkY0JpdG1hcCwgaGJtTmV3Qml0bWFwKTsKKyAgICAgICAgQml0Qmx0MzIgKGhkY0JpdG1hcCwgMCwgMCwgaGltbC0+Y0N1ckltYWdlICogaGltbC0+Y3gsIGhpbWwtPmN5LAorICAgICAgICAgICAgICAgICAgaGRjSW1hZ2VMaXN0LCAwLCAwLCBTUkNDT1BZKTsKKyAgICAgICAgRGVsZXRlT2JqZWN0MzIgKGhpbWwtPmhibU1hc2spOworICAgICAgICBoaW1sLT5oYm1NYXNrID0gaGJtTmV3Qml0bWFwOworICAgIH0KKworICAgIERlbGV0ZURDMzIgKGhkY0ltYWdlTGlzdCk7CisgICAgRGVsZXRlREMzMiAoaGRjQml0bWFwKTsKK30KKworCitJTlQzMiBXSU5BUEkKK0ltYWdlTGlzdF9BZGQgKEhJTUFHRUxJU1QgaGltbCwgSEJJVE1BUDMyIGhibUltYWdlLCBIQklUTUFQMzIgaGJtTWFzaykKK3sKKyAgICBIREMzMiAgICBoZGNJbWFnZUxpc3QsIGhkY0ltYWdlLCBoZGNNYXNrOworICAgIElOVDMyICAgIG5GaXJzdEluZGV4LCBuSW1hZ2VDb3VudDsKKyAgICBJTlQzMiAgICBuU3RhcnRYLCBuUnVuWCwgblJ1blk7CisgICAgQ09MT1JSRUYgY2xyQ29sb3I7CisgICAgQklUTUFQMzIgYm1wOworCisgICAgR2V0T2JqZWN0MzJBIChoYm1JbWFnZSwgc2l6ZW9mKEJJVE1BUDMyKSwgKExQVk9JRCkmYm1wKTsKKyAgICBuSW1hZ2VDb3VudCA9IGJtcC5ibVdpZHRoIC8gaGltbC0+Y3g7CisKKyAgICBpZiAoaGltbC0+Y0N1ckltYWdlICsgbkltYWdlQ291bnQgPj0gaGltbC0+Y01heEltYWdlKQorICAgICAgICBJTUFHRUxJU1RfR3Jvd0JpdG1hcHMgKGhpbWwsIG5JbWFnZUNvdW50KTsKKworICAgIGhkY0ltYWdlTGlzdCA9IENyZWF0ZUNvbXBhdGlibGVEQzMyICgwKTsKKyAgICBoZGNJbWFnZSA9IENyZWF0ZUNvbXBhdGlibGVEQzMyICgwKTsKKworICAgIFNlbGVjdE9iamVjdDMyIChoZGNJbWFnZUxpc3QsIGhpbWwtPmhibUltYWdlKTsKKyAgICBTZWxlY3RPYmplY3QzMiAoaGRjSW1hZ2UsIGhibUltYWdlKTsKKworICAgIEJpdEJsdDMyIChoZGNJbWFnZUxpc3QsIGhpbWwtPmNDdXJJbWFnZSAqIGhpbWwtPmN4LCAwLAorICAgICAgICAgICAgICBibXAuYm1XaWR0aCwgaGltbC0+Y3ksIGhkY0ltYWdlLCAwLCAwLCBTUkNDT1BZKTsKKyAgICAgICAgICAKKyAgICBpZiAoaGltbC0+aGJtTWFzaykgeworICAgICAgICBpZiAoaGJtTWFzaykgeworICAgICAgICAgICAgU2VsZWN0T2JqZWN0MzIgKGhkY0ltYWdlTGlzdCwgaGltbC0+aGJtTWFzayk7CisgICAgICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjSW1hZ2UsIGhibU1hc2spOworICAgICAgICAgICAgQml0Qmx0MzIgKGhkY0ltYWdlTGlzdCwgaGltbC0+Y0N1ckltYWdlICogaGltbC0+Y3gsIDAsCisgICAgICAgICAgICAgICAgICAgICAgYm1wLmJtV2lkdGgsIGhpbWwtPmN5LCBoZGNJbWFnZSwgMCwgMCwgU1JDQ09QWSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBjcmVhdGUgbWFzayBmcm9tIHRoZSBpbWFnZWxpc3QncyBiYWNrZ3JvdW5kIGNvbG9yICovCisgICAgICAgICAgICBoZGNNYXNrID0gQ3JlYXRlQ29tcGF0aWJsZURDMzIgKDApOworICAgICAgICAgICAgU2VsZWN0T2JqZWN0MzIgKGhkY01hc2ssIGhpbWwtPmhibU1hc2spOworICAgICAgICAgICAgblN0YXJ0WCA9IGhpbWwtPmNDdXJJbWFnZSAqIGhpbWwtPmN4OworICAgICAgICAgICAgZm9yIChuUnVuWSA9IDA7IG5SdW5ZIDwgaGltbC0+Y3k7IG5SdW5ZKyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKG5SdW5YID0gMDsgblJ1blggPCBibXAuYm1XaWR0aDsgblJ1blgrKykgeworICAgICAgICAgICAgICAgICAgICBjbHJDb2xvciA9IEdldFBpeGVsMzIgKGhkY0ltYWdlLCBuUnVuWCwgblJ1blkpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xyQ29sb3IgPT0gaGltbC0+Y2xyQmspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNldFBpeGVsMzIgKGhkY0ltYWdlTGlzdCwgblN0YXJ0WCArIG5SdW5YLCBuUnVuWSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSR0IoMCwgMCwgMCkpOworICAgICAgICAgICAgICAgICAgICAgICAgU2V0UGl4ZWwzMiAoaGRjTWFzaywgblN0YXJ0WCArIG5SdW5YLCBuUnVuWSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSR0IoMjU1LCAyNTUsIDI1NSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIFNldFBpeGVsMzIgKGhkY01hc2ssIG5TdGFydFggKyBuUnVuWCwgblJ1blksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkdCKDAsIDAsIDApKTsgICAgICAgIAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERlbGV0ZURDMzIgKGhkY01hc2spOworICAgICAgICB9CisgICAgfQorCisgICAgRGVsZXRlREMzMiAoaGRjSW1hZ2VMaXN0KTsKKyAgICBEZWxldGVEQzMyIChoZGNJbWFnZSk7CisKKyAgICBuRmlyc3RJbmRleCA9IGhpbWwtPmNDdXJJbWFnZTsKKyAgICBoaW1sLT5jQ3VySW1hZ2UgKz0gbkltYWdlQ291bnQ7CisKKyAgICByZXR1cm4gKG5GaXJzdEluZGV4KTsKK30KKworCitJTlQzMiBXSU5BUEkKK0ltYWdlTGlzdF9BZGRNYXNrZWQgKEhJTUFHRUxJU1QgaGltbCwgSEJJVE1BUDMyIGhibUltYWdlLCBDT0xPUlJFRiBjck1hc2spCit7CisgICAgSERDMzIgICAgaGRjSW1hZ2VMaXN0LCBoZGNJbWFnZSwgaGRjTWFzazsKKyAgICBJTlQzMiAgICBuSW5kZXgsIG5JbWFnZUNvdW50OworICAgIEJJVE1BUDMyIGJtcDsKKyAgICBJTlQzMiAgICBuU3RhcnRYLCBuUnVuWCwgblJ1blk7CisgICAgQ09MT1JSRUYgY3JDb2xvcjsKKworICAgIEdldE9iamVjdDMyQSAoaGJtSW1hZ2UsIHNpemVvZihCSVRNQVAzMiksICZibXApOworICAgIG5JbWFnZUNvdW50ID0gYm1wLmJtV2lkdGggLyBoaW1sLT5jeDsKKworICAgIGlmIChoaW1sLT5jQ3VySW1hZ2UgKyBuSW1hZ2VDb3VudCA+PSBoaW1sLT5jTWF4SW1hZ2UpCisgICAgICAgIElNQUdFTElTVF9Hcm93Qml0bWFwcyAoaGltbCwgbkltYWdlQ291bnQpOworCisgICAgbkluZGV4ID0gaGltbC0+Y0N1ckltYWdlOworICAgIGhpbWwtPmNDdXJJbWFnZSArPSBuSW1hZ2VDb3VudDsKKworICAgIGhkY0ltYWdlTGlzdCA9IENyZWF0ZUNvbXBhdGlibGVEQzMyICgwKTsKKyAgICBoZGNJbWFnZSA9IENyZWF0ZUNvbXBhdGlibGVEQzMyICgwKTsKKworICAgIFNlbGVjdE9iamVjdDMyIChoZGNJbWFnZUxpc3QsIGhpbWwtPmhibUltYWdlKTsKKyAgICBTZWxlY3RPYmplY3QzMiAoaGRjSW1hZ2UsIGhibUltYWdlKTsKKyAgICBCaXRCbHQzMiAoaGRjSW1hZ2VMaXN0LCBuSW5kZXggKiBoaW1sLT5jeCwgMCwKKyAgICAgICAgICAgICAgYm1wLmJtV2lkdGgsIGhpbWwtPmN5LCBoZGNJbWFnZSwgMCwgMCwgU1JDQ09QWSk7CisKKyAgICBpZiAoaGltbC0+aGJtTWFzaykgeworICAgICAgICAvKiBjcmVhdGUgTWFzayAqLworICAgICAgICBoZGNNYXNrID0gQ3JlYXRlQ29tcGF0aWJsZURDMzIgKDApOworICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjTWFzaywgaGltbC0+aGJtTWFzayk7CisgICAgICAgIG5TdGFydFggPSBuSW5kZXggKiBoaW1sLT5jeDsKKyAgICAgICAgZm9yIChuUnVuWSA9IDA7IG5SdW5ZIDwgaGltbC0+Y3k7IG5SdW5ZKyspIHsKKyAgICAgICAgICAgIGZvciAoblJ1blggPSAwOyBuUnVuWCA8IGJtcC5ibVdpZHRoOyBuUnVuWCsrKSB7CisgICAgICAgICAgICAgICAgY3JDb2xvciA9IEdldFBpeGVsMzIgKGhkY0ltYWdlLCBuUnVuWCwgblJ1blkpOworICAgICAgICAgICAgICAgIGlmIChjckNvbG9yID09IGNyTWFzaykgeworICAgICAgICAgICAgICAgICAgICBTZXRQaXhlbDMyIChoZGNJbWFnZUxpc3QsIG5TdGFydFggKyBuUnVuWCwgblJ1blksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJHQigwLCAwLCAwKSk7CisgICAgICAgICAgICAgICAgICAgIFNldFBpeGVsMzIgKGhkY01hc2ssIG5TdGFydFggKyBuUnVuWCwgblJ1blksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJHQigyNTUsIDI1NSwgMjU1KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgU2V0UGl4ZWwzMiAoaGRjTWFzaywgblN0YXJ0WCArIG5SdW5YLCBuUnVuWSwgUkdCKDAsIDAsIDApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBEZWxldGVEQzMyIChoZGNNYXNrKTsKKyAgICB9CisKKyAgICBEZWxldGVEQzMyIChoZGNJbWFnZUxpc3QpOworICAgIERlbGV0ZURDMzIgKGhkY0ltYWdlKTsKKyAgCisgICAgcmV0dXJuIChuSW5kZXgpOworfQorCisKK0hJTUFHRUxJU1QgV0lOQVBJCitJbWFnZUxpc3RfQ3JlYXRlIChJTlQzMiBjeCwgSU5UMzIgY3ksIFVJTlQzMiBmbGFncywgSU5UMzIgY0luaXRpYWwsIElOVDMyIGNHcm93KQoreworICAgIEhJTUFHRUxJU1QgaGltbDsKKyAgICBIQU5ETEUzMiBoSGVhcDsKKyAgICBIREMzMiBoZGNEZXNrdG9wOworICAgIEhXTkQzMiBod25kRGVza3RvcDsKKworICAgIGhIZWFwID0gR2V0UHJvY2Vzc0hlYXAgKCk7CisgICAgaGltbCA9IChISU1BR0VMSVNUKSBIZWFwQWxsb2MgKGhIZWFwLCAwLCBzaXplb2Yoc3RydWN0IF9JTUFHRUxJU1QpKTsKKyAgICBpZiAoIWhpbWwpCisgICAgICAgIHJldHVybiAoMCk7CisgICAgaGltbC0+aEhlYXAgPSBoSGVhcDsKKyAgICBoaW1sLT5jeCA9IGN4OworICAgIGhpbWwtPmN5ID0gY3k7CisgICAgaGltbC0+ZmxhZ3MgPSBmbGFnczsKKyAgICBoaW1sLT5jTWF4SW1hZ2UgPSBjSW5pdGlhbCArIGNHcm93OworICAgIGhpbWwtPmNHcm93ID0gY0dyb3c7CisgICAgaGltbC0+Y0N1ckltYWdlID0gMDsKKyAgICBoaW1sLT5jbHJCayA9IENMUl9OT05FOyAgLyogPz8/IG9yIENMUl9ERUZBVUxUICovCisgICAgaGltbC0+bk92bElkeFswXSA9IC0xOworICAgIGhpbWwtPm5PdmxJZHhbMV0gPSAtMTsKKyAgICBoaW1sLT5uT3ZsSWR4WzJdID0gLTE7CisgICAgaGltbC0+bk92bElkeFszXSA9IC0xOworCisgICAgaHduZERlc2t0b3AgPSBHZXREZXNrdG9wV2luZG93MzIoKTsKKyAgICBoZGNEZXNrdG9wID0gR2V0REMzMiAoaHduZERlc2t0b3ApOworICAgIAorICAgIGhpbWwtPmhibUltYWdlID0KKyAgICAgICAgQ3JlYXRlQ29tcGF0aWJsZUJpdG1hcDMyIChoZGNEZXNrdG9wLCBoaW1sLT5jeCAqIGhpbWwtPmNNYXhJbWFnZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGltbC0+Y3kpOworICAgIGlmIChoaW1sLT5mbGFncyAmIElMQ19NQVNLKQorICAgICAgICBoaW1sLT5oYm1NYXNrID0gCisgICAgICAgICAgICBDcmVhdGVDb21wYXRpYmxlQml0bWFwMzIgKGhkY0Rlc2t0b3AsIGhpbWwtPmN4ICogaGltbC0+Y01heEltYWdlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGltbC0+Y3kpOyAKKyAgICBlbHNlCisgICAgICAgIGhpbWwtPmhibU1hc2sgPSAwOworCisgICAgUmVsZWFzZURDMzIgKGh3bmREZXNrdG9wLCBoZGNEZXNrdG9wKTsKKyAgICAKKyAgICByZXR1cm4gKGhpbWwpOyAgICAKK30KKworCitCT09MMzIgV0lOQVBJCitJbWFnZUxpc3RfRGVzdHJveSAoSElNQUdFTElTVCBoaW1sKQoreworICAgIGlmIChoaW1sLT5oYm1JbWFnZSkKKyAgICAgICAgRGVsZXRlT2JqZWN0MzIgKGhpbWwtPmhibUltYWdlKTsKKyAgICBpZiAoaGltbC0+aGJtTWFzaykKKyAgICAgICAgRGVsZXRlT2JqZWN0MzIgKGhpbWwtPmhibU1hc2spOworICAgICAgICAKKyAgICBIZWFwRnJlZSAoaGltbC0+aEhlYXAsIDAsIChMUFZPSUQpaGltbCk7CisgICAgcmV0dXJuIChUUlVFKTsKK30KKworCisKK0JPT0wzMiBXSU5BUEkKK0ltYWdlTGlzdF9EcmF3IChISU1BR0VMSVNUIGhpbWwsIElOVDMyIGksIEhEQzMyIGhkYywgCisgICAgICAgICAgICAgICAgSU5UMzIgeCwgSU5UMzIgeSwgVUlOVDMyIGZTdHlsZSkKK3sKKyAgICBIREMzMiAgICAgaGRjSW1hZ2VMaXN0LGhkY01hc2s7CisgICAgSEJJVE1BUDMyIGhibU1hc2s7CisgICAgSEJSVVNIMzIgaEJydXNoLCBoT2xkQnJ1c2g7CisgICAgSU5UMzIgbk92bElkeDsKKworICAgIGhkY0ltYWdlTGlzdCA9IENyZWF0ZUNvbXBhdGlibGVEQzMyICgwKTsKKyAgCisgICAgaWYgKGhpbWwtPmhibU1hc2spIHsgIAorICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjSW1hZ2VMaXN0LCBoaW1sLT5oYm1NYXNrKTsKKyAgICAgICAgQml0Qmx0MzIgKGhkYywgeCwgeSwgaGltbC0+Y3gsIGhpbWwtPmN5LCBoZGNJbWFnZUxpc3QsCisgICAgICAgICAgICAgICAgICBoaW1sLT5jeCAqIGksIDAsIFNSQ0FORCk7ICAKKyAgICB9ICAKKworICAgIFNlbGVjdE9iamVjdDMyIChoZGNJbWFnZUxpc3QsIGhpbWwtPmhibUltYWdlKTsKKworICAgIEJpdEJsdDMyIChoZGMsIHgsIHksIGhpbWwtPmN4LCBoaW1sLT5jeSwgaGRjSW1hZ2VMaXN0LAorICAgICAgICAgICAgICBoaW1sLT5jeCAqIGksIDAsIFNSQ1BBSU5UKTsKKworICAgIC8qIERyYXcgb3ZlcmxheSBpbWFnZSAqLworICAgIGlmIChmU3R5bGUgJiAweDA3MDApIHsKKyAgICAgICAgbk92bElkeCA9IChmU3R5bGUgJiAweDA3MDApID4+IDg7CisgICAgICAgIGlmICgobk92bElkeCA+PSAxKSAmJiAobk92bElkeCA8PSA0KSkgeworICAgICAgICAgICAgbk92bElkeCA9IGhpbWwtPm5PdmxJZHhbbk92bElkeCAtIDFdOworICAgICAgICAgICAgaWYgKChuT3ZsSWR4ID49IDApICYmIChuT3ZsSWR4IDw9IGhpbWwtPmNDdXJJbWFnZSkpIHsKKworICAgICAgICAgICAgICAgIGlmIChoaW1sLT5oYm1NYXNrKSB7ICAKKyAgICAgICAgICAgICAgICAgICAgU2VsZWN0T2JqZWN0MzIgKGhkY0ltYWdlTGlzdCwgaGltbC0+aGJtTWFzayk7CisgICAgICAgICAgICAgICAgICAgIEJpdEJsdDMyIChoZGMsIHgsIHksIGhpbWwtPmN4LCBoaW1sLT5jeSwgaGRjSW1hZ2VMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGltbC0+Y3ggKiBuT3ZsSWR4LCAwLCBTUkNBTkQpOyAgCisgICAgICAgICAgICAgICAgfSAgCisgICAgICAgICAgICAgICAgU2VsZWN0T2JqZWN0MzIgKGhkY0ltYWdlTGlzdCwgaGltbC0+aGJtSW1hZ2UpOworICAgICAgICAgICAgICAgIEJpdEJsdDMyIChoZGMsIHgsIHksIGhpbWwtPmN4LCBoaW1sLT5jeSwgaGRjSW1hZ2VMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBoaW1sLT5jeCAqIG5PdmxJZHgsIDAsIFNSQ1BBSU5UKTsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgRGVsZXRlREMzMiAoaGRjSW1hZ2VMaXN0KTsKKyAgCisgICAgcmV0dXJuIChUUlVFKTsKK30KKworCisKK0NPTE9SUkVGIFdJTkFQSQorSW1hZ2VMaXN0X0dldEJrQ29sb3IgKEhJTUFHRUxJU1QgaGltbCkKK3sKKyAgICByZXR1cm4gKGhpbWwtPmNsckJrKTsKK30KKworCitISUNPTjMyIFdJTkFQSQorSW1hZ2VMaXN0X0dldEljb24gKEhJTUFHRUxJU1QgaGltbCwgSU5UMzIgaSwgVUlOVDMyIGZsYWdzKQoreworCisKKyAgICByZXR1cm4gKDApOworfQorCisKK0JPT0wzMiBXSU5BUEkKK0ltYWdlTGlzdF9HZXRJY29uU2l6ZSAoSElNQUdFTElTVCBoaW1sLCBJTlQzMiAqY3gsIElOVDMyICpjeSkKK3sKKyAgICAqY3ggPSBoaW1sLT5jeDsKKyAgICAqY3kgPSBoaW1sLT5jeTsKKyAgICByZXR1cm4gKFRSVUUpOworfQorCisKK0lOVDMyIFdJTkFQSQorSW1hZ2VMaXN0X0dldEltYWdlQ291bnQgKEhJTUFHRUxJU1QgaGltbCkKK3sKKyAgICByZXR1cm4gKGhpbWwtPmNDdXJJbWFnZSk7Cit9CisKKworQk9PTDMyIFdJTkFQSQorSW1hZ2VMaXN0X0dldEltYWdlSW5mbyAoSElNQUdFTElTVCBoaW1sLCBJTlQzMiBpLCBJTUFHRUlORk8gKnBJbWFnZUluZm8pCit7CisgICAgcEltYWdlSW5mby0+aGJtSW1hZ2UgPSBoaW1sLT5oYm1JbWFnZTsKKyAgICBwSW1hZ2VJbmZvLT5oYm1NYXNrICA9IGhpbWwtPmhibU1hc2s7CisgICAgCisgICAgcEltYWdlSW5mby0+cmNJbWFnZS50b3AgICAgPSAwOworICAgIHBJbWFnZUluZm8tPnJjSW1hZ2UuYm90dG9tID0gaGltbC0+Y3k7CisgICAgcEltYWdlSW5mby0+cmNJbWFnZS5sZWZ0ICAgPSBpICogaGltbC0+Y3g7CisgICAgcEltYWdlSW5mby0+cmNJbWFnZS5yaWdodCAgPSAoaSsxKSAqIGhpbWwtPmN4OworICAgIAorICAgIHJldHVybiAoVFJVRSk7Cit9CisKKworSElNQUdFTElTVCBXSU5BUEkKK0ltYWdlTGlzdF9Mb2FkSW1hZ2UzMkEgKEhJTlNUQU5DRTMyIGhpLCBMUENTVFIgbHBibXAsIElOVDMyIGN4LCBJTlQzMiBjR3JvdywgCisgICAgICAgICAgICAgICAgICAgICAgICBDT0xPUlJFRiBjbHJNYXNrLCBVSU5UMzIgdVR5cGUsIFVJTlQzMiB1RmxhZ3MpCit7CisgICAgSElNQUdFTElTVCBoaW1sID0gTlVMTDsKKyAgICBIQU5ETEUzMiAgIGhhbmRsZTsKKyAgICBJTlQzMiAgICAgIG5JbWFnZUNvdW50OworCisgICAgaGFuZGxlID0gTG9hZEltYWdlMzJBIChoaSwgbHBibXAsIHVUeXBlLCAwLCAwLCB1RmxhZ3MpOworCisgICAgaWYgKHVUeXBlID09IElNQUdFX0JJVE1BUCkgeworICAgICAgICBCSVRNQVAzMiBibXA7CisgICAgICAgIEdldE9iamVjdDMyQSAoaGFuZGxlLCBzaXplb2YoQklUTUFQMzIpLCAmYm1wKTsKKyAgICAgICAgbkltYWdlQ291bnQgPSBibXAuYm1XaWR0aCAvIGN4OworCisgICAgICAgIGhpbWwgPSBJbWFnZUxpc3RfQ3JlYXRlIChjeCwgYm1wLmJtSGVpZ2h0LCBJTENfTUFTSyB8IElMQ19DT0xPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5JbWFnZUNvdW50LCBjR3Jvdyk7CisgICAgICAgIEltYWdlTGlzdF9BZGRNYXNrZWQgKGhpbWwsIChIQklUTUFQMzIpaGFuZGxlLCBjbHJNYXNrKTsKKyAgICB9CisgICAgZWxzZSBpZiAoKHVUeXBlID09IElNQUdFX0lDT04pIHx8ICh1VHlwZSA9PSBJTUFHRV9DVVJTT1IpKSB7CisjaWZkZWYgX19HRVRfSUNPTl9JTkZPX0hBQ0tfXworICAgICAgICBIQklUTUFQMzIgaGJtSW1hZ2U7CisgICAgICAgIEhCSVRNQVAzMiBoYm1NYXNrOworICAgICAgICBDVVJTT1JJQ09OSU5GTyAqcHRyOworCisgICAgICAgIGlmICghKHB0ciA9IChDVVJTT1JJQ09OSU5GTyAqKUdsb2JhbExvY2sxNihoYW5kbGUpKSkgcmV0dXJuIChOVUxMKTsKKyAgICAgICAgaGJtTWFzayAgPSBDcmVhdGVCaXRtYXAzMiAocHRyLT5uV2lkdGgsIHB0ci0+bkhlaWdodCwgMSwgMSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopKHB0ciArIDEpKTsKKyAgICAgICAgaGJtSW1hZ2UgPSBDcmVhdGVCaXRtYXAzMiAocHRyLT5uV2lkdGgsIHB0ci0+bkhlaWdodCwgcHRyLT5iUGxhbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHItPmJCaXRzUGVyUGl4ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopKHB0ciArIDEpICsgcHRyLT5uSGVpZ2h0ICogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVE1BUF9XSURUSF9CWVRFUyhwdHItPm5XaWR0aCwgMSkpOworICAgICAgICBoaW1sID0gSW1hZ2VMaXN0X0NyZWF0ZSAocHRyLT5uV2lkdGgsIHB0ci0+bkhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElMQ19NQVNLIHwgSUxDX0NPTE9SLCAxLCBjR3Jvdyk7CisgICAgICAgIEltYWdlTGlzdF9BZGQgKGhpbWwsIGhibUltYWdlLCBoYm1NYXNrKTsKKyAgICAgICAgRGVsZXRlT2JqZWN0MzIgKGhibUltYWdlKTsKKyAgICAgICAgRGVsZXRlT2JqZWN0MzIgKGhibU1hc2spOworICAgICAgICBHbG9iYWxVbmxvY2sxNiAoaGFuZGxlKTsKKyNlbHNlCisgICAgICAgIElDT05JTkZPMzIgaWk7CisgICAgICAgIEJJVE1BUDMyIGJtcDsKKworICAgICAgICBHZXRJY29uSW5mbyAoaEljb24sICZpaSk7CisgICAgICAgIEdldE9iamVjdDMyQSAoaWktPmhibU1hc2ssIHNpemVvZihCSVRNQVAzMiksIChMUFZPSUQpJmJtcCk7CisgICAgICAgIGhpbWwgPSBJbWFnZUxpc3RfQ3JlYXRlIChibXAuYm1XaWR0aCwgYm1wLmJtSGVpZ2h0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElMQ19NQVNLIHwgSUxDX0NPTE9SLCAxLCBjR3Jvdyk7CisgICAgICAgIEltYWdlTGlzdF9BZGQgKGhpbWwsIGlpLT5oYm1Db2xvciwgaWktPmhibU1hc2spOworI2VuZGlmCisgICAgfQorCisgICAgRGVsZXRlT2JqZWN0MzIgKGhhbmRsZSk7CisgICAgCisgICAgcmV0dXJuIChoaW1sKTsKK30KKworCitISU1BR0VMSVNUIFdJTkFQSQorSW1hZ2VMaXN0X0xvYWRJbWFnZTMyVyAoSElOU1RBTkNFMzIgaGksIExQQ1dTVFIgbHBibXAsIElOVDMyIGN4LCBJTlQzMiBjR3JvdywgCisgICAgICAgICAgICAgICAgICAgICAgICBDT0xPUlJFRiBjbHJNYXNrLCBVSU5UMzIgdVR5cGUsIFVJTlQzMiB1RmxhZ3MpCit7CisgICAgSElNQUdFTElTVCBoaW1sID0gTlVMTDsKKyAgICBIQU5ETEUzMiAgIGhhbmRsZTsKKyAgICBJTlQzMiAgICAgIG5JbWFnZUNvdW50OworCisgICAgaGFuZGxlID0gTG9hZEltYWdlMzJXIChoaSwgbHBibXAsIHVUeXBlLCAwLCAwLCB1RmxhZ3MpOworCisgICAgaWYgKHVUeXBlID09IElNQUdFX0JJVE1BUCkgeworICAgICAgICBCSVRNQVAzMiBibXA7CisgICAgICAgIEdldE9iamVjdDMyQSAoaGFuZGxlLCBzaXplb2YoQklUTUFQMzIpLCAmYm1wKTsKKyAgICAgICAgbkltYWdlQ291bnQgPSBibXAuYm1XaWR0aCAvIGN4OworCisgICAgICAgIGhpbWwgPSBJbWFnZUxpc3RfQ3JlYXRlIChjeCwgYm1wLmJtSGVpZ2h0LCBJTENfTUFTSyB8IElMQ19DT0xPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5JbWFnZUNvdW50LCBjR3Jvdyk7CisgICAgICAgIEltYWdlTGlzdF9BZGRNYXNrZWQgKGhpbWwsIChIQklUTUFQMzIpaGFuZGxlLCBjbHJNYXNrKTsKKyAgICB9CisgICAgZWxzZSBpZiAoKHVUeXBlID09IElNQUdFX0lDT04pIHx8ICh1VHlwZSA9PSBJTUFHRV9DVVJTT1IpKSB7CisjaWZkZWYgX19HRVRfSUNPTl9JTkZPX0hBQ0tfXworICAgICAgICBIQklUTUFQMzIgaGJtSW1hZ2U7CisgICAgICAgIEhCSVRNQVAzMiBoYm1NYXNrOworICAgICAgICBDVVJTT1JJQ09OSU5GTyAqcHRyOworCisgICAgICAgIGlmICghKHB0ciA9IChDVVJTT1JJQ09OSU5GTyAqKUdsb2JhbExvY2sxNihoYW5kbGUpKSkgcmV0dXJuIChOVUxMKTsKKyAgICAgICAgaGJtTWFzayAgPSBDcmVhdGVCaXRtYXAzMiAocHRyLT5uV2lkdGgsIHB0ci0+bkhlaWdodCwgMSwgMSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopKHB0ciArIDEpKTsKKyAgICAgICAgaGJtSW1hZ2UgPSBDcmVhdGVCaXRtYXAzMiAocHRyLT5uV2lkdGgsIHB0ci0+bkhlaWdodCwgcHRyLT5iUGxhbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHItPmJCaXRzUGVyUGl4ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopKHB0ciArIDEpICsgcHRyLT5uSGVpZ2h0ICogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVE1BUF9XSURUSF9CWVRFUyhwdHItPm5XaWR0aCwgMSkpOworICAgICAgICBoaW1sID0gSW1hZ2VMaXN0X0NyZWF0ZSAocHRyLT5uV2lkdGgsIHB0ci0+bkhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElMQ19NQVNLIHwgSUxDX0NPTE9SLCAxLCBjR3Jvdyk7CisgICAgICAgIEltYWdlTGlzdF9BZGQgKGhpbWwsIGhibUltYWdlLCBoYm1NYXNrKTsKKyAgICAgICAgRGVsZXRlT2JqZWN0MzIgKGhibUltYWdlKTsKKyAgICAgICAgRGVsZXRlT2JqZWN0MzIgKGhibU1hc2spOworICAgICAgICBHbG9iYWxVbmxvY2sxNiAoaGFuZGxlKTsKKyNlbHNlCisgICAgICAgIElDT05JTkZPMzIgaWk7CisgICAgICAgIEJJVE1BUDMyIGJtcDsKKworICAgICAgICBHZXRJY29uSW5mbyAoaEljb24sICZpaSk7CisgICAgICAgIEdldE9iamVjdDMyQSAoaWktPmhibU1hc2ssIHNpemVvZihCSVRNQVAzMiksIChMUFZPSUQpJmJtcCk7CisgICAgICAgIGhpbWwgPSBJbWFnZUxpc3RfQ3JlYXRlIChibXAuYm1XaWR0aCwgYm1wLmJtSGVpZ2h0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElMQ19NQVNLIHwgSUxDX0NPTE9SLCAxLCBjR3Jvdyk7CisgICAgICAgIEltYWdlTGlzdF9BZGQgKGhpbWwsIGlpLT5oYm1Db2xvciwgaWktPmhibU1hc2spOworI2VuZGlmCisgICAgfQorCisgICAgRGVsZXRlT2JqZWN0MzIgKGhhbmRsZSk7CisgICAgCisgICAgcmV0dXJuIChoaW1sKTsKK30KKworCitISU1BR0VMSVNUIFdJTkFQSQorSW1hZ2VMaXN0X01lcmdlIChISU1BR0VMSVNUIGhpbWwxLCBJTlQzMiBpMSwgSElNQUdFTElTVCBoaW1sMiwgSU5UMzIgaTIsCisgICAgICAgICAgICAgICAgIElOVDMyIHhPZmZzLCBJTlQzMiB5T2ZmcykKK3sKKyAgICBISU1BR0VMSVNUIGhpbWxEc3QgPSBOVUxMOworICAgIEhEQzMyICAgICAgaGRjU3JjSW1hZ2UsIGhkY0RzdEltYWdlOworICAgIElOVDMyICAgICAgblgxLCBuWDI7CisKKyAgICBoaW1sRHN0ID0gSW1hZ2VMaXN0X0NyZWF0ZSAoaGltbDEtPmN4LCBoaW1sMS0+Y3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElMQ19NQVNLIHwgSUxDX0NPTE9SLCAxLCAxKTsKKyAgICBpZiAoaGltbERzdCkgeworICAgICAgICBoZGNTcmNJbWFnZSA9IENyZWF0ZUNvbXBhdGlibGVEQzMyICgwKTsKKyAgICAgICAgaGRjRHN0SW1hZ2UgPSBDcmVhdGVDb21wYXRpYmxlREMzMiAoMCk7CisgICAgICAgIG5YMSA9IGkxICogaGltbDEtPmN4OworICAgICAgICBuWDIgPSBpMiAqIGhpbWwyLT5jeDsKKyAgICAgICAgCisgICAgICAgIC8qIGNvcHkgaW1hZ2UgKi8KKyAgICAgICAgU2VsZWN0T2JqZWN0MzIgKGhkY1NyY0ltYWdlLCBoaW1sMS0+aGJtSW1hZ2UpOworICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjRHN0SW1hZ2UsIGhpbWxEc3QtPmhibUltYWdlKTsKKyAgICAgICAgQml0Qmx0MzIgKGhkY0RzdEltYWdlLCAwLCAwLCBoaW1sRHN0LT5jeCwgaGltbERzdC0+Y3ksIAorICAgICAgICAgICAgICAgICAgaGRjU3JjSW1hZ2UsIG5YMSwgMCwgU1JDQ09QWSk7ICAvKiBTUkNDT1BZICovCisKKyAgICAgICAgU2VsZWN0T2JqZWN0MzIgKGhkY1NyY0ltYWdlLCBoaW1sMi0+aGJtTWFzayk7CisgICAgICAgIEJpdEJsdDMyIChoZGNEc3RJbWFnZSwgeE9mZnMsIHlPZmZzLCAKKyAgICAgICAgICAgICAgICAgIGhpbWxEc3QtPmN4IC0geE9mZnMsIGhpbWxEc3QtPmN5IC0geU9mZnMsIAorICAgICAgICAgICAgICAgICAgaGRjU3JjSW1hZ2UsIG5YMiwgMCwgU1JDQU5EKTsKKworICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjU3JjSW1hZ2UsIGhpbWwyLT5oYm1JbWFnZSk7CisgICAgICAgIEJpdEJsdDMyIChoZGNEc3RJbWFnZSwgeE9mZnMsIHlPZmZzLCAKKyAgICAgICAgICAgICAgICAgIGhpbWxEc3QtPmN4IC0geE9mZnMsIGhpbWxEc3QtPmN5IC0geU9mZnMsIAorICAgICAgICAgICAgICAgICAgaGRjU3JjSW1hZ2UsIG5YMiwgMCwgU1JDUEFJTlQpOworCisgICAgICAgIC8qIGNvcHkgbWFzayAqLworICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjU3JjSW1hZ2UsIGhpbWwxLT5oYm1NYXNrKTsKKyAgICAgICAgU2VsZWN0T2JqZWN0MzIgKGhkY0RzdEltYWdlLCBoaW1sRHN0LT5oYm1NYXNrKTsKKyAgICAgICAgQml0Qmx0MzIgKGhkY0RzdEltYWdlLCAwLCAwLCBoaW1sRHN0LT5jeCwgaGltbERzdC0+Y3ksIAorICAgICAgICAgICAgICAgICAgaGRjU3JjSW1hZ2UsIG5YMSwgMCwgU1JDQ09QWSk7CisKKyAgICAgICAgU2VsZWN0T2JqZWN0MzIgKGhkY1NyY0ltYWdlLCBoaW1sMi0+aGJtTWFzayk7CisgICAgICAgIEJpdEJsdDMyIChoZGNEc3RJbWFnZSwgeE9mZnMsIHlPZmZzLCAKKyAgICAgICAgICAgICAgICAgIGhpbWxEc3QtPmN4IC0geE9mZnMsIGhpbWxEc3QtPmN5IC0geU9mZnMsIAorICAgICAgICAgICAgICAgICAgaGRjU3JjSW1hZ2UsIG5YMiwgMCwgU1JDQU5EKTsKKworICAgICAgICBEZWxldGVEQzMyIChoZGNTcmNJbWFnZSk7CisgICAgICAgIERlbGV0ZURDMzIgKGhkY0RzdEltYWdlKTsKKyAgICB9CisgICAKKyAgICByZXR1cm4gKGhpbWxEc3QpOworfQorCisKKworQk9PTDMyIFdJTkFQSQorSW1hZ2VMaXN0X1JlcGxhY2UgKEhJTUFHRUxJU1QgaGltbCwgSU5UMzIgaSwgIEhCSVRNQVAzMiBoYm1JbWFnZSwgCisgICAgICAgICAgICAgICAgICAgSEJJVE1BUDMyIGhibU1hc2spCit7CisgICAgSERDMzIgaGRjSW1hZ2VMaXN0LCBoZGNJbWFnZTsKKworICAgIGlmICgoaSA+PSBoaW1sLT5jQ3VySW1hZ2UpIHx8IChpIDwgMCkpIHJldHVybiAoRkFMU0UpOworCisgICAgaGRjSW1hZ2VMaXN0ID0gQ3JlYXRlQ29tcGF0aWJsZURDMzIgKDApOworICAgIGhkY0ltYWdlID0gQ3JlYXRlQ29tcGF0aWJsZURDMzIgKDApOworCisgICAgLyogUmVwbGFjZSBJbWFnZSAqLworICAgIFNlbGVjdE9iamVjdDMyIChoZGNJbWFnZUxpc3QsIGhpbWwtPmhibUltYWdlKTsKKyAgICBTZWxlY3RPYmplY3QzMiAoaGRjSW1hZ2UsIGhibUltYWdlKTsKKworICAgIEJpdEJsdDMyIChoZGNJbWFnZUxpc3QsIGkgKiBoaW1sLT5jeCwgMCwKKyAgICAgICAgICAgICAgaGltbC0+Y3gsIGhpbWwtPmN5LCBoZGNJbWFnZSwgMCwgMCwgU1JDQ09QWSk7CisKKyAgICBpZiAoaGltbC0+aGJtTWFzaykgeworICAgICAgICAvKiBSZXBsYWNlIE1hc2sgKi8KKyAgICAgICAgU2VsZWN0T2JqZWN0MzIgKGhkY0ltYWdlTGlzdCwgaGltbC0+aGJtTWFzayk7CisgICAgICAgIFNlbGVjdE9iamVjdDMyIChoZGNJbWFnZSwgaGJtTWFzayk7CisKKyAgICAgICAgQml0Qmx0MzIgKGhkY0ltYWdlTGlzdCwgaSAqIGhpbWwtPmN4LCAwLAorICAgICAgICAgICAgICAgICAgaGltbC0+Y3gsIGhpbWwtPmN5LCBoZGNJbWFnZSwgMCwgMCwgU1JDQ09QWSk7CisgICAgfQorCisgICAgRGVsZXRlREMzMiAoaGRjSW1hZ2UpOworICAgIERlbGV0ZURDMzIgKGhkY0ltYWdlTGlzdCk7CisKKyAgICByZXR1cm4gKFRSVUUpOworfQorCisKK0lOVDMyIFdJTkFQSQorSW1hZ2VMaXN0X1JlcGxhY2VJY29uIChISU1BR0VMSVNUIGhpbWwsIElOVDMyIGksIEhJQ09OMzIgaEljb24pCit7CisgICAgSERDMzIgICAgIGhkY0ltYWdlTGlzdCwgaGRjSW1hZ2U7CisgICAgSU5UMzIgICAgIG5JbmRleDsKKyNpZmRlZiBfX0dFVF9JQ09OX0lORk9fSEFDS19fCisgICAgSEJJVE1BUDMyIGhibUltYWdlOworICAgIEhCSVRNQVAzMiBoYm1NYXNrOworICAgIENVUlNPUklDT05JTkZPICpwdHI7CisjZWxzZSAgICAKKyAgICBJQ09OSU5GTzMyIGlpOworICAgIEJJVE1BUDMyIGJtcDsKKyNlbmRpZgorCisgICAgaWYgKChpID49IGhpbWwtPmNDdXJJbWFnZSkgfHwgKGkgPCAtMSkpIHJldHVybiAoLTEpOworCisjaWZkZWYgX19HRVRfSUNPTl9JTkZPX0hBQ0tfXworICAgIGlmICghKHB0ciA9IChDVVJTT1JJQ09OSU5GTyAqKUdsb2JhbExvY2sxNihoSWNvbikpKSByZXR1cm4gKC0xKTsKKyAgICBoYm1NYXNrICA9IENyZWF0ZUJpdG1hcDMyIChwdHItPm5XaWR0aCwgcHRyLT5uSGVpZ2h0LCAxLCAxLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKShwdHIgKyAxKSk7CisgICAgaGJtSW1hZ2UgPSBDcmVhdGVCaXRtYXAzMiAocHRyLT5uV2lkdGgsIHB0ci0+bkhlaWdodCwgcHRyLT5iUGxhbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ci0+YkJpdHNQZXJQaXhlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKShwdHIgKyAxKSArIHB0ci0+bkhlaWdodCAqIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVE1BUF9XSURUSF9CWVRFUyhwdHItPm5XaWR0aCwgMSkpOworI2Vsc2UKKyAgICBHZXRJY29uSW5mbyAoaEljb24sICZpaSk7CisgICAgR2V0T2JqZWN0MzJBIChpaS0+aGJtTWFzaywgc2l6ZW9mKEJJVE1BUDMyKSwgKExQVk9JRCkmYm1wKTsKKyNlbmRpZgorCisgICAgaWYgKGkgPT0gLTEpIHsKKyAgICAgICAgaWYgKGhpbWwtPmNDdXJJbWFnZSArIDEgPj0gaGltbC0+Y01heEltYWdlKQorICAgICAgICAgICAgSU1BR0VMSVNUX0dyb3dCaXRtYXBzIChoaW1sLCAxKTsKKyAgICAgICAgbkluZGV4ID0gaGltbC0+Y0N1ckltYWdlOworICAgICAgICBoaW1sLT5jQ3VySW1hZ2UgKys7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgbkluZGV4ID0gaTsKKworICAgIGhkY0ltYWdlTGlzdCA9IENyZWF0ZUNvbXBhdGlibGVEQzMyICgwKTsKKyAgICBoZGNJbWFnZSA9IENyZWF0ZUNvbXBhdGlibGVEQzMyICgwKTsKKworI2lmZGVmIF9fR0VUX0lDT05fSU5GT19IQUNLX18KKyAgICBTZWxlY3RPYmplY3QzMiAoaGRjSW1hZ2VMaXN0LCBoaW1sLT5oYm1JbWFnZSk7CisgICAgU2VsZWN0T2JqZWN0MzIgKGhkY0ltYWdlLCBoYm1JbWFnZSk7CisjZWxzZQorICAgIFNlbGVjdE9iamVjdDMyIChoZGNJbWFnZSwgaWktPmhibUNvbG9yKTsKKyNlbmRpZgorCisgICAgQml0Qmx0MzIgKGhkY0ltYWdlTGlzdCwgbkluZGV4ICogaGltbC0+Y3gsIDAsCisgICAgICAgICAgICAgIGhpbWwtPmN4LCBoaW1sLT5jeSwgaGRjSW1hZ2UsIDAsIDAsIFNSQ0NPUFkpOworCisgICAgaWYgKGhpbWwtPmhibU1hc2spIHsKKyNpZmRlZiBfX0dFVF9JQ09OX0lORk9fSEFDS19fCisgICAgICAgIFNlbGVjdE9iamVjdDMyIChoZGNJbWFnZUxpc3QsIGhpbWwtPmhibU1hc2spOworICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjSW1hZ2UsIGhibU1hc2spOworI2Vsc2UKKyAgICAgICAgU2VsZWN0T2JqZWN0MzIgKGhkY0ltYWdlLCBpaS0+aGJtTWFzayk7CisjZW5kaWYKKyAgICAgICAgQml0Qmx0MzIgKGhkY0ltYWdlTGlzdCwgbkluZGV4ICogaGltbC0+Y3gsIDAsCisgICAgICAgICAgICAgICAgICBoaW1sLT5jeCwgaGltbC0+Y3ksIGhkY0ltYWdlLCAwLCAwLCBTUkNDT1BZKTsKKyAgICB9CisKKyAgICBEZWxldGVEQzMyIChoZGNJbWFnZUxpc3QpOworICAgIERlbGV0ZURDMzIgKGhkY0ltYWdlKTsKKyNpZmRlZiBfX0dFVF9JQ09OX0lORk9fSEFDSyAgICAgICAgCisgICAgRGVsZXRlT2JqZWN0MzIgKGhibUltYWdlKTsKKyAgICBEZWxldGVPYmplY3QzMiAoaGJtTWFzayk7CisgICAgR2xvYmFsVW5sb2NrMTYgKGhJY29uKTsKKyNlbmRpZgorICAgIHJldHVybiAobkluZGV4KTsKK30KKworCitDT0xPUlJFRiBXSU5BUEkKK0ltYWdlTGlzdF9TZXRCa0NvbG9yIChISU1BR0VMSVNUIGhpbWwsIENPTE9SUkVGIGNsckJrKQoreworICAgIENPTE9SUkVGIGNsck9sZEJrOworCisgICAgY2xyT2xkQmsgPSBoaW1sLT5jbHJCazsKKyAgICBoaW1sLT5jbHJCayA9IGNsckJrOworICAgIHJldHVybiAoY2xyT2xkQmspOworfQorCisKKworQk9PTDMyIFdJTkFQSQorSW1hZ2VMaXN0X1NldE92ZXJsYXlJbWFnZSAoSElNQUdFTElTVCBoaW1sLCBJTlQzMiBpSW1hZ2UsIElOVDMyIGlPdmVybGF5KQoreworICAgIGlmICgoaU92ZXJsYXkgPCAxKSB8fCAoaU92ZXJsYXkgPiA0KSkgcmV0dXJuIChGQUxTRSk7CisgICAgaWYgKChpSW1hZ2UgPCAwKSB8fCAoaUltYWdlID4gaGltbC0+Y0N1ckltYWdlKSkgcmV0dXJuIChGQUxTRSk7CisgICAgCisgICAgaGltbC0+bk92bElkeFtpT3ZlcmxheSAtIDFdID0gaUltYWdlOworICAgIHJldHVybiAoVFJVRSk7Cit9CisKZGlmZiAtLWdpdCBhL21pc2MvbHN0ci5jIGIvbWlzYy9sc3RyLmMKaW5kZXggMjUyZDA4MS4uZmYzNTc2YSAxMDA2NDQKLS0tIGEvbWlzYy9sc3RyLmMKKysrIGIvbWlzYy9sc3RyLmMKQEAgLTUxNywxMiArNTE3LDEwIEBACiAJRFdPUkQJd2lkdGggPSBkd0ZsYWdzICYgRk9STUFUX01FU1NBR0VfTUFYX1dJRFRIX01BU0s7CiAJRFdPUkQJbm9saW5lZmVlZCA9IDA7CiAKLQlkcHJpbnRmX2luZm8ocmVzb3VyY2UsCi0JCSJGb3JtYXRNZXNzYWdlMzJBKDB4JWx4LCVwLCVsZCwweCVseCwlcCwlbGQsJXApXG4iLAotCQlkd0ZsYWdzLGxwU291cmNlLGR3TWVzc2FnZUlkLGR3TGFuZ3VhZ2VJZCxscEJ1ZmZlcixuU2l6ZSxhcmdzCi0JKTsKKwlUUkFDRShyZXNvdXJjZSwgIigweCVseCwlcCwlbGQsMHglbHgsJXAsJWxkLCVwKVxuIiwKKwkJICAgICBkd0ZsYWdzLGxwU291cmNlLGR3TWVzc2FnZUlkLGR3TGFuZ3VhZ2VJZCxscEJ1ZmZlcixuU2l6ZSxhcmdzKTsKIAlpZiAod2lkdGgpIAotCQlmcHJpbnRmKHN0ZG5pbXAsIgktIGxpbmUgd3JhcHBpbmcgbm90IHN1cHBvcnRlZC5cbiIpOworCQlGSVhNRShyZXNvdXJjZSwibGluZSB3cmFwcGluZyBub3Qgc3VwcG9ydGVkLlxuIik7CiAJZnJvbSA9IE5VTEw7CiAJaWYgKGR3RmxhZ3MgJiBGT1JNQVRfTUVTU0FHRV9GUk9NX1NUUklORykKIAkJZnJvbSA9IEhFQVBfc3RyZHVwQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgKExQU1RSKWxwU291cmNlKTsKQEAgLTU5Niw2ICs1OTQsOSBAQAogCQkJCQkJCWYrPXN0cmxlbihmKTsgLyphdCBcMCovCiAJCQkJCQl9CiAJCQkJCX0gZWxzZQorCQkJCQkgICAgICAgIGlmKCFhcmdzKSAKKwkJCQkJCSAgYnJlYWs7CisJCQkJCWVsc2UKIAkJCQkJCWZtdHN0cj1IRUFQX3N0cmR1cEEoR2V0UHJvY2Vzc0hlYXAoKSwwLCIlcyIpOwogCQkJCQlpZiAoYXJncykgewogCQkJCQkJaWYgKGR3RmxhZ3MgJiBGT1JNQVRfTUVTU0FHRV9BUkdVTUVOVF9BUlJBWSkKQEAgLTYwMyw3ICs2MDQsNyBAQAogCQkJCQkJZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ2xpc3RzdGFydD0oKihEV09SRCoqKWFyZ3MpK2luc2VydG5yLTE7CiAKLQkJCQkJCWlmIChmbXRzdHJbc3RybGVuKGZtdHN0cildPT0ncycpCisJCQkJCQlpZiAoZm10c3RyW3N0cmxlbihmbXRzdHIpLTFdPT0ncycpCiAJCQkJCQkJc3ByaW50ZmJ1Zj1IZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLHN0cmxlbigoTFBTVFIpYXJnbGlzdHN0YXJ0WzBdKSsxKTsKIAkJCQkJCWVsc2UKIAkJCQkJCQlzcHJpbnRmYnVmPUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsMTAwKTsKQEAgLTY4MywxMiArNjg0LDEwIEBACiAJRFdPUkQJd2lkdGggPSBkd0ZsYWdzICYgRk9STUFUX01FU1NBR0VfTUFYX1dJRFRIX01BU0s7CiAJRFdPUkQJbm9saW5lZmVlZCA9IDA7CiAKLQlkcHJpbnRmX2luZm8ocmVzb3VyY2UsCi0JCSJGb3JtYXRNZXNzYWdlMzJBKDB4JWx4LCVwLCVsZCwweCVseCwlcCwlbGQsJXApXG4iLAotCQlkd0ZsYWdzLGxwU291cmNlLGR3TWVzc2FnZUlkLGR3TGFuZ3VhZ2VJZCxscEJ1ZmZlcixuU2l6ZSxhcmdzCi0JKTsKKwlUUkFDRShyZXNvdXJjZSwgIigweCVseCwlcCwlbGQsMHglbHgsJXAsJWxkLCVwKVxuIiwKKwkJICAgICBkd0ZsYWdzLGxwU291cmNlLGR3TWVzc2FnZUlkLGR3TGFuZ3VhZ2VJZCxscEJ1ZmZlcixuU2l6ZSxhcmdzKTsKIAlpZiAod2lkdGgpIAotCQlmcHJpbnRmKHN0ZG5pbXAsIgktIGxpbmUgd3JhcHBpbmcgbm90IHN1cHBvcnRlZC5cbiIpOworCQlGSVhNRShyZXNvdXJjZSwibGluZSB3cmFwcGluZyBub3Qgc3VwcG9ydGVkLlxuIik7CiAJZnJvbSA9IE5VTEw7CiAJaWYgKGR3RmxhZ3MgJiBGT1JNQVRfTUVTU0FHRV9GUk9NX1NUUklORykKIAkJZnJvbSA9IEhFQVBfc3RyZHVwV3RvQShHZXRQcm9jZXNzSGVhcCgpLDAsKExQV1NUUilscFNvdXJjZSk7CkBAIC03NjQsMTMgKzc2MywxNiBAQAogCQkJCQkJCWYrPXN0cmxlbihmKTsgLyphdCBcMCovCiAJCQkJCQl9CiAJCQkJCX0gZWxzZQorCQkJCQkgICAgICAgIGlmKCFhcmdzKQorCQkJCQkJICBicmVhazsKKwkJCQkJZWxzZQogCQkJCQkJZm10c3RyPUhFQVBfc3RyZHVwQSggR2V0UHJvY2Vzc0hlYXAoKSwwLCIlcyIpOwogCQkJCQlpZiAoZHdGbGFncyAmIEZPUk1BVF9NRVNTQUdFX0FSR1VNRU5UX0FSUkFZKQogCQkJCQkJYXJnbGlzdHN0YXJ0PWFyZ3MraW5zZXJ0bnItMTsKIAkJCQkJZWxzZQogCQkJCQkJYXJnbGlzdHN0YXJ0PSgqKERXT1JEKiopYXJncykraW5zZXJ0bnItMTsKIAotCQkJCQlpZiAoZm10c3RyW3N0cmxlbihmbXRzdHIpXT09J3MnKSB7CisJCQkJCWlmIChmbXRzdHJbc3RybGVuKGZtdHN0ciktMV09PSdzJykgewogCQkJCQkJRFdPUkQJeGFyclszXTsKIAogCQkJCQkJeGFyclswXT0oRFdPUkQpSEVBUF9zdHJkdXBXdG9BKEdldFByb2Nlc3NIZWFwKCksMCwoTFBXU1RSKSgqKGFyZ2xpc3RzdGFydCswKSkpOwpkaWZmIC0tZ2l0IGEvbWlzYy9semV4cGFuZC5jIGIvbWlzYy9semV4cGFuZC5jCmluZGV4IGY5ZGVmZWIuLjc0NDBlOWQgMTAwNjQ0Ci0tLSBhL21pc2MvbHpleHBhbmQuYworKysgYi9taXNjL2x6ZXhwYW5kLmMKQEAgLTExOCw3ICsxMTgsNyBAQAogICovCiBJTlQxNiBXSU5BUEkgTFpTdGFydDE2KHZvaWQpCiB7Ci0gICAgZHByaW50Zl9pbmZvKGZpbGUsIkxaU3RhcnQxNih2b2lkKVxuIik7CisgICAgVFJBQ0UoZmlsZSwiKHZvaWQpXG4iKTsKICAgICByZXR1cm4gMTsKIH0KIApAQCAtMTI4LDcgKzEyOCw3IEBACiAgKi8KIElOVDMyIFdJTkFQSSBMWlN0YXJ0MzIodm9pZCkKIHsKLSAgICBkcHJpbnRmX2luZm8oZmlsZSwiTFpTdGFydDMyKHZvaWQpXG4iKTsKKyAgICBUUkFDRShmaWxlLCIodm9pZClcbiIpOwogICAgIHJldHVybiAxOwogfQogCkBAIC0xNjEsNyArMTYxLDcgQEAKIAlzdHJ1Y3QJbHpzdGF0ZQkJKmx6czsKIAlEV09SRAlyZXQ7CiAKLQlkcHJpbnRmX2luZm8oZmlsZSwiTFpJbml0KCVkKVxuIixoZlNyYyk7CisJVFJBQ0UoZmlsZSwiKCVkKVxuIixoZlNyYyk7CiAJcmV0PXJlYWRfaGVhZGVyKGhmU3JjLCZoZWFkKTsKIAlpZiAocmV0PD0wKSB7CiAJCV9sbHNlZWszMihoZlNyYywwLFNFRUtfU0VUKTsKQEAgLTE5NCw3ICsxOTQsNyBAQAogICovCiB2b2lkIFdJTkFQSSBMWkRvbmUodm9pZCkKIHsKLSAgICBkcHJpbnRmX2luZm8oZmlsZSwiTFpEb25lKClcbiIpOworICAgIFRSQUNFKGZpbGUsIih2b2lkKVxuIik7CiB9CiAKIApAQCAtMjI2LDcgKzIyNiw3IEBACiAJSU5UMzIJCWZuaXNsb3dlcmNhc2VkLHJldCxsZW47CiAJTFBTVFIJCXMsdDsKIAotCWRwcmludGZfaW5mbyhmaWxlLCJHZXRFeHBhbmRlZE5hbWUoJXMpXG4iLGluKTsKKwlUUkFDRShmaWxlLCIoJXMpXG4iLGluKTsKIAlmZD1PcGVuRmlsZTMyKGluLCZvZnMsT0ZfUkVBRCk7CiAJaWYgKGZkPT1IRklMRV9FUlJPUjMyKQogCQlyZXR1cm4gKElOVDMyKShJTlQxNilMWkVSUk9SX0JBRElOSEFORExFOwpAQCAtMzIyLDcgKzMyMiw3IEBACiAJc3RydWN0CWx6c3RhdGUJKmx6czsKIAogCWJ1Zj0oTFBCWVRFKXZidWY7Ci0JZHByaW50Zl9pbmZvKGZpbGUsIkxaUmVhZDMyKCVkLCVwLCVkKVxuIixmZCxidWYsdG9yZWFkKTsKKwlUUkFDRShmaWxlLCIoJWQsJXAsJWQpXG4iLGZkLGJ1Zix0b3JlYWQpOwogCWhvd211Y2g9dG9yZWFkOwogCWZvciAoaT0wO2k8bnJvZmx6c3RhdGVzO2krKykKIAkJaWYgKGx6c3RhdGVzW2ldLmx6ZmQ9PWZkKQpAQCAtNDI2LDcgKzQyNiw3IEBACiAJc3RydWN0CWx6c3RhdGUJKmx6czsKIAlMT05HCW5ld3dhbnRlZDsKIAotCWRwcmludGZfaW5mbyhmaWxlLCJMWlNlZWsoJWQsJWxkLCVkKVxuIixmZCxvZmYsdHlwZSk7CisJVFJBQ0UoZmlsZSwiKCVkLCVsZCwlZClcbiIsZmQsb2ZmLHR5cGUpOwogCWZvciAoaT0wO2k8bnJvZmx6c3RhdGVzO2krKykKIAkJaWYgKGx6c3RhdGVzW2ldLmx6ZmQ9PWZkKQogCQkJYnJlYWs7CkBAIC00NzksNyArNDc5LDcgQEAKIAlCWVRFCWJ1ZltCVUZMRU5dOwogCUlOVDMyCVdJTkFQSSAoKnhyZWFkKShIRklMRTMyLExQVk9JRCxVSU5UMzIpOwogCi0JZHByaW50Zl9pbmZvKGZpbGUsIkxaQ29weSglZCwlZClcbiIsc3JjLGRlc3QpOworCVRSQUNFKGZpbGUsIiglZCwlZClcbiIsc3JjLGRlc3QpOwogCWZvciAoaT0wO2k8bnJvZmx6c3RhdGVzO2krKykKIAkJaWYgKHNyYz09bHpzdGF0ZXNbaV0ubHpmZCkKIAkJCWJyZWFrOwpAQCAtNTQ1LDcgKzU0NSw3IEBACiB7CiAJSEZJTEUzMglmZCxjZmQ7CiAKLQlkcHJpbnRmX2luZm8oZmlsZSwiTFpPcGVuRmlsZSglcywlcCwlZClcbiIsZm4sb2ZzLG1vZGUpOworCVRSQUNFKGZpbGUsIiglcywlcCwlZClcbiIsZm4sb2ZzLG1vZGUpOwogCS8qIDB4NzAgcmVwcmVzZW50cyBhbGwgT0ZfU0hBUkVfKiBmbGFncywgaWdub3JlIHRoZW0gZm9yIHRoZSBjaGVjayAqLwogCWZkPU9wZW5GaWxlMzIoZm4sb2ZzLG1vZGUpOwogCWlmIChmZD09SEZJTEVfRVJST1IzMikKQEAgLTYwMyw3ICs2MDMsNyBAQAogewogCWludAlpOwogCi0JZHByaW50Zl9pbmZvKGZpbGUsIkxaQ2xvc2UoJWQpXG4iLGZkKTsKKwlUUkFDRShmaWxlLCIoJWQpXG4iLGZkKTsKIAlmb3IgKGk9MDtpPG5yb2ZsenN0YXRlcztpKyspCiAJCWlmIChsenN0YXRlc1tpXS5semZkPT1mZCkKIAkJCWJyZWFrOwpAQCAtNjI2LDcgKzYyNiw3IEBACiAgKi8KIExPTkcgV0lOQVBJIENvcHlMWkZpbGUxNiggSEZJTEUxNiBzcmMsIEhGSUxFMTYgZGVzdCApCiB7Ci0gICAgZHByaW50Zl9pbmZvKGZpbGUsIkNvcHlMWkZpbGUxNiglZCwlZClcbiIsc3JjLGRlc3QpOworICAgIFRSQUNFKGZpbGUsIiglZCwlZClcbiIsc3JjLGRlc3QpOwogICAgIHJldHVybiBMWkNvcHkzMihzcmMsZGVzdCk7CiB9CiAKQEAgLTYzOSw2ICs2MzksNiBAQAogICovCiBMT05HIFdJTkFQSSBDb3B5TFpGaWxlMzIoIEhGSUxFMzIgc3JjLCBIRklMRTMyIGRlc3QgKQogewotICAgIGRwcmludGZfaW5mbyhmaWxlLCJDb3B5TFpGaWxlMzIoJWQsJWQpXG4iLHNyYyxkZXN0KTsKKyAgICBUUkFDRShmaWxlLCIoJWQsJWQpXG4iLHNyYyxkZXN0KTsKICAgICByZXR1cm4gTFpDb3B5MzIoc3JjLGRlc3QpOwogfQpkaWZmIC0tZ2l0IGEvbWlzYy9yZWdpc3RyeS5jIGIvbWlzYy9yZWdpc3RyeS5jCmluZGV4IDNlNDc4NTEuLjNmN2FjMDMgMTAwNjQ0Ci0tLSBhL21pc2MvcmVnaXN0cnkuYworKysgYi9taXNjL3JlZ2lzdHJ5LmMKQEAgLTUwLDcgKzUwLDcgQEAKIHsKICAgICBMUFdTVFIgICBuYW1lOyAgICAgICAgICAvKiBuYW1lIG9mIHZhbHVlIChVTklDT0RFKSBvciBOVUxMIGZvciB3aW4zMSAqLwogICAgIERXT1JEICAgIHR5cGU7ICAgICAgICAgIC8qIHR5cGUgb2YgdmFsdWUgKi8KLSAgICBEV09SRCAgICBsZW47ICAgICAgICAgICAvKiBsZW5ndGggb2YgZGF0YSAqLworICAgIERXT1JEICAgIGxlbjsgICAgICAgICAgIC8qIGxlbmd0aCBvZiBkYXRhIGluIEJZVEVzICovCiAgICAgRFdPUkQgICAgbGFzdG1vZGlmaWVkOyAgLyogdGltZSBvZiBzZWNvbmRzIHNpbmNlIDEuMS4xOTcwICovCiAgICAgTFBCWVRFICAgZGF0YTsgICAgICAgICAgLyogY29udGVudCwgbWF5IGJlIHN0cmluZ3MsIGJpbmFyaWVzLCBldGMuICovCiB9IEtFWVZBTFVFLCpMUEtFWVZBTFVFOwpAQCAtMTE3LDEwICsxMTcsMTAgQEAKIAogCWZvciAoaT0wO2k8bnJvZm9wZW5oYW5kbGVzO2krKykgewogCQlpZiAob3BlbmhhbmRsZXNbaV0ubHBrZXk9PWxwa2V5KSB7Ci0JCQlkcHJpbnRmX3dhcm4ocmVnLCAiYWRkX2hhbmRsZTpUcmllZCB0byBhZGQgJXAgdHdpY2UhXG4iLGxwa2V5KTsKKwkJCVdBUk4ocmVnLCAiVHJpZWQgdG8gYWRkICVwIHR3aWNlIVxuIixscGtleSk7CiAJCX0KIAkJaWYgKG9wZW5oYW5kbGVzW2ldLmhrZXk9PWhrZXkpIHsKLQkJCWRwcmludGZfd2FybihyZWcsICJhZGRfaGFuZGxlOlRyaWVkIHRvIGFkZCAlbHggdHdpY2UhXG4iLChMT05HKWhrZXkpOworCQkJV0FSTihyZWcsICJUcmllZCB0byBhZGQgJWx4IHR3aWNlIVxuIiwoTE9ORyloa2V5KTsKIAkJfQogCX0KIAlvcGVuaGFuZGxlcz14cmVhbGxvYygJb3BlbmhhbmRsZXMsCkBAIC0xMzksNyArMTM5LDcgQEAKIAlmb3IgKGk9MDtpPG5yb2ZvcGVuaGFuZGxlcztpKyspCiAJCWlmIChvcGVuaGFuZGxlc1tpXS5oa2V5PT1oa2V5KQogCQkJcmV0dXJuIG9wZW5oYW5kbGVzW2ldLmxwa2V5OwotCWRwcmludGZfd2FybihyZWcsICJnZXRfaGFuZGxlOkRpZG4ndCBmaW5kIGhhbmRsZSAlbHg/XG4iLChMT05HKWhrZXkpOworCVdBUk4ocmVnLCAiRGlkbid0IGZpbmQgaGFuZGxlICVseD9cbiIsKExPTkcpaGtleSk7CiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTE1MSw3ICsxNTEsNyBAQAogCQlpZiAob3BlbmhhbmRsZXNbaV0uaGtleT09aGtleSkKIAkJCWJyZWFrOwogCWlmIChpPT1ucm9mb3BlbmhhbmRsZXMpIHsKLQkJZHByaW50Zl93YXJuKHJlZywgInJlbW92ZV9oYW5kbGU6RGlkbid0IGZpbmQgaGFuZGxlICUwOHg/XG4iLGhrZXkpOworCQlXQVJOKHJlZywgIkRpZG4ndCBmaW5kIGhhbmRsZSAlMDh4P1xuIixoa2V5KTsKIAkJcmV0dXJuOwogCX0KIAltZW1jcHkoCW9wZW5oYW5kbGVzK2ksCkBAIC0xOTksNyArMTk5LDcgQEAKIAljYXNlIEhLRVlfQ1VSUkVOVF9DT05GSUc6CiAJCXJldHVybiBrZXlfY3VycmVudF9jb25maWc7CiAJZGVmYXVsdDoKLQkJZHByaW50Zl93YXJuKHJlZywgImxvb2t1cF9oa2V5KCVseCksIHNwZWNpYWwga2V5IVxuIiwKKwkJV0FSTihyZWcsICIoJWx4KSwgc3BlY2lhbCBrZXkhXG4iLAogCQkJKExPTkcpaGtleQogCQkpOwogCQlyZXR1cm4gZ2V0X2hhbmRsZShoa2V5KTsKQEAgLTgwNiw3ICs4MDYsNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAJaWYgKHZlciE9UkVHSVNUUllfU0FWRV9WRVJTSU9OKSB7Ci0JCWRwcmludGZfaW5mbyhyZWcsX19GSUxFX18iOl93aW5lX2xvYWRzdWJyZWc6T2xkIGZvcm1hdCAoJWQpIHJlZ2lzdHJ5IGZvdW5kLCBpZ25vcmluZyBpdC4gKGJ1ZiB3YXMgJXMpLlxuIix2ZXIsYnVmKTsKKwkJVFJBQ0UocmVnLCJPbGQgZm9ybWF0ICglZCkgcmVnaXN0cnkgZm91bmQsIGlnbm9yaW5nIGl0LiAoYnVmIHdhcyAlcykuXG4iLHZlcixidWYpOwogCQlmcmVlKGJ1Zik7CiAJCXJldHVybiAwOwogCX0KQEAgLTgyOCw3ICs4MjgsNyBAQAogCiAJRj1mb3BlbihmbiwicmIiKTsKIAlpZiAoRj09TlVMTCkgewotCQlkcHJpbnRmX3dhcm4ocmVnLCJDb3VsZG4ndCBvcGVuICVzIGZvciByZWFkaW5nOiAlc1xuIiwKKwkJV0FSTihyZWcsIkNvdWxkbid0IG9wZW4gJXMgZm9yIHJlYWRpbmc6ICVzXG4iLAogCQkgICAgICAgZm4sc3RyZXJyb3IoZXJybm8pCiAJCSk7CiAJCXJldHVybjsKQEAgLTk5Niw3ICs5OTYsNyBAQAogewogICAgTFBXU1RSIGRlc3QgPSB4bWFsbG9jICgyICogbmNoYXJzICsgMik7CiAKLSAgIGxzdHJjcHluQXRvVyhkZXN0LHNyYywgbmNoYXJzKTsKKyAgIGxzdHJjcHluQXRvVyhkZXN0LHNyYyxuY2hhcnMrMSk7CiAgICBkZXN0W25jaGFyc10gPSAwOwogICAgcmV0dXJuIGRlc3Q7CiB9CkBAIC0xMDg4LDcgKzEwODgsNyBAQAogCiAJICBpZiAoKDEgPDwgZGt2LnR5cGUpICYgVU5JQ09OVk1BU0spIHsKIAkgICAgZGF0YSA9IChMUEJZVEUpIHN0cmN2dEEyVyhjdXJkYXRhLCBka3YudmFsZGF0YWxlbik7Ci0JICAgIGxlbiA9IGRrdi52YWxkYXRhbGVuICsgMTsKKwkgICAgbGVuID0gMiooZGt2LnZhbGRhdGFsZW4gKyAxKTsKIAkgIH0gZWxzZSB7CiAJICAgIC8qIEkgZG9uJ3QgdGhpbmsgd2Ugd2FudCB0byBOVUxMIHRlcm1pbmF0ZSBhbGwgZGF0YSAqLwogCSAgICBkYXRhID0geG1hbGxvYyhka3YudmFsZGF0YWxlbik7CkBAIC0xMTY4LDcgKzExNjgsNyBAQAogCU9GU1RSVUNUCW9mczsKIAlCWV9IQU5ETEVfRklMRV9JTkZPUk1BVElPTiBoZmRpbmZvOwogCi0JZHByaW50Zl9pbmZvKHJlZywiTG9hZGluZyBXaW45NSByZWdpc3RyeSBkYXRhYmFzZSAnJXMnXG4iLGZuKTsKKwlUUkFDRShyZWcsIkxvYWRpbmcgV2luOTUgcmVnaXN0cnkgZGF0YWJhc2UgJyVzJ1xuIixmbik7CiAJaGZkPU9wZW5GaWxlMzIoZm4sJm9mcyxPRl9SRUFEKTsKIAlpZiAoaGZkPT1IRklMRV9FUlJPUjMyKQogCQlyZXR1cm47CkBAIC0xMTg4LDcgKzExODgsNyBAQAogCWlmICg0IT1fbHJlYWQzMihoZmQsbWFnaWMsNCkpCiAJCXJldHVybjsKIAlpZiAoc3RyY21wKG1hZ2ljLCJSR0tOIikpIHsKLQkJZHByaW50Zl93YXJuKHJlZywgInNlY29uZCBJRkYgaGVhZGVyIG5vdCBSR0tOLCBidXQgJXNcbiIsIG1hZ2ljKTsKKwkJV0FSTihyZWcsICJzZWNvbmQgSUZGIGhlYWRlciBub3QgUkdLTiwgYnV0ICVzXG4iLCBtYWdpYyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTEzNTMsNyArMTM1Myw3IEBACiAJCQkJfQogCQkJfQogCQl9IGVsc2UgewotCQkJZHByaW50Zl9pbmZvKHJlZywiX193MzFfZHVtcHRyZWU6c3RyYW5nZTogbm8gZGlyZWN0b3J5IGtleSBuYW1lLCBpZHg9JTA0eFxuIiwgaWR4KTsKKwkJCVRSQUNFKHJlZywic3RyYW5nZTogbm8gZGlyZWN0b3J5IGtleSBuYW1lLCBpZHg9JTA0eFxuIiwgaWR4KTsKIAkJfQogCQlfX3czMV9kdW1wdHJlZShkaXItPmNoaWxkX2lkeCx0eHQsdGFiLGhlYWQseGxwa2V5LGxhc3Rtb2RpZmllZCxsZXZlbCsxKTsKIAkJaWR4PWRpci0+c2libGluZ19pZHg7CkBAIC0xMzc5LDEyICsxMzc5LDEyIEBACiAKIAkvKiByZWFkICYgZHVtcCBoZWFkZXIgKi8KIAlpZiAoc2l6ZW9mKGhlYWQpIT1fbHJlYWQzMihoZiwmaGVhZCxzaXplb2YoaGVhZCkpKSB7Ci0JCWRwcmludGZfZXJyKHJlZywgIl93MzFfbG9hZHJlZzpyZWcuZGF0IGlzIHRvbyBzaG9ydC5cbiIpOworCQlFUlIocmVnLCAicmVnLmRhdCBpcyB0b28gc2hvcnQuXG4iKTsKIAkJX2xjbG9zZTMyKGhmKTsKIAkJcmV0dXJuOwogCX0KIAlpZiAobWVtY21wKGhlYWQuY29va2llLCAiU0hDQzMuMTAiLCBzaXplb2YoaGVhZC5jb29raWUpKSE9MCkgewotCQlkcHJpbnRmX2VycihyZWcsICJfdzMxX2xvYWRyZWc6cmVnLmRhdCBoYXMgYmFkIHNpZ25hdHVyZS5cbiIpOworCQlFUlIocmVnLCAicmVnLmRhdCBoYXMgYmFkIHNpZ25hdHVyZS5cbiIpOwogCQlfbGNsb3NlMzIoaGYpOwogCQlyZXR1cm47CiAJfQpAQCAtMTM5Myw3ICsxMzkzLDcgQEAKIAkvKiByZWFkIGFuZCBkdW1wIGluZGV4IHRhYmxlICovCiAJdGFiID0geG1hbGxvYyhsZW4pOwogCWlmIChsZW4hPV9scmVhZDMyKGhmLHRhYixsZW4pKSB7Ci0JCWRwcmludGZfZXJyKHJlZywiX3czMV9sb2FkcmVnOmNvdWxkbid0IHJlYWQgJWQgYnl0ZXMuXG4iLGxlbik7IAorCQlFUlIocmVnLCJjb3VsZG4ndCByZWFkICVkIGJ5dGVzLlxuIixsZW4pOyAKIAkJZnJlZSh0YWIpOwogCQlfbGNsb3NlMzIoaGYpOwogCQlyZXR1cm47CkBAIC0xNDAyLDE0ICsxNDAyLDE0IEBACiAJLyogcmVhZCB0ZXh0ICovCiAJdHh0ID0geG1hbGxvYyhoZWFkLnRleHRzaXplKTsKIAlpZiAoLTE9PV9sbHNlZWszMihoZixoZWFkLnRleHRvZmYsU0VFS19TRVQpKSB7Ci0JCWRwcmludGZfZXJyKHJlZywiX3czMV9sb2FkcmVnOmNvdWxkbid0IHNlZWsgdG8gdGV4dGJsb2NrLlxuIik7IAorCQlFUlIocmVnLCJjb3VsZG4ndCBzZWVrIHRvIHRleHRibG9jay5cbiIpOyAKIAkJZnJlZSh0YWIpOwogCQlmcmVlKHR4dCk7CiAJCV9sY2xvc2UzMihoZik7CiAJCXJldHVybjsKIAl9CiAJaWYgKGhlYWQudGV4dHNpemUhPV9scmVhZDMyKGhmLHR4dCxoZWFkLnRleHRzaXplKSkgewotCQlkcHJpbnRmX2VycihyZWcsIl93MzFfbG9hZHJlZzp0ZXh0YmxvY2sgdG9vIHNob3J0ICglZCBpbnN0ZWFkIG9mICVsZCkuXG4iLGxlbixoZWFkLnRleHRzaXplKTsgCisJCUVSUihyZWcsInRleHRibG9jayB0b28gc2hvcnQgKCVkIGluc3RlYWQgb2YgJWxkKS5cbiIsbGVuLGhlYWQudGV4dHNpemUpOyAKIAkJZnJlZSh0YWIpOwogCQlmcmVlKHR4dCk7CiAJCV9sY2xvc2UzMihoZik7CkBAIC0xNDE3LDcgKzE0MTcsNyBAQAogCX0KIAogCWlmICghR2V0RmlsZUluZm9ybWF0aW9uQnlIYW5kbGUoaGYsJmhmaW5mbykpIHsKLQkJZHByaW50Zl9lcnIocmVnLCJfdzMxX2xvYWRyZWc6R2V0RmlsZUluZm9ybWF0aW9uQnlIYW5kbGUgZmFpbGVkPy5cbiIpOyAKKwkJRVJSKHJlZywiR2V0RmlsZUluZm9ybWF0aW9uQnlIYW5kbGUgZmFpbGVkPy5cbiIpOyAKIAkJZnJlZSh0YWIpOwogCQlmcmVlKHR4dCk7CiAJCV9sY2xvc2UzMihoZik7CkBAIC0xNTI5LDcgKzE1MjksNyBAQAogCUxQS0VZU1RSVUNUCWxwTmV4dEtleSxscHhrZXk7CiAJTFBXU1RSCQkqd3BzOwogCWludAkJd3BjLGk7Ci0JZHByaW50Zl9pbmZvKHJlZywiUmVnT3BlbktleUV4MzJXKCVseCwlcywlbGQsJWx4LCVwKVxuIiwKKwlUUkFDRShyZWcsIiglbHgsJXMsJWxkLCVseCwlcClcbiIsCiAJCShMT05HKWhrZXksVzJDKGxwc3pTdWJLZXksMCksZHdSZXNlcnZlZCxzYW1EZXNpcmVkLHJldGtleQogCSk7CiAKQEAgLTE1NzEsNyArMTU3MSw3IEBACiAJTFBDV1NUUglscHN6U3ViS2V5LAogCUxQSEtFWQlyZXRrZXkKICkgewotCWRwcmludGZfaW5mbyhyZWcsIlJlZ09wZW5LZXkzMlcoJWx4LCVzLCVwKVxuIiwKKwlUUkFDRShyZWcsIiglbHgsJXMsJXApXG4iLAogCQkoTE9ORyloa2V5LFcyQyhscHN6U3ViS2V5LDApLHJldGtleQogCSk7CiAJcmV0dXJuIFJlZ09wZW5LZXlFeDMyVyhoa2V5LGxwc3pTdWJLZXksMCxLRVlfQUxMX0FDQ0VTUyxyZXRrZXkpOwpAQCAtMTU4OSw3ICsxNTg5LDcgQEAKIAlMUFdTVFIJbHBzelN1YktleVc7CiAJRFdPUkQJcmV0OwogCi0JZHByaW50Zl9pbmZvKHJlZywiUmVnT3BlbktleUV4MzJBKCVseCwlcywlbGQsJWx4LCVwKVxuIiwKKwlUUkFDRShyZWcsIiglbHgsJXMsJWxkLCVseCwlcClcbiIsCiAJCShMT05HKWhrZXksbHBzelN1YktleSxkd1Jlc2VydmVkLHNhbURlc2lyZWQscmV0a2V5CiAJKTsKIAlpZiAobHBzelN1YktleSkKQEAgLTE2MDgsNyArMTYwOCw3IEBACiAJTFBDU1RSCWxwc3pTdWJLZXksCiAJTFBIS0VZCXJldGtleQogKSB7Ci0JZHByaW50Zl9pbmZvKHJlZywiUmVnT3BlbktleTMyQSglbHgsJXMsJXApXG4iLAorCVRSQUNFKHJlZywiKCVseCwlcywlcClcbiIsCiAJCShMT05HKWhrZXksbHBzelN1YktleSxyZXRrZXkKIAkpOwogCXJldHVybglSZWdPcGVuS2V5RXgzMkEoaGtleSxscHN6U3ViS2V5LDAsS0VZX0FMTF9BQ0NFU1MscmV0a2V5KTsKQEAgLTE2MjAsNyArMTYyMCw3IEBACiAJTFBDU1RSCWxwc3pTdWJLZXksCiAJTFBIS0VZCXJldGtleQogKSB7Ci0JZHByaW50Zl9pbmZvKHJlZywiUmVnT3BlbktleTE2KCVseCwlcywlcClcbiIsCisJVFJBQ0UocmVnLCIoJWx4LCVzLCVwKVxuIiwKIAkJKExPTkcpaGtleSxscHN6U3ViS2V5LHJldGtleQogCSk7CiAJcmV0dXJuIFJlZ09wZW5LZXkzMkEoaGtleSxscHN6U3ViS2V5LHJldGtleSk7CkBAIC0xNjU2LDcgKzE2NTYsNyBAQAogCWludAkJd3BjLGk7CiAKIC8qRklYTUU6IGhhbmRsZSBzZWN1cml0eS9hY2Nlc3Mvd2hhdGV2ZXIgKi8KLQlkcHJpbnRmX2luZm8ocmVnLCJSZWdDcmVhdGVLZXlFeDMyVyglbHgsJXMsJWxkLCVzLCVseCwlbHgsJXAsJXAsJXApXG4iLAorCVRSQUNFKHJlZywiKCVseCwlcywlbGQsJXMsJWx4LCVseCwlcCwlcCwlcClcbiIsCiAJCShMT05HKWhrZXksCiAJCVcyQyhscHN6U3ViS2V5LDApLAogCQlkd1Jlc2VydmVkLApAQCAtMTc1Miw3ICsxNzUyLDcgQEAKICkgewogCURXT1JECWp1bmsscmV0OwogCi0JZHByaW50Zl9pbmZvKHJlZywiUmVnQ3JlYXRlS2V5MzJXKCVseCwlcywlcClcbiIsCisJVFJBQ0UocmVnLCIoJWx4LCVzLCVwKVxuIiwKIAkJKExPTkcpaGtleSxXMkMobHBzelN1YktleSwwKSxyZXRrZXkKIAkpOwogCXJldD1SZWdDcmVhdGVLZXlFeDMyVygKQEAgLTE3ODQsNyArMTc4NCw3IEBACiAJTFBXU1RSCWxwc3pTdWJLZXlXLGxwc3pDbGFzc1c7CiAJRFdPUkQJcmV0OwogCi0JZHByaW50Zl9pbmZvKHJlZywiUmVnQ3JlYXRlS2V5RXgzMkEoJWx4LCVzLCVsZCwlcywlbHgsJWx4LCVwLCVwLCVwKVxuIiwKKwlUUkFDRShyZWcsIiglbHgsJXMsJWxkLCVzLCVseCwlbHgsJXAsJXAsJXApXG4iLAogCQkoTE9ORyloa2V5LAogCQlscHN6U3ViS2V5LAogCQlkd1Jlc2VydmVkLApAQCAtMTgyOSw3ICsxODI5LDcgQEAKICkgewogCURXT1JECWp1bms7CiAKLQlkcHJpbnRmX2luZm8ocmVnLCJSZWdDcmVhdGVLZXkzMkEoJWx4LCVzLCVwKVxuIiwKKwlUUkFDRShyZWcsIiglbHgsJXMsJXApXG4iLAogCQkoTE9ORyloa2V5LGxwc3pTdWJLZXkscmV0a2V5CiAJKTsKIAlyZXR1cm4JUmVnQ3JlYXRlS2V5RXgzMkEoCkBAIC0xODUxLDcgKzE4NTEsNyBAQAogCUxQQ1NUUglscHN6U3ViS2V5LAogCUxQSEtFWQlyZXRrZXkKICkgewotCWRwcmludGZfaW5mbyhyZWcsIlJlZ0NyZWF0ZUtleTE2KCVseCwlcywlcClcbiIsCisJVFJBQ0UocmVnLCIoJWx4LCVzLCVwKVxuIiwKIAkJKExPTkcpaGtleSxscHN6U3ViS2V5LHJldGtleQogCSk7CiAJcmV0dXJuIFJlZ0NyZWF0ZUtleTMyQShoa2V5LGxwc3pTdWJLZXkscmV0a2V5KTsKQEAgLTE4ODEsMTAgKzE4ODEsOSBAQAogCUxQS0VZU1RSVUNUCWxwa2V5OwogCWludAkJaTsKIAotCWRwcmludGZfaW5mbyhyZWcsIlJlZ1F1ZXJ5VmFsdWVFeDMyVygleCwlcywlcCwlcCwlcCwlbGQpXG4iLAotCQloa2V5LFcyQyhscHN6VmFsdWVOYW1lLDApLGxwZHdSZXNlcnZlZCxscGR3VHlwZSxscGJEYXRhLAotCQlscGNiRGF0YT8qbHBjYkRhdGE6MAotCSk7CisJVFJBQ0UocmVnLCIoJXgsJXMsJXAsJXAsJXAsJWxkKVxuIiwKKwkJICAgICBoa2V5LFcyQyhscHN6VmFsdWVOYW1lLDApLGxwZHdSZXNlcnZlZCxscGR3VHlwZSxscGJEYXRhLAorCQkgICAgIGxwY2JEYXRhPypscGNiRGF0YTowKTsKIAogCWxwa2V5CT0gbG9va3VwX2hrZXkoaGtleSk7CiAJaWYgKCFscGtleSkKQEAgLTE5MjMsOCArMTkyMiw3IEBACiAJCXJldHVybiBTSEVMTF9FUlJPUl9TVUNDRVNTOwogCX0KIAlpZiAoKmxwY2JEYXRhPGxwa2V5LT52YWx1ZXNbaV0ubGVuKSB7Ci0JCSooV0NIQVIqKWxwYkRhdGEKLQkJCT0gMDsKKwkJKihXQ0hBUiopbHBiRGF0YT0gMDsKIAkJKmxwY2JEYXRhCT0gbHBrZXktPnZhbHVlc1tpXS5sZW47CiAJCXJldHVybiBFUlJPUl9NT1JFX0RBVEE7CiAJfQpAQCAtMTk0MywxMCArMTk0MSw5IEBACiAJSEtFWQl4aGtleTsKIAlEV09SRAlyZXQsbHBkd1R5cGU7CiAKLQlkcHJpbnRmX2luZm8ocmVnLCJSZWdRdWVyeVZhbHVlMzJXKCV4LCVzLCVwLCVsZClcbiIsCi0JCWhrZXksVzJDKGxwc3pTdWJLZXksMCksbHBzekRhdGEsCi0JCWxwY2JEYXRhPypscGNiRGF0YTowCi0JKTsKKwlUUkFDRShyZWcsIigleCwlcywlcCwlbGQpXG4iLAorCQkgICAgIGhrZXksVzJDKGxwc3pTdWJLZXksMCksbHBzekRhdGEsCisJCSAgICAgbHBjYkRhdGE/KmxwY2JEYXRhOjApOwogCiAJLyogb25seSBvcGVuIHN1YmtleSwgaWYgd2UgcmVhbGx5IGRvIGRlc2NlbmQgKi8KIAlpZiAobHBzelN1YktleSAmJiAqbHBzelN1YktleSkgewpAQCAtMTk4NSwxMCArMTk4MiwxMCBAQAogCURXT1JECSpteWxlbjsKIAlEV09SRAl0eXBlOwogCi0JZHByaW50Zl9pbmZvKHJlZywiUmVnUXVlcnlWYWx1ZUV4MzJBKCV4LCVzLCVwLCVwLCVwLCVsZClcbiIsCi0JCWhrZXksbHBzelZhbHVlTmFtZSxscGR3UmVzZXJ2ZWQsbHBkd1R5cGUsbHBiRGF0YSwKLQkJbHBjYkRhdGE/KmxwY2JEYXRhOjAKLQkpOworCVRSQUNFKHJlZywiKCV4LCVzLCVwLCVwLCVwLCVsZClcbiIsCisJCSAgICAgaGtleSxscHN6VmFsdWVOYW1lLGxwZHdSZXNlcnZlZCxscGR3VHlwZSxscGJEYXRhLAorCQkgICAgIGxwY2JEYXRhPypscGNiRGF0YTowKTsKKwogCWlmIChscHN6VmFsdWVOYW1lKQogCQlscHN6VmFsdWVOYW1lVz1zdHJkdXBBMlcobHBzelZhbHVlTmFtZSk7CiAJZWxzZSAKQEAgLTIwNzAsMTAgKzIwNjcsMTAgQEAKIAlMUEJZVEUJbHBiRGF0YSwKIAlMUERXT1JECWxwY2JEYXRhCiApIHsKLQlkcHJpbnRmX2luZm8ocmVnLCJSZWdRdWVyeVZhbHVlRXgxNigleCwlcywlcCwlcCwlcCwlbGQpXG4iLAotCQloa2V5LGxwc3pWYWx1ZU5hbWUsbHBkd1Jlc2VydmVkLGxwZHdUeXBlLGxwYkRhdGEsCi0JCWxwY2JEYXRhPypscGNiRGF0YTowCi0JKTsKKwlUUkFDRShyZWcsIigleCwlcywlcCwlcCwlcCwlbGQpXG4iLAorCQkgICAgIGhrZXksbHBzelZhbHVlTmFtZSxscGR3UmVzZXJ2ZWQsbHBkd1R5cGUsbHBiRGF0YSwKKwkJICAgICBscGNiRGF0YT8qbHBjYkRhdGE6MCk7CisKIAlyZXR1cm4gUmVnUXVlcnlWYWx1ZUV4MzJBKAogCQloa2V5LAogCQlscHN6VmFsdWVOYW1lLApAQCAtMjA5NCwxMCArMjA5MSw5IEBACiAJSEtFWQl4aGtleTsKIAlEV09SRAlyZXQsbHBkd1R5cGU7CiAKLQlkcHJpbnRmX2luZm8ocmVnLCJSZWdRdWVyeVZhbHVlMzJBKCV4LCVzLCVwLCVsZClcbiIsCi0JCWhrZXksbHBzelN1YktleSxscHN6RGF0YSwKLQkJbHBjYkRhdGE/KmxwY2JEYXRhOjAKLQkpOworCVRSQUNFKHJlZywiKCV4LCVzLCVwLCVsZClcbiIsCisJCSAgICAgaGtleSxscHN6U3ViS2V5LGxwc3pEYXRhLAorCQkgICAgIGxwY2JEYXRhPypscGNiRGF0YTowKTsKIAogCS8qIG9ubHkgb3BlbiBzdWJrZXksIGlmIHdlIHJlYWxseSBkbyBkZXNjZW5kICovCiAJaWYgKGxwc3pTdWJLZXkgJiYgKmxwc3pTdWJLZXkpIHsKQEAgLTIxMjgsOSArMjEyNCw5IEBACiAJTFBTVFIJbHBzekRhdGEsCiAJTFBEV09SRAlscGNiRGF0YQogKSB7Ci0JZHByaW50Zl9pbmZvKHJlZywiUmVnUXVlcnlWYWx1ZTE2KCV4LCVzLCVwLCVsZClcbiIsCi0JCWhrZXksbHBzelN1YktleSxscHN6RGF0YSxscGNiRGF0YT8qbHBjYkRhdGE6MAotCSk7CisJVFJBQ0UocmVnLCIoJXgsJXMsJXAsJWxkKVxuIiwKKwkJICAgICBoa2V5LGxwc3pTdWJLZXksbHBzekRhdGEsbHBjYkRhdGE/KmxwY2JEYXRhOjApOworCiAJLyogSEFDSzogdGhlIDE2Yml0IFJlZ1F1ZXJ5VmFsdWUgZG9lc24ndCBoYW5kbGUgc2VsZWN0b3JibG9ja3MKIAkgKiAgICAgICBhbnl3YXksIHNvIHdlIGp1c3QgbWFzayBvdXQgdGhlIGhpZ2ggMTYgYml0LgogCSAqICAgICAgICh0aGlzIChub3Qgc28gbXVjaCBpbmNpZGVudGx5OykgaG9wZWZ1bGx5IGZpeGVzIEFsZHVzIEZINCkKQEAgLTIxNjAsNyArMjE1Niw3IEBACiAJTFBLRVlTVFJVQ1QJbHBrZXk7CiAJaW50CQlpOwogCi0JZHByaW50Zl9pbmZvKHJlZywiUmVnU2V0VmFsdWVFeDMyVygleCwlcywlbGQsJWxkLCVwLCVsZClcbiIsCisJVFJBQ0UocmVnLCIoJXgsJXMsJWxkLCVsZCwlcCwlbGQpXG4iLAogCQloa2V5LFcyQyhscHN6VmFsdWVOYW1lLDApLGR3UmVzZXJ2ZWQsZHdUeXBlLGxwYkRhdGEsY2JEYXRhCiAJKTsKIAkvKiB3ZSBubyBsb25nZXIgY2FyZSBhYm91dCB0aGUgbHBiRGF0YSB0eXBlIGhlcmUuLi4gKi8KQEAgLTIyMTcsNyArMjIxMyw3IEBACiAJTFBXU1RSCWxwc3pWYWx1ZU5hbWVXOwogCURXT1JECXJldDsKIAotCWRwcmludGZfaW5mbyhyZWcsIlJlZ1NldFZhbHVlRXgzMkEoJXgsJXMsJWxkLCVsZCwlcCwlbGQpXG4iLAorCVRSQUNFKHJlZywiKCV4LCVzLCVsZCwlbGQsJXAsJWxkKVxuIiwKIAkJaGtleSxscHN6VmFsdWVOYW1lLGR3UmVzZXJ2ZWQsZHdUeXBlLGxwYkRhdGEsY2JEYXRhCiAJKTsKIAlpZiAoKDE8PGR3VHlwZSkgJiBVTklDT05WTUFTSykgewpAQCAtMjI0Niw3ICsyMjQyLDcgQEAKIAlMUEJZVEUJbHBiRGF0YSwKIAlEV09SRAljYkRhdGEKICkgewotCWRwcmludGZfaW5mbyhyZWcsIlJlZ1NldFZhbHVlRXgxNigleCwlcywlbGQsJWxkLCVwLCVsZClcbiIsCisJVFJBQ0UocmVnLCIoJXgsJXMsJWxkLCVsZCwlcCwlbGQpXG4iLAogCQloa2V5LGxwc3pWYWx1ZU5hbWUsZHdSZXNlcnZlZCxkd1R5cGUsbHBiRGF0YSxjYkRhdGEKIAkpOwogCXJldHVybiBSZWdTZXRWYWx1ZUV4MzJBKGhrZXksbHBzelZhbHVlTmFtZSxkd1Jlc2VydmVkLGR3VHlwZSxscGJEYXRhLGNiRGF0YSk7CkBAIC0yMjYzLDcgKzIyNTksNyBAQAogCUhLRVkJeGhrZXk7CiAJRFdPUkQJcmV0OwogCi0JZHByaW50Zl9pbmZvKHJlZywiUmVnU2V0VmFsdWUzMlcoJXgsJXMsJWxkLCVzLCVsZClcbiIsCisJVFJBQ0UocmVnLCIoJXgsJXMsJWxkLCVzLCVsZClcbiIsCiAJCWhrZXksVzJDKGxwc3pTdWJLZXksMCksZHdUeXBlLFcyQyhscHN6RGF0YSwwKSxjYkRhdGEKIAkpOwogCWlmIChscHN6U3ViS2V5ICYmICpscHN6U3ViS2V5KSB7CkBAIC0yMjc3LDcgKzIyNzMsNyBAQAogCQlkd1R5cGU9UkVHX1NaOwogCX0KIAlpZiAoY2JEYXRhIT0yKmxzdHJsZW4zMlcobHBzekRhdGEpKzIpIHsKLQkJZHByaW50Zl9pbmZvKHJlZywiUmVnU2V0VmFsdWVYIGNhbGxlZCB3aXRoIGxlbj0lbGQgIT0gc3RybGVuKCVzKSsxPSVkIVxuIiwKKwkJVFJBQ0UocmVnLCJSZWdTZXRWYWx1ZVggY2FsbGVkIHdpdGggbGVuPSVsZCAhPSBzdHJsZW4oJXMpKzE9JWQhXG4iLAogCQkJY2JEYXRhLFcyQyhscHN6RGF0YSwwKSwyKmxzdHJsZW4zMlcobHBzekRhdGEpKzIKIAkJKTsKIAkJY2JEYXRhPTIqbHN0cmxlbjMyVyhscHN6RGF0YSkrMjsKQEAgLTIyOTksNyArMjI5NSw3IEBACiAJRFdPUkQJcmV0OwogCUhLRVkJeGhrZXk7CiAKLQlkcHJpbnRmX2luZm8ocmVnLCJSZWdTZXRWYWx1ZTMyQSgleCwlcywlbGQsJXMsJWxkKVxuIiwKKwlUUkFDRShyZWcsIigleCwlcywlbGQsJXMsJWxkKVxuIiwKIAkJaGtleSxscHN6U3ViS2V5LGR3VHlwZSxscHN6RGF0YSxjYkRhdGEKIAkpOwogCWlmIChscHN6U3ViS2V5ICYmICpscHN6U3ViS2V5KSB7CkBAIC0yMzEwLDcgKzIzMDYsNyBAQAogCQl4aGtleT1oa2V5OwogCiAJaWYgKGR3VHlwZSE9UkVHX1NaKSB7Ci0JCWRwcmludGZfaW5mbyhyZWcsIlJlZ1NldFZhbHVlQSBjYWxsZWQgd2l0aCBkd1R5cGU9JWxkIVxuIixkd1R5cGUpOworCQlUUkFDRShyZWcsIlJlZ1NldFZhbHVlQSBjYWxsZWQgd2l0aCBkd1R5cGU9JWxkIVxuIixkd1R5cGUpOwogCQlkd1R5cGU9UkVHX1NaOwogCX0KIAlpZiAoY2JEYXRhIT1zdHJsZW4obHBzekRhdGEpKzEpCkBAIC0yMzMwLDcgKzIzMjYsNyBAQAogCURXT1JECWNiRGF0YQogKSB7CiAJRFdPUkQJcmV0OwotCWRwcmludGZfaW5mbyhyZWcsIlJlZ1NldFZhbHVlMTYoJXgsJXMsJWxkLCVzLCVsZClcbiIsCisJVFJBQ0UocmVnLCIoJXgsJXMsJWxkLCVzLCVsZClcbiIsCiAJCWhrZXksbHBzelN1YktleSxkd1R5cGUsbHBzekRhdGEsY2JEYXRhCiAJKTsKIAlyZXQ9UmVnU2V0VmFsdWUzMkEoaGtleSxscHN6U3ViS2V5LGR3VHlwZSxscHN6RGF0YSxjYkRhdGEpOwpAQCAtMjM1OCw3ICsyMzU0LDcgQEAKICkgewogCUxQS0VZU1RSVUNUCWxwa2V5LGxweGtleTsKIAotCWRwcmludGZfaW5mbyhyZWcsIlJlZ0VudW1LZXlFeDMyVygleCwlbGQsJXAsJWxkLCVwLCVwLCVwLCVwKVxuIiwKKwlUUkFDRShyZWcsIigleCwlbGQsJXAsJWxkLCVwLCVwLCVwLCVwKVxuIiwKIAkJaGtleSxpU3Via2V5LGxwc3pOYW1lLCpscGNjaE5hbWUsbHBkd1Jlc2VydmVkLGxwc3pDbGFzcyxscGNjaENsYXNzLGZ0CiAJKTsKIAlscGtleT1sb29rdXBfaGtleShoa2V5KTsKQEAgLTIzNzgsNyArMjM3NCw3IEBACiAJbWVtY3B5KGxwc3pOYW1lLGxweGtleS0+a2V5bmFtZSxsc3RybGVuMzJXKGxweGtleS0+a2V5bmFtZSkqMisyKTsKIAlpZiAobHBzekNsYXNzKSB7CiAJCS8qIHdoYXQgc2hvdWxkIHdlIHdyaXRlIGludG8gaXQ/ICovCi0JCSpscHN6Q2xhc3MJCT0gMDsKKwkJKmxwc3pDbGFzcwk9IDA7CiAJCSpscGNjaENsYXNzCT0gMjsKIAl9CiAJcmV0dXJuIEVSUk9SX1NVQ0NFU1M7CkBAIC0yMzk0LDcgKzIzOTAsNyBAQAogKSB7CiAJRklMRVRJTUUJZnQ7CiAKLQlkcHJpbnRmX2luZm8ocmVnLCJSZWdFbnVtS2V5MzJXKCV4LCVsZCwlcCwlbGQpXG4iLAorCVRSQUNFKHJlZywiKCV4LCVsZCwlcCwlbGQpXG4iLAogCQloa2V5LGlTdWJrZXksbHBzek5hbWUsbHBjY2hOYW1lCiAJKTsKIAlyZXR1cm4gUmVnRW51bUtleUV4MzJXKGhrZXksaVN1YmtleSxscHN6TmFtZSwmbHBjY2hOYW1lLE5VTEwsTlVMTCxOVUxMLCZmdCk7CkBAIC0yNDE0LDcgKzI0MTAsNyBAQAogCUxQV1NUUglscHN6TmFtZVcsbHBzekNsYXNzVzsKIAogCi0JZHByaW50Zl9pbmZvKHJlZywiUmVnRW51bUtleUV4MzJBKCV4LCVsZCwlcCwlbGQsJXAsJXAsJXAsJXApXG4iLAorCVRSQUNFKHJlZywiKCV4LCVsZCwlcCwlbGQsJXAsJXAsJXAsJXApXG4iLAogCQloa2V5LGlTdWJrZXksbHBzek5hbWUsKmxwY2NoTmFtZSxscGR3UmVzZXJ2ZWQsbHBzekNsYXNzLGxwY2NoQ2xhc3MsZnQKIAkpOwogCWlmIChscHN6TmFtZSkgewpAQCAtMjQ2NSw3ICsyNDYxLDcgQEAKICkgewogCUZJTEVUSU1FCWZ0OwogCi0JZHByaW50Zl9pbmZvKHJlZywiUmVnRW51bUtleTMyQSgleCwlbGQsJXAsJWxkKVxuIiwKKwlUUkFDRShyZWcsIigleCwlbGQsJXAsJWxkKVxuIiwKIAkJaGtleSxpU3Via2V5LGxwc3pOYW1lLGxwY2NoTmFtZQogCSk7CiAJcmV0dXJuCVJlZ0VudW1LZXlFeDMyQSgKQEAgLTI0ODcsNyArMjQ4Myw3IEBACiAJTFBTVFIJbHBzek5hbWUsCiAJRFdPUkQJbHBjY2hOYW1lCiApIHsKLQlkcHJpbnRmX2luZm8ocmVnLCJSZWdFbnVtS2V5MTYoJXgsJWxkLCVwLCVsZClcbiIsCisJVFJBQ0UocmVnLCIoJXgsJWxkLCVwLCVsZClcbiIsCiAJCWhrZXksaVN1YmtleSxscHN6TmFtZSxscGNjaE5hbWUKIAkpOwogCXJldHVybiBSZWdFbnVtS2V5MzJBKGhrZXksaVN1YmtleSxscHN6TmFtZSxscGNjaE5hbWUpOwpAQCAtMjUxNCw3ICsyNTEwLDcgQEAKIAlMUEtFWVNUUlVDVAlscGtleTsKIAlMUEtFWVZBTFVFCXZhbDsKIAotCWRwcmludGZfaW5mbyhyZWcsIlJlZ0VudW1WYWx1ZTMyVygleCwlbGQsJXAsJXAsJXAsJXAsJXAsJXApXG4iLAorCVRSQUNFKHJlZywiKCV4LCVsZCwlcCwlcCwlcCwlcCwlcCwlcClcbiIsCiAJCWhrZXksaVZhbHVlLGxwc3pWYWx1ZSxscGNjaFZhbHVlLGxwZFJlc2VydmVkLGxwZHdUeXBlLGxwYkRhdGEsbHBjYkRhdGEKIAkpOwogCWxwa2V5ID0gbG9va3VwX2hrZXkoaGtleSk7CkBAIC0yNTYxLDcgKzI1NTcsNyBAQAogCUxQQllURQlscGJEYXRhVzsKIAlEV09SRAlyZXQsbHBjYkRhdGFXOwogCi0JZHByaW50Zl9pbmZvKHJlZywiUmVnRW51bVZhbHVlMzJBKCV4LCVsZCwlcCwlcCwlcCwlcCwlcCwlcClcbiIsCisJVFJBQ0UocmVnLCIoJXgsJWxkLCVwLCVwLCVwLCVwLCVwLCVwKVxuIiwKIAkJaGtleSxpVmFsdWUsbHBzelZhbHVlLGxwY2NoVmFsdWUsbHBkUmVzZXJ2ZWQsbHBkd1R5cGUsbHBiRGF0YSxscGNiRGF0YQogCSk7CiAKQEAgLTI2MTQsNyArMjYxMCw3IEBACiAJTFBCWVRFCWxwYkRhdGEsCiAJTFBEV09SRAlscGNiRGF0YQogKSB7Ci0JZHByaW50Zl9pbmZvKHJlZywiUmVnRW51bVZhbHVlKCV4LCVsZCwlcCwlcCwlcCwlcCwlcCwlcClcbiIsCisJVFJBQ0UocmVnLCIoJXgsJWxkLCVwLCVwLCVwLCVwLCVwLCVwKVxuIiwKIAkJaGtleSxpVmFsdWUsbHBzelZhbHVlLGxwY2NoVmFsdWUsbHBkUmVzZXJ2ZWQsbHBkd1R5cGUsbHBiRGF0YSxscGNiRGF0YQogCSk7CiAJcmV0dXJuIFJlZ0VudW1WYWx1ZTMyQSgKQEAgLTI2MzQsNyArMjYzMCw3IEBACiAgKi8KIC8qIFJlZ0Nsb3NlS2V5CQkJW1NIRUxMLjNdIFtLRVJORUwuMjIwXSBbQURWQVBJMzIuMTI2XSAqLwogRFdPUkQgV0lOQVBJIFJlZ0Nsb3NlS2V5KEhLRVkgaGtleSkgewotCWRwcmludGZfaW5mbyhyZWcsIlJlZ0Nsb3NlS2V5KCV4KVxuIixoa2V5KTsKKwlUUkFDRShyZWcsIigleClcbiIsaGtleSk7CiAJcmVtb3ZlX2hhbmRsZShoa2V5KTsKIAlyZXR1cm4gRVJST1JfU1VDQ0VTUzsKIH0KQEAgLTI2NTAsMTcgKzI2NDYsMTcgQEAKIAlMUFdTVFIJCSp3cHM7CiAJaW50CQl3cGMsaTsKIAotCWRwcmludGZfaW5mbyhyZWcsIlJlZ0RlbGV0ZUtleTMyVygleCwlcylcbiIsCisJVFJBQ0UocmVnLCIoJXgsJXMpXG4iLAogCQloa2V5LFcyQyhscHN6U3ViS2V5LDApCiAJKTsKIAlscE5leHRLZXkJPSBsb29rdXBfaGtleShoa2V5KTsKIAlpZiAoIWxwTmV4dEtleSkgewotCQlkcHJpbnRmX2luZm8ocmVnLCAiICBCYWRrZXlbMV0uXG4iKTsKKwkJVFJBQ0UocmVnLCAiICBCYWRrZXlbMV0uXG4iKTsKIAkJcmV0dXJuIFNIRUxMX0VSUk9SX0JBREtFWTsKIAl9CiAJLyogd2UgbmVlZCB0byBrbm93IHRoZSBwcmV2aW91cyBrZXkgaW4gdGhlIGhpZXIuICovCiAJaWYgKCFscHN6U3ViS2V5IHx8ICEqbHBzelN1YktleSkgewotCQlkcHJpbnRmX2luZm8ocmVnLCAiICBCYWRrZXlbMl0uXG4iKTsKKwkJVFJBQ0UocmVnLCAiICBCYWRrZXlbMl0uXG4iKTsKIAkJcmV0dXJuIFNIRUxMX0VSUk9SX0JBREtFWTsKIAl9CiAJc3BsaXRfa2V5cGF0aChscHN6U3ViS2V5LCZ3cHMsJndwYyk7CkBAIC0yNjY5LDcgKzI2NjUsNyBAQAogCXdoaWxlIChpPHdwYy0xKSB7CiAJCWxweGtleT1scE5leHRLZXktPm5leHRzdWI7CiAJCXdoaWxlIChscHhrZXkpIHsKLQkJCWRwcmludGZfaW5mbyhyZWcsICIgIFNjYW5uaW5nIFslc11cbiIsCisJCQlUUkFDRShyZWcsICIgIFNjYW5uaW5nIFslc11cbiIsCiAJCQkJICAgICBXMkMgKGxweGtleS0+a2V5bmFtZSwgMCkpOwogCQkJaWYgKCFsc3RyY21waTMyVyh3cHNbaV0sbHB4a2V5LT5rZXluYW1lKSkKIAkJCQlicmVhazsKQEAgLTI2NzcsNyArMjY3Myw3IEBACiAJCX0KIAkJaWYgKCFscHhrZXkpIHsKIAkJCUZSRUVfS0VZX1BBVEg7Ci0JCQlkcHJpbnRmX2luZm8ocmVnLCAiICBOb3QgZm91bmQuXG4iKTsKKwkJCVRSQUNFKHJlZywgIiAgTm90IGZvdW5kLlxuIik7CiAJCQkvKiBub3QgZm91bmQgaXMgc3VjY2VzcyAqLwogCQkJcmV0dXJuIFNIRUxMX0VSUk9SX1NVQ0NFU1M7CiAJCX0KQEAgLTI2ODcsNyArMjY4Myw3IEBACiAJbHB4a2V5CT0gbHBOZXh0S2V5LT5uZXh0c3ViOwogCWxwbHBQcmV2S2V5ID0gJihscE5leHRLZXktPm5leHRzdWIpOwogCXdoaWxlIChscHhrZXkpIHsKLQkJZHByaW50Zl9pbmZvKHJlZywgIiAgU2Nhbm5pbmcgWyVzXVxuIiwKKwkJVFJBQ0UocmVnLCAiICBTY2FubmluZyBbJXNdXG4iLAogCQkJICAgICBXMkMgKGxweGtleS0+a2V5bmFtZSwgMCkpOwogCQlpZiAoIWxzdHJjbXBpMzJXKHdwc1tpXSxscHhrZXktPmtleW5hbWUpKQogCQkJYnJlYWs7CkBAIC0yNjk2LDEyICsyNjkyLDEyIEBACiAJfQogCWlmICghbHB4a2V5KSB7CiAJCUZSRUVfS0VZX1BBVEg7Ci0JCWRwcmludGZfd2FybihyZWcgLCAiICBOb3QgZm91bmQuXG4iKTsKKwkJV0FSTihyZWcgLCAiICBOb3QgZm91bmQuXG4iKTsKIAkJcmV0dXJuIFNIRUxMX0VSUk9SX0JBREtFWTsKIAl9CiAJaWYgKGxweGtleS0+bmV4dHN1YikgewogCQlGUkVFX0tFWV9QQVRIOwotCQlkcHJpbnRmX3dhcm4ocmVnICwgIiAgTm90IGVtcHR5LlxuIik7CisJCVdBUk4ocmVnICwgIiAgTm90IGVtcHR5LlxuIik7CiAJCXJldHVybiBTSEVMTF9FUlJPUl9DQU5UV1JJVEU7CiAJfQogCSpscGxwUHJldktleQk9IGxweGtleS0+bmV4dDsKQEAgLTI3MTIsNyArMjcwOCw3IEBACiAJCWZyZWUobHB4a2V5LT52YWx1ZXMpOwogCWZyZWUobHB4a2V5KTsKIAlGUkVFX0tFWV9QQVRIOwotCWRwcmludGZfaW5mbyhyZWcsICIgIERvbmUuXG4iKTsKKwlUUkFDRShyZWcsICIgIERvbmUuXG4iKTsKIAlyZXR1cm4JU0hFTExfRVJST1JfU1VDQ0VTUzsKIH0KIApAQCAtMjcyMSw3ICsyNzE3LDcgQEAKIAlMUFdTVFIJbHBzelN1YktleVc7CiAJRFdPUkQJcmV0OwogCi0JZHByaW50Zl9pbmZvKHJlZywiUmVnRGVsZXRlS2V5MzJBKCV4LCVzKVxuIiwKKwlUUkFDRShyZWcsIigleCwlcylcbiIsCiAJCWhrZXksbHBzelN1YktleQogCSk7CiAJbHBzelN1YktleVc9SEVBUF9zdHJkdXBBdG9XKEdldFByb2Nlc3NIZWFwKCksMCxscHN6U3ViS2V5KTsKQEAgLTI3MzIsNyArMjcyOCw3IEBACiAKIC8qIFJlZ0RlbGV0ZUtleQkJCVtTSEVMTC40XSBbS0VSTkVMLjIxOV0gKi8KIERXT1JEIFdJTkFQSSBSZWdEZWxldGVLZXkxNihIS0VZIGhrZXksTFBDU1RSIGxwc3pTdWJLZXkpIHsKLQlkcHJpbnRmX2luZm8ocmVnLCJSZWdEZWxldGVLZXkxNigleCwlcylcbiIsCisJVFJBQ0UocmVnLCIoJXgsJXMpXG4iLAogCQloa2V5LGxwc3pTdWJLZXkKIAkpOwogCXJldHVybiBSZWdEZWxldGVLZXkzMkEoaGtleSxscHN6U3ViS2V5KTsKQEAgLTI3NTEsNyArMjc0Nyw3IEBACiAJTFBLRVlTVFJVQ1QJbHBrZXk7CiAJTFBLRVlWQUxVRQl2YWw7CiAKLQlkcHJpbnRmX2luZm8ocmVnLCJSZWdEZWxldGVWYWx1ZTMyVygleCwlcylcbiIsCisJVFJBQ0UocmVnLCIoJXgsJXMpXG4iLAogCQloa2V5LFcyQyhscHN6VmFsdWUsMCkKIAkpOwogCWxwa2V5PWxvb2t1cF9oa2V5KGhrZXkpOwpAQCAtMjc5Miw3ICsyNzg4LDcgQEAKIAlMUFdTVFIJbHBzelZhbHVlVzsKIAlEV09SRAlyZXQ7CiAKLQlkcHJpbnRmX2luZm8ocmVnLCAiUmVnRGVsZXRlVmFsdWUzMkEoJXgsJXMpXG4iLCBoa2V5LGxwc3pWYWx1ZSApOworCVRSQUNFKHJlZywgIigleCwlcylcbiIsIGhrZXksbHBzelZhbHVlICk7CiAgICAgICAgIGxwc3pWYWx1ZVc9SEVBUF9zdHJkdXBBdG9XKEdldFByb2Nlc3NIZWFwKCksMCxscHN6VmFsdWUpOwogCXJldD1SZWdEZWxldGVWYWx1ZTMyVyhoa2V5LGxwc3pWYWx1ZVcpOwogICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsbHBzelZhbHVlVyk7CkBAIC0yODAyLDE0ICsyNzk4LDE0IEBACiAvKiBSZWdEZWxldGVWYWx1ZQkJW0tFUk5FTC4yMjJdICovCiBEV09SRCBXSU5BUEkgUmVnRGVsZXRlVmFsdWUxNihIS0VZIGhrZXksTFBTVFIgbHBzelZhbHVlKQogewotCWRwcmludGZfaW5mbyhyZWcsIlJlZ0RlbGV0ZVZhbHVlMTYoJXgsJXMpXG4iLCBoa2V5LGxwc3pWYWx1ZSApOworCVRSQUNFKHJlZywiKCV4LCVzKVxuIiwgaGtleSxscHN6VmFsdWUgKTsKIAlyZXR1cm4gUmVnRGVsZXRlVmFsdWUzMkEoaGtleSxscHN6VmFsdWUpOwogfQogCiAvKiBSZWdGbHVzaEtleQkJCVtBRFZBUEkzMi4xNDNdIFtLRVJORUwuMjI3XSAqLwogRFdPUkQgV0lOQVBJIFJlZ0ZsdXNoS2V5KEhLRVkgaGtleSkKIHsKLQlkcHJpbnRmX2ZpeG1lKHJlZywgIlJlZ0ZsdXNoS2V5KCV4KSwgU1RVQi5cbiIsIGhrZXkpOworCUZJWE1FKHJlZywgIigleCksIFNUVUIuXG4iLCBoa2V5KTsKIAlyZXR1cm4gU0hFTExfRVJST1JfU1VDQ0VTUzsKIH0KIApAQCAtMjgzNCw3ICsyODMwLDcgQEAKIAlpbnQJCW5yb2ZrZXlzLG1heHN1YmtleSxtYXhjbGFzcyxtYXh2YWx1ZXMsbWF4dm5hbWUsbWF4dmRhdGE7CiAJaW50CQlpOwogCi0JZHByaW50Zl9pbmZvKHJlZywiUmVnUXVlcnlJbmZvS2V5MzJXKCV4LC4uLi4uLilcbiIsaGtleSk7CisJVFJBQ0UocmVnLCIoJXgsLi4uLi4uKVxuIixoa2V5KTsKIAlscGtleT1sb29rdXBfaGtleShoa2V5KTsKIAlpZiAoIWxwa2V5KQogCQlyZXR1cm4gU0hFTExfRVJST1JfQkFES0VZOwpAQCAtMjkwOSw3ICsyOTA1LDcgQEAKIAlMUFdTVFIJCWxwc3pDbGFzc1c7CiAJRFdPUkQJCXJldDsKIAotCWRwcmludGZfaW5mbyhyZWcsIlJlZ1F1ZXJ5SW5mb0tleTMyQSgleCwuLi4uLi4pXG4iLGhrZXkpOworCVRSQUNFKHJlZywiKCV4LC4uLi4uLilcbiIsaGtleSk7CiAJaWYgKGxwc3pDbGFzcykgewogCQkqbHBjY2hDbGFzcyo9IDI7CiAJCWxwc3pDbGFzc1cgID0gKExQV1NUUil4bWFsbG9jKCpscGNjaENsYXNzKTsKZGlmZiAtLWdpdCBhL21pc2Mvc2hlbGwuYyBiL21pc2Mvc2hlbGwuYwppbmRleCA2OWYxMmFhLi5hN2FlNGMwIDEwMDY0NAotLS0gYS9taXNjL3NoZWxsLmMKKysrIGIvbWlzYy9zaGVsbC5jCkBAIC03OCwxMSArNzgsMTMgQEAKICAgICAiSm9jaGVuIEthcnJlciIsCiAgICAgIkFuZHJlYXMgS2lyc2NoYmF1bSIsCiAgICAgIkFsYnJlY2h0IEtsZWluZSIsCisgICAgIkVyaWMgS29obCIsCiAgICAgIkpvbiBLb25yYXRoIiwKICAgICAiQWxleCBLb3JvYmthIiwKICAgICAiR3JlZyBLcmVpZGVyIiwKICAgICAiQW5hbmQgS3VtcmlhIiwKICAgICAiU2NvdHQgQS4gTGFpcmQiLAorICAgICJEYXZpZCBMZWUgTGFtYmVydCIsCiAgICAgIkFuZHJldyBMZXd5Y2t5IiwKICAgICAiTWFydGluIHZvbiBMb2V3aXMiLAogICAgICJNaWNoaWVsIHZhbiBMb29uIiwKQEAgLTE1NSw2ICsxNTcsNyBAQAogICAgICJOaWtpdGEgVi4gWW91c2hjaGVua28iLAogICAgICJNaWtvbGFqIFphbGV3c2tpIiwKICAgICAiSm9obiBaZXJvIiwKKyAgICAiTHVpeiBPdGF2aW8gTC4gWm9yemVsbGEiLAogICAgIE5VTEwKIH07CiAKQEAgLTIyMiw3ICsyMjUsNyBAQAogICAgIExQU1RSIGxwQ3VycmVudDsKICAgICBXT1JEICBpOwogICAgIAotICAgIGRwcmludGZfaW5mbyhyZWcsIkRyYWdRdWVyeUZpbGUoJTA0eCwgJWksICVwLCAldSlcbiIsCisgICAgVFJBQ0UocmVnLCIoJTA0eCwgJWksICVwLCAldSlcbiIsCiAJCWhEcm9wLHdGaWxlLGxwc3pGaWxlLHdMZW5ndGgpOwogICAgIAogICAgIGxwRHJvcEZpbGVTdHJ1Y3QgPSAoTFBEUk9QRklMRVNUUlVDVCkgR2xvYmFsTG9jazE2KGhEcm9wKTsgCkBAIC0yOTYsNyArMjk5LDcgQEAKICAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAvKiByYW5kb20gY291bnRlciAqLwogICAgIGNoYXIgeGxwRmlsZVsyNTZdOyAgICAgIC8qIHJlc3VsdCBvZiBTZWFyY2hQYXRoICovCiAKLSAgICBkcHJpbnRmX2luZm8oZXhlYywgIlNIRUxMX0ZpbmRFeGVjdXRhYmxlOiAlc1xuIiwKKyAgICBUUkFDRShleGVjLCAiJXNcbiIsCiAgICAgICAgICAgICAgICAgIChscEZpbGUgIT0gTlVMTD9scEZpbGU6Ii0iKSApOwogICAgIGxwUmVzdWx0WzBdPSdcMCc7IC8qIFN0YXJ0IG9mZiB3aXRoIGFuIGVtcHR5IHJldHVybiBzdHJpbmcgKi8KIApAQCAtMzIyLDcgKzMyNSw3IEBACiAgICAgLyogTWFrZSBsb2NhbCBjb3B5ICYgbG93ZXJjYXNlIGl0IGZvciByZWcgJiAncHJvZ3JhbXM9JyBsb29rdXAgKi8KICAgICBsc3RyY3B5bjMyQSggdG1wZXh0LCBleHRlbnNpb24sIDUgKTsKICAgICBDaGFyTG93ZXIzMkEoIHRtcGV4dCApOwotICAgIGRwcmludGZfaW5mbyhleGVjLCAiU0hFTExfRmluZEV4ZWN1dGFibGU6ICVzIGZpbGVcbiIsIHRtcGV4dCk7CisgICAgVFJBQ0UoZXhlYywgIiVzIGZpbGVcbiIsIHRtcGV4dCk7CiAgICAgCiAgICAgLyogVGhyZWUgcGxhY2VzIHRvIGNoZWNrOiAqLwogICAgIC8qIDEuIHdpbi5pbmksIFt3aW5kb3dzXSwgcHJvZ3JhbXMgKE5CIG5vIGxlYWRpbmcgJy4nKSAqLwpAQCAtMzQ4LDcgKzM1MSw3IEBACiAJCQkJc3RyY3B5KGxwUmVzdWx0LCB4bHBGaWxlKTsKIAkJCQkvKiBOZWVkIHRvIHBlcmhhcHMgY2hlY2sgdGhhdCB0aGUgZmlsZSBoYXMgYSBwYXRoCiAJCQkJICogYXR0YWNoZWQgKi8KLQkJCQlkcHJpbnRmX2luZm8oZXhlYywgIlNIRUxMX0ZpbmRFeGVjdXRhYmxlOiBmb3VuZCAlc1xuIiwKKwkJCQlUUkFDRShleGVjLCAiZm91bmQgJXNcbiIsCiAJCQkJCQkJIGxwUmVzdWx0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDMzOwogCkBAIC0zNjYsNyArMzY5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZXR5cGVsZW4gKSA9PSBTSEVMTF9FUlJPUl9TVUNDRVNTICkKICAgICB7CiAJZmlsZXR5cGVbZmlsZXR5cGVsZW5dPSdcMCc7Ci0JZHByaW50Zl9pbmZvKGV4ZWMsICJTSEVMTF9GaW5kRXhlY3V0YWJsZTogRmlsZSB0eXBlOiAlc1xuIiwKKwlUUkFDRShleGVjLCAiRmlsZSB0eXBlOiAlc1xuIiwKIAkJICAgICBmaWxldHlwZSk7CiAKIAkvKiBMb29raW5nIGZvciAuLi5idWZmZXJcc2hlbGxcbHBPcGVyYXRpb25cY29tbWFuZCAqLwpAQCAtNDIwLDcgKzQyMyw3IEBACiAJICB9CiAJfQogCi0gICAgZHByaW50Zl9pbmZvKGV4ZWMsICJTSEVMTF9GaW5kRXhlY3V0YWJsZTogcmV0dXJuaW5nICVzXG4iLCBscFJlc3VsdCk7CisgICAgVFJBQ0UoZXhlYywgInJldHVybmluZyAlc1xuIiwgbHBSZXN1bHQpOwogICAgIHJldHVybiByZXR2YWw7CiB9CiAKQEAgLTQzNSw3ICs0MzgsNyBAQAogICAgIGNoYXIgb2xkX2RpclsxMDI0XTsKICAgICBjaGFyIGNtZFsyNTZdOwogCi0gICAgZHByaW50Zl9pbmZvKGV4ZWMsICJTaGVsbEV4ZWN1dGUoJTA0eCwnJXMnLCclcycsJyVzJywnJXMnLCV4KVxuIiwKKyAgICBUUkFDRShleGVjLCAiKCUwNHgsJyVzJywnJXMnLCclcycsJyVzJywleClcbiIsCiAJCWhXbmQsIGxwT3BlcmF0aW9uID8gbHBPcGVyYXRpb246IjxudWxsPiIsIGxwRmlsZSA/IGxwRmlsZToiPG51bGw+IiwKIAkJbHBQYXJhbWV0ZXJzID8gbHBQYXJhbWV0ZXJzIDogIjxudWxsPiIsIAogCQlscERpcmVjdG9yeSA/IGxwRGlyZWN0b3J5IDogIjxudWxsPiIsIGlTaG93Q21kKTsKQEAgLTQ2MCw3ICs0NjMsNyBAQAogICAgICAgICAgICAgc3RyY2F0KGNtZCxscFBhcmFtZXRlcnMpOwogICAgICAgICB9CiAKLSAgICAgICAgZHByaW50Zl9pbmZvKGV4ZWMsIlNoZWxsRXhlY3V0ZTpzdGFydGluZyAlc1xuIixjbWQpOworICAgICAgICBUUkFDRShleGVjLCJzdGFydGluZyAlc1xuIixjbWQpOwogICAgICAgICByZXR2YWwgPSBXaW5FeGVjMzIoIGNtZCwgaVNob3dDbWQgKTsKICAgICB9CiAgICAgaWYgKGxwRGlyZWN0b3J5KSBTZXRDdXJyZW50RGlyZWN0b3J5MzJBKCBvbGRfZGlyICk7CkBAIC00OTgsNyArNTAxLDcgQEAKICAgICBISU5TVEFOQ0UzMiByZXR2YWw9MzE7ICAgIC8qIGRlZmF1bHQgLSAnTm8gYXNzb2NpYXRpb24gd2FzIGZvdW5kJyAqLwogICAgIGNoYXIgb2xkX2RpclsxMDI0XTsKIAotICAgIGRwcmludGZfaW5mbyhleGVjLCAiRmluZEV4ZWN1dGFibGU6IEZpbGUgJXMsIERpciAlc1xuIiwgCisgICAgVFJBQ0UoZXhlYywgIkZpbGUgJXMsIERpciAlc1xuIiwgCiAJCSAobHBGaWxlICE9IE5VTEw/bHBGaWxlOiItIiksIAogCQkgKGxwRGlyZWN0b3J5ICE9IE5VTEw/bHBEaXJlY3Rvcnk6Ii0iKSk7CiAKQEAgLTUxOSw3ICs1MjIsNyBAQAogCiAgICAgcmV0dmFsID0gU0hFTExfRmluZEV4ZWN1dGFibGUoIGxwRmlsZSwgIm9wZW4iLCBscFJlc3VsdCApOwogCi0gICAgZHByaW50Zl9pbmZvKGV4ZWMsICJGaW5kRXhlY3V0YWJsZTogcmV0dXJuaW5nICVzXG4iLCBscFJlc3VsdCk7CisgICAgVFJBQ0UoZXhlYywgInJldHVybmluZyAlc1xuIiwgbHBSZXN1bHQpOwogICAgIGlmIChscERpcmVjdG9yeSkgU2V0Q3VycmVudERpcmVjdG9yeTMyQSggb2xkX2RpciApOwogICAgIHJldHVybiByZXR2YWw7CiB9CkBAIC05MzEsNyArOTM0LDcgQEAKICAgSEZJTEUzMiAJaEZpbGUgPSBPcGVuRmlsZTMyKCBscHN6RXhlRmlsZU5hbWUsICZvZnMsIE9GX1JFQUQgKTsKICAgVUlOVDE2CWljb25EaXJDb3VudCA9IDAsaWNvbkNvdW50ID0gMDsKICAgCi0gIGRwcmludGZfaW5mbyhyZWcsIkludGVybmFsRXh0cmFjdEljb24oJTA0eCxmaWxlICVzLHN0YXJ0ICVkLGV4dHJhY3QgJWRcbiIsIAorICBUUkFDRShyZWcsIiglMDR4LGZpbGUgJXMsc3RhcnQgJWQsZXh0cmFjdCAlZFxuIiwgCiAJCSAgICAgICBoSW5zdGFuY2UsIGxwc3pFeGVGaWxlTmFtZSwgbkljb25JbmRleCwgbik7CiAKICAgaWYoIGhGaWxlID09IEhGSUxFX0VSUk9SMzIgfHwgIW4gKSByZXR1cm4gMDsKQEAgLTk2NiwxMyArOTY5LDEzIEBACiAJICB7CiAJICAgICBpY29uRGlyQ291bnQgPSBwVEluZm8tPmNvdW50OwogCSAgICAgcEljb25EaXIgPSAoKE5FX05BTUVJTkZPKikocFRJbmZvICsgMSkpOwotCSAgICAgZHByaW50Zl9pbmZvKHJlZywiXHRmb3VuZCBkaXJlY3RvcnkgLSAlaSBpY29uIGZhbWlsaWVzXG4iLCBpY29uRGlyQ291bnQpOworCSAgICAgVFJBQ0UocmVnLCJcdGZvdW5kIGRpcmVjdG9yeSAtICVpIGljb24gZmFtaWxpZXNcbiIsIGljb25EaXJDb3VudCk7CiAJICB9CiAJaWYoIHBUSW5mby0+dHlwZV9pZCA9PSBORV9SU0NUWVBFX0lDT04gKSAKIAkgIHsgCiAJICAgICBpY29uQ291bnQgPSBwVEluZm8tPmNvdW50OwogCSAgICAgcEljb25TdG9yYWdlID0gKChORV9OQU1FSU5GTyopKHBUSW5mbyArIDEpKTsKLQkgICAgIGRwcmludGZfaW5mbyhyZWcsIlx0dG90YWwgaWNvbnMgLSAlaVxuIiwgaWNvbkNvdW50KTsKKwkgICAgIFRSQUNFKHJlZywiXHR0b3RhbCBpY29ucyAtICVpXG4iLCBpY29uQ291bnQpOwogCSAgfQogICAJcFRJbmZvID0gKE5FX1RZUEVJTkZPICopKChjaGFyKikocFRJbmZvKzEpK3BUSW5mby0+Y291bnQqc2l6ZW9mKE5FX05BTUVJTkZPKSk7CiAgICAgfQpAQCAtMTAzNiwxMyArMTAzOSwxMyBAQAogCQogCWZtYXBwaW5nID0gQ3JlYXRlRmlsZU1hcHBpbmczMkEoaEZpbGUsTlVMTCxQQUdFX1JFQURPTkxZfFNFQ19DT01NSVQsMCwwLE5VTEwpOwogCWlmIChmbWFwcGluZyA9PSAwKSB7IC8qIEZJWE1FLCBJTlZBTElEX0hBTkRMRV9WQUxVRT8gKi8KLQkJZnByaW50ZihzdGRlcnIsIkludGVybmFsRXh0cmFjdEljb246ZmFpbGVkIHRvIGNyZWF0ZSBmaWxlbWFwLlxuIik7CisJCVdBUk4ocmVnLCJmYWlsZWQgdG8gY3JlYXRlIGZpbGVtYXAuXG4iKTsKIAkJX2xjbG9zZTMyKCBoRmlsZSk7CiAJCXJldHVybiAwOwogCX0KIAlwZWltYWdlID0gTWFwVmlld09mRmlsZShmbWFwcGluZyxGSUxFX01BUF9SRUFELDAsMCwwKTsKIAlpZiAoIXBlaW1hZ2UpIHsKLQkJZnByaW50ZihzdGRlcnIsIkludGVybmFsRXh0cmFjdEljb246ZmFpbGVkIHRvIG1tYXAgZmlsZW1hcC5cbiIpOworCQlXQVJOKHJlZywiZmFpbGVkIHRvIG1tYXAgZmlsZW1hcC5cbiIpOwogCQlDbG9zZUhhbmRsZShmbWFwcGluZyk7CiAJCV9sY2xvc2UzMiggaEZpbGUpOwogCQlyZXR1cm4gMDsKQEAgLTEwNjYsNyArMTA2OSw3IEBACiAJfQogCiAJaWYgKCFyb290cmVzZGlyKSB7Ci0JCWZwcmludGYoc3RkZXJyLCJJbnRlcm5hbEV4dHJhY3RJY29uOiBoYXZlbid0IGZvdW5kIHNlY3Rpb24gZm9yIHJlc291cmNlIGRpcmVjdG9yeS5cbiIpOworCQlXQVJOKHJlZywiaGF2ZW4ndCBmb3VuZCBzZWN0aW9uIGZvciByZXNvdXJjZSBkaXJlY3RvcnkuXG4iKTsKIAkJVW5tYXBWaWV3T2ZGaWxlKHBlaW1hZ2UpOwogCQlDbG9zZUhhbmRsZShmbWFwcGluZyk7CiAJCV9sY2xvc2UzMiggaEZpbGUpOwpAQCAtMTA3NCw3ICsxMDc3LDcgQEAKIAl9CiAJaWNvbmdyb3VwcmVzZGlyID0gR2V0UmVzRGlyRW50cnlXKHJvb3RyZXNkaXIsKExQV1NUUilSVF9HUk9VUF9JQ09OLChEV09SRClyb290cmVzZGlyLEZBTFNFKTsKIAlpZiAoIWljb25ncm91cHJlc2RpcikgewotCQlmcHJpbnRmKHN0ZGVyciwiSW50ZXJuYWxFeHRyYWN0SWNvbjogTm8gSWNvbmdyb3VwcmVzb3VyY2VkaXJlY3RvcnkhXG4iKTsKKwkJV0FSTihyZWcsIk5vIEljb25ncm91cHJlc291cmNlZGlyZWN0b3J5IVxuIik7CiAJCVVubWFwVmlld09mRmlsZShwZWltYWdlKTsKIAkJQ2xvc2VIYW5kbGUoZm1hcHBpbmcpOwogCQlfbGNsb3NlMzIoIGhGaWxlKTsKQEAgLTEwOTEsOSArMTA5NCw4IEBACiAJfQogCiAJaWYgKG5JY29uSW5kZXggPj0gaWNvbkRpckNvdW50KSB7Ci0JCWZwcmludGYoc3RkZXJyLCJuSWNvbkluZGV4ICVkIGlzIGxhcmdlciB0aGFuIGljb25EaXJDb3VudCAlZFxuIiwKLQkJCW5JY29uSW5kZXgsaWNvbkRpckNvdW50Ci0JCSk7CisJCVdBUk4ocmVnLCJuSWNvbkluZGV4ICVkIGlzIGxhcmdlciB0aGFuIGljb25EaXJDb3VudCAlZFxuIiwKKwkJCSAgICBuSWNvbkluZGV4LGljb25EaXJDb3VudCk7CiAJCVVubWFwVmlld09mRmlsZShwZWltYWdlKTsKIAkJQ2xvc2VIYW5kbGUoZm1hcHBpbmcpOwogCQlfbGNsb3NlMzIoIGhGaWxlKTsKQEAgLTExMzEsNyArMTEzMyw3IEBACiAJCQlpZ2RhdGEgPSBwZWltYWdlKyhpZ2RhdGFlbnQtPk9mZnNldFRvRGF0YS1wZV9zZWN0aW9uc1tqXS5WaXJ0dWFsQWRkcmVzcytwZV9zZWN0aW9uc1tqXS5Qb2ludGVyVG9SYXdEYXRhKTsKIAkJfQogCQlpZiAoIWlnZGF0YSkgewotCQkJZnByaW50ZihzdGRlcnIsIkludGVybmFsRXh0cmFjdEljb246IG5vIG1hdGNoaW5nIHJlYWwgYWRkcmVzcyBmb3VuZCBmb3IgaWNvbmdyb3VwIVxuIik7CisJCQlXQVJOKHJlZywibm8gbWF0Y2hpbmcgcmVhbCBhZGRyZXNzIGZvciBpY29uZ3JvdXAhXG4iKTsKIAkJCVVubWFwVmlld09mRmlsZShwZWltYWdlKTsKIAkJCUNsb3NlSGFuZGxlKGZtYXBwaW5nKTsKIAkJCV9sY2xvc2UzMiggaEZpbGUpOwpAQCAtMTE0NCw3ICsxMTQ2LDcgQEAKIAl9CiAJaWNvbnJlc2Rpcj1HZXRSZXNEaXJFbnRyeVcocm9vdHJlc2RpciwoTFBXU1RSKVJUX0lDT04sKERXT1JEKXJvb3RyZXNkaXIsRkFMU0UpOwogCWlmICghaWNvbnJlc2RpcikgewotCSAgICBmcHJpbnRmKHN0ZGVyciwiSW50ZXJuYWxFeHRyYWN0SWNvbjogTm8gSWNvbnJlc291cmNlZGlyZWN0b3J5IVxuIik7CisJICAgIFdBUk4ocmVnLCJObyBJY29ucmVzb3VyY2VkaXJlY3RvcnkhXG4iKTsKIAkgICAgVW5tYXBWaWV3T2ZGaWxlKHBlaW1hZ2UpOwogCSAgICBDbG9zZUhhbmRsZShmbWFwcGluZyk7CiAJICAgIF9sY2xvc2UzMiggaEZpbGUpOwpAQCAtMTE2OCw3ICsxMTcwLDcgQEAKIAkJaWRhdGEgPSBwZWltYWdlKyhpZGF0YWVudC0+T2Zmc2V0VG9EYXRhLXBlX3NlY3Rpb25zW2pdLlZpcnR1YWxBZGRyZXNzK3BlX3NlY3Rpb25zW2pdLlBvaW50ZXJUb1Jhd0RhdGEpOwogCSAgICB9CiAJICAgIGlmICghaWRhdGEpIHsKLQkJZnByaW50ZihzdGRlcnIsIkludGVybmFsRXh0cmFjdEljb246IG5vIG1hdGNoaW5nIHJlYWwgYWRkcmVzcyBmb3VuZCBmb3IgaWNvbmRhdGEhXG4iKTsKKwkJV0FSTihyZWcsIm5vIG1hdGNoaW5nIHJlYWwgYWRkcmVzcyBmb3VuZCBmb3IgaWNvbmRhdGEhXG4iKTsKIAkJUmV0UHRyW2ldPTA7CiAJCWNvbnRpbnVlOwogCSAgICB9CkBAIC0xMzIzLDcgKzEzMjUsNyBAQAogCiAgIENoYXJUb09lbTMyQShzdHIsc3RyKTsKIAotICBkcHJpbnRmX2luZm8ocmVnLCJEb0VudlN1YnN0OiBhY2NlcHQgJXNcbiIsIHN0cik7CisgIFRSQUNFKHJlZywiYWNjZXB0ICVzXG4iLCBzdHIpOwogCiAgIHdoaWxlKCAqbHBzdHIgJiYgbHBic3RyIC0gbHBCdWZmZXIgPCBsZW5ndGggKQogICAgewpAQCAtMTM0Myw4ICsxMzQ1LDcgQEAKIAogCQkgICBpZiggbCA+IGxlbmd0aCAtIChscGJzdHIgLSBscEJ1ZmZlcikgLSAxICkKIAkJICAgICB7Ci0JCSAgICAgICBmcHJpbnRmKHN0ZG5pbXAsIkZpbGUgJXMsIGxpbmUgJWk6IEVudiBzdWJzdCBhYm9ydGVkIC0gc3RyaW5nIHRvbyBzaG9ydFxuIiwgCi0JCQkJCV9fRklMRV9fLCBfX0xJTkVfXyk7CisJCSAgICAgICBXQVJOKHJlZywiRW52IHN1YnN0IGFib3J0ZWQgLSBzdHJpbmcgdG9vIHNob3J0XG4iKTsKIAkJICAgICAgKmxwZW5kID0gJyUnOwogCQkgICAgICAgYnJlYWs7CiAJCSAgICAgfQpAQCAtMTM3Miw3ICsxMzczLDcgQEAKICAgZWxzZQogICAgICAgbGVuZ3RoID0gMDsKIAotICBkcHJpbnRmX2luZm8ocmVnLCIgICAgcmV0dXJuICVzXG4iLCBzdHIpOworICBUUkFDRShyZWcsIiAgICByZXR1cm4gJXNcbiIsIHN0cik7CiAKICAgT2VtVG9DaGFyMzJBKHN0cixzdHIpOwogICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbHBCdWZmZXIpOwpAQCAtMTM4OSw3ICsxMzkwLDcgQEAKICAqLwogTFJFU1VMVCBXSU5BUEkgU2hlbGxIb29rUHJvYyhJTlQxNiBjb2RlLCBXUEFSQU0xNiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7Ci0gICAgZHByaW50Zl9pbmZvKHJlZywiU2hlbGxIb29rUHJvYzogJWksICUwNHgsICUwOHhcbiIsIGNvZGUsIHdQYXJhbSwgCisgICAgVFJBQ0UocmVnLCIlaSwgJTA0eCwgJTA4eFxuIiwgY29kZSwgd1BhcmFtLCAKIAkJCQkJCSAgICAgICh1bnNpZ25lZClsUGFyYW0gKTsKICAgICBpZiggU0hFTExfaEhvb2sgJiYgU0hFTExfaFduZCApCiAgICAgewpAQCAtMTQwNSwxMCArMTQwNiwxMCBAQAogICAgIHJldHVybiBDYWxsTmV4dEhvb2tFeDE2KCBXSF9TSEVMTCwgY29kZSwgd1BhcmFtLCBsUGFyYW0gKTsKIH0KIAotTFJFU1VMVCBXSU5BUEkgRlVOQzAwNChJTlQxNiBjb2RlLCBXUEFSQU0xNiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCitMUkVTVUxUIFdJTkFQSSBGVU5DMDA0KElOVDE2IGNvZGUsIFdQQVJBTTE2IHdQYXJhbSwgLypMUEFSQU0qL1dPUkQgbFBhcmFtKQogewotCWZwcmludGYoc3RkZXJyLCJGVU5DMDA0KCVkLCVkLCVsZCksU1RVQiFcbiIsY29kZSx3UGFyYW0sbFBhcmFtKTsKLQlyZXR1cm4gU2hlbGxIb29rUHJvYyhjb2RlLHdQYXJhbSxsUGFyYW0pOworCUZJWE1FKHJlZywiKCVkLCVkLCVkKSxTVFVCIVxuIixjb2RlLHdQYXJhbSxsUGFyYW0pOworCXJldHVybiBTaGVsbEhvb2tQcm9jKGNvZGUsd1BhcmFtLChEV09SRClsUGFyYW0pOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTQxNiw3ICsxNDE3LDcgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBSZWdpc3RlclNoZWxsSG9vayhIV05EMTYgaFduZCwgVUlOVDE2IHVBY3Rpb24pCiB7Ci0gICAgZHByaW50Zl9pbmZvKHJlZywiUmVnaXN0ZXJTaGVsbEhvb2s6ICUwNHggWyV1XVxuIiwgaFduZCwgdUFjdGlvbiApOworICAgIFRSQUNFKHJlZywiJTA0eCBbJXVdXG4iLCBoV25kLCB1QWN0aW9uICk7CiAKICAgICBzd2l0Y2goIHVBY3Rpb24gKQogICAgIHsKQEAgLTE0MzQsNyArMTQzNSw3IEBACiAJCSAgICB1TXNnV25kRGVzdHJveWVkID0gUmVnaXN0ZXJXaW5kb3dNZXNzYWdlMzJBKCBscHN0ck1zZ1duZERlc3Ryb3llZCApOwogCQkgICAgdU1zZ1NoZWxsQWN0aXZhdGUgPSBSZWdpc3RlcldpbmRvd01lc3NhZ2UzMkEoIGxwc3RyTXNnU2hlbGxBY3RpdmF0ZSApOwogCQl9IAotCQllbHNlIGZwcmludGYoIHN0ZGVyciwgIlx0dW5hYmxlIHRvIGluc3RhbGwgU2hlbGxIb29rUHJvYygpIVxuIik7CisJCWVsc2UgV0FSTihyZWcsICJ1bmFibGUgdG8gaW5zdGFsbCBTaGVsbEhvb2tQcm9jKCkhXG4iKTsKIAkgICAgIH0KIAogCSAgICAgaWYoIFNIRUxMX2hIb29rICkgcmV0dXJuICgoU0hFTExfaFduZCA9IGhXbmQpICE9IDApOwpAQCAtMTQ0Miw3ICsxNDQzLDcgQEAKIAogCWRlZmF1bHQ6CiAKLQkgICAgIGZwcmludGYoIHN0ZGVyciwgIlJlZ2lzdGVyU2hlbGxIb29rOiB1bmtub3duIGNvZGUgJWlcbiIsIHVBY3Rpb24gKTsKKwkgICAgIFdBUk4ocmVnLCAidW5rbm93biBjb2RlICVpXG4iLCB1QWN0aW9uICk7CiAKIAkgICAgIC8qIGp1c3QgaW4gY2FzZSAqLwogCkBAIC0xNTQ3LDExICsxNTQ4LDkgQEAKIAogdm9pZCBXSU5BUEkgQ29udHJvbF9SdW5ETEwgKEhXTkQzMiBod25kLCBMUENWT0lEIGNvZGUsIExQQ1NUUiBjbWQsIERXT1JEIGFyZzQpCiB7Ci0gIGRwcmludGZfaW5mbyhleGVjLCAiQ29udHJvbF9SdW5ETEwgKCUwOHgsICVwLCBcIiVzXCIsICUwOGx4KVxuIiwKLQkJaHduZCwKLQkJY29kZSA/IGNvZGUgOiAiKG51bGwpIiwKLQkJY21kID8gY21kIDogIihudWxsKSIsCi0JCWFyZzQpOworICBUUkFDRShleGVjLCAiKCUwOHgsICVwLCBcIiVzXCIsICUwOGx4KVxuIiwKKwkJaHduZCwgY29kZSA/IGNvZGUgOiAiKG51bGwpIiwKKwkJY21kID8gY21kIDogIihudWxsKSIsIGFyZzQpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvbWlzYy9zaGVsbG9yZC5jIGIvbWlzYy9zaGVsbG9yZC5jCmluZGV4IDllZGE0MzMuLmVkYWEyZDcgMTAwNjQ0Ci0tLSBhL21pc2Mvc2hlbGxvcmQuYworKysgYi9taXNjL3NoZWxsb3JkLmMKQEAgLTQzNSwyNiArNDM1LDI0IEBACiApIHsKIAlEV09SRAlXSU5BUEkJKCpkbGxnZXRjbGFzc29iKShSRUZDTFNJRCxSRUZJSUQsTFBWT0lEKTsKIAlEV09SRAkJaHJlczsKLS8qCiAJTFBDTEFTU0ZBQ1RPUlkJY2xhc3NmYWM7Ci0gKi8KIAogCWRsbGdldGNsYXNzb2IgPSAoRFdPUkQoKikoUkVGQ0xTSUQsUkVGSUlELExQVk9JRCkpX2ZpbmRfbW9kdWxlcHJvYyhkbGxuYW1lLE5VTEwsIkRsbEdldENsYXNzT2JqZWN0Iik7CiAJaWYgKCFkbGxnZXRjbGFzc29iKQogCQlyZXR1cm4gMHg4MDA3MDAwMHxHZXRMYXN0RXJyb3IoKTsKIAogLyogRklYTUUgKi8KKy8qCiAJaHJlcyA9ICgqZGxsZ2V0Y2xhc3NvYikoY2xzaWQsKFJFRklJRCkmSUlEX0lDbGFzc0ZhY3RvcnksaW5zdCk7CiAJaWYgKGhyZXM8MCkKIAkJcmV0dXJuIGhyZXM7CiAKLS8qCisgKi8KIAlocmVzID0gKCpkbGxnZXRjbGFzc29iKShjbHNpZCwoUkVGSUlEKSZJSURfSUNsYXNzRmFjdG9yeSwmY2xhc3NmYWMpOwogCWlmIChocmVzPDApCiAJCXJldHVybiBocmVzOwogCWNsYXNzZmFjLT5scHZ0YmwtPmZuQ3JlYXRlSW5zdGFuY2UoY2xhc3NmYWMsdW5rbm93bm91dGVyLHJlZmlpZCxpbnN0KTsKIAljbGFzc2ZhYy0+bHB2dGJsLT5mblJlbGVhc2UoY2xhc3NmYWMpOwotICovCiAJcmV0dXJuIDA7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvbWlzYy9zcHkuYyBiL21pc2Mvc3B5LmMKaW5kZXggOWE2YjNmYi4uMmQ1MzU3YyAxMDA2NDQKLS0tIGEvbWlzYy9zcHkuYworKysgYi9taXNjL3NweS5jCkBAIC02NDIsMjEgKzY0MiwyMSBAQAogewogICAgIExQQ1NUUiBwbmFtZTsKIAotICAgIGlmICghZGVidWdnaW5nX2luZm8obWVzc2FnZSkgfHwgU1BZX0VYQ0xVREUobXNnKSkgcmV0dXJuOworICAgIGlmICghVFJBQ0VfT04obWVzc2FnZSkgfHwgU1BZX0VYQ0xVREUobXNnKSkgcmV0dXJuOwogCiAgICAgLyogZWFjaCBTUFlfU0VORE1FU1NBR0UgbXVzdCBiZSBjb21wbGVtZW50ZWQgYnkgY2FsbCB0byBTUFlfRXhpdE1lc3NhZ2UgKi8KICAgICBzd2l0Y2goaUZsYWcpCiAgICAgewogICAgIGNhc2UgU1BZX0RJU1BBVENITUVTU0FHRTE2OgogCXBuYW1lID0gU1BZX0dldFduZE5hbWUoaFduZCk7Ci0gICAgICAgIGRwcmludGZfaW5mbyhtZXNzYWdlLCIlKnMoJTA0eCkgJS0xNnMgbWVzc2FnZSBbJTA0eF0gJXMgZGlzcGF0Y2hlZCAgd3A9JTA0eCBscD0lMDhseFxuIiwKKyAgICAgICAgVFJBQ0UobWVzc2FnZSwiJSpzKCUwNHgpICUtMTZzIG1lc3NhZ2UgWyUwNHhdICVzIGRpc3BhdGNoZWQgIHdwPSUwNHggbHA9JTA4bHhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBTUFlfSW5kZW50TGV2ZWwsICIiLCBoV25kLCBwbmFtZSwgbXNnLCBTUFlfR2V0TXNnTmFtZSggbXNnICksCiAgICAgICAgICAgICAgICAgICAgICAgICB3UGFyYW0sIGxQYXJhbSk7CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBTUFlfRElTUEFUQ0hNRVNTQUdFMzI6CiAJcG5hbWUgPSBTUFlfR2V0V25kTmFtZShoV25kKTsKLSAgICAgICAgZHByaW50Zl9pbmZvKG1lc3NhZ2UsIiUqcyglMDh4KSAlLTE2cyBtZXNzYWdlIFslMDR4XSAlcyBkaXNwYXRjaGVkICB3cD0lMDh4IGxwPSUwOGx4XG4iLAorICAgICAgICBUUkFDRShtZXNzYWdlLCIlKnMoJTA4eCkgJS0xNnMgbWVzc2FnZSBbJTA0eF0gJXMgZGlzcGF0Y2hlZCAgd3A9JTA4eCBscD0lMDhseFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIFNQWV9JbmRlbnRMZXZlbCwgIiIsIGhXbmQsIHBuYW1lLCBtc2csIFNQWV9HZXRNc2dOYW1lKCBtc2cgKSwKICAgICAgICAgICAgICAgICAgICAgICAgIHdQYXJhbSwgbFBhcmFtKTsKICAgICAgICAgYnJlYWs7CkBAIC02NzQsMjggKzY3NCwyNiBAQAogCSAgICBwbmFtZSA9IFNQWV9HZXRXbmROYW1lKGhXbmQpOwogCiAgICAgICAgICAgICBpZiAoaUZsYWcgPT0gU1BZX1NFTkRNRVNTQUdFMTYpCi0gICAgICAgICAgICAgICAgZHByaW50Zl9pbmZvKG1lc3NhZ2UsCi0JCQkJIiUqcyglMDR4KSAlLTE2cyBtZXNzYWdlIFslMDR4XSAlcyBzZW50IGZyb20gJXMgd3A9JTA0eCBscD0lMDhseFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BZX0luZGVudExldmVsLCAiIiwgaFduZCwgcG5hbWUsIG1zZywgU1BZX0dldE1zZ05hbWUoIG1zZyApLCAKLQkJCQl0YXNrTmFtZSwgd1BhcmFtLCBsUGFyYW0gKTsKKyAgICAgICAgICAgICAgICBUUkFDRShtZXNzYWdlLCAiJSpzKCUwNHgpICUtMTZzIG1lc3NhZ2UgWyUwNHhdICVzIHNlbnQgZnJvbSAlcyB3cD0lMDR4IGxwPSUwOGx4XG4iLAorCQkJICAgICBTUFlfSW5kZW50TGV2ZWwsICIiLCBoV25kLCBwbmFtZSwgbXNnLCBTUFlfR2V0TXNnTmFtZSggbXNnICksIAorCQkJICAgICB0YXNrTmFtZSwgd1BhcmFtLCBsUGFyYW0gKTsKICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBkcHJpbnRmX2luZm8obWVzc2FnZSwKLQkJCQkiJSpzKCUwOHgpICUtMTZzIG1lc3NhZ2UgWyUwNHhdICVzIHNlbnQgZnJvbSAlcyB3cD0lMDh4IGxwPSUwOGx4XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUFlfSW5kZW50TGV2ZWwsICIiLCBoV25kLCBwbmFtZSwgbXNnLCBTUFlfR2V0TXNnTmFtZSggbXNnICksIAotCQkJCXRhc2tOYW1lLCB3UGFyYW0sIGxQYXJhbSApOworICAgICAgICAgICAgICAgIFRSQUNFKG1lc3NhZ2UsICIlKnMoJTA4eCkgJS0xNnMgbWVzc2FnZSBbJTA0eF0gJXMgc2VudCBmcm9tICVzIHdwPSUwOHggbHA9JTA4bHhcbiIsCisJCQkgICAgIFNQWV9JbmRlbnRMZXZlbCwgIiIsIGhXbmQsIHBuYW1lLCBtc2csIFNQWV9HZXRNc2dOYW1lKCBtc2cgKSwgCisJCQkgICAgIHRhc2tOYW1lLCB3UGFyYW0sIGxQYXJhbSApOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOyAgIAogCiAgICAgY2FzZSBTUFlfREVGV05EUFJPQzE2OgogCWlmKCBTUFlfRXhjbHVkZURXUCApIHJldHVybjsKLSAgICAgICAgZHByaW50Zl9pbmZvKG1lc3NhZ2UsICIlKnMoJTA0eCkgIERlZldpbmRvd1Byb2MxNjogJXMgWyUwNHhdICB3cD0lMDR4IGxwPSUwOGx4XG4iLAorICAgICAgICBUUkFDRShtZXNzYWdlLCAiJSpzKCUwNHgpICBEZWZXaW5kb3dQcm9jMTY6ICVzIFslMDR4XSAgd3A9JTA0eCBscD0lMDhseFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIFNQWV9JbmRlbnRMZXZlbCwgIiIsIGhXbmQsIFNQWV9HZXRNc2dOYW1lKCBtc2cgKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG1zZywgd1BhcmFtLCBsUGFyYW0gKTsKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIFNQWV9ERUZXTkRQUk9DMzI6CiAJaWYoIFNQWV9FeGNsdWRlRFdQICkgcmV0dXJuOwotICAgICAgICBkcHJpbnRmX2luZm8obWVzc2FnZSwgIiUqcyglMDh4KSAgRGVmV2luZG93UHJvYzMyOiAlcyBbJTA0eF0gIHdwPSUwOHggbHA9JTA4bHhcbiIsCisgICAgICAgIFRSQUNFKG1lc3NhZ2UsICIlKnMoJTA4eCkgIERlZldpbmRvd1Byb2MzMjogJXMgWyUwNHhdICB3cD0lMDh4IGxwPSUwOGx4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgU1BZX0luZGVudExldmVsLCAiIiwgaFduZCwgU1BZX0dldE1zZ05hbWUoIG1zZyApLAogICAgICAgICAgICAgICAgICAgICAgICAgbXNnLCB3UGFyYW0sIGxQYXJhbSApOwogICAgICAgICBicmVhazsKQEAgLTcxMSw3ICs3MDksNyBAQAogewogICAgIExQQ1NUUiBwbmFtZTsKIAotICAgIGlmICghZGVidWdnaW5nX2luZm8obWVzc2FnZSkgfHwgU1BZX0VYQ0xVREUobXNnKSB8fAorICAgIGlmICghVFJBQ0VfT04obWVzc2FnZSkgfHwgU1BZX0VYQ0xVREUobXNnKSB8fAogCShTUFlfRXhjbHVkZURXUCAmJiAoaUZsYWcgPT0gU1BZX1JFU1VMVF9ERUZXTkQxNiB8fCBpRmxhZyA9PSBTUFlfUkVTVUxUX0RFRldORDMyKSkgKQogCXJldHVybjsKIApAQCAtNzIwLDM5ICs3MTgsMzkgQEAKICAgICBzd2l0Y2goaUZsYWcpCiAgICAgewogICAgIGNhc2UgU1BZX1JFU1VMVF9ERUZXTkQxNjoKLQlkcHJpbnRmX2luZm8obWVzc2FnZSwiJSpzKCUwNHgpICBEZWZXaW5kb3dQcm9jMTY6ICVzIFslMDR4XSByZXR1cm5lZCAlMDhseFxuIiwKKwlUUkFDRShtZXNzYWdlLCIlKnMoJTA0eCkgIERlZldpbmRvd1Byb2MxNjogJXMgWyUwNHhdIHJldHVybmVkICUwOGx4XG4iLAogCQkJU1BZX0luZGVudExldmVsLCAiIiwgaFduZCwgU1BZX0dldE1zZ05hbWUoIG1zZyApLCBtc2csIGxSZXR1cm4gKTsKIAlicmVhazsKIAogICAgIGNhc2UgU1BZX1JFU1VMVF9ERUZXTkQzMjoKLQlkcHJpbnRmX2luZm8obWVzc2FnZSwiJSpzKCUwOHgpICBEZWZXaW5kb3dQcm9jMzI6ICVzIFslMDR4XSByZXR1cm5lZCAlMDhseFxuIiwKKwlUUkFDRShtZXNzYWdlLCIlKnMoJTA4eCkgIERlZldpbmRvd1Byb2MzMjogJXMgWyUwNHhdIHJldHVybmVkICUwOGx4XG4iLAogCQkJU1BZX0luZGVudExldmVsLCAiIiwgaFduZCwgU1BZX0dldE1zZ05hbWUoIG1zZyApLCBtc2csIGxSZXR1cm4gKTsKIAlicmVhazsKIAogICAgIGNhc2UgU1BZX1JFU1VMVF9PSzE2OgogCXBuYW1lID0gU1BZX0dldFduZE5hbWUoaFduZCk7Ci0gICAgICAgIGRwcmludGZfaW5mbyhtZXNzYWdlLCIlKnMoJTA0eCkgJS0xNnMgbWVzc2FnZSBbJTA0eF0gJXMgcmV0dXJuZWQgJTA4bHhcbiIsCisgICAgICAgIFRSQUNFKG1lc3NhZ2UsIiUqcyglMDR4KSAlLTE2cyBtZXNzYWdlIFslMDR4XSAlcyByZXR1cm5lZCAlMDhseFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIFNQWV9JbmRlbnRMZXZlbCwgIiIsIGhXbmQsIHBuYW1lLCBtc2csCiAgICAgICAgICAgICAgICAgICAgICAgICBTUFlfR2V0TXNnTmFtZSggbXNnICksIGxSZXR1cm4gKTsKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIFNQWV9SRVNVTFRfT0szMjoKIAlwbmFtZSA9IFNQWV9HZXRXbmROYW1lKGhXbmQpOwotICAgICAgICBkcHJpbnRmX2luZm8obWVzc2FnZSwiJSpzKCUwOHgpICUtMTZzIG1lc3NhZ2UgWyUwNHhdICVzIHJldHVybmVkICUwOGx4XG4iLAorICAgICAgICBUUkFDRShtZXNzYWdlLCIlKnMoJTA4eCkgJS0xNnMgbWVzc2FnZSBbJTA0eF0gJXMgcmV0dXJuZWQgJTA4bHhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBTUFlfSW5kZW50TGV2ZWwsICIiLCBoV25kLCBwbmFtZSwgbXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgU1BZX0dldE1zZ05hbWUoIG1zZyApLCBsUmV0dXJuICk7CiAgICAgICAgIGJyZWFrOyAKIAogICAgIGNhc2UgU1BZX1JFU1VMVF9JTlZBTElESFdORDE2OgogCXBuYW1lID0gU1BZX0dldFduZE5hbWUoaFduZCk7Ci0gICAgICAgIGRwcmludGZfd2FybihtZXNzYWdlLCAiJSpzKCUwNHgpICUtMTZzIG1lc3NhZ2UgWyUwNHhdICVzIEhBUyBJTlZBTElEIEhXTkRcbiIsCisgICAgICAgIFdBUk4obWVzc2FnZSwgIiUqcyglMDR4KSAlLTE2cyBtZXNzYWdlIFslMDR4XSAlcyBIQVMgSU5WQUxJRCBIV05EXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgU1BZX0luZGVudExldmVsLCAiIiwgaFduZCwgcG5hbWUsIG1zZywKICAgICAgICAgICAgICAgICAgICAgICAgIFNQWV9HZXRNc2dOYW1lKCBtc2cgKSApOwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgU1BZX1JFU1VMVF9JTlZBTElESFdORDMyOgogCXBuYW1lID0gU1BZX0dldFduZE5hbWUoaFduZCk7Ci0gICAgICAgIGRwcmludGZfd2FybihtZXNzYWdlLCAiJSpzKCUwOHgpICUtMTZzIG1lc3NhZ2UgWyUwNHhdICVzIEhBUyBJTlZBTElEIEhXTkRcbiIsCisgICAgICAgIFdBUk4obWVzc2FnZSwgIiUqcyglMDh4KSAlLTE2cyBtZXNzYWdlIFslMDR4XSAlcyBIQVMgSU5WQUxJRCBIV05EXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgU1BZX0luZGVudExldmVsLCAiIiwgaFduZCwgcG5hbWUsIG1zZywKICAgICAgICAgICAgICAgICAgICAgICAgIFNQWV9HZXRNc2dOYW1lKCBtc2cgKSApOwogICAgICAgICBicmVhazsKQEAgLTc2OCwxMiArNzY2LDEyIEBACiAgICAgaW50IGk7CiAgICAgY2hhciBidWZmZXJbMTAyNF07CiAKLSAgICBpZiAoIWRlYnVnZ2luZ19pbmZvKG1lc3NhZ2UpKSByZXR1cm4gVFJVRTsKKyAgICBpZiAoIVRSQUNFX09OKG1lc3NhZ2UpKSByZXR1cm4gVFJVRTsKIAogICAgIFBST0ZJTEVfR2V0V2luZUluaVN0cmluZyggIlNweSIsICJJbmNsdWRlIiwgIiIsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikgKTsKICAgICBpZiAoYnVmZmVyWzBdICYmIHN0cmNtcCggYnVmZmVyLCAiSU5DTFVERUFMTCIgKSkKICAgICB7Ci0gICAgICAgIGRwcmludGZfaW5mbyhtZXNzYWdlLCAiU3B5SW5pdDogSW5jbHVkZT0lc1xuIiwgYnVmZmVyICk7CisgICAgICAgIFRSQUNFKG1lc3NhZ2UsICJJbmNsdWRlPSVzXG4iLCBidWZmZXIgKTsKICAgICAgICAgZm9yIChpID0gMDsgaSA8PSBTUFlfTUFYX01TR05VTTsgaSsrKQogICAgICAgICAgICAgU1BZX0V4Y2x1ZGVbaV0gPSAoTWVzc2FnZVR5cGVOYW1lc1tpXSAmJiAhc3Ryc3RyKGJ1ZmZlcixNZXNzYWdlVHlwZU5hbWVzW2ldKSk7CiAgICAgfQpAQCAtNzgxLDcgKzc3OSw3IEBACiAgICAgUFJPRklMRV9HZXRXaW5lSW5pU3RyaW5nKCAiU3B5IiwgIkV4Y2x1ZGUiLCAiIiwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSApOwogICAgIGlmIChidWZmZXJbMF0pCiAgICAgewotICAgICAgICBkcHJpbnRmX2luZm8obWVzc2FnZSwgIlNweUluaXQ6IEV4Y2x1ZGU9JXNcbiIsIGJ1ZmZlciApOworICAgICAgICBUUkFDRShtZXNzYWdlLCAiRXhjbHVkZT0lc1xuIiwgYnVmZmVyICk7CiAgICAgICAgIGlmICghc3RyY21wKCBidWZmZXIsICJFWENMVURFQUxMIiApKQogICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8PSBTUFlfTUFYX01TR05VTTsgaSsrKSBTUFlfRXhjbHVkZVtpXSA9IFRSVUU7CiAgICAgICAgIGVsc2UKZGlmZiAtLWdpdCBhL21pc2Mvc3RyZXNzLmMgYi9taXNjL3N0cmVzcy5jCmluZGV4IDU3MTQ1NTIuLjYzMjBkZmEgMTAwNjQ0Ci0tLSBhL21pc2Mvc3RyZXNzLmMKKysrIGIvbWlzYy9zdHJlc3MuYwpAQCAtNyw3ICs3LDcgQEAKIAogaW50IFdJTkFQSSBBbGxvY0Rpc2tTcGFjZShsb25nIGxMZWZ0LCBVSU5UMTYgdURyaXZlKQogewotCWRwcmludGZfZml4bWUoc3RyZXNzLCAic3RyZXNzLmRsbDogQWxsb2NEaXNrU3BhY2UoJWQsICVsZCkgLSBzdHViXG4iLCAKKwlGSVhNRShzdHJlc3MsICIoJWQsICVsZCkgLSBzdHViXG4iLCAKIAkJICAgICAgIHVEcml2ZSwgbExlZnQpOwogCiAJcmV0dXJuIDE7CkBAIC0xNSw3ICsxNSw3IEBACiAKIGludCBXSU5BUEkgQWxsb2NGaWxlSGFuZGxlcyhpbnQgTGVmdCkKIHsKLQlkcHJpbnRmX2luZm8oc3RyZXNzLCAic3RyZXNzLmRsbDogQWxsb2NGaWxlSGFuZGxlcyglZCkgLSBzdHViXG4iLCBMZWZ0KTsKKwlUUkFDRShzdHJlc3MsICIoJWQpIC0gc3R1YlxuIiwgTGVmdCk7CiAKIAlpZiAoTGVmdCA8IDApCiAJCXJldHVybiAtMTsKQEAgLTI1LDQ4ICsyNSw0OCBAQAogCiBCT09MMTYgV0lOQVBJIEFsbG9jR0RJTWVtKFVJTlQxNiB1TGVmdCkKIHsKLQlkcHJpbnRmX2luZm8oc3RyZXNzLCAic3RyZXNzLmRsbDogQWxsb2NHRElNZW0oJWQpIC0gc3R1YlxuIiwgdUxlZnQpOworCVRSQUNFKHN0cmVzcywgIiglZCkgLSBzdHViXG4iLCB1TGVmdCk7CiAKIAlyZXR1cm4gMTsKIH0KIAogQk9PTDE2IFdJTkFQSSBBbGxvY01lbShEV09SRCBkd0xlZnQpCiB7Ci0JZHByaW50Zl9maXhtZShzdHJlc3MsICJzdHJlc3MuZGxsOiBBbGxvY01lbSglbGQpIC0gc3R1YlxuIiwgZHdMZWZ0KTsKKwlGSVhNRShzdHJlc3MsICIoJWxkKSAtIHN0dWJcbiIsIGR3TGVmdCk7CiAKIAlyZXR1cm4gMTsKIH0KIAogQk9PTDE2IFdJTkFQSSBBbGxvY1VzZXJNZW0oVUlOVDE2IHVDb250aWcpCiB7Ci0JZHByaW50Zl9pbmZvKHN0cmVzcywgInN0cmVzcy5kbGw6IEFsbG9jVXNlck1lbSAlZFxuIiwgdUNvbnRpZyk7CisJVFJBQ0Uoc3RyZXNzLCAiQWxsb2NVc2VyTWVtICVkXG4iLCB1Q29udGlnKTsKIAogCXJldHVybiAxOwogfQogCiB2b2lkIFdJTkFQSSBGcmVlQWxsTWVtKHZvaWQpCiB7Ci0JZHByaW50Zl9pbmZvKHN0cmVzcywgInN0cmVzcy5kbGw6IEZyZWVBbGxNZW1cbiIpOworCVRSQUNFKHN0cmVzcywgIkZyZWVBbGxNZW1cbiIpOwogfQogCiB2b2lkIFdJTkFQSSBGcmVlQWxsR0RJTWVtKHZvaWQpCiB7Ci0JZHByaW50Zl9pbmZvKHN0cmVzcywgInN0cmVzcy5kbGw6IEZyZWVBbGxHRElNZW1cbiIpOworCVRSQUNFKHN0cmVzcywgIkZyZWVBbGxHRElNZW1cbiIpOwogfQogCiB2b2lkIFdJTkFQSSBGcmVlQWxsVXNlck1lbSh2b2lkKQogewotCWRwcmludGZfaW5mbyhzdHJlc3MsICJzdHJlc3MuZGxsOiBGcmVlQWxsVXNlck1lbVxuIik7CisJVFJBQ0Uoc3RyZXNzLCAiRnJlZUFsbFVzZXJNZW1cbiIpOwogfQogCiB2b2lkIFdJTkFQSSBHZXRGcmVlQWxsVXNlck1lbSh2b2lkKQogewotICAgICAgIGRwcmludGZfaW5mbyhzdHJlc3MsICJzdHJlc3MuZGxsOiBHZXRGcmVlQWxsVXNlck1lbVxuIik7CisgICAgICAgVFJBQ0Uoc3RyZXNzLCAiR2V0RnJlZUFsbFVzZXJNZW1cbiIpOwogfQogCiBpbnQgV0lOQVBJIEdldEZyZWVGaWxlSGFuZGxlcyh2b2lkKQogewotCWRwcmludGZfaW5mbyhzdHJlc3MsICJzdHJlc3MuZGxsOiBHZXRGcmVlRmlsZUhhbmRsZXNcbiIpOworCVRSQUNFKHN0cmVzcywgIkdldEZyZWVGaWxlSGFuZGxlc1xuIik7CiAKICNpZm5kZWYgT1BFTl9NQVgKIAlyZXR1cm4gX1BPU0lYX09QRU5fTUFYOwpAQCAtNzcsMTAgKzc3LDEwIEBACiAKIHZvaWQgV0lOQVBJIFVuQWxsb2NEaXNrU3BhY2UoVUlOVDE2IGRyaXZlKQogewotCWRwcmludGZfaW5mbyhzdHJlc3MsICJzdHJlc3MuZGxsOiBVbkFsbG9jRGlza1NwYWNlICVkXG4iLCBkcml2ZSk7CisJVFJBQ0Uoc3RyZXNzLCAiVW5BbGxvY0Rpc2tTcGFjZSAlZFxuIiwgZHJpdmUpOwogfQogCiB2b2lkIFdJTkFQSSBVbkFsbG9jRmlsZUhhbmRsZXModm9pZCkKIHsKLQlkcHJpbnRmX2luZm8oc3RyZXNzLCAic3RyZXNzLmRsbDogR2V0RnJlZUFsbFVzZXJNZW1cbiIpOworCVRSQUNFKHN0cmVzcywgIkdldEZyZWVBbGxVc2VyTWVtXG4iKTsKIH0KZGlmZiAtLWdpdCBhL21pc2MvdG9vbGhlbHAuYyBiL21pc2MvdG9vbGhlbHAuYwppbmRleCA5ZWM4YzZmLi5hNjUyMGQ4IDEwMDY0NAotLS0gYS9taXNjL3Rvb2xoZWxwLmMKKysrIGIvbWlzYy90b29saGVscC5jCkBAIC0zNSw3ICszNSw3IEBACiB7CiAgICAgaW50CWk7CiAKLSAgICBkcHJpbnRmX2luZm8odG9vbGhlbHAsICJOb3RpZnlSZWdpc3RlcigleCwlbHgsJXgpIGNhbGxlZC5cbiIsCisgICAgVFJBQ0UodG9vbGhlbHAsICIoJXgsJWx4LCV4KSBjYWxsZWQuXG4iLAogICAgICAgICAgICAgICAgICAgICAgIGh0YXNrLCAoRFdPUkQpbHBmbkNhbGxiYWNrLCB3RmxhZ3MgKTsKICAgICBpZiAoIWh0YXNrKSBodGFzayA9IEdldEN1cnJlbnRUYXNrKCk7CiAgICAgZm9yIChpPTA7aTxucm9mbm90aWZ5cztpKyspCkBAIC02MSw3ICs2MSw3IEBACiB7CiAgICAgaW50CWk7CiAgICAgCi0gICAgZHByaW50Zl9pbmZvKHRvb2xoZWxwLCAiTm90aWZ5VW5yZWdpc3RlcigleCkgY2FsbGVkLlxuIiwgaHRhc2sgKTsKKyAgICBUUkFDRSh0b29saGVscCwgIigleCkgY2FsbGVkLlxuIiwgaHRhc2sgKTsKICAgICBpZiAoIWh0YXNrKSBodGFzayA9IEdldEN1cnJlbnRUYXNrKCk7CiAgICAgZm9yIChpPW5yb2Zub3RpZnlzO2ktLTspCiAgICAgICAgIGlmIChub3RpZnlzW2ldLmh0YXNrPT1odGFzaykKZGlmZiAtLWdpdCBhL21pc2MvdHdlYWsuYyBiL21pc2MvdHdlYWsuYwppbmRleCBlMzlmOTVhLi42MDNmOWRmIDEwMDY0NAotLS0gYS9taXNjL3R3ZWFrLmMKKysrIGIvbWlzYy90d2Vhay5jCkBAIC0yMTAsOCArMjEwLDggQEAKIAkgICAgUFJPRklMRV9HZXRXaW5lSW5pSW50KCJUd2Vhay5Db2xvcnMiLCAiUGVuMDA5NS5Hcm4iLCAweDAwKSwKIAkgICAgUFJPRklMRV9HZXRXaW5lSW5pSW50KCJUd2Vhay5Db2xvcnMiLCAiUGVuMDA5NS5CbHUiLCAweDAwKSkpOwogCi0gICAgZHByaW50Zl9pbmZvKHR3ZWFrLCAiVFdFQUtfVmFySW5pdDogVXNpbmcgJXMgbG9vayBhbmQgZmVlbC5cbiIsCi0JCSAgVFdFQUtfV2luOTVMb29rID8gIldpbjk1IiA6ICJXaW4zLjEiKTsKKyAgICBUUkFDRSh0d2VhaywgIlVzaW5nICVzIGxvb2sgYW5kIGZlZWwuXG4iLAorCQkgVFdFQUtfV2luOTVMb29rID8gIldpbjk1IiA6ICJXaW4zLjEiKTsKICAgICByZXR1cm4gMTsKIH0KIApkaWZmIC0tZ2l0IGEvbWlzYy92ZXIuYyBiL21pc2MvdmVyLmMKaW5kZXggZDU4ZGY4YS4uZGE5ZjhlNSAxMDA2NDQKLS0tIGEvbWlzYy92ZXIuYworKysgYi9taXNjL3Zlci5jCkBAIC01NCw3ICs1NCw3IEBACiAgICAgY2hhciBjb25zdCAqIHRlc3RzdHJpbmcsCiAgICAgY2hhciBjb25zdCAqIGVwaWxvZ3VlICkKIHsKLSAgICBkcHJpbnRmX2luZm8odmVyLCAiJXMgJXAgKFwiJXNcIikgJXNcbiIsIHByb2xvZ3VlLCAKKyAgICBUUkFDRSh2ZXIsICIlcyAlcCAoXCIlc1wiKSAlc1xuIiwgcHJvbG9ndWUsIAogCQkodm9pZCBjb25zdCAqKSB0ZXN0c3RyaW5nLCAKIAkJdGVzdHN0cmluZyA/IHRlc3RzdHJpbmcgOiAiKG51bGwpIiwKIAkJZXBpbG9ndWUpOwpAQCAtNzIsNyArNzIsNyBAQAogewogICAgICAgICBkYmdfZGVjbF9zdHIodmVyLCAxMDI0KTsKIAotCWRwcmludGZfaW5mbyh2ZXIsIiBzdHJ1Y3R2ZXJzaW9uPTB4JWx4LjB4JWx4LCBmaWxldmVyc2lvbj0weCVseC4weCVseCwgcHJvZHVjdHZlcnNpb249MHglbHguMHglbHgsIGZsYWdtYXNrPTB4JWx4LCBmbGFncz0lcyVzJXMlcyVzJXNcbiIsCisJVFJBQ0UodmVyLCIgc3RydWN0dmVyc2lvbj0weCVseC4weCVseCwgZmlsZXZlcnNpb249MHglbHguMHglbHgsIHByb2R1Y3R2ZXJzaW9uPTB4JWx4LjB4JWx4LCBmbGFnbWFzaz0weCVseCwgZmxhZ3M9JXMlcyVzJXMlcyVzXG4iLAogCQkgICAgKHZmZmktPmR3U3RydWNWZXJzaW9uPj4xNiksdmZmaS0+ZHdTdHJ1Y1ZlcnNpb24mMHhGRkZGLAogCQkgICAgdmZmaS0+ZHdGaWxlVmVyc2lvbk1TLHZmZmktPmR3RmlsZVZlcnNpb25MUywKIAkJICAgIHZmZmktPmR3UHJvZHVjdFZlcnNpb25NUyx2ZmZpLT5kd1Byb2R1Y3RWZXJzaW9uTFMsCkBAIC0xMDYsNyArMTA2LDcgQEAKIAljYXNlIFZPU19fUE0zMjpkc3ByaW50Zih2ZXIsIlBNMzIiKTticmVhazsKIAlkZWZhdWx0OmRzcHJpbnRmKHZlciwiVU5LTk9XTigweCVseCkiLHZmZmktPmR3RmlsZU9TJjB4RkZGRik7YnJlYWs7CiAJfQotCWRwcmludGZfaW5mbyh2ZXIsICIoJXMpXG4iLCBkYmdfc3RyKHZlcikpOworCVRSQUNFKHZlciwgIiglcylcbiIsIGRiZ19zdHIodmVyKSk7CiAKIAlkYmdfcmVzZXRfc3RyKHZlcik7CiAJc3dpdGNoICh2ZmZpLT5kd0ZpbGVUeXBlKSB7CkBAIC0xNzIsOSArMTcyLDkgQEAKIAljYXNlIFZGVF9WWEQ6ZHNwcmludGYodmVyLCJmaWxldHlwZT1WWEQiKTticmVhazsKIAljYXNlIFZGVF9TVEFUSUNfTElCOmRzcHJpbnRmKHZlciwiZmlsZXR5cGU9U1RBVElDX0xJQiIpO2JyZWFrOwogCX0KLQlkcHJpbnRmX2luZm8odmVyLCAiJXNcbiIsIGRiZ19zdHIodmVyKSk7CisJVFJBQ0UodmVyLCAiJXNcbiIsIGRiZ19zdHIodmVyKSk7CiAKLQlkcHJpbnRmX2luZm8odmVyLCAiICBmaWxlZGF0YT0weCVseC4weCVseFxuIiwKKwlUUkFDRSh2ZXIsICIgIGZpbGVkYXRhPTB4JWx4LjB4JWx4XG4iLAogCQkgICAgdmZmaS0+ZHdGaWxlRGF0ZU1TLHZmZmktPmR3RmlsZURhdGVMUyk7CiB9CiAKQEAgLTMxNiwxMyArMzE2LDEzIEBACiAJbmVoZG9mZnNldCA9IExaVEVMTChsemZkKTsKIAlMWlJFQUQoJm5laGQpOwogCWlmIChuZWhkLnJlc291cmNlX3RhYl9vZmZzZXQ9PW5laGQucm5hbWVfdGFiX29mZnNldCkgewotCQlkcHJpbnRmX2luZm8odmVyLCJubyByZXNvdXJjZXMgaW4gTkUgZGxsXG4iKTsKKwkJVFJBQ0UodmVyLCJubyByZXNvdXJjZXMgaW4gTkUgZGxsXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCUxaU2VlazMyKGx6ZmQsbmVoZC5yZXNvdXJjZV90YWJfb2Zmc2V0K25laGRvZmZzZXQsU0VFS19TRVQpOwogCUxaUkVBRCgmc2hpZnRjb3VudCk7Ci0JZHByaW50Zl9pbmZvKHZlciwic2hpZnRjb3VudCBpcyAlZFxuIixzaGlmdGNvdW50KTsKLQlkcHJpbnRmX2luZm8odmVyLCJyZWFkaW5nIHJlc291cmNlIHR5cGVpbmZvIGRpci5cbiIpOworCVRSQUNFKHZlciwic2hpZnRjb3VudCBpcyAlZFxuIixzaGlmdGNvdW50KTsKKwlUUkFDRSh2ZXIsInJlYWRpbmcgcmVzb3VyY2UgdHlwZWluZm8gZGlyLlxuIik7CiAKIAlpZiAoIUhJV09SRCh0eXBlaWQpKSB0eXBlaWQgPSAoU0VHUFRSKShMT1dPUkQodHlwZWlkKSB8IDB4ODAwMCk7CiAJaWYgKCFISVdPUkQocmVzaWQpKSAgcmVzaWQgID0gKFNFR1BUUikoTE9XT1JEKHJlc2lkKSB8IDB4ODAwMCk7CkBAIC0zMzIsNyArMzMyLDcgQEAKIAkJTFpSRUFEKCZ0aSk7CiAJCWlmICghdGkudHlwZV9pZCkKIAkJCXJldHVybiAwOwotCQlkcHJpbnRmX2luZm8odmVyLCIgICAgdGkudHlwZWlkID0lMDR4LGNvdW50PSVkXG4iLHRpLnR5cGVfaWQsdGkuY291bnQpOworCQlUUkFDRSh2ZXIsIiAgICB0aS50eXBlaWQgPSUwNHgsY291bnQ9JWRcbiIsdGkudHlwZV9pZCx0aS5jb3VudCk7CiAKIAkJc2tpcGZsYWc9MDsKIAkJaWYgKCFISVdPUkQodHlwZWlkKSkgewpAQCAtMzU2LDcgKzM1Niw3IEBACiAJCQkJc3RyPXhtYWxsb2MobGVuKTsKIAkJCQlpZiAobGVuIT1MWlJlYWQzMihsemZkLHN0cixsZW4pKQogCQkJCQlyZXR1cm4gMDsKLQkJCQlkcHJpbnRmX2luZm8odmVyLCJyZWFkICVzIHRvIGNvbXBhcmUgaXQgd2l0aCAlc1xuIiwKKwkJCQlUUkFDRSh2ZXIsInJlYWQgJXMgdG8gY29tcGFyZSBpdCB3aXRoICVzXG4iLAogCQkJCQlzdHIsKGNoYXIqKVBUUl9TRUdfVE9fTElOKHR5cGVpZCkKIAkJCQkpOwogCQkJCWlmIChsc3RyY21waTMyQShzdHIsKGNoYXIqKVBUUl9TRUdfVE9fTElOKHR5cGVpZCkpKQpAQCAtMzc0LDcgKzM3NCw3IEBACiAJCQlpbnQJbGVuOwogCiAJCQlMWlJFQUQoJm5pKTsKLQkJCWRwcmludGZfaW5mbyh2ZXIsIgluaS5pZD0lNHgsb2Zmc2V0PSVkLGxlbmd0aD0lZFxuIiwKKwkJCVRSQUNFKHZlciwiCW5pLmlkPSU0eCxvZmZzZXQ9JWQsbGVuZ3RoPSVkXG4iLAogCQkJCW5pLmlkLG5pLm9mZnNldCxuaS5sZW5ndGgKIAkJCSk7CiAJCQlza2lwZmxhZz0xOwpAQCAtMzk3LDcgKzM5Nyw3IEBACiAJCQkJCXN0cj14bWFsbG9jKGxlbik7CiAJCQkJCWlmIChsZW4hPUxaUmVhZDMyKGx6ZmQsc3RyLGxlbikpCiAJCQkJCQlyZXR1cm4gMDsKLQkJCQkJZHByaW50Zl9pbmZvKHZlciwicmVhZCAlcyB0byBjb21wYXJlIGl0IHdpdGggJXNcbiIsCisJCQkJCVRSQUNFKHZlciwicmVhZCAlcyB0byBjb21wYXJlIGl0IHdpdGggJXNcbiIsCiAJCQkJCQlzdHIsKGNoYXIqKVBUUl9TRUdfVE9fTElOKHR5cGVpZCkKIAkJCQkJKTsKIAkJCQkJaWYgKCFsc3RyY21waTMyQShzdHIsKGNoYXIqKVBUUl9TRUdfVE9fTElOKHR5cGVpZCkpKQpAQCAtNDE2LDcgKzQxNiw3IEBACiAJCQkJZnJlZShyZGF0YSk7CiAJCQkJcmV0dXJuIDA7CiAJCQl9Ci0JCQlkcHJpbnRmX2luZm8odmVyLCJyZXNvdXJjZSBmb3VuZC5cbiIpOworCQkJVFJBQ0UodmVyLCJyZXNvdXJjZSBmb3VuZC5cbiIpOwogCQkJKnJlc2RhdGE9IChCWVRFKilyZGF0YTsKIAkJCSpyZXNsZW4JPSBsZW47CiAJCQlyZXR1cm4gMTsKQEAgLTQ0NSw3ICs0NDUsNyBAQAogCXBlaGRvZmZzZXQgPSBMWlRFTEwobHpmZCk7CiAJTFpSRUFEKCZwZWhkKTsKIAlyZXNkaXIgPSBwZWhkLk9wdGlvbmFsSGVhZGVyLkRhdGFEaXJlY3RvcnlbSU1BR0VfRklMRV9SRVNPVVJDRV9ESVJFQ1RPUlldOwotCWRwcmludGZfaW5mbyh2ZXIsImZpbmRfcGVfcmVzb3VyY2UoLiwlcCwlcCwuLi4uKVxuIix0eXBlaWQscmVzaWQpOworCVRSQUNFKHZlciwiKC4sJXAsJXAsLi4uLilcbiIsdHlwZWlkLHJlc2lkKTsKIAlpZiAoIXJlc2Rpci5TaXplKSB7CiAJCWZwcmludGYoc3RkZXJyLCJtaXNjL3Zlci5jOmZpbmRfcGVfcmVzb3VyY2UoKSBubyByZXNvdXJjZSBkaXJlY3RvcnkgZm91bmQgaW4gUEUgZmlsZS5cbiIpOwogCQlyZXR1cm4gMDsKQEAgLTQ4MCwyMCArNDgwLDIwIEBACiAJcmVzb3VyY2VkaXIgPSAoTFBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUlkpKGltYWdlK3Jlc2Rpci5WaXJ0dWFsQWRkcmVzcyk7CiAJeHJlc2RpciA9IEdldFJlc0RpckVudHJ5VyhyZXNvdXJjZWRpcix0eXBlaWQsKERXT1JEKXJlc291cmNlZGlyLEZBTFNFKTsKIAlpZiAoIXhyZXNkaXIpIHsKLQkJZHByaW50Zl9pbmZvKHZlciwiLi4ubm8gdHlwZWlkIGVudHJ5IGZvdW5kIGZvciAlcFxuIix0eXBlaWQpOworCQlUUkFDRSh2ZXIsIi4uLm5vIHR5cGVpZCBlbnRyeSBmb3VuZCBmb3IgJXBcbiIsdHlwZWlkKTsKIAkJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLGltYWdlKTsKIAkJcmV0dXJuIDA7CiAJfQogCXhyZXNkaXIgPSBHZXRSZXNEaXJFbnRyeVcoeHJlc2RpcixyZXNpZCwoRFdPUkQpcmVzb3VyY2VkaXIsRkFMU0UpOwogCWlmICgheHJlc2RpcikgewotCQlkcHJpbnRmX2luZm8odmVyLCIuLi5ubyByZXNpZCBlbnRyeSBmb3VuZCBmb3IgJXBcbiIscmVzaWQpOworCQlUUkFDRSh2ZXIsIi4uLm5vIHJlc2lkIGVudHJ5IGZvdW5kIGZvciAlcFxuIixyZXNpZCk7CiAJCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxpbWFnZSk7CiAJCXJldHVybiAwOwogCX0KIAkKIAl4cmVzZGlyID0gR2V0UmVzRGlyRW50cnlXKHhyZXNkaXIsMCwoRFdPUkQpcmVzb3VyY2VkaXIsVFJVRSk7CiAJaWYgKCF4cmVzZGlyKSB7Ci0JCWRwcmludGZfaW5mbyh2ZXIsIi4uLm5vIDAgKGRlZmF1bHQgbGFuZ3VhZ2UpIGVudHJ5IGZvdW5kIGZvciAlcFxuIixyZXNpZCk7CisJCVRSQUNFKHZlciwiLi4ubm8gMCAoZGVmYXVsdCBsYW5ndWFnZSkgZW50cnkgZm91bmQgZm9yICVwXG4iLHJlc2lkKTsKIAkJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLGltYWdlKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtNTI3LDcgKzUyNyw3IEBACiAJaW50CQkJcmVzbGVuPTA7CiAJaW50CQkJcmVzPTA7CiAKLQlkcHJpbnRmX2luZm8odmVyLCJHZXRGaWxlUmVzb3VyY2VTaXplKCVzLCVseCwlbHgsJXApXG4iLAorCVRSQUNFKHZlciwiKCVzLCVseCwlbHgsJXApXG4iLAogCQlmaWxlbmFtZSwoTE9ORylyZXN0eXBlLChMT05HKXJlc2lkLG9mZgogCSk7CiAJbHpmZD1MWk9wZW5GaWxlMzJBKGZpbGVuYW1lLCZvZnMsT0ZfUkVBRCk7CkBAIC01NjQsNyArNTY0LDcgQEAKIAlpbnQJCQlyZXM9MDsKIAlpbnQJCQlyZXNsZW49ZGF0YWxlbjsKIAotCWRwcmludGZfaW5mbyh2ZXIsIkdldEZpbGVSZXNvdXJjZSglcywlbHgsJWx4LCVsZCwlbGQsJXApXG4iLAorCVRSQUNFKHZlciwiKCVzLCVseCwlbHgsJWxkLCVsZCwlcClcbiIsCiAJCWZpbGVuYW1lLChMT05HKXJlc3R5cGUsKExPTkcpcmVzaWQsb2ZmLGRhdGFsZW4sZGF0YQogCSk7CiAKQEAgLTYwMyw3ICs2MDMsNyBAQAogCUJZVEUJYnVmWzE0NF07CiAJVlNfRklYRURGSUxFSU5GTyAqdmZmaTsKIAotCWRwcmludGZfaW5mbyh2ZXIsIkdldEZpbGVWZXJzaW9uSW5mb1NpemUxNiglcywlcClcbiIsZmlsZW5hbWUsaGFuZGxlKTsKKwlUUkFDRSh2ZXIsIiglcywlcClcbiIsZmlsZW5hbWUsaGFuZGxlKTsKIAlsZW49R2V0RmlsZVJlc291cmNlU2l6ZShmaWxlbmFtZSxWU19GSUxFX0lORk8sVlNfVkVSU0lPTl9JTkZPLGhhbmRsZSk7CiAJaWYgKCFsZW4pCiAJCXJldHVybiAwOwpAQCAtNjI5LDcgKzYyOSw3IEBACiAJaWYgKCooV09SRCopYnVmIDwgbGVuKQogCQlsZW4gPSAqKFdPUkQqKWJ1ZjsKIAotCWlmKGRlYnVnZ2luZ19pbmZvKHZlcikpCisJaWYoVFJBQ0VfT04odmVyKSkKIAkgIHByaW50X3ZmZmlfZGVidWcodmZmaSk7CiAKIAlyZXR1cm4gbGVuOwpAQCAtNjM4LDcgKzYzOCw3IEBACiAvKiBHZXRGaWxlVmVyc2lvbkluZm9TaXplMzJBCQkJW1ZFUlNJT04uMV0gKi8KIERXT1JEIFdJTkFQSSBHZXRGaWxlVmVyc2lvbkluZm9TaXplMzJBKExQQ1NUUiBmaWxlbmFtZSxMUERXT1JEIGhhbmRsZSkKIHsKLQlkcHJpbnRmX2luZm8odmVyLCJHZXRGaWxlVmVyc2lvbkluZm9TaXplMzJBKCVzLCVwKVxuIixmaWxlbmFtZSxoYW5kbGUpOworCVRSQUNFKHZlciwiKCVzLCVwKVxuIixmaWxlbmFtZSxoYW5kbGUpOwogCXJldHVybiBHZXRGaWxlVmVyc2lvbkluZm9TaXplMTYoZmlsZW5hbWUsaGFuZGxlKTsKIH0KIApAQCAtNjU1LDcgKzY1NSw3IEBACiBEV09SRCAgV0lOQVBJIEdldEZpbGVWZXJzaW9uSW5mbzE2KExQQ1NUUiBmaWxlbmFtZSxEV09SRCBoYW5kbGUsRFdPUkQgZGF0YXNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBkYXRhKQogewotCWRwcmludGZfaW5mbyh2ZXIsIkdldEZpbGVWZXJzaW9uSW5mbzE2KCVzLCVsZCwlbGQsJXApXG4iLAorCVRSQUNFKHZlciwiKCVzLCVsZCwlbGQsJXApXG4iLAogCQlmaWxlbmFtZSxoYW5kbGUsZGF0YXNpemUsZGF0YQogCSk7CiAJcmV0dXJuIEdldEZpbGVSZXNvdXJjZSgKQEAgLTcxMiwyNyArNzEyLDI3IEBACiAgICAgcmV0dmFsID0gMDsKIAogICAgIC8qIFByaW50IG91dCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gKi8KLSAgICBkcHJpbnRmX2luZm8odmVyLCAiVmVyRmluZEZpbGUoKSBjYWxsZWQgd2l0aCBwYXJhbWV0ZXJzOlxuIgotCQkiXHRmbGFncyA9ICV4IiwgZmxhZ3MpOworICAgIFRSQUNFKHZlciwgImNhbGxlZCB3aXRoIHBhcmFtZXRlcnM6XG4iCisJCSAiXHRmbGFncyA9ICV4IiwgZmxhZ3MpOwogICAgIGlmKGZsYWdzICYgVkZGRl9JU1NIQVJFREZJTEUpCi0JZHByaW50Zl9pbmZvKHZlciwgIiAoVkZGRl9JU1NIQVJFREZJTEUpXG4iKTsKKwlUUkFDRSh2ZXIsICIgKFZGRkZfSVNTSEFSRURGSUxFKVxuIik7CiAgICAgZWxzZQotCWRwcmludGZfaW5mbyh2ZXIsICJcbiIpOworCVRSQUNFKHZlciwgIlxuIik7CiAKICAgICB2ZXJfZHN0cmluZygiXHRscHN6RmlsZW5hbWUgPSAiLCBscHN6RmlsZW5hbWUsICIiKTsKICAgICB2ZXJfZHN0cmluZygiXHRscHN6V2luRGlyID0gIiwgbHBzeldpbkRpciwgIiIpOwogICAgIHZlcl9kc3RyaW5nKCJcdGxwc3pBcHBEaXIgPSAiLCBscHN6QXBwRGlyLCAiIik7CiAKLSAgICBkcHJpbnRmX2luZm8odmVyLCAiXHRscHN6Q3VyRGlyID0gJXBcbiIsIGxwc3pDdXJEaXIpOworICAgIFRSQUNFKHZlciwgIlx0bHBzekN1ckRpciA9ICVwXG4iLCBscHN6Q3VyRGlyKTsKICAgICBpZihscHVDdXJEaXJMZW4pCi0JZHByaW50Zl9pbmZvKHZlciwgIlx0bHB1Q3VyRGlyTGVuID0gJXAgKCV1KVxuIiwKKwlUUkFDRSh2ZXIsICJcdGxwdUN1ckRpckxlbiA9ICVwICgldSlcbiIsCiAJCSAgICBscHVDdXJEaXJMZW4sICpscHVDdXJEaXJMZW4pOwogICAgIGVsc2UKLQlkcHJpbnRmX2luZm8odmVyLCAiXHRscHVDdXJEaXJMZW4gPSAobnVsbClcbiIpOworCVRSQUNFKHZlciwgIlx0bHB1Q3VyRGlyTGVuID0gKG51bGwpXG4iKTsKIAotICAgIGRwcmludGZfaW5mbyh2ZXIsICJcdGxwc3pEZXN0RGlyID0gJXBcbiIsIGxwc3pEZXN0RGlyKTsKKyAgICBUUkFDRSh2ZXIsICJcdGxwc3pEZXN0RGlyID0gJXBcbiIsIGxwc3pEZXN0RGlyKTsKICAgICBpZihscHVEZXN0RGlyTGVuKQotCWRwcmludGZfaW5mbyh2ZXIsICJcdGxwdURlc3REaXJMZW4gPSAlcCAoJXUpXG4iLAorCVRSQUNFKHZlciwgIlx0bHB1RGVzdERpckxlbiA9ICVwICgldSlcbiIsCiAJCSAgICBscHVEZXN0RGlyTGVuLCAqbHB1RGVzdERpckxlbik7CiAKICAgICAvKiBGaWd1cmUgb3V0IHdoZXJlIHRoZSBmaWxlIHNob3VsZCBnbzsgc2hhcmVkIGZpbGVzIGRlZmF1bHQgdG8gdGhlCkBAIC04MjAsMjEgKzgyMCwyMSBAQAogCSpscHVDdXJEaXJMZW4gPSBjdXJEaXJTaXplUmVxOwogICAgIH0KIAotICAgIGRwcmludGZfaW5mbyh2ZXIsICJWZXJGaW5kRmlsZSgpIHJldCA9ICVsdSAoJXMlcyVzKVxuIiwgcmV0dmFsLAotCQkocmV0dmFsICYgVkZGX0NVUk5FREVTVCkgPyAiVkZGX0NVUk5FREVTVCAiIDogIiIsCi0JCShyZXR2YWwgJiBWRkZfRklMRUlOVVNFKSA/ICJWRkZfRklMRUlOVVNFICIgOiAiIiwKLQkJKHJldHZhbCAmIFZGRl9CVUZGVE9PU01BTEwpID8gIlZGRl9CVUZGVE9PU01BTEwgIiA6ICIiKTsKKyAgICBUUkFDRSh2ZXIsICJyZXQgPSAlbHUgKCVzJXMlcylcbiIsIHJldHZhbCwKKwkJIChyZXR2YWwgJiBWRkZfQ1VSTkVERVNUKSA/ICJWRkZfQ1VSTkVERVNUICIgOiAiIiwKKwkJIChyZXR2YWwgJiBWRkZfRklMRUlOVVNFKSA/ICJWRkZfRklMRUlOVVNFICIgOiAiIiwKKwkJIChyZXR2YWwgJiBWRkZfQlVGRlRPT1NNQUxMKSA/ICJWRkZfQlVGRlRPT1NNQUxMICIgOiAiIik7CiAKICAgICB2ZXJfZHN0cmluZygiXHQoRXhpdCkgbHBzekN1ckRpciA9ICIsIGxwc3pDdXJEaXIsICIiKTsKICAgICBpZihscHVDdXJEaXJMZW4pCi0JZHByaW50Zl9pbmZvKHZlciwgIlx0KEV4aXQpIGxwdUN1ckRpckxlbiA9ICVwICgldSlcbiIsCisJVFJBQ0UodmVyLCAiXHQoRXhpdCkgbHB1Q3VyRGlyTGVuID0gJXAgKCV1KVxuIiwKIAkJICAgIGxwdUN1ckRpckxlbiwgKmxwdUN1ckRpckxlbik7CiAgICAgZWxzZQotCWRwcmludGZfaW5mbyh2ZXIsICJcdChFeGl0KSBscHVDdXJEaXJMZW4gPSAobnVsbClcbiIpOworCVRSQUNFKHZlciwgIlx0KEV4aXQpIGxwdUN1ckRpckxlbiA9IChudWxsKVxuIik7CiAKICAgICB2ZXJfZHN0cmluZygiXHQoRXhpdCkgbHBzekRlc3REaXIgPSAiLCBscHN6RGVzdERpciwgIiIpOwogICAgIGlmKGxwdURlc3REaXJMZW4pCi0JZHByaW50Zl9pbmZvKHZlciwgIlx0KEV4aXQpIGxwdURlc3REaXJMZW4gPSAlcCAoJXUpXG4iLAorCVRSQUNFKHZlciwgIlx0KEV4aXQpIGxwdURlc3REaXJMZW4gPSAlcCAoJXUpXG4iLAogCQkgICAgbHB1RGVzdERpckxlbiwgKmxwdURlc3REaXJMZW4pOwogCiAgICAgcmV0dXJuIHJldHZhbDsKQEAgLTExOTEsMTMgKzExOTEsMTMgQEAKIAogCXdoaWxlICgxKSB7CiAJCWRiPShzdHJ1Y3QgZGJBKilibG9jazsKLQkJZHByaW50Zl9pbmZvKHZlciwiZGI9JXAsZGItPm5leHRvZmY9JWQsZGItPmRhdGFsZW49JWQsZGItPm5hbWU9JXNcbiIsCisJCVRSQUNFKHZlciwiZGI9JXAsZGItPm5leHRvZmY9JWQsZGItPmRhdGFsZW49JWQsZGItPm5hbWU9JXNcbiIsCiAJCQlkYixkYi0+bmV4dG9mZixkYi0+ZGF0YWxlbixkYi0+bmFtZQogCQkpOwogCQlpZiAoKCFkYi0+bmV4dG9mZikgfHwgKGJ1ZmZfcmVtYWluPD0wKSkgLyogbm8gbW9yZSBlbnRyaWVzID8gKi8KIAkJCXJldHVybiBOVUxMOwogCi0JCWRwcmludGZfaW5mbyh2ZXIsImNvbXBhcmluZyB3aXRoICVzXG4iLGRiLT5uYW1lKTsKKwkJVFJBQ0UodmVyLCJjb21wYXJpbmcgd2l0aCAlc1xuIixkYi0+bmFtZSk7CiAJCWlmICghbHN0cm5jbXBpMzJBKGRiLT5uYW1lLHN0cixzdWJzdHJsZW4pKSB7CiAJCQlpZiAobmV4dHNsYXNoKSB7CiAJCQkJaW5jX3NpemU9REFUQV9PRkZTRVRfQShkYikrKChkYi0+ZGF0YWxlbiszKSZ+Myk7CkBAIC0xMjQ4LDcgKzEyNDgsNyBAQAogCQl9IGVsc2UKIAkJCXZzID0gSEVBUF9zdHJkdXBBKEdldFByb2Nlc3NIZWFwKCksMCwibm8gZGF0YSIpOwogCi0JCWRwcmludGZfaW5mbyh2ZXIsImRiLT5uZXh0b2ZmPSVkLGRiLT5uYW1lPSVzLGRiLT5kYXRhPVwiJXNcIlxuIiwKKwkJVFJBQ0UodmVyLCJkYi0+bmV4dG9mZj0lZCxkYi0+bmFtZT0lcyxkYi0+ZGF0YT1cIiVzXCJcbiIsCiAJCQlkYi0+bmV4dG9mZix4cyx2cwogCQkpOwogCQlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsdnMpOwpAQCAtMTI4NCw3ICsxMjg0LDcgQEAKIAlMUFNUUglzOwogCUJZVEUJKmJsb2NrPVBUUl9TRUdfVE9fTElOKHNlZ2Jsb2NrKSwqYjsKIAotCWRwcmludGZfaW5mbyh2ZXIsIlZlclF1ZXJ5VmFsdWUxNiglcCwlcywlcCwlZClcbiIsCisJVFJBQ0UodmVyLCIoJXAsJXMsJXAsJWQpXG4iLAogCQlibG9jayxzdWJibG9jayxidWZmZXIsKmJ1ZmxlbgogCSk7CiAKQEAgLTEzMTIsMTAgKzEzMTIsMTAgQEAKIAkJKmJ1Zmxlbgk9IGRiLT5kYXRhbGVuOwogCQlpZiAoZGItPmJ0ZXh0KSB7CiAJCSAgICB4cyA9IEhFQVBfc3RyZHVwV3RvQShHZXRQcm9jZXNzSGVhcCgpLDAsKFdDSEFSKiliKTsKLQkJICAgIGRwcmludGZfaW5mbyh2ZXIsIi0+JXNcbiIseHMpOworCQkgICAgVFJBQ0UodmVyLCItPiVzXG4iLHhzKTsKIAkJICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCx4cyk7CiAJCX0gZWxzZQotCQkgICAgZHByaW50Zl9pbmZvKHZlciwiLT4lcFxuIixiKTsKKwkJICAgIFRSQUNFKHZlciwiLT4lcFxuIixiKTsKIAl9IGVsc2UgewogCQlzdHJ1Y3QJZGJBCSpkYjsKIAkJYj1fZmluZF9kYXRhQShibG9jayxzLCooV09SRCopYmxvY2spOwpAQCAtMTMzMCw5ICsxMzMwLDkgQEAKIAkJKmJ1Zmxlbgk9IGRiLT5kYXRhbGVuOwogCQkvKiB0aGUgc3RyaW5nIGlzIG9ubHkgcHJpbnRhYmxlLCBpZiBpdCBpcyBiZWxvdyBcXFN0cmluZ0ZpbGVJbmZvKi8KIAkJaWYgKCFsc3RybmNtcGkzMkEoIlZTX1ZFUlNJT05fSU5GT1xcU3RyaW5nRmlsZUluZm9cXCIscyxzdHJsZW4oIlZTX1ZFUlNJT05fSU5GT1xcU3RyaW5nRmlsZUluZm9cXCIpKSkKLQkJICAgIGRwcmludGZfaW5mbyh2ZXIsIgktPiAlcz0lc1xuIixzdWJibG9jayxiKTsKKwkJICAgIFRSQUNFKHZlciwiCS0+ICVzPSVzXG4iLHN1YmJsb2NrLGIpOwogCQllbHNlCi0JCSAgICBkcHJpbnRmX2luZm8odmVyLCIJLT4gJXM9JXBcbiIsc3ViYmxvY2ssYik7CisJCSAgICBUUkFDRSh2ZXIsIgktPiAlcz0lcFxuIixzdWJibG9jayxiKTsKIAl9CiAJKmJ1ZmZlcgk9IChiLWJsb2NrKStzZWdibG9jazsKIAlmcmVlKHMpOwpAQCAtMTM0NSw3ICsxMzQ1LDcgQEAKIAlCWVRFCSpiLCpibG9jaz0oTFBCWVRFKXZibG9jaywqKmJ1ZmZlcj0oTFBCWVRFKil2YnVmZmVyOwogCUxQU1RSCXM7CiAKLQlkcHJpbnRmX2luZm8odmVyLCJWZXJRdWVyeVZhbHVlMzJBKCVwLCVzLCVwLCVkKVxuIiwKKwlUUkFDRSh2ZXIsIiglcCwlcywlcCwlZClcbiIsCiAJCWJsb2NrLHN1YmJsb2NrLGJ1ZmZlciwqYnVmbGVuCiAJKTsKIApAQCAtMTM3NCwxMCArMTM3NCwxMCBAQAogCQliCT0gYitEQVRBX09GRlNFVF9XKGRiKTsKIAkJaWYgKGRiLT5idGV4dCkgewogCQkgICAgeHMgPSBIRUFQX3N0cmR1cFd0b0EoR2V0UHJvY2Vzc0hlYXAoKSwwLChXQ0hBUiopYik7Ci0JCSAgICBkcHJpbnRmX2luZm8odmVyLCItPiVzXG4iLHhzKTsKKwkJICAgIFRSQUNFKHZlciwiLT4lc1xuIix4cyk7CiAJCSAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAseHMpOwogCQl9IGVsc2UKLQkJICAgIGRwcmludGZfaW5mbyh2ZXIsIi0+JXBcbiIsYik7CisJCSAgICBUUkFDRSh2ZXIsIi0+JXBcbiIsYik7CiAJCS8qIFRoaXMgaXMgYSBsZWFrLiAgKi8KIAkJYiA9IEhFQVBfc3RyZHVwV3RvQShHZXRQcm9jZXNzSGVhcCgpLDAsKFdDSEFSKiliKTsKIAl9IGVsc2UgewpAQCAtMTM5NSw5ICsxMzk1LDkgQEAKIAogCQkvKiB0aGUgc3RyaW5nIGlzIG9ubHkgcHJpbnRhYmxlLCBpZiBpdCBpcyBiZWxvdyBcXFN0cmluZ0ZpbGVJbmZvKi8KIAkJaWYgKCFsc3RybmNtcGkzMkEoIlZTX1ZFUlNJT05fSU5GT1xcU3RyaW5nRmlsZUluZm9cXCIscyxzdHJsZW4oIlZTX1ZFUlNJT05fSU5GT1xcU3RyaW5nRmlsZUluZm9cXCIpKSkKLQkJICAgIGRwcmludGZfaW5mbyh2ZXIsIgktPiAlcz0lc1xuIixzdWJibG9jayxiKTsKKwkJICAgIFRSQUNFKHZlciwiCS0+ICVzPSVzXG4iLHN1YmJsb2NrLGIpOwogCQllbHNlCi0JCSAgICBkcHJpbnRmX2luZm8odmVyLCIJLT4gJXM9JXBcbiIsc3ViYmxvY2ssYik7CisJCSAgICBUUkFDRSh2ZXIsIgktPiAlcz0lcFxuIixzdWJibG9jayxiKTsKIAl9CiAJKmJ1ZmZlcgk9IGI7CiAJZnJlZShzKTsKZGlmZiAtLWdpdCBhL21pc2Mvd2luZGVidWcuYyBiL21pc2Mvd2luZGVidWcuYwppbmRleCA1ZjczMjk5Li4zZjE3ZjliIDEwMDY0NAotLS0gYS9taXNjL3dpbmRlYnVnLmMKKysrIGIvbWlzYy93aW5kZWJ1Zy5jCkBAIC0yMCwxMCArMjAsMTEgQEAKIAlzd2l0Y2ggKEFYX3JlZyhjb250ZXh0KSkKIAl7CiAJCWNhc2UgMHgwMDBEOgotCQljYXNlIDB4MDAwRToJLyogX19hc21fXygicHVzaGwgJDB4MFxuXHQiKTsgPz8/ICovCi0JCQkJYnJlYWs7CisJCWNhc2UgMHgwMDBFOgogCQljYXNlIDB4MDA2MDoJLyogZG8gbm90aGluZyAqLwogCQkJCWJyZWFrOworCQljYXNlIDB4MDA2MjogCisJCQkJYnJlYWs7CiAJCWNhc2UgMHgwMDYzOgkvKiBkbyBzb21ldGhpbmcgY29tcGxpY2F0ZWQgKi8KIAkJCQlicmVhazsKIAkJY2FzZSAweDAwNjQ6CS8qIGRvIHNvbWV0aGluZyBjb21wbGljYXRlZCAqLwpkaWZmIC0tZ2l0IGEvbWlzYy93aW5zb2NrLmMgYi9taXNjL3dpbnNvY2suYwppbmRleCAyMzljNDU2Li5lYzc4YjRiIDEwMDY0NAotLS0gYS9taXNjL3dpbnNvY2suYworKysgYi9taXNjL3dpbnNvY2suYwpAQCAtMjA1LDcgKzIwNSw3IEBACiAKICAgICBvcHRsZW4gPSBzaXplb2Yob3B0dmFsKTsKICAgICBnZXRzb2Nrb3B0KHMsIFNPTF9TT0NLRVQsIFNPX0VSUk9SLCAmb3B0dmFsLCAmb3B0bGVuKTsKLSAgICBpZiAob3B0dmFsKSBkcHJpbnRmX3dhcm4od2luc29jaywgIlx0WyVpXSBlcnJvcjogJWRcbiIsIHMsIG9wdHZhbCk7CisgICAgaWYgKG9wdHZhbCkgV0FSTih3aW5zb2NrLCAiXHRbJWldIGVycm9yOiAlZFxuIiwgcywgb3B0dmFsKTsKICAgICByZXR1cm4gb3B0dmFsICE9IDA7CiB9CiAKQEAgLTI0OCw3ICsyNDgsNyBAQAogCWlmKCBiMzIgKSB3c2ZkczMyLT5mZF9jb3VudCA9IGo7CiAJZWxzZSB3c2ZkczE2LT5mZF9jb3VudCA9IGo7CiAKLQlkcHJpbnRmX2luZm8od2luc29jaywgIlxuIik7CisJVFJBQ0Uod2luc29jaywgIlxuIik7CiAjdW5kZWYgd3NmZHMzMgogI3VuZGVmIHdzZmRzMTYKICAgICB9CkBAIC0zMDMsNyArMzAzLDcgQEAKICAgICBIVEFTSzE2ICAgICAgICAgICAgIHRpZCA9IEdldEN1cnJlbnRUYXNrKCk7CiAgICAgTFBXU0lORk8gICAgICAgICAgICBwd3NpOwogCi0gICAgZHByaW50Zl9pbmZvKHdpbnNvY2ssICJXU0FTdGFydHVwOiB2ZXJSZXE9JXhcbiIsIHdWZXJzaW9uUmVxdWVzdGVkKTsKKyAgICBUUkFDRSh3aW5zb2NrLCAidmVyUmVxPSV4XG4iLCB3VmVyc2lvblJlcXVlc3RlZCk7CiAKICAgICBpZiAoTE9CWVRFKHdWZXJzaW9uUmVxdWVzdGVkKSA8IDEgfHwgKExPQllURSh3VmVyc2lvblJlcXVlc3RlZCkgPT0gMSAmJgogICAgICAgICBISUJZVEUod1ZlcnNpb25SZXF1ZXN0ZWQpIDwgMSkpIHJldHVybiBXU0FWRVJOT1RTVVBQT1JURUQ7CkBAIC0zNTgsNyArMzU4LDcgQEAKIAogICAgIG1lbWNweShscFdTQURhdGEsICZXSU5TT0NLX2RhdGEsIHNpemVvZihXSU5TT0NLX2RhdGEpKTsKIAotICAgIGRwcmludGZfaW5mbyh3aW5zb2NrLCAiV1NBU3RhcnR1cDogc3VjY2VlZGVkXG4iKTsKKyAgICBUUkFDRSh3aW5zb2NrLCAic3VjY2VlZGVkXG4iKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtNDEwLDEyICs0MTAsMTIgQEAKIAlXSU5TT0NLX1NodXRkb3duKCk7CS8qIGp1c3QgaW4gY2FzZSAqLwogCiAgICAgaWYoIHB3c2ktPmZsYWdzICYgV1NJX0JMT0NLSU5HQ0FMTCApCi0JZHByaW50Zl9pbmZvKHdpbnNvY2ssIlx0aW5zaWRlIGJsb2NraW5nIGNhbGwhXG4iKTsKKwlUUkFDRSh3aW5zb2NrLCJcdGluc2lkZSBibG9ja2luZyBjYWxsIVxuIik7CiAKIC8qIEZJWE1FOiBhb3BfY29udHJvbCgpIGRvZXNuJ3QgZGVjcmVtZW50IHB3c2ktPm51bV9hc3luY19ycQogICoKICAqICAgIGlmKCBwd3NpLT5udW1fYXN5bmNfcnEgKQotICoJICBkcHJpbnRmX3dhcm4od2luc29jaywiXHRoYXZlICVpIG91dHN0YW5kaW5nIGFzeW5jIG9wcyFcbiIsIHB3c2ktPm51bV9hc3luY19ycSApOworICoJICBXQVJOKHdpbnNvY2ssIlx0aGF2ZSAlaSBvdXRzdGFuZGluZyBhc3luYyBvcHMhXG4iLCBwd3NpLT5udW1fYXN5bmNfcnEgKTsKICAqLwogCiAgICAgZm9yKGkgPSAwLCBqID0gMCwgbiA9IDA7IGkgPCBXU19NQVhfU09DS0VUU19QRVJfUFJPQ0VTUzsgaSsrKQpAQCAtNDI5LDcgKzQyOSw3IEBACiAgICAgICAgICAgICBjbG9zZShwd3NpLT5zb2NrW2ldLmZkKTsgaisrOyAKICAgICAgICAgfQogICAgIGlmKCBqICkgCi0JICBkcHJpbnRmX2luZm8od2luc29jaywiXHRjbG9zZWQgJWkgc29ja2V0cywga2lsbGVkICVpIGFzeW5jIHNlbGVjdHMhXG4iLCBqLCBuKTsKKwkgIFRSQUNFKHdpbnNvY2ssIlx0Y2xvc2VkICVpIHNvY2tldHMsIGtpbGxlZCAlaSBhc3luYyBzZWxlY3RzIVxuIiwgaiwgbik7CiAKICAgICAvKiBkZWxldGUgc2NyYXRjaCBidWZmZXJzICovCiAKQEAgLTQ0Nyw3ICs0NDcsNyBAQAogewogICAgIEhUQVNLMTYJaFRhc2sgPSBHZXRDdXJyZW50VGFzaygpOwogCi0gICAgZHByaW50Zl9pbmZvKHdpbnNvY2ssICJXU0FDbGVhbnVwKCUwNHgpXG4iLCBoVGFzayApOworICAgIFRSQUNFKHdpbnNvY2ssICIoJTA0eClcbiIsIGhUYXNrICk7CiAgICAgaWYoIGhUYXNrICkKICAgICB7CiAJTFBXU0lORk8gcHdzaSA9IHdzaV9maW5kKGhUYXNrKTsKQEAgLTQ2OSw3ICs0NjksNyBAQAogICAgIExQV1NJTkZPIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKICAgICBJTlQxNiAgICByZXQgPSAocHdzaSkgPyBwd3NpLT5lcnIgOiBXU0FOT1RJTklUSUFMSVNFRDsKIAotICAgIGRwcmludGZfaW5mbyh3aW5zb2NrLCAiV1NBR2V0TGFzdEVycm9yKCUwOHgpID0gJWlcbiIsIAorICAgIFRSQUNFKHdpbnNvY2ssICIoJTA4eCkgPSAlaVxuIiwgCiAJCSAgICAodW5zaWduZWQpcHdzaSwgKGludClyZXQpOwogICAgIHJldHVybiByZXQ7CiB9CkBAIC00ODEsNyArNDgxLDcgQEAKIHsKICAgICBMUFdTSU5GTyAgICAgIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKIAotICAgIGRwcmludGZfaW5mbyh3aW5zb2NrLCAiV1NBU2V0TGFzdEVycm9yKCUwOHgpOiAlZFxuIiwgKHVuc2lnbmVkKXB3c2ksIChpbnQpaUVycm9yKTsKKyAgICBUUkFDRSh3aW5zb2NrLCAiKCUwOHgpOiAlZFxuIiwgKHVuc2lnbmVkKXB3c2ksIChpbnQpaUVycm9yKTsKICAgICBpZiggcHdzaSApIHB3c2ktPmVyciA9IGlFcnJvcjsKIH0KIApAQCAtNTIyLDcgKzUyMiw3IEBACiAgICAgd3Nfc29ja2V0Kglwd3MgID0gKHdzX3NvY2tldCopV1NfSEFORExFMlBUUigoU09DS0VUMTYpcyk7CiAgICAgTFBXU0lORk8JcHdzaSA9IHdzaV9maW5kKEdldEN1cnJlbnRUYXNrKCkpOwogCi0gICAgZHByaW50Zl9pbmZvKHdpbnNvY2ssICJXU19BQ0NFUFQoJTA4eCk6IHNvY2tldCAlMDR4XG4iLCAKKyAgICBUUkFDRSh3aW5zb2NrLCAiKCUwOHgpOiBzb2NrZXQgJTA0eFxuIiwgCiAJCQkJICAodW5zaWduZWQpcHdzaSwgKFVJTlQxNilzICk7IAogICAgIGlmKCBfY2hlY2tfd3MocHdzaSwgcHdzKSApCiAgICAgewpAQCAtNTczLDcgKzU3Myw3IEBACiAgICAgd3Nfc29ja2V0KiAgICBwd3MgID0gKHdzX3NvY2tldCopV1NfSEFORExFMlBUUihzKTsKICAgICBMUFdTSU5GTyAgICAgIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKIAotICAgIGRwcmludGZfaW5mbyh3aW5zb2NrLCAiV1NfQklORCglMDh4KTogc29ja2V0ICUwNHgsIHB0ciAlOHgsIGxlbmd0aCAlZFxuIiwgCisgICAgVFJBQ0Uod2luc29jaywgIiglMDh4KTogc29ja2V0ICUwNHgsIHB0ciAlOHgsIGxlbmd0aCAlZFxuIiwgCiAJCQkgICAodW5zaWduZWQpcHdzaSwgcywgKGludCkgbmFtZSwgbmFtZWxlbik7CiAjaWYgREVCVUdfU09DS0FERFIKICAgICBkdW1wX3NvY2thZGRyKG5hbWUpOwpAQCAtNTg1LDcgKzU4NSw3IEBACiAJICBpZiAoIGJpbmQocHdzLT5mZCwgbmFtZSwgbmFtZWxlbikgPCAwICkgCiAJICB7CiAJICAgICBpbnQJbG9jX2Vycm5vID0gZXJybm87Ci0JICAgICBkcHJpbnRmX3dhcm4od2luc29jaywgIlx0ZmFpbHVyZSAtIGVycm5vID0gJWlcbiIsIGVycm5vKTsKKwkgICAgIFdBUk4od2luc29jaywgIlx0ZmFpbHVyZSAtIGVycm5vID0gJWlcbiIsIGVycm5vKTsKIAkgICAgIGVycm5vID0gbG9jX2Vycm5vOwogCSAgICAgc3dpdGNoKGVycm5vKQogCSAgICAgewpAQCAtNjE2LDcgKzYxNiw3IEBACiAgICAgd3Nfc29ja2V0KiAgICBwd3MgID0gKHdzX3NvY2tldCopV1NfSEFORExFMlBUUihzKTsKICAgICBMUFdTSU5GTyAgICAgIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKIAotICAgIGRwcmludGZfaW5mbyh3aW5zb2NrLCAiV1NfQ0xPU0UoJTA4eCk6IHNvY2tldCAlMDh4XG4iLCAodW5zaWduZWQpcHdzaSwgcyk7CisgICAgVFJBQ0Uod2luc29jaywgIiglMDh4KTogc29ja2V0ICUwOHhcbiIsICh1bnNpZ25lZClwd3NpLCBzKTsKIAogICAgIGlmKCBfY2hlY2tfd3MocHdzaSwgcHdzKSApCiAgICAgeyAKQEAgLTY1MSw3ICs2NTEsNyBAQAogICB3c19zb2NrZXQqICAgIHB3cyAgPSAod3Nfc29ja2V0KilXU19IQU5ETEUyUFRSKHMpOwogICBMUFdTSU5GTyAgICAgIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKIAotICBkcHJpbnRmX2luZm8od2luc29jaywgIldTX0NPTk5FQ1QoJTA4eCk6IHNvY2tldCAlMDR4LCBwdHIgJTh4LCBsZW5ndGggJWRcbiIsIAorICBUUkFDRSh3aW5zb2NrLCAiKCUwOHgpOiBzb2NrZXQgJTA0eCwgcHRyICU4eCwgbGVuZ3RoICVkXG4iLCAKIAkJCSAgICh1bnNpZ25lZClwd3NpLCBzLCAoaW50KSBuYW1lLCBuYW1lbGVuKTsKICNpZiBERUJVR19TT0NLQUREUgogICBkdW1wX3NvY2thZGRyKG5hbWUpOwpAQCAtNzA5LDcgKzcwOSw3IEBACiAgICAgd3Nfc29ja2V0KiAgICBwd3MgID0gKHdzX3NvY2tldCopV1NfSEFORExFMlBUUihzKTsKICAgICBMUFdTSU5GTyAgICAgIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKIAotICAgIGRwcmludGZfaW5mbyh3aW5zb2NrLCAiV1NfR0VUUEVFUk5BTUUoJTA4eCk6IHNvY2tldDogJTA0eCwgcHRyICU4eCwgcHRyICU4eFxuIiwgCisgICAgVFJBQ0Uod2luc29jaywgIiglMDh4KTogc29ja2V0OiAlMDR4LCBwdHIgJTh4LCBwdHIgJTh4XG4iLCAKIAkJCSAgICh1bnNpZ25lZClwd3NpLCBzLCAoaW50KSBuYW1lLCAqbmFtZWxlbik7CiAgICAgaWYoIF9jaGVja193cyhwd3NpLCBwd3MpICkKICAgICB7CkBAIC03NDYsNyArNzQ2LDcgQEAKICAgICB3c19zb2NrZXQqICAgIHB3cyAgPSAod3Nfc29ja2V0KilXU19IQU5ETEUyUFRSKHMpOwogICAgIExQV1NJTkZPICAgICAgcHdzaSA9IHdzaV9maW5kKEdldEN1cnJlbnRUYXNrKCkpOwogCi0gICAgZHByaW50Zl9pbmZvKHdpbnNvY2ssICJXU19HRVRTT0NLTkFNRSglMDh4KTogc29ja2V0OiAlMDR4LCBwdHIgJTh4LCBwdHIgJTh4XG4iLCAKKyAgICBUUkFDRSh3aW5zb2NrLCAiKCUwOHgpOiBzb2NrZXQ6ICUwNHgsIHB0ciAlOHgsIHB0ciAlOHhcbiIsIAogCQkJICAodW5zaWduZWQpcHdzaSwgcywgKGludCkgbmFtZSwgKGludCkgKm5hbWVsZW4pOwogICAgIGlmKCBfY2hlY2tfd3MocHdzaSwgcHdzKSApCiAgICAgewpAQCAtNzkwLDcgKzc5MCw3IEBACiAgICAgd3Nfc29ja2V0KiAgICBwd3MgID0gKHdzX3NvY2tldCopV1NfSEFORExFMlBUUihzKTsKICAgICBMUFdTSU5GTyAgICAgIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKIAotICAgIGRwcmludGZfaW5mbyh3aW5zb2NrLCAiV1NfR0VUU09DS09QVCglMDh4KTogc29ja2V0OiAlMDR4LCBvcHQgJWQsIHB0ciAlOHgsIHB0ciAlOHhcbiIsIAorICAgIFRSQUNFKHdpbnNvY2ssICIoJTA4eCk6IHNvY2tldDogJTA0eCwgb3B0ICVkLCBwdHIgJTh4LCBwdHIgJTh4XG4iLCAKIAkJCSAgICh1bnNpZ25lZClwd3NpLCBzLCBsZXZlbCwgKGludCkgb3B0dmFsLCAoaW50KSAqb3B0bGVuKTsKICAgICBpZiggX2NoZWNrX3dzKHB3c2ksIHB3cykgKQogICAgIHsKQEAgLTg4Myw3ICs4ODMsNyBAQAogICB3c19zb2NrZXQqICAgIHB3cyAgPSAod3Nfc29ja2V0KilXU19IQU5ETEUyUFRSKHMpOwogICBMUFdTSU5GTyAgICAgIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKIAotICBkcHJpbnRmX2luZm8od2luc29jaywgIldTX0lPQ1RMKCUwOHgpOiBzb2NrZXQgJTA0eCwgY21kICUwOHgsIHB0ciAlOHhcbiIsIAorICBUUkFDRSh3aW5zb2NrLCAiKCUwOHgpOiBzb2NrZXQgJTA0eCwgY21kICUwOHgsIHB0ciAlOHhcbiIsIAogCQkJICAodW5zaWduZWQpcHdzaSwgcywgY21kLCAodW5zaWduZWQpIGFyZ3ApOwogICBpZiggX2NoZWNrX3dzKHB3c2ksIHB3cykgKQogICB7CkBAIC05MTYsNyArOTE2LDcgQEAKIAogCWRlZmF1bHQ6CSAgCiAJCS8qIE5ldHNjYXBlIHRyaWVzIGhhcmQgdG8gdXNlIGJvZ3VzIGlvY3RsIDB4NjY3ZSAqLwotCQlkcHJpbnRmX3dhcm4od2luc29jaywgIlx0dW5rbm93biBXU19JT0NUTCBjbWQgKCUwOHgpXG4iLCBjbWQpOworCQlXQVJOKHdpbnNvY2ssICJcdHVua25vd24gV1NfSU9DVEwgY21kICglMDh4KVxuIiwgY21kKTsKICAgICB9CiAgICAgaWYoIGlvY3RsKHB3cy0+ZmQsIG5ld2NtZCwgKGNoYXIqKWFyZ3AgKSA9PSAwICkgcmV0dXJuIDA7CiAgICAgcHdzaS0+ZXJyID0gKGVycm5vID09IEVCQURGKSA/IFdTQUVOT1RTT0NLIDogd3NhRXJybm8oKTsgCkBAIC05NDEsNyArOTQxLDcgQEAKICAgICB3c19zb2NrZXQqICAgIHB3cyAgPSAod3Nfc29ja2V0KilXU19IQU5ETEUyUFRSKHMpOwogICAgIExQV1NJTkZPICAgICAgcHdzaSA9IHdzaV9maW5kKEdldEN1cnJlbnRUYXNrKCkpOwogCi0gICAgZHByaW50Zl9pbmZvKHdpbnNvY2ssICJXU19MSVNURU4oJTA4eCk6IHNvY2tldCAlMDR4LCBiYWNrbG9nICVkXG4iLCAKKyAgICBUUkFDRSh3aW5zb2NrLCAiKCUwOHgpOiBzb2NrZXQgJTA0eCwgYmFja2xvZyAlZFxuIiwgCiAJCQkgICAgKHVuc2lnbmVkKXB3c2ksIHMsIGJhY2tsb2cpOwogICAgIGlmKCBfY2hlY2tfd3MocHdzaSwgcHdzKSApCiAgICAgewpAQCAtOTc5LDcgKzk3OSw3IEBACiAgICAgd3Nfc29ja2V0KiAgICBwd3MgID0gKHdzX3NvY2tldCopV1NfSEFORExFMlBUUihzKTsKICAgICBMUFdTSU5GTyAgICAgIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKIAotICAgIGRwcmludGZfaW5mbyh3aW5zb2NrLCAiV1NfUkVDViglMDh4KTogc29ja2V0ICUwNHgsIGJ1ZiAlOHgsIGxlbiAlZCwgIgorICAgIFRSQUNFKHdpbnNvY2ssICIoJTA4eCk6IHNvY2tldCAlMDR4LCBidWYgJTh4LCBsZW4gJWQsICIKIAkJICAgICJmbGFncyAlZFxuIiwgKHVuc2lnbmVkKXB3c2ksIHMsICh1bnNpZ25lZClidWYsIAogCQkgICAgbGVuLCBmbGFncyk7CiAgICAgaWYoIF9jaGVja193cyhwd3NpLCBwd3MpICkKQEAgLTk4Nyw3ICs5ODcsNyBAQAogCUlOVDMyIGxlbmd0aDsKIAlpZiAoKGxlbmd0aCA9IHJlY3YocHdzLT5mZCwgYnVmLCBsZW4sIGZsYWdzKSkgPj0gMCkgCiAJeyAKLQkgICAgZHByaW50Zl9pbmZvKHdpbnNvY2ssICIgLT4gJWkgYnl0ZXNcbiIsIGxlbmd0aCk7CisJICAgIFRSQUNFKHdpbnNvY2ssICIgLT4gJWkgYnl0ZXNcbiIsIGxlbmd0aCk7CiAKIAkgICAgaWYoIHB3cy0+cHNvcCAmJiAocHdzLT5mbGFncyAmIChXU19GRF9SRUFEIHwgV1NfRkRfQ0xPU0UpKSApCiAJCUVWRU5UX0FkZElPKCBwd3MtPmZkLCBFVkVOVF9JT19SRUFEICk7CS8qIHJlZW5hYmxlciAqLwpAQCAtOTk3LDcgKzk5Nyw3IEBACiAJcHdzaS0+ZXJyID0gd3NhRXJybm8oKTsKICAgICB9CiAgICAgZWxzZSBpZiggcHdzaSApIHB3c2ktPmVyciA9IFdTQUVOT1RTT0NLOwotICAgIGRwcmludGZfd2Fybih3aW5zb2NrLCAiIC0+IEVSUk9SXG4iKTsKKyAgICBXQVJOKHdpbnNvY2ssICIgLT4gRVJST1JcbiIpOwogICAgIHJldHVybiBTT0NLRVRfRVJST1I7CiB9CiAKQEAgLTEwMTksNyArMTAxOSw3IEBACiAgICAgd3Nfc29ja2V0KiAgICBwd3MgID0gKHdzX3NvY2tldCopV1NfSEFORExFMlBUUihzKTsKICAgICBMUFdTSU5GTyAgICAgIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKIAotICAgIGRwcmludGZfaW5mbyh3aW5zb2NrLCAiV1NfUkVDVkZST00oJTA4eCk6IHNvY2tldCAlMDR4LCBwdHIgJTA4eCwgIgorICAgIFRSQUNFKHdpbnNvY2ssICIoJTA4eCk6IHNvY2tldCAlMDR4LCBwdHIgJTA4eCwgIgogCQkgICAgImxlbiAlZCwgZmxhZ3MgJWRcbiIsICh1bnNpZ25lZClwd3NpLCBzLCAodW5zaWduZWQpYnVmLAogCQkgICAgbGVuLCBmbGFncyk7CiAjaWYgREVCVUdfU09DS0FERFIKQEAgLTEwMzMsNyArMTAzMyw3IEBACiAKIAlpZiAoKGxlbmd0aCA9IHJlY3Zmcm9tKHB3cy0+ZmQsIGJ1ZiwgbGVuLCBmbGFncywgZnJvbSwgZnJvbWxlbjMyKSkgPj0gMCkKIAl7Ci0JICAgIGRwcmludGZfaW5mbyh3aW5zb2NrLCAiIC0+ICVpIGJ5dGVzXG4iLCBsZW5ndGgpOworCSAgICBUUkFDRSh3aW5zb2NrLCAiIC0+ICVpIGJ5dGVzXG4iLCBsZW5ndGgpOwogCiAJICAgIGlmKCBwd3MtPnBzb3AgJiYgKHB3cy0+ZmxhZ3MgJiAoV1NfRkRfUkVBRCB8IFdTX0ZEX0NMT1NFKSkgKQogCQlFVkVOVF9BZGRJTyggcHdzLT5mZCwgRVZFTlRfSU9fUkVBRCApOyAgLyogcmVlbmFibGVyICovCkBAIC0xMDQzLDcgKzEwNDMsNyBAQAogCXB3c2ktPmVyciA9IHdzYUVycm5vKCk7CiAgICAgfQogICAgIGVsc2UgaWYoIHB3c2kgKSBwd3NpLT5lcnIgPSBXU0FFTk9UU09DSzsKLSAgICBkcHJpbnRmX3dhcm4od2luc29jaywgIiAtPiBFUlJPUlxuIik7CisgICAgV0FSTih3aW5zb2NrLCAiIC0+IEVSUk9SXG4iKTsKICAgICByZXR1cm4gU09DS0VUX0VSUk9SOwogfQogCkBAIC0xMDcxLDcgKzEwNzEsNyBAQAogewogICAgIExQV1NJTkZPICAgICAgcHdzaSA9IHdzaV9maW5kKEdldEN1cnJlbnRUYXNrKCkpOwogCQotICAgIGRwcmludGZfaW5mbyh3aW5zb2NrLCAiV1NfU0VMRUNUKCUwOHgpOiByZWFkICU4eCwgd3JpdGUgJTh4LCBleGNwICU4eFxuIiwgCisgICAgVFJBQ0Uod2luc29jaywgIiglMDh4KTogcmVhZCAlOHgsIHdyaXRlICU4eCwgZXhjcCAlOHhcbiIsIAogICAgICh1bnNpZ25lZCkgcHdzaSwgKHVuc2lnbmVkKSB3c19yZWFkZmRzLCAodW5zaWduZWQpIHdzX3dyaXRlZmRzLCAodW5zaWduZWQpIHdzX2V4Y2VwdGZkcyk7CiAKICAgICBpZiggcHdzaSApCkBAIC0xMTUwLDcgKzExNTAsNyBAQAogICAgIHdzX3NvY2tldCogICAgcHdzICA9ICh3c19zb2NrZXQqKVdTX0hBTkRMRTJQVFIocyk7CiAgICAgTFBXU0lORk8gICAgICBwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CiAKLSAgICBkcHJpbnRmX2luZm8od2luc29jaywgIldTX1NFTkQoJTA4eCk6IHNvY2tldCAlMDR4LCBwdHIgJTA4eCwgbGVuZ3RoICVkLCBmbGFncyAlZFxuIiwgCisgICAgVFJBQ0Uod2luc29jaywgIiglMDh4KTogc29ja2V0ICUwNHgsIHB0ciAlMDh4LCBsZW5ndGggJWQsIGZsYWdzICVkXG4iLCAKIAkJCSAgICh1bnNpZ25lZClwd3NpLCBzLCAodW5zaWduZWQpIGJ1ZiwgbGVuLCBmbGFncyk7CiAgICAgaWYoIF9jaGVja193cyhwd3NpLCBwd3MpICkKICAgICB7CkBAIC0xMTg2LDcgKzExODYsNyBAQAogICAgIHdzX3NvY2tldCogICAgcHdzICA9ICh3c19zb2NrZXQqKVdTX0hBTkRMRTJQVFIocyk7CiAgICAgTFBXU0lORk8gICAgICBwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CiAKLSAgICBkcHJpbnRmX2luZm8od2luc29jaywgIldTX1NFTkRUTyglMDh4KTogc29ja2V0ICUwNHgsIHB0ciAlMDh4LCBsZW5ndGggJWQsIGZsYWdzICVkXG4iLAorICAgIFRSQUNFKHdpbnNvY2ssICIoJTA4eCk6IHNvY2tldCAlMDR4LCBwdHIgJTA4eCwgbGVuZ3RoICVkLCBmbGFncyAlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKXB3c2ksIHMsICh1bnNpZ25lZCkgYnVmLCBsZW4sIGZsYWdzKTsKICAgICBpZiggX2NoZWNrX3dzKHB3c2ksIHB3cykgKQogICAgIHsKQEAgLTEyMjMsNyArMTIyMyw3IEBACiAgICAgd3Nfc29ja2V0KiAgICBwd3MgID0gKHdzX3NvY2tldCopV1NfSEFORExFMlBUUihzKTsKICAgICBMUFdTSU5GTyAgICAgIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKIAotICAgIGRwcmludGZfaW5mbyh3aW5zb2NrLCAiV1NfU0VUU09DS09QVCglMDh4KTogc29ja2V0ICUwNHgsIGxldiAlZCwgb3B0ICVkLCBwdHIgJTA4eCwgbGVuICVkXG4iLAorICAgIFRSQUNFKHdpbnNvY2ssICIoJTA4eCk6IHNvY2tldCAlMDR4LCBsZXYgJWQsIG9wdCAlZCwgcHRyICUwOHgsIGxlbiAlZFxuIiwKIAkJCSAgKHVuc2lnbmVkKXB3c2ksIHMsIGxldmVsLCBvcHRuYW1lLCAoaW50KSBvcHR2YWwsIG9wdGxlbik7CiAgICAgaWYoIF9jaGVja193cyhwd3NpLCBwd3MpICkKICAgICB7CkBAIC0xMjYzLDcgKzEyNjMsNyBAQAogICAgIHdzX3NvY2tldCogICAgcHdzICA9ICh3c19zb2NrZXQqKVdTX0hBTkRMRTJQVFIocyk7CiAgICAgTFBXU0lORk8gICAgICBwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CiAKLSAgICBkcHJpbnRmX2luZm8od2luc29jaywgIldTX1NIVVRET1dOKCUwOHgpOiBzb2NrZXQgJTA0eCwgaG93ICVpXG4iLAorICAgIFRSQUNFKHdpbnNvY2ssICIoJTA4eCk6IHNvY2tldCAlMDR4LCBob3cgJWlcbiIsCiAJCQkgICAgKHVuc2lnbmVkKXB3c2ksIHMsIGhvdyApOwogICAgIGlmKCBfY2hlY2tfd3MocHdzaSwgcHdzKSApCiAgICAgewpAQCAtMTMyOCw3ICsxMzI4LDcgQEAKIHsKICAgTFBXU0lORk8gICAgICBwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CiAKLSAgZHByaW50Zl9pbmZvKHdpbnNvY2ssICJXU19TT0NLRVQoJTA4eCk6IGFmPSVkIHR5cGU9JWQgcHJvdG9jb2w9JWRcbiIsIAorICBUUkFDRSh3aW5zb2NrLCAiKCUwOHgpOiBhZj0lZCB0eXBlPSVkIHByb3RvY29sPSVkXG4iLCAKIAkJCSAgKHVuc2lnbmVkKXB3c2ksIGFmLCB0eXBlLCBwcm90b2NvbCk7CiAKICAgaWYoIHB3c2kgKQpAQCAtMTM3Miw3ICsxMzcyLDcgQEAKICAgICB7CiAgICAgICAgIHdzX3NvY2tldCogICAgICBwbmV3ID0gd3NpX2FsbG9jX3NvY2tldChwd3NpLCBzb2NrKTsKIAotCWRwcmludGZfaW5mbyh3aW5zb2NrLCJcdGNyZWF0ZWQgJWkgKGhhbmRsZSAlMDR4KVxuIiwgc29jaywgKFVJTlQxNilXU19QVFIySEFORExFKHBuZXcpKTsKKwlUUkFDRSh3aW5zb2NrLCJcdGNyZWF0ZWQgJWkgKGhhbmRsZSAlMDR4KVxuIiwgc29jaywgKFVJTlQxNilXU19QVFIySEFORExFKHBuZXcpKTsKIAogICAgICAgICBpZiggcG5ldyApIAogCXsKQEAgLTEzOTIsNyArMTM5Miw3IEBACiAgICAgfSBlbHNlIHB3c2ktPmVyciA9IHdzYUVycm5vKCk7CiAgIH0KICAKLSAgZHByaW50Zl93YXJuKHdpbnNvY2ssICJcdFx0ZmFpbGVkIVxuIik7CisgIFdBUk4od2luc29jaywgIlx0XHRmYWlsZWQhXG4iKTsKICAgcmV0dXJuIElOVkFMSURfU09DS0VUMzI7CiB9CiAKQEAgLTE0MzksNyArMTQzOSw3IEBACiBTRUdQVFIgV0lOQVBJIFdJTlNPQ0tfZ2V0aG9zdGJ5YWRkcjE2KGNvbnN0IGNoYXIgKmFkZHIsIElOVDE2IGxlbiwgSU5UMTYgdHlwZSkKIHsKICAgICBzdHJ1Y3QgV0lOX2hvc3RlbnQqIHJldHZhbDsKLSAgICBkcHJpbnRmX2luZm8od2luc29jaywgIldTX0dldEhvc3RCeUFkZHIxNjogcHRyICUwOHgsIGxlbiAlZCwgdHlwZSAlZFxuIiwKKyAgICBUUkFDRSh3aW5zb2NrLCAicHRyICUwOHgsIGxlbiAlZCwgdHlwZSAlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpIGFkZHIsIGxlbiwgdHlwZSk7CiAgICAgcmV0dmFsID0gX193c19nZXRob3N0YnlhZGRyKCBhZGRyLCBsZW4sIHR5cGUsIFdTX0RVUF9TRUdQVFIgKTsKICAgICByZXR1cm4gcmV0dmFsID8gU0VHUFRSX0dFVChyZXR2YWwpIDogKChTRUdQVFIpTlVMTCk7CkBAIC0xNDQ4LDcgKzE0NDgsNyBAQAogc3RydWN0IFdJTl9ob3N0ZW50KiBXSU5BUEkgV0lOU09DS19nZXRob3N0YnlhZGRyMzIoY29uc3QgY2hhciAqYWRkciwgSU5UMzIgbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIgdHlwZSkKIHsKLSAgICBkcHJpbnRmX2luZm8od2luc29jaywgIldTX0dldEhvc3RCeUFkZHIzMjogcHRyICUwOHgsIGxlbiAlZCwgdHlwZSAlZFxuIiwKKyAgICBUUkFDRSh3aW5zb2NrLCAicHRyICUwOHgsIGxlbiAlZCwgdHlwZSAlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKSBhZGRyLCBsZW4sIHR5cGUpOwogICAgIHJldHVybiBfX3dzX2dldGhvc3RieWFkZHIoYWRkciwgbGVuLCB0eXBlLCBXU19EVVBfTElORUFSKTsKIH0KQEAgLTE0NzUsMTQgKzE0NzUsMTQgQEAKIFNFR1BUUiBXSU5BUEkgV0lOU09DS19nZXRob3N0YnluYW1lMTYoY29uc3QgY2hhciAqbmFtZSkKIHsKICAgICBzdHJ1Y3QgV0lOX2hvc3RlbnQqIHJldHZhbDsKLSAgICBkcHJpbnRmX2luZm8od2luc29jaywgIldTX0dldEhvc3RCeU5hbWUxNjogJXNcbiIsIChuYW1lKT9uYW1lOk5VTExfU1RSSU5HKTsKKyAgICBUUkFDRSh3aW5zb2NrLCAiJXNcbiIsIChuYW1lKT9uYW1lOk5VTExfU1RSSU5HKTsKICAgICByZXR2YWwgPSBfX3dzX2dldGhvc3RieW5hbWUoIG5hbWUsIFdTX0RVUF9TRUdQVFIgKTsKICAgICByZXR1cm4gKHJldHZhbCk/IFNFR1BUUl9HRVQocmV0dmFsKSA6ICgoU0VHUFRSKU5VTEwpIDsKIH0KIAogc3RydWN0IFdJTl9ob3N0ZW50KiBXSU5BUEkgV0lOU09DS19nZXRob3N0YnluYW1lMzIoY29uc3QgY2hhciogbmFtZSkKIHsKLSAgICBkcHJpbnRmX2luZm8od2luc29jaywgIldTX0dldEhvc3RCeU5hbWUzMjogJXNcbiIsIChuYW1lKT9uYW1lOk5VTExfU1RSSU5HKTsKKyAgICBUUkFDRSh3aW5zb2NrLCAiJXNcbiIsIChuYW1lKT9uYW1lOk5VTExfU1RSSU5HKTsKICAgICByZXR1cm4gX193c19nZXRob3N0YnluYW1lKCBuYW1lLCBXU19EVVBfTElORUFSICk7CiB9CiAKQEAgLTE1MDksMTQgKzE1MDksMTQgQEAKIFNFR1BUUiBXSU5BUEkgV0lOU09DS19nZXRwcm90b2J5bmFtZTE2KGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAgICAgc3RydWN0IFdJTl9wcm90b2VudCogcmV0dmFsOwotICAgIGRwcmludGZfaW5mbyh3aW5zb2NrLCAiV1NfR2V0UHJvdG9CeU5hbWUxNjogJXNcbiIsIChuYW1lKT9uYW1lOk5VTExfU1RSSU5HKTsKKyAgICBUUkFDRSh3aW5zb2NrLCAiJXNcbiIsIChuYW1lKT9uYW1lOk5VTExfU1RSSU5HKTsKICAgICByZXR2YWwgPSBfX3dzX2dldHByb3RvYnluYW1lKG5hbWUsIFdTX0RVUF9TRUdQVFIpOwogICAgIHJldHVybiByZXR2YWwgPyBTRUdQVFJfR0VUKHJldHZhbCkgOiAoKFNFR1BUUilOVUxMKTsKIH0KIAogc3RydWN0IFdJTl9wcm90b2VudCogV0lOQVBJIFdJTlNPQ0tfZ2V0cHJvdG9ieW5hbWUzMihjb25zdCBjaGFyKiBuYW1lKQogewotICAgIGRwcmludGZfaW5mbyh3aW5zb2NrLCAiV1NfR2V0UHJvdG9CeU5hbWUzMjogJXNcbiIsIChuYW1lKT9uYW1lOk5VTExfU1RSSU5HKTsKKyAgICBUUkFDRSh3aW5zb2NrLCAiJXNcbiIsIChuYW1lKT9uYW1lOk5VTExfU1RSSU5HKTsKICAgICByZXR1cm4gX193c19nZXRwcm90b2J5bmFtZShuYW1lLCBXU19EVVBfTElORUFSKTsKIH0KIApAQCAtMTU0MywxNCArMTU0MywxNCBAQAogU0VHUFRSIFdJTkFQSSBXSU5TT0NLX2dldHByb3RvYnludW1iZXIxNihJTlQxNiBudW1iZXIpCiB7CiAgICAgc3RydWN0IFdJTl9wcm90b2VudCogcmV0dmFsOwotICAgIGRwcmludGZfaW5mbyh3aW5zb2NrLCAiV1NfR2V0UHJvdG9CeU51bWJlcjE2OiAlaVxuIiwgbnVtYmVyKTsKKyAgICBUUkFDRSh3aW5zb2NrLCAiJWlcbiIsIG51bWJlcik7CiAgICAgcmV0dmFsID0gX193c19nZXRwcm90b2J5bnVtYmVyKG51bWJlciwgV1NfRFVQX1NFR1BUUik7CiAgICAgcmV0dXJuIHJldHZhbCA/IFNFR1BUUl9HRVQocmV0dmFsKSA6ICgoU0VHUFRSKU5VTEwpOwogfQogCiBzdHJ1Y3QgV0lOX3Byb3RvZW50KiBXSU5BUEkgV0lOU09DS19nZXRwcm90b2J5bnVtYmVyMzIoSU5UMzIgbnVtYmVyKQogewotICAgIGRwcmludGZfaW5mbyh3aW5zb2NrLCAiV1NfR2V0UHJvdG9CeU51bWJlcjMyOiAlaVxuIiwgbnVtYmVyKTsKKyAgICBUUkFDRSh3aW5zb2NrLCAiJWlcbiIsIG51bWJlcik7CiAgICAgcmV0dXJuIF9fd3NfZ2V0cHJvdG9ieW51bWJlcihudW1iZXIsIFdTX0RVUF9MSU5FQVIpOwogfQogCkBAIC0xNTgxLDcgKzE1ODEsNyBAQAogU0VHUFRSIFdJTkFQSSBXSU5TT0NLX2dldHNlcnZieW5hbWUxNihjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpwcm90bykKIHsKICAgICBzdHJ1Y3QgV0lOX3NlcnZlbnQqIHJldHZhbDsKLSAgICBkcHJpbnRmX2luZm8od2luc29jaywgIldTX0dldFNlcnZCeU5hbWUxNjogJyVzJywgJyVzJ1xuIiwKKyAgICBUUkFDRSh3aW5zb2NrLCAiJyVzJywgJyVzJ1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmFtZSk/bmFtZTpOVUxMX1NUUklORywgKHByb3RvKT9wcm90bzpOVUxMX1NUUklORyk7CiAgICAgcmV0dmFsID0gX193c19nZXRzZXJ2YnluYW1lKG5hbWUsIHByb3RvLCBXU19EVVBfU0VHUFRSKTsKICAgICByZXR1cm4gcmV0dmFsID8gU0VHUFRSX0dFVChyZXR2YWwpIDogKChTRUdQVFIpTlVMTCk7CkBAIC0xNTg5LDcgKzE1ODksNyBAQAogCiBzdHJ1Y3QgV0lOX3NlcnZlbnQqIFdJTkFQSSBXSU5TT0NLX2dldHNlcnZieW5hbWUzMihjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpwcm90bykKIHsKLSAgICBkcHJpbnRmX2luZm8od2luc29jaywgIldTX0dldFNlcnZCeU5hbWUzMjogJyVzJywgJyVzJ1xuIiwKKyAgICBUUkFDRSh3aW5zb2NrLCAiJyVzJywgJyVzJ1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmFtZSk/bmFtZTpOVUxMX1NUUklORywgKHByb3RvKT9wcm90bzpOVUxMX1NUUklORyk7CiAgICAgcmV0dXJuIF9fd3NfZ2V0c2VydmJ5bmFtZShuYW1lLCBwcm90bywgV1NfRFVQX0xJTkVBUik7CiB9CkBAIC0xNjIxLDcgKzE2MjEsNyBAQAogU0VHUFRSIFdJTkFQSSBXSU5TT0NLX2dldHNlcnZieXBvcnQxNihJTlQxNiBwb3J0LCBjb25zdCBjaGFyICpwcm90bykKIHsKICAgICBzdHJ1Y3QgV0lOX3NlcnZlbnQqIHJldHZhbDsKLSAgICBkcHJpbnRmX2luZm8od2luc29jaywgIldTX0dldFNlcnZCeVBvcnQxNjogJWksICclcydcbiIsCisgICAgVFJBQ0Uod2luc29jaywgIiVpLCAnJXMnXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpcG9ydCwgKHByb3RvKT9wcm90bzpOVUxMX1NUUklORyk7CiAgICAgcmV0dmFsID0gX193c19nZXRzZXJ2Ynlwb3J0KHBvcnQsIHByb3RvLCBXU19EVVBfU0VHUFRSKTsKICAgICByZXR1cm4gcmV0dmFsID8gU0VHUFRSX0dFVChyZXR2YWwpIDogKChTRUdQVFIpTlVMTCk7CkBAIC0xNjI5LDcgKzE2MjksNyBAQAogCiBzdHJ1Y3QgV0lOX3NlcnZlbnQqIFdJTkFQSSBXSU5TT0NLX2dldHNlcnZieXBvcnQzMihJTlQzMiBwb3J0LCBjb25zdCBjaGFyICpwcm90bykKIHsKLSAgICBkcHJpbnRmX2luZm8od2luc29jaywgIldTX0dldFNlcnZCeVBvcnQzMjogJWksICclcydcbiIsCisgICAgVFJBQ0Uod2luc29jaywgIiVpLCAnJXMnXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpcG9ydCwgKHByb3RvKT9wcm90bzpOVUxMX1NUUklORyk7CiAgICAgcmV0dXJuIF9fd3NfZ2V0c2VydmJ5cG9ydChwb3J0LCBwcm90bywgV1NfRFVQX0xJTkVBUik7CiB9CkBAIC0xNjQyLDcgKzE2NDIsNyBAQAogewogICAgIExQV1NJTkZPICAgICAgICAgICAgICBwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CiAKLSAgICBkcHJpbnRmX2luZm8od2luc29jaywgIldTX0dldEhvc3ROYW1lKCUwOHgpOiBuYW1lICVzLCBsZW4gJWRcbiIsCisgICAgVFJBQ0Uod2luc29jaywgIiglMDh4KTogbmFtZSAlcywgbGVuICVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpcHdzaSwgKG5hbWUpP25hbWU6TlVMTF9TVFJJTkcsIG5hbWVsZW4pOwogICAgIGlmKCBwd3NpICkKICAgICB7CkBAIC0xNjgyLDggKzE2ODIsOCBAQAogewogICBMUFdTSU5GTyAgICAgICAgICAgICAgcHdzaSA9IHdzaV9maW5kKEdldEN1cnJlbnRUYXNrKCkpOwogCi0gIGRwcmludGZfaW5mbyh3aW5zb2NrLCAiV1NfQXN5bmNHZXRIb3N0QnlBZGRyMTYoJTA4eCk6IGh3bmQgJTA0eCwgbXNnICUwNHgsIGFkZHIgJTA4eFslaV1cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClwd3NpLCBoV25kLCB1TXNnLCAodW5zaWduZWQpYWRkciAsIGxlbiApOworICBUUkFDRSh3aW5zb2NrLCAiKCUwOHgpOiBod25kICUwNHgsIG1zZyAlMDR4LCBhZGRyICUwOHhbJWldXG4iLAorCSAgICAgICAodW5zaWduZWQpcHdzaSwgaFduZCwgdU1zZywgKHVuc2lnbmVkKWFkZHIgLCBsZW4gKTsKIAogICBpZiggcHdzaSApIAogICAgIHJldHVybiBfX1dTQXN5bmNEQlF1ZXJ5KHB3c2ksIGhXbmQsIHVNc2csIHR5cGUsIGFkZHIsIGxlbiwKQEAgLTE2OTksOCArMTY5OSw4IEBACiB7CiAgIExQV1NJTkZPICAgICAgICAgICAgICBwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CiAKLSAgZHByaW50Zl9pbmZvKHdpbnNvY2ssICJXU19Bc3luY0dldEhvc3RCeUFkZHIzMiglMDh4KTogaHduZCAlMDR4LCBtc2cgJTA4eCwgYWRkciAlMDh4WyVpXVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKXB3c2ksIChIV05EMTYpaFduZCwgdU1zZywgKHVuc2lnbmVkKWFkZHIgLCBsZW4gKTsKKyAgVFJBQ0Uod2luc29jaywgIiglMDh4KTogaHduZCAlMDR4LCBtc2cgJTA4eCwgYWRkciAlMDh4WyVpXVxuIiwKKwkgICAgICAgKHVuc2lnbmVkKXB3c2ksIChIV05EMTYpaFduZCwgdU1zZywgKHVuc2lnbmVkKWFkZHIgLCBsZW4gKTsKIAogICBpZiggcHdzaSApCiAgICAgcmV0dXJuIF9fV1NBc3luY0RCUXVlcnkocHdzaSwgaFduZCwgdU1zZywgdHlwZSwgYWRkciwgbGVuLApAQCAtMTcxNyw3ICsxNzE3LDcgQEAKIHsKICAgTFBXU0lORk8gICAgICAgICAgICAgIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKIAotICBkcHJpbnRmX2luZm8od2luc29jaywgIldTX0FzeW5jR2V0SG9zdEJ5TmFtZTE2KCUwOHgpOiBod25kICUwNHgsIG1zZyAlMDR4LCBob3N0ICVzLCAKKyAgVFJBQ0Uod2luc29jaywgIiglMDh4KTogaHduZCAlMDR4LCBtc2cgJTA0eCwgaG9zdCAlcywgCiBidWZmZXIgJWlcbiIsICh1bnNpZ25lZClwd3NpLCBoV25kLCB1TXNnLCAobmFtZSk/bmFtZTpOVUxMX1NUUklORywgKGludClidWZsZW4gKTsKIAogICBpZiggcHdzaSApCkBAIC0xNzMzLDggKzE3MzMsOSBAQAogCQkJCQlMUFNUUiBzYnVmLCBJTlQzMiBidWZsZW4pCiB7CiAgIExQV1NJTkZPICAgICAgICAgICAgICBwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7Ci0gIGRwcmludGZfaW5mbyh3aW5zb2NrLCAiV1NfQXN5bmNHZXRIb3N0QnlOYW1lMzIoJTA4eCk6IGh3bmQgJTA0eCwgbXNnICUwOHgsIGhvc3QgJXMsIAotYnVmZmVyICVpXG4iLCAodW5zaWduZWQpcHdzaSwgKEhXTkQxNiloV25kLCB1TXNnLCAobmFtZSk/bmFtZTpOVUxMX1NUUklORywgKGludClidWZsZW4gKTsKKyAgVFJBQ0Uod2luc29jaywgIiglMDh4KTogaHduZCAlMDR4LCBtc2cgJTA4eCwgaG9zdCAlcywgYnVmZmVyICVpXG4iLCAKKwkgICAgICAgKHVuc2lnbmVkKXB3c2ksIChIV05EMTYpaFduZCwgdU1zZywgCisJICAgICAgIChuYW1lKT9uYW1lOk5VTExfU1RSSU5HLCAoaW50KWJ1ZmxlbiApOwogICBpZiggcHdzaSApCiAgICAgcmV0dXJuIF9fV1NBc3luY0RCUXVlcnkocHdzaSwgaFduZCwgdU1zZywgMCwgbmFtZSwgMCwKICAJCQkgICAgTlVMTCwgKHZvaWQqKXNidWYsIGJ1ZmxlbiwgV1NNU0dfQVNZTkNfSE9TVEJZTkFNRSB8IFdTTVNHX0FTWU5DX1dJTjMyKTsKQEAgLTE3NTAsOCArMTc1MSw4IEBACiB7CiAgIExQV1NJTkZPICAgICAgICAgICAgICBwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CiAKLSAgZHByaW50Zl9pbmZvKHdpbnNvY2ssICJXU19Bc3luY0dldFByb3RvQnlOYW1lMTYoJTA4eCk6IGh3bmQgJTA0eCwgbXNnICUwOHgsIHByb3RvY29sICVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpcHdzaSwgKEhXTkQxNiloV25kLCB1TXNnLCAobmFtZSk/bmFtZTpOVUxMX1NUUklORyApOworICBUUkFDRSh3aW5zb2NrLCAiKCUwOHgpOiBod25kICUwNHgsIG1zZyAlMDh4LCBwcm90b2NvbCAlc1xuIiwKKwkgICAgICAgKHVuc2lnbmVkKXB3c2ksIChIV05EMTYpaFduZCwgdU1zZywgKG5hbWUpP25hbWU6TlVMTF9TVFJJTkcgKTsKIAogICBpZiggcHdzaSApCiAgICAgcmV0dXJuIF9fV1NBc3luY0RCUXVlcnkocHdzaSwgaFduZCwgdU1zZywgMCwgbmFtZSwgMCwKQEAgLTE3NjcsOCArMTc2OCw4IEBACiB7CiAgIExQV1NJTkZPICAgICAgICAgICAgICBwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CiAKLSAgZHByaW50Zl9pbmZvKHdpbnNvY2ssICJXU19Bc3luY0dldFByb3RvQnlOYW1lMzIoJTA4eCk6IGh3bmQgJTA0eCwgbXNnICUwOHgsIHByb3RvY29sICVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpcHdzaSwgKEhXTkQxNiloV25kLCB1TXNnLCAobmFtZSk/bmFtZTpOVUxMX1NUUklORyApOworICBUUkFDRSh3aW5zb2NrLCAiKCUwOHgpOiBod25kICUwNHgsIG1zZyAlMDh4LCBwcm90b2NvbCAlc1xuIiwKKwkgICAgICAgKHVuc2lnbmVkKXB3c2ksIChIV05EMTYpaFduZCwgdU1zZywgKG5hbWUpP25hbWU6TlVMTF9TVFJJTkcgKTsKIAogICBpZiggcHdzaSApCiAgICAgcmV0dXJuIF9fV1NBc3luY0RCUXVlcnkocHdzaSwgaFduZCwgdU1zZywgMCwgbmFtZSwgMCwKQEAgLTE3ODUsOCArMTc4Niw4IEBACiB7CiAgIExQV1NJTkZPICAgICAgICAgICAgICBwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CiAKLSAgZHByaW50Zl9pbmZvKHdpbnNvY2ssICJXU19Bc3luY0dldFByb3RvQnlOdW1iZXIxNiglMDh4KTogaHduZCAlMDR4LCBtc2cgJTA0eCwgbnVtICVpXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpcHdzaSwgaFduZCwgdU1zZywgbnVtYmVyICk7CisgIFRSQUNFKHdpbnNvY2ssICIoJTA4eCk6IGh3bmQgJTA0eCwgbXNnICUwNHgsIG51bSAlaVxuIiwKKwkgICAgICAgKHVuc2lnbmVkKXB3c2ksIGhXbmQsIHVNc2csIG51bWJlciApOwogCiAgIGlmKCBwd3NpICkKICAgICByZXR1cm4gX19XU0FzeW5jREJRdWVyeShwd3NpLCBoV25kLCB1TXNnLCBudW1iZXIsIE5VTEwsIDAsCkBAIC0xODAyLDggKzE4MDMsOCBAQAogewogICBMUFdTSU5GTyAgICAgICAgICAgICAgcHdzaSA9IHdzaV9maW5kKEdldEN1cnJlbnRUYXNrKCkpOwogCi0gIGRwcmludGZfaW5mbyh3aW5zb2NrLCAiV1NfQXN5bmNHZXRQcm90b0J5TnVtYmVyMzIoJTA4eCk6IGh3bmQgJTA0eCwgbXNnICUwOHgsIG51bSAlaVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKXB3c2ksIChIV05EMTYpaFduZCwgdU1zZywgbnVtYmVyICk7CisgIFRSQUNFKHdpbnNvY2ssICIoJTA4eCk6IGh3bmQgJTA0eCwgbXNnICUwOHgsIG51bSAlaVxuIiwKKwkgICAgICAgKHVuc2lnbmVkKXB3c2ksIChIV05EMTYpaFduZCwgdU1zZywgbnVtYmVyICk7CiAKICAgaWYoIHB3c2kgKQogICAgIHJldHVybiBfX1dTQXN5bmNEQlF1ZXJ5KHB3c2ksIGhXbmQsIHVNc2csIG51bWJlciwgTlVMTCwgMCwKQEAgLTE4MjAsOCArMTgyMSw5IEBACiB7CiAgIExQV1NJTkZPICAgICAgICAgICAgICBwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CiAKLSAgZHByaW50Zl9pbmZvKHdpbnNvY2ssICJXU19Bc3luY0dldFNlcnZCeU5hbWUxNiglMDh4KTogaHduZCAlMDR4LCBtc2cgJTA0eCwgbmFtZSAlcywgcHJvdG8gJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKXB3c2ksIGhXbmQsIHVNc2csIChuYW1lKT9uYW1lOk5VTExfU1RSSU5HLCAocHJvdG8pP3Byb3RvOk5VTExfU1RSSU5HICk7CisgIFRSQUNFKHdpbnNvY2ssICIoJTA4eCk6IGh3bmQgJTA0eCwgbXNnICUwNHgsIG5hbWUgJXMsIHByb3RvICVzXG4iLAorCSAgICAgICAodW5zaWduZWQpcHdzaSwgaFduZCwgdU1zZywgCisJICAgICAgIChuYW1lKT9uYW1lOk5VTExfU1RSSU5HLCAocHJvdG8pP3Byb3RvOk5VTExfU1RSSU5HICk7CiAKICAgaWYoIHB3c2kgKQogICB7CkBAIC0xODQyLDggKzE4NDQsOSBAQAogewogICBMUFdTSU5GTyAgICAgICAgICAgICAgcHdzaSA9IHdzaV9maW5kKEdldEN1cnJlbnRUYXNrKCkpOwogCi0gIGRwcmludGZfaW5mbyh3aW5zb2NrLCAiV1NfQXN5bmNHZXRTZXJ2QnlOYW1lMzIoJTA4eCk6IGh3bmQgJTA0eCwgbXNnICUwOHgsIG5hbWUgJXMsIHByb3RvICVzXG4iLAotICAgICAgICAgICAodW5zaWduZWQpcHdzaSwgKEhXTkQxNiloV25kLCB1TXNnLCAobmFtZSk/bmFtZTpOVUxMX1NUUklORywgKHByb3RvKT9wcm90bzpOVUxMX1NUUklORyApOworICBUUkFDRSh3aW5zb2NrLCAiKCUwOHgpOiBod25kICUwNHgsIG1zZyAlMDh4LCBuYW1lICVzLCBwcm90byAlc1xuIiwKKwkgICAgICAgKHVuc2lnbmVkKXB3c2ksIChIV05EMTYpaFduZCwgdU1zZywgCisJICAgICAgIChuYW1lKT9uYW1lOk5VTExfU1RSSU5HLCAocHJvdG8pP3Byb3RvOk5VTExfU1RSSU5HICk7CiAgIGlmKCBwd3NpICkKICAgewogICAgICAgaW50IGkgPSB3c2lfc3RydG9sbyggcHdzaSwgbmFtZSwgcHJvdG8gKTsKQEAgLTE4NjQsOCArMTg2Nyw4IEBACiB7CiAgIExQV1NJTkZPICAgICAgICAgICAgICBwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CiAKLSAgZHByaW50Zl9pbmZvKHdpbnNvY2ssICJXU19Bc3luY0dldFNlcnZCeVBvcnQxNiglMDh4KTogaHduZCAlMDR4LCBtc2cgJTA0eCwgcG9ydCAlaSwgcHJvdG8gJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpcHdzaSwgaFduZCwgdU1zZywgcG9ydCwgKHByb3RvKT9wcm90bzpOVUxMX1NUUklORyApOworICBUUkFDRSh3aW5zb2NrLCAiKCUwOHgpOiBod25kICUwNHgsIG1zZyAlMDR4LCBwb3J0ICVpLCBwcm90byAlc1xuIiwKKwkgICAgICAgKHVuc2lnbmVkKXB3c2ksIGhXbmQsIHVNc2csIHBvcnQsIChwcm90byk/cHJvdG86TlVMTF9TVFJJTkcgKTsKIAogICBpZiggcHdzaSApCiAgIHsKQEAgLTE4ODYsOCArMTg4OSw4IEBACiB7CiAgIExQV1NJTkZPICAgICAgICAgICAgICBwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CiAKLSAgZHByaW50Zl9pbmZvKHdpbnNvY2ssICJXU19Bc3luY0dldFNlcnZCeVBvcnQzMiglMDh4KTogaHduZCAlMDR4LCBtc2cgJTA4eCwgcG9ydCAlaSwgcHJvdG8gJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpcHdzaSwgKEhXTkQxNiloV25kLCB1TXNnLCBwb3J0LCAocHJvdG8pP3Byb3RvOk5VTExfU1RSSU5HICk7CisgIFRSQUNFKHdpbnNvY2ssICIoJTA4eCk6IGh3bmQgJTA0eCwgbXNnICUwOHgsIHBvcnQgJWksIHByb3RvICVzXG4iLAorCSAgICAgICAodW5zaWduZWQpcHdzaSwgKEhXTkQxNiloV25kLCB1TXNnLCBwb3J0LCAocHJvdG8pP3Byb3RvOk5VTExfU1RSSU5HICk7CiAKICAgaWYoIHB3c2kgKQogICB7CkBAIC0xOTEwLDcgKzE5MTMsNyBAQAogICAgIExQV1NJTkZPCQlwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CiAgICAgd3NfYXN5bmNfb3AqCXBfYW9wID0gKHdzX2FzeW5jX29wKilXU19IQU5ETEUyUFRSKGhBc3luY1Rhc2tIYW5kbGUpOwogCi0gICAgZHByaW50Zl9pbmZvKHdpbnNvY2ssICJXU19DYW5jZWxBc3luY1JlcXVlc3QoJTA4eCk6IGhhbmRsZSAlMDh4XG4iLCAKKyAgICBUUkFDRSh3aW5zb2NrLCAiKCUwOHgpOiBoYW5kbGUgJTA4eFxuIiwgCiAJCQkgICAodW5zaWduZWQpcHdzaSwgaEFzeW5jVGFza0hhbmRsZSk7CiAgICAgaWYoIHB3c2kgKQogICAgIHsKQEAgLTE5NTAsNyArMTk1Myw3IEBACiAgICAgRFdPUkQJCWR3RXZlbnQsIGR3RXJyQnl0ZXM7CiAgICAgaW50CQkJbnVtX3Bvc3RlZDsKIAotICAgIGRwcmludGZfaW5mbyh3aW5zb2NrLCJXSU5TT0NLX0hhbmRsZUlPOiAlaSBwZW5kaW5nIGRlc2NyaXB0b3JzXG4iLCBudW1fcGVuZGluZyApOworICAgIFRSQUNFKHdpbnNvY2ssIiVpIHBlbmRpbmcgZGVzY3JpcHRvcnNcbiIsIG51bV9wZW5kaW5nICk7CiAKICAgICBmb3IoIG51bV9wb3N0ZWQgPSBkd0V2ZW50ID0gMCA7IHBzb3A7IHBzb3AgPSBwc29wLT5uZXh0ICkKICAgICB7CkBAIC0xOTY4LDcgKzE5NzEsNyBAQAogCSAgICAgKiBSZWVuYWJsaW5nIGNhbGxzIHR1cm4gdGhlbSBiYWNrIG9uLgogCSAgICAgKi8KIAotCSAgICBkcHJpbnRmX2luZm8od2luc29jaywiXHRjaGVja2luZyBwc29wID0gMHglMDh4XG4iLCAodW5zaWduZWQpIHBzb3AgKTsKKwkgICAgVFJBQ0Uod2luc29jaywiXHRjaGVja2luZyBwc29wID0gMHglMDh4XG4iLCAodW5zaWduZWQpIHBzb3AgKTsKIAogCSAgICBudW1fcGVuZGluZy0tOwogCkBAIC0yMDQ0LDcgKzIwNDcsNyBAQAogCQkgICAgaWYoIFBvc3RNZXNzYWdlMzJBKCBwc29wLT5oV25kLCBwc29wLT51TXNnLCAoV1BBUkFNMzIpV1NfUFRSMkhBTkRMRShwc29wLT5wd3MpLCAKIAkJCSAgICAgICAgICAgICAgKExQQVJBTSlXU0FNQUtFU0VMRUNUUkVQTFkoIFdTX0ZEX1dSSVRFLCAwICkgKSApCiAJCSAgICB7Ci0JCQlkcHJpbnRmX2luZm8od2luc29jaywgIlx0ICAgIGh3bmQgJTA0eCAtICUwNHgsICUwOHhcbiIsCisJCQlUUkFDRSh3aW5zb2NrLCAiXHQgICAgaHduZCAlMDR4IC0gJTA0eCwgJTA4eFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNvcC0+aFduZCwgcHNvcC0+dU1zZywgKHVuc2lnbmVkKU1BS0VMT05HKFdTX0ZEX1dSSVRFLCAwKSApOwogCQkJRkRfQ0xSKCBmZCwgJmV2ZW50X3NldFtFVkVOVF9JT19XUklURV0gKTsKIAkJCW51bV9wb3N0ZWQrKzsKQEAgLTIxMDYsNyArMjEwOSw3IEBACiAKIAkgICAgaWYoIGJQb3N0ICkKIAkgICAgewotCQlkcHJpbnRmX2luZm8od2luc29jaywgIlx0ICAgIGh3bmQgJTA0eCAtICUwNHgsICUwOHhcbiIsIAorCQlUUkFDRSh3aW5zb2NrLCAiXHQgICAgaHduZCAlMDR4IC0gJTA0eCwgJTA4eFxuIiwgCiAJCQkJcHNvcC0+aFduZCwgcHNvcC0+dU1zZywgKHVuc2lnbmVkKWR3RXZlbnQgKTsKIAkJUG9zdE1lc3NhZ2UzMkEoIHBzb3AtPmhXbmQsIHBzb3AtPnVNc2csIAogCQkJICAgICAgKFdQQVJBTTMyKVdTX1BUUjJIQU5ETEUocHNvcC0+cHdzKSwgKExQQVJBTSlkd0V2ZW50ICk7CkBAIC0yMTE3LDcgKzIxMjAsNyBAQAogCWlmKCBudW1fcGVuZGluZyA8PSAwICkgYnJlYWs7CiAgICAgfQogCi0gICAgZHByaW50Zl9pbmZvKHdpbnNvY2ssICJcdGRvbmUsICVpIHBvc3RlZCBldmVudHNcbiIsIG51bV9wb3N0ZWQgKTsKKyAgICBUUkFDRSh3aW5zb2NrLCAiXHRkb25lLCAlaSBwb3N0ZWQgZXZlbnRzXG4iLCBudW1fcG9zdGVkICk7CiAgICAgcmV0dXJuICggbnVtX3Bvc3RlZCApID8gVFJVRSA6IEZBTFNFOwogfQogCkBAIC0yMTI2LDcgKzIxMjksNyBAQAogICAgIHdzX3NvY2tldCogICAgcHdzICA9ICh3c19zb2NrZXQqKVdTX0hBTkRMRTJQVFIocyk7CiAgICAgTFBXU0lORk8gICAgICBwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CiAKLSAgICBkcHJpbnRmX2luZm8od2luc29jaywgIldTX0FzeW5jU2VsZWN0KCUwOHgpOiAlMDR4LCBoV25kICUwNHgsIHVNc2cgJTA4eCwgZXZlbnQgJTA4eFxuIiwKKyAgICBUUkFDRSh3aW5zb2NrLCAiKCUwOHgpOiAlMDR4LCBoV25kICUwNHgsIHVNc2cgJTA4eCwgZXZlbnQgJTA4eFxuIiwKIAkJCSAgKHVuc2lnbmVkKXB3c2ksIChTT0NLRVQxNilzLCAoSFdORDE2KWhXbmQsIHVNc2csICh1bnNpZ25lZClsRXZlbnQgKTsKICAgICBpZiggX2NoZWNrX3dzKHB3c2ksIHB3cykgKQogICAgIHsKQEAgLTIxNDcsNyArMjE1MCw3IEBACiAJICAgIGlmKCBwd3MtPmZsYWdzICYgKFdTX0ZEX0NPTk5FQ1QgfCBXU19GRF9XUklURSkgKQogCQlFVkVOVF9EZWxldGVJTyggcHdzLT5mZCwgRVZFTlRfSU9fV1JJVEUgKTsKIAotCSAgICBkcHJpbnRmX2luZm8od2luc29jaywiXHRyZW1vdmluZyBwc29wID0gMHglMDh4XG4iLCAodW5zaWduZWQpIHBzb3AgKTsKKwkgICAgVFJBQ0Uod2luc29jaywiXHRyZW1vdmluZyBwc29wID0gMHglMDh4XG4iLCAodW5zaWduZWQpIHBzb3AgKTsKIAogCSAgICBXU19GUkVFKCBwd3MtPnBzb3AgKTsKIAkgICAgcHdzLT5mbGFncyAmPSB+KFdTX0ZEX1JBVyB8IFdTX0ZEX0FDQ0VQVCB8IFdTX0ZEX0NPTk5FQ1QgfCAKQEAgLTIxODYsNyArMjE4OSw3IEBACiAKIAkJLyogVE9ETzogaGFuZGxlIFdTX0ZEX0FDQ0VQVCByaWdodCBhd2F5IGlmIHRoZSBzb2NrZXQgaXMgcmVhZGFibGUgKi8KIAotCQlkcHJpbnRmX2luZm8od2luc29jaywiXHRjcmVhdGluZyBwc29wID0gMHglMDh4XG4iLCAodW5zaWduZWQpcHNvcCApOworCQlUUkFDRSh3aW5zb2NrLCJcdGNyZWF0aW5nIHBzb3AgPSAweCUwOHhcbiIsICh1bnNpZ25lZClwc29wICk7CiAKIAkJcmV0dXJuIDA7IC8qIHN1Y2Nlc3MgKi8KIAkgICAgfQpAQCAtMjIxMSw3ICsyMjE0LDcgQEAKIHsKICAgaW50IGkgPSBzZXQtPmZkX2NvdW50OwogICAKLSAgZHByaW50Zl9pbmZvKHdpbnNvY2ssICJfX1dTQUZESXNTZXQxNiglZCwlOGx4KCVpKSlcbiIsIHMsKHVuc2lnbmVkIGxvbmcpc2V0LCBpKTsKKyAgVFJBQ0Uod2luc29jaywgIiglZCwlOGx4KCVpKSlcbiIsIHMsKHVuc2lnbmVkIGxvbmcpc2V0LCBpKTsKICAgICAKICAgd2hpbGUgKGktLSkKICAgICAgIGlmIChzZXQtPmZkX2FycmF5W2ldID09IHMpIHJldHVybiAxOwpAQCAtMjIyNSw3ICsyMjI4LDcgQEAKIHsKICAgaW50IGkgPSBzZXQtPmZkX2NvdW50OwogCi0gIGRwcmludGZfaW5mbyh3aW5zb2NrLCAiX19XU0FGRElzU2V0MzIoJWQsJThseCglaSkpXG4iLCBzLCh1bnNpZ25lZCBsb25nKXNldCwgaSk7CisgIFRSQUNFKHdpbnNvY2ssICIoJWQsJThseCglaSkpXG4iLCBzLCh1bnNpZ25lZCBsb25nKXNldCwgaSk7CiAKICAgd2hpbGUgKGktLSkKICAgICAgIGlmIChzZXQtPmZkX2FycmF5W2ldID09IHMpIHJldHVybiAxOwpAQCAtMjI0NSw3ICsyMjQ4LDcgQEAKICAgICogTm90ZTogSXQgaXMgYWxsb3dlZCB0byBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aG91dCBwcmlvciBXU0FTdGFydHVwKCkuCiAgICAqLwogCi0gIGRwcmludGZfaW5mbyh3aW5zb2NrLCAiV1NfSXNCbG9ja2luZygpXG4iKTsKKyAgVFJBQ0Uod2luc29jaywgIlxuIik7CiAgIHJldHVybiBGQUxTRTsKIH0KIApAQCAtMjI1Niw3ICsyMjU5LDcgQEAKIHsKICAgTFBXU0lORk8gICAgICAgICAgICAgIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKIAotICBkcHJpbnRmX2luZm8od2luc29jaywgIldTX0NhbmNlbEJsb2NraW5nQ2FsbCglMDh4KVxuIiwgKHVuc2lnbmVkKXB3c2kpOworICBUUkFDRSh3aW5zb2NrLCAiKCUwOHgpXG4iLCAodW5zaWduZWQpcHdzaSk7CiAKICAgaWYoIHB3c2kgKSByZXR1cm4gMDsKICAgcmV0dXJuIFNPQ0tFVF9FUlJPUjsKQEAgLTIyNzEsOCArMjI3NCw4IEBACiAgIEZBUlBST0MxNgkJcHJldjsKICAgTFBXU0lORk8gICAgICAgICAgICAgIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKIAotICBkcHJpbnRmX2luZm8od2luc29jaywgIldTX1NldEJsb2NraW5nSG9vazE2KCUwOHgpOiBob29rICUwOHhcbiIsIAotCQkJICAodW5zaWduZWQpcHdzaSwgKHVuc2lnbmVkKSBscEJsb2NrRnVuYyk7CisgIFRSQUNFKHdpbnNvY2ssICIoJTA4eCk6IGhvb2sgJTA4eFxuIiwgCisJICAgICAgICh1bnNpZ25lZClwd3NpLCAodW5zaWduZWQpIGxwQmxvY2tGdW5jKTsKICAgaWYoIHB3c2kgKSAKICAgeyAKICAgICAgIHByZXYgPSAoRkFSUFJPQzE2KXB3c2ktPmJsb2NraW5nX2hvb2s7IApAQCAtMjI5Miw4ICsyMjk1LDggQEAKICAgRkFSUFJPQzMyICAgICAgICAgICAgIHByZXY7CiAgIExQV1NJTkZPICAgICAgICAgICAgICBwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CiAKLSAgZHByaW50Zl9pbmZvKHdpbnNvY2ssICJXU19TZXRCbG9ja2luZ0hvb2szMiglMDh4KTogaG9vayAlMDh4XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpcHdzaSwgKHVuc2lnbmVkKSBscEJsb2NrRnVuYyk7CisgIFRSQUNFKHdpbnNvY2ssICIoJTA4eCk6IGhvb2sgJTA4eFxuIiwKKwkgICAgICAgKHVuc2lnbmVkKXB3c2ksICh1bnNpZ25lZCkgbHBCbG9ja0Z1bmMpOwogICBpZiggcHdzaSApIHsKICAgICAgIHByZXYgPSAoRkFSUFJPQzMyKXB3c2ktPmJsb2NraW5nX2hvb2s7CiAgICAgICBwd3NpLT5ibG9ja2luZ19ob29rID0gKERXT1JEKWxwQmxvY2tGdW5jOwpAQCAtMjMxMSw3ICsyMzE0LDcgQEAKIHsKICAgICBMUFdTSU5GTyAgICAgICAgICAgICAgcHdzaSA9IHdzaV9maW5kKEdldEN1cnJlbnRUYXNrKCkpOwogCi0gICAgZHByaW50Zl9pbmZvKHdpbnNvY2ssICJXU19Vbmhvb2tCbG9ja2luZ0hvb2sxNiglMDh4KVxuIiwgKHVuc2lnbmVkKXB3c2kpOworICAgIFRSQUNFKHdpbnNvY2ssICIoJTA4eClcbiIsICh1bnNpZ25lZClwd3NpKTsKICAgICBpZiggcHdzaSApIHJldHVybiAoSU5UMTYpKHB3c2ktPmJsb2NraW5nX2hvb2sgPSAwKTsKICAgICByZXR1cm4gU09DS0VUX0VSUk9SOwogfQpAQCAtMjMyNCw3ICsyMzI3LDcgQEAKIHsKICAgICBMUFdTSU5GTyAgICAgICAgICAgICAgcHdzaSA9IHdzaV9maW5kKEdldEN1cnJlbnRUYXNrKCkpOwogCi0gICAgZHByaW50Zl9pbmZvKHdpbnNvY2ssICJXU19Vbmhvb2tCbG9ja2luZ0hvb2szMiglMDh4KVxuIiwgKHVuc2lnbmVkKXB3c2kpOworICAgIFRSQUNFKHdpbnNvY2ssICIoJTA4eClcbiIsICh1bnNpZ25lZClwd3NpKTsKICAgICBpZiggcHdzaSApCiAgICAgewogCXB3c2ktPmJsb2NraW5nX2hvb2sgPSAwOwpAQCAtMjU3MSwxMCArMjU3NCwxMCBAQAogewogICAgIGludAlsb2NfZXJybm8gPSBlcnJubzsgCiAjaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykKLSAgICAgICBkcHJpbnRmX2Vycih3aW5zb2NrLCAid2luc29jazogZXJybm8gJWQsICglcykuXG4iLCAKKyAgICAgICBFUlIod2luc29jaywgImVycm5vICVkLCAoJXMpLlxuIiwgCiAgICAgICAgICAgICAgICAgCQkJIGVycm5vLCBzdHJlcnJvcihlcnJubykpOwogI2Vsc2UKLSAgICAgICBkcHJpbnRmX2Vycih3aW5zb2NrLCAid2luc29jazogZXJybm8gJWRcbiIsIGVycm5vKTsKKyAgICAgICBFUlIod2luc29jaywgImVycm5vICVkXG4iLCBlcnJubyk7CiAjZW5kaWYKIAogICAgIHN3aXRjaChsb2NfZXJybm8pCkBAIC0yNjQ2LDEwICsyNjQ5LDEwIEBACiAgICAgaW50CQlsb2NfZXJybm8gPSBoX2Vycm5vOwogCiAjaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykKLSAgICBkcHJpbnRmX2Vycih3aW5zb2NrLCAid2luc29jazogaF9lcnJubyAlZCwgKCVzKS5cbiIsIAorICAgIEVSUih3aW5zb2NrLCAiaF9lcnJubyAlZCwgKCVzKS5cbiIsIAogICAgICAgICAgICAgICAgCSAgICBoX2Vycm5vLCBzdHJlcnJvcihoX2Vycm5vKSk7CiAjZWxzZQotICAgIGRwcmludGZfZXJyKHdpbnNvY2ssICJ3aW5zb2NrOiBoX2Vycm5vICVkLlxuIiwgaF9lcnJubyk7CisgICAgRVJSKHdpbnNvY2ssICJoX2Vycm5vICVkLlxuIiwgaF9lcnJubyk7CiAjZW5kaWYKIAogICAgIHN3aXRjaChsb2NfZXJybm8pCmRpZmYgLS1naXQgYS9taXNjL3dpbnNvY2tfZG5zLmMgYi9taXNjL3dpbnNvY2tfZG5zLmMKaW5kZXggMDI5ZDk3My4uYjAwYjRlZiAxMDA2NDQKLS0tIGEvbWlzYy93aW5zb2NrX2Rucy5jCisrKyBiL21pc2Mvd2luc29ja19kbnMuYwpAQCAtMzQsNyArMzQsOSBAQAogI2luY2x1ZGUgImhlYXAuaCIKICNpbmNsdWRlICJsZHQuaCIKICNpbmNsdWRlICJtZXNzYWdlLmgiCisjaW5jbHVkZSAic2VsZWN0b3JzLmgiCiAjaW5jbHVkZSAibWlzY2VtdS5oIgorI2luY2x1ZGUgInNpZ19jb250ZXh0LmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogI2lmbmRlZiBGQVNZTkMKQEAgLTEzNiw3ICsxMzgsNyBAQAogICAgIGludCBudW0gPSAwOwogICAgIHdzX2FzeW5jX29wKiAgIHAsICpuZXh0OwogCi0gICAgZHByaW50Zl9pbmZvKHdpbnNvY2ssIiBjYW5jZWxsaW5nIGFzeW5jIEROUyByZXF1ZXN0cy4uLiBcbiIpOworICAgIFRSQUNFKHdpbnNvY2ssIiBjYW5jZWxsaW5nIGFzeW5jIEROUyByZXF1ZXN0cy4uLiBcbiIpOwogCiAgICAgU0lHTkFMX01hc2tBc3luY0V2ZW50cyggVFJVRSApOwogICAgIG5leHQgPSBfX2FzeW5jX29wX2xpc3Q7CkBAIC0xNTMsNyArMTU1LDcgQEAKIAl9CiAgICAgfQogICAgIFNJR05BTF9NYXNrQXN5bmNFdmVudHMoIEZBTFNFICk7Ci0gICAgZHByaW50Zl9pbmZvKHdpbnNvY2ssIiAtPiAlaSB0b3RhbFxuIiwgbnVtICk7CisgICAgVFJBQ0Uod2luc29jaywiIC0+ICVpIHRvdGFsXG4iLCBudW0gKTsKIH0KIAogdm9pZCBXSU5TT0NLX2xpbmtfYXN5bmNfb3Aod3NfYXN5bmNfb3AqIHBfYW9wKQpAQCAtMTc2LDcgKzE3OCw3IEBACiAJICB7CiAJICAgICAgd3NfYXN5bmNfb3AqIGRlYWQgPSBwOwogCi0JICAgICAgZHByaW50Zl9pbmZvKHdpbnNvY2ssIlx0cmVhcGluZyBkZWFkIGFvcCBbJTA4eF1cbiIsICh1bnNpZ25lZClwICk7CisJICAgICAgVFJBQ0Uod2luc29jaywiXHRyZWFwaW5nIGRlYWQgYW9wIFslMDh4XVxuIiwgKHVuc2lnbmVkKXAgKTsKIAogCSAgICAgIHAgPSBwLT5uZXh0OwogCSAgICAgIFdJTlNPQ0tfdW5saW5rX2FzeW5jX29wKCBkZWFkICk7CkBAIC0yMTgsMTIgKzIyMCwxNCBAQAogICogTm90ZTogcGlwZS1iYXNlZCBoYW5kbGVycyBtdXN0IHJhaXNlIGV4cGxpY2l0IFNJR0lPIHdpdGgga2lsbCgyKS4KICAqLwogCi12b2lkIFdJTlNPQ0tfc2lnaW8oaW50IHNpZ25hbCkKK0hBTkRMRVJfREVGKFdJTlNPQ0tfc2lnaW8pCiB7CiAgc3RydWN0IHRpbWV2YWwgICAgICAgICB0aW1lb3V0OwogIGZkX3NldCAgICAgICAgICAgICAgICAgY2hlY2tfc2V0OwogIHdzX2FzeW5jX29wKgkJcF9hb3A7CiAKKyBIQU5ETEVSX0lOSVQoKTsKKwogIGNoZWNrX3NldCA9IF9fYXN5bmNfaW9fZmRzZXQ7CiAgbWVtc2V0KCZ0aW1lb3V0LCAwLCBzaXplb2YodGltZW91dCkpOwogCkBAIC0zNDMsNyArMzQ3LDcgQEAKIAkgICAgYXN5bmNfY3RsLndzX2FvcC0+cGlkID0gZm9yaygpOwogCSAgICBpZiggYXN5bmNfY3RsLndzX2FvcC0+cGlkICkKIAkgICAgewotCQlkcHJpbnRmX2luZm8od2luc29jaywgIlx0YXN5bmNfb3AgPSAlMDR4IChjaGlsZCAlaSlcbiIsIAorCQlUUkFDRSh3aW5zb2NrLCAiXHRhc3luY19vcCA9ICUwNHggKGNoaWxkICVpKVxuIiwgCiAJCQkJaGFuZGxlLCBhc3luY19jdGwud3NfYW9wLT5waWQpOwogCiAJCWNsb3NlKGFzeW5jX2N0bC53c19hb3AtPmZkWzFdKTsgIC8qIHdyaXRlIGVuZHBvaW50ICovCkBAIC00NTIsNyArNDU2LDcgQEAKIAkgOiBnZXRob3N0YnlhZGRyKGFzeW5jX2N0bC5ycS5uYW1lLAogCQkgCSBhc3luY19jdGwuaWxlbmd0aCwgYXN5bmNfY3RsLnR5cGUpOwogCi0gIGRwcmludGZfaW5mbyh3aW5zb2NrLCJETlM6IGdvdCBob3N0ZW50IGZvciBbJXNdXG4iLCBhc3luY19jdGwucnEubmFtZSApOworICBUUkFDRSh3aW5zb2NrLCJETlM6IGdvdCBob3N0ZW50IGZvciBbJXNdXG4iLCBhc3luY19jdGwucnEubmFtZSApOwogCiAgIGlmKCBwX2hlICkgLyogY29udmVydCB0byB0aGUgV2luc29jayBmb3JtYXQgd2l0aCBpbnRlcm5hbCBwb2ludGVycyBhcyBvZmZzZXRzICovCiAgICAgICBzaXplID0gV1NfZHVwX2hlKHB3c2ksIHBfaGUsIFdTX0RVUF9PRkZTRVQgfCAKQEAgLTQ3Niw3ICs0ODAsNyBAQAogCSA/IGdldHByb3RvYnluYW1lKGFzeW5jX2N0bC5ycS5uYW1lKQogCSA6IGdldHByb3RvYnludW1iZXIoYXN5bmNfY3RsLnR5cGUpOwogCi0gIGRwcmludGZfaW5mbyh3aW5zb2NrLCJETlM6IGdvdCBwcm90b2VudCBmb3IgWyVzXVxuIiwgYXN5bmNfY3RsLnJxLm5hbWUgKTsKKyAgVFJBQ0Uod2luc29jaywiRE5TOiBnb3QgcHJvdG9lbnQgZm9yIFslc11cbiIsIGFzeW5jX2N0bC5ycS5uYW1lICk7CiAKICAgaWYoIHBfcGUgKSAvKiBjb252ZXJ0IHRvIHRoZSBXaW5zb2NrIGZvcm1hdCB3aXRoIGludGVybmFsIHBvaW50ZXJzIGFzIG9mZnNldHMgKi8KICAgICAgIHNpemUgPSBXU19kdXBfcGUocHdzaSwgcF9wZSwgV1NfRFVQX09GRlNFVCB8CmRpZmYgLS1naXQgYS9taXNjL3dzcHJpbnRmLmMgYi9taXNjL3dzcHJpbnRmLmMKaW5kZXggMDQzZjVlOS4uZmZmYTJlNiAxMDA2NDQKLS0tIGEvbWlzYy93c3ByaW50Zi5jCisrKyBiL21pc2Mvd3NwcmludGYuYwpAQCAtMzk2LDcgKzM5Niw3IEBACiAgICAgICAgIG1heGxlbiAtPSBsZW47CiAgICAgfQogICAgICpwID0gMDsKLSAgICBkcHJpbnRmX2luZm8oc3RyaW5nLCIlc1xuIixidWZmZXIpOworICAgIFRSQUNFKHN0cmluZywiJXNcbiIsYnVmZmVyKTsKICAgICByZXR1cm4gKG1heGxlbiA+IDEpID8gKElOVDMyKShwIC0gYnVmZmVyKSA6IC0xOwogfQogCkBAIC00NzcsNyArNDc3LDcgQEAKICAqLwogSU5UMTYgV0lOQVBJIHd2c3ByaW50ZjE2KCBMUFNUUiBidWZmZXIsIExQQ1NUUiBzcGVjLCBMUENWT0lEIGFyZ3MgKQogewotICAgIGRwcmludGZfaW5mbyhzdHJpbmcsInd2c3ByaW50ZjE2IGZvciAlcCBnb3Q6XG4iLGJ1ZmZlcik7CisgICAgVFJBQ0Uoc3RyaW5nLCJmb3IgJXAgZ290OlxuIixidWZmZXIpOwogICAgIHJldHVybiB3dnNucHJpbnRmMTYoIGJ1ZmZlciwgMHhmZmZmLCBzcGVjLCBhcmdzICk7CiB9CiAKQEAgLTQ4Nyw3ICs0ODcsNyBAQAogICovCiBJTlQzMiBXSU5BUEkgd3ZzcHJpbnRmMzJBKCBMUFNUUiBidWZmZXIsIExQQ1NUUiBzcGVjLCB2YV9saXN0IGFyZ3MgKQogewotICAgIGRwcmludGZfaW5mbyhzdHJpbmcsInd2c3ByaW50ZjMyQSBmb3IgJXAgZ290OlxuIixidWZmZXIpOworICAgIFRSQUNFKHN0cmluZywiZm9yICVwIGdvdDpcbiIsYnVmZmVyKTsKICAgICByZXR1cm4gd3ZzbnByaW50ZjMyQSggYnVmZmVyLCAweGZmZmZmZmZmLCBzcGVjLCBhcmdzICk7CiB9CiAKQEAgLTQ5Nyw3ICs0OTcsNyBAQAogICovCiBJTlQzMiBXSU5BUEkgd3ZzcHJpbnRmMzJXKCBMUFdTVFIgYnVmZmVyLCBMUENXU1RSIHNwZWMsIHZhX2xpc3QgYXJncyApCiB7Ci0gICAgZHByaW50Zl9pbmZvKHN0cmluZywid3ZzcHJpbnRmMzJXIGZvciAlcCBnb3Q6XG4iLGJ1ZmZlcik7CisgICAgVFJBQ0Uoc3RyaW5nLCJmb3IgJXAgZ290OlxuIixidWZmZXIpOwogICAgIHJldHVybiB3dnNucHJpbnRmMzJXKCBidWZmZXIsIDB4ZmZmZmZmZmYsIHNwZWMsIGFyZ3MgKTsKIH0KIApAQCAtNTExLDcgKzUxMSw3IEBACiAgICAgdmFfbGlzdCB2YWxpc3Q7CiAgICAgSU5UMTYgcmVzOwogCi0gICAgZHByaW50Zl9pbmZvKHN0cmluZywid3NwcmludGYxNiBmb3IgJXAgZ290OlxuIixidWZmZXIpOworICAgIFRSQUNFKHN0cmluZywiZm9yICVwIGdvdDpcbiIsYnVmZmVyKTsKICAgICB2YV9zdGFydCggdmFsaXN0LCBzcGVjICk7CiAgICAgLyogTm90ZTogd2UgY2FsbCB0aGUgMzItYml0IHZlcnNpb24sIGJlY2F1c2UgdGhlIGFyZ3MgYXJlIDMyLWJpdCAqLwogICAgIHJlcyA9IChJTlQxNil3dnNucHJpbnRmMzJBKCBidWZmZXIsIDB4ZmZmZmZmZmYsIHNwZWMsIHZhbGlzdCApOwpAQCAtNTI5LDcgKzUyOSw3IEBACiAgICAgVkFfU1RBUlQxNiggdmFsaXN0ICk7CiAgICAgYnVmZmVyID0gVkFfQVJHMTYoIHZhbGlzdCwgU0VHUFRSICk7CiAgICAgc3BlYyAgID0gVkFfQVJHMTYoIHZhbGlzdCwgU0VHUFRSICk7Ci0gICAgZHByaW50Zl9pbmZvKHN0cmluZywiV0lOMTZfd3NwcmludGYxNiBnb3Q6XG4iKTsKKyAgICBUUkFDRShzdHJpbmcsImdvdDpcbiIpOwogICAgIHJlcyA9IHd2c25wcmludGYxNiggKExQU1RSKVBUUl9TRUdfVE9fTElOKGJ1ZmZlciksIDB4ZmZmZiwKICAgICAgICAgICAgICAgICAgICAgICAgIChMUENTVFIpUFRSX1NFR19UT19MSU4oc3BlYyksIHZhbGlzdCApOwogICAgIFZBX0VORDE2KCB2YWxpc3QgKTsKQEAgLTU0NSw3ICs1NDUsNyBAQAogICAgIHZhX2xpc3QgdmFsaXN0OwogICAgIElOVDMyIHJlczsKIAotICAgIGRwcmludGZfaW5mbyhzdHJpbmcsIndzcHJpbnRmMzJBIGZvciAlcCBnb3Q6XG4iLGJ1ZmZlcik7CisgICAgVFJBQ0Uoc3RyaW5nLCJmb3IgJXAgZ290OlxuIixidWZmZXIpOwogICAgIHZhX3N0YXJ0KCB2YWxpc3QsIHNwZWMgKTsKICAgICByZXMgPSB3dnNucHJpbnRmMzJBKCBidWZmZXIsIDB4ZmZmZmZmZmYsIHNwZWMsIHZhbGlzdCApOwogICAgIHZhX2VuZCggdmFsaXN0ICk7CkBAIC01NjEsNyArNTYxLDcgQEAKICAgICB2YV9saXN0IHZhbGlzdDsKICAgICBJTlQzMiByZXM7CiAKLSAgICBkcHJpbnRmX2luZm8oc3RyaW5nLCJ3c3ByaW50ZjMyVyBmb3IgJXBcbiIsYnVmZmVyKTsKKyAgICBUUkFDRShzdHJpbmcsIndzcHJpbnRmMzJXIGZvciAlcFxuIixidWZmZXIpOwogICAgIHZhX3N0YXJ0KCB2YWxpc3QsIHNwZWMgKTsKICAgICByZXMgPSB3dnNucHJpbnRmMzJXKCBidWZmZXIsIDB4ZmZmZmZmZmYsIHNwZWMsIHZhbGlzdCApOwogICAgIHZhX2VuZCggdmFsaXN0ICk7CmRpZmYgLS1naXQgYS9taXNjZW11L2VtdWxhdGUuYyBiL21pc2NlbXUvZW11bGF0ZS5jCmluZGV4IDkyNjFlYWEuLmYxNDFhNDQgMTAwNjQ0Ci0tLSBhL21pc2NlbXUvZW11bGF0ZS5jCisrKyBiL21pc2NlbXUvZW11bGF0ZS5jCkBAIC0yOCw3ICsyOCw3IEBACiAKIHZvaWQgV0lOQVBJIFdJTjg3X2ZwbWF0aCggQ09OVEVYVCAqY29udGV4dCApCiB7Ci0gICAgZHByaW50Zl9pbmZvKGludCwgIl9mcG1hdGg6IChjczplaXA9JXg6JWx4IGVzPSV4IGJ4PSUwNHggYXg9JTA0eCBkeD09JTA0eClcbiIsCisgICAgVFJBQ0UoaW50LCAiKGNzOmVpcD0leDolbHggZXM9JXggYng9JTA0eCBheD0lMDR4IGR4PT0lMDR4KVxuIiwKICAgICAgICAgICAgICAgICAgKFdPUkQpQ1NfcmVnKGNvbnRleHQpLCBFSVBfcmVnKGNvbnRleHQpLAogICAgICAgICAgICAgICAgICAoV09SRClFU19yZWcoY29udGV4dCksIEJYX3JlZyhjb250ZXh0KSwKICAgICAgICAgICAgICAgICAgQVhfcmVnKGNvbnRleHQpLCBEWF9yZWcoY29udGV4dCkgKTsKQEAgLTc0LDcgKzc0LDcgQEAKICAgICAgICAgICAgICAqLwogLyogRklYTUU6IGNvdWxkIHNvbWVvbmUgd2hvIHJlYWxseSB1bmRlcnN0YW5kcyBhc20oKSBmaXggdGhpcyBwbGVhc2U/IC0tQUogKi8KIC8qICAgICAgICAgICAgX19hc21fXygiZmlzdHAgJTA7d2FpdCIgOiAiPW0iIChkdykgOiA6ICJtZW1vcnkiKTsgKi8KLSAgICAgICAgICAgIGRwcmludGZfaW5mbyhpbnQsImVtdWxhdGUuYzpPbiB0b3Agb2Ygc3RhY2sgd2FzICVsZFxuIixkdyk7CisgICAgICAgICAgICBUUkFDRShpbnQsIk9uIHRvcCBvZiBzdGFjayB3YXMgJWxkXG4iLGR3KTsKICAgICAgICAgICAgIEFYX3JlZyhjb250ZXh0KSA9IExPV09SRChkdyk7CiAgICAgICAgICAgICBEWF9yZWcoY29udGV4dCkgPSBISVdPUkQoZHcpOwogICAgICAgICB9CkBAIC0xMDgsMTggKzEwOCwxOCBAQAogdm9pZCBXSU5BUEkgV0lOODdfV2luRW04N0luZm8oc3RydWN0IFdpbjg3RW1JbmZvU3RydWN0ICpwV0lTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNiV2luODdFbUluZm9TdHJ1Y3QpCiB7Ci0gIGRwcmludGZfaW5mbyhpbnQsICJfX1dpbkVtODdJbmZvKCVwLCVkKVxuIixwV0lTLGNiV2luODdFbUluZm9TdHJ1Y3QpOworICBUUkFDRShpbnQsICIoJXAsJWQpXG4iLHBXSVMsY2JXaW44N0VtSW5mb1N0cnVjdCk7CiB9CiAKIHZvaWQgV0lOQVBJIFdJTjg3X1dpbkVtODdSZXN0b3JlKHZvaWQgKnBXaW44N0VtU2F2ZUFyZWEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2JXaW44N0VtU2F2ZUFyZWEpCiB7Ci0gIGRwcmludGZfaW5mbyhpbnQsICJfX1dpbkVtODdSZXN0b3JlKCVwLCVkKVxuIiwKKyAgVFJBQ0UoaW50LCAiKCVwLCVkKVxuIiwKIAlwV2luODdFbVNhdmVBcmVhLGNiV2luODdFbVNhdmVBcmVhKTsKIH0KIAogdm9pZCBXSU5BUEkgV0lOODdfV2luRW04N1NhdmUodm9pZCAqcFdpbjg3RW1TYXZlQXJlYSwgaW50IGNiV2luODdFbVNhdmVBcmVhKQogewotICBkcHJpbnRmX2luZm8oaW50LCAiX19XaW5FbTg3U2F2ZSglcCwlZClcbiIsCisgIFRSQUNFKGludCwgIiglcCwlZClcbiIsCiAJcFdpbjg3RW1TYXZlQXJlYSxjYldpbjg3RW1TYXZlQXJlYSk7CiB9CmRpZmYgLS1naXQgYS9tc2Rvcy9kb3NtZW0uYyBiL21zZG9zL2Rvc21lbS5jCmluZGV4IDhjMzI2ZGIuLjQ0ODJjZjkgMTAwNjQ0Ci0tLSBhL21zZG9zL2Rvc21lbS5jCisrKyBiL21zZG9zL2Rvc21lbS5jCkBAIC0zODcsNyArMzg3LDcgQEAKICAgIExQVk9JRCAgICAgICBsaW47CiAKICAgIGxpbj1ET1NNRU1fZG9zbWVtKyh4JjB4ZmZmZikrKCgoeCYweGZmZmYwMDAwKT4+MTYpKjE2KTsKLSAgIGRwcmludGZfaW5mbyhzZWxlY3RvciwiRE9TTUVNX01hcFIyTCgweCUwOGx4KSByZXR1cm5zIDB4JXAuXG4iLAorICAgVFJBQ0Uoc2VsZWN0b3IsIigweCUwOGx4KSByZXR1cm5zIDB4JXAuXG4iLAogICAgICAgICAgICAgICAgICAgICB4LGxpbiApOwogICAgcmV0dXJuIGxpbjsKIH0KQEAgLTQwNiw3ICs0MDYsNyBAQAogCQlHTUVNX0ZJWEVELERPU01FTV9kb3NtZW0rcmVhbHNlbCoxNiwweDEwMDAwLAogCQloTW9kdWxlLEZBTFNFLEZBTFNFLEZBTFNFLE5VTEwKIAkpOwotCWRwcmludGZfaW5mbyhzZWxlY3RvciwiRE9TTUVNX0FsbG9jU2VsZWN0b3IoMHglMDR4KSByZXR1cm5zIDB4JTA0eC5cbiIsCisJVFJBQ0Uoc2VsZWN0b3IsIigweCUwNHgpIHJldHVybnMgMHglMDR4LlxuIiwKIAkJcmVhbHNlbCxzZWwKIAkpOwogCXJldHVybiBzZWw7CmRpZmYgLS1naXQgYS9tc2Rvcy9kcG1pLmMgYi9tc2Rvcy9kcG1pLmMKaW5kZXggZDQ2NDhjNi4uOTE0NjZjMSAxMDA2NDQKLS0tIGEvbXNkb3MvZHBtaS5jCisrKyBiL21zZG9zL2RwbWkuYwpAQCAtMzUwLDcgKzM1MCw3IEBACiAgICAgICAgICAgICBsZHRfZW50cnkgZW50cnk7CiAgICAgICAgICAgICBMRFRfQnl0ZXNUb0VudHJ5KCBQVFJfU0VHX09GRl9UT19MSU4oIEVTX3JlZyhjb250ZXh0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElfcmVnKGNvbnRleHQpICksICZlbnRyeSApOwotICAgICAgICAgICAgTERUX0dldEVudHJ5KCBTRUxFQ1RPUl9UT19FTlRSWSggQlhfcmVnKGNvbnRleHQpICksICZlbnRyeSApOworICAgICAgICAgICAgTERUX1NldEVudHJ5KCBTRUxFQ1RPUl9UT19FTlRSWSggQlhfcmVnKGNvbnRleHQpICksICZlbnRyeSApOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogCmRpZmYgLS1naXQgYS9tc2Rvcy9pbnQxMy5jIGIvbXNkb3MvaW50MTMuYwppbmRleCA4ZmE3MGFiLi43NjFiMmFkIDEwMDY0NAotLS0gYS9tc2Rvcy9pbnQxMy5jCisrKyBiL21zZG9zL2ludDEzLmMKQEAgLTEzMyw2ICsxMzMsMTggQEAKICAgICAgICAgICAgICAgICBTRVRfQ0ZMQUcoY29udGV4dCk7CiAJCWJyZWFrOwogCisJY2FzZSAweDE3OgkgICAvKiBTRVQgRElTSyBUWVBFIEZPUiBGT1JNQVQgKi8KKwkJaWYgKERMX3JlZyhjb250ZXh0KSA8IDQpCisJCSAgICBBSF9yZWcoY29udGV4dCkgPSAweDAwOyAvKiBzdWNjZXNzZnVsIGNvbXBsZXRpb24gKi8KKwkJZWxzZQorCQkgICAgQUhfcmVnKGNvbnRleHQpID0gMHgwMTsgLyogZXJyb3IgKi8KKwkJYnJlYWs7CisJY2FzZSAweDE4OgorCQlpZiAoRExfcmVnKGNvbnRleHQpIDwgNCkKKwkJICAgIEFIX3JlZyhjb250ZXh0KSA9IDB4MDA7IC8qIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiAqLworCQllbHNlCisJCSAgICBBSF9yZWcoY29udGV4dCkgPSAweDAxOyAvKiBlcnJvciAqLworCQlicmVhazsKIAlkZWZhdWx0OgogCQlJTlRfQkFSRiggY29udGV4dCwgMHgxMyApOwogICAgIH0KZGlmZiAtLWdpdCBhL21zZG9zL2ludDFhLmMgYi9tc2Rvcy9pbnQxYS5jCmluZGV4IDkwYzAzYzUuLjM1MGE5YTkgMTAwNjQ0Ci0tLSBhL21zZG9zL2ludDFhLmMKKysrIGIvbXNkb3MvaW50MWEuYwpAQCAtNTUsNyArNTUsNyBAQAogICAgICAgICAgICAgQ1hfcmVnKGNvbnRleHQpID0gSElXT1JEKHRpY2tzKTsKICAgICAgICAgICAgIERYX3JlZyhjb250ZXh0KSA9IExPV09SRCh0aWNrcyk7CiAgICAgICAgICAgICBBWF9yZWcoY29udGV4dCkgPSAwOyAgLyogTm8gbWlkbmlnaHQgcm9sbG92ZXIgKi8KLSAgICAgICAgICAgIGRwcmludGZfaW5mbyhpbnQsImludDFhXzAwIC8vIHRpY2tzPSVsZFxuIiwgdGlja3MpOworICAgICAgICAgICAgVFJBQ0UoaW50LCJpbnQxYTogQUg9MDAgLS0gdGlja3M9JWxkXG4iLCB0aWNrcyk7CiAgICAgICAgICAgICBicmVhazsKIAkJCiAJY2FzZSAyOiAKZGlmZiAtLWdpdCBhL21zZG9zL2ludDIxLmMgYi9tc2Rvcy9pbnQyMS5jCmluZGV4IDA0ZGY0ZTEuLmNlMWI1MWMgMTAwNjQ0Ci0tLSBhL21zZG9zL2ludDIxLmMKKysrIGIvbXNkb3MvaW50MjEuYwpAQCAtMTY5LDcgKzE2OSw3IEBACiAgICAgICAgIH0KICAgICAgICAgZWxzZSBpZiAoaGVhcCB8fCBJTlQyMV9DcmVhdGVIZWFwKCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkcHJpbnRmX2ZpeG1lKGludCwgImludDIxOiBHZXREcml2ZVBCIG5vdCBmdWxseSBpbXBsZW1lbnRlZC5cbiIpOworICAgICAgICAgICAgICAgIEZJWE1FKGludDIxLCAiR2V0RHJpdmVQQiBub3QgZnVsbHkgaW1wbGVtZW50ZWQuXG4iKTsKIAogICAgICAgICAgICAgICAgIC8qIEZJWE1FOiBJIGhhdmUgbm8gaWRlYSB3aGF0IGEgbG90IG9mIHRoaXMgaW5mb3JtYXRpb24gc2hvdWxkCiAgICAgICAgICAgICAgICAgICogc2F5IG9yIHdoZXRoZXIgaXQgZXZlbiByZWFsbHkgbWF0dGVycyBzaW5jZSB3ZSdyZSBub3QgYWxsb3dpbmcKQEAgLTIwNiw3ICsyMDYsNyBAQAogc3RhdGljIHZvaWQgaW9jdGxHZXREZXZpY2VJbmZvKCBDT05URVhUICpjb250ZXh0ICkKIHsKICAgICBpbnQgY3Vycl9kcml2ZTsKLSAgICBkcHJpbnRmX2luZm8oaW50LCAiaW50MjE6IGlvY3RsICglZCwgR2V0RGV2aWNlSW5mbylcbiIsIEJYX3JlZyhjb250ZXh0KSk7CisgICAgVFJBQ0UoaW50MjEsICIoJWQpXG4iLCBCWF9yZWcoY29udGV4dCkpOwogICAgIAogICAgIGN1cnJfZHJpdmUgPSBEUklWRV9HZXRDdXJyZW50RHJpdmUoKTsKICAgICBEWF9yZWcoY29udGV4dCkgPSAweDAxNDAgKyBjdXJyX2RyaXZlICsgKChjdXJyX2RyaXZlID4gMSkgPyAweDA4MDAgOiAwKTsgLyogbm8gZmxvcHB5ICovCkBAIC0yMzgsNyArMjM4LDcgQEAKIAlzd2l0Y2ggKENMX3JlZyhjb250ZXh0KSkgCiAJewogCQljYXNlIDB4NGE6IC8qIGxvY2sgbG9naWNhbCB2b2x1bWUgKi8KLQkJCWRwcmludGZfaW5mbyhpbnQsImludDIxOiBsb2NrIGxvZ2ljYWwgdm9sdW1lICglZCkgbGV2ZWwgJWQgbW9kZSAlZFxuIixkcml2ZSxCSF9yZWcoY29udGV4dCksRFhfcmVnKGNvbnRleHQpKTsKKwkJCVRSQUNFKGludDIxLCJsb2NrIGxvZ2ljYWwgdm9sdW1lICglZCkgbGV2ZWwgJWQgbW9kZSAlZFxuIixkcml2ZSxCSF9yZWcoY29udGV4dCksRFhfcmVnKGNvbnRleHQpKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgMHg2MDogLyogZ2V0IGRldmljZSBwYXJhbWV0ZXJzICovCkBAIC0yNzksNyArMjc5LDcgQEAKIAkJCWJyZWFrOwogCiAJCWNhc2UgMHg2YToKLQkJCWRwcmludGZfaW5mbyhpbnQsImludDIxOiBsb2dpY2FsIHZvbHVtZSAlZCB1bmxvY2tlZC5cbiIsZHJpdmUpOworCQkJVFJBQ0UoaW50MjEsImxvZ2ljYWwgdm9sdW1lICVkIHVubG9ja2VkLlxuIixkcml2ZSk7CiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgpAQCAtMzM2LDkgKzMzNiw4IEBACiAJICAgIGJyZWFrOwogCiAJICBjYXNlIDB4MzA6ICAgIC8qIERFTllSRUFEICovCi0JICAgIGRwcmludGZfaW5mbyhpbnQsCi0JICAgICAgIk9wZW5FeGlzdGluZ0ZpbGUgKCVzKTogREVOWVJFQUQgY2hhbmdlZCB0byBERU5ZQUxMXG4iLAotCSAgICAgIChjaGFyICopUFRSX1NFR19PRkZfVE9fTElOKERTX3JlZyhjb250ZXh0KSxEWF9yZWcoY29udGV4dCkpKTsKKwkgICAgVFJBQ0UoaW50MjEsICIoJXMpOiBERU5ZUkVBRCBjaGFuZ2VkIHRvIERFTllBTExcbiIsCisJCQkgKGNoYXIgKilQVFJfU0VHX09GRl9UT19MSU4oRFNfcmVnKGNvbnRleHQpLERYX3JlZyhjb250ZXh0KSkpOwogCSAgY2FzZSAweDEwOiAgICAvKiBERU5ZQUxMICovICAKIAkgICAgbG9jayA9IExPQ0tfRVg7CiAJICAgIGJyZWFrOwpAQCAtNDI0LDcgKzQyMyw3IEBACiAJICBDbG9zZUZpbGUoY29udGV4dCk7CiAJICBBWF9yZWcoY29udGV4dCkgPSAweDAwNTA7CS8qRmlsZSBleGlzdHMqLwogCSAgU0VUX0NGTEFHKGNvbnRleHQpOwotCSAgZHByaW50Zl93YXJuKGludCwgImludDIxOiBleHRlbmRlZCBvcGVuL2NyZWF0ZTogZmFpbGVkIGJlY2F1c2UgZmlsZSBleGlzdHMgXG4iKTsKKwkgIFdBUk4oaW50MjEsICJleHRlbmRlZCBvcGVuL2NyZWF0ZTogZmFpbGVkIGJlY2F1c2UgZmlsZSBleGlzdHMgXG4iKTsKICAgICAgIH0KICAgICAgIGVsc2UgaWYgKChhY3Rpb24gJiAweDA3KSA9PSAyKSAKICAgICAgIHsKQEAgLTQzMyw3ICs0MzIsNyBAQAogCXsKIAkJICBCWF9yZWcoY29udGV4dCkgPSBBWF9yZWcoY29udGV4dCk7CiAJCSAgQ2xvc2VGaWxlKGNvbnRleHQpOwotCQkgIGRwcmludGZfd2FybihpbnQsICJpbnQyMTogZXh0ZW5kZWQgb3Blbi9jcmVhdGU6IGZhaWxlZCwgdHJ1bmMgb24gcm8gZmlsZVxuIik7CisJCSAgV0FSTihpbnQyMSwgImV4dGVuZGVkIG9wZW4vY3JlYXRlOiBmYWlsZWQsIHRydW5jIG9uIHJvIGZpbGVcbiIpOwogCQkgIEFYX3JlZyhjb250ZXh0KSA9IDB4MDAwQzsJLypBY2Nlc3MgY29kZSBpbnZhbGlkKi8KIAkJICBTRVRfQ0ZMQUcoY29udGV4dCk7CiAJfQpAQCAtNDQyLDE5ICs0NDEsMTkgQEAKIAkJLyogU2h1ZmZsZSBhcmd1bWVudHMgdG8gY2FsbCBDbG9zZUZpbGUgd2hpbGUKIAkJICogcHJlc2VydmluZyBCWCBhbmQgRFggKi8KIAotCQlkcHJpbnRmX2luZm8oaW50LCAiaW50MjE6IGV4dGVuZGVkIG9wZW4vY3JlYXRlOiBDbG9zaW5nIGJlZm9yZSB0cnVuY2F0ZVxuIik7CisJCVRSQUNFKGludDIxLCAiZXh0ZW5kZWQgb3Blbi9jcmVhdGU6IENsb3NpbmcgYmVmb3JlIHRydW5jYXRlXG4iKTsKIAkJQlhfcmVnKGNvbnRleHQpID0gQVhfcmVnKGNvbnRleHQpOwogCQlDbG9zZUZpbGUoY29udGV4dCk7CiAJCWlmIChFRkxfcmVnKGNvbnRleHQpICYgMHgwMDAxKSAKIAkJewotCQkgICBkcHJpbnRmX3dhcm4oaW50LCAiaW50MjE6IGV4dGVuZGVkIG9wZW4vY3JlYXRlOiBjbG9zZSBiZWZvcmUgdHJ1bmMgZmFpbGVkXG4iKTsKKwkJICAgV0FSTihpbnQyMSwgImV4dGVuZGVkIG9wZW4vY3JlYXRlOiBjbG9zZSBiZWZvcmUgdHJ1bmMgZmFpbGVkXG4iKTsKIAkJICAgQVhfcmVnKGNvbnRleHQpID0gMHgwMDE5OwkvKlNlZWsgRXJyb3IqLwogCQkgICBDWF9yZWcoY29udGV4dCkgPSAwOwogCQkgICBTRVRfQ0ZMQUcoY29udGV4dCk7CiAJCX0KIAkJLyogU2h1ZmZsZSBhcmd1bWVudHMgdG8gY2FsbCBDcmVhdGVGaWxlICovCiAKLQkJZHByaW50Zl9pbmZvKGludCwgImludDIxOiBleHRlbmRlZCBvcGVuL2NyZWF0ZTogVHJ1bmNhdGluZ1xuIik7CisJCVRSQUNFKGludDIxLCAiZXh0ZW5kZWQgb3Blbi9jcmVhdGU6IFRydW5jYXRpbmdcbiIpOwogCQlBTF9yZWcoY29udGV4dCkgPSBCTF9yZWcoY29udGV4dCk7CiAJCS8qIENYIGlzIHN0aWxsIHRoZSBzYW1lICovCiAJCURYX3JlZyhjb250ZXh0KSA9IFNJX3JlZyhjb250ZXh0KTsKQEAgLTQ2Miw3ICs0NjEsNyBAQAogCiAJCWlmIChFRkxfcmVnKGNvbnRleHQpICYgMHgwMDAxKSAJLypubyBmaWxlIG9wZW4sIGZsYWdzIHNldCAqLwogCQl7Ci0JCSAgICBkcHJpbnRmX3dhcm4oaW50LCAiaW50MjE6IGV4dGVuZGVkIG9wZW4vY3JlYXRlOiB0cnVuYyBmYWlsZWRcbiIpOworCQkgICAgV0FSTihpbnQyMSwgImV4dGVuZGVkIG9wZW4vY3JlYXRlOiB0cnVuYyBmYWlsZWRcbiIpOwogCQkgICAgcmV0dXJuIGJFeHRlbmRlZEVycm9yOwogCQl9CiAJCXVSZXR1cm5DWCA9IDB4MzsKQEAgLTQ3OSwxOSArNDc4LDE5IEBACiAgICAgICB7CiAJQ1hfcmVnKGNvbnRleHQpID0gMDsKIAlTRVRfQ0ZMQUcoY29udGV4dCk7Ci0JZHByaW50Zl93YXJuKGludCwgImludDIxOiBleHRlbmRlZCBvcGVuL2NyZWF0ZTogZmFpbGVkLCBmaWxlIGRvc2VuJ3QgZXhpc3RcbiIpOworCVdBUk4oaW50MjEsICJleHRlbmRlZCBvcGVuL2NyZWF0ZTogZmFpbGVkLCBmaWxlIGRvc2VuJ3QgZXhpc3RcbiIpOwogICAgICAgfQogICAgICAgZWxzZQogICAgICAgewogICAgICAgICAvKiBTaHVmZmxlIGFyZ3VtZW50cyB0byBjYWxsIENyZWF0ZUZpbGUgKi8KLSAgICAgICAgZHByaW50Zl9pbmZvKGludCwgImludDIxOiBleHRlbmRlZCBvcGVuL2NyZWF0ZTogQ3JlYXRpbmdcbiIpOworICAgICAgICBUUkFDRShpbnQyMSwgImV4dGVuZGVkIG9wZW4vY3JlYXRlOiBDcmVhdGluZ1xuIik7CiAgICAgICAgIEFMX3JlZyhjb250ZXh0KSA9IEJMX3JlZyhjb250ZXh0KTsKICAgICAgICAgLyogQ1ggc2hvdWxkIHN0aWxsIGJlIHRoZSBzYW1lICovCiAgICAgICAgIERYX3JlZyhjb250ZXh0KSA9IFNJX3JlZyhjb250ZXh0KTsKICAgICAgICAgYkV4dGVuZGVkRXJyb3IgPSBJTlQyMV9DcmVhdGVGaWxlKGNvbnRleHQpOwogICAgICAgICBpZiAoRUZMX3JlZyhjb250ZXh0KSAmIDB4MDAwMSkgIC8qbm8gZmlsZSBvcGVuLCBmbGFncyBzZXQgKi8KIAl7Ci0gIAkgICAgZHByaW50Zl93YXJuKGludCwgImludDIxOiBleHRlbmRlZCBvcGVuL2NyZWF0ZTogY3JlYXRlIGZhaWxlZFxuIik7CisgIAkgICAgV0FSTihpbnQyMSwgImV4dGVuZGVkIG9wZW4vY3JlYXRlOiBjcmVhdGUgZmFpbGVkXG4iKTsKIAkgICAgcmV0dXJuIGJFeHRlbmRlZEVycm9yOwogICAgICAgICB9CiAgICAgICAgIENYX3JlZyhjb250ZXh0KSA9IDI7CkBAIC01MDcsNyArNTA2LDcgQEAKICAgICBpbnQgZHJpdmU7CiAgICAgY2hhciAqZGlybmFtZSA9IFBUUl9TRUdfT0ZGX1RPX0xJTihEU19yZWcoY29udGV4dCksRFhfcmVnKGNvbnRleHQpKTsKIAotICAgIGRwcmludGZfaW5mbyhpbnQsImludDIxOiBjaGFuZ2VkaXIgJXNcbiIsIGRpcm5hbWUpOworICAgIFRSQUNFKGludDIxLCJjaGFuZ2VkaXIgJXNcbiIsIGRpcm5hbWUpOwogICAgIGlmIChkaXJuYW1lWzBdICYmIChkaXJuYW1lWzFdID09ICc6JykpCiAgICAgewogICAgICAgICBkcml2ZSA9IHRvdXBwZXIoZGlybmFtZVswXSkgLSAnQSc7CkBAIC02MDUsNyArNjA0LDcgQEAKIAogICAgICAgICBpZiAoKEFYX3JlZyhjb250ZXh0KSA9IF9sY3JlYXRfdW5pcSggbmFtZSwgMCApKSAhPSAoV09SRClIRklMRV9FUlJPUjE2KQogICAgICAgICB7Ci0gICAgICAgICAgICBkcHJpbnRmX2luZm8oaW50LCAiSU5UMjFfQ3JlYXRlVGVtcEZpbGU6IGNyZWF0ZWQgJXNcbiIsIG5hbWUgKTsKKyAgICAgICAgICAgIFRSQUNFKGludDIxLCAiY3JlYXRlZCAlc1xuIiwgbmFtZSApOwogICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKERPU19FeHRlbmRlZEVycm9yICE9IEVSX0ZpbGVFeGlzdHMpIHJldHVybiBGQUxTRTsKQEAgLTgwMCw2ICs3OTksNjMgQEAKICAgICAgfQogfSAKIAorU0VHUFRSIElOVDIxX0dldExpc3RPZkxpc3RzKCkKK3sKKwlzdGF0aWMgRE9TX0xJU1RPRkxJU1RTICpMT0w7CisJc3RhdGljIFNFR1BUUiBzZWdfTE9MOworCisvKgorT3V0cHV0IG9mIERPUyA2LjIyOgorCiswMTMzOjAwMjAgICAgICAgICAgICAgICAgICAgIDZBIDEzLTMzIDAxIENDIDAwIDMzIDAxIDU5IDAwICAgICAgICAgai4zLi4uMy5ZLgorMDEzMzowMDMwICA3MCAwMCAwMCAwMCA3MiAwMiAwMCAwMi02RCAwMCAzMyAwMSAwMCAwMCAyRSAwNSAgIHAuLi5yLi4ubS4zLi4uLi4KKzAxMzM6MDA0MCAgMDAgMDAgRkMgMDQgMDAgMDAgMDMgMDgtOTIgMjEgMTEgRTAgMDQgODAgQzYgMEQgICAuLi4uLi4uLi4hLi4uLi4uCiswMTMzOjAwNTAgIENDIDBEIDRFIDU1IDRDIDIwIDIwIDIwLTIwIDIwIDAwIDAwIDAwIDAwIDAwIDAwICAgLi5OVUwgICAgIC4uLi4uLgorMDEzMzowMDYwICAwMCA0QiBCQSBDMSAwNiAxNCAwMCAwMC0wMCAwMyAwMSAwMCAwNCA3MCBDRSBGRiAgIC5LLi4uLi4uLi4uLi5wLi4KKzAxMzM6MDA3MCAgRkYgMDAgMDAgMDAgMDAgMDAgMDAgMDAtMDAgMDEgMDAgMDAgMEQgMDUgMDAgMDAgICAuLi4uLi4uLi4uLi4uLi4uCiswMTMzOjAwODAgIDAwIEZGIEZGIDAwIDAwIDAwIDAwIEZFLTAwIDAwIEY4IDAzIEZGIDlGIDcwIDAyICAgLi4uLi4uLi4uLi4uLi5wLgorMDEzMzowMDkwICBEMCA0NCBDOCBGRCBENCA0NCBDOCBGRC1ENCA0NCBDOCBGRCBEMCA0NCBDOCBGRCAgIC5ELi4uRC4uLkQuLi5ELi4KKzAxMzM6MDBBMCAgRDAgNDQgQzggRkQgRDAgNDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRC4uLkQKKyovCisJaWYgKCFMT0wpIHsKKwkJTE9MID0gU0VHUFRSX0FMTE9DKHNpemVvZihET1NfTElTVE9GTElTVFMpKTsKKworCQlMT0wtPkNYX0ludDIxXzVlMDEJCT0gMHgwOworCQlMT0wtPkxSVV9jb3VudF9GQ0JfY2FjaGUJPSAweDA7CisJCUxPTC0+TFJVX2NvdW50X0ZDQl9vcGVuCQk9IDB4MDsKKwkJTE9MLT5PRU1fZnVuY19oYW5kbGVyCQk9IC0xOyAvKiBub3QgYXZhaWxhYmxlICovCisJCUxPTC0+SU5UMjFfb2Zmc2V0CQk9IDB4MDsKKwkJTE9MLT5zaGFyaW5nX3JldHJ5X2NvdW50CT0gc2hhcmluZ19yZXRyaWVzOyAvKiBkZWZhdWx0IHZhbHVlOiAzICovCisJCUxPTC0+c2hhcmluZ19yZXRyeV9kZWxheQk9IHNoYXJpbmdfcGF1c2U7IC8qIGRlZmF1bHQgdmFsdWU6IDEgKi8KKwkJTE9MLT5wdHJfZGlza19idWYJCT0gMHgwOworCQlMT0wtPm9mZnNfdW5yZWFkX0NPTgkJPSAweDA7CisJCUxPTC0+c2VnX2ZpcnN0X01DQgkJPSAweDA7CisJCUxPTC0+cHRyX2ZpcnN0X0RQQgkJPSAweDA7CisJCUxPTC0+cHRyX2ZpcnN0X1N5c0ZpbGVUYWJsZQk9IDB4MDsKKwkJTE9MLT5wdHJfY2xvY2tfZGV2X2hkcgkJPSAweDA7CisJCUxPTC0+cHRyX0NPTl9kZXZfaGRyCQk9IDB4MDsKKwkJTE9MLT5tYXhfYnl0ZV9wZXJfc2VjCQk9IDUxMjsKKwkJTE9MLT5wdHJfZGlza19idWZfaW5mbwkJPSAweDA7CisJCUxPTC0+cHRyX2FycmF5X0NEUwkJPSAweDA7CisJCUxPTC0+cHRyX3N5c19GQ0IJCT0gMHgwOworCQlMT0wtPm5yX3Byb3RlY3RfRkNCCQk9IDB4MDsKKwkJTE9MLT5ucl9ibG9ja19kZXYJCT0gMHgwOworCQlMT0wtPm5yX2F2YWlsX2RyaXZlX2xldHRlcnMJPSAyNjsgLyogQSAtIFogKi8KKwkJTE9MLT5ucl9kcml2ZXNfSk9JTmVkCQk9IDB4MDsKKwkJTE9MLT5wdHJfc3BlY19wcmdfbmFtZXMJCT0gMHgwOworCQlMT0wtPnB0cl9TRVRWRVJfcHJnX2xpc3QJPSAweDA7IC8qIG5vIFNFVFZFUiBsaXN0ICovCisJCUxPTC0+RE9TX0hJR0hfQTIwX2Z1bmNfb2Zmcwk9IDB4MDsKKwkJTE9MLT5QU1BfbGFzdF9leGVjCQk9IDB4MDsKKwkJTE9MLT5CVUZGRVJTX3ZhbAkJPSA5OTsgLyogbWF4aW11bTogOTkgKi8KKwkJTE9MLT5CVUZGRVJTX25yX2xvb2thaGVhZAk9IDg7IC8qIG1heGltdW06IDggKi8KKwkJTE9MLT5ib290X2RyaXZlCQkJPSAzOyAvKiBDOiAqLworCQlMT0wtPmZsYWdfRFdPUkRfbW92ZXMJCT0gMHgwMTsgLyogaTM4NisgKi8KKwkJTE9MLT5zaXplX2V4dGVuZGVkX21lbQkJPSAweGYwMDA7IC8qIHZlcnkgaGlnaCB2YWx1ZSAqLworCX0JCisJaWYgKCFzZWdfTE9MKSBzZWdfTE9MID0gU0VHUFRSX0dFVChMT0wpOworCXJldHVybiBzZWdfTE9MKyhXT1JEKSYoKERPU19MSVNUT0ZMSVNUUyopMCktPnB0cl9maXJzdF9EUEI7Cit9CisKIAogZXh0ZXJuIHZvaWQgTE9DQUxfUHJpbnRIZWFwIChXT1JEIGRzKTsKIApAQCAtODEwLDcgKzg2Niw3IEBACiB7CiAgICAgQk9PTDMyCWJTZXRET1NFeHRlbmRlZEVycm9yID0gRkFMU0U7CiAKLSAgICBkcHJpbnRmX2luZm8oaW50LCAiaW50MjE6IEFYPSUwNHggQlg9JTA0eCBDWD0lMDR4IERYPSUwNHggIgorICAgIFRSQUNFKGludDIxLCAiQVg9JTA0eCBCWD0lMDR4IENYPSUwNHggRFg9JTA0eCAiCiAgICAgICAgICAgICAgICAgICJTST0lMDR4IERJPSUwNHggRFM9JTA0eCBFUz0lMDR4IEVGTD0lMDhseFxuIiwKICAgICAgICAgICAgICAgICAgQVhfcmVnKGNvbnRleHQpLCBCWF9yZWcoY29udGV4dCksIENYX3JlZyhjb250ZXh0KSwKICAgICAgICAgICAgICAgICAgRFhfcmVnKGNvbnRleHQpLCBTSV9yZWcoY29udGV4dCksIERJX3JlZyhjb250ZXh0KSwKQEAgLTkxOSw3ICs5NzUsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBUREIgKnBUYXNrID0gKFREQiAqKUdsb2JhbExvY2sxNiggR2V0Q3VycmVudFRhc2soKSApOwogICAgICAgICAgICAgcFRhc2stPmR0YSA9IFBUUl9TRUdfT0ZGX1RPX1NFR1BUUihEU19yZWcoY29udGV4dCksRFhfcmVnKGNvbnRleHQpKTsKLSAgICAgICAgICAgIGRwcmludGZfaW5mbyhpbnQsICJpbnQyMTogU2V0IERUQTogJTA4bHhcbiIsIHBUYXNrLT5kdGEpOworICAgICAgICAgICAgVFJBQ0UoaW50MjEsICJTZXQgRFRBOiAlMDhseFxuIiwgcFRhc2stPmR0YSk7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAKQEAgLTExNDMsNyArMTE5OSw3IEBACiAJICAgIGludAlpOwogCSAgICBpbnQJZHJpdmUgPSBET1NfR0VUX0RSSVZFKEJMX3JlZyhjb250ZXh0KSk7CiAKLQkgICAgZnByaW50ZihzdGRuaW1wLCJpbnQyMTogcHJvZ3JhbSB0cmllZCB0byB3cml0ZSB0byBibG9jayBkZXZpY2UgY29udHJvbCBjaGFubmVsIG9mIGRyaXZlICVkOlxuIixkcml2ZSk7CisJICAgIGZwcmludGYoc3RkbmltcCwicHJvZ3JhbSB0cmllZCB0byB3cml0ZSB0byBibG9jayBkZXZpY2UgY29udHJvbCBjaGFubmVsIG9mIGRyaXZlICVkOlxuIixkcml2ZSk7CiAJICAgIGZvciAoaT0wO2k8Q1hfcmVnKGNvbnRleHQpO2krKykKIAkgICAgCWZwcmludGYoc3RkbmltcCwiJTAyeCAiLGRhdGFwdHJbaV0pOwogCSAgICBmcHJpbnRmKHN0ZG5pbXAsIlxuIik7CkBAIC0xMjg1LDkgKzEzNDEsMTIgQEAKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIDB4NTI6IC8qICJTWVNWQVJTIiAtIEdFVCBMSVNUIE9GIExJU1RTICovCi0gICAgICAgIEVTX3JlZyhjb250ZXh0KSA9IDB4MDsKLSAgICAgICAgQlhfcmVnKGNvbnRleHQpID0gMHgwOwotICAgICAgICBJTlRfQkFSRiggY29udGV4dCwgMHgyMSApOworICAgICAgICB7CisgICAgICAgICAgICAgICAgU0VHUFRSIGxvbDsKKyAgICAgICAgICAgICAgICBsb2wgPSBJTlQyMV9HZXRMaXN0T2ZMaXN0cygpOworICAgICAgICAgICAgICAgIEVTX3JlZyhjb250ZXh0KSA9IEhJV09SRChsb2wpOworICAgICAgICAgICAgICAgIEJYX3JlZyhjb250ZXh0KSA9IExPV09SRChsb2wpOworICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSAweDU2OiAvKiAiUkVOQU1FIiAtIFJFTkFNRSBGSUxFICovCkBAIC0xNTgzLDkgKzE2NDIsOSBAQAogICAgIGNhc2UgMHg3MDogLyogTVMtRE9TIDcgKFdpbmRvd3M5NSkgLSA/Pz8gKGNvdW50cnktc3BlY2lmaWM/KSovCiAgICAgY2FzZSAweDcyOiAvKiBNUy1ET1MgNyAoV2luZG93czk1KSAtID8/PyAqLwogICAgIGNhc2UgMHg3MzogLyogTVMtRE9TIDcgKFdpbmRvd3M5NSkgLSBEUklWRSBMT0NLSU5HID8/PyAqLwotICAgICAgICBkcHJpbnRmX2luZm8oaW50LCJpbnQyMTogd2luZG93czk1IGZ1bmN0aW9uIEFYICUwNHhcbiIsCisgICAgICAgIFRSQUNFKGludDIxLCJ3aW5kb3dzOTUgZnVuY3Rpb24gQVggJTA0eFxuIiwKICAgICAgICAgICAgICAgICAgICAgQVhfcmVnKGNvbnRleHQpKTsKLSAgICAgICAgZHByaW50Zl93YXJuKGludCwgIiAgICAgICAgcmV0dXJuaW5nIHVuaW1wbGVtZW50ZWRcbiIpOworICAgICAgICBXQVJOKGludDIxLCAiICAgICAgICByZXR1cm5pbmcgdW5pbXBsZW1lbnRlZFxuIik7CiAgICAgICAgIFNFVF9DRkxBRyhjb250ZXh0KTsKICAgICAgICAgQUxfcmVnKGNvbnRleHQpID0gMDsKICAgICAgICAgYnJlYWs7CkBAIC0xNjA2LDcgKzE2NjUsNyBAQAogCVNFVF9DRkxBRyhjb250ZXh0KTsKICAgICB9CiAKLSAgICBkcHJpbnRmX2luZm8oaW50LCAicmV0MjE6IEFYPSUwNHggQlg9JTA0eCBDWD0lMDR4IERYPSUwNHggIgorICAgIFRSQUNFKGludDIxLCAicmV0dXJuaW5nOiBBWD0lMDR4IEJYPSUwNHggQ1g9JTA0eCBEWD0lMDR4ICIKICAgICAgICAgICAgICAgICAgIlNJPSUwNHggREk9JTA0eCBEUz0lMDR4IEVTPSUwNHggRUZMPSUwOGx4XG4iLAogICAgICAgICAgICAgICAgICBBWF9yZWcoY29udGV4dCksIEJYX3JlZyhjb250ZXh0KSwgQ1hfcmVnKGNvbnRleHQpLAogICAgICAgICAgICAgICAgICBEWF9yZWcoY29udGV4dCksIFNJX3JlZyhjb250ZXh0KSwgRElfcmVnKGNvbnRleHQpLApkaWZmIC0tZ2l0IGEvbXNkb3MvaW50MjUuYyBiL21zZG9zL2ludDI1LmMKaW5kZXggZDkyNzM5NC4uNmYxNmQ4OCAxMDA2NDQKLS0tIGEvbXNkb3MvaW50MjUuYworKysgYi9tc2Rvcy9pbnQyNS5jCkBAIC00Miw3ICs0Miw3IEBACiAgICAgICAgIGJlZ2luICA9IERYX3JlZyhjb250ZXh0KTsKICAgICAgICAgbGVuZ3RoID0gQ1hfcmVnKGNvbnRleHQpOwogICAgIH0KLSAgICBkcHJpbnRmX2luZm8oaW50LCAiaW50MjU6IGFicyBkaXNrcmVhZCwgZHJpdmUgJWQsIHNlY3RvciAlbGQsICIKKyAgICBUUkFDRShpbnQsICJpbnQyNTogYWJzIGRpc2tyZWFkLCBkcml2ZSAlZCwgc2VjdG9yICVsZCwgIgogICAgICAgICAgICAgICAgICAiY291bnQgJWxkLCBidWZmZXIgJWRcbiIsCiAgICAgICAgICAgICAgICAgIEFMX3JlZyhjb250ZXh0KSwgYmVnaW4sIGxlbmd0aCwgKGludCkgZGF0YXB0cik7CiAKZGlmZiAtLWdpdCBhL21zZG9zL2ludDI2LmMgYi9tc2Rvcy9pbnQyNi5jCmluZGV4IGI1ZmZlMTYuLjBhZDFiNDEgMTAwNjQ0Ci0tLSBhL21zZG9zL2ludDI2LmMKKysrIGIvbXNkb3MvaW50MjYuYwpAQCAtNDIsNyArNDIsNyBAQAogICAgICAgICBsZW5ndGggPSBDWF9yZWcoY29udGV4dCk7CiAgICAgfQogCQkKLSAgICBkcHJpbnRmX2luZm8oaW50LCJpbnQyNjogYWJzIGRpc2t3cml0ZSwgZHJpdmUgJWQsIHNlY3RvciAlbGQsICIKKyAgICBUUkFDRShpbnQsImludDI2OiBhYnMgZGlza3dyaXRlLCBkcml2ZSAlZCwgc2VjdG9yICVsZCwgIgogICAgICAgICAgICAgICAgICAiY291bnQgJWxkLCBidWZmZXIgJWRcbiIsCiAgICAgICAgICAgICAgICAgIEFMX3JlZyhjb250ZXh0KSwgYmVnaW4sIGxlbmd0aCwgKGludCkgZGF0YXB0ciApOwogCmRpZmYgLS1naXQgYS9tc2Rvcy9pbnQyZi5jIGIvbXNkb3MvaW50MmYuYwppbmRleCBmMzFhZDYxLi5jMmQyNTY0IDEwMDY0NAotLS0gYS9tc2Rvcy9pbnQyZi5jCisrKyBiL21zZG9zL2ludDJmLmMKQEAgLTc4LDYgKzc4LDggQEAKICAgICBjYXNlIDB4YmQ6ICAvKiBzb21lIE5vdmVsbCBuZXR3b3JrIGluc3RhbGwgY2hlY2sgPz8/ICovCiAgICAgICAgIEFYX3JlZyhjb250ZXh0KSA9IDB4YTVhNTsgLyogcHJldGVuZCB0byBoYXZlIE5vdmVsbCBJUFggaW5zdGFsbGVkICovCiAJYnJlYWs7CisgICAgY2FzZSAweGZhOiAgLyogV2F0Y29tIGRlYnVnZ2VyIGNoZWNrLCByZXR1cm5zIDB4NjY2IGlmIGluc3RhbGxlZCAqLworICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgICBJTlRfQkFSRiggY29udGV4dCwgMHgyZiApOwogICAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL21zZG9zL2ludGVycnVwdHMuYyBiL21zZG9zL2ludGVycnVwdHMuYwppbmRleCA2MDU4YmU3Li5kYTZmZjJhIDEwMDY0NAotLS0gYS9tc2Rvcy9pbnRlcnJ1cHRzLmMKKysrIGIvbXNkb3MvaW50ZXJydXB0cy5jCkBAIC0zNSw3ICszNSw3IEBACiAgKi8KIHZvaWQgSU5UX1NldEhhbmRsZXIoIEJZVEUgaW50bnVtLCBGQVJQUk9DMTYgaGFuZGxlciApCiB7Ci0gICAgZHByaW50Zl9pbmZvKGludCwgIlNldCBpbnRlcnJ1cHQgdmVjdG9yICUwMnggPC0gJTA0eDolMDR4XG4iLAorICAgIFRSQUNFKGludCwgIlNldCBpbnRlcnJ1cHQgdmVjdG9yICUwMnggPC0gJTA0eDolMDR4XG4iLAogICAgICAgICAgICAgICAgICBpbnRudW0sIEhJV09SRChoYW5kbGVyKSwgTE9XT1JEKGhhbmRsZXIpICk7CiAgICAgSU5UX1ZlY3RvcnNbaW50bnVtXSA9IGhhbmRsZXI7CiB9CmRpZmYgLS1naXQgYS9tc2Rvcy9pb3BvcnRzLmMgYi9tc2Rvcy9pb3BvcnRzLmMKaW5kZXggYTYzZDMwNS4uYjQ5MjRiZCAxMDA2NDQKLS0tIGEvbXNkb3MvaW9wb3J0cy5jCisrKyBiL21zZG9zL2lvcG9ydHMuYwpAQCAtMjE1LDcgKzIxNSw3IEBACiAgICAgICAgICAgICAgICAgY2FzZSAyOiByZXMgPSBpbncoIHBvcnQgKTsgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXMgPSBpbmwoIHBvcnQgKTsgYnJlYWs7CiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiSU9faW5wb3J0OiBpbnZhbGlkIGNvdW50ICVkXG4iLCBjb3VudCk7CisgICAgICAgICAgICAgICAgICAgIEVSUihpbnQsICJpbnZhbGlkIGNvdW50ICVkXG4iLCBjb3VudCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpb3BsKDApOwogICAgICAgICAgICAgcmV0dXJuIHJlczsKQEAgLTIyMyw3ICsyMjMsNyBAQAogICAgIH0KICNlbmRpZgogCi0gICAgZHByaW50Zl9pbmZvKGludCwgIklPOiAlZCBieXRlcyBmcm9tIHBvcnQgMHglMDJ4XG4iLCBjb3VudCwgcG9ydCApOworICAgIFRSQUNFKGludCwgIiVkIGJ5dGVzIGZyb20gcG9ydCAweCUwMnhcbiIsIGNvdW50LCBwb3J0ICk7CiAKICAgICB3aGlsZSAoY291bnQtLSA+IDApCiAgICAgewpAQCAtMjQzLDcgKzI0Myw3IEBACiAgICAgICAgIHBvcnQrKzsKICAgICAgICAgcmVzID0gKHJlcyA8PCA4KSB8IGI7CiAgICAgfQotICAgIGRwcmludGZfaW5mbyhpbnQsICIgIHJldHVybmluZyAoIDB4JWx4IClcbiIsIHJlcyApOworICAgIFRSQUNFKGludCwgIiAgcmV0dXJuaW5nICggMHglbHggKVxuIiwgcmVzICk7CiAgICAgcmV0dXJuIHJlczsKIH0KIApAQCAtMjU1LDcgKzI1NSw3IEBACiB7CiAgICAgQllURSBiOwogCi0gICAgZHByaW50Zl9pbmZvKGludCwgIklPOiAweCVseCAoJWQgYnl0ZXMpIHRvIHBvcnQgMHglMDJ4XG4iLAorICAgIFRSQUNFKGludCwgIklPOiAweCVseCAoJWQgYnl0ZXMpIHRvIHBvcnQgMHglMDJ4XG4iLAogICAgICAgICAgICAgICAgICB2YWx1ZSwgY291bnQsIHBvcnQgKTsKIAogI2lmZGVmIERJUkVDVF9JT19BQ0NFU1MKZGlmZiAtLWdpdCBhL21zZG9zL3Z4ZC5jIGIvbXNkb3MvdnhkLmMKaW5kZXggOGEzYjc3YS4uYmM5MjJlMyAxMDA2NDQKLS0tIGEvbXNkb3MvdnhkLmMKKysrIGIvbXNkb3MvdnhkLmMKQEAgLTM1LDE4ICszNSwxOCBAQAogCiAgICAgLyogdGFrZW4gZnJvbSBSYWxmIEJyb3duJ3MgSW50ZXJydXB0IExpc3QgKi8KIAotICAgIGRwcmludGZfaW5mbyh2eGQsIlZ4RDogWyUwNHhdIFBhZ2VGaWxlXG4iLCAoVUlOVDE2KXNlcnZpY2UgKTsKKyAgICBUUkFDRSh2eGQsIlslMDR4XSBQYWdlRmlsZVxuIiwgKFVJTlQxNilzZXJ2aWNlICk7CiAKICAgICBzd2l0Y2goc2VydmljZSkKICAgICB7CiAgICAgY2FzZSAweDAwOiAvKiBnZXQgdmVyc2lvbiwgaXMgdGhpcyB3aW5kb3dzIHZlcnNpb24/ICovCi0JZHByaW50Zl9pbmZvKHZ4ZCwiVnhEIFBhZ2VGaWxlOiByZXR1cm5pbmcgdmVyc2lvblxuIik7CisJVFJBQ0UodnhkLCJyZXR1cm5pbmcgdmVyc2lvblxuIik7CiAgICAgICAgIEFYX3JlZyhjb250ZXh0KSA9IFZYRF9XaW5WZXJzaW9uKCk7CiAJUkVTRVRfQ0ZMQUcoY29udGV4dCk7CiAJYnJlYWs7CiAKICAgICBjYXNlIDB4MDE6IC8qIGdldCBzd2FwIGZpbGUgaW5mbyAqLwotCWRwcmludGZfaW5mbyh2eGQsIlZ4RCBQYWdlRmlsZTogcmV0dXJuaW5nIHN3YXAgZmlsZSBpbmZvXG4iKTsKKwlUUkFDRSh2eGQsIlZ4RCBQYWdlRmlsZTogcmV0dXJuaW5nIHN3YXAgZmlsZSBpbmZvXG4iKTsKIAlBWF9yZWcoY29udGV4dCkgPSAweDAwOyAvKiBwYWdpbmcgZGlzYWJsZWQgKi8KIAlFQ1hfcmVnKGNvbnRleHQpID0gMDsgICAvKiBtYXhpbXVtIHNpemUgb2YgcGFnaW5nIGZpbGUgKi8JCiAJLyogRklYTUU6IGRvIEkgdG91Y2ggRFM6U0kgb3IgRFM6REk/ICovCkBAIC01NCwxMiArNTQsMTIgQEAKIAlicmVhazsKIAogICAgIGNhc2UgMHgwMjogLyogZGVsZXRlIHBlcm1hbmVudCBzd2FwIG9uIGV4aXQgKi8KLQlkcHJpbnRmX2luZm8odnhkLCJWeEQgUGFnZUZpbGU6IHN1cHBvc2VkIHRvIGRlbGV0ZSBzd2FwXG4iKTsKKwlUUkFDRSh2eGQsIlZ4RCBQYWdlRmlsZTogc3VwcG9zZWQgdG8gZGVsZXRlIHN3YXBcbiIpOwogCVJFU0VUX0NGTEFHKGNvbnRleHQpOwogCWJyZWFrOwogCiAgICAgY2FzZSAweDAzOiAvKiBjdXJyZW50IHRlbXBvcmFyeSBzd2FwIGZpbGUgc2l6ZSAqLwotCWRwcmludGZfaW5mbyh2eGQsIlZ4RCBQYWdlRmlsZTogd2hhdCBpcyBjdXJyZW50IHRlbXAuIHN3YXAgc2l6ZVxuIik7CisJVFJBQ0UodnhkLCJWeEQgUGFnZUZpbGU6IHdoYXQgaXMgY3VycmVudCB0ZW1wLiBzd2FwIHNpemVcbiIpOwogCVJFU0VUX0NGTEFHKGNvbnRleHQpOwogCWJyZWFrOwogCkBAIC04MCwxMiArODAsMTIgQEAKIHsKICAgICB1bnNpZ25lZAlzZXJ2aWNlID0gRFhfcmVnKGNvbnRleHQpOwogCi0gICAgZHByaW50Zl9pbmZvKHZ4ZCwiVnhEOiBbJTA0eF0gU2hlbGxcbiIsIChVSU5UMTYpc2VydmljZSk7CisgICAgVFJBQ0UodnhkLCJbJTA0eF0gU2hlbGxcbiIsIChVSU5UMTYpc2VydmljZSk7CiAKICAgICBzd2l0Y2ggKHNlcnZpY2UpIC8qIFJhbGYgQnJvd24gc2F5cyBFRFgsIGJ1dCBJIHVzZSBEWCBpbnN0ZWFkICovCiAgICAgewogICAgIGNhc2UgMHgwMDAwOgotCWRwcmludGZfaW5mbyh2eGQsIlZ4RCBTaGVsbDogcmV0dXJuaW5nIHZlcnNpb25cbiIpOworCVRSQUNFKHZ4ZCwicmV0dXJuaW5nIHZlcnNpb25cbiIpOwogICAgICAgICBBWF9yZWcoY29udGV4dCkgPSBWWERfV2luVmVyc2lvbigpOwogCUVCWF9yZWcoY29udGV4dCkgPSAxOyAvKiBzeXN0ZW0gVk0gSGFuZGxlICovCiAJYnJlYWs7CkBAIC05NSwxMiArOTUsMTIgQEAKICAgICBjYXNlIDB4MDAwMzoKICAgICBjYXNlIDB4MDAwNDoKICAgICBjYXNlIDB4MDAwNToKLQlkcHJpbnRmX2luZm8odnhkLCJWeEQgU2hlbGw6IEVEWCA9ICUwOGx4XG4iLEVEWF9yZWcoY29udGV4dCkpOworCVRSQUNFKHZ4ZCwiVnhEIFNoZWxsOiBFRFggPSAlMDhseFxuIixFRFhfcmVnKGNvbnRleHQpKTsKIAlWWERfQkFSRiggY29udGV4dCwgInNoZWxsIiApOwogCWJyZWFrOwogCiAgICAgY2FzZSAweDAwMDY6IC8qIFNIRUxMX0dldF9WTV9TdGF0ZSAqLwotCWRwcmludGZfaW5mbyh2eGQsIlZ4RCBTaGVsbDogcmV0dXJuaW5nIFZNIHN0YXRlXG4iKTsKKwlUUkFDRSh2eGQsIlZ4RCBTaGVsbDogcmV0dXJuaW5nIFZNIHN0YXRlXG4iKTsKIAkvKiBBY3R1YWxseSB3ZSBkb24ndCwgbm90IHlldC4gV2UgaGF2ZSB0byByZXR1cm4gYSBzdHJ1Y3R1cmUKICAgICAgICAgICogYW5kIEkgYW0gbm90IHRvIHN1cmUgaG93IHRvIHNldCBpdCB1cCBhbmQgcmV0dXJuIGl0IHlldCwKICAgICAgICAgICogc28gZm9yIG5vdyBsZXQncyBkbyBub3RoaW5nLiBJIGNhbiAoaG9wZWZ1bGx5KSBnZXQgdGhpcwpAQCAtMTI2LDcgKzEyNiw3IEBACiAgICAgY2FzZSAweDAwMTU6CiAgICAgY2FzZSAweDAwMTY6CiAgICAgZGVmYXVsdDoKLSAJZHByaW50Zl9pbmZvKHZ4ZCwiVnhEIFNoZWxsOiBFRFggPSAlMDhseFxuIixFRFhfcmVnKGNvbnRleHQpKTsgCisgCVRSQUNFKHZ4ZCwiVnhEIFNoZWxsOiBFRFggPSAlMDhseFxuIixFRFhfcmVnKGNvbnRleHQpKTsgCiAJVlhEX0JBUkYoIGNvbnRleHQsICJzaGVsbCIpOwogCWJyZWFrOwogICAgIH0KQEAgLTE0MCwxMiArMTQwLDEyIEBACiB7CiAgICAgdW5zaWduZWQJc2VydmljZSA9IEFYX3JlZyhjb250ZXh0KTsKIAotICAgIGRwcmludGZfaW5mbyh2eGQsIlZ4RDogWyUwNHhdIENvbW1cbiIsIChVSU5UMTYpc2VydmljZSk7CisgICAgVFJBQ0UodnhkLCJbJTA0eF0gQ29tbVxuIiwgKFVJTlQxNilzZXJ2aWNlKTsKIAogICAgIHN3aXRjaCAoc2VydmljZSkKICAgICB7CiAgICAgY2FzZSAweDAwMDA6IC8qIGdldCB2ZXJzaW9uICovCi0JZHByaW50Zl9pbmZvKHZ4ZCwiVnhEIENvbW06IHJldHVybmluZyB2ZXJzaW9uXG4iKTsKKwlUUkFDRSh2eGQsInJldHVybmluZyB2ZXJzaW9uXG4iKTsKICAgICAgICAgQVhfcmVnKGNvbnRleHQpID0gVlhEX1dpblZlcnNpb24oKTsKIAlSRVNFVF9DRkxBRyhjb250ZXh0KTsKIAlicmVhazsKQEAgLTE2NSw3ICsxNjUsNyBAQAogewogICAgIHVuc2lnbmVkIHNlcnZpY2UgPSBBWF9yZWcoY29udGV4dCk7CiAKLSAgICBkcHJpbnRmX2luZm8odnhkLCJWeEQ6IFslMDR4XSBWaXJ0dWFsIFRpbWVyXG4iLCAoVUlOVDE2KXNlcnZpY2UpOworICAgIFRSQUNFKHZ4ZCwiWyUwNHhdIFZpcnR1YWwgVGltZXJcbiIsIChVSU5UMTYpc2VydmljZSk7CiAKICAgICBzd2l0Y2goc2VydmljZSkKICAgICB7CmRpZmYgLS1naXQgYS9tdWx0aW1lZGlhL2F1ZGlvLmMgYi9tdWx0aW1lZGlhL2F1ZGlvLmMKaW5kZXggNzY4MTgwZi4uY2Q1NWNlOCAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS9hdWRpby5jCisrKyBiL211bHRpbWVkaWEvYXVkaW8uYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKQEAgLTI3LDcgKzI4LDExIEBACiAjaW5jbHVkZSAiZGVidWcuaCIKIAogI2lmZGVmIEhBVkVfT1NTCisjaWZkZWYgSEFWRV9NQUNISU5FX1NPVU5EQ0FSRF9ICisjaW5jbHVkZSA8bWFjaGluZS9zb3VuZGNhcmQuaD4KKyNlbHNlIC8qIEhBVkVfTUFDSElORV9TT1VORENBUkRfSCAqLwogI2luY2x1ZGUgPHN5cy9zb3VuZGNhcmQuaD4KKyNlbmRpZiAvKiBIQVZFX01BQ0hJTkVfU09VTkRDQVJEX0ggKi8KIAogI2RlZmluZSBTT1VORF9ERVYgIi9kZXYvZHNwIgogI2RlZmluZSBNSVhFUl9ERVYgIi9kZXYvbWl4ZXIiCkBAIC04Nyw3ICs5Miw3IEBACiBzdGF0aWMgRFdPUkQgV0FWRV9Ob3RpZnlDbGllbnQoVUlOVDE2IHdEZXZJRCwgV09SRCB3TXNnLCAKIAkJCQlEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIpCiB7Ci0JZHByaW50Zl9pbmZvKG1jaXdhdmUsIldBVkVfTm90aWZ5Q2xpZW50IC8vIHdEZXZJRCA9ICUwNFggd01zZyA9ICVkIGR3UGFybTEgPSAlMDRsWCBkd1BhcmFtMiA9ICUwNGxYXG4iLHdEZXZJRCwgd01zZywgZHdQYXJhbTEsIGR3UGFyYW0yKTsKKwlUUkFDRShtY2l3YXZlLCJ3RGV2SUQgPSAlMDRYIHdNc2cgPSAlZCBkd1Bhcm0xID0gJTA0bFggZHdQYXJhbTIgPSAlMDRsWFxuIix3RGV2SUQsIHdNc2csIGR3UGFyYW0xLCBkd1BhcmFtMik7CiAKIAlzd2l0Y2ggKHdNc2cpIHsKIAljYXNlIFdPTV9PUEVOOgpAQCAtMTAzLDcgKzEwOCw3IEBACiAJCVdPdXREZXZbd0RldklEXS53YXZlRGVzYy5kd0luc3RhbmNlLCAKICAgICAgICAgICAgICAgICBkd1BhcmFtMSwgCiAgICAgICAgICAgICAgICAgZHdQYXJhbTIpKSB7Ci0JICAgIGRwcmludGZfd2FybihtY2l3YXZlLCAiV0FWRV9Ob3RpZnlDbGllbnQgLy8gY2FuJ3Qgbm90aWZ5IGNsaWVudCAhXG4iKTsKKwkgICAgV0FSTihtY2l3YXZlLCAiY2FuJ3Qgbm90aWZ5IGNsaWVudCAhXG4iKTsKIAkgICAgcmV0dXJuIE1NU1lTRVJSX05PRVJST1I7CiAJICB9CiAJICBicmVhazsKQEAgLTExNyw3ICsxMjIsNyBAQAogCQlXSW5EZXZbd0RldklEXS53YXZlRGVzYy5kd0NhbGxCYWNrLCBXSW5EZXZbd0RldklEXS53RmxhZ3MsIAogCQlXSW5EZXZbd0RldklEXS53YXZlRGVzYy5oV2F2ZSwgd01zZywgCiAJCVdJbkRldlt3RGV2SURdLndhdmVEZXNjLmR3SW5zdGFuY2UsIGR3UGFyYW0xLCBkd1BhcmFtMikpIHsKLQkgICAgZHByaW50Zl93YXJuKG1jaXdhdmUsICJXQVZFX05vdGlmeUNsaWVudCAvLyBjYW4ndCBub3RpZnkgY2xpZW50ICFcbiIpOworCSAgICBXQVJOKG1jaXdhdmUsICJjYW4ndCBub3RpZnkgY2xpZW50ICFcbiIpOwogCSAgICByZXR1cm4gTU1TWVNFUlJfTk9FUlJPUjsKIAkgIH0KIAkgIGJyZWFrOwpAQCAtMTM3LDcgKzE0Miw3IEBACiAJRFdPUkQJCWR3UmV0OwogCWNoYXIJCXN0clsxMjhdOwogCi0JZHByaW50Zl9pbmZvKG1jaXdhdmUsIldBVkVfbWNpT3BlbiglMDRYLCAlMDhsWCwgJXApXG4iLCAKKwlUUkFDRShtY2l3YXZlLCIoJTA0WCwgJTA4bFgsICVwKVxuIiwgCiAJCQkJd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCkBAIC0xNTYsMTEgKzE2MSwxMSBAQAogCiAJTUNJV2F2RGV2W3dEZXZJRF0uZklucHV0ID0gRkFMU0U7CiAKLQlkcHJpbnRmX2luZm8obWNpd2F2ZSwiV0FWRV9tY2lPcGVuIC8vIHdEZXZJRD0lMDRYXG4iLCB3RGV2SUQpOwotCWRwcmludGZfaW5mbyhtY2l3YXZlLCJXQVZFX21jaU9wZW4gLy8gYmVmb3JlIE9QRU5fRUxFTUVOVFxuIik7CisJVFJBQ0UobWNpd2F2ZSwid0RldklEPSUwNFhcbiIsIHdEZXZJRCk7CisJVFJBQ0UobWNpd2F2ZSwiYmVmb3JlIE9QRU5fRUxFTUVOVFxuIik7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfT1BFTl9FTEVNRU5UKSB7CiAJCWxwc3RyRWxlbWVudE5hbWUgPSAoTFBTVFIpUFRSX1NFR19UT19MSU4obHBQYXJtcy0+bHBzdHJFbGVtZW50TmFtZSk7Ci0JCWRwcmludGZfaW5mbyhtY2l3YXZlLCJXQVZFX21jaU9wZW4gLy8gTUNJX09QRU5fRUxFTUVOVCAnJXMnICFcbiIsCisJCVRSQUNFKG1jaXdhdmUsIk1DSV9PUEVOX0VMRU1FTlQgJyVzJyAhXG4iLAogCQkJCQkJbHBzdHJFbGVtZW50TmFtZSk7CiAJCWlmICggbHBzdHJFbGVtZW50TmFtZSAmJiAoc3RybGVuKGxwc3RyRWxlbWVudE5hbWUpID4gMCkpIHsKIAkJCXN0cmNweShzdHIsIGxwc3RyRWxlbWVudE5hbWUpOwpAQCAtMTY4LDE0ICsxNzMsMTQgQEAKIAkJCU1DSVdhdkRldlt3RGV2SURdLmhGaWxlID0gbW1pb09wZW4xNihzdHIsIE5VTEwsIAogCQkJCU1NSU9fQUxMT0NCVUYgfCBNTUlPX1JFQURXUklURSB8IE1NSU9fRVhDTFVTSVZFKTsKIAkJCWlmIChNQ0lXYXZEZXZbd0RldklEXS5oRmlsZSA9PSAwKSB7Ci0JCQkJZHByaW50Zl93YXJuKG1jaXdhdmUsICJXQVZFX21jaU9wZW4gLy8gY2FuJ3QgZmluZCBmaWxlPSclcycgIVxuIiwgc3RyKTsKKwkJCQlXQVJOKG1jaXdhdmUsICJjYW4ndCBmaW5kIGZpbGU9JyVzJyAhXG4iLCBzdHIpOwogCQkJCXJldHVybiBNQ0lFUlJfRklMRV9OT1RfRk9VTkQ7CiAJCQl9CiAJCX0KIAkJZWxzZSAKIAkJCU1DSVdhdkRldlt3RGV2SURdLmhGaWxlID0gMDsKIAl9Ci0JZHByaW50Zl9pbmZvKG1jaXdhdmUsIldBVkVfbWNpT3BlbiAvLyBoRmlsZT0ldVxuIiwgTUNJV2F2RGV2W3dEZXZJRF0uaEZpbGUpOworCVRSQUNFKG1jaXdhdmUsImhGaWxlPSV1XG4iLCBNQ0lXYXZEZXZbd0RldklEXS5oRmlsZSk7CiAJbWVtY3B5KCZNQ0lXYXZEZXZbd0RldklEXS5vcGVuUGFybXMsIGxwUGFybXMsIHNpemVvZihNQ0lfV0FWRV9PUEVOX1BBUk1TMTYpKTsKIAlNQ0lXYXZEZXZbd0RldklEXS53Tm90aWZ5RGV2aWNlSUQgPSBscFBhcm1zLT53RGV2aWNlSUQ7CiAJbHBXYXZlRm9ybWF0ID0gJk1DSVdhdkRldlt3RGV2SURdLldhdmVGb3JtYXQ7CkBAIC0xOTQsMzMgKzE5OSwyOSBAQAogCQlNTUNLSU5GTwlja01haW5SSUZGOwogCQlpZiAobW1pb0Rlc2NlbmQoTUNJV2F2RGV2W3dEZXZJRF0uaEZpbGUsICZja01haW5SSUZGLCBOVUxMLCAwKSAhPSAwKQogCQkJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKLQkJZHByaW50Zl9pbmZvKG1jaXdhdmUsCi0JCQkJIldBVkVfbWNpT3BlbiAvLyBQYXJlbnRDaHVuayBja2lkPSUuNHMgZmNjVHlwZT0lLjRzIGNrc2l6ZT0lMDhsWCBcbiIsCi0JCQkJKExQU1RSKSZja01haW5SSUZGLmNraWQsIChMUFNUUikmY2tNYWluUklGRi5mY2NUeXBlLAotCQkJCWNrTWFpblJJRkYuY2tzaXplKTsKKwkJVFJBQ0UobWNpd2F2ZSwgIlBhcmVudENodW5rIGNraWQ9JS40cyBmY2NUeXBlPSUuNHMgY2tzaXplPSUwOGxYIFxuIiwKKwkJCSAgICAgKExQU1RSKSZja01haW5SSUZGLmNraWQsIChMUFNUUikmY2tNYWluUklGRi5mY2NUeXBlLAorCQkJICAgICBja01haW5SSUZGLmNrc2l6ZSk7CiAJCWlmICgoY2tNYWluUklGRi5ja2lkICE9IEZPVVJDQ19SSUZGKSB8fAogCQkgICAgKGNrTWFpblJJRkYuZmNjVHlwZSAhPSBtbWlvRk9VUkNDKCdXJywgJ0EnLCAnVicsICdFJykpKQogCQkJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAkJbW1ja0luZm8uY2tpZCA9IG1taW9GT1VSQ0MoJ2YnLCAnbScsICd0JywgJyAnKTsKIAkJaWYgKG1taW9EZXNjZW5kKE1DSVdhdkRldlt3RGV2SURdLmhGaWxlLCAmbW1ja0luZm8sICZja01haW5SSUZGLCBNTUlPX0ZJTkRDSFVOSykgIT0gMCkKIAkJCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7Ci0JCWRwcmludGZfaW5mbyhtY2l3YXZlLAotCQkJCSJXQVZFX21jaU9wZW4gLy8gQ2h1bmsgRm91bmQgY2tpZD0lLjRzIGZjY1R5cGU9JS40cyBja3NpemU9JTA4bFggXG4iLAotCQkJCShMUFNUUikmbW1ja0luZm8uY2tpZCwgKExQU1RSKSZtbWNrSW5mby5mY2NUeXBlLAotCQkJCW1tY2tJbmZvLmNrc2l6ZSk7CisJCVRSQUNFKG1jaXdhdmUsICJDaHVuayBGb3VuZCBja2lkPSUuNHMgZmNjVHlwZT0lLjRzIGNrc2l6ZT0lMDhsWCBcbiIsCisJCQkgICAgIChMUFNUUikmbW1ja0luZm8uY2tpZCwgKExQU1RSKSZtbWNrSW5mby5mY2NUeXBlLAorCQkJICAgICBtbWNrSW5mby5ja3NpemUpOwogCQlpZiAobW1pb1JlYWQoTUNJV2F2RGV2W3dEZXZJRF0uaEZpbGUsIChIUFNUUikgbHBXYXZlRm9ybWF0LAogCQkgICAgKGxvbmcpIHNpemVvZihQQ01XQVZFRk9STUFUKSkgIT0gKGxvbmcpIHNpemVvZihQQ01XQVZFRk9STUFUKSkKIAkJCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJCW1tY2tJbmZvLmNraWQgPSBtbWlvRk9VUkNDKCdkJywgJ2EnLCAndCcsICdhJyk7CiAJCWlmIChtbWlvRGVzY2VuZChNQ0lXYXZEZXZbd0RldklEXS5oRmlsZSwgJm1tY2tJbmZvLCAmY2tNYWluUklGRiwgTU1JT19GSU5EQ0hVTkspICE9IDApCiAJCQlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwotCQlkcHJpbnRmX2luZm8obWNpd2F2ZSwKLQkJCQkiV0FWRV9tY2lPcGVuIC8vIENodW5rIEZvdW5kIGNraWQ9JS40cyBmY2NUeXBlPSUuNHMgY2tzaXplPSUwOGxYIFxuIiwKLQkJCQkoTFBTVFIpJm1tY2tJbmZvLmNraWQsIChMUFNUUikmbW1ja0luZm8uZmNjVHlwZSwKLQkJCQltbWNrSW5mby5ja3NpemUpOwotCQlkcHJpbnRmX2luZm8obWNpd2F2ZSwKLQkJCSJXQVZFX21jaU9wZW4gLy8gbkNoYW5uZWxzPSVkIG5TYW1wbGVzUGVyU2VjPSVsZFxuIiwKLQkJCWxwV2F2ZUZvcm1hdC0+d2YubkNoYW5uZWxzLCBscFdhdmVGb3JtYXQtPndmLm5TYW1wbGVzUGVyU2VjKTsKKwkJVFJBQ0UobWNpd2F2ZSwiQ2h1bmsgRm91bmQgY2tpZD0lLjRzIGZjY1R5cGU9JS40cyBja3NpemU9JTA4bFggXG4iLAorCQkJICAgICAoTFBTVFIpJm1tY2tJbmZvLmNraWQsIChMUFNUUikmbW1ja0luZm8uZmNjVHlwZSwKKwkJCSAgICAgbW1ja0luZm8uY2tzaXplKTsKKwkJVFJBQ0UobWNpd2F2ZSwgIm5DaGFubmVscz0lZCBuU2FtcGxlc1BlclNlYz0lbGRcbiIsCisJCSAgICAgbHBXYXZlRm9ybWF0LT53Zi5uQ2hhbm5lbHMsIGxwV2F2ZUZvcm1hdC0+d2YublNhbXBsZXNQZXJTZWMpOwogCQlscFdhdmVGb3JtYXQtPndCaXRzUGVyU2FtcGxlID0gMDsKIAl9CiAJbHBXYXZlRm9ybWF0LT53Zi5uQXZnQnl0ZXNQZXJTZWMgPSAKQEAgLTI1Niw3ICsyNTcsNyBAQAogICAgICAgICBEV09SRAkJZHdSZXQ7CiAgICAgICAgIFdBVkVPUEVOREVTQwl3YXZlRGVzYzsKIAotCWRwcmludGZfaW5mbyhtY2l3YXZlLCJXQVZFX21jaUN1ZSgldSwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdQYXJhbSwgbHBQYXJtcyk7CisJVFJBQ0UobWNpd2F2ZSwiKCV1LCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd1BhcmFtLCBscFBhcm1zKTsKIAogLyogYWx3YXlzIGNsb3NlIGVsZW1lbnRzID8gKi8KIApAQCAtMjk0LDggKzI5NSw3IEBACiB7CiAJRFdPUkQJCWR3UmV0OwogCi0JZHByaW50Zl9pbmZvKG1jaXdhdmUsCi0JCQkiV0FWRV9tY2lDbG9zZSgldSwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdQYXJhbSwgbHBQYXJtcyk7CisJVFJBQ0UobWNpd2F2ZSwgIigldSwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdQYXJhbSwgbHBQYXJtcyk7CiAJTUNJV2F2RGV2W3dEZXZJRF0ublVzZUNvdW50LS07CiAJaWYgKE1DSVdhdkRldlt3RGV2SURdLm5Vc2VDb3VudCA9PSAwKSB7CiAJICAgICAgICBpZiAoTUNJV2F2RGV2W3dEZXZJRF0uaEZpbGUgIT0gMCkgewpAQCAtMzI0LDQxICszMjQsMzggQEAKIAlMUFdBVkVIRFIJbHBXYXZlSGRyOwogCURXT1JECQlkd1JldDsKIAotCWRwcmludGZfaW5mbyhtY2l3YXZlLAotCQkgIldBVkVfbWNpUGxheSgldSwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CisJVFJBQ0UobWNpd2F2ZSwgIigldSwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAKIAlpZiAoTUNJV2F2RGV2W3dEZXZJRF0uZklucHV0KSB7Ci0JICAgICAgICBkcHJpbnRmX3dhcm4obWNpd2F2ZSwgIldBVkVfbWNpUGxheSAvLyBjYW5ub3QgcGxheSBvbiBpbnB1dCBkZXZpY2VcbiIpOworCSAgICAgICAgV0FSTihtY2l3YXZlLCAiY2Fubm90IHBsYXkgb24gaW5wdXQgZGV2aWNlXG4iKTsKIAkJcmV0dXJuIE1DSUVSUl9OT05BUFBMSUNBQkxFX0ZVTkNUSU9OOwogCX0KIAogCWlmIChNQ0lXYXZEZXZbd0RldklEXS5oRmlsZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZHByaW50Zl93YXJuKG1jaXdhdmUsICJXQVZFX21jaVBsYXkgLy8gY2FuJ3QgZmluZCBmaWxlPSclMDhseCcgIVxuIiwKKyAgICAgICAgICAgICAgICBXQVJOKG1jaXdhdmUsICJjYW4ndCBmaW5kIGZpbGU9JyUwOGx4JyAhXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgTUNJV2F2RGV2W3dEZXZJRF0ub3BlblBhcm1zLmxwc3RyRWxlbWVudE5hbWUpOwogCQlyZXR1cm4gTUNJRVJSX0ZJTEVfTk9UX0ZPVU5EOwogCX0KIAlzdGFydCA9IDE7IAkJZW5kID0gOTk5OTk7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfRlJPTSkgewogCQlzdGFydCA9IGxwUGFybXMtPmR3RnJvbTsgCi0JCWRwcmludGZfaW5mbyhtY2l3YXZlLAotCQkJCSJXQVZFX21jaVBsYXkgLy8gTUNJX0ZST009JWQgXG4iLCBzdGFydCk7CisJCVRSQUNFKG1jaXdhdmUsICJNQ0lfRlJPTT0lZCBcbiIsIHN0YXJ0KTsKIAl9CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfVE8pIHsKIAkJZW5kID0gbHBQYXJtcy0+ZHdUbzsKLQkJZHByaW50Zl9pbmZvKG1jaXdhdmUsIldBVkVfbWNpUGxheSAvLyBNQ0lfVE89JWQgXG4iLCBlbmQpOworCQlUUkFDRShtY2l3YXZlLCJNQ0lfVE89JWQgXG4iLCBlbmQpOwogCX0KICNpZiAwCiAJaWYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSB7Ci0gICAgICAgIGRwcmludGZfaW5mbyhtY2l3YXZlLAotCSAgICAgICAgIldBVkVfbWNpUGxheSAvLyBNQ0lfTk9USUZZICUwOGxYICFcbiIsIGxwUGFybXMtPmR3Q2FsbGJhY2spOworICAgICAgICBUUkFDRShtY2l3YXZlLCAiTUNJX05PVElGWSAlMDhsWCAhXG4iLCBscFBhcm1zLT5kd0NhbGxiYWNrKTsKIAkJc3dpdGNoKGZvcmsoKSkgewogCQkJY2FzZSAtMToKLQkJCQlkcHJpbnRmX3dhcm4obWNpd2F2ZSwgIldBVkVfbWNpUGxheSAvLyBDYW4ndCAnZm9yaycgcHJvY2VzcyAhXG4iKTsKKwkJCQlXQVJOKG1jaXdhdmUsICJDYW4ndCAnZm9yaycgcHJvY2VzcyAhXG4iKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgMDoKIAkJCQlicmVhazsgICAgICAgICAKIAkJCWRlZmF1bHQ6Ci0JCQkJZHByaW50Zl9pbmZvKG1jaXdhdmUsIldBVkVfbWNpUGxheSAvLyBwcm9jZXNzIHN0YXJ0ZWQgISByZXR1cm4gdG8gY2FsbGVyLi4uXG4iKTsKKwkJCQlUUkFDRShtY2l3YXZlLCJwcm9jZXNzIHN0YXJ0ZWQgISByZXR1cm4gdG8gY2FsbGVyLi4uXG4iKTsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KIAkJfQpAQCAtMzczLDExICszNzAsMTEgQEAKIAlkd1JldD13b2RNZXNzYWdlKHdEZXZJRCxXT0RNX1BSRVBBUkUsMCwoRFdPUkQpbHBXYXZlSGRyLHNpemVvZihXQVZFSERSKSk7CiAJd2hpbGUoVFJVRSkgewogCQljb3VudCA9IG1taW9SZWFkKE1DSVdhdkRldlt3RGV2SURdLmhGaWxlLCBscFdhdmVIZHItPmxwRGF0YSwgYnVmc2l6ZSk7Ci0JCWRwcmludGZfaW5mbyhtY2l3YXZlLCJXQVZFX21jaVBsYXkgLy8gbW1pb1JlYWQgYnVmc2l6ZT0lbGQgY291bnQ9JWxkXG4iLCBidWZzaXplLCBjb3VudCk7CisJCVRSQUNFKG1jaXdhdmUsIm1taW9SZWFkIGJ1ZnNpemU9JWxkIGNvdW50PSVsZFxuIiwgYnVmc2l6ZSwgY291bnQpOwogCQlpZiAoY291bnQgPCAxKSBicmVhazsKIAkJbHBXYXZlSGRyLT5kd0J1ZmZlckxlbmd0aCA9IGNvdW50OwogLyoJCWxwV2F2ZUhkci0+ZHdCeXRlc1JlY29yZGVkID0gY291bnQ7ICovCi0JCWRwcmludGZfaW5mbyhtY2l3YXZlLCJXQVZFX21jaVBsYXkgLy8gYmVmb3JlIFdPRE1fV1JJVEUgbHBXYXZlSGRyPSVwIGR3QnVmZmVyTGVuZ3RoPSVsdSBkd0J5dGVzUmVjb3JkZWQ9JWx1XG4iLAorCQlUUkFDRShtY2l3YXZlLCJiZWZvcmUgV09ETV9XUklURSBscFdhdmVIZHI9JXAgZHdCdWZmZXJMZW5ndGg9JWx1IGR3Qnl0ZXNSZWNvcmRlZD0lbHVcbiIsCiAJCQkJbHBXYXZlSGRyLCBscFdhdmVIZHItPmR3QnVmZmVyTGVuZ3RoLCBscFdhdmVIZHItPmR3Qnl0ZXNSZWNvcmRlZCk7CiAJCWR3UmV0PXdvZE1lc3NhZ2Uod0RldklELFdPRE1fV1JJVEUsMCwoRFdPUkQpbHBXYXZlSGRyLHNpemVvZihXQVZFSERSKSk7CiAJfQpAQCAtMzg4LDcgKzM4NSw3IEBACiAJCWxwV2F2ZUhkci0+bHBEYXRhID0gTlVMTDsKIAl9CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSB7Ci0JCWRwcmludGZfaW5mbyhtY2l3YXZlLCJXQVZFX21jaVBsYXkgLy8gTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIGxwUGFybXMtPmR3Q2FsbGJhY2spOworCQlUUkFDRShtY2l3YXZlLCJNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdDYWxsYmFjayk7CiAJCW1jaURyaXZlck5vdGlmeSgoSFdORDE2KUxPV09SRChscFBhcm1zLT5kd0NhbGxiYWNrKSwgCiAJCQlNQ0lXYXZEZXZbd0RldklEXS53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CiAJfQpAQCAtNDA3LDI4ICs0MDQsMjYgQEAKIAlMUFdBVkVIRFIJCWxwV2F2ZUhkcjsKIAlEV09SRAkJCWR3UmV0OwogCi0JZHByaW50Zl9pbmZvKG1jaXdhdmUsCi0JCSJXQVZFX21jaVJlY29yZCgldSwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CisJVFJBQ0UobWNpd2F2ZSwgIigldSwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAKIAlpZiAoIU1DSVdhdkRldlt3RGV2SURdLmZJbnB1dCkgewotCSAgICAgICAgZHByaW50Zl93YXJuKG1jaXdhdmUsICJXQVZFX21jaVBsYXkgLy8gY2Fubm90IHJlY29yZCBvbiBvdXRwdXQgZGV2aWNlXG4iKTsKKwkgICAgICAgIFdBUk4obWNpd2F2ZSwgImNhbm5vdCByZWNvcmQgb24gb3V0cHV0IGRldmljZVxuIik7CiAJCXJldHVybiBNQ0lFUlJfTk9OQVBQTElDQUJMRV9GVU5DVElPTjsKIAl9CiAKIAlpZiAoTUNJV2F2RGV2W3dEZXZJRF0uaEZpbGUgPT0gMCkgewotCQlkcHJpbnRmX3dhcm4obWNpd2F2ZSwgIldBVkVfbWNpUmVjb3JkIC8vIGNhbid0IGZpbmQgZmlsZT0nJTA4bHgnICFcbiIsIAorCQlXQVJOKG1jaXdhdmUsICJjYW4ndCBmaW5kIGZpbGU9JyUwOGx4JyAhXG4iLCAKIAkJCQlNQ0lXYXZEZXZbd0RldklEXS5vcGVuUGFybXMubHBzdHJFbGVtZW50TmFtZSk7CiAJCXJldHVybiBNQ0lFUlJfRklMRV9OT1RfRk9VTkQ7CiAJfQogCXN0YXJ0ID0gMTsgCWVuZCA9IDk5OTk5OwogCWlmIChkd0ZsYWdzICYgTUNJX0ZST00pIHsKIAkJc3RhcnQgPSBscFBhcm1zLT5kd0Zyb207IAotCQlkcHJpbnRmX2luZm8obWNpd2F2ZSwKLQkJCQkiV0FWRV9tY2lSZWNvcmQgLy8gTUNJX0ZST009JWQgXG4iLCBzdGFydCk7CisJCVRSQUNFKG1jaXdhdmUsICJNQ0lfRlJPTT0lZCBcbiIsIHN0YXJ0KTsKIAl9CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfVE8pIHsKIAkJZW5kID0gbHBQYXJtcy0+ZHdUbzsKLQkJZHByaW50Zl9pbmZvKG1jaXdhdmUsIldBVkVfbWNpUmVjb3JkIC8vIE1DSV9UTz0lZCBcbiIsIGVuZCk7CisJCVRSQUNFKG1jaXdhdmUsIk1DSV9UTz0lZCBcbiIsIGVuZCk7CiAJfQogCWJ1ZnNpemUgPSA2NDAwMDsKIAlscFdhdmVIZHIgPSAmTUNJV2F2RGV2W3dEZXZJRF0uV2F2ZUhkcjsKQEAgLTQzOSwyNSArNDM0LDI0IEBACiAJbHBXYXZlSGRyLT5kd0ZsYWdzID0gMEw7CiAJbHBXYXZlSGRyLT5kd0xvb3BzID0gMEw7CiAJZHdSZXQ9d2lkTWVzc2FnZSh3RGV2SUQsV0lETV9QUkVQQVJFLDAsKERXT1JEKWxwV2F2ZUhkcixzaXplb2YoV0FWRUhEUikpOwotCWRwcmludGZfaW5mbyhtY2l3YXZlLCJXQVZFX21jaVJlY29yZCAvLyBhZnRlciBXSURNX1BSRVBBUkUgXG4iKTsKKwlUUkFDRShtY2l3YXZlLCJhZnRlciBXSURNX1BSRVBBUkUgXG4iKTsKIAl3aGlsZShUUlVFKSB7CiAJCWxwV2F2ZUhkci0+ZHdCeXRlc1JlY29yZGVkID0gMDsKIAkJZHdSZXQgPSB3aWRNZXNzYWdlKHdEZXZJRCwgV0lETV9TVEFSVCwgMCwgMEwsIDBMKTsKLQkJZHByaW50Zl9pbmZvKG1jaXdhdmUsCi0gICAgICAgICAgICAgICAgICAgICJXQVZFX21jaVJlY29yZCAvLyBhZnRlciBXSURNX1NUQVJUIGxwV2F2ZUhkcj0lcCBkd0J5dGVzUmVjb3JkZWQ9JWx1XG4iLAotCQkJCQlscFdhdmVIZHIsIGxwV2F2ZUhkci0+ZHdCeXRlc1JlY29yZGVkKTsKKwkJVFJBQ0UobWNpd2F2ZSwgImFmdGVyIFdJRE1fU1RBUlQgbHBXYXZlSGRyPSVwIGR3Qnl0ZXNSZWNvcmRlZD0lbHVcbiIsCisJCQkgICAgIGxwV2F2ZUhkciwgbHBXYXZlSGRyLT5kd0J5dGVzUmVjb3JkZWQpOwogCQlpZiAobHBXYXZlSGRyLT5kd0J5dGVzUmVjb3JkZWQgPT0gMCkgYnJlYWs7CiAJfQotCWRwcmludGZfaW5mbyhtY2l3YXZlLCJXQVZFX21jaVJlY29yZCAvLyBiZWZvcmUgV0lETV9VTlBSRVBBUkUgXG4iKTsKKwlUUkFDRShtY2l3YXZlLCJiZWZvcmUgV0lETV9VTlBSRVBBUkUgXG4iKTsKIAlkd1JldCA9IHdpZE1lc3NhZ2Uod0RldklELFdJRE1fVU5QUkVQQVJFLDAsKERXT1JEKWxwV2F2ZUhkcixzaXplb2YoV0FWRUhEUikpOwotCWRwcmludGZfaW5mbyhtY2l3YXZlLCJXQVZFX21jaVJlY29yZCAvLyBhZnRlciBXSURNX1VOUFJFUEFSRSBcbiIpOworCVRSQUNFKG1jaXdhdmUsImFmdGVyIFdJRE1fVU5QUkVQQVJFIFxuIik7CiAJaWYgKGxwV2F2ZUhkci0+bHBEYXRhICE9IE5VTEwpIHsKIAkJR2xvYmFsVW5sb2NrMTYoaERhdGEpOwogCQlHbG9iYWxGcmVlMTYoaERhdGEpOwogCQlscFdhdmVIZHItPmxwRGF0YSA9IE5VTEw7CiAJfQogCWlmIChkd0ZsYWdzICYgTUNJX05PVElGWSkgewotCSAgZHByaW50Zl9pbmZvKG1jaXdhdmUsIldBVkVfbWNpUmVjb3JkIC8vIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCBscFBhcm1zLT5kd0NhbGxiYWNrKTsKKwkgIFRSQUNFKG1jaXdhdmUsIk1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCBscFBhcm1zLT5kd0NhbGxiYWNrKTsKIAkJbWNpRHJpdmVyTm90aWZ5KChIV05EMTYpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKIAkJCU1DSVdhdkRldlt3RGV2SURdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKIAl9CkBAIC00NzIsOCArNDY2LDcgQEAKIHsKICAgICAgICAgRFdPUkQgZHdSZXQ7CiAKLQlkcHJpbnRmX2luZm8obWNpd2F2ZSwKLQkJIldBVkVfbWNpU3RvcCgldSwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CisJVFJBQ0UobWNpd2F2ZSwgIigldSwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAlpZiAoTUNJV2F2RGV2W3dEZXZJRF0uZklucHV0KQogCSAgZHdSZXQgPSB3aWRNZXNzYWdlKHdEZXZJRCwgV0lETV9TVE9QLCAwLCBkd0ZsYWdzLCAoRFdPUkQpbHBQYXJtcyk7CkBAIC00OTEsOCArNDg0LDcgQEAKIHsKICAgICAgICAgRFdPUkQgZHdSZXQ7CiAKLQlkcHJpbnRmX2luZm8obWNpd2F2ZSwKLQkJIldBVkVfbWNpUGF1c2UoJXUsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOworCVRSQUNFKG1jaXdhdmUsICIoJXUsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJaWYgKE1DSVdhdkRldlt3RGV2SURdLmZJbnB1dCkKIAkgIGR3UmV0ID0gd2lkTWVzc2FnZSh3RGV2SUQsIFdJRE1fUEFVU0UsIDAsIGR3RmxhZ3MsIChEV09SRClscFBhcm1zKTsKQEAgLTUwOCw4ICs1MDAsNyBAQAogICovCiBzdGF0aWMgRFdPUkQgV0FWRV9tY2lSZXN1bWUoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfR0VORVJJQ19QQVJNUyBscFBhcm1zKQogewotCWRwcmludGZfaW5mbyhtY2l3YXZlLAotCQkiV0FWRV9tY2lSZXN1bWUoJXUsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOworCVRSQUNFKG1jaXdhdmUsICIoJXUsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJcmV0dXJuIDA7CiB9CkBAIC01MjAsMjYgKzUxMSwyMyBAQAogICovCiBzdGF0aWMgRFdPUkQgV0FWRV9tY2lTZXQoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfU0VUX1BBUk1TIGxwUGFybXMpCiB7Ci0JZHByaW50Zl9pbmZvKG1jaXdhdmUsCi0JCSJXQVZFX21jaVNldCgldSwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CisJVFJBQ0UobWNpd2F2ZSwgIigldSwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKLQlkcHJpbnRmX2luZm8obWNpd2F2ZSwKLQkJICJXQVZFX21jaVNldCAvLyBkd1RpbWVGb3JtYXQ9JTA4bFhcbiIsIGxwUGFybXMtPmR3VGltZUZvcm1hdCk7Ci0JZHByaW50Zl9pbmZvKG1jaXdhdmUsCi0JCSAiV0FWRV9tY2lTZXQgLy8gZHdBdWRpbz0lMDhsWFxuIiwgbHBQYXJtcy0+ZHdBdWRpbyk7CisJVFJBQ0UobWNpd2F2ZSwgImR3VGltZUZvcm1hdD0lMDhsWFxuIiwgbHBQYXJtcy0+ZHdUaW1lRm9ybWF0KTsKKwlUUkFDRShtY2l3YXZlLCAiZHdBdWRpbz0lMDhsWFxuIiwgbHBQYXJtcy0+ZHdBdWRpbyk7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfU0VUX1RJTUVfRk9STUFUKSB7CiAJCXN3aXRjaCAobHBQYXJtcy0+ZHdUaW1lRm9ybWF0KSB7CiAJCWNhc2UgTUNJX0ZPUk1BVF9NSUxMSVNFQ09ORFM6Ci0JCQlkcHJpbnRmX2luZm8obWNpd2F2ZSwJIldBVkVfbWNpU2V0IC8vIE1DSV9GT1JNQVRfTUlMTElTRUNPTkRTICFcbiIpOworCQkJVFJBQ0UobWNpd2F2ZSwgIk1DSV9GT1JNQVRfTUlMTElTRUNPTkRTICFcbiIpOwogCQkJYnJlYWs7CiAJCWNhc2UgTUNJX0ZPUk1BVF9CWVRFUzoKLQkJCWRwcmludGZfaW5mbyhtY2l3YXZlLCAiV0FWRV9tY2lTZXQgLy8gTUNJX0ZPUk1BVF9CWVRFUyAhXG4iKTsKKwkJCVRSQUNFKG1jaXdhdmUsICJNQ0lfRk9STUFUX0JZVEVTICFcbiIpOwogCQkJYnJlYWs7CiAJCWNhc2UgTUNJX0ZPUk1BVF9TQU1QTEVTOgotCQkJZHByaW50Zl9pbmZvKG1jaXdhdmUsCSJXQVZFX21jaVNldCAvLyBNQ0lfRk9STUFUX1NBTVBMRVMgIVxuIik7CisJCQlUUkFDRShtY2l3YXZlLCAiTUNJX0ZPUk1BVF9TQU1QTEVTICFcbiIpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlkcHJpbnRmX3dhcm4obWNpd2F2ZSwJIldBVkVfbWNpU2V0IC8vIGJhZCB0aW1lIGZvcm1hdCAhXG4iKTsKKwkJCVdBUk4obWNpd2F2ZSwgImJhZCB0aW1lIGZvcm1hdCAhXG4iKTsKIAkJCXJldHVybiBNQ0lFUlJfQkFEX1RJTUVfRk9STUFUOwogCQl9CiAJfQpAQCAtNTQ3LDM5ICs1MzUsMzYgQEAKIAlpZiAoZHdGbGFncyAmIE1DSV9TRVRfRE9PUl9PUEVOKSByZXR1cm4gTUNJRVJSX1VOU1VQUE9SVEVEX0ZVTkNUSU9OOwogCWlmIChkd0ZsYWdzICYgTUNJX1NFVF9ET09SX0NMT1NFRCkgcmV0dXJuIE1DSUVSUl9VTlNVUFBPUlRFRF9GVU5DVElPTjsKIAlpZiAoZHdGbGFncyAmIE1DSV9TRVRfQVVESU8pIAotCSAgZHByaW50Zl9pbmZvKG1jaXdhdmUsIldBVkVfbWNpU2V0IC8vIE1DSV9TRVRfQVVESU8gIVxuIik7CisJICBUUkFDRShtY2l3YXZlLCJNQ0lfU0VUX0FVRElPICFcbiIpOwogCWlmIChkd0ZsYWdzICYmIE1DSV9TRVRfT04pIHsKLQkgIGRwcmludGZfaW5mbyhtY2l3YXZlLCJXQVZFX21jaVNldCAvLyBNQ0lfU0VUX09OICFcbiIpOworCSAgVFJBQ0UobWNpd2F2ZSwiTUNJX1NFVF9PTiAhXG4iKTsKIAkgIGlmIChkd0ZsYWdzICYmIE1DSV9TRVRfQVVESU9fTEVGVCkgCi0JICAgIGRwcmludGZfaW5mbyhtY2l3YXZlLCJXQVZFX21jaVNldCAvLyBNQ0lfU0VUX0FVRElPX0xFRlQgIVxuIik7CisJICAgIFRSQUNFKG1jaXdhdmUsIk1DSV9TRVRfQVVESU9fTEVGVCAhXG4iKTsKIAkgIGlmIChkd0ZsYWdzICYmIE1DSV9TRVRfQVVESU9fUklHSFQpIAotCSAgICBkcHJpbnRmX2luZm8obWNpd2F2ZSwiV0FWRV9tY2lTZXQgLy8gTUNJX1NFVF9BVURJT19SSUdIVCAhXG4iKTsKKwkgICAgVFJBQ0UobWNpd2F2ZSwiTUNJX1NFVF9BVURJT19SSUdIVCAhXG4iKTsKIAl9CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfU0VUX09GRikgCi0JICBkcHJpbnRmX2luZm8obWNpd2F2ZSwiV0FWRV9tY2lTZXQgLy8gTUNJX1NFVF9PRkYgIVxuIik7CisJICBUUkFDRShtY2l3YXZlLCJNQ0lfU0VUX09GRiAhXG4iKTsKIAlpZiAoZHdGbGFncyAmIE1DSV9XQVZFX0lOUFVUKSAKLQkgIGRwcmludGZfaW5mbyhtY2l3YXZlLCJXQVZFX21jaVNldCAvLyBNQ0lfV0FWRV9JTlBVVCAhXG4iKTsKKwkgIFRSQUNFKG1jaXdhdmUsIk1DSV9XQVZFX0lOUFVUICFcbiIpOwogICAgICAgCWlmIChkd0ZsYWdzICYgTUNJX1dBVkVfT1VUUFVUKSAKLQkgIGRwcmludGZfaW5mbyhtY2l3YXZlLCJXQVZFX21jaVNldCAvLyBNQ0lfV0FWRV9PVVRQVVQgIVxuIik7CisJICBUUkFDRShtY2l3YXZlLCJNQ0lfV0FWRV9PVVRQVVQgIVxuIik7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfV0FWRV9TRVRfQU5ZSU5QVVQpIAotCSAgZHByaW50Zl9pbmZvKG1jaXdhdmUsIldBVkVfbWNpU2V0IC8vIE1DSV9XQVZFX1NFVF9BTllJTlBVVCAhXG4iKTsKKwkgIFRSQUNFKG1jaXdhdmUsIk1DSV9XQVZFX1NFVF9BTllJTlBVVCAhXG4iKTsKIAlpZiAoZHdGbGFncyAmIE1DSV9XQVZFX1NFVF9BTllPVVRQVVQpIAotCSAgZHByaW50Zl9pbmZvKG1jaXdhdmUsIldBVkVfbWNpU2V0IC8vIE1DSV9XQVZFX1NFVF9BTllPVVRQVVQgIVxuIik7CisJICBUUkFDRShtY2l3YXZlLCJNQ0lfV0FWRV9TRVRfQU5ZT1VUUFVUICFcbiIpOwogCWlmIChkd0ZsYWdzICYgTUNJX1dBVkVfU0VUX0FWR0JZVEVTUEVSU0VDKSAKLQkgIGRwcmludGZfaW5mbyhtY2l3YXZlLAotCQkJICAiV0FWRV9tY2lTZXQgLy8gTUNJX1dBVkVfU0VUX0FWR0JZVEVTUEVSU0VDICFcbiIpOworCSAgVFJBQ0UobWNpd2F2ZSwgIk1DSV9XQVZFX1NFVF9BVkdCWVRFU1BFUlNFQyAhXG4iKTsKIAlpZiAoZHdGbGFncyAmIE1DSV9XQVZFX1NFVF9CSVRTUEVSU0FNUExFKSAKLQkgIGRwcmludGZfaW5mbyhtY2l3YXZlLAotCQkJICAiV0FWRV9tY2lTZXQgLy8gTUNJX1dBVkVfU0VUX0JJVFNQRVJTQU1QTEUgIVxuIik7CisJICBUUkFDRShtY2l3YXZlLCAiTUNJX1dBVkVfU0VUX0JJVFNQRVJTQU1QTEUgIVxuIik7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfV0FWRV9TRVRfQkxPQ0tBTElHTikgCi0JICBkcHJpbnRmX2luZm8obWNpd2F2ZSwiV0FWRV9tY2lTZXQgLy8gTUNJX1dBVkVfU0VUX0JMT0NLQUxJR04gIVxuIik7CisJICBUUkFDRShtY2l3YXZlLCJNQ0lfV0FWRV9TRVRfQkxPQ0tBTElHTiAhXG4iKTsKIAlpZiAoZHdGbGFncyAmIE1DSV9XQVZFX1NFVF9DSEFOTkVMUykgCi0JICBkcHJpbnRmX2luZm8obWNpd2F2ZSwiV0FWRV9tY2lTZXQgLy8gTUNJX1dBVkVfU0VUX0NIQU5ORUxTICFcbiIpOworCSAgVFJBQ0UobWNpd2F2ZSwiTUNJX1dBVkVfU0VUX0NIQU5ORUxTICFcbiIpOwogCWlmIChkd0ZsYWdzICYgTUNJX1dBVkVfU0VUX0ZPUk1BVFRBRykgCi0JICBkcHJpbnRmX2luZm8obWNpd2F2ZSwiV0FWRV9tY2lTZXQgLy8gTUNJX1dBVkVfU0VUX0ZPUk1BVFRBRyAhXG4iKTsKKwkgIFRSQUNFKG1jaXdhdmUsIk1DSV9XQVZFX1NFVF9GT1JNQVRUQUcgIVxuIik7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfV0FWRV9TRVRfU0FNUExFU1BFUlNFQykgCi0JICBkcHJpbnRmX2luZm8obWNpd2F2ZSwKLQkJCSAgIldBVkVfbWNpU2V0IC8vIE1DSV9XQVZFX1NFVF9TQU1QTEVTUEVSU0VDICFcbiIpOworCSAgVFJBQ0UobWNpd2F2ZSwgIk1DSV9XQVZFX1NFVF9TQU1QTEVTUEVSU0VDICFcbiIpOwogIAlyZXR1cm4gMDsKIH0KIApAQCAtNTg5LDggKzU3NCw3IEBACiAgKi8KIHN0YXRpYyBEV09SRCBXQVZFX21jaVN0YXR1cyhVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9TVEFUVVNfUEFSTVMgbHBQYXJtcykKIHsKLQlkcHJpbnRmX2luZm8obWNpd2F2ZSwKLQkJIldBVkVfbWNpU3RhdHVzKCV1LCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKKwlUUkFDRShtY2l3YXZlLCAiKCV1LCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCWlmIChkd0ZsYWdzICYgTUNJX1NUQVRVU19JVEVNKSB7CiAJCXN3aXRjaChscFBhcm1zLT5kd0l0ZW0pIHsKQEAgLTYwOCw3ICs1OTIsNyBAQAogCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSBNQ0lfTU9ERV9TVE9QOwogCQkJYnJlYWs7CiAJCWNhc2UgTUNJX1NUQVRVU19NRURJQV9QUkVTRU5UOgotCQkJZHByaW50Zl9pbmZvKG1jaXdhdmUsIldBVkVfbWNpU3RhdHVzIC8vIE1DSV9TVEFUVVNfTUVESUFfUFJFU0VOVCAhXG4iKTsKKwkJCVRSQUNFKG1jaXdhdmUsIk1DSV9TVEFUVVNfTUVESUFfUFJFU0VOVCAhXG4iKTsKIAkJCWxwUGFybXMtPmR3UmV0dXJuID0gVFJVRTsKIAkJCWJyZWFrOwogCQljYXNlIE1DSV9TVEFUVVNfTlVNQkVSX09GX1RSQUNLUzoKQEAgLTYyNCw1NiArNjA4LDU2IEBACiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBNQ0lfU1RBVFVTX1JFQURZOgotCQkJZHByaW50Zl9pbmZvKG1jaXdhdmUsIldBVkVfbWNpU3RhdHVzIC8vIE1DSV9TVEFUVVNfUkVBRFkgIVxuIik7CisJCQlUUkFDRShtY2l3YXZlLCJNQ0lfU1RBVFVTX1JFQURZICFcbiIpOwogCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSBUUlVFOwogCQkJYnJlYWs7CiAJCWNhc2UgTUNJX1NUQVRVU19USU1FX0ZPUk1BVDoKLQkJCWRwcmludGZfaW5mbyhtY2l3YXZlLCJXQVZFX21jaVN0YXR1cyAvLyBNQ0lfU1RBVFVTX1RJTUVfRk9STUFUICFcbiIpOworCQkJVFJBQ0UobWNpd2F2ZSwiTUNJX1NUQVRVU19USU1FX0ZPUk1BVCAhXG4iKTsKIAkJCWxwUGFybXMtPmR3UmV0dXJuID0gTUNJX0ZPUk1BVF9NSUxMSVNFQ09ORFM7CiAJCQlicmVhazsKIAkJY2FzZSBNQ0lfV0FWRV9JTlBVVDoKLQkJCWRwcmludGZfaW5mbyhtY2l3YXZlLCJXQVZFX21jaVN0YXR1cyAvLyBNQ0lfV0FWRV9JTlBVVCAhXG4iKTsKKwkJCVRSQUNFKG1jaXdhdmUsIk1DSV9XQVZFX0lOUFVUICFcbiIpOwogCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSAwOwogCQkJYnJlYWs7CiAJCWNhc2UgTUNJX1dBVkVfT1VUUFVUOgotCQkJZHByaW50Zl9pbmZvKG1jaXdhdmUsIldBVkVfbWNpU3RhdHVzIC8vIE1DSV9XQVZFX09VVFBVVCAhXG4iKTsKKwkJCVRSQUNFKG1jaXdhdmUsIk1DSV9XQVZFX09VVFBVVCAhXG4iKTsKIAkJCWxwUGFybXMtPmR3UmV0dXJuID0gMDsKIAkJCWJyZWFrOwogCQljYXNlIE1DSV9XQVZFX1NUQVRVU19BVkdCWVRFU1BFUlNFQzoKLQkJCWRwcmludGZfaW5mbyhtY2l3YXZlLCJXQVZFX21jaVN0YXR1cyAvLyBNQ0lfV0FWRV9TVEFUVVNfQVZHQllURVNQRVJTRUMgIVxuIik7CisJCQlUUkFDRShtY2l3YXZlLCJNQ0lfV0FWRV9TVEFUVVNfQVZHQllURVNQRVJTRUMgIVxuIik7CiAJCQlscFBhcm1zLT5kd1JldHVybiA9IDIyMDUwOwogCQkJYnJlYWs7CiAJCWNhc2UgTUNJX1dBVkVfU1RBVFVTX0JJVFNQRVJTQU1QTEU6Ci0JCQlkcHJpbnRmX2luZm8obWNpd2F2ZSwiV0FWRV9tY2lTdGF0dXMgLy8gTUNJX1dBVkVfU1RBVFVTX0JJVFNQRVJTQU1QTEUgIVxuIik7CisJCQlUUkFDRShtY2l3YXZlLCJNQ0lfV0FWRV9TVEFUVVNfQklUU1BFUlNBTVBMRSAhXG4iKTsKIAkJCWxwUGFybXMtPmR3UmV0dXJuID0gODsKIAkJCWJyZWFrOwogCQljYXNlIE1DSV9XQVZFX1NUQVRVU19CTE9DS0FMSUdOOgotCQkJZHByaW50Zl9pbmZvKG1jaXdhdmUsIldBVkVfbWNpU3RhdHVzIC8vIE1DSV9XQVZFX1NUQVRVU19CTE9DS0FMSUdOICFcbiIpOworCQkJVFJBQ0UobWNpd2F2ZSwiTUNJX1dBVkVfU1RBVFVTX0JMT0NLQUxJR04gIVxuIik7CiAJCQlscFBhcm1zLT5kd1JldHVybiA9IDE7CiAJCQlicmVhazsKIAkJY2FzZSBNQ0lfV0FWRV9TVEFUVVNfQ0hBTk5FTFM6Ci0JCQlkcHJpbnRmX2luZm8obWNpd2F2ZSwiV0FWRV9tY2lTdGF0dXMgLy8gTUNJX1dBVkVfU1RBVFVTX0NIQU5ORUxTICFcbiIpOworCQkJVFJBQ0UobWNpd2F2ZSwiTUNJX1dBVkVfU1RBVFVTX0NIQU5ORUxTICFcbiIpOwogCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSAxOwogCQkJYnJlYWs7CiAJCWNhc2UgTUNJX1dBVkVfU1RBVFVTX0ZPUk1BVFRBRzoKLQkJCWRwcmludGZfaW5mbyhtY2l3YXZlLCJXQVZFX21jaVN0YXR1cyAvLyBNQ0lfV0FWRV9GT1JNQVRUQUcgIVxuIik7CisJCQlUUkFDRShtY2l3YXZlLCJNQ0lfV0FWRV9GT1JNQVRUQUcgIVxuIik7CiAJCQlscFBhcm1zLT5kd1JldHVybiA9IFdBVkVfRk9STUFUX1BDTTsKIAkJCWJyZWFrOwogCQljYXNlIE1DSV9XQVZFX1NUQVRVU19MRVZFTDoKLQkJCWRwcmludGZfaW5mbyhtY2l3YXZlLCJXQVZFX21jaVN0YXR1cyAvLyBNQ0lfV0FWRV9TVEFUVVNfTEVWRUwgIVxuIik7CisJCQlUUkFDRShtY2l3YXZlLCJNQ0lfV0FWRV9TVEFUVVNfTEVWRUwgIVxuIik7CiAJCQlscFBhcm1zLT5kd1JldHVybiA9IDB4QUFBQTU1NTU7CiAJCQlicmVhazsKIAkJY2FzZSBNQ0lfV0FWRV9TVEFUVVNfU0FNUExFU1BFUlNFQzoKLQkJCWRwcmludGZfaW5mbyhtY2l3YXZlLCJXQVZFX21jaVN0YXR1cyAvLyBNQ0lfV0FWRV9TVEFUVVNfU0FNUExFU1BFUlNFQyAhXG4iKTsKKwkJCVRSQUNFKG1jaXdhdmUsIk1DSV9XQVZFX1NUQVRVU19TQU1QTEVTUEVSU0VDICFcbiIpOwogCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSAyMjA1MDsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJZHByaW50Zl93YXJuKG1jaXdhdmUsIldBVkVfbWNpU3RhdHVzIC8vIHVua25vd24gY29tbWFuZCAlMDhsWCAhXG4iLCBscFBhcm1zLT5kd0l0ZW0pOworCQkJV0FSTihtY2l3YXZlLCJ1bmtub3duIGNvbW1hbmQgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdJdGVtKTsKIAkJCXJldHVybiBNQ0lFUlJfVU5SRUNPR05JWkVEX0NPTU1BTkQ7CiAJCX0KIAl9CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSB7Ci0JCWRwcmludGZfaW5mbyhtY2l3YXZlLCJXQVZFX21jaVN0YXR1cyAvLyBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdDYWxsYmFjayk7CisJCVRSQUNFKG1jaXdhdmUsIk1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCBscFBhcm1zLT5kd0NhbGxiYWNrKTsKIAkJbWNpRHJpdmVyTm90aWZ5KChIV05EMTYpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKIAkJCU1DSVdhdkRldlt3RGV2SURdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKIAl9CkBAIC02ODYsOCArNjcwLDcgQEAKIHN0YXRpYyBEV09SRCBXQVZFX21jaUdldERldkNhcHMoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgCiAJCQkJCUxQTUNJX0dFVERFVkNBUFNfUEFSTVMgbHBQYXJtcykKIHsKLQlkcHJpbnRmX2luZm8obWNpd2F2ZSwKLQkJIldBVkVfbWNpR2V0RGV2Q2FwcygldSwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CisJVFJBQ0UobWNpd2F2ZSwgIigldSwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAlpZiAoZHdGbGFncyAmIE1DSV9HRVRERVZDQVBTX0lURU0pIHsKIAkJc3dpdGNoKGxwUGFybXMtPmR3SXRlbSkgewpAQCAtNzM2LDggKzcxOSw3IEBACiAgKi8KIHN0YXRpYyBEV09SRCBXQVZFX21jaUluZm8oVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfSU5GT19QQVJNUzE2IGxwUGFybXMpCiB7Ci0JZHByaW50Zl9pbmZvKG1jaXdhdmUsCi0JCSJXQVZFX21jaUluZm8oJXUsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOworCVRSQUNFKG1jaXdhdmUsICIoJXUsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJbHBQYXJtcy0+bHBzdHJSZXR1cm4gPSBOVUxMOwogCXN3aXRjaChkd0ZsYWdzKSB7CkBAIC03NzksOCArNzYxLDcgQEAKIAlpbnQJZHNwX3N0ZXJlbyA9IDE7CiAJaW50CWJ5dGVzcGVyc21wbDsKIAotCWRwcmludGZfaW5mbyhtY2l3YXZlLAotCQkgICAid29kR2V0RGV2Q2FwcygldSwgJXAsICVsdSk7XG4iLCB3RGV2SUQsIGxwQ2FwcywgZHdTaXplKTsKKwlUUkFDRShtY2l3YXZlLCAiKCV1LCAlcCwgJWx1KTtcbiIsIHdEZXZJRCwgbHBDYXBzLCBkd1NpemUpOwogCWlmIChscENhcHMgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJaWYgKGFjY2VzcyhTT1VORF9ERVYsMCkgIT0gMCkgcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJYXVkaW8gPSBvcGVuIChTT1VORF9ERVYsIE9fV1JPTkxZLCAwKTsKQEAgLTgzNCw4ICs4MTUsNyBAQAogCQl9CiAJfQogCWNsb3NlKGF1ZGlvKTsKLQlkcHJpbnRmX2luZm8obWNpd2F2ZSwKLQkJIndvZEdldERldkNhcHMgLy8gZHdGb3JtYXRzID0gJTA4bFhcbiIsIGxwQ2Fwcy0+ZHdGb3JtYXRzKTsKKwlUUkFDRShtY2l3YXZlLCAiZHdGb3JtYXRzID0gJTA4bFhcbiIsIGxwQ2Fwcy0+ZHdGb3JtYXRzKTsKIAlyZXR1cm4gTU1TWVNFUlJfTk9FUlJPUjsKIH0KIApAQCAtODQ4LDQ0ICs4MjgsNDMgQEAKIAlpbnQgCSBhdWRpbyxhYnVmX3NpemUsc21wbHJhdGUsc2FtcGxlc2l6ZSxkc3Bfc3RlcmVvOwogCUxQV0FWRUZPUk1BVAlscEZvcm1hdDsKIAotCWRwcmludGZfaW5mbyhtY2l3YXZlLAotCQkid29kT3BlbigldSwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBEZXNjLCBkd0ZsYWdzKTsKKwlUUkFDRShtY2l3YXZlLCAiKCV1LCAlcCwgJTA4bFgpO1xuIiwgd0RldklELCBscERlc2MsIGR3RmxhZ3MpOwogCWlmIChscERlc2MgPT0gTlVMTCkgewotCQlkcHJpbnRmX3dhcm4obWNpd2F2ZSwgIkxpbnV4ICd3b2RPcGVuJyAvLyBJbnZhbGlkIFBhcmFtZXRlciAhXG4iKTsKKwkJV0FSTihtY2l3YXZlLCAiSW52YWxpZCBQYXJhbWV0ZXIgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOwogCX0KIAlpZiAod0RldklEID49IE1BWF9XQVZPVVREUlYpIHsKLQkJZHByaW50Zl9pbmZvKG1jaXdhdmUsIkxpbnV4ICd3b2RPcGVuJyAvLyBNQVhfV0FWT1VURFJWIHJlYWNoZWQgIVxuIik7CisJCVRSQUNFKG1jaXdhdmUsIk1BWF9XQVZPVVREUlYgcmVhY2hlZCAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX0FMTE9DQVRFRDsKIAl9CiAJV091dERldlt3RGV2SURdLnVuaXhkZXYgPSAwOwogCWlmIChhY2Nlc3MoU09VTkRfREVWLDApICE9IDApIHJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCWF1ZGlvID0gb3BlbiAoU09VTkRfREVWLCBPX1dST05MWSwgMCk7CiAJaWYgKGF1ZGlvID09IC0xKSB7Ci0JCWRwcmludGZfd2FybihtY2l3YXZlLCAiTGludXggJ3dvZE9wZW4nIC8vIGNhbid0IG9wZW4gIVxuIik7CisJCVdBUk4obWNpd2F2ZSwgImNhbid0IG9wZW4gIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9BTExPQ0FURUQgOwogCX0KIAlJT0NUTChhdWRpbywgU05EQ1RMX0RTUF9HRVRCTEtTSVpFLCBhYnVmX3NpemUpOwogCWlmIChhYnVmX3NpemUgPCAxMDI0IHx8IGFidWZfc2l6ZSA+IDY1NTM2KSB7CiAJCWlmIChhYnVmX3NpemUgPT0gLTEpCi0JCQlkcHJpbnRmX3dhcm4obWNpd2F2ZSwgIkxpbnV4ICd3b2RPcGVuJyAvLyBJT0NUTCBjYW4ndCAnU05EQ1RMX0RTUF9HRVRCTEtTSVpFJyAhXG4iKTsKKwkJCVdBUk4obWNpd2F2ZSwgIklPQ1RMIGNhbid0ICdTTkRDVExfRFNQX0dFVEJMS1NJWkUnICFcbiIpOwogCQllbHNlCi0JCQlkcHJpbnRmX3dhcm4obWNpd2F2ZSwgIkxpbnV4ICd3b2RPcGVuJyAvLyBTTkRDVExfRFNQX0dFVEJMS1NJWkUgSW52YWxpZCBidWZzaXplICFcbiIpOworCQkJV0FSTihtY2l3YXZlLCAiU05EQ1RMX0RTUF9HRVRCTEtTSVpFIEludmFsaWQgYnVmc2l6ZSAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJfQogCVdPdXREZXZbd0RldklEXS53RmxhZ3MgPSBISVdPUkQoZHdGbGFncyAmIENBTExCQUNLX1RZUEVNQVNLKTsKIAlzd2l0Y2goV091dERldlt3RGV2SURdLndGbGFncykgewogCWNhc2UgRENCX05VTEw6Ci0JCWRwcmludGZfaW5mbyhtY2l3YXZlLAkiTGludXggJ3dvZE9wZW4nIC8vIENBTExCQUNLX05VTEwgIVxuIik7CisJCVRSQUNFKG1jaXdhdmUsICJDQUxMQkFDS19OVUxMICFcbiIpOwogCQlicmVhazsKIAljYXNlIERDQl9XSU5ET1c6Ci0JCWRwcmludGZfaW5mbyhtY2l3YXZlLAkiTGludXggJ3dvZE9wZW4nIC8vIENBTExCQUNLX1dJTkRPVyAhXG4iKTsKKwkJVFJBQ0UobWNpd2F2ZSwgIkNBTExCQUNLX1dJTkRPVyAhXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBEQ0JfVEFTSzoKLQkJZHByaW50Zl9pbmZvKG1jaXdhdmUsCSJMaW51eCAnd29kT3BlbicgLy8gQ0FMTEJBQ0tfVEFTSyAhXG4iKTsKKwkJVFJBQ0UobWNpd2F2ZSwgIkNBTExCQUNLX1RBU0sgIVxuIik7CiAJCWJyZWFrOwogCWNhc2UgRENCX0ZVTkNUSU9OOgotCQlkcHJpbnRmX2luZm8obWNpd2F2ZSwJIkxpbnV4ICd3b2RPcGVuJyAvLyBDQUxMQkFDS19GVU5DVElPTiAhXG4iKTsKKwkJVFJBQ0UobWNpd2F2ZSwgIkNBTExCQUNLX0ZVTkNUSU9OICFcbiIpOwogCQlicmVhazsKIAl9CiAJV091dERldlt3RGV2SURdLmxwUXVldWVIZHIgPSBOVUxMOwpAQCAtODk0LDIzICs4NzMsMjMgQEAKIAlXT3V0RGV2W3dEZXZJRF0uYnVmc2l6ZSA9IGFidWZfc2l6ZTsKIAkvKiBGSVhNRTogY29weSBscEZvcm1hdCB0b28/ICovCiAJbWVtY3B5KCZXT3V0RGV2W3dEZXZJRF0ud2F2ZURlc2MsIGxwRGVzYywgc2l6ZW9mKFdBVkVPUEVOREVTQykpOwotCWRwcmludGZfaW5mbyhtY2l3YXZlLCJMaW51eCAnd29kT3BlbicgLy8gbHBEZXNjLT5scEZvcm1hdCA9ICVwXG4iLGxwRGVzYy0+bHBGb3JtYXQpOworCVRSQUNFKG1jaXdhdmUsImxwRGVzYy0+bHBGb3JtYXQgPSAlcFxuIixscERlc2MtPmxwRm9ybWF0KTsKICAgICAgICAgbHBGb3JtYXQgPSBscERlc2MtPmxwRm9ybWF0OyAKLQlkcHJpbnRmX2luZm8obWNpd2F2ZSwiTGludXggJ3dvZE9wZW4nIC8vIGxwRm9ybWF0ID0gJXBcbiIsbHBGb3JtYXQpOworCVRSQUNFKG1jaXdhdmUsImxwRm9ybWF0ID0gJXBcbiIsbHBGb3JtYXQpOwogCWlmIChscEZvcm1hdC0+d0Zvcm1hdFRhZyAhPSBXQVZFX0ZPUk1BVF9QQ00pIHsKLQkJZHByaW50Zl93YXJuKG1jaXdhdmUsIkxpbnV4ICd3b2RPcGVuJyAvLyBCYWQgZm9ybWF0ICUwNFggIVxuIiwKLQkJCQlscEZvcm1hdC0+d0Zvcm1hdFRhZyk7Ci0JCWRwcmludGZfd2FybihtY2l3YXZlLCJMaW51eCAnd29kT3BlbicgLy8gQmFkIG5DaGFubmVscyAlZCAhXG4iLAotCQkJCWxwRm9ybWF0LT5uQ2hhbm5lbHMpOwotCQlkcHJpbnRmX3dhcm4obWNpd2F2ZSwiTGludXggJ3dvZE9wZW4nIC8vIEJhZCBuU2FtcGxlc1BlclNlYyAlbGQgIVxuIiwKLQkJCQlscEZvcm1hdC0+blNhbXBsZXNQZXJTZWMpOworCQlXQVJOKG1jaXdhdmUsIkJhZCBmb3JtYXQgJTA0WCAhXG4iLAorCQkJICAgICBscEZvcm1hdC0+d0Zvcm1hdFRhZyk7CisJCVdBUk4obWNpd2F2ZSwiQmFkIG5DaGFubmVscyAlZCAhXG4iLAorCQkJICAgICBscEZvcm1hdC0+bkNoYW5uZWxzKTsKKwkJV0FSTihtY2l3YXZlLCJCYWQgblNhbXBsZXNQZXJTZWMgJWxkICFcbiIsCisJCQkgICAgIGxwRm9ybWF0LT5uU2FtcGxlc1BlclNlYyk7CiAJCXJldHVybiBXQVZFUlJfQkFERk9STUFUOwogCX0KIAltZW1jcHkoJldPdXREZXZbd0RldklEXS5Gb3JtYXQsIGxwRm9ybWF0LCBzaXplb2YoUENNV0FWRUZPUk1BVCkpOwogCWlmIChXT3V0RGV2W3dEZXZJRF0uRm9ybWF0LndmLm5DaGFubmVscyA9PSAwKSByZXR1cm4gV0FWRVJSX0JBREZPUk1BVDsKIAlpZiAoV091dERldlt3RGV2SURdLkZvcm1hdC53Zi5uU2FtcGxlc1BlclNlYyA9PSAwKSByZXR1cm4gV0FWRVJSX0JBREZPUk1BVDsKLQlkcHJpbnRmX2luZm8obWNpd2F2ZSwiTGludXggJ3dvZE9wZW4nIC8vIHdCaXRzUGVyU2FtcGxlPSV1ICFcbiIsCi0JCQkJV091dERldlt3RGV2SURdLkZvcm1hdC53Qml0c1BlclNhbXBsZSk7CisJVFJBQ0UobWNpd2F2ZSwid0JpdHNQZXJTYW1wbGU9JXUgIVxuIiwKKwkJICAgICBXT3V0RGV2W3dEZXZJRF0uRm9ybWF0LndCaXRzUGVyU2FtcGxlKTsKIAlpZiAoV091dERldlt3RGV2SURdLkZvcm1hdC53Qml0c1BlclNhbXBsZSA9PSAwKSB7CiAJCVdPdXREZXZbd0RldklEXS5Gb3JtYXQud0JpdHNQZXJTYW1wbGUgPSA4ICoKIAkJKFdPdXREZXZbd0RldklEXS5Gb3JtYXQud2YubkF2Z0J5dGVzUGVyU2VjIC8KQEAgLTkyMywxNiArOTAyLDE2IEBACiAJSU9DVEwoYXVkaW8sIFNORENUTF9EU1BfU1BFRUQsIHNtcGxyYXRlKTsKIAlJT0NUTChhdWRpbywgU05EQ1RMX0RTUF9TQU1QTEVTSVpFLCBzYW1wbGVzaXplKTsKIAlJT0NUTChhdWRpbywgU05EQ1RMX0RTUF9TVEVSRU8sIGRzcF9zdGVyZW8pOwotCWRwcmludGZfaW5mbyhtY2l3YXZlLCJMaW51eCAnd29kT3BlbicgLy8gd0JpdHNQZXJTYW1wbGU9JXUgIVxuIiwKLQkJCQlXT3V0RGV2W3dEZXZJRF0uRm9ybWF0LndCaXRzUGVyU2FtcGxlKTsKLQlkcHJpbnRmX2luZm8obWNpd2F2ZSwiTGludXggJ3dvZE9wZW4nIC8vIG5BdmdCeXRlc1BlclNlYz0lbHUgIVxuIiwKLQkJCQlXT3V0RGV2W3dEZXZJRF0uRm9ybWF0LndmLm5BdmdCeXRlc1BlclNlYyk7Ci0JZHByaW50Zl9pbmZvKG1jaXdhdmUsIkxpbnV4ICd3b2RPcGVuJyAvLyBuU2FtcGxlc1BlclNlYz0lbHUgIVxuIiwKLQkJCQlXT3V0RGV2W3dEZXZJRF0uRm9ybWF0LndmLm5TYW1wbGVzUGVyU2VjKTsKLQlkcHJpbnRmX2luZm8obWNpd2F2ZSwiTGludXggJ3dvZE9wZW4nIC8vIG5DaGFubmVscz0ldSAhXG4iLAotCQkJCVdPdXREZXZbd0RldklEXS5Gb3JtYXQud2YubkNoYW5uZWxzKTsKKwlUUkFDRShtY2l3YXZlLCJ3Qml0c1BlclNhbXBsZT0ldSAhXG4iLAorCQkgICAgIFdPdXREZXZbd0RldklEXS5Gb3JtYXQud0JpdHNQZXJTYW1wbGUpOworCVRSQUNFKG1jaXdhdmUsIm5BdmdCeXRlc1BlclNlYz0lbHUgIVxuIiwKKwkJICAgICBXT3V0RGV2W3dEZXZJRF0uRm9ybWF0LndmLm5BdmdCeXRlc1BlclNlYyk7CisJVFJBQ0UobWNpd2F2ZSwiblNhbXBsZXNQZXJTZWM9JWx1ICFcbiIsCisJCSAgICAgV091dERldlt3RGV2SURdLkZvcm1hdC53Zi5uU2FtcGxlc1BlclNlYyk7CisJVFJBQ0UobWNpd2F2ZSwibkNoYW5uZWxzPSV1ICFcbiIsCisJCSAgICAgV091dERldlt3RGV2SURdLkZvcm1hdC53Zi5uQ2hhbm5lbHMpOwogCWlmIChXQVZFX05vdGlmeUNsaWVudCh3RGV2SUQsIFdPTV9PUEVOLCAwTCwgMEwpICE9IE1NU1lTRVJSX05PRVJST1IpIHsKLQkJZHByaW50Zl93YXJuKG1jaXdhdmUsICJMaW51eCAnd29kT3BlbicgLy8gY2FuJ3Qgbm90aWZ5IGNsaWVudCAhXG4iKTsKKwkJV0FSTihtY2l3YXZlLCAiY2FuJ3Qgbm90aWZ5IGNsaWVudCAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07CiAJfQogCXJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwpAQCAtOTQzLDE0ICs5MjIsMTQgQEAKICAqLwogc3RhdGljIERXT1JEIHdvZENsb3NlKFdPUkQgd0RldklEKQogewotCWRwcmludGZfaW5mbyhtY2l3YXZlLCJ3b2RDbG9zZSgldSk7XG4iLCB3RGV2SUQpOworCVRSQUNFKG1jaXdhdmUsIigldSk7XG4iLCB3RGV2SUQpOwogCWlmICh3RGV2SUQgPiBNQVhfV0FWT1VURFJWKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKIAlpZiAoV091dERldlt3RGV2SURdLnVuaXhkZXYgPT0gMCkgewotCQlkcHJpbnRmX3dhcm4obWNpd2F2ZSwgIkxpbnV4ICd3b2RDbG9zZScgLy8gY2FuJ3QgY2xvc2UgIVxuIik7CisJCVdBUk4obWNpd2F2ZSwgImNhbid0IGNsb3NlICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAl9CiAJaWYgKFdPdXREZXZbd0RldklEXS5scFF1ZXVlSGRyICE9IE5VTEwpIHsKLQkgICAgICAgIGRwcmludGZfd2FybihtY2l3YXZlLCAibGludXggJ3dvZGNsb3NlJyAvLyBzdGlsbCBidWZmZXJzIG9wZW4gIVxuIik7CisJICAgICAgICBXQVJOKG1jaXdhdmUsICJzdGlsbCBidWZmZXJzIG9wZW4gIVxuIik7CiAJCS8qIERvbid0IGNhcmUuIFdobyBuZWVkcyB0aG9zZSBidWZmZXJzIGFueXdheSAqLwogCQkvKnJldHVybiBXQVZFUlJfU1RJTExQTEFZSU5HOyAqLwogCX0KQEAgLTk1OSw3ICs5MzgsNyBAQAogCVdPdXREZXZbd0RldklEXS5idWZzaXplID0gMDsKIAlXT3V0RGV2W3dEZXZJRF0ubHBRdWV1ZUhkciA9IE5VTEw7CiAJaWYgKFdBVkVfTm90aWZ5Q2xpZW50KHdEZXZJRCwgV09NX0NMT1NFLCAwTCwgMEwpICE9IE1NU1lTRVJSX05PRVJST1IpIHsKLQkJZHByaW50Zl93YXJuKG1jaXdhdmUsICJMaW51eCAnd29kQ2xvc2UnIC8vIGNhbid0IG5vdGlmeSBjbGllbnQgIVxuIik7CisJCVdBUk4obWNpd2F2ZSwgImNhbid0IG5vdGlmeSBjbGllbnQgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOwogCX0KIAlyZXR1cm4gTU1TWVNFUlJfTk9FUlJPUjsKQEAgLTk3Niw5ICs5NTUsOSBAQAogCUxQU1RSCSAgICAgICAgbHBEYXRhOwogCUxQV0FWRUhEUgl4d2F2ZWhkcjsKIAotCWRwcmludGZfaW5mbyhtY2l3YXZlLCJ3b2RXcml0ZSgldSwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBXYXZlSGRyLCBkd1NpemUpOworCVRSQUNFKG1jaXdhdmUsIigldSwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBXYXZlSGRyLCBkd1NpemUpOwogCWlmIChXT3V0RGV2W3dEZXZJRF0udW5peGRldiA9PSAwKSB7Ci0gICAgICAgIGRwcmludGZfd2FybihtY2l3YXZlLCAiTGludXggJ3dvZFdyaXRlJyAvLyBjYW4ndCBwbGF5ICFcbiIpOworICAgICAgICBXQVJOKG1jaXdhdmUsICJjYW4ndCBwbGF5ICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAl9CiAJaWYgKGxwV2F2ZUhkci0+bHBEYXRhID09IE5VTEwpIHJldHVybiBXQVZFUlJfVU5QUkVQQVJFRDsKQEAgLTk4NiwxNSArOTY1LDE1IEBACiAJaWYgKGxwV2F2ZUhkci0+ZHdGbGFncyAmIFdIRFJfSU5RVUVVRSkgcmV0dXJuIFdBVkVSUl9TVElMTFBMQVlJTkc7CiAJbHBXYXZlSGRyLT5kd0ZsYWdzICY9IH5XSERSX0RPTkU7CiAJbHBXYXZlSGRyLT5kd0ZsYWdzIHw9IFdIRFJfSU5RVUVVRTsKLQlkcHJpbnRmX2luZm8obWNpd2F2ZSwKLQkJIndvZFdyaXRlKCkgLy8gZHdCdWZmZXJMZW5ndGggJWx1ICFcbiIsIGxwV2F2ZUhkci0+ZHdCdWZmZXJMZW5ndGgpOwotCWRwcmludGZfaW5mbyhtY2l3YXZlLAotCQkid29kV3JpdGUoKSAvLyBXT3V0RGV2WyV1XS51bml4ZGV2ICV1ICFcbiIsIHdEZXZJRCwgV091dERldlt3RGV2SURdLnVuaXhkZXYpOworCVRSQUNFKG1jaXdhdmUsICJkd0J1ZmZlckxlbmd0aCAlbHUgIVxuIiwgCisJCSAgICAgbHBXYXZlSGRyLT5kd0J1ZmZlckxlbmd0aCk7CisJVFJBQ0UobWNpd2F2ZSwgIldPdXREZXZbJXVdLnVuaXhkZXYgJXUgIVxuIiwgCisJCSAgICAgd0RldklELCBXT3V0RGV2W3dEZXZJRF0udW5peGRldik7CiAJbHBEYXRhID0gbHBXYXZlSGRyLT5scERhdGE7CiAJY291bnQgPSB3cml0ZSAoV091dERldlt3RGV2SURdLnVuaXhkZXYsIGxwRGF0YSwgbHBXYXZlSGRyLT5kd0J1ZmZlckxlbmd0aCk7Ci0JZHByaW50Zl9pbmZvKG1jaXdhdmUsIndvZFdyaXRlKCkvL3dyaXRlIHJldHVybmVkIGNvdW50ICV1ICFcbiIsY291bnQpOworCVRSQUNFKG1jaXdhdmUsIndyaXRlIHJldHVybmVkIGNvdW50ICV1ICFcbiIsY291bnQpOwogCWlmIChjb3VudCAhPSBscFdhdmVIZHItPmR3QnVmZmVyTGVuZ3RoKSB7Ci0JCWRwcmludGZfd2FybihtY2l3YXZlLCAiTGludXggJ3dvZFdyaXRlJyAvLyBlcnJvciB3cml0dGluZyAhXG4iKTsKKwkJV0FSTihtY2l3YXZlLCAiIGVycm9yIHdyaXR0aW5nICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAl9CiAJV091dERldlt3RGV2SURdLmR3VG90YWxQbGF5ZWQgKz0gY291bnQ7CkBAIC0xMDA2LDE0ICs5ODUsMTQgQEAKIAkJbWVtY3B5KHh3YXZlaGRyLGxwV2F2ZUhkcixzaXplb2YoV0FWRUhEUikpOwogCQl4d2F2ZWhkci0+bHBEYXRhID0gKExQQllURSl4d2F2ZWhkci0+cmVzZXJ2ZWQ7CiAJCWlmIChXQVZFX05vdGlmeUNsaWVudCh3RGV2SUQsIFdPTV9ET05FLCAoRFdPUkQpU0VHUFRSX0dFVCh4d2F2ZWhkciksIGNvdW50KSAhPSBNTVNZU0VSUl9OT0VSUk9SKSB7Ci0JCQlkcHJpbnRmX3dhcm4obWNpd2F2ZSwgIkxpbnV4ICd3b2RXcml0ZScgLy8gY2FuJ3Qgbm90aWZ5IGNsaWVudCAhXG4iKTsKKwkJCVdBUk4obWNpd2F2ZSwgImNhbid0IG5vdGlmeSBjbGllbnQgIVxuIik7CiAJCQlTRUdQVFJfRlJFRSh4d2F2ZWhkcik7CiAJCQlyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKIAkJfQogCQlTRUdQVFJfRlJFRSh4d2F2ZWhkcik7CiAJfSBlbHNlIHsKIAkJaWYgKFdBVkVfTm90aWZ5Q2xpZW50KHdEZXZJRCwgV09NX0RPTkUsIChEV09SRClscFdhdmVIZHIsIGNvdW50KSAhPSBNTVNZU0VSUl9OT0VSUk9SKSB7Ci0JCQlkcHJpbnRmX3dhcm4obWNpd2F2ZSwgIkxpbnV4ICd3b2RXcml0ZScgLy8gY2FuJ3Qgbm90aWZ5IGNsaWVudCAhXG4iKTsKKwkJCVdBUk4obWNpd2F2ZSwgImNhbid0IG5vdGlmeSBjbGllbnQgIVxuIik7CiAJCQlyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKIAkJfQogCX0KQEAgLTEwMjUsMTAgKzEwMDQsOSBAQAogICovCiBzdGF0aWMgRFdPUkQgd29kUHJlcGFyZShXT1JEIHdEZXZJRCwgTFBXQVZFSERSIGxwV2F2ZUhkciwgRFdPUkQgZHdTaXplKQogewotCWRwcmludGZfaW5mbyhtY2l3YXZlLAotCQkid29kUHJlcGFyZSgldSwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBXYXZlSGRyLCBkd1NpemUpOworCVRSQUNFKG1jaXdhdmUsICIoJXUsICVwLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGxwV2F2ZUhkciwgZHdTaXplKTsKIAlpZiAoV091dERldlt3RGV2SURdLnVuaXhkZXYgPT0gMCkgewotCQlkcHJpbnRmX3dhcm4obWNpd2F2ZSwgIkxpbnV4ICd3b2RQcmVwYXJlJyAvLyBjYW4ndCBwcmVwYXJlICFcbiIpOworCQlXQVJOKG1jaXdhdmUsICJjYW4ndCBwcmVwYXJlICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAl9CiAJLyogZG9uJ3QgYXBwZW5kIHRvIHF1ZXVlLCB3b2RXcml0ZSBkb2VzIHRoYXQgKi8KQEAgLTEwNDUsMTAgKzEwMjMsOSBAQAogICovCiBzdGF0aWMgRFdPUkQgd29kVW5wcmVwYXJlKFdPUkQgd0RldklELCBMUFdBVkVIRFIgbHBXYXZlSGRyLCBEV09SRCBkd1NpemUpCiB7Ci0JZHByaW50Zl9pbmZvKG1jaXdhdmUsCi0JCSJ3b2RVbnByZXBhcmUoJXUsICVwLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGxwV2F2ZUhkciwgZHdTaXplKTsKKwlUUkFDRShtY2l3YXZlLCAiKCV1LCAlcCwgJTA4bFgpO1xuIiwgd0RldklELCBscFdhdmVIZHIsIGR3U2l6ZSk7CiAJaWYgKFdPdXREZXZbd0RldklEXS51bml4ZGV2ID09IDApIHsKLQkJZHByaW50Zl93YXJuKG1jaXdhdmUsICJMaW51eCAnd29kVW5wcmVwYXJlJyAvLyBjYW4ndCB1bnByZXBhcmUgIVxuIik7CisJCVdBUk4obWNpd2F2ZSwgImNhbid0IHVucHJlcGFyZSAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJfQogCWlmIChscFdhdmVIZHItPmR3RmxhZ3MgJiBXSERSX0lOUVVFVUUpCkBAIC0xMDU2LDggKzEwMzMsNyBAQAogCQogCWxwV2F2ZUhkci0+ZHdGbGFncyAmPSB+V0hEUl9QUkVQQVJFRDsKIAlscFdhdmVIZHItPmR3RmxhZ3MgfD0gV0hEUl9ET05FOwotCWRwcmludGZfaW5mbyhtY2l3YXZlLAotCQkiTGludXggJ3dvZFVucHJlcGFyZScgLy8gYWxsIGhlYWRlcnMgdW5wcmVwYXJlZCAhXG4iKTsKKwlUUkFDRShtY2l3YXZlLCAiYWxsIGhlYWRlcnMgdW5wcmVwYXJlZCAhXG4iKTsKIAlyZXR1cm4gTU1TWVNFUlJfTk9FUlJPUjsKIH0KIApAQCAtMTA2NiwxNCArMTA0MiwxNCBAQAogICovCiBzdGF0aWMgRFdPUkQgd29kUmVzdGFydChXT1JEIHdEZXZJRCkKIHsKLQlkcHJpbnRmX2luZm8obWNpd2F2ZSwid29kUmVzdGFydCgldSk7XG4iLCB3RGV2SUQpOworCVRSQUNFKG1jaXdhdmUsIigldSk7XG4iLCB3RGV2SUQpOwogCWlmIChXT3V0RGV2W3dEZXZJRF0udW5peGRldiA9PSAwKSB7Ci0JCWRwcmludGZfd2FybihtY2l3YXZlLCAiTGludXggJ3dvZFJlc3RhcnQnIC8vIGNhbid0IHJlc3RhcnQgIVxuIik7CisJCVdBUk4obWNpd2F2ZSwgImNhbid0IHJlc3RhcnQgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCX0KIAkvKiBGSVhNRTogaXMgTm90aWZ5Q2xpZW50IHdpdGggV09NX0RPTkUgcmlnaHQgPyAoQ29tZXQgQnVzdGVycyAxLjMuMyBuZWVkcyB0aGlzIG5vdGlmaWNhdGlvbikgKi8KICAgICAgICAJaWYgKFdBVkVfTm90aWZ5Q2xpZW50KHdEZXZJRCwgV09NX0RPTkUsIDBMLCAwTCkgIT0gTU1TWVNFUlJfTk9FUlJPUikgewotICAgICAgICAgICAgICAgCWRwcmludGZfd2FybihtY2l3YXZlLCAiTGludXggJ3dvZFJlc3RhcnQnIC8vIGNhbid0IG5vdGlmeSBjbGllbnQgIVxuIik7CisgICAgICAgICAgICAgICAJV0FSTihtY2l3YXZlLCAiY2FuJ3Qgbm90aWZ5IGNsaWVudCAhXG4iKTsKICAgICAgICAgICAgICAgIAlyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKICAgICAgICAgfQogCkBAIC0xMDg1LDkgKzEwNjEsOSBAQAogICovCiBzdGF0aWMgRFdPUkQgd29kUmVzZXQoV09SRCB3RGV2SUQpCiB7Ci0JZHByaW50Zl9pbmZvKG1jaXdhdmUsIndvZFJlc2V0KCV1KTtcbiIsIHdEZXZJRCk7CisJVFJBQ0UobWNpd2F2ZSwiKCV1KTtcbiIsIHdEZXZJRCk7CiAJaWYgKFdPdXREZXZbd0RldklEXS51bml4ZGV2ID09IDApIHsKLQkJZHByaW50Zl93YXJuKG1jaXdhdmUsICJMaW51eCAnd29kUmVzZXQnIC8vIGNhbid0IHJlc2V0ICFcbiIpOworCQlXQVJOKG1jaXdhdmUsICJjYW4ndCByZXNldCAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJCX0KIAlyZXR1cm4gTU1TWVNFUlJfTk9FUlJPUjsKQEAgLTExMDAsMzUgKzEwNzYsMzUgQEAKIHN0YXRpYyBEV09SRCB3b2RHZXRQb3NpdGlvbihXT1JEIHdEZXZJRCwgTFBNTVRJTUUxNiBscFRpbWUsIERXT1JEIHVTaXplKQogewogCWludAkJdGltZTsKLQlkcHJpbnRmX2luZm8obWNpd2F2ZSwid29kR2V0UG9zaXRpb24oJXUsICVwLCAlbHUpO1xuIiwgd0RldklELCBscFRpbWUsIHVTaXplKTsKKwlUUkFDRShtY2l3YXZlLCIoJXUsICVwLCAlbHUpO1xuIiwgd0RldklELCBscFRpbWUsIHVTaXplKTsKIAlpZiAoV091dERldlt3RGV2SURdLnVuaXhkZXYgPT0gMCkgewotCQlkcHJpbnRmX3dhcm4obWNpd2F2ZSwgIkxpbnV4ICd3b2RHZXRQb3NpdGlvbicgLy8gY2FuJ3QgZ2V0IHBvcyAhXG4iKTsKKwkJV0FSTihtY2l3YXZlLCAiY2FuJ3QgZ2V0IHBvcyAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJfQogCWlmIChscFRpbWUgPT0gTlVMTCkJcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07Ci0JZHByaW50Zl9pbmZvKG1jaXdhdmUsIndvZEdldFBvc2l0aW9uIC8vIHdUeXBlPSUwNFggIVxuIiwgCisJVFJBQ0UobWNpd2F2ZSwid1R5cGU9JTA0WCAhXG4iLCAKIAkJCWxwVGltZS0+d1R5cGUpOwotCWRwcmludGZfaW5mbyhtY2l3YXZlLCJ3b2RHZXRQb3NpdGlvbiAvLyB3Qml0c1BlclNhbXBsZT0ldVxuIiwKKwlUUkFDRShtY2l3YXZlLCJ3Qml0c1BlclNhbXBsZT0ldVxuIiwKIAkJCVdPdXREZXZbd0RldklEXS5Gb3JtYXQud0JpdHNQZXJTYW1wbGUpOyAKLQlkcHJpbnRmX2luZm8obWNpd2F2ZSwid29kR2V0UG9zaXRpb24gLy8gblNhbXBsZXNQZXJTZWM9JWx1XG4iLAorCVRSQUNFKG1jaXdhdmUsIm5TYW1wbGVzUGVyU2VjPSVsdVxuIiwKIAkJCVdPdXREZXZbd0RldklEXS5Gb3JtYXQud2YublNhbXBsZXNQZXJTZWMpOyAKLQlkcHJpbnRmX2luZm8obWNpd2F2ZSwid29kR2V0UG9zaXRpb24gLy8gbkNoYW5uZWxzPSV1XG4iLAorCVRSQUNFKG1jaXdhdmUsIm5DaGFubmVscz0ldVxuIiwKIAkJCVdPdXREZXZbd0RldklEXS5Gb3JtYXQud2YubkNoYW5uZWxzKTsgCi0JZHByaW50Zl9pbmZvKG1jaXdhdmUsIndvZEdldFBvc2l0aW9uIC8vIG5BdmdCeXRlc1BlclNlYz0lbHVcbiIsCisJVFJBQ0UobWNpd2F2ZSwibkF2Z0J5dGVzUGVyU2VjPSVsdVxuIiwKIAkJCVdPdXREZXZbd0RldklEXS5Gb3JtYXQud2YubkF2Z0J5dGVzUGVyU2VjKTsgCiAJc3dpdGNoKGxwVGltZS0+d1R5cGUpIHsKIAljYXNlIFRJTUVfQllURVM6CiAJCWxwVGltZS0+dS5jYiA9IFdPdXREZXZbd0RldklEXS5kd1RvdGFsUGxheWVkOwotCQlkcHJpbnRmX2luZm8obWNpd2F2ZSwid29kR2V0UG9zaXRpb24gLy8gVElNRV9CWVRFUz0lbHVcbiIsIGxwVGltZS0+dS5jYik7CisJCVRSQUNFKG1jaXdhdmUsIlRJTUVfQllURVM9JWx1XG4iLCBscFRpbWUtPnUuY2IpOwogCQlicmVhazsKIAljYXNlIFRJTUVfU0FNUExFUzoKLQkJZHByaW50Zl9pbmZvKG1jaXdhdmUsIndvZEdldFBvc2l0aW9uIC8vIGR3VG90YWxQbGF5ZWQ9JWx1XG4iLCAKKwkJVFJBQ0UobWNpd2F2ZSwiZHdUb3RhbFBsYXllZD0lbHVcbiIsIAogCQkJCVdPdXREZXZbd0RldklEXS5kd1RvdGFsUGxheWVkKTsKLQkJZHByaW50Zl9pbmZvKG1jaXdhdmUsIndvZEdldFBvc2l0aW9uIC8vIHdCaXRzUGVyU2FtcGxlPSV1XG4iLCAKKwkJVFJBQ0UobWNpd2F2ZSwid0JpdHNQZXJTYW1wbGU9JXVcbiIsIAogCQkJCVdPdXREZXZbd0RldklEXS5Gb3JtYXQud0JpdHNQZXJTYW1wbGUpOwogCQlscFRpbWUtPnUuc2FtcGxlID0gV091dERldlt3RGV2SURdLmR3VG90YWxQbGF5ZWQgKiA4IC8KIAkJCQkJV091dERldlt3RGV2SURdLkZvcm1hdC53Qml0c1BlclNhbXBsZTsKLQkJZHByaW50Zl9pbmZvKG1jaXdhdmUsIndvZEdldFBvc2l0aW9uIC8vIFRJTUVfU0FNUExFUz0lbHVcbiIsIGxwVGltZS0+dS5zYW1wbGUpOworCQlUUkFDRShtY2l3YXZlLCJUSU1FX1NBTVBMRVM9JWx1XG4iLCBscFRpbWUtPnUuc2FtcGxlKTsKIAkJYnJlYWs7CiAJY2FzZSBUSU1FX1NNUFRFOgogCQl0aW1lID0gV091dERldlt3RGV2SURdLmR3VG90YWxQbGF5ZWQgLwpAQCAtMTE0MSwxOCArMTExNywxOCBAQAogCQl0aW1lIC09IGxwVGltZS0+dS5zbXB0ZS5zZWMgKiAzMDsKIAkJbHBUaW1lLT51LnNtcHRlLmZyYW1lID0gdGltZTsKIAkJbHBUaW1lLT51LnNtcHRlLmZwcyA9IDMwOwotCQlkcHJpbnRmX2luZm8obWNpd2F2ZSwKKwkJVFJBQ0UobWNpd2F2ZSwKIAkJICAid29kR2V0UG9zaXRpb24gLy8gVElNRV9TTVBURT0lMDJ1OiUwMnU6JTAydTolMDJ1XG4iLAogCQkgIGxwVGltZS0+dS5zbXB0ZS5ob3VyLCBscFRpbWUtPnUuc21wdGUubWluLAogCQkgIGxwVGltZS0+dS5zbXB0ZS5zZWMsIGxwVGltZS0+dS5zbXB0ZS5mcmFtZSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWRwcmludGZfZml4bWUobWNpd2F2ZSwgIndvZEdldFBvc2l0aW9uKCkgZm9ybWF0IG5vdCBzdXBwb3J0ZWQgISB1c2UgVElNRV9NUyAhXG4iKTsKKwkJRklYTUUobWNpd2F2ZSwgIndvZEdldFBvc2l0aW9uKCkgZm9ybWF0ICVkIG5vdCBzdXBwb3J0ZWQgISB1c2UgVElNRV9NUyAhXG4iLGxwVGltZS0+d1R5cGUpOwogCQlscFRpbWUtPndUeXBlID0gVElNRV9NUzsKIAljYXNlIFRJTUVfTVM6CiAJCWxwVGltZS0+dS5tcyA9IFdPdXREZXZbd0RldklEXS5kd1RvdGFsUGxheWVkIC8KIAkJCQkoV091dERldlt3RGV2SURdLkZvcm1hdC53Zi5uQXZnQnl0ZXNQZXJTZWMgLyAxMDAwKTsKLQkJZHByaW50Zl9pbmZvKG1jaXdhdmUsIndvZEdldFBvc2l0aW9uIC8vIFRJTUVfTVM9JWx1XG4iLCBscFRpbWUtPnUubXMpOworCQlUUkFDRShtY2l3YXZlLCJ3b2RHZXRQb3NpdGlvbiAvLyBUSU1FX01TPSVsdVxuIiwgbHBUaW1lLT51Lm1zKTsKIAkJYnJlYWs7CiAJfQogCXJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwpAQCAtMTE2NSwyMCArMTE0MSwyMCBAQAogewogCWludCAJbWl4ZXI7CiAJaW50CQl2b2x1bWUsIGxlZnQsIHJpZ2h0OwotCWRwcmludGZfaW5mbyhtY2l3YXZlLCJ3b2RHZXRWb2x1bWUoJXUsICVwKTtcbiIsIHdEZXZJRCwgbHBkd1ZvbCk7CisJVFJBQ0UobWNpd2F2ZSwiKCV1LCAlcCk7XG4iLCB3RGV2SUQsIGxwZHdWb2wpOwogCWlmIChscGR3Vm9sID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCWlmICgobWl4ZXIgPSBvcGVuKE1JWEVSX0RFViwgT19SRE9OTFkpKSA8IDApIHsKLQkJZHByaW50Zl93YXJuKG1jaXdhdmUsICJMaW51eCAnd29kR2V0Vm9sdW1lJyAvLyBtaXhlciBkZXZpY2Ugbm90IGF2YWlsYWJsZSAhXG4iKTsKKwkJV0FSTihtY2l3YXZlLCAibWl4ZXIgZGV2aWNlIG5vdCBhdmFpbGFibGUgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCX0KIAlpZiAoaW9jdGwobWl4ZXIsIFNPVU5EX01JWEVSX1JFQURfUENNLCAmdm9sdW1lKSA9PSAtMSkgewotCQlkcHJpbnRmX3dhcm4obWNpd2F2ZSwgIkxpbnV4ICd3b2RHZXRWb2x1bWUnIC8vIHVuYWJsZSByZWFkIG1peGVyICFcbiIpOworCQlXQVJOKG1jaXdhdmUsICJ1bmFibGUgcmVhZCBtaXhlciAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJfQogCWNsb3NlKG1peGVyKTsKIAlsZWZ0ID0gdm9sdW1lICYgMHg3RjsKIAlyaWdodCA9ICh2b2x1bWUgPj4gOCkgJiAweDdGOwotCWRwcmludGZfaW5mbyhtY2l3YXZlLCJMaW51eCAnd29kR2V0Vm9sdW1lJyAvLyBsZWZ0PSVkIHJpZ2h0PSVkICFcbiIsIGxlZnQsIHJpZ2h0KTsKKwlUUkFDRShtY2l3YXZlLCJsZWZ0PSVkIHJpZ2h0PSVkICFcbiIsIGxlZnQsIHJpZ2h0KTsKIAkqbHBkd1ZvbCA9IE1BS0VMT05HKGxlZnQgPDwgOSwgcmlnaHQgPDwgOSk7CiAJcmV0dXJuIE1NU1lTRVJSX05PRVJST1I7CiB9CkBAIC0xMTkxLDE1ICsxMTY3LDE1IEBACiB7CiAJaW50IAltaXhlcjsKIAlpbnQJCXZvbHVtZTsKLQlkcHJpbnRmX2luZm8obWNpd2F2ZSwid29kU2V0Vm9sdW1lKCV1LCAlMDhsWCk7XG4iLCB3RGV2SUQsIGR3UGFyYW0pOworCVRSQUNFKG1jaXdhdmUsIigldSwgJTA4bFgpO1xuIiwgd0RldklELCBkd1BhcmFtKTsKIAl2b2x1bWUgPSAoTE9XT1JEKGR3UGFyYW0pID4+IDkgJiAweDdGKSArIAogCQkoKEhJV09SRChkd1BhcmFtKSA+PiA5ICAmIDB4N0YpIDw8IDgpOwogCWlmICgobWl4ZXIgPSBvcGVuKE1JWEVSX0RFViwgT19XUk9OTFkpKSA8IDApIHsKLQkJZHByaW50Zl93YXJuKG1jaXdhdmUsCSJMaW51eCAnd29kU2V0Vm9sdW1lJyAvLyBtaXhlciBkZXZpY2Ugbm90IGF2YWlsYWJsZSAhXG4iKTsKKwkJV0FSTihtY2l3YXZlLAkibWl4ZXIgZGV2aWNlIG5vdCBhdmFpbGFibGUgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCQl9CiAgICAgaWYgKGlvY3RsKG1peGVyLCBTT1VORF9NSVhFUl9XUklURV9QQ00sICZ2b2x1bWUpID09IC0xKSB7Ci0JCWRwcmludGZfd2FybihtY2l3YXZlLCAiTGludXggJ3dvZFNldFZvbHVtZScgLy8gdW5hYmxlIHNldCBtaXhlciAhXG4iKTsKKwkJV0FSTihtY2l3YXZlLCAidW5hYmxlIHNldCBtaXhlciAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJCX0KIAljbG9zZShtaXhlcik7CkBAIC0xMjEyLDcgKzExODgsOCBAQAogRFdPUkQgd29kTWVzc2FnZShXT1JEIHdEZXZJRCwgV09SRCB3TXNnLCBEV09SRCBkd1VzZXIsIAogCQkJCQlEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIpCiB7Ci0JZHByaW50Zl9pbmZvKG1jaXdhdmUsIndvZE1lc3NhZ2UoJXUsICUwNFgsICUwOGxYLCAlMDhsWCwgJTA4bFgpO1xuIiwKKyAgaW50IGF1ZGlvOworCVRSQUNFKG1jaXdhdmUsIndvZE1lc3NhZ2UoJXUsICUwNFgsICUwOGxYLCAlMDhsWCwgJTA4bFgpO1xuIiwKIAkJCXdEZXZJRCwgd01zZywgZHdVc2VyLCBkd1BhcmFtMSwgZHdQYXJhbTIpOwogICAgICAgICBzd2l0Y2god01zZykgewogCWNhc2UgV09ETV9PUEVOOgpAQCAtMTIzNiw3ICsxMjEzLDE1IEBACiAJY2FzZSBXT0RNX0dFVERFVkNBUFM6CiAJCXJldHVybiB3b2RHZXREZXZDYXBzKHdEZXZJRCwoTFBXQVZFT1VUQ0FQUzE2KWR3UGFyYW0xLGR3UGFyYW0yKTsKIAljYXNlIFdPRE1fR0VUTlVNREVWUzoKLQkJcmV0dXJuIDFMOworCSAgLyogRklYTUU6IEZvciBub3csIG9ubHkgb25lIHNvdW5kIGRldmljZSAoU09VTkRfREVWKSBpcyBhbGxvd2VkICovCisJICBhdWRpbyA9IG9wZW4gKFNPVU5EX0RFViwgT19XUk9OTFksIDApOworCSAgaWYgKGF1ZGlvID09IC0xKQorCSAgICBpZiAoZXJybm8gPT0gRUJVU1kpCisJICAgICAgcmV0dXJuIDE7CisJICAgIGVsc2UKKwkgICAgICByZXR1cm4gMDsKKwkgIGNsb3NlIChhdWRpbyk7CisJICByZXR1cm4gMTsKIAljYXNlIFdPRE1fR0VUUElUQ0g6CiAJCXJldHVybiBNTVNZU0VSUl9OT1RTVVBQT1JURUQ7CiAJY2FzZSBXT0RNX1NFVFBJVENIOgpAQCAtMTI1NCw3ICsxMjM5LDcgQEAKIAljYXNlIFdPRE1fUkVTRVQ6CiAJCXJldHVybiB3b2RSZXNldCh3RGV2SUQpOwogCWRlZmF1bHQ6Ci0JCWRwcmludGZfd2FybihtY2l3YXZlLCJ3b2RNZXNzYWdlIC8vIHVua25vd24gbWVzc2FnZSAhXG4iKTsKKwkJV0FSTihtY2l3YXZlLCJ1bmtub3duIG1lc3NhZ2UgIVxuIik7CiAJfQogCXJldHVybiBNTVNZU0VSUl9OT1RTVVBQT1JURUQ7CiB9CkBAIC0xMjY5LDggKzEyNTQsNyBAQAogewogCWludCAJYXVkaW8sc21wbHJhdGUsc2FtcGxlc2l6ZT0xNixkc3Bfc3RlcmVvPTEsYnl0ZXNwZXJzbXBsOwogCi0JZHByaW50Zl9pbmZvKG1jaXdhdmUsCi0JCSJ3aWRHZXREZXZDYXBzKCV1LCAlcCwgJWx1KTtcbiIsIHdEZXZJRCwgbHBDYXBzLCBkd1NpemUpOworCVRSQUNFKG1jaXdhdmUsICIoJXUsICVwLCAlbHUpO1xuIiwgd0RldklELCBscENhcHMsIGR3U2l6ZSk7CiAJaWYgKGxwQ2FwcyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAlpZiAoYWNjZXNzKFNPVU5EX0RFViwwKSAhPSAwKSByZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAlhdWRpbyA9IG9wZW4gKFNPVU5EX0RFViwgT19SRE9OTFksIDApOwpAQCAtMTMyMSw4ICsxMzA1LDcgQEAKIAkJfQogCX0KIAljbG9zZShhdWRpbyk7Ci0JZHByaW50Zl9pbmZvKG1jaXdhdmUsCi0JCSJ3aWRHZXREZXZDYXBzIC8vIGR3Rm9ybWF0cyA9ICUwOGxYXG4iLCBscENhcHMtPmR3Rm9ybWF0cyk7CisJVFJBQ0UobWNpd2F2ZSwgImR3Rm9ybWF0cyA9ICUwOGxYXG4iLCBscENhcHMtPmR3Rm9ybWF0cyk7CiAJcmV0dXJuIE1NU1lTRVJSX05PRVJST1I7CiB9CiAKQEAgLTEzMzUsNDMgKzEzMTgsNDMgQEAKIAlpbnQgCQlhdWRpbyxhYnVmX3NpemUsc21wbHJhdGUsc2FtcGxlc2l6ZSxkc3Bfc3RlcmVvOwogCUxQV0FWRUZPUk1BVAlscEZvcm1hdDsKIAotCWRwcmludGZfaW5mbyhtY2l3YXZlLCAid2lkT3BlbigldSwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBEZXNjLCBkd0ZsYWdzKTsKKwlUUkFDRShtY2l3YXZlLCAiKCV1LCAlcCwgJTA4bFgpO1xuIiwgd0RldklELCBscERlc2MsIGR3RmxhZ3MpOwogCWlmIChscERlc2MgPT0gTlVMTCkgewotCQlkcHJpbnRmX3dhcm4obWNpd2F2ZSwgIkxpbnV4ICd3aWRPcGVuJyAvLyBJbnZhbGlkIFBhcmFtZXRlciAhXG4iKTsKKwkJV0FSTihtY2l3YXZlLCAiSW52YWxpZCBQYXJhbWV0ZXIgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOwogCX0KIAlpZiAod0RldklEID49IE1BWF9XQVZJTkRSVikgewotCQlkcHJpbnRmX2luZm8obWNpd2F2ZSwiTGludXggJ3dpZE9wZW4nIC8vIE1BWF9XQVZJTkRSViByZWFjaGVkICFcbiIpOworCQlUUkFDRShtY2l3YXZlLCJNQVhfV0FWSU5EUlYgcmVhY2hlZCAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX0FMTE9DQVRFRDsKIAl9CiAJV0luRGV2W3dEZXZJRF0udW5peGRldiA9IDA7CiAJaWYgKGFjY2VzcyhTT1VORF9ERVYsMCkgIT0gMCkgcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJYXVkaW8gPSBvcGVuIChTT1VORF9ERVYsIE9fUkRPTkxZLCAwKTsKIAlpZiAoYXVkaW8gPT0gLTEpIHsKLQkJZHByaW50Zl93YXJuKG1jaXdhdmUsIkxpbnV4ICd3aWRPcGVuJyAvLyBjYW4ndCBvcGVuICFcbiIpOworCQlXQVJOKG1jaXdhdmUsImNhbid0IG9wZW4gIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9BTExPQ0FURUQ7CiAJfQogCUlPQ1RMKGF1ZGlvLCBTTkRDVExfRFNQX0dFVEJMS1NJWkUsIGFidWZfc2l6ZSk7CiAJaWYgKGFidWZfc2l6ZSA8IDEwMjQgfHwgYWJ1Zl9zaXplID4gNjU1MzYpIHsKIAkJaWYgKGFidWZfc2l6ZSA9PSAtMSkKLQkJCWRwcmludGZfd2FybihtY2l3YXZlLCAiTGludXggJ3dpZE9wZW4nIC8vIElPQ1RMIGNhbid0ICdTTkRDVExfRFNQX0dFVEJMS1NJWkUnICFcbiIpOworCQkJV0FSTihtY2l3YXZlLCAiSU9DVEwgY2FuJ3QgJ1NORENUTF9EU1BfR0VUQkxLU0laRScgIVxuIik7CiAJCWVsc2UKLQkJCWRwcmludGZfd2FybihtY2l3YXZlLCAiTGludXggJ3dpZE9wZW4nIC8vIFNORENUTF9EU1BfR0VUQkxLU0laRSBJbnZhbGlkIGJ1ZnNpemUgIVxuIik7CisJCQlXQVJOKG1jaXdhdmUsICJTTkRDVExfRFNQX0dFVEJMS1NJWkUgSW52YWxpZCBidWZzaXplICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAl9CiAJV0luRGV2W3dEZXZJRF0ud0ZsYWdzID0gSElXT1JEKGR3RmxhZ3MgJiBDQUxMQkFDS19UWVBFTUFTSyk7CiAJc3dpdGNoKFdJbkRldlt3RGV2SURdLndGbGFncykgewogCWNhc2UgRENCX05VTEw6Ci0JCWRwcmludGZfaW5mbyhtY2l3YXZlLCJMaW51eCAnd2lkT3BlbicgLy8gQ0FMTEJBQ0tfTlVMTCFcbiIpOworCQlUUkFDRShtY2l3YXZlLCJDQUxMQkFDS19OVUxMIVxuIik7CiAJCWJyZWFrOwogCWNhc2UgRENCX1dJTkRPVzoKLQkJZHByaW50Zl9pbmZvKG1jaXdhdmUsIkxpbnV4ICd3aWRPcGVuJyAvLyBDQUxMQkFDS19XSU5ET1chXG4iKTsKKwkJVFJBQ0UobWNpd2F2ZSwiQ0FMTEJBQ0tfV0lORE9XIVxuIik7CiAJCWJyZWFrOwogCWNhc2UgRENCX1RBU0s6Ci0JCWRwcmludGZfaW5mbyhtY2l3YXZlLCJMaW51eCAnd2lkT3BlbicgLy8gQ0FMTEJBQ0tfVEFTSyFcbiIpOworCQlUUkFDRShtY2l3YXZlLCJDQUxMQkFDS19UQVNLIVxuIik7CiAJCWJyZWFrOwogCWNhc2UgRENCX0ZVTkNUSU9OOgotCQlkcHJpbnRmX2luZm8obWNpd2F2ZSwiTGludXggJ3dpZE9wZW4nIC8vIENBTExCQUNLX0ZVTkNUSU9OIVxuIik7CisJCVRSQUNFKG1jaXdhdmUsIkNBTExCQUNLX0ZVTkNUSU9OIVxuIik7CiAJCWJyZWFrOwogCX0KIAlpZiAoV0luRGV2W3dEZXZJRF0ubHBRdWV1ZUhkcikgewpAQCAtMTM4NCw3ICsxMzY3LDcgQEAKIAltZW1jcHkoJldJbkRldlt3RGV2SURdLndhdmVEZXNjLCBscERlc2MsIHNpemVvZihXQVZFT1BFTkRFU0MpKTsKICAgICAgICAgbHBGb3JtYXQgPSAoTFBXQVZFRk9STUFUKSBscERlc2MtPmxwRm9ybWF0OyAKIAlpZiAobHBGb3JtYXQtPndGb3JtYXRUYWcgIT0gV0FWRV9GT1JNQVRfUENNKSB7Ci0JCWRwcmludGZfd2FybihtY2l3YXZlLCAiTGludXggJ3dpZE9wZW4nIC8vIEJhZCBmb3JtYXQgJTA0WCAhXG4iLAorCQlXQVJOKG1jaXdhdmUsICJCYWQgZm9ybWF0ICUwNFggIVxuIiwKIAkJCQkJbHBGb3JtYXQtPndGb3JtYXRUYWcpOwogCQlyZXR1cm4gV0FWRVJSX0JBREZPUk1BVDsKIAl9CkBAIC0xNDA0LDE2ICsxMzg3LDE2IEBACiAJSU9DVEwoYXVkaW8sIFNORENUTF9EU1BfU1BFRUQsIHNtcGxyYXRlKTsKIAlJT0NUTChhdWRpbywgU05EQ1RMX0RTUF9TQU1QTEVTSVpFLCBzYW1wbGVzaXplKTsKIAlJT0NUTChhdWRpbywgU05EQ1RMX0RTUF9TVEVSRU8sIGRzcF9zdGVyZW8pOwotCWRwcmludGZfaW5mbyhtY2l3YXZlLCJMaW51eCAnd2lkT3BlbicgLy8gd0JpdHNQZXJTYW1wbGU9JXUgIVxuIiwKKwlUUkFDRShtY2l3YXZlLCJ3Qml0c1BlclNhbXBsZT0ldSAhXG4iLAogCQkJCVdJbkRldlt3RGV2SURdLkZvcm1hdC53Qml0c1BlclNhbXBsZSk7Ci0JZHByaW50Zl9pbmZvKG1jaXdhdmUsIkxpbnV4ICd3aWRPcGVuJyAvLyBuU2FtcGxlc1BlclNlYz0lbHUgIVxuIiwKKwlUUkFDRShtY2l3YXZlLCJuU2FtcGxlc1BlclNlYz0lbHUgIVxuIiwKIAkJCQlXSW5EZXZbd0RldklEXS5Gb3JtYXQud2YublNhbXBsZXNQZXJTZWMpOwotCWRwcmludGZfaW5mbyhtY2l3YXZlLCJMaW51eCAnd2lkT3BlbicgLy8gbkNoYW5uZWxzPSV1ICFcbiIsCisJVFJBQ0UobWNpd2F2ZSwibkNoYW5uZWxzPSV1ICFcbiIsCiAJCQkJV0luRGV2W3dEZXZJRF0uRm9ybWF0LndmLm5DaGFubmVscyk7Ci0JZHByaW50Zl9pbmZvKG1jaXdhdmUsIkxpbnV4ICd3aWRPcGVuJyAvLyBuQXZnQnl0ZXNQZXJTZWM9JWx1XG4iLAorCVRSQUNFKG1jaXdhdmUsIm5BdmdCeXRlc1BlclNlYz0lbHVcbiIsCiAJCQlXSW5EZXZbd0RldklEXS5Gb3JtYXQud2YubkF2Z0J5dGVzUGVyU2VjKTsgCiAJaWYgKFdBVkVfTm90aWZ5Q2xpZW50KHdEZXZJRCwgV0lNX09QRU4sIDBMLCAwTCkgIT0gTU1TWVNFUlJfTk9FUlJPUikgewotCQlkcHJpbnRmX3dhcm4obWNpd2F2ZSwiTGludXggJ3dpZE9wZW4nIC8vIGNhbid0IG5vdGlmeSBjbGllbnQgIVxuIik7CisJCVdBUk4obWNpd2F2ZSwiY2FuJ3Qgbm90aWZ5IGNsaWVudCAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07CiAJfQogCXJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwpAQCAtMTQyNCwyMSArMTQwNywyMSBAQAogICovCiBzdGF0aWMgRFdPUkQgd2lkQ2xvc2UoV09SRCB3RGV2SUQpCiB7Ci0JZHByaW50Zl9pbmZvKG1jaXdhdmUsIndpZENsb3NlKCV1KTtcbiIsIHdEZXZJRCk7CisJVFJBQ0UobWNpd2F2ZSwiKCV1KTtcbiIsIHdEZXZJRCk7CiAJaWYgKHdEZXZJRCA+IE1BWF9XQVZJTkRSVikgcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07CiAJaWYgKFdJbkRldlt3RGV2SURdLnVuaXhkZXYgPT0gMCkgewotCQlkcHJpbnRmX3dhcm4obWNpd2F2ZSwiTGludXggJ3dpZENsb3NlJyAvLyBjYW4ndCBjbG9zZSAhXG4iKTsKKwkJV0FSTihtY2l3YXZlLCJjYW4ndCBjbG9zZSAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJfQogCWlmIChXSW5EZXZbd0RldklEXS5scFF1ZXVlSGRyICE9IE5VTEwpIHsKLQkgICAgICAgIGRwcmludGZfd2FybihtY2l3YXZlLCAibGludXggJ3dpZGNsb3NlJyAvLyBzdGlsbCBidWZmZXJzIG9wZW4gIVxuIik7CisJICAgICAgICBXQVJOKG1jaXdhdmUsICJzdGlsbCBidWZmZXJzIG9wZW4gIVxuIik7CiAJCXJldHVybiBXQVZFUlJfU1RJTExQTEFZSU5HOwogCX0KIAljbG9zZShXSW5EZXZbd0RldklEXS51bml4ZGV2KTsKIAlXSW5EZXZbd0RldklEXS51bml4ZGV2ID0gMDsKIAlXSW5EZXZbd0RldklEXS5idWZzaXplID0gMDsKIAlpZiAoV0FWRV9Ob3RpZnlDbGllbnQod0RldklELCBXSU1fQ0xPU0UsIDBMLCAwTCkgIT0gTU1TWVNFUlJfTk9FUlJPUikgewotCQlkcHJpbnRmX3dhcm4obWNpd2F2ZSwiTGludXggJ3dpZENsb3NlJyAvLyBjYW4ndCBub3RpZnkgY2xpZW50ICFcbiIpOworCQlXQVJOKG1jaXdhdmUsImNhbid0IG5vdGlmeSBjbGllbnQgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOwogCX0KIAlyZXR1cm4gTU1TWVNFUlJfTk9FUlJPUjsKQEAgLTE0NTIsMTggKzE0MzUsMTcgQEAKIAlpbnQJCWNvdW50CT0gMTsKIAlMUFdBVkVIRFIgCWxwV0lIZHI7CiAKLQlkcHJpbnRmX2luZm8obWNpd2F2ZSwKLQkJIndpZEFkZEJ1ZmZlcigldSwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBXYXZlSGRyLCBkd1NpemUpOworCVRSQUNFKG1jaXdhdmUsICIoJXUsICVwLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGxwV2F2ZUhkciwgZHdTaXplKTsKIAlpZiAoV0luRGV2W3dEZXZJRF0udW5peGRldiA9PSAwKSB7Ci0JCWRwcmludGZfd2FybihtY2l3YXZlLCJMaW51eCAnd2lkQWRkQnVmZmVyJyAvLyBjYW4ndCBkbyBpdCAhXG4iKTsKKwkJV0FSTihtY2l3YXZlLCJjYW4ndCBkbyBpdCAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJfQogCWlmICghKGxwV2F2ZUhkci0+ZHdGbGFncyAmIFdIRFJfUFJFUEFSRUQpKSB7Ci0JCWRwcmludGZfaW5mbyhtY2l3YXZlLAkiTGludXggJ3dpZEFkZEJ1ZmZlcicgLy8gbmV2ZXIgYmVlbiBwcmVwYXJlZCAhXG4iKTsKKwkJVFJBQ0UobWNpd2F2ZSwgIm5ldmVyIGJlZW4gcHJlcGFyZWQgIVxuIik7CiAJCXJldHVybiBXQVZFUlJfVU5QUkVQQVJFRDsKIAl9CiAJaWYgKGxwV2F2ZUhkci0+ZHdGbGFncyAmIFdIRFJfSU5RVUVVRSkgewotCQlkcHJpbnRmX2luZm8obWNpd2F2ZSwJIkxpbnV4ICd3aWRBZGRCdWZmZXInIC8vIGhlYWRlciBhbHJlYWR5IGluIHVzZSAhXG4iKTsKKwkJVFJBQ0UobWNpd2F2ZSwJImhlYWRlciBhbHJlYWR5IGluIHVzZSAhXG4iKTsKIAkJcmV0dXJuIFdBVkVSUl9TVElMTFBMQVlJTkc7CiAJfQogCWxwV2F2ZUhkci0+ZHdGbGFncyB8PSBXSERSX1BSRVBBUkVEOwpAQCAtMTQ4Miw4ICsxNDY0LDcgQEAKIAkJbHBXYXZlSGRyLT5scE5leHQgPSBOVUxMOwogCQljb3VudCsrOwogCX0KLQlkcHJpbnRmX2luZm8obWNpd2F2ZSwKLQkJIndpZEFkZEJ1ZmZlciAvLyBidWZmZXIgYWRkZWQgISAobm93ICV1IGluIHF1ZXVlKVxuIiwgY291bnQpOworCVRSQUNFKG1jaXdhdmUsICJidWZmZXIgYWRkZWQgISAobm93ICV1IGluIHF1ZXVlKVxuIiwgY291bnQpOwogCXJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwogfQogCkBAIC0xNDkyLDEwICsxNDczLDkgQEAKICAqLwogc3RhdGljIERXT1JEIHdpZFByZXBhcmUoV09SRCB3RGV2SUQsIExQV0FWRUhEUiBscFdhdmVIZHIsIERXT1JEIGR3U2l6ZSkKIHsKLQlkcHJpbnRmX2luZm8obWNpd2F2ZSwKLQkJIndpZFByZXBhcmUoJXUsICVwLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGxwV2F2ZUhkciwgZHdTaXplKTsKKwlUUkFDRShtY2l3YXZlLCAiKCV1LCAlcCwgJTA4bFgpO1xuIiwgd0RldklELCBscFdhdmVIZHIsIGR3U2l6ZSk7CiAJaWYgKFdJbkRldlt3RGV2SURdLnVuaXhkZXYgPT0gMCkgewotCQlkcHJpbnRmX3dhcm4obWNpd2F2ZSwiTGludXggJ3dpZFByZXBhcmUnIC8vIGNhbid0IHByZXBhcmUgIVxuIik7CisJCVdBUk4obWNpd2F2ZSwiY2FuJ3QgcHJlcGFyZSAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJfQogCWlmIChscFdhdmVIZHItPmR3RmxhZ3MgJiBXSERSX0lOUVVFVUUpCkBAIC0xNTA0LDcgKzE0ODQsNyBAQAogCWxwV2F2ZUhkci0+ZHdGbGFncyAmPSB+V0hEUl9JTlFVRVVFOwogCWxwV2F2ZUhkci0+ZHdGbGFncyAmPSB+V0hEUl9ET05FOwogCWxwV2F2ZUhkci0+ZHdCeXRlc1JlY29yZGVkID0gMDsKLQlkcHJpbnRmX2luZm8obWNpd2F2ZSwiTGludXggJ3dpZFByZXBhcmUnIC8vIGhlYWRlciBwcmVwYXJlZCAhXG4iKTsKKwlUUkFDRShtY2l3YXZlLCJoZWFkZXIgcHJlcGFyZWQgIVxuIik7CiAJcmV0dXJuIE1NU1lTRVJSX05PRVJST1I7CiB9CiAKQEAgLTE1MTMsMTcgKzE0OTMsMTYgQEAKICAqLwogc3RhdGljIERXT1JEIHdpZFVucHJlcGFyZShXT1JEIHdEZXZJRCwgTFBXQVZFSERSIGxwV2F2ZUhkciwgRFdPUkQgZHdTaXplKQogewotCWRwcmludGZfaW5mbyhtY2l3YXZlLAotCQkid2lkVW5wcmVwYXJlKCV1LCAlcCwgJTA4bFgpO1xuIiwgd0RldklELCBscFdhdmVIZHIsIGR3U2l6ZSk7CisJVFJBQ0UobWNpd2F2ZSwgIigldSwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBXYXZlSGRyLCBkd1NpemUpOwogCWlmIChXSW5EZXZbd0RldklEXS51bml4ZGV2ID09IDApIHsKLQkJZHByaW50Zl93YXJuKG1jaXdhdmUsIkxpbnV4ICd3aWRVbnByZXBhcmUnIC8vIGNhbid0IHVucHJlcGFyZSAhXG4iKTsKKwkJV0FSTihtY2l3YXZlLCJjYW4ndCB1bnByZXBhcmUgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCX0KIAlscFdhdmVIZHItPmR3RmxhZ3MgJj0gfldIRFJfUFJFUEFSRUQ7CiAJbHBXYXZlSGRyLT5kd0ZsYWdzICY9IH5XSERSX0lOUVVFVUU7CiAJbHBXYXZlSGRyLT5kd0ZsYWdzIHw9IFdIRFJfRE9ORTsKIAotCWRwcmludGZfaW5mbyhtY2l3YXZlLCAiTGludXggJ3dpZFVucHJlcGFyZScgLy8gYWxsIGhlYWRlcnMgdW5wcmVwYXJlZCAhXG4iKTsKKwlUUkFDRShtY2l3YXZlLCAiYWxsIGhlYWRlcnMgdW5wcmVwYXJlZCAhXG4iKTsKIAlyZXR1cm4gTU1TWVNFUlJfTk9FUlJPUjsKIH0KIApAQCAtMTUzNywyMyArMTUxNiwyMiBAQAogCUxQV0FWRUhEUiAJbHBXSUhkcjsKIAlMUFdBVkVIRFIJKmxwV2F2ZUhkcjsKIAotCWRwcmludGZfaW5mbyhtY2l3YXZlLCJ3aWRTdGFydCgldSk7XG4iLCB3RGV2SUQpOworCVRSQUNFKG1jaXdhdmUsIigldSk7XG4iLCB3RGV2SUQpOwogCWlmIChXSW5EZXZbd0RldklEXS51bml4ZGV2ID09IDApIHsKLQkJZHByaW50Zl93YXJuKG1jaXdhdmUsCSJMaW51eCAnd2lkU3RhcnQnIC8vIGNhbid0IHN0YXJ0IHJlY29yZGluZyAhXG4iKTsKKwkJV0FSTihtY2l3YXZlLCAiY2FuJ3Qgc3RhcnQgcmVjb3JkaW5nICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAl9CiAKIAlscFdhdmVIZHIgPSAmKFdJbkRldlt3RGV2SURdLmxwUXVldWVIZHIpOwotCWRwcmludGZfaW5mbyhtY2l3YXZlLCJMaW51eCAnd2lkc3RhcnQnLy8gbHBXYXZlSGRyID0gJTA4bHhcbiIsKERXT1JEKWxwV2F2ZUhkcik7CisJVFJBQ0UobWNpd2F2ZSwibHBXYXZlSGRyID0gJTA4bHhcbiIsKERXT1JEKWxwV2F2ZUhkcik7CiAJaWYgKCEqbHBXYXZlSGRyIHx8ICEoKmxwV2F2ZUhkciktPmxwRGF0YSkgewotCQlkcHJpbnRmX2luZm8obWNpd2F2ZSwiTGludXggJ3dpZFN0YXJ0JyAvLyBuZXZlciBiZWVuIHByZXBhcmVkICFcbiIpOworCQlUUkFDRShtY2l3YXZlLCJuZXZlciBiZWVuIHByZXBhcmVkICFcbiIpOwogCQlyZXR1cm4gV0FWRVJSX1VOUFJFUEFSRUQ7CiAJfQogCiAJd2hpbGUoKmxwV2F2ZUhkciAhPSBOVUxMKSB7CiAJICAgICAgICBscFdJSGRyID0gKmxwV2F2ZUhkcjsKLQkJZHByaW50Zl9pbmZvKG1jaXdhdmUsCi0JCQkid2lkU3RhcnQgLy8gcmVjb3JkaW5nIGJ1ZiMldT0lcCBzaXplPSVsdSBcbiIsCisJCVRSQUNFKG1jaXdhdmUsICJyZWNvcmRpbmcgYnVmIyV1PSVwIHNpemU9JWx1IFxuIiwKIAkJCWNvdW50LCBscFdJSGRyLT5scERhdGEsIGxwV0lIZHItPmR3QnVmZmVyTGVuZ3RoKTsKIAkJZmZsdXNoKHN0ZGRlYik7CiAJCWJ5dGVzUmVhZCA9IHJlYWQgKFdJbkRldlt3RGV2SURdLnVuaXhkZXYsIApAQCAtMTU2OSwxNCArMTU0NywxNCBAQAogCiAJCS8qIEZJWE1FOiBzaG91bGQgcGFzcyBzZWdtZW50ZWQgcG9pbnRlciBoZXJlLCBkbyB3ZSBuZWVkIHRoYXQ/Ki8KIAkJaWYgKFdBVkVfTm90aWZ5Q2xpZW50KHdEZXZJRCwgV0lNX0RBVEEsIChEV09SRClscFdhdmVIZHIsIGxwV0lIZHItPmR3Qnl0ZXNSZWNvcmRlZCkgIT0gTU1TWVNFUlJfTk9FUlJPUikgewotCQkJZHByaW50Zl93YXJuKG1jaXdhdmUsCSJMaW51eCAnd2lkU3RhcnQnIC8vIGNhbid0IG5vdGlmeSBjbGllbnQgIVxuIik7CisJCQlXQVJOKG1jaXdhdmUsICJjYW4ndCBub3RpZnkgY2xpZW50ICFcbiIpOwogCQkJcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07CiAJCX0KIAkJLyogcmVtb3ZlcyB0aGUgY3VycmVudCBibG9jayBmcm9tIHRoZSBxdWV1ZSAqLwogCQkqbHBXYXZlSGRyID0gbHBXSUhkci0+bHBOZXh0OwogCQljb3VudCsrOwogCX0KLQlkcHJpbnRmX2luZm8obWNpd2F2ZSwid2lkU3RhcnQgLy8gZW5kIG9mIHJlY29yZGluZyAhXG4iKTsKKwlUUkFDRShtY2l3YXZlLCJlbmQgb2YgcmVjb3JkaW5nICFcbiIpOwogCWZmbHVzaChzdGRkZWIpOwogCXJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwogfQpAQCAtMTU4Niw5ICsxNTY0LDkgQEAKICAqLwogc3RhdGljIERXT1JEIHdpZFN0b3AoV09SRCB3RGV2SUQpCiB7Ci0JZHByaW50Zl9pbmZvKG1jaXdhdmUsIndpZFN0b3AoJXUpO1xuIiwgd0RldklEKTsKKwlUUkFDRShtY2l3YXZlLCIoJXUpO1xuIiwgd0RldklEKTsKIAlpZiAoV0luRGV2W3dEZXZJRF0udW5peGRldiA9PSAwKSB7Ci0JCWRwcmludGZfd2FybihtY2l3YXZlLCJMaW51eCAnd2lkU3RvcCcgLy8gY2FuJ3Qgc3RvcCAhXG4iKTsKKwkJV0FSTihtY2l3YXZlLCJjYW4ndCBzdG9wICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAl9CiAJcmV0dXJuIE1NU1lTRVJSX05PRVJST1I7CkBAIC0xNTk5LDkgKzE1NzcsOSBAQAogICovCiBzdGF0aWMgRFdPUkQgd2lkUmVzZXQoV09SRCB3RGV2SUQpCiB7Ci0JZHByaW50Zl9pbmZvKG1jaXdhdmUsIndpZFJlc2V0KCV1KTtcbiIsIHdEZXZJRCk7CisJVFJBQ0UobWNpd2F2ZSwiKCV1KTtcbiIsIHdEZXZJRCk7CiAJaWYgKFdJbkRldlt3RGV2SURdLnVuaXhkZXYgPT0gMCkgewotCQlkcHJpbnRmX3dhcm4obWNpd2F2ZSwiTGludXggJ3dpZFJlc2V0JyAvLyBjYW4ndCByZXNldCAhXG4iKTsKKwkJV0FSTihtY2l3YXZlLCJjYW4ndCByZXNldCAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJfQogCXJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwpAQCAtMTYxNCwzNiArMTU5MiwzMiBAQAogewogCWludAkJdGltZTsKICAgICAKLQlkcHJpbnRmX2luZm8obWNpd2F2ZSwKLQkJIndpZEdldFBvc2l0aW9uKCV1LCAlcCwgJWx1KTtcbiIsIHdEZXZJRCwgbHBUaW1lLCB1U2l6ZSk7CisJVFJBQ0UobWNpd2F2ZSwgIigldSwgJXAsICVsdSk7XG4iLCB3RGV2SUQsIGxwVGltZSwgdVNpemUpOwogCWlmIChXSW5EZXZbd0RldklEXS51bml4ZGV2ID09IDApIHsKLQkJZHByaW50Zl93YXJuKG1jaXdhdmUsIkxpbnV4ICd3aWRHZXRQb3NpdGlvbicgLy8gY2FuJ3QgZ2V0IHBvcyAhXG4iKTsKKwkJV0FSTihtY2l3YXZlLCJjYW4ndCBnZXQgcG9zICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAl9CiAJaWYgKGxwVGltZSA9PSBOVUxMKQlyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKLQlkcHJpbnRmX2luZm8obWNpd2F2ZSwid2lkR2V0UG9zaXRpb24gLy8gd1R5cGU9JTA0WCAhXG4iLCAKKwlUUkFDRShtY2l3YXZlLCJ3VHlwZT0lMDRYICFcbiIsIAogCQkJbHBUaW1lLT53VHlwZSk7Ci0JZHByaW50Zl9pbmZvKG1jaXdhdmUsIndpZEdldFBvc2l0aW9uIC8vIHdCaXRzUGVyU2FtcGxlPSV1XG4iLAorCVRSQUNFKG1jaXdhdmUsIndCaXRzUGVyU2FtcGxlPSV1XG4iLAogCQkJV0luRGV2W3dEZXZJRF0uRm9ybWF0LndCaXRzUGVyU2FtcGxlKTsgCi0JZHByaW50Zl9pbmZvKG1jaXdhdmUsIndpZEdldFBvc2l0aW9uIC8vIG5TYW1wbGVzUGVyU2VjPSVsdVxuIiwKKwlUUkFDRShtY2l3YXZlLCJuU2FtcGxlc1BlclNlYz0lbHVcbiIsCiAJCQlXSW5EZXZbd0RldklEXS5Gb3JtYXQud2YublNhbXBsZXNQZXJTZWMpOyAKLQlkcHJpbnRmX2luZm8obWNpd2F2ZSwid2lkR2V0UG9zaXRpb24gLy8gbkNoYW5uZWxzPSV1XG4iLAorCVRSQUNFKG1jaXdhdmUsIm5DaGFubmVscz0ldVxuIiwKIAkJCVdJbkRldlt3RGV2SURdLkZvcm1hdC53Zi5uQ2hhbm5lbHMpOyAKLQlkcHJpbnRmX2luZm8obWNpd2F2ZSwid2lkR2V0UG9zaXRpb24gLy8gbkF2Z0J5dGVzUGVyU2VjPSVsdVxuIiwKKwlUUkFDRShtY2l3YXZlLCJuQXZnQnl0ZXNQZXJTZWM9JWx1XG4iLAogCQkJV0luRGV2W3dEZXZJRF0uRm9ybWF0LndmLm5BdmdCeXRlc1BlclNlYyk7IAogCWZmbHVzaChzdGRkZWIpOwogCXN3aXRjaChscFRpbWUtPndUeXBlKSB7CiAJY2FzZSBUSU1FX0JZVEVTOgogCQlscFRpbWUtPnUuY2IgPSBXSW5EZXZbd0RldklEXS5kd1RvdGFsUmVjb3JkZWQ7Ci0JCWRwcmludGZfaW5mbyhtY2l3YXZlLAotCQkgICAgIndpZEdldFBvc2l0aW9uIC8vIFRJTUVfQllURVM9JWx1XG4iLCBscFRpbWUtPnUuY2IpOworCQlUUkFDRShtY2l3YXZlLCJUSU1FX0JZVEVTPSVsdVxuIiwgbHBUaW1lLT51LmNiKTsKIAkJYnJlYWs7CiAJY2FzZSBUSU1FX1NBTVBMRVM6CiAJCWxwVGltZS0+dS5zYW1wbGUgPSBXSW5EZXZbd0RldklEXS5kd1RvdGFsUmVjb3JkZWQgKiA4IC8KIAkJCQkgIFdJbkRldlt3RGV2SURdLkZvcm1hdC53Qml0c1BlclNhbXBsZTsKLQkJZHByaW50Zl9pbmZvKG1jaXdhdmUsCi0JCQkJIndpZEdldFBvc2l0aW9uIC8vIFRJTUVfU0FNUExFUz0lbHVcbiIsIAotCQkJCWxwVGltZS0+dS5zYW1wbGUpOworCQlUUkFDRShtY2l3YXZlLCAiVElNRV9TQU1QTEVTPSVsdVxuIiwgbHBUaW1lLT51LnNhbXBsZSk7CiAJCWJyZWFrOwogCWNhc2UgVElNRV9TTVBURToKIAkJdGltZSA9IFdJbkRldlt3RGV2SURdLmR3VG90YWxSZWNvcmRlZCAvCkBAIC0xNjU2LDE4ICsxNjMwLDE3IEBACiAJCXRpbWUgLT0gbHBUaW1lLT51LnNtcHRlLnNlYyAqIDMwOwogCQlscFRpbWUtPnUuc21wdGUuZnJhbWUgPSB0aW1lOwogCQlscFRpbWUtPnUuc21wdGUuZnBzID0gMzA7Ci1kcHJpbnRmX2luZm8obWNpd2F2ZSwid2lkR2V0UG9zaXRpb24gLy8gVElNRV9TTVBURT0lMDJ1OiUwMnU6JTAydTolMDJ1XG4iLAotCQkJCWxwVGltZS0+dS5zbXB0ZS5ob3VyLCBscFRpbWUtPnUuc21wdGUubWluLAotCQkJCWxwVGltZS0+dS5zbXB0ZS5zZWMsIGxwVGltZS0+dS5zbXB0ZS5mcmFtZSk7CisJCVRSQUNFKG1jaXdhdmUsIlRJTUVfU01QVEU9JTAydTolMDJ1OiUwMnU6JTAydVxuIiwKKwkJCSAgICAgbHBUaW1lLT51LnNtcHRlLmhvdXIsIGxwVGltZS0+dS5zbXB0ZS5taW4sCisJCQkgICAgIGxwVGltZS0+dS5zbXB0ZS5zZWMsIGxwVGltZS0+dS5zbXB0ZS5mcmFtZSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWRwcmludGZfZml4bWUobWNpd2F2ZSwgIndpZEdldFBvc2l0aW9uKCkgZm9ybWF0IG5vdCBzdXBwb3J0ZWQgISB1c2UgVElNRV9NUyAhXG4iKTsKKwkJRklYTUUobWNpd2F2ZSwgImZvcm1hdCBub3Qgc3VwcG9ydGVkICEgdXNlIFRJTUVfTVMgIVxuIik7CiAJCWxwVGltZS0+d1R5cGUgPSBUSU1FX01TOwogCWNhc2UgVElNRV9NUzoKIAkJbHBUaW1lLT51Lm1zID0gV0luRGV2W3dEZXZJRF0uZHdUb3RhbFJlY29yZGVkIC8KIAkJCQkoV0luRGV2W3dEZXZJRF0uRm9ybWF0LndmLm5BdmdCeXRlc1BlclNlYyAvIDEwMDApOwotCQlkcHJpbnRmX2luZm8obWNpd2F2ZSwKLQkJICAgICAgIndpZEdldFBvc2l0aW9uIC8vIFRJTUVfTVM9JWx1XG4iLCBscFRpbWUtPnUubXMpOworCQlUUkFDRShtY2l3YXZlLCAiVElNRV9NUz0lbHVcbiIsIGxwVGltZS0+dS5tcyk7CiAJCWJyZWFrOwogCX0KIAlyZXR1cm4gTU1TWVNFUlJfTk9FUlJPUjsKQEAgLTE2NzksNyArMTY1Miw4IEBACiBEV09SRCB3aWRNZXNzYWdlKFdPUkQgd0RldklELCBXT1JEIHdNc2csIERXT1JEIGR3VXNlciwgCiAJCQkJCURXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMikKIHsKLQlkcHJpbnRmX2luZm8obWNpd2F2ZSwid2lkTWVzc2FnZSgldSwgJTA0WCwgJTA4bFgsICUwOGxYLCAlMDhsWCk7XG4iLAorICBpbnQgYXVkaW87CisJVFJBQ0UobWNpd2F2ZSwid2lkTWVzc2FnZSgldSwgJTA0WCwgJTA4bFgsICUwOGxYLCAlMDhsWCk7XG4iLAogCQkJd0RldklELCB3TXNnLCBkd1VzZXIsIGR3UGFyYW0xLCBkd1BhcmFtMik7CiAJc3dpdGNoKHdNc2cpIHsKIAljYXNlIFdJRE1fT1BFTjoKQEAgLTE2OTUsNiArMTY2OSwxNCBAQAogCWNhc2UgV0lETV9HRVRERVZDQVBTOgogCQlyZXR1cm4gd2lkR2V0RGV2Q2Fwcyh3RGV2SUQsIChMUFdBVkVJTkNBUFMxNilkd1BhcmFtMSxkd1BhcmFtMik7CiAJY2FzZSBXSURNX0dFVE5VTURFVlM6CisJICAvKiBGSVhNRTogRm9yIG5vdywgb25seSBvbmUgc291bmQgZGV2aWNlIChTT1VORF9ERVYpIGlzIGFsbG93ZWQgKi8KKwkgIGF1ZGlvID0gb3BlbiAoU09VTkRfREVWLCBPX1JET05MWSwgMCk7CisJICBpZiAoYXVkaW8gPT0gLTEpCisJICAgIGlmIChlcnJubyA9PSBFQlVTWSkKKwkgICAgICByZXR1cm4gMTsKKwkgICAgZWxzZQorCSAgICAgIHJldHVybiAwOworCSAgY2xvc2UgKGF1ZGlvKTsKIAkJcmV0dXJuIDE7CiAJY2FzZSBXSURNX0dFVFBPUzoKIAkJcmV0dXJuIHdpZEdldFBvc2l0aW9uKHdEZXZJRCwgKExQTU1USU1FMTYpZHdQYXJhbTEsIGR3UGFyYW0yKTsKQEAgLTE3MDcsNyArMTY4OSw3IEBACiAJY2FzZSBXSURNX1NUT1A6CiAJCXJldHVybiB3aWRTdG9wKHdEZXZJRCk7CiAJZGVmYXVsdDoKLQkJZHByaW50Zl93YXJuKG1jaXdhdmUsIndpZE1lc3NhZ2UgLy8gdW5rbm93biBtZXNzYWdlICFcbiIpOworCQlXQVJOKG1jaXdhdmUsInVua25vd24gbWVzc2FnZSAhXG4iKTsKIAl9CiAJcmV0dXJuIE1NU1lTRVJSX05PVFNVUFBPUlRFRDsKIH0KQEAgLTE3MTksNyArMTcwMSw3IEBACiBMT05HIFdBVkVfRHJpdmVyUHJvYyhEV09SRCBkd0RldklELCBIRFJWUjE2IGhEcml2LCBXT1JEIHdNc2csIAogCQkgICAgIERXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMikKIHsKLQlkcHJpbnRmX2luZm8obWNpd2F2ZSwiV0FWRV9Ecml2ZXJQcm9jKCUwOGxYLCAlMDRYLCAlMDRYLCAlMDhsWCwgJTA4bFgpXG4iLCAKKwlUUkFDRShtY2l3YXZlLCIoJTA4bFgsICUwNFgsICUwNFgsICUwOGxYLCAlMDhsWClcbiIsIAogCQlkd0RldklELCBoRHJpdiwgd01zZywgZHdQYXJhbTEsIGR3UGFyYW0yKTsKIAlzd2l0Y2god01zZykgewogCWNhc2UgRFJWX0xPQUQ6CmRpZmYgLS1naXQgYS9tdWx0aW1lZGlhL2Rzb3VuZC5jIGIvbXVsdGltZWRpYS9kc291bmQuYwppbmRleCBhNzE5MDQ4Li44MzFkYWJmIDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL2Rzb3VuZC5jCisrKyBiL211bHRpbWVkaWEvZHNvdW5kLmMKQEAgLTQ2LDcgKzQ2LDExIEBACiAKICNpZmRlZiBIQVZFX09TUwogI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2lmZGVmIEhBVkVfTUFDSElORV9TT1VORENBUkRfSAorI2luY2x1ZGUgPG1hY2hpbmUvc291bmRjYXJkLmg+CisjZWxzZSAvKiBIQVZFX01BQ0hJTkVfU09VTkRDQVJEX0ggKi8KICNpbmNsdWRlIDxzeXMvc291bmRjYXJkLmg+CisjZW5kaWYgLyogSEFWRV9NQUNISU5FX1NPVU5EQ0FSRF9IICovCiAKIHN0YXRpYyBpbnQgYXVkaW9mZCA9IC0xOwogc3RhdGljIExQRElSRUNUU09VTkQJZHNvdW5kID0gTlVMTDsKQEAgLTEyNyw3ICsxMzEsNyBAQAogKSB7CiAJaW50CWk7CiAKLQlpZiAoZGVidWdnaW5nX2luZm8oZHNvdW5kKSkgeworCWlmIChUUkFDRV9PTihkc291bmQpKSB7CiAJICAgIGZwcmludGYoc3RkZXJyLCJJRGlyZWN0U291bmROb3RpZnkoJXApLT5TZXROb3RpZmljYXRpb25Qb3NpdGlvbnMoMHglMDhseCwlcClcbiIsdGhpcyxob3dtdWNoLG5vdGlmeSk7CiAJICAgIGZvciAoaT0wO2k8aG93bXVjaDtpKyspCiAJCSAgICBmcHJpbnRmKHN0ZGVyciwiCW5vdGlmeSBhdCAlbGQgdG8gMHglMDhseFxuIixub3RpZnlbaV0uZHdPZmZzZXQsKERXT1JEKW5vdGlmeVtpXS5oRXZlbnROb3RpZnkpOwpAQCAtMTU3LDkgKzE2MSw5IEBACiApIHsKIAogCW1lbWNweSgmKHRoaXMtPndmeCksd2ZleCxzaXplb2YodGhpcy0+d2Z4KSk7Ci0JZHByaW50Zl9maXhtZShkc291bmQsIklEaXJlY3RTb3VuZEJ1ZmZlciglcCktPlNldEZvcm1hdCglcClcbiIsCisJVFJBQ0UoZHNvdW5kLCIoJXApLT5TZXRGb3JtYXQoJXApXG4iLAogCQkgICAgICAgdGhpcyx3ZmV4KTsKLQlkcHJpbnRmX2luZm8oZHNvdW5kLCIJW2Zvcm1hdHRhZz0weCUwNHgsY2hhbnM9JWQsc2FtcGxlcmF0ZT0lbGQiCisJVFJBQ0UoZHNvdW5kLCIJW2Zvcm1hdHRhZz0weCUwNHgsY2hhbnM9JWQsc2FtcGxlcmF0ZT0lbGQiCiAJCSAgICJieXRlc3BlcnNlYz0lbGQsYmxvY2thbGlnbj0lZCxiaXRzcGVyc2FtcD0lZCxjYlNpemU9JWRdXG4iLAogCQkgICB3ZmV4LT53Rm9ybWF0VGFnLCB3ZmV4LT5uQ2hhbm5lbHMsIHdmZXgtPm5TYW1wbGVzUGVyU2VjLAogCQkgICB3ZmV4LT5uQXZnQnl0ZXNQZXJTZWMsIHdmZXgtPm5CbG9ja0FsaWduLCAKQEAgLTE3MSw3ICsxNzUsNyBAQAogc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RTb3VuZEJ1ZmZlcl9TZXRWb2x1bWUoCiAJTFBESVJFQ1RTT1VOREJVRkZFUiB0aGlzLExPTkcgdm9sCiApIHsKLQlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdFNvdW5kQnVmZmVyKCVwKS0+U2V0Vm9sdW1lKCVsZClcbiIsdGhpcyx2b2wpOworCWZwcmludGYoc3RkZXJyLCIoJXApLT5TZXRWb2x1bWUoJWxkKVxuIix0aGlzLHZvbCk7CiAJdGhpcy0+dm9sdW1lID0gdm9sOwogCXRoaXMtPnZvbGZhYyA9ICgoZG91YmxlKXZvbCsxMDAwMC4wKS8xMDAwMC4wOwogCXJldHVybiAwOwpAQCAtMTgwLDcgKzE4NCw3IEBACiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFNvdW5kQnVmZmVyX0dldFZvbHVtZSgKIAlMUERJUkVDVFNPVU5EQlVGRkVSIHRoaXMsTFBMT05HIHZvbAogKSB7Ci0JZHByaW50Zl9maXhtZShkc291bmQsIklEaXJlY3RTb3VuZEJ1ZmZlciglcCktPkdldFZvbHVtZSglcClcbiIsdGhpcyx2b2wpOworCVRSQUNFKGRzb3VuZCwiKCVwKS0+R2V0Vm9sdW1lKCVwKVxuIix0aGlzLHZvbCk7CiAJKnZvbCA9IHRoaXMtPnZvbHVtZTsKIAlyZXR1cm4gMDsKIH0KQEAgLTE4OCw3ICsxOTIsNyBAQAogc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RTb3VuZEJ1ZmZlcl9TZXRGcmVxdWVuY3koCiAJTFBESVJFQ1RTT1VOREJVRkZFUiB0aGlzLERXT1JEIGZyZXEKICkgewotCWRwcmludGZfZml4bWUoZHNvdW5kLCJJRGlyZWN0U291bmRCdWZmZXIoJXApLT5TZXRGcmVxdWVuY3koJWxkKVxuIix0aGlzLGZyZXEpOworCVRSQUNFKGRzb3VuZCwiKCVwKS0+U2V0RnJlcXVlbmN5KCVsZClcbiIsdGhpcyxmcmVxKTsKIAl0aGlzLT53ZngublNhbXBsZXNQZXJTZWMgPSBmcmVxOwogCXRoaXMtPndmeC5uQXZnQnl0ZXNQZXJTZWMgPSBmcmVxKnRoaXMtPndmeC5uQ2hhbm5lbHMqKHRoaXMtPndmeC53Qml0c1BlclNhbXBsZS84KTsKIAlyZXR1cm4gMDsKQEAgLTE5Nyw3ICsyMDEsNyBAQAogc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RTb3VuZEJ1ZmZlcl9QbGF5KAogCUxQRElSRUNUU09VTkRCVUZGRVIgdGhpcyxEV09SRCByZXNlcnZlZDEsRFdPUkQgcmVzZXJ2ZWQyLERXT1JEIGZsYWdzCiApIHsKLQlkcHJpbnRmX2ZpeG1lKGRzb3VuZCwiSURpcmVjdFNvdW5kQnVmZmVyKCVwKS0+UGxheSglMDhseCwlMDhseCwlMDhseClcbiIsCisJVFJBQ0UoZHNvdW5kLCIoJXApLT5QbGF5KCUwOGx4LCUwOGx4LCUwOGx4KVxuIiwKIAkJdGhpcyxyZXNlcnZlZDEscmVzZXJ2ZWQyLGZsYWdzCiAJKTsKIAl0aGlzLT5wbGF5cG9zID0gMDsKQEAgLTIwNyw3ICsyMTEsNyBAQAogfQogCiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFNvdW5kQnVmZmVyX1N0b3AoTFBESVJFQ1RTT1VOREJVRkZFUiB0aGlzKSB7Ci0JZHByaW50Zl9pbmZvKGRzb3VuZCwiSURpcmVjdFNvdW5kQnVmZmVyKCVwKS0+U3RvcCgpXG4iLHRoaXMpOworCVRSQUNFKGRzb3VuZCwiKCVwKS0+U3RvcCgpXG4iLHRoaXMpOwogCXRoaXMtPnBsYXlpbmcgPSAwOwogCXRoaXMtPndyaXRlcG9zID0gMDsgLyogaG1tICovCiAJcmV0dXJuIDA7CkBAIC0yNDEsNyArMjQ1LDcgQEAKIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0U291bmRCdWZmZXJfR2V0Q3VycmVudFBvc2l0aW9uKAogCUxQRElSRUNUU09VTkRCVUZGRVIgdGhpcyxMUERXT1JEIHBsYXlwb3MsTFBEV09SRCB3cml0ZXBvcwogKSB7Ci0JZHByaW50Zl9maXhtZShkc291bmQsIklEaXJlY3RTb3VuZEJ1ZmZlciglcCktPkdldEN1cnJlbnRQb3NpdGlvbiglcCwlcClcbiIsdGhpcyxwbGF5cG9zLHdyaXRlcG9zKTsKKwlUUkFDRShkc291bmQsIiglcCktPkdldEN1cnJlbnRQb3NpdGlvbiglcCwlcClcbiIsdGhpcyxwbGF5cG9zLHdyaXRlcG9zKTsKIAlpZiAocGxheXBvcykgKnBsYXlwb3MgPSB0aGlzLT5wbGF5cG9zOwogCWlmICh3cml0ZXBvcykgKndyaXRlcG9zID0gdGhpcy0+d3JpdGVwb3M7CiAJcmV0dXJuIDA7CkBAIC0yNTAsNyArMjU0LDcgQEAKIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0U291bmRCdWZmZXJfR2V0U3RhdHVzKAogCUxQRElSRUNUU09VTkRCVUZGRVIgdGhpcyxMUERXT1JEIHN0YXR1cwogKSB7Ci0JZHByaW50Zl9pbmZvKGRzb3VuZCwiSURpcmVjdFNvdW5kQnVmZmVyKCVwKS0+R2V0U3RhdHVzKCVwKVxuIix0aGlzLHN0YXR1cyk7CisJVFJBQ0UoZHNvdW5kLCIoJXApLT5HZXRTdGF0dXMoJXApXG4iLHRoaXMsc3RhdHVzKTsKIAkqc3RhdHVzID0gMDsKIAlpZiAodGhpcy0+cGxheWluZykKIAkJKnN0YXR1cyB8PSBEU0JTVEFUVVNfUExBWUlORzsKQEAgLTI2Miw3ICsyNjYsNyBAQAogc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RTb3VuZEJ1ZmZlcl9HZXRGb3JtYXQoCiAJTFBESVJFQ1RTT1VOREJVRkZFUiB0aGlzLExQV0FWRUZPUk1BVEVYIGxwd2YsRFdPUkQgd2ZzaXplLExQRFdPUkQgd2Z3cml0dGVuCiApIHsKLQlkcHJpbnRmX2luZm8oZHNvdW5kLCJJRGlyZWN0U291bmRCdWZmZXIoJXApLT5HZXRGb3JtYXQoJXAsJWxkLCVwKVxuIix0aGlzLGxwd2Ysd2ZzaXplLHdmd3JpdHRlbik7CisJVFJBQ0UoZHNvdW5kLCIoJXApLT5HZXRGb3JtYXQoJXAsJWxkLCVwKVxuIix0aGlzLGxwd2Ysd2ZzaXplLHdmd3JpdHRlbik7CiAJaWYgKHdmc2l6ZT5zaXplb2YodGhpcy0+d2Z4KSkgd2ZzaXplID0gc2l6ZW9mKHRoaXMtPndmeCk7CiAJbWVtY3B5KGxwd2YsJih0aGlzLT53ZngpLHdmc2l6ZSk7CiAJaWYgKHdmd3JpdHRlbikgKndmd3JpdHRlbiA9IHdmc2l6ZTsKQEAgLTI3Myw3ICsyNzcsNyBAQAogCUxQRElSRUNUU09VTkRCVUZGRVIgdGhpcyxEV09SRCB3cml0ZWN1cnNvcixEV09SRCB3cml0ZWJ5dGVzLExQVk9JRCBscGxwYXVkaW9wdHIxLExQRFdPUkQgYXVkaW9ieXRlczEsTFBWT0lEIGxwbHBhdWRpb3B0cjIsTFBEV09SRCBhdWRpb2J5dGVzMixEV09SRCBmbGFncwogKSB7CiAKLQlkcHJpbnRmX2luZm8oZHNvdW5kLCJJRGlyZWN0U291bmRCdWZmZXIoJXApLT5Mb2NrKCVsZCwlbGQsJXAsJXAsJXAsJXAsMHglMDhseClcbiIsCisJVFJBQ0UoZHNvdW5kLCIoJXApLT5Mb2NrKCVsZCwlbGQsJXAsJXAsJXAsJXAsMHglMDhseClcbiIsCiAJCXRoaXMsCiAJCXdyaXRlY3Vyc29yLAogCQl3cml0ZWJ5dGVzLApAQCAtMjk0LDcgKzI5OCw3IEBACiAJCQkqKExQQllURSopbHBscGF1ZGlvcHRyMiA9IE5VTEw7CiAJCWlmIChhdWRpb2J5dGVzMikKIAkJCSphdWRpb2J5dGVzMiA9IDA7Ci0JCWRwcmludGZfaW5mbyhkc291bmQsIi0+JWxkLjBcbiIsd3JpdGVieXRlcyk7CisJCVRSQUNFKGRzb3VuZCwiLT4lbGQuMFxuIix3cml0ZWJ5dGVzKTsKIAl9IGVsc2UgewogCQkqKExQQllURSopbHBscGF1ZGlvcHRyMSA9IHRoaXMtPmJ1ZmZlcit3cml0ZWN1cnNvcjsKIAkJKmF1ZGlvYnl0ZXMxID0gdGhpcy0+YnVmbGVuLXdyaXRlY3Vyc29yOwpAQCAtMzAyLDcgKzMwNiw3IEBACiAJCQkqKExQQllURSopbHBscGF1ZGlvcHRyMiA9IHRoaXMtPmJ1ZmZlcjsKIAkJaWYgKGF1ZGlvYnl0ZXMyKQogCQkJKmF1ZGlvYnl0ZXMyID0gd3JpdGVieXRlcy0odGhpcy0+YnVmbGVuLXdyaXRlY3Vyc29yKTsKLQkJZHByaW50Zl9pbmZvKGRzb3VuZCwiLT4lbGQuJWxkXG4iLCphdWRpb2J5dGVzMSxhdWRpb2J5dGVzMj8qYXVkaW9ieXRlczI6MCk7CisJCVRSQUNFKGRzb3VuZCwiLT4lbGQuJWxkXG4iLCphdWRpb2J5dGVzMSxhdWRpb2J5dGVzMj8qYXVkaW9ieXRlczI6MCk7CiAJfQogCXRoaXMtPndyaXRlcG9zPSh3cml0ZWN1cnNvcit3cml0ZWJ5dGVzKSV0aGlzLT5idWZsZW47CiAJcmV0dXJuIDA7CkBAIC0zMTEsNyArMzE1LDcgQEAKIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0U291bmRCdWZmZXJfU2V0Q3VycmVudFBvc2l0aW9uKAogCUxQRElSRUNUU09VTkRCVUZGRVIgdGhpcyxEV09SRCBuZXdwb3MKICkgewotCWRwcmludGZfaW5mbyhkc291bmQsIklEaXJlY3RTb3VuZEJ1ZmZlciglcCktPlNldEN1cnJlbnRQb3NpdGlvbiglbGQpXG4iLHRoaXMsbmV3cG9zKTsKKwlUUkFDRShkc291bmQsIiglcCktPlNldEN1cnJlbnRQb3NpdGlvbiglbGQpXG4iLHRoaXMsbmV3cG9zKTsKIAl0aGlzLT5wbGF5cG9zID0gbmV3cG9zOwogCXJldHVybiAwOwogfQpAQCAtMzE5LDcgKzMyMyw3IEBACiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFNvdW5kQnVmZmVyX1NldFBhbigKIAlMUERJUkVDVFNPVU5EQlVGRkVSIHRoaXMsTE9ORyBuZXdwYW4KICkgewotCWRwcmludGZfZml4bWUoZHNvdW5kLCJJRGlyZWN0U291bmRCdWZmZXIoJXApLT5TZXRQYW4oJWxkKVxuIix0aGlzLG5ld3Bhbik7CisJVFJBQ0UoZHNvdW5kLCIoJXApLT5TZXRQYW4oJWxkKVxuIix0aGlzLG5ld3Bhbik7CiAJdGhpcy0+cGFuID0gbmV3cGFuOwogCXJldHVybiAwOwogfQpAQCAtMzI3LDcgKzMzMSw3IEBACiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFNvdW5kQnVmZmVyX0dldFBhbigKIAlMUERJUkVDVFNPVU5EQlVGRkVSIHRoaXMsTFBMT05HIHBhbgogKSB7Ci0JZHByaW50Zl9maXhtZShkc291bmQsIklEaXJlY3RTb3VuZEJ1ZmZlciglcCktPkdldFBhbiglcClcbiIsdGhpcyxwYW4pOworCVRSQUNFKGRzb3VuZCwiKCVwKS0+R2V0UGFuKCVwKVxuIix0aGlzLHBhbik7CiAJKnBhbiA9IHRoaXMtPnBhbjsKIAlyZXR1cm4gMDsKIH0KQEAgLTMzNSw3ICszMzksNyBAQAogc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RTb3VuZEJ1ZmZlcl9VbmxvY2soCiAJTFBESVJFQ1RTT1VOREJVRkZFUiB0aGlzLExQVk9JRCBwMSxEV09SRCB4MSxMUFZPSUQgcDIsRFdPUkQgeDIKICkgewotCWRwcmludGZfaW5mbyhkc291bmQsIklEaXJlY3RTb3VuZEJ1ZmZlciglcCktPlVubG9jayglcCwlbGQsJXAsJWxkKVxuIiwKKwlUUkFDRShkc291bmQsIiglcCktPlVubG9jayglcCwlbGQsJXAsJWxkKVxuIiwKIAkJdGhpcyxwMSx4MSxwMix4MgogCSk7CiAJcmV0dXJuIDA7CkBAIC0zNDQsNyArMzQ4LDcgQEAKIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0U291bmRCdWZmZXJfR2V0RnJlcXVlbmN5KAogCUxQRElSRUNUU09VTkRCVUZGRVIgdGhpcyxMUERXT1JEIGZyZXEKICkgewotCWRwcmludGZfaW5mbyhkc291bmQsIklEaXJlY3RTb3VuZEJ1ZmZlciglcCktPkdldEZyZXF1ZW5jeSglcClcbiIsCisJVFJBQ0UoZHNvdW5kLCIoJXApLT5HZXRGcmVxdWVuY3koJXApXG4iLAogCQl0aGlzLGZyZXEKIAkpOwogCSpmcmVxID0gdGhpcy0+d2Z4Lm5TYW1wbGVzUGVyU2VjOwpAQCAtMzU0LDcgKzM1OCw3IEBACiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFNvdW5kQnVmZmVyX0luaXRpYWxpemUoCiAJTFBESVJFQ1RTT1VOREJVRkZFUiB0aGlzLExQRElSRUNUU09VTkQgZHNvdW5kLExQRFNCVUZGRVJERVNDIGRic2QKICkgewotCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0U291bmRCdWZmZXIoJXApLT5Jbml0aWFsaXplKCVwLCVwKVxuIix0aGlzLGRzb3VuZCxkYnNkKTsKKwlmcHJpbnRmKHN0ZGVyciwiKCVwKS0+SW5pdGlhbGl6ZSglcCwlcClcbiIsdGhpcyxkc291bmQsZGJzZCk7CiAJcmV0dXJuIERTRVJSX0FMUkVBRFlJTklUSUFMSVpFRDsKIH0KIApAQCAtMzg2LDcgKzM5MCw3IEBACiAJCXJldHVybiAwOwogCX0KIAlXSU5FX1N0cmluZ0Zyb21DTFNJRChyaWlkLHhidWYpOwotCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0U291bmRCdWZmZXIoJXApLT5RdWVyeUludGVyZmFjZSglcywlcClcbiIsdGhpcyx4YnVmLHBwb2JqKTsKKwlmcHJpbnRmKHN0ZGVyciwiKCVwKS0+UXVlcnlJbnRlcmZhY2UoJXMsJXApXG4iLHRoaXMseGJ1ZixwcG9iaik7CiAJcmV0dXJuIEVfRkFJTDsKIH0KIApAQCAtNDIwLDcgKzQyNCw3IEBACiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFNvdW5kX1NldENvb3BlcmF0aXZlTGV2ZWwoCiAJTFBESVJFQ1RTT1VORCB0aGlzLEhXTkQzMiBod25kLERXT1JEIGxldmVsCiApIHsKLQlkcHJpbnRmX2luZm8oZHNvdW5kLCJJRGlyZWN0U291bmQoJXApLT5TZXRDb29wZXJhdGl2ZUxldmVsKCUwOGx4LCVsZClcbiIsCisJVFJBQ0UoZHNvdW5kLCIoJXApLT5TZXRDb29wZXJhdGl2ZUxldmVsKCUwOGx4LCVsZClcbiIsCiAJCXRoaXMsKERXT1JEKWh3bmQsbGV2ZWwKIAkpOwogCXJldHVybiAwOwpAQCAtNDMwLDcgKzQzNCw3IEBACiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFNvdW5kX0NyZWF0ZVNvdW5kQnVmZmVyKAogCUxQRElSRUNUU09VTkQgdGhpcyxMUERTQlVGRkVSREVTQyBkc2JkLExQTFBESVJFQ1RTT1VOREJVRkZFUiBwcGRzYixMUFVOS05PV04gbHB1bmsKICkgewotCWlmIChkZWJ1Z2dpbmdfaW5mbyhkc291bmQpKSB7CisJaWYgKFRSQUNFX09OKGRzb3VuZCkpIHsKIAkJZnByaW50ZihzdGRlcnIsIklEaXJlY3RTb3VuZCglcCktPkNyZWF0ZVNvdW5kQnVmZmVyKCVwLCVwLCVwKVxuIix0aGlzLGRzYmQscHBkc2IsbHB1bmspOwogCQlmcHJpbnRmKHN0ZGVyciwiW3NpemU9JWxkLCIsZHNiZC0+ZHdTaXplKTsKIAkJZnByaW50ZihzdGRlcnIsImZsYWdzID0gMHglMDhseCwiLGRzYmQtPmR3RmxhZ3MpOwpAQCAtNDYzLDcgKzQ2Nyw3IEBACiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFNvdW5kX0R1cGxpY2F0ZVNvdW5kQnVmZmVyKAogCUxQRElSRUNUU09VTkQgdGhpcyxMUERJUkVDVFNPVU5EQlVGRkVSIHBkc2IsTFBMUERJUkVDVFNPVU5EQlVGRkVSIHBwZHNiCiApIHsKLQlkcHJpbnRmX2ZpeG1lKGRzb3VuZCwiSURpcmVjdFNvdW5kKCVwKS0+RHVwbGljYXRlU291bmRCdWZmZXIoJXAsJXApXG4iLHRoaXMscGRzYixwcGRzYik7CisJVFJBQ0UoZHNvdW5kLCJJRGlyZWN0U291bmQoJXApLT5EdXBsaWNhdGVTb3VuZEJ1ZmZlciglcCwlcClcbiIsdGhpcyxwZHNiLHBwZHNiKTsKIAogCSpwcGRzYiA9IChMUERJUkVDVFNPVU5EQlVGRkVSKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLEhFQVBfWkVST19NRU1PUlksc2l6ZW9mKElEaXJlY3RTb3VuZEJ1ZmZlcikpOwogCSgqcHBkc2IpLT5yZWYgPTE7CkBAIC00ODUsOCArNDg5LDggQEAKIAogCiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFNvdW5kX0dldENhcHMoTFBESVJFQ1RTT1VORCB0aGlzLExQRFNDQVBTIGNhcHMpIHsKLQlkcHJpbnRmX2ZpeG1lKGRzb3VuZCwiSURpcmVjdFNvdW5kKCVwKS0+R2V0Q2FwcyglcClcbiIsdGhpcyxjYXBzKTsKLQlkcHJpbnRmX2ZpeG1lKGRzb3VuZCwiCWZsYWdzID0gMHglMDhseFxuIixjYXBzLT5kd0ZsYWdzKTsKKwlUUkFDRShkc291bmQsIklEaXJlY3RTb3VuZCglcCktPkdldENhcHMoJXApXG4iLHRoaXMsY2Fwcyk7CisJVFJBQ0UoZHNvdW5kLCIJZmxhZ3MgPSAweCUwOGx4XG4iLGNhcHMtPmR3RmxhZ3MpOwogCiAJY2Fwcy0+ZHdTaXplID0gc2l6ZW9mKCpjYXBzKTsKIAljYXBzLT5kd0ZsYWdzID0gRFNDQVBTX1BSSU1BUllTVEVSRU98RFNDQVBTX1BSSU1BUlkxNkJJVHxEU0NBUFNfRU1VTERSSVZFUnxEU0NBUFNfU0VDT05EQVJZU1RFUkVPfERTQ0FQU19TRUNPTkRBUlkxNkJJVDsKQEAgLTc0OCw3ICs3NTIsNyBAQAogCQkJCQkJcmV0dXJuOwogCQkJCQl9CiAJCQkJCS8qIEZJWE1FOiBwYW4sdm9sdW1lICovCi0JCQkJCXBsYXlidWZbal0rPXhidWZbZHNiLT5wbGF5cG9zPj4xXSp2b2xmYWM7CisJCQkJCXBsYXlidWZbal0rPXhidWZbZHNiLT5wbGF5cG9zPj4xXS8qKnZvbGZhYyovOwogCQkJCQlDSEVDS19FVkVOVAogCQkJCX0KIAkJCX0KQEAgLTc1OSwxMCArNzYzLDggQEAKIHN0YXRpYyBEV09SRAogRFNPVU5EX3RocmVhZChMUFZPSUQgYXJnKSB7CiAJaW50CXJlcyxpLGN1cmxlZnQscGxheWluZyxoYXZlcHJpbWFyeSA9IDA7Ci0Jc3RydWN0IGF1ZGlvX2J1Zl9pbmZvCWFiaTsKIAogCWZwcmludGYoc3RkZXJyLCJkc291bmQgaXMgYXQgcGlkICVkXG4iLGdldHBpZCgpKTsKLQlpb2N0bChhdWRpb2ZkLFNORENUTF9EU1BfR0VUT1NQQUNFLCZhYmkpOwogCXdoaWxlICgxKSB7CiAJCWlmICghZHNvdW5kKSB7CiAJCQlmcHJpbnRmKHN0ZGVyciwiRFNPVU5EIHRocmVhZCBnaXZpbmcgdXAuXG4iKTsKQEAgLTg1OCw5ICs4NjAsMTEgQEAKIAl4eD0weDAwMDIwMDBjOwogCWlmICgtMT09aW9jdGwoYXVkaW9mZCxTTkRDVExfRFNQX1NFVEZSQUdNRU5ULCZ4eCkpCiAJCXBlcnJvcigiaW9jdGwgU0VURlJBR01FTlQiKTsKKy8qCiAJZnByaW50ZihzdGRlcnIsIlNFVEZSQUdNRU5ULiBjb3VudCBpcyBub3cgJWQsIGZyYWdzaXplIGlzICVkXG4iLAogCQkoeHg+PjE2KSsxLHh4JjB4ZmZmZgogCSk7CisgKi8KIAogCSpwcERTID0gKExQRElSRUNUU09VTkQpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxzaXplb2YoSURpcmVjdFNvdW5kKSk7CiAJKCpwcERTKS0+cmVmCQk9IDE7CmRpZmYgLS1naXQgYS9tdWx0aW1lZGlhL2pveXN0aWNrLmMgYi9tdWx0aW1lZGlhL2pveXN0aWNrLmMKaW5kZXggYWUxYzU2OC4uNmE4ZDJlNiAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS9qb3lzdGljay5jCisrKyBiL211bHRpbWVkaWEvam95c3RpY2suYwpAQCAtOTQsNyArOTQsOSBAQAogCQl9IGVsc2UKIAkJCXJldHVybjsKICAgICAgICAgaWYgKGpveUNhcHR1cmVkID09IEZBTFNFKSByZXR1cm47Ci0JZHByaW50Zl9pbmZvKG1tc3lzLCAiSm95U2VuZE1lc3NhZ2VzKClcbiIpOworCisJVFJBQ0UobW1zeXMsICIgLS1cbiIpOworCiAgICAgICAgIGZvciAoam95PTA7IGpveSA8IE1BWEpPWURSSVZFUlM7IGpveSsrKSB7CiAJCWlmIChqb3lPcGVuRHJpdmVyKGpveSkgPT0gRkFMU0UpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIGRldl9zdGF0ID0gcmVhZChqb3lfZGV2W2pveV0sICZqcywgc2l6ZW9mKGpzKSk7CkBAIC0xNDIsNyArMTQ0LDcgQEAKIAkJam95Q2xvc2VEcml2ZXIoam95KTsKIAkJam95X2NudCsrOwogICAgIH0KLSAgICBkcHJpbnRmX2luZm8obW1zeXMsICJyZXR1cm5pbmcgJWRcbiIsIGpveV9jbnQpOworICAgIFRSQUNFKG1tc3lzLCAicmV0dXJuaW5nICVkXG4iLCBqb3lfY250KTsKICAgICBpZiAoIWpveV9jbnQpIGZwcmludGYoc3RkZXJyLCAiTm8gam95c3RpY2sgZm91bmQgLSAiCiAJCQkgICJwZXJoYXBzIGdldCBqb3lzdGljay0wLjguMC50YXIuZ3ogYW5kIGxvYWQiCiAJCQkgICJpdCBhcyBtb2R1bGUgb3IgdXNlIExpbnV4ID49IDIuMS40NSB0byBiZSAiCkBAIC0yMjYsNyArMjI4LDcgQEAKICAqLwogTU1SRVNVTFQxNiBXSU5BUEkgam95R2V0RGV2Q2FwczE2KFVJTlQxNiB3SUQsIExQSk9ZQ0FQUzE2IGxwQ2FwcywgVUlOVDE2IHdTaXplKQogewotICAgIGRwcmludGZfaW5mbyhtbXN5cywgIkpveUdldERldkNhcHMoJTA0WCwgJXAsICVkKTtcbiIsCisgICAgVFJBQ0UobW1zeXMsICIoJTA0WCwgJXAsICVkKTtcbiIsCiAgICAgICAgICAgICB3SUQsIGxwQ2Fwcywgd1NpemUpOwogICAgIGlmIChqb3lPcGVuRHJpdmVyKHdJRCkgPT0gVFJVRSkgewogICAgICAgICBscENhcHMtPndNaWQgPSBNTV9NSUNST1NPRlQ7CkBAIC0yOTQsNyArMjk2LDcgQEAKIHsKICAgICAgICAgc3RydWN0IGpzX3N0YXR1cyBqczsKIAotICAgICAgICBkcHJpbnRmX2luZm8obW1zeXMsICJKb3lHZXRQb3MoJTA0WCwgJXApXG4iLCB3SUQsIGxwSW5mbyk7CisgICAgICAgIFRSQUNFKG1tc3lzLCAiKCUwNFgsICVwKVxuIiwgd0lELCBscEluZm8pOwogICAgICAgICBpZiAoam95T3BlbkRyaXZlcih3SUQpID09IEZBTFNFKSByZXR1cm4gTU1TWVNFUlJfTk9EUklWRVI7CiAJZGV2X3N0YXQgPSByZWFkKGpveV9kZXZbd0lEXSwgJmpzLCBzaXplb2YoanMpKTsKIAlpZiAoZGV2X3N0YXQgIT0gc2l6ZW9mKGpzKSkgewpAQCAtMzA4LDcgKzMxMCw3IEBACiAJbHBJbmZvLT53WXBvcyA9IGpzLnk7CiAJbHBJbmZvLT53WnBvcyA9IDA7IC8qIEZJWE1FOiBEb24ndCBrbm93IHdoYXQgdG8gZG8gd2l0aCB0aGlzIHZhbHVlIGFzIGpveXN0aWNrIGRyaXZlciBkb2Vzbid0IHByb3ZpZGUgYSBaIHZhbHVlICovCiAJbHBJbmZvLT53QnV0dG9ucyA9IGpzLmJ1dHRvbnM7Ci0JZHByaW50Zl9pbmZvKG1tc3lzLCAiSm95R2V0UG9zOiB4OiAlZCwgeTogJWQsIGJ1dHRvbnM6ICVkXG4iLCBqcy54LCBqcy55LCBqcy5idXR0b25zKTsKKwlUUkFDRShtbXN5cywgIng6ICVkLCB5OiAlZCwgYnV0dG9uczogJWRcbiIsIGpzLngsIGpzLnksIGpzLmJ1dHRvbnMpOwogCXJldHVybiBKT1lFUlJfTk9FUlJPUjsKIH0KIApAQCAtMzI5LDcgKzMzMSw3IEBACiAgKi8KIE1NUkVTVUxUMTYgV0lOQVBJIGpveUdldFRocmVzaG9sZDE2KFVJTlQxNiB3SUQsIExQVUlOVDE2IGxwVGhyZXNob2xkKQogewotICAgIGRwcmludGZfaW5mbyhtbXN5cywgIkpveUdldFRocmVzaG9sZCglMDRYLCAlcCk7XG4iLCB3SUQsIGxwVGhyZXNob2xkKTsKKyAgICBUUkFDRShtbXN5cywgIiglMDRYLCAlcCk7XG4iLCB3SUQsIGxwVGhyZXNob2xkKTsKICAgICBpZiAod0lEID49IE1BWEpPWURSSVZFUlMpIHJldHVybiBKT1lFUlJfUEFSTVM7CiAgICAgKmxwVGhyZXNob2xkID0gam95X3RocmVzaG9sZFt3SURdOwogICAgIHJldHVybiBKT1lFUlJfTk9FUlJPUjsKQEAgLTM0OCw3ICszNTAsNyBAQAogICovCiBNTVJFU1VMVDE2IFdJTkFQSSBqb3lSZWxlYXNlQ2FwdHVyZTE2KFVJTlQxNiB3SUQpCiB7Ci0gICAgZHByaW50Zl9pbmZvKG1tc3lzLCAiSm95UmVsZWFzZUNhcHR1cmUoJTA0WCk7XG4iLCB3SUQpOworICAgIFRSQUNFKG1tc3lzLCAiKCUwNFgpO1xuIiwgd0lEKTsKICAgICBqb3lDYXB0dXJlZCA9IEZBTFNFOwogICAgIGpveUNsb3NlRHJpdmVyKHdJRCk7CiAgICAgam95X2Rldlt3SURdID0gLTE7CkBAIC0zNzAsNyArMzcyLDcgQEAKIE1NUkVTVUxUMTYgV0lOQVBJIGpveVNldENhcHR1cmUxNihIV05EMTYgaFduZCxVSU5UMTYgd0lELFVJTlQxNiB3UGVyaW9kLEJPT0wxNiBiQ2hhbmdlZCkKIHsKIAotICAgIGRwcmludGZfaW5mbyhtbXN5cywgIkpveVNldENhcHR1cmUoJTA0WCwgJTA0WCwgJWQsICVkKTtcbiIsCisgICAgVFJBQ0UobW1zeXMsICIoJTA0WCwgJTA0WCwgJWQsICVkKTtcbiIsCiAJICAgIGhXbmQsIHdJRCwgd1BlcmlvZCwgYkNoYW5nZWQpOwogCiAgICAgaWYgKCFDYXB0dXJlV25kW3dJRF0pIHsKQEAgLTM5NSw3ICszOTcsNyBAQAogICovCiBNTVJFU1VMVDE2IFdJTkFQSSBqb3lTZXRUaHJlc2hvbGQxNihVSU5UMTYgd0lELCBVSU5UMTYgd1RocmVzaG9sZCkKIHsKLSAgICBkcHJpbnRmX2luZm8obW1zeXMsICJKb3lTZXRUaHJlc2hvbGQoJTA0WCwgJWQpO1xuIiwgd0lELCB3VGhyZXNob2xkKTsKKyAgICBUUkFDRShtbXN5cywgIiglMDRYLCAlZCk7XG4iLCB3SUQsIHdUaHJlc2hvbGQpOwogCiAgICAgaWYgKHdJRCA+IDMpIHJldHVybiBKT1lFUlJfUEFSTVM7CiAgICAgam95X3RocmVzaG9sZFt3SURdID0gd1RocmVzaG9sZDsKZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvbWNpYW5pbS5jIGIvbXVsdGltZWRpYS9tY2lhbmltLmMKaW5kZXggYWE1NDVhNS4uODBkODk3MCAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS9tY2lhbmltLmMKKysrIGIvbXVsdGltZWRpYS9tY2lhbmltLmMKQEAgLTU0LDcgKzU0LDcgQEAKIAlMUFNUUgkJbHBzdHJFbGVtZW50TmFtZTsKIAljaGFyCQlzdHJbMTI4XTsKIAotCWRwcmludGZfaW5mbyhtY2lhbmltLCJBTklNX21jaU9wZW4oJTA0WCwgJTA4bFgsICVwKTtcbiIsIAorCVRSQUNFKG1jaWFuaW0sIiglMDRYLCAlMDhsWCwgJXApO1xuIiwgCiAJCQkJCXdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAlpZiAoQW5pbURldlt3RGV2SURdLm5Vc2VDb3VudCA+IDApIHsKQEAgLTcwLDEyICs3MCwxMiBAQAogCQlBbmltRGV2W3dEZXZJRF0ublVzZUNvdW50ID0gMTsKIAkJQW5pbURldlt3RGV2SURdLmZTaGFyZWFibGUgPSBkd0ZsYWdzICYgTUNJX09QRU5fU0hBUkVBQkxFOwogCQl9Ci0JZHByaW50Zl9pbmZvKG1jaWFuaW0sIkFOSU1fbWNpT3BlbiAvLyB3RGV2SUQ9JTA0WFxuIiwgd0RldklEKTsKKwlUUkFDRShtY2lhbmltLCJ3RGV2SUQ9JTA0WFxuIiwgd0RldklEKTsKIAlscFBhcm1zLT53RGV2aWNlSUQgPSB3RGV2SUQ7Ci0JZHByaW50Zl9pbmZvKG1jaWFuaW0sIkFOSU1fbWNpT3BlbiAvLyBscFBhcm1zLT53RGV2SUQ9JTA0WFxuIiwgbHBQYXJtcy0+d0RldmljZUlEKTsKKwlUUkFDRShtY2lhbmltLCJscFBhcm1zLT53RGV2SUQ9JTA0WFxuIiwgbHBQYXJtcy0+d0RldmljZUlEKTsKICAgICBpZiAoZHdGbGFncyAmIE1DSV9PUEVOX0VMRU1FTlQpIHsKIAkJbHBzdHJFbGVtZW50TmFtZSA9IChMUFNUUilQVFJfU0VHX1RPX0xJTihscFBhcm1zLT5scHN0ckVsZW1lbnROYW1lKTsKLQkJZHByaW50Zl9pbmZvKG1jaWFuaW0sIkFOSU1fbWNpT3BlbiAvLyBNQ0lfT1BFTl9FTEVNRU5UICclcycgIVxuIiwKKwkJVFJBQ0UobWNpYW5pbSwiTUNJX09QRU5fRUxFTUVOVCAnJXMnICFcbiIsCiAJCQkJCQlscHN0ckVsZW1lbnROYW1lKTsKIAkJaWYgKHN0cmxlbihscHN0ckVsZW1lbnROYW1lKSA+IDApIHsKIAkJCXN0cmNweShzdHIsIGxwc3RyRWxlbWVudE5hbWUpOwpAQCAtOTUsOCArOTUsNyBAQAogICAgTW92ZWQgdG8gbW1zeXN0ZW0uYyBtY2lPcGVuIHJvdXRpbmUgCiAKIAlpZiAoZHdGbGFncyAmIE1DSV9OT1RJRlkpIHsKLQkJZHByaW50Zl9pbmZvKG1jaWFuaW0sCi0JCQkiQU5JTV9tY2lPcGVuIC8vIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCAKKwkJVFJBQ0UobWNpYW5pbSwgIk1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCAKIAkJCWxwUGFybXMtPmR3Q2FsbGJhY2spOwogCQltY2lEcml2ZXJOb3RpZnkoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAogCQkJQW5pbURldlt3RGV2SURdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKQEAgLTExNCw3ICsxMTMsNyBAQAogc3RhdGljIERXT1JEIEFOSU1fbWNpQ2xvc2UoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdQYXJhbSwgTFBNQ0lfR0VORVJJQ19QQVJNUyBscFBhcm1zKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCi0JZHByaW50Zl9pbmZvKG1jaWFuaW0sIkFOSU1fbWNpQ2xvc2UoJXUsICUwOGxYLCAlcCk7XG4iLCAKKwlUUkFDRShtY2lhbmltLCIoJXUsICUwOGxYLCAlcCk7XG4iLCAKIAkJCQl3RGV2SUQsIGR3UGFyYW0sIGxwUGFybXMpOwogCWlmIChBbmltRGV2W3dEZXZJRF0ubHBkd1RyYWNrTGVuICE9IE5VTEwpIGZyZWUoQW5pbURldlt3RGV2SURdLmxwZHdUcmFja0xlbik7CiAJaWYgKEFuaW1EZXZbd0RldklEXS5scGR3VHJhY2tQb3MgIT0gTlVMTCkgZnJlZShBbmltRGV2W3dEZXZJRF0ubHBkd1RyYWNrUG9zKTsKQEAgLTEyOSwxMiArMTI4LDExIEBACiAJCQkJCQlMUE1DSV9HRVRERVZDQVBTX1BBUk1TIGxwUGFybXMpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLQlkcHJpbnRmX2luZm8obWNpYW5pbSwiQU5JTV9tY2lHZXREZXZDYXBzKCV1LCAlMDhsWCwgJXApO1xuIiwgCisJVFJBQ0UobWNpYW5pbSwiKCV1LCAlMDhsWCwgJXApO1xuIiwgCiAJCQkJd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCWlmIChkd0ZsYWdzICYgTUNJX0dFVERFVkNBUFNfSVRFTSkgewotICAgICAgICAJZHByaW50Zl9pbmZvKG1jaWFuaW0sCi0JCSJBTklNX21jaUdldERldkNhcHMgLy8gTUNJX0dFVERFVkNBUFNfSVRFTSBkd0l0ZW09JTA4bFg7XG4iLAorICAgICAgICAJVFJBQ0UobWNpYW5pbSwgIk1DSV9HRVRERVZDQVBTX0lURU0gZHdJdGVtPSUwOGxYO1xuIiwKIAkJCQlscFBhcm1zLT5kd0l0ZW0pOwogCQlzd2l0Y2gobHBQYXJtcy0+ZHdJdGVtKSB7CiAJCQljYXNlIE1DSV9HRVRERVZDQVBTX0NBTl9SRUNPUkQ6CkBAIC0xNjgsOCArMTY2LDcgQEAKIAkJCQlyZXR1cm4gTUNJRVJSX1VOUkVDT0dOSVpFRF9DT01NQU5EOwogCQkJfQogCQl9Ci0JZHByaW50Zl9pbmZvKG1jaWFuaW0sCi0JCSJBTklNX21jaUdldERldkNhcHMgLy8gbHBQYXJtcy0+ZHdSZXR1cm49JTA4bFg7XG4iLCAKKwlUUkFDRShtY2lhbmltLCAibHBQYXJtcy0+ZHdSZXR1cm49JTA4bFg7XG4iLCAKIAkJbHBQYXJtcy0+ZHdSZXR1cm4pOwogIAlyZXR1cm4gMDsKICNlbHNlCkBAIC0xODksMTQgKzE4NiwxMyBAQAogCVVJTlQxNgl3TWludXRlczsKIAlVSU5UMTYJd1NlY29uZHM7CiAJVUlOVDE2CXdGcmFtZXM7Ci0JZHByaW50Zl9pbmZvKG1jaWFuaW0sIkFOSU1fQ2FsY1RpbWUoJXUsICUwOGxYLCAlbHUpO1xuIiwgCisJVFJBQ0UobWNpYW5pbSwiKCV1LCAlMDhsWCwgJWx1KTtcbiIsIAogCQkJd0RldklELCBkd0Zvcm1hdFR5cGUsIGR3RnJhbWUpOwogICAgIAogCXN3aXRjaCAoZHdGb3JtYXRUeXBlKSB7CiAJCWNhc2UgTUNJX0ZPUk1BVF9NSUxMSVNFQ09ORFM6CiAJCQlkd1RpbWUgPSBkd0ZyYW1lIC8gQU5JTUZSQU1FU19QRVJTRUMgKiAxMDAwOwotCQkJZHByaW50Zl9pbmZvKG1jaWFuaW0sCi0JCQkJIkFOSU1fQ2FsY1RpbWUgLy8gTUlMTElTRUNPTkRTICVsdVxuIiwgZHdUaW1lKTsKKwkJCVRSQUNFKG1jaWFuaW0sICJNSUxMSVNFQ09ORFMgJWx1XG4iLCBkd1RpbWUpOwogCQkJYnJlYWs7CiAJCWNhc2UgTUNJX0ZPUk1BVF9NU0Y6CiAJCQl3TWludXRlcyA9IGR3RnJhbWUgLyBBTklNRlJBTUVTX1BFUk1JTjsKQEAgLTIwNCw3ICsyMDAsNyBAQAogCQkJd0ZyYW1lcyA9IGR3RnJhbWUgLSBBTklNRlJBTUVTX1BFUk1JTiAqIHdNaW51dGVzIC0gCiAJCQkJCQkJCUFOSU1GUkFNRVNfUEVSU0VDICogd1NlY29uZHM7CiAJCQlkd1RpbWUgPSBNQ0lfTUFLRV9NU0Yod01pbnV0ZXMsIHdTZWNvbmRzLCB3RnJhbWVzKTsKLQkJCWRwcmludGZfaW5mbyhtY2lhbmltLCJBTklNX0NhbGNUaW1lIC8vIE1TRiAlMDJ1OiUwMnU6JTAydSAtPiBkd1RpbWU9JWx1XG4iLAorCQkJVFJBQ0UobWNpYW5pbSwiTVNGICUwMnU6JTAydTolMDJ1IC0+IGR3VGltZT0lbHVcbiIsCiAJCQkJCQkJCXdNaW51dGVzLCB3U2Vjb25kcywgd0ZyYW1lcywgZHdUaW1lKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgpAQCAtMjIyLDggKzIxOCw3IEBACiAJCQl3RnJhbWVzID0gZHdGcmFtZSAtIEFOSU1GUkFNRVNfUEVSTUlOICogd01pbnV0ZXMgLSAKIAkJCQkJCQkJQU5JTUZSQU1FU19QRVJTRUMgKiB3U2Vjb25kczsKIAkJCWR3VGltZSA9IE1DSV9NQUtFX1RNU0Yod1RyYWNrLCB3TWludXRlcywgd1NlY29uZHMsIHdGcmFtZXMpOwotCQkJZHByaW50Zl9pbmZvKG1jaWFuaW0sCi0JCQkJIkFOSU1fQ2FsY1RpbWUgLy8gJTAydS0lMDJ1OiUwMnU6JTAydVxuIiwKKwkJCVRSQUNFKG1jaWFuaW0sICIlMDJ1LSUwMnU6JTAydTolMDJ1XG4iLAogCQkJCXdUcmFjaywgd01pbnV0ZXMsIHdTZWNvbmRzLCB3RnJhbWVzKTsKIAkJCWJyZWFrOwogCQl9CkBAIC0yNDAsMTggKzIzNSwxNiBAQAogCURXT1JECWR3RnJhbWUgPSAwOwogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCiAJVUlOVDE2CXdUcmFjazsKLQlkcHJpbnRmX2luZm8obWNpYW5pbSwiQU5JTV9DYWxjRnJhbWUoJXUsICUwOGxYLCAlbHUpO1xuIiwgCisJVFJBQ0UobWNpYW5pbSwiKCV1LCAlMDhsWCwgJWx1KTtcbiIsIAogCQkJd0RldklELCBkd0Zvcm1hdFR5cGUsIGR3VGltZSk7CiAKICAgICAgICAgc3dpdGNoIChkd0Zvcm1hdFR5cGUpIHsKIAkJY2FzZSBNQ0lfRk9STUFUX01JTExJU0VDT05EUzoKIAkJCWR3RnJhbWUgPSBkd1RpbWUgKiBBTklNRlJBTUVTX1BFUlNFQyAvIDEwMDA7Ci0JCQlkcHJpbnRmX2luZm8obWNpYW5pbSwKLQkJCQkiQU5JTV9DYWxjRnJhbWUgLy8gTUlMTElTRUNPTkRTICVsdVxuIiwgZHdGcmFtZSk7CisJCQlUUkFDRShtY2lhbmltLCAiTUlMTElTRUNPTkRTICVsdVxuIiwgZHdGcmFtZSk7CiAJCQlicmVhazsKIAkJY2FzZSBNQ0lfRk9STUFUX01TRjoKLQkJCWRwcmludGZfaW5mbyhtY2lhbmltLAotCQkJCSJBTklNX0NhbGNGcmFtZSAvLyBNU0YgJTAydTolMDJ1OiUwMnVcbiIsCisJCQlUUkFDRShtY2lhbmltLCAiTVNGICUwMnU6JTAydTolMDJ1XG4iLAogCQkJCU1DSV9NU0ZfTUlOVVRFKGR3VGltZSksIE1DSV9NU0ZfU0VDT05EKGR3VGltZSksIAogCQkJCU1DSV9NU0ZfRlJBTUUoZHdUaW1lKSk7CiAJCQlkd0ZyYW1lICs9IEFOSU1GUkFNRVNfUEVSTUlOICogTUNJX01TRl9NSU5VVEUoZHdUaW1lKTsKQEAgLTI2MywxMiArMjU2LDEwIEBACiAJCQlkd0Zvcm1hdFR5cGUgPSBNQ0lfRk9STUFUX1RNU0Y7CiAJCWNhc2UgTUNJX0ZPUk1BVF9UTVNGOgogCQkJd1RyYWNrID0gTUNJX1RNU0ZfVFJBQ0soZHdUaW1lKTsKLQkJCWRwcmludGZfaW5mbyhtY2lhbmltLAotCQkJCSJBTklNX0NhbGNGcmFtZSAvLyBUTVNGICUwMnUtJTAydTolMDJ1OiUwMnVcbiIsCisJCQlUUkFDRShtY2lhbmltLCAiVE1TRiAlMDJ1LSUwMnU6JTAydTolMDJ1XG4iLAogCQkJCU1DSV9UTVNGX1RSQUNLKGR3VGltZSksIE1DSV9UTVNGX01JTlVURShkd1RpbWUpLCAKIAkJCQlNQ0lfVE1TRl9TRUNPTkQoZHdUaW1lKSwgTUNJX1RNU0ZfRlJBTUUoZHdUaW1lKSk7Ci0JCQlkcHJpbnRmX2luZm8obWNpYW5pbSwKLQkJCQkiQU5JTV9DYWxjRnJhbWUgLy8gVE1TRiB0cmFja3Bvc1sldV09JWx1XG4iLAorCQkJVFJBQ0UobWNpYW5pbSwgIlRNU0YgdHJhY2twb3NbJXVdPSVsdVxuIiwKIAkJCQl3VHJhY2ssIEFuaW1EZXZbd0RldklEXS5scGR3VHJhY2tQb3Nbd1RyYWNrIC0gMV0pOwogCQkJZHdGcmFtZSA9IEFuaW1EZXZbd0RldklEXS5scGR3VHJhY2tQb3Nbd1RyYWNrIC0gMV07CiAJCQlkd0ZyYW1lICs9IEFOSU1GUkFNRVNfUEVSTUlOICogTUNJX1RNU0ZfTUlOVVRFKGR3VGltZSk7CkBAIC0yODcsNyArMjc4LDcgQEAKIHN0YXRpYyBEV09SRCBBTklNX21jaUluZm8oVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfSU5GT19QQVJNUzE2IGxwUGFybXMpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLQlkcHJpbnRmX2luZm8obWNpYW5pbSwiQU5JTV9tY2lJbmZvKCV1LCAlMDhsWCwgJXApO1xuIiwgCisJVFJBQ0UobWNpYW5pbSwiKCV1LCAlMDhsWCwgJXApO1xuIiwgCiAJCXdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAlscFBhcm1zLT5scHN0clJldHVybiA9IE5VTEw7CkBAIC0zMjEsMTIgKzMxMiwxMSBAQAogc3RhdGljIERXT1JEIEFOSU1fbWNpU3RhdHVzKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX1NUQVRVU19QQVJNUyBscFBhcm1zKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCi0JZHByaW50Zl9pbmZvKG1jaWFuaW0sIkFOSU1fbWNpU3RhdHVzKCV1LCAlMDhsWCwgJXApO1xuIiwgCisJVFJBQ0UobWNpYW5pbSwiKCV1LCAlMDhsWCwgJXApO1xuIiwgCiAJCQl3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSB7Ci0JCWRwcmludGZfaW5mbyhtY2lhbmltLAotCQkJIkFOSU1fbWNpU3RhdHVzIC8vIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCAKKwkJVFJBQ0UobWNpYW5pbSwgIk1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCAKIAkJCWxwUGFybXMtPmR3Q2FsbGJhY2spOwogCQltY2lEcml2ZXJOb3RpZnkoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAogCQkJQW5pbURldlt3RGV2SURdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKQEAgLTMzNSwxMSArMzI1LDExIEBACiAJCXN3aXRjaChscFBhcm1zLT5kd0l0ZW0pIHsKIAkJCWNhc2UgTUNJX1NUQVRVU19DVVJSRU5UX1RSQUNLOgogCQkJCWxwUGFybXMtPmR3UmV0dXJuID0gQW5pbURldlt3RGV2SURdLm5DdXJUcmFjazsKLQkJCQlkcHJpbnRmX2luZm8obWNpYW5pbSwiQU5JTV9tY2lTdGF0dXMgLy8gQ1VSUkVOVF9UUkFDSz0lbHUhXG4iLCBscFBhcm1zLT5kd1JldHVybik7CisJCQkJVFJBQ0UobWNpYW5pbSwiQ1VSUkVOVF9UUkFDSz0lbHUhXG4iLCBscFBhcm1zLT5kd1JldHVybik7CiAJCQkgCXJldHVybiAwOwogCQkJY2FzZSBNQ0lfU1RBVFVTX0xFTkdUSDoKIAkJCQlpZiAoZHdGbGFncyAmIE1DSV9UUkFDSykgewotCQkJCQlkcHJpbnRmX2luZm8obWNpYW5pbSwiQU5JTV9tY2lTdGF0dXMgLy8gTUNJX1RSQUNLICMlbHUgTEVOR1RIPT8/PyAhXG4iLAorCQkJCQlUUkFDRShtY2lhbmltLCJNQ0lfVFJBQ0sgIyVsdSBMRU5HVEg9Pz8/ICFcbiIsCiAJCQkJCQkJCQkJCQkJCWxwUGFybXMtPmR3VHJhY2spOwogCQkJCQlpZiAobHBQYXJtcy0+ZHdUcmFjayA+IEFuaW1EZXZbd0RldklEXS5uVHJhY2tzKQogCQkJCQkJcmV0dXJuIE1DSUVSUl9PVVRPRlJBTkdFOwpAQCAtMzQ5LDIwICszMzksMjAgQEAKIAkJCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSBBbmltRGV2W3dEZXZJRF0uZHdUb3RhbExlbjsKIAkJCQlscFBhcm1zLT5kd1JldHVybiA9IEFOSU1fQ2FsY1RpbWUod0RldklELCAKIAkJCQkJQW5pbURldlt3RGV2SURdLmR3VGltZUZvcm1hdCwgbHBQYXJtcy0+ZHdSZXR1cm4pOwotICAgICAgICAgICAgICAgIAkJZHByaW50Zl9pbmZvKG1jaWFuaW0sIkFOSU1fbWNpU3RhdHVzIC8vIExFTkdUSD0lbHUgIVxuIiwgbHBQYXJtcy0+ZHdSZXR1cm4pOworICAgICAgICAgICAgICAgIAkJVFJBQ0UobWNpYW5pbSwiTEVOR1RIPSVsdSAhXG4iLCBscFBhcm1zLT5kd1JldHVybik7CiAJCQkgCXJldHVybiAwOwogCQkJY2FzZSBNQ0lfU1RBVFVTX01PREU6CiAJCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSBBbmltRGV2W3dEZXZJRF0ubW9kZTsKLQkJCQlkcHJpbnRmX2luZm8obWNpYW5pbSwiQU5JTV9tY2lTdGF0dXMgLy8gTUNJX1NUQVRVU19NT0RFPSUwOGxYICFcbiIsCisJCQkJVFJBQ0UobWNpYW5pbSwiTUNJX1NUQVRVU19NT0RFPSUwOGxYICFcbiIsCiAJCQkJCQkJCQkJCQlscFBhcm1zLT5kd1JldHVybik7CiAJCQkgCXJldHVybiAwOwogCQkJY2FzZSBNQ0lfU1RBVFVTX01FRElBX1BSRVNFTlQ6CiAJCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSBUUlVFOwotCQkJCWRwcmludGZfaW5mbyhtY2lhbmltLCJBTklNX21jaVN0YXR1cyAvLyBNQ0lfU1RBVFVTX01FRElBX1BSRVNFTlQgIVxuIik7CisJCQkJVFJBQ0UobWNpYW5pbSwiTUNJX1NUQVRVU19NRURJQV9QUkVTRU5UICFcbiIpOwogCQkJIAlyZXR1cm4gMDsKIAkJCWNhc2UgTUNJX1NUQVRVU19OVU1CRVJfT0ZfVFJBQ0tTOgogCQkJCWxwUGFybXMtPmR3UmV0dXJuID0gMTsKLQkJCQlkcHJpbnRmX2luZm8obWNpYW5pbSwiQU5JTV9tY2lTdGF0dXMgLy8gTUNJX1NUQVRVU19OVU1CRVJfT0ZfVFJBQ0tTID0gJWx1ICFcbiIsCisJCQkJVFJBQ0UobWNpYW5pbSwiTUNJX1NUQVRVU19OVU1CRVJfT0ZfVFJBQ0tTID0gJWx1ICFcbiIsCiAJCQkJCQkJCQkJCWxwUGFybXMtPmR3UmV0dXJuKTsKIAkJCQlpZiAobHBQYXJtcy0+ZHdSZXR1cm4gPT0gKFdPUkQpLTEpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJCQkgCXJldHVybiAwOwpAQCAtMzcwLDI1ICszNjAsMjUgQEAKIAkJCQlscFBhcm1zLT5kd1JldHVybiA9IEFuaW1EZXZbd0RldklEXS5kd0N1ckZyYW1lOwogCQkJCWlmIChkd0ZsYWdzICYgTUNJX1NUQVRVU19TVEFSVCkgewogCQkJCQlscFBhcm1zLT5kd1JldHVybiA9IDA7Ci0JCQkJCWRwcmludGZfaW5mbyhtY2lhbmltLCJDREFVRElPX21jaVN0YXR1cyAvLyBnZXQgTUNJX1NUQVRVU19TVEFSVCAhXG4iKTsKKwkJCQkJVFJBQ0UobWNpYW5pbSwiZ2V0IE1DSV9TVEFUVVNfU1RBUlQgIVxuIik7CiAJCQkJCX0KIAkJCQlpZiAoZHdGbGFncyAmIE1DSV9UUkFDSykgewogCQkJCQlpZiAobHBQYXJtcy0+ZHdUcmFjayA+IEFuaW1EZXZbd0RldklEXS5uVHJhY2tzKQogCQkJCQkJcmV0dXJuIE1DSUVSUl9PVVRPRlJBTkdFOwogCQkJCQlscFBhcm1zLT5kd1JldHVybiA9IEFuaW1EZXZbd0RldklEXS5scGR3VHJhY2tQb3NbbHBQYXJtcy0+ZHdUcmFjayAtIDFdOwotCQkJCQlkcHJpbnRmX2luZm8obWNpYW5pbSwiQU5JTV9tY2lTdGF0dXMgLy8gZ2V0IE1DSV9UUkFDSyAjJWx1ICFcbiIsIGxwUGFybXMtPmR3VHJhY2spOworCQkJCQlUUkFDRShtY2lhbmltLCJnZXQgTUNJX1RSQUNLICMlbHUgIVxuIiwgbHBQYXJtcy0+ZHdUcmFjayk7CiAJCQkJCX0KIAkJCQlscFBhcm1zLT5kd1JldHVybiA9IEFOSU1fQ2FsY1RpbWUod0RldklELCAKIAkJCQkJQW5pbURldlt3RGV2SURdLmR3VGltZUZvcm1hdCwgbHBQYXJtcy0+ZHdSZXR1cm4pOwotCQkJCQlkcHJpbnRmX2luZm8obWNpYW5pbSwiQU5JTV9tY2lTdGF0dXMgLy8gTUNJX1NUQVRVU19QT1NJVElPTj0lMDhsWCAhXG4iLAorCQkJCQlUUkFDRShtY2lhbmltLCJNQ0lfU1RBVFVTX1BPU0lUSU9OPSUwOGxYICFcbiIsCiAJCQkJCQkJCQkJCQkJCWxwUGFybXMtPmR3UmV0dXJuKTsKIAkJCSAJcmV0dXJuIDA7CiAJCQljYXNlIE1DSV9TVEFUVVNfUkVBRFk6Ci0JCQkJZHByaW50Zl9pbmZvKG1jaWFuaW0sIkFOSU1fbWNpU3RhdHVzIC8vIE1DSV9TVEFUVVNfUkVBRFkgIVxuIik7CisJCQkJVFJBQ0UobWNpYW5pbSwiTUNJX1NUQVRVU19SRUFEWSAhXG4iKTsKIAkJCQlscFBhcm1zLT5kd1JldHVybiA9IFRSVUU7CiAJCQkgCXJldHVybiAwOwogCQkJY2FzZSBNQ0lfU1RBVFVTX1RJTUVfRk9STUFUOgotCQkJCWRwcmludGZfaW5mbyhtY2lhbmltLCJBTklNX21jaVN0YXR1cyAvLyBNQ0lfU1RBVFVTX1RJTUVfRk9STUFUICFcbiIpOworCQkJCVRSQUNFKG1jaWFuaW0sIk1DSV9TVEFUVVNfVElNRV9GT1JNQVQgIVxuIik7CiAJCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSBNQ0lfRk9STUFUX01JTExJU0VDT05EUzsKIAkJCSAJcmV0dXJuIDA7CiAJCQlkZWZhdWx0OgpAQCAtNDExLDcgKzQwMSw3IEBACiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKIAlpbnQgCXN0YXJ0LCBlbmQ7Ci0JZHByaW50Zl9pbmZvKG1jaWFuaW0sIkFOSU1fbWNpUGxheSgldSwgJTA4bFgsICVwKTtcbiIsIAorCVRSQUNFKG1jaWFuaW0sIigldSwgJTA4bFgsICVwKTtcbiIsIAogCQl3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJc3RhcnQgPSAwOyAJCWVuZCA9IEFuaW1EZXZbd0RldklEXS5kd1RvdGFsTGVuOwpAQCAtNDE5LDIwICs0MDksMTggQEAKIAlpZiAoZHdGbGFncyAmIE1DSV9GUk9NKSB7CiAJCXN0YXJ0ID0gQU5JTV9DYWxjRnJhbWUod0RldklELCAKIAkJCUFuaW1EZXZbd0RldklEXS5kd1RpbWVGb3JtYXQsIGxwUGFybXMtPmR3RnJvbSk7IAotICAgICAgICBkcHJpbnRmX2luZm8obWNpYW5pbSwiQU5JTV9tY2lQbGF5IC8vIE1DSV9GUk9NPSUwOGxYIC0+ICV1IFxuIiwKKyAgICAgICAgVFJBQ0UobWNpYW5pbSwiTUNJX0ZST009JTA4bFggLT4gJXUgXG4iLAogCQkJCWxwUGFybXMtPmR3RnJvbSwgc3RhcnQpOwogCQl9CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfVE8pIHsKIAkJZW5kID0gQU5JTV9DYWxjRnJhbWUod0RldklELCAKIAkJCUFuaW1EZXZbd0RldklEXS5kd1RpbWVGb3JtYXQsIGxwUGFybXMtPmR3VG8pOwotICAgICAgICAJZHByaW50Zl9pbmZvKG1jaWFuaW0sCi0JCQkiQU5JTV9tY2lQbGF5IC8vIE1DSV9UTz0lMDhsWCAtPiAldSBcbiIsCisgICAgICAgIAlUUkFDRShtY2lhbmltLCAiTUNJX1RPPSUwOGxYIC0+ICV1IFxuIiwKIAkJCWxwUGFybXMtPmR3VG8sIGVuZCk7CiAJCX0KIAlBbmltRGV2W3dEZXZJRF0ubW9kZSA9IE1DSV9NT0RFX1BMQVk7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSB7Ci0JCWRwcmludGZfaW5mbyhtY2lhbmltLAotCQkJIkFOSU1fbWNpUGxheSAvLyBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgCisJCVRSQUNFKG1jaWFuaW0sICJNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgCiAJCQlscFBhcm1zLT5kd0NhbGxiYWNrKTsKIAkJbWNpRHJpdmVyTm90aWZ5KChIV05EMTYpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKIAkJCUFuaW1EZXZbd0RldklEXS53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CkBAIC00NDksMTMgKzQzNywxMiBAQAogc3RhdGljIERXT1JEIEFOSU1fbWNpU3RvcChVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9HRU5FUklDX1BBUk1TIGxwUGFybXMpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLQlkcHJpbnRmX2luZm8obWNpYW5pbSwiQU5JTV9tY2lTdG9wKCV1LCAlMDhsWCwgJXApO1xuIiwgCisJVFJBQ0UobWNpYW5pbSwiKCV1LCAlMDhsWCwgJXApO1xuIiwgCiAJCQl3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJQW5pbURldlt3RGV2SURdLm1vZGUgPSBNQ0lfTU9ERV9TVE9QOwogCWlmIChkd0ZsYWdzICYgTUNJX05PVElGWSkgewotCQlkcHJpbnRmX2luZm8obWNpYW5pbSwKLQkJCSJBTklNX21jaVN0b3AgLy8gTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIAorCQlUUkFDRShtY2lhbmltLCAiTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIAogCQkJbHBQYXJtcy0+ZHdDYWxsYmFjayk7CiAJCW1jaURyaXZlck5vdGlmeSgoSFdORDE2KUxPV09SRChscFBhcm1zLT5kd0NhbGxiYWNrKSwgCiAJCQlBbmltRGV2W3dEZXZJRF0ud05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOwpAQCAtNDcyLDEzICs0NTksMTIgQEAKIHN0YXRpYyBEV09SRCBBTklNX21jaVBhdXNlKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcykKIHsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQotCWRwcmludGZfaW5mbyhtY2lhbmltLCJBTklNX21jaVBhdXNlKCV1LCAlMDhsWCwgJXApO1xuIiwgCisJVFJBQ0UobWNpYW5pbSwiKCV1LCAlMDhsWCwgJXApO1xuIiwgCiAJCXdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAlBbmltRGV2W3dEZXZJRF0ubW9kZSA9IE1DSV9NT0RFX1BBVVNFOwogCWlmIChkd0ZsYWdzICYgTUNJX05PVElGWSkgewotCQlkcHJpbnRmX2luZm8obWNpYW5pbSwKLQkJCSJBTklNX21jaVBhdXNlIC8vIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCAKKwkJVFJBQ0UobWNpYW5pbSwgIk1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCAKIAkJCWxwUGFybXMtPmR3Q2FsbGJhY2spOwogCQltY2lEcml2ZXJOb3RpZnkoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAogCQkJQW5pbURldlt3RGV2SURdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKQEAgLTQ5NSwxMyArNDgxLDEyIEBACiBzdGF0aWMgRFdPUkQgQU5JTV9tY2lSZXN1bWUoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfR0VORVJJQ19QQVJNUyBscFBhcm1zKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCi0JZHByaW50Zl9pbmZvKG1jaWFuaW0sIkFOSU1fbWNpUmVzdW1lKCV1LCAlMDhsWCwgJXApO1xuIiwgCisJVFJBQ0UobWNpYW5pbSwiKCV1LCAlMDhsWCwgJXApO1xuIiwgCiAJCXdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAlBbmltRGV2W3dEZXZJRF0ubW9kZSA9IE1DSV9NT0RFX1NUT1A7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSB7Ci0JCWRwcmludGZfaW5mbyhtY2lhbmltLAotCQkJIkFOSU1fbWNpUmVzdW1lIC8vIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCAKKwkJVFJBQ0UobWNpYW5pbSwgIk1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCAKIAkJCWxwUGFybXMtPmR3Q2FsbGJhY2spOwogCQltY2lEcml2ZXJOb3RpZnkoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAogCQkJQW5pbURldlt3RGV2SURdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKQEAgLTUyMCw3ICs1MDUsNyBAQAogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCiAJRFdPUkQJZHdSZXQ7CiAJTUNJX1BMQVlfUEFSTVMgUGxheVBhcm1zOwotCWRwcmludGZfaW5mbyhtY2lhbmltLCJBTklNX21jaVNlZWsoJXUsICUwOGxYLCAlcCk7XG4iLCAKKwlUUkFDRShtY2lhbmltLCIoJXUsICUwOGxYLCAlcCk7XG4iLCAKIAkJd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCUFuaW1EZXZbd0RldklEXS5tb2RlID0gTUNJX01PREVfU0VFSzsKQEAgLTUzOSw4ICs1MjQsNyBAQAogCWlmIChkd1JldCAhPSAwKSByZXR1cm4gZHdSZXQ7CiAJZHdSZXQgPSBBTklNX21jaVN0b3Aod0RldklELCBNQ0lfV0FJVCwgKExQTUNJX0dFTkVSSUNfUEFSTVMpJlBsYXlQYXJtcyk7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSB7Ci0JCWRwcmludGZfaW5mbyhtY2lhbmltLAotCQkJIkFOSU1fbWNpU2VlayAvLyBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgCisJCVRSQUNFKG1jaWFuaW0sICJNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgCiAJCQlscFBhcm1zLT5kd0NhbGxiYWNrKTsKIAkJbWNpRHJpdmVyTm90aWZ5KChIV05EMTYpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKIAkJCUFuaW1EZXZbd0RldklEXS53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CkBAIC01NTgsNyArNTQyLDcgQEAKIHN0YXRpYyBEV09SRCBBTklNX21jaVNldChVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9TRVRfUEFSTVMgbHBQYXJtcykKIHsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQotCWRwcmludGZfaW5mbyhtY2lhbmltLCJBTklNX21jaVNldCgldSwgJTA4bFgsICVwKTtcbiIsIAorCVRSQUNFKG1jaWFuaW0sIigldSwgJTA4bFgsICVwKTtcbiIsIAogCQl3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAvKgpAQCAtNTY4LDE0ICs1NTIsMTMgQEAKIAlpZiAoZHdGbGFncyAmIE1DSV9TRVRfVElNRV9GT1JNQVQpIHsKIAkJc3dpdGNoIChscFBhcm1zLT5kd1RpbWVGb3JtYXQpIHsKIAkJCWNhc2UgTUNJX0ZPUk1BVF9NSUxMSVNFQ09ORFM6Ci0JCQkJZHByaW50Zl9pbmZvKG1jaWFuaW0sCi0JCQkJCSJBTklNX21jaVNldCAvLyBNQ0lfRk9STUFUX01JTExJU0VDT05EUyAhXG4iKTsKKwkJCQlUUkFDRShtY2lhbmltLCAiTUNJX0ZPUk1BVF9NSUxMSVNFQ09ORFMgIVxuIik7CiAJCQkJYnJlYWs7CiAJCQljYXNlIE1DSV9GT1JNQVRfTVNGOgotCQkJCWRwcmludGZfaW5mbyhtY2lhbmltLCJBTklNX21jaVNldCAvLyBNQ0lfRk9STUFUX01TRiAhXG4iKTsKKwkJCQlUUkFDRShtY2lhbmltLCJNQ0lfRk9STUFUX01TRiAhXG4iKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgTUNJX0ZPUk1BVF9UTVNGOgotCQkJCWRwcmludGZfaW5mbyhtY2lhbmltLCJBTklNX21jaVNldCAvLyBNQ0lfRk9STUFUX1RNU0YgIVxuIik7CisJCQkJVFJBQ0UobWNpYW5pbSwiTUNJX0ZPUk1BVF9UTVNGICFcbiIpOwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKIAkJCQlmcHJpbnRmKHN0ZGVyciwiQU5JTV9tY2lTZXQgLy8gYmFkIHRpbWUgZm9ybWF0ICFcbiIpOwpAQCAtNTg3LDggKzU3MCw3IEBACiAJaWYgKGR3RmxhZ3MgJiBNQ0lfU0VUX09OKSByZXR1cm4gTUNJRVJSX1VOU1VQUE9SVEVEX0ZVTkNUSU9OOwogCWlmIChkd0ZsYWdzICYgTUNJX1NFVF9PRkYpIHJldHVybiBNQ0lFUlJfVU5TVVBQT1JURURfRlVOQ1RJT047CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSB7Ci0JCWRwcmludGZfaW5mbyhtY2lhbmltLAotCQkJIkFOSU1fbWNpU2V0IC8vIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCAKKwkJVFJBQ0UobWNpYW5pbSwgIk1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCAKIAkJCWxwUGFybXMtPmR3Q2FsbGJhY2spOwogCQltY2lEcml2ZXJOb3RpZnkoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAogCQkJQW5pbURldlt3RGV2SURdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvbWNpY2RhLmMgYi9tdWx0aW1lZGlhL21jaWNkYS5jCmluZGV4IDdjNDNiN2QuLmEzZmEwNGYgMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvbWNpY2RhLmMKKysrIGIvbXVsdGltZWRpYS9tY2ljZGEuYwpAQCAtMjQsNyArMjQsNiBAQAogI2luY2x1ZGUgPHN5cy9jZGlvLmg+CiAjZW5kaWYKIAotI2RlZmluZSBTT1VORF9ERVYgIi9kZXYvZHNwIgogI2lmZGVmIF9fRnJlZUJTRF9fCiAjZGVmaW5lIENEQVVESU9fREVWICIvZGV2L3JjZDBjIgogI2Vsc2UKQEAgLTk1LDkgKzk0LDggQEAKIAkJCSAgQ0RJT1JFQURUT0NIRUFERVIKICNlbmRpZgogCQkJICAsICZoZHIpKSB7Ci0gICAgICAgICAgICAJCWRwcmludGZfd2FybihjZGF1ZGlvLAotCQkJCSJHZXROdW1iZXJPZlRyYWNrcyglMDRYKSAvLyBFcnJvciBvY2N1cmVkICFcbiIsIAotCQkJCXdEZXZJRCk7CisgICAgICAgICAgICAJCVdBUk4oY2RhdWRpbywgIiglMDRYKSAtLSBFcnJvciBvY2N1cmVkICFcbiIsIAorCQkJCSAgICAgd0RldklEKTsKIAkJCXJldHVybiAoV09SRCktMTsKIAkJCX0KICNpZmRlZiBsaW51eApAQCAtMTMyLDcgKzEzMCw3IEBACiAJaWYgKENEQURldlt3RGV2SURdLm5UcmFja3MgPT0gMCkgewogCQlpZiAoQ0RBVURJT19HZXROdW1iZXJPZlRyYWNrcyh3RGV2SUQpID09IChXT1JEKS0xKSByZXR1cm4gRkFMU0U7CiAJCX0KLSAgICAJZHByaW50Zl9pbmZvKGNkYXVkaW8sIkNEQVVESU9fR2V0VHJhY2tzSW5mbyAvLyBuVHJhY2tzPSV1XG4iLCAKKyAgICAJVFJBQ0UoY2RhdWRpbywiblRyYWNrcz0ldVxuIiwgCiAJCUNEQURldlt3RGV2SURdLm5UcmFja3MpOwogCWlmIChDREFEZXZbd0RldklEXS5scGR3VHJhY2tMZW4gIT0gTlVMTCkgCiAJCWZyZWUoQ0RBRGV2W3dEZXZJRF0ubHBkd1RyYWNrTGVuKTsKQEAgLTE0NCw4ICsxNDIsNyBAQAogCQkoQ0RBRGV2W3dEZXZJRF0ublRyYWNrcyArIDEpICogc2l6ZW9mKERXT1JEKSk7CiAJaWYgKENEQURldlt3RGV2SURdLmxwZHdUcmFja0xlbiA9PSBOVUxMIHx8CiAJCUNEQURldlt3RGV2SURdLmxwZHdUcmFja1BvcyA9PSBOVUxMKSB7Ci0gICAgICAgIAkJZHByaW50Zl93YXJuKGNkYXVkaW8sCi0JCQkJIkNEQVVESU9fR2V0VHJhY2tzSW5mbyAvLyBlcnJvciBhbGxvY2F0aW5nIHRyYWNrIHRhYmxlICFcbiIpOworICAgICAgICAJCVdBUk4oY2RhdWRpbywgImVycm9yIGFsbG9jYXRpbmcgdHJhY2sgdGFibGUgIVxuIik7CiAJCXJldHVybiBGQUxTRTsKIAkJfQogCW1lbXNldChDREFEZXZbd0RldklEXS5scGR3VHJhY2tMZW4sIDAsIApAQCAtMTgxLDggKzE3OCw3IEBACiAJCQkgIENESU9SRUFEVE9DRU5UUllTCiAjZW5kaWYKIAkJCSAgLCAmZW50cnkpKSB7Ci0gICAgICAgICAgICAJCWRwcmludGZfd2FybihjZGF1ZGlvLAotCQkJCSJDREFVRElPX0dldFRyYWNrc0luZm8gLy8gZXJyb3IgcmVhZCBlbnRyeVxuIik7CisgICAgICAgICAgICAJCVdBUk4oY2RhdWRpbywgImVycm9yIHJlYWQgZW50cnlcbiIpOwogCQkJcmV0dXJuIEZBTFNFOwogCQkJfQogI2lmZGVmIGxpbnV4CkBAIC0xOTcsOCArMTkzLDcgQEAKIAkJaWYgKGkgPT0gMCkgewogCQkJbGFzdF9zdGFydCA9IHN0YXJ0OwogCQkJQ0RBRGV2W3dEZXZJRF0uZHdGaXJzdE9mZnNldCA9IHN0YXJ0OwotICAgICAgICAgICAgCQlkcHJpbnRmX2luZm8oY2RhdWRpbywKLQkJCQkiQ0RBVURJT19HZXRUcmFja3NJbmZvIC8vIGR3Rmlyc3RPZmZzZXQ9JXVcbiIsIAorICAgICAgICAgICAgCQlUUkFDRShjZGF1ZGlvLCAiZHdGaXJzdE9mZnNldD0ldVxuIiwgCiAJCQkJc3RhcnQpOwogCQkJfQogCQllbHNlIHsKQEAgLTIwOCwxMyArMjAzLDEyIEBACiAJCQl0b3RhbF9sZW5ndGggKz0gbGVuZ3RoOwogCQkJQ0RBRGV2W3dEZXZJRF0ubHBkd1RyYWNrTGVuW2kgLSAxXSA9IGxlbmd0aDsKIAkJCUNEQURldlt3RGV2SURdLmxwZHdUcmFja1Bvc1tpIC0gMV0gPSBzdGFydDsKLSAgICAgICAgICAgIAkJZHByaW50Zl9pbmZvKGNkYXVkaW8sCi0JCQkiQ0RBVURJT19HZXRUcmFja3NJbmZvIC8vIHRyYWNrICMldSBzdGFydD0ldSBsZW49JXVcbiIsCi0JCQkJaSwgc3RhcnQsIGxlbmd0aCk7CisgICAgICAgICAgICAJCVRSQUNFKGNkYXVkaW8sICJ0cmFjayAjJXUgc3RhcnQ9JXUgbGVuPSV1XG4iLAorCQkJCSAgICAgaSwgc3RhcnQsIGxlbmd0aCk7CiAJCQl9CiAJCX0KIAlDREFEZXZbd0RldklEXS5kd1RvdGFsTGVuID0gdG90YWxfbGVuZ3RoOwotICAgIAlkcHJpbnRmX2luZm8oY2RhdWRpbywiQ0RBVURJT19HZXRUcmFja3NJbmZvIC8vIHRvdGFsX2xlbj0ldVxuIiwgCisgICAgCVRSQUNFKGNkYXVkaW8sInRvdGFsX2xlbj0ldVxuIiwgCiAJCXRvdGFsX2xlbmd0aCk7CiAJcmV0dXJuIFRSVUU7CiAjZWxzZQpAQCAtMjI5LDcgKzIyMyw3IEBACiBzdGF0aWMgRFdPUkQgQ0RBVURJT19tY2lPcGVuKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX09QRU5fUEFSTVMxNiBscFBhcm1zKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCi0gICAgCWRwcmludGZfaW5mbyhjZGF1ZGlvLCJDREFVRElPX21jaU9wZW4oJTA0WCwgJTA4bFgsICVwKTtcbiIsIAorICAgIAlUUkFDRShjZGF1ZGlvLCIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIAogCQkJCQl3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAKQEAgLTI0NywxNCArMjQxLDE0IEBACiAJCUNEQURldlt3RGV2SURdLmZTaGFyZWFibGUgPSBkd0ZsYWdzICYgTUNJX09QRU5fU0hBUkVBQkxFOwogCQl9CiAgICAgaWYgKGR3RmxhZ3MgJiBNQ0lfT1BFTl9FTEVNRU5UKSB7Ci0JCWRwcmludGZfaW5mbyhjZGF1ZGlvLCJDREFVRElPX21jaU9wZW4gLy8gTUNJX09QRU5fRUxFTUVOVCAhXG4iKTsKKwkJVFJBQ0UoY2RhdWRpbywiTUNJX09QRU5fRUxFTUVOVCAhXG4iKTsKIC8qCQlyZXR1cm4gTUNJRVJSX05PX0VMRU1FTlRfQUxMT1dFRDsgKi8KIAkJfQogCW1lbWNweSgmQ0RBRGV2W3dEZXZJRF0ub3BlblBhcm1zLCBscFBhcm1zLCBzaXplb2YoTUNJX09QRU5fUEFSTVMxNikpOwogCUNEQURldlt3RGV2SURdLndOb3RpZnlEZXZpY2VJRCA9IGxwUGFybXMtPndEZXZpY2VJRDsKIAlDREFEZXZbd0RldklEXS51bml4ZGV2ID0gb3BlbiAoQ0RBVURJT19ERVYsIE9fUkRPTkxZLCAwKTsKIAlpZiAoQ0RBRGV2W3dEZXZJRF0udW5peGRldiA9PSAtMSkgewotCQlkcHJpbnRmX3dhcm4oY2RhdWRpbywiQ0RBVURJT19tY2lPcGVuIC8vIGNhbid0IG9wZW4gJyVzJyAhXG4iLCBDREFVRElPX0RFVik7CisJCVdBUk4oY2RhdWRpbywiY2FuJ3Qgb3BlbiAnJXMnICFcbiIsIENEQVVESU9fREVWKTsKIAkJcmV0dXJuIE1DSUVSUl9IQVJEV0FSRTsKIAkJfQogCUNEQURldlt3RGV2SURdLm1vZGUgPSAwOwpAQCAtMjY2LDcgKzI2MCw3IEBACiAJQ0RBRGV2W3dEZXZJRF0ubHBkd1RyYWNrTGVuID0gTlVMTDsKIAlDREFEZXZbd0RldklEXS5scGR3VHJhY2tQb3MgPSBOVUxMOwogCWlmICghQ0RBVURJT19HZXRUcmFja3NJbmZvKHdEZXZJRCkpIHsKLQkJZHByaW50Zl93YXJuKGNkYXVkaW8sIkNEQVVESU9fbWNpT3BlbiAvLyBlcnJvciByZWFkaW5nIFRyYWNrc0luZm8gIVxuIik7CisJCVdBUk4oY2RhdWRpbywiZXJyb3IgcmVhZGluZyBUcmFja3NJbmZvICFcbiIpOwogLyoJCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7ICovCiAJCX0KIApAQCAtMjc0LDggKzI2OCw3IEBACiAgICBNb3ZlZCB0byBtbXN5c3RlbS5jIG1jaU9wZW4gcm91dGluZQogCiAJaWYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSB7Ci0gICAgICAgIAlkcHJpbnRmX2luZm8oY2RhdWRpbywKLQkJCSJDREFVRElPX21jaU9wZW4gLy8gTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIAorICAgICAgICAJVFJBQ0UoY2RhdWRpbywgIk1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCAKIAkJCWxwUGFybXMtPmR3Q2FsbGJhY2spOwogCQltY2lEcml2ZXJOb3RpZnkoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAogCQkJQ0RBRGV2W3dEZXZJRF0ud05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOwpAQCAtMjkzLDcgKzI4Niw3IEBACiBzdGF0aWMgRFdPUkQgQ0RBVURJT19tY2lDbG9zZShVSU5UMTYgd0RldklELCBEV09SRCBkd1BhcmFtLCBMUE1DSV9HRU5FUklDX1BBUk1TIGxwUGFybXMpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLSAgICAJZHByaW50Zl9pbmZvKGNkYXVkaW8sIkNEQVVESU9fbWNpQ2xvc2UoJTA0WCwgJTA4bFgsICVwKTtcbiIsIAorICAgIAlUUkFDRShjZGF1ZGlvLCIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIAogCQl3RGV2SUQsIGR3UGFyYW0sIGxwUGFybXMpOwogCWlmIChDREFEZXZbd0RldklEXS5scGR3VHJhY2tMZW4gIT0gTlVMTCkgZnJlZShDREFEZXZbd0RldklEXS5scGR3VHJhY2tMZW4pOwogCWlmIChDREFEZXZbd0RldklEXS5scGR3VHJhY2tQb3MgIT0gTlVMTCkgZnJlZShDREFEZXZbd0RldklEXS5scGR3VHJhY2tQb3MpOwpAQCAtMzA5LDEzICszMDIsMTIgQEAKIAkJCQkJCUxQTUNJX0dFVERFVkNBUFNfUEFSTVMgbHBQYXJtcykKIHsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQotICAgIAlkcHJpbnRmX2luZm8oY2RhdWRpbywiQ0RBVURJT19tY2lHZXREZXZDYXBzKCUwNFgsICUwOGxYLCAlcCk7XG4iLCAKKyAgICAJVFJBQ0UoY2RhdWRpbywiKCUwNFgsICUwOGxYLCAlcCk7XG4iLCAKIAkJd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCWlmIChkd0ZsYWdzICYgTUNJX0dFVERFVkNBUFNfSVRFTSkgewotICAgICAgICAJZHByaW50Zl9pbmZvKGNkYXVkaW8sCi0JCSJDREFVRElPX21jaUdldERldkNhcHMgLy8gTUNJX0dFVERFVkNBUFNfSVRFTSBkd0l0ZW09JTA4bFg7XG4iLAotCQkJCWxwUGFybXMtPmR3SXRlbSk7CisgICAgICAgIAlUUkFDRShjZGF1ZGlvLCAiTUNJX0dFVERFVkNBUFNfSVRFTSBkd0l0ZW09JTA4bFg7XG4iLAorCQkJICAgICBscFBhcm1zLT5kd0l0ZW0pOwogCQlzd2l0Y2gobHBQYXJtcy0+ZHdJdGVtKSB7CiAJCQljYXNlIE1DSV9HRVRERVZDQVBTX0NBTl9SRUNPUkQ6CiAJCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSBGQUxTRTsKQEAgLTM0OCw4ICszNDAsNyBAQAogCQkJCXJldHVybiBNQ0lFUlJfVU5SRUNPR05JWkVEX0NPTU1BTkQ7CiAJCQl9CiAJCX0KLSAgICAJZHByaW50Zl9pbmZvKGNkYXVkaW8sCi0JCSJDREFVRElPX21jaUdldERldkNhcHMgLy8gbHBQYXJtcy0+ZHdSZXR1cm49JTA4bFg7XG4iLCAKKyAgICAJVFJBQ0UoY2RhdWRpbywgImxwUGFybXMtPmR3UmV0dXJuPSUwOGxYO1xuIiwgCiAJCWxwUGFybXMtPmR3UmV0dXJuKTsKICAJcmV0dXJuIDA7CiAjZWxzZQpAQCAtMzYzLDcgKzM1NCw3IEBACiBzdGF0aWMgRFdPUkQgQ0RBVURJT19tY2lJbmZvKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0lORk9fUEFSTVMxNiBscFBhcm1zKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCi0gICAgCWRwcmludGZfaW5mbyhjZGF1ZGlvLCJDREFVRElPX21jaUluZm8oJTA0WCwgJTA4bFgsICVwKTtcbiIsIAorICAgIAlUUkFDRShjZGF1ZGlvLCIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIAogCQl3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJbHBQYXJtcy0+bHBzdHJSZXR1cm4gPSBOVUxMOwpAQCAtMzk0LDE5ICszODUsMTcgQEAKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQogCVVJTlQxNgl3VHJhY2s7CiAgICAgCi0gICAgCWRwcmludGZfaW5mbyhjZGF1ZGlvLCJDREFVRElPX0NhbGNGcmFtZSglMDRYLCAlMDhsWCwgJWx1KTtcbiIsIAorICAgIAlUUkFDRShjZGF1ZGlvLCIoJTA0WCwgJTA4bFgsICVsdSk7XG4iLCAKIAkJd0RldklELCBkd0Zvcm1hdFR5cGUsIGR3VGltZSk7CiAgICAgCiAJc3dpdGNoIChkd0Zvcm1hdFR5cGUpIHsKIAkJY2FzZSBNQ0lfRk9STUFUX01JTExJU0VDT05EUzoKIAkJCWR3RnJhbWUgPSBkd1RpbWUgKiBDREZSQU1FU19QRVJTRUMgLyAxMDAwOwotICAgICAgICAgICAgCQlkcHJpbnRmX2luZm8oY2RhdWRpbywKLQkJCQkiQ0RBVURJT19DYWxjRnJhbWUgLy8gTUlMTElTRUNPTkRTICVsdVxuIiwgCisgICAgICAgICAgICAJCVRSQUNFKGNkYXVkaW8sICJNSUxMSVNFQ09ORFMgJWx1XG4iLCAKIAkJCQlkd0ZyYW1lKTsKIAkJCWJyZWFrOwogCQljYXNlIE1DSV9GT1JNQVRfTVNGOgotICAgICAgICAgICAgCQlkcHJpbnRmX2luZm8oY2RhdWRpbywKLQkJCQkiQ0RBVURJT19DYWxjRnJhbWUgLy8gTVNGICUwMnU6JTAydTolMDJ1XG4iLAorICAgICAgICAgICAgCQlUUkFDRShjZGF1ZGlvLCAiTVNGICUwMnU6JTAydTolMDJ1XG4iLAogCQkJCU1DSV9NU0ZfTUlOVVRFKGR3VGltZSksIE1DSV9NU0ZfU0VDT05EKGR3VGltZSksIAogCQkJCU1DSV9NU0ZfRlJBTUUoZHdUaW1lKSk7CiAJCQlkd0ZyYW1lICs9IENERlJBTUVTX1BFUk1JTiAqIE1DSV9NU0ZfTUlOVVRFKGR3VGltZSk7CkBAIC00MTgsMTIgKzQwNywxMCBAQAogCQkJZHdGb3JtYXRUeXBlID0gTUNJX0ZPUk1BVF9UTVNGOwogCQljYXNlIE1DSV9GT1JNQVRfVE1TRjoKIAkJCXdUcmFjayA9IE1DSV9UTVNGX1RSQUNLKGR3VGltZSk7Ci0gICAgICAgICAgICAJCWRwcmludGZfaW5mbyhjZGF1ZGlvLAotCQkJIkNEQVVESU9fQ2FsY0ZyYW1lIC8vIFRNU0YgJTAydS0lMDJ1OiUwMnU6JTAydVxuIiwKKyAgICAgICAgICAgIAkJVFJBQ0UoY2RhdWRpbywgIk1TRiAlMDJ1LSUwMnU6JTAydTolMDJ1XG4iLAogCQkJCQlNQ0lfVE1TRl9UUkFDSyhkd1RpbWUpLCBNQ0lfVE1TRl9NSU5VVEUoZHdUaW1lKSwgCiAJCQkJCU1DSV9UTVNGX1NFQ09ORChkd1RpbWUpLCBNQ0lfVE1TRl9GUkFNRShkd1RpbWUpKTsKLSAgICAgICAgICAgIAkJZHByaW50Zl9pbmZvKGNkYXVkaW8sCi0JCQkJIkNEQVVESU9fQ2FsY0ZyYW1lIC8vIFRNU0YgdHJhY2twb3NbJXVdPSVsdVxuIiwKKyAgICAgICAgICAgIAkJVFJBQ0UoY2RhdWRpbywgIlRNU0YgdHJhY2twb3NbJXVdPSVsdVxuIiwKIAkJCQl3VHJhY2ssIENEQURldlt3RGV2SURdLmxwZHdUcmFja1Bvc1t3VHJhY2sgLSAxXSk7CiAJCQlkd0ZyYW1lID0gQ0RBRGV2W3dEZXZJRF0ubHBkd1RyYWNrUG9zW3dUcmFjayAtIDFdOwogCQkJZHdGcmFtZSArPSBDREZSQU1FU19QRVJNSU4gKiBNQ0lfVE1TRl9NSU5VVEUoZHdUaW1lKTsKQEAgLTQ2MSw3ICs0NDgsNyBAQAogCQkgIENESU9DUkVBRFNVQkNIQU5ORUwsICZyZWFkX3NjCiAjZW5kaWYKIAkJICApKSB7Ci0gICAgICAgIAlkcHJpbnRmX2luZm8oY2RhdWRpbywiQ0RBVURJT19HZXRDRFN0YXR1cyAvLyBvcGVuZWQgb3Igbm9fbWVkaWEgIVxuIik7CisgICAgICAgIAlUUkFDRShjZGF1ZGlvLCJvcGVuZWQgb3Igbm9fbWVkaWEgIVxuIik7CiAJCUNEQURldlt3RGV2SURdLm1vZGUgPSBNQ0lfTU9ERV9OT1RfUkVBRFk7CiAJCXJldHVybiBUUlVFOwogCQl9CkBAIC00NzcsNyArNDY0LDcgQEAKICNlbGlmIF9fRnJlZUJTRF9fCiAJCWNhc2UgQ0RfQVNfQVVESU9fSU5WQUxJRDoKICNlbmRpZgotICAgICAgICAgICAgCQlkcHJpbnRmX3dhcm4oY2RhdWRpbywgIkNEQVVESU9fR2V0Q0RTdGF0dXMgLy8gZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBzdGF0dXMsIHJldHVybmluZyBOT1RfUkVBRFkuXG4iKTsKKyAgICAgICAgICAgIAkJV0FSTihjZGF1ZGlvLCAiZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBzdGF0dXMsIHJldHVybmluZyBOT1RfUkVBRFkuXG4iKTsKICNpZmRlZiBsaW51eAogCQkJQ0RBRGV2W3dEZXZJRF0ubW9kZSA9IE1DSV9NT0RFX05PVF9SRUFEWTsKICNlbGlmIF9fRnJlZUJTRF9fCkBAIC00OTAsNyArNDc3LDcgQEAKIAkJY2FzZSBDRF9BU19OT19TVEFUVVM6CiAjZW5kaWYKIAkJCUNEQURldlt3RGV2SURdLm1vZGUgPSBNQ0lfTU9ERV9TVE9QOwotICAgICAgICAgICAgCQlkcHJpbnRmX2luZm8oY2RhdWRpbywiQ0RBVURJT19HZXRDRFN0YXR1cyAvLyBNQ0lfTU9ERV9TVE9QICFcbiIpOworICAgICAgICAgICAgCQlUUkFDRShjZGF1ZGlvLCJNQ0lfTU9ERV9TVE9QICFcbiIpOwogCQkJYnJlYWs7CiAjaWZkZWYgbGludXgKIAkJY2FzZSBDRFJPTV9BVURJT19QTEFZOiAKQEAgLTQ5OCw3ICs0ODUsNyBAQAogCQljYXNlIENEX0FTX1BMQVlfSU5fUFJPR1JFU1M6CiAjZW5kaWYKIAkJCUNEQURldlt3RGV2SURdLm1vZGUgPSBNQ0lfTU9ERV9QTEFZOwotICAgICAgICAgICAgCQlkcHJpbnRmX2luZm8oY2RhdWRpbywiQ0RBVURJT19HZXRDRFN0YXR1cyAvLyBNQ0lfTU9ERV9QTEFZICFcbiIpOworICAgICAgICAgICAgCQlUUkFDRShjZGF1ZGlvLCJNQ0lfTU9ERV9QTEFZICFcbiIpOwogCQkJYnJlYWs7CiAjaWZkZWYgbGludXgKIAkJY2FzZSBDRFJPTV9BVURJT19QQVVTRUQ6CkBAIC01MDYsMTQgKzQ5MywxNCBAQAogCQljYXNlIENEX0FTX1BMQVlfUEFVU0VEOgogI2VuZGlmCiAJCQlDREFEZXZbd0RldklEXS5tb2RlID0gTUNJX01PREVfUEFVU0U7Ci0gICAgICAgICAgICAJCWRwcmludGZfaW5mbyhjZGF1ZGlvLCJDREFVRElPX0dldENEU3RhdHVzIC8vIE1DSV9NT0RFX1BBVVNFICFcbiIpOworICAgICAgICAgICAgCQlUUkFDRShjZGF1ZGlvLCJNQ0lfTU9ERV9QQVVTRSAhXG4iKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogI2lmZGVmIGxpbnV4Ci0gICAgICAgICAgICAJCWRwcmludGZfaW5mbyhjZGF1ZGlvLCJDREFVRElPX0dldENEU3RhdHVzIC8vIHN0YXR1cz0lMDJYICFcbiIsCisgICAgICAgICAgICAJCVRSQUNFKGNkYXVkaW8sInN0YXR1cz0lMDJYICFcbiIsCiAJCQkJICAgICBDREFEZXZbd0RldklEXS5zYy5jZHNjX2F1ZGlvc3RhdHVzKTsKICNlbGlmIF9fRnJlZUJTRF9fCi0gICAgICAgICAgICAJCWRwcmludGZfaW5mbyhjZGF1ZGlvLCJDREFVRElPX0dldENEU3RhdHVzIC8vIHN0YXR1cz0lMDJYICFcbiIsCisgICAgICAgICAgICAJCVRSQUNFKGNkYXVkaW8sInN0YXR1cz0lMDJYICFcbiIsCiAJCQkJICAgICBDREFEZXZbd0RldklEXS5zYy5oZWFkZXIuYXVkaW9fc3RhdHVzKTsKICNlbmRpZgogCQl9CkBAIC01MzEsMTMgKzUxOCwxMyBAQAogCQlDREFEZXZbd0RldklEXS5zYy53aGF0LnBvc2l0aW9uLmFic2FkZHIubXNmLmZyYW1lOwogI2VuZGlmCiAjaWZkZWYgbGludXgKLSAgICAJZHByaW50Zl9pbmZvKGNkYXVkaW8sIkNEQVVESU9fR2V0Q0RTdGF0dXMgLy8gJTAydS0lMDJ1OiUwMnU6JTAydSBcbiIsCisgICAgCVRSQUNFKGNkYXVkaW8sIiUwMnUtJTAydTolMDJ1OiUwMnUgXG4iLAogCQkgICAgIENEQURldlt3RGV2SURdLnNjLmNkc2NfdHJrLAogCQkgICAgIENEQURldlt3RGV2SURdLnNjLmNkc2NfYWJzYWRkci5tc2YubWludXRlLAogCQkgICAgIENEQURldlt3RGV2SURdLnNjLmNkc2NfYWJzYWRkci5tc2Yuc2Vjb25kLAogCQkgICAgIENEQURldlt3RGV2SURdLnNjLmNkc2NfYWJzYWRkci5tc2YuZnJhbWUpOwogI2VsaWYgX19GcmVlQlNEX18KLSAgICAJZHByaW50Zl9pbmZvKGNkYXVkaW8sIkNEQVVESU9fR2V0Q0RTdGF0dXMgLy8gJTAydS0lMDJ1OiUwMnU6JTAydSBcbiIsCisgICAgCVRSQUNFKGNkYXVkaW8sIiUwMnUtJTAydTolMDJ1OiUwMnUgXG4iLAogCQkgICAgIENEQURldlt3RGV2SURdLnNjLndoYXQucG9zaXRpb24udHJhY2tfbnVtYmVyLAogCQkgICAgIENEQURldlt3RGV2SURdLnNjLndoYXQucG9zaXRpb24uYWJzYWRkci5tc2YubWludXRlLAogCQkgICAgIENEQURldlt3RGV2SURdLnNjLndoYXQucG9zaXRpb24uYWJzYWRkci5tc2Yuc2Vjb25kLApAQCAtNTQ2LDcgKzUzMyw3IEBACiAJCQkKIAlpZiAob2xkbW9kZSAhPSBDREFEZXZbd0RldklEXS5tb2RlICYmIG9sZG1vZGUgPT0gTUNJX01PREVfT1BFTikgewogCQlpZiAoIUNEQVVESU9fR2V0VHJhY2tzSW5mbyh3RGV2SUQpKSB7Ci0JCSAgZHByaW50Zl93YXJuKGNkYXVkaW8sICJDREFVRElPX0dldENEU3RhdHVzIC8vIGVycm9yIHVwZGF0aW5nIFRyYWNrc0luZm8gIVxuIik7CisJCSAgV0FSTihjZGF1ZGlvLCAiZXJyb3IgdXBkYXRpbmcgVHJhY2tzSW5mbyAhXG4iKTsKIAkJCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJCQl9CiAJCX0KQEAgLTU2OSwxNCArNTU2LDEzIEBACiAJVUlOVDE2CXdTZWNvbmRzOwogCVVJTlQxNgl3RnJhbWVzOwogCi0gICAgCWRwcmludGZfaW5mbyhjZGF1ZGlvLCJDREFVRElPX0NhbGNUaW1lKCUwNFgsICUwOGxYLCAlbHUpO1xuIiwgCisgICAgCVRSQUNFKGNkYXVkaW8sIiglMDRYLCAlMDhsWCwgJWx1KTtcbiIsIAogCQl3RGV2SUQsIGR3Rm9ybWF0VHlwZSwgZHdGcmFtZSk7CiAKIAlzd2l0Y2ggKGR3Rm9ybWF0VHlwZSkgewogCQljYXNlIE1DSV9GT1JNQVRfTUlMTElTRUNPTkRTOgogCQkJZHdUaW1lID0gZHdGcmFtZSAvIENERlJBTUVTX1BFUlNFQyAqIDEwMDA7Ci0gICAgICAgICAgICAJCWRwcmludGZfaW5mbyhjZGF1ZGlvLAotCQkJCSJDREFVRElPX0NhbGNUaW1lIC8vIE1JTExJU0VDT05EUyAlbHVcbiIsIAorICAgICAgICAgICAgCQlUUkFDRShjZGF1ZGlvLCAiTUlMTElTRUNPTkRTICVsdVxuIiwgCiAJCQkJZHdUaW1lKTsKIAkJCWJyZWFrOwogCQljYXNlIE1DSV9GT1JNQVRfTVNGOgpAQCAtNTg1LDcgKzU3MSw3IEBACiAJCQl3RnJhbWVzID0gZHdGcmFtZSAtIENERlJBTUVTX1BFUk1JTiAqIHdNaW51dGVzIC0gCiAJCQkJCQkJCUNERlJBTUVTX1BFUlNFQyAqIHdTZWNvbmRzOwogCQkJZHdUaW1lID0gTUNJX01BS0VfTVNGKHdNaW51dGVzLCB3U2Vjb25kcywgd0ZyYW1lcyk7Ci0gICAgICAgICAgICAJCWRwcmludGZfaW5mbyhjZGF1ZGlvLCJDREFVRElPX0NhbGNUaW1lIC8vIE1TRiAlMDJ1OiUwMnU6JTAydSAtPiBkd1RpbWU9JWx1XG4iLAorICAgICAgICAgICAgCQlUUkFDRShjZGF1ZGlvLCJNU0YgJTAydTolMDJ1OiUwMnUgLT4gZHdUaW1lPSVsdVxuIiwKIAkJCQkJCQkJd01pbnV0ZXMsIHdTZWNvbmRzLCB3RnJhbWVzLCBkd1RpbWUpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CkBAIC02MDMsOCArNTg5LDcgQEAKIAkJCXdGcmFtZXMgPSBkd0ZyYW1lIC0gQ0RGUkFNRVNfUEVSTUlOICogd01pbnV0ZXMgLSAKIAkJCQkJCQkJQ0RGUkFNRVNfUEVSU0VDICogd1NlY29uZHM7CiAJCQlkd1RpbWUgPSBNQ0lfTUFLRV9UTVNGKHdUcmFjaywgd01pbnV0ZXMsIHdTZWNvbmRzLCB3RnJhbWVzKTsKLSAgICAgICAgICAgIAkJZHByaW50Zl9pbmZvKGNkYXVkaW8sCi0JCQkJIkNEQVVESU9fQ2FsY1RpbWUgLy8gJTAydS0lMDJ1OiUwMnU6JTAydVxuIiwKKyAgICAgICAgICAgIAkJVFJBQ0UoY2RhdWRpbywgIiUwMnUtJTAydTolMDJ1OiUwMnVcbiIsCiAJCQkJCXdUcmFjaywgd01pbnV0ZXMsIHdTZWNvbmRzLCB3RnJhbWVzKTsKIAkJCWJyZWFrOwogCQl9CkBAIC02MTksMTMgKzYwNCwxMiBAQAogc3RhdGljIERXT1JEIENEQVVESU9fbWNpU3RhdHVzKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX1NUQVRVU19QQVJNUyBscFBhcm1zKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCi0gICAgCWRwcmludGZfaW5mbyhjZGF1ZGlvLCJDREFVRElPX21jaVN0YXR1cyglMDRYLCAlMDhsWCwgJXApO1xuIiwgCisgICAgCVRSQUNFKGNkYXVkaW8sIiglMDRYLCAlMDhsWCwgJXApO1xuIiwgCiAJCXdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAlpZiAoQ0RBRGV2W3dEZXZJRF0udW5peGRldiA9PSAwKSByZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAlpZiAoZHdGbGFncyAmIE1DSV9OT1RJRlkpIHsKLSAgICAgICAgCWRwcmludGZfaW5mbyhjZGF1ZGlvLAotCQkJIkNEQVVESU9fbWNpU3RhdHVzIC8vIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCAKKyAgICAgICAgCVRSQUNFKGNkYXVkaW8sICJNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgCiAJCQlscFBhcm1zLT5kd0NhbGxiYWNrKTsKIAkJbWNpRHJpdmVyTm90aWZ5KChIV05EMTYpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKIAkJCUNEQURldlt3RGV2SURdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKQEAgLTYzNSwxNyArNjE5LDE3IEBACiAJCQljYXNlIE1DSV9TVEFUVVNfQ1VSUkVOVF9UUkFDSzoKIAkJCQlpZiAoIUNEQVVESU9fR2V0Q0RTdGF0dXMod0RldklEKSkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAkJCQlscFBhcm1zLT5kd1JldHVybiA9IENEQURldlt3RGV2SURdLm5DdXJUcmFjazsKLSAgICAgICAgICAgICAgICAJCWRwcmludGZfaW5mbyhjZGF1ZGlvLCJDREFVRElPX21jaVN0YXR1cyAvLyBDVVJSRU5UX1RSQUNLPSVsdSFcbiIsIGxwUGFybXMtPmR3UmV0dXJuKTsKKyAgICAgICAgICAgICAgICAJCVRSQUNFKGNkYXVkaW8sIkNVUlJFTlRfVFJBQ0s9JWx1IVxuIiwgbHBQYXJtcy0+ZHdSZXR1cm4pOwogCQkJIAlyZXR1cm4gMDsKIAkJCWNhc2UgTUNJX1NUQVRVU19MRU5HVEg6CiAJCQkJaWYgKENEQURldlt3RGV2SURdLm5UcmFja3MgPT0gMCkgewogCQkJCQlpZiAoIUNEQVVESU9fR2V0VHJhY2tzSW5mbyh3RGV2SUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAJCQlkcHJpbnRmX3dhcm4oY2RhdWRpbywgIkNEQVVESU9fbWNpU3RhdHVzIC8vIGVycm9yIHJlYWRpbmcgVHJhY2tzSW5mbyAhXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAkJCVdBUk4oY2RhdWRpbywgImVycm9yIHJlYWRpbmcgVHJhY2tzSW5mbyAhXG4iKTsKIAkJCQkJCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJCQkJCQl9CiAJCQkJCX0KIAkJCQlpZiAoZHdGbGFncyAmIE1DSV9UUkFDSykgewotCQkJCQlkcHJpbnRmX2luZm8oY2RhdWRpbywiQ0RBVURJT19tY2lTdGF0dXMgLy8gTUNJX1RSQUNLICMlbHUgTEVOR1RIPT8/PyAhXG4iLAorCQkJCQlUUkFDRShjZGF1ZGlvLCJNQ0lfVFJBQ0sgIyVsdSBMRU5HVEg9Pz8/ICFcbiIsCiAJCQkJCQkJbHBQYXJtcy0+ZHdUcmFjayk7CiAJCQkJCWlmIChscFBhcm1zLT5kd1RyYWNrID4gQ0RBRGV2W3dEZXZJRF0ublRyYWNrcykKIAkJCQkJCXJldHVybiBNQ0lFUlJfT1VUT0ZSQU5HRTsKQEAgLTY1NSwyNCArNjM5LDI0IEBACiAJCQkJCWxwUGFybXMtPmR3UmV0dXJuID0gQ0RBRGV2W3dEZXZJRF0uZHdUb3RhbExlbjsKIAkJCQlscFBhcm1zLT5kd1JldHVybiA9IENEQVVESU9fQ2FsY1RpbWUod0RldklELCAKIAkJCQkJQ0RBRGV2W3dEZXZJRF0uZHdUaW1lRm9ybWF0LCBscFBhcm1zLT5kd1JldHVybik7Ci0gICAgICAgICAgICAgICAgCQlkcHJpbnRmX2luZm8oY2RhdWRpbywiQ0RBVURJT19tY2lTdGF0dXMgLy8gTEVOR1RIPSVsdSAhXG4iLCBscFBhcm1zLT5kd1JldHVybik7CisgICAgICAgICAgICAgICAgCQlUUkFDRShjZGF1ZGlvLCJMRU5HVEg9JWx1ICFcbiIsIGxwUGFybXMtPmR3UmV0dXJuKTsKIAkJCSAJcmV0dXJuIDA7CiAJCQljYXNlIE1DSV9TVEFUVVNfTU9ERToKIAkJCQlpZiAoIUNEQVVESU9fR2V0Q0RTdGF0dXMod0RldklEKSkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAkJCQlscFBhcm1zLT5kd1JldHVybiA9IENEQURldlt3RGV2SURdLm1vZGU7Ci0gICAgICAgICAgICAgICAgCQlkcHJpbnRmX2luZm8oY2RhdWRpbywiQ0RBVURJT19tY2lTdGF0dXMgLy8gTUNJX1NUQVRVU19NT0RFPSUwOGxYICFcbiIsCisgICAgICAgICAgICAgICAgCQlUUkFDRShjZGF1ZGlvLCJNQ0lfU1RBVFVTX01PREU9JTA4bFggIVxuIiwKIAkJCQkJCQkJCQkJCWxwUGFybXMtPmR3UmV0dXJuKTsKIAkJCSAJcmV0dXJuIDA7CiAJCQljYXNlIE1DSV9TVEFUVVNfTUVESUFfUFJFU0VOVDoKIAkJCQlscFBhcm1zLT5kd1JldHVybiA9IChDREFEZXZbd0RldklEXS5uVHJhY2tzID4gMCkgPyBUUlVFIDogRkFMU0U7CiAJCQkJaWYgKGxwUGFybXMtPmR3UmV0dXJuID09IEZBTFNFKQotICAgICAgICAgICAgICAgICAgICAJCQlkcHJpbnRmX2luZm8oY2RhdWRpbywiQ0RBVURJT19tY2lTdGF0dXMgLy8gTUVESUFfTk9UX1BSRVNFTlQgIVxuIik7CisgICAgICAgICAgICAgICAgICAgIAkJCVRSQUNFKGNkYXVkaW8sIk1FRElBX05PVF9QUkVTRU5UICFcbiIpOwogCQkJCWVsc2UKLSAgICAgICAgICAgICAgICAgICAgCQkJZHByaW50Zl9pbmZvKGNkYXVkaW8sIkNEQVVESU9fbWNpU3RhdHVzIC8vIE1DSV9TVEFUVVNfTUVESUFfUFJFU0VOVCAhXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgCQkJVFJBQ0UoY2RhdWRpbywiTUNJX1NUQVRVU19NRURJQV9QUkVTRU5UICFcbiIpOwogCQkJIAlyZXR1cm4gMDsKIAkJCWNhc2UgTUNJX1NUQVRVU19OVU1CRVJfT0ZfVFJBQ0tTOgogCQkJCWxwUGFybXMtPmR3UmV0dXJuID0gQ0RBVURJT19HZXROdW1iZXJPZlRyYWNrcyh3RGV2SUQpOwotICAgICAgICAgICAgICAgIAkJZHByaW50Zl9pbmZvKGNkYXVkaW8sIkNEQVVESU9fbWNpU3RhdHVzIC8vIE1DSV9TVEFUVVNfTlVNQkVSX09GX1RSQUNLUyA9ICVsdSAhXG4iLAorICAgICAgICAgICAgICAgIAkJVFJBQ0UoY2RhdWRpbywiTUNJX1NUQVRVU19OVU1CRVJfT0ZfVFJBQ0tTID0gJWx1ICFcbiIsCiAJCQkJCQkJCQkJCQkJbHBQYXJtcy0+ZHdSZXR1cm4pOwogCQkJCWlmIChscFBhcm1zLT5kd1JldHVybiA9PSAoV09SRCktMSkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAkJCSAJcmV0dXJuIDA7CkBAIC02ODEsMzMgKzY2NSwzMyBAQAogCQkJCWxwUGFybXMtPmR3UmV0dXJuID0gQ0RBRGV2W3dEZXZJRF0uZHdDdXJGcmFtZTsKIAkJCQlpZiAoZHdGbGFncyAmIE1DSV9TVEFUVVNfU1RBUlQpIHsKIAkJCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSBDREFEZXZbd0RldklEXS5kd0ZpcnN0T2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAJCQlkcHJpbnRmX2luZm8oY2RhdWRpbywiQ0RBVURJT19tY2lTdGF0dXMgLy8gZ2V0IE1DSV9TVEFUVVNfU1RBUlQgIVxuIik7CisgICAgICAgICAgICAgICAgICAgIAkJCVRSQUNFKGNkYXVkaW8sImdldCBNQ0lfU1RBVFVTX1NUQVJUICFcbiIpOwogCQkJCQl9CiAJCQkJaWYgKGR3RmxhZ3MgJiBNQ0lfVFJBQ0spIHsKIAkJCQkJaWYgKGxwUGFybXMtPmR3VHJhY2sgPiBDREFEZXZbd0RldklEXS5uVHJhY2tzKQogCQkJCQkJcmV0dXJuIE1DSUVSUl9PVVRPRlJBTkdFOwogCQkJCQlscFBhcm1zLT5kd1JldHVybiA9IENEQURldlt3RGV2SURdLmxwZHdUcmFja1Bvc1tscFBhcm1zLT5kd1RyYWNrIC0gMV07Ci0gICAgICAgICAgICAgICAgICAgIAkJCWRwcmludGZfaW5mbyhjZGF1ZGlvLCJDREFVRElPX21jaVN0YXR1cyAvLyBnZXQgTUNJX1RSQUNLICMlbHUgIVxuIiwgbHBQYXJtcy0+ZHdUcmFjayk7CisgICAgICAgICAgICAgICAgICAgIAkJCVRSQUNFKGNkYXVkaW8sImdldCBNQ0lfVFJBQ0sgIyVsdSAhXG4iLCBscFBhcm1zLT5kd1RyYWNrKTsKIAkJCQkJfQogCQkJCWxwUGFybXMtPmR3UmV0dXJuID0gQ0RBVURJT19DYWxjVGltZSh3RGV2SUQsCiAJCQkJCUNEQURldlt3RGV2SURdLmR3VGltZUZvcm1hdCwgbHBQYXJtcy0+ZHdSZXR1cm4pOwotICAgICAgICAgICAgICAgIAkJCWRwcmludGZfaW5mbyhjZGF1ZGlvLCJDREFVRElPX21jaVN0YXR1cyAvLyBNQ0lfU1RBVFVTX1BPU0lUSU9OPSUwOGxYICFcbiIsCisgICAgICAgICAgICAgICAgCQkJVFJBQ0UoY2RhdWRpbywiTUNJX1NUQVRVU19QT1NJVElPTj0lMDhsWCAhXG4iLAogCQkJCQkJCQkJCQkJCQlscFBhcm1zLT5kd1JldHVybik7CiAJCQkgCXJldHVybiAwOwogCQkJY2FzZSBNQ0lfU1RBVFVTX1JFQURZOgotICAgICAgICAgICAgICAgIAkJZHByaW50Zl9pbmZvKGNkYXVkaW8sIkNEQVVESU9fbWNpU3RhdHVzIC8vIE1DSV9TVEFUVVNfUkVBRFkgIVxuIik7CisgICAgICAgICAgICAgICAgCQlUUkFDRShjZGF1ZGlvLCJNQ0lfU1RBVFVTX1JFQURZICFcbiIpOwogCQkJCWxwUGFybXMtPmR3UmV0dXJuID0gVFJVRTsKIAkJCSAJcmV0dXJuIDA7CiAJCQljYXNlIE1DSV9TVEFUVVNfVElNRV9GT1JNQVQ6Ci0gICAgICAgICAgICAgICAgCQlkcHJpbnRmX2luZm8oY2RhdWRpbywiQ0RBVURJT19tY2lTdGF0dXMgLy8gTUNJX1NUQVRVU19USU1FX0ZPUk1BVCAhXG4iKTsKKyAgICAgICAgICAgICAgICAJCVRSQUNFKGNkYXVkaW8sIk1DSV9TVEFUVVNfVElNRV9GT1JNQVQgIVxuIik7CiAJCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSBDREFEZXZbd0RldklEXS5kd1RpbWVGb3JtYXQ7CiAJCQkgCXJldHVybiAwOwogCQkJZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAJCWRwcmludGZfd2FybihjZGF1ZGlvLCAiQ0RBVURJT19tY2lTdGF0dXMgLy8gdW5rbm93biBjb21tYW5kICUwOGxYICFcbiIsIGxwUGFybXMtPmR3SXRlbSk7CisgICAgICAgICAgICAgICAgCQlXQVJOKGNkYXVkaW8sICJ1bmtub3duIGNvbW1hbmQgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdJdGVtKTsKIAkJCQlyZXR1cm4gTUNJRVJSX1VOUkVDT0dOSVpFRF9DT01NQU5EOwogCQkJfQogCQl9Ci0JZHByaW50Zl93YXJuKGNkYXVkaW8sICJDREFVRElPX21jaVN0YXR1cyAvLyBub3QgTUNJX1NUQVRVU19JVEVNICFcbiIpOworCVdBUk4oY2RhdWRpbywgIm5vdCBNQ0lfU1RBVFVTX0lURU0gIVxuIik7CiAgCXJldHVybiAwOwogI2Vsc2UKIAlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKQEAgLTcyOCw3ICs3MTIsNyBAQAogCXN0cnVjdAlpb2NfcGxheV9tc2YJbXNmOwogI2VuZGlmCiAKLSAgICAJZHByaW50Zl9pbmZvKGNkYXVkaW8sIkNEQVVESU9fbWNpUGxheSglMDRYLCAlMDhsWCwgJXApO1xuIiwgCisgICAgCVRSQUNFKGNkYXVkaW8sIiglMDRYLCAlMDhsWCwgJXApO1xuIiwgCiAJCXdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAlpZiAoQ0RBRGV2W3dEZXZJRF0udW5peGRldiA9PSAwKSByZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKQEAgLTczNywxNCArNzIxLDEzIEBACiAJaWYgKGR3RmxhZ3MgJiBNQ0lfRlJPTSkgewogCQlzdGFydCA9IENEQVVESU9fQ2FsY0ZyYW1lKHdEZXZJRCwgCiAJCQlDREFEZXZbd0RldklEXS5kd1RpbWVGb3JtYXQsIGxwUGFybXMtPmR3RnJvbSk7IAotICAgICAgICBkcHJpbnRmX2luZm8oY2RhdWRpbywiQ0RBVURJT19tY2lQbGF5IC8vIE1DSV9GUk9NPSUwOGxYIC0+ICV1IFxuIiwKKyAgICAgICAgVFJBQ0UoY2RhdWRpbywiTUNJX0ZST009JTA4bFggLT4gJXUgXG4iLAogCQkJCWxwUGFybXMtPmR3RnJvbSwgc3RhcnQpOwogCQl9CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfVE8pIHsKIAkJZW5kID0gQ0RBVURJT19DYWxjRnJhbWUod0RldklELCAKIAkJCUNEQURldlt3RGV2SURdLmR3VGltZUZvcm1hdCwgbHBQYXJtcy0+ZHdUbyk7Ci0gICAgICAgIAlkcHJpbnRmX2luZm8oY2RhdWRpbywKLQkJCSJDREFVRElPX21jaVBsYXkgLy8gTUNJX1RPPSUwOGxYIC0+ICV1IFxuIiwKKyAgICAgICAgCVRSQUNFKGNkYXVkaW8sICJNQ0lfVE89JTA4bFggLT4gJXUgXG4iLAogCQkJbHBQYXJtcy0+ZHdUbywgZW5kKTsKIAkJfQogCXN0YXJ0ICs9IENEQURldlt3RGV2SURdLmR3Rmlyc3RPZmZzZXQ7CQpAQCAtNzcxLDcgKzc1NCw3IEBACiAJCSAgQ0RJT0NTVEFSVAogI2VuZGlmCiAJCSAgKSkgewotICAgICAgICAJZHByaW50Zl93YXJuKGNkYXVkaW8sICJDREFVRElPX21jaVBsYXkgLy8gbW90b3IgZG9lc24ndCBzdGFydCAhXG4iKTsKKyAgICAgICAgCVdBUk4oY2RhdWRpbywgIm1vdG9yIGRvZXNuJ3Qgc3RhcnQgIVxuIik7CiAJCXJldHVybiBNQ0lFUlJfSEFSRFdBUkU7CiAJCX0KIAlpZiAoaW9jdGwoQ0RBRGV2W3dEZXZJRF0udW5peGRldiwgCkBAIC03ODEsMjIgKzc2NCwyMSBAQAogCQkgIENESU9DUExBWU1TRgogI2VuZGlmCiAJCSAgLCAmbXNmKSkgewotICAgICAgICAJZHByaW50Zl93YXJuKGNkYXVkaW8sICJDREFVRElPX21jaVBsYXkgLy8gZGV2aWNlIGRvZXNuJ3QgcGxheSAhXG4iKTsKKyAgICAgICAgCVdBUk4oY2RhdWRpbywgImRldmljZSBkb2Vzbid0IHBsYXkgIVxuIik7CiAJCXJldHVybiBNQ0lFUlJfSEFSRFdBUkU7CiAJCX0KICNpZmRlZiBsaW51eAotICAgIAlkcHJpbnRmX2luZm8oY2RhdWRpbywiQ0RBVURJT19tY2lQbGF5IC8vIG1zZiA9ICVkOiVkOiVkICVkOiVkOiVkXG4iLAorICAgIAlUUkFDRShjZGF1ZGlvLCJtc2YgPSAlZDolZDolZCAlZDolZDolZFxuIiwKIAkJbXNmLmNkbXNmX21pbjAsIG1zZi5jZG1zZl9zZWMwLCBtc2YuY2Rtc2ZfZnJhbWUwLAogCQltc2YuY2Rtc2ZfbWluMSwgbXNmLmNkbXNmX3NlYzEsIG1zZi5jZG1zZl9mcmFtZTEpOwogI2VsaWYgX19GcmVlQlNEX18KLSAgICAJZHByaW50Zl9pbmZvKGNkYXVkaW8sIkNEQVVESU9fbWNpUGxheSAvLyBtc2YgPSAlZDolZDolZCAlZDolZDolZFxuIiwKKyAgICAJVFJBQ0UoY2RhdWRpbywibXNmID0gJWQ6JWQ6JWQgJWQ6JWQ6JWRcbiIsCiAJCW1zZi5zdGFydF9tLCBtc2Yuc3RhcnRfcywgbXNmLnN0YXJ0X2YsCiAJCW1zZi5lbmRfbSwgICBtc2YuZW5kX3MsICAgbXNmLmVuZF9mKTsKICNlbmRpZgogCUNEQURldlt3RGV2SURdLm1vZGUgPSBNQ0lfTU9ERV9QTEFZOwogCWlmIChkd0ZsYWdzICYgTUNJX05PVElGWSkgewotICAgICAgICAJZHByaW50Zl9pbmZvKGNkYXVkaW8sCi0JCQkiQ0RBVURJT19tY2lQbGF5IC8vIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCAKKyAgICAgICAgCVRSQUNFKGNkYXVkaW8sICJNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgCiAJCQlscFBhcm1zLT5kd0NhbGxiYWNrKTsKIC8qCiAJCW1jaURyaXZlck5vdGlmeSgoSFdORDE2KUxPV09SRChscFBhcm1zLT5kd0NhbGxiYWNrKSwgCkBAIC04MTUsNyArNzk3LDcgQEAKIHN0YXRpYyBEV09SRCBDREFVRElPX21jaVN0b3AoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfR0VORVJJQ19QQVJNUyBscFBhcm1zKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCi0gICAgCWRwcmludGZfaW5mbyhjZGF1ZGlvLCJDREFVRElPX21jaVN0b3AoJTA0WCwgJTA4bFgsICVwKTtcbiIsIAorICAgIAlUUkFDRShjZGF1ZGlvLCIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIAogCQl3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJaWYgKGlvY3RsKENEQURldlt3RGV2SURdLnVuaXhkZXYsCkBAIC04MjcsOCArODA5LDcgQEAKIAkJICApKSByZXR1cm4gTUNJRVJSX0hBUkRXQVJFOwogCUNEQURldlt3RGV2SURdLm1vZGUgPSBNQ0lfTU9ERV9TVE9QOwogCWlmIChkd0ZsYWdzICYgTUNJX05PVElGWSkgewotICAgICAgICAJZHByaW50Zl9pbmZvKGNkYXVkaW8sCi0JCQkiQ0RBVURJT19tY2lTdG9wIC8vIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCAKKyAgICAgICAgCVRSQUNFKGNkYXVkaW8sICJNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgCiAJCQlscFBhcm1zLT5kd0NhbGxiYWNrKTsKIAkJbWNpRHJpdmVyTm90aWZ5KChIV05EMTYpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKIAkJCUNEQURldlt3RGV2SURdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKQEAgLTg0NSw3ICs4MjYsNyBAQAogc3RhdGljIERXT1JEIENEQVVESU9fbWNpUGF1c2UoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfR0VORVJJQ19QQVJNUyBscFBhcm1zKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCi0gICAgCWRwcmludGZfaW5mbyhjZGF1ZGlvLCJDREFVRElPX21jaVBhdXNlKCUwNFgsICUwOGxYLCAlcCk7XG4iLCAKKyAgICAJVFJBQ0UoY2RhdWRpbywiKCUwNFgsICUwOGxYLCAlcCk7XG4iLCAKIAkJd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCWlmIChpb2N0bChDREFEZXZbd0RldklEXS51bml4ZGV2LApAQCAtODU3LDggKzgzOCw3IEBACiAJCSAgKSkgcmV0dXJuIE1DSUVSUl9IQVJEV0FSRTsKIAlDREFEZXZbd0RldklEXS5tb2RlID0gTUNJX01PREVfUEFVU0U7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSB7Ci0gICAgICAgIGRwcmludGZfaW5mbyhjZGF1ZGlvLAotCQkiQ0RBVURJT19tY2lQYXVzZSAvLyBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgCisgICAgICAgIFRSQUNFKGNkYXVkaW8sICJNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgCiAJCWxwUGFybXMtPmR3Q2FsbGJhY2spOwogCQltY2lEcml2ZXJOb3RpZnkoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAogCQkJQ0RBRGV2W3dEZXZJRF0ud05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOwpAQCAtODc1LDcgKzg1NSw3IEBACiBzdGF0aWMgRFdPUkQgQ0RBVURJT19tY2lSZXN1bWUoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfR0VORVJJQ19QQVJNUyBscFBhcm1zKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCi0gICAgCWRwcmludGZfaW5mbyhjZGF1ZGlvLCJDREFVRElPX21jaVJlc3VtZSglMDRYLCAlMDhsWCwgJXApO1xuIiwgCisgICAgCVRSQUNFKGNkYXVkaW8sIiglMDRYLCAlMDhsWCwgJXApO1xuIiwgCiAJCXdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAlpZiAoaW9jdGwoQ0RBRGV2W3dEZXZJRF0udW5peGRldiwgCkBAIC04ODcsOCArODY3LDcgQEAKIAkJICApKSByZXR1cm4gTUNJRVJSX0hBUkRXQVJFOwogCUNEQURldlt3RGV2SURdLm1vZGUgPSBNQ0lfTU9ERV9TVE9QOwogCWlmIChkd0ZsYWdzICYgTUNJX05PVElGWSkgewotICAgICAgICAJZHByaW50Zl9pbmZvKGNkYXVkaW8sCi0JCQkiQ0RBVURJT19tY2lSZXN1bWUgLy8gTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIAorICAgICAgICAJVFJBQ0UoY2RhdWRpbywgIk1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCAKIAkJCWxwUGFybXMtPmR3Q2FsbGJhY2spOwogCQltY2lEcml2ZXJOb3RpZnkoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAogCQkJQ0RBRGV2W3dEZXZJRF0ud05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOwpAQCAtOTA3LDcgKzg4Niw3IEBACiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKIAlEV09SRAlkd1JldDsKIAlNQ0lfUExBWV9QQVJNUyBQbGF5UGFybXM7Ci0gICAgCWRwcmludGZfaW5mbyhjZGF1ZGlvLCJDREFVRElPX21jaVNlZWsoJTA0WCwgJTA4bFgsICVwKTtcbiIsIAorICAgIAlUUkFDRShjZGF1ZGlvLCIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIAogCQl3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJaWYgKGlvY3RsKENEQURldlt3RGV2SURdLnVuaXhkZXYsCkBAIC05MzYsOCArOTE1LDcgQEAKIAlpZiAoZHdSZXQgIT0gMCkgcmV0dXJuIGR3UmV0OwogCWR3UmV0ID0gQ0RBVURJT19tY2lTdG9wKHdEZXZJRCwgTUNJX1dBSVQsIChMUE1DSV9HRU5FUklDX1BBUk1TKSZQbGF5UGFybXMpOwogCWlmIChkd0ZsYWdzICYgTUNJX05PVElGWSkgewotICAgICAgICAJZHByaW50Zl9pbmZvKGNkYXVkaW8sCi0JCQkiQ0RBVURJT19tY2lTZWVrIC8vIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCAKKyAgICAgICAgCVRSQUNFKGNkYXVkaW8sICJNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgCiAJCQlscFBhcm1zLT5kd0NhbGxiYWNrKTsKIAkJbWNpRHJpdmVyTm90aWZ5KChIV05EMTYpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKIAkJCUNEQURldlt3RGV2SURdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKQEAgLTk1NSw3ICs5MzMsNyBAQAogc3RhdGljIERXT1JEIENEQVVESU9fbWNpU2V0KFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX1NFVF9QQVJNUyBscFBhcm1zKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCi0gICAgCWRwcmludGZfaW5mbyhjZGF1ZGlvLCJDREFVRElPX21jaVNldCglMDRYLCAlMDhsWCwgJXApO1xuIiwgCisgICAgCVRSQUNFKGNkYXVkaW8sIiglMDRYLCAlMDhsWCwgJXApO1xuIiwgCiAJCXdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIC8qCkBAIC05NjUsMjQgKzk0MywyMiBAQAogCWlmIChkd0ZsYWdzICYgTUNJX1NFVF9USU1FX0ZPUk1BVCkgewogCQlzd2l0Y2ggKGxwUGFybXMtPmR3VGltZUZvcm1hdCkgewogCQkJY2FzZSBNQ0lfRk9STUFUX01JTExJU0VDT05EUzoKLSAgICAgICAgICAgICAgICAJCWRwcmludGZfaW5mbyhjZGF1ZGlvLAotCQkJCSJDREFVRElPX21jaVNldCAvLyBNQ0lfRk9STUFUX01JTExJU0VDT05EUyAhXG4iKTsKKyAgICAgICAgICAgICAgICAJCVRSQUNFKGNkYXVkaW8sICJNQ0lfRk9STUFUX01JTExJU0VDT05EUyAhXG4iKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgTUNJX0ZPUk1BVF9NU0Y6Ci0gICAgICAgICAgICAgICAgCQlkcHJpbnRmX2luZm8oY2RhdWRpbywiQ0RBVURJT19tY2lTZXQgLy8gTUNJX0ZPUk1BVF9NU0YgIVxuIik7CisgICAgICAgICAgICAgICAgCQlUUkFDRShjZGF1ZGlvLCJNQ0lfRk9STUFUX01TRiAhXG4iKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgTUNJX0ZPUk1BVF9UTVNGOgotICAgICAgICAgICAgICAgIAkJZHByaW50Zl9pbmZvKGNkYXVkaW8sIkNEQVVESU9fbWNpU2V0IC8vIE1DSV9GT1JNQVRfVE1TRiAhXG4iKTsKKyAgICAgICAgICAgICAgICAJCVRSQUNFKGNkYXVkaW8sIk1DSV9GT1JNQVRfVE1TRiAhXG4iKTsKIAkJCQlicmVhazsKIAkJCWRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgCQlkcHJpbnRmX3dhcm4oY2RhdWRpbywgIkNEQVVESU9fbWNpU2V0IC8vIGJhZCB0aW1lIGZvcm1hdCAhXG4iKTsKKyAgICAgICAgICAgICAgICAJCVdBUk4oY2RhdWRpbywgImJhZCB0aW1lIGZvcm1hdCAhXG4iKTsKIAkJCQlyZXR1cm4gTUNJRVJSX0JBRF9USU1FX0ZPUk1BVDsKIAkJCX0KIAkJQ0RBRGV2W3dEZXZJRF0uZHdUaW1lRm9ybWF0ID0gbHBQYXJtcy0+ZHdUaW1lRm9ybWF0OwogCQl9CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfU0VUX0RPT1JfT1BFTikgewotICAgICAgICAJZHByaW50Zl9pbmZvKGNkYXVkaW8sCi0JCQkiQ0RBVURJT19tY2lTZXQgLy8gTUNJX1NFVF9ET09SX09QRU4gIVxuIik7CisgICAgICAgIAlUUkFDRShjZGF1ZGlvLCAiTUNJX1NFVF9ET09SX09QRU4gIVxuIik7CiAjaWZkZWYgX19GcmVlQlNEX18KIAkJaWYgKGlvY3RsKENEQURldlt3RGV2SURdLnVuaXhkZXYsIENESU9DQUxMT1cpKSByZXR1cm4gTUNJRVJSX0hBUkRXQVJFOwogCQlpZiAoaW9jdGwoQ0RBRGV2W3dEZXZJRF0udW5peGRldiwgQ0RJT0NFSkVDVCkpIHJldHVybiBNQ0lFUlJfSEFSRFdBUkU7CkBAIC05OTMsOCArOTY5LDcgQEAKIAkJQ0RBRGV2W3dEZXZJRF0ublRyYWNrcyA9IDA7CiAJCX0KIAlpZiAoZHdGbGFncyAmIE1DSV9TRVRfRE9PUl9DTE9TRUQpIHsKLSAgICAgICAgCWRwcmludGZfaW5mbyhjZGF1ZGlvLAotCQkJIkNEQVVESU9fbWNpU2V0IC8vIE1DSV9TRVRfRE9PUl9DTE9TRUQgIVxuIik7CisgICAgICAgIAlUUkFDRShjZGF1ZGlvLCAiTUNJX1NFVF9ET09SX0NMT1NFRCAhXG4iKTsKICNpZmRlZiBfX0ZyZWVCU0RfXwogICAgICAgICAgICAgICAgIGlmIChpb2N0bChDREFEZXZbd0RldklEXS51bml4ZGV2LCBDRElPQ0FMTE9XKSkgcmV0dXJuIE1DSUVSUl9IQVJEV0FSRTsKICAgICAgICAgICAgICAgICBpZiAoaW9jdGwoQ0RBRGV2W3dEZXZJRF0udW5peGRldiwgQ0RJT0NDTE9TRSkpIHJldHVybiBNQ0lFUlJfSEFSRFdBUkU7CkBAIC0xMDA5LDggKzk4NCw3IEBACiAJaWYgKGR3RmxhZ3MgJiBNQ0lfU0VUX09OKSByZXR1cm4gTUNJRVJSX1VOU1VQUE9SVEVEX0ZVTkNUSU9OOwogCWlmIChkd0ZsYWdzICYgTUNJX1NFVF9PRkYpIHJldHVybiBNQ0lFUlJfVU5TVVBQT1JURURfRlVOQ1RJT047CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSB7Ci0gICAgICAgIAlkcHJpbnRmX2luZm8oY2RhdWRpbywKLQkJCSJDREFVRElPX21jaVNldCAvLyBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgCisgICAgICAgIAlUUkFDRShjZGF1ZGlvLCAiTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIAogCQkJbHBQYXJtcy0+ZHdDYWxsYmFjayk7CiAJCW1jaURyaXZlck5vdGlmeSgoSFdORDE2KUxPV09SRChscFBhcm1zLT5kd0NhbGxiYWNrKSwgCiAJCQlDREFEZXZbd0RldklEXS53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CkBAIC0xMDg0LDggKzEwNTgsNyBAQAogCQkJcmV0dXJuIENEQVVESU9fbWNpU2Vlayhkd0RldklELCBkd1BhcmFtMSwgCiAJCQkJKExQTUNJX1NFRUtfUEFSTVMpUFRSX1NFR19UT19MSU4oZHdQYXJhbTIpKTsKIAkJY2FzZSBNQ0lfU0VUX0RPT1JfT1BFTjoKLSAgICAgICAgICAgIAkJZHByaW50Zl9pbmZvKGNkYXVkaW8sCi0JCQkJIkNEQVVESU9fRHJpdmVyUHJvYyAvLyBNQ0lfU0VUX0RPT1JfT1BFTiAhXG4iKTsKKyAgICAgICAgICAgIAkJVFJBQ0UoY2RhdWRpbywgIk1DSV9TRVRfRE9PUl9PUEVOICFcbiIpOwogI2lmZGVmIF9fRnJlZUJTRF9fCiAJCQlpZiAoaW9jdGwoQ0RBRGV2W2R3RGV2SURdLnVuaXhkZXYsIENESU9DQUxMT1cpKSByZXR1cm4gTUNJRVJSX0hBUkRXQVJFOwogCQkJaWYgKGlvY3RsKENEQURldltkd0RldklEXS51bml4ZGV2LCBDRElPQ0VKRUNUKSkgcmV0dXJuIE1DSUVSUl9IQVJEV0FSRTsKQEAgLTEwOTYsNyArMTA2OSw3IEBACiAJCQlDREFEZXZbZHdEZXZJRF0ublRyYWNrcyA9IDA7CiAJCQlyZXR1cm4gMDsKIAkJY2FzZSBNQ0lfU0VUX0RPT1JfQ0xPU0VEOgotICAgICAgICAgICAgCQlkcHJpbnRmX2luZm8oY2RhdWRpbywiQ0RBVURJT19Ecml2ZXJQcm9jIC8vIE1DSV9TRVRfRE9PUl9DTE9TRUQgIVxuIik7CisgICAgICAgICAgICAJCVRSQUNFKGNkYXVkaW8sIk1DSV9TRVRfRE9PUl9DTE9TRUQgIVxuIik7CiAjaWZkZWYgX19GcmVlQlNEX18KIAkJCWlmIChpb2N0bChDREFEZXZbZHdEZXZJRF0udW5peGRldiwgQ0RJT0NBTExPVykpIHJldHVybiBNQ0lFUlJfSEFSRFdBUkU7CiAJCQlpZiAoaW9jdGwoQ0RBRGV2W2R3RGV2SURdLnVuaXhkZXYsIENESU9DQ0xPU0UpKSByZXR1cm4gTUNJRVJSX0hBUkRXQVJFOwpkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9tY2lzdHJpbmcuYyBiL211bHRpbWVkaWEvbWNpc3RyaW5nLmMKaW5kZXggYmRkMjg4Ny4uNjJmNGNmNyAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS9tY2lzdHJpbmcuYworKysgYi9tdWx0aW1lZGlhL21jaXN0cmluZy5jCkBAIC02NSwxMCArNjUsMTAgQEAKICAqIGZvciB1c2UgaW4gbWNpU2VuZFN0cmluZygpCiAgKi8KICNkZWZpbmUgX01DSV9TVFIocykgZG8ge1wKLQlkcHJpbnRmX2luZm8obWNpLCItPnJldHVybnMgXCIlc1wiIixzKTtcCisJVFJBQ0UobWNpLCItPnJldHVybnMgJyVzJ1xuIixzKTtcCiAJaWYgKGxwc3RyUmV0dXJuU3RyaW5nKSB7XAogCSAgICBsc3RyY3B5bjMyQShscHN0clJldHVyblN0cmluZyxzLHVSZXR1cm5MZW5ndGgpO1wKLQkgICAgZHByaW50Zl9pbmZvKG1jaSwiLS0+XCIlc1wiXG4iLGxwc3RyUmV0dXJuU3RyaW5nKTtcCisJICAgIFRSQUNFKG1jaSwiLS0+JyVzJ1xuIixscHN0clJldHVyblN0cmluZyk7XAogCX1cCiB9IHdoaWxlKDApCiAKQEAgLTg4LDcgKzg4LDcgQEAKIAkJcmVzPUFOSU1fRHJpdmVyUHJvYyhHZXREcnYod0RldklEKS0+bW9kcC53RGV2aWNlSUQsMCxjbWQsZHdGbGFncywoRFdPUkQpKHBhcmFtcykpO1wKIAkJYnJlYWs7XAogCWNhc2UgTUNJX0RFVlRZUEVfRElHSVRBTF9WSURFTzpcCi0JCWRwcmludGZfZml4bWUobWNpLCJfTUNJX0NBTExfRFJJVkVSIC8vTm8gRElHSVRBTF9WSURFTyB5ZXQgIVxuIik7XAorCQlGSVhNRShtY2ksIl9NQ0lfQ0FMTF9EUklWRVI6IE5vIERJR0lUQUxfVklERU8geWV0ICFcbiIpO1wKIAkJcmVzPU1DSUVSUl9ERVZJQ0VfTk9UX0lOU1RBTExFRDtcCiAJCWJyZWFrO1wKIAlkZWZhdWx0OlwKQEAgLTMzNSw3ICszMzUsNyBAQAogCXdoaWxlKEdldERydih3RGV2SUQpLT5tb2RwLndUeXBlKSB7CiAJCXdEZXZJRCA9IE1NU1lTVEVNX05leHREZXZJRCh3RGV2SUQpOwogCQlpZiAoIU1NU1lTVEVNX0RldklEVmFsaWQod0RldklEKSkgewotCQkJZHByaW50Zl9pbmZvKG1jaSwgX19GSUxFX18iOk1DSVNUUl9PcGVuOk1BWE1DSURSSVZFUlMgcmVhY2hlZCAoJXgpICFcbiIsIHdEZXZJRCk7CisJCQlUUkFDRShtY2ksICJNQVhNQ0lEUklWRVJTIHJlYWNoZWQgKCV4KSAhXG4iLCB3RGV2SUQpOwogCQkJU0VHUFRSX0ZSRUUoUFRSX1NFR19UT19MSU4ocFUtPm9wZW5QYXJhbXMubHBzdHJFbGVtZW50TmFtZSkpOwogCQkJU0VHUFRSX0ZSRUUocFUpOwogCQkJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKQEAgLTIxMTIsNyArMjExMiw3IEBACiAJRFdPUkQJZHdGbGFnczsKIAlpbnQJcmVzPTAsaSxucm9ma2V5d29yZHM7CiAKLQlkcHJpbnRmX2luZm8obWNpLCJtY2lTZW5kU3RyaW5nKCclcycsICVwLCAlZCwgJVgpXG4iLCBscHN0ckNvbW1hbmQsIAorCVRSQUNFKG1jaSwiKCclcycsICVwLCAlZCwgJVgpXG4iLCBscHN0ckNvbW1hbmQsIAogCQlscHN0clJldHVyblN0cmluZywgdVJldHVybkxlbmd0aCwgaHduZENhbGxiYWNrCiAJKTsKIAkvKiBmb3JtYXQgaXMgPGNvbW1hbmQ+IDxkZXZpY2U+IDxvcHRhcmdzPiAqLwpAQCAtMjE4Miw3ICsyMTgyLDcgQEAKIAkJCQlicmVhazsKIAkJCXdEZXZJRCA9IE1NU1lTVEVNX05leHREZXZJRCh3RGV2SUQpOwogCQkJaWYgKCFNTVNZU1RFTV9EZXZJRFZhbGlkKHdEZXZJRCkpIHsKLQkJCQlkcHJpbnRmX2luZm8obWNpLCBfX0ZJTEVfXyI6bWNpU2VuZFN0cmluZzpNQVhNQ0lEUklWRVJTIHJlYWNoZWQhXG4iKTsKKwkJCQlUUkFDRShtY2ksICJNQVhNQ0lEUklWRVJTIHJlYWNoZWQhXG4iKTsKIAkJCQlmcmVlKGtleXdvcmRzKTtmcmVlKGNtZCk7CiAJCQkJcmV0dXJuIE1DSUVSUl9JTlZBTElEX0RFVklDRV9OQU1FOwogCQkJfQpkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9taWRpLmMgYi9tdWx0aW1lZGlhL21pZGkuYwppbmRleCA2YTViOTRhLi5mMjUzZDU2IDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL21pZGkuYworKysgYi9tdWx0aW1lZGlhL21pZGkuYwpAQCAtODksNyArODksNyBAQAogc3RhdGljIERXT1JEIE1JRElfTm90aWZ5Q2xpZW50KFVJTlQxNiB3RGV2SUQsIFdPUkQgd01zZywgCiAJCQkJRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yKQogewotCWRwcmludGZfaW5mbyhtaWRpLCJNSURJX05vdGlmeUNsaWVudCAvLyB3RGV2SUQgPSAlMDRYIHdNc2cgPSAlZCBkd1Bhcm0xID0gJTA0bFggZHdQYXJhbTIgPSAlMDRsWFxuIix3RGV2SUQsIHdNc2csIGR3UGFyYW0xLCBkd1BhcmFtMik7CisJVFJBQ0UobWlkaSwid0RldklEID0gJTA0WCB3TXNnID0gJWQgZHdQYXJtMSA9ICUwNGxYIGR3UGFyYW0yID0gJTA0bFhcbiIsd0RldklELCB3TXNnLCBkd1BhcmFtMSwgZHdQYXJhbTIpOwogCiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKIApAQCAtMTA3LDcgKzEwNyw3IEBACiAJCU1pZGlPdXREZXZbd0RldklEXS5taWRpRGVzYy5kd0luc3RhbmNlLCAKICAgICAgICAgICAgICAgICBkd1BhcmFtMSwgCiAgICAgICAgICAgICAgICAgZHdQYXJhbTIpKSB7Ci0JICAgIGRwcmludGZfd2FybihtaWRpLCJNSURJX05vdGlmeUNsaWVudCAvLyBjYW4ndCBub3RpZnkgY2xpZW50ICFcbiIpOworCSAgICBXQVJOKG1pZGksImNhbid0IG5vdGlmeSBjbGllbnQgIVxuIik7CiAJICAgIHJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwogCSAgfQogCSAgYnJlYWs7CkBAIC0xMjAsNyArMTIwLDcgQEAKIAkJTWlkaUluRGV2W3dEZXZJRF0ubWlkaURlc2MuZHdDYWxsYmFjaywgTWlkaUluRGV2W3dEZXZJRF0ud0ZsYWdzLCAKIAkJTWlkaUluRGV2W3dEZXZJRF0ubWlkaURlc2MuaE1pZGksIHdNc2csIAogCQlNaWRpSW5EZXZbd0RldklEXS5taWRpRGVzYy5kd0luc3RhbmNlLCBkd1BhcmFtMSwgZHdQYXJhbTIpKSB7Ci0JICAgIGRwcmludGZfd2FybihtY2l3YXZlLCJNSURJX05vdGlmeUNsaWVudCAvLyBjYW4ndCBub3RpZnkgY2xpZW50ICFcbiIpOworCSAgICBXQVJOKG1jaXdhdmUsImNhbid0IG5vdGlmeSBjbGllbnQgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwogCQl9CiAJICBicmVhazsKQEAgLTE0NCw3ICsxNDQsNyBAQAogCQkJcmV0dXJuIDA7CiAJCX0KIAl9Ci0JZHByaW50Zl93YXJuKG1pZGksICJNSURJX1JlYWRCeXRlIC8vIGVycm9yIHJlYWRpbmcgd0RldklEPSUwNFhcbiIsIHdEZXZJRCk7CisJV0FSTihtaWRpLCAiZXJyb3IgcmVhZGluZyB3RGV2SUQ9JTA0WFxuIiwgd0RldklEKTsKIAlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCiAjZWxzZQpAQCAtMTY3LDcgKzE2Nyw3IEBACiAJCQl9CiAJCX0KIAl9Ci0JZHByaW50Zl93YXJuKG1pZGksICJNSURJX1JlYWRXb3JkIC8vIGVycm9yIHJlYWRpbmcgd0RldklEPSUwNFhcbiIsIHdEZXZJRCk7CisJV0FSTihtaWRpLCAiZXJyb3IgcmVhZGluZyB3RGV2SUQ9JTA0WFxuIiwgd0RldklEKTsKIAlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogfQogCkBAIC0xODYsNyArMTg2LDcgQEAKIAkJCX0KIAkJfQogCX0KLQlkcHJpbnRmX3dhcm4obWlkaSwgIk1JRElfUmVhZExvbmcgLy8gZXJyb3IgcmVhZGluZyB3RGV2SUQ9JTA0WFxuIiwgd0RldklEKTsKKwlXQVJOKG1pZGksICJlcnJvciByZWFkaW5nIHdEZXZJRD0lMDRYXG4iLCB3RGV2SUQpOwogCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiB9CiAKQEAgLTIwMCwyMCArMjAwLDIwIEBACiAJRFdPUkQJdmFsdWU7CiAJaWYgKGxwZHcgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAlpZiAoTUlESV9SZWFkQnl0ZSh3RGV2SUQsICZieXRlKSAhPSAwKSB7Ci0JCWRwcmludGZfd2FybihtaWRpLCAiTUlESV9SZWFkVmFyeUxlbiAvLyBlcnJvciByZWFkaW5nIHdEZXZJRD0lMDRYXG4iLCB3RGV2SUQpOworCQlXQVJOKG1pZGksICJlcnJvciByZWFkaW5nIHdEZXZJRD0lMDRYXG4iLCB3RGV2SUQpOwogCQlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCX0KIAl2YWx1ZSA9IChEV09SRCkoYnl0ZSAmIDB4N0YpOwogCXdoaWxlIChieXRlICYgMHg4MCkgewogCQlpZiAoTUlESV9SZWFkQnl0ZSh3RGV2SUQsICZieXRlKSAhPSAwKSB7Ci0JCQlkcHJpbnRmX3dhcm4obWlkaSwgIk1JRElfUmVhZFZhcnlMZW4gLy8gZXJyb3IgcmVhZGluZyB3RGV2SUQ9JTA0WFxuIiwgd0RldklEKTsKKwkJCVdBUk4obWlkaSwgImVycm9yIHJlYWRpbmcgd0RldklEPSUwNFhcbiIsIHdEZXZJRCk7CiAJCQlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCQl9CiAJCXZhbHVlID0gKHZhbHVlIDw8IDcpICsgKGJ5dGUgJiAweDdGKTsKIAl9CiAJKmxwZHcgPSB2YWx1ZTsKIC8qCi0JZHByaW50Zl9pbmZvKG1pZGksICJNSURJX1JlYWRWYXJ5TGVuIC8vIHZhbD0lMDhsWCBcbiIsIHZhbHVlKTsKKwlUUkFDRShtaWRpLCAidmFsPSUwOGxYIFxuIiwgdmFsdWUpOwogKi8KIAlyZXR1cm4gMDsKIH0KQEAgLTIyNyw5ICsyMjcsOSBAQAogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCiAJRFdPUkQJdG9iZXJlYWQ7CiAJRk9VUkNDCWZvdXJjYzsKLQlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfUmVhZE1UaGQoJTA0WCwgJTA4bFgpO1xuIiwgd0RldklELCBkd09mZnNldCk7CisJVFJBQ0UobWlkaSwgIiglMDRYLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGR3T2Zmc2V0KTsKIAlpZiAobW1pb1NlZWsoTUNJTWlkaURldlt3RGV2SURdLmhGaWxlLCBkd09mZnNldCwgU0VFS19TRVQpICE9IGR3T2Zmc2V0KSB7Ci0JCWRwcmludGZfd2FybihtaWRpLCAiTUlESV9SZWFkTVRoZCAvLyBjYW4ndCBzZWVrIGF0ICUwOGxYIGJlZ2luIG9mICdNVGhkJyBcbiIsIGR3T2Zmc2V0KTsKKwkJV0FSTihtaWRpLCAiY2FuJ3Qgc2VlayBhdCAlMDhsWCBiZWdpbiBvZiAnTVRoZCcgXG4iLCBkd09mZnNldCk7CiAJCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJfQogCWlmIChtbWlvUmVhZChNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUsIChIUFNUUikmZm91cmNjLApAQCAtMjQzLDcgKzI0Myw3IEBACiAJCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJaWYgKE1JRElfUmVhZFdvcmQod0RldklELCAmTUNJTWlkaURldlt3RGV2SURdLm5UZW1wbykgIT0gMCkKIAkJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKLQlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfUmVhZE1UaGQgLy8gdG9iZXJlYWQ9JTA4bFgsIHdGb3JtYXQ9JTA0WCBuVHJhY2tzPSUwNFggblRlbXBvPSUwNFhcbiIsCisJVFJBQ0UobWlkaSwgInRvYmVyZWFkPSUwOGxYLCB3Rm9ybWF0PSUwNFggblRyYWNrcz0lMDRYIG5UZW1wbz0lMDRYXG4iLAogCQl0b2JlcmVhZCwgTUNJTWlkaURldlt3RGV2SURdLndGb3JtYXQsCiAJCU1DSU1pZGlEZXZbd0RldklEXS5uVHJhY2tzLAogCQlNQ0lNaWRpRGV2W3dEZXZJRF0ublRlbXBvKTsKQEAgLTI2NSw3ICsyNjUsNyBAQAogCURXT1JECXRvYmVyZWFkOwogCUZPVVJDQwlmb3VyY2M7CiAJaWYgKG1taW9TZWVrKE1DSU1pZGlEZXZbd0RldklEXS5oRmlsZSwgZHdPZmZzZXQsIFNFRUtfU0VUKSAhPSBkd09mZnNldCkgewotCQlkcHJpbnRmX3dhcm4obWlkaSwgIk1JRElfUmVhZE1UcmsgLy8gY2FuJ3Qgc2VlayBhdCAlMDhsWCBiZWdpbiBvZiAnTVRoZCcgXG4iLCBkd09mZnNldCk7CisJCVdBUk4obWlkaSwgImNhbid0IHNlZWsgYXQgJTA4bFggYmVnaW4gb2YgJ01UaGQnIFxuIiwgZHdPZmZzZXQpOwogCQl9CiAJaWYgKG1taW9SZWFkKE1DSU1pZGlEZXZbd0RldklEXS5oRmlsZSwgKEhQU1RSKSZmb3VyY2MsCiAJCShsb25nKSBzaXplb2YoRk9VUkNDKSkgIT0gKGxvbmcpIHNpemVvZihGT1VSQ0MpKSB7CkBAIC0yNzQsNyArMjc0LDcgQEAKIAlpZiAoTUlESV9SZWFkTG9uZyh3RGV2SUQsICZ0b2JlcmVhZCkgIT0gMCkgewogCQlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCQl9Ci0JZHByaW50Zl9pbmZvKG1pZGksICJNSURJX1JlYWRNVHJrIC8vIHRvYmVyZWFkPSUwOGxYXG4iLCB0b2JlcmVhZCk7CisJVFJBQ0UobWlkaSwgInRvYmVyZWFkPSUwOGxYXG4iLCB0b2JlcmVhZCk7CiAJdG9iZXJlYWQgLT0gMyAqIHNpemVvZihXT1JEKTsKIAlNQ0lNaWRpRGV2W3dEZXZJRF0uZHdUb3RhbExlbiA9IHRvYmVyZWFkOwogCXJldHVybiAwOwpAQCAtMjk2LDcgKzI5Niw3IEBACiAJTFBTVFIJCWxwc3RyRWxlbWVudE5hbWU7CiAJY2hhcgkJc3RyWzEyOF07CiAKLQlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfbWNpT3BlbiglMDhsWCwgJXApXG4iLCBkd0ZsYWdzLCBscFBhcm1zKTsKKwlUUkFDRShtaWRpLCAiKCUwOGxYLCAlcClcbiIsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAKIAlpZiAoTUNJTWlkaURldlt3RGV2SURdLm5Vc2VDb3VudCA+IDApIHsKQEAgLTMxMywyNiArMzEzLDI2IEBACiAJCU1DSU1pZGlEZXZbd0RldklEXS5oTWlkaUhkciA9IFVTRVJfSEVBUF9BTExPQyhzaXplb2YoTUlESUhEUikpOwogCX0KIAotCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lPcGVuIC8vIHdEZXZJRD0lMDRYXG4iLCB3RGV2SUQpOworCVRSQUNFKG1pZGksICJ3RGV2SUQ9JTA0WFxuIiwgd0RldklEKTsKIC8qCWxwUGFybXMtPndEZXZpY2VJRCA9IHdEZXZJRDsqLwotCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lPcGVuIC8vIGxwUGFybXMtPndEZXZJRD0lMDRYXG4iLCBscFBhcm1zLT53RGV2aWNlSUQpOwotCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lPcGVuIC8vIGJlZm9yZSBPUEVOX0VMRU1FTlRcbiIpOworCVRSQUNFKG1pZGksICJscFBhcm1zLT53RGV2SUQ9JTA0WFxuIiwgbHBQYXJtcy0+d0RldmljZUlEKTsKKwlUUkFDRShtaWRpLCAiYmVmb3JlIE9QRU5fRUxFTUVOVFxuIik7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfT1BFTl9FTEVNRU5UKSB7CiAJCWxwc3RyRWxlbWVudE5hbWUgPSAoTFBTVFIpUFRSX1NFR19UT19MSU4obHBQYXJtcy0+bHBzdHJFbGVtZW50TmFtZSk7Ci0JCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lPcGVuIC8vIE1DSV9PUEVOX0VMRU1FTlQgJyVzJyAhXG4iLCBscHN0ckVsZW1lbnROYW1lKTsKKwkJVFJBQ0UobWlkaSwgIk1DSV9PUEVOX0VMRU1FTlQgJyVzJyAhXG4iLCBscHN0ckVsZW1lbnROYW1lKTsKIAkJaWYgKHN0cmxlbihscHN0ckVsZW1lbnROYW1lKSA+IDApIHsKIAkJCXN0cmNweShzdHIsIGxwc3RyRWxlbWVudE5hbWUpOwogCQkJQ2hhclVwcGVyMzJBKHN0cik7CiAJCQlNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUgPSBtbWlvT3BlbjE2KHN0ciwgTlVMTCwgCiAJCQkJTU1JT19BTExPQ0JVRiB8IE1NSU9fUkVBRFdSSVRFIHwgTU1JT19FWENMVVNJVkUpOwogCQkJaWYgKE1DSU1pZGlEZXZbd0RldklEXS5oRmlsZSA9PSAwKSB7Ci0JCQkJZHByaW50Zl93YXJuKG1pZGksICJNSURJX21jaU9wZW4gLy8gY2FuJ3QgZmluZCBmaWxlPSclcycgIVxuIiwgc3RyKTsKKwkJCQlXQVJOKG1pZGksICJjYW4ndCBmaW5kIGZpbGU9JyVzJyAhXG4iLCBzdHIpOwogCQkJCXJldHVybiBNQ0lFUlJfRklMRV9OT1RfRk9VTkQ7CiAJCQl9CiAJCX0gZWxzZSAKIAkJCU1DSU1pZGlEZXZbd0RldklEXS5oRmlsZSA9IDA7CiAJfQotCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lPcGVuIC8vIGhGaWxlPSV1XG4iLCBNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUpOworCVRSQUNFKG1pZGksICJoRmlsZT0ldVxuIiwgTUNJTWlkaURldlt3RGV2SURdLmhGaWxlKTsKIAltZW1jcHkoJk1DSU1pZGlEZXZbd0RldklEXS5vcGVuUGFybXMsIGxwUGFybXMsIHNpemVvZihNQ0lfT1BFTl9QQVJNUzE2KSk7CiAJTUNJTWlkaURldlt3RGV2SURdLndOb3RpZnlEZXZpY2VJRCA9IGxwUGFybXMtPndEZXZpY2VJRDsKIAlNQ0lNaWRpRGV2W3dEZXZJRF0uZHdTdGF0dXMgPSBNQ0lfTU9ERV9TVE9QOwpAQCAtMzQ0LDMwICszNDQsMzAgQEAKIAkJaWYgKG1taW9EZXNjZW5kKE1DSU1pZGlEZXZbd0RldklEXS5oRmlsZSwgJmNrTWFpblJJRkYsIE5VTEwsIDApICE9IDApIHsKIAkJCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJCX0KLQkJZHByaW50Zl9pbmZvKG1pZGksIk1JRElfbWNpT3BlbiAvLyBQYXJlbnRDaHVuayBja2lkPSUuNHMgZmNjVHlwZT0lLjRzIGNrc2l6ZT0lMDhsWCBcbiIsCisJCVRSQUNFKG1pZGksIlBhcmVudENodW5rIGNraWQ9JS40cyBmY2NUeXBlPSUuNHMgY2tzaXplPSUwOGxYIFxuIiwKIAkJCQkoTFBTVFIpJmNrTWFpblJJRkYuY2tpZCwgKExQU1RSKSZja01haW5SSUZGLmZjY1R5cGUsCiAJCQkJY2tNYWluUklGRi5ja3NpemUpOwogCQlkd09mZnNldCA9IDA7CiAJCWlmIChja01haW5SSUZGLmNraWQgPT0gbW1pb0ZPVVJDQygnUicsICdNJywgJ0knLCAnRCcpKSB7Ci0JCQlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfbWNpT3BlbiAvLyBpcyBhICdSTUlEJyBmaWxlIFxuIik7CisJCQlUUkFDRShtaWRpLCAiaXMgYSAnUk1JRCcgZmlsZSBcbiIpOwogCQkJZHdPZmZzZXQgPSBja01haW5SSUZGLmR3RGF0YU9mZnNldDsKIAkJfQogCQlpZiAoY2tNYWluUklGRi5ja2lkICE9IG1taW9GT1VSQ0MoJ00nLCAnVCcsICdoJywgJ2QnKSkgewotCQkJZHByaW50Zl93YXJuKG1pZGksICJNSURJX21jaU9wZW4gLy8gdW5rbm93biBmb3JtYXQgIVxuIik7CisJCQlXQVJOKG1pZGksICJ1bmtub3duIGZvcm1hdCAhXG4iKTsKIAkJCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJCX0KIAkJaWYgKE1JRElfUmVhZE1UaGQod0RldklELCBkd09mZnNldCkgIT0gMCkgewotCQkJZHByaW50Zl93YXJuKG1pZGksICJNSURJX21jaU9wZW4gLy8gY2FuJ3QgcmVhZCAnTVRoZCcgaGVhZGVyIFxuIik7CisJCQlXQVJOKG1pZGksICJjYW4ndCByZWFkICdNVGhkJyBoZWFkZXIgXG4iKTsKIAkJCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJCX0KIAkJZHdPZmZzZXQgPSBtbWlvU2VlayhNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUsIDAsIFNFRUtfQ1VSKTsKIAkJaWYgKE1JRElfUmVhZE1Ucmsod0RldklELCBkd09mZnNldCkgIT0gMCkgewotCQkJZHByaW50Zl93YXJuKG1pZGksICJNSURJX21jaU9wZW4gLy8gY2FuJ3QgcmVhZCAnTVRyaycgaGVhZGVyIFxuIik7CisJCQlXQVJOKG1pZGksICJjYW4ndCByZWFkICdNVHJrJyBoZWFkZXIgXG4iKTsKIAkJCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJCX0KIAkJZHdPZmZzZXQgPSBtbWlvU2VlayhNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUsIDAsIFNFRUtfQ1VSKTsKIAkJTUNJTWlkaURldlt3RGV2SURdLmR3QmVnaW5EYXRhID0gZHdPZmZzZXQ7Ci0JCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lPcGVuIC8vIENodW5rIEZvdW5kIGNraWQ9JS40cyBmY2NUeXBlPSUuNHMgY2tzaXplPSUwOGxYIFxuIiwKKwkJVFJBQ0UobWlkaSwgIkNodW5rIEZvdW5kIGNraWQ9JS40cyBmY2NUeXBlPSUuNHMgY2tzaXplPSUwOGxYIFxuIiwKIAkJCQkoTFBTVFIpJmNrTWFpblJJRkYuY2tpZCwgKExQU1RSKSZja01haW5SSUZGLmZjY1R5cGUsCiAJCQkJY2tNYWluUklGRi5ja3NpemUpOwogCX0KQEAgLTM4NywxMCArMzg3LDEwIEBACiBzdGF0aWMgRFdPUkQgTUlESV9tY2lTdG9wKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcykKIHsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQotCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lTdG9wKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOworCVRSQUNFKG1pZGksICIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAlNQ0lNaWRpRGV2W3dEZXZJRF0uZHdTdGF0dXMgPSBNQ0lfTU9ERV9TVE9QOwotCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lTdG9wIC8vIE1DSU1pZGlEZXZbd0RldklEXS5kd1N0YXR1cz0lcCAlZFxuIiwKKwlUUkFDRShtaWRpLCAiTUNJTWlkaURldlt3RGV2SURdLmR3U3RhdHVzPSVwICVkXG4iLAogCQkJJk1DSU1pZGlEZXZbd0RldklEXS5kd1N0YXR1cywgTUNJTWlkaURldlt3RGV2SURdLmR3U3RhdHVzKTsKIAlyZXR1cm4gMDsKICNlbHNlCkBAIC00MDcsNyArNDA3LDcgQEAKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQogCURXT1JECQlkd1JldDsKIAotCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lDbG9zZSglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd1BhcmFtLCBscFBhcm1zKTsKKwlUUkFDRShtaWRpLCAiKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3UGFyYW0sIGxwUGFybXMpOwogCWlmIChNQ0lNaWRpRGV2W3dEZXZJRF0uZHdTdGF0dXMgIT0gTUNJX01PREVfU1RPUCkgewogCQlNSURJX21jaVN0b3Aod0RldklELCBNQ0lfV0FJVCwgbHBQYXJtcyk7CiAJCX0KQEAgLTQxNyw3ICs0MTcsNyBAQAogCQlpZiAoTUNJTWlkaURldlt3RGV2SURdLmhGaWxlICE9IDApIHsKIAkJCW1taW9DbG9zZShNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUsIDApOwogCQkJTUNJTWlkaURldlt3RGV2SURdLmhGaWxlID0gMDsKLQkJCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lDbG9zZSAvLyBoRmlsZSBjbG9zZWQgIVxuIik7CisJCQlUUkFDRShtaWRpLCAiaEZpbGUgY2xvc2VkICFcbiIpOwogCQkJfQogCQlVU0VSX0hFQVBfRlJFRShNQ0lNaWRpRGV2W3dEZXZJRF0uaE1pZGlIZHIpOwogCQlkd1JldCA9IG1vZE1lc3NhZ2Uod0RldklELCBNT0RNX0NMT1NFLCAwLCAwTCwgMEwpOwpAQCAtNDQ1LDMzICs0NDUsMzMgQEAKIAlEV09SRAkJZHdEYXRhLGR3UmV0OwogCUxQV09SRAkJcHRyOwogCi0JZHByaW50Zl9pbmZvKG1pZGksICJNSURJX21jaVBsYXkoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CisJVFJBQ0UobWlkaSwgIiglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAoTUNJTWlkaURldlt3RGV2SURdLmhGaWxlID09IDApIHsKLQkJZHByaW50Zl93YXJuKG1pZGksICJNSURJX21jaVBsYXkgLy8gY2FuJ3QgZmluZCBmaWxlPSclMDhseCcgIVxuIiwgCisJCVdBUk4obWlkaSwgImNhbid0IGZpbmQgZmlsZT0nJTA4bHgnICFcbiIsIAogCQkJCShEV09SRClNQ0lNaWRpRGV2W3dEZXZJRF0ub3BlblBhcm1zLmxwc3RyRWxlbWVudE5hbWUpOwogCQlyZXR1cm4gTUNJRVJSX0ZJTEVfTk9UX0ZPVU5EOwogCX0KIAlzdGFydCA9IDE7IAkJZW5kID0gOTk5OTk7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfRlJPTSkgewogCQlzdGFydCA9IGxwUGFybXMtPmR3RnJvbTsgCi0JCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lQbGF5IC8vIE1DSV9GUk9NPSVkIFxuIiwgc3RhcnQpOworCQlUUkFDRShtaWRpLCAiTUNJX0ZST009JWQgXG4iLCBzdGFydCk7CiAJfQogCWlmIChkd0ZsYWdzICYgTUNJX1RPKSB7CiAJCWVuZCA9IGxwUGFybXMtPmR3VG87Ci0JCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lQbGF5IC8vIE1DSV9UTz0lZCBcbiIsIGVuZCk7CisJCVRSQUNFKG1pZGksICJNQ0lfVE89JWQgXG4iLCBlbmQpOwogCX0KICNpZiAwCiAJaWYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSB7Ci0JCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lQbGF5IC8vIE1DSV9OT1RJRlkgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdDYWxsYmFjayk7CisJCVRSQUNFKG1pZGksICJNQ0lfTk9USUZZICUwOGxYICFcbiIsIGxwUGFybXMtPmR3Q2FsbGJhY2spOwogCQlzd2l0Y2goZm9yaygpKSB7CiAJCWNhc2UgLTE6Ci0JCQlkcHJpbnRmX3dhcm4obWlkaSwgIk1JRElfbWNpUGxheSAvLyBDYW4ndCAnZm9yaycgcHJvY2VzcyAhXG4iKTsKKwkJCVdBUk4obWlkaSwgIkNhbid0ICdmb3JrJyBwcm9jZXNzICFcbiIpOwogCQkJYnJlYWs7CiAJCWNhc2UgMDoKLQkJCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lQbGF5IC8vIHByb2Nlc3Mgc3RhcnRlZCAhIHBsYXkgaW4gYmFja2dyb3VuZCAuLi5cbiIpOworCQkJVFJBQ0UobWlkaSwgInByb2Nlc3Mgc3RhcnRlZCAhIHBsYXkgaW4gYmFja2dyb3VuZCAuLi5cbiIpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfbWNpUGxheSAvLyBwcm9jZXNzIHN0YXJ0ZWQgISByZXR1cm4gdG8gY2FsbGVyLi4uXG4iKTsKKwkJCVRSQUNFKG1pZGksICJwcm9jZXNzIHN0YXJ0ZWQgISByZXR1cm4gdG8gY2FsbGVyLi4uXG4iKTsKIAkJCXJldHVybiAwOwogCQl9CiAJfQpAQCAtNDg2LDExICs0ODYsMTEgQEAKIAlscE1pZGlIZHItPmR3RmxhZ3MgPSAwTDsKIAlkd1JldCA9IG1vZE1lc3NhZ2Uod0RldklELCBNT0RNX1BSRVBBUkUsIDAsIChEV09SRClscE1pZGlIZHIsIHNpemVvZihNSURJSERSKSk7CiAKLS8qCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lQbGF5IC8vIGFmdGVyIE1PRE1fUFJFUEFSRSBcbiIpOyAqLworLyoJVFJBQ0UobWlkaSwgImFmdGVyIE1PRE1fUFJFUEFSRSBcbiIpOyAqLwogCiAJTUNJTWlkaURldlt3RGV2SURdLmR3U3RhdHVzID0gTUNJX01PREVfUExBWTsKIAl3aGlsZShNQ0lNaWRpRGV2W3dEZXZJRF0uZHdTdGF0dXMgIT0gTUNJX01PREVfU1RPUCkgewotCQlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfbWNpUGxheSAvLyBNQ0lNaWRpRGV2W3dEZXZJRF0uZHdTdGF0dXM9JXAgJWRcbiIsCisJCVRSQUNFKG1pZGksICJNQ0lNaWRpRGV2W3dEZXZJRF0uZHdTdGF0dXM9JXAgJWRcbiIsCiAJCQkmTUNJTWlkaURldlt3RGV2SURdLmR3U3RhdHVzLCBNQ0lNaWRpRGV2W3dEZXZJRF0uZHdTdGF0dXMpOwogCiAJCXB0ciA9IChMUFdPUkQpbHBNaWRpSGRyLT5scERhdGE7CkBAIC01MDEsMTEgKzUwMSwxMSBAQAogLyoKIAkJY291bnQgPSBtbWlvUmVhZChNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUsIGxwTWlkaUhkci0+bHBEYXRhLCBscE1pZGlIZHItPmR3QnVmZmVyTGVuZ3RoKTsKICovCi0JCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lQbGF5IC8vIGFmdGVyIHJlYWQgY291bnQgPSAlZFxuIixjb3VudCk7CisJCVRSQUNFKG1pZGksICJhZnRlciByZWFkIGNvdW50ID0gJWRcbiIsY291bnQpOwogCiAJCWlmIChjb3VudCA8IDEpIGJyZWFrOwogCQlscE1pZGlIZHItPmR3Qnl0ZXNSZWNvcmRlZCA9IGNvdW50OwotCQlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfbWNpUGxheSAvLyBiZWZvcmUgTU9ETV9MT05HREFUQSBscE1pZGlIZHI9JXAgZHdCeXRlc1JlY29yZGVkPSVsdVxuIiwKKwkJVFJBQ0UobWlkaSwgImJlZm9yZSBNT0RNX0xPTkdEQVRBIGxwTWlkaUhkcj0lcCBkd0J5dGVzUmVjb3JkZWQ9JWx1XG4iLAogCQkJCQlscE1pZGlIZHIsIGxwTWlkaUhkci0+ZHdCeXRlc1JlY29yZGVkKTsKIAkJZHdSZXQgPSBtb2RNZXNzYWdlKHdEZXZJRCwgTU9ETV9MT05HREFUQSwgMCwgKERXT1JEKWxwTWlkaUhkciwgc2l6ZW9mKE1JRElIRFIpKTsKIAkJaWYgKGR3UmV0ICE9IE1NU1lTRVJSX05PRVJST1IpIHsKQEAgLTUzNyw3ICs1MzcsNyBAQAogCX0KIAlNQ0lNaWRpRGV2W3dEZXZJRF0uZHdTdGF0dXMgPSBNQ0lfTU9ERV9TVE9QOwogCWlmIChkd0ZsYWdzICYgTUNJX05PVElGWSkgewotCQlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfbWNpUGxheSAvLyBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdDYWxsYmFjayk7CisJCVRSQUNFKG1pZGksICJNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdDYWxsYmFjayk7CiAJCW1jaURyaXZlck5vdGlmeSgoSFdORDE2KUxPV09SRChscFBhcm1zLT5kd0NhbGxiYWNrKSwgCiAJCQlNQ0lNaWRpRGV2W3dEZXZJRF0ud05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOwogI2lmIDAKQEAgLTU2MSwyMCArNTYxLDIwIEBACiAJTFBNSURJSERSCWxwTWlkaUhkcjsKIAlEV09SRAkJZHdSZXQ7CiAKLQlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfbWNpUmVjb3JkKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOworCVRSQUNFKG1pZGksICIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKE1DSU1pZGlEZXZbd0RldklEXS5oRmlsZSA9PSAwKSB7Ci0JCWRwcmludGZfd2FybihtaWRpLCAiTUlESV9tY2lSZWNvcmQgLy8gY2FuJ3QgZmluZCBmaWxlPSclMDhseCcgIVxuIiwgCisJCVdBUk4obWlkaSwgImNhbid0IGZpbmQgZmlsZT0nJTA4bHgnICFcbiIsIAogCQkJKERXT1JEKU1DSU1pZGlEZXZbd0RldklEXS5vcGVuUGFybXMubHBzdHJFbGVtZW50TmFtZSk7CiAJCXJldHVybiBNQ0lFUlJfRklMRV9OT1RfRk9VTkQ7CiAJfQogCXN0YXJ0ID0gMTsgCQllbmQgPSA5OTk5OTsKIAlpZiAoZHdGbGFncyAmIE1DSV9GUk9NKSB7CiAJCXN0YXJ0ID0gbHBQYXJtcy0+ZHdGcm9tOyAKLQkJZHByaW50Zl9pbmZvKG1pZGksICJNSURJX21jaVJlY29yZCAvLyBNQ0lfRlJPTT0lZCBcbiIsIHN0YXJ0KTsKKwkJVFJBQ0UobWlkaSwgIk1DSV9GUk9NPSVkIFxuIiwgc3RhcnQpOwogCX0KIAlpZiAoZHdGbGFncyAmIE1DSV9UTykgewogCQllbmQgPSBscFBhcm1zLT5kd1RvOwotCQlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfbWNpUmVjb3JkIC8vIE1DSV9UTz0lZCBcbiIsIGVuZCk7CisJCVRSQUNFKG1pZGksICJNQ0lfVE89JWQgXG4iLCBlbmQpOwogCX0KIAlscE1pZGlIZHIgPSBVU0VSX0hFQVBfTElOX0FERFIoTUNJTWlkaURldlt3RGV2SURdLmhNaWRpSGRyKTsKIAlscE1pZGlIZHItPmxwRGF0YSA9IChMUFNUUikgeG1hbGxvYygxMjAwKTsKQEAgLTU4MiwyNyArNTgyLDI3IEBACiAJbHBNaWRpSGRyLT5kd1VzZXIgPSAwTDsKIAlscE1pZGlIZHItPmR3RmxhZ3MgPSAwTDsKIAlkd1JldCA9IG1pZE1lc3NhZ2Uod0RldklELCBNSURNX1BSRVBBUkUsIDAsIChEV09SRClscE1pZGlIZHIsIHNpemVvZihNSURJSERSKSk7Ci0JZHByaW50Zl9pbmZvKG1pZGksICJNSURJX21jaVJlY29yZCAvLyBhZnRlciBNSURNX1BSRVBBUkUgXG4iKTsKKwlUUkFDRShtaWRpLCAiYWZ0ZXIgTUlETV9QUkVQQVJFIFxuIik7CiAJTUNJTWlkaURldlt3RGV2SURdLmR3U3RhdHVzID0gTUNJX01PREVfUkVDT1JEOwogCXdoaWxlKE1DSU1pZGlEZXZbd0RldklEXS5kd1N0YXR1cyAhPSBNQ0lfTU9ERV9TVE9QKSB7Ci0JCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lSZWNvcmQgLy8gTUNJTWlkaURldlt3RGV2SURdLmR3U3RhdHVzPSVwICVkXG4iLAorCQlUUkFDRShtaWRpLCAiTUNJTWlkaURldlt3RGV2SURdLmR3U3RhdHVzPSVwICVkXG4iLAogCQkJJk1DSU1pZGlEZXZbd0RldklEXS5kd1N0YXR1cywgTUNJTWlkaURldlt3RGV2SURdLmR3U3RhdHVzKTsKIAkJbHBNaWRpSGRyLT5kd0J5dGVzUmVjb3JkZWQgPSAwOwogCQlkd1JldCA9IG1pZE1lc3NhZ2Uod0RldklELCBNSURNX1NUQVJULCAwLCAwTCwgMEwpOwotCQlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfbWNpUmVjb3JkIC8vIGFmdGVyIE1JRE1fU1RBUlQgbHBNaWRpSGRyPSVwIGR3Qnl0ZXNSZWNvcmRlZD0lbHVcbiIsCisJCVRSQUNFKG1pZGksICJhZnRlciBNSURNX1NUQVJUIGxwTWlkaUhkcj0lcCBkd0J5dGVzUmVjb3JkZWQ9JWx1XG4iLAogCQkJCQlscE1pZGlIZHIsIGxwTWlkaUhkci0+ZHdCeXRlc1JlY29yZGVkKTsKIAkJaWYgKGxwTWlkaUhkci0+ZHdCeXRlc1JlY29yZGVkID09IDApIGJyZWFrOwogCX0KLQlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfbWNpUmVjb3JkIC8vIGJlZm9yZSBNSURNX1VOUFJFUEFSRSBcbiIpOworCVRSQUNFKG1pZGksICJiZWZvcmUgTUlETV9VTlBSRVBBUkUgXG4iKTsKIAlkd1JldCA9IG1pZE1lc3NhZ2Uod0RldklELCBNSURNX1VOUFJFUEFSRSwgMCwgKERXT1JEKWxwTWlkaUhkciwgc2l6ZW9mKE1JRElIRFIpKTsKLQlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfbWNpUmVjb3JkIC8vIGFmdGVyIE1JRE1fVU5QUkVQQVJFIFxuIik7CisJVFJBQ0UobWlkaSwgImFmdGVyIE1JRE1fVU5QUkVQQVJFIFxuIik7CiAJaWYgKGxwTWlkaUhkci0+bHBEYXRhICE9IE5VTEwpIHsKIAkJZnJlZShscE1pZGlIZHItPmxwRGF0YSk7CiAJCWxwTWlkaUhkci0+bHBEYXRhID0gTlVMTDsKIAl9CiAJTUNJTWlkaURldlt3RGV2SURdLmR3U3RhdHVzID0gTUNJX01PREVfU1RPUDsKIAlpZiAoZHdGbGFncyAmIE1DSV9OT1RJRlkpIHsKLQkJZHByaW50Zl9pbmZvKG1pZGksICJNSURJX21jaVJlY29yZCAvLyBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdDYWxsYmFjayk7CisJCVRSQUNFKG1pZGksICJNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdDYWxsYmFjayk7CiAJCW1jaURyaXZlck5vdGlmeSgoSFdORDE2KUxPV09SRChscFBhcm1zLT5kd0NhbGxiYWNrKSwgCiAJCQlNQ0lNaWRpRGV2W3dEZXZJRF0ud05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOwogCX0KQEAgLTYxOSw3ICs2MTksNyBAQAogc3RhdGljIERXT1JEIE1JRElfbWNpUGF1c2UoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfR0VORVJJQ19QQVJNUyBscFBhcm1zKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCi0JZHByaW50Zl9pbmZvKG1pZGksICJNSURJX21jaVBhdXNlKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOworCVRSQUNFKG1pZGksICIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAlyZXR1cm4gMDsKICNlbHNlCkBAIC02MzQsNyArNjM0LDcgQEAKIHN0YXRpYyBEV09SRCBNSURJX21jaVJlc3VtZShVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9HRU5FUklDX1BBUk1TIGxwUGFybXMpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLQlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfbWNpUmVzdW1lKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOworCVRSQUNFKG1pZGksICIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAlyZXR1cm4gMDsKICNlbHNlCkBAIC02NDksMjMgKzY0OSwyMyBAQAogc3RhdGljIERXT1JEIE1JRElfbWNpU2V0KFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX1NFVF9QQVJNUyBscFBhcm1zKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCi0JZHByaW50Zl9pbmZvKG1pZGksICJNSURJX21jaVNldCglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKKwlUUkFDRShtaWRpLCAiKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7Ci0JZHByaW50Zl9pbmZvKG1pZGksICJNSURJX21jaVNldCAvLyBkd1RpbWVGb3JtYXQ9JTA4bFhcbiIsIGxwUGFybXMtPmR3VGltZUZvcm1hdCk7Ci0JZHByaW50Zl9pbmZvKG1pZGksICJNSURJX21jaVNldCAvLyBkd0F1ZGlvPSUwOGxYXG4iLCBscFBhcm1zLT5kd0F1ZGlvKTsKKwlUUkFDRShtaWRpLCAiZHdUaW1lRm9ybWF0PSUwOGxYXG4iLCBscFBhcm1zLT5kd1RpbWVGb3JtYXQpOworCVRSQUNFKG1pZGksICJkd0F1ZGlvPSUwOGxYXG4iLCBscFBhcm1zLT5kd0F1ZGlvKTsKIAlpZiAoZHdGbGFncyAmIE1DSV9TRVRfVElNRV9GT1JNQVQpIHsKIAkJc3dpdGNoIChscFBhcm1zLT5kd1RpbWVGb3JtYXQpIHsKIAkJY2FzZSBNQ0lfRk9STUFUX01JTExJU0VDT05EUzoKLQkJCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lTZXQgLy8gTUNJX0ZPUk1BVF9NSUxMSVNFQ09ORFMgIVxuIik7CisJCQlUUkFDRShtaWRpLCAiTUNJX0ZPUk1BVF9NSUxMSVNFQ09ORFMgIVxuIik7CiAJCQlicmVhazsKIAkJY2FzZSBNQ0lfRk9STUFUX0JZVEVTOgotCQkJZHByaW50Zl9pbmZvKG1pZGksICJNSURJX21jaVNldCAvLyBNQ0lfRk9STUFUX0JZVEVTICFcbiIpOworCQkJVFJBQ0UobWlkaSwgIk1DSV9GT1JNQVRfQllURVMgIVxuIik7CiAJCQlicmVhazsKIAkJY2FzZSBNQ0lfRk9STUFUX1NBTVBMRVM6Ci0JCQlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfbWNpU2V0IC8vIE1DSV9GT1JNQVRfU0FNUExFUyAhXG4iKTsKKwkJCVRSQUNFKG1pZGksICJNQ0lfRk9STUFUX1NBTVBMRVMgIVxuIik7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCWRwcmludGZfd2FybihtaWRpLCAiTUlESV9tY2lTZXQgLy8gYmFkIHRpbWUgZm9ybWF0ICFcbiIpOworCQkJV0FSTihtaWRpLCAiYmFkIHRpbWUgZm9ybWF0ICFcbiIpOwogCQkJcmV0dXJuIE1DSUVSUl9CQURfVElNRV9GT1JNQVQ7CiAJCX0KIAl9CkBAIC02NzMsMjYgKzY3MywyNiBAQAogCWlmIChkd0ZsYWdzICYgTUNJX1NFVF9ET09SX09QRU4pIHJldHVybiBNQ0lFUlJfVU5TVVBQT1JURURfRlVOQ1RJT047CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfU0VUX0RPT1JfQ0xPU0VEKSByZXR1cm4gTUNJRVJSX1VOU1VQUE9SVEVEX0ZVTkNUSU9OOwogCWlmIChkd0ZsYWdzICYgTUNJX1NFVF9BVURJTykKLQkJZHByaW50Zl9pbmZvKG1pZGksICJNSURJX21jaVNldCAvLyBNQ0lfU0VUX0FVRElPICFcbiIpOworCQlUUkFDRShtaWRpLCAiTUNJX1NFVF9BVURJTyAhXG4iKTsKIAlpZiAoZHdGbGFncyAmJiBNQ0lfU0VUX09OKSB7Ci0JCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lTZXQgLy8gTUNJX1NFVF9PTiAhXG4iKTsKKwkJVFJBQ0UobWlkaSwgIk1DSV9TRVRfT04gIVxuIik7CiAJCWlmIChkd0ZsYWdzICYmIE1DSV9TRVRfQVVESU9fTEVGVCkKLQkJCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lTZXQgLy8gTUNJX1NFVF9BVURJT19MRUZUICFcbiIpOworCQkJVFJBQ0UobWlkaSwgIk1DSV9TRVRfQVVESU9fTEVGVCAhXG4iKTsKIAkJaWYgKGR3RmxhZ3MgJiYgTUNJX1NFVF9BVURJT19SSUdIVCkKLQkJCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lTZXQgLy8gTUNJX1NFVF9BVURJT19SSUdIVCAhXG4iKTsKKwkJCVRSQUNFKG1pZGksICJNQ0lfU0VUX0FVRElPX1JJR0hUICFcbiIpOwogCX0KIAlpZiAoZHdGbGFncyAmIE1DSV9TRVRfT0ZGKQotCQlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfbWNpU2V0IC8vIE1DSV9TRVRfT0ZGICFcbiIpOworCQlUUkFDRShtaWRpLCAiTUNJX1NFVF9PRkYgIVxuIik7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfU0VRX1NFVF9NQVNURVIpCi0JCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lTZXQgLy8gTUNJX1NFUV9TRVRfTUFTVEVSICFcbiIpOworCQlUUkFDRShtaWRpLCAiTUNJX1NFUV9TRVRfTUFTVEVSICFcbiIpOwogCWlmIChkd0ZsYWdzICYgTUNJX1NFUV9TRVRfU0xBVkUpCi0JCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lTZXQgLy8gTUNJX1NFUV9TRVRfU0xBVkUgIVxuIik7CisJCVRSQUNFKG1pZGksICJNQ0lfU0VRX1NFVF9TTEFWRSAhXG4iKTsKIAlpZiAoZHdGbGFncyAmIE1DSV9TRVFfU0VUX09GRlNFVCkKLQkJZHByaW50Zl9pbmZvKG1pZGksICJNSURJX21jaVNldCAvLyBNQ0lfU0VRX1NFVF9PRkZTRVQgIVxuIik7CisJCVRSQUNFKG1pZGksICJNQ0lfU0VRX1NFVF9PRkZTRVQgIVxuIik7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfU0VRX1NFVF9QT1JUKQotCQlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfbWNpU2V0IC8vIE1DSV9TRVFfU0VUX1BPUlQgIVxuIik7CisJCVRSQUNFKG1pZGksICJNQ0lfU0VRX1NFVF9QT1JUICFcbiIpOwogCWlmIChkd0ZsYWdzICYgTUNJX1NFUV9TRVRfVEVNUE8pCi0JCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lTZXQgLy8gTUNJX1NFUV9TRVRfVEVNUE8gIVxuIik7CisJCVRSQUNFKG1pZGksICJNQ0lfU0VRX1NFVF9URU1QTyAhXG4iKTsKICAJcmV0dXJuIDA7CiAjZWxzZQogCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CkBAIC03MDYsNyArNzA2LDcgQEAKIHN0YXRpYyBEV09SRCBNSURJX21jaVN0YXR1cyhVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9TVEFUVVNfUEFSTVMgbHBQYXJtcykKIHsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQotCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lTdGF0dXMoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CisJVFJBQ0UobWlkaSwgIiglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCWlmIChkd0ZsYWdzICYgTUNJX1NUQVRVU19JVEVNKSB7CiAJCXN3aXRjaChscFBhcm1zLT5kd0l0ZW0pIHsKQEAgLTcyNCw3ICs3MjQsNyBAQAogCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSBNQ0lfTU9ERV9TVE9QOwogCQkJYnJlYWs7CiAJCWNhc2UgTUNJX1NUQVRVU19NRURJQV9QUkVTRU5UOgotCQkJZHByaW50Zl9pbmZvKG1pZGksICJNSURJX21jaVN0YXR1cyAvLyBNQ0lfU1RBVFVTX01FRElBX1BSRVNFTlQgIVxuIik7CisJCQlUUkFDRShtaWRpLCAiTUNJX1NUQVRVU19NRURJQV9QUkVTRU5UICFcbiIpOwogCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSBUUlVFOwogCQkJYnJlYWs7CiAJCWNhc2UgTUNJX1NUQVRVU19OVU1CRVJfT0ZfVFJBQ0tTOgpAQCAtNzQwLDQ0ICs3NDAsNDQgQEAKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIE1DSV9TVEFUVVNfUkVBRFk6Ci0JCQlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfbWNpU3RhdHVzIC8vIE1DSV9TVEFUVVNfUkVBRFkgIVxuIik7CisJCQlUUkFDRShtaWRpLCAiTUNJX1NUQVRVU19SRUFEWSAhXG4iKTsKIAkJCWxwUGFybXMtPmR3UmV0dXJuID0gVFJVRTsKIAkJCWJyZWFrOwogCQljYXNlIE1DSV9TVEFUVVNfVElNRV9GT1JNQVQ6Ci0JCQlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfbWNpU3RhdHVzIC8vIE1DSV9TVEFUVVNfVElNRV9GT1JNQVQgIVxuIik7CisJCQlUUkFDRShtaWRpLCAiTUNJX1NUQVRVU19USU1FX0ZPUk1BVCAhXG4iKTsKIAkJCWxwUGFybXMtPmR3UmV0dXJuID0gTUNJX0ZPUk1BVF9NSUxMSVNFQ09ORFM7CiAJCQlicmVhazsKIAkJY2FzZSBNQ0lfU0VRX1NUQVRVU19ESVZUWVBFOgotCQkJZHByaW50Zl9pbmZvKG1pZGksICJNSURJX21jaVN0YXR1cyAvLyBNQ0lfU0VRX1NUQVRVU19ESVZUWVBFICFcbiIpOworCQkJVFJBQ0UobWlkaSwgIk1DSV9TRVFfU1RBVFVTX0RJVlRZUEUgIVxuIik7CiAJCQlscFBhcm1zLT5kd1JldHVybiA9IDA7CiAJCQlicmVhazsKIAkJY2FzZSBNQ0lfU0VRX1NUQVRVU19NQVNURVI6Ci0JCQlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfbWNpU3RhdHVzIC8vIE1DSV9TRVFfU1RBVFVTX01BU1RFUiAhXG4iKTsKKwkJCVRSQUNFKG1pZGksICJNQ0lfU0VRX1NUQVRVU19NQVNURVIgIVxuIik7CiAJCQlscFBhcm1zLT5kd1JldHVybiA9IDA7CiAJCQlicmVhazsKIAkJY2FzZSBNQ0lfU0VRX1NUQVRVU19TTEFWRToKLQkJCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lTdGF0dXMgLy8gTUNJX1NFUV9TVEFUVVNfU0xBVkUgIVxuIik7CisJCQlUUkFDRShtaWRpLCAiTUNJX1NFUV9TVEFUVVNfU0xBVkUgIVxuIik7CiAJCQlscFBhcm1zLT5kd1JldHVybiA9IDA7CiAJCQlicmVhazsKIAkJY2FzZSBNQ0lfU0VRX1NUQVRVU19PRkZTRVQ6Ci0JCQlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfbWNpU3RhdHVzIC8vIE1DSV9TRVFfU1RBVFVTX09GRlNFVCAhXG4iKTsKKwkJCVRSQUNFKG1pZGksICJNQ0lfU0VRX1NUQVRVU19PRkZTRVQgIVxuIik7CiAJCQlscFBhcm1zLT5kd1JldHVybiA9IDA7CiAJCQlicmVhazsKIAkJY2FzZSBNQ0lfU0VRX1NUQVRVU19QT1JUOgotCQkJZHByaW50Zl9pbmZvKG1pZGksICJNSURJX21jaVN0YXR1cyAvLyBNQ0lfU0VRX1NUQVRVU19QT1JUICFcbiIpOworCQkJVFJBQ0UobWlkaSwgIk1DSV9TRVFfU1RBVFVTX1BPUlQgIVxuIik7CiAJCQlscFBhcm1zLT5kd1JldHVybiA9IDA7CiAJCQlicmVhazsKIAkJY2FzZSBNQ0lfU0VRX1NUQVRVU19URU1QTzoKLQkJCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lTdGF0dXMgLy8gTUNJX1NFUV9TVEFUVVNfVEVNUE8gIVxuIik7CisJCQlUUkFDRShtaWRpLCAiTUNJX1NFUV9TVEFUVVNfVEVNUE8gIVxuIik7CiAJCQlscFBhcm1zLT5kd1JldHVybiA9IDA7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCWRwcmludGZfd2FybihtaWRpLCAiTUlESV9tY2lTdGF0dXMgLy8gdW5rbm93bSBjb21tYW5kICUwOGxYICFcbiIsIGxwUGFybXMtPmR3SXRlbSk7CisJCQlXQVJOKG1pZGksICJ1bmtub3dtIGNvbW1hbmQgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdJdGVtKTsKIAkJCXJldHVybiBNQ0lFUlJfVU5SRUNPR05JWkVEX0NPTU1BTkQ7CiAJCX0KIAl9CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSB7Ci0JCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lTdGF0dXMgLy8gTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIGxwUGFybXMtPmR3Q2FsbGJhY2spOworCQlUUkFDRShtaWRpLCAiTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIGxwUGFybXMtPmR3Q2FsbGJhY2spOwogCQltY2lEcml2ZXJOb3RpZnkoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAogCQkJTUNJTWlkaURldlt3RGV2SURdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKIAl9CkBAIC03OTQsNyArNzk0LDcgQEAKIAkJCQkJTFBNQ0lfR0VUREVWQ0FQU19QQVJNUyBscFBhcm1zKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCi0JZHByaW50Zl9pbmZvKG1pZGksICJNSURJX21jaUdldERldkNhcHMoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CisJVFJBQ0UobWlkaSwgIiglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCWlmIChkd0ZsYWdzICYgTUNJX0dFVERFVkNBUFNfSVRFTSkgewogCQlzd2l0Y2gobHBQYXJtcy0+ZHdJdGVtKSB7CkBAIC04NDEsNyArODQxLDcgQEAKIHN0YXRpYyBEV09SRCBNSURJX21jaUluZm8oVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfSU5GT19QQVJNUzE2IGxwUGFybXMpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLQlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfbWNpSW5mbyglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKKwlUUkFDRShtaWRpLCAiKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJbHBQYXJtcy0+bHBzdHJSZXR1cm4gPSBOVUxMOwogCXN3aXRjaChkd0ZsYWdzKSB7CkBAIC04NzMsNyArODczLDcgQEAKICAqLwogc3RhdGljIERXT1JEIG1pZEdldERldkNhcHMoV09SRCB3RGV2SUQsIExQTUlESUlOQ0FQUzE2IGxwQ2FwcywgRFdPUkQgZHdTaXplKQogewotCWRwcmludGZfaW5mbyhtaWRpLCAibWlkR2V0RGV2Q2FwcyglMDRYLCAlcCwgJTA4bFgpO1xuIiwgd0RldklELCBscENhcHMsIGR3U2l6ZSk7CisJVFJBQ0UobWlkaSwgIiglMDRYLCAlcCwgJTA4bFgpO1xuIiwgd0RldklELCBscENhcHMsIGR3U2l6ZSk7CiAJbHBDYXBzLT53TWlkID0gMHgwMEZGOyAJICAgICAgICAvKiBNYW51ZmFjIElEICovCiAJbHBDYXBzLT53UGlkID0gMHgwMDAxOyAJICAgICAgICAvKiBQcm9kdWN0IElEICovCiAJbHBDYXBzLT52RHJpdmVyVmVyc2lvbiA9IDB4MDAxOyAvKiBQcm9kdWN0IFZlcnNpb24gKi8KQEAgLTg4OSwzOCArODg5LDM0IEBACiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKIAlpbnQJCW1pZGk7Ci0JZHByaW50Zl9pbmZvKG1pZGksCi0JCSJtaWRPcGVuKCUwNFgsICVwLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGxwRGVzYywgZHdGbGFncyk7CisJVFJBQ0UobWlkaSwgIiglMDRYLCAlcCwgJTA4bFgpO1xuIiwgd0RldklELCBscERlc2MsIGR3RmxhZ3MpOwogCWlmIChscERlc2MgPT0gTlVMTCkgewotCQlkcHJpbnRmX3dhcm4obWlkaSwgIkxpbnV4ICdtaWRPcGVuJyAvLyBJbnZhbGlkIFBhcmFtZXRlciAhXG4iKTsKKwkJV0FSTihtaWRpLCAiSW52YWxpZCBQYXJhbWV0ZXIgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOwogCX0KIAlpZiAod0RldklEID49IE1BWF9NSURJSU5EUlYpIHsKLQkJZHByaW50Zl9pbmZvKG1pZGksIkxpbnV4ICdtaWRPcGVuJyAvLyBNQVhfTUlESUlORFJWIHJlYWNoZWQgIVxuIik7CisJCVRSQUNFKG1pZGksIk1BWF9NSURJSU5EUlYgcmVhY2hlZCAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX0FMTE9DQVRFRDsKIAl9CiAJTWlkaUluRGV2W3dEZXZJRF0udW5peGRldiA9IDA7CiAJbWlkaSA9IG9wZW4gKE1JRElfREVWLCBPX1JET05MWSwgMCk7CiAJaWYgKG1pZGkgPT0gLTEpIHsKLQkJZHByaW50Zl93YXJuKG1pZGksIkxpbnV4ICdtaWRPcGVuJyAvLyBjYW4ndCBvcGVuICFcbiIpOworCQlXQVJOKG1pZGksImNhbid0IG9wZW4gIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCX0KIAlNaWRpSW5EZXZbd0RldklEXS53RmxhZ3MgPSBISVdPUkQoZHdGbGFncyAmIENBTExCQUNLX1RZUEVNQVNLKTsKIAlzd2l0Y2goTWlkaUluRGV2W3dEZXZJRF0ud0ZsYWdzKSB7CiAJCWNhc2UgRENCX05VTEw6Ci0JCQlkcHJpbnRmX2luZm8obWlkaSwiTGludXggJ21pZE9wZW4nIC8vIENBTExCQUNLX05VTEwgIVxuIik7CisJCQlUUkFDRShtaWRpLCJDQUxMQkFDS19OVUxMICFcbiIpOwogCQkJYnJlYWs7CiAJCWNhc2UgRENCX1dJTkRPVzoKLQkJCWRwcmludGZfaW5mbyhtaWRpLAotCQkJCSJMaW51eCAnbWlkT3BlbicgLy8gQ0FMTEJBQ0tfV0lORE9XICFcbiIpOworCQkJVFJBQ0UobWlkaSwgIkNBTExCQUNLX1dJTkRPVyAhXG4iKTsKIAkJCWJyZWFrOwogCQljYXNlIERDQl9UQVNLOgotCQkJZHByaW50Zl9pbmZvKG1pZGksCi0JCQkJICAgIkxpbnV4ICdtaWRPcGVuJyAvLyBDQUxMQkFDS19UQVNLICFcbiIpOworCQkJVFJBQ0UobWlkaSwgIkNBTExCQUNLX1RBU0sgIVxuIik7CiAJCQlicmVhazsKIAkJY2FzZSBEQ0JfRlVOQ1RJT046Ci0JCQlkcHJpbnRmX2luZm8obWlkaSwKLQkJCQkgICAiTGludXggJ21pZE9wZW4nIC8vIENBTExCQUNLX0ZVTkNUSU9OICFcbiIpOworCQkJVFJBQ0UobWlkaSwgIkNBTExCQUNLX0ZVTkNUSU9OICFcbiIpOwogCQkJYnJlYWs7CiAJfQogCU1pZGlJbkRldlt3RGV2SURdLmxwUXVldWVIZHIgPSBOVUxMOwpAQCAtOTI4LDcgKzkyNCw3IEBACiAJTWlkaUluRGV2W3dEZXZJRF0uZHdUb3RhbFBsYXllZCA9IDA7CiAJTWlkaUluRGV2W3dEZXZJRF0uYnVmc2l6ZSA9IDB4M0ZGRjsKIAlpZiAoTUlESV9Ob3RpZnlDbGllbnQod0RldklELCBNSU1fT1BFTiwgMEwsIDBMKSAhPSBNTVNZU0VSUl9OT0VSUk9SKSB7Ci0JCWRwcmludGZfd2FybihtaWRpLCJMaW51eCAnbWlkT3BlbicgLy8gY2FuJ3Qgbm90aWZ5IGNsaWVudCAhXG4iKTsKKwkJV0FSTihtaWRpLCJjYW4ndCBub3RpZnkgY2xpZW50ICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKIAl9CiAJcmV0dXJuIE1NU1lTRVJSX05PRVJST1I7CkBAIC05NDMsMTYgKzkzOSwxNiBAQAogc3RhdGljIERXT1JEIG1pZENsb3NlKFdPUkQgd0RldklEKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCi0JZHByaW50Zl9pbmZvKG1pZGksICJtaWRDbG9zZSglMDRYKTtcbiIsIHdEZXZJRCk7CisJVFJBQ0UobWlkaSwgIiglMDRYKTtcbiIsIHdEZXZJRCk7CiAJaWYgKE1pZGlJbkRldlt3RGV2SURdLnVuaXhkZXYgPT0gMCkgewotCQlkcHJpbnRmX3dhcm4obWlkaSwiTGludXggJ21pZENsb3NlJyAvLyBjYW4ndCBjbG9zZSAhXG4iKTsKKwkJV0FSTihtaWRpLCJjYW4ndCBjbG9zZSAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJfQogCWNsb3NlKE1pZGlJbkRldlt3RGV2SURdLnVuaXhkZXYpOwogCU1pZGlJbkRldlt3RGV2SURdLnVuaXhkZXYgPSAwOwogCU1pZGlJbkRldlt3RGV2SURdLmJ1ZnNpemUgPSAwOwogCWlmIChNSURJX05vdGlmeUNsaWVudCh3RGV2SUQsIE1JTV9DTE9TRSwgMEwsIDBMKSAhPSBNTVNZU0VSUl9OT0VSUk9SKSB7Ci0JCWRwcmludGZfd2FybihtaWRpLCJMaW51eCAnbWlkQ2xvc2UnIC8vIGNhbid0IG5vdGlmeSBjbGllbnQgIVxuIik7CisJCVdBUk4obWlkaSwiY2FuJ3Qgbm90aWZ5IGNsaWVudCAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07CiAJfQogCXJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwpAQCAtOTY2LDcgKzk2Miw3IEBACiAgKi8KIHN0YXRpYyBEV09SRCBtaWRBZGRCdWZmZXIoV09SRCB3RGV2SUQsIExQTUlESUhEUiBscE1pZGlIZHIsIERXT1JEIGR3U2l6ZSkKIHsKLQlkcHJpbnRmX2luZm8obWlkaSwgIm1pZEFkZEJ1ZmZlciglMDRYLCAlcCwgJTA4bFgpO1xuIiwgd0RldklELCBscE1pZGlIZHIsIGR3U2l6ZSk7CisJVFJBQ0UobWlkaSwgIiglMDRYLCAlcCwgJTA4bFgpO1xuIiwgd0RldklELCBscE1pZGlIZHIsIGR3U2l6ZSk7CiAJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiB9CiAKQEAgLTk3NSw3ICs5NzEsNyBAQAogICovCiBzdGF0aWMgRFdPUkQgbWlkUHJlcGFyZShXT1JEIHdEZXZJRCwgTFBNSURJSERSIGxwTWlkaUhkciwgRFdPUkQgZHdTaXplKQogewotCWRwcmludGZfaW5mbyhtaWRpLCAibWlkUHJlcGFyZSglMDRYLCAlcCwgJTA4bFgpO1xuIiwgd0RldklELCBscE1pZGlIZHIsIGR3U2l6ZSk7CisJVFJBQ0UobWlkaSwgIiglMDRYLCAlcCwgJTA4bFgpO1xuIiwgd0RldklELCBscE1pZGlIZHIsIGR3U2l6ZSk7CiAJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiB9CiAKQEAgLTk4NCw3ICs5ODAsNyBAQAogICovCiBzdGF0aWMgRFdPUkQgbWlkVW5wcmVwYXJlKFdPUkQgd0RldklELCBMUE1JRElIRFIgbHBNaWRpSGRyLCBEV09SRCBkd1NpemUpCiB7Ci0JZHByaW50Zl9pbmZvKG1pZGksICJtaWRVbnByZXBhcmUoJTA0WCwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBNaWRpSGRyLCBkd1NpemUpOworCVRSQUNFKG1pZGksICIoJTA0WCwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBNaWRpSGRyLCBkd1NpemUpOwogCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogfQogCkBAIC05OTMsNyArOTg5LDcgQEAKICAqLwogc3RhdGljIERXT1JEIG1pZFJlc2V0KFdPUkQgd0RldklEKQogewotCWRwcmludGZfaW5mbyhtaWRpLCAibWlkUmVzZXQoJTA0WCk7XG4iLCB3RGV2SUQpOworCVRSQUNFKG1pZGksICIoJTA0WCk7XG4iLCB3RGV2SUQpOwogCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogfQogCkBAIC0xMDAzLDcgKzk5OSw3IEBACiAgKi8KIHN0YXRpYyBEV09SRCBtaWRTdGFydChXT1JEIHdEZXZJRCkKIHsKLQlkcHJpbnRmX2luZm8obWlkaSwgIm1pZFN0YXJ0KCUwNFgpO1xuIiwgd0RldklEKTsKKwlUUkFDRShtaWRpLCAiKCUwNFgpO1xuIiwgd0RldklEKTsKIAlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIH0KIApAQCAtMTAxMyw3ICsxMDA5LDcgQEAKICAqLwogc3RhdGljIERXT1JEIG1pZFN0b3AoV09SRCB3RGV2SUQpCiB7Ci0JZHByaW50Zl9pbmZvKG1pZGksICJtaWRTdG9wKCUwNFgpO1xuIiwgd0RldklEKTsKKwlUUkFDRShtaWRpLCAiKCUwNFgpO1xuIiwgd0RldklEKTsKIAlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIH0KIApAQCAtMTAyNCw3ICsxMDIwLDcgQEAKIERXT1JEIG1pZE1lc3NhZ2UoV09SRCB3RGV2SUQsIFdPUkQgd01zZywgRFdPUkQgZHdVc2VyLCAKIAkJCQkJRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yKQogewotCWRwcmludGZfaW5mbyhtaWRpLCAibWlkTWVzc2FnZSglMDRYLCAlMDRYLCAlMDhsWCwgJTA4bFgsICUwOGxYKTtcbiIsIAorCVRSQUNFKG1pZGksICIoJTA0WCwgJTA0WCwgJTA4bFgsICUwOGxYLCAlMDhsWCk7XG4iLCAKIAkJCXdEZXZJRCwgd01zZywgZHdVc2VyLCBkd1BhcmFtMSwgZHdQYXJhbTIpOwogCXN3aXRjaCh3TXNnKSB7CiAJY2FzZSBNSURNX09QRU46CkBAIC0xMDYxLDcgKzEwNTcsNyBAQAogICovCiBzdGF0aWMgRFdPUkQgbW9kR2V0RGV2Q2FwcyhXT1JEIHdEZXZJRCwgTFBNSURJT1VUQ0FQUzE2IGxwQ2FwcywgRFdPUkQgZHdTaXplKQogewotCWRwcmludGZfaW5mbyhtaWRpLCAibW9kR2V0RGV2Q2FwcyglMDRYLCAlcCwgJTA4bFgpO1xuIiwgd0RldklELCBscENhcHMsIGR3U2l6ZSk7CisJVFJBQ0UobWlkaSwgIiglMDRYLCAlcCwgJTA4bFgpO1xuIiwgd0RldklELCBscENhcHMsIGR3U2l6ZSk7CiAJbHBDYXBzLT53TWlkID0gMHgwMEZGOyAJLyogTWFudWZhYyBJRCAqLwogCWxwQ2Fwcy0+d1BpZCA9IDB4MDAwMTsgCS8qIFByb2R1Y3QgSUQgKi8KIAlscENhcHMtPnZEcml2ZXJWZXJzaW9uID0gMHgwMDE7IC8qIFByb2R1Y3QgVmVyc2lvbiAqLwpAQCAtMTA3NCw3ICsxMDcwLDcgQEAKIAlscENhcHMtPndWb2ljZXMgICAgID0gMTQ7ICAgICAgIC8qIG1ha2UgaXQgaW9jdGwgKi8KIAlscENhcHMtPndOb3RlcyAgICAgID0gMTQ7ICAgICAgIC8qIG1ha2UgaXQgaW9jdGwgKi8KIAlscENhcHMtPmR3U3VwcG9ydCAgID0gTUlESUNBUFNfVk9MVU1FfE1JRElDQVBTX0xSVk9MVU1FOwotCWRwcmludGZfaW5mbyhtaWRpLCJMaW51eCBtb2RHZXREZXZDYXBzIC8vIHRlY2huID0gJWQgdm9pY2VzPSVkIG5vdGVzID0gJWQgc3VwcG9ydCA9ICVsZFxuIixscENhcHMtPndUZWNobm9sb2d5LGxwQ2Fwcy0+d1ZvaWNlcyxscENhcHMtPndOb3RlcyxscENhcHMtPmR3U3VwcG9ydCk7CisJVFJBQ0UobWlkaSwidGVjaG4gPSAlZCB2b2ljZXM9JWQgbm90ZXMgPSAlZCBzdXBwb3J0ID0gJWxkXG4iLGxwQ2Fwcy0+d1RlY2hub2xvZ3ksbHBDYXBzLT53Vm9pY2VzLGxwQ2Fwcy0+d05vdGVzLGxwQ2Fwcy0+ZHdTdXBwb3J0KTsKIAogCXJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwogfQpAQCAtMTA4OCwzOCArMTA4NCwzNCBAQAogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCiAJaW50CQltaWRpOwogCi0JZHByaW50Zl9pbmZvKG1pZGksCi0JCSJtb2RPcGVuKCUwNFgsICVwLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGxwRGVzYywgZHdGbGFncyk7CisJVFJBQ0UobWlkaSwgIiglMDRYLCAlcCwgJTA4bFgpO1xuIiwgd0RldklELCBscERlc2MsIGR3RmxhZ3MpOwogCWlmIChscERlc2MgPT0gTlVMTCkgewotCQlkcHJpbnRmX3dhcm4obWlkaSwgIkxpbnV4ICdtb2RPcGVuJyAvLyBJbnZhbGlkIFBhcmFtZXRlciAhXG4iKTsKKwkJV0FSTihtaWRpLCAiSW52YWxpZCBQYXJhbWV0ZXIgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOwogCX0KIAlpZiAod0RldklEPj0gTUFYX01JRElPVVREUlYpIHsKLQkJZHByaW50Zl9pbmZvKG1pZGksIkxpbnV4ICdtb2RPcGVuJyAvLyBNQVhfTUlESU9VVERSViByZWFjaGVkICFcbiIpOworCQlUUkFDRShtaWRpLCJNQVhfTUlESU9VVERSViByZWFjaGVkICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfQUxMT0NBVEVEOwogCX0KIAlNaWRpT3V0RGV2W3dEZXZJRF0udW5peGRldiA9IDA7CiAJbWlkaSA9IG9wZW4gKE1JRElfREVWLCBPX1dST05MWSwgMCk7CiAJaWYgKG1pZGkgPT0gLTEpIHsKLQkJZHByaW50Zl93YXJuKG1pZGksIkxpbnV4ICdtb2RPcGVuJyAvLyBjYW4ndCBvcGVuICFcbiIpOworCQlXQVJOKG1pZGksICJjYW4ndCBvcGVuICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAl9CiAJTWlkaU91dERldlt3RGV2SURdLndGbGFncyA9IEhJV09SRChkd0ZsYWdzICYgQ0FMTEJBQ0tfVFlQRU1BU0spOwogCXN3aXRjaChNaWRpT3V0RGV2W3dEZXZJRF0ud0ZsYWdzKSB7CiAJY2FzZSBEQ0JfTlVMTDoKLQkJZHByaW50Zl9pbmZvKG1pZGksIkxpbnV4ICdtb2RPcGVuJyAvLyBDQUxMQkFDS19OVUxMICFcbiIpOworCQlUUkFDRShtaWRpLCJDQUxMQkFDS19OVUxMICFcbiIpOwogCQlicmVhazsKIAljYXNlIERDQl9XSU5ET1c6Ci0JCWRwcmludGZfaW5mbyhtaWRpLAotCQkJIkxpbnV4ICdtb2RPcGVuJyAvLyBDQUxMQkFDS19XSU5ET1cgIVxuIik7CisJCVRSQUNFKG1pZGksICJDQUxMQkFDS19XSU5ET1cgIVxuIik7CiAJCWJyZWFrOwogCWNhc2UgRENCX1RBU0s6Ci0JCWRwcmludGZfaW5mbyhtaWRpLAotCQkJIkxpbnV4ICdtb2RPcGVuJyAvLyBDQUxMQkFDS19UQVNLICFcbiIpOworCQlUUkFDRShtaWRpLCAiQ0FMTEJBQ0tfVEFTSyAhXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBEQ0JfRlVOQ1RJT046Ci0JCWRwcmludGZfaW5mbyhtaWRpLAotCQkJIkxpbnV4ICdtb2RPcGVuJyAvLyBDQUxMQkFDS19GVU5DVElPTiAhXG4iKTsKKwkJVFJBQ0UobWlkaSwgIkNBTExCQUNLX0ZVTkNUSU9OICFcbiIpOwogCQlicmVhazsKIAl9CiAJTWlkaU91dERldlt3RGV2SURdLmxwUXVldWVIZHIgPSBOVUxMOwpAQCAtMTEyNywxMSArMTExOSwxMCBAQAogCU1pZGlPdXREZXZbd0RldklEXS5kd1RvdGFsUGxheWVkID0gMDsKIAlNaWRpT3V0RGV2W3dEZXZJRF0uYnVmc2l6ZSA9IDB4M0ZGRjsKIAlpZiAoTUlESV9Ob3RpZnlDbGllbnQod0RldklELCBNT01fT1BFTiwgMEwsIDBMKSAhPSBNTVNZU0VSUl9OT0VSUk9SKSB7Ci0JCWRwcmludGZfd2FybihtaWRpLCJMaW51eCAnbW9kT3BlbicgLy8gY2FuJ3Qgbm90aWZ5IGNsaWVudCAhXG4iKTsKKwkJV0FSTihtaWRpLCJjYW4ndCBub3RpZnkgY2xpZW50ICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKIAl9Ci0JZHByaW50Zl9pbmZvKG1pZGksCi0JCSJMaW51eCAnbW9kT3BlbicgLy8gU3VjY2VzZnVsIHVuaXhkZXY9JWQgIVxuIiwgbWlkaSk7CisJVFJBQ0UobWlkaSwgIlN1Y2Nlc2Z1bCB1bml4ZGV2PSVkICFcbiIsIG1pZGkpOwogCXJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwogI2Vsc2UKIAlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKQEAgLTExNDUsMTYgKzExMzYsMTYgQEAKIHN0YXRpYyBEV09SRCBtb2RDbG9zZShXT1JEIHdEZXZJRCkKIHsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQotCWRwcmludGZfaW5mbyhtaWRpLCAibW9kQ2xvc2UoJTA0WCk7XG4iLCB3RGV2SUQpOworCVRSQUNFKG1pZGksICIoJTA0WCk7XG4iLCB3RGV2SUQpOwogCWlmIChNaWRpT3V0RGV2W3dEZXZJRF0udW5peGRldiA9PSAwKSB7Ci0JCWRwcmludGZfd2FybihtaWRpLCJMaW51eCAnbW9kQ2xvc2UnIC8vIGNhbid0IGNsb3NlICFcbiIpOworCQlXQVJOKG1pZGksImNhbid0IGNsb3NlICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAl9CiAJY2xvc2UoTWlkaU91dERldlt3RGV2SURdLnVuaXhkZXYpOwogCU1pZGlPdXREZXZbd0RldklEXS51bml4ZGV2ID0gMDsKIAlNaWRpT3V0RGV2W3dEZXZJRF0uYnVmc2l6ZSA9IDA7CiAJaWYgKE1JRElfTm90aWZ5Q2xpZW50KHdEZXZJRCwgTU9NX0NMT1NFLCAwTCwgMEwpICE9IE1NU1lTRVJSX05PRVJST1IpIHsKLQkJZHByaW50Zl93YXJuKG1pZGksIkxpbnV4ICdtb2RDbG9zZScgLy8gY2FuJ3Qgbm90aWZ5IGNsaWVudCAhXG4iKTsKKwkJV0FSTihtaWRpLCJjYW4ndCBub3RpZnkgY2xpZW50ICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKIAl9CiAJcmV0dXJuIE1NU1lTRVJSX05PRVJST1I7CkBAIC0xMTcxLDE2ICsxMTYyLDE1IEBACiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKIAlXT1JECWV2ZW50OwogCi0JZHByaW50Zl9pbmZvKG1pZGksCQotCQkibW9kRGF0YSglMDRYLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGR3UGFyYW0pOworCVRSQUNFKG1pZGksICIoJTA0WCwgJTA4bFgpO1xuIiwgd0RldklELCBkd1BhcmFtKTsKIAlpZiAoTWlkaU91dERldlt3RGV2SURdLnVuaXhkZXYgPT0gMCkgewotICAgICAgICAJZHByaW50Zl93YXJuKG1pZGksIkxpbnV4ICdtb2REYXRhJyAvLyBjYW4ndCBwbGF5ICFcbiIpOworICAgICAgICAJV0FSTihtaWRpLCJjYW4ndCBwbGF5ICFcbiIpOwogCQlyZXR1cm4gTUlESUVSUl9OT0RFVklDRTsKIAl9CiAJZXZlbnQgPSBMT1dPUkQoZHdQYXJhbSk7CiAJaWYgKHdyaXRlIChNaWRpT3V0RGV2W3dEZXZJRF0udW5peGRldiwgCiAJCSZldmVudCwgc2l6ZW9mKFdPUkQpKSAhPSBzaXplb2YoV09SRCkpIHsKLQkJZHByaW50Zl93YXJuKG1pZGksICJtb2REYXRhKCkgLy8gZXJyb3Igd3JpdHRpbmcgdW5peGRldiAhXG4iKTsKKwkJV0FSTihtaWRpLCAiZXJyb3Igd3JpdHRpbmcgdW5peGRldiAhXG4iKTsKIAl9CiAJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAjZWxzZQpAQCAtMTE5OCwxMCArMTE4OCw5IEBACiAJTFBXT1JECXB0cjsKIAlpbnQgICAgIGVuOwogCi0JZHByaW50Zl9pbmZvKG1pZGksCQotCQkibW9kTG9uZ0RhdGEoJTA0WCwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBNaWRpSGRyLCBkd1NpemUpOworCVRSQUNFKG1pZGksICIoJTA0WCwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBNaWRpSGRyLCBkd1NpemUpOwogCWlmIChNaWRpT3V0RGV2W3dEZXZJRF0udW5peGRldiA9PSAwKSB7Ci0gICAgICAgIGRwcmludGZfd2FybihtaWRpLCJMaW51eCAnbW9kTG9uZ0RhdGEnIC8vIGNhbid0IHBsYXkgIVxuIik7CisgICAgICAgIFdBUk4obWlkaSwiY2FuJ3QgcGxheSAhXG4iKTsKIAkJcmV0dXJuIE1JRElFUlJfTk9ERVZJQ0U7CiAJCX0KIAlpZiAobHBNaWRpSGRyLT5scERhdGEgPT0gTlVMTCkgcmV0dXJuIE1JRElFUlJfVU5QUkVQQVJFRDsKQEAgLTEyMDksMTMgKzExOTgsMTAgQEAKIAlpZiAobHBNaWRpSGRyLT5kd0ZsYWdzICYgTUhEUl9JTlFVRVVFKSByZXR1cm4gTUlESUVSUl9TVElMTFBMQVlJTkc7CiAJbHBNaWRpSGRyLT5kd0ZsYWdzICY9IH5NSERSX0RPTkU7CiAJbHBNaWRpSGRyLT5kd0ZsYWdzIHw9IE1IRFJfSU5RVUVVRTsKLQlkcHJpbnRmX2luZm8obWlkaSwKLQkJIm1vZExvbmdEYXRhKCkgLy8gZHdCeXRlc1JlY29yZGVkICVsdSAhXG4iLCBscE1pZGlIZHItPmR3Qnl0ZXNSZWNvcmRlZCk7Ci0JZHByaW50Zl9pbmZvKG1pZGksCi0gICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgJTAyWCAlMDJYICUwMlggJTAyWFxuIixscE1pZGlIZHItPmxwRGF0YVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwTWlkaUhkci0+bHBEYXRhWzFdLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwTWlkaUhkci0+bHBEYXRhWzJdLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwTWlkaUhkci0+bHBEYXRhWzNdKTsKKwlUUkFDRShtaWRpLCAiZHdCeXRlc1JlY29yZGVkICVsdSAhXG4iLCBscE1pZGlIZHItPmR3Qnl0ZXNSZWNvcmRlZCk7CisJVFJBQ0UobWlkaSwgIiAgICAgICAgICAgICAgICAgJTAyWCAlMDJYICUwMlggJTAyWFxuIiwKKwkJICAgICBscE1pZGlIZHItPmxwRGF0YVswXSwgbHBNaWRpSGRyLT5scERhdGFbMV0sCisJCSAgICAgbHBNaWRpSGRyLT5scERhdGFbMl0sIGxwTWlkaUhkci0+bHBEYXRhWzNdKTsKIC8qCiAJY291bnQgPSB3cml0ZSAoTWlkaU91dERldlt3RGV2SURdLnVuaXhkZXYsIAogCQlscE1pZGlIZHItPmxwRGF0YSwgbHBNaWRpSGRyLT5kd0J5dGVzUmVjb3JkZWQpOwpAQCAtMTIyOCwxOSArMTIxNCwxOCBAQAogCX0KIAogCWVuID0gZXJybm87Ci0JZHByaW50Zl9pbmZvKG1pZGksICJMaW51eCAnbW9kTG9uZ0RhdGEnIC8vIGFmdGVyIHdyaXRlIGNvdW50ID0gJWRcbiIsY291bnQpOworCVRSQUNFKG1pZGksICJhZnRlciB3cml0ZSBjb3VudCA9ICVkXG4iLGNvdW50KTsKIAlpZiAoY291bnQgIT0gbHBNaWRpSGRyLT5kd0J5dGVzUmVjb3JkZWQpIHsKLQkJZHByaW50Zl93YXJuKG1pZGksCi0JCSAgICAgICAibW9kTG9uZ0RhdGEoKSAvLyBlcnJvciB3cml0dGluZyB1bml4ZGV2ICMlZCAhICglZCAhPSAlbGQpXG4iLAotCQkJTWlkaU91dERldlt3RGV2SURdLnVuaXhkZXYsIGNvdW50LCBscE1pZGlIZHItPmR3Qnl0ZXNSZWNvcmRlZCk7Ci0JCWRwcmludGZfaW5mbyhtaWRpLAotCQkJIlx0ZXJybm8gPSAlZCBlcnJvciA9ICVzXG4iLGVuLHN0cmVycm9yKGVuKSk7CisJCVdBUk4obWlkaSwgImVycm9yIHdyaXR0aW5nIHVuaXhkZXYgIyVkICEgKCVkICE9ICVsZClcbiIsCisJCQkgICAgIE1pZGlPdXREZXZbd0RldklEXS51bml4ZGV2LCBjb3VudCwgCisJCQkgICAgIGxwTWlkaUhkci0+ZHdCeXRlc1JlY29yZGVkKTsKKwkJVFJBQ0UobWlkaSwgIlx0ZXJybm8gPSAlZCBlcnJvciA9ICVzXG4iLGVuLHN0cmVycm9yKGVuKSk7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCX0KIAlscE1pZGlIZHItPmR3RmxhZ3MgJj0gfk1IRFJfSU5RVUVVRTsKIAlscE1pZGlIZHItPmR3RmxhZ3MgfD0gTUhEUl9ET05FOwogCWlmIChNSURJX05vdGlmeUNsaWVudCh3RGV2SUQsIE1PTV9ET05FLCAwTCwgMEwpICE9IE1NU1lTRVJSX05PRVJST1IpIHsKLQkJZHByaW50Zl93YXJuKG1pZGksIkxpbnV4ICdtb2RMb25nRGF0YScgLy8gY2FuJ3Qgbm90aWZ5IGNsaWVudCAhXG4iKTsKKwkJV0FSTihtaWRpLCJjYW4ndCBub3RpZnkgY2xpZW50ICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKIAl9CiAJcmV0dXJuIE1NU1lTRVJSX05PRVJST1I7CkBAIC0xMjU1LDE0ICsxMjQwLDEzIEBACiBzdGF0aWMgRFdPUkQgbW9kUHJlcGFyZShXT1JEIHdEZXZJRCwgTFBNSURJSERSIGxwTWlkaUhkciwgRFdPUkQgZHdTaXplKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCi0JZHByaW50Zl9pbmZvKG1pZGksCi0JCSAgIm1vZFByZXBhcmUoJTA0WCwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBNaWRpSGRyLCBkd1NpemUpOworCVRSQUNFKG1pZGksICIoJTA0WCwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBNaWRpSGRyLCBkd1NpemUpOwogCWlmIChNaWRpT3V0RGV2W3dEZXZJRF0udW5peGRldiA9PSAwKSB7Ci0JCWRwcmludGZfd2FybihtaWRpLCJMaW51eCAnbW9kUHJlcGFyZScgLy8gY2FuJ3QgcHJlcGFyZSAhXG4iKTsKKwkJV0FSTihtaWRpLCJjYW4ndCBwcmVwYXJlICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAl9CiAJaWYgKE1pZGlPdXREZXZbd0RldklEXS5scFF1ZXVlSGRyICE9IE5VTEwpIHsKLQkJZHByaW50Zl9pbmZvKG1pZGksIkxpbnV4ICdtb2RQcmVwYXJlJyAvLyBhbHJlYWR5IHByZXBhcmUgIVxuIik7CisJCVRSQUNFKG1pZGksImFscmVhZHkgcHJlcGFyZSAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJfQogCU1pZGlPdXREZXZbd0RldklEXS5kd1RvdGFsUGxheWVkID0gMDsKQEAgLTEyODIsMTAgKzEyNjYsOSBAQAogc3RhdGljIERXT1JEIG1vZFVucHJlcGFyZShXT1JEIHdEZXZJRCwgTFBNSURJSERSIGxwTWlkaUhkciwgRFdPUkQgZHdTaXplKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCi0JZHByaW50Zl9pbmZvKG1pZGksCi0JCSJtb2RVbnByZXBhcmUoJTA0WCwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBNaWRpSGRyLCBkd1NpemUpOworCVRSQUNFKG1pZGksICIoJTA0WCwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBNaWRpSGRyLCBkd1NpemUpOwogCWlmIChNaWRpT3V0RGV2W3dEZXZJRF0udW5peGRldiA9PSAwKSB7Ci0JCWRwcmludGZfd2FybihtaWRpLCJMaW51eCAnbW9kVW5wcmVwYXJlJyAvLyBjYW4ndCB1bnByZXBhcmUgIVxuIik7CisJCVdBUk4obWlkaSwiY2FuJ3QgdW5wcmVwYXJlICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAl9CiAJcmV0dXJuIE1NU1lTRVJSX05PRVJST1I7CkBAIC0xMjk5LDcgKzEyODIsNyBAQAogICovCiBzdGF0aWMgRFdPUkQgbW9kUmVzZXQoV09SRCB3RGV2SUQpCiB7Ci0JZHByaW50Zl9pbmZvKG1pZGksICJtb2RSZXNldCglMDRYKTtcbiIsIHdEZXZJRCk7CisJVFJBQ0UobWlkaSwgIiglMDRYKTtcbiIsIHdEZXZJRCk7CiAJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiB9CiAKQEAgLTEzMTAsNyArMTI5Myw3IEBACiBEV09SRCBtb2RNZXNzYWdlKFdPUkQgd0RldklELCBXT1JEIHdNc2csIERXT1JEIGR3VXNlciwgCiAJCQkJCURXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMikKIHsKLQlkcHJpbnRmX2luZm8obWlkaSwgIm1vZE1lc3NhZ2UoJTA0WCwgJTA0WCwgJTA4bFgsICUwOGxYLCAlMDhsWCk7XG4iLCAKKwlUUkFDRShtaWRpLCAiKCUwNFgsICUwNFgsICUwOGxYLCAlMDhsWCwgJTA4bFgpO1xuIiwgCiAJCQl3RGV2SUQsIHdNc2csIGR3VXNlciwgZHdQYXJhbTEsIGR3UGFyYW0yKTsKIAlzd2l0Y2god01zZykgewogCWNhc2UgTU9ETV9PUEVOOgpkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9taXhlci5jIGIvbXVsdGltZWRpYS9taXhlci5jCmluZGV4IDliY2IyNGQuLmYzN2I5MzEgMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvbWl4ZXIuYworKysgYi9tdWx0aW1lZGlhL21peGVyLmMKQEAgLTM4LDEwICszOCwxMCBAQAogI2lmZGVmIGxpbnV4CiAJaW50IAkJbWl4ZXIsbWFzazsKIAotCWRwcmludGZfaW5mbyhtbWF1eCwiTUlYX0dldERldkNhcHMoJTA0WCwgJXAsICVsdSk7XG4iLCB3RGV2SUQsIGxwQ2FwcywgZHdTaXplKTsKKwlUUkFDRShtbWF1eCwiKCUwNFgsICVwLCAlbHUpO1xuIiwgd0RldklELCBscENhcHMsIGR3U2l6ZSk7CiAJaWYgKGxwQ2FwcyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAlpZiAoKG1peGVyID0gb3BlbihNSVhFUl9ERVYsIE9fUkRXUikpIDwgMCkgewotCQlkcHJpbnRmX3dhcm4obW1hdXgsICJNSVhfR2V0RGV2Q2FwcyAvLyBtaXhlciBkZXZpY2Ugbm90IGF2YWlsYWJsZSAhXG4iKTsKKwkJV0FSTihtbWF1eCwgIm1peGVyIGRldmljZSBub3QgYXZhaWxhYmxlICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAl9CiAJbHBDYXBzLT53TWlkID0gMHhBQTsKQEAgLTc3LDcgKzc3LDcgQEAKICNpZmRlZiBsaW51eAogCWludCAJCW1peGVyLGksaixkZXZtYXNrLHJlY3NyYyxyZWNtYXNrOwogCi0JZHByaW50Zl9pbmZvKG1tYXV4LCJNSVhfR2V0RGV2TGluZUluZm8oJTA0WCwgJXAsICVsdSk7XG4iLCB3RGV2SUQsIGxwbWwsIGZkd0luZm8pOworCVRSQUNFKG1tYXV4LCIoJTA0WCwgJXAsICVsdSk7XG4iLCB3RGV2SUQsIGxwbWwsIGZkd0luZm8pOwogCWlmIChscG1sID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCWlmICgobWl4ZXIgPSBvcGVuKE1JWEVSX0RFViwgT19SRFdSKSkgPCAwKQogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKQEAgLTE3OCw3ICsxNzgsNyBAQAogewogI2lmZGVmIGxpbnV4CiAKLQlkcHJpbnRmX2luZm8obW1hdXgsIk1JWF9PcGVuKCUwNFgsICVwLCAlbHUpO1xuIix3RGV2SUQsbHBtb2QsZmxhZ3MpOworCVRSQUNFKG1tYXV4LCIoJTA0WCwgJXAsICVsdSk7XG4iLHdEZXZJRCxscG1vZCxmbGFncyk7CiAJaWYgKGxwbW9kID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCS8qIGhtbS4gV2UgZG9uJ3Qga2VlcCB0aGUgbWl4ZXIgZGV2aWNlIG9wZW4uIFNvIGp1c3QgcHJldGVuZCBpdCB3b3JrcyAqLwogCXJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwpAQCAtMTkzLDcgKzE5Myw3IEBACiBEV09SRCBtaXhNZXNzYWdlKFdPUkQgd0RldklELCBXT1JEIHdNc2csIERXT1JEIGR3VXNlciwgCiAJCQkJCURXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMikKIHsKLQlkcHJpbnRmX2luZm8obW1hdXgsIm1peE1lc3NhZ2UoJTA0WCwgJTA0WCwgJTA4bFgsICUwOGxYLCAlMDhsWCk7XG4iLCAKKwlUUkFDRShtbWF1eCwiKCUwNFgsICUwNFgsICUwOGxYLCAlMDhsWCwgJTA4bFgpO1xuIiwgCiAJCQl3RGV2SUQsIHdNc2csIGR3VXNlciwgZHdQYXJhbTEsIGR3UGFyYW0yKTsKIAlzd2l0Y2god01zZykgewogCWNhc2UgTVhETV9HRVRERVZDQVBTOgpAQCAtMjAxLDEyICsyMDEsMTMgQEAKIAljYXNlIE1YRE1fR0VUTElORUlORk86CiAJCXJldHVybiBNSVhfR2V0TGluZUluZm8od0RldklELChMUE1JWEVSTElORTE2KWR3UGFyYW0xLGR3UGFyYW0yKTsKIAljYXNlIE1YRE1fR0VUTlVNREVWUzoKLQkJZHByaW50Zl9pbmZvKG1tc3lzLCJNSVhfR2V0TnVtRGV2cygpIHJldHVybiAxO1xuIik7CisJCVRSQUNFKG1tc3lzLCJyZXR1cm4gMTtcbiIpOwogCQlyZXR1cm4gMTsKIAljYXNlIE1YRE1fT1BFTjoKIAkJcmV0dXJuIE1JWF9PcGVuKHdEZXZJRCwoTFBNSVhFUk9QRU5ERVNDKWR3UGFyYW0xLGR3UGFyYW0yKTsKIAlkZWZhdWx0OgotCQlkcHJpbnRmX3dhcm4obW1hdXgsIm1peE1lc3NhZ2UgLy8gdW5rbm93biBtZXNzYWdlICVkIVxuIix3TXNnKTsKKwkJV0FSTihtbWF1eCwidW5rbm93biBtZXNzYWdlICVkIVxuIix3TXNnKTsKIAl9CiAJcmV0dXJuIE1NU1lTRVJSX05PVFNVUFBPUlRFRDsKIH0KKwpkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9tbWF1eC5jIGIvbXVsdGltZWRpYS9tbWF1eC5jCmluZGV4IDE0NTk4YjkuLmRlOTUzYjMgMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvbW1hdXguYworKysgYi9tdWx0aW1lZGlhL21tYXV4LmMKQEAgLTIzLDcgKzIzLDYgQEAKICNpbmNsdWRlIDxtYWNoaW5lL3NvdW5kY2FyZC5oPgogI2VuZGlmCiAKLSNkZWZpbmUgU09VTkRfREVWICIvZGV2L2RzcCIKICNkZWZpbmUgTUlYRVJfREVWICIvZGV2L21peGVyIgogCiAjaWZkZWYgU09VTkRfVkVSU0lPTgpAQCAtNDYsMTUgKzQ1LDE1IEBACiAjaWZkZWYgbGludXgKIAlpbnQgCW1peGVyLHZvbHVtZTsKIAotCWRwcmludGZfaW5mbyhtbWF1eCwiQVVYX0dldERldkNhcHMoJTA0WCwgJXAsICVsdSk7XG4iLCB3RGV2SUQsIGxwQ2FwcywgZHdTaXplKTsKKwlUUkFDRShtbWF1eCwiKCUwNFgsICVwLCAlbHUpO1xuIiwgd0RldklELCBscENhcHMsIGR3U2l6ZSk7CiAJaWYgKGxwQ2FwcyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAlpZiAoKG1peGVyID0gb3BlbihNSVhFUl9ERVYsIE9fUkRXUikpIDwgMCkgewotCQlkcHJpbnRmX3dhcm4obW1hdXgsICJBVVhfR2V0RGV2Q2FwcyAvLyBtaXhlciBkZXZpY2Ugbm90IGF2YWlsYWJsZSAhXG4iKTsKKwkJV0FSTihtbWF1eCwgIm1peGVyIGRldmljZSBub3QgYXZhaWxhYmxlICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAl9CiAJaWYgKGlvY3RsKG1peGVyLCBTT1VORF9NSVhFUl9SRUFEX0xJTkUsICZ2b2x1bWUpID09IC0xKSB7CiAJCWNsb3NlKG1peGVyKTsKLQkJZHByaW50Zl93YXJuKG1tYXV4LCAiQVVYX0dldERldkNhcHMgLy8gdW5hYmxlIHJlYWQgbWl4ZXIgIVxuIik7CisJCVdBUk4obW1hdXgsICJ1bmFibGUgcmVhZCBtaXhlciAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJfQogCWNsb3NlKG1peGVyKTsKQEAgLTExNyw0OSArMTE2LDQ5IEBACiAjaWZkZWYgbGludXgKIAlpbnQgCW1peGVyLHZvbHVtZSxsZWZ0LHJpZ2h0LGNtZDsKIAotCWRwcmludGZfaW5mbyhtbWF1eCwiQVVYX0dldFZvbHVtZSglMDRYLCAlcCk7XG4iLCB3RGV2SUQsIGxwZHdWb2wpOworCVRSQUNFKG1tYXV4LCIoJTA0WCwgJXApO1xuIiwgd0RldklELCBscGR3Vm9sKTsKIAlpZiAobHBkd1ZvbCA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAlpZiAoKG1peGVyID0gb3BlbihNSVhFUl9ERVYsIE9fUkRXUikpIDwgMCkgewotCQlkcHJpbnRmX3dhcm4obW1hdXgsICJMaW51eCAnQVVYX0dldFZvbHVtZScgLy8gbWl4ZXIgZGV2aWNlIG5vdCBhdmFpbGFibGUgIVxuIik7CisJCVdBUk4obW1hdXgsICJtaXhlciBkZXZpY2Ugbm90IGF2YWlsYWJsZSAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJfQogCXN3aXRjaCh3RGV2SUQpIHsKIAkJY2FzZSAwOgotCQkJZHByaW50Zl9pbmZvKG1tYXV4LCJMaW51eCAnQVVYX0dldFZvbHVtZScgLy8gU09VTkRfTUlYRVJfUkVBRF9QQ00gIVxuIik7CisJCQlUUkFDRShtbWF1eCwiU09VTkRfTUlYRVJfUkVBRF9QQ00gIVxuIik7CiAJCQljbWQgPSBTT1VORF9NSVhFUl9SRUFEX1BDTTsKIAkJCWJyZWFrOwogCQljYXNlIDE6Ci0JCQlkcHJpbnRmX2luZm8obW1hdXgsIkxpbnV4ICdBVVhfR2V0Vm9sdW1lJyAvLyBTT1VORF9NSVhFUl9SRUFEX1NZTlRIICFcbiIpOworCQkJVFJBQ0UobW1hdXgsIlNPVU5EX01JWEVSX1JFQURfU1lOVEggIVxuIik7CiAJCQljbWQgPSBTT1VORF9NSVhFUl9SRUFEX1NZTlRIOwogCQkJYnJlYWs7CiAJCWNhc2UgMjoKLQkJCWRwcmludGZfaW5mbyhtbWF1eCwiTGludXggJ0FVWF9HZXRWb2x1bWUnIC8vIFNPVU5EX01JWEVSX1JFQURfQ0QgIVxuIik7CisJCQlUUkFDRShtbWF1eCwiU09VTkRfTUlYRVJfUkVBRF9DRCAhXG4iKTsKIAkJCWNtZCA9IFNPVU5EX01JWEVSX1JFQURfQ0Q7CiAJCQlicmVhazsKIAkJY2FzZSAzOgotCQkJZHByaW50Zl9pbmZvKG1tYXV4LCJMaW51eCAnQVVYX0dldFZvbHVtZScgLy8gU09VTkRfTUlYRVJfUkVBRF9MSU5FICFcbiIpOworCQkJVFJBQ0UobW1hdXgsIlNPVU5EX01JWEVSX1JFQURfTElORSAhXG4iKTsKIAkJCWNtZCA9IFNPVU5EX01JWEVSX1JFQURfTElORTsKIAkJCWJyZWFrOwogCQljYXNlIDQ6Ci0JCQlkcHJpbnRmX2luZm8obW1hdXgsIkxpbnV4ICdBVVhfR2V0Vm9sdW1lJyAvLyBTT1VORF9NSVhFUl9SRUFEX01JQyAhXG4iKTsKKwkJCVRSQUNFKG1tYXV4LCJTT1VORF9NSVhFUl9SRUFEX01JQyAhXG4iKTsKIAkJCWNtZCA9IFNPVU5EX01JWEVSX1JFQURfTUlDOwogCQkJYnJlYWs7CiAJCWNhc2UgNToKLQkJCWRwcmludGZfaW5mbyhtbWF1eCwiTGludXggJ0FVWF9HZXRWb2x1bWUnIC8vIFNPVU5EX01JWEVSX1JFQURfVk9MVU1FICFcbiIpOworCQkJVFJBQ0UobW1hdXgsIlNPVU5EX01JWEVSX1JFQURfVk9MVU1FICFcbiIpOwogCQkJY21kID0gU09VTkRfTUlYRVJfUkVBRF9WT0xVTUU7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCWRwcmludGZfd2FybihtbWF1eCwgIkxpbnV4ICdBVVhfR2V0Vm9sdW1lJyAvLyBpbnZhbGlkIGRldmljZSBpZD0lMDRYICFcbiIsIHdEZXZJRCk7CisJCQlXQVJOKG1tYXV4LCAiaW52YWxpZCBkZXZpY2UgaWQ9JTA0WCAhXG4iLCB3RGV2SUQpOwogCQkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJCX0KIAlpZiAoaW9jdGwobWl4ZXIsIGNtZCwgJnZvbHVtZSkgPT0gLTEpIHsKLQkJZHByaW50Zl93YXJuKG1tYXV4LCAiTGludXggJ0FVWF9HZXRWb2x1bWUnIC8vIHVuYWJsZSByZWFkIG1peGVyICFcbiIpOworCQlXQVJOKG1tYXV4LCAidW5hYmxlIHJlYWQgbWl4ZXIgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCX0KIAljbG9zZShtaXhlcik7CiAJbGVmdCA9IHZvbHVtZSAmIDB4N0Y7CiAJcmlnaHQgPSAodm9sdW1lID4+IDgpICYgMHg3RjsKLQlkcHJpbnRmX2luZm8obW1hdXgsIkxpbnV4ICdBVVhfR2V0Vm9sdW1lJyAvLyBsZWZ0PSVkIHJpZ2h0PSVkICFcbiIsIGxlZnQsIHJpZ2h0KTsKKwlUUkFDRShtbWF1eCwibGVmdD0lZCByaWdodD0lZCAhXG4iLCBsZWZ0LCByaWdodCk7CiAJKmxwZHdWb2wgPSBNQUtFTE9ORyhsZWZ0IDw8IDksIHJpZ2h0IDw8IDkpOwogCXJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwogI2Vsc2UKQEAgLTE3Niw0NCArMTc1LDQ0IEBACiAJaW50IAltaXhlcjsKIAlpbnQJCXZvbHVtZTsKIAlpbnQJCWNtZDsKLQlkcHJpbnRmX2luZm8obW1hdXgsIkFVWF9TZXRWb2x1bWUoJTA0WCwgJTA4bFgpO1xuIiwgd0RldklELCBkd1BhcmFtKTsKKwlUUkFDRShtbWF1eCwiKCUwNFgsICUwOGxYKTtcbiIsIHdEZXZJRCwgZHdQYXJhbSk7CiAJdm9sdW1lID0gKExPV09SRChkd1BhcmFtKSA+PiA5ICYgMHg3RikgKyAKIAkJKChISVdPUkQoZHdQYXJhbSkgPj4gOSAgJiAweDdGKSA8PCA4KTsKIAlpZiAoKG1peGVyID0gb3BlbihNSVhFUl9ERVYsIE9fUkRXUikpIDwgMCkgewotCQlkcHJpbnRmX3dhcm4obW1hdXgsICJMaW51eCAnQVVYX1NldFZvbHVtZScgLy8gbWl4ZXIgZGV2aWNlIG5vdCBhdmFpbGFibGUgIVxuIik7CisJCVdBUk4obW1hdXgsICJtaXhlciBkZXZpY2Ugbm90IGF2YWlsYWJsZSAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJCX0KIAlzd2l0Y2god0RldklEKSB7CiAJCWNhc2UgMDoKLQkJCWRwcmludGZfaW5mbyhtbWF1eCwiTGludXggJ0FVWF9TZXRWb2x1bWUnIC8vIFNPVU5EX01JWEVSX1dSSVRFX1BDTSAhXG4iKTsKKwkJCVRSQUNFKG1tYXV4LCJTT1VORF9NSVhFUl9XUklURV9QQ00gIVxuIik7CiAJCQljbWQgPSBTT1VORF9NSVhFUl9XUklURV9QQ007CiAJCQlicmVhazsKIAkJY2FzZSAxOgotCQkJZHByaW50Zl9pbmZvKG1tYXV4LCJMaW51eCAnQVVYX1NldFZvbHVtZScgLy8gU09VTkRfTUlYRVJfV1JJVEVfU1lOVEggIVxuIik7CisJCQlUUkFDRShtbWF1eCwiU09VTkRfTUlYRVJfV1JJVEVfU1lOVEggIVxuIik7CiAJCQljbWQgPSBTT1VORF9NSVhFUl9XUklURV9TWU5USDsKIAkJCWJyZWFrOwogCQljYXNlIDI6Ci0JCQlkcHJpbnRmX2luZm8obW1hdXgsIkxpbnV4ICdBVVhfU2V0Vm9sdW1lJyAvLyBTT1VORF9NSVhFUl9XUklURV9DRCAhXG4iKTsKKwkJCVRSQUNFKG1tYXV4LCJTT1VORF9NSVhFUl9XUklURV9DRCAhXG4iKTsKIAkJCWNtZCA9IFNPVU5EX01JWEVSX1dSSVRFX0NEOwogCQkJYnJlYWs7CiAJCWNhc2UgMzoKLQkJCWRwcmludGZfaW5mbyhtbWF1eCwiTGludXggJ0FVWF9TZXRWb2x1bWUnIC8vIFNPVU5EX01JWEVSX1dSSVRFX0xJTkUgIVxuIik7CisJCQlUUkFDRShtbWF1eCwiU09VTkRfTUlYRVJfV1JJVEVfTElORSAhXG4iKTsKIAkJCWNtZCA9IFNPVU5EX01JWEVSX1dSSVRFX0xJTkU7CiAJCQlicmVhazsKIAkJY2FzZSA0OgotCQkJZHByaW50Zl9pbmZvKG1tYXV4LCJMaW51eCAnQVVYX1NldFZvbHVtZScgLy8gU09VTkRfTUlYRVJfV1JJVEVfTUlDICFcbiIpOworCQkJVFJBQ0UobW1hdXgsIlNPVU5EX01JWEVSX1dSSVRFX01JQyAhXG4iKTsKIAkJCWNtZCA9IFNPVU5EX01JWEVSX1dSSVRFX01JQzsKIAkJCWJyZWFrOwogCQljYXNlIDU6Ci0JCQlkcHJpbnRmX2luZm8obW1hdXgsIkxpbnV4ICdBVVhfU2V0Vm9sdW1lJyAvLyBTT1VORF9NSVhFUl9XUklURV9WT0xVTUUgIVxuIik7CisJCQlUUkFDRShtbWF1eCwiU09VTkRfTUlYRVJfV1JJVEVfVk9MVU1FICFcbiIpOwogCQkJY21kID0gU09VTkRfTUlYRVJfV1JJVEVfVk9MVU1FOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlkcHJpbnRmX3dhcm4obW1hdXgsICJMaW51eCAnQVVYX1NldFZvbHVtZScgLy8gaW52YWxpZCBkZXZpY2UgaWQ9JTA0WCAhXG4iLCB3RGV2SUQpOworCQkJV0FSTihtbWF1eCwiaW52YWxpZCBkZXZpY2UgaWQ9JTA0WCAhXG4iLCB3RGV2SUQpOwogCQkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJCX0KICAgICBpZiAoaW9jdGwobWl4ZXIsIGNtZCwgJnZvbHVtZSkgPT0gLTEpIHsKLQkJZHByaW50Zl93YXJuKG1tYXV4LCAiTGludXggJ0FVWF9TZXRWb2x1bWUnIC8vIHVuYWJsZSBzZXQgbWl4ZXIgIVxuIik7CisJCVdBUk4obW1hdXgsICJ1bmFibGUgc2V0IG1peGVyICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAkJfQogCWNsb3NlKG1peGVyKTsKQEAgLTIzMCwyMCArMjI5LDIwIEBACiBEV09SRCBhdXhNZXNzYWdlKFdPUkQgd0RldklELCBXT1JEIHdNc2csIERXT1JEIGR3VXNlciwgCiAJCQkJCURXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMikKIHsKLQlkcHJpbnRmX2luZm8obW1hdXgsImF1eE1lc3NhZ2UoJTA0WCwgJTA0WCwgJTA4bFgsICUwOGxYLCAlMDhsWCk7XG4iLCAKKwlUUkFDRShtbWF1eCwiKCUwNFgsICUwNFgsICUwOGxYLCAlMDhsWCwgJTA4bFgpO1xuIiwgCiAJCQl3RGV2SUQsIHdNc2csIGR3VXNlciwgZHdQYXJhbTEsIGR3UGFyYW0yKTsKIAlzd2l0Y2god01zZykgewogCWNhc2UgQVVYRE1fR0VUREVWQ0FQUzoKIAkJcmV0dXJuIEFVWF9HZXREZXZDYXBzKHdEZXZJRCwoTFBBVVhDQVBTMTYpZHdQYXJhbTEsZHdQYXJhbTIpOwogCWNhc2UgQVVYRE1fR0VUTlVNREVWUzoKLQkJZHByaW50Zl9pbmZvKG1tYXV4LCJBVVhfR2V0TnVtRGV2cygpIHJldHVybiAlZDtcbiIsIE51bURldik7CisJCVRSQUNFKG1tYXV4LCJyZXR1cm4gJWQ7XG4iLCBOdW1EZXYpOwogCQlyZXR1cm4gTnVtRGV2OwogCWNhc2UgQVVYRE1fR0VUVk9MVU1FOgogCQlyZXR1cm4gQVVYX0dldFZvbHVtZSh3RGV2SUQsKExQRFdPUkQpZHdQYXJhbTEpOwogCWNhc2UgQVVYRE1fU0VUVk9MVU1FOgogCQlyZXR1cm4gQVVYX1NldFZvbHVtZSh3RGV2SUQsZHdQYXJhbTEpOwogCWRlZmF1bHQ6Ci0JCWRwcmludGZfd2FybihtbWF1eCwgImF1eE1lc3NhZ2UgLy8gdW5rbm93biBtZXNzYWdlICFcbiIpOworCQlXQVJOKG1tYXV4LCAidW5rbm93biBtZXNzYWdlICFcbiIpOwogCX0KIAlyZXR1cm4gTU1TWVNFUlJfTk9UU1VQUE9SVEVEOwogfQpkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9tbWlvLmMgYi9tdWx0aW1lZGlhL21taW8uYwppbmRleCA1OTczNTBhLi44N2Y5YjFlIDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL21taW8uYworKysgYi9tdWx0aW1lZGlhL21taW8uYwpAQCAtMjYsNyArMjYsNyBAQAogKiAgICAgICAgICAgICAgIG1taW9Eb3NJT1Byb2MgICAgICAgICAgIFtpbnRlcm5hbF0KICovCiBzdGF0aWMgTFJFU1VMVCBtbWlvRG9zSU9Qcm9jKExQTU1JT0lORk8xNiBscG1taW9pbmZvLCBVSU5UMTYgdU1lc3NhZ2UsIExQQVJBTSBsUGFyYW0xLCBMUEFSQU0gbFBhcmFtMikgewotCWRwcmludGZfaW5mbyhtbWlvLCAibW1pb0Rvc0lPUHJvYyglcCwgJVgsICVsZCwgJWxkKTtcbiIsIGxwbW1pb2luZm8sIHVNZXNzYWdlLCBsUGFyYW0xLCBsUGFyYW0yKTsKKwlUUkFDRShtbWlvLCAiKCVwLCAlWCwgJWxkLCAlbGQpO1xuIiwgbHBtbWlvaW5mbywgdU1lc3NhZ2UsIGxQYXJhbTEsIGxQYXJhbTIpOwogCiAJc3dpdGNoICh1TWVzc2FnZSkgewogCkBAIC00Miw3ICs0Miw3IEBACiAJCQlMUFNUUiBzekZpbGVOYW1lID0gKExQU1RSKSBsUGFyYW0xOwogCiAJCQlpZiAobHBtbWlvaW5mby0+ZHdGbGFncyAmIE1NSU9fR0VUVEVNUCkgewotCQkJCWRwcmludGZfZml4bWUobW1pbywgIm1taW9Eb3NJT1Byb2MgLy8gTU1JT19HRVRURU1QIG5vdCBpbXBsZW1lbnRlZFxuIik7CisJCQkJRklYTUUobW1pbywgIk1NSU9fR0VUVEVNUCBub3QgaW1wbGVtZW50ZWRcbiIpOwogCQkJCXJldHVybiBNTUlPRVJSX0NBTk5PVE9QRU47CiAJCQl9CiAKQEAgLTE0NCwxMiArMTQ0LDEyIEBACiAgICAgICAgICAgICAgKiBSZXR1cm5zOiB6ZXJvIG9uIHN1Y2Nlc3MsIG5vbi16ZXJvIG9uIGZhaWx1cmUKICAgICAgICAgICAgICAqLwogCi0gICAgICAgICAgICBkcHJpbnRmX2ZpeG1lKG1taW8sICJtbWlvRG9zSU9Qcm9jOiBNTUlPTV9SRU5BTUUgdW5pbXBsZW1lbnRlZFxuIik7CisgICAgICAgICAgICBGSVhNRShtbWlvLCAiTU1JT01fUkVOQU1FIHVuaW1wbGVtZW50ZWRcbiIpOwogICAgICAgICAgICAgcmV0dXJuIE1NSU9FUlJfRklMRU5PVEZPVU5EOwogCQl9CiAKIAkJZGVmYXVsdDoKLQkJCWRwcmludGZfd2FybihtbWlvLCAibW1pb0Rvc0lPUHJvYzogdW5leHBlY3RlZCBtZXNzYWdlICV1XG4iLCB1TWVzc2FnZSk7CisJCQlXQVJOKG1taW8sICJ1bmV4cGVjdGVkIG1lc3NhZ2UgJXVcbiIsIHVNZXNzYWdlKTsKIAkJCXJldHVybiAwOwogCX0KIAkKQEAgLTE5NSw3ICsxOTUsNyBAQAogCUhNTUlPMTYgaG1taW87CiAJVUlOVDE2IHJlc3VsdDsKIAotCWRwcmludGZfaW5mbyhtbWlvLCAibW1pb09wZW4oJyVzJywgJXAsICUwOGxYKTtcbiIsIHN6RmlsZU5hbWUsIGxwbW1pb2luZm8sIGR3T3BlbkZsYWdzKTsKKwlUUkFDRShtbWlvLCAiKCclcycsICVwLCAlMDhsWCk7XG4iLCBzekZpbGVOYW1lLCBscG1taW9pbmZvLCBkd09wZW5GbGFncyk7CiAKIAlobW1pbyA9IEdsb2JhbEFsbG9jMTYoR0hORCwgc2l6ZW9mKE1NSU9JTkZPMTYpKTsKIAlscG1taW5mbyA9IChMUE1NSU9JTkZPMTYpR2xvYmFsTG9jazE2KGhtbWlvKTsKQEAgLTI1Niw3ICsyNTYsNyBAQAogCUxQTU1JT0lORk8xNiBscG1taW5mbzsKIAlVSU5UMTYgcmVzdWx0OwogCi0JZHByaW50Zl9pbmZvKG1taW8sICJtbWlvQ2xvc2UoJTA0WCwgJTA0WCk7XG4iLCBobW1pbywgdUZsYWdzKTsKKwlUUkFDRShtbWlvLCAiKCUwNFgsICUwNFgpO1xuIiwgaG1taW8sIHVGbGFncyk7CiAKIAlscG1taW5mbyA9IChMUE1NSU9JTkZPMTYpIEdsb2JhbExvY2sxNihobW1pbyk7CiAJaWYgKGxwbW1pbmZvID09IE5VTEwpCkBAIC0yODYsNyArMjg2LDcgQEAKIAlMT05HIGNvdW50OwogCUxQTU1JT0lORk8xNiBscG1taW5mbzsKIAotCWRwcmludGZfaW5mbyhtbWlvLCAibW1pb1JlYWQoJTA0WCwgJXAsICVsZCk7XG4iLCBobW1pbywgcGNoLCBjY2gpOworCVRSQUNFKG1taW8sICIoJTA0WCwgJXAsICVsZCk7XG4iLCBobW1pbywgcGNoLCBjY2gpOwogCiAJbHBtbWluZm8gPSAoTFBNTUlPSU5GTzE2KUdsb2JhbExvY2sxNihobW1pbyk7CiAJaWYgKGxwbW1pbmZvID09IE5VTEwpCkBAIC0yOTUsNyArMjk1LDcgQEAKIAljb3VudCA9IG1taW9TZW5kTWVzc2FnZShobW1pbywgTU1JT01fUkVBRCwgKExQQVJBTSkgcGNoLCAoTFBBUkFNKSBjY2gpOwogCiAJR2xvYmFsVW5sb2NrMTYoaG1taW8pOwotCWRwcmludGZfaW5mbyhtbWlvLCAibW1pb1JlYWQgLy8gY291bnQ9JWxkXG4iLCBjb3VudCk7CisJVFJBQ0UobW1pbywgImNvdW50PSVsZFxuIiwgY291bnQpOwogCXJldHVybiBjb3VudDsKIH0KIApAQCAtMzA5LDcgKzMwOSw3IEBACiAJTE9ORyBjb3VudDsKIAlMUE1NSU9JTkZPMTYgbHBtbWluZm87CiAKLQlkcHJpbnRmX2luZm8obW1pbywgIm1taW9Xcml0ZSglMDRYLCAlcCwgJWxkKTtcbiIsIGhtbWlvLCBwY2gsIGNjaCk7CisJVFJBQ0UobW1pbywgIiglMDRYLCAlcCwgJWxkKTtcbiIsIGhtbWlvLCBwY2gsIGNjaCk7CiAKIAlscG1taW5mbyA9IChMUE1NSU9JTkZPMTYpR2xvYmFsTG9jazE2KGhtbWlvKTsKIAlpZiAobHBtbWluZm8gPT0gTlVMTCkKQEAgLTMxOCw3ICszMTgsNyBAQAogCWNvdW50ID0gbW1pb1NlbmRNZXNzYWdlKGhtbWlvLCBNTUlPTV9XUklURSwgKExQQVJBTSkgcGNoLCAoTFBBUkFNKSBjY2gpOwogCiAJR2xvYmFsVW5sb2NrMTYoaG1taW8pOwotCWRwcmludGZfaW5mbyhtbWlvLCAibW1pb1dyaXRlIC8vIGNvdW50PSVsZFxuIiwgY291bnQpOworCVRSQUNFKG1taW8sICJjb3VudD0lbGRcbiIsIGNvdW50KTsKIAlyZXR1cm4gY291bnQ7CiB9CiAKQEAgLTMzMCw3ICszMzAsNyBAQAogCWludCBvZmZzZXQ7CiAJTFBNTUlPSU5GTzE2IGxwbW1pbmZvOwogCi0JZHByaW50Zl9pbmZvKG1taW8sICJtbWlvU2VlayglMDRYLCAlMDhsWCwgJWQpO1xuIiwgaG1taW8sIGxPZmZzZXQsIGlPcmlnaW4pOworCVRSQUNFKG1taW8sICIoJTA0WCwgJTA4bFgsICVkKTtcbiIsIGhtbWlvLCBsT2Zmc2V0LCBpT3JpZ2luKTsKIAogCWxwbW1pbmZvID0gKExQTU1JT0lORk8xNilHbG9iYWxMb2NrMTYoaG1taW8pOwogCWlmIChscG1taW5mbyA9PSBOVUxMKQpAQCAtMzQ4LDcgKzM0OCw3IEBACiBVSU5UMTYgV0lOQVBJIG1taW9HZXRJbmZvKEhNTUlPMTYgaG1taW8sIE1NSU9JTkZPMTYgKiBscG1taW9pbmZvLCBVSU5UMTYgdUZsYWdzKQogewogCUxQTU1JT0lORk8xNglscG1taW5mbzsKLQlkcHJpbnRmX2luZm8obW1pbywgIm1taW9HZXRJbmZvXG4iKTsKKwlUUkFDRShtbWlvLCAibW1pb0dldEluZm9cbiIpOwogCWxwbW1pbmZvID0gKExQTU1JT0lORk8xNilHbG9iYWxMb2NrMTYoaG1taW8pOwogCWlmIChscG1taW5mbyA9PSBOVUxMKSByZXR1cm4gMDsKIAltZW1jcHkobHBtbWlvaW5mbywgbHBtbWluZm8sIHNpemVvZihNTUlPSU5GTzE2KSk7CkBAIC0zNjIsNyArMzYyLDcgQEAKIFVJTlQxNiBXSU5BUEkgbW1pb1NldEluZm8oSE1NSU8xNiBobW1pbywgY29uc3QgTU1JT0lORk8xNiAqIGxwbW1pb2luZm8sIFVJTlQxNiB1RmxhZ3MpCiB7CiAJTFBNTUlPSU5GTzE2CWxwbW1pbmZvOwotCWRwcmludGZfaW5mbyhtbWlvLCAibW1pb1NldEluZm9cbiIpOworCVRSQUNFKG1taW8sICJtbWlvU2V0SW5mb1xuIik7CiAJbHBtbWluZm8gPSAoTFBNTUlPSU5GTzE2KUdsb2JhbExvY2sxNihobW1pbyk7CiAJaWYgKGxwbW1pbmZvID09IE5VTEwpIHJldHVybiAwOwogCUdsb2JhbFVubG9jazE2KGhtbWlvKTsKQEAgLTM3NSw3ICszNzUsNyBAQAogVUlOVDE2IFdJTkFQSSBtbWlvU2V0QnVmZmVyKEhNTUlPMTYgaG1taW8sIExQU1RSIHBjaEJ1ZmZlciwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9ORyBjY2hCdWZmZXIsIFVJTlQxNiB1RmxhZ3MpCiB7Ci0JZHByaW50Zl9maXhtZShtbWlvLCAibW1pb1NldEJ1ZmZlciAvLyBlbXB0eSBzdHViIFxuIik7CisJRklYTUUobW1pbywgImVtcHR5IHN0dWIgXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzg1LDcgKzM4NSw3IEBACiBVSU5UMTYgV0lOQVBJIG1taW9GbHVzaChITU1JTzE2IGhtbWlvLCBVSU5UMTYgdUZsYWdzKQogewogCUxQTU1JT0lORk8xNglscG1taW5mbzsKLQlkcHJpbnRmX2luZm8obW1pbywgIm1taW9GbHVzaCglMDRYLCAlMDRYKVxuIiwgaG1taW8sIHVGbGFncyk7CisJVFJBQ0UobW1pbywgIiglMDRYLCAlMDRYKVxuIiwgaG1taW8sIHVGbGFncyk7CiAJbHBtbWluZm8gPSAoTFBNTUlPSU5GTzE2KUdsb2JhbExvY2sxNihobW1pbyk7CiAJaWYgKGxwbW1pbmZvID09IE5VTEwpIHJldHVybiAwOwogCUdsb2JhbFVubG9jazE2KGhtbWlvKTsKQEAgLTM5OSw3ICszOTksNyBAQAogewogCWludAkJY291bnQgPSAwOwogCUxQTU1JT0lORk8xNglscG1taW5mbzsKLQlkcHJpbnRmX2luZm8obW1pbywgIm1taW9BZHZhbmNlXG4iKTsKKwlUUkFDRShtbWlvLCAibW1pb0FkdmFuY2VcbiIpOwogCWxwbW1pbmZvID0gKExQTU1JT0lORk8xNilHbG9iYWxMb2NrMTYoaG1taW8pOwogCWlmIChscG1taW5mbyA9PSBOVUxMKSByZXR1cm4gMDsKIAlpZiAodUZsYWdzID09IE1NSU9fUkVBRCkgewpAQCAtNDQxLDcgKzQ0MSw3IEBACiAgKi8KIEZPVVJDQyBXSU5BUEkgbW1pb1N0cmluZ1RvRk9VUkNDMTYoTFBDU1RSIHN6LCBVSU5UMTYgdUZsYWdzKQogewotCWRwcmludGZfZml4bWUobW1pbywgIm1taW9TdHJpbmdUb0ZPVVJDQyAvLyBlbXB0eSBzdHViIFxuIik7CisJRklYTUUobW1pbywgImVtcHR5IHN0dWIgXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDUxLDcgKzQ1MSw3IEBACiBMUE1NSU9QUk9DMTYgV0lOQVBJIG1taW9JbnN0YWxsSU9Qcm9jMTYoRk9VUkNDIGZjY0lPUHJvYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBNTUlPUFJPQzE2IHBJT1Byb2MsIERXT1JEIGR3RmxhZ3MpCiB7Ci0JZHByaW50Zl9pbmZvKG1taW8sICJtbWlvSW5zdGFsbElPUHJvYyglbGQsICVwLCAlMDhsWClcbiIsCisJVFJBQ0UobW1pbywgIiglbGQsICVwLCAlMDhsWClcbiIsCiAJCQkJIGZjY0lPUHJvYywgcElPUHJvYywgZHdGbGFncyk7CiAKIAlpZiAoZHdGbGFncyAmIE1NSU9fR0xPQkFMUFJPQykgewpAQCAtNDgzLDcgKzQ4Myw3IEBACiBMUE1NSU9QUk9DMzIgV0lOQVBJIG1taW9JbnN0YWxsSU9Qcm9jMzJBKEZPVVJDQyBmY2NJT1Byb2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUE1NSU9QUk9DMzIgcElPUHJvYywgRFdPUkQgZHdGbGFncykKIHsKLQlkcHJpbnRmX2ZpeG1lKG1taW8sICJtbWlvSW5zdGFsbElPUHJvY0EgKCVjJWMlYyVjLCVwLDB4JTA4bHgpLy8gZW1wdHkgc3R1YiBcbiIsCisJRklYTUUobW1pbywgIiglYyVjJWMlYywlcCwweCUwOGx4KSAtLSBlbXB0eSBzdHViIFxuIiwKICAgICAgICAgICAgICAgICAgICAgIChjaGFyKSgoZmNjSU9Qcm9jJjB4ZmYwMDAwMDApPj4yNCksCiAgICAgICAgICAgICAgICAgICAgICAoY2hhcikoKGZjY0lPUHJvYyYweDAwZmYwMDAwKT4+MTYpLAogICAgICAgICAgICAgICAgICAgICAgKGNoYXIpKChmY2NJT1Byb2MmMHgwMDAwZmYwMCk+PiA4KSwKQEAgLTUxNywxMCArNTE3LDEwIEBACiAjZW5kaWYKIAogCWlmIChtc2cpCi0JCWRwcmludGZfaW5mbyhtbWlvLCAibW1pb1NlbmRNZXNzYWdlKCUwNFgsICVzLCAlbGQsICVsZClcbiIsCisJCVRSQUNFKG1taW8sICIoJTA0WCwgJXMsICVsZCwgJWxkKVxuIiwKIAkJCQkJIGhtbWlvLCBtc2csIGxQYXJhbTEsIGxQYXJhbTIpOwogCWVsc2UKLQkJZHByaW50Zl9pbmZvKG1taW8sICJtbWlvU2VuZE1lc3NhZ2UoJTA0WCwgJXUsICVsZCwgJWxkKVxuIiwKKwkJVFJBQ0UobW1pbywgIiglMDRYLCAldSwgJWxkLCAlbGQpXG4iLAogCQkJCQkgaG1taW8sIHVNZXNzYWdlLCBsUGFyYW0xLCBsUGFyYW0yKTsKIAkKIAlscG1taW5mbyA9IChMUE1NSU9JTkZPMTYpR2xvYmFsTG9jazE2KGhtbWlvKTsKQEAgLTU0MywyMCArNTQzLDIwIEBACiB7CiAJRFdPUkQJZHdmY2MsIGR3T2xkUG9zOwogCi0JZHByaW50Zl9pbmZvKG1taW8sICJtbWlvRGVzY2VuZCglMDRYLCAlcCwgJXAsICUwNFgpO1xuIiwgCisJVFJBQ0UobW1pbywgIiglMDRYLCAlcCwgJXAsICUwNFgpO1xuIiwgCiAJCQkJaG1taW8sIGxwY2ssIGxwY2tQYXJlbnQsIHVGbGFncyk7CiAKIAlpZiAobHBjayA9PSBOVUxMKQogCSAgICByZXR1cm4gMDsKIAogCWR3ZmNjID0gbHBjay0+Y2tpZDsKLQlkcHJpbnRmX2luZm8obW1pbywgIm1taW9EZXNjZW5kIC8vIGR3ZmNjPSUwOGxYXG4iLCBkd2ZjYyk7CisJVFJBQ0UobW1pbywgImR3ZmNjPSUwOGxYXG4iLCBkd2ZjYyk7CiAKIAlkd09sZFBvcyA9IG1taW9TZWVrKGhtbWlvLCAwLCBTRUVLX0NVUik7Ci0JZHByaW50Zl9pbmZvKG1taW8sICJtbWlvRGVzY2VuZCAvLyBkd09sZFBvcz0lbGRcbiIsIGR3T2xkUG9zKTsKKwlUUkFDRShtbWlvLCAiZHdPbGRQb3M9JWxkXG4iLCBkd09sZFBvcyk7CiAKIAlpZiAobHBja1BhcmVudCAhPSBOVUxMKSB7Ci0JCWRwcmludGZfaW5mbyhtbWlvLCAibW1pb0Rlc2NlbmQgLy8gc2VlayBpbnNpZGUgcGFyZW50IGF0ICVsZCAhXG4iLCBscGNrUGFyZW50LT5kd0RhdGFPZmZzZXQpOworCQlUUkFDRShtbWlvLCAic2VlayBpbnNpZGUgcGFyZW50IGF0ICVsZCAhXG4iLCBscGNrUGFyZW50LT5kd0RhdGFPZmZzZXQpOwogCQlkd09sZFBvcyA9IG1taW9TZWVrKGhtbWlvLCBscGNrUGFyZW50LT5kd0RhdGFPZmZzZXQsIFNFRUtfU0VUKTsKIAl9CiAvKgpAQCAtNTY4LDE5ICs1NjgsMTkgQEAKIAkJKHVGbGFncyAmIE1NSU9fRklORExJU1QpKSB7CiAqLwogCWlmICgodUZsYWdzICYgTU1JT19GSU5EQ0hVTkspIHx8ICh1RmxhZ3MgJiBNTUlPX0ZJTkRMSVNUKSkgewotCQlkcHJpbnRmX2luZm8obW1pbywgIm1taW9EZXNjZW5kIC8vIE1NSU9fRklORHh4eHggZHdmY2M9JTA4bFggIVxuIiwgZHdmY2MpOworCQlUUkFDRShtbWlvLCAiTU1JT19GSU5EeHh4eCBkd2ZjYz0lMDhsWCAhXG4iLCBkd2ZjYyk7CiAJCXdoaWxlIChUUlVFKSB7CiAJCSAgICAgICAgTE9ORyBpeDsKIAogCQkJaXggPSBtbWlvUmVhZChobW1pbywgKExQU1RSKWxwY2ssIHNpemVvZihNTUNLSU5GTykpOwotCQkJZHByaW50Zl9pbmZvKG1taW8sICJtbWlvRGVzY2VuZCAvLyBhZnRlciBfbHJlYWQzMiBpeCA9ICVsZCByZXEgPSAlZCwgZXJybm8gPSAlZFxuIixpeCxzaXplb2YoTU1DS0lORk8pLGVycm5vKTsKKwkJCVRSQUNFKG1taW8sICJhZnRlciBfbHJlYWQzMiBpeCA9ICVsZCByZXEgPSAlZCwgZXJybm8gPSAlZFxuIixpeCxzaXplb2YoTU1DS0lORk8pLGVycm5vKTsKIAkJCWlmIChpeCA8IHNpemVvZihNTUNLSU5GTykpIHsKIAogCQkJCW1taW9TZWVrKGhtbWlvLCBkd09sZFBvcywgU0VFS19TRVQpOwotCQkJCWRwcmludGZfd2FybihtbWlvLCAibW1pb0Rlc2NlbmQgLy8gcmV0dXJuIENodW5rTm90Rm91bmRcbiIpOworCQkJCVdBUk4obW1pbywgInJldHVybiBDaHVua05vdEZvdW5kXG4iKTsKIAkJCQlyZXR1cm4gTU1JT0VSUl9DSFVOS05PVEZPVU5EOwogCQkJfQotCQkJZHByaW50Zl9pbmZvKG1taW8sICJtbWlvRGVzY2VuZCAvLyBkd2ZjYz0lMDhsWCBja2lkPSUwOGxYIGNrc2l6ZT0lMDhsWCAhXG4iLCAKKwkJCVRSQUNFKG1taW8sICJkd2ZjYz0lMDhsWCBja2lkPSUwOGxYIGNrc2l6ZT0lMDhsWCAhXG4iLCAKIAkJCQkJCQkJCWR3ZmNjLCBscGNrLT5ja2lkLCBscGNrLT5ja3NpemUpOwogCQkJaWYgKGR3ZmNjID09IGxwY2stPmNraWQpCiAJCQkJYnJlYWs7CkBAIC01OTQsNyArNTk0LDcgQEAKIAllbHNlIHsKIAkJaWYgKG1taW9SZWFkKGhtbWlvLCAoTFBTVFIpbHBjaywgc2l6ZW9mKE1NQ0tJTkZPKSkgPCBzaXplb2YoTU1DS0lORk8pKSB7CiAJCQltbWlvU2VlayhobW1pbywgZHdPbGRQb3MsIFNFRUtfU0VUKTsKLQkJCWRwcmludGZfd2FybihtbWlvLCAibW1pb0Rlc2NlbmQgLy8gcmV0dXJuIENodW5rTm90Rm91bmQgMm5kXG4iKTsKKwkJCVdBUk4obW1pbywgInJldHVybiBDaHVua05vdEZvdW5kIDJuZFxuIik7CiAJCQlyZXR1cm4gTU1JT0VSUl9DSFVOS05PVEZPVU5EOwogCQl9CiAJfQpAQCAtNjAzLDkgKzYwMyw5IEBACiAJCWxwY2stPmR3RGF0YU9mZnNldCArPSBzaXplb2YoRFdPUkQpOwogCW1taW9TZWVrKGhtbWlvLCBscGNrLT5kd0RhdGFPZmZzZXQsIFNFRUtfU0VUKTsKIAotCWRwcmludGZfaW5mbyhtbWlvLCAibW1pb0Rlc2NlbmQgLy8gbHBjay0+Y2tpZD0lMDhsWCBscGNrLT5ja3NpemU9JWxkICFcbiIsIAorCVRSQUNFKG1taW8sICJscGNrLT5ja2lkPSUwOGxYIGxwY2stPmNrc2l6ZT0lbGQgIVxuIiwgCiAJCQkJCQkJCWxwY2stPmNraWQsIGxwY2stPmNrc2l6ZSk7Ci0JZHByaW50Zl9pbmZvKG1taW8sICJtbWlvRGVzY2VuZCAvLyBscGNrLT5mY2NUeXBlPSUwOGxYICFcbiIsIGxwY2stPmZjY1R5cGUpOworCVRSQUNFKG1taW8sICJscGNrLT5mY2NUeXBlPSUwOGxYICFcbiIsIGxwY2stPmZjY1R5cGUpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02MTUsNyArNjE1LDcgQEAKICovCiBVSU5UMTYgV0lOQVBJIG1taW9Bc2NlbmQoSE1NSU8xNiBobW1pbywgTU1DS0lORk8gKiBscGNrLCBVSU5UMTYgdUZsYWdzKQogewotCWRwcmludGZfZml4bWUobW1pbywgIm1taW9Bc2NlbmQgLy8gZW1wdHkgc3R1YiAhXG4iKTsKKwlGSVhNRShtbWlvLCAiZW1wdHkgc3R1YiAhXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjI0LDcgKzYyNCw3IEBACiAqLwogVUlOVDE2IFdJTkFQSSBtbWlvQ3JlYXRlQ2h1bmsoSE1NSU8xNiBobW1pbywgTU1DS0lORk8gKiBscGNrLCBVSU5UMTYgdUZsYWdzKQogewotCWRwcmludGZfZml4bWUobW1pbywgIm1taW9DcmVhdGVDaHVuayAvLyBlbXB0eSBzdHViIFxuIik7CisJRklYTUUobW1pbywgImVtcHR5IHN0dWIgXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjM5LDcgKzYzOSw3IEBACiAJTFBNTUlPSU5GTzE2IGxwbW1pbmZvOwogCUhNTUlPMTYgaG1taW87CiAKLQlkcHJpbnRmX2luZm8obW1pbywgIm1taW9SZW5hbWUoJyVzJywgJyVzJywgJXAsICUwOGxYKTtcbiIsCisJVFJBQ0UobW1pbywgIignJXMnLCAnJXMnLCAlcCwgJTA4bFgpO1xuIiwKIAkJCQkgc3pGaWxlTmFtZSwgc3pOZXdGaWxlTmFtZSwgbHBtbWlvaW5mbywgZHdSZW5hbWVGbGFncyk7CiAKIAlobW1pbyA9IEdsb2JhbEFsbG9jMTYoR0hORCwgc2l6ZW9mKE1NSU9JTkZPMTYpKTsKZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvbW1zeXN0ZW0uYyBiL211bHRpbWVkaWEvbW1zeXN0ZW0uYwppbmRleCAzNWU5NGU3Li4xMmU1NWQ3IDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL21tc3lzdGVtLmMKKysrIGIvbXVsdGltZWRpYS9tbXN5c3RlbS5jCkBAIC0xMjEsOCArMTIxLDggQEAKICAqLwogQk9PTDMyIFdJTkFQSSBQbGF5U291bmQzMkEoTFBDU1RSIHBzelNvdW5kLCBITU9EVUxFMzIgaG1vZCwgRFdPUkQgZmR3U291bmQpCiB7Ci0gIGRwcmludGZfaW5mbyhtbXN5cywgIlBsYXlTb3VuZEE6IHBzelNvdW5kPSclcCcgaG1vZD0lMDRYIGZkd1NvdW5kPSUwOGxYXG4iLAotCQlwc3pTb3VuZCwgaG1vZCwgZmR3U291bmQpOworICBUUkFDRShtbXN5cywgInBzelNvdW5kPSclcCcgaG1vZD0lMDRYIGZkd1NvdW5kPSUwOGxYXG4iLAorCSAgICAgICBwc3pTb3VuZCwgaG1vZCwgZmR3U291bmQpOwogICBpZihobW9kICE9IDAgfHwgIShmZHdTb3VuZCAmIFNORF9GSUxFTkFNRSkpIHsKICAgICBmcHJpbnRmKHN0ZGVyciwgIlBsYXlTb3VuZEE6IG9ubHkgZGlzayBzb3VuZCBmaWxlcyBhcmUgc3VwcG9ydGVkXG4iKTsKICAgICByZXR1cm4gRkFMU0U7CkBAIC0xNTQsMzcgKzE1NCwzNyBAQAogCWNoYXIJCQlzdHJbMTI4XTsKIAlMUFNUUgkJCXB0cjsKIAotCWRwcmludGZfaW5mbyhtbXN5cywgInNuZFBsYXlTb3VuZCAvLyBTb3VuZE5hbWU9JyVzJyB1RmxhZ3M9JTA0WCAhXG4iLCAKKwlUUkFDRShtbXN5cywgIlNvdW5kTmFtZT0nJXMnIHVGbGFncz0lMDRYICFcbiIsIAogCQkJCQkJCQkJbHBzelNvdW5kTmFtZSwgdUZsYWdzKTsKIAlpZiAobHBzelNvdW5kTmFtZSA9PSBOVUxMKSB7Ci0JCWRwcmludGZfaW5mbyhtbXN5cywgInNuZFBsYXlTb3VuZCAvLyBTdG9wICFcbiIpOworCQlUUkFDRShtbXN5cywgIlN0b3AgIVxuIik7CiAJCXJldHVybiBGQUxTRTsKIAkJfQogCWhtbWlvID0gbW1pb09wZW4xNigoTFBTVFIpbHBzelNvdW5kTmFtZSwgTlVMTCwgCiAJCU1NSU9fQUxMT0NCVUYgfCBNTUlPX1JFQUQgfCBNTUlPX0RFTllXUklURSk7CiAKIAlpZiAodUZsYWdzICYgU05EX01FTU9SWSkgewotCQlkcHJpbnRmX2ZpeG1lKG1tc3lzLCAic25kUGxheVNvdW5kIC8vIFNORF9NRU1PUlkgZmxhZyBub3QgaW1wbGVtZW50ZWQhXG4iKTsKKwkJRklYTUUobW1zeXMsICJTTkRfTUVNT1JZIGZsYWcgbm90IGltcGxlbWVudGVkIVxuIik7CiAJCXJldHVybiBGQUxTRTsKIAl9CiAKIAlpZiAoaG1taW8gPT0gMCkgCiAJewotCQlkcHJpbnRmX2luZm8obW1zeXMsICJzbmRQbGF5U291bmQgLy8gc2VhcmNoaW5nIGluIFN5c3RlbVNvdW5kIExpc3QgIVxuIik7CisJCVRSQUNFKG1tc3lzLCAic2VhcmNoaW5nIGluIFN5c3RlbVNvdW5kIExpc3QgIVxuIik7CiAJCUdldFByb2ZpbGVTdHJpbmczMkEoIlNvdW5kcyIsIChMUFNUUilscHN6U291bmROYW1lLCAiIiwgc3RyLCBzaXplb2Yoc3RyKSk7CiAJCWlmIChzdHJsZW4oc3RyKSA9PSAwKSByZXR1cm4gRkFMU0U7CiAJCWlmICggKHB0ciA9IChMUFNUUilzdHJjaHIoc3RyLCAnLCcpKSAhPSBOVUxMKSAqcHRyID0gJ1wwJzsKIAkJaG1taW8gPSBtbWlvT3BlbjE2KHN0ciwgTlVMTCwgTU1JT19BTExPQ0JVRiB8IE1NSU9fUkVBRCB8IE1NSU9fREVOWVdSSVRFKTsKIAkJaWYgKGhtbWlvID09IDApIAogCQl7Ci0JCQlkcHJpbnRmX3dhcm4obW1zeXMsICJzbmRQbGF5U291bmQgLy8gY2FuJ3QgZmluZCBTeXN0ZW1Tb3VuZD0nJXMnICFcbiIsIHN0cik7CisJCQlXQVJOKG1tc3lzLCAiY2FuJ3QgZmluZCBTeXN0ZW1Tb3VuZD0nJXMnICFcbiIsIHN0cik7CiAJCQlyZXR1cm4gRkFMU0U7CiAJCX0KIAl9CiAKIAlpZiAobW1pb0Rlc2NlbmQoaG1taW8sICZja01haW5SSUZGLCBOVUxMLCAwKSA9PSAwKSAKICAgICAgICAgewotCSAgICBkcHJpbnRmX2luZm8obW1zeXMsICJzbmRQbGF5U291bmQgLy8gUGFyZW50Q2h1bmsgY2tpZD0lLjRzIGZjY1R5cGU9JS40cyBja3NpemU9JTA4bFggXG4iLAorCSAgICBUUkFDRShtbXN5cywgIlBhcmVudENodW5rIGNraWQ9JS40cyBmY2NUeXBlPSUuNHMgY2tzaXplPSUwOGxYIFxuIiwKIAkJCQkoTFBTVFIpJmNrTWFpblJJRkYuY2tpZCwgKExQU1RSKSZja01haW5SSUZGLmZjY1R5cGUsIGNrTWFpblJJRkYuY2tzaXplKTsKIAogCSAgICBpZiAoKGNrTWFpblJJRkYuY2tpZCA9PSBGT1VSQ0NfUklGRikgJiYKQEAgLTE5OCwxOSArMTk4LDE5IEBACiAJCXsKIAkJICAgIFBDTVdBVkVGT1JNQVQgICAgICAgICAgIHBjbVdhdmVGb3JtYXQ7CiAKLQkJICAgIGRwcmludGZfaW5mbyhtbXN5cywgInNuZFBsYXlTb3VuZCAvLyBDaHVuayBGb3VuZCBja2lkPSUuNHMgZmNjVHlwZT0lLjRzIGNrc2l6ZT0lMDhsWCBcbiIsCisJCSAgICBUUkFDRShtbXN5cywgIkNodW5rIEZvdW5kIGNraWQ9JS40cyBmY2NUeXBlPSUuNHMgY2tzaXplPSUwOGxYIFxuIiwKIAkJCQkoTFBTVFIpJm1tY2tJbmZvLmNraWQsIChMUFNUUikmbW1ja0luZm8uZmNjVHlwZSwgbW1ja0luZm8uY2tzaXplKTsKIAogCQkgICAgaWYgKG1taW9SZWFkKGhtbWlvLCAoSFBTVFIpICZwY21XYXZlRm9ybWF0LAogCQkJICAgICAgICAobG9uZykgc2l6ZW9mKFBDTVdBVkVGT1JNQVQpKSA9PSAobG9uZykgc2l6ZW9mKFBDTVdBVkVGT1JNQVQpKQogCQkgICAgewogCi0JCQlkcHJpbnRmX2luZm8obW1zeXMsICJzbmRQbGF5U291bmQgLy8gd0Zvcm1hdFRhZz0lMDRYICFcbiIsIHBjbVdhdmVGb3JtYXQud2Yud0Zvcm1hdFRhZyk7Ci0JCQlkcHJpbnRmX2luZm8obW1zeXMsICJzbmRQbGF5U291bmQgLy8gbkNoYW5uZWxzPSVkIFxuIiwgcGNtV2F2ZUZvcm1hdC53Zi5uQ2hhbm5lbHMpOwotCQkJZHByaW50Zl9pbmZvKG1tc3lzLCAic25kUGxheVNvdW5kIC8vIG5TYW1wbGVzUGVyU2VjPSVsZFxuIiwgcGNtV2F2ZUZvcm1hdC53Zi5uU2FtcGxlc1BlclNlYyk7Ci0JCQlkcHJpbnRmX2luZm8obW1zeXMsICJzbmRQbGF5U291bmQgLy8gbkF2Z0J5dGVzUGVyU2VjPSVsZFxuIiwgcGNtV2F2ZUZvcm1hdC53Zi5uQXZnQnl0ZXNQZXJTZWMpOwotCQkJZHByaW50Zl9pbmZvKG1tc3lzLCAic25kUGxheVNvdW5kIC8vIG5CbG9ja0FsaWduPSVkIFxuIiwgcGNtV2F2ZUZvcm1hdC53Zi5uQmxvY2tBbGlnbik7Ci0JCQlkcHJpbnRmX2luZm8obW1zeXMsICJzbmRQbGF5U291bmQgLy8gd0JpdHNQZXJTYW1wbGU9JXUgIVxuIiwgcGNtV2F2ZUZvcm1hdC53Qml0c1BlclNhbXBsZSk7CisJCQlUUkFDRShtbXN5cywgIndGb3JtYXRUYWc9JTA0WCAhXG4iLCBwY21XYXZlRm9ybWF0LndmLndGb3JtYXRUYWcpOworCQkJVFJBQ0UobW1zeXMsICJuQ2hhbm5lbHM9JWQgXG4iLCBwY21XYXZlRm9ybWF0LndmLm5DaGFubmVscyk7CisJCQlUUkFDRShtbXN5cywgIm5TYW1wbGVzUGVyU2VjPSVsZFxuIiwgcGNtV2F2ZUZvcm1hdC53Zi5uU2FtcGxlc1BlclNlYyk7CisJCQlUUkFDRShtbXN5cywgIm5BdmdCeXRlc1BlclNlYz0lbGRcbiIsIHBjbVdhdmVGb3JtYXQud2YubkF2Z0J5dGVzUGVyU2VjKTsKKwkJCVRSQUNFKG1tc3lzLCAibkJsb2NrQWxpZ249JWQgXG4iLCBwY21XYXZlRm9ybWF0LndmLm5CbG9ja0FsaWduKTsKKwkJCVRSQUNFKG1tc3lzLCAid0JpdHNQZXJTYW1wbGU9JXUgIVxuIiwgcGNtV2F2ZUZvcm1hdC53Qml0c1BlclNhbXBsZSk7CiAKIAkJCW1tY2tJbmZvLmNraWQgPSBtbWlvRk9VUkNDKCdkJywgJ2EnLCAndCcsICdhJyk7CiAJCQlpZiAobW1pb0Rlc2NlbmQoaG1taW8sICZtbWNrSW5mbywgJmNrTWFpblJJRkYsIE1NSU9fRklORENIVU5LKSA9PSAwKQpAQCAtMjE4LDcgKzIxOCw3IEBACiAJCQkgICAgV0FWRU9QRU5ERVNDCXdhdmVEZXNjOwogCQkJICAgIERXT1JECQlkd1JldDsKIAotCQkJICAgIGRwcmludGZfaW5mbyhtbXN5cywgInNuZFBsYXlTb3VuZCAvLyBDaHVuayBGb3VuZCBcCisJCQkgICAgVFJBQ0UobW1zeXMsICJDaHVuayBGb3VuZCBcCiAgY2tpZD0lLjRzIGZjY1R5cGU9JS40cyBja3NpemU9JTA4bFggXG4iLCAoTFBTVFIpJm1tY2tJbmZvLmNraWQsIChMUFNUUikmbW1ja0luZm8uZmNjVHlwZSwgbW1ja0luZm8uY2tzaXplKTsKIAogCQkJICAgIHBjbVdhdmVGb3JtYXQud2YubkF2Z0J5dGVzUGVyU2VjID0gcGNtV2F2ZUZvcm1hdC53Zi5uU2FtcGxlc1BlclNlYyAqIApAQCAtMjU4LDcgKzI1OCw3IEBACiAKIAkJCQkgICAgYlJldCA9IFRSVUU7CiAJCQkJfQotCQkJCWVsc2UgZHByaW50Zl93YXJuKG1tc3lzLCAic25kUGxheVNvdW5kIC8vIGNhbid0IHByZXBhcmUgV2F2ZU91dCBkZXZpY2UgIVxuIik7CisJCQkJZWxzZSBXQVJOKG1tc3lzLCAiY2FuJ3QgcHJlcGFyZSBXYXZlT3V0IGRldmljZSAhXG4iKTsKIAogCQkJCUdsb2JhbFVubG9jazE2KGhEYXRhKTsKIAkJCQlHbG9iYWxGcmVlMTYoaERhdGEpOwpAQCAtMjg3LDcgKzI4Nyw3IEBACiAgKi8KIFVJTlQxNiBXSU5BUEkgbW1zeXN0ZW1HZXRWZXJzaW9uMTYoKQogewotCWRwcmludGZfaW5mbyhtbXN5cywgIm1tc3lzdGVtR2V0VmVyc2lvbiAvLyAzLjEwIChXaW45NT8pXG4iKTsKKwlUUkFDRShtbXN5cywgIjMuMTAgKFdpbjk1PylcbiIpOwogCXJldHVybiAweDAzMGE7CiB9CiAKQEAgLTMwOCwxNCArMzA4LDE0IEBACiB7CiAJTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwogCi0JZHByaW50Zl9pbmZvKG1tc3lzLCAiRHJpdmVyQ2FsbGJhY2soJTA4bFgsICUwNFgsICUwNFgsICUwNFgsICUwOGxYLCAlMDhsWCwgJTA4bFgpOyAhXG4iLAorCVRSQUNFKG1tc3lzLCAiKCUwOGxYLCAlMDRYLCAlMDRYLCAlMDRYLCAlMDhsWCwgJTA4bFgsICUwOGxYKTsgIVxuIiwKIAkJZHdDYWxsQmFjaywgdUZsYWdzLCBoRGV2LCB3TXNnLCBkd1VzZXIsIGR3UGFyYW0xLCBkd1BhcmFtMik7CiAJc3dpdGNoKHVGbGFncyAmIERDQl9UWVBFTUFTSykgewogCQljYXNlIERDQl9OVUxMOgotCQkJZHByaW50Zl9pbmZvKG1tc3lzLCAiRHJpdmVyQ2FsbGJhY2soKSAvLyBDQUxMQkFDS19OVUxMICFcbiIpOworCQkJVFJBQ0UobW1zeXMsICJDQUxMQkFDS19OVUxMICFcbiIpOwogCQkJYnJlYWs7CiAJCWNhc2UgRENCX1dJTkRPVzoKLQkJCWRwcmludGZfaW5mbyhtbXN5cywgIkRyaXZlckNhbGxiYWNrKCkgLy8gQ0FMTEJBQ0tfV0lORE9XID0gJTA0bFggaGFuZGxlID0gJTA0WCFcbiIsZHdDYWxsQmFjayxoRGV2KTsKKwkJCVRSQUNFKG1tc3lzLCAiQ0FMTEJBQ0tfV0lORE9XID0gJTA0bFggaGFuZGxlID0gJTA0WCFcbiIsZHdDYWxsQmFjayxoRGV2KTsKIAkJCWlmICghSXNXaW5kb3czMihkd0NhbGxCYWNrKSkgcmV0dXJuIEZBTFNFOwogCQkJbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaERldik7CiAJCQlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBGQUxTRTsKQEAgLTMyMywxMCArMzIzLDEwIEBACiAJCQlQb3N0TWVzc2FnZTE2KChIV05EMTYpZHdDYWxsQmFjaywgd01zZywgaERldiwgZHdQYXJhbTEpOwogCQkJYnJlYWs7CiAJCWNhc2UgRENCX1RBU0s6Ci0JCQlkcHJpbnRmX2luZm8obW1zeXMsICJEcml2ZXJDYWxsYmFjaygpIC8vIENBTExCQUNLX1RBU0sgIVxuIik7CisJCQlUUkFDRShtbXN5cywgIkNBTExCQUNLX1RBU0sgIVxuIik7CiAJCQlyZXR1cm4gRkFMU0U7CiAJCWNhc2UgRENCX0ZVTkNUSU9OOgotCQkJZHByaW50Zl9pbmZvKG1tc3lzLCAiRHJpdmVyQ2FsbGJhY2soKSAvLyBDQUxMQkFDS19GVU5DVElPTiAhXG4iKTsKKwkJCVRSQUNFKG1tc3lzLCAiQ0FMTEJBQ0tfRlVOQ1RJT04gIVxuIik7CiAJCQlDYWxsYmFja3MtPkNhbGxEcml2ZXJDYWxsYmFjayggKEZBUlBST0MxNilkd0NhbGxCYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhEZXYsIHdNc2csIGR3VXNlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1BhcmFtMSwgZHdQYXJhbTIgKTsKQEAgLTM2NCw3ICszNjQsNyBAQAogCVVJTlQxNgljb3VudDsKIAogCWNvdW50ID0gbWl4TWVzc2FnZSgwLE1YRE1fR0VUTlVNREVWUywwTCwwTCwwTCk7Ci0JZHByaW50Zl9pbmZvKG1tYXV4LCJtaXhlckdldE51bURldnMgcmV0dXJucyAlZFxuIixjb3VudCk7CisJVFJBQ0UobW1hdXgsIm1peGVyR2V0TnVtRGV2cyByZXR1cm5zICVkXG4iLGNvdW50KTsKIAlyZXR1cm4gY291bnQ7CiB9CiAKQEAgLTY5OCw5ICs2OTgsOSBAQAogVUlOVDE2IFdJTkFQSSBhdXhHZXROdW1EZXZzMTYoKQogewogCVVJTlQxNgljb3VudCA9IDA7Ci0JZHByaW50Zl9pbmZvKG1tc3lzLCAiYXV4R2V0TnVtRGV2cyAhXG4iKTsKKwlUUkFDRShtbXN5cywgImF1eEdldE51bURldnMgIVxuIik7CiAJY291bnQgKz0gYXV4TWVzc2FnZSgwLCBBVVhETV9HRVROVU1ERVZTLCAwTCwgMEwsIDBMKTsKLQlkcHJpbnRmX2luZm8obW1zeXMsICJhdXhHZXROdW1EZXZzIHJldHVybiAldSBcbiIsIGNvdW50KTsKKwlUUkFDRShtbXN5cywgImF1eEdldE51bURldnMgcmV0dXJuICV1IFxuIiwgY291bnQpOwogCXJldHVybiBjb3VudDsKIH0KIApAQCAtNzQzLDcgKzc0Myw3IEBACiAgKi8KIFVJTlQxNiBXSU5BUEkgYXV4R2V0RGV2Q2FwczE2KFVJTlQxNiB1RGV2aWNlSUQsTFBBVVhDQVBTMTYgbHBDYXBzLCBVSU5UMTYgdVNpemUpCiB7Ci0JZHByaW50Zl9pbmZvKG1tc3lzLCAiYXV4R2V0RGV2Q2FwcyglMDRYLCAlcCwgJWQpICFcbiIsIAorCVRSQUNFKG1tc3lzLCAiKCUwNFgsICVwLCAlZCkgIVxuIiwgCiAJCQkJCXVEZXZpY2VJRCwgbHBDYXBzLCB1U2l6ZSk7CiAJcmV0dXJuIGF1eE1lc3NhZ2UodURldmljZUlELCBBVVhETV9HRVRERVZDQVBTLAogCQkJCTBMLCAoRFdPUkQpbHBDYXBzLCAoRFdPUkQpdVNpemUpOwpAQCAtNzYyLDcgKzc2Miw3IEBACiAgKi8KIFVJTlQxNiBXSU5BUEkgYXV4R2V0Vm9sdW1lMTYoVUlOVDE2IHVEZXZpY2VJRCwgRFdPUkQgKiBscGR3Vm9sdW1lKQogewotCWRwcmludGZfaW5mbyhtbXN5cywgImF1eEdldFZvbHVtZSglMDRYLCAlcCkgIVxuIiwgdURldmljZUlELCBscGR3Vm9sdW1lKTsKKwlUUkFDRShtbXN5cywgIiglMDRYLCAlcCkgIVxuIiwgdURldmljZUlELCBscGR3Vm9sdW1lKTsKIAlyZXR1cm4gYXV4TWVzc2FnZSh1RGV2aWNlSUQsIEFVWERNX0dFVFZPTFVNRSwgMEwsIChEV09SRClscGR3Vm9sdW1lLCAwTCk7CiB9CiAKQEAgLTc3OSw3ICs3NzksNyBAQAogICovCiBVSU5UMTYgV0lOQVBJIGF1eFNldFZvbHVtZTE2KFVJTlQxNiB1RGV2aWNlSUQsIERXT1JEIGR3Vm9sdW1lKQogewotCWRwcmludGZfaW5mbyhtbXN5cywgImF1eFNldFZvbHVtZSglMDRYLCAlMDhsWCkgIVxuIiwgdURldmljZUlELCBkd1ZvbHVtZSk7CisJVFJBQ0UobW1zeXMsICIoJTA0WCwgJTA4bFgpICFcbiIsIHVEZXZpY2VJRCwgZHdWb2x1bWUpOwogCXJldHVybiBhdXhNZXNzYWdlKHVEZXZpY2VJRCwgQVVYRE1fU0VUVk9MVU1FLCAwTCwgZHdWb2x1bWUsIDBMKTsKIH0KIApAQCAtODEwLDcgKzgxMCw3IEBACiAgKi8KIERXT1JEIFdJTkFQSSBhdXhPdXRNZXNzYWdlMTYoVUlOVDE2IHVEZXZpY2VJRCwgVUlOVDE2IHVNZXNzYWdlLCBEV09SRCBkdzEsIERXT1JEIGR3MikKIHsKLQlkcHJpbnRmX2luZm8obW1zeXMsICJhdXhPdXRNZXNzYWdlKCUwNFgsICUwNFgsICUwOGxYLCAlMDhsWClcbiIsIAorCVRSQUNFKG1tc3lzLCAiKCUwNFgsICUwNFgsICUwOGxYLCAlMDhsWClcbiIsIAogCQkJCXVEZXZpY2VJRCwgdU1lc3NhZ2UsIGR3MSwgZHcyKTsKIAlzd2l0Y2ggKHVNZXNzYWdlKSB7CiAJY2FzZSBBVVhETV9HRVROVU1ERVZTOgpAQCAtODU3LDcgKzg1Nyw3IEBACiBCT09MMTYgV0lOQVBJIG1jaUdldEVycm9yU3RyaW5nMTYoRFdPUkQgd0Vycm9yLExQU1RSIGxwc3RyQnVmZmVyLFVJTlQxNiB1TGVuZ3RoKQogewogCUxQU1RSCW1zZ3B0cjsKLQlkcHJpbnRmX2luZm8obW1zeXMsICJtY2lHZXRFcnJvclN0cmluZyglMDhsWCwgJXAsICVkKTtcbiIsIAorCVRSQUNFKG1tc3lzLCAiKCUwOGxYLCAlcCwgJWQpO1xuIiwgCiAJICAgICAgIHdFcnJvciwgbHBzdHJCdWZmZXIsIHVMZW5ndGgpOwogCWlmICgobHBzdHJCdWZmZXIgPT0gTlVMTCkgfHwgKHVMZW5ndGggPCAxKSkgcmV0dXJuKEZBTFNFKTsKIAlscHN0ckJ1ZmZlclswXSA9ICdcMCc7CkBAIC0xMTIzLDcgKzExMjMsNyBAQAogCQkJYnJlYWs7CiAJfQogICAgICAgICBsc3RyY3B5bjMyQShscHN0ckJ1ZmZlciwgbXNncHRyLCB1TGVuZ3RoKTsKLQlkcHJpbnRmX2luZm8obW1zeXMsICJtY2lHZXRFcnJvclN0cmluZyAvLyBtc2cgPSAlcztcbiIsIG1zZ3B0cik7CisJVFJBQ0UobW1zeXMsICJtc2cgPSAlcztcbiIsIG1zZ3B0cik7CiAJcmV0dXJuIFRSVUU7CiB9CiAKQEAgLTExMzMsOSArMTEzMyw5IEBACiAgKi8KIEJPT0wxNiBXSU5BUEkgbWNpRHJpdmVyTm90aWZ5KEhXTkQxNiBoV25kQ2FsbEJhY2ssIFVJTlQxNiB3RGV2SUQsIFVJTlQxNiB3U3RhdHVzKQogewotCWRwcmludGZfaW5mbyhtbXN5cywgIm1jaURyaXZlck5vdGlmeSglMDRYLCAldSwgJTA0WClcbiIsIGhXbmRDYWxsQmFjaywgd0RldklELCB3U3RhdHVzKTsKKwlUUkFDRShtbXN5cywgIiglMDRYLCAldSwgJTA0WClcbiIsIGhXbmRDYWxsQmFjaywgd0RldklELCB3U3RhdHVzKTsKIAlpZiAoIUlzV2luZG93MzIoaFduZENhbGxCYWNrKSkgcmV0dXJuIEZBTFNFOwotCWRwcmludGZfaW5mbyhtbXN5cywgIm1jaURyaXZlck5vdGlmeSAvLyBiZWZvcmUgUG9zdE1lc3NhZ2VcbiIpOworCVRSQUNFKG1tc3lzLCAiYmVmb3JlIFBvc3RNZXNzYWdlXG4iKTsKIAlQb3N0TWVzc2FnZTE2KCBoV25kQ2FsbEJhY2ssIE1NX01DSU5PVElGWSwgd1N0YXR1cywgCiAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VMT05HKHdEZXZJRCwgMCkpOwogCXJldHVybiBUUlVFOwpAQCAtMTE1NCwyMyArMTE1NCwyMyBAQAogCURXT1JEIGR3cmV0OwogCiAJbHBQYXJtcyA9IFBUUl9TRUdfVE9fTElOKGxwMTZQYXJtcyk7Ci0JZHByaW50Zl9pbmZvKG1tc3lzLCAibWNpT3BlbiglMDhsWCwgJXAgKCVwKSlcbiIsIGR3UGFyYW0sIGxwMTZQYXJtcywgbHBQYXJtcyk7CisJVFJBQ0UobW1zeXMsICIoJTA4bFgsICVwICglcCkpXG4iLCBkd1BhcmFtLCBscDE2UGFybXMsIGxwUGFybXMpOwogCWlmIChscDE2UGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAogCXdoaWxlKEdldERydih3RGV2SUQpLT5tb2RwLndUeXBlICE9IDApIHsKIAkJd0RldklEID0gTU1TWVNURU1fTmV4dERldklEKHdEZXZJRCk7CiAJCWlmICghTU1TWVNURU1fRGV2SURWYWxpZCh3RGV2SUQpKSB7Ci0JCQlkcHJpbnRmX2luZm8obW1zeXMsICJNQ0lfT1BFTiAvLyBNQVhNQ0lEUklWRVJTIHJlYWNoZWQgIVxuIik7CisJCQlUUkFDRShtbXN5cywgIk1BWE1DSURSSVZFUlMgcmVhY2hlZCAhXG4iKTsKIAkJCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJCX0KIAl9Ci0JZHByaW50Zl9pbmZvKG1tc3lzLCAibWNpT3BlbiAvLyB3RGV2SUQ9JTA0WCBcbiIsIHdEZXZJRCk7CisJVFJBQ0UobW1zeXMsICJ3RGV2SUQ9JTA0WCBcbiIsIHdEZXZJRCk7CiAJbWVtY3B5KEdldE9wZW5EcnYod0RldklEKSxscFBhcm1zLHNpemVvZigqbHBQYXJtcykpOwogCiAJaWYgKGR3UGFyYW0gJiBNQ0lfT1BFTl9FTEVNRU5UKSB7CiAJCWNoYXIJKnMsKnQ7CiAKLQkJZHByaW50Zl9pbmZvKG1tc3lzLCJtY2lPcGVuIC8vIGxwc3RyRWxlbWVudE5hbWU9JyVzJ1xuIiwKKwkJVFJBQ0UobW1zeXMsImxwc3RyRWxlbWVudE5hbWU9JyVzJ1xuIiwKIAkJCShjaGFyKilQVFJfU0VHX1RPX0xJTihscFBhcm1zLT5scHN0ckVsZW1lbnROYW1lKQogCQkpOwogCQlzPShjaGFyKilQVFJfU0VHX1RPX0xJTihscFBhcm1zLT5scHN0ckVsZW1lbnROYW1lKTsKQEAgLTExNzgsNyArMTE3OCw3IEBACiAJCWlmICh0KSB7CiAJCQlHZXRQcm9maWxlU3RyaW5nMzJBKCJtY2kgZXh0ZW5zaW9ucyIsdCsxLCIqIixzdHIsc2l6ZW9mKHN0cikpOwogCQkJQ2hhclVwcGVyMzJBKHN0cik7Ci0JCQlkcHJpbnRmX2luZm8obW1zeXMsICJtY2lPcGVuIC8vIHN0ciA9ICVzIFxuIiwgc3RyKTsKKwkJCVRSQUNFKG1tc3lzLCAic3RyID0gJXMgXG4iLCBzdHIpOwogCQkJaWYgKHN0cmNtcChzdHIsICJDREFVRElPIikgPT0gMCkgewogCQkJCXVEZXZUeXAgPSBNQ0lfREVWVFlQRV9DRF9BVURJTzsKIAkJCX0gZWxzZQpAQCAtMTE5NSw3ICsxMTk1LDcgQEAKIAkJCQl1RGV2VHlwID0gTUNJX0RFVlRZUEVfRElHSVRBTF9WSURFTzsKIAkJCX0gZWxzZSAKIAkJCWlmIChzdHJjbXAoc3RyLCIqIikgPT0gMCkgewotCQkJCWRwcmludGZfaW5mbyhtbXN5cywiTm8gW21jaSBleHRlbnNpb25zXSBlbnRyeSBmb3IgJXMgZm91bmQuXG4iLHQpOworCQkJCVRSQUNFKG1tc3lzLCJObyBbbWNpIGV4dGVuc2lvbnNdIGVudHJ5IGZvciAlcyBmb3VuZC5cbiIsdCk7CiAJCQkJcmV0dXJuIE1DSUVSUl9FWFRFTlNJT05fTk9UX0ZPVU5EOwogI2lmIHRlc3RpbmcxNgogCQkJfSBlbHNlICB7CkBAIC0xMjA4LDcgKzEyMDgsNyBAQAogCQkJCQlHZXREcnYod0RldklEKS0+ZHJpdmVycHJvYyA9IEdldFByb2NBZGRyZXNzMTYoaG1vZCxTRUdQVFJfR0VUKFNFR1BUUl9TVFJEVVAoIkRSSVZFUlBST0MiKSkpOwogCQkJCQl1RGV2VHlwID0gTUNJX0RFVlRZUEVfT1RIRVI7CiAJCQkJfSBlbHNlIHsKLQkJCQkJZHByaW50Zl9maXhtZShtbXN5cywgIlttY2kgZXh0ZW5zaW9uc10gZW50cnkgJXMgZm9yICVzIG5vdCBzdXBwb3J0ZWQuXG4iLHN0cix0KTsKKwkJCQkJRklYTUUobW1zeXMsICJbbWNpIGV4dGVuc2lvbnNdIGVudHJ5ICVzIGZvciAlcyBub3Qgc3VwcG9ydGVkLlxuIixzdHIsdCk7CiAJCQkJCXJldHVybiBNQ0lFUlJfREVWSUNFX05PVF9JTlNUQUxMRUQ7CiAJCQkJfQogI2VuZGlmCkBAIC0xMjE4LDcgKzEyMTgsNyBAQAogCX0KIAogCWlmIChkd1BhcmFtICYgTUNJX09QRU5fQUxJQVMpIHsKLQkJZHByaW50Zl9pbmZvKG1tc3lzLCAiTUNJX09QRU4gLy8gQWxpYXM9JyVzJyAhXG4iLAorCQlUUkFDRShtbXN5cywgIkFsaWFzPSclcycgIVxuIiwKIAkJCShjaGFyKilQVFJfU0VHX1RPX0xJTihscFBhcm1zLT5scHN0ckFsaWFzKSk7CiAgICAgICAgICAgICAgICAgR2V0T3BlbkRydih3RGV2SUQpLT5scHN0ckFsaWFzID0gKExQU1RSKVNFR1BUUl9HRVQoCiAgICAgICAgICAgICAgICAgICAgIFNFR1BUUl9TVFJEVVAoKGNoYXIqKVBUUl9TRUdfVE9fTElOKGxwUGFybXMtPmxwc3RyQWxpYXMpKSk7CkBAIC0xMjI2LDEyICsxMjI2LDEyIEBACiAJfQogCWlmIChkd1BhcmFtICYgTUNJX09QRU5fVFlQRSkgewogCQlpZiAoZHdQYXJhbSAmIE1DSV9PUEVOX1RZUEVfSUQpIHsKLQkJCWRwcmludGZfaW5mbyhtbXN5cywgIk1DSV9PUEVOIC8vIERldj0lMDhseCFcbiIsIChEV09SRClscFBhcm1zLT5scHN0ckRldmljZVR5cGUpOworCQkJVFJBQ0UobW1zeXMsICJEZXY9JTA4bHghXG4iLCAoRFdPUkQpbHBQYXJtcy0+bHBzdHJEZXZpY2VUeXBlKTsKIAkJCXVEZXZUeXAgPSBMT1dPUkQoKERXT1JEKWxwUGFybXMtPmxwc3RyRGV2aWNlVHlwZSk7CiAgCQkJR2V0T3BlbkRydih3RGV2SUQpLT5scHN0ckRldmljZVR5cGU9KExQU1RSKWxwUGFybXMtPmxwc3RyRGV2aWNlVHlwZTsKIAkJfSBlbHNlIHsKIAkJCWlmIChscFBhcm1zLT5scHN0ckRldmljZVR5cGUgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKLQkJCWRwcmludGZfaW5mbyhtbXN5cywgIk1DSV9PUEVOIC8vIERldj0nJXMnICFcbiIsCisJCQlUUkFDRShtbXN5cywgIkRldj0nJXMnICFcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopUFRSX1NFR19UT19MSU4obHBQYXJtcy0+bHBzdHJEZXZpY2VUeXBlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBHZXRPcGVuRHJ2KHdEZXZJRCktPmxwc3RyRGV2aWNlVHlwZT0oTFBTVFIpU0VHUFRSX0dFVCgKICAgICAgICAgICAgICAgU0VHUFRSX1NUUkRVUCgoY2hhciopUFRSX1NFR19UT19MSU4obHBQYXJtcy0+bHBzdHJEZXZpY2VUeXBlKSkpOwpAQCAtMTI3Miw3ICsxMjcyLDcgQEAKIAlHZXREcnYod0RldklEKS0+bW9kcC53VHlwZSA9IHVEZXZUeXA7CiAJR2V0RHJ2KHdEZXZJRCktPm1vZHAud0RldmljZUlEID0gMDsgIC8qIEZJWE1FPyBmb3IgbXVsdGlwbGUgZGV2aWNlcyAqLwogCWxwUGFybXMtPndEZXZpY2VJRCA9IHdEZXZJRDsKLQlkcHJpbnRmX2luZm8obW1zeXMsICJNQ0lfT1BFTiAvLyBtY2lkZXY9JWQsIHVEZXZUeXA9JTA0WCB3RGV2aWNlSUQ9JTA0WCAhXG4iLCAKKwlUUkFDRShtbXN5cywgIm1jaWRldj0lZCwgdURldlR5cD0lMDRYIHdEZXZpY2VJRD0lMDRYICFcbiIsIAogCQkJCXdEZXZJRCwgdURldlR5cCwgbHBQYXJtcy0+d0RldmljZUlEKTsKIAlzd2l0Y2godURldlR5cCkKICAgICAgICAgewpAQCAtMTI5MywxMiArMTI5MywxMiBAQAogCQkJCSAgZHdQYXJhbSwgKERXT1JEKWxwMTZQYXJtcyk7CiAJICBicmVhazsKICAgICAgICAgY2FzZSBNQ0lfREVWVFlQRV9ESUdJVEFMX1ZJREVPOgotCSAgZHByaW50Zl9pbmZvKG1tc3lzLCAiTUNJX09QRU4gLy8gTm8gRElHSVRBTF9WSURFTyB5ZXQgIVxuIik7CisJICBUUkFDRShtbXN5cywgIk5vIERJR0lUQUxfVklERU8geWV0ICFcbiIpOwogCSAgcmV0dXJuIE1DSUVSUl9ERVZJQ0VfTk9UX0lOU1RBTExFRDsKICAgICAgICAgZGVmYXVsdDoKICNpZiB0ZXN0aW5nMTYKIAkgIGR3cmV0ID0gQ2FsbGJhY2tzLT5DYWxsRHJpdmVyUHJvYyhHZXREcnYod0RldklEKS0+ZHJpdmVycHJvYywwLEdldERydih3RGV2SUQpLT5oZHJ2LE1DSV9PUEVOX0RSSVZFUixkd1BhcmFtLChEV09SRClscDE2UGFybXMpOwotCSAgZHByaW50Zl93YXJuKG1tc3lzLCAiTUNJX09QRU4gLy8gSW52YWxpZCBEZXZpY2UgTmFtZSAnJTA4bHgnICFcbiIsIChEV09SRClscFBhcm1zLT5scHN0ckRldmljZVR5cGUpOworCSAgV0FSTihtbXN5cywgIkludmFsaWQgRGV2aWNlIE5hbWUgJyUwOGx4JyAhXG4iLCAoRFdPUkQpbHBQYXJtcy0+bHBzdHJEZXZpY2VUeXBlKTsKICNlbmRpZgogCSAgcmV0dXJuIE1DSUVSUl9JTlZBTElEX0RFVklDRV9OQU1FOwogICAgICAgICB9CkBAIC0xMzA5LDcgKzEzMDksNyBAQAogCQkJICAoZHdyZXQ9PTA/TUNJX05PVElGWV9TVUNDRVNTRlVMOk1DSV9OT1RJRllfRkFJTFVSRSkpOwogCiAJLyogb25seSBoYW5kbGVkIGRldmljZXMgZmFsbCB0aHJvdWdoICovCi0JZHByaW50Zl9pbmZvKG1tc3lzLCAiTUNJX09QRU4gLy8gd0RldklEID0gJTA0WCB3RGV2aWNlSUQgPSAlZCBkd3JldCA9ICVsZFxuIix3RGV2SUQsIGxwUGFybXMtPndEZXZpY2VJRCwgZHdyZXQpOworCVRSQUNFKG1tc3lzLCAid0RldklEID0gJTA0WCB3RGV2aWNlSUQgPSAlZCBkd3JldCA9ICVsZFxuIix3RGV2SUQsIGxwUGFybXMtPndEZXZpY2VJRCwgZHdyZXQpOwogCXJldHVybiBkd3JldDsKIH0KIApAQCAtMTMzNiw3ICsxMzM2LDcgQEAKIHsKIAlEV09SRAlkd1JldCA9IE1DSUVSUl9JTlRFUk5BTDsKIAotCWRwcmludGZfaW5mbyhtbXN5cywgIm1jaUNsb3NlKCUwNHgsICUwOGxYLCAlcClcbiIsIHdEZXZJRCwgZHdQYXJhbSwgbHBQYXJtcyk7CisJVFJBQ0UobW1zeXMsICIoJTA0eCwgJTA4bFgsICVwKVxuIiwgd0RldklELCBkd1BhcmFtLCBscFBhcm1zKTsKIAlzd2l0Y2goR2V0RHJ2KHdEZXZJRCktPm1vZHAud1R5cGUpIHsKIAljYXNlIE1DSV9ERVZUWVBFX0NEX0FVRElPOgogCQlkd1JldCA9IENEQVVESU9fRHJpdmVyUHJvYyhHZXREcnYod0RldklEKS0+bW9kcC53RGV2aWNlSUQsMCwKQEAgLTEzNjgsNyArMTM2OCw3IEBACiAJICBtY2lEcml2ZXJOb3RpZnkobHBQYXJtcy0+ZHdDYWxsYmFjayx3RGV2SUQsCiAJCQkgIChkd1JldD09MD9NQ0lfTk9USUZZX1NVQ0NFU1NGVUw6TUNJX05PVElGWV9GQUlMVVJFKSk7CiAKLQlkcHJpbnRmX2luZm8obW1zeXMsICJtY2lDbG9zZSgpIC8vIHJldHVybnMgJWxkXG4iLGR3UmV0KTsKKwlUUkFDRShtbXN5cywgInJldHVybnMgJWxkXG4iLGR3UmV0KTsKIAlyZXR1cm4gZHdSZXQ7CiB9CiAKQEAgLTEzODMsMjMgKzEzODMsMjMgQEAKIAlMUFNUUglscHN0clJldHVybjsKIAlEV09SRAkqbHBkd1JldDsKIAlMUFNUUglTeXNGaWxlID0gIlNZU1RFTS5JTkkiOwotCWRwcmludGZfaW5mbyhtY2ksICJtY2lTeXNJbmZvKCUwOGxYLCAlMDhsWClcbiIsIGR3RmxhZ3MsIChEV09SRClscFBhcm1zKTsKKwlUUkFDRShtY2ksICIoJTA4bFgsICUwOGxYKVxuIiwgZHdGbGFncywgKERXT1JEKWxwUGFybXMpOwogCWxwc3RyUmV0dXJuID0gUFRSX1NFR19UT19MSU4obHBQYXJtcy0+bHBzdHJSZXR1cm4pOwogCXN3aXRjaChkd0ZsYWdzKSB7CiAJY2FzZSBNQ0lfU1lTSU5GT19RVUFOVElUWToKLQkJZHByaW50Zl9pbmZvKG1jaSwgIm1jaVN5c0luZm8gLy8gTUNJX1NZU0lORk9fUVVBTlRJVFkgXG4iKTsKKwkJVFJBQ0UobWNpLCAiTUNJX1NZU0lORk9fUVVBTlRJVFkgXG4iKTsKIAkJbHBkd1JldCA9IChEV09SRCAqKWxwc3RyUmV0dXJuOwogCQkqKGxwZHdSZXQpID0gSW5zdGFsbGVkQ291bnQ7CiAJCXJldHVybiAwOwogCWNhc2UgTUNJX1NZU0lORk9fSU5TVEFMTE5BTUU6Ci0JCWRwcmludGZfaW5mbyhtY2ksICJtY2lTeXNJbmZvIC8vIE1DSV9TWVNJTkZPX0lOU1RBTExOQU1FIFxuIik7CisJCVRSQUNFKG1jaSwgIk1DSV9TWVNJTkZPX0lOU1RBTExOQU1FIFxuIik7CiAJCWlmIChscEluc3RhbGxOYW1lcyA9PSBOVUxMKSB7CiAJCQlJbnN0YWxsZWRDb3VudCA9IDA7CiAJCQlJbnN0YWxsZWRMaXN0TGVuID0gMDsKIAkJCXB0ciA9IGxwSW5zdGFsbE5hbWVzID0geG1hbGxvYygyMDQ4KTsKIAkJCUdldFByaXZhdGVQcm9maWxlU3RyaW5nMzJBKCJtY2kiLCBOVUxMLCAiIiwgbHBJbnN0YWxsTmFtZXMsIDIwMDAsIFN5c0ZpbGUpOwogCQkJd2hpbGUoc3RybGVuKHB0cikgPiAwKSB7Ci0JCQkJZHByaW50Zl9pbmZvKG1jaSwgIi0tLT4gJyVzJyBcbiIsIHB0cik7CisJCQkJVFJBQ0UobWNpLCAiLS0tPiAnJXMnIFxuIiwgcHRyKTsKIAkJCQlsZW4gPSBzdHJsZW4ocHRyKSArIDE7CiAJCQkJcHRyICs9IGxlbjsKIAkJCQlJbnN0YWxsZWRMaXN0TGVuICs9IGxlbjsKQEAgLTE0MTIsMTAgKzE0MTIsMTAgQEAKIAkJCXN0cmNweShscHN0clJldHVybiwgbHBJbnN0YWxsTmFtZXMpOwogCQlyZXR1cm4gMDsKIAljYXNlIE1DSV9TWVNJTkZPX05BTUU6Ci0JCWRwcmludGZfaW5mbyhtY2ksICJtY2lTeXNJbmZvIC8vIE1DSV9TWVNJTkZPX05BTUUgXG4iKTsKKwkJVFJBQ0UobWNpLCAiTUNJX1NZU0lORk9fTkFNRSBcbiIpOwogCQlyZXR1cm4gMDsKIAljYXNlIE1DSV9TWVNJTkZPX09QRU46Ci0JCWRwcmludGZfaW5mbyhtY2ksICJtY2lTeXNJbmZvIC8vIE1DSV9TWVNJTkZPX09QRU4gXG4iKTsKKwkJVFJBQ0UobWNpLCAiTUNJX1NZU0lORk9fT1BFTiBcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAJcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07CkBAIC0xNDg2LDcgKzE0ODYsNyBAQAogewogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJaWYgKGR3UGFyYW0gJiBNQ0lfU09VTkRfTkFNRSkKLQkJZHByaW50Zl9pbmZvKG1jaSwgIk1DSV9TT1VORCAvLyBmaWxlPSclcycgIVxuIiwgbHBQYXJtcy0+bHBzdHJTb3VuZE5hbWUpOworCQlUUkFDRShtY2ksICJmaWxlPSclcycgIVxuIiwgbHBQYXJtcy0+bHBzdHJTb3VuZE5hbWUpOwogCXJldHVybiBNQ0lFUlJfSU5WQUxJRF9ERVZJQ0VfSUQ7CiB9CiAgKgpAQCAtMTU2Niw3ICsxNTY2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1BhcmFtMikKIHsKICAgICBIRFJWUjE2IGhEcnYgPSAwOwotICAgIGRwcmludGZfaW5mbyhtY2ksICJtY2lTZW5kQ29tbWFuZCglMDRYLCAlcywgJTA4bFgsICUwOGxYKVxuIiwgCisgICAgVFJBQ0UobWNpLCAiKCUwNFgsICVzLCAlMDhsWCwgJTA4bFgpXG4iLCAKICAgICAgICAgICAgICAgICB3RGV2SUQsIF9tY2lDb21tYW5kVG9TdHJpbmcod01zZyksIGR3UGFyYW0xLCBkd1BhcmFtMik7CiAgICAgc3dpdGNoKHdNc2cpCiAgICAgewpAQCAtMTU5OCw5ICsxNTk4LDggQEAKICAgICAgICAgZGVmYXVsdDoKIAkgICAgcmV0dXJuIENhbGxiYWNrcy0+Q2FsbERyaXZlclByb2MoR2V0RHJ2KHdEZXZJRCktPmRyaXZlcnByb2MsR2V0RHJ2KHdEZXZJRCktPm1vZHAud0RldmljZUlELEdldERydih3RGV2SUQpLT5oZHJ2LE1DSV9DTE9TRSxkd1BhcmFtMSxkd1BhcmFtMik7CiAKLSAgICAgICAgICAgIGRwcmludGZfd2FybihtY2ksCi0gICAgICAgICAgICAgICAgICAgICAgICAibWNpU2VuZENvbW1hbmQoKSAvLyB1bmtub3duIGRldmljZSB0eXBlPSUwNFggIVxuIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICBHZXREcnYod0RldklEKS0+bW9kcC53VHlwZSk7CisgICAgICAgICAgICBXQVJOKG1jaSwgInVua25vd24gZGV2aWNlIHR5cGU9JTA0WCAhXG4iLCAKKwkJCSBHZXREcnYod0RldklEKS0+bW9kcC53VHlwZSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07CkBAIC0xNjEzLDcgKzE2MTIsNyBAQAogewogICAgIFVJTlQxNiB3RGV2SUQ7CiAKLSAgICBkcHJpbnRmX2luZm8obWNpLCAibWNpR2V0RGV2aWNlSUQoXCIlc1wiKVxuIiwgbHBzdHJOYW1lKTsKKyAgICBUUkFDRShtY2ksICIoXCIlc1wiKVxuIiwgbHBzdHJOYW1lKTsKICAgICBpZiAobHBzdHJOYW1lICYmICFsc3RyY21waTMyQShscHN0ck5hbWUsICJBTEwiKSkKICAgICAgICAgcmV0dXJuIE1DSV9BTExfREVWSUNFX0lEOwogCkBAIC0xNjgyLDkgKzE2ODEsOSBAQAogVUlOVDE2IFdJTkFQSSBtaWRpT3V0R2V0TnVtRGV2czE2KHZvaWQpCiB7CiAJVUlOVDE2CWNvdW50ID0gMDsKLQlkcHJpbnRmX2luZm8obW1zeXMsICJtaWRpT3V0R2V0TnVtRGV2c1xuIik7CisJVFJBQ0UobW1zeXMsICJtaWRpT3V0R2V0TnVtRGV2c1xuIik7CiAJY291bnQgKz0gbW9kTWVzc2FnZSgwLCBNT0RNX0dFVE5VTURFVlMsIDBMLCAwTCwgMEwpOwotCWRwcmludGZfaW5mbyhtbXN5cywgIm1pZGlPdXRHZXROdW1EZXZzIHJldHVybiAldSBcbiIsIGNvdW50KTsKKwlUUkFDRShtbXN5cywgIm1pZGlPdXRHZXROdW1EZXZzIHJldHVybiAldSBcbiIsIGNvdW50KTsKIAlyZXR1cm4gY291bnQ7CiB9CiAKQEAgLTE3MzQsNyArMTczMyw3IEBACiAgKi8KIFVJTlQxNiBXSU5BUEkgbWlkaU91dEdldERldkNhcHMxNihVSU5UMTYgdURldmljZUlELExQTUlESU9VVENBUFMxNiBscENhcHMsIFVJTlQxNiB1U2l6ZSkKIHsKLQlkcHJpbnRmX2luZm8obW1zeXMsICJtaWRpT3V0R2V0RGV2Q2Fwc1xuIik7CisJVFJBQ0UobW1zeXMsICJtaWRpT3V0R2V0RGV2Q2Fwc1xuIik7CiAJcmV0dXJuIG1vZE1lc3NhZ2UodURldmljZUlELE1PRE1fR0VUREVWQ0FQUywwLChEV09SRClscENhcHMsdVNpemUpOwogfQogCkBAIC0xNzQzLDcgKzE3NDIsNyBAQAogICovCiBVSU5UMzIgV0lOQVBJIG1pZGlPdXRHZXRFcnJvclRleHQzMkEoVUlOVDMyIHVFcnJvciwgTFBTVFIgbHBUZXh0LCBVSU5UMzIgdVNpemUpCiB7Ci0JZHByaW50Zl9pbmZvKG1tc3lzLCAibWlkaU91dEdldEVycm9yVGV4dFxuIik7CisJVFJBQ0UobW1zeXMsICJtaWRpT3V0R2V0RXJyb3JUZXh0XG4iKTsKIAlyZXR1cm4gbWlkaUdldEVycm9yVGV4dCh1RXJyb3IsIGxwVGV4dCwgdVNpemUpOwogfQogCkBAIC0xNzU1LDcgKzE3NTQsNyBAQAogCUxQU1RSCXhzdHIgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLHVTaXplKTsKIAlVSU5UMzIJcmV0OwogCi0JZHByaW50Zl9pbmZvKG1tc3lzLCAibWlkaU91dEdldEVycm9yVGV4dFxuIik7CisJVFJBQ0UobW1zeXMsICJtaWRpT3V0R2V0RXJyb3JUZXh0XG4iKTsKIAlyZXQgPSBtaWRpR2V0RXJyb3JUZXh0KHVFcnJvciwgeHN0ciwgdVNpemUpOwogCWxzdHJjcHlBdG9XKGxwVGV4dCx4c3RyKTsKIAlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAseHN0cik7CkBAIC0xNzY2LDcgKzE3NjUsNyBAQAogICovCiBVSU5UMTYgV0lOQVBJIG1pZGlPdXRHZXRFcnJvclRleHQxNihVSU5UMTYgdUVycm9yLCBMUFNUUiBscFRleHQsIFVJTlQxNiB1U2l6ZSkKIHsKLSAgICAgICAgZHByaW50Zl9pbmZvKG1tc3lzLCAibWlkaU91dEdldEVycm9yVGV4dFxuIik7CisgICAgICAgIFRSQUNFKG1tc3lzLCAibWlkaU91dEdldEVycm9yVGV4dFxuIik7CiAJcmV0dXJuIG1pZGlHZXRFcnJvclRleHQodUVycm9yLCBscFRleHQsIHVTaXplKTsKIH0KIApAQCAtMTgzOSwxMCArMTgzOCwxMCBAQAogCURXT1JECWR3UmV0ID0gMDsKIAlCT09MMzIJYk1hcHBlckZsZyA9IEZBTFNFOwogCWlmIChscGhNaWRpT3V0ICE9IE5VTEwpICpscGhNaWRpT3V0ID0gMDsKLQlkcHJpbnRmX2luZm8obW1zeXMsICJtaWRpT3V0T3BlbiglcCwgJWQsICUwOGxYLCAlMDhsWCwgJTA4bFgpO1xuIiwgCisJVFJBQ0UobW1zeXMsICIoJXAsICVkLCAlMDhsWCwgJTA4bFgsICUwOGxYKTtcbiIsIAogCQlscGhNaWRpT3V0LCB1RGV2aWNlSUQsIGR3Q2FsbGJhY2ssIGR3SW5zdGFuY2UsIGR3RmxhZ3MpOwogCWlmICh1RGV2aWNlSUQgPT0gKFVJTlQxNilNSURJX01BUFBFUikgewotCQlkcHJpbnRmX2luZm8obW1zeXMsICJtaWRpT3V0T3BlbgkvLyBNSURJX01BUFBFUiBtb2RlIHJlcXVlc3RlZCAhXG4iKTsKKwkJVFJBQ0UobW1zeXMsICJNSURJX01BUFBFUiBtb2RlIHJlcXVlc3RlZCAhXG4iKTsKIAkJYk1hcHBlckZsZyA9IFRSVUU7CiAJCXVEZXZpY2VJRCA9IDA7CiAJfQpAQCAtMTg2MCw3ICsxODU5LDcgQEAKIAkJaWYgKGR3UmV0ID09IE1NU1lTRVJSX05PRVJST1IpIGJyZWFrOwogCQlpZiAoIWJNYXBwZXJGbGcpIGJyZWFrOwogCQl1RGV2aWNlSUQrKzsKLQkJZHByaW50Zl9pbmZvKG1tc3lzLCAibWlkaU91dE9wZW4JLy8gTUlESV9NQVBQRVIgbW9kZSAhIHRyeSBuZXh0IGRyaXZlci4uLlxuIik7CisJCVRSQUNFKG1tc3lzLCAiTUlESV9NQVBQRVIgbW9kZSAhIHRyeSBuZXh0IGRyaXZlci4uLlxuIik7CiAJfQogCXJldHVybiBkd1JldDsKIH0KQEAgLTE4NzksNyArMTg3OCw3IEBACiBVSU5UMTYgV0lOQVBJIG1pZGlPdXRDbG9zZTE2KEhNSURJT1VUMTYgaE1pZGlPdXQpCiB7CiAJTFBNSURJT1BFTkRFU0MJbHBEZXNjOwotCWRwcmludGZfaW5mbyhtbXN5cywgIm1pZGlPdXRDbG9zZSglMDRYKVxuIiwgaE1pZGlPdXQpOworCVRSQUNFKG1tc3lzLCAiKCUwNFgpXG4iLCBoTWlkaU91dCk7CiAJbHBEZXNjID0gKExQTUlESU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaE1pZGlPdXQpOwogCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwogCXJldHVybiBtb2RNZXNzYWdlKDAsIE1PRE1fQ0xPU0UsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgMEwsIDBMKTsKQEAgLTE5MDEsNyArMTkwMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlESUhEUiAqIGxwTWlkaU91dEhkciwgVUlOVDE2IHVTaXplKQogewogCUxQTUlESU9QRU5ERVNDCWxwRGVzYzsKLQlkcHJpbnRmX2luZm8obW1zeXMsICJtaWRpT3V0UHJlcGFyZUhlYWRlciglMDRYLCAlcCwgJWQpXG4iLCAKKwlUUkFDRShtbXN5cywgIiglMDRYLCAlcCwgJWQpXG4iLCAKIAkJCQkJaE1pZGlPdXQsIGxwTWlkaU91dEhkciwgdVNpemUpOwogCWxwRGVzYyA9IChMUE1JRElPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhNaWRpT3V0KTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKQEAgLTE5MjQsNyArMTkyMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlESUhEUiAqIGxwTWlkaU91dEhkciwgVUlOVDE2IHVTaXplKQogewogCUxQTUlESU9QRU5ERVNDCWxwRGVzYzsKLQlkcHJpbnRmX2luZm8obW1zeXMsICJtaWRpT3V0VW5wcmVwYXJlSGVhZGVyKCUwNFgsICVwLCAlZClcbiIsIAorCVRSQUNFKG1tc3lzLCAiKCUwNFgsICVwLCAlZClcbiIsIAogCQkJCQloTWlkaU91dCwgbHBNaWRpT3V0SGRyLCB1U2l6ZSk7CiAJbHBEZXNjID0gKExQTUlESU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaE1pZGlPdXQpOwogCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwpAQCAtMTk0NSw3ICsxOTQ0LDcgQEAKIFVJTlQxNiBXSU5BUEkgbWlkaU91dFNob3J0TXNnMTYoSE1JRElPVVQxNiBoTWlkaU91dCwgRFdPUkQgZHdNc2cpCiB7CiAJTFBNSURJT1BFTkRFU0MJbHBEZXNjOwotCWRwcmludGZfaW5mbyhtbXN5cywgIm1pZGlPdXRTaG9ydE1zZyglMDRYLCAlMDhsWClcbiIsIGhNaWRpT3V0LCBkd01zZyk7CisJVFJBQ0UobW1zeXMsICIoJTA0WCwgJTA4bFgpXG4iLCBoTWlkaU91dCwgZHdNc2cpOwogCWxwRGVzYyA9IChMUE1JRElPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhNaWRpT3V0KTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKIAlyZXR1cm4gbW9kTWVzc2FnZSgwLCBNT0RNX0RBVEEsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgZHdNc2csIDBMKTsKQEAgLTE5NjcsNyArMTk2Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlESUhEUiAqIGxwTWlkaU91dEhkciwgVUlOVDE2IHVTaXplKQogewogCUxQTUlESU9QRU5ERVNDCWxwRGVzYzsKLQlkcHJpbnRmX2luZm8obW1zeXMsICJtaWRpT3V0TG9uZ01zZyglMDRYLCAlcCwgJWQpXG4iLCAKKwlUUkFDRShtbXN5cywgIiglMDRYLCAlcCwgJWQpXG4iLCAKIAkJCQloTWlkaU91dCwgbHBNaWRpT3V0SGRyLCB1U2l6ZSk7CiAJbHBEZXNjID0gKExQTUlESU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaE1pZGlPdXQpOwogCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwpAQCAtMTk4OSw3ICsxOTg4LDcgQEAKIFVJTlQxNiBXSU5BUEkgbWlkaU91dFJlc2V0MTYoSE1JRElPVVQxNiBoTWlkaU91dCkKIHsKIAlMUE1JRElPUEVOREVTQwlscERlc2M7Ci0JZHByaW50Zl9pbmZvKG1tc3lzLCAibWlkaU91dFJlc2V0KCUwNFgpXG4iLCBoTWlkaU91dCk7CisJVFJBQ0UobW1zeXMsICIoJTA0WClcbiIsIGhNaWRpT3V0KTsKIAlscERlc2MgPSAoTFBNSURJT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoTWlkaU91dCk7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CiAJcmV0dXJuIG1vZE1lc3NhZ2UoMCwgTU9ETV9SRVNFVCwgbHBEZXNjLT5kd0luc3RhbmNlLCAwTCwgMEwpOwpAQCAtMjAwNyw3ICsyMDA2LDcgQEAKICAqLwogVUlOVDE2IFdJTkFQSSBtaWRpT3V0R2V0Vm9sdW1lMTYoVUlOVDE2IHVEZXZpY2VJRCwgRFdPUkQgKiBscGR3Vm9sdW1lKQogewotCWRwcmludGZfaW5mbyhtbXN5cywgIm1pZGlPdXRHZXRWb2x1bWUoJTA0WCwgJXApO1xuIiwgdURldmljZUlELCBscGR3Vm9sdW1lKTsKKwlUUkFDRShtbXN5cywgIiglMDRYLCAlcCk7XG4iLCB1RGV2aWNlSUQsIGxwZHdWb2x1bWUpOwogCXJldHVybiBtb2RNZXNzYWdlKHVEZXZpY2VJRCwgTU9ETV9HRVRWT0xVTUUsIDBMLCAoRFdPUkQpbHBkd1ZvbHVtZSwgMEwpOwogfQogCkBAIC0yMDI0LDcgKzIwMjMsNyBAQAogICovCiBVSU5UMTYgV0lOQVBJIG1pZGlPdXRTZXRWb2x1bWUxNihVSU5UMTYgdURldmljZUlELCBEV09SRCBkd1ZvbHVtZSkKIHsKLQlkcHJpbnRmX2luZm8obW1zeXMsICJtaWRpT3V0U2V0Vm9sdW1lKCUwNFgsICUwOGxYKTtcbiIsIHVEZXZpY2VJRCwgZHdWb2x1bWUpOworCVRSQUNFKG1tc3lzLCAiKCUwNFgsICUwOGxYKTtcbiIsIHVEZXZpY2VJRCwgZHdWb2x1bWUpOwogCXJldHVybiBtb2RNZXNzYWdlKHVEZXZpY2VJRCwgTU9ETV9TRVRWT0xVTUUsIDBMLCBkd1ZvbHVtZSwgMEwpOwogfQogCkBAIC0yMDg1LDcgKzIwODQsNyBAQAogICovCiBVSU5UMTYgV0lOQVBJIG1pZGlPdXRHZXRJRDE2KEhNSURJT1VUMTYgaE1pZGlPdXQsIFVJTlQxNiAqIGxwdURldmljZUlEKQogewotCWRwcmludGZfaW5mbyhtbXN5cywgIm1pZGlPdXRHZXRJRFxuIik7CisJVFJBQ0UobW1zeXMsICJtaWRpT3V0R2V0SURcbiIpOwogCXJldHVybiAwOwogfQogCkBAIC0yMDk3LDcgKzIwOTYsNyBAQAogewogCUxQTUlESU9QRU5ERVNDCWxwRGVzYzsKIAotCWRwcmludGZfaW5mbyhtbXN5cywgIm1pZGlPdXRNZXNzYWdlKCUwNFgsICUwNFgsICUwOGxYLCAlMDhsWClcbiIsIAorCVRSQUNFKG1tc3lzLCAiKCUwNFgsICUwNFgsICUwOGxYLCAlMDhsWClcbiIsIAogCQkJaE1pZGlPdXQsIHVNZXNzYWdlLCBkd1BhcmFtMSwgZHdQYXJhbTIpOwogCWxwRGVzYyA9IChMUE1JRElPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhNaWRpT3V0KTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKQEAgLTIxMzQsNyArMjEzMyw3IEBACiB7CiAJTFBNSURJT1BFTkRFU0MJbHBEZXNjOwogCi0JZHByaW50Zl9pbmZvKG1tc3lzLCAibWlkaU91dE1lc3NhZ2UoJTA0WCwgJTA0WCwgJTA4bFgsICUwOGxYKVxuIiwgCisJVFJBQ0UobW1zeXMsICIoJTA0WCwgJTA0WCwgJTA4bFgsICUwOGxYKVxuIiwgCiAJCQloTWlkaU91dCwgdU1lc3NhZ2UsIGR3UGFyYW0xLCBkd1BhcmFtMik7CiAJbHBEZXNjID0gKExQTUlESU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaE1pZGlPdXQpOwogCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwpAQCAtMjE3OSw5ICsyMTc4LDkgQEAKIFVJTlQxNiBXSU5BUEkgbWlkaUluR2V0TnVtRGV2czE2KHZvaWQpCiB7CiAJVUlOVDE2CWNvdW50ID0gMDsKLQlkcHJpbnRmX2luZm8obW1zeXMsICJtaWRpSW5HZXROdW1EZXZzXG4iKTsKKwlUUkFDRShtbXN5cywgIm1pZGlJbkdldE51bURldnNcbiIpOwogCWNvdW50ICs9IG1pZE1lc3NhZ2UoMCwgTUlETV9HRVROVU1ERVZTLCAwTCwgMEwsIDBMKTsKLQlkcHJpbnRmX2luZm8obW1zeXMsICJtaWRpSW5HZXROdW1EZXZzIHJldHVybiAldSBcbiIsIGNvdW50KTsKKwlUUkFDRShtbXN5cywgIm1pZGlJbkdldE51bURldnMgcmV0dXJuICV1IFxuIiwgY291bnQpOwogCXJldHVybiBjb3VudDsKIH0KIApAQCAtMjIyNSw3ICsyMjI0LDcgQEAKIFVJTlQxNiBXSU5BUEkgbWlkaUluR2V0RGV2Q2FwczE2KFVJTlQxNiB1RGV2aWNlSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBNSURJSU5DQVBTMTYgbHBDYXBzLCBVSU5UMTYgdVNpemUpCiB7Ci0JZHByaW50Zl9pbmZvKG1tc3lzLCAibWlkaUluR2V0RGV2Q2Fwc1xuIik7CisJVFJBQ0UobW1zeXMsICJtaWRpSW5HZXREZXZDYXBzXG4iKTsKIAlyZXR1cm4gbWlkTWVzc2FnZSh1RGV2aWNlSUQsTUlETV9HRVRERVZDQVBTLDAsKERXT1JEKWxwQ2Fwcyx1U2l6ZSk7OwogfQogCkBAIC0yMjUzLDcgKzIyNTIsNyBAQAogICovCiBVSU5UMTYgV0lOQVBJIG1pZGlJbkdldEVycm9yVGV4dDE2KFVJTlQxNiB1RXJyb3IsIExQU1RSIGxwVGV4dCwgVUlOVDE2IHVTaXplKQogewotCWRwcmludGZfaW5mbyhtbXN5cywgIm1pZGlJbkdldEVycm9yVGV4dFxuIik7CisJVFJBQ0UobW1zeXMsICJtaWRpSW5HZXRFcnJvclRleHRcbiIpOwogCXJldHVybiAobWlkaUdldEVycm9yVGV4dCh1RXJyb3IsIGxwVGV4dCwgdVNpemUpKTsKIH0KIApAQCAtMjI4MSwxMCArMjI4MCwxMCBAQAogCUJPT0wzMgliTWFwcGVyRmxnID0gRkFMU0U7CiAKIAlpZiAobHBoTWlkaUluICE9IE5VTEwpICpscGhNaWRpSW4gPSAwOwotCWRwcmludGZfaW5mbyhtbXN5cywgIm1pZGlJbk9wZW4oJXAsICVkLCAlMDhsWCwgJTA4bFgsICUwOGxYKTtcbiIsIAorCVRSQUNFKG1tc3lzLCAiKCVwLCAlZCwgJTA4bFgsICUwOGxYLCAlMDhsWCk7XG4iLCAKIAkJbHBoTWlkaUluLCB1RGV2aWNlSUQsIGR3Q2FsbGJhY2ssIGR3SW5zdGFuY2UsIGR3RmxhZ3MpOwogCWlmICh1RGV2aWNlSUQgPT0gKFVJTlQxNilNSURJX01BUFBFUikgewotCQlkcHJpbnRmX2luZm8obW1zeXMsICJtaWRpSW5PcGVuCS8vIE1JRElfTUFQUEVSIG1vZGUgcmVxdWVzdGVkICFcbiIpOworCQlUUkFDRShtbXN5cywgIk1JRElfTUFQUEVSIG1vZGUgcmVxdWVzdGVkICFcbiIpOwogCQliTWFwcGVyRmxnID0gVFJVRTsKIAkJdURldmljZUlEID0gMDsKIAl9CkBAIC0yMzAxLDcgKzIzMDAsNyBAQAogCQlpZiAoZHdSZXQgPT0gTU1TWVNFUlJfTk9FUlJPUikgYnJlYWs7CiAJCWlmICghYk1hcHBlckZsZykgYnJlYWs7CiAJCXVEZXZpY2VJRCsrOwotCQlkcHJpbnRmX2luZm8obW1zeXMsICJtaWRpSW5PcGVuCS8vIE1JRElfTUFQUEVSIG1vZGUgISB0cnkgbmV4dCBkcml2ZXIuLi5cbiIpOworCQlUUkFDRShtbXN5cywgIk1JRElfTUFQUEVSIG1vZGUgISB0cnkgbmV4dCBkcml2ZXIuLi5cbiIpOwogCX0KIAlyZXR1cm4gZHdSZXQ7CiB9CkBAIC0yMzIwLDcgKzIzMTksNyBAQAogVUlOVDE2IFdJTkFQSSBtaWRpSW5DbG9zZTE2KEhNSURJSU4xNiBoTWlkaUluKQogewogCUxQTUlESU9QRU5ERVNDCWxwRGVzYzsKLQlkcHJpbnRmX2luZm8obW1zeXMsICJtaWRpSW5DbG9zZSglMDRYKVxuIiwgaE1pZGlJbik7CisJVFJBQ0UobW1zeXMsICIoJTA0WClcbiIsIGhNaWRpSW4pOwogCWxwRGVzYyA9IChMUE1JRElPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhNaWRpSW4pOwogCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwogCXJldHVybiBtaWRNZXNzYWdlKDAsIE1JRE1fQ0xPU0UsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgMEwsIDBMKTsKQEAgLTIzNDIsNyArMjM0MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSURJSERSICogbHBNaWRpSW5IZHIsIFVJTlQxNiB1U2l6ZSkKIHsKIAlMUE1JRElPUEVOREVTQwlscERlc2M7Ci0JZHByaW50Zl9pbmZvKG1tc3lzLCAibWlkaUluUHJlcGFyZUhlYWRlciglMDRYLCAlcCwgJWQpXG4iLCAKKwlUUkFDRShtbXN5cywgIiglMDRYLCAlcCwgJWQpXG4iLCAKIAkJCQkJaE1pZGlJbiwgbHBNaWRpSW5IZHIsIHVTaXplKTsKIAlscERlc2MgPSAoTFBNSURJT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoTWlkaUluKTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKQEAgLTIzNjYsNyArMjM2NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JRElIRFIgKiBscE1pZGlJbkhkciwgVUlOVDE2IHVTaXplKQogewogCUxQTUlESU9QRU5ERVNDCWxwRGVzYzsKLQlkcHJpbnRmX2luZm8obW1zeXMsICJtaWRpSW5VbnByZXBhcmVIZWFkZXIoJTA0WCwgJXAsICVkKVxuIiwgCisJVFJBQ0UobW1zeXMsICIoJTA0WCwgJXAsICVkKVxuIiwgCiAJCQkJCWhNaWRpSW4sIGxwTWlkaUluSGRyLCB1U2l6ZSk7CiAJbHBEZXNjID0gKExQTUlESU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaE1pZGlJbik7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CkBAIC0yMzg5LDcgKzIzODgsNyBAQAogVUlOVDE2IFdJTkFQSSBtaWRpSW5BZGRCdWZmZXIxNihITUlESUlOMTYgaE1pZGlJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlESUhEUiAqIGxwTWlkaUluSGRyLCBVSU5UMTYgdVNpemUpCiB7Ci0JZHByaW50Zl9pbmZvKG1tc3lzLCAibWlkaUluQWRkQnVmZmVyXG4iKTsKKwlUUkFDRShtbXN5cywgIm1pZGlJbkFkZEJ1ZmZlclxuIik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI0MDYsNyArMjQwNSw3IEBACiAgKi8KIFVJTlQxNiBXSU5BUEkgbWlkaUluU3RhcnQxNihITUlESUlOMTYgaE1pZGlJbikKIHsKLQlkcHJpbnRmX2luZm8obW1zeXMsICJtaWRpSW5TdGFydFxuIik7CisJVFJBQ0UobW1zeXMsICJtaWRpSW5TdGFydFxuIik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI0MjMsNyArMjQyMiw3IEBACiAgKi8KIFVJTlQxNiBXSU5BUEkgbWlkaUluU3RvcDE2KEhNSURJSU4xNiBoTWlkaUluKQogewotCWRwcmludGZfaW5mbyhtbXN5cywgIm1pZGlJblN0b3BcbiIpOworCVRSQUNFKG1tc3lzLCAibWlkaUluU3RvcFxuIik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI0NDAsNyArMjQzOSw3IEBACiAgKi8KIFVJTlQxNiBXSU5BUEkgbWlkaUluUmVzZXQxNihITUlESUlOMTYgaE1pZGlJbikKIHsKLQlkcHJpbnRmX2luZm8obW1zeXMsICJtaWRpSW5SZXNldFxuIik7CisJVFJBQ0UobW1zeXMsICJtaWRpSW5SZXNldFxuIik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI0NDksNyArMjQ0OCw3IEBACiAgKi8KIFVJTlQzMiBXSU5BUEkgbWlkaUluR2V0SUQzMihITUlESUlOMzIgaE1pZGlJbiwgVUlOVDMyICogbHB1RGV2aWNlSUQpCiB7Ci0JZHByaW50Zl9pbmZvKG1tc3lzLCAibWlkaUluR2V0SURcbiIpOworCVRSQUNFKG1tc3lzLCAibWlkaUluR2V0SURcbiIpOwogCXJldHVybiAwOwogfQogCkBAIC0yNDU4LDcgKzI0NTcsNyBAQAogICovCiBVSU5UMTYgV0lOQVBJIG1pZGlJbkdldElEMTYoSE1JRElJTjE2IGhNaWRpSW4sIFVJTlQxNiAqIGxwdURldmljZUlEKQogewotCWRwcmludGZfaW5mbyhtbXN5cywgIm1pZGlJbkdldElEXG4iKTsKKwlUUkFDRShtbXN5cywgIm1pZGlJbkdldElEXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjQ2OSw3ICsyNDY4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yKQogewogCUxQTUlESU9QRU5ERVNDCWxwRGVzYzsKLQlkcHJpbnRmX2luZm8obW1zeXMsICJtaWRpSW5NZXNzYWdlKCUwNFgsICUwNFgsICUwOGxYLCAlMDhsWClcbiIsIAorCVRSQUNFKG1tc3lzLCAiKCUwNFgsICUwNFgsICUwOGxYLCAlMDhsWClcbiIsIAogCQkJaE1pZGlJbiwgdU1lc3NhZ2UsIGR3UGFyYW0xLCBkd1BhcmFtMik7CiAJbHBEZXNjID0gKExQTUlESU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaE1pZGlJbik7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CkBAIC0yNTA4LDcgKzI1MDcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIpCiB7CiAJTFBNSURJT1BFTkRFU0MJbHBEZXNjOwotCWRwcmludGZfaW5mbyhtbXN5cywgIm1pZGlJbk1lc3NhZ2UoJTA0WCwgJTA0WCwgJTA4bFgsICUwOGxYKVxuIiwgCisJVFJBQ0UobW1zeXMsICIoJTA0WCwgJTA0WCwgJTA4bFgsICUwOGxYKVxuIiwgCiAJCQloTWlkaUluLCB1TWVzc2FnZSwgZHdQYXJhbTEsIGR3UGFyYW0yKTsKIAlscERlc2MgPSAoTFBNSURJT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoTWlkaUluKTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKQEAgLTI1NTQsOSArMjU1Myw5IEBACiBVSU5UMTYgV0lOQVBJIHdhdmVPdXRHZXROdW1EZXZzMTYoKQogewogCVVJTlQxNgljb3VudCA9IDA7Ci0JZHByaW50Zl9pbmZvKG1tc3lzLCAid2F2ZU91dEdldE51bURldnNcbiIpOworCVRSQUNFKG1tc3lzLCAid2F2ZU91dEdldE51bURldnNcbiIpOwogCWNvdW50ICs9IHdvZE1lc3NhZ2UoIE1NU1lTVEVNX0ZpcnN0RGV2SUQoKSwgV09ETV9HRVROVU1ERVZTLCAwTCwgMEwsIDBMKTsKLQlkcHJpbnRmX2luZm8obW1zeXMsICJ3YXZlT3V0R2V0TnVtRGV2cyByZXR1cm4gJXUgXG4iLCBjb3VudCk7CisJVFJBQ0UobW1zeXMsICJ3YXZlT3V0R2V0TnVtRGV2cyByZXR1cm4gJXUgXG4iLCBjb3VudCk7CiAJcmV0dXJuIGNvdW50OwogfQogCkBAIC0yNTY4LDcgKzI1NjcsNyBAQAogewogCWlmICh1RGV2aWNlSUQgPiB3YXZlT3V0R2V0TnVtRGV2czE2KCkgLSAxKSByZXR1cm4gTU1TWVNFUlJfQkFEREVWSUNFSUQ7CiAJaWYgKHVEZXZpY2VJRCA9PSAoVUlOVDE2KVdBVkVfTUFQUEVSKSByZXR1cm4gTU1TWVNFUlJfQkFEREVWSUNFSUQ7IC8qIEZJWE1FOiBkbyB3ZSBoYXZlIGEgd2F2ZSBtYXBwZXIgPyAqLwotCWRwcmludGZfaW5mbyhtbXN5cywgIndhdmVPdXRHZXREZXZDYXBzXG4iKTsKKwlUUkFDRShtbXN5cywgIndhdmVPdXRHZXREZXZDYXBzXG4iKTsKIAlyZXR1cm4gd29kTWVzc2FnZSh1RGV2aWNlSUQsIFdPRE1fR0VUREVWQ0FQUywgMEwsIChEV09SRClscENhcHMsIHVTaXplKTsKIH0KIApAQCAtMjYxNSw3ICsyNjE0LDcgQEAKICAqLwogVUlOVDE2IFdJTkFQSSB3YXZlT3V0R2V0RXJyb3JUZXh0MTYoVUlOVDE2IHVFcnJvciwgTFBTVFIgbHBUZXh0LCBVSU5UMTYgdVNpemUpCiB7Ci0JZHByaW50Zl9pbmZvKG1tc3lzLCAid2F2ZU91dEdldEVycm9yVGV4dFxuIik7CisJVFJBQ0UobW1zeXMsICJ3YXZlT3V0R2V0RXJyb3JUZXh0XG4iKTsKIAlyZXR1cm4od2F2ZUdldEVycm9yVGV4dCh1RXJyb3IsIGxwVGV4dCwgdVNpemUpKTsKIH0KIApAQCAtMjY0Nyw3ICsyNjQ2LDcgQEAKIHN0YXRpYyBVSU5UMTYgd2F2ZUdldEVycm9yVGV4dChVSU5UMTYgdUVycm9yLCBMUFNUUiBscFRleHQsIFVJTlQxNiB1U2l6ZSkKIHsKIAlMUFNUUgltc2dwdHI7Ci0JZHByaW50Zl9pbmZvKG1tc3lzLCAid2F2ZUdldEVycm9yVGV4dCglMDRYLCAlcCwgJWQpO1xuIiwgCisJVFJBQ0UobW1zeXMsICIoJTA0WCwgJXAsICVkKTtcbiIsIAogCSAgICAgICB1RXJyb3IsIGxwVGV4dCwgdVNpemUpOwogCWlmICgobHBUZXh0ID09IE5VTEwpIHx8ICh1U2l6ZSA8IDEpKSByZXR1cm4oRkFMU0UpOwogCWxwVGV4dFswXSA9ICdcMCc7CkBAIC0yNzMzLDEyICsyNzMyLDEyIEBACiAJRFdPUkQJCWR3UmV0ID0gMDsKIAlCT09MMzIJCWJNYXBwZXJGbGcgPSBGQUxTRTsKIAotCWRwcmludGZfaW5mbyhtbXN5cywgIndhdmVPdXRPcGVuKCVwLCAlZCwgJXAsICUwOGxYLCAlMDhsWCwgJTA4bFgpO1xuIiwgCisJVFJBQ0UobW1zeXMsICIoJXAsICVkLCAlcCwgJTA4bFgsICUwOGxYLCAlMDhsWCk7XG4iLCAKIAkJbHBoV2F2ZU91dCwgdURldmljZUlELCBscEZvcm1hdCwgZHdDYWxsYmFjaywgZHdJbnN0YW5jZSwgZHdGbGFncyk7CiAJaWYgKGR3RmxhZ3MgJiBXQVZFX0ZPUk1BVF9RVUVSWSkKLQkJZHByaW50Zl9pbmZvKG1tc3lzLCAid2F2ZU91dE9wZW4JLy8gV0FWRV9GT1JNQVRfUVVFUlkgcmVxdWVzdGVkICFcbiIpOworCQlUUkFDRShtbXN5cywgIldBVkVfRk9STUFUX1FVRVJZIHJlcXVlc3RlZCAhXG4iKTsKIAlpZiAodURldmljZUlEID09IChVSU5UMTYpV0FWRV9NQVBQRVIpIHsKLQkJZHByaW50Zl9pbmZvKG1tc3lzLCAid2F2ZU91dE9wZW4JLy8gV0FWRV9NQVBQRVIgbW9kZSByZXF1ZXN0ZWQgIVxuIik7CisJCVRSQUNFKG1tc3lzLCAiV0FWRV9NQVBQRVIgbW9kZSByZXF1ZXN0ZWQgIVxuIik7CiAJCWJNYXBwZXJGbGcgPSBUUlVFOwogCQl1RGV2aWNlSUQgPSAwOwogCX0KQEAgLTI3NjAsMTEgKzI3NTksMTEgQEAKIAkJaWYgKGR3UmV0ID09IE1NU1lTRVJSX05PRVJST1IpIGJyZWFrOwogCQlpZiAoIWJNYXBwZXJGbGcpIGJyZWFrOwogCQl1RGV2aWNlSUQrKzsKLQkJZHByaW50Zl9pbmZvKG1tc3lzLCAid2F2ZU91dE9wZW4JLy8gV0FWRV9NQVBQRVIgbW9kZSAhIHRyeSBuZXh0IGRyaXZlci4uLlxuIik7CisJCVRSQUNFKG1tc3lzLCAiV0FWRV9NQVBQRVIgbW9kZSAhIHRyeSBuZXh0IGRyaXZlci4uLlxuIik7CiAJfQogCWxwRGVzYy0+dURldmljZUlEID0gdURldmljZUlEOyAgLyogc2F2ZSBwaHlzaWNhbCBEZXZpY2UgSUQgKi8KIAlpZiAoZHdGbGFncyAmIFdBVkVfRk9STUFUX1FVRVJZKSB7Ci0JCWRwcmludGZfaW5mbyhtbXN5cywgIndhdmVPdXRPcGVuCS8vIEVuZCBvZiBXQVZFX0ZPUk1BVF9RVUVSWSAhXG4iKTsKKwkJVFJBQ0UobW1zeXMsICJFbmQgb2YgV0FWRV9GT1JNQVRfUVVFUlkgIVxuIik7CiAJCWR3UmV0ID0gd2F2ZU91dENsb3NlMzIoaFdhdmVPdXQpOwogCX0KIAlyZXR1cm4gZHdSZXQ7CkBAIC0yNzg0LDcgKzI3ODMsNyBAQAogewogCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsKIAotCWRwcmludGZfaW5mbyhtbXN5cywgIndhdmVPdXRDbG9zZSglMDRYKVxuIiwgaFdhdmVPdXQpOworCVRSQUNFKG1tc3lzLCAiKCUwNFgpXG4iLCBoV2F2ZU91dCk7CiAJbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVPdXQpOwogCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwogCXJldHVybiB3b2RNZXNzYWdlKCBscERlc2MtPnVEZXZpY2VJRCwgV09ETV9DTE9TRSwgbHBEZXNjLT5kd0luc3RhbmNlLCAwTCwgMEwpOwpAQCAtMjc5OCw3ICsyNzk3LDcgQEAKIHsKIAlMUFdBVkVPUEVOREVTQwlscERlc2M7CiAKLQlkcHJpbnRmX2luZm8obW1zeXMsICJ3YXZlT3V0UHJlcGFyZUhlYWRlciglMDRYLCAlcCwgJXUpO1xuIiwgCisJVFJBQ0UobW1zeXMsICIoJTA0WCwgJXAsICV1KTtcbiIsIAogCQkJCQloV2F2ZU91dCwgbHBXYXZlT3V0SGRyLCB1U2l6ZSk7CiAJbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVPdXQpOwogCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwpAQCAtMjgxNSw3ICsyODE0LDcgQEAKIAlMUEJZVEUJCXNhdmVkZGF0YSA9IGxwV2F2ZU91dEhkci0+bHBEYXRhOwogCVVJTlQxNgkJcmV0OwogCi0JZHByaW50Zl9pbmZvKG1tc3lzLCAid2F2ZU91dFByZXBhcmVIZWFkZXIoJTA0WCwgJXAsICV1KTtcbiIsIAorCVRSQUNFKG1tc3lzLCAiKCUwNFgsICVwLCAldSk7XG4iLCAKIAkJCQkJaFdhdmVPdXQsIGxwV2F2ZU91dEhkciwgdVNpemUpOwogCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlT3V0KTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKQEAgLTI4MzQsNyArMjgzMyw3IEBACiB7CiAJTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwogCi0JZHByaW50Zl9pbmZvKG1tc3lzLCAid2F2ZU91dFVucHJlcGFyZUhlYWRlciglMDRYLCAlcCwgJXUpO1xuIiwgCisJVFJBQ0UobW1zeXMsICIoJTA0WCwgJXAsICV1KTtcbiIsIAogCQkJCQkJaFdhdmVPdXQsIGxwV2F2ZU91dEhkciwgdVNpemUpOwogCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlT3V0KTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKQEAgLTI4NTEsNyArMjg1MCw3IEBACiAJTFBCWVRFCQlzYXZlZGRhdGEgPSBscFdhdmVPdXRIZHItPmxwRGF0YTsKIAlVSU5UMTYJCXJldDsKIAotCWRwcmludGZfaW5mbyhtbXN5cywgIndhdmVPdXRVbnByZXBhcmVIZWFkZXIoJTA0WCwgJXAsICV1KTtcbiIsIAorCVRSQUNFKG1tc3lzLCAiKCUwNFgsICVwLCAldSk7XG4iLCAKIAkJCQkJCWhXYXZlT3V0LCBscFdhdmVPdXRIZHIsIHVTaXplKTsKIAlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZU91dCk7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CkBAIC0yODY5LDcgKzI4NjgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMzIgdVNpemUpCiB7CiAJTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwotCWRwcmludGZfaW5mbyhtbXN5cywgIndhdmVPdXRXcml0ZSglMDRYLCAlcCwgJXUpO1xuIiwgaFdhdmVPdXQsIGxwV2F2ZU91dEhkciwgdVNpemUpOworCVRSQUNFKG1tc3lzLCAiKCUwNFgsICVwLCAldSk7XG4iLCBoV2F2ZU91dCwgbHBXYXZlT3V0SGRyLCB1U2l6ZSk7CiAJbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVPdXQpOwogCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwogCWxwV2F2ZU91dEhkci0+cmVzZXJ2ZWQgPSAoRFdPUkQpbHBXYXZlT3V0SGRyLT5scERhdGE7CkBAIC0yODg0LDcgKzI4ODMsNyBAQAogCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsKIAlVSU5UMTYJCXJldDsKIAotCWRwcmludGZfaW5mbyhtbXN5cywgIndhdmVPdXRXcml0ZSglMDRYLCAlcCwgJXUpO1xuIiwgaFdhdmVPdXQsIGxwV2F2ZU91dEhkciwgdVNpemUpOworCVRSQUNFKG1tc3lzLCAiKCUwNFgsICVwLCAldSk7XG4iLCBoV2F2ZU91dCwgbHBXYXZlT3V0SGRyLCB1U2l6ZSk7CiAJbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVPdXQpOwogCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwogCWxwV2F2ZU91dEhkci0+cmVzZXJ2ZWQ9KERXT1JEKWxwV2F2ZU91dEhkci0+bHBEYXRhOy8qc2F2ZSBvcmlnaW5hbCBwdHIqLwpAQCAtMjkwOSw3ICsyOTA4LDcgQEAKIHsKIAlMUFdBVkVPUEVOREVTQwlscERlc2M7CiAKLQlkcHJpbnRmX2luZm8obW1zeXMsICJ3YXZlT3V0UGF1c2UoJTA0WClcbiIsIGhXYXZlT3V0KTsKKwlUUkFDRShtbXN5cywgIiglMDRYKVxuIiwgaFdhdmVPdXQpOwogCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlT3V0KTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKIAlyZXR1cm4gd29kTWVzc2FnZSggbHBEZXNjLT51RGV2aWNlSUQsIFdPRE1fUEFVU0UsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgMEwsIDBMKTsKQEAgLTI5MjksNyArMjkyOCw3IEBACiB7CiAJTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwogCi0JZHByaW50Zl9pbmZvKG1tc3lzLCAid2F2ZU91dFJlc3RhcnQoJTA0WClcbiIsIGhXYXZlT3V0KTsKKwlUUkFDRShtbXN5cywgIiglMDRYKVxuIiwgaFdhdmVPdXQpOwogCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlT3V0KTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKIAlyZXR1cm4gd29kTWVzc2FnZSggbHBEZXNjLT51RGV2aWNlSUQsIFdPRE1fUkVTVEFSVCwgbHBEZXNjLT5kd0luc3RhbmNlLCAwTCwgMEwpOwpAQCAtMjk0OSw3ICsyOTQ4LDcgQEAKIFVJTlQxNiBXSU5BUEkgd2F2ZU91dFJlc2V0MTYoSFdBVkVPVVQxNiBoV2F2ZU91dCkKIHsKIAlMUFdBVkVPUEVOREVTQwlscERlc2M7Ci0JZHByaW50Zl9pbmZvKG1tc3lzLCAid2F2ZU91dFJlc2V0KCUwNFgpXG4iLCBoV2F2ZU91dCk7CisJVFJBQ0UobW1zeXMsICIoJTA0WClcbiIsIGhXYXZlT3V0KTsKIAlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZU91dCk7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CiAJcmV0dXJuIHdvZE1lc3NhZ2UoIGxwRGVzYy0+dURldmljZUlELCBXT0RNX1JFU0VULCBscERlc2MtPmR3SW5zdGFuY2UsIDBMLCAwTCk7CkBAIC0yOTYyLDcgKzI5NjEsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIHVTaXplKQogewogCU1NVElNRTE2CW1tdDE2OwotCVVJTlQzMiByZXQgPSB3YXZlT3V0R2V0UG9zaXRpb24xNihoV2F2ZU91dCwmbW10MTYsc2l6ZW9mKG1tdDE2KSk7CisJVUlOVDMyIHJldDsKKwkKKwltbXQxNi53VHlwZSA9IGxwVGltZS0+d1R5cGU7CisJcmV0ID0gd2F2ZU91dEdldFBvc2l0aW9uMTYoaFdhdmVPdXQsJm1tdDE2LHNpemVvZihtbXQxNikpOwogCU1NU1lTVEVNX01NVElNRTE2dG8zMihscFRpbWUsJm1tdDE2KTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjk3Myw3ICsyOTc1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IHVTaXplKQogewogCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsKLQlkcHJpbnRmX2luZm8obW1zeXMsICJ3YXZlT3V0R2V0UG9zaXRpb24oJTA0WCwgJXAsICV1KTtcbiIsIGhXYXZlT3V0LCBscFRpbWUsIHVTaXplKTsKKwlUUkFDRShtbXN5cywgIiglMDRYLCAlcCwgJXUpO1xuIiwgaFdhdmVPdXQsIGxwVGltZSwgdVNpemUpOwogCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlT3V0KTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKIAlyZXR1cm4gd29kTWVzc2FnZSggbHBEZXNjLT51RGV2aWNlSUQsIFdPRE1fR0VUUE9TLCBscERlc2MtPmR3SW5zdGFuY2UsIApAQCAtMjk4OCw3ICsyOTkwLDcgQEAKIFVJTlQxNiBXSU5BUEkgd2F2ZU91dCMjeHgjIzE2KEhXQVZFT1VUMTYgaFdhdmVPdXQsIGF0eXBlIHgpCQlcCiB7CQkJCQkJCQkJXAogCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsJCQkJCQlcCi0JZHByaW50Zl9pbmZvKG1tc3lzLCAid2F2ZU91dCIjeHgiKCUwNFgsICUwOGx4KTtcbiIsIGhXYXZlT3V0LChEV09SRCl4KTtcCisJVFJBQ0UobW1zeXMsICJ3YXZlT3V0IiN4eCIoJTA0WCwgJTA4bHgpO1xuIiwgaFdhdmVPdXQsKERXT1JEKXgpO1wKIAlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZU91dCk7CQlcCiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CQlcCiAJcmV0dXJuIHdvZE1lc3NhZ2UobHBEZXNjLT51RGV2aWNlSUQsIFdPRE1fIyNYWCwgbHBEZXNjLT5kd0luc3RhbmNlLFwKQEAgLTMwMDcsNyArMzAwOSw3IEBACiB9CQkJCQkJCQkJXAogVUlOVDE2IFdJTkFQSSB3YXZlT3V0IyN4eCMjMTYoVUlOVDE2IGRldmlkLCBhdHlwZSB4KQkJCVwKIHsJCQkJCQkJCQlcCi0JZHByaW50Zl9pbmZvKG1tc3lzLCAid2F2ZU91dCIjeHgiKCUwNFgsICUwOGx4KTtcbiIsIGRldmlkLChEV09SRCl4KTsJXAorCVRSQUNFKG1tc3lzLCAid2F2ZU91dCIjeHgiKCUwNFgsICUwOGx4KTtcbiIsIGRldmlkLChEV09SRCl4KTsJXAogCXJldHVybiB3b2RNZXNzYWdlKGRldmlkLCBXT0RNXyMjWFgsIDBMLAkoRFdPUkQpeCwgMEwpOwkJXAogfQogCQpAQCAtMzAyOCw3ICszMDMwLDcgQEAKICAqLwogVUlOVDE2IFdJTkFQSSB3YXZlT3V0QnJlYWtMb29wMTYoSFdBVkVPVVQxNiBoV2F2ZU91dCkKIHsKLQlkcHJpbnRmX2luZm8obW1zeXMsICJ3YXZlT3V0QnJlYWtMb29wKCUwNFgpXG4iLCBoV2F2ZU91dCk7CisJVFJBQ0UobW1zeXMsICIoJTA0WClcbiIsIGhXYXZlT3V0KTsKIAlyZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CiB9CiAKQEAgLTMwMzgsNyArMzA0MCw3IEBACiBVSU5UMzIgV0lOQVBJIHdhdmVPdXRHZXRJRDMyKEhXQVZFT1VUMzIgaFdhdmVPdXQsIFVJTlQzMiAqIGxwdURldmljZUlEKQogewogCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsKLQlkcHJpbnRmX2luZm8obW1zeXMsICJ3YXZlT3V0R2V0SUQoJTA0WCwgJXApO1xuIiwgaFdhdmVPdXQsIGxwdURldmljZUlEKTsKKwlUUkFDRShtbXN5cywgIiglMDRYLCAlcCk7XG4iLCBoV2F2ZU91dCwgbHB1RGV2aWNlSUQpOwogCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlT3V0KTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKIAlpZiAobHB1RGV2aWNlSUQgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwpAQCAtMzA1MSw3ICszMDUzLDcgQEAKIFVJTlQxNiBXSU5BUEkgd2F2ZU91dEdldElEMTYoSFdBVkVPVVQxNiBoV2F2ZU91dCwgVUlOVDE2ICogbHB1RGV2aWNlSUQpCiB7CiAJTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwotCWRwcmludGZfaW5mbyhtbXN5cywgIndhdmVPdXRHZXRJRCglMDRYLCAlcCk7XG4iLCBoV2F2ZU91dCwgbHB1RGV2aWNlSUQpOworCVRSQUNFKG1tc3lzLCAiKCUwNFgsICVwKTtcbiIsIGhXYXZlT3V0LCBscHVEZXZpY2VJRCk7CiAJbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVPdXQpOwogCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwogCWlmIChscHVEZXZpY2VJRCA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CkBAIC0zMTY1LDkgKzMxNjcsOSBAQAogVUlOVDE2IFdJTkFQSSB3YXZlSW5HZXROdW1EZXZzMTYoKQogewogCVVJTlQxNgljb3VudCA9IDA7Ci0JZHByaW50Zl9pbmZvKG1tc3lzLCAid2F2ZUluR2V0TnVtRGV2c1xuIik7CisJVFJBQ0UobW1zeXMsICJ3YXZlSW5HZXROdW1EZXZzXG4iKTsKIAljb3VudCArPSB3aWRNZXNzYWdlKDAsIFdJRE1fR0VUTlVNREVWUywgMEwsIDBMLCAwTCk7Ci0JZHByaW50Zl9pbmZvKG1tc3lzLCAid2F2ZUluR2V0TnVtRGV2cyByZXR1cm4gJXUgXG4iLCBjb3VudCk7CisJVFJBQ0UobW1zeXMsICJ3YXZlSW5HZXROdW1EZXZzIHJldHVybiAldSBcbiIsIGNvdW50KTsKIAlyZXR1cm4gY291bnQ7CiB9CiAKQEAgLTMyMDksNyArMzIxMSw3IEBACiAgKi8KIFVJTlQxNiBXSU5BUEkgd2F2ZUluR2V0RGV2Q2FwczE2KFVJTlQxNiB1RGV2aWNlSUQsIExQV0FWRUlOQ0FQUzE2IGxwQ2FwcywgVUlOVDE2IHVTaXplKQogewotCWRwcmludGZfaW5mbyhtbXN5cywgIndhdmVJbkdldERldkNhcHNcbiIpOworCVRSQUNFKG1tc3lzLCAid2F2ZUluR2V0RGV2Q2Fwc1xuIik7CiAJcmV0dXJuIHdpZE1lc3NhZ2UodURldmljZUlELCBXSURNX0dFVERFVkNBUFMsIDBMLCAoRFdPUkQpbHBDYXBzLCB1U2l6ZSk7CiB9CiAKQEAgLTMyMTgsNyArMzIyMCw3IEBACiAgKi8KIFVJTlQzMiBXSU5BUEkgd2F2ZUluR2V0RXJyb3JUZXh0MzJBKFVJTlQzMiB1RXJyb3IsIExQU1RSIGxwVGV4dCwgVUlOVDMyIHVTaXplKQogewotICAgZHByaW50Zl9pbmZvKG1tc3lzLCAid2F2ZUluR2V0RXJyb3JUZXh0XG4iKTsKKyAgIFRSQUNFKG1tc3lzLCAid2F2ZUluR2V0RXJyb3JUZXh0XG4iKTsKICAgIHJldHVybih3YXZlR2V0RXJyb3JUZXh0KHVFcnJvciwgbHBUZXh0LCB1U2l6ZSkpOwogfQogCkBAIC0zMjQwLDcgKzMyNDIsNyBAQAogICovCiBVSU5UMTYgV0lOQVBJIHdhdmVJbkdldEVycm9yVGV4dDE2KFVJTlQxNiB1RXJyb3IsIExQU1RSIGxwVGV4dCwgVUlOVDE2IHVTaXplKQogewotICAgZHByaW50Zl9pbmZvKG1tc3lzLCAid2F2ZUluR2V0RXJyb3JUZXh0XG4iKTsKKyAgIFRSQUNFKG1tc3lzLCAid2F2ZUluR2V0RXJyb3JUZXh0XG4iKTsKICAgIHJldHVybih3YXZlR2V0RXJyb3JUZXh0KHVFcnJvciwgbHBUZXh0LCB1U2l6ZSkpOwogfQogCkBAIC0zMjY5LDEyICszMjcxLDEyIEBACiAJTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwogCURXT1JECWR3UmV0ID0gMDsKIAlCT09MMzIJYk1hcHBlckZsZyA9IEZBTFNFOwotCWRwcmludGZfaW5mbyhtbXN5cywgIndhdmVJbk9wZW4oJXAsICVkLCAlcCwgJTA4bFgsICUwOGxYLCAlMDhsWCk7XG4iLCAKKwlUUkFDRShtbXN5cywgIiglcCwgJWQsICVwLCAlMDhsWCwgJTA4bFgsICUwOGxYKTtcbiIsIAogCQlscGhXYXZlSW4sIHVEZXZpY2VJRCwgbHBGb3JtYXQsIGR3Q2FsbGJhY2ssIGR3SW5zdGFuY2UsIGR3RmxhZ3MpOwogCWlmIChkd0ZsYWdzICYgV0FWRV9GT1JNQVRfUVVFUlkpCi0JCWRwcmludGZfaW5mbyhtbXN5cywgIndhdmVJbk9wZW4gLy8gV0FWRV9GT1JNQVRfUVVFUlkgcmVxdWVzdGVkICFcbiIpOworCQlUUkFDRShtbXN5cywgIldBVkVfRk9STUFUX1FVRVJZIHJlcXVlc3RlZCAhXG4iKTsKIAlpZiAodURldmljZUlEID09IChVSU5UMTYpV0FWRV9NQVBQRVIpIHsKLQkJZHByaW50Zl9pbmZvKG1tc3lzLCAid2F2ZUluT3BlbgkvLyBXQVZFX01BUFBFUiBtb2RlIHJlcXVlc3RlZCAhXG4iKTsKKwkJVFJBQ0UobW1zeXMsICJXQVZFX01BUFBFUiBtb2RlIHJlcXVlc3RlZCAhXG4iKTsKIAkJYk1hcHBlckZsZyA9IFRSVUU7CiAJCXVEZXZpY2VJRCA9IDA7CiAJfQpAQCAtMzI5MywxMSArMzI5NSwxMSBAQAogCQlpZiAoZHdSZXQgPT0gTU1TWVNFUlJfTk9FUlJPUikgYnJlYWs7CiAJCWlmICghYk1hcHBlckZsZykgYnJlYWs7CiAJCXVEZXZpY2VJRCsrOwotCQlkcHJpbnRmX2luZm8obW1zeXMsICJ3YXZlSW5PcGVuCS8vIFdBVkVfTUFQUEVSIG1vZGUgISB0cnkgbmV4dCBkcml2ZXIuLi5cbiIpOworCQlUUkFDRShtbXN5cywgIldBVkVfTUFQUEVSIG1vZGUgISB0cnkgbmV4dCBkcml2ZXIuLi5cbiIpOwogCX0KIAlscERlc2MtPnVEZXZpY2VJRCA9IHVEZXZpY2VJRDsKIAlpZiAoZHdGbGFncyAmIFdBVkVfRk9STUFUX1FVRVJZKSB7Ci0JCWRwcmludGZfaW5mbyhtbXN5cywgIndhdmVJbk9wZW4JLy8gRW5kIG9mIFdBVkVfRk9STUFUX1FVRVJZICFcbiIpOworCQlUUkFDRShtbXN5cywgIkVuZCBvZiBXQVZFX0ZPUk1BVF9RVUVSWSAhXG4iKTsKIAkJZHdSZXQgPSB3YXZlSW5DbG9zZTE2KGhXYXZlSW4pOwogCX0KIAlyZXR1cm4gZHdSZXQ7CkBAIC0zMzE3LDcgKzMzMTksNyBAQAogewogCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsKIAotCWRwcmludGZfaW5mbyhtbXN5cywgIndhdmVJbkNsb3NlKCUwNFgpXG4iLCBoV2F2ZUluKTsKKwlUUkFDRShtbXN5cywgIiglMDRYKVxuIiwgaFdhdmVJbik7CiAJbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVJbik7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CiAJcmV0dXJuIHdpZE1lc3NhZ2UobHBEZXNjLT51RGV2aWNlSUQsIFdJRE1fQ0xPU0UsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgMEwsIDBMKTsKQEAgLTMzMzEsNyArMzMzMyw3IEBACiB7CiAJTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwogCi0JZHByaW50Zl9pbmZvKG1tc3lzLCAid2F2ZUluUHJlcGFyZUhlYWRlciglMDRYLCAlcCwgJXUpO1xuIiwgCisJVFJBQ0UobW1zeXMsICIoJTA0WCwgJXAsICV1KTtcbiIsIAogCQkJCQloV2F2ZUluLCBscFdhdmVJbkhkciwgdVNpemUpOwogCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlSW4pOwogCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwpAQCAtMzMzOSw3ICszMzQxLDcgQEAKIAlscFdhdmVJbkhkciA9IGxwV2F2ZUluSGRyOwogCWxwV2F2ZUluSGRyLT5scE5leHQgPSBOVUxMOwogICAgIAlscFdhdmVJbkhkci0+ZHdCeXRlc1JlY29yZGVkID0gMDsKLQlkcHJpbnRmX2luZm8obW1zeXMsICJ3YXZlSW5QcmVwYXJlSGVhZGVyIC8vIGxwRGF0YT0lcCBzaXplPSVsdSBcbiIsIAorCVRSQUNFKG1tc3lzLCAibHBEYXRhPSVwIHNpemU9JWx1IFxuIiwgCiAJCWxwV2F2ZUluSGRyLT5scERhdGEsIGxwV2F2ZUluSGRyLT5kd0J1ZmZlckxlbmd0aCk7CiAJcmV0dXJuIHdpZE1lc3NhZ2UobHBEZXNjLT51RGV2aWNlSUQsV0lETV9QUkVQQVJFLGxwRGVzYy0+ZHdJbnN0YW5jZSwgCiAJCQkgIChEV09SRClscFdhdmVJbkhkciwgdVNpemUpOwpAQCAtMzM1NCw3ICszMzU2LDcgQEAKIAlMUEJZVEUJCXNhdmVkZGF0YSA9IGxwV2F2ZUluSGRyLT5scERhdGE7CiAJVUlOVDE2CQlyZXQ7CiAKLQlkcHJpbnRmX2luZm8obW1zeXMsICJ3YXZlSW5QcmVwYXJlSGVhZGVyKCUwNFgsICVwLCAldSk7XG4iLCAKKwlUUkFDRShtbXN5cywgIiglMDRYLCAlcCwgJXUpO1xuIiwgCiAJCQkJCWhXYXZlSW4sIGxwV2F2ZUluSGRyLCB1U2l6ZSk7CiAJbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVJbik7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CkBAIC0zMzYzLDcgKzMzNjUsNyBAQAogCWxwV2F2ZUluSGRyLT5scE5leHQgPSBOVUxMOwogICAgIAlscFdhdmVJbkhkci0+ZHdCeXRlc1JlY29yZGVkID0gMDsKIAotCWRwcmludGZfaW5mbyhtbXN5cywgIndhdmVJblByZXBhcmVIZWFkZXIgLy8gbHBEYXRhPSVwIHNpemU9JWx1IFxuIiwgCisJVFJBQ0UobW1zeXMsICJscERhdGE9JXAgc2l6ZT0lbHUgXG4iLCAKIAkJbHBXYXZlSW5IZHItPmxwRGF0YSwgbHBXYXZlSW5IZHItPmR3QnVmZmVyTGVuZ3RoKTsKIAlscFdhdmVJbkhkci0+bHBEYXRhID0gUFRSX1NFR19UT19MSU4obHBXYXZlSW5IZHItPmxwRGF0YSk7CiAJcmV0ID0gd2lkTWVzc2FnZShscERlc2MtPnVEZXZpY2VJRCxXSURNX1BSRVBBUkUsbHBEZXNjLT5kd0luc3RhbmNlLCAKQEAgLTMzODEsNyArMzM4Myw3IEBACiB7CiAJTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwogCi0JZHByaW50Zl9pbmZvKG1tc3lzLCAid2F2ZUluVW5wcmVwYXJlSGVhZGVyKCUwNFgsICVwLCAldSk7XG4iLCAKKwlUUkFDRShtbXN5cywgIiglMDRYLCAlcCwgJXUpO1xuIiwgCiAJCQkJCQloV2F2ZUluLCBscFdhdmVJbkhkciwgdVNpemUpOwogCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlSW4pOwogCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwpAQCAtMzQwMCw3ICszNDAyLDcgQEAKIHsKIAlMUFdBVkVPUEVOREVTQwlscERlc2M7CiAKLQlkcHJpbnRmX2luZm8obW1zeXMsICJ3YXZlSW5VbnByZXBhcmVIZWFkZXIoJTA0WCwgJXAsICV1KTtcbiIsIAorCVRSQUNFKG1tc3lzLCAiKCUwNFgsICVwLCAldSk7XG4iLCAKIAkJCQkJCWhXYXZlSW4sIGxwV2F2ZUluSGRyLCB1U2l6ZSk7CiAJbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVJbik7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CkBAIC0zNDIwLDEzICszNDIyLDEzIEBACiB7CiAJTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwogCi0JZHByaW50Zl9pbmZvKG1tc3lzLCAid2F2ZUluQWRkQnVmZmVyKCUwNFgsICVwLCAldSk7XG4iLCBoV2F2ZUluLCBscFdhdmVJbkhkciwgdVNpemUpOworCVRSQUNFKG1tc3lzLCAiKCUwNFgsICVwLCAldSk7XG4iLCBoV2F2ZUluLCBscFdhdmVJbkhkciwgdVNpemUpOwogCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlSW4pOwogCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwogCWlmIChscFdhdmVJbkhkciA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CiAJbHBXYXZlSW5IZHItPmxwTmV4dCA9IE5VTEw7CiAJbHBXYXZlSW5IZHItPmR3Qnl0ZXNSZWNvcmRlZCA9IDA7Ci0JZHByaW50Zl9pbmZvKG1tc3lzLCAid2F2ZUluQWRkQnVmZmVyIC8vIGxwRGF0YT0lcCBzaXplPSVsdSBcbiIsIAorCVRSQUNFKG1tc3lzLCAibHBEYXRhPSVwIHNpemU9JWx1IFxuIiwgCiAJCWxwV2F2ZUluSGRyLT5scERhdGEsIGxwV2F2ZUluSGRyLT5kd0J1ZmZlckxlbmd0aCk7CiAJcmV0dXJuIHdpZE1lc3NhZ2UobHBEZXNjLT51RGV2aWNlSUQsIFdJRE1fQUREQlVGRkVSLCBscERlc2MtPmR3SW5zdGFuY2UsCiAJCQkJCQkJCShEV09SRClscFdhdmVJbkhkciwgdVNpemUpOwpAQCAtMzQ0MiwxNCArMzQ0NCwxNCBAQAogCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsKIAlVSU5UMTYJCXJldDsKIAotCWRwcmludGZfaW5mbyhtbXN5cywgIndhdmVJbkFkZEJ1ZmZlciglMDRYLCAlcCwgJXUpO1xuIiwgaFdhdmVJbiwgbHBXYXZlSW5IZHIsIHVTaXplKTsKKwlUUkFDRShtbXN5cywgIiglMDRYLCAlcCwgJXUpO1xuIiwgaFdhdmVJbiwgbHBXYXZlSW5IZHIsIHVTaXplKTsKIAlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZUluKTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKIAlpZiAobHBXYXZlSW5IZHIgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwogCWxwV2F2ZUluSGRyLT5scE5leHQgPSBOVUxMOwogCWxwV2F2ZUluSGRyLT5kd0J5dGVzUmVjb3JkZWQgPSAwOwogCWxwV2F2ZUluSGRyLT5scERhdGEgPSBQVFJfU0VHX1RPX0xJTihscFdhdmVJbkhkci0+bHBEYXRhKTsKLQlkcHJpbnRmX2luZm8obW1zeXMsICJ3YXZlSW5BZGRCdWZmZXIgLy8gbHBEYXRhPSVwIHNpemU9JWx1IFxuIiwgCisJVFJBQ0UobW1zeXMsICJscERhdGE9JXAgc2l6ZT0lbHUgXG4iLCAKIAkJbHBXYXZlSW5IZHItPmxwRGF0YSwgbHBXYXZlSW5IZHItPmR3QnVmZmVyTGVuZ3RoKTsKIAlyZXQgPSB3aWRNZXNzYWdlKGxwRGVzYy0+dURldmljZUlELCBXSURNX0FEREJVRkZFUiwgbHBEZXNjLT5kd0luc3RhbmNlLAogCQkJICAoRFdPUkQpbHBXYXZlSW5IZHIsIHVTaXplKTsKQEAgLTM0NzIsNyArMzQ3NCw3IEBACiB7CiAJTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwogCi0JZHByaW50Zl9pbmZvKG1tc3lzLCAid2F2ZUluU3RhcnQoJTA0WClcbiIsIGhXYXZlSW4pOworCVRSQUNFKG1tc3lzLCAiKCUwNFgpXG4iLCBoV2F2ZUluKTsKIAlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZUluKTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKIAlyZXR1cm4gd2lkTWVzc2FnZShscERlc2MtPnVEZXZpY2VJRCxXSURNX1NUQVJULGxwRGVzYy0+ZHdJbnN0YW5jZSwwLDApOwpAQCAtMzQ5Myw3ICszNDk1LDcgQEAKIHsKIAlMUFdBVkVPUEVOREVTQwlscERlc2M7CiAKLQlkcHJpbnRmX2luZm8obW1zeXMsICJ3YXZlSW5TdG9wKCUwNFgpXG4iLCBoV2F2ZUluKTsKKwlUUkFDRShtbXN5cywgIiglMDRYKVxuIiwgaFdhdmVJbik7CiAJbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVJbik7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CiAJcmV0dXJuIHdpZE1lc3NhZ2UobHBEZXNjLT51RGV2aWNlSUQsIFdJRE1fU1RPUCwgbHBEZXNjLT5kd0luc3RhbmNlLCAwTCwgMEwpOwpAQCAtMzUxNCw3ICszNTE2LDcgQEAKIHsKIAlMUFdBVkVPUEVOREVTQwlscERlc2M7CiAKLQlkcHJpbnRmX2luZm8obW1zeXMsICJ3YXZlSW5SZXNldCglMDRYKVxuIiwgaFdhdmVJbik7CisJVFJBQ0UobW1zeXMsICIoJTA0WClcbiIsIGhXYXZlSW4pOwogCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlSW4pOwogCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwogCXJldHVybiB3aWRNZXNzYWdlKGxwRGVzYy0+dURldmljZUlELFdJRE1fUkVTRVQsbHBEZXNjLT5kd0luc3RhbmNlLDAsMCk7CkBAIC0zNTQxLDcgKzM1NDMsNyBAQAogewogCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsKIAotCWRwcmludGZfaW5mbyhtbXN5cywgIndhdmVJbkdldFBvc2l0aW9uKCUwNFgsICVwLCAldSk7XG4iLCBoV2F2ZUluLCBscFRpbWUsIHVTaXplKTsKKwlUUkFDRShtbXN5cywgIiglMDRYLCAlcCwgJXUpO1xuIiwgaFdhdmVJbiwgbHBUaW1lLCB1U2l6ZSk7CiAJbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVJbik7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CiAJcmV0dXJuIHdpZE1lc3NhZ2UobHBEZXNjLT51RGV2aWNlSUQsIFdJRE1fR0VUUE9TLCBscERlc2MtPmR3SW5zdGFuY2UsCkBAIC0zNTU1LDcgKzM1NTcsNyBAQAogewogCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsKIAotCWRwcmludGZfaW5mbyhtbXN5cywgIndhdmVJbkdldElEXG4iKTsKKwlUUkFDRShtbXN5cywgIndhdmVJbkdldElEXG4iKTsKIAlpZiAobHB1RGV2aWNlSUQgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwogCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlSW4pOwogCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwpAQCAtMzU3MSw3ICszNTczLDcgQEAKIHsKIAlMUFdBVkVPUEVOREVTQwlscERlc2M7CiAKLQlkcHJpbnRmX2luZm8obW1zeXMsICJ3YXZlSW5HZXRJRFxuIik7CisJVFJBQ0UobW1zeXMsICJ3YXZlSW5HZXRJRFxuIik7CiAJaWYgKGxwdURldmljZUlEID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKIAlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZUluKTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKQEAgLTM2NjMsNyArMzY2NSw3IEBACiAqLwogSERSVlIxNiBXSU5BUEkgRHJ2T3BlbihMUFNUUiBscERyaXZlck5hbWUsIExQU1RSIGxwU2VjdGlvbk5hbWUsIExQQVJBTSBsUGFyYW0pCiB7Ci0JZHByaW50Zl9pbmZvKG1tc3lzLCAiRHJ2T3BlbignJXMnLCAnJXMnLCAlMDhsWCk7XG4iLAorCVRSQUNFKG1tc3lzLCAiKCclcycsICclcycsICUwOGxYKTtcbiIsCiAJCWxwRHJpdmVyTmFtZSwgbHBTZWN0aW9uTmFtZSwgbFBhcmFtKTsKIAlyZXR1cm4gT3BlbkRyaXZlcihscERyaXZlck5hbWUsIGxwU2VjdGlvbk5hbWUsIGxQYXJhbSk7CiB9CkBAIC0zNjc0LDcgKzM2NzYsNyBAQAogKi8KIExSRVNVTFQgV0lOQVBJIERydkNsb3NlKEhEUlZSMTYgaERydnIsIExQQVJBTSBsUGFyYW0xLCBMUEFSQU0gbFBhcmFtMikKIHsKLQlkcHJpbnRmX2luZm8obW1zeXMsICJEcnZDbG9zZSglMDRYLCAlMDhsWCwgJTA4bFgpO1xuIiwgaERydnIsIGxQYXJhbTEsIGxQYXJhbTIpOworCVRSQUNFKG1tc3lzLCAiKCUwNFgsICUwOGxYLCAlMDhsWCk7XG4iLCBoRHJ2ciwgbFBhcmFtMSwgbFBhcmFtMik7CiAJcmV0dXJuIENsb3NlRHJpdmVyKGhEcnZyLCBsUGFyYW0xLCBsUGFyYW0yKTsKIH0KIApAQCAtMzY4Niw3ICszNjg4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSBsUGFyYW0yKQogewogCURXT1JEIAlkd0RyaXZlcklEID0gMDsKLQlkcHJpbnRmX2luZm8obW1zeXMsICJEcnZTZW5kTWVzc2FnZSglMDRYLCAlMDRYLCAlMDhsWCwgJTA4bFgpO1xuIiwKKwlUUkFDRShtbXN5cywgIiglMDRYLCAlMDRYLCAlMDhsWCwgJTA4bFgpO1xuIiwKIAkJCQkJaERyaXZlciwgbXNnLCBsUGFyYW0xLCBsUGFyYW0yKTsKIAlyZXR1cm4gQ0RBVURJT19Ecml2ZXJQcm9jKGR3RHJpdmVySUQsIGhEcml2ZXIsIG1zZywgbFBhcmFtMSwgbFBhcmFtMik7CiB9CkBAIC0zNjk2LDcgKzM2OTgsNyBAQAogKi8KIEhBTkRMRTE2IFdJTkFQSSBEcnZHZXRNb2R1bGVIYW5kbGUoSERSVlIxNiBoRHJ2cikKIHsKLQlkcHJpbnRmX2luZm8obW1zeXMsICJEcnZHZXRNb2R1bGVIYW5kbGUoJTA0WCk7XG4iLCBoRHJ2cik7CisJVFJBQ0UobW1zeXMsICIoJTA0WCk7XG4iLCBoRHJ2cik7CiAgICAgICAgIHJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9tdWx0aW1lZGlhL3RpbWUuYyBiL211bHRpbWVkaWEvdGltZS5jCmluZGV4IDBlNjAyMzQuLjFhZmNjZTQgMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvdGltZS5jCisrKyBiL211bHRpbWVkaWEvdGltZS5jCkBAIC0yMiw2ICsyMiwxMiBAQAogc3RhdGljIE1NVElNRTE2IG1tU3lzVGltZU1TOwogc3RhdGljIE1NVElNRTE2IG1tU3lzVGltZVNNUFRFOwogCisvKiB0aGlzIGlzIHVzZWQgdG8gYXZvaWQgaW5maW5pdGUgbG9vcCBpbiB0aW1lR2V0VGltZSwgYmVjYXVzZQorICAgb2YgdGhlIGZha2VkIG11bHRpbWVkaWEgdGltZXJzLCBhbmQgd2lsbCBkZXNhcHBlYXIgYXMgc29vbiBhcworICAgdGhlIHRpbWVycyBhcmUgaW1wbGVtZW50ZWQgY29ycmVjdGx5LgorICovCitzdGF0aWMgaW50IHRpbWVfY2FsbGVkPTA7CisKIHR5cGVkZWYgc3RydWN0IHRhZ1RJTUVSRU5UUlkgewogICAgIFVJTlQzMgl3RGVsYXk7CiAgICAgVUlOVDMyCXdSZXNvbDsKQEAgLTQwLDEwICs0NiwxMSBAQAogCiAvKgogICogRklYTUUKLSAqIGlzIHRoaXMgdGhlIG1pbmltdW0gcmVzb2x1dGlvbiA/IAorICogV2UncmUgdXNpbmcgIjEiIGFzIHRoZSBtaW5pbnVtIHJlc29sdXRpb24gdG8gdGhlIHRpbWVyLAorICogYXMgV2luZG93cyA5NSBkb2VzLCBhY2NvcmRpbmcgdG8gdGhlIGRvY3MuIE1heWJlIGl0IHNob3VsZAorICogZGVwZW5kIG9uIHRoZSBjb21wdXRlcnMgcmVzb3VyY2VzIQogICovCi0vKiNkZWZpbmUgTU1TWVNUSU1FX01JTklOVEVSVkFMICgzMykqLwotI2RlZmluZSBNTVNZU1RJTUVfTUlOSU5URVJWQUwgKDMxKQorI2RlZmluZSBNTVNZU1RJTUVfTUlOSU5URVJWQUwgKDEpCiAjZGVmaW5lIE1NU1lTVElNRV9NQVhJTlRFUlZBTCAoNjU1MzUpCiAKIApAQCAtNjAsMTAgKzY3LDEwIEBACiAJICAgIGxwVGltZXItPndDdXJUaW1lID0gbHBUaW1lci0+d0RlbGF5OwogCiAJICAgIGlmIChscFRpbWVyLT5scEZ1bmMgIT0gKEZBUlBST0MxNikgTlVMTCkgewotCQlkcHJpbnRmX2luZm8obW10aW1lLCAiTU1TeXNUaW1lQ2FsbGJhY2sgLy8gYmVmb3JlIENhbGxCYWNrMTYgIVxuIik7Ci0JCWRwcmludGZfaW5mbyhtbXRpbWUsICJNTVN5c1RpbWVDYWxsYmFjayAvLyBscEZ1bmM9JXAgd1RpbWVySUQ9JTA0WCBkd1VzZXI9JTA4bFggIVxuIiwKKwkJVFJBQ0UobW10aW1lLCAiYmVmb3JlIENhbGxCYWNrMTYgIVxuIik7CisJCVRSQUNFKG1tdGltZSwgImxwRnVuYz0lcCB3VGltZXJJRD0lMDRYIGR3VXNlcj0lMDhsWCAhXG4iLAogCQkJbHBUaW1lci0+bHBGdW5jLCBscFRpbWVyLT53VGltZXJJRCwgbHBUaW1lci0+ZHdVc2VyKTsKLQkJZHByaW50Zl9pbmZvKG1tdGltZSwgIk1NU3lzVGltZUNhbGxiYWNrIC8vIGhJbnN0YW5jZT0lMDRYICFcbiIsIGxwVGltZXItPmhJbnN0YW5jZSk7CisJCVRSQUNFKG1tdGltZSwgImhJbnN0YW5jZT0lMDRYICFcbiIsIGxwVGltZXItPmhJbnN0YW5jZSk7CiAKIAogLyogICAgICAgIC0gVGltZVByb2MgY2FsbGJhY2sgdGhhdCBpcyBjYWxsZWQgaGVyZSBpcyBzb21ldGhpbmcgc3RyYW5nZSwgdW5kZXIgV2luZG93cyAzLjF4IGl0IGlzIGNhbGxlZCAKQEAgLTc5LDcgKzg2LDcgQEAKIAkJCQkJCSAgICBscFRpbWVyLT5kd1VzZXIsMCwwCiAJCQkpOwogCi0JCWRwcmludGZfaW5mbyhtbXRpbWUsICJNTVN5c1RpbWVDYWxsYmFjayAvLyBhZnRlciBDYWxsQmFjazE2ICFcbiIpOworCQlUUkFDRShtbXRpbWUsICJhZnRlciBDYWxsQmFjazE2ICFcbiIpOwogCSAgICB9CiAJICAgIGlmIChscFRpbWVyLT53RmxhZ3MgJiBUSU1FX09ORVNIT1QpCiAJCXRpbWVLaWxsRXZlbnQzMihscFRpbWVyLT53VGltZXJJRCk7CkBAIC0xMDMsMTYgKzExMCwxNiBAQAogCSAgICBscFRpbWVyLT53Q3VyVGltZSA9IGxwVGltZXItPndEZWxheTsKIAogCSAgICBpZiAobHBUaW1lci0+bHBGdW5jICE9IChGQVJQUk9DMTYpIE5VTEwpIHsKLQkJZHByaW50Zl9pbmZvKG1tdGltZSwgIk1NU3lzVGltZUNhbGxiYWNrIC8vIGJlZm9yZSBDYWxsQmFjazE2ICFcbiIpOwotCQlkcHJpbnRmX2luZm8obW10aW1lLCAiTU1TeXNUaW1lQ2FsbGJhY2sgLy8gbHBGdW5jPSVwIHdUaW1lcklEPSUwNFggZHdVc2VyPSUwOGxYICFcbiIsCisJCVRSQUNFKG1tdGltZSwgImJlZm9yZSBDYWxsQmFjazE2ICFcbiIpOworCQlUUkFDRShtbXRpbWUsICJscEZ1bmM9JXAgd1RpbWVySUQ9JTA0WCBkd1VzZXI9JTA4bFggIVxuIiwKIAkJCWxwVGltZXItPmxwRnVuYywgbHBUaW1lci0+d1RpbWVySUQsIGxwVGltZXItPmR3VXNlcik7Ci0JCWRwcmludGZfaW5mbyhtbXRpbWUsICJNTVN5c1RpbWVDYWxsYmFjayAvLyBoSW5zdGFuY2U9JTA0WCAhXG4iLCBscFRpbWVyLT5oSW5zdGFuY2UpOworCQlUUkFDRShtbXRpbWUsICJoSW5zdGFuY2U9JTA0WCAhXG4iLCBscFRpbWVyLT5oSW5zdGFuY2UpOwogCiAvKiBUaGlzIGlzIHdyb25nIChscEZ1bmMgaXMgTlVMTCBhbGwgdGhlIHRpbWUpCiAKICAgIAkgICAgICAgIGxwRnVuYyA9IE1PRFVMRV9HZXRFbnRyeVBvaW50KCBscFRpbWVyLT5oSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgTU9EVUxFX0dldE9yZGluYWwobHBUaW1lci0+aEluc3RhbmNlLCJUaW1lckNhbGxCYWNrIiApKTsKLQkJZHByaW50Zl9pbmZvKG1tdGltZSwgIk1NU3lzVGltZUNhbGxiYWNrIC8vIGxwRnVuYz0lMDhseCAhXG4iLCBscEZ1bmMpOworCQlUUkFDRShtbXRpbWUsICJscEZ1bmM9JTA4bHggIVxuIiwgbHBGdW5jKTsKICovCiAKIApAQCAtMTI5LDcgKzEzNiw3IEBACiAJCQkJCQkgICAgbHBUaW1lci0+ZHdVc2VyLDAsMAogCQkJKTsKIAotCQlkcHJpbnRmX2luZm8obW10aW1lLCAiTU1TeXNUaW1lQ2FsbGJhY2sgLy8gYWZ0ZXIgQ2FsbEJhY2sxNiAhXG4iKTsKKwkJVFJBQ0UobW10aW1lLCAiYWZ0ZXIgQ2FsbEJhY2sxNiAhXG4iKTsKIAkJZmZsdXNoKHN0ZG91dCk7CiAJICAgIH0KIAkgICAgaWYgKGxwVGltZXItPndGbGFncyAmIFRJTUVfT05FU0hPVCkKQEAgLTE2NCw3ICsxNzEsNyBAQAogICovCiBNTVJFU1VMVDMyIFdJTkFQSSB0aW1lR2V0U3lzdGVtVGltZTMyKExQTU1USU1FMzIgbHBUaW1lLCBVSU5UMzIgd1NpemUpCiB7Ci0gICAgZHByaW50Zl9pbmZvKG1tc3lzLCAidGltZUdldFN5c3RlbVRpbWUzMiglcCwgJXUpO1xuIiwgbHBUaW1lLCB3U2l6ZSk7CisgICAgVFJBQ0UobW1zeXMsICIoJXAsICV1KTtcbiIsIGxwVGltZSwgd1NpemUpOwogICAgIGlmICghbW1UaW1lU3RhcnRlZCkKIAlTdGFydE1NVGltZSgpOwogICAgIGxwVGltZS0+d1R5cGUgPSBUSU1FX01TOwpAQCAtMTc3LDcgKzE4NCw3IEBACiAgKi8KIE1NUkVTVUxUMTYgV0lOQVBJIHRpbWVHZXRTeXN0ZW1UaW1lMTYoTFBNTVRJTUUxNiBscFRpbWUsIFVJTlQxNiB3U2l6ZSkKIHsKLSAgICBkcHJpbnRmX2luZm8obW1zeXMsICJ0aW1lR2V0U3lzdGVtVGltZTE2KCVwLCAldSk7XG4iLCBscFRpbWUsIHdTaXplKTsKKyAgICBUUkFDRShtbXN5cywgIiglcCwgJXUpO1xuIiwgbHBUaW1lLCB3U2l6ZSk7CiAgICAgaWYgKCFtbVRpbWVTdGFydGVkKQogCVN0YXJ0TU1UaW1lKCk7CiAgICAgbHBUaW1lLT53VHlwZSA9IFRJTUVfTVM7CkBAIC0xOTYsNyArMjAzLDcgQEAKICAgICBMUFRJTUVSRU5UUlkgbHBOZXdUaW1lcjsKICAgICBMUFRJTUVSRU5UUlkgbHBUaW1lciA9IGxwVGltZXJMaXN0OwogCi0gICAgZHByaW50Zl9pbmZvKG1tdGltZSwgInRpbWVTZXRFdmVudDMyKCV1LCAldSwgJXAsICUwOGxYLCAlMDRYKTtcbiIsCisgICAgVFJBQ0UobW10aW1lLCAiKCV1LCAldSwgJXAsICUwOGxYLCAlMDRYKTtcbiIsCiAJCSAgd0RlbGF5LCB3UmVzb2wsIGxwRnVuYywgZHdVc2VyLCB3RmxhZ3MpOwogICAgIGlmICghbW1UaW1lU3RhcnRlZCkKIAlTdGFydE1NVGltZSgpOwpAQCAtMjE4LDggKzIyNSw4IEBACiAgICAgbHBOZXdUaW1lci0+bHBGdW5jID0gKEZBUlBST0MxNikgbHBGdW5jOwogICAgIGxwTmV3VGltZXItPmlzd2luMzIgPSAxOwogICAgIGxwTmV3VGltZXItPmhJbnN0YW5jZSA9IEdldFRhc2tEUygpOwotCWRwcmludGZfaW5mbyhtbXRpbWUsICJ0aW1lU2V0RXZlbnQgLy8gaEluc3RhbmNlPSUwNFggIVxuIiwgbHBOZXdUaW1lci0+aEluc3RhbmNlKTsKLQlkcHJpbnRmX2luZm8obW10aW1lLCAidGltZVNldEV2ZW50IC8vIGxwRnVuYz0lcCAhXG4iLCAKKwlUUkFDRShtbXRpbWUsICJoSW5zdGFuY2U9JTA0WCAhXG4iLCBscE5ld1RpbWVyLT5oSW5zdGFuY2UpOworCVRSQUNFKG1tdGltZSwgImxwRnVuYz0lcCAhXG4iLCAKIAkJCQlscEZ1bmMpOwogICAgIGxwTmV3VGltZXItPmR3VXNlciA9IGR3VXNlcjsKICAgICBscE5ld1RpbWVyLT53RmxhZ3MgPSB3RmxhZ3M7CkBAIC0yMzYsNyArMjQzLDcgQEAKICAgICBXT1JEIHdOZXdJRCA9IDA7CiAgICAgTFBUSU1FUkVOVFJZIGxwTmV3VGltZXI7CiAgICAgTFBUSU1FUkVOVFJZIGxwVGltZXIgPSBscFRpbWVyTGlzdDsKLSAgICBkcHJpbnRmX2luZm8obW10aW1lLCAidGltZVNldEV2ZW50KCV1LCAldSwgJXAsICUwOGxYLCAlMDRYKTtcbiIsCisgICAgVFJBQ0UobW10aW1lLCAiKCV1LCAldSwgJXAsICUwOGxYLCAlMDRYKTtcbiIsCiAJCSAgd0RlbGF5LCB3UmVzb2wsIGxwRnVuYywgZHdVc2VyLCB3RmxhZ3MpOwogICAgIGlmICghbW1UaW1lU3RhcnRlZCkKIAlTdGFydE1NVGltZSgpOwpAQCAtMjU4LDggKzI2NSw4IEBACiAgICAgbHBOZXdUaW1lci0+bHBGdW5jID0gKEZBUlBST0MxNikgbHBGdW5jOwogICAgIGxwTmV3VGltZXItPmlzd2luMzIgPSAwOwogICAgIGxwTmV3VGltZXItPmhJbnN0YW5jZSA9IEdldFRhc2tEUygpOwotCWRwcmludGZfaW5mbyhtbXRpbWUsICJ0aW1lU2V0RXZlbnQgLy8gaEluc3RhbmNlPSUwNFggIVxuIiwgbHBOZXdUaW1lci0+aEluc3RhbmNlKTsKLQlkcHJpbnRmX2luZm8obW10aW1lLCAidGltZVNldEV2ZW50IC8vIFBUUl9TRUdfVE9fTElOKGxwRnVuYyk9JXAgIVxuIiwgCisJVFJBQ0UobW10aW1lLCAiaEluc3RhbmNlPSUwNFggIVxuIiwgbHBOZXdUaW1lci0+aEluc3RhbmNlKTsKKwlUUkFDRShtbXRpbWUsICIobHBGdW5jKT0lcCAhXG4iLCAKIAkJCQlQVFJfU0VHX1RPX0xJTihscEZ1bmMpKTsKICAgICBscE5ld1RpbWVyLT5kd1VzZXIgPSBkd1VzZXI7CiAgICAgbHBOZXdUaW1lci0+d0ZsYWdzID0gd0ZsYWdzOwpAQCAtMjk3LDcgKzMwNCw3IEBACiAgKi8KIE1NUkVTVUxUMzIgV0lOQVBJIHRpbWVHZXREZXZDYXBzMzIoTFBUSU1FQ0FQUzMyIGxwQ2FwcyxVSU5UMzIgd1NpemUpCiB7Ci0gICAgZHByaW50Zl9pbmZvKG1tdGltZSwgInRpbWVHZXREZXZDYXBzKCVwLCAldSkgIVxuIiwgbHBDYXBzLCB3U2l6ZSk7CisgICAgVFJBQ0UobW10aW1lLCAiKCVwLCAldSkgIVxuIiwgbHBDYXBzLCB3U2l6ZSk7CiAgICAgaWYgKCFtbVRpbWVTdGFydGVkKQogCVN0YXJ0TU1UaW1lKCk7CiAgICAgbHBDYXBzLT53UGVyaW9kTWluID0gTU1TWVNUSU1FX01JTklOVEVSVkFMOwpAQCAtMzEwLDcgKzMxNyw3IEBACiAgKi8KIE1NUkVTVUxUMTYgV0lOQVBJIHRpbWVHZXREZXZDYXBzMTYoTFBUSU1FQ0FQUzE2IGxwQ2FwcywgVUlOVDE2IHdTaXplKQogewotICAgIGRwcmludGZfaW5mbyhtbXRpbWUsICJ0aW1lR2V0RGV2Q2FwcyglcCwgJXUpICFcbiIsIGxwQ2Fwcywgd1NpemUpOworICAgIFRSQUNFKG1tdGltZSwgIiglcCwgJXUpICFcbiIsIGxwQ2Fwcywgd1NpemUpOwogICAgIGlmICghbW1UaW1lU3RhcnRlZCkKIAlTdGFydE1NVGltZSgpOwogICAgIGxwQ2Fwcy0+d1BlcmlvZE1pbiA9IE1NU1lTVElNRV9NSU5JTlRFUlZBTDsKQEAgLTMyMyw3ICszMzAsNyBAQAogICovCiBNTVJFU1VMVDMyIFdJTkFQSSB0aW1lQmVnaW5QZXJpb2QzMihVSU5UMzIgd1BlcmlvZCkKIHsKLSAgICBkcHJpbnRmX2luZm8obW10aW1lLCAidGltZUJlZ2luUGVyaW9kMzIoJXUpICFcbiIsIHdQZXJpb2QpOworICAgIFRSQUNFKG1tdGltZSwgIigldSkgIVxuIiwgd1BlcmlvZCk7CiAgICAgaWYgKCFtbVRpbWVTdGFydGVkKQogCVN0YXJ0TU1UaW1lKCk7CiAgICAgaWYgKHdQZXJpb2QgPCBNTVNZU1RJTUVfTUlOSU5URVJWQUwgfHwgd1BlcmlvZCA+IE1NU1lTVElNRV9NQVhJTlRFUlZBTCkgCkBAIC0zMzUsNyArMzQyLDcgQEAKICAqLwogTU1SRVNVTFQxNiBXSU5BUEkgdGltZUJlZ2luUGVyaW9kMTYoVUlOVDE2IHdQZXJpb2QpCiB7Ci0gICAgZHByaW50Zl9pbmZvKG1tdGltZSwgInRpbWVCZWdpblBlcmlvZCgldSkgIVxuIiwgd1BlcmlvZCk7CisgICAgVFJBQ0UobW10aW1lLCAiKCV1KSAhXG4iLCB3UGVyaW9kKTsKICAgICBpZiAoIW1tVGltZVN0YXJ0ZWQpCiAJU3RhcnRNTVRpbWUoKTsKICAgICBpZiAod1BlcmlvZCA8IE1NU1lTVElNRV9NSU5JTlRFUlZBTCB8fCB3UGVyaW9kID4gTU1TWVNUSU1FX01BWElOVEVSVkFMKSAKQEAgLTM0OCw3ICszNTUsNyBAQAogICovCiBNTVJFU1VMVDMyIFdJTkFQSSB0aW1lRW5kUGVyaW9kMzIoVUlOVDMyIHdQZXJpb2QpCiB7Ci0gICAgZHByaW50Zl9pbmZvKG1tdGltZSwgInRpbWVFbmRQZXJpb2QoJXUpICFcbiIsIHdQZXJpb2QpOworICAgIFRSQUNFKG1tdGltZSwgIigldSkgIVxuIiwgd1BlcmlvZCk7CiAgICAgaWYgKHdQZXJpb2QgPCBNTVNZU1RJTUVfTUlOSU5URVJWQUwgfHwgd1BlcmlvZCA+IE1NU1lTVElNRV9NQVhJTlRFUlZBTCkgCiAgICAgICAgIHJldHVybiBUSU1FUlJfTk9DQU5ETzsKICAgICByZXR1cm4gMDsKQEAgLTM1OSw3ICszNjYsNyBAQAogICovCiBNTVJFU1VMVDE2IFdJTkFQSSB0aW1lRW5kUGVyaW9kMTYoVUlOVDE2IHdQZXJpb2QpCiB7Ci0gICAgZHByaW50Zl9pbmZvKG1tdGltZSwgInRpbWVFbmRQZXJpb2QoJXUpICFcbiIsIHdQZXJpb2QpOworICAgIFRSQUNFKG1tdGltZSwgIigldSkgIVxuIiwgd1BlcmlvZCk7CiAgICAgaWYgKHdQZXJpb2QgPCBNTVNZU1RJTUVfTUlOSU5URVJWQUwgfHwgd1BlcmlvZCA+IE1NU1lTVElNRV9NQVhJTlRFUlZBTCkgCiAgICAgICAgIHJldHVybiBUSU1FUlJfTk9DQU5ETzsKICAgICByZXR1cm4gMDsKQEAgLTM3MCwxOCArMzc3LDM2IEBACiAgKi8KIERXT1JEIFdJTkFQSSB0aW1lR2V0VGltZSgpCiB7CisgIC8qIEZJWE1FIGFsbCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBoYXZlIHRvIGJlIGlzCisgICAgICAgbG9uZyByZXN1bHQ7CisgICAgICAgc3RydWN0IHRpbWV2YWwgdGltZTsKKyAgICAgICBkcHJpbnRmX21tdGltZShzdGRkZWIsICJ0aW1lR2V0VGltZSgpOyAhXG4iKTsKKyAgICAgICBnZXR0aW1lb2ZkYXkoJnRpbWUsIDApOworICAgICAgIHJlc3VsdCA9ICgoKGxvbmcpdGltZS50dl9zZWMgKiAobG9uZykxMDAwKSArICgobG9uZyl0aW1lLnR2X3VzZWMgLyAobG9uZykxMDAwKSk7CisKKyAgICAgYnV0IHRoZSBtdWx0aW1lZGlhIHRpbWVycyBhcmUgbm90IGltcGxlbWVudGVkIGNvcnJlY3RseSwgc28gYWxsIHRoZSByZXN0CisgICAgIGlzIGEgd29ya2Fyb3VuZCB0byBmYWtlIHRoZW0uCisgICAgICAgCisgICAqLyAgCiAgICAgc3RhdGljIERXT1JEIGxhc3R0aWNrPTA7CiAgICAgRFdPUkQJbmV3dGljazsKIAotICAgIGRwcmludGZfaW5mbyhtbXRpbWUsICJ0aW1lR2V0VGltZSgpOyAhXG4iKTsKKyAgICBUUkFDRShtbXRpbWUsICIhXG4iKTsKICAgICBpZiAoIW1tVGltZVN0YXJ0ZWQpCiAJU3RhcnRNTVRpbWUoKTsKICAgICBuZXd0aWNrID0gR2V0VGlja0NvdW50KCk7CiAgICAgbW1TeXNUaW1lTVMudS5tcys9bmV3dGljay1sYXN0dGljazsgLyogRklYTUU6IGZha2VkIHRpbWVyICovCiAgICAgaWYgKG5ld3RpY2shPWxhc3R0aWNrKQorCisgICAgaWYgKCF0aW1lX2NhbGxlZCkgeyAvKiB0byBhdm9pZCBpbmZpbml0ZSByZWN1cnNpb24gaWYgdGltZUdldFRpbWUgaXMgY2FsbGVkCisJCQkgICBpbnNpZGUgY2hlY2tfTU10aW1lcnMKKwkJCSAqLworICAgICAgdGltZV9jYWxsZWQrKzsKICAgICAJY2hlY2tfTU10aW1lcnMoKTsKKyAgICAgIHRpbWVfY2FsbGVkLS07CisgICAgfSAgICAvL2NoZWNrX01NdGltZXJzKCk7CiAgICAgbGFzdHRpY2sgPSBuZXd0aWNrOwotICAgIGRwcmludGZfaW5mbyhtbXRpbWUsICJ0aW1lR2V0VGltZSgpIC8vIFRpbWUgPSAlbGRcbiIsbW1TeXNUaW1lTVMudS5tcyk7CisgICAgVFJBQ0UobW10aW1lLCAiVGltZSA9ICVsZFxuIixtbVN5c1RpbWVNUy51Lm1zKTsKIAogCiAgICAgcmV0dXJuIG1tU3lzVGltZU1TLnUubXM7CmRpZmYgLS1naXQgYS9vYmplY3RzL01ha2VmaWxlLmluIGIvb2JqZWN0cy9NYWtlZmlsZS5pbgppbmRleCBhZWNmZmQwLi5lZjZjZjg3IDEwMDY0NAotLS0gYS9vYmplY3RzL01ha2VmaWxlLmluCisrKyBiL29iamVjdHMvTWFrZWZpbGUuaW4KQEAgLTE0LDYgKzE0LDcgQEAKIAlkYy5jIFwKIAlkY3ZhbHVlcy5jIFwKIAlkaWIuYyBcCisJZW5obWV0YWZpbGUuYyBcCiAJZm9udC5jIFwKIAlnZGlvYmouYyBcCiAJbGluZWRkYS5jIFwKZGlmZiAtLWdpdCBhL29iamVjdHMvYml0bWFwLmMgYi9vYmplY3RzL2JpdG1hcC5jCmluZGV4IGRmOWJkMmEuLjhiNjJlOGQgMTAwNjQ0Ci0tLSBhL29iamVjdHMvYml0bWFwLmMKKysrIGIvb2JqZWN0cy9iaXRtYXAuYwpAQCAtMTQyLDcgKzE0Miw3IEBACiAgICAgcGxhbmVzID0gKEJZVEUpcGxhbmVzOwogICAgIGJwcCAgICA9IChCWVRFKWJwcDsKIAotICAgIGRwcmludGZfaW5mbyhnZGksICJDcmVhdGVCaXRtYXA6ICVkeCVkLCAlZCBjb2xvcnNcbiIsIAorICAgIFRSQUNFKGdkaSwgIiVkeCVkLCAlZCBjb2xvcnNcbiIsIAogICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCAxIDw8IChwbGFuZXMqYnBwKSApOwogCiAgICAgICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCkBAIC0xOTgsMTEgKzE5OCwxMSBAQAogICAgIEhCSVRNQVAzMiBoYm1wUmV0ID0gMDsKICAgICBEQyAqZGM7CiAKLSAgICBkcHJpbnRmX2luZm8oZ2RpLCAiQ3JlYXRlQ29tcGF0aWJsZUJpdG1hcCglMDR4LCVkLCVkKSA9IFxuIiwgCisgICAgVFJBQ0UoZ2RpLCAiKCUwNHgsJWQsJWQpID0gXG4iLCAKICAgICAgICAgICAgICAgICAgaGRjLCB3aWR0aCwgaGVpZ2h0ICk7CiAgICAgaWYgKCEoZGMgPSBEQ19HZXREQ1B0ciggaGRjICkpKSByZXR1cm4gMDsKICAgICBoYm1wUmV0ID0gQ3JlYXRlQml0bWFwMzIoIHdpZHRoLCBoZWlnaHQsIDEsIGRjLT53LmJpdHNQZXJQaXhlbCwgTlVMTCApOwotICAgIGRwcmludGZfaW5mbyhnZGksIlx0XHQlMDR4XG4iLCBoYm1wUmV0KTsKKyAgICBUUkFDRShnZGksIlx0XHQlMDR4XG4iLCBoYm1wUmV0KTsKICAgICByZXR1cm4gaGJtcFJldDsKIH0KIApAQCAtMjcxLDcgKzI3MSw3IEBACiAgICAgaGVpZ2h0ID0gY291bnQgLyBibXAtPmJpdG1hcC5ibVdpZHRoQnl0ZXM7CiAgICAgaWYgKGhlaWdodCA+IGJtcC0+Yml0bWFwLmJtSGVpZ2h0KSBoZWlnaHQgPSBibXAtPmJpdG1hcC5ibUhlaWdodDsKIAotICAgIGRwcmludGZfaW5mbyhiaXRtYXAsICJHZXRCaXRtYXBCaXRzOiAlZHglZCAlZCBjb2xvcnMgJXAgZmV0Y2hlZCBoZWlnaHQ6ICVsZFxuIiwKKyAgICBUUkFDRShiaXRtYXAsICIlZHglZCAlZCBjb2xvcnMgJXAgZmV0Y2hlZCBoZWlnaHQ6ICVsZFxuIiwKIAkgICAgYm1wLT5iaXRtYXAuYm1XaWR0aCwgYm1wLT5iaXRtYXAuYm1IZWlnaHQsCiAJICAgIDEgPDwgYm1wLT5iaXRtYXAuYm1CaXRzUGl4ZWwsIGJ1ZmZlciwgaGVpZ2h0ICk7CiAKQEAgLTM5NCw3ICszOTQsNyBAQAogICAgIGJtcCA9IChCSVRNQVBPQkogKikgR0RJX0dldE9ialB0ciggaGJpdG1hcCwgQklUTUFQX01BR0lDICk7CiAgICAgaWYgKCFibXApIHJldHVybiAwOwogCi0gICAgZHByaW50Zl9pbmZvKGJpdG1hcCwgIlNldEJpdG1hcEJpdHM6ICVkeCVkICVkIGNvbG9ycyAlcFxuIiwKKyAgICBUUkFDRShiaXRtYXAsICIlZHglZCAlZCBjb2xvcnMgJXBcbiIsCiAJICAgIGJtcC0+Yml0bWFwLmJtV2lkdGgsIGJtcC0+Yml0bWFwLmJtSGVpZ2h0LAogCSAgICAxIDw8IGJtcC0+Yml0bWFwLmJtQml0c1BpeGVsLCBidWZmZXIgKTsKIApAQCAtNTI0LDExICs1MjQsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyIGRlc2lyZWR4LCBJTlQzMiBkZXNpcmVkeSwgVUlOVDMyIGxvYWRmbGFncykKIHsKIAlpZiAoSElXT1JEKG5hbWUpKSB7Ci0JCWRwcmludGZfaW5mbyhyZXNvdXJjZSwiTG9hZEltYWdlMzJBKDB4JTA0eCwlcywlZCwlZCwlZCwweCUwOHgpXG4iLAorCQlUUkFDRShyZXNvdXJjZSwiKDB4JTA0eCwlcywlZCwlZCwlZCwweCUwOHgpXG4iLAogCQkJaGluc3QsbmFtZSx0eXBlLGRlc2lyZWR4LGRlc2lyZWR5LGxvYWRmbGFncwogCQkpOwogCX0gZWxzZSB7Ci0JCWRwcmludGZfaW5mbyhyZXNvdXJjZSwiTG9hZEltYWdlMzJBKDB4JTA0eCwlcCwlZCwlZCwlZCwweCUwOHgpXG4iLAorCQlUUkFDRShyZXNvdXJjZSwiKDB4JTA0eCwlcCwlZCwlZCwlZCwweCUwOHgpXG4iLAogCQkJaGluc3QsbmFtZSx0eXBlLGRlc2lyZWR4LGRlc2lyZWR5LGxvYWRmbGFncwogCQkpOwogCX0KQEAgLTU0NywxMSArNTQ3LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMiBkZXNpcmVkeCwgSU5UMzIgZGVzaXJlZHksIFVJTlQzMiBsb2FkZmxhZ3MpCiB7CiAJaWYgKEhJV09SRChuYW1lKSkgewotCQlkcHJpbnRmX2luZm8ocmVzb3VyY2UsIkxvYWRJbWFnZTMyVygweCUwNHgsJXAsJWQsJWQsJWQsMHglMDh4KVxuIiwKKwkJVFJBQ0UocmVzb3VyY2UsIigweCUwNHgsJXAsJWQsJWQsJWQsMHglMDh4KVxuIiwKIAkJCWhpbnN0LG5hbWUsdHlwZSxkZXNpcmVkeCxkZXNpcmVkeSxsb2FkZmxhZ3MKIAkJKTsKIAl9IGVsc2UgewotCQlkcHJpbnRmX2luZm8ocmVzb3VyY2UsIkxvYWRJbWFnZTMyVygweCUwNHgsJXAsJWQsJWQsJWQsMHglMDh4KVxuIiwKKwkJVFJBQ0UocmVzb3VyY2UsIigweCUwNHgsJXAsJWQsJWQsJWQsMHglMDh4KVxuIiwKIAkJCWhpbnN0LG5hbWUsdHlwZSxkZXNpcmVkeCxkZXNpcmVkeSxsb2FkZmxhZ3MKIAkJKTsKIAl9CkBAIC02MTksMTEgKzYxOSwxMSBAQAogICAgIGlmIChISVdPUkQobmFtZSkpCiAgICAgewogICAgICAgICBjaGFyICpzdHIgPSAoY2hhciAqKVBUUl9TRUdfVE9fTElOKCBuYW1lICk7Ci0gICAgICAgIGRwcmludGZfaW5mbyhiaXRtYXAsICJMb2FkQml0bWFwMTYoJTA0eCwnJXMnKVxuIiwgaW5zdGFuY2UsIHN0ciApOworICAgICAgICBUUkFDRShiaXRtYXAsICIoJTA0eCwnJXMnKVxuIiwgaW5zdGFuY2UsIHN0ciApOwogICAgICAgICBpZiAoc3RyWzBdID09ICcjJykgbmFtZSA9IChTRUdQVFIpKERXT1JEKShXT1JEKWF0b2koIHN0ciArIDEgKTsKICAgICB9CiAgICAgZWxzZQotICAgICAgICBkcHJpbnRmX2luZm8oYml0bWFwLCAiTG9hZEJpdG1hcDE2KCUwNHgsJTA0eClcbiIsCisgICAgICAgIFRSQUNFKGJpdG1hcCwgIiglMDR4LCUwNHgpXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsIExPV09SRChuYW1lKSApOwogCiAgICAgaWYgKCFpbnN0YW5jZSkgIC8qIE9FTSBiaXRtYXAgKi8KZGlmZiAtLWdpdCBhL29iamVjdHMvYnJ1c2guYyBiL29iamVjdHMvYnJ1c2guYwppbmRleCBhZjY4ZDRjLi43YWRkNmQyIDEwMDY0NAotLS0gYS9vYmplY3RzL2JydXNoLmMKKysrIGIvb2JqZWN0cy9icnVzaC5jCkBAIC01Miw3ICs1Miw3IEBACiBIQlJVU0gxNiBXSU5BUEkgQ3JlYXRlSGF0Y2hCcnVzaDE2KCBJTlQxNiBzdHlsZSwgQ09MT1JSRUYgY29sb3IgKQogewogICAgIExPR0JSVVNIMzIgbG9nYnJ1c2ggPSB7IEJTX0hBVENIRUQsIGNvbG9yLCBzdHlsZSB9OwotICAgIGRwcmludGZfaW5mbyhnZGksICJDcmVhdGVIYXRjaEJydXNoMTY6ICVkICUwNmx4XG4iLCBzdHlsZSwgY29sb3IgKTsKKyAgICBUUkFDRShnZGksICIlZCAlMDZseFxuIiwgc3R5bGUsIGNvbG9yICk7CiAgICAgaWYgKChzdHlsZSA8IDApIHx8IChzdHlsZSA+PSBOQl9IQVRDSF9TVFlMRVMpKSByZXR1cm4gMDsKICAgICByZXR1cm4gQ3JlYXRlQnJ1c2hJbmRpcmVjdDMyKCAmbG9nYnJ1c2ggKTsKIH0KQEAgLTY0LDcgKzY0LDcgQEAKIEhCUlVTSDMyIFdJTkFQSSBDcmVhdGVIYXRjaEJydXNoMzIoIElOVDMyIHN0eWxlLCBDT0xPUlJFRiBjb2xvciApCiB7CiAgICAgTE9HQlJVU0gzMiBsb2dicnVzaCA9IHsgQlNfSEFUQ0hFRCwgY29sb3IsIHN0eWxlIH07Ci0gICAgZHByaW50Zl9pbmZvKGdkaSwgIkNyZWF0ZUhhdGNoQnJ1c2gzMjogJWQgJTA2bHhcbiIsIHN0eWxlLCBjb2xvciApOworICAgIFRSQUNFKGdkaSwgIiVkICUwNmx4XG4iLCBzdHlsZSwgY29sb3IgKTsKICAgICBpZiAoKHN0eWxlIDwgMCkgfHwgKHN0eWxlID49IE5CX0hBVENIX1NUWUxFUykpIHJldHVybiAwOwogICAgIHJldHVybiBDcmVhdGVCcnVzaEluZGlyZWN0MzIoICZsb2dicnVzaCApOwogfQpAQCAtODcsNyArODcsNyBAQAogICAgIExPR0JSVVNIMzIgbG9nYnJ1c2ggPSB7IEJTX1BBVFRFUk4sIDAsIDAgfTsKICAgICBCSVRNQVBPQkogKmJtcCwgKm5ld2JtcDsKIAotICAgIGRwcmludGZfaW5mbyhnZGksICJDcmVhdGVQYXR0ZXJuQnJ1c2g6ICUwNHhcbiIsIGhiaXRtYXAgKTsKKyAgICBUUkFDRShnZGksICIlMDR4XG4iLCBoYml0bWFwICk7CiAKICAgICAgIC8qIE1ha2UgYSBjb3B5IG9mIHRoZSBiaXRtYXAgKi8KIApAQCAtMTE4LDcgKzExOCw3IEBACiAgICAgQklUTUFQSU5GTyAqaW5mbywgKm5ld0luZm87CiAgICAgSU5UMzIgc2l6ZTsKICAgICAKLSAgICBkcHJpbnRmX2luZm8oZ2RpLCAiQ3JlYXRlRElCUGF0dGVybkJydXNoOiAlMDR4XG4iLCBoYml0bWFwICk7CisgICAgVFJBQ0UoZ2RpLCAiJTA0eFxuIiwgaGJpdG1hcCApOwogCiAgICAgICAvKiBNYWtlIGEgY29weSBvZiB0aGUgYml0bWFwICovCiAKQEAgLTE1Myw3ICsxNTMsNyBAQAogICAgIEJJVE1BUElORk8gKmluZm8sICpuZXdJbmZvOwogICAgIElOVDMyIHNpemU7CiAgICAgCi0gICAgZHByaW50Zl9pbmZvKGdkaSwgIkNyZWF0ZURJQlBhdHRlcm5CcnVzaDogJTA0eFxuIiwgaGJpdG1hcCApOworICAgIFRSQUNFKGdkaSwgIiUwNHhcbiIsIGhiaXRtYXAgKTsKIAogICAgICAgLyogTWFrZSBhIGNvcHkgb2YgdGhlIGJpdG1hcCAqLwogCkBAIC0xODUsNyArMTg1LDcgQEAKIEhCUlVTSDE2IFdJTkFQSSBDcmVhdGVTb2xpZEJydXNoMTYoIENPTE9SUkVGIGNvbG9yICkKIHsKICAgICBMT0dCUlVTSDMyIGxvZ2JydXNoID0geyBCU19TT0xJRCwgY29sb3IsIDAgfTsKLSAgICBkcHJpbnRmX2luZm8oZ2RpLCAiQ3JlYXRlU29saWRCcnVzaDE2OiAlMDZseFxuIiwgY29sb3IgKTsKKyAgICBUUkFDRShnZGksICIlMDZseFxuIiwgY29sb3IgKTsKICAgICByZXR1cm4gQ3JlYXRlQnJ1c2hJbmRpcmVjdDMyKCAmbG9nYnJ1c2ggKTsKIH0KIApAQCAtMTk2LDcgKzE5Niw3IEBACiBIQlJVU0gzMiBXSU5BUEkgQ3JlYXRlU29saWRCcnVzaDMyKCBDT0xPUlJFRiBjb2xvciApCiB7CiAgICAgTE9HQlJVU0gzMiBsb2dicnVzaCA9IHsgQlNfU09MSUQsIGNvbG9yLCAwIH07Ci0gICAgZHByaW50Zl9pbmZvKGdkaSwgIkNyZWF0ZVNvbGlkQnJ1c2gzMjogJTA2bHhcbiIsIGNvbG9yICk7CisgICAgVFJBQ0UoZ2RpLCAiJTA2bHhcbiIsIGNvbG9yICk7CiAgICAgcmV0dXJuIENyZWF0ZUJydXNoSW5kaXJlY3QzMiggJmxvZ2JydXNoICk7CiB9CiAKZGlmZiAtLWdpdCBhL29iamVjdHMvY2xpcHBpbmcuYyBiL29iamVjdHMvY2xpcHBpbmcuYwppbmRleCBjNDM1NzExLi4xNzM2MDkyIDEwMDY0NAotLS0gYS9vYmplY3RzL2NsaXBwaW5nLmMKKysrIGIvb2JqZWN0cy9jbGlwcGluZy5jCkBAIC02NSw3ICs2NSw3IEBACiAgICAgREMgKiBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICk7CiAgICAgaWYgKCFkYykgcmV0dXJuIEVSUk9SOwogCi0gICAgZHByaW50Zl9pbmZvKGNsaXBwaW5nLCAiU2VsZWN0Q2xpcFJnbjogJTA0eCAlMDR4XG4iLCBoZGMsIGhyZ24gKTsKKyAgICBUUkFDRShjbGlwcGluZywgIiUwNHggJTA0eFxuIiwgaGRjLCBocmduICk7CiAKICAgICBpZiAoaHJnbikKICAgICB7CkBAIC05NCw3ICs5NCw3IEBACiAgICAgREMgKiBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICk7CiAgICAgaWYgKCFkYyB8fCAhaHJnbikgcmV0dXJuIEVSUk9SOwogCi0gICAgZHByaW50Zl9pbmZvKGNsaXBwaW5nLCAiU2VsZWN0VmlzUmduOiAlMDR4ICUwNHhcbiIsIGhkYywgaHJnbiApOworICAgIFRSQUNFKGNsaXBwaW5nLCAiJTA0eCAlMDR4XG4iLCBoZGMsIGhyZ24gKTsKIAogICAgIGRjLT53LmZsYWdzICY9IH5EQ19ESVJUWTsKIApAQCAtMTI5LDcgKzEyOSw3IEBACiAJcmV0dXJuIE5VTExSRUdJT047ICAgLyogPz8gKi8KICAgICB9CiAKLSAgICBkcHJpbnRmX2luZm8oY2xpcHBpbmcsICJPZmZzZXRDbGlwUmduOiAlMDR4ICVkLCVkXG4iLCBoZGMsIHgsIHkgKTsKKyAgICBUUkFDRShjbGlwcGluZywgIiUwNHggJWQsJWRcbiIsIGhkYywgeCwgeSApOwogCiAgICAgaWYgKGRjLT53LmhDbGlwUmduKQogICAgIHsKQEAgLTE1MSw3ICsxNTEsNyBAQAogICAgIElOVDE2IHJldHZhbDsKICAgICBEQyAqIGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKTsKICAgICBpZiAoIWRjKSByZXR1cm4gRVJST1I7ICAgIAotICAgIGRwcmludGZfaW5mbyhjbGlwcGluZywgIk9mZnNldFZpc1JnbjogJTA0eCAlZCwlZFxuIiwgaGRjLCB4LCB5ICk7CisgICAgVFJBQ0UoY2xpcHBpbmcsICIlMDR4ICVkLCVkXG4iLCBoZGMsIHgsIHkgKTsKICAgICByZXR2YWwgPSBPZmZzZXRSZ24zMiggZGMtPncuaFZpc1JnbiwgeCwgeSApOwogICAgIENMSVBQSU5HX1VwZGF0ZUdDUmVnaW9uKCBkYyApOwogICAgIEdESV9IRUFQX1VOTE9DSyggaGRjICk7CkBAIC0yMjgsNyArMjI4LDcgQEAKICAgICB0b3AgICAgPSBZTFBUT0RQKCBkYywgdG9wICk7CiAgICAgYm90dG9tID0gWUxQVE9EUCggZGMsIGJvdHRvbSApOwogCi0gICAgZHByaW50Zl9pbmZvKGNsaXBwaW5nLCAiRXhjbHVkZUNsaXBSZWN0OiAlMDR4ICVkeCVkLCVkeCVkXG4iLAorICAgIFRSQUNFKGNsaXBwaW5nLCAiJTA0eCAlZHglZCwlZHglZFxuIiwKIAkgICAgaGRjLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20gKTsKICAgICByZXQgPSBDTElQUElOR19JbnRlcnNlY3RDbGlwUmVjdCggZGMsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgQ0xJUF9FWENMVURFICk7CiAgICAgR0RJX0hFQVBfVU5MT0NLKCBoZGMgKTsKQEAgLTI2OCw3ICsyNjgsNyBAQAogICAgIHRvcCAgICA9IFlMUFRPRFAoIGRjLCB0b3AgKTsKICAgICBib3R0b20gPSBZTFBUT0RQKCBkYywgYm90dG9tICk7CiAKLSAgICBkcHJpbnRmX2luZm8oY2xpcHBpbmcsICJJbnRlcnNlY3RDbGlwUmVjdDogJTA0eCAlZHglZCwlZHglZFxuIiwKKyAgICBUUkFDRShjbGlwcGluZywgIiUwNHggJWR4JWQsJWR4JWRcbiIsCiAJICAgIGhkYywgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tICk7CiAgICAgcmV0ID0gQ0xJUFBJTkdfSW50ZXJzZWN0Q2xpcFJlY3QoIGRjLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIENMSVBfSU5URVJTRUNUICk7CiAgICAgR0RJX0hFQVBfVU5MT0NLKCBoZGMgKTsKQEAgLTMyNiw3ICszMjYsNyBAQAogewogICAgIERDICogZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOwogICAgIGlmICghZGMpIHJldHVybiBFUlJPUjsgICAgCi0gICAgZHByaW50Zl9pbmZvKGNsaXBwaW5nLCAiRXhjbHVkZVZpc1JlY3Q6ICUwNHggJWR4JWQsJWR4JWRcbiIsCisgICAgVFJBQ0UoY2xpcHBpbmcsICIlMDR4ICVkeCVkLCVkeCVkXG4iLAogCSAgICBoZGMsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSApOwogCiAgICAgcmV0dXJuIENMSVBQSU5HX0ludGVyc2VjdFZpc1JlY3QoIGRjLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIFRSVUUgKTsKQEAgLTM0MSw3ICszNDEsNyBAQAogewogICAgIERDICogZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOwogICAgIGlmICghZGMpIHJldHVybiBFUlJPUjsgICAgCi0gICAgZHByaW50Zl9pbmZvKGNsaXBwaW5nLCAiSW50ZXJzZWN0VmlzUmVjdDogJTA0eCAlZHglZCwlZHglZFxuIiwKKyAgICBUUkFDRShjbGlwcGluZywgIiUwNHggJWR4JWQsJWR4JWRcbiIsCiAJICAgIGhkYywgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tICk7CiAKICAgICByZXR1cm4gQ0xJUFBJTkdfSW50ZXJzZWN0VmlzUmVjdCggZGMsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgRkFMU0UgKTsKQEAgLTM2NSw3ICszNjUsNyBAQAogICAgIERDICogZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOwogICAgIGlmICghZGMpIHJldHVybiBFUlJPUjsgICAgCiAKLSAgICBkcHJpbnRmX2luZm8oY2xpcHBpbmcsICJQdFZpc2libGU6ICUwNHggJWQsJWRcbiIsIGhkYywgeCwgeSApOworICAgIFRSQUNFKGNsaXBwaW5nLCAiJTA0eCAlZCwlZFxuIiwgaGRjLCB4LCB5ICk7CiAgICAgaWYgKCFkYy0+dy5oR0NDbGlwUmduKSByZXR1cm4gRkFMU0U7CiAKICAgICBpZiggZGMtPncuZmxhZ3MgJiBEQ19ESVJUWSApIFVQREFURV9ESVJUWV9EQyhkYyk7CkBAIC0zODMsNyArMzgzLDcgQEAKICAgICBSRUNUMTYgdG1wUmVjdDsKICAgICBEQyAqIGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKTsKICAgICBpZiAoIWRjKSByZXR1cm4gRkFMU0U7Ci0gICAgZHByaW50Zl9pbmZvKGNsaXBwaW5nLCJSZWN0VmlzaWJsZTogJTA0eCAlZCwlZHglZCwlZFxuIiwKKyAgICBUUkFDRShjbGlwcGluZywiJTA0eCAlZCwlZHglZCwlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgIGhkYywgcmVjdC0+bGVmdCwgcmVjdC0+dG9wLCByZWN0LT5yaWdodCwgcmVjdC0+Ym90dG9tICk7CiAgICAgaWYgKCFkYy0+dy5oR0NDbGlwUmduKSByZXR1cm4gRkFMU0U7CiAgICAgLyogY29weSByZWN0YW5nbGUgdG8gYXZvaWQgb3ZlcndyaXRpbmcgYnkgTFB0b0RQICovCkBAIC00NjAsNyArNDYwLDcgQEAKICAgICBSR05PQkogKm9iaiwgKmNvcHlPYmo7CiAgICAgREMgKiBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICk7CiAgICAgaWYgKCFkYykgcmV0dXJuIDA7Ci0gICAgZHByaW50Zl9pbmZvKGNsaXBwaW5nLCAiU2F2ZVZpc1JnbjogJTA0eFxuIiwgaGRjICk7CisgICAgVFJBQ0UoY2xpcHBpbmcsICIlMDR4XG4iLCBoZGMgKTsKICAgICBpZiAoIWRjLT53LmhWaXNSZ24pCiAgICAgewogICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJTYXZlVmlzUmduOiBoVmlzUmduIGlzIHplcm8uIFBsZWFzZSByZXBvcnQgdGhpcy5cbiIgKTsKQEAgLTUxMiw3ICs1MTIsNyBAQAogICAgICAgICBHRElfSEVBUF9VTkxPQ0soIGhkYyApOwogICAgICAgICByZXR1cm4gRVJST1I7ICAgIAogICAgIH0KLSAgICBkcHJpbnRmX2luZm8oY2xpcHBpbmcsICJSZXN0b3JlVmlzUmduOiAlMDR4XG4iLCBoZGMgKTsKKyAgICBUUkFDRShjbGlwcGluZywgIiUwNHhcbiIsIGhkYyApOwogICAgIGlmICghKG9iaiA9IChSR05PQkogKikgR0RJX0dldE9ialB0ciggZGMtPncuaFZpc1JnbiwgUkVHSU9OX01BR0lDICkpKQogICAgIHsKICAgICAgICAgR0RJX0hFQVBfVU5MT0NLKCBoZGMgKTsKZGlmZiAtLWdpdCBhL29iamVjdHMvY29sb3IuYyBiL29iamVjdHMvY29sb3IuYwppbmRleCA2Mzk5ZDM5Li45ZjM3ZWJjIDEwMDY0NAotLS0gYS9vYmplY3RzL2NvbG9yLmMKKysrIGIvb2JqZWN0cy9jb2xvci5jCkBAIC0yODgsNyArMjg4LDcgQEAKIAogICAgIENPTE9SX3N5c1BhbCA9IChQQUxFVFRFRU5UUlkqKXhtYWxsb2Moc2l6ZW9mKFBBTEVUVEVFTlRSWSkqY3MtPnNpemUpOwogCi0gICAgZHByaW50Zl9pbmZvKHBhbGV0dGUsIlx0YnVpbGRpbmcgcHJpdmF0ZSBtYXAgLSAlaSBwYWxldHRlIGVudHJpZXNcbiIsIGNzLT5zaXplKTsKKyAgICBUUkFDRShwYWxldHRlLCJcdGJ1aWxkaW5nIHByaXZhdGUgbWFwIC0gJWkgcGFsZXR0ZSBlbnRyaWVzXG4iLCBjcy0+c2l6ZSk7CiAKICAgICAgIC8qIEFsbG9jYXRlIHN5c3RlbSBwYWxldHRlIGNvbG9ycyAqLyAKIApAQCAtMzQ1LDkgKzM0NSw5IEBACiAgICBDT0xPUl9tYXggPSBQUk9GSUxFX0dldFdpbmVJbmlJbnQoICJvcHRpb25zIiwgIkFsbG9jU3lzdGVtQ29sb3JzIiwgMjU2KTsKICAgIGlmIChDT0xPUl9tYXggPiAyNTYpIENPTE9SX21heCA9IDI1NjsKICAgIGVsc2UgaWYgKENPTE9SX21heCA8IDIwKSBDT0xPUl9tYXggPSAyMDsKLSAgIGRwcmludGZfaW5mbyhwYWxldHRlLCJDT0xPUl9Jbml0OiAlZCBjb2xvcnMgY29uZmlndXJlZC5cbiIsIENPTE9SX21heCk7CisgICBUUkFDRShwYWxldHRlLCIlZCBjb2xvcnMgY29uZmlndXJlZC5cbiIsIENPTE9SX21heCk7CiAgICAKLSAgIGRwcmludGZfaW5mbyhwYWxldHRlLCJcdGJ1aWxkaW5nIHNoYXJlZCBtYXAgLSAlaSBwYWxldHRlIGVudHJpZXNcbiIsIGNzLT5zaXplKTsKKyAgIFRSQUNFKHBhbGV0dGUsIlx0YnVpbGRpbmcgc2hhcmVkIG1hcCAtICVpIHBhbGV0dGUgZW50cmllc1xuIiwgY3MtPnNpemUpOwogCiAgICAvKiBCZSBuaWNlIGFuZCBhbGxvY2F0ZSBzeXN0ZW0gY29sb3JzIGFzIHJlYWQtb25seSAqLwogCkBAIC0zNjQsNyArMzY0LDcgQEAKIAkgICAgIAogICAgICAgICAgICAgIGlmKCAhd2FybisrICkgCiAJICAgICB7Ci0JCSAgZHByaW50Zl93YXJuKHBhbGV0dGUsICJOb3QgZW5vdWdoIGNvbG9ycyBmb3IgdGhlIGZ1bGwgc3lzdGVtIHBhbGV0dGUuXG4iKTsKKwkJICBXQVJOKHBhbGV0dGUsICJOb3QgZW5vdWdoIGNvbG9ycyBmb3IgdGhlIGZ1bGwgc3lzdGVtIHBhbGV0dGUuXG4iKTsKIAogCSAgICAgICAgICBicCA9IEJsYWNrUGl4ZWwoZGlzcGxheSwgRGVmYXVsdFNjcmVlbihkaXNwbGF5KSk7CiAJICAgICAgICAgIHdwID0gV2hpdGVQaXhlbChkaXNwbGF5LCBEZWZhdWx0U2NyZWVuKGRpc3BsYXkpKTsKQEAgLTQwMiw3ICs0MDIsNyBAQAogCiAgICAgICAgIHN5c1BpeGVsW2ldID0gY29sb3IucGl4ZWw7CiAKLSAgICAgICAgZHByaW50Zl9pbmZvKHBhbGV0dGUsIlx0c3lzY29sb3IoJWx4KSAtPiBwaXhlbCAlaVxuIiwKKyAgICAgICAgVFJBQ0UocGFsZXR0ZSwiXHRzeXNjb2xvciglbHgpIC0+IHBpeGVsICVpXG4iLAogCQkgICAgICAqKENPTE9SUkVGKikoX19zeXNQYWxUZW1wbGF0ZStpKSwgKGludCljb2xvci5waXhlbCk7CiAKICAgICAgICAgLyogU2V0IEVHQSBtYXBwaW5nIGlmIGNvbG9yIGluIHRoZSBmaXJzdCBvciBsYXN0IGVpZ2h0ICovCkBAIC00MTksNyArNDE5LDcgQEAKICAgICAgewogCWludCBjX21pbiA9IDAsIGNfbWF4ID0gY3MtPnNpemUsIGNfdmFsOwogCi0JZHByaW50Zl9pbmZvKHBhbGV0dGUsIlx0ZHluYW1pYyBjb2xvcm1hcC4uLiBcbiIpOworCVRSQUNFKHBhbGV0dGUsIlx0ZHluYW1pYyBjb2xvcm1hcC4uLiBcbiIpOwogCiAJLyogY29tbWVudCB0aGlzIG91dCBpZiB5b3Ugd2FudCB0byBkZWJ1ZyBwYWxldHRlIGluaXQgKi8KIApAQCAtNDYxLDcgKzQ2MSw3IEBACiAKIAlUU1hVbmdyYWJTZXJ2ZXIoZGlzcGxheSk7CiAKLQlkcHJpbnRmX2luZm8ocGFsZXR0ZSwiYWRqdXN0ZWQgc2l6ZSAlaSBjb2xvcmNlbGxzXG4iLCBjcy0+c2l6ZSk7CisJVFJBQ0UocGFsZXR0ZSwiYWRqdXN0ZWQgc2l6ZSAlaSBjb2xvcmNlbGxzXG4iLCBjcy0+c2l6ZSk7CiAgICAgIH0KICAgIGVsc2UgaWYoIGNTcGFjZS5mbGFncyAmIENPTE9SX1ZJUlRVQUwgKSAKIAl7CkBAIC00NzAsMTIgKzQ3MCwxMiBAQAogCSAgICogdG8gbWFpbnRhaW4gY29tcGF0aWJpbGl0eQogCSAgICovCiAJICBjcy0+c2l6ZSA9IDI1NjsKLQkgIGRwcmludGZfaW5mbyhwYWxldHRlLCJcdHZpcnR1YWwgY29sb3JzcGFjZSAtIHNjcmVlbmRlcHRoICVpXG4iLCBzY3JlZW5EZXB0aCk7CisJICBUUkFDRShwYWxldHRlLCJcdHZpcnR1YWwgY29sb3JzcGFjZSAtIHNjcmVlbmRlcHRoICVpXG4iLCBzY3JlZW5EZXB0aCk7CiAJfQogICAgZWxzZSBjcy0+c2l6ZSA9IE5CX1JFU0VSVkVEX0NPTE9SUzsJLyogc3lzdGVtIHBhbGV0dGUgb25seSAtIGhvd2V2ZXIgd2UgY2FuIGFsbG9jIGEgYnVuY2gKIAkJCSAgICAgICAgICAgICAgICAgKiBvZiBjb2xvcnMgYW5kIG1hcCB0byB0aGVtICovCiAKLSAgIGRwcmludGZfaW5mbyhwYWxldHRlLCJTaGFyZWQgc3lzdGVtIHBhbGV0dGUgdXNlcyAlaSBjb2xvcnMuXG4iLCBjcy0+c2l6ZSk7CisgICBUUkFDRShwYWxldHRlLCJTaGFyZWQgc3lzdGVtIHBhbGV0dGUgdXNlcyAlaSBjb2xvcnMuXG4iLCBjcy0+c2l6ZSk7CiAKICAgIC8qIHNldCBnYXAgdG8gYWNjb3VudCBmb3IgcGl4ZWwgc2hvcnRhZ2UuIEl0IGhhcyB0byBiZSByaWdodCBpbiB0aGUgY2VudGVyCiAgICAgKiBvZiB0aGUgc3lzdGVtIHBhbGV0dGUgYmVjYXVzZSBvdGhlcndpc2UgcmFzdGVyIG9wcyBnZXQgc2NyZXdlZC4gKi8KQEAgLTUyOSw3ICs1MjksNyBAQAogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgQ09MT1JfUGFsZXR0ZVRvUGl4ZWxbaV0gPSBpOwogCi0gICAgICBkcHJpbnRmX2luZm8ocGFsZXR0ZSwiXHRpbmRleCAlaSAtPiBwaXhlbCAlaVxuIiwgaSwgQ09MT1JfUGFsZXR0ZVRvUGl4ZWxbaV0pOworICAgICAgVFJBQ0UocGFsZXR0ZSwiXHRpbmRleCAlaSAtPiBwaXhlbCAlaVxuIiwgaSwgQ09MT1JfUGFsZXR0ZVRvUGl4ZWxbaV0pOwogCiAgICAgICBpZiggQ09MT1JfUGl4ZWxUb1BhbGV0dGUgKQogICAgICAgICAgIENPTE9SX1BpeGVsVG9QYWxldHRlW0NPTE9SX1BhbGV0dGVUb1BpeGVsW2ldXSA9IGk7CkBAIC01NzQsNyArNTc0LDcgQEAKIAogICAgIHZpc3VhbCA9IERlZmF1bHRWaXN1YWwoIGRpc3BsYXksIERlZmF1bHRTY3JlZW4oZGlzcGxheSkgKTsKIAotICAgIGRwcmludGZfaW5mbyhwYWxldHRlLCJDT0xPUl9Jbml0OiBpbml0aWFsaXppbmcgcGFsZXR0ZSBtYW5hZ2VyLi4uXG4iKTsKKyAgICBUUkFDRShwYWxldHRlLCJpbml0aWFsaXppbmcgcGFsZXR0ZSBtYW5hZ2VyLi4uXG4iKTsKIAogICAgIHdoaXRlID0gV2hpdGVQaXhlbE9mU2NyZWVuKCBzY3JlZW4gKTsKICAgICBibGFjayA9IEJsYWNrUGl4ZWxPZlNjcmVlbiggc2NyZWVuICk7CkBAIC02NDksNyArNjQ5LDcgQEAKICAgICB9CiAgICAgfQogCi0gICAgZHByaW50Zl9pbmZvKHBhbGV0dGUsIiB2aXN1YWwgY2xhc3MgJWkgKCVpKVxuIiwgCisgICAgVFJBQ0UocGFsZXR0ZSwiIHZpc3VhbCBjbGFzcyAlaSAoJWkpXG4iLCAKIAkJICAgIHZpc3VhbC0+Y2xhc3MsIGNTcGFjZS5tb25vUGxhbmUpOwogCiAgICAgbWVtc2V0KENPTE9SX2ZyZWVMaXN0LCAwLCAyNTYqc2l6ZW9mKHVuc2lnbmVkIGNoYXIpKTsKQEAgLTk0MSw3ICs5NDEsNyBAQAogCiAJaWYoICFwYWxQdHIgKSByZXR1cm4gMDsKIAllbHNlIGlmKCAhcGFsUHRyLT5tYXBwaW5nICkgCi0gICAgICAgICAgICBkcHJpbnRmX3dhcm4ocGFsZXR0ZSwgIlx0cGFsZXR0ZSAlMDR4IGlzIG5vdCByZWFsaXplZFxuIiwgZGMtPncuaFBhbGV0dGUpOworICAgICAgICAgICAgV0FSTihwYWxldHRlLCAiXHRwYWxldHRlICUwNHggaXMgbm90IHJlYWxpemVkXG4iLCBkYy0+dy5oUGFsZXR0ZSk7CiAKIAlzd2l0Y2goc3BlY190eXBlKQkvKiB3ZSBoYXZlIHRvIHBlcnVzZSBEQyBhbmQgc3lzdGVtIHBhbGV0dGUgKi8KICAgICAJewpAQCAtOTYwLDcgKzk2MCw3IEBACiAJICAgIAlpbmRleCA9IENPTE9SX1BhbGV0dGVMb29rdXBQaXhlbCggQ09MT1Jfc3lzUGFsLCAyNTYsIAogCQkJCQkJICBDT0xPUl9QYWxldHRlVG9QaXhlbCwgY29sb3IsIEZBTFNFKTsKIAotCQkvKiBkcHJpbnRmX2luZm8ocGFsZXR0ZSwiXHRSR0IoJWx4KSAtPiBwaXhlbCAlaVxuIiwgY29sb3IsIGluZGV4KTsKKwkJLyogVFJBQ0UocGFsZXR0ZSwiXHRSR0IoJWx4KSAtPiBwaXhlbCAlaVxuIiwgY29sb3IsIGluZGV4KTsKIAkJICovCiAJICAgIAlicmVhazsKICAgICAgICAJICAgIGNhc2UgMTogIC8qIFBBTEVUVEVJTkRFWCAqLwpAQCAtOTcwLDE0ICs5NzAsMTQgQEAKIAkJICAgIGZwcmludGYoc3RkZXJyLCAiXHRSR0IoJWx4KSA6IGluZGV4ICVpIGlzIG91dCBvZiBib3VuZHNcbiIsIGNvbG9yLCBpbmRleCk7IAogCQllbHNlIGlmKCBwYWxQdHItPm1hcHBpbmcgKSBpbmRleCA9IHBhbFB0ci0+bWFwcGluZ1tpbmRleF07CiAKLQkJLyogIGRwcmludGZfaW5mbyhwYWxldHRlLCJcdFBBTEVUVEVJTkRFWCglMDR4KSAtPiBwaXhlbCAlaVxuIiwgKFdPUkQpY29sb3IsIGluZGV4KTsKKwkJLyogIFRSQUNFKHBhbGV0dGUsIlx0UEFMRVRURUlOREVYKCUwNHgpIC0+IHBpeGVsICVpXG4iLCAoV09SRCljb2xvciwgaW5kZXgpOwogCQkgKi8KIAkJYnJlYWs7CiAgICAgICAgICAgICBjYXNlIDI6ICAvKiBQQUxFVFRFUkdCICovCiAJCWluZGV4ID0gQ09MT1JfUGFsZXR0ZUxvb2t1cFBpeGVsKCBwYWxQdHItPmxvZ3BhbGV0dGUucGFsUGFsRW50cnksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFsUHRyLT5sb2dwYWxldHRlLnBhbE51bUVudHJpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWxQdHItPm1hcHBpbmcsIGNvbG9yLCBGQUxTRSk7Ci0JCS8qIGRwcmludGZfaW5mbyhwYWxldHRlLCJcdFBBTEVUVEVSR0IoJWx4KSAtPiBwaXhlbCAlaVxuIiwgY29sb3IsIGluZGV4KTsKKwkJLyogVFJBQ0UocGFsZXR0ZSwiXHRQQUxFVFRFUkdCKCVseCkgLT4gcGl4ZWwgJWlcbiIsIGNvbG9yLCBpbmRleCk7CiAJCSAqLwogCQlicmVhazsKIAl9CkBAIC0xMDc3LDcgKzEwNzcsNyBAQAogICAgICAgICBpZiggIXByZXZNYXBwaW5nIHx8IHBhbFB0ci0+bWFwcGluZ1t1U3RhcnRdICE9IGluZGV4ICkgaVJlbWFwcGVkKys7CiAgICAgICAgIHBhbFB0ci0+bWFwcGluZ1t1U3RhcnRdID0gaW5kZXg7CiAKLSAgICAgICAgZHByaW50Zl9pbmZvKHBhbGV0dGUsIlx0ZW50cnkgJWkgKCVseCkgLT4gcGl4ZWwgJWlcbiIsIHVTdGFydCwgCisgICAgICAgIFRSQUNFKHBhbGV0dGUsIlx0ZW50cnkgJWkgKCVseCkgLT4gcGl4ZWwgJWlcbiIsIHVTdGFydCwgCiAJCQkJKihDT0xPUlJFRiopKHBhbFB0ci0+bG9ncGFsZXR0ZS5wYWxQYWxFbnRyeSArIHVTdGFydCksIGluZGV4KTsKIAkKICAgICB9CmRpZmYgLS1naXQgYS9vYmplY3RzL2N1cnNvcmljb24uYyBiL29iamVjdHMvY3Vyc29yaWNvbi5jCmluZGV4IGRiMjM1NzQuLmYxYmIzMmIgMTAwNjQ0Ci0tLSBhL29iamVjdHMvY3Vyc29yaWNvbi5jCisrKyBiL29iamVjdHMvY3Vyc29yaWNvbi5jCkBAIC0yODksNyArMjg5LDcgQEAKICAgICBCSVRNQVBJTkZPICpibWk7CiAgICAgSERDMzIgaGRjOwogCi0gICAgZHByaW50Zl9pbmZvKGN1cnNvciwiQ3JlYXRlRnJvbVJlc291cmNlOiAlMDh4ICgldSBieXRlcyksIHZlciAlMDh4LCAlaXglaSAlcyAlc1xuIiwKKyAgICBUUkFDRShjdXJzb3IsIiUwOHggKCV1IGJ5dGVzKSwgdmVyICUwOHgsICVpeCVpICVzICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKWJpdHMsIGNiU2l6ZSwgKHVuc2lnbmVkKWR3VmVyc2lvbiwgd2lkdGgsIGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSWNvbiA/ICJpY29uIiA6ICJjdXJzb3IiLCBjRmxhZyA/ICJtb25vIiA6ICIiICk7CiAgICAgaWYgKGR3VmVyc2lvbiA9PSAweDAwMDIwMDAwKQpAQCAtNDQwLDIyICs0NDAsMjEgQEAKIH0KIAogCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgIENyZWF0ZUljb25Gcm9tUmVzb3VyY2UgICAgICAgICAgKFVTRVIzMikKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICBDcmVhdGVJY29uRnJvbVJlc291cmNlICAgICAgICAgIChVU0VSMzIuPz8/KQorICogRklYTUU6CisgKiAgCWJvbkBlbGVrdHJvbi5pa3AucGh5c2lrLnR1LWRhcm1zdGFkdC5kZSA5NzExMzA6IFRlc3Qgd2l0aCB3ZWRpdHJlcworICoJc2hvd2VkIG9ubHkgYmxhbmsgbGF5b3V0LiBDb3VsZG4ndCBkZXRlcm1pbmUgaWYgdGhpcyBpcyBhIHByb2JsZW0KKyAqCXdpdGggQ3JlYXRlSWNvbkZyb21SZXNvdXJjZTMyIG9yIHRoZSBhcHBsaWNhdGlvbi4gVGhlIGFwcGxpY2F0aW9uCisgKgl3aW5kb3dzIGJlaGF2ZXMgc3RyYW5nZSAobm8gcmVkcmF3KSBiZWZvcmUgQ3JlYXRlSWNvbkZyb21SZXNvdXJjZTMyCiAgKi8KIEhJQ09OMzIgV0lOQVBJIENyZWF0ZUljb25Gcm9tUmVzb3VyY2UzMiggTFBCWVRFIGJpdHMsIFVJTlQzMiBjYlNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTDMyIGJJY29uLCBEV09SRCBkd1ZlcnNpb24pCi0vKkZJWE1FOiBib25AZWxla3Ryb24uaWtwLnBoeXNpay50dS1kYXJtc3RhZHQuZGUgOTcxMTMwOiBUZXN0IHdpdGggd2VkaXRyZXMKLQkgc2hvd2VkIG9ubHkgYmxhbmsgbGF5b3V0LiBDb3VsZG4ndCBkZXRlcm1pbmUgaWYgdGhpcyBpcyBhIHByb2JsZW0KLQkgd2l0aCBDcmVhdGVJY29uRnJvbVJlc291cmNlMzIgb3IgdGhlIGFwcGxpY2F0aW9uLiBUaGUgYXBwbGljYXRpb24KLQkgd2luZG93cyBiZWhhdmVzIHN0cmFuZ2UgKG5vIHJlZHJhdykgYmVmb3JlICBDcmVhdGVJY29uRnJvbVJlc291cmNlMzIKLSovCiB7CiAgICAgSElDT04zMiByZXQ7CiAgICAgcmV0ID0gQ3JlYXRlSWNvbkZyb21SZXNvdXJjZUV4MTYoIGJpdHMsIGNiU2l6ZSwgYkljb24sIGR3VmVyc2lvbiwgMCwwLDApOwotICAgIGZwcmludGYoc3RkbmltcCwiQ3JlYXRlSWNvbkZyb21SZXNvdXJjZTMgcHJvYmFibHkgb25seSBhIHN0dWJcbiIpOwotICAgIGRwcmludGZfaW5mbyhpY29uLCAKLQkiQ3JlYXRlSWNvbkZyb21SZXNvdXJjZTMyICVzIGF0ICVwIHNpemUgJWQgd2ludmVyICVkIHJldHVybiAweCUwNHhcbiIsCisgICAgRklYTUUoaWNvbiwicHJvYmFibHkgb25seSBhIHN0dWJcbiIpOworICAgIFRSQUNFKGljb24sICIlcyBhdCAlcCBzaXplICVkIHdpbnZlciAlZCByZXR1cm4gMHglMDR4XG4iLAogICAgICAgICAgICAgICAgICAoYkljb24pPyJJY29uIjoiQ3Vyc29yIixiaXRzLGNiU2l6ZSxiSWNvbixyZXQpOwogICAgIHJldHVybiByZXQ7CiB9CkBAIC02MzcsNyArNjM2LDcgQEAKICAgICAgICAgICAgQ09MT1JSRUYgICAgICAgY29sOwogICAgICAgICAgICBDVVJTT1JJQ09OSU5GTyBjSTsKIAotCSAgIGRwcmludGZfaW5mbyhpY29uLCAiSWNvblRvQ3Vyc29yOlslMDR4XSAlaXglaSAlaWJwcCAoYm9ndXMgJWlicHMpXG4iLCAKKwkgICBUUkFDRShpY29uLCAiWyUwNHhdICVpeCVpICVpYnBwIChib2d1cyAlaWJwcylcbiIsIAogCQloSWNvbiwgcEljb24tPm5XaWR0aCwgcEljb24tPm5IZWlnaHQsIHBJY29uLT5iQml0c1BlclBpeGVsLCBwSWNvbi0+bldpZHRoQnl0ZXMgKTsKIAogCSAgIHhvcl93aWR0aCA9IEJJVE1BUF9HZXRCaXRzV2lkdGgoIHBJY29uLT5uV2lkdGgsIGJwcCApOwpAQCAtNzA0LDEwICs3MDMsMTAgQEAKIEhDVVJTT1IxNiBXSU5BUEkgTG9hZEN1cnNvcjE2KCBISU5TVEFOQ0UxNiBoSW5zdGFuY2UsIFNFR1BUUiBuYW1lICkKIHsKICAgICBpZiAoSElXT1JEKG5hbWUpKQotICAgICAgICBkcHJpbnRmX2luZm8oY3Vyc29yLCAiTG9hZEN1cnNvcjE2OiAlMDR4ICclcydcbiIsCisgICAgICAgIFRSQUNFKGN1cnNvciwgIiUwNHggJyVzJ1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGhJbnN0YW5jZSwgKGNoYXIgKilQVFJfU0VHX1RPX0xJTiggbmFtZSApICk7CiAgICAgZWxzZQotICAgICAgICBkcHJpbnRmX2luZm8oY3Vyc29yLCAiTG9hZEN1cnNvcjE2OiAlMDR4ICUwNHhcbiIsCisgICAgICAgIFRSQUNFKGN1cnNvciwgIiUwNHggJTA0eFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGhJbnN0YW5jZSwgTE9XT1JEKG5hbWUpICk7CiAKICAgICByZXR1cm4gQ1VSU09SSUNPTl9Mb2FkMTYoIGhJbnN0YW5jZSwgbmFtZSwKQEAgLTcyMSwxMCArNzIwLDEwIEBACiBISUNPTjE2IFdJTkFQSSBMb2FkSWNvbjE2KCBISU5TVEFOQ0UxNiBoSW5zdGFuY2UsIFNFR1BUUiBuYW1lICkKIHsKICAgICBpZiAoSElXT1JEKG5hbWUpKQotICAgICAgICBkcHJpbnRmX2luZm8oaWNvbiwgIkxvYWRJY29uOiAlMDR4ICclcydcbiIsCisgICAgICAgIFRSQUNFKGljb24sICIlMDR4ICclcydcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgaEluc3RhbmNlLCAoY2hhciAqKVBUUl9TRUdfVE9fTElOKCBuYW1lICkgKTsKICAgICBlbHNlCi0gICAgICAgIGRwcmludGZfaW5mbyhpY29uLCAiTG9hZEljb246ICUwNHggJTA0eFxuIiwKKyAgICAgICAgVFJBQ0UoaWNvbiwgIiUwNHggJTA0eFxuIiwKICAgICAgICAgICAgICAgICAgICAgICBoSW5zdGFuY2UsIExPV09SRChuYW1lKSApOwogCiAgICAgcmV0dXJuIENVUlNPUklDT05fTG9hZDE2KCBoSW5zdGFuY2UsIG5hbWUsCkBAIC03NDMsNyArNzQyLDcgQEAKIHsKICAgICBDVVJTT1JJQ09OSU5GTyBpbmZvID0geyB7IHhIb3RTcG90LCB5SG90U3BvdCB9LCBuV2lkdGgsIG5IZWlnaHQsIDAsIDEsIDEgfTsKIAotICAgIGRwcmludGZfaW5mbyhjdXJzb3IsICJDcmVhdGVDdXJzb3I6ICVkeCVkIHNwb3Q9JWQsJWQgeG9yPSVwIGFuZD0lcFxuIiwKKyAgICBUUkFDRShjdXJzb3IsICIlZHglZCBzcG90PSVkLCVkIHhvcj0lcCBhbmQ9JXBcbiIsCiAgICAgICAgICAgICAgICAgICAgIG5XaWR0aCwgbkhlaWdodCwgeEhvdFNwb3QsIHlIb3RTcG90LCBscFhPUmJpdHMsIGxwQU5EYml0cyk7CiAgICAgcmV0dXJuIENyZWF0ZUN1cnNvckljb25JbmRpcmVjdCggaEluc3RhbmNlLCAmaW5mbywgbHBBTkRiaXRzLCBscFhPUmJpdHMgKTsKIH0KQEAgLTc1OSw3ICs3NTgsNyBAQAogewogICAgIENVUlNPUklDT05JTkZPIGluZm8gPSB7IHsgeEhvdFNwb3QsIHlIb3RTcG90IH0sIG5XaWR0aCwgbkhlaWdodCwgMCwgMSwgMSB9OwogCi0gICAgZHByaW50Zl9pbmZvKGN1cnNvciwgIkNyZWF0ZUN1cnNvcjogJWR4JWQgc3BvdD0lZCwlZCB4b3I9JXAgYW5kPSVwXG4iLAorICAgIFRSQUNFKGN1cnNvciwgIiVkeCVkIHNwb3Q9JWQsJWQgeG9yPSVwIGFuZD0lcFxuIiwKICAgICAgICAgICAgICAgICAgICAgbldpZHRoLCBuSGVpZ2h0LCB4SG90U3BvdCwgeUhvdFNwb3QsIGxwWE9SYml0cywgbHBBTkRiaXRzKTsKICAgICByZXR1cm4gQ3JlYXRlQ3Vyc29ySWNvbkluZGlyZWN0KCBNT0RVTEVfSEFORExFdG9ITU9EVUxFMTYoIGhJbnN0YW5jZSApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvLCBscEFORGJpdHMsIGxwWE9SYml0cyApOwpAQCAtNzc1LDcgKzc3NCw3IEBACiB7CiAgICAgQ1VSU09SSUNPTklORk8gaW5mbyA9IHsgeyAwLCAwIH0sIG5XaWR0aCwgbkhlaWdodCwgMCwgYlBsYW5lcywgYkJpdHNQaXhlbH07CiAKLSAgICBkcHJpbnRmX2luZm8oaWNvbiwgIkNyZWF0ZUljb246ICVkeCVkeCVkLCB4b3I9JXAsIGFuZD0lcFxuIiwKKyAgICBUUkFDRShpY29uLCAiJWR4JWR4JWQsIHhvcj0lcCwgYW5kPSVwXG4iLAogICAgICAgICAgICAgICAgICAgbldpZHRoLCBuSGVpZ2h0LCBiUGxhbmVzICogYkJpdHNQaXhlbCwgbHBYT1JiaXRzLCBscEFORGJpdHMpOwogICAgIHJldHVybiBDcmVhdGVDdXJzb3JJY29uSW5kaXJlY3QoIGhJbnN0YW5jZSwgJmluZm8sIGxwQU5EYml0cywgbHBYT1JiaXRzICk7CiB9CkBAIC03OTAsNyArNzg5LDcgQEAKIHsKICAgICBDVVJTT1JJQ09OSU5GTyBpbmZvID0geyB7IDAsIDAgfSwgbldpZHRoLCBuSGVpZ2h0LCAwLCBiUGxhbmVzLCBiQml0c1BpeGVsfTsKIAotICAgIGRwcmludGZfaW5mbyhpY29uLCAiQ3JlYXRlSWNvbjogJWR4JWR4JWQsIHhvcj0lcCwgYW5kPSVwXG4iLAorICAgIFRSQUNFKGljb24sICIlZHglZHglZCwgeG9yPSVwLCBhbmQ9JXBcbiIsCiAgICAgICAgICAgICAgICAgICBuV2lkdGgsIG5IZWlnaHQsIGJQbGFuZXMgKiBiQml0c1BpeGVsLCBscFhPUmJpdHMsIGxwQU5EYml0cyk7CiAgICAgcmV0dXJuIENyZWF0ZUN1cnNvckljb25JbmRpcmVjdCggTU9EVUxFX0hBTkRMRXRvSE1PRFVMRTE2KCBoSW5zdGFuY2UgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mbywgbHBBTkRiaXRzLCBscFhPUmJpdHMgKTsKQEAgLTgzMSw3ICs4MzAsNyBAQAogICovCiBISUNPTjE2IFdJTkFQSSBDb3B5SWNvbjE2KCBISU5TVEFOQ0UxNiBoSW5zdGFuY2UsIEhJQ09OMTYgaEljb24gKQogewotICAgIGRwcmludGZfaW5mbyhpY29uLCAiQ29weUljb24xNjogJTA0eCAlMDR4XG4iLCBoSW5zdGFuY2UsIGhJY29uICk7CisgICAgVFJBQ0UoaWNvbiwgIiUwNHggJTA0eFxuIiwgaEluc3RhbmNlLCBoSWNvbiApOwogICAgIHJldHVybiBDVVJTT1JJQ09OX0NvcHkoIGhJbnN0YW5jZSwgaEljb24gKTsKIH0KIApAQCAtODQzLDcgKzg0Miw3IEBACiB7CiAgIEhUQVNLMTYgaFRhc2sgPSBHZXRDdXJyZW50VGFzayAoKTsKICAgVERCKiBwVGFzayA9IChUREIgKikgR2xvYmFsTG9jazE2IChoVGFzayk7Ci0gICAgZHByaW50Zl9pbmZvKGljb24sICJDb3B5SWNvbjMyOiAlMDR4XG4iLCBoSWNvbiApOworICAgIFRSQUNFKGljb24sICIlMDR4XG4iLCBoSWNvbiApOwogICByZXR1cm4gQ1VSU09SSUNPTl9Db3B5KCBwVGFzay0+aEluc3RhbmNlLCBoSWNvbiApOwogfQogCkBAIC04NTMsNyArODUyLDcgQEAKICAqLwogSENVUlNPUjE2IFdJTkFQSSBDb3B5Q3Vyc29yMTYoIEhJTlNUQU5DRTE2IGhJbnN0YW5jZSwgSENVUlNPUjE2IGhDdXJzb3IgKQogewotICAgIGRwcmludGZfaW5mbyhjdXJzb3IsICJDb3B5Q3Vyc29yMTY6ICUwNHggJTA0eFxuIiwgaEluc3RhbmNlLCBoQ3Vyc29yICk7CisgICAgVFJBQ0UoY3Vyc29yLCAiJTA0eCAlMDR4XG4iLCBoSW5zdGFuY2UsIGhDdXJzb3IgKTsKICAgICByZXR1cm4gQ1VSU09SSUNPTl9Db3B5KCBoSW5zdGFuY2UsIGhDdXJzb3IgKTsKIH0KIApAQCAtODcyLDcgKzg3MSw3IEBACiAgKi8KIEJPT0wzMiBXSU5BUEkgRGVzdHJveUljb24zMiggSElDT04zMiBoSWNvbiApCiB7Ci0gICAgZHByaW50Zl9pbmZvKGljb24sICJEZXN0cm95SWNvbjogJTA0eFxuIiwgaEljb24gKTsKKyAgICBUUkFDRShpY29uLCAiJTA0eFxuIiwgaEljb24gKTsKICAgICAvKiBGSVhNRTogc2hvdWxkIGNoZWNrIGZvciBPRU0gaWNvbiBoZXJlICovCiAgICAgcmV0dXJuIChGcmVlUmVzb3VyY2UxNiggaEljb24gKSA9PSAwKTsKIH0KQEAgLTg5Miw3ICs4OTEsNyBAQAogICovCiBCT09MMzIgV0lOQVBJIERlc3Ryb3lDdXJzb3IzMiggSENVUlNPUjMyIGhDdXJzb3IgKQogewotICAgIGRwcmludGZfaW5mbyhjdXJzb3IsICJEZXN0cm95Q3Vyc29yOiAlMDR4XG4iLCBoQ3Vyc29yICk7CisgICAgVFJBQ0UoY3Vyc29yLCAiJTA0eFxuIiwgaEN1cnNvciApOwogICAgIC8qIEZJWE1FOiBzaG91bGQgY2hlY2sgZm9yIE9FTSBjdXJzb3IgaGVyZSAqLwogICAgIHJldHVybiAoRnJlZVJlc291cmNlMTYoIGhDdXJzb3IgKSA9PSAwKTsKIH0KQEAgLTExMTksMTMgKzExMTgsMTYgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgU2V0Q3Vyc29yMzIgICAgKFVTRVIzMi40NzEpCisgKiBSRVRVUk5TOgorICoJQSBoYW5kbGUgdG8gdGhlIHByZXZpb3VzIGN1cnNvciBzaGFwZS4KICAqLwotSENVUlNPUjMyIFdJTkFQSSBTZXRDdXJzb3IzMiggSENVUlNPUjMyIGhDdXJzb3IgKQoteworSENVUlNPUjMyIFdJTkFQSSBTZXRDdXJzb3IzMigKKwkgICAgICAgICBIQ1VSU09SMzIgaEN1cnNvciAvKiBIYW5kbGUgb2YgY3Vyc29yIHRvIHNob3cgKi8KKykgewogICAgIEhDVVJTT1IzMiBoT2xkQ3Vyc29yOwogCiAgICAgaWYgKGhDdXJzb3IgPT0gaEFjdGl2ZUN1cnNvcikgcmV0dXJuIGhBY3RpdmVDdXJzb3I7ICAvKiBObyBjaGFuZ2UgKi8KLSAgICBkcHJpbnRmX2luZm8oY3Vyc29yLCAiU2V0Q3Vyc29yOiAlMDR4XG4iLCBoQ3Vyc29yICk7CisgICAgVFJBQ0UoY3Vyc29yLCAiJTA0eFxuIiwgaEN1cnNvciApOwogICAgIGhPbGRDdXJzb3IgPSBoQWN0aXZlQ3Vyc29yOwogICAgIGhBY3RpdmVDdXJzb3IgPSBoQ3Vyc29yOwogICAgIC8qIENoYW5nZSB0aGUgY3Vyc29yIHNoYXBlIG9ubHkgaWYgaXQgaXMgdmlzaWJsZSAqLwpAQCAtMTE1Myw3ICsxMTU1LDcgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBTZXRDdXJzb3JQb3MzMiggSU5UMzIgeCwgSU5UMzIgeSApCiB7Ci0gICAgZHByaW50Zl9pbmZvKGN1cnNvciwgIlNldEN1cnNvclBvczogeD0lZCB5PSVkXG4iLCB4LCB5ICk7CisgICAgVFJBQ0UoY3Vyc29yLCAieD0lZCB5PSVkXG4iLCB4LCB5ICk7CiAgICAgVFNYV2FycFBvaW50ZXIoIGRpc3BsYXksIHJvb3RXaW5kb3csIHJvb3RXaW5kb3csIDAsIDAsIDAsIDAsIHgsIHkgKTsKICAgICByZXR1cm4gVFJVRTsKIH0KQEAgLTExNzMsNyArMTE3NSw3IEBACiAgKi8KIElOVDMyIFdJTkFQSSBTaG93Q3Vyc29yMzIoIEJPT0wzMiBiU2hvdyApCiB7Ci0gICAgZHByaW50Zl9pbmZvKGN1cnNvciwgIlNob3dDdXJzb3I6ICVkLCBjb3VudD0lZFxuIiwKKyAgICBUUkFDRShjdXJzb3IsICIlZCwgY291bnQ9JWRcbiIsCiAgICAgICAgICAgICAgICAgICAgIGJTaG93LCBDVVJTT1JfU2hvd0NvdW50ICk7CiAKICAgICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwpAQCAtMTI2Miw3ICsxMjY0LDcgQEAKICAgICAgICAgZWxzZQogICAgICAgICAgICAgTW91c2VCdXR0b25zU3RhdGVzWzJdID0gRkFMU0U7CiAgICAgfQotICAgIGRwcmludGZfaW5mbyhjdXJzb3IsICJHZXRDdXJzb3JQb3M6IHJldD0lZCwlZFxuIiwgcHQtPngsIHB0LT55ICk7CisgICAgVFJBQ0UoY3Vyc29yLCAicmV0PSVkLCVkXG4iLCBwdC0+eCwgcHQtPnkgKTsKIH0KIAogCkBAIC0xMzIwLDcgKzEzMjIsNyBAQAogCSAgICBpZiggZW50cnkgKSByZXRWYWwgPSBlbnRyeS0+d1Jlc0lkOwogCX0KICAgICB9Ci0gICAgZWxzZSBkcHJpbnRmX3dhcm4oY3Vyc29yLCAiSWNvbklkOiBpbnZhbGlkIHJlc291cmNlIGRpcmVjdG9yeVxuIik7CisgICAgZWxzZSBXQVJOKGN1cnNvciwgImludmFsaWQgcmVzb3VyY2UgZGlyZWN0b3J5XG4iKTsKICAgICByZXR1cm4gcmV0VmFsOwogfQogCkBAIC0xMzYwLDcgKzEzNjIsNyBAQAogewogICAgIExQQllURSBscERpciA9IChMUEJZVEUpR2xvYmFsTG9jazE2KGhSZXNvdXJjZSk7CiAKLSAgICBkcHJpbnRmX2luZm8oY3Vyc29yLCAiR2V0SWNvbklEOiBoUmVzPSUwNHgsIGVudHJpZXM9JWlcbiIsCisgICAgVFJBQ0UoY3Vyc29yLCAiaFJlcz0lMDR4LCBlbnRyaWVzPSVpXG4iLAogICAgICAgICAgICAgICAgICAgICBoUmVzb3VyY2UsIGxwRGlyID8gKChDVVJTT1JJQ09ORElSKilscERpciktPmlkQ291bnQgOiAwKTsKIAogICAgIHN3aXRjaChyZXNUeXBlKQpAQCAtMTQzOCw3ICsxNDQwLDcgQEAKIHsKICAgICBMUEJZVEUgYml0cyA9IChMUEJZVEUpTG9ja1Jlc291cmNlMTYoIGhSZXNvdXJjZSApOwogCi0gICAgZHByaW50Zl9pbmZvKGN1cnNvciwiTG9hZEljb25IYW5kbGVyOiBoUmVzPSUwNHhcbiIsaFJlc291cmNlKTsKKyAgICBUUkFDRShjdXJzb3IsImhSZXM9JTA0eFxuIixoUmVzb3VyY2UpOwogCiAgICAgcmV0dXJuIENVUlNPUklDT05fQ3JlYXRlRnJvbVJlc291cmNlKCAwLCAwLCBiaXRzLCAwLCBUUlVFLCAKIAkJICAgICAgYk5ldyA/IDB4MDAwMzAwMDAgOiAweDAwMDIwMDAwLCAwLCAwLCBMUl9ERUZBVUxUQ09MT1IgKTsKQEAgLTE1NzYsNyArMTU3OCw3IEBACiAgICAgSERDMzIgaE1lbURDID0gQ3JlYXRlQ29tcGF0aWJsZURDMzIgKGhkYyk7CiAgICAgQk9PTDMyIHJlc3VsdCA9IEZBTFNFOwogCi0gICAgZHByaW50Zl9maXhtZShpY29uLCAiRHJhd0ljb25FeDMyOiBwYXJ0IHN0dWIuXG4iKTsKKyAgICBGSVhNRShpY29uLCAicGFydCBzdHViLlxuIik7CiAKICAgICBpZiAoaE1lbURDICYmIHB0cikKICAgICB7CmRpZmYgLS1naXQgYS9vYmplY3RzL2RjLmMgYi9vYmplY3RzL2RjLmMKaW5kZXggNzBhNjVjNy4uOGRiOWFkYyAxMDA2NDQKLS0tIGEvb2JqZWN0cy9kYy5jCisrKyBiL29iamVjdHMvZGMuYwpAQCAtNDQ5LDcgKzQ0OSw3IEBACiAgICAgfQogICAgIG5ld2RjID0gKERDICopIEdESV9IRUFQX0xPQ0soIGhhbmRsZSApOwogCi0gICAgZHByaW50Zl9pbmZvKGRjLCAiR2V0RENTdGF0ZSglMDR4KTogcmV0dXJuaW5nICUwNHhcbiIsIGhkYywgaGFuZGxlICk7CisgICAgVFJBQ0UoZGMsICIoJTA0eCk6IHJldHVybmluZyAlMDR4XG4iLCBoZGMsIGhhbmRsZSApOwogCiAgICAgbWVtc2V0KCAmbmV3ZGMtPnUueCwgMCwgc2l6ZW9mKG5ld2RjLT51LngpICk7CiAgICAgbmV3ZGMtPncuZmxhZ3MgICAgICAgICAgID0gZGMtPncuZmxhZ3MgfCBEQ19TQVZFRDsKQEAgLTUzNyw3ICs1MzcsNyBAQAogICAgICAgR0RJX0hFQVBfVU5MT0NLKCBoZGNzICk7CiAgICAgICByZXR1cm47CiAgICAgfQotICAgIGRwcmludGZfaW5mbyhkYywgIlNldERDU3RhdGU6ICUwNHggJTA0eFxuIiwgaGRjLCBoZGNzICk7CisgICAgVFJBQ0UoZGMsICIlMDR4ICUwNHhcbiIsIGhkYywgaGRjcyApOwogCiAgICAgZGMtPncuZmxhZ3MgICAgICAgICAgID0gZGNzLT53LmZsYWdzICYgfkRDX1NBVkVEOwogICAgIGRjLT53LmRldkNhcHMgICAgICAgICA9IGRjcy0+dy5kZXZDYXBzOwpAQCAtNjQyLDcgKzY0Miw3IEBACiAgICAgCiAgICAgZGNzLT5oZWFkZXIuaE5leHQgPSBkYy0+aGVhZGVyLmhOZXh0OwogICAgIGRjLT5oZWFkZXIuaE5leHQgPSBoZGNzOwotICAgIGRwcmludGZfaW5mbyhkYywgIlNhdmVEQyglMDR4KTogcmV0dXJuaW5nICVkXG4iLCBoZGMsIGRjLT5zYXZlTGV2ZWwrMSApOworICAgIFRSQUNFKGRjLCAiKCUwNHgpOiByZXR1cm5pbmcgJWRcbiIsIGhkYywgZGMtPnNhdmVMZXZlbCsxICk7CiAgICAgcmV0ID0gKytkYy0+c2F2ZUxldmVsOwogICAgIEdESV9IRUFQX1VOTE9DSyggaGRjcyApOwogICAgIEdESV9IRUFQX1VOTE9DSyggaGRjICk7CkBAIC02NjcsNyArNjY3LDcgQEAKICAgICBEQyAqIGRjLCAqIGRjczsKICAgICBCT09MMzIgc3VjY2VzczsKIAotICAgIGRwcmludGZfaW5mbyhkYywgIlJlc3RvcmVEQzogJTA0eCAlZFxuIiwgaGRjLCBsZXZlbCApOworICAgIFRSQUNFKGRjLCAiJTA0eCAlZFxuIiwgaGRjLCBsZXZlbCApOwogICAgIGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKTsKICAgICBpZiAoIWRjKSAKICAgICB7CkBAIC03MjcsMTMgKzcyNywxMyBAQAogICAgIGlmICghKGRjID0gRENfQWxsb2NEQyggZnVuY3MgKSkpIHJldHVybiAwOwogICAgIGRjLT53LmZsYWdzID0gMDsKIAotICAgIGRwcmludGZfaW5mbyhkYywgIkNyZWF0ZURDKCVzICVzICVzKTogcmV0dXJuaW5nICUwNHhcbiIsCisgICAgVFJBQ0UoZGMsICIoJXMgJXMgJXMpOiByZXR1cm5pbmcgJTA0eFxuIiwKICAgICAgICAgICAgICAgIGRyaXZlciwgZGV2aWNlLCBvdXRwdXQsIGRjLT5oU2VsZiApOwogCiAgICAgaWYgKGRjLT5mdW5jcy0+cENyZWF0ZURDICYmCiAgICAgICAgICFkYy0+ZnVuY3MtPnBDcmVhdGVEQyggZGMsIGRyaXZlciwgZGV2aWNlLCBvdXRwdXQsIGluaXREYXRhICkpCiAgICAgewotICAgICAgICBkcHJpbnRmX3dhcm4oZGMsICJDcmVhdGVEQzogY3JlYXRpb24gYWJvcnRlZCBieSBkZXZpY2VcbiIgKTsKKyAgICAgICAgV0FSTihkYywgImNyZWF0aW9uIGFib3J0ZWQgYnkgZGV2aWNlXG4iICk7CiAgICAgICAgIEdESV9IRUFQX0ZSRUUoIGRjLT5oU2VsZiApOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CkBAIC04MjksNyArODI5LDcgQEAKIAogICAgIGlmICghKGRjID0gRENfQWxsb2NEQyggZnVuY3MgKSkpIHJldHVybiAwOwogCi0gICAgZHByaW50Zl9pbmZvKGRjLCAiQ3JlYXRlQ29tcGF0aWJsZURDKCUwNHgpOiByZXR1cm5pbmcgJTA0eFxuIiwKKyAgICBUUkFDRShkYywgIiglMDR4KTogcmV0dXJuaW5nICUwNHhcbiIsCiAgICAgICAgICAgICAgICBoZGMsIGRjLT5oU2VsZiApOwogCiAgICAgICAvKiBDcmVhdGUgZGVmYXVsdCBiaXRtYXAgKi8KQEAgLTg0Niw3ICs4NDYsNyBAQAogICAgIGlmIChkYy0+ZnVuY3MtPnBDcmVhdGVEQyAmJgogICAgICAgICAhZGMtPmZ1bmNzLT5wQ3JlYXRlREMoIGRjLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMICkpCiAgICAgewotICAgICAgICBkcHJpbnRmX3dhcm4oZGMsICJDcmVhdGVDb21wYXRpYmxlREM6IGNyZWF0aW9uIGFib3J0ZWQgYnkgZGV2aWNlXG4iKTsKKyAgICAgICAgV0FSTihkYywgImNyZWF0aW9uIGFib3J0ZWQgYnkgZGV2aWNlXG4iKTsKICAgICAgICAgRGVsZXRlT2JqZWN0MzIoIGhiaXRtYXAgKTsKICAgICAgICAgR0RJX0hFQVBfRlJFRSggZGMtPmhTZWxmICk7CiAgICAgICAgIHJldHVybiAwOwpAQCAtODc1LDcgKzg3NSw3IEBACiAgICAgREMgKiBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICk7CiAgICAgaWYgKCFkYykgcmV0dXJuIEZBTFNFOwogCi0gICAgZHByaW50Zl9pbmZvKGRjLCAiRGVsZXRlREM6ICUwNHhcbiIsIGhkYyApOworICAgIFRSQUNFKGRjLCAiJTA0eFxuIiwgaGRjICk7CiAKICAgICB3aGlsZSAoZGMtPnNhdmVMZXZlbCkKICAgICB7CkBAIC05NjEsNyArOTYxLDcgQEAKICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICAKLSAgICBkcHJpbnRmX2luZm8oZGMsICJHZXREZXZpY2VDYXBzKCUwNHgsJWQpOiByZXR1cm5pbmcgJWRcbiIsCisgICAgVFJBQ0UoZGMsICIoJTA0eCwlZCk6IHJldHVybmluZyAlZFxuIiwKIAkgICAgaGRjLCBjYXAsICooV09SRCAqKSgoKGNoYXIgKilkYy0+dy5kZXZDYXBzKSArIGNhcCkgKTsKICAgICByZXQgPSAqKFdPUkQgKikoKChjaGFyICopZGMtPncuZGV2Q2FwcykgKyBjYXApOwogICAgIEdESV9IRUFQX1VOTE9DSyggaGRjICk7CkBAIC0xMjA4LDkgKzEyMDgsMTAgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgR2V0V29ybGRUcmFuc2Zvcm0gICAgKEdESTMyLjI0NCkKKyAqIEZJWE1FCisgKglDaGVjayB0aGF0IFNldExhc3RFcnJvciBpcyBiZWluZyBjYWxsZWQgY29ycmVjdGx5CiAgKi8KIEJPT0wzMiBXSU5BUEkgR2V0V29ybGRUcmFuc2Zvcm0oIEhEQzMyIGhkYywgTFBYRk9STSB4Zm9ybSApCi0vKiBGSVhNRTogQ2hlY2sgdGhhdCBTZXRMYXN0RXJyb3IgaXMgYmVpbmcgY2FsbGVkIGNvcnJlY3RseSAqLwogewogICAgIERDICogZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOwogICAgIApAQCAtMTI2OCw3ICsxMjY5LDcgQEAKIHsKICAgICBEQyAqZGMgPSAoREMgKilHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICk7CiAKLSAgICBkcHJpbnRmX2luZm8oZGMsICJTZXREQ0hvb2s6IGhvb2tQcm9jICUwOHgsIGRlZmF1bHQgaXMgJTA4eFxuIiwKKyAgICBUUkFDRShkYywgImhvb2tQcm9jICUwOHgsIGRlZmF1bHQgaXMgJTA4eFxuIiwKICAgICAgICAgICAgICAgICAoVUlOVDMyKWhvb2tQcm9jLCAoVUlOVDMyKURDSG9vayApOwogCiAgICAgaWYgKCFkYykgcmV0dXJuIEZBTFNFOwpAQCAtMTMwNiw3ICsxMzA3LDcgQEAKICAgICAgICAgLyogIlVuZG9jdW1lbnRlZCBXaW5kb3dzIiBpbmZvIGlzIHNsaWdodGx5IGNvbmZ1c2luZy4KICAgICAgICAgICovCiAKLSAgICAgICAgZHByaW50Zl9pbmZvKGRjLCJTZXRIb29rRmxhZ3M6IGhEQyAlMDR4LCBmbGFncyAlMDR4XG4iLGhEQyxmbGFncyk7CisgICAgICAgIFRSQUNFKGRjLCJoREMgJTA0eCwgZmxhZ3MgJTA0eFxuIixoREMsZmxhZ3MpOwogCiAgICAgICAgIGlmKCBmbGFncyAmIERDSEZfSU5WQUxJREFURVZJU1JHTiApCiAgICAgICAgICAgICBkYy0+dy5mbGFncyB8PSBEQ19ESVJUWTsKZGlmZiAtLWdpdCBhL29iamVjdHMvZGliLmMgYi9vYmplY3RzL2RpYi5jCmluZGV4IDE2MjJkMTcuLjdkZDAzM2YgMTAwNjQ0Ci0tLSBhL29iamVjdHMvZGliLmMKKysrIGIvb2JqZWN0cy9kaWIuYwpAQCAtNTc3LDEwICs1NzcsOCBAQAogCQkJICBsaW5lIAktPSAoKnBJbisrKTsKIAkJCSAgaWYgKGxpbmUgPT0gMCkKIAkJCSAgICB7Ci0JCQkgICAgICBkcHJpbnRmX2luZm8oYml0bWFwLCAKLQkJCQkJICAgICAiRElCX1NldEltYWdlQml0c19STEU4KCk6ICIKLQkJCQkJICAgICAiRGVsdGEgdG8gbGFzdCBsaW5lIG9mIGJpdG1hcCAiCi0JCQkJCSAgICAgIih3cm9uZ2x5PykgY2F1c2VzIGxvb3AgZXhpdFxuIik7CisJCQkgICAgICBUUkFDRShiaXRtYXAsICJEZWx0YSB0byBsYXN0IGxpbmUgb2YgYml0bWFwICIKKwkJCQkJICAgIih3cm9uZ2x5PykgY2F1c2VzIGxvb3AgZXhpdFxuIik7CiAJCQkgICAgfQogCQkJICBicmVhazsKIAkJICAgICAgfQpAQCAtNjI0LDcgKzYyMiw3IEBACiAgICAgICovCiAgICAgaWYgKCAoKihwSW4tMikgIT0gMC8qZXNjYXBlKi8pIHx8ICgqKHBJbi0xKSE9IFJsZUVuZCkgKQogICAgICAgewotCWRwcmludGZfaW5mbyhiaXRtYXAsICJESUJfU2V0SW1hZ2VCaXRzX1JMRTgoKTogRW5kLW9mLWJpdG1hcCAiCisJVFJBQ0UoYml0bWFwLCAiRW5kLW9mLWJpdG1hcCAiCiAJCSAgICAgICAid2l0aG91dCAoc3RyaWN0bHkpIHByb3BlciBlc2NhcGUgY29kZS4gIExhc3QgdHdvICIKIAkJICAgICAgICJieXRlcyB3ZXJlOiAlMDJYICUwMlguXG4iLAogCQkgICAgICAgKGludCkqKHBJbi0yKSwKQEAgLTExNzksNyArMTE3Nyw3IEBACiAJQllURSoJYmJpdHMgPSBiaXRzOwogCWludAlwYWQsIHllbmQsIHhlbmQgPSBibXAtPmJpdG1hcC5ibVdpZHRoOwogCi0gICAgICAgIGRwcmludGZfaW5mbyhiaXRtYXAsICJHZXRESUJpdHM6ICV1IHNjYW5saW5lcyBvZiAoJWksJWkpIC0+ICglaSwlaSkgc3RhcnRpbmcgZnJvbSAldVxuIiwKKyAgICAgICAgVFJBQ0UoYml0bWFwLCAiJXUgc2NhbmxpbmVzIG9mICglaSwlaSkgLT4gKCVpLCVpKSBzdGFydGluZyBmcm9tICV1XG4iLAogCQkJICAgIGxpbmVzLCBibXAtPmJpdG1hcC5ibVdpZHRoLCBibXAtPmJpdG1hcC5ibUhlaWdodCwKIAkJCSAgICAoaW50KWluZm8tPmJtaUhlYWRlci5iaVdpZHRoLCAoaW50KWluZm8tPmJtaUhlYWRlci5iaUhlaWdodCwgc3RhcnRzY2FuICk7CiAKZGlmZiAtLWdpdCBhL29iamVjdHMvZW5obWV0YWZpbGUuYyBiL29iamVjdHMvZW5obWV0YWZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGMxNzAwCi0tLSAvZGV2L251bGwKKysrIGIvb2JqZWN0cy9lbmhtZXRhZmlsZS5jCkBAIC0wLDAgKzEsMjI1IEBACisvKgorICBFbmhhbmNlZCBtZXRhZmlsZSBmdW5jdGlvbnMKKyAgQ29weXJpZ2h0IDE5OTgsIERvdWdsYXMgUmlkZ3dheQorKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAid2luZG93cy5oIgorI2luY2x1ZGUgIndpbmJhc2UuaCIKKyNpbmNsdWRlICJ3aW5udC5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgIEdldEVuaE1ldGFGaWxlMzJBIChHREkzMi4xNzQpCisgKgorICoKKyAqLworSEVOSE1FVEFGSUxFMzIgR2V0RW5oTWV0YUZpbGUzMkEoIAorCSAgICAgTFBDU1RSIGxwc3pNZXRhRmlsZSAgLyogZmlsZW5hbWUgb2YgZW5oYW5jZWQgbWV0YWZpbGUgKi8KKyAgICApCit7CisgIEhFTkhNRVRBRklMRTMyIGhtZiA9IE5VTEw7CisgIEVOSE1FVEFIRUFERVIgaDsKKyAgY2hhciAqcDsKKyAgRFdPUkQgcmVhZDsKKyAgSEZJTEUzMiBoZiA9IENyZWF0ZUZpbGUzMkEobHBzek1ldGFGaWxlLCBHRU5FUklDX1JFQUQsIDAsIDAsIAorCQkJICAgICBPUEVOX0VYSVNUSU5HLCAwLCBOVUxMKTsKKyAgaWYgKCFSZWFkRmlsZShoZiwgJmgsIHNpemVvZihFTkhNRVRBSEVBREVSKSwgJnJlYWQsIE5VTEwpKSAKKyAgICByZXR1cm4gTlVMTDsKKyAgaWYgKHJlYWQhPXNpemVvZihFTkhNRVRBSEVBREVSKSkgcmV0dXJuIE5VTEw7CisgIFNldEZpbGVQb2ludGVyKGhmLCAwLCBOVUxMLCBGSUxFX0JFR0lOKTsgCisgIC8qICBobWYgPSBDcmVhdGVGaWxlTWFwcGluZzMyQSggaGYsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsICJ0ZW1wIik7ICovCisgIGhtZiA9IEdsb2JhbEFsbG9jMzIoR0hORCwgaC5uQnl0ZXMpOworICBwID0gR2xvYmFsTG9jazMyKGhtZik7CisgIGlmICghUmVhZEZpbGUoaGYsIHAsIGgubkJ5dGVzLCAmcmVhZCwgTlVMTCkpIHJldHVybiBOVUxMOworICBHbG9iYWxVbmxvY2szMihobWYpOworICByZXR1cm4gaG1mOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICBHZXRFbmhNZXRhRmlsZUhlYWRlcjMyICAoR0RJMzIuMTc4KQorICoKKyAqICBJZiBfYnVmXyBpcyBOVUxMLCByZXR1cm5zIHRoZSBzaXplIG9mIGJ1ZmZlciByZXF1aXJlZC4KKyAqICBPdGhlcndpc2UsIGNvcHkgdXAgdG8gX2J1ZnNpemVfIGJ5dGVzIG9mIGVuaGFuY2VkIG1ldGFmaWxlIGhlYWRlciBpbnRvIAorICogIF9idWYuCisgKi8KK1VJTlQzMiBHZXRFbmhNZXRhRmlsZUhlYWRlcjMyKCAKKyAgICAgICBIRU5ITUVUQUZJTEUzMiBobWYsIC8qIGVuaGFuY2VkIG1ldGFmaWxlICovCisgICAgICAgVUlOVDMyIGJ1ZnNpemUsICAgICAvKiBzaXplIG9mIGJ1ZmZlciAqLworICAgICAgIExQRU5ITUVUQUhFQURFUiBidWYgLyogYnVmZmVyICovIAorICAgICkKK3sKKyAgTFBFTkhNRVRBSEVBREVSIHAgPSBHbG9iYWxMb2NrMzIoaG1mKTsKKyAgaWYgKCFidWYpIHJldHVybiBzaXplb2YoRU5ITUVUQUhFQURFUik7CisgIG1lbW1vdmUoYnVmLCBwLCBNSU4oc2l6ZW9mKEVOSE1FVEFIRUFERVIpLCBidWZzaXplKSk7CisgIHJldHVybiBNSU4oc2l6ZW9mKEVOSE1FVEFIRUFERVIpLCBidWZzaXplKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgIEdldEVuaE1ldGFGaWxlRGVzY3JpcHRpb24zMkEgIChHREkzMi4xNzYpCisgKgorICogIENvcGllcyB0aGUgZGVzY3JpcHRpb24gc3RyaW5nIG9mIGFuIGVuaGFuY2VkIG1ldGFmaWxlIGludG8gYSBidWZmZXIgCisgKiAgX2J1Zl8uCisgKgorICogRklYTUUKKyAqICAgZG9lc24ndCB3b3JrLiBkZXNjcmlwdGlvbiBpcyB3aWRlLCB3aXRoIHN1YnN0cnVjdHVyZQorICovCitVSU5UMzIgR2V0RW5oTWV0YUZpbGVEZXNjcmlwdGlvbjMyQSggCisgICAgICAgSEVOSE1FVEFGSUxFMzIgaG1mLCAvKiBlbmhhbmNlZCBtZXRhZmlsZSAqLworICAgICAgIFVJTlQzMiBzaXplLCAvKiBzaXplIG9mIGJ1ZiAqLyAKKyAgICAgICBMUENTVFIgYnVmIC8qIGJ1ZmZlciB0byByZWNlaXZlIGRlc2NyaXB0aW9uICovCisgICAgKQoreworICBMUEVOSE1FVEFIRUFERVIgcCA9IEdsb2JhbExvY2szMihobWYpOworICAKKyAgaWYgKCFidWYgfHwgIXNpemUpIHJldHVybiBwLT5uRGVzY3JpcHRpb247CisgIGxzdHJjcHluV3RvQShidWYsICh2b2lkICopcCtwLT5vZmZEZXNjcmlwdGlvbiwgc2l6ZSk7CisgIC8qICBtZW1tb3ZlKGJ1ZiwgKHZvaWQgKilwK3AtPm9mZkRlc2NyaXB0aW9uLCBNSU4oc2l6ZSxwLT5uRGVzY3JpcHRpb24pKTsqLworICByZXR1cm4gTUlOKHNpemUscC0+bkRlc2NyaXB0aW9uKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgUGxheUVuaE1ldGFGaWxlUmVjb3JkMzIgIChHREkzMi4yNjQpCisgKgorICogIFJlbmRlciBhIHNpbmdsZSBlbmhhbmNlZCBtZXRhZmlsZSByZWNvcmQgaW4gdGhlIGRldmljZSBjb250ZXh0IGhkYy4KKyAqCisgKiAgUkVUVVJOUworICogICAgVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBlcnJvci4KKyAqICBCVUdTCisgKiAgICBVbmltcGxlbWVudGVkCisgKi8KK0JPT0wzMiBQbGF5RW5oTWV0YUZpbGVSZWNvcmQzMiggCisgICAgIEhEQzMyIGhkYywgCisgICAgIC8qIGRldmljZSBjb250ZXh0IGluIHdoaWNoIHRvIHJlbmRlciBFTUYgcmVjb3JkICovCisgICAgIExQSEFORExFVEFCTEUzMiBscEhhbmRsZXRhYmxlLCAKKyAgICAgLyogYXJyYXkgb2YgaGFuZGxlcyB0byBiZSB1c2VkIGluIHJlbmRlcmluZyByZWNvcmQgKi8KKyAgICAgY29uc3QgRU5ITUVUQVJFQ09SRCAqbHBFbmhNZXRhUmVjb3JkLCAvKiBFTUYgcmVjb3JkIHRvIHJlbmRlciAqLworICAgICBVSU5UMzIgbkhhbmRsZXMgIC8qIHNpemUgb2YgaGFuZGxlIGFycmF5ICovCisgICAgICkgCit7CisgIGludCB0eXBlOworICBmcHJpbnRmKHN0ZG91dCwgCisgICJQbGF5RW5oTWV0YUZpbGVSZWNvcmQoaGRjID0gJTA4eCwgaGFuZGxldGFibGUgPSAlcCwgcmVjb3JkID0gJXAsIG51bUhhbmRsZXMgPSAlZFxuIiwgCisJICBoZGMsIGxwSGFuZGxldGFibGUsIGxwRW5oTWV0YVJlY29yZCwgbkhhbmRsZXMpOworICAvKiAgU2V0TGFzdEVycm9yKEVfTk9USU1QTCk7ICovCisgIGlmICghbHBFbmhNZXRhUmVjb3JkKSByZXR1cm4gRkFMU0U7CisKKyAgdHlwZSA9IGxwRW5oTWV0YVJlY29yZC0+aVR5cGU7CisKKyAgc3dpdGNoKHR5cGUpIAorICAgIHsKKyAgICBjYXNlIEVNUl9IRUFERVI6CisgICAgICBwcmludGYoIkhlYWRlciBvayFcbiIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEVNUl9FT0Y6CisgICAgICBwcmludGYoIkVvZiBvayFcbiIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgICBicmVhazsKKyAgICB9CisgIHByaW50ZigiSSBkdW5ubyAlZFxuIiwgdHlwZSk7CisgIHJldHVybiBGQUxTRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgICAgRW51bUVuaE1ldGFGaWxlMzIgIChHREkzMi43OSkKKyAqCisgKiAgV2FsayBhbiBlbmhhbmNlZCBtZXRhZmlsZSwgY2FsbGluZyBhIHVzZXItc3BlY2lmaWVkIGZ1bmN0aW9uIF9FbmhNZXRhRnVuY18KKyAqICBmb3IgZWFjaAorICogIHJlY29yZC4gUmV0dXJucyB3aGVuIGVpdGhlciBldmVyeSByZWNvcmQgaGFzIGJlZW4gdXNlZCBvciAKKyAqICB3aGVuIF9FbmhNZXRhRnVuY18gcmV0dXJucyBGQUxTRS4KKyAqCisgKgorICogUkVUVVJOUworICogIFRSVUUgaWYgZXZlcnkgcmVjb3JkIGlzIHVzZWQsIEZBTFNFIGlmIGFueSBpbnZvY2F0aW9uIG9mIF9FbmhNZXRhRnVuY18KKyAqICByZXR1cm5zIEZBTFNFLgorICoKKyAqIEJVR1MKKyAqICAgRG9lc24ndCBmcmVlIG9iamVjdHMsIGlnbm9yZXMgcmVjdC4KKyAqLworQk9PTDMyIEVudW1FbmhNZXRhRmlsZTMyKCAKKyAgICAgSERDMzIgaGRjLCAvKiBkZXZpY2UgY29udGV4dCB0byBwYXNzIHRvIF9FbmhNZXRhRnVuY18gKi8KKyAgICAgSEVOSE1FVEFGSUxFMzIgaG1mLCAvKiBFTUYgdG8gd2FsayAqLworICAgICBFTkhNRkVOVU1QUk9DMzIgY2FsbGJhY2ssIC8qIGNhbGxiYWNrIGZ1bmN0aW9uICovIAorICAgICBMUFZPSUQgZGF0YSwgLyogb3B0aW9uYWwgZGF0YSBmb3IgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKyAgICAgY29uc3QgUkVDVDMyICpyZWN0ICAvKiBib3VuZGluZyByZWN0YW5nbGUgZm9yIHJlbmRlcmVkIG1ldGFmaWxlICovCisgICAgKQoreworICBCT09MMzIgcmV0ID0gVFJVRTsKKyAgTFBFTkhNRVRBUkVDT1JEIHAgPSBHbG9iYWxMb2NrMzIoaG1mKTsKKyAgSU5UMzIgY291bnQgPSAoKExQRU5ITUVUQUhFQURFUikgcCktPm5IYW5kbGVzOworICBIQU5ETEVUQUJMRTMyICpodCA9IChIQU5ETEVUQUJMRTMyICopR2xvYmFsQWxsb2MzMihHUFRSLCBzaXplb2YoSEFORExFVEFCTEUzMikqY291bnQpOworICBodC0+b2JqZWN0SGFuZGxlWzBdID0gaG1mOworICB3aGlsZSAocmV0KSB7CisgICAgLyogICBwcmludGYoIkVudW1FbmhNZXRhRmlsZTogdHlwZSA9ICVsZCBzaXplID0gJWxkXG4iLCBwLT5pVHlwZSwgcC0+blNpemUpOyovCisgICAgcmV0ID0gKCpjYWxsYmFjaykoaGRjLCBodCwgcCwgY291bnQsIGRhdGEpOyAKKyAgICBpZiAocC0+aVR5cGUgPT0gRU1SX0VPRikgYnJlYWs7CisgICAgcCA9ICh2b2lkICopIHAgKyBwLT5uU2l6ZTsKKyAgfQorICByZXR1cm4gcmV0OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgUGxheUVuaE1ldGFGaWxlMzIgIChHREkzMi4yNjMpCisgKgorICogICAgUmVuZGVycyBhbiBlbmhhbmNlZCBtZXRhZmlsZSBpbnRvIGEgc3BlY2lmaWVkIHJlY3RhbmdsZSAqbHBSZWN0CisgKiAgICBpbiBkZXZpY2UgY29udGV4dCBoZGMuCisgKgorICogQlVHUworICogICAgQWxtb3N0IGVudGlyZWx5IHVuaW1wbGVtZW50ZWQKKyAqCisgKi8KK0JPT0wzMiBQbGF5RW5oTWV0YUZpbGUzMiggCisgICAgICAgSERDMzIgaGRjLCAvKiBEQyB0byByZW5kZXIgaW50byAqLworICAgICAgIEhFTkhNRVRBRklMRTMyIGhtZiwgLyogbWV0YWZpbGUgdG8gcmVuZGVyICovCisgICAgICAgY29uc3QgUkVDVDMyICpscFJlY3QgIC8qIHJlY3RhbmdsZSB0byBwbGFjZSBtZXRhZmlsZSBpbnNpZGUgKi8KKyAgICAgICkKK3sKKyAgTFBFTkhNRVRBUkVDT1JEIHAgPSBHbG9iYWxMb2NrMzIoaG1mKTsKKyAgSU5UMzIgY291bnQgPSAoKExQRU5ITUVUQUhFQURFUikgcCktPm5IYW5kbGVzOworICBIQU5ETEVUQUJMRTMyICpodCA9IChIQU5ETEVUQUJMRTMyICopR2xvYmFsQWxsb2MzMihHUFRSLCBzaXplb2YoSEFORExFVEFCTEUzMikqY291bnQpOworICBodC0+b2JqZWN0SGFuZGxlWzBdID0gaG1mOworICB3aGlsZSAoMSkgeworICAgIFBsYXlFbmhNZXRhRmlsZVJlY29yZDMyKGhkYywgaHQsIHAsIGNvdW50KTsKKyAgICBpZiAocC0+aVR5cGUgPT0gRU1SX0VPRikgYnJlYWs7CisgICAgcCA9ICh2b2lkICopIHAgKyBwLT5uU2l6ZTsgLyogY2FzdGVkIHNvIHRoYXQgYXJpdGhtZXRpYyBpcyBpbiBieXRlcyAqLworICB9CisgIHJldHVybiBGQUxTRTsKK30KKworLyoKKyAgbmVlZCB3aWRlIHZlcnNpb24gYXMgd2VsbAorKi8KK0hEQzMyIENyZWF0ZUVuaE1ldGFGaWxlMzJBKCAKKyAgICBIREMzMiBoZGNSZWYsIC8qIG9wdGlvbmFsIHJlZmVyZW5jZSBEQyAqLworICAgIExQQ1NUUiBscEZpbGVuYW1lLCAvKiBvcHRpb25hbCBmaWxlbmFtZSBmb3IgZGlzayBtZXRhZmlsZXMgKi8KKyAgICBjb25zdCBSRUNUMzIgKmxwUmVjdCwgLyogb3B0aW9uYWwgYm91bmRpbmcgcmVjdGFuZ2xlICovCisgICAgTFBDU1RSIGxwRGVzY3JpcHRpb24gLyogb3B0aW9uYWwgZGVzY3JpcHRpb24gKi8gCisgICAgKQoreworICByZXR1cm4gTlVMTDsKK30KKworSEVOSE1FVEFGSUxFMzIgQ2xvc2VFbmhNZXRhRmlsZTMyKCAKKyAgICAgICAgICAgICAgIEhEQzMyIGhkYyAgLyogbWV0YWZpbGUgREMgKi8KKwkgICAgICAgKQoreworICByZXR1cm4gTlVMTDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBEZWxldGVFbmhNZXRhRmlsZTMyIChHREkzMi42OCkKKyAqLworQk9PTDMyIERlbGV0ZUVuaE1ldGFGaWxlMzIoSEVOSE1FVEFGSUxFMzIgaG1mKSB7CisgIHJldHVybiBGQUxTRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weUVuaE1ldGFGaWxlQSAoR0RJMzIuMjEpCisgKi8KKwpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9mb250LmMgYi9vYmplY3RzL2ZvbnQuYwppbmRleCAwNGZlMTMxLi5hZmEzNzRkIDEwMDY0NAotLS0gYS9vYmplY3RzL2ZvbnQuYworKysgYi9vYmplY3RzL2ZvbnQuYwpAQCAtMjIyLDcgKzIyMiw3IEBACiAJICAgIGZvbnRQdHIgPSAoRk9OVE9CSiAqKSBHRElfSEVBUF9MT0NLKCBoRm9udCApOwogCSAgICBtZW1jcHkoICZmb250UHRyLT5sb2dmb250LCBmb250LCBzaXplb2YoTE9HRk9OVDE2KSApOwogCi0JICAgIGRwcmludGZfaW5mbyhmb250LCJDcmVhdGVGb250SW5kaXJlY3QoJWkgJWkpICclcycgJXMgJXMgPT4gJTA0eFxuIiwKKwkgICAgVFJBQ0UoZm9udCwiKCVpICVpKSAnJXMnICVzICVzID0+ICUwNHhcbiIsCiAJCQkJIGZvbnQtPmxmSGVpZ2h0LCBmb250LT5sZldpZHRoLCAKIAkJCQkgZm9udC0+bGZGYWNlTmFtZSA/IGZvbnQtPmxmRmFjZU5hbWUgOiAiTlVMTCIsCiAJCQkJIGZvbnQtPmxmV2VpZ2h0ID4gNDAwID8gIkJvbGQiIDogIiIsCkBAIC0yNzAsNyArMjcwLDcgQEAKICAgICBMT0dGT05UMTYgbG9nZm9udCA9IHsgaGVpZ2h0LCB3aWR0aCwgZXNjLCBvcmllbnQsIHdlaWdodCwgaXRhbGljLCB1bmRlcmxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlrZW91dCwgY2hhcnNldCwgb3V0cHJlcywgY2xpcHByZXMsIHF1YWxpdHksIHBpdGNoLCB9OwogCi0gICAgZHByaW50Zl9pbmZvKGZvbnQsIkNyZWF0ZUZvbnQxNignJXMnLCVkLCVkKVxuIiwKKyAgICBUUkFDRShmb250LCIoJyVzJywlZCwlZClcbiIsCiAJCSAobmFtZSA/IG5hbWUgOiAiKG51bGwpIikgLCBoZWlnaHQsIHdpZHRoKTsKICAgICBpZiAobmFtZSkgCiAJbHN0cmNweW4zMkEobG9nZm9udC5sZkZhY2VOYW1lLG5hbWUsc2l6ZW9mKGxvZ2ZvbnQubGZGYWNlTmFtZSkpOwpAQCAtNzE1LDcgKzcxNSw3IEBACiAgICAgICAgICFkYy0+ZnVuY3MtPnBHZXRUZXh0RXh0ZW50UG9pbnQoIGRjLCBzdHIsIGNvdW50LCBzaXplICkpCiAgICAgICAgIHJldHVybiBGQUxTRTsKIAotICAgIGRwcmludGZfaW5mbyhmb250LCJHZXRUZXh0RXh0ZW50UG9pbnQoJTA4eCAlcyAlZCAlcCk6IHJldHVybmluZyAlZCwlZFxuIiwKKyAgICBUUkFDRShmb250LCIoJTA4eCAlcyAlZCAlcCk6IHJldHVybmluZyAlZCwlZFxuIiwKICAgICAgICAgICAgICAgICAgaGRjLCBkZWJ1Z3N0cl9hbiAoc3RyLCBjb3VudCksIGNvdW50LAogCQkgc2l6ZSwgc2l6ZS0+Y3gsIHNpemUtPmN5ICk7CiAgICAgcmV0dXJuIFRSVUU7CkBAIC03NDEsNyArNzQxLDcgQEAKIEJPT0wzMiBXSU5BUEkgR2V0VGV4dEV4dGVudFBvaW50MzJBQnVnZ3koIEhEQzMyIGhkYywgTFBDU1RSIHN0ciwgSU5UMzIgY291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFNJWkUzMiBzaXplICkKIHsKLSAgICBkcHJpbnRmX2luZm8oZm9udCwgIkdldFRleHRFeHRlbnRQb2ludDMyQUJ1Z2d5OiBub3QgYnVnIGNvbXBhdGlibGUuXG4iKTsKKyAgICBUUkFDRShmb250LCAibm90IGJ1ZyBjb21wYXRpYmxlLlxuIik7CiAgICAgcmV0dXJuIEdldFRleHRFeHRlbnRQb2ludDMyQSggaGRjLCBzdHIsIGNvdW50LCBzaXplICk7CiB9CiAKQEAgLTc1MSw3ICs3NTEsNyBAQAogQk9PTDMyIFdJTkFQSSBHZXRUZXh0RXh0ZW50UG9pbnQzMldCdWdneSggSERDMzIgaGRjLCBMUENXU1RSIHN0ciwgSU5UMzIgY291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFNJWkUzMiBzaXplICkKIHsKLSAgICBkcHJpbnRmX2luZm8oZm9udCwgIkdldFRleHRFeHRlbnRQb2ludDMyV0J1Z2d5OiBub3QgYnVnIGNvbXBhdGlibGUuXG4iKTsKKyAgICBUUkFDRShmb250LCAibm90IGJ1ZyBjb21wYXRpYmxlLlxuIik7CiAgICAgcmV0dXJuIEdldFRleHRFeHRlbnRQb2ludDMyVyggaGRjLCBzdHIsIGNvdW50LCBzaXplICk7CiB9CiAKQEAgLTc5MSw3ICs3OTEsNyBAQAogICAgIHNpemUtPmN4ID0gZXh0ZW50OwogICAgKmxwbkZpdCA9IG5GaXQ7CiAKLSAgICBkcHJpbnRmX2luZm8oZm9udCwiR2V0VGV4dEV4dGVudEV4UG9pbnQzMkEoJTA4eCAnJS4qcycgJWQpIHJldHVybmluZyAlZCAlZCAlZFxuIiwKKyAgICBUUkFDRShmb250LCIoJTA4eCAnJS4qcycgJWQpIHJldHVybmluZyAlZCAlZCAlZFxuIiwKICAgICAgICAgICAgICAgIGhkYyxjb3VudCxzdHIsbWF4RXh0LG5GaXQsIHNpemUtPmN4LHNpemUtPmN5KTsKICAgICByZXR1cm4gVFJVRTsKIH0KQEAgLTg2MCw3ICs4NjAsNyBAQAogICAgIG1ldHJpY3MtPnRtTWF4Q2hhcldpZHRoICAgICA9IFdEUFRPTFAobWV0cmljcy0+dG1NYXhDaGFyV2lkdGgpOwogICAgIG1ldHJpY3MtPnRtT3ZlcmhhbmcgICAgICAgICA9IFdEUFRPTFAobWV0cmljcy0+dG1PdmVyaGFuZyk7CiAKLSAgICBkcHJpbnRmX2luZm8oZm9udCwidGV4dCBtZXRyaWNzOgorICAgIFRSQUNFKGZvbnQsInRleHQgbWV0cmljczoKICAgICBXZWlnaHQgPSAlMDNpXHQgRmlyc3RDaGFyID0gJTAzaVx0IEF2ZUNoYXJXaWR0aCA9ICVpCiAgICAgSXRhbGljID0gJSAzaVx0IExhc3RDaGFyID0gJTAzaVx0XHQgTWF4Q2hhcldpZHRoID0gJWkKICAgICBVbmRlckxpbmVkID0gJTAxaVx0IERlZmF1bHRDaGFyID0gJTAzaVx0IE92ZXJoYW5nID0gJWkKQEAgLTk4Nyw3ICs5ODcsNyBAQAogICovCiBEV09SRCBXSU5BUEkgU2V0TWFwcGVyRmxhZ3MzMiggSERDMzIgaERDLCBEV09SRCBkd0ZsYWcgKQogewotICAgIGRwcmludGZfZml4bWUoZm9udCwgIlNldE1hcHBlckZsYWdzKCUwNHgsICUwOGxYKSAvLyBFbXB0eSBTdHViICFcbiIsCisgICAgRklYTUUoZm9udCwgIiglMDR4LCAlMDhsWCkgLS0gRW1wdHkgU3R1YiAhXG4iLAogCQkgIGhEQywgZHdGbGFnKTsKICAgICByZXR1cm4gMEw7CiB9CkBAIC05OTcsNyArOTk3LDcgQEAKICAqLwogQk9PTDE2IEdldEFzcGVjdFJhdGlvRmlsdGVyRXgxNiggSERDMTYgaGRjLCBMUFZPSUQgcEFzcGVjdFJhdGlvICkKIHsKLSAgZHByaW50Zl9maXhtZShmb250LCAiR2V0QXNwZWN0UmF0aW9GaWx0ZXJFeCglMDR4LCAlcCk6IC8vIEVtcHR5IFN0dWIgIVxuIiwKKyAgRklYTUUoZm9udCwgIiglMDR4LCAlcCk6IC0tIEVtcHR5IFN0dWIgIVxuIiwKIAkJaGRjLCBwQXNwZWN0UmF0aW8pOwogICByZXR1cm4gRkFMU0U7CiB9CmRpZmYgLS1naXQgYS9vYmplY3RzL2dkaW9iai5jIGIvb2JqZWN0cy9nZGlvYmouYwppbmRleCBkMTlhYWQzLi4yODNkY2QxIDEwMDY0NAotLS0gYS9vYmplY3RzL2dkaW9iai5jCisrKyBiL29iamVjdHMvZ2Rpb2JqLmMKQEAgLTM2MCw3ICszNjAsNyBAQAogICAgICAgICByZXR1cm4gVFJVRTsKICAgICBpZiAoIShoZWFkZXIgPSAoR0RJT0JKSERSICopIEdESV9IRUFQX0xPQ0soIG9iaiApKSkgcmV0dXJuIEZBTFNFOwogCi0gICAgZHByaW50Zl9pbmZvKGdkaSwgIkRlbGV0ZU9iamVjdDogJTA0eFxuIiwgb2JqICk7CisgICAgVFJBQ0UoZ2RpLCAiJTA0eFxuIiwgb2JqICk7CiAKICAgICAgIC8qIERlbGV0ZSBvYmplY3QgKi8KIApAQCAtMzkzLDcgKzM5Myw3IEBACiB7CiAgICAgaWYgKChvYmogPCAwKSB8fCAob2JqID49IE5CX1NUT0NLX09CSkVDVFMpKSByZXR1cm4gMDsKICAgICBpZiAoIVN0b2NrT2JqZWN0c1tvYmpdKSByZXR1cm4gMDsKLSAgICBkcHJpbnRmX2luZm8oZ2RpLCAiR2V0U3RvY2tPYmplY3Q6IHJldHVybmluZyAlZFxuIiwKKyAgICBUUkFDRShnZGksICJyZXR1cm5pbmcgJWRcbiIsCiAgICAgICAgICAgICAgICAgRklSU1RfU1RPQ0tfSEFORExFICsgb2JqICk7CiAgICAgcmV0dXJuIChIR0RJT0JKMTYpKEZJUlNUX1NUT0NLX0hBTkRMRSArIG9iaik7CiB9CkBAIC00MDYsNyArNDA2LDcgQEAKIHsKICAgICBHRElPQkpIRFIgKiBwdHIgPSBOVUxMOwogICAgIElOVDE2IHJlc3VsdCA9IDA7Ci0gICAgZHByaW50Zl9pbmZvKGdkaSwgIkdldE9iamVjdDE2OiAlMDR4ICVkICVwXG4iLCBoYW5kbGUsIGNvdW50LCBidWZmZXIgKTsKKyAgICBUUkFDRShnZGksICIlMDR4ICVkICVwXG4iLCBoYW5kbGUsIGNvdW50LCBidWZmZXIgKTsKICAgICBpZiAoIWNvdW50KSByZXR1cm4gMDsKIAogICAgIGlmICgoaGFuZGxlID49IEZJUlNUX1NUT0NLX0hBTkRMRSkgJiYgKGhhbmRsZSA8PSBMQVNUX1NUT0NLX0hBTkRMRSkpCkBAIC00NDUsNyArNDQ1LDcgQEAKIHsKICAgICBHRElPQkpIRFIgKiBwdHIgPSBOVUxMOwogICAgIElOVDMyIHJlc3VsdCA9IDA7Ci0gICAgZHByaW50Zl9pbmZvKGdkaSwgIkdldE9iamVjdDMyQTogJTA4eCAlZCAlcFxuIiwgaGFuZGxlLCBjb3VudCwgYnVmZmVyICk7CisgICAgVFJBQ0UoZ2RpLCAiJTA4eCAlZCAlcFxuIiwgaGFuZGxlLCBjb3VudCwgYnVmZmVyICk7CiAgICAgaWYgKCFjb3VudCkgcmV0dXJuIDA7CiAKICAgICBpZiAoKGhhbmRsZSA+PSBGSVJTVF9TVE9DS19IQU5ETEUpICYmIChoYW5kbGUgPD0gTEFTVF9TVE9DS19IQU5ETEUpKQpAQCAtNDY5LDYgKzQ2OSw5IEBACiAJICByZXN1bHQgPSBGT05UX0dldE9iamVjdDMyQSggKEZPTlRPQkogKilwdHIsIGNvdW50LCBidWZmZXIgKTsKIAkgIGJyZWFrOwogICAgICAgY2FzZSBQQUxFVFRFX01BR0lDOgorCSAgcmVzdWx0ID0gUEFMRVRURV9HZXRPYmplY3QoIChQQUxFVFRFT0JKICopcHRyLCBjb3VudCwgYnVmZmVyICk7CisJICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiR2V0T2JqZWN0MzI6IG1hZ2ljICUwNHggbm90IGltcGxlbWVudGVkXG4iLAogICAgICAgICAgICAgICAgICAgIHB0ci0+d01hZ2ljICk7CiAgICAgICAgICAgYnJlYWs7CkBAIC00ODQsNyArNDg3LDcgQEAKIHsKICAgICBHRElPQkpIRFIgKiBwdHIgPSBOVUxMOwogICAgIElOVDMyIHJlc3VsdCA9IDA7Ci0gICAgZHByaW50Zl9pbmZvKGdkaSwgIkdldE9iamVjdFR5cGU6ICUwOHhcbiIsIGhhbmRsZSApOworICAgIFRSQUNFKGdkaSwgIiUwOHhcbiIsIGhhbmRsZSApOwogCiAgICAgaWYgKChoYW5kbGUgPj0gRklSU1RfU1RPQ0tfSEFORExFKSAmJiAoaGFuZGxlIDw9IExBU1RfU1RPQ0tfSEFORExFKSkKICAgICAgIHB0ciA9IFN0b2NrT2JqZWN0c1toYW5kbGUgLSBGSVJTVF9TVE9DS19IQU5ETEVdOwpAQCAtNTgxLDcgKzU4NCw3IEBACiB7CiAgICAgREMgKiBkYyA9IERDX0dldERDUHRyKCBoZGMgKTsKICAgICBpZiAoIWRjIHx8ICFkYy0+ZnVuY3MtPnBTZWxlY3RPYmplY3QpIHJldHVybiAwOwotICAgIGRwcmludGZfaW5mbyhnZGksICJTZWxlY3RPYmplY3Q6IGhkYz0lMDR4ICUwNHhcbiIsIGhkYywgaGFuZGxlICk7CisgICAgVFJBQ0UoZ2RpLCAiaGRjPSUwNHggJTA0eFxuIiwgaGRjLCBoYW5kbGUgKTsKICAgICByZXR1cm4gZGMtPmZ1bmNzLT5wU2VsZWN0T2JqZWN0KCBkYywgaGFuZGxlICk7CiB9CiAKQEAgLTYwNiw3ICs2MDksNyBAQAogICAgIEdESU9CSkhEUiAqIGhlYWRlciA9IChHRElPQkpIRFIgKikgR0RJX0hFQVBfTE9DSyggb2JqICk7CiAgICAgaWYgKCFoZWFkZXIpIHJldHVybiBGQUxTRTsKIAotICAgIGRwcmludGZfaW5mbyhnZGksICJVbnJlYWxpemVPYmplY3Q6ICUwNHhcbiIsIG9iaiApOworICAgIFRSQUNFKGdkaSwgIiUwNHhcbiIsIG9iaiApOwogCiAgICAgICAvKiBVbnJlYWxpemUgb2JqZWN0ICovCiAKQEAgLTY0Nyw3ICs2NTAsNyBAQAogICAgIExPR1BFTjE2ICpwZW47CiAgICAgTE9HQlJVU0gxNiAqYnJ1c2ggPSBOVUxMOwogCi0gICAgZHByaW50Zl9pbmZvKGdkaSwgIkVudW1PYmplY3RzMTY6ICUwNHggJWQgJTA4bHggJTA4bHhcbiIsCisgICAgVFJBQ0UoZ2RpLCAiJTA0eCAlZCAlMDhseCAlMDhseFxuIiwKICAgICAgICAgICAgICAgICAgaGRjLCBuT2JqVHlwZSwgKERXT1JEKWxwRW51bUZ1bmMsIGxQYXJhbSApOwogICAgIHN3aXRjaChuT2JqVHlwZSkKICAgICB7CkBAIC02NjEsNyArNjY0LDcgQEAKICAgICAgICAgICAgIHBlbi0+bG9wbldpZHRoLnkgPSAwOwogICAgICAgICAgICAgcGVuLT5sb3BuQ29sb3IgICA9IHNvbGlkX2NvbG9yc1tpXTsKICAgICAgICAgICAgIHJldHZhbCA9IGxwRW51bUZ1bmMoIFNFR1BUUl9HRVQocGVuKSwgbFBhcmFtICk7Ci0gICAgICAgICAgICBkcHJpbnRmX2luZm8oZ2RpLCAiRW51bU9iamVjdHMxNjogc29saWQgcGVuICUwOGx4LCByZXQ9JWRcbiIsCisgICAgICAgICAgICBUUkFDRShnZGksICJzb2xpZCBwZW4gJTA4bHgsIHJldD0lZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBzb2xpZF9jb2xvcnNbaV0sIHJldHZhbCk7CiAgICAgICAgICAgICBpZiAoIXJldHZhbCkgYnJlYWs7CiAgICAgICAgIH0KQEAgLTY3Nyw3ICs2ODAsNyBAQAogICAgICAgICAgICAgYnJ1c2gtPmxiQ29sb3IgPSBzb2xpZF9jb2xvcnNbaV07CiAgICAgICAgICAgICBicnVzaC0+bGJIYXRjaCA9IDA7CiAgICAgICAgICAgICByZXR2YWwgPSBscEVudW1GdW5jKCBTRUdQVFJfR0VUKGJydXNoKSwgbFBhcmFtICk7Ci0gICAgICAgICAgICBkcHJpbnRmX2luZm8oZ2RpLCAiRW51bU9iamVjdHMxNjogc29saWQgYnJ1c2ggJTA4bHgsIHJldD0lZFxuIiwKKyAgICAgICAgICAgIFRSQUNFKGdkaSwgInNvbGlkIGJydXNoICUwOGx4LCByZXQ9JWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc29saWRfY29sb3JzW2ldLCByZXR2YWwpOwogICAgICAgICAgICAgaWYgKCFyZXR2YWwpIGJyZWFrOwogICAgICAgICB9CkBAIC02ODksNyArNjkyLDcgQEAKICAgICAgICAgICAgIGJydXNoLT5sYkNvbG9yID0gUkdCKDAsMCwwKTsKICAgICAgICAgICAgIGJydXNoLT5sYkhhdGNoID0gaTsKICAgICAgICAgICAgIHJldHZhbCA9IGxwRW51bUZ1bmMoIFNFR1BUUl9HRVQoYnJ1c2gpLCBsUGFyYW0gKTsKLSAgICAgICAgICAgIGRwcmludGZfaW5mbyhnZGksICJFbnVtT2JqZWN0czE2OiBoYXRjaGVkIGJydXNoICVkLCByZXQ9JWRcbiIsCisgICAgICAgICAgICBUUkFDRShnZGksICJoYXRjaGVkIGJydXNoICVkLCByZXQ9JWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgcmV0dmFsKTsKICAgICAgICAgICAgIGlmICghcmV0dmFsKSBicmVhazsKICAgICAgICAgfQpAQCAtNzI2LDcgKzcyOSw3IEBACiAgICAgTE9HUEVOMzIgcGVuOwogICAgIExPR0JSVVNIMzIgYnJ1c2g7CiAKLSAgICBkcHJpbnRmX2luZm8oZ2RpLCAiRW51bU9iamVjdHMzMjogJTA0eCAlZCAlMDhseCAlMDhseFxuIiwKKyAgICBUUkFDRShnZGksICIlMDR4ICVkICUwOGx4ICUwOGx4XG4iLAogICAgICAgICAgICAgICAgICBoZGMsIG5PYmpUeXBlLCAoRFdPUkQpbHBFbnVtRnVuYywgbFBhcmFtICk7CiAgICAgc3dpdGNoKG5PYmpUeXBlKQogICAgIHsKQEAgLTczOSw3ICs3NDIsNyBAQAogICAgICAgICAgICAgcGVuLmxvcG5XaWR0aC55ID0gMDsKICAgICAgICAgICAgIHBlbi5sb3BuQ29sb3IgICA9IHNvbGlkX2NvbG9yc1tpXTsKICAgICAgICAgICAgIHJldHZhbCA9IGxwRW51bUZ1bmMoICZwZW4sIGxQYXJhbSApOwotICAgICAgICAgICAgZHByaW50Zl9pbmZvKGdkaSwgIkVudW1PYmplY3RzMzI6IHNvbGlkIHBlbiAlMDhseCwgcmV0PSVkXG4iLAorICAgICAgICAgICAgVFJBQ0UoZ2RpLCAic29saWQgcGVuICUwOGx4LCByZXQ9JWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc29saWRfY29sb3JzW2ldLCByZXR2YWwpOwogICAgICAgICAgICAgaWYgKCFyZXR2YWwpIGJyZWFrOwogICAgICAgICB9CkBAIC03NTMsNyArNzU2LDcgQEAKICAgICAgICAgICAgIGJydXNoLmxiQ29sb3IgPSBzb2xpZF9jb2xvcnNbaV07CiAgICAgICAgICAgICBicnVzaC5sYkhhdGNoID0gMDsKICAgICAgICAgICAgIHJldHZhbCA9IGxwRW51bUZ1bmMoICZicnVzaCwgbFBhcmFtICk7Ci0gICAgICAgICAgICBkcHJpbnRmX2luZm8oZ2RpLCAiRW51bU9iamVjdHMzMjogc29saWQgYnJ1c2ggJTA4bHgsIHJldD0lZFxuIiwKKyAgICAgICAgICAgIFRSQUNFKGdkaSwgInNvbGlkIGJydXNoICUwOGx4LCByZXQ9JWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc29saWRfY29sb3JzW2ldLCByZXR2YWwpOwogICAgICAgICAgICAgaWYgKCFyZXR2YWwpIGJyZWFrOwogICAgICAgICB9CkBAIC03NjUsNyArNzY4LDcgQEAKICAgICAgICAgICAgIGJydXNoLmxiQ29sb3IgPSBSR0IoMCwwLDApOwogICAgICAgICAgICAgYnJ1c2gubGJIYXRjaCA9IGk7CiAgICAgICAgICAgICByZXR2YWwgPSBscEVudW1GdW5jKCAmYnJ1c2gsIGxQYXJhbSApOwotICAgICAgICAgICAgZHByaW50Zl9pbmZvKGdkaSwgIkVudW1PYmplY3RzMzI6IGhhdGNoZWQgYnJ1c2ggJWQsIHJldD0lZFxuIiwKKyAgICAgICAgICAgIFRSQUNFKGdkaSwgImhhdGNoZWQgYnJ1c2ggJWQsIHJldD0lZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBpLCByZXR2YWwpOwogICAgICAgICAgICAgaWYgKCFyZXR2YWwpIGJyZWFrOwogICAgICAgICB9CkBAIC04ODUsMTcgKzg4OCwyMyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBNdWxEaXYzMiAgIChLRVJORUwzMi4zOTEpCisgKiBSRVRVUk5TCisgKglSZXN1bHQgb2YgbXVsdGlwbGljYXRpb24gYW5kIGRpdmlzaW9uCisgKgktMTogT3ZlcmZsb3cgb2NjdXJyZWQgb3IgRGl2aXNvciB3YXMgMAogICovCi1JTlQzMiBXSU5BUEkgTXVsRGl2MzIoIElOVDMyIGZvbywgSU5UMzIgYmFyLCBJTlQzMiBiYXogKQoteworSU5UMzIgV0lOQVBJIE11bERpdjMyKAorCSAgICAgSU5UMzIgbk11bHRpcGxpY2FuZCwgCisJICAgICBJTlQzMiBuTXVsdGlwbGllciwKKwkgICAgIElOVDMyIG5EaXZpc29yCispIHsKICNpZmRlZiBfX0dOVUNfXwogICAgIGxvbmcgbG9uZyByZXQ7Ci0gICAgaWYgKCFiYXopIHJldHVybiAtMTsKLSAgICByZXQgPSAoKGxvbmcgbG9uZylmb28gKiBiYXIpIC8gYmF6OworICAgIGlmICghbkRpdmlzb3IpIHJldHVybiAtMTsKKyAgICByZXQgPSAoKGxvbmcgbG9uZyluTXVsdGlwbGljYW5kICogbk11bHRpcGxpZXIpIC8gbkRpdmlzb3I7CiAgICAgaWYgKChyZXQgPiAyMTQ3NDgzNjQ3KSB8fCAocmV0IDwgLTIxNDc0ODM2NDcpKSByZXR1cm4gLTE7CiAgICAgcmV0dXJuIHJldDsKICNlbHNlCi0gICAgaWYgKCFiYXopIHJldHVybiAtMTsKLSAgICByZXR1cm4gKGZvbyAqIGJhcikgLyBiYXo7CisgICAgaWYgKCFuRGl2aXNvcikgcmV0dXJuIC0xOworICAgIHJldHVybiAobk11bHRpcGxpY2FuZCAqIG5NdWx0aXBsaWVyKSAvIG5EaXZpc29yOwogI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9vYmplY3RzL21ldGFmaWxlLmMgYi9vYmplY3RzL21ldGFmaWxlLmMKaW5kZXggMWQ1OGFmMC4uNjg2ZDVjZCAxMDA2NDQKLS0tIGEvb2JqZWN0cy9tZXRhZmlsZS5jCisrKyBiL29iamVjdHMvbWV0YWZpbGUuYwpAQCAtNzksNyArNzksNyBAQAogICBIRklMRTMyIGhGaWxlOwogICBEV09SRCBzaXplOwogICAKLSAgZHByaW50Zl9pbmZvKG1ldGFmaWxlLCJHZXRNZXRhRmlsZTogJXNcbiIsIGxwRmlsZW5hbWUpOworICBUUkFDRShtZXRhZmlsZSwiJXNcbiIsIGxwRmlsZW5hbWUpOwogCiAgIGlmICghbHBGaWxlbmFtZSkKICAgICByZXR1cm4gMDsKQEAgLTE3OCwxOCArMTc4LDE1IEBACiAgKiAgQ29weWluZyB0byBkaXNrIHJldHVybnMgTlVMTCBldmVuIGlmIHN1Y2Nlc3NmdWwuCiAgKi8KIEhNRVRBRklMRTMyIFdJTkFQSSBDb3B5TWV0YUZpbGUzMkEoCi0JCQkJICAgSE1FVEFGSUxFMzIgaFNyY01ldGFGaWxlLCAKLQkJCQkgICAvKiBoYW5kbGUgb2YgbWV0YWZpbGUgdG8gY29weSAqLwotCQkJCSAgIExQQ1NUUiBscEZpbGVuYW1lCi0JCQkJICAgLyogZmlsZW5hbWUgaWYgY29weWluZyB0byBhIGZpbGUgKi8KLSkKLXsKKwkJICAgSE1FVEFGSUxFMzIgaFNyY01ldGFGaWxlLCAvKiBoYW5kbGUgb2YgbWV0YWZpbGUgdG8gY29weSAqLworCQkgICBMUENTVFIgbHBGaWxlbmFtZSAvKiBmaWxlbmFtZSBpZiBjb3B5aW5nIHRvIGEgZmlsZSAqLworKSB7CiAgICAgSE1FVEFGSUxFMTYgaGFuZGxlID0gMDsKICAgICBNRVRBSEVBREVSICptaDsKICAgICBNRVRBSEVBREVSICptaDI7CiAgICAgSEZJTEUzMiBoRmlsZTsKICAgICAKLSAgICBkcHJpbnRmX2luZm8obWV0YWZpbGUsIkNvcHlNZXRhRmlsZTogJXNcbiIsIGxwRmlsZW5hbWUpOworICAgIFRSQUNFKG1ldGFmaWxlLCIlc1xuIiwgbHBGaWxlbmFtZSk7CiAgICAgCiAgICAgbWggPSAoTUVUQUhFQURFUiAqKUdsb2JhbExvY2sxNihoU3JjTWV0YUZpbGUpOwogICAgIApAQCAtMjYwLDcgKzI1Nyw3IEBACiAgICAgICAgICAgICByZXN1PVRSVUU7CiAgICAgICBHbG9iYWxVbmxvY2sxNihobWYpOwogICAgIH0KLSAgICBkcHJpbnRmX2luZm8obWV0YWZpbGUsIklzVmFsaWRNZXRhRmlsZSAleCA9PiAlZFxuIixobWYscmVzdSk7CisgICAgVFJBQ0UobWV0YWZpbGUsIklzVmFsaWRNZXRhRmlsZSAleCA9PiAlZFxuIixobWYscmVzdSk7CiAgICAgcmV0dXJuIHJlc3U7ICAgICAgICAgCiB9CiAKQEAgLTI5Niw3ICsyOTMsNyBAQAogICAgIEhGT05UMzIgaEZvbnQ7CiAgICAgREMgKmRjOwogICAgIAotICAgIGRwcmludGZfaW5mbyhtZXRhZmlsZSwiUGxheU1ldGFGaWxlKCUwNHggJTA0eClcbiIsaGRjLGhtZik7CisgICAgVFJBQ0UobWV0YWZpbGUsIiglMDR4ICUwNHgpXG4iLGhkYyxobWYpOwogICAgIGlmICghbWgpIHJldHVybiBGQUxTRTsKICAgICBpZiAoIShkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICkpKSByZXR1cm4gMDsKICAgICBoUGVuID0gZGMtPncuaFBlbjsKQEAgLTMxNCw3ICszMTEsNyBAQAogICAgIHdoaWxlIChvZmZzZXQgPCBtaC0+bXRTaXplICogMikKICAgICB7CiAgICAgICAgIG1yID0gKE1FVEFSRUNPUkQgKikoKGNoYXIgKiltaCArIG9mZnNldCk7Ci0JZHByaW50Zl9pbmZvKG1ldGFmaWxlLCJvZmZzZXQgPSAlMDR4IHNpemUgPSAlMDhseFxuIiwKKwlUUkFDRShtZXRhZmlsZSwib2Zmc2V0ID0gJTA0eCBzaXplID0gJTA4bHhcbiIsCiAJCQkgb2Zmc2V0LCBtci0+cmRTaXplKTsKIAlpZiAoIW1yLT5yZFNpemUpIHsKIAkJZnByaW50ZihzdGRlcnIsIk1FVEFGSUxFIGVudHJ5IGdvdCBzaXplIDAgYXQgb2Zmc2V0ICVkLCB0b3RhbCBtZiBsZW5ndGggaXMgJWxkXG4iLG9mZnNldCxtaC0+bXRTaXplKjIpOwpAQCAtMzc0LDcgKzM3MSw3IEBACiAgICAgREMgKmRjOwogICAgIEJPT0wxNiByZXN1bHQgPSBUUlVFOwogICAgIAotICAgIGRwcmludGZfaW5mbyhtZXRhZmlsZSwiRW51bU1ldGFGaWxlKCUwNHgsICUwNHgsICUwOGx4LCAlMDhseClcbiIsCisgICAgVFJBQ0UobWV0YWZpbGUsIiglMDR4LCAlMDR4LCAlMDhseCwgJTA4bHgpXG4iLAogCQkgICAgIGhkYywgaG1mLCAoRFdPUkQpbHBFbnVtRnVuYywgbHBEYXRhKTsKIAogICAgIGlmICghKGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKSkpIHJldHVybiAwOwpAQCAtNDQzLDI2ICs0NDAsMTkgQEAKICAqICBBQk9SVERPQywgRU5ERE9DLCBDUkVBVEVCUlVTSCwgQ1JFQVRFQklUTUFQSU5ESVJFQ1QsIGFuZCBDUkVBVEVCSVRNQVAuCiAgKgogICovCi0KIHZvaWQgV0lOQVBJIFBsYXlNZXRhRmlsZVJlY29yZDE2KCAKLQkJCQkgSERDMTYgaGRjLCAKLQkJCQkgLyogREMgdG8gcmVuZGVyIG1ldGFmaWxlIGludG8gKi8KLQkJCQkgSEFORExFVEFCTEUxNiAqaHQsIAotCQkJCSAvKiBwb2ludGVyIHRvIGhhbmRsZSB0YWJsZSBmb3IgbWV0YWZpbGUgb2JqZWN0cyAqLwotCQkJCSBNRVRBUkVDT1JEICptciwgCi0JCQkJIC8qIHBvaW50ZXIgdG8gbWV0YWZpbGUgcmVjb3JkIHRvIHJlbmRlciAqLwotCQkJCSBVSU5UMTYgbkhhbmRsZXMgCi0JCQkJIC8qIHNpemUgb2YgaGFuZGxlIHRhYmxlICovCi0pCi17CisJICAgIEhEQzE2IGhkYywgLyogREMgdG8gcmVuZGVyIG1ldGFmaWxlIGludG8gKi8KKwkgICAgSEFORExFVEFCTEUxNiAqaHQsIC8qIHBvaW50ZXIgdG8gaGFuZGxlIHRhYmxlIGZvciBtZXRhZmlsZSBvYmplY3RzICovCisJICAgIE1FVEFSRUNPUkQgKm1yLCAvKiBwb2ludGVyIHRvIG1ldGFmaWxlIHJlY29yZCB0byByZW5kZXIgKi8KKwkgICAgVUlOVDE2IG5IYW5kbGVzIC8qIHNpemUgb2YgaGFuZGxlIHRhYmxlICovCispIHsKICAgICBzaG9ydCBzMTsKICAgICBIQU5ETEUxNiBobmRsOwogICAgIGNoYXIgKnB0cjsKICAgICBCSVRNQVBJTkZPSEVBREVSICppbmZvaGRyOwogCi0gICAgZHByaW50Zl9pbmZvKG1ldGFmaWxlLAotIlBsYXlNZXRhRmlsZVJlY29yZCglMDR4ICUwOGx4ICUwOGx4ICUwNHgpIGZ1bmN0aW9uICUwNHhcbiIsCi0JCSAgICAgaGRjLChMT05HKWh0LCAoTE9ORyltciwgbkhhbmRsZXMsIG1yLT5yZEZ1bmN0aW9uKTsKKyAgICBUUkFDRShtZXRhZmlsZSwiKCUwNHggJTA4bHggJTA4bHggJTA0eCkgZnVuY3Rpb24gJTA0eFxuIiwKKwkJIGhkYywoTE9ORylodCwgKExPTkcpbXIsIG5IYW5kbGVzLCBtci0+cmRGdW5jdGlvbik7CiAgICAgCiAgICAgc3dpdGNoIChtci0+cmRGdW5jdGlvbikKICAgICB7CkBAIC03MTEsNyArNzAxLDcgQEAKIAlicmVhazsKIAogICAgIGNhc2UgTUVUQV9FU0NBUEU6Ci0JZHByaW50Zl9maXhtZShtZXRhZmlsZSwgIlBsYXlNZXRhRmlsZVJlY29yZDogTUVUQV9FU0NBUEUgdW5pbXBsZW1lbnRlZC5cbiIpOworCUZJWE1FKG1ldGFmaWxlLCAiTUVUQV9FU0NBUEUgdW5pbXBsZW1lbnRlZC5cbiIpOwogICAgICAgICBicmVhazsKIAogICAgICAgICAvKiAtLS0gQmVnaW4gb2YgZml4ZWQgb3IgbmV3IG1ldGFmaWxlIG9wZXJhdGlvbnMuIEp1bHkgMTk5NiAtLS0tKi8KQEAgLTczNiw3ICs3MjYsNyBAQAogICAgICAgICAgICAgZHh4ID0gKExQSU5UMTYpKHNvdCsoKChzMSsxKT4+MSkqMikpOwkgICAKICAgICAgICAgICBlbHNlIAogCSAgewotCSAgIGRwcmludGZfaW5mbyhtZXRhZmlsZSwiRVhUVEVYVE9VVDogJXMgIGxlbjogJWxkXG4iLAorCSAgIFRSQUNFKG1ldGFmaWxlLCIlcyAgbGVuOiAlbGRcbiIsCiAgICAgICAgICAgICAgc290LG1yLT5yZFNpemUpOwogICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKIAkgICAgICJQbGVhc2UgcmVwb3J0OiBQbGF5TWV0YUZpbGUvRXh0VGV4dE91dCBsZW49JWxkIHNsZW49JWQgcmRTaXplPSVsZCBvcHQ9JTA0eFxuIiwKQEAgLTc1MCw3ICs3NDAsNyBAQAogCQkgICAgICAgICAgIHNvdCwJCQkJLyogc3RyaW5nICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMSwgZHh4KTsgICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCwgZHggYXJyYXkgKi8KICAgICAgICAgaWYgKGR4eCkgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgZHByaW50Zl9pbmZvKG1ldGFmaWxlLCJFWFRURVhUT1VUOiAlcyAgbGVuOiAlbGQgIGR4MDogJWRcbiIsCisgICAgICAgICAgVFJBQ0UobWV0YWZpbGUsIiVzICBsZW46ICVsZCAgZHgwOiAlZFxuIiwKICAgICAgICAgICAgIHNvdCxtci0+cmRTaXplLGR4eFswXSk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwpAQCAtODQxLDcgKzgzMSw3IEBACiAKICAgICAgY2FzZSBNRVRBX0RJQkNSRUFURVBBVFRFUk5CUlVTSDoKIAkvKiAgKihtci0+cmRQYXJhbSkgbWF5IGJlIEJTX1BBVFRFUk4gb3IgQlNfRElCUEFUVEVSTjogYnV0IHRoZXJlJ3Mgbm8gZGlmZmVyZW5jZSAqLwotICAgICAgICBkcHJpbnRmX2luZm8obWV0YWZpbGUsIk1FVEFfRElCQ1JFQVRFUEFUVEVSTkJSVVNIOiAlZFxuIiwqKG1yLT5yZFBhcmFtKSk7CisgICAgICAgIFRSQUNFKG1ldGFmaWxlLCIlZFxuIiwqKG1yLT5yZFBhcmFtKSk7CiAJczEgPSBtci0+cmRTaXplICogMiAtIHNpemVvZihNRVRBUkVDT1JEKSAtIDI7CiAJaG5kbCA9IEdsb2JhbEFsbG9jMTYoR01FTV9NT1ZFQUJMRSwgczEpOwogCXB0ciA9IEdsb2JhbExvY2sxNihobmRsKTsKQEAgLTkwNyw3ICs4OTcsNyBAQAogCQkJCSBITUVUQUZJTEUxNiBobWYgLyogbWV0YWZpbGUgaGFuZGxlICovCiAJCQkJICkKIHsKLSAgICBkcHJpbnRmX2luZm8obWV0YWZpbGUsIkdldE1ldGFGaWxlQml0czogaE1lbSBvdXQ6ICUwNHhcbiIsIGhtZik7CisgICAgVFJBQ0UobWV0YWZpbGUsImhNZW0gb3V0OiAlMDR4XG4iLCBobWYpOwogICAgIHJldHVybiBobWY7CiB9CiAKQEAgLTkyNCw3ICs5MTQsNyBAQAogCQkJLyogaGFuZGxlIHRvIGEgbWVtb3J5IHJlZ2lvbiBob2xkaW5nIGEgbWV0YWZpbGUgKi8KICkKIHsKLSAgICBkcHJpbnRmX2luZm8obWV0YWZpbGUsIlNldE1ldGFGaWxlQml0czogaG1mIG91dDogJTA0eFxuIiwgaE1lbSk7CisgICAgVFJBQ0UobWV0YWZpbGUsImhtZiBvdXQ6ICUwNHhcbiIsIGhNZW0pOwogCiAgICAgcmV0dXJuIGhNZW07CiB9CkBAIC0xMDQyLDcgKzEwMzIsNyBAQAogCW1lbWNweSgoV09SRCAqKXBoeXNEZXYtPm1oICsgcGh5c0Rldi0+bWgtPm10U2l6ZSwgbXIsIHJsZW4pOwogICAgICAgICBicmVhazsKICAgICBjYXNlIE1FVEFGSUxFX0RJU0s6Ci0gICAgICAgIGRwcmludGZfaW5mbyhtZXRhZmlsZSwiV3JpdGluZyByZWNvcmQgdG8gZGlza1xuIik7CisgICAgICAgIFRSQUNFKG1ldGFmaWxlLCJXcml0aW5nIHJlY29yZCB0byBkaXNrXG4iKTsKIAlpZiAoX2x3cml0ZTMyKHBoeXNEZXYtPm1oLT5tdE5vUGFyYW1ldGVycywgKGNoYXIgKiltciwgcmxlbikgPT0gLTEpCiAJICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgYnJlYWs7CkBAIC0xNDQyLDcgKzE0MzIsNyBAQAogICAgICoobXItPnJkUGFyYW0gKyA5KSA9IEJNLmJtV2lkdGhCeXRlczsKICAgICAqKG1yLT5yZFBhcmFtICsxMCkgPSBCTS5ibVBsYW5lczsKICAgICAqKG1yLT5yZFBhcmFtICsxMSkgPSBCTS5ibUJpdHNQaXhlbDsKLSAgICBkcHJpbnRmX2luZm8obWV0YWZpbGUsIk1GX1N0cmV0Y2hCbHQtPmxlbiA9ICVsZCAgcm9wPSVseCAgXG4iLGxlbixyb3ApOworICAgIFRSQUNFKG1ldGFmaWxlLCJNRl9TdHJldGNoQmx0LT5sZW4gPSAlbGQgIHJvcD0lbHggIFxuIixsZW4scm9wKTsKICAgICBpZiAoR2V0Qml0bWFwQml0czMyKGRjU3JjLT53LmhCaXRtYXAsQk0uYm1XaWR0aEJ5dGVzICogQk0uYm1IZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICBtci0+cmRQYXJhbSArMTIpKQogICAgIHsKQEAgLTE1MDcsNyArMTQ5Nyw3IEBACiAgICAgbHBCTUktPmJpWVBlbHNQZXJNZXRlciA9IE11bERpdjMyKEdldERldmljZUNhcHMoZGNTcmMtPmhTZWxmLExPR1BJWEVMU1kpLDM5MzcsMTAwKTsKICAgICBscEJNSS0+YmlDbHJJbXBvcnRhbnQgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEgbWV0ZXIgID0gMzkuMzcgaW5jaCAqLwogCi0gICAgZHByaW50Zl9pbmZvKG1ldGFmaWxlLCJNRl9TdHJldGNoQmx0VmlhRElCLT5sZW4gPSAlbGQgIHJvcD0lbHggIFBpeFlQTT0lbGQgQ2Fwcz0lZFxuIiwKKyAgICBUUkFDRShtZXRhZmlsZSwiTUZfU3RyZXRjaEJsdFZpYURJQi0+bGVuID0gJWxkICByb3A9JWx4ICBQaXhZUE09JWxkIENhcHM9JWRcbiIsCiAgICAgICAgICAgICAgICBsZW4scm9wLGxwQk1JLT5iaVlQZWxzUGVyTWV0ZXIsR2V0RGV2aWNlQ2FwcyhoZGNTcmMsTE9HUElYRUxTWSkpOwogICAgIGlmIChHZXRESUJpdHMoaGRjU3JjLGRjU3JjLT53LmhCaXRtYXAsMCwoVUlOVDMyKWxwQk1JLT5iaUhlaWdodCwKICAgICAgICAgICAgICAgICAgIChMUFNUUilscEJNSSArIERJQl9CaXRtYXBJbmZvU2l6ZSggKEJJVE1BUElORk8gKilscEJNSSwKQEAgLTE1MjQsNyArMTUxNCw3IEBACiAgICAgKihtci0+cmRQYXJhbSArMTIpID0gQk0uYm1XaWR0aEJ5dGVzOwogICAgICoobXItPnJkUGFyYW0gKzEzKSA9IEJNLmJtUGxhbmVzOwogICAgICoobXItPnJkUGFyYW0gKzE0KSA9IEJNLmJtQml0c1BpeGVsOwotICAgIGRwcmludGZfaW5mbyhtZXRhZmlsZSwiTUZfU3RyZXRjaEJsdC0+bGVuID0gJWxkICByb3A9JWx4ICBcbiIsbGVuLHJvcCk7CisgICAgVFJBQ0UobWV0YWZpbGUsIk1GX1N0cmV0Y2hCbHQtPmxlbiA9ICVsZCAgcm9wPSVseCAgXG4iLGxlbixyb3ApOwogICAgIGlmIChHZXRCaXRtYXBCaXRzMzIoIGRjU3JjLT53LmhCaXRtYXAsIEJNLmJtV2lkdGhCeXRlcyAqIEJNLmJtSGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgIG1yLT5yZFBhcmFtICsxNSkpCiAjZW5kaWYgICAgCmRpZmYgLS1naXQgYS9vYmplY3RzL3BhbGV0dGUuYyBiL29iamVjdHMvcGFsZXR0ZS5jCmluZGV4IGQxMWMyY2QuLjhlMjU5NzAgMTAwNjQ0Ci0tLSBhL29iamVjdHMvcGFsZXR0ZS5jCisrKyBiL29iamVjdHMvcGFsZXR0ZS5jCkBAIC05Myw3ICs5Myw3IEBACiAgICAgSFBBTEVUVEUzMiBocGFsZXR0ZTsKICAgICBpbnQgc2l6ZSA9IHNpemVvZihMT0dQQUxFVFRFKSArIChwYWxldHRlLT5wYWxOdW1FbnRyaWVzIC0gMSkgKiBzaXplb2YoUEFMRVRURUVOVFJZKTsKIAotICAgIGRwcmludGZfaW5mbyhwYWxldHRlLCJDcmVhdGVQYWxldHRlOiAlaSBlbnRyaWVzIFxuIiwKKyAgICBUUkFDRShwYWxldHRlLCIlaSBlbnRyaWVzIFxuIiwKICAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZS0+cGFsTnVtRW50cmllcyk7CiAKICAgICBocGFsZXR0ZSA9IEdESV9BbGxvY09iamVjdCggc2l6ZSArIHNpemVvZihpbnQqKSArc2l6ZW9mKEdESU9CSkhEUikgLCBQQUxFVFRFX01BR0lDICk7CkBAIC0xMDYsNyArMTA2LDcgQEAKICAgICBwYWxldHRlUHRyLT5tYXBwaW5nID0gTlVMTDsKICAgICBHRElfSEVBUF9VTkxPQ0soIGhwYWxldHRlICk7CiAKLSAgICBkcHJpbnRmX2luZm8ocGFsZXR0ZSwiICAgcmV0dXJuaW5nICUwNHhcbiIsIGhwYWxldHRlKTsKKyAgICBUUkFDRShwYWxldHRlLCIgICByZXR1cm5pbmcgJTA0eFxuIiwgaHBhbGV0dGUpOwogICAgIHJldHVybiBocGFsZXR0ZTsKIH0KIApAQCAtMTM4LDcgKzEzOCw3IEBACiAgICAgUEFMRVRURU9CSiAqIHBhbFB0cjsKICAgICBJTlQzMiBudW1FbnRyaWVzOwogCi0gICAgZHByaW50Zl9pbmZvKHBhbGV0dGUsIkdldFBhbGV0dGVFbnRyaWVzOiBocGFsID0gJTA0eCwgJWkgZW50cmllc1xuIiwKKyAgICBUUkFDRShwYWxldHRlLCJocGFsID0gJTA0eCwgJWkgZW50cmllc1xuIiwKICAgICAgICAgICAgICAgICAgICAgIGhwYWxldHRlLCBjb3VudCApOwogICAgICAgICAKICAgICBwYWxQdHIgPSAoUEFMRVRURU9CSiAqKSBHRElfR2V0T2JqUHRyKCBocGFsZXR0ZSwgUEFMRVRURV9NQUdJQyApOwpAQCAtMTgwLDcgKzE4MCw3IEBACiAgICAgUEFMRVRURU9CSiAqIHBhbFB0cjsKICAgICBJTlQzMiBudW1FbnRyaWVzOwogCi0gICAgZHByaW50Zl9pbmZvKHBhbGV0dGUsIlNldFBhbGV0dGVFbnRyaWVzOiBocGFsID0gJTA0eCwgJWkgZW50cmllc1xuIiwKKyAgICBUUkFDRShwYWxldHRlLCJocGFsID0gJTA0eCwgJWkgZW50cmllc1xuIiwKICAgICAgICAgICAgICAgICAgICAgIGhwYWxldHRlLCBjb3VudCApOwogCiAgICAgcGFsUHRyID0gKFBBTEVUVEVPQkogKikgR0RJX0dldE9ialB0ciggaHBhbGV0dGUsIFBBTEVUVEVfTUFHSUMgKTsKQEAgLTIyMyw3ICsyMjMsNyBAQAogICAgIGludAkJIHByZXZzaXplLCBzaXplID0gc2l6ZW9mKExPR1BBTEVUVEUpICsgKGNFbnRyaWVzIC0gMSkgKiBzaXplb2YoUEFMRVRURUVOVFJZKTsKICAgICBpbnQqCSBtYXBwaW5nID0gTlVMTDsKIAotICAgIGRwcmludGZfaW5mbyhwYWxldHRlLCJSZXNpemVQYWxldHRlOiBocGFsID0gJTA0eCwgcHJldiA9ICVpLCBuZXcgPSAlaVxuIiwKKyAgICBUUkFDRShwYWxldHRlLCJocGFsID0gJTA0eCwgcHJldiA9ICVpLCBuZXcgPSAlaVxuIiwKIAkJICAgIGhQYWwsIHBhbFB0ciA/IHBhbFB0ci0+bG9ncGFsZXR0ZS5wYWxOdW1FbnRyaWVzIDogLTEsCiAgICAgICAgICAgICAgICAgICAgIGNFbnRyaWVzICk7CiAgICAgaWYoICFwYWxQdHIgKSByZXR1cm4gRkFMU0U7CkBAIC0yNzUsNyArMjc1LDcgQEAKIEJPT0wzMiBXSU5BUEkgQW5pbWF0ZVBhbGV0dGUzMiggSFBBTEVUVEUzMiBoUGFsLCBVSU5UMzIgU3RhcnRJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMzIgTnVtRW50cmllcywgTFBQQUxFVFRFRU5UUlkgUGFsZXR0ZUNvbG9ycykKIHsKLSAgICBkcHJpbnRmX2luZm8ocGFsZXR0ZSwgIkFuaW1hdGVQYWxldHRlOiAlMDR4ICglaSAtICVpKVxuIiwgaFBhbCwgCisgICAgVFJBQ0UocGFsZXR0ZSwgIiUwNHggKCVpIC0gJWkpXG4iLCBoUGFsLCAKICAgICAgICAgICAgICAgICAgICAgU3RhcnRJbmRleCwgU3RhcnRJbmRleCArIE51bUVudHJpZXMgKTsKIAogICAgIGlmKCBoUGFsICE9IFNUT0NLX0RFRkFVTFRfUEFMRVRURSApIApAQCAtMzU2LDcgKzM1Niw3IEBACiAgICAgVUlOVDMyIGk7CiAgICAgREMgKmRjOwogCi0gICAgZHByaW50Zl9pbmZvKHBhbGV0dGUsICJHZXRTeXN0ZW1QYWxldHRlRW50cmllczogaGRjID0gJTA0eCwgIgorICAgIFRSQUNFKHBhbGV0dGUsICJoZGMgPSAlMDR4LCAiCiAJCSAgICAiY291bmQgPSAlaVxuIiwgaGRjLCBjb3VudCApOwogCiAgICAgaWYgKCEoZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApKSkgcmV0dXJuIDA7CkBAIC0zNzEsNyArMzcxLDcgQEAKICAgICB7CiAJKihDT0xPUlJFRiopKGVudHJpZXMgKyBpKSA9IENPTE9SX0dldFN5c3RlbVBhbGV0dGVFbnRyeSggc3RhcnQgKyBpICk7CiAKLSAgICAgICAgZHByaW50Zl9pbmZvKHBhbGV0dGUsIlx0aWR4KCUwMngpIC0+IFJHQiglMDhseClcbiIsCisgICAgICAgIFRSQUNFKHBhbGV0dGUsIlx0aWR4KCUwMngpIC0+IFJHQiglMDhseClcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyBpLCAqKENPTE9SUkVGKikoZW50cmllcyArIGkpICk7CiAgICAgfQogICAgIEdESV9IRUFQX1VOTE9DSyggaGRjICk7CkBAIC00MDEsNyArNDAxLDcgQEAKIAkJCQkgICAgICAgICAgcGFsT2JqLT5sb2dwYWxldHRlLnBhbE51bUVudHJpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBjb2xvciwgRkFMU0UgKTsKIAotICAgIGRwcmludGZfaW5mbyhwYWxldHRlLCJHZXROZWFyZXN0UGFsZXR0ZUluZGV4KCUwNHgsJTA2bHgpOiByZXR1cm5pbmcgJWRcbiIsIAorICAgIFRSQUNFKHBhbGV0dGUsIiglMDR4LCUwNmx4KTogcmV0dXJuaW5nICVkXG4iLCAKICAgICAgICAgICAgICAgICAgICAgaHBhbGV0dGUsIGNvbG9yLCBpbmRleCApOwogICAgIEdESV9IRUFQX1VOTE9DSyggaHBhbGV0dGUgKTsKICAgICByZXR1cm4gaW5kZXg7CkBAIC00MzcsNyArNDM3LDcgQEAKICAgICAgIEdESV9IRUFQX1VOTE9DSyggZGMtPncuaFBhbGV0dGUgKTsKICAgICB9CiAKLSAgICBkcHJpbnRmX2luZm8ocGFsZXR0ZSwiR2V0TmVhcmVzdENvbG9yKCUwNmx4KTogcmV0dXJuaW5nICUwNmx4XG4iLCAKKyAgICBUUkFDRShwYWxldHRlLCIoJTA2bHgpOiByZXR1cm5pbmcgJTA2bHhcbiIsIAogICAgICAgICAgICAgICAgICAgICBjb2xvciwgbmVhcmVzdCApOwogICAgIEdESV9IRUFQX1VOTE9DSyggaGRjICk7ICAgIAogICAgIHJldHVybiBuZWFyZXN0OwpAQCAtNDg5LDcgKzQ4OSw3IEBACiAgICAgSFBBTEVUVEUxNiBwcmV2OwogICAgIERDICpkYzsKIAotICAgIGRwcmludGZfaW5mbyhwYWxldHRlLCAiR0RJU2VsZWN0UGFsZXR0ZTogJTA0eCAlMDR4XG4iLCBoZGMsIGhwYWwgKTsKKyAgICBUUkFDRShwYWxldHRlLCAiJTA0eCAlMDR4XG4iLCBoZGMsIGhwYWwgKTsKICAgICAKICAgICBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICk7CiAgICAgaWYgKCFkYykgCkBAIC01MTksNyArNTE5LDcgQEAKIAlpZiAoIWRjKSByZXR1cm4gMDsKICAgICB9CiAKLSAgICBkcHJpbnRmX2luZm8ocGFsZXR0ZSwgIkdESVJlYWxpemVQYWxldHRlOiAlMDR4Li4uXG4iLCBoZGMgKTsKKyAgICBUUkFDRShwYWxldHRlLCAiJTA0eC4uLlxuIiwgaGRjICk7CiAgICAgCiAgICAgaWYoIGRjICYmICBkYy0+dy5oUGFsZXR0ZSAhPSBoTGFzdFJlYWxpemVkUGFsZXR0ZSApCiAgICAgewpAQCAtNTM0LDExICs1MzQsMTEgQEAKIAlHRElfSEVBUF9VTkxPQ0soIGRjLT53LmhQYWxldHRlICk7CiAJaExhc3RSZWFsaXplZFBhbGV0dGUgPSBkYy0+dy5oUGFsZXR0ZTsKICAgICB9Ci0gICAgZWxzZSBkcHJpbnRmX2luZm8ocGFsZXR0ZSwgIiAgc2tpcHBpbmcgKGhMYXN0UmVhbGl6ZWRQYWxldHRlID0gJTA0eClcbiIsCisgICAgZWxzZSBUUkFDRShwYWxldHRlLCAiICBza2lwcGluZyAoaExhc3RSZWFsaXplZFBhbGV0dGUgPSAlMDR4KVxuIiwKIAkJCSBoTGFzdFJlYWxpemVkUGFsZXR0ZSk7CiAgICAgCiAgICAgR0RJX0hFQVBfVU5MT0NLKCBoZGMgKTsKLSAgICBkcHJpbnRmX2ZpeG1lKHBhbGV0dGUsICIgICByZWFsaXplZCAlaSBjb2xvcnMgLSBub3QgaW1wbWVuZW50ZWQ/XG4iLCByZWFsaXplZCApOworICAgIEZJWE1FKHBhbGV0dGUsICIgICByZWFsaXplZCAlaSBjb2xvcnMgLSBub3QgaW1wbWVuZW50ZWQ/XG4iLCByZWFsaXplZCApOwogICAgIHJldHVybiAoVUlOVDE2KXJlYWxpemVkOwogfQogCkBAIC01NTIsNyArNTUyLDcgQEAKICAgICBQQUxFVFRFT0JKKiAgcGFsUHRyOwogICAgIGludCAgICAgICAgICBpLCBpbmRleCwgcmVhbGl6ZWQgPSAwOwogCi0gICAgZHByaW50Zl9pbmZvKHBhbGV0dGUsIlJlYWxpemVEZWZhdWx0UGFsZXR0ZTogJTA0eFxuIiwgaGRjICk7CisgICAgVFJBQ0UocGFsZXR0ZSwiJTA0eFxuIiwgaGRjICk7CiAKICAgICBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICk7CiAgICAgaWYgKCFkYykgCkBAIC02MTksMTEgKzYxOSwxMSBAQAogICAgIFdPUkQJd0JrZ1BhbGV0dGUgPSAxOwogICAgIFBBTEVUVEVPQkoqIGxwdCA9IChQQUxFVFRFT0JKKikgR0RJX0dldE9ialB0ciggaFBhbCwgUEFMRVRURV9NQUdJQyApOwogCi0gICAgZHByaW50Zl9pbmZvKHBhbGV0dGUsIlNlbGVjdFBhbGV0dGU6IGRjICUwNHggcGFsICUwNHgsIGZvcmNlPSVpIFxuIiwgCisgICAgVFJBQ0UocGFsZXR0ZSwiZGMgJTA0eCBwYWwgJTA0eCwgZm9yY2U9JWkgXG4iLCAKIAkJCSAgICBoREMsIGhQYWwsIGJGb3JjZUJhY2tncm91bmQpOwogICAgIGlmKCAhbHB0ICkgcmV0dXJuIDA7CiAKLSAgICBkcHJpbnRmX2luZm8ocGFsZXR0ZSwiIGVudHJpZXMgPSAlZFxuIiwgCisgICAgVFJBQ0UocGFsZXR0ZSwiIGVudHJpZXMgPSAlZFxuIiwgCiAJCQkgICAgbHB0LT5sb2dwYWxldHRlLnBhbE51bUVudHJpZXMpOwogICAgIEdESV9IRUFQX1VOTE9DSyggaFBhbCApOwogCmRpZmYgLS1naXQgYS9vYmplY3RzL3Blbi5jIGIvb2JqZWN0cy9wZW4uYwppbmRleCBlMWY0NGE5Li43OWNhODJjIDEwMDY0NAotLS0gYS9vYmplY3RzL3Blbi5jCisrKyBiL29iamVjdHMvcGVuLmMKQEAgLTE3LDcgKzE3LDcgQEAKIEhQRU4xNiBXSU5BUEkgQ3JlYXRlUGVuMTYoIElOVDE2IHN0eWxlLCBJTlQxNiB3aWR0aCwgQ09MT1JSRUYgY29sb3IgKQogewogICAgIExPR1BFTjMyIGxvZ3BlbiA9IHsgc3R5bGUsIHsgd2lkdGgsIDAgfSwgY29sb3IgfTsKLSAgICBkcHJpbnRmX2luZm8oZ2RpLCAiQ3JlYXRlUGVuMTY6ICVkICVkICUwNmx4XG4iLCBzdHlsZSwgd2lkdGgsIGNvbG9yICk7CisgICAgVFJBQ0UoZ2RpLCAiJWQgJWQgJTA2bHhcbiIsIHN0eWxlLCB3aWR0aCwgY29sb3IgKTsKICAgICByZXR1cm4gQ3JlYXRlUGVuSW5kaXJlY3QzMiggJmxvZ3BlbiApOwogfQogCkBAIC0yOCw3ICsyOCw3IEBACiBIUEVOMzIgV0lOQVBJIENyZWF0ZVBlbjMyKCBJTlQzMiBzdHlsZSwgSU5UMzIgd2lkdGgsIENPTE9SUkVGIGNvbG9yICkKIHsKICAgICBMT0dQRU4zMiBsb2dwZW4gPSB7IHN0eWxlLCB7IHdpZHRoLCAwIH0sIGNvbG9yIH07Ci0gICAgZHByaW50Zl9pbmZvKGdkaSwgIkNyZWF0ZVBlbjMyOiAlZCAlZCAlMDZseFxuIiwgc3R5bGUsIHdpZHRoLCBjb2xvciApOworICAgIFRSQUNFKGdkaSwgIiVkICVkICUwNmx4XG4iLCBzdHlsZSwgd2lkdGgsIGNvbG9yICk7CiAgICAgcmV0dXJuIENyZWF0ZVBlbkluZGlyZWN0MzIoICZsb2dwZW4gKTsKIH0KIApkaWZmIC0tZ2l0IGEvb2JqZWN0cy9yZWdpb24uYyBiL29iamVjdHMvcmVnaW9uLmMKaW5kZXggZWY3OThkZC4uODU3MmQ1NiAxMDA2NDQKLS0tIGEvb2JqZWN0cy9yZWdpb24uYworKysgYi9vYmplY3RzL3JlZ2lvbi5jCkBAIC0xMDYsMTEgKzEwNiwxMSBAQAogewogICAgIFJFQ1QzMiAqcFJlY3QsICpwUmVjdEVuZCA9IHBSZWctPnJlY3RzICsgcFJlZy0+bnVtUmVjdHM7CiAKLSAgICBkcHJpbnRmX2luZm8ocmVnaW9uLCAiUmVnaW9uICVwOiAlZCwlZCAtICVkLCVkICVkIHJlY3RzXG4iLCBwUmVnLAorICAgIFRSQUNFKHJlZ2lvbiwgIlJlZ2lvbiAlcDogJWQsJWQgLSAlZCwlZCAlZCByZWN0c1xuIiwgcFJlZywKIAkgICAgcFJlZy0+ZXh0ZW50cy5sZWZ0LCBwUmVnLT5leHRlbnRzLnRvcCwKIAkgICAgcFJlZy0+ZXh0ZW50cy5yaWdodCwgcFJlZy0+ZXh0ZW50cy5ib3R0b20sIHBSZWctPm51bVJlY3RzKTsKICAgICBmb3IocFJlY3QgPSBwUmVnLT5yZWN0czsgcFJlY3QgPCBwUmVjdEVuZDsgcFJlY3QrKykKLSAgICAgICAgZHByaW50Zl9pbmZvKHJlZ2lvbiwgIlx0JWQsJWQgLSAlZCwlZFxuIiwgcFJlY3QtPmxlZnQsIHBSZWN0LT50b3AsCisgICAgICAgIFRSQUNFKHJlZ2lvbiwgIlx0JWQsJWQgLSAlZCwlZFxuIiwgcFJlY3QtPmxlZnQsIHBSZWN0LT50b3AsCiAJCSAgICAgICBwUmVjdC0+cmlnaHQsIHBSZWN0LT5ib3R0b20pOwogICAgIHJldHVybjsKIH0KQEAgLTE3MCw3ICsxNzAsNyBAQAogICovCiBCT09MMzIgUkVHSU9OX0RlbGV0ZU9iamVjdCggSFJHTjMyIGhyZ24sIFJHTk9CSiAqIG9iaiApCiB7Ci0gICAgZHByaW50Zl9pbmZvKHJlZ2lvbiwgIkRlbGV0ZVJlZ2lvbjogJTA0eFxuIiwgaHJnbiApOworICAgIFRSQUNFKHJlZ2lvbiwgIiAlMDR4XG4iLCBocmduICk7CiAKICAgICBSRUdJT05fRGVzdHJveVdpbmVSZWdpb24oIG9iai0+cmduICk7CiAgICAgcmV0dXJuIEdESV9GcmVlT2JqZWN0KCBocmduICk7CkBAIC0xOTcsNyArMTk3LDcgQEAKIAlpbnQgbmJveCA9IG9iai0+cmduLT5udW1SZWN0czsKIAlSRUNUMzIgKnBib3ggPSBvYmotPnJnbi0+cmVjdHM7CiAJCi0JZHByaW50Zl9pbmZvKHJlZ2lvbiwgIk9mZnNldFJnbjogJTA0eCAlZCwlZFxuIiwgaHJnbiwgeCwgeSApOworCVRSQUNFKHJlZ2lvbiwgIiAlMDR4ICVkLCVkXG4iLCBocmduLCB4LCB5ICk7CiAJaWYobmJveCAmJiAoeCB8fCB5KSkgewogCSAgICB3aGlsZShuYm94LS0pIHsKIAkgICAgICAgIHBib3gtPmxlZnQgKz0geDsKQEAgLTIzOSw3ICsyMzksNyBAQAogICAgIGlmIChvYmopCiAgICAgewogCUlOVDMyIHJldDsKLQlkcHJpbnRmX2luZm8ocmVnaW9uLCAiR2V0UmduQm94OiAlMDR4XG4iLCBocmduICk7CisJVFJBQ0UocmVnaW9uLCAiICUwNHhcbiIsIGhyZ24gKTsKIAlyZWN0LT5sZWZ0ID0gb2JqLT5yZ24tPmV4dGVudHMubGVmdDsKIAlyZWN0LT50b3AgPSBvYmotPnJnbi0+ZXh0ZW50cy50b3A7CiAJcmVjdC0+cmlnaHQgPSBvYmotPnJnbi0+ZXh0ZW50cy5yaWdodDsKQEAgLTI3MCw3ICsyNzAsNyBAQAogCiAgICAgaWYgKCEoaHJnbiA9IFJFR0lPTl9DcmVhdGVSZWdpb24oKSkpCiAJcmV0dXJuIDA7Ci0gICAgZHByaW50Zl9pbmZvKHJlZ2lvbiwgIkNyZWF0ZVJlY3RSZ246IFxuIik7CisgICAgVFJBQ0UocmVnaW9uLCAiIFxuIik7CiAgICAgU2V0UmVjdFJnbjMyKGhyZ24sIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CiAgICAgcmV0dXJuIGhyZ247CiB9CkBAIC0zMTEsNyArMzExLDcgQEAKIHsKICAgICBSR05PQkogKiBvYmo7CiAKLSAgICBkcHJpbnRmX2luZm8ocmVnaW9uLCAiU2V0UmVjdFJnbjogJTA0eCAlZCwlZC0lZCwlZFxuIiwgCisgICAgVFJBQ0UocmVnaW9uLCAiICUwNHggJWQsJWQtJWQsJWRcbiIsIAogCQkgICBocmduLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20gKTsKICAgICAKICAgICBpZiAoIShvYmogPSAoUkdOT0JKICopIEdESV9HZXRPYmpQdHIoIGhyZ24sIFJFR0lPTl9NQUdJQyApKSkgcmV0dXJuOwpAQCAtMzY0LDcgKzM2NCw3IEBACiAKICAgICBpZiAoIShocmduID0gUkVHSU9OX0NyZWF0ZVJlZ2lvbigpKSkgcmV0dXJuIDA7CiAgICAgb2JqID0gKFJHTk9CSiAqKSBHRElfSEVBUF9MT0NLKCBocmduICk7Ci0gICAgZHByaW50Zl9pbmZvKHJlZ2lvbiwiQ3JlYXRlUm91bmRSZWN0UmduKCVkLCVkLSVkLCVkICVkeCVkKTogcmV0PSUwNHhcbiIsCisgICAgVFJBQ0UocmVnaW9uLCIoJWQsJWQtJWQsJWQgJWR4JWQpOiByZXQ9JTA0eFxuIiwKIAkgICAgICAgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBlbGxpcHNlX3dpZHRoLCBlbGxpcHNlX2hlaWdodCwgaHJnbiApOwogCiAgICAgICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCkBAIC00OTUsNyArNDk1LDcgQEAKICAgICBEV09SRCBzaXplOwogICAgIFJHTk9CSiAqb2JqID0gKFJHTk9CSiAqKSBHRElfR2V0T2JqUHRyKCBocmduLCBSRUdJT05fTUFHSUMgKTsKICAgICAKLSAgICBkcHJpbnRmX2luZm8ocmVnaW9uLCAiR2V0UmVnaW9uRGF0YTogJTA0eCBjb3VudCA9ICVsZCwgcmduZGF0YSA9ICVwXG4iLAorICAgIFRSQUNFKHJlZ2lvbiwgIiAlMDR4IGNvdW50ID0gJWxkLCByZ25kYXRhID0gJXBcbiIsCiAJCSAgIGhyZ24sIGNvdW50LCByZ25kYXRhKTsKIAogICAgIGlmKCFvYmopIHJldHVybiAwOwpAQCAtNTMyLDcgKzUzMiw3IEBACiAgICAgUkdOT0JKICpvYmogPSAoUkdOT0JKICopIEdESV9HZXRPYmpQdHIoIGhyZ24sIFJFR0lPTl9NQUdJQyApOwogICAgIFJFQ1QzMiAqcEN1clJlY3QsICpwRW5kUmVjdDsKIAotICAgIGRwcmludGZfaW5mbyhyZWdpb24sICJFeHRDcmVhdGVSZWdpb246ICVwICVsZCAlcC4gUmV0dXJuaW5nICUwNHhcbiIsCisgICAgVFJBQ0UocmVnaW9uLCAiICVwICVsZCAlcC4gUmV0dXJuaW5nICUwNHhcbiIsCiAJCSAgIGxwWGZvcm0sIGR3Q291bnQsIHJnbmRhdGEsIGhyZ24pOwogICAgIGlmKCFocmduKQogICAgIHsKQEAgLTc3Myw3ICs3NzMsNyBAQAogICAgIERDICogZGMgPSBEQ19HZXREQ1B0ciggaGRjICk7CiAgICAgUkVDVDMyIHRtcFJlY3Q7CiAKLSAgICBkcHJpbnRmX2luZm8ocmVnaW9uLCAiUkVHSU9OX0xQVE9EUDogaGRjPSUwNHggZGVzdD0lMDR4IHNyYz0lMDR4XG4iLAorICAgIFRSQUNFKHJlZ2lvbiwgIiBoZGM9JTA0eCBkZXN0PSUwNHggc3JjPSUwNHhcbiIsCiAJCSAgICBoZGMsIGhEZXN0LCBoU3JjKSA7CiAgICAgCiAgICAgaWYgKGRjLT53Lk1hcE1vZGUgPT0gTU1fVEVYVCkgLyogUmVxdWlyZXMgb25seSBhIHRyYW5zbGF0aW9uICovCkBAIC04MjgsMTYgKzgyOCwxNiBAQAogICAgIFJHTk9CSiAqZGVzdE9iaiA9IChSR05PQkogKikgR0RJX0dldE9ialB0ciggaERlc3QsIFJFR0lPTl9NQUdJQyk7CiAgICAgSU5UMzIgcmVzdWx0ID0gRVJST1I7CiAKLSAgICBkcHJpbnRmX2luZm8ocmVnaW9uLCAiQ29tYmluZVJnbjogJTA0eCwlMDR4IC0+ICUwNHggbW9kZT0leFxuIiwgCi0JCSAgIGhTcmMxLCBoU3JjMiwgaERlc3QsIG1vZGUgKTsKKyAgICBUUkFDRShyZWdpb24sICIgJTA0eCwlMDR4IC0+ICUwNHggbW9kZT0leFxuIiwgCisJCSBoU3JjMSwgaFNyYzIsIGhEZXN0LCBtb2RlICk7CiAgICAgaWYgKGRlc3RPYmopCiAgICAgewogCVJHTk9CSiAqc3JjMU9iaiA9IChSR05PQkogKikgR0RJX0dldE9ialB0ciggaFNyYzEsIFJFR0lPTl9NQUdJQyk7CiAKIAlpZiAoc3JjMU9iaikKIAl7Ci0JICAgIGRwcmludGZfaW5mbyhyZWdpb24sICJzcmMxOlxuIik7Ci0JICAgIGlmKGRlYnVnZ2luZ19pbmZvKHJlZ2lvbikpIAorCSAgICBUUkFDRShyZWdpb24sICJkdW1wOlxuIik7CisJICAgIGlmKFRSQUNFX09OKHJlZ2lvbikpIAogCSAgICAgIFJFR0lPTl9EdW1wUmVnaW9uKHNyYzFPYmotPnJnbik7CiAJICAgIGlmIChtb2RlID09IFJHTl9DT1BZKQogCSAgICB7CkBAIC04NTAsOCArODUwLDggQEAKIAogCQlpZiAoc3JjMk9iaikKIAkJewotCQkgICAgZHByaW50Zl9pbmZvKHJlZ2lvbiwgInNyYzI6XG4iKTsKLQkJICAgIGlmKGRlYnVnZ2luZ19pbmZvKHJlZ2lvbikpIAorCQkgICAgVFJBQ0UocmVnaW9uLCAiZHVtcDpcbiIpOworCQkgICAgaWYoVFJBQ0VfT04ocmVnaW9uKSkgCiAJCSAgICAgIFJFR0lPTl9EdW1wUmVnaW9uKHNyYzJPYmotPnJnbik7CiAJCSAgICBzd2l0Y2ggKG1vZGUpCiAJCSAgICB7CkBAIC04NzQsOCArODc0LDggQEAKIAkgICAgfQogCSAgICBHRElfSEVBUF9VTkxPQ0soIGhTcmMxICk7CiAJfQotCWRwcmludGZfaW5mbyhyZWdpb24sICJkZXN0OlxuIik7Ci0JaWYoZGVidWdnaW5nX2luZm8ocmVnaW9uKSkgCisJVFJBQ0UocmVnaW9uLCAiZHVtcDpcbiIpOworCWlmKFRSQUNFX09OKHJlZ2lvbikpIAogCSAgUkVHSU9OX0R1bXBSZWdpb24oZGVzdE9iai0+cmduKTsKIAogCUdESV9IRUFQX1VOTE9DSyggaERlc3QgKTsKQEAgLTk2OSwxMiArOTY5LDExIEBACiAgKiAgICAgICAgICAtIHBSZWctPm51bVJlY3RzIHdpbGwgYmUgZGVjcmVhc2VkLgogICoKICAqLwotc3RhdGljIElOVDMyIFJFR0lPTl9Db2FsZXNjZSAoV0lORVJFR0lPTiAqcFJlZywgSU5UMzIgcHJldlN0YXJ0LAotCQkJICAgICAgSU5UMzIgY3VyU3RhcnQpCi0gICAvKiAgIHBSZWcgLSBSZWdpb24gdG8gY29hbGVzY2UgKi8KLSAgIC8qICAgcHJldlN0YXJ0IC0gSW5kZXggb2Ygc3RhcnQgb2YgcHJldmlvdXMgYmFuZCAqLwotICAgLyogICBjdXJTdGFydCAtIEluZGV4IG9mIHN0YXJ0IG9mIGN1cnJlbnQgYmFuZCAqLwoteworc3RhdGljIElOVDMyIFJFR0lPTl9Db2FsZXNjZSAoCisJICAgICBXSU5FUkVHSU9OICpwUmVnLCAvKiBSZWdpb24gdG8gY29hbGVzY2UgKi8KKwkgICAgIElOVDMyIHByZXZTdGFydCwgIC8qIEluZGV4IG9mIHN0YXJ0IG9mIHByZXZpb3VzIGJhbmQgKi8KKwkgICAgIElOVDMyIGN1clN0YXJ0ICAgIC8qIEluZGV4IG9mIHN0YXJ0IG9mIGN1cnJlbnQgYmFuZCAqLworKSB7CiAgICAgUkVDVDMyICpwUHJldlJlY3Q7ICAgICAgICAgIC8qIEN1cnJlbnQgcmVjdCBpbiBwcmV2aW91cyBiYW5kICovCiAgICAgUkVDVDMyICpwQ3VyUmVjdDsgICAgICAgICAgIC8qIEN1cnJlbnQgcmVjdCBpbiBjdXJyZW50IGJhbmQgKi8KICAgICBSRUNUMzIgKnBSZWdFbmQ7ICAgICAgICAgICAgLyogRW5kIG9mIHJlZ2lvbiAqLwpAQCAtMTExNiwxOSArMTExNSwxNCBAQAogICogICAgICB0byByZWR1Y2UgdGhlIG51bWJlciBvZiByZWN0YW5nbGVzIGluIHRoZSByZWdpb24uCiAgKgogICovCi1zdGF0aWMgdm9pZCBSRUdJT05fUmVnaW9uT3AoV0lORVJFR0lPTiAqbmV3UmVnLCBXSU5FUkVHSU9OICpyZWcxLAotCVdJTkVSRUdJT04gKnJlZzIsIHZvaWQgKCpvdmVybGFwRnVuYykoKSwgdm9pZCAoKm5vbk92ZXJsYXAxRnVuYykoKSwKLQl2b2lkICgqbm9uT3ZlcmxhcDJGdW5jKSgpKQotCi0JLyogbmV3UmVnIC0gUGxhY2UgdG8gc3RvcmUgcmVzdWx0ICovCi0JLyogcmVnMSAtICAgRmlyc3QgcmVnaW9uIGluIG9wZXJhdGlvbiAqLwotCS8qIHJlZzIgLSAgIDJuZCByZWdpb24gaW4gb3BlcmF0aW9uICovCi0JLyogb3ZlcmxhcEZ1bmMgLSAgRnVuY3Rpb24gdG8gY2FsbCBmb3Igb3Zlci1sYXBwaW5nIGJhbmRzICovCi0JLyogbm9uT3ZlcmxhcDFGdW5jIC0gRnVuY3Rpb24gdG8gY2FsbCBmb3Igbm9uLW92ZXJsYXBwaW5nIGJhbmRzIGluCi0JCQkJCXJlZ2lvbiAxICovCi0JLyogbm9uT3ZlcmxhcDJGdW5jIC0gRnVuY3Rpb24gdG8gY2FsbCBmb3Igbm9uLW92ZXJsYXBwaW5nIGJhbmRzIGluCi0JCQkJCXJlZ2lvbiAyICovCi17CitzdGF0aWMgdm9pZCBSRUdJT05fUmVnaW9uT3AoCisJICAgIFdJTkVSRUdJT04gKm5ld1JlZywgLyogUGxhY2UgdG8gc3RvcmUgcmVzdWx0ICovCisJICAgIFdJTkVSRUdJT04gKnJlZzEsICAgLyogRmlyc3QgcmVnaW9uIGluIG9wZXJhdGlvbiAqLworICAgICAgICAgICAgV0lORVJFR0lPTiAqcmVnMiwgICAvKiAybmQgcmVnaW9uIGluIG9wZXJhdGlvbiAqLworCSAgICB2b2lkICgqb3ZlcmxhcEZ1bmMpKCksICAgICAvKiBGdW5jdGlvbiB0byBjYWxsIGZvciBvdmVyLWxhcHBpbmcgYmFuZHMgKi8KKwkgICAgdm9pZCAoKm5vbk92ZXJsYXAxRnVuYykoKSwgLyogRnVuY3Rpb24gdG8gY2FsbCBmb3Igbm9uLW92ZXJsYXBwaW5nIGJhbmRzIGluIHJlZ2lvbiAxICovCisJICAgIHZvaWQgKCpub25PdmVybGFwMkZ1bmMpKCkgIC8qIEZ1bmN0aW9uIHRvIGNhbGwgZm9yIG5vbi1vdmVybGFwcGluZyBiYW5kcyBpbiByZWdpb24gMiAqLworKSB7CiAgICAgUkVDVDMyICpyMTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciBpbnRvIGZpcnN0IHJlZ2lvbiAqLwogICAgIFJFQ1QzMiAqcjI7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgaW50byAyZCByZWdpb24gKi8KICAgICBSRUNUMzIgKnIxRW5kOyAgICAgICAgICAgICAgICAgICAgICAvKiBFbmQgb2YgMXN0IHJlZ2lvbiAqLwpkaWZmIC0tZ2l0IGEvb2JqZWN0cy90ZXh0LmMgYi9vYmplY3RzL3RleHQuYwppbmRleCA4N2NhYjZkLi40ZjgzMjA5IDEwMDY0NAotLS0gYS9vYmplY3RzL3RleHQuYworKysgYi9vYmplY3RzL3RleHQuYwpAQCAtMTk4LDcgKzE5OCw3IEBACiAgICAgaW50IHdpZHRoID0gcmVjdC0+cmlnaHQgLSByZWN0LT5sZWZ0OwogICAgIGludCBtYXhfd2lkdGggPSAwOwogCi0gICAgZHByaW50Zl9pbmZvKHRleHQsIkRyYXdUZXh0OiAnJXMnLCAlZCAsIFsoJWQsJWQpLCglZCwlZCldXG4iLCBzdHIsCisgICAgVFJBQ0UodGV4dCwiJyVzJywgJWQgLCBbKCVkLCVkKSwoJWQsJWQpXVxuIiwgc3RyLAogCQkgY291bnQsIHJlY3QtPmxlZnQsIHJlY3QtPnRvcCwgcmVjdC0+cmlnaHQsIHJlY3QtPmJvdHRvbSk7CiAgICAgCiAgICAgaWYgKGNvdW50ID09IC0xKSBjb3VudCA9IHN0cmxlbihzdHIpOwpAQCAtNjM2LDcgKzYzNiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDE2IGNvdW50LCBJTlQxNiBjVGFiU3RvcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVDE2ICpscFRhYlBvcywgSU5UMTYgblRhYk9yZyApCiB7Ci0gICAgZHByaW50Zl9pbmZvKHRleHQsICJUYWJiZWRUZXh0T3V0MTY6ICUwNHggJWQsJWQgJyUuKnMnICVkXG4iLAorICAgIFRSQUNFKHRleHQsICIlMDR4ICVkLCVkICclLipzJyAlZFxuIiwKICAgICAgICAgICAgICAgICAgIGhkYywgeCwgeSwgY291bnQsIGxwc3RyLCBjb3VudCApOwogICAgIHJldHVybiBURVhUX1RhYmJlZFRleHRPdXQoIGhkYywgeCwgeSwgbHBzdHIsIGNvdW50LCBjVGFiU3RvcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBUYWJQb3MsIE5VTEwsIG5UYWJPcmcsIFRSVUUgKTsKQEAgLTY1MCw3ICs2NTAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIgY291bnQsIElOVDMyIGNUYWJTdG9wcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVDMyICpscFRhYlBvcywgSU5UMzIgblRhYk9yZyApCiB7Ci0gICAgZHByaW50Zl9pbmZvKHRleHQsICJUYWJiZWRUZXh0T3V0MzJBOiAlMDR4ICVkLCVkICclLipzJyAlZFxuIiwKKyAgICBUUkFDRSh0ZXh0LCAiJTA0eCAlZCwlZCAnJS4qcycgJWRcbiIsCiAgICAgICAgICAgICAgICAgICBoZGMsIHgsIHksIGNvdW50LCBscHN0ciwgY291bnQgKTsKICAgICByZXR1cm4gVEVYVF9UYWJiZWRUZXh0T3V0KCBoZGMsIHgsIHksIGxwc3RyLCBjb3VudCwgY1RhYlN0b3BzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIGxwVGFiUG9zLCBuVGFiT3JnLCBUUlVFICk7CkBAIC02ODAsNyArNjgwLDcgQEAKIERXT1JEIFdJTkFQSSBHZXRUYWJiZWRUZXh0RXh0ZW50MTYoIEhEQzE2IGhkYywgTFBDU1RSIGxwc3RyLCBJTlQxNiBjb3VudCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQxNiBjVGFiU3RvcHMsIGNvbnN0IElOVDE2ICpscFRhYlBvcyApCiB7Ci0gICAgZHByaW50Zl9pbmZvKHRleHQsICJHZXRUYWJiZWRUZXh0RXh0ZW50OiAlMDR4ICclLipzJyAlZFxuIiwKKyAgICBUUkFDRSh0ZXh0LCAiJTA0eCAnJS4qcycgJWRcbiIsCiAgICAgICAgICAgICAgICAgICBoZGMsIGNvdW50LCBscHN0ciwgY291bnQgKTsKICAgICByZXR1cm4gVEVYVF9UYWJiZWRUZXh0T3V0KCBoZGMsIDAsIDAsIGxwc3RyLCBjb3VudCwgY1RhYlN0b3BzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwVGFiUG9zLCBOVUxMLCAwLCBGQUxTRSApOwpAQCAtNjkzLDcgKzY5Myw3IEBACiBEV09SRCBXSU5BUEkgR2V0VGFiYmVkVGV4dEV4dGVudDMyQSggSERDMzIgaGRjLCBMUENTVFIgbHBzdHIsIElOVDMyIGNvdW50LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMiBjVGFiU3RvcHMsIGNvbnN0IElOVDMyICpscFRhYlBvcyApCiB7Ci0gICAgZHByaW50Zl9pbmZvKHRleHQsICJHZXRUYWJiZWRUZXh0RXh0ZW50OiAlMDR4ICclLipzJyAlZFxuIiwKKyAgICBUUkFDRSh0ZXh0LCAiJTA0eCAnJS4qcycgJWRcbiIsCiAgICAgICAgICAgICAgICAgICBoZGMsIGNvdW50LCBscHN0ciwgY291bnQgKTsKICAgICByZXR1cm4gVEVYVF9UYWJiZWRUZXh0T3V0KCBoZGMsIDAsIDAsIGxwc3RyLCBjb3VudCwgY1RhYlN0b3BzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIGxwVGFiUG9zLCAwLCBGQUxTRSApOwpkaWZmIC0tZ2l0IGEvb2xlL01ha2VmaWxlLmluIGIvb2xlL01ha2VmaWxlLmluCmluZGV4IDg1ZTk4MWEuLmJiZTcxOTggMTAwNjQ0Ci0tLSBhL29sZS9NYWtlZmlsZS5pbgorKysgYi9vbGUvTWFrZWZpbGUuaW4KQEAgLTksMTIgKzksMTQgQEAKIAljb21wb2JqLmMgXAogCWlmcy5jIFwKIAlmb2xkZXJzLmMgXAorCW1vbmlrZXIuYyBcCiAJb2xlMi5jIFwKIAlvbGUyZGlzcC5jIFwKIAlvbGUybmxzLmMgXAogCW9sZWNsaS5jIFwKIAlvbGVzdnIuYyBcCi0Jc3RvcmFnZS5jCisJc3RvcmFnZS5jIFwKKwl0eXBlbGliLmMKIAogYWxsOiAkKE1PRFVMRSkubwogCmRpZmYgLS1naXQgYS9vbGUvY29tcG9iai5jIGIvb2xlL2NvbXBvYmouYwppbmRleCAwNDg0Zjc4Li4xOTA0N2ZhIDEwMDY0NAotLS0gYS9vbGUvY29tcG9iai5jCisrKyBiL29sZS9jb21wb2JqLmMKQEAgLTMzLDcgKzMzLDcgQEAKICAqLwogRFdPUkQgV0lOQVBJIENvQnVpbGRWZXJzaW9uKCkKIHsKLSAgICBkcHJpbnRmX2luZm8ob2xlLCJDb0J1aWxkVmVyc2lvbigpXG4iKTsKKyAgICBUUkFDRShvbGUsIih2b2lkKVxuIik7CiAgICAgcmV0dXJuIChybW08PDE2KStydXA7CiB9CiAKQEAgLTQxLDggKzQxLDkgQEAKICAqICAgICAgICAgICBDb0luaXRpYWxpemUJW0NPTVBPQkouMl0KICAqIGxwUmVzZXJ2ZWQgaXMgYW4gSU1hbGxvYyBwb2ludGVyIGluIDE2Yml0IE9MRS4KICAqLwotSFJFU1VMVCBXSU5BUEkgQ29Jbml0aWFsaXplMTYoTFBNQUxMT0MxNiBscFJlc2VydmVkKQoteworSFJFU1VMVCBXSU5BUEkgQ29Jbml0aWFsaXplMTYoCisJTFBNQUxMT0MxNiBscFJlc2VydmVkCS8qIFtpbl0gcG9pbnRlciB0byB3aW4xNiBtYWxsb2MgaW50ZXJmYWNlICovCispIHsKICAgICBjdXJyZW50TWFsbG9jMTYgPSBscFJlc2VydmVkOwogICAgIHJldHVybiBTX09LOwogfQpAQCAtNTEsOCArNTIsOSBAQAogICogICAgICAgICAgIENvSW5pdGlhbGl6ZQkoT0xFMzIuMjYpCiAgKiBscFJlc2VydmVkIGlzIGFuIElNYWxsb2MgcG9pbnRlciBpbiAzMmJpdCBPTEUuCiAgKi8KLUhSRVNVTFQgV0lOQVBJIENvSW5pdGlhbGl6ZTMyKExQTUFMTE9DMzIgbHBSZXNlcnZlZCkKLXsKK0hSRVNVTFQgV0lOQVBJIENvSW5pdGlhbGl6ZTMyKAorCUxQTUFMTE9DMzIgbHBSZXNlcnZlZAkvKiBbaW5dIHBvaW50ZXIgdG8gd2luMzIgbWFsbG9jIGludGVyZmFjZSAqLworKSB7CiAgICAgY3VycmVudE1hbGxvYzMyID0gbHBSZXNlcnZlZDsKICAgICByZXR1cm4gU19PSzsKIH0KQEAgLTYyLDE0ICs2NCwxNiBAQAogICovCiB2b2lkIFdJTkFQSSBDb1VuaXRpYWxpemUoKQogewotICAgIGRwcmludGZfaW5mbyhvbGUsIkNvVW5pdGlhbGl6ZSgpXG4iKTsKKyAgICBUUkFDRShvbGUsIih2b2lkKVxuIik7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIENvR2V0TWFsbG9jICAgIFtDT01QT0JKLjRdCiAgKi8KLUhSRVNVTFQgV0lOQVBJIENvR2V0TWFsbG9jMTYoRFdPUkQgZHdNZW1Db250ZXh0LCBMUE1BTExPQzE2ICogbHBNYWxsb2MpCi17CitIUkVTVUxUIFdJTkFQSSBDb0dldE1hbGxvYzE2KAorCURXT1JEIGR3TWVtQ29udGV4dCwJLyogW2luXSB1bmtub3duICovCisJTFBNQUxMT0MxNiAqIGxwTWFsbG9jCS8qIFtvdXRdIGN1cnJlbnQgd2luMTYgbWFsbG9jIGludGVyZmFjZSAqLworKSB7CiAgICAgaWYoIWN1cnJlbnRNYWxsb2MxNikKIAljdXJyZW50TWFsbG9jMTYgPSBJTWFsbG9jMTZfQ29uc3RydWN0b3IoKTsKICAgICAqbHBNYWxsb2MgPSBjdXJyZW50TWFsbG9jMTY7CkBAIC03OSw4ICs4MywxMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQ29HZXRNYWxsb2MgICAgKE9MRTMyLjRdCiAgKi8KLUhSRVNVTFQgV0lOQVBJIENvR2V0TWFsbG9jMzIoRFdPUkQgZHdNZW1Db250ZXh0LCBMUE1BTExPQzMyICpscE1hbGxvYykKLXsKK0hSRVNVTFQgV0lOQVBJIENvR2V0TWFsbG9jMzIoCisJRFdPUkQgZHdNZW1Db250ZXh0LAkvKiBbaW5dIHVua25vd24gKi8KKwlMUE1BTExPQzMyICpscE1hbGxvYwkvKiBbb3V0XSBjdXJyZW50IHdpbjMyIG1hbGxvYyBpbnRlcmZhY2UgKi8KKykgewogICAgIGlmKCFjdXJyZW50TWFsbG9jMzIpCiAJY3VycmVudE1hbGxvYzMyID0gSU1hbGxvYzMyX0NvbnN0cnVjdG9yKCk7CiAgICAgKmxwTWFsbG9jID0gY3VycmVudE1hbGxvYzMyOwpAQCAtOTIsNyArOTgsNyBAQAogICovCiBPTEVTVEFUVVMgV0lOQVBJIENvRGlzY29ubmVjdE9iamVjdCggTFBVTktOT1dOIGxwVW5rLCBEV09SRCByZXNlcnZlZCApCiB7Ci0gICAgZHByaW50Zl9pbmZvKG9sZSwiQ29EaXNjb25uZWN0T2JqZWN0OiVwICVseFxuIixscFVuayxyZXNlcnZlZCk7CisgICAgVFJBQ0Uob2xlLCIlcCAlbHhcbiIsbHBVbmsscmVzZXJ2ZWQpOwogICAgIHJldHVybiBTX09LOwogfQogCkBAIC0xMTcsNyArMTIzLDcgQEAKICAgaW50CWk7CiAgIEJZVEUgdGFibGVbMjU2XTsKIAotICBkcHJpbnRmX2luZm8ob2xlLCJDbHNJREZyb21TdHJpbmcoKSAlcyAtPiAlcFxuIiwgaWRzdHIsIGlkKTsKKyAgVFJBQ0Uob2xlLCIlcyAtPiAlcFxuIiwgaWRzdHIsIGlkKTsKIAogICAvKiBxdWljayBsb29rdXAgdGFibGUgKi8KICAgbWVtc2V0KHRhYmxlLCAwLCAyNTYpOwpAQCAtMjEzLDcgKzIxOSw3IEBACiAgICAgaWRzdHJbaV0gPSB0b3VwcGVyKGlkc3RyW2ldKTsKICAgfQogCi0gIGRwcmludGZfaW5mbyhvbGUsIlN0cmluZ0Zyb21DbHNJRDogJXAtPiVzXG4iLCBpZCwgaWRzdHIpOworICBUUkFDRShvbGUsIiVwLT4lc1xuIiwgaWQsIGlkc3RyKTsKIAogICByZXR1cm4gT0xFX09LOwogfQpAQCAtMjY1LDYgKzI3MSwxNiBAQAogCXJldHVybiByZXQ7CiB9CiAKK09MRVNUQVRVUyBXSU5BUEkgU3RyaW5nRnJvbUdVSUQyKAorCWNvbnN0IENMU0lEICppZCwgTFBPTEVTVFIxNiBpZHN0ciwgSU5UMTYgbWF4CispIHsKKwljaGFyCQlidWZbODBdOworCU9MRVNUQVRVUwlyZXQgPSBXSU5FX1N0cmluZ0Zyb21DTFNJRChpZCxidWYpOworCisJaWYgKCFyZXQpCisJCWxzdHJjcHluMzJBKGlkc3RyLGJ1ZixtYXgpOworCXJldHVybiByZXQ7Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIENMU0lERnJvbVByb2dJRCBbQ09NUE9CSi42MV0KQEAgLTM5Myw4ICs0MDksMTIgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQ29UYXNrTWVtQWxsb2MgKE9MRTMyLjQzKQorICogUkVUVVJOUworICogIHBvaW50ZXIgdG8gbmV3bHkgYWxsb2NhdGVkIGJsb2NrCiAgKi8KLUxQVk9JRCBXSU5BUEkgQ29UYXNrTWVtQWxsb2MoVUxPTkcgc2l6ZSkgeworTFBWT0lEIFdJTkFQSSBDb1Rhc2tNZW1BbGxvYygKKwlVTE9ORyBzaXplCS8qIFtpbl0gc2l6ZSBvZiBtZW1vcnlibG9jayB0byBiZSBhbGxvY2F0ZWQgKi8KKykgewogICAgIExQTUFMTE9DMzIJbHBtYWxsb2M7CiAgICAgSFJFU1VMVAlyZXQgPSBDb0dldE1hbGxvYzMyKDAsJmxwbWFsbG9jKTsKIApAQCAtNDA2LDcgKzQyNiw5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBDb1Rhc2tNZW1GcmVlIChPTEUzMi40NCkKICAqLwotVk9JRCBXSU5BUEkgQ29UYXNrTWVtRnJlZShMUFZPSUQgcHRyKSB7CitWT0lEIFdJTkFQSSBDb1Rhc2tNZW1GcmVlKAorCUxQVk9JRCBwdHIJLyogW2luXSBwb2ludGVyIHRvIGJlIGZyZWVkICovCispIHsKICAgICBMUE1BTExPQzMyCWxwbWFsbG9jOwogICAgIEhSRVNVTFQJcmV0ID0gQ29HZXRNYWxsb2MzMigwLCZscG1hbGxvYyk7CiAKQEAgLTQyMSwzICs0NDMsMTUgQEAKICAgICBmcHJpbnRmKHN0ZGVyciwiQ29Jbml0aWFsaXplV09XKDB4JTA4bHgsMHglMDhseCksc3R1YiFcbiIseCx5KTsKICAgICByZXR1cm4gMDsKIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ29Mb2NrT2JqZWN0RXh0ZXJuYWwgKENPTVBPQkouNjMpCisgKi8KK0hSRVNVTFQgV0lOQVBJIENvTG9ja09iamVjdEV4dGVybmFsMTYoCisgICAgTFBVTktOT1dOIHBVbmssCQkvKiBbaW5dIG9iamVjdCB0byBiZSBsb2NrZWQgKi8KKyAgICBCT09MMTYgZkxvY2ssCQkvKiBbaW5dIGRvIGxvY2sgKi8KKyAgICBCT09MMTYgZkxhc3RVbmxvY2tSZWxlYXNlcwkvKiBbaW5dID8gKi8KKykgeworICAgIGZwcmludGYoc3RkZXJyLCJDb0xvY2tPYmplY3RFeHRlcm5hbCglcCwlZCwlZCksc3R1YiFcbiIscFVuayxmTG9jayxmTGFzdFVubG9ja1JlbGVhc2VzKTsKKyAgICByZXR1cm4gU19PSzsKK30KZGlmZiAtLWdpdCBhL29sZS9pZnMuYyBiL29sZS9pZnMuYwppbmRleCA4ZTYxNDdiLi42ZjI0NTg0IDEwMDY0NAotLS0gYS9vbGUvaWZzLmMKKysrIGIvb2xlL2lmcy5jCkBAIC0yNCwxMSArMjQsMTEgQEAKICAqIElVbmtub3duCiAgKi8KIHN0YXRpYyBVTE9ORyBXSU5BUEkgSVVua25vd25fQWRkUmVmKExQVU5LTk9XTiB0aGlzKSB7IAotCWRwcmludGZfaW5mbyhyZWxheSwiSVVua25vd24oJXApLT5BZGRSZWYoKVxuIix0aGlzKTsKKwlUUkFDRShyZWxheSwiKCVwKS0+QWRkUmVmKClcbiIsdGhpcyk7CiAJcmV0dXJuICsrKHRoaXMtPnJlZik7CiB9CiBzdGF0aWMgVUxPTkcgV0lOQVBJIElVbmtub3duX1JlbGVhc2UoTFBVTktOT1dOIHRoaXMpIHsKLQlkcHJpbnRmX2luZm8ocmVsYXksIklVbmtub3duKCVwKS0+UmVsZWFzZSgpXG4iLHRoaXMpOworCVRSQUNFKHJlbGF5LCIoJXApLT5SZWxlYXNlKClcbiIsdGhpcyk7CiAJaWYgKCEtLSh0aGlzLT5yZWYpKSB7CiAJCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCx0aGlzKTsKIAkJcmV0dXJuIDA7CkBAIC00MCw3ICs0MCw3IEBACiAJY2hhcgl4cmVmaWlkWzUwXTsKIAogCVdJTkVfU3RyaW5nRnJvbUNMU0lEKChMUENMU0lEKXJlZmlpZCx4cmVmaWlkKTsKLQlkcHJpbnRmX2luZm8ocmVsYXksIklVbmtub3duKCVwKS0+UXVlcnlJbnRlcmZhY2UoJXMsJXApXG4iLHRoaXMseHJlZmlpZCxvYmopOworCVRSQUNFKHJlbGF5LCIoJXApLT5RdWVyeUludGVyZmFjZSglcywlcClcbiIsdGhpcyx4cmVmaWlkLG9iaik7CiAKIAlpZiAoIW1lbWNtcCgmSUlEX0lVbmtub3duLHJlZmlpZCxzaXplb2YoSUlEX0lVbmtub3duKSkpIHsKIAkJKm9iaiA9IHRoaXM7CkBAIC03MCwxMiArNzAsMTIgQEAKICAqIElNYWxsb2MxNgogICovCiBVTE9ORyBXSU5BUEkgSU1hbGxvYzE2X0FkZFJlZihMUE1BTExPQzE2IHRoaXMpIHsKLQlkcHJpbnRmX2luZm8ocmVsYXksIklNYWxsb2MxNiglcCktPkFkZFJlZigpXG4iLHRoaXMpOworCVRSQUNFKHJlbGF5LCIoJXApLT5BZGRSZWYoKVxuIix0aGlzKTsKIAlyZXR1cm4gMTsgLyogY2Fubm90IGJlIGZyZWVkICovCiB9CiAKIFVMT05HIFdJTkFQSSBJTWFsbG9jMTZfUmVsZWFzZShMUE1BTExPQzE2IHRoaXMpIHsKLQlkcHJpbnRmX2luZm8ocmVsYXksIklNYWxsb2MxNiglcCktPlJlbGVhc2UoKVxuIix0aGlzKTsKKwlUUkFDRShyZWxheSwiKCVwKS0+UmVsZWFzZSgpXG4iLHRoaXMpOwogCXJldHVybiAxOyAvKiBjYW5ub3QgYmUgZnJlZWQgKi8KIH0KIApAQCAtODMsNyArODMsNyBAQAogCWNoYXIJeHJlZmlpZFs1MF07CiAKIAlXSU5FX1N0cmluZ0Zyb21DTFNJRCgoTFBDTFNJRClyZWZpaWQseHJlZmlpZCk7Ci0JZHByaW50Zl9pbmZvKHJlbGF5LCJJTWFsbG9jMTYoJXApLT5RdWVyeUludGVyZmFjZSglcywlcClcbiIsdGhpcyx4cmVmaWlkLG9iaik7CisJVFJBQ0UocmVsYXksIiglcCktPlF1ZXJ5SW50ZXJmYWNlKCVzLCVwKVxuIix0aGlzLHhyZWZpaWQsb2JqKTsKIAlpZiAoCSFtZW1jbXAoJklJRF9JVW5rbm93bixyZWZpaWQsc2l6ZW9mKElJRF9JVW5rbm93bikpIHx8CiAJCSFtZW1jbXAoJklJRF9JTWFsbG9jLHJlZmlpZCxzaXplb2YoSUlEX0lNYWxsb2MpKQogCSkgewpAQCAtOTQsMzAgKzk0LDMwIEBACiB9CiAKIExQVk9JRCBXSU5BUEkgSU1hbGxvYzE2X0FsbG9jKExQTUFMTE9DMTYgdGhpcyxEV09SRCBjYikgewotCWRwcmludGZfaW5mbyhyZWxheSwiSU1hbGxvYzE2KCVwKS0+QWxsb2MoJWxkKVxuIix0aGlzLGNiKTsKKwlUUkFDRShyZWxheSwiKCVwKS0+QWxsb2MoJWxkKVxuIix0aGlzLGNiKTsKIAlyZXR1cm4gKExQVk9JRClQVFJfU0VHX09GRl9UT19TRUdQVFIodGhpcy0+aGVhcCxMT0NBTF9BbGxvYyh0aGlzLT5oZWFwLDAsY2IpKTsKIH0KIAogTFBWT0lEIFdJTkFQSSBJTWFsbG9jMTZfUmVhbGxvYyhMUE1BTExPQzE2IHRoaXMsTFBWT0lEIHB2LERXT1JEIGNiKSB7Ci0JZHByaW50Zl9pbmZvKHJlbGF5LCJJTWFsbG9jMTYoJXApLT5SZWFsbG9jKCVwLCVsZClcbiIsdGhpcyxwdixjYik7CisJVFJBQ0UocmVsYXksIiglcCktPlJlYWxsb2MoJXAsJWxkKVxuIix0aGlzLHB2LGNiKTsKIAlyZXR1cm4gKExQVk9JRClQVFJfU0VHX09GRl9UT19TRUdQVFIodGhpcy0+aGVhcCxMT0NBTF9SZUFsbG9jKHRoaXMtPmhlYXAsMCxMT1dPUkQocHYpLGNiKSk7CiB9CiBWT0lEIFdJTkFQSSBJTWFsbG9jMTZfRnJlZShMUE1BTExPQzE2IHRoaXMsTFBWT0lEIHB2KSB7Ci0JZHByaW50Zl9pbmZvKHJlbGF5LCJJTWFsbG9jMTYoJXApLT5GcmVlKCVwKVxuIix0aGlzLHB2KTsKKwlUUkFDRShyZWxheSwiKCVwKS0+RnJlZSglcClcbiIsdGhpcyxwdik7CiAJTE9DQUxfRnJlZSh0aGlzLT5oZWFwLExPV09SRChwdikpOwogfQogCiBEV09SRCBXSU5BUEkgSU1hbGxvYzE2X0dldFNpemUoTFBNQUxMT0MxNiB0aGlzLExQVk9JRCBwdikgewotCWRwcmludGZfaW5mbyhyZWxheSwiSU1hbGxvYzE2KCVwKS0+R2V0U2l6ZSglcClcbiIsdGhpcyxwdik7CisJVFJBQ0UocmVsYXksIiglcCktPkdldFNpemUoJXApXG4iLHRoaXMscHYpOwogCXJldHVybiBMT0NBTF9TaXplKHRoaXMtPmhlYXAsTE9XT1JEKHB2KSk7CiB9CiAKIElOVDE2IFdJTkFQSSBJTWFsbG9jMTZfRGlkQWxsb2MoTFBNQUxMT0MxNiB0aGlzLExQVk9JRCBwdikgewotCWRwcmludGZfaW5mbyhyZWxheSwiSU1hbGxvYzE2KCVwKS0+RGlkQWxsb2MoJXApXG4iLHRoaXMscHYpOworCVRSQUNFKHJlbGF5LCIoJXApLT5EaWRBbGxvYyglcClcbiIsdGhpcyxwdik7CiAJcmV0dXJuIChJTlQxNiktMTsKIH0KIExQVk9JRCBXSU5BUEkgSU1hbGxvYzE2X0hlYXBNaW5pbWl6ZShMUE1BTExPQzE2IHRoaXMpIHsKLQlkcHJpbnRmX2luZm8ocmVsYXksIklNYWxsb2MxNiglcCktPkhlYXBNaW5pbWl6ZSgpXG4iLHRoaXMpOworCVRSQUNFKHJlbGF5LCIoJXApLT5IZWFwTWluaW1pemUoKVxuIix0aGlzKTsKIAlyZXR1cm4gTlVMTDsKIH0KIApAQCAtMTQ0LDcgKzE0NCw4IEBACiAJfSBlbHNlIHsKIAkJSE1PRFVMRTE2CWhjb21wID0gR2V0TW9kdWxlSGFuZGxlMTYoIkNPTVBPQkoiKTsKIAkJaWYgKCFtc2VndnQxNikgewotCQkJbXNlZ3Z0MTYgPSBTRUdQVFJfTkVXKElNYWxsb2MxNl9WVGFibGUpOworCQkJdGhpcy0+bHB2dGJsID0gbXNlZ3Z0MTYgPSBTRUdQVFJfTkVXKElNYWxsb2MxNl9WVGFibGUpOworCiAjZGVmaW5lIEZOKHgpIHRoaXMtPmxwdnRibC0+Zm4jI3ggPSAodm9pZCopV0lOMzJfR2V0UHJvY0FkZHJlc3MxNihoY29tcCwiSU1hbGxvYzE2XyIjeCk7YXNzZXJ0KHRoaXMtPmxwdnRibC0+Zm4jI3gpOwogCQkJRk4oUXVlcnlJbnRlcmZhY2UpCiAJCQlGTihBZGRSZWYpCkBAIC0xNzEsMTIgKzE3MiwxMiBAQAogICogSU1hbGxvYzMyCiAgKi8KIHN0YXRpYyBVTE9ORyBXSU5BUEkgSU1hbGxvYzMyX0FkZFJlZihMUE1BTExPQzMyIHRoaXMpIHsKLQlkcHJpbnRmX2luZm8ocmVsYXksIklNYWxsb2MzMiglcCktPkFkZFJlZigpXG4iLHRoaXMpOworCVRSQUNFKHJlbGF5LCIoJXApLT5BZGRSZWYoKVxuIix0aGlzKTsKIAlyZXR1cm4gMTsgLyogY2Fubm90IGJlIGZyZWVkICovCiB9CiAKIHN0YXRpYyBVTE9ORyBXSU5BUEkgSU1hbGxvYzMyX1JlbGVhc2UoTFBNQUxMT0MzMiB0aGlzKSB7Ci0JZHByaW50Zl9pbmZvKHJlbGF5LCJJTWFsbG9jMzIoJXApLT5SZWxlYXNlKClcbiIsdGhpcyk7CisJVFJBQ0UocmVsYXksIiglcCktPlJlbGVhc2UoKVxuIix0aGlzKTsKIAlyZXR1cm4gMTsgLyogY2Fubm90IGJlIGZyZWVkICovCiB9CiAKQEAgLTE4NCw3ICsxODUsNyBAQAogCWNoYXIJeHJlZmlpZFs1MF07CiAKIAlXSU5FX1N0cmluZ0Zyb21DTFNJRCgoTFBDTFNJRClyZWZpaWQseHJlZmlpZCk7Ci0JZHByaW50Zl9pbmZvKHJlbGF5LCJJTWFsbG9jMzIoJXApLT5RdWVyeUludGVyZmFjZSglcywlcClcbiIsdGhpcyx4cmVmaWlkLG9iaik7CisJVFJBQ0UocmVsYXksIiglcCktPlF1ZXJ5SW50ZXJmYWNlKCVzLCVwKVxuIix0aGlzLHhyZWZpaWQsb2JqKTsKIAlpZiAoCSFtZW1jbXAoJklJRF9JVW5rbm93bixyZWZpaWQsc2l6ZW9mKElJRF9JVW5rbm93bikpIHx8CiAJCSFtZW1jbXAoJklJRF9JTWFsbG9jLHJlZmlpZCxzaXplb2YoSUlEX0lNYWxsb2MpKQogCSkgewpAQCAtMTk1LDMwICsxOTYsMzAgQEAKIH0KIAogc3RhdGljIExQVk9JRCBXSU5BUEkgSU1hbGxvYzMyX0FsbG9jKExQTUFMTE9DMzIgdGhpcyxEV09SRCBjYikgewotCWRwcmludGZfaW5mbyhyZWxheSwiSU1hbGxvYzMyKCVwKS0+QWxsb2MoJWxkKVxuIix0aGlzLGNiKTsKKwlUUkFDRShyZWxheSwiKCVwKS0+QWxsb2MoJWxkKVxuIix0aGlzLGNiKTsKIAlyZXR1cm4gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxjYik7CiB9CiAKIHN0YXRpYyBMUFZPSUQgV0lOQVBJIElNYWxsb2MzMl9SZWFsbG9jKExQTUFMTE9DMzIgdGhpcyxMUFZPSUQgcHYsRFdPUkQgY2IpIHsKLQlkcHJpbnRmX2luZm8ocmVsYXksIklNYWxsb2MzMiglcCktPlJlYWxsb2MoJXAsJWxkKVxuIix0aGlzLHB2LGNiKTsKKwlUUkFDRShyZWxheSwiKCVwKS0+UmVhbGxvYyglcCwlbGQpXG4iLHRoaXMscHYsY2IpOwogCXJldHVybiBIZWFwUmVBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAscHYsY2IpOwogfQogc3RhdGljIFZPSUQgV0lOQVBJIElNYWxsb2MzMl9GcmVlKExQTUFMTE9DMzIgdGhpcyxMUFZPSUQgcHYpIHsKLQlkcHJpbnRmX2luZm8ocmVsYXksIklNYWxsb2MzMiglcCktPkZyZWUoJXApXG4iLHRoaXMscHYpOworCVRSQUNFKHJlbGF5LCIoJXApLT5GcmVlKCVwKVxuIix0aGlzLHB2KTsKIAlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAscHYpOwogfQogCiBzdGF0aWMgRFdPUkQgV0lOQVBJIElNYWxsb2MzMl9HZXRTaXplKExQTUFMTE9DMzIgdGhpcyxMUFZPSUQgcHYpIHsKLQlkcHJpbnRmX2luZm8ocmVsYXksIklNYWxsb2MzMiglcCktPkdldFNpemUoJXApXG4iLHRoaXMscHYpOworCVRSQUNFKHJlbGF5LCIoJXApLT5HZXRTaXplKCVwKVxuIix0aGlzLHB2KTsKIAlyZXR1cm4gSGVhcFNpemUoR2V0UHJvY2Vzc0hlYXAoKSwwLHB2KTsKIH0KIAogc3RhdGljIElOVDMyIFdJTkFQSSBJTWFsbG9jMzJfRGlkQWxsb2MoTFBNQUxMT0MzMiB0aGlzLExQVk9JRCBwdikgewotCWRwcmludGZfaW5mbyhyZWxheSwiSU1hbGxvYzMyKCVwKS0+RGlkQWxsb2MoJXApXG4iLHRoaXMscHYpOworCVRSQUNFKHJlbGF5LCIoJXApLT5EaWRBbGxvYyglcClcbiIsdGhpcyxwdik7CiAJcmV0dXJuIC0xOwogfQogc3RhdGljIExQVk9JRCBXSU5BUEkgSU1hbGxvYzMyX0hlYXBNaW5pbWl6ZShMUE1BTExPQzMyIHRoaXMpIHsKLQlkcHJpbnRmX2luZm8ocmVsYXksIklNYWxsb2MzMiglcCktPkhlYXBNaW5pbWl6ZSgpXG4iLHRoaXMpOworCVRSQUNFKHJlbGF5LCIoJXApLT5IZWFwTWluaW1pemUoKVxuIix0aGlzKTsKIAlyZXR1cm4gTlVMTDsKIH0KIApAQCAtMjQ2LDcgKzI0NywxNCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEFQSSBGdW5jdGlvbnMKICAqLwotQk9PTDMyIFdJTkFQSSBJc1ZhbGlkSW50ZXJmYWNlMzIoTFBVTktOT1dOIHB1bmspIHsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAJCUlzVmFsaWRJbnRlcmZhY2UJCShPTEUzMi43OCkKKyAqIFJFVFVSTlMKKyAqICBUcnVlLCBpZiB0aGUgcGFzc2VkIHBvaW50ZXIgaXMgYSB2YWxpZCBpbnRlcmZhY2UKKyAqLworQk9PTDMyIFdJTkFQSSBJc1ZhbGlkSW50ZXJmYWNlMzIoCisJTFBVTktOT1dOIHB1bmsJLyogW2luXSBpbnRlcmZhY2UgdG8gYmUgdGVzdGVkICovCispIHsKIAlyZXR1cm4gISgKIAkJSXNCYWRSZWFkUHRyMzIocHVuayw0KQkJCQkJfHwKIAkJSXNCYWRSZWFkUHRyMzIocHVuay0+bHB2dGJsLDQpCQkJCXx8CmRpZmYgLS1naXQgYS9vbGUvbW9uaWtlci5jIGIvb2xlL21vbmlrZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzM2NWNkCi0tLSAvZGV2L251bGwKKysrIGIvb2xlL21vbmlrZXIuYwpAQCAtMCwwICsxLDMzIEBACisvKgorICoJTW9uaWtlcnMKKyAqCisgKglDb3B5cmlnaHQgMTk5OAlNYXJjdXMgTWVpc3NuZXIKKyAqLworCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlICJ3aW5lcnJvci5oIgorI2luY2x1ZGUgIm9sZS5oIgorI2luY2x1ZGUgIm9sZTIuaCIKKyNpbmNsdWRlICJsZHQuaCIKKyNpbmNsdWRlICJoZWFwLmgiCisjaW5jbHVkZSAiY29tcG9iai5oIgorI2luY2x1ZGUgImludGVyZmFjZXMuaCIKKyNpbmNsdWRlICJzaGxvYmouaCIKKyNpbmNsdWRlICJsb2NhbC5oIgorI2luY2x1ZGUgIm1vZHVsZS5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJQ3JlYXRlRmlsZU1vbmlrZXIJKE9MRTIuMjgpCisgKi8KK0hSRVNVTFQgV0lOQVBJCitDcmVhdGVGaWxlTW9uaWtlcjE2KAorCUxQQ09MRVNUUjE2IGxwc3pQYXRoTmFtZSwJLyogW2luXSBwYXRobmFtZSAqLworCUxQTU9OSUtFUiAqIHBwbWsJCS8qIFtvdXRdIG5ldyBtb25pa2VyIG9iamVjdCAqLworKSB7CisJZnByaW50ZihzdGRlcnIsIkNyZWF0ZUZpbGVNb25pa2VyKCVzLCVwKSxzdHViIVxuIixscHN6UGF0aE5hbWUscHBtayk7CisJcmV0dXJuIEVfRkFJTDsKK30KZGlmZiAtLWdpdCBhL29sZS9vbGUyLmMgYi9vbGUvb2xlMi5jCmluZGV4IDgxNzFhYzQuLmQ2ZTQyMzIgMTAwNjQ0Ci0tLSBhL29sZS9vbGUyLmMKKysrIGIvb2xlL29sZTIuYwpAQCAtNCwxMCArNCw4IEBACiAgKglDb3B5cmlnaHQgMTk5NQlNYXJ0aW4gdm9uIExvZXdpcwogICovCiAKLS8qCUF0IHRoZSBtb21lbnQsIHRoZXNlIGFyZSBvbmx5IGVtcHR5IHN0dWJzLgotICovCi0KICNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAid2luZXJyb3IuaCIKICNpbmNsdWRlICJvbGUyLmgiCiAjaW5jbHVkZSAicHJvY2Vzcy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCkBAIC0xNyw3ICsxNSw3IEBACiAgKi8KIERXT1JEIFdJTkFQSSBPbGVCdWlsZFZlcnNpb24oKQogewotICAgIGRwcmludGZfaW5mbyhvbGUsIk9sZUJ1aWxkVmVyc2lvbigpXG4iKTsKKyAgICBUUkFDRShvbGUsIih2b2lkKVxuIik7CiAgICAgcmV0dXJuIChybW08PDE2KStydXA7CiB9CiAKQEAgLTI2LDcgKzI0LDcgQEAKICAqLwogSFJFU1VMVCBXSU5BUEkgT2xlSW5pdGlhbGl6ZShMUFZPSUQgcmVzZXJ2ZWQpCiB7Ci0gICAgZHByaW50Zl9maXhtZShvbGUsIk9sZUluaXRpYWxpemUgLSBzdHViXG4iKTsKKyAgICBGSVhNRShvbGUsIk9sZUluaXRpYWxpemUgLSBzdHViXG4iKTsKICAgICByZXR1cm4gU19PSzsKIH0KIApAQCAtMzksNyArMzcsNyBAQAogICovCiB2b2lkIFdJTkFQSSBPbGVVbmluaXRpYWxpemUodm9pZCkKIHsKLSAgICBkcHJpbnRmX2ZpeG1lKG9sZSwiT2xlVW5pbml0aWFsaXplKCkgLSBzdHViXG4iKTsKKyAgICBGSVhNRShvbGUsInN0dWJcbiIpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTU3LDcgKzU1LDcgQEAKICAgICBMUE1FU1NBR0VGSUxURVIgbHBNZXNzYWdlRmlsdGVyLAkvKiBQb2ludGVyIHRvIGludGVyZmFjZSAqLwogICAgIExQTUVTU0FHRUZJTFRFUiAqbHBscE1lc3NhZ2VGaWx0ZXIJLyogSW5kaXJlY3QgcG9pbnRlciB0byBwcmlvciBpbnN0YW5jZSBpZiBub24tTlVMTCAqLwogKSB7Ci0gICAgZHByaW50Zl9maXhtZShvbGUsIkNvUmVnaXN0ZXJNZXNzYWdlRmlsdGVyKCkgLSBzdHViXG4iKTsKKyAgICBGSVhNRShvbGUsInN0dWJcbiIpOwogICAgIGlmIChscGxwTWVzc2FnZUZpbHRlcikgewogCSpscGxwTWVzc2FnZUZpbHRlciA9IE5VTEw7CiAgICAgfQpAQCAtNzEsMyArNjksMjMgQEAKICAgICAgICAgZnByaW50ZihzdGRlcnIsIk9sZUluaXRpYWxpemVXT1coMHglMDhseCksc3R1YiFcbiIseCk7CiAgICAgICAgIHJldHVybiAwOwogfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHZXRSdW5uaW5nT2JqZWN0VGFibGUgKE9MRTIuMzApCisgKi8KK0hSRVNVTFQgV0lOQVBJIEdldFJ1bm5pbmdPYmplY3RUYWJsZTE2KERXT1JEIHJlc2VydmVkLCBMUFZPSUQgKnBwcm90KSB7CisJZnByaW50ZihzdGRlcnIsIkdldFJ1bm5pbmdPYmplY3RUYWJsZSglbGQsJXApLHN0dWIhXG4iLHJlc2VydmVkLHBwcm90KTsKKwlyZXR1cm4gRV9GQUlMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBSZWdpc3RlckRyYWdEcm9wIChPTEUyLjM1KQorICovCitIUkVTVUxUIFdJTkFQSSBSZWdpc3RlckRyYWdEcm9wMTYoCisJSFdORDE2IGh3bmQsCisJTFBEUk9QVEFSR0VUIHBEcm9wVGFyZ2V0CispIHsKKwlmcHJpbnRmKHN0ZGVyciwiUmVnaXN0ZXJEcmFnRHJvcCgweCUwNHgsJXApLHN0dWIhXG4iLGh3bmQscERyb3BUYXJnZXQpOworCXJldHVybiBTX09LOworfQorCmRpZmYgLS1naXQgYS9vbGUvb2xlMm5scy5jIGIvb2xlL29sZTJubHMuYwppbmRleCBiNjFjNzhkLi4xOWQ3YTZhIDEwMDY0NAotLS0gYS9vbGUvb2xlMm5scy5jCisrKyBiL29sZS9vbGUybmxzLmMKQEAgLTI2Miw3ICsyNjIsNyBAQAogCWNoYXIJKnJldFN0cmluZzsKIAlpbnQJZm91bmQsaTsKIAotCWRwcmludGZfaW5mbyhvbGUsIkdldExvY2FsZUluZm8zMkEoJThsWCwlOGxYLCVwLCU0WClcbiIsCisJVFJBQ0Uob2xlLCIoJThsWCwlOGxYLCVwLCU0WClcbiIsCiAJCQlsY2lkLExDVHlwZSxidWYsbGVuKTsKIAogCUxDVHlwZSAmPSB+KExPQ0FMRV9OT1VTRVJPVkVSUklERXxMT0NBTEVfVVNFX0NQX0FDUCk7CkBAIC01NjgsNyArNTY4LDcgQEAKIExPQ1ZBTChMT0NBTEVfU0RBVEUsIi4iKQogTE9DVkFMKExPQ0FMRV9TVElNRSwiOiIpCiBMT0NWQUwoTE9DQUxFX1NTSE9SVERBVEUsIk1NL2RkL3l5IikKLUxPQ1ZBTChMT0NBTEVfU0xPTkdEQVRFLCJkZGQsIGQuIE1NTU0geXl5eSIpCitMT0NWQUwoTE9DQUxFX1NMT05HREFURSwiZGRkLCBNTU1NIGRcJ3RoXCcsIHl5eXkiKQogTE9DVkFMKExPQ0FMRV9TVElNRUZPUk1BVCwgImg6bW06c3MgdHQiKQogTE9DVkFMKExPQ0FMRV9JREFURSwiMSIpCiAvKgpAQCAtMTkwOSw3ICsxOTA5LDcgQEAKIAlXQ0hBUglidWZmZXJbMjAwXTsKIAlIS0VZCXhoa2V5OwogCi0JZHByaW50Zl9pbmZvKHdpbjMyLCJFbnVtU3lzdGVtTG9jYWxlczMyVyglcCwlMDhseClcbiIsCisJVFJBQ0Uod2luMzIsIiglcCwlMDhseClcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgbHBmbkxvY2FsZUVudW0sZmxhZ3MgKTsKIAkvKiBzZWUgaWYgd2UgY2FuIHJldXNlIHRoZSBXaW45NSByZWdpc3RyeSBlbnRyaWVzLi4uLiAqLwogCWlmIChFUlJPUl9TVUNDRVNTPT1SZWdPcGVuS2V5MzJBKEhLRVlfTE9DQUxfTUFDSElORSwiXFxTeXN0ZW1cXEN1cnJlbnRDb250cm9sU2V0XFxjb250cm9sXFxObHNcXExvY2FsZVxcIiwmeGhrZXkpKSB7CkBAIC0xOTUyLDcgKzE5NTIsNyBAQAogCUNIQVIJYnVmZmVyWzIwMF07CiAJSEtFWQl4aGtleTsKIAotCWRwcmludGZfaW5mbyh3aW4zMiwiRW51bVN5c3RlbUxvY2FsZXMzMkEoJXAsJTA4bHgpXG4iLAorCVRSQUNFKHdpbjMyLCIoJXAsJTA4bHgpXG4iLAogCQlscGZuTG9jYWxlRW51bSxmbGFncwogCSk7CiAJaWYgKEVSUk9SX1NVQ0NFU1M9PVJlZ09wZW5LZXkzMkEoSEtFWV9MT0NBTF9NQUNISU5FLCJcXFN5c3RlbVxcQ3VycmVudENvbnRyb2xTZXRcXGNvbnRyb2xcXE5sc1xcTG9jYWxlXFwiLCZ4aGtleSkpIHsKQEAgLTIwODIsNyArMjA4Miw3IEBACiAJaW50CWk7CiAJY2hhcgkqYnVmOwogCi0JZHByaW50Zl9pbmZvKHZlciwiVmVyTGFuZ3VhZ2VOYW1lKCVkLCVwLCVkKVxuIixsYW5naWQsbGFuZ25hbWUsbGFuZ25hbWVsZW4pOworCVRSQUNFKHZlciwiKCVkLCVwLCVkKVxuIixsYW5naWQsbGFuZ25hbWUsbGFuZ25hbWVsZW4pOwogCS8qIEZpcnN0LCBjaGVjayBcU3lzdGVtXEN1cnJlbnRDb250cm9sU2V0XGNvbnRyb2xcTmxzXExvY2FsZVw8bGFuZ2lkPgogCSAqIGZyb20gdGhlIHJlZ2lzdHJ5LiAKIAkgKi8KQEAgLTIxNDEsNyArMjE0MSw3IEBACiApIHsKIAlpbnQJaSxsZW47CiAKLQlkcHJpbnRmX2luZm8oc3RyaW5nLCJMQ01hcFN0cmluZ0EoMHglMDRseCwweCUwOGx4LCVzLCVkLCVwLCVkKVxuIiwKKwlUUkFDRShzdHJpbmcsIigweCUwNGx4LDB4JTA4bHgsJXMsJWQsJXAsJWQpXG4iLAogCQlsY2lkLG1hcGZsYWdzLHNyY3N0cixzcmNsZW4sZHN0c3RyLGRzdGxlbik7CiAJaWYgKCFkc3RsZW4gfHwgIWRzdHN0cikgewogCQlkc3RzdHIgPSAoTFBTVFIpc3Jjc3RyOwpAQCAtMjE3OSw3ICsyMTc5LDcgQEAKICkgewogCWludAlpLGxlbjsKIAotCWRwcmludGZfaW5mbyhzdHJpbmcsIkxDTWFwU3RyaW5nVygweCUwNGx4LDB4JTA4bHgsJXAsJWQsJXAsJWQpXG4iLAorCVRSQUNFKHN0cmluZywiKDB4JTA0bHgsMHglMDhseCwlcCwlZCwlcCwlZClcbiIsCiAJCWxjaWQsbWFwZmxhZ3Msc3Jjc3RyLHNyY2xlbixkc3RzdHIsZHN0bGVuCiAJKTsKIAlpZiAoIWRzdGxlbiB8fCAhZHN0c3RyKSB7CkBAIC0yMjEwLDI2ICsyMjEwLDI0NSBAQAogCXJldHVybiBsZW47CiB9CiAKLS8qIEZJWE1FOiB0aGVzZSBzaG91bGRuJ3QgYmUgbmVlZGVkICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgT0xFX0dldEZvcm1hdEEoKQorICogIE9MRV9HZXRGb3JtYXRXKCkKIAotc3RhdGljIGNoYXIgKmFueV9sb2NhbGVfZGF5c1tdID0gCi17IlN1biIsICJNb24iLCAiVHVlIiwgIldlZCIsICJUaHUiLCAiRnJpIiwgIlNhdCJ9OworIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyBzdHVmZiBmb3IgR2V0RGF0ZUZvcm1hdCgpIGFuZCAKKyBHZXRUaW1lRm9ybWF0KCkuCiAKLXN0YXRpYyBjaGFyICphbnlfbG9jYWxlX21vbnRoc1tdID0KLXsiemVybyIsICJKYW4iLCAiRmViIiwgIk1hciIsICJBcHIiLCAiTWF5IiwgIkp1biIsIAotICAgICAgICAgIkp1bCIsICJBdWciLCAiU2VwIiwgIk9jdCIsICJOb3YiLCAiRGVjIn07CisgIGQgICAgc2luZ2xlLWRpZ2l0IChubyBsZWFkaW5nIHplcm8pIGRheSAob2YgbW9udGgpCisgIGRkICAgdHdvLWRpZ2l0IGRheSAob2YgbW9udGgpCisgIGRkZCAgc2hvcnQgZGF5LW9mLXdlZWsgbmFtZQorICBkZGRkIGxvbmcgZGF5LW9mLXdlZWsgbmFtZQorICBNICAgIHNpbmdsZS1kaWdpdCBtb250aAorICBNTSAgIHR3by1kaWdpdCBtb250aAorICBNTU0gIHNob3J0IG1vbnRoIG5hbWUKKyAgTU1NTSBmdWxsIG1vbnRoIG5hbWUKKyAgeSAgICB0d28tZGlnaXQgeWVhciwgbm8gbGVhZGluZyAwCisgIHl5ICAgdHdvLWRpZ2l0IHllYXIKKyAgeXl5eSBmb3VyLWRpZ2l0IHllYXIKKyAgZ2cgICBlcmEgc3RyaW5nCisgIGggICAgaG91cnMgd2l0aCBubyBsZWFkaW5nIHplcm8gKDEyLWhvdXIpCisgIGhoICAgaG91cnMgd2l0aCBmdWxsIHR3byBkaWdpdHMKKyAgSCAgICBob3VycyB3aXRoIG5vIGxlYWRpbmcgemVybyAoMjQtaG91cikKKyAgSEggICBob3VycyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cworICBtICAgIG1pbnV0ZXMgd2l0aCBubyBsZWFkaW5nIHplcm8KKyAgbW0gICBtaW51dGVzIHdpdGggZnVsbCB0d28gZGlnaXRzCisgIHMgICAgc2Vjb25kcyB3aXRoIG5vIGxlYWRpbmcgemVybworICBzcyAgIHNlY29uZHMgd2l0aCBmdWxsIHR3byBkaWdpdHMKKyAgdCAgICB0aW1lIG1hcmtlciAoQSBvciBQKQorICB0dCAgIHRpbWUgbWFya2VyIChBTSwgUE0pCisgICcnICAgdXNlZCB0byBxdW90ZSBsaXRlcmFsIGNoYXJhY3RlcnMKKyAgJycgICAod2l0aGluIGEgcXVvdGVkIHN0cmluZykgaW5kaWNhdGVzIGEgbGl0ZXJhbCAnCiAKLXR5cGVkZWYgc3RydWN0IHsKLSAgICBpbnQgaW5wb3M7ICAgLyogcGxhY2UgaW4gdGhlIGlucHV0IGJ1ZmZlciAqLwotICAgIGludCBvdXRwb3M7ICAvKiBwbGFjZSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciAqLwotICAgIGludCBjb3VudDsgICAKLSAgICBpbnQgaW5xdW90ZTsgCi0gICAgY2hhciB0eXBlOwotICB9IFBBUlNJTkdfU1RBVEU7CisgVGhlc2UgZnVuY3Rpb25zIFJFUVVJUkUgdmFsaWQgbG9jYWxlLCBkYXRlLCAgYW5kIGZvcm1hdC4gCisKKyAqLworCitJTlQzMiBXSU5BUEkgT0xFX0dldEZvcm1hdEEoTENJRCBsb2NhbGUsCisJCQkgICAgRFdPUkQgZmxhZ3MsCisJCQkgICAgTFBTWVNURU1USU1FIHh0aW1lLAorCQkJICAgIExQQ1NUUiBmb3JtYXQsIAorCQkJICAgIExQU1RSIGRhdGUsIElOVDMyIGRhdGVsZW4pCit7CisgICBJTlQzMiBpbnBvcywgb3V0cG9zOworICAgaW50IGNvdW50LCB0eXBlLCBpbnF1b3RlLCBPdmVyZmxvdzsKKyAgY2hhciBidWZbNDBdOworICBpbnQgYnVmbGVuOworCisgICBjb25zdCBjaGFyICogX2RnZm10W10gPSB7ICIlZCIsICIlMDJkIiB9OworICAgY29uc3QgY2hhciAqKiBkZ2ZtdCA9IF9kZ2ZtdCAtIDE7IAorCisgICAvKiByZXBvcnQsIGZvciBkZWJ1Z2dpbmcgKi8KKyAgIFRSQUNFKG9sZSwgImZ1bmMoJTh4LCU4eCwgdGltZShkPSVkLGg9JWQsbT0lZCxzPSVkKSwgZm10OlwnJXNcJyAoYXQgJXApLCAlcCAoJTlzKSwgbGVuPSVsZClcbiIsIGxvY2FsZSwgZmxhZ3MsCisJCXh0aW1lLT53RGF5LCB4dGltZS0+d0hvdXIsIHh0aW1lLT53TWludXRlLCB4dGltZS0+d1NlY29uZCwKKwkJZm9ybWF0LCBmb3JtYXQsIGRhdGUsIGRhdGUsIGRhdGVsZW4pOworICAKKyAgIC8qIGluaXRhbGl6ZSBzdGF0ZSB2YXJpYWJsZXMgYW5kIG91dHB1dCBidWZmZXIgKi8KKyAgIGlucG9zID0gb3V0cG9zID0gMDsKKyAgIGNvdW50ID0gMDsgaW5xdW90ZSA9IDA7IE92ZXJmbG93ID0gMDsKKyAgIHR5cGUgPSAnXDAnOworICAgZGF0ZVswXSA9IGJ1ZlswXSA9ICdcMCc7CisgICAgICAKKyAgIGZvciAoaW5wb3MgPSAwOzsgaW5wb3MrKykgeworICAgICAgLyogVFJBQ0Uob2xlLCAiU1RBVEUgaW5wb3M9JTJkIG91dHBvcz0lMmQgY291bnQ9JWQgaW5xdW90ZT0lZCB0eXBlPSVjIGJ1ZixkYXRlID0gJWMsJWNcbiIsIGlucG9zLCBvdXRwb3MsIGNvdW50LCBpbnF1b3RlLCB0eXBlLCBidWZbaW5wb3NdLCBkYXRlW291dHBvc10pOyAqLworICAgICAgaWYgKGlucXVvdGUpIHsKKwkgaWYgKGZvcm1hdFtpbnBvc10gPT0gJ1wnJykgeworCSAgICBpZiAoZm9ybWF0W2lucG9zKzFdID09ICdcJycpIHsKKwkgICAgICAgaW5wb3MgKz0gMTsKKwkgICAgICAgZGF0ZVtvdXRwb3MrK10gPSAnXCcnOworCSAgICB9IGVsc2UgeworCSAgICAgICBpbnF1b3RlID0gMDsKKwkgICAgICAgY29udGludWU7IC8qIHdlIGRpZCBub3RoaW5nIHRvIHRoZSBvdXRwdXQgKi8KKwkgICAgfQorCSB9IGVsc2UgaWYgKGZvcm1hdFtpbnBvc10gPT0gJ1wwJykgeworCSAgICBkYXRlW291dHBvcysrXSA9ICdcMCc7CisJICAgIGlmIChvdXRwb3MgPiBkYXRlbGVuKSBPdmVyZmxvdyA9IDE7CisJICAgIGJyZWFrOworCSB9IGVsc2UgeworCSAgICBkYXRlW291dHBvcysrXSA9IGZvcm1hdFtpbnBvc107CisJICAgIGlmIChvdXRwb3MgPiBkYXRlbGVuKSB7CisJICAgICAgIE92ZXJmbG93ID0gMTsKKwkgICAgICAgZGF0ZVtvdXRwb3MtMV0gPSAnXDAnOyAvKiB0aGlzIGlzIHRoZSBsYXN0IHBsYWNlIHdoZXJlCisJCQkJCSBpdCdzIHNhZmUgdG8gd3JpdGUgKi8KKwkgICAgICAgYnJlYWs7CisJICAgIH0KKwkgfQorICAgICAgfSBlbHNlIGlmICggIChjb3VudCAmJiAoZm9ybWF0W2lucG9zXSAhPSB0eXBlKSkKKwkJICAgfHwgY291bnQgPT0gNAorCQkgICB8fCAoY291bnQgPT0gMiAmJiBzdHJjaHIoImdoSG1zdCIsIHR5cGUpKSApCisgICAgICAgeworCSAgICBpZiAgICAgICAgICh0eXBlID09ICdkJykgeworCSAgICAgICBpZiAgICAgICAgKGNvdW50ID09IDQpIHsKKwkJICBHZXRMb2NhbGVJbmZvMzJBKGxvY2FsZSwKKwkJCQkgICBMT0NBTEVfU0RBWU5BTUUxCisJCQkJICAgKyB4dGltZS0+d0RheU9mV2VlayAtIDEsCisJCQkJICAgYnVmLCBzaXplb2YoYnVmKSk7CisJICAgICAgIH0gZWxzZSBpZiAoY291bnQgPT0gMykgeworCQkJICAgR2V0TG9jYWxlSW5mbzMyQShsb2NhbGUsIAorCQkJCQkgICAgTE9DQUxFX1NBQkJSRVZEQVlOQU1FMSAKKwkJCQkJICAgICsgeHRpbWUtPndEYXlPZldlZWsgLSAxLAorCQkJCQkgICAgYnVmLCBzaXplb2YoYnVmKSk7CisJCSAgICAgIH0gZWxzZSB7CisJCSAgc3ByaW50ZihidWYsIGRnZm10W2NvdW50XSwgeHRpbWUtPndEYXkpOworCSAgICAgICB9CisJICAgIH0gZWxzZSBpZiAodHlwZSA9PSAnTScpIHsKKwkgICAgICAgaWYgKGNvdW50ID09IDMpIHsKKwkJICBHZXRMb2NhbGVJbmZvMzJBKGxvY2FsZSwgCisJCQkJICAgTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxCisJCQkJICAgKyB4dGltZS0+d01vbnRoIC0gMSwKKwkJCQkgICBidWYsIHNpemVvZihidWYpKTsKKwkgICAgICAgfSBlbHNlIGlmIChjb3VudCA9PSA0KSB7CisJCSAgR2V0TG9jYWxlSW5mbzMyQShsb2NhbGUsCisJCQkJICAgTE9DQUxFX1NNT05USE5BTUUxCisJCQkJICAgKyB4dGltZS0+d01vbnRoIC0gMSwKKwkJCQkgICBidWYsIHNpemVvZihidWYpKTsKKwkJIH0gZWxzZSB7CisJCSAgc3ByaW50ZihidWYsIGRnZm10W2NvdW50XSwgeHRpbWUtPndNb250aCk7CisJICAgICAgIH0KKwkgICAgfSBlbHNlIGlmICh0eXBlID09ICd5JykgeworCSAgICAgICBpZiAoY291bnQgPT0gNCkgeworCQkgICAgICBzcHJpbnRmKGJ1ZiwgIiVkIiwgeHRpbWUtPndZZWFyKTsKKwkgICAgICAgfSBlbHNlIGlmIChjb3VudCA9PSAzKSB7CisJCSAgc3RyY3B5KGJ1ZiwgInl5eSIpOworCQkgIFdBUk4ob2xlLAorCQkJICAgICAgInVua25vd24gZm9ybWF0LFwKK2M9JWMsIG49JWRcbiIsICB0eXBlLCBjb3VudCk7CisJCSB9IGVsc2UgeworCQkgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sIHh0aW1lLT53WWVhciAlIDEwMCk7CisJICAgICAgIH0KKwkgICAgfSBlbHNlIGlmICh0eXBlID09ICdnJykgeworCSAgICAgICBpZiAgICAgICAgKGNvdW50ID09IDIpIHsKKwkJICBGSVhNRShvbGUsICJMT0NBTEVfSUNBTEVOREFSVFlQRSB1bmltcC5cbiIpOworCQkgIHN0cmNweShidWYsICJBRCIpOworCSAgICB9IGVsc2UgeworCQkgIHN0cmNweShidWYsICJnIik7CisJCSAgV0FSTihvbGUsCisJCQkgICAgICAgInVua25vd24gZm9ybWF0LCBcCitjPSVjLCBuPSVkXG4iLCB0eXBlLCBjb3VudCk7CisJICAgICAgIH0KKwkgICAgfSBlbHNlIGlmICh0eXBlID09ICdoJykgeworCSAgICAgICAvKiBnaXZlcyB1cyBob3VycyAxOjAwIC0tIDEyOjAwICovCisJICAgICAgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sICh4dGltZS0+d0hvdXItMSklMTIgKzEpOworCSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ0gnKSB7CisJICAgICAgIC8qIDI0LWhvdXIgdGltZSAqLworCSAgICAgICBzcHJpbnRmKGJ1ZiwgZGdmbXRbY291bnRdLCB4dGltZS0+d0hvdXIpOworCSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ20nKSB7CisJICAgICAgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sIHh0aW1lLT53TWludXRlKTsKKwkgICAgfSBlbHNlIGlmICh0eXBlID09ICdzJykgeworCSAgICAgICBzcHJpbnRmKGJ1ZiwgZGdmbXRbY291bnRdLCB4dGltZS0+d1NlY29uZCk7CisJICAgIH0gZWxzZSBpZiAodHlwZSA9PSAndCcpIHsKKwkgICAgICAgaWYgICAgICAgIChjb3VudCA9PSAxKSB7CisJCSAgc3ByaW50ZihidWYsICIlYyIsICh4dGltZS0+d0hvdXIgPCAxMikgPyAnQScgOiAnUCcpOworCSAgICAgICB9IGVsc2UgaWYgKGNvdW50ID09IDIpIHsKKwkJICAvKiBzcHJpbnRmKGJ1ZiwgIiVzIiwgKHh0aW1lLT53SG91ciA8IDEyKSA/ICJBTSIgOiAiUE0iKTsgKi8KKwkJICBHZXRMb2NhbGVJbmZvMzJBKGxvY2FsZSwKKwkJCQkgICAoeHRpbWUtPndIb3VyPDEyKSAKKwkJCQkgICA/IExPQ0FMRV9TMTE1OSA6IExPQ0FMRV9TMjM1OSwKKwkJCQkgICBidWYsIHNpemVvZihidWYpKTsKKwkgICAgICAgfQorCSAgICB9OworCisJICAgIC8qIHdlIG5lZWQgdG8gY2hlY2sgdGhlIG5leHQgY2hhciBpbiB0aGUgZm9ybWF0IHN0cmluZyAKKwkgICAgICAgYWdhaW4sIG5vIG1hdHRlciB3aGF0IGhhcHBlbmVkICovCisJICAgIGlucG9zLS07CisJICAgIAorCSAgICAvKiBhZGQgdGhlIGNvbnRlbnRzIG9mIGJ1ZiB0byB0aGUgb3V0cHV0ICovCisJICAgIGJ1ZmxlbiA9IHN0cmxlbihidWYpOworCSAgICBpZiAob3V0cG9zICsgYnVmbGVuIDwgZGF0ZWxlbikgeworCSAgICAgICBkYXRlW291dHBvc10gPSAnXDAnOyAvKiBmb3Igc3RyY2F0IHRvIGhvb2sgb250byAqLworCQkgc3RyY2F0KGRhdGUsIGJ1Zik7CisJICAgICAgIG91dHBvcyArPSBidWZsZW47CisJICAgIH0gZWxzZSB7CisJICAgICAgIGRhdGVbb3V0cG9zXSA9ICdcMCc7CisJICAgICAgIHN0cm5jYXQoZGF0ZSwgYnVmLCBkYXRlbGVuIC0gb3V0cG9zKTsKKwkJIGRhdGVbZGF0ZWxlbiAtIDFdID0gJ1wwJzsKKwkJIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKKwkgICAgICAgV0FSTihvbGUsICJpbnN1ZmZpY2llbnQgYnVmZmVyXG4iKTsKKwkJIHJldHVybiAwOworCSAgICB9CisKKwkgICAgLyogcmVzZXQgdGhlIHZhcmlhYmxlcyB3ZSB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhpcyBpdGVtICovCisJICAgIGNvdW50ID0gMDsKKwkgICAgdHlwZSA9ICdcMCc7CisJIH0gZWxzZSBpZiAoZm9ybWF0W2lucG9zXSA9PSAnXDAnKSB7CisJICAgIC8qIHdlIGNhbid0IGNoZWNrIGZvciB0aGlzIGF0IHRoZSBsb29wLWhlYWQsIGJlY2F1c2UKKwkgICAgICAgdGhhdCBicmVha3MgdGhlIHByaW50aW5nIG9mIHRoZSBsYXN0IGZvcm1hdC1pdGVtICovCisJICAgIGRhdGVbb3V0cG9zXSA9ICdcMCc7CisJICAgIGJyZWFrOworICAgICAgICAgfSBlbHNlIGlmIChjb3VudCkgeworCSAgICAvKiBjb250aW51aW5nIGEgY29kZSBmb3IgYW4gaXRlbSAqLworCSAgICBjb3VudCArPTE7CisJICAgIGNvbnRpbnVlOworCSB9IGVsc2UgaWYgKHN0cmNocigiaEhtc3R5TWRnIiwgZm9ybWF0W2lucG9zXSkpIHsKKwkgICAgdHlwZSA9IGZvcm1hdFtpbnBvc107CisJICAgIGNvdW50ID0gMTsKKwkgICAgY29udGludWU7CisJIH0gZWxzZSBpZiAoZm9ybWF0W2lucG9zXSA9PSAnXCcnKSB7CisJICAgIGlucXVvdGUgPSAxOworCSAgICBjb250aW51ZTsKKyAgICAgICB9IGVsc2UgeworCSAgICBkYXRlW291dHBvcysrXSA9IGZvcm1hdFtpbnBvc107CisJIH0KKyAgICAgIC8qIG5vdyBkZWFsIHdpdGggYSBwb3NzaWJsZSBidWZmZXIgb3ZlcmZsb3cgKi8KKyAgICAgIGlmIChvdXRwb3MgPj0gZGF0ZWxlbikgeworICAgICAgIGRhdGVbZGF0ZWxlbiAtIDFdID0gJ1wwJzsKKyAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CisgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICB9CisgICAKKyAgIGlmIChPdmVyZmxvdykgeworICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOworICAgfTsKKworICAgLyogZmluaXNoIGl0IG9mZiB3aXRoIGEgc3RyaW5nIHRlcm1pbmF0b3IgKi8KKyAgIG91dHBvcysrOworICAgLyogc2FuaXR5IGNoZWNrICovCisgICBpZiAob3V0cG9zID4gZGF0ZWxlbi0xKSBvdXRwb3MgPSBkYXRlbGVuLTE7CisgICBkYXRlW291dHBvc10gPSAnXDAnOworICAgCisgICBUUkFDRShvbGUsICJPTEVfR2V0Rm9ybWF0QSByZXR1cm5zIHN0cmluZyAnJXMnLCBsZW4gJWRcbiIsCisJICAgICAgIGRhdGUsIG91dHBvcyk7CisgICByZXR1cm4gb3V0cG9zOworfQorCitJTlQzMiBXSU5BUEkgT0xFX0dldEZvcm1hdFcoTENJRCBsb2NhbGUsIERXT1JEIGZsYWdzLAorCQkJICAgIExQU1lTVEVNVElNRSB4dGltZSwKKwkJCSAgICBMUENXU1RSIGZvcm1hdCwKKwkJCSAgICBMUFdTVFIgdGltZXN0ciwgSU5UMzIgdGltZWxlbikKK3sKKyAgIEZJWE1FKG9sZSwgIih1bmljb2RlIEdldERhdGVGb3JtYXQpIFNUVUJcbiIpOworICAgcmV0dXJuIDA7CisgICAKK30KKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCi0gKiAgR2V0RGF0ZUZvcm1hdCgpCisgKiAgR2V0RGF0ZUZvcm1hdDMyQSgpCiAKICAgVGhpcyBmdW5jdGlvbiB1c2VzIGZvcm1hdCB0byBmb3JtYXQgdGhlIGRhdGUsICBvciwgIGlmIGZvcm1hdAogICBpcyBOVUxMLCB1c2VzIHRoZSBkZWZhdWx0IGZvciB0aGUgbG9jYWxlLiAgZm9ybWF0IGlzIGEgc3RyaW5nCkBAIC0yMjUwLDE4MiArMjQ2OSw4OSBAQAogCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKi8KIAotSU5UMzIgV0lOQVBJIEdldERhdGVGb3JtYXQzMkEoTENJRCBsb2NhbGUsRFdPUkQgZmxhZ3MsTFBTWVNURU1USU1FIHh0aW1lLAorSU5UMzIgV0lOQVBJIEdldERhdGVGb3JtYXQzMkEoTENJRCBsb2NhbGUsRFdPUkQgZmxhZ3MsCisJCQkgICAgICBMUFNZU1RFTVRJTUUgeHRpbWUsCiAJCQkgICAgICBMUENTVFIgZm9ybWF0LCBMUFNUUiBkYXRlLElOVDMyIGRhdGVsZW4pIAogewotICBQQVJTSU5HX1NUQVRFIHN0YXRlOyAgIAotICBjaGFyIGJ1Zls0MF07Ci0gIGludCBidWZsZW47CisgICAKKyAgY2hhciBmb3JtYXRfYnVmWzQwXTsKICAgTFBDU1RSIHRoaXNmb3JtYXQ7CisgIFNZU1RFTVRJTUUgdDsKKyAgTFBTWVNURU1USU1FIHRoaXN0aW1lOworICBMQ0lEIHRoaXNsb2NhbGU7CiAKLSAgZHByaW50Zl9pbmZvKG9sZSwiR2V0RGF0ZUZvcm1hdCgweCUwNGx4LDB4JTA4bHgsJXAsJXMsJXAsJWQpXG4iLAorICBJTlQzMiByZXQ7CisKKyAgVFJBQ0Uob2xlLCIoMHglMDRseCwweCUwOGx4LCVwLCVzLCVwLCVkKVxuIiwKIAkgICAgICBsb2NhbGUsZmxhZ3MseHRpbWUsZm9ybWF0LGRhdGUsZGF0ZWxlbik7Ci0KLSAgLyogRklYTUU6IEdldCB0aGUgZGVmYXVsdCBmb3IgdGhpcyBsb2NhbGUgKi8KLSAgaWYgKGZvcm1hdCkgewotICAgIHRoaXNmb3JtYXQgPSBmb3JtYXQ7CisgIAorICBpZiAoIWxvY2FsZSkgeworICAgICBsb2NhbGUgPSBMT0NBTEVfU1lTVEVNX0RFRkFVTFQ7CisgICAgIH07CisgIAorICBpZiAobG9jYWxlID09IExPQ0FMRV9TWVNURU1fREVGQVVMVCkgeworICAgICB0aGlzbG9jYWxlID0gR2V0U3lzdGVtRGVmYXVsdExDSUQoKTsKKyAgfSBlbHNlIGlmIChsb2NhbGUgPT0gTE9DQUxFX1VTRVJfREVGQVVMVCkgeworICAgICB0aGlzbG9jYWxlID0gR2V0VXNlckRlZmF1bHRMQ0lEKCk7CiAgIH0gZWxzZSB7Ci0gICAgdGhpc2Zvcm1hdCA9ICJ5eXl5LU1NLWRkIChkZGQpICI7CisgICAgIHRoaXNsb2NhbGUgPSBsb2NhbGU7CisgICB9OworCisgIGlmICh4dGltZSA9PSBOVUxMKSB7CisgICAgIEdldFN5c3RlbVRpbWUoJnQpOworICAgICB0aGlzdGltZSA9ICZ0OworICB9IGVsc2UgeworICAgICB0aGlzdGltZSA9IHh0aW1lOworICB9OworCisgIGlmIChmb3JtYXQgPT0gTlVMTCkgeworICAgICBHZXRMb2NhbGVJbmZvMzJBKHRoaXNsb2NhbGUsICgoZmxhZ3MmREFURV9MT05HREFURSkgCisJCQkJICAgPyBMT0NBTEVfU0xPTkdEQVRFCisJCQkJICAgOiBMT0NBTEVfU1NIT1JUREFURSksCisJCSAgICAgIGZvcm1hdF9idWYsIHNpemVvZihmb3JtYXRfYnVmKSk7CisgICAgIHRoaXNmb3JtYXQgPSBmb3JtYXRfYnVmOworICB9IGVsc2UgeworICAgICB0aGlzZm9ybWF0ID0gZm9ybWF0OwogICB9OwogCiAgIAotICAvKiBpbml0aWFsaXplIHN0YXRlIHZhcmlhYmxlcyAqLwotICBzdGF0ZS5pbnBvcyA9IHN0YXRlLm91dHBvcyA9IDA7Ci0gIHN0YXRlLmNvdW50ID0gc3RhdGUuaW5xdW90ZSA9IDA7Ci0gIHN0YXRlLnR5cGUgPSAnXDAnOwotICAvKiBpbml0aWFsaXNlIG91dHB1dCBidWZmZXIgKi8KLSAgZGF0ZVswXSA9ICdcMCc7Ci0gICAgICAKLSAgZm9yIChzdGF0ZS5pbnBvcyA9IDA7IHRoaXNmb3JtYXRbc3RhdGUuaW5wb3NdIDsgc3RhdGUuaW5wb3MrKykgewotICAgICAgIGlmIChzdGF0ZS5pbnF1b3RlKSB7Ci0JICAgIGlmICh0aGlzZm9ybWF0W3N0YXRlLmlucG9zXSA9PSAnXCcnKSB7Ci0JCSBzdGF0ZS5pbnF1b3RlID0gMDsKLQkJIGNvbnRpbnVlOwotCSAgICB9IGVsc2UgewotCQkgZGF0ZVtzdGF0ZS5vdXRwb3MrK10gPSB0aGlzZm9ybWF0W3N0YXRlLmlucG9zXTsKLQkgICAgfTsJICAgIAotICAgICAgIH0gZWxzZSBpZiAoIChzdGF0ZS5jb3VudCAmJiAodGhpc2Zvcm1hdFtzdGF0ZS5pbnBvc10gIT0gc3RhdGUudHlwZSkpIAotCQkgICB8fCBzdGF0ZS5jb3VudCA9PSA0IAotCQkgICB8fCAoc3RhdGUuY291bnQgPT0gMiAmJiBzdGF0ZS50eXBlID09ICdnJyApICkgCi0gICAgICAgewotCSAgICAvKiBlbmQgb2YgYSBmb3JtYXQtdHlwZSBzdHJpbmcgKi8KLQkgICAgaWYgICAgICAgICAoc3RhdGUudHlwZSA9PSAnZCcpIHsKLQkJIGlmICAgICAgICAoc3RhdGUuY291bnQgPT0gMSkgewotCQkgICAgICBzcHJpbnRmKGJ1ZiwgIiVkIiwgeHRpbWUtPndEYXkpOwotCQkgfSBlbHNlIGlmIChzdGF0ZS5jb3VudCA9PSAyKSB7Ci0JCSAgICAgIHNwcmludGYoYnVmLCAiJTAyZCIsIHh0aW1lLT53RGF5KTsKLQkJIH0gZWxzZSBpZiAoc3RhdGUuY291bnQgPT0gMykgewotCQkgICAgICAvKiBkYXkgb2Ygd2Vlaywgc2hvcnQgKi8KLQkJICAgICAgLyogRklYTUU6IFRoaXMgaXMgdGhlIHdheSB0byBkbyBpdCBldmVyeXdoZXJlICovCi0JCSAgICAgIGlmIChsb2NhbGUpIHsKLQkJCSAgIAotCQkJICAgR2V0TG9jYWxlSW5mbzMyQShsb2NhbGUsIAotCQkJCQkgICAgTE9DQUxFX1NBQkJSRVZEQVlOQU1FMSAKLQkJCQkJICAgICsgeHRpbWUtPndEYXlPZldlZWsgLSAxLAotCQkJCQkgICAgYnVmLCBzaXplb2YoYnVmKSk7Ci0JCSAgICAgIH0gZWxzZSB7Ci0JCQkgICBzdHJjcHkoYnVmLCAKLQkJCQkgIGFueV9sb2NhbGVfZGF5c1t4dGltZS0+d0RheU9mV2VlayAtMV0pOwotCQkgICAgICB9OwotCQkgfSBlbHNlIGlmIChzdGF0ZS5jb3VudCA9PSA0KSB7Ci0JCSAgICAgIC8qIGRheSBvZiB3ZWVrLCBsb25nICovCisgIHJldCA9IE9MRV9HZXRGb3JtYXRBKHRoaXNsb2NhbGUsIGZsYWdzLCB0aGlzdGltZSwgdGhpc2Zvcm1hdCwgCisJCSAgICAgICBkYXRlLCBkYXRlbGVuKTsKKyAgCiAKLQkJICAgICAgLyogRklYTUU6IGdldCB0aGUgZGF5cyBmcm9tIHRoZSBsb2NhbGUgKi8KLQkJICAgICAgLyogRklYTUU6IHRoZXNlIHNob3VsZCBiZSBsb25nIGRheXMgKi8KLQkJICAgICAgc3ByaW50ZihidWYsICIlLipzIiwgKGludCkgc2l6ZW9mKGJ1ZiksCi0JCQkgICAgICBhbnlfbG9jYWxlX2RheXNbeHRpbWUtPndEYXlPZldlZWtdKTsKLQkJIH0gZWxzZSB7Ci0JCSAgICAgIGRwcmludGZfaW5mbyhvbGUsIAotCQkJCSAgIkdldERhdGVGb3JtYXQoKTogdW5iZWthbm50IGZvcm1hdCwgXAotYz0lYywgbj0lZFxuIiwKLQkJCQkgIHN0YXRlLnR5cGUsIHN0YXRlLmNvdW50KTsKLQkJIH07Ci0JICAgIH0gZWxzZSBpZiAoc3RhdGUudHlwZSA9PSAnTScpIHsKLQkJIGlmICAgICAgICAoc3RhdGUuY291bnQgPT0gMSkgewotCQkgICAgICBzcHJpbnRmKGJ1ZiwgIiVkIiwgeHRpbWUtPndNb250aCk7Ci0JCSB9IGVsc2UgaWYgKHN0YXRlLmNvdW50ID09IDIpIHsKLQkJICAgICAgc3ByaW50ZihidWYsICIlMDJkIiwgeHRpbWUtPndNb250aCk7Ci0JCSB9IGVsc2UgaWYgKHN0YXRlLmNvdW50ID09IDMpIHsKLQkJICAgICAgLyogRklYTUU6IGdldCB0aGUgbW9udGgtbmFtZSBmcm9tIHRoZSBsb2NhbGUgKi8KLQkJICAgICAgc3ByaW50ZihidWYsICIlLipzIiwgKGludCkgc2l6ZW9mKGJ1ZiksCi0JCQkgICAgICBhbnlfbG9jYWxlX21vbnRoc1t4dGltZS0+d01vbnRoXSk7Ci0JCSB9IGVsc2UgaWYgKHN0YXRlLmNvdW50ID09IDQpIHsKLQkJICAgICAgLyogRklYTUU6IGdldCB0aGUgbW9udGgtbmFtZSBmcm9tIHRoZSBsb2NhbGUgKi8KLQkJICAgICAgLyogRklYTUU6IHNob3VsZCByZXR1cm4gYSBsb25nIG1vbnRoICovCi0JCSAgICAgIHNwcmludGYoYnVmLCAiJS4qcyIsIChpbnQpIHNpemVvZihidWYpLCAKLQkJCSAgICAgIGFueV9sb2NhbGVfbW9udGhzW3h0aW1lLT53TW9udGhdKTsKLQkJIH0gZWxzZSB7Ci0JCSAgICAgIGRwcmludGZfaW5mbyhvbGUsIAotCQkJICAiR2V0RGF0ZUZvcm1hdCgpOiB1bmJla2FubnQgZm9ybWF0LCBjPSVjLCBuPSVkXG4iLAotCQkJCSAgc3RhdGUudHlwZSwgc3RhdGUuY291bnQpOwotCQkgfTsKLQkgICAgfSBlbHNlIGlmIChzdGF0ZS50eXBlID09ICd5JykgewotCQkgaWYgICAgICAgIChzdGF0ZS5jb3VudCA9PSAxKSB7Ci0JCSAgICAgIHNwcmludGYoYnVmLCAiJWQiLCB4dGltZS0+d1llYXIgJSAxMDApOwotCQkgfSBlbHNlIGlmIChzdGF0ZS5jb3VudCA9PSAyKSB7Ci0JCSAgICAgIHNwcmludGYoYnVmLCAiMDIlZCIsIHh0aW1lLT53WWVhciAlIDEwMCk7Ci0JCSB9IGVsc2UgaWYgKHN0YXRlLmNvdW50ID09IDQpIHsKLQkJICAgICAgc3ByaW50ZihidWYsICIlZCIsIHh0aW1lLT53WWVhcik7Ci0JCSB9IGVsc2UgewotCQkgICAgICBkcHJpbnRmX2luZm8ob2xlLCAKLQkJCSAiR2V0RGF0ZUZvcm1hdCgpOiB1bmJla2FubnQgZm9ybWF0LCBjPSVjLCBuPSVkXG4iLAotCQkJCSAgc3RhdGUudHlwZSwgc3RhdGUuY291bnQpOwotCQkgfTsKLQkgICAgfSBlbHNlIGlmIChzdGF0ZS50eXBlID09ICdnJykgewotCQkgaWYgICAgICAgIChzdGF0ZS5jb3VudCA9PSAyKSB7Ci0JCSAgICAgIC8qIEZJWE1FOiBHZXQgZXJhIGZyb20gdGhlIGxvY2FsZSAqLwotCQkgICAgICBzdHJjcHkoYnVmLCAiQUQgKENFKSIpOwotCQkgfSBlbHNlIHsKLQkJICAgICAgZHByaW50Zl9pbmZvKG9sZSwgCi0JCQkgIkdldERhdGVGb3JtYXQoKTogdW5iZWthbm50IGZvcm1hdCwgYz0lYywgbj0lZCIsCi0JCQkJICBzdGF0ZS50eXBlLCBzdGF0ZS5jb3VudCk7Ci0JCSB9OwotCSAgICB9IGVsc2UgewotCQkgZHByaW50Zl9pbmZvKG9sZSwgCi0JCSAgICAgIkdldERhdGVGb3JtYXQoKTogdW5iZWthbm50IGZvcm1hdCwgYz0lYywgbj0lZFxuIiwKLQkJCSAgICAgc3RhdGUudHlwZSwgc3RhdGUuY291bnQpOwotCSAgICB9OwotCSAgICBidWZsZW4gPSBzdHJsZW4oYnVmKTsKLQotCSAgICAvKiB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBuZXh0IGNoYXIgYWdhaW4sIG9uZQotCSAgICAgICB3YXkgb3IgYW5vdGhlciAqLwotCSAgICBzdGF0ZS5pbnBvcy0tOwotCSAgICAKLSAgICAgICAgICAgIC8qIG5vdywgYWRkIGJ1ZiB0byB0aGUgb3V0cHV0IGJ1ZmZlciAqLwotCSAgICBpZiAoc3RhdGUub3V0cG9zICsgYnVmbGVuIDwgZGF0ZWxlbikgewotCQkgZGF0ZVtzdGF0ZS5vdXRwb3NdID0gJ1wwJzsgLyogZm9yIHN0cmNhdCB0byBob29rIG9uICovCi0JCSBzdHJjYXQoZGF0ZSwgYnVmKTsKLQkJIHN0YXRlLm91dHBvcyArPSBidWZsZW47Ci0JICAgIH0gZWxzZSB7Ci0JCSBkYXRlW3N0YXRlLm91dHBvc10gPSAnXDAnOwotCQkgc3RybmNhdChkYXRlLCBidWYsIGRhdGVsZW4gLSBzdGF0ZS5vdXRwb3MgLSAxKTsKLQkJIGRhdGVbZGF0ZWxlbiAtIDFdID0gJ1wwJzsKLQkJIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKLQkJIHJldHVybiAwOwotCSAgICB9OwotCi0JICAgIC8qIHJlc2V0IG90aGVyIHZhcmlhYmxlcyAqLwotCSAgICBzdGF0ZS5jb3VudCA9IDA7Ci0JICAgIHN0YXRlLnR5cGUgPSAnXDAnOwotCi0JICAgIC8qIGVuZCBvZiBjb2RlIGZvciBwcmludGluZyBmb3JtYXQtc3RyaW5ncyAqLwotICAgICAgIH0gZWxzZSBpZiAoc3RhdGUuY291bnQpIHsKLQkgICAgLyogYW5kIGNoYXIgaXMgb2Ygc2FtZSB0eXBlIChzZWUgYWJvdmUpICovCi0JICAgIHN0YXRlLmNvdW50ICs9IDE7OwotICAgICAgIH0gZWxzZSBpZiAoc3RyY2hyKCJ5TWRnIiwgdGhpc2Zvcm1hdFtzdGF0ZS5pbnBvc10pKSB7Ci0JICAgIHN0YXRlLnR5cGUgPSB0aGlzZm9ybWF0W3N0YXRlLmlucG9zXTsKLQkgICAgc3RhdGUuY291bnQgPSAxOwotICAgICAgIH0gZWxzZSBpZiAodGhpc2Zvcm1hdFtzdGF0ZS5pbnBvc10gPT0gJ1wnJykgewotCSAgICBzdGF0ZS5pbnF1b3RlID0gMTsKLSAgICAgICB9IGVsc2UgewotCSAgICBkYXRlW3N0YXRlLm91dHBvcysrXSA9IHRoaXNmb3JtYXRbc3RhdGUuaW5wb3NdOwotICAgICAgIH07Ci0gICAgIGlmIChzdGF0ZS5vdXRwb3MgPj0gZGF0ZWxlbikgewotICAgICAgIGRhdGVbZGF0ZWxlbiAtIDFdID0gJ1wwJzsKLSAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7Ci0gICAgICAgcmV0dXJuIDA7Ci0gICAgIH07Ci0gICB9OwotCi0gIHN0YXRlLm91dHBvcysrOwotICBpZiAoc3RhdGUub3V0cG9zID49IGRhdGVsZW4gLSAxKSB7Ci0gICAgICAgc3RhdGUub3V0cG9zID0gZGF0ZWxlbiAtIDE7Ci0gIH07Ci0KLSAgZGF0ZVtzdGF0ZS5vdXRwb3NdID0gJ1wwJzsKLQotICAgZHByaW50Zl9pbmZvKG9sZSwgCisgICBUUkFDRShvbGUsIAogCSAgICAgICAiR2V0RGF0ZUZvcm1hdDMyQSgpIHJldHVybmluZyAlZCwgd2l0aCBkYXRhPSVzXG4iLAotCSAgICAgICBzdGF0ZS5vdXRwb3MsIGRhdGUpOwotICAgcmV0dXJuIHN0YXRlLm91dHBvczsKKwkgICAgICAgcmV0LCBkYXRlKTsKKyAgcmV0dXJuIHJldDsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIEdldERhdGVGb3JtYXQzMlcoKQorCisgKiBBY3RzIHRoZSBzYW1lIGFzIEdldERhdGVGb3JtYXQzMkEoKSwgIGV4Y2VwdCB0aGF0IGl0J3MgVW5pY29kZS4KKyAqIEFjY2VwdHMgJiByZXR1cm5zIHNpemVzIGFzIGNvdW50cyBvZiBVbmljb2RlIGNoYXJhY3RlcnMuCisKKyAqLworSU5UMzIgV0lOQVBJIEdldERhdGVGb3JtYXQzMlcoTENJRCBsb2NhbGUsRFdPUkQgZmxhZ3MsCisJCQkgICAgICBMUFNZU1RFTVRJTUUgeHRpbWUsCisJCQkgICAgICBMUENXU1RSIGZvcm1hdCwKKwkJCSAgICAgIExQV1NUUiBkYXRlLCBJTlQzMiBkYXRlbGVuKQoreworICAgc2hvcnQgZGF0ZWFycltdID0geycxJywnOScsJzknLCc0JywnLScsJzEnLCctJywnMScsMH07CisKKyAgIEZJWE1FKG9sZSwgIlNUVUJcbiIpOyAgIAorICAgbHN0cmNweW4zMlcoZGF0ZSwgZGF0ZWFyciwgZGF0ZWxlbik7CisgICByZXR1cm4gKCAgZGF0ZWxlbiA8IDkpID8gZGF0ZWxlbiA6IDk7CisgICAKKyAgIAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCi0gKiBHZXRUaW1lRm9ybWF0KCkgCisgKiBHZXRUaW1lRm9ybWF0MzJBKCkgCiAKLSBGb3JtYXRzIGRhdGUgYWNjb3JkaW5nIHRvIGZvcm1hdCwgIG9yIGxvY2FsZSBkZWZhdWx0IGlmIGZvcm1hdCBpcyBOVUxMLgotIFRoZSBmb3JtYXQgY29uc2lzdHMgb2YgbGl0ZXJhbCBjaGFyYWN0ZXJzIGFuZCBmaWVsZHMgYXMgZm9sbG93czoKKyBGb3JtYXRzIGRhdGUgYWNjb3JkaW5nIHRvIGZvcm1hdCwgIG9yIGxvY2FsZSBkZWZhdWx0IGlmIGZvcm1hdCBpcworIE5VTEwuIFRoZSBmb3JtYXQgY29uc2lzdHMgb2YgbGl0ZXJhbCBjaGFyYWN0ZXJzIGFuZCBmaWVsZHMgYXMgZm9sbG93czoKIAogIGggIGhvdXJzIHdpdGggbm8gbGVhZGluZyB6ZXJvICgxMi1ob3VyKQogIGhoIGhvdXJzIHdpdGggZnVsbCB0d28gZGlnaXRzCkBAIC0yNDQwLDIzICsyNTY2LDY2IEBACiAKICAqLwogCi1JTlQzMiBXSU5BUEkgR2V0VGltZUZvcm1hdDMyQShMQ0lEIGxvY2FsZSxEV09SRCBmbGFncyxMUFNZU1RFTVRJTUUgeHRpbWUsCi0JCQkgICAgICBMUENTVFIgZm9ybWF0LCBMUFNUUiB0aW1lc3RyLElOVDMyIHRpbWVsZW4KLSkgewotICAgZHByaW50Zl9pbmZvKG9sZSwiR2V0VGltZUZvcm1hdCgweCUwNGx4LDB4JTA4bHgsJXAsJXMsJXAsJWQpLCBzdHViXG4iLAorSU5UMzIgV0lOQVBJIEdldFRpbWVGb3JtYXQzMkEoTENJRCBsb2NhbGUsRFdPUkQgZmxhZ3MsCisJCQkgICAgICBMUFNZU1RFTVRJTUUgeHRpbWUsCisJCQkgICAgICBMUENTVFIgZm9ybWF0LCAKKwkJCSAgICAgIExQU1RSIHRpbWVzdHIsSU5UMzIgdGltZWxlbikgCit7CisgICBJTlQzMiByZXQ7CisgICBMUENTVFIgcmVhbGZvcm1hdDsKKyAgIGNoYXIgZm10X2J1Zls0MF07CisgICAKKyAgIFRSQUNFKG9sZSwiR2V0VGltZUZvcm1hdCgweCUwNGx4LDB4JTA4bHgsJXAsJXMsJXAsJWQpXG4iLAogCQlsb2NhbGUsZmxhZ3MseHRpbWUsZm9ybWF0LHRpbWVzdHIsdGltZWxlbgogCSk7CiAgICAKLSAgIC8qIEZJWE1FOiBpbXBsZW1lbnQgdGhpcyBvbmUuICBQZXJoYXBzIGEgY29tbW9uIGNvZGViYXNlPyAqLworICAgaWYgKGZvcm1hdCkgeworICAgICAgcmVhbGZvcm1hdCA9IGZvcm1hdDsKKyAgIH0gZWxzZSBpZiAobG9jYWxlKSB7CisgICAgICBHZXRMb2NhbGVJbmZvMzJBKGxvY2FsZSwgTE9DQUxFX1NUSU1FRk9STUFULAorCQkgICAgICAgZm10X2J1ZiwgIHNpemVvZihmbXRfYnVmKSk7CisgICAgICByZWFsZm9ybWF0ID0gZm10X2J1ZjsKKyAgIH0gZWxzZSB7CisgICAgICBXQVJOKG9sZSwgIkNhbGxlciBnYXZlIG5vIGxvY2FsZSBhbmQgbm8gZm9ybWF0XG4iKTsKKyAgICAgIHJlYWxmb3JtYXQgPSAiaGg6bW06c3MiOworICAgfTsKKyAgIGlmICghbG9jYWxlKSB7CisgICAgICBsb2NhbGUgPSBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOworICAgfQogCiAKKyAgIHJldHVybiBPTEVfR2V0Rm9ybWF0QShsb2NhbGUsIGZsYWdzLCB4dGltZSwgcmVhbGZvcm1hdCwgdGltZXN0ciwgdGltZWxlbik7CiAKLQotCi0JbHN0cmNweW4zMkEodGltZXN0ciwiMDA6MDA6NDIiLHRpbWVsZW4pOwotCXJldHVybiBzdHJsZW4oIjAwOjAwOjQyIik7CiB9CiAKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBHZXRUaW1lRm9ybWF0MzJXKCkKKyAqIAorICoKKyAqLworCitJTlQzMiBXSU5BUEkgR2V0VGltZUZvcm1hdDMyVyhMQ0lEIGxvY2FsZSxEV09SRCBmbGFncywKKwkJCSAgICAgIExQU1lTVEVNVElNRSB4dGltZSwKKwkJCSAgICAgIExQQ1dTVFIgZm9ybWF0LCAKKwkJCSAgICAgIExQV1NUUiB0aW1lc3RyLElOVDMyIHRpbWVsZW4pIAoreworICAgY2hhciBidWZbNDBdOworICAgCisgICBsc3RyY3B5bld0b0EoYnVmLCBmb3JtYXQsIChzaXplb2YoYnVmKSkvMik7CisgICAKKyAgIFRSQUNFKG9sZSwgIkdldFRpbWVGb3JtYXRXIGxlbiAlZCBmbGFncyAweCVsWCBmb3JtYXQgPiVzPFxuIiwKKwkJdGltZWxlbiwgZmxhZ3MsIGJ1Zik7CisgICBGSVhNRShvbGUsICJTVFVCIik7CisgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CisgICByZXR1cm4gMDsKKworCit9CisKKworCisKKwogCiAKIApkaWZmIC0tZ2l0IGEvb2xlL29sZWNsaS5jIGIvb2xlL29sZWNsaS5jCmluZGV4IGJjNjNlZjEuLmU1MTA5NTEgMTAwNjQ0Ci0tLSBhL29sZS9vbGVjbGkuYworKysgYi9vbGUvb2xlY2xpLmMKQEAgLTEwNiwxNCArMTA2LDI1IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgT2xlSXNEY01ldGEKKyAqICAgICAgICAgICBPbGVJc0RjTWV0YTE2CiAgKi8KLUJPT0wxNiBXSU5BUEkgT2xlSXNEY01ldGEoSERDMTYgaGRjKQorQk9PTDE2IFdJTkFQSSBPbGVJc0RjTWV0YTE2KEhEQzE2IGhkYykKIHsKLQlkcHJpbnRmX2luZm8ob2xlLCJPbGVJc0RDTWV0YSglMDR4KVxuIixoZGMpOworCVRSQUNFKG9sZSwiKCUwNHgpXG4iLGhkYyk7CiAJcmV0dXJuIEdESV9HZXRPYmpQdHIoIGhkYywgTUVUQUZJTEVfRENfTUFHSUMgKSAhPSAwOwogfQogCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIE9sZUlzRGNNZXRhMzIKKyAqLworQk9PTDMyIFdJTkFQSSBPbGVJc0RjTWV0YTMyKEhEQzMyIGhkYykKK3sKKyAgICAgICAgVFJBQ0Uob2xlLCIoJTA0eClcbiIsaGRjKTsKKyAgICAgICAgcmV0dXJuIEdESV9HZXRPYmpQdHIoIGhkYywgTUVUQUZJTEVfRENfTUFHSUMgKSAhPSAwOworfQorCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIE9sZVNldEhvc3ROYW1lcwogICovCmRpZmYgLS1naXQgYS9vbGUvb2xlc3ZyLmMgYi9vbGUvb2xlc3ZyLmMKaW5kZXggMTg2NDc1ZS4uZjYwNGE0YSAxMDA2NDQKLS0tIGEvb2xlL29sZXN2ci5jCisrKyBiL29sZS9vbGVzdnIuYwpAQCAtMjAsNyArMjAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSFNFUlZFUiAqaFJldCwgSElOU1RBTkNFMTYgaFNlcnZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0xFX1NFUlZFUl9VU0UgdXNlICkKIHsKLSAgICBkcHJpbnRmX2ZpeG1lKG9sZSwiT2xlUmVnaXN0ZXJTZXJ2ZXI6JXMgLSBzdHViXG4iLG5hbWUpOworICAgIEZJWE1FKG9sZSwiJXMgLSBzdHViXG4iLG5hbWUpOwogICAgICpoUmV0PSsrT0xFX2N1cnJlbnRfaGFuZGxlOwogICAgIC8qIHJldHVybiBPTEVfRVJST1JfTUVNT1JZLCBPTEVfRVJST1JfUFJPVEVDVF9PTkxZIGlmIHlvdSB3YW50IGl0IGZhaWwqLwogICAgIHJldHVybiBPTEVfT0s7CkBAIC03Myw3ICs3Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQT0xFU0VSVkVSRE9DIGRvY3VtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSFNFUlZFUkRPQyAqaFJldCkKIHsKLSAgICBkcHJpbnRmX2ZpeG1lKG9sZSwiT2xlUmVnaXN0ZXJTZXJ2ZXJEb2M6JWxkLCVzIC0gc3R1YlxuIiwgCisgICAgRklYTUUob2xlLCIlbGQsJXMgLSBzdHViXG4iLCAKIAkJaFNlcnZlciwgZG9jbmFtZSk7CiAgICAgKmhSZXQ9KytPTEVfY3VycmVudF9oYW5kbGU7CiAgICAgcmV0dXJuIE9MRV9PSzsKQEAgLTg0LDcgKzg0LDcgQEAKICAqLwogT0xFU1RBVFVTIFdJTkFQSSBPbGVSZXZva2VTZXJ2ZXJEb2MxNihMSFNFUlZFUkRPQyBoU2VydmVyRG9jKQogewotICAgIGRwcmludGZfZml4bWUob2xlLCJPbGVSZXZva2VTZXJ2ZXJEb2M6JWxkICAtIHN0dWJcbiIsaFNlcnZlckRvYyk7CisgICAgRklYTUUob2xlLCIlbGQgIC0gc3R1YlxuIixoU2VydmVyRG9jKTsKICAgICByZXR1cm4gT0xFX09LOwogfQogCkBAIC0xMDIsNyArMTAyLDcgQEAKICAqLwogT0xFU1RBVFVTIFdJTkFQSSBPbGVSZXZva2VTZXJ2ZXIoTEhTRVJWRVIgaFNlcnZlcikKIHsKLSAgICBkcHJpbnRmX2ZpeG1lKG9sZSwiT2xlUmV2b2tlU2VydmVyOiVsZCAtIHN0dWJcbiIsaFNlcnZlcik7CisgICAgRklYTUUob2xlLCIlbGQgLSBzdHViXG4iLGhTZXJ2ZXIpOwogICAgIHJldHVybiBPTEVfT0s7CiB9CiAKZGlmZiAtLWdpdCBhL29sZS9zdG9yYWdlLmMgYi9vbGUvc3RvcmFnZS5jCmluZGV4IDA2ZDY3YTguLjMzNzdmNzkgMTAwNjQ0Ci0tLSBhL29sZS9zdG9yYWdlLmMKKysrIGIvb2xlL3N0b3JhZ2UuYwpAQCAtNTg2LDcgKzU4Niw3IEBACiAJY2hhciAgICB4cmVmaWlkWzUwXTsKIAogCVdJTkVfU3RyaW5nRnJvbUNMU0lEKChMUENMU0lEKXJlZmlpZCx4cmVmaWlkKTsKLQlkcHJpbnRmX2luZm8ocmVsYXksIklTdHJlYW0xNiglcCktPlF1ZXJ5SW50ZXJmYWNlKCVzLCVwKVxuIix0aGlzLHhyZWZpaWQsb2JqKTsKKwlUUkFDRShyZWxheSwiKCVwKS0+UXVlcnlJbnRlcmZhY2UoJXMsJXApXG4iLHRoaXMseHJlZmlpZCxvYmopOwogCWlmICghbWVtY21wKCZJSURfSVVua25vd24scmVmaWlkLHNpemVvZihJSURfSVVua25vd24pKSkgewogCQkqb2JqID0gdGhpczsKIAkJcmV0dXJuIDA7CkBAIC02MTQsNyArNjE0LDcgQEAKIEhSRVNVTFQgV0lOQVBJIElTdHJlYW0xNl9TZWVrKAogCUxQU1RSRUFNMTYgdGhpcyxMQVJHRV9JTlRFR0VSIG9mZnNldCxEV09SRCB3aGVuY2UsVUxBUkdFX0lOVEVHRVIgKm5ld3BvcwogKSB7Ci0JZHByaW50Zl9pbmZvKHJlbGF5LCJJU3RyZWFtMTYoJXApLT5TZWVrKFslbGQuJWxkXSwlbGQsJXApXG4iLHRoaXMsb2Zmc2V0LkhpZ2hQYXJ0LG9mZnNldC5Mb3dQYXJ0LHdoZW5jZSxuZXdwb3MpOworCVRSQUNFKHJlbGF5LCIoJXApLT5TZWVrKFslbGQuJWxkXSwlbGQsJXApXG4iLHRoaXMsb2Zmc2V0LkhpZ2hQYXJ0LG9mZnNldC5Mb3dQYXJ0LHdoZW5jZSxuZXdwb3MpOwogCiAJc3dpdGNoICh3aGVuY2UpIHsKIAkvKiB1bml4IFNFRUtfeHggc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHdpbjk1IG9uZXMgKi8KQEAgLTY1OCw3ICs2NTgsNyBAQAogCVVMT05HCSpieXRlc3JlYWQ9cGNiUmVhZCx4eHJlYWQ7CiAJaW50CWJsb2NrbnI7CiAKLQlkcHJpbnRmX2luZm8ocmVsYXksIklTdHJlYW0xNiglcCktPlJlYWQoJXAsJWxkLCVwKVxuIix0aGlzLHB2LGNiLHBjYlJlYWQpOworCVRSQUNFKHJlbGF5LCIoJXApLT5SZWFkKCVwLCVsZCwlcClcbiIsdGhpcyxwdixjYixwY2JSZWFkKTsKIAlpZiAoIXBjYlJlYWQpIGJ5dGVzcmVhZD0meHhyZWFkOwogCSpieXRlc3JlYWQgPSAwOwogCkBAIC03MTksNyArNzE5LDcgQEAKIAlpZiAoIXBjYldyaXRlKSBieXRlc3dyaXR0ZW49Jnh4d3JpdHRlbjsKIAkqYnl0ZXN3cml0dGVuID0gMDsKIAotCWRwcmludGZfaW5mbyhyZWxheSwiSVN0cmVhbTE2KCVwKS0+V3JpdGUoJXAsJWxkLCVwKVxuIix0aGlzLHB2LGNiLHBjYldyaXRlKTsKKwlUUkFDRShyZWxheSwiKCVwKS0+V3JpdGUoJXAsJWxkLCVwKVxuIix0aGlzLHB2LGNiLHBjYldyaXRlKTsKIAkvKiBkbyB3ZSBuZWVkIHRvIGp1bmsgc29tZSBibG9ja3M/ICovCiAJbmV3c2l6ZQk9IHRoaXMtPm9mZnNldC5Mb3dQYXJ0K2NiOwogCW9sZHNpemUJPSB0aGlzLT5zdGRlLnBwc19zaXplOwpAQCAtMTAyOSw3ICsxMDI5LDcgQEAKIAljaGFyICAgIHhyZWZpaWRbNTBdOwogCiAJV0lORV9TdHJpbmdGcm9tQ0xTSUQoKExQQ0xTSUQpcmVmaWlkLHhyZWZpaWQpOwotCWRwcmludGZfaW5mbyhyZWxheSwiSVN0cmVhbTE2KCVwKS0+UXVlcnlJbnRlcmZhY2UoJXMsJXApXG4iLHRoaXMseHJlZmlpZCxvYmopOworCVRSQUNFKHJlbGF5LCIoJXApLT5RdWVyeUludGVyZmFjZSglcywlcClcbiIsdGhpcyx4cmVmaWlkLG9iaik7CiAJaWYgKCFtZW1jbXAoJklJRF9JVW5rbm93bixyZWZpaWQsc2l6ZW9mKElJRF9JVW5rbm93bikpKSB7CiAJCSpvYmogPSB0aGlzOwogCQlyZXR1cm4gMDsKQEAgLTEwNzYsNyArMTA3Niw3IEBACiAJY2hhciAgICB4cmVmaWlkWzUwXTsKIAogCVdJTkVfU3RyaW5nRnJvbUNMU0lEKChMUENMU0lEKXJlZmlpZCx4cmVmaWlkKTsKLQlkcHJpbnRmX2luZm8ocmVsYXksIklTdG9yYWdlMTYoJXApLT5RdWVyeUludGVyZmFjZSglcywlcClcbiIsdGhpcyx4cmVmaWlkLG9iaik7CisJVFJBQ0UocmVsYXksIiglcCktPlF1ZXJ5SW50ZXJmYWNlKCVzLCVwKVxuIix0aGlzLHhyZWZpaWQsb2JqKTsKIAogCWlmICghbWVtY21wKCZJSURfSVVua25vd24scmVmaWlkLHNpemVvZihJSURfSVVua25vd24pKSkgewogCQkqb2JqID0gdGhpczsKQEAgLTEyNTIsNyArMTI1Miw3IEBACiAJV0NIQVIJCW5hbWVbMzNdOwogCWludAkJbmV3cHBzOwogCi0JZHByaW50Zl9pbmZvKHJlbGF5LCJJU3RvcmFnZTE2KCVwKS0+T3BlblN0b3JhZ2UoJXMsJXAsMHglMDhseCwlcCwweCUwOGx4LCVwKVxuIiwKKwlUUkFDRShyZWxheSwiKCVwKS0+T3BlblN0b3JhZ2UoJXMsJXAsMHglMDhseCwlcCwweCUwOGx4LCVwKVxuIiwKIAkJdGhpcyxwd2NzTmFtZSxwc3RnUHJpbyxncmZNb2RlLHNuYkV4Y2x1ZGUscmVzZXJ2ZWQscHBzdGcKIAkpOwogCWlmIChncmZNb2RlICYgU1RHTV9UUkFOU0FDVEVEKQpAQCAtMTI4Miw3ICsxMjgyLDcgQEAKIAlXQ0hBUgkJbmFtZVszM107CiAJaW50CQluZXdwcHM7CiAKLQlkcHJpbnRmX2luZm8ocmVsYXksIklTdG9yYWdlMTYoJXApLT5PcGVuU3RyZWFtKCVzLCVwLDB4JTA4bHgsMHglMDhseCwlcClcbiIsCisJVFJBQ0UocmVsYXksIiglcCktPk9wZW5TdHJlYW0oJXMsJXAsMHglMDhseCwweCUwOGx4LCVwKVxuIiwKIAkJdGhpcyxwd2NzTmFtZSxyZXNlcnZlZDEsZ3JmTW9kZSxyZXNlcnZlZDIscHBzdG0KIAkpOwogCWlmIChncmZNb2RlICYgU1RHTV9UUkFOU0FDVEVEKQpAQCAtMTM3OCw3ICsxMzc4LDcgQEAKIAljaGFyICAgIHhyZWZpaWRbNTBdOwogCiAJV0lORV9TdHJpbmdGcm9tQ0xTSUQoKExQQ0xTSUQpcmVmaWlkLHhyZWZpaWQpOwotCWRwcmludGZfaW5mbyhyZWxheSwiSVN0b3JhZ2UzMiglcCktPlF1ZXJ5SW50ZXJmYWNlKCVzLCVwKVxuIix0aGlzLHhyZWZpaWQsb2JqKTsKKwlUUkFDRShyZWxheSwiKCVwKS0+UXVlcnlJbnRlcmZhY2UoJXMsJXApXG4iLHRoaXMseHJlZmlpZCxvYmopOwogCiAJaWYgKCFtZW1jbXAoJklJRF9JVW5rbm93bixyZWZpaWQsc2l6ZW9mKElJRF9JVW5rbm93bikpKSB7CiAJCSpvYmogPSB0aGlzOwpkaWZmIC0tZ2l0IGEvb2xlL3R5cGVsaWIuYyBiL29sZS90eXBlbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZjZDcyYwotLS0gL2Rldi9udWxsCisrKyBiL29sZS90eXBlbGliLmMKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqCVRZUEVMSUIKKyAqCisgKglDb3B5cmlnaHQgMTk5NwlNYXJjdXMgTWVpc3NuZXIKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSAid2ludHlwZXMuaCIKKyNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAid2luZXJyb3IuaCIKKyNpbmNsdWRlICJvbGUuaCIKKyNpbmNsdWRlICJvbGUyLmgiCisjaW5jbHVkZSAiY29tcG9iai5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisKK0hSRVNVTFQgV0lOQVBJCitRdWVyeVBhdGhPZlJlZ1R5cGVMaWIoUkVGR1VJRCBndWlkLFdPUkQgd01haiwgV09SRCB3TWluLCBMQ0lEIGxjaWQsTFBTVFIgcGF0aCkgCit7CisJY2hhcgl4Z3VpZFs4MF07CisKKwlpZiAoSElXT1JEKGd1aWQpKQorCQlXSU5FX1N0cmluZ0Zyb21DTFNJRChndWlkLHhndWlkKTsKKwllbHNlCisJCXNwcmludGYoeGd1aWQsIjxndWlkIDB4JTA4bHg+IixndWlkKTsKKwlmcHJpbnRmKHN0ZGVyciwiUXVlcnlQYXRoT2ZSZWdUeXBlTGliKCVzLCVkLCVkLDB4JTA0eCwlcCksc3R1YiFcbiIsCisJCXhndWlkLHdNYWosd01pbixsY2lkLHBhdGgKKwkpOworCXJldHVybiBFX0ZBSUw7Cit9CmRpZmYgLS1naXQgYS9wcm9ncmFtcy9jbG9jay9DaGFuZ2VMb2cgYi9wcm9ncmFtcy9jbG9jay9DaGFuZ2VMb2cKaW5kZXggY2UxMGI0Zi4uNWQ5Yzc5MSAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvY2xvY2svQ2hhbmdlTG9nCisrKyBiL3Byb2dyYW1zL2Nsb2NrL0NoYW5nZUxvZwpAQCAtMSwzICsxLDcgQEAKK1dlZCBNYXIgMTEgMjM6MTA6MzcgMTk5OCAgS2FybCBCYWNrc3Ry9m0gPGthcmxfYkBnZW9jaXRpZXMuY29tPgorICAgICAgICogW21haW4uY10KKwkgU3RhcnRlZCB3aXRoIHRoZSBkaWdpdGFsIGNsb2NrLgorCiBUdWUgRmViIDI0IDIzOjI2OjQwIDE5OTggIEthcmwgQmFja3N0cvZtIDxrYXJsX2JAZ2VvY2l0aWVzLmNvbT4KICAgICAgICAqIFtsYW5ndWFnZS5jXSBbbGFuZ3VhZ2UuaF0gTkVXCiAJIE1vdmVkIGxhbmd1YWdlIHN0dWZmIGhlcmUuCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9jbG9jay9sYW5ndWFnZS5jIGIvcHJvZ3JhbXMvY2xvY2svbGFuZ3VhZ2UuYwppbmRleCAzMDc0ZjBkLi5jNTY4M2Q2IDEwMDY0NAotLS0gYS9wcm9ncmFtcy9jbG9jay9sYW5ndWFnZS5jCisrKyBiL3Byb2dyYW1zL2Nsb2NrL2xhbmd1YWdlLmMKQEAgLTE1LDMxICsxNSwzMSBAQAogCiBDSEFSIFNUUklOR19NRU5VX1h4W10gICAgICA9ICJNRU5VX1h4IjsKIAotc3RhdGljIEJPT0wgTEFOR1VBR0VfTG9hZFN0cmluZ090aGVyTGFuZ3VhZ2UoVUlOVCBudW0sIFVJTlQgaWRzLCBMUFNUUiBzdHIsIFVJTlQgbGVuKQorc3RhdGljIEJPT0wgTEFOR1VBR0VfTG9hZFN0cmluZ090aGVyKFVJTlQgbnVtLCBVSU5UIGlkcywgTFBTVFIgc3RyLCBVSU5UIGxlbikKIHsKICAgaWRzIC09IEdsb2JhbHMud1N0cmluZ1RhYmxlT2Zmc2V0OwogICBpZHMgKz0gbnVtICogMHgxMDA7CiAgIHJldHVybihMb2FkU3RyaW5nKEdsb2JhbHMuaEluc3RhbmNlLCBpZHMsIHN0ciwgbGVuKSk7CiB9OwogCi1WT0lEIExBTkdVQUdFX1NlbGVjdExhbmd1YWdlQnlOYW1lKExQQ1NUUiBsYW5nKQorVk9JRCBMQU5HVUFHRV9TZWxlY3RCeU5hbWUoTFBDU1RSIGxhbmcpCiB7CiAgIElOVCBpOwogICBDSEFSIG5ld2xhbmdbM107CiAKICAgZm9yIChpID0gMDsgaSA8PSBNQVhfTEFOR1VBR0VfTlVNQkVSOyBpKyspCi0gICAgaWYgKExBTkdVQUdFX0xvYWRTdHJpbmdPdGhlckxhbmd1YWdlKGksIElEU19MQU5HVUFHRV9JRCwgbmV3bGFuZywgc2l6ZW9mKG5ld2xhbmcpKSAmJgorICAgIGlmIChMQU5HVUFHRV9Mb2FkU3RyaW5nT3RoZXIoaSwgSURTX0xBTkdVQUdFX0lELCBuZXdsYW5nLCBzaXplb2YobmV3bGFuZykpICYmCiAJIWxzdHJjbXAobGFuZywgbmV3bGFuZykpCiAgICAgICB7Ci0gICAgICAgIExBTkdVQUdFX1NlbGVjdExhbmd1YWdlQnlOdW1iZXIoaSk7CisgICAgICAgIExBTkdVQUdFX1NlbGVjdEJ5TnVtYmVyKGkpOwogCXJldHVybjsKICAgICAgIH0KIAogICAvKiBGYWxsYmFjayAqLwogICAgIGZvciAoaSA9IDA7IGkgPD0gTUFYX0xBTkdVQUdFX05VTUJFUjsgaSsrKQotICAgIGlmIChMQU5HVUFHRV9Mb2FkU3RyaW5nT3RoZXJMYW5ndWFnZShpLCBJRFNfTEFOR1VBR0VfSUQsIG5ld2xhbmcsIHNpemVvZihuZXdsYW5nKSkpCisgICAgaWYgKExBTkdVQUdFX0xvYWRTdHJpbmdPdGhlcihpLCBJRFNfTEFOR1VBR0VfSUQsIG5ld2xhbmcsIHNpemVvZihuZXdsYW5nKSkpCiAgICAgICB7Ci0JTEFOR1VBR0VfU2VsZWN0TGFuZ3VhZ2VCeU51bWJlcihpKTsKKwlMQU5HVUFHRV9TZWxlY3RCeU51bWJlcihpKTsKIAlyZXR1cm47CiAgICAgICB9CiAKQEAgLTQ3LDcgKzQ3LDcgQEAKICAgUG9zdFF1aXRNZXNzYWdlKDEpOwogfQogCi1WT0lEIExBTkdVQUdFX1NlbGVjdExhbmd1YWdlQnlOdW1iZXIoVUlOVCBudW0pCitWT0lEIExBTkdVQUdFX1NlbGVjdEJ5TnVtYmVyKFVJTlQgbnVtKQogewogICBJTlQgICAgaTsKICAgQ0hBUiAgIGxhbmdbM107CkBAIC02MSw3ICs2MSw2IEBACiAgIC8qIEdldCBMYW5ndWFnZSBpZCAqLwogICBMb2FkU3RyaW5nKEdsb2JhbHMuaEluc3RhbmNlLCBJRFNfTEFOR1VBR0VfSUQsIGxhbmcsIHNpemVvZihsYW5nKSk7CiAgIEdsb2JhbHMubHBzekxhbmd1YWdlID0gbGFuZzsKLSAgcHJpbnRmKCIgR2xvYmFscy5scHN6TGFuZ3VhZ2U6ICVzXG4iLCBHbG9iYWxzLmxwc3pMYW5ndWFnZSk7CiAKICAgLyogU2V0IGZyYW1lIGNhcHRpb24gKi8KICAgTG9hZFN0cmluZyhHbG9iYWxzLmhJbnN0YW5jZSwgSURTX0NMT0NLLCBjYXB0aW9uLCBzaXplb2YoY2FwdGlvbikpOwpAQCAtODAsNyArNzksNyBAQAogICBSZW1vdmVNZW51KEdsb2JhbHMuaExhbmd1YWdlTWVudSwgMCwgTUZfQllQT1NJVElPTik7CiAgIC8qIEFkZCBsYW5ndWFnZSBpdGVtcyAqLwogICBmb3IgKGkgPSAwOyBpIDw9IE1BWF9MQU5HVUFHRV9OVU1CRVI7IGkrKykKLSAgICBpZiAoTEFOR1VBR0VfTG9hZFN0cmluZ090aGVyTGFuZ3VhZ2UoaSwgSURTX0xBTkdVQUdFX01FTlVfSVRFTSwgaXRlbSwgc2l6ZW9mKGl0ZW0pKSkKKyAgICBpZiAoTEFOR1VBR0VfTG9hZFN0cmluZ090aGVyKGksIElEU19MQU5HVUFHRV9NRU5VX0lURU0sIGl0ZW0sIHNpemVvZihpdGVtKSkpCiAgICAgICBBcHBlbmRNZW51KEdsb2JhbHMuaExhbmd1YWdlTWVudSwgTUZfU1RSSU5HIHwgTUZfQllDT01NQU5ELAogCQkgQ0xfRklSU1RfTEFOR1VBR0UgKyBpLCBpdGVtKTsKIApAQCAtMTAzLDYgKzEwMiw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgIE1GX0JZQ09NTUFORCB8IE1GX0NIRUNLRUQpOwogICAgICAgICBDaGVja01lbnVJdGVtKEdsb2JhbHMuaFByb3BlcnRpZXNNZW51LCBDTF9ESUdJVEFMLCBcCiAgICAgICAgICAgICAgICAgICAgICAgIE1GX0JZQ09NTUFORCB8IE1GX1VOQ0hFQ0tFRCk7CisJRW5hYmxlTWVudUl0ZW0oR2xvYmFscy5oUHJvcGVydGllc01lbnUsIENMX0ZPTlQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgTUZfQllDT01NQU5EIHwgTUZfR1JBWUVEKTsKIH0KIGVsc2UgewogCUNoZWNrTWVudUl0ZW0oR2xvYmFscy5oUHJvcGVydGllc01lbnUsIENMX0FOQUxPRywgXApAQCAtMTIwLDI1ICsxMjEsMjkgQEAKIAkgICAgICAgICAgICAgICAgICAgICAoR2xvYmFscy5iRGF0ZSA/IE1GX0NIRUNLRUQgOiBNRl9VTkNIRUNLRUQpKTsKIH0KIAotVk9JRCBMQU5HVUFHRV9EZWZhdWx0TGFuZ3VhZ2VIYW5kbGUoV1BBUkFNIHdQYXJhbSkKK1ZPSUQgTEFOR1VBR0VfRGVmYXVsdEhhbmRsZShXUEFSQU0gd1BhcmFtKQogewogICBpZiAoKHdQYXJhbSA+PUNMX0ZJUlNUX0xBTkdVQUdFKSAmJiAod1BhcmFtPD1DTF9MQVNUX0xBTkdVQUdFKSkKLSAgICAgICAgICBMQU5HVUFHRV9TZWxlY3RMYW5ndWFnZUJ5TnVtYmVyKHdQYXJhbSAtIENMX0ZJUlNUX0xBTkdVQUdFKTsKKyAgICAgICAgICBMQU5HVUFHRV9TZWxlY3RCeU51bWJlcih3UGFyYW0gLSBDTF9GSVJTVF9MQU5HVUFHRSk7CiAgICAgIGVsc2UgcHJpbnRmKCJVbmltcGxlbWVudGVkIG1lbnUgY29tbWFuZCAlaVxuIiwgd1BhcmFtKTsKIH0KIAotVk9JRCBMQU5HVUFHRV9Jbml0TGFuZ3VhZ2UoVk9JRCkKK1ZPSUQgTEFOR1VBR0VfSW5pdChWT0lEKQogewogICAjaWZkZWYgV0lORUxJQgogICAgR2xvYmFscy5scHN6TGFuZ3VhZ2UgPSBMYW5ndWFnZXNbT3B0aW9ucy5sYW5ndWFnZV0ubmFtZTsKLSAgI2Vsc2UKLSAgQ0hBUiBidWZmZXJbTUFYX1BBVEhOQU1FX0xFTl0sICpwOwotCi0gICAgUFJPRklMRV9HZXRXaW5lSW5pU3RyaW5nKCJwcm9ncmFtcyIsICJsYW5ndWFnZSIsICJsYW5ndWFnZSIsIAorICAjZW5kaWYKKy8vICAjZWxzZQorICBwcmludGYoIkdsb2JhbHMubHBzekxhbmd1YWdlID09ICVzXG4iLCBHbG9iYWxzLmxwc3pMYW5ndWFnZSk7CisgIGlmIChHbG9iYWxzLmxwc3pMYW5ndWFnZSA9PSAiRW4iKSB7CisgICAgQ0hBUiBidWZmZXJbTUFYX1BBVEhOQU1FX0xFTl0sICpwOworICAgIHByaW50ZigiTXV1XG4iKTsKKyAgICBQUk9GSUxFX0dldFdpbmVJbmlTdHJpbmcoInByb2dyYW1zIiwgImxhbmd1YWdlIiwgIkVuIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOwogICBHbG9iYWxzLmxwc3pMYW5ndWFnZSA9IHAgPSBMb2NhbExvY2soTG9jYWxBbGxvYyhMTUVNX0ZJWEVELCBsc3RybGVuKGJ1ZmZlcikpKTsKLSAgaG1lbWNweShwLCBidWZmZXIsIDEgKyBsc3RybGVuKGJ1ZmZlcikpOwotICAjZW5kaWYKKyAgaG1lbWNweShwLCBidWZmZXIsIDEgKyBsc3RybGVuKGJ1ZmZlcikpOyB9CisvLyAgI2VuZGlmCisvLyAgaWYgKCFHbG9iYWxzLmxwc3pMYW5ndWFnZSkgR2xvYmFscy5scHN6TGFuZ3VhZ2UgPSAiRW4iOwogfQogCiAvKiBMb2NhbCBWYXJpYWJsZXM6ICAgICovCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9jbG9jay9sYW5ndWFnZS5oIGIvcHJvZ3JhbXMvY2xvY2svbGFuZ3VhZ2UuaAppbmRleCA3MGE3NDUyLi4yN2Q1YzQ4IDEwMDY0NAotLS0gYS9wcm9ncmFtcy9jbG9jay9sYW5ndWFnZS5oCisrKyBiL3Byb2dyYW1zL2Nsb2NrL2xhbmd1YWdlLmgKQEAgLTUsMTAgKzUsMTAgQEAKICAqIENvcHlyaWdodCAxOTk4IEthcmwgQmFja3N0cvZtIDxrYXJsX2JAZ2VvY2l0aWVzLmNvbT4KICAqLwogCi1WT0lEIExBTkdVQUdFX1NlbGVjdExhbmd1YWdlQnlOdW1iZXIoVUlOVCBudW0pOwotVk9JRCBMQU5HVUFHRV9TZWxlY3RMYW5ndWFnZUJ5TmFtZShMUENTVFIgbGFuZyk7Ci1WT0lEIExBTkdVQUdFX0RlZmF1bHRMYW5ndWFnZUhhbmRsZShXUEFSQU0gd1BhcmFtKTsKLVZPSUQgTEFOR1VBR0VfSW5pdExhbmd1YWdlKFZPSUQpOworVk9JRCBMQU5HVUFHRV9TZWxlY3RCeU51bWJlcihVSU5UIG51bSk7CitWT0lEIExBTkdVQUdFX1NlbGVjdEJ5TmFtZShMUENTVFIgbGFuZyk7CitWT0lEIExBTkdVQUdFX0RlZmF1bHRIYW5kbGUoV1BBUkFNIHdQYXJhbSk7CitWT0lEIExBTkdVQUdFX0luaXQoVk9JRCk7CiAKIC8qIExvY2FsIFZhcmlhYmxlczogICAgKi8KIC8qIGMtZmlsZS1zdHlsZTogIkdOVSIgKi8KZGlmZiAtLWdpdCBhL3Byb2dyYW1zL2Nsb2NrL21haW4uYyBiL3Byb2dyYW1zL2Nsb2NrL21haW4uYwppbmRleCAzM2JhNjQzLi43ZGY2MDAyIDEwMDY0NAotLS0gYS9wcm9ncmFtcy9jbG9jay9tYWluLmMKKysrIGIvcHJvZ3JhbXMvY2xvY2svbWFpbi5jCkBAIC0xNiw3ICsxNiw3IEBACiAjaW5jbHVkZSAidmVyc2lvbi5oIgogI2luY2x1ZGUgImxhbmd1YWdlLmgiCiAjaW5jbHVkZSAid2luY2xvY2suaCIKLS8vICNpbmNsdWRlICJjb21tZGxnLmgiCisjaW5jbHVkZSAiY29tbWRsZy5oIgogCiAjaWZkZWYgV0lORUxJQgogICAgI2luY2x1ZGUgIm9wdGlvbnMuaCIKQEAgLTM4LDYgKzM4LDcgQEAKIAogaW50IENMT0NLX01lbnVDb21tYW5kIChXUEFSQU0gd1BhcmFtKQogeyAgCisgICBDSEFSICAgY2FwdGlvbltNQVhfU1RSSU5HX0xFTl07CiAgICBzd2l0Y2ggKHdQYXJhbSkgewogICAgICBjYXNlIENMX0FOQUxPRzogewogICAgICAgICAgR2xvYmFscy5iQW5hbG9nID0gVFJVRTsKQEAgLTQ1LDYgKzQ2LDkgQEAKIAkgICAgICAgICAgICAgICBNRl9CWUNPTU1BTkQgfCBNRl9DSEVDS0VEKTsKIAkgQ2hlY2tNZW51SXRlbShHbG9iYWxzLmhQcm9wZXJ0aWVzTWVudSwgQ0xfRElHSVRBTCwgXAogCSAgICAgICAgICAgICAgIE1GX0JZQ09NTUFORCB8IE1GX1VOQ0hFQ0tFRCk7CisJIEVuYWJsZU1lbnVJdGVtKEdsb2JhbHMuaFByb3BlcnRpZXNNZW51LCBDTF9GT05ULCBcCisgICAgICAgICAgICAgICAgICAgICAgIE1GX0JZQ09NTUFORCB8IE1GX0dSQVlFRCk7CisJIFNlbmRNZXNzYWdlKEdsb2JhbHMuaE1haW5XbmQsIFdNX1BBSU5ULCAwLCAwKTsKIAkgYnJlYWs7CSAgICAgCiAgICAgICAgfSAKICAgICAgY2FzZSBDTF9ESUdJVEFMOiB7CkBAIC01MywzNSArNTcsMjIgQEAKIAkgICAgICAgICAgICAgICBNRl9CWUNPTU1BTkQgfCBNRl9VTkNIRUNLRUQpOwogCSBDaGVja01lbnVJdGVtKEdsb2JhbHMuaFByb3BlcnRpZXNNZW51LCBDTF9ESUdJVEFMLCBcCiAJICAgICAgICAgICAgICAgTUZfQllDT01NQU5EIHwgTUZfQ0hFQ0tFRCk7CisJIEVuYWJsZU1lbnVJdGVtKEdsb2JhbHMuaFByb3BlcnRpZXNNZW51LCBDTF9GT05ULCBcCisgICAgICAgICAgICAgICAgICAgICAgIE1GX0JZQ09NTUFORCB8IE1GX0VOQUJMRUQpOworCSBTZW5kTWVzc2FnZShHbG9iYWxzLmhNYWluV25kLCBXTV9QQUlOVCwgMCwgMCk7CiAJIGJyZWFrOwkgICAgICAgCiAgICAgICAgfQogICAgICBjYXNlIENMX0ZPTlQ6Ci0gICAgICAgcHJpbnRmKCJGT05UOiIpOwotLyoJQ0hPT1NFRk9OVCBmb250bDsKLQlmb250bC5sU3RydWN0U2l6ZQk9IDA7Ci0gICAgICAgIGZvbnRsLmh3bmRPd25lcgkJPSBHbG9iYWxzLmhNYWluV25kOwotICAgICAgICBmb250bC5oREMJCT0gTlVMTDsKLSAgICAgICAgZm9udGwubHBMb2dGb250ICAJPSAwOwotICAgICAgICBmb250bC5pUG9pbnRTaXplCSAgIAk9IDA7Ci0gICAgICAgIGZvbnRsLkZsYWdzCQk9IDA7Ci0gICAgICAgIGZvbnRsLnJnYkNvbG9ycwkJPSAwOwotICAgICAgICBmb250bC5sQ3VzdERhdGEJCT0gMDsKLSAgICAgICAgZm9udGwubHBmbkhvb2sJCT0gMDsKLSAgICAgICAgZm9udGwubHBUZW1wbGF0ZU5hbWUJPSAwOwotICAgICAgICBmb250bC5oSW5zdGFuY2UJCT0gR2xvYmFscy5oSW5zdGFuY2U7Ci0gICAgICAgIGZvbnRsLmxwc3pTdHlsZQkJPSAwOwotICAgICAgICBmb250bC5uRm9udFR5cGUJCT0gMDsKLSAgICAgICAgZm9udGwublNpemVNaW4JCT0gMDsKLSAgICAgICAgZm9udGwublNpemVNYXgJCT0gMTAwOwotCi0JaWYgKENob29zZUZvbnQoJmZvbnQpKTsgCi0qLworCU1BSU5fRmlsZUNob29zZUZvbnQoKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBDTF9XSVRIT1VUX1RJVExFOgogICAgICAgIEdsb2JhbHMuYldpdGhvdXRUaXRsZSA9ICFHbG9iYWxzLmJXaXRob3V0VGl0bGU7CiAgICAgICAgQ2hlY2tNZW51SXRlbShHbG9iYWxzLmhQcm9wZXJ0aWVzTWVudSwgQ0xfV0lUSE9VVF9USVRMRSwgTUZfQllDT01NQU5EIHwgXAogICAgICAgICAgICAgICAgICAgICAgKEdsb2JhbHMuYldpdGhvdXRUaXRsZSA/IE1GX0NIRUNLRUQgOiBNRl9VTkNIRUNLRUQpKTsKLSAgICAgICBwcmludGYoIk5PIFRJVExFOiIpOworCVNldE1lbnUoR2xvYmFscy5oTWFpblduZCwgTlVMTCk7CisgIAlTZXRXaW5kb3dUZXh0KEdsb2JhbHMuaE1haW5XbmQsIE5VTEwpOworICAgIAlVcGRhdGVXaW5kb3cgKEdsb2JhbHMuaE1haW5XbmQpOworICAgICAgICBwcmludGYoIk5PIFRJVExFOiIpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIENMX09OX1RPUDoKICAgICAgICBHbG9iYWxzLmJBbHdheXNPblRvcCA9ICFHbG9iYWxzLmJBbHdheXNPblRvcDsKQEAgLTkyLDExICs4MywzNCBAQAogICAgICAgIEdsb2JhbHMuYlNlY29uZHMgPSAhR2xvYmFscy5iU2Vjb25kczsKICAgICAgICBDaGVja01lbnVJdGVtKEdsb2JhbHMuaFByb3BlcnRpZXNNZW51LCBDTF9TRUNPTkRTLCBNRl9CWUNPTU1BTkQgfCBcCiAgICAgICAgICAgICAgICAgICAgICAoR2xvYmFscy5iU2Vjb25kcyA/IE1GX0NIRUNLRUQgOiBNRl9VTkNIRUNLRUQpKTsKKyAgICAgICBTZW5kTWVzc2FnZShHbG9iYWxzLmhNYWluV25kLCBXTV9QQUlOVCwgMCwgMCk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQ0xfREFURToKICAgICAgICBHbG9iYWxzLmJEYXRlID0gIUdsb2JhbHMuYkRhdGU7CiAgICAgICAgQ2hlY2tNZW51SXRlbShHbG9iYWxzLmhQcm9wZXJ0aWVzTWVudSwgQ0xfREFURSwgTUZfQllDT01NQU5EIHwgXAogICAgICAgICAgICAgICAgICAgICAgKEdsb2JhbHMuYkRhdGUgPyBNRl9DSEVDS0VEIDogTUZfVU5DSEVDS0VEKSk7CisgICAgICAgTG9hZFN0cmluZyhHbG9iYWxzLmhJbnN0YW5jZSwgSURTX0NMT0NLLCBjYXB0aW9uLCBzaXplb2YoY2FwdGlvbikpOworICAgICAgIGlmIChHbG9iYWxzLmJEYXRlKQorICAgICAgIHsKKwkgaWYgKEdsb2JhbHMuYkFuYWxvZykKKwkgeworCSAgIC8qIEZJWE1FOiBBZGQgZGF0ZSB0byBjYXB0aW9uICovCisJICAgU2V0V2luZG93VGV4dChHbG9iYWxzLmhNYWluV25kLCBjYXB0aW9uKTsKKwkgfQorCSBlbHNlCisJIHsKKwkgfQorICAgICAgIH0KKyAgICAgICBlbHNlIAorICAgICAgIHsKKwkgaWYgKEdsb2JhbHMuYkFuYWxvZykKKyAgICAgICAgIHsKKyAgICAgICAgICAgU2V0V2luZG93VGV4dChHbG9iYWxzLmhNYWluV25kLCBjYXB0aW9uKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgIH0KKyAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQ0xfSU5GT19MSUNFTlNFOgogICAgICAgIFdpbmVMaWNlbnNlKEdsb2JhbHMuaE1haW5XbmQsIEdsb2JhbHMubHBzekxhbmd1YWdlKTsKQEAgLTEwOSwxMiArMTIzLDMzIEBACiAgICAgIGJyZWFrOwogICAgICAvLyBIYW5kbGUgbGFuZ3VhZ2VzCiAgICAgIGRlZmF1bHQ6Ci0gICAgICAgTEFOR1VBR0VfRGVmYXVsdExhbmd1YWdlSGFuZGxlKHdQYXJhbSk7IAorICAgICAgIExBTkdVQUdFX0RlZmF1bHRIYW5kbGUod1BhcmFtKTsgCiAgICB9CiAgICByZXR1cm4gMDsKIH0KIAorVk9JRCBNQUlOX0ZpbGVDaG9vc2VGb250KFZPSUQpIHsKIAorICBDSE9PU0VGT05UIGZvbnQ7CisgICAgICAgIGZvbnQubFN0cnVjdFNpemUgICAgICAgPSAwOworICAgICAgICBmb250Lmh3bmRPd25lciAgICAgICAgID0gR2xvYmFscy5oTWFpblduZDsKKyAgICAgICAgZm9udC5oREMgICAgICAgICAgICAgICA9IE5VTEw7CisgICAgICAgIGZvbnQubHBMb2dGb250ICAgICAgICAgPSAwOworICAgICAgICBmb250LmlQb2ludFNpemUgICAgICAgID0gMDsKKyAgICAgICAgZm9udC5GbGFncyAgICAgICAgICAgICA9IDA7CisgICAgICAgIGZvbnQucmdiQ29sb3JzICAgICAgICAgPSAwOworICAgICAgICBmb250LmxDdXN0RGF0YSAgICAgICAgID0gMDsKKyAgICAgICAgZm9udC5scGZuSG9vayAgICAgICAgICA9IDA7CisgICAgICAgIGZvbnQubHBUZW1wbGF0ZU5hbWUgICAgPSAwOworICAgICAgICBmb250LmhJbnN0YW5jZSAgICAgICAgID0gR2xvYmFscy5oSW5zdGFuY2U7CisgICAgICAgIGZvbnQubHBzelN0eWxlICAgICAgICAgPSBMRl9GQUNFU0laRTsKKyAgICAgICAgZm9udC5uRm9udFR5cGUgICAgICAgICA9IDA7CisgICAgICAgIGZvbnQublNpemVNaW4gICAgICAgICAgPSAwOworICAgICAgICBmb250Lm5TaXplTWF4ICAgICAgICAgID0gMDsKKworICAgICAgICBpZiAoQ2hvb3NlRm9udCgmZm9udCkpOworCit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTEyNSw2ICsxNjAsNyBAQAogewogICAgIFBBSU5UU1RSVUNUIHBzOwogICAgIEhEQyBjb250ZXh0OworICAgIENIQVIgICBjYXB0aW9uW01BWF9TVFJJTkdfTEVOXTsKIAogICAgIHN3aXRjaCAobXNnKSB7CiAKQEAgLTEzNCw2ICsxNzAsMTMgQEAKIAogICAgICAgICBjYXNlIFdNX1JCVVRUT05VUDoKIAkgIHByaW50ZigiV01fUkJVVFRPTlVQXG4iKTsKKwlHbG9iYWxzLmJXaXRob3V0VGl0bGUgPSAhR2xvYmFscy5iV2l0aG91dFRpdGxlOworCVNldE1lbnUoR2xvYmFscy5oTWFpblduZCwgR2xvYmFscy5oTWFpbk1lbnUpOworICAgICAgICBVcGRhdGVXaW5kb3cgKEdsb2JhbHMuaE1haW5XbmQpOworCUNoZWNrTWVudUl0ZW0oR2xvYmFscy5oUHJvcGVydGllc01lbnUsIENMX1dJVEhPVVRfVElUTEUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgTUZfQllDT01NQU5EIHwgTUZfVU5DSEVDS0VEKTsKKwlMb2FkU3RyaW5nKEdsb2JhbHMuaEluc3RhbmNlLCBJRFNfQ0xPQ0ssIGNhcHRpb24sIHNpemVvZihjYXB0aW9uKSk7CisgICAgICAgIFNldFdpbmRvd1RleHQoR2xvYmFscy5oTWFpblduZCwgY2FwdGlvbik7CiAJYnJlYWs7CiAKIAljYXNlIFdNX1BBSU5UOgpAQCAtMjA1LDE0ICsyNDgsMTMgQEAKICAgICBwcmludGYoIldpbk1haW4oKVxuIik7CiAgICAgCiAgICAgLyogU2V0dXAgR2xvYmFscyAqLwotCiAgICAgR2xvYmFscy5iQW5hbG9nCSAgPSBUUlVFOwogICAgIEdsb2JhbHMuYlNlY29uZHMgICAgICA9IFRSVUU7CiAgICAgR2xvYmFscy5scHN6SW5pRmlsZSAgID0gImNsb2NrLmluaSI7CiAgICAgR2xvYmFscy5scHN6SWNvRmlsZSAgID0gImNsb2NrLmljbyI7CiAKICAgLyogU2VsZWN0IExhbmd1YWdlICovCi0gICAgTEFOR1VBR0VfSW5pdExhbmd1YWdlKCk7CisgICAgTEFOR1VBR0VfSW5pdCgpOwogCiAgICAgR2xvYmFscy5oSW5zdGFuY2UgICAgID0gaEluc3RhbmNlOwogICAgIEdsb2JhbHMuaE1haW5JY29uICAgICA9IEV4dHJhY3RJY29uKEdsb2JhbHMuaEluc3RhbmNlLCAKQEAgLTI0Miw4ICsyODQsMTkgQEAKIAkJCUxvYWRNZW51KEdsb2JhbHMuaEluc3RhbmNlLCBTVFJJTkdfTUVOVV9YeCksCiAJCQlHbG9iYWxzLmhJbnN0YW5jZSwgMCk7CiAJCQkKLSAgICBMQU5HVUFHRV9TZWxlY3RMYW5ndWFnZUJ5TmFtZShHbG9iYWxzLmxwc3pMYW5ndWFnZSk7CisgICAgTEFOR1VBR0VfU2VsZWN0QnlOYW1lKEdsb2JhbHMubHBzekxhbmd1YWdlKTsKICAgICBTZXRNZW51KEdsb2JhbHMuaE1haW5XbmQsIEdsb2JhbHMuaE1haW5NZW51KTsKKworLy8gICAgR2xvYmFscy5oUG9wdXBNZW51MSA9IENyZWF0ZVBvcHVwTWVudSgpOworLy8gICAgR2xvYmFscy5oU3lzdGVtTWVudSA9IEdldFN5c3RlbU1lbnUoR2xvYmFscy5oTWFpblduZCwgVFJVRSk7CisvLyAgICBwcmludGYoIiVpIiwgR2xvYmFscy5oU3lzdGVtTWVudSk7CisgICAgCisgICAgQXBwZW5kTWVudShHbG9iYWxzLmhTeXN0ZW1NZW51LCBNRl9TVFJJTkcgfCBNRl9CWUNPTU1BTkQsCisgICAgICAgICAgICAgICAgIDEwMDAsICJpdGVtIik7CisgICAgU2V0U3lzdGVtTWVudShHbG9iYWxzLmhNYWluV25kLCBHbG9iYWxzLmhTeXN0ZW1NZW51KTsKKworICAgIEVuYWJsZU1lbnVJdGVtKEdsb2JhbHMuaFByb3BlcnRpZXNNZW51LCBDTF9GT05ULCBcCisgICAgICAgICAgICAgICAgICAgIE1GX0JZQ09NTUFORCB8IE1GX0dSQVlFRCk7CiAgICAgU2hvd1dpbmRvdyAoR2xvYmFscy5oTWFpblduZCwgc2hvdyk7CiAgICAgVXBkYXRlV2luZG93IChHbG9iYWxzLmhNYWluV25kKTsKIApkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvY2xvY2svbWFpbi5oIGIvcHJvZ3JhbXMvY2xvY2svbWFpbi5oCmluZGV4IDYzNzQxYzkuLjZlZmFmNzcgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL2Nsb2NrL21haW4uaAorKysgYi9wcm9ncmFtcy9jbG9jay9tYWluLmgKQEAgLTI0LDYgKzI0LDggQEAKICAgSE1FTlUgICBoUHJvcGVydGllc01lbnU7CiAgIEhNRU5VICAgaExhbmd1YWdlTWVudTsKICAgSE1FTlUgICBoSW5mb01lbnU7CisgIEhNRU5VICAgaFN5c3RlbU1lbnU7CisgIEhNRU5VICAgaFBvcHVwTWVudTE7CiAgIExQQ1NUUiAgbHBzekluaUZpbGU7CiAgIExQQ1NUUiAgbHBzekljb0ZpbGU7CiAgIExQQ1NUUiAgbHBzekxhbmd1YWdlOwpAQCAtNDIsOCArNDQsNyBAQAogZXh0ZXJuIENMT0NLX0dMT0JBTFMgR2xvYmFsczsKIAogLyogZnVuY3Rpb24gcHJvdG90eXBlcyAqLwotVk9JRCBNQUlOX1NlbGVjdExhbmd1YWdlQnlOYW1lKExQQ1NUUik7Ci1WT0lEIE1BSU5fU2VsZWN0TGFuZ3VhZ2VCeU51bWJlcihVSU5UKTsKK1ZPSUQgTUFJTl9GaWxlQ2hvb3NlRm9udChWT0lEKTsKIAogLyogY2xhc3MgbmFtZXMgKi8KIApkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvY2xvY2svd2luY2xvY2suYyBiL3Byb2dyYW1zL2Nsb2NrL3dpbmNsb2NrLmMKaW5kZXggNGU3YWY1Zi4uNWVjNjBlNyAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvY2xvY2svd2luY2xvY2suYworKysgYi9wcm9ncmFtcy9jbG9jay93aW5jbG9jay5jCkBAIC0xNjAsNiArMTYwLDggQEAKIHZvaWQgSWRsZShIREMgaWRjKQogewogICBTWVNURU1USU1FIHN0OworICBURVhUTUVUUklDIHRtOworICBzdGF0aWMgc2hvcnQgeENoYXIsIHlDaGFyOwogICBXT1JEIEgsIE0sIFMsIEY7CiAgIGludCBNaWRYLCBNaWRZLCBEaWZmWCwgRGlmZlk7CiAgIEhEQyBkYzsKQEAgLTE5MSwxNCArMTkzLDIyIEBACiAgIGlmKFVwZGF0ZVNlY29uZEhhbmQoZGMsTWlkWCtEaWZmWCxNaWRZK0RpZmZZLE1pZFgqMC43OSxNaWRZKjAuNzksRikpIFJlZHJhdyA9IFRSVUU7CiAgIGlmIChHbG9iYWxzLmJBbmFsb2cpCiAgIHsKLSAgRGVsZXRlT2JqZWN0KFNlbGVjdE9iamVjdChkYyxDcmVhdGVQZW4oUFNfU09MSUQsMSxIYW5kQ29sb3IpKSk7Ci0gICAgaWYoUmVkcmF3KQotICAgIHsKLSAgICAgIERyYXdTZWNvbmRIYW5kKGRjKTsKLSAgICAgIERyYXdNaW51dGVIYW5kKGRjKTsKLSAgICAgIERyYXdIb3VySGFuZChkYyk7Ci0gICAgfQotICBEZWxldGVPYmplY3QoU2VsZWN0T2JqZWN0KGRjLEdldFN0b2NrT2JqZWN0KE5VTExfUEVOKSkpOyAKKyAgICBEZWxldGVPYmplY3QoU2VsZWN0T2JqZWN0KGRjLENyZWF0ZVBlbihQU19TT0xJRCwxLEhhbmRDb2xvcikpKTsKKyAgICAgIGlmKFJlZHJhdykKKyAgICAgIHsKKyAgICAgICAgRHJhd1NlY29uZEhhbmQoZGMpOworICAgICAgICBEcmF3TWludXRlSGFuZChkYyk7CisgICAgICAgIERyYXdIb3VySGFuZChkYyk7CisgICAgICB9CisgICAgRGVsZXRlT2JqZWN0KFNlbGVjdE9iamVjdChkYyxHZXRTdG9ja09iamVjdChOVUxMX1BFTikpKTsgCisgIH0KKyAgZWxzZSAKKyAgeworICAgIFNlbGVjdE9iamVjdChkYyxDcmVhdGVQZW4oUFNfU09MSUQsMSxGYWNlQ29sb3IpKTsKKyAgICB4Q2hhciA9IHRtLnRtQXZlQ2hhcldpZHRoOworICAgIHlDaGFyID0gdG0udG1IZWlnaHQ7CisgICAgVGV4dE91dCAoZGMsIHhDaGFyLCB5Q2hhciwgIkhvbGEiLCBzdHJsZW4gKCJIb2xhIikpOyAKKyAgICBEZWxldGVPYmplY3QoU2VsZWN0T2JqZWN0KGRjLEdldFN0b2NrT2JqZWN0KE5VTExfUEVOKSkpOwogICB9CiAgIGlmKCFpZGMpIFJlbGVhc2VEQyhHbG9iYWxzLmhNYWluV25kLGRjKTsKIH0KZGlmZiAtLWdpdCBhL3Byb2dyYW1zL25vdGVwYWQvQ2hhbmdlTG9nIGIvcHJvZ3JhbXMvbm90ZXBhZC9DaGFuZ2VMb2cKaW5kZXggYjkzODVjNi4uNzEwMDIyZCAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvbm90ZXBhZC9DaGFuZ2VMb2cKKysrIGIvcHJvZ3JhbXMvbm90ZXBhZC9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxMSBAQAorRnJpIEZlYiAyNyAyMTowMzozNyAxOTk4ICBLYXJsIEJhY2tzdHL2bSA8a2FybF9iQGdlb2NpdGllcy5jb20+CisJKiBGaXhlZCBzb21lIG1pbm9yIGZlYXR1cmVzLgorCitTYXQgRmViIDE0IDE3OjQyOjI5IDE5OTggIEthcmwgQmFja3N0cvZtIDxrYXJsX2JAZ2VvY2l0aWVzLmNvbT4KKyAgICAgICAgKiBORVcgW2xhbmd1YWdlLmNdIFtsYW5ndWFnZS5oXQorCVRha2VzIGNhcmUgb2YgYWxsIGxhbmd1YWdlIHJlbGF0ZWQgc3R1ZmYuCisJQSBuZXcgW3Byb2dyYW1zXSBpbiAud2luZXJjIGlzIGluIHVzZS4KKwogVHVlIEZlYiAxMCAyMzozNDowOCAxOTk4ICBNYXJjZWwgQmF1ciA8bWJhdXJAZzI2LmV0aHouY2g+CiAgICAgICAgICogRml4ZWQgYnJva2VuIGxhbmd1YWdlIG1lbnVzCiAKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL25vdGVwYWQvRGUucmMgYi9wcm9ncmFtcy9ub3RlcGFkL0RlLnJjCmluZGV4IDU0NGZkYWEuLmY0MDkyMzMgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL25vdGVwYWQvRGUucmMKKysrIGIvcHJvZ3JhbXMvbm90ZXBhZC9EZS5yYwpAQCAtNTcsNyArNTcsNyBAQAogI2RlZmluZSBESUFMT0dfUEFHRVNFVFVQX0NBUFRJT04gICAgICJTZWl0ZSBlaW5yaWNodGVuIgogI2RlZmluZSBESUFMT0dfUEFHRVNFVFVQX0hFQUQgICAgICAgICImS29wZnplaWxlOiIKICNkZWZpbmUgRElBTE9HX1BBR0VTRVRVUF9UQUlMICAgICAgICAiJkZ133plaWxlOiIKLSNkZWZpbmUgRElBTE9HX1BBR0VTRVRVUF9CT1JERVIgICAgICAiUuRuZGVyIgorI2RlZmluZSBESUFMT0dfUEFHRVNFVFVQX01BUkdJTiAgICAgICJS5G5kZXIiCiAjZGVmaW5lIERJQUxPR19QQUdFU0VUVVBfTEVGVCAgICAgICAgIiZMaW5rczoiCiAjZGVmaW5lIERJQUxPR19QQUdFU0VUVVBfUklHSFQgICAgICAgIiZSZWNodHM6IgogI2RlZmluZSBESUFMT0dfUEFHRVNFVFVQX1RPUCAgICAgICAgICImT2JlbjoiCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9ub3RlcGFkL0VuLnJjIGIvcHJvZ3JhbXMvbm90ZXBhZC9Fbi5yYwppbmRleCA4OGI0Y2VmLi4wOWJiNzlhIDEwMDY0NAotLS0gYS9wcm9ncmFtcy9ub3RlcGFkL0VuLnJjCisrKyBiL3Byb2dyYW1zL25vdGVwYWQvRW4ucmMKQEAgLTU3LDcgKzU3LDcgQEAKICNkZWZpbmUgRElBTE9HX1BBR0VTRVRVUF9DQVBUSU9OICAgICAiUGFnZSBTZXR1cCIKICNkZWZpbmUgRElBTE9HX1BBR0VTRVRVUF9IRUFEICAgICAgICAiJkhlYWRlcjoiCiAjZGVmaW5lIERJQUxPR19QQUdFU0VUVVBfVEFJTCAgICAgICAgIiZGb290ZXI6IgotI2RlZmluZSBESUFMT0dfUEFHRVNFVFVQX0JPUkRFUiAgICAgICImTWFyZ2luczoiCisjZGVmaW5lIERJQUxPR19QQUdFU0VUVVBfTUFSR0lOICAgICAgIiZNYXJnaW5zOiIKICNkZWZpbmUgRElBTE9HX1BBR0VTRVRVUF9MRUZUICAgICAgICAiJkxlZnQ6IgogI2RlZmluZSBESUFMT0dfUEFHRVNFVFVQX1JJR0hUICAgICAgICImUmlnaHQ6IgogI2RlZmluZSBESUFMT0dfUEFHRVNFVFVQX1RPUCAgICAgICAgICImVG9wOiIKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL25vdGVwYWQvTWFrZWZpbGUuaW4gYi9wcm9ncmFtcy9ub3RlcGFkL01ha2VmaWxlLmluCmluZGV4IDdjYjhmYWUuLmZhOTQ1YWQgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL25vdGVwYWQvTWFrZWZpbGUuaW4KKysrIGIvcHJvZ3JhbXMvbm90ZXBhZC9NYWtlZmlsZS5pbgpAQCAtMTQsNyArMTQsOCBAQAogTU9TVFNSQ1MgPSBcCiAJbGljZW5zZS5jIFwKIAltYWluLmMgXAotCWRpYWxvZy5jCisJZGlhbG9nLmMgXAorCWxhbmd1YWdlLmMKIAogIyBTb21lIHN0cmluZ3MgbmVlZCBhZGRyZXNzZXMgPj0gMHgxMDAwMAogU1RSSU5HU1JDUyA9IFwKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL25vdGVwYWQvU3cucmMgYi9wcm9ncmFtcy9ub3RlcGFkL1N3LnJjCmluZGV4IDE4YzQ0YTAuLmFhMzU0OGIgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL25vdGVwYWQvU3cucmMKKysrIGIvcHJvZ3JhbXMvbm90ZXBhZC9Tdy5yYwpAQCAtNTcsNyArNTcsNyBAQAogI2RlZmluZSBESUFMT0dfUEFHRVNFVFVQX0NBUFRJT04gICAgICJTaWQgTGF5b3V0IgogI2RlZmluZSBESUFMT0dfUEFHRVNFVFVQX0hFQUQgICAgICAgICImSHV2dWRub3Q6IgogI2RlZmluZSBESUFMT0dfUEFHRVNFVFVQX1RBSUwgICAgICAgICImRm90bm90OiIKLSNkZWZpbmUgRElBTE9HX1BBR0VTRVRVUF9CT1JERVIgICAgICAiS2FudGVyOiIKKyNkZWZpbmUgRElBTE9HX1BBR0VTRVRVUF9NQVJHSU4gICAgICAiS2FudGVyOiIKICNkZWZpbmUgRElBTE9HX1BBR0VTRVRVUF9MRUZUICAgICAgICAiJlbkbnN0ZXI6IgogI2RlZmluZSBESUFMT0dfUEFHRVNFVFVQX1JJR0hUICAgICAgICImSPZnZXI6IgogI2RlZmluZSBESUFMT0dfUEFHRVNFVFVQX1RPUCAgICAgICAgICIm1nZlcjoiCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9ub3RlcGFkL2RpYWxvZy5jIGIvcHJvZ3JhbXMvbm90ZXBhZC9kaWFsb2cuYwppbmRleCAzNjE2N2Q5Li5jZGU5YTZiIDEwMDY0NAotLS0gYS9wcm9ncmFtcy9ub3RlcGFkL2RpYWxvZy5jCisrKyBiL3Byb2dyYW1zL25vdGVwYWQvZGlhbG9nLmMKQEAgLTY0LDcgKzY0LDkgQEAKIAkgIG9wZW5maWxlbmFtZS5scGZuSG9vayAgICAgICAgICA9IDA7CiAgCSAgb3BlbmZpbGVuYW1lLmxwVGVtcGxhdGVOYW1lICAgID0gMDsKIAotICAJICBpZiAoR2V0T3BlbkZpbGVOYW1lKCZvcGVuZmlsZW5hbWUpKTsKKyAgCSAgaWYgKEdldE9wZW5GaWxlTmFtZSgmb3BlbmZpbGVuYW1lKSkgeworCSAgcHJpbnRmKCJPcGVuZmlsZTogJXNcbiIsIG9wZW5maWxlbmFtZS5scHN0ckZpbGUpOworCSAgfQogfQogCiBWT0lEIERJQUxPR19GaWxlU2F2ZShWT0lEKQpAQCAtMTg5LDcgKzE5MSw3IEBACiAKIFZPSUQgRElBTE9HX0VkaXRUaW1lRGF0ZShWT0lEKQogewotICBmcHJpbnRmKHN0ZGVyciwgIkVkaXRUaW1lRGF0ZSgpXG4iKTsKKyAgRElBTE9HX1RpbWVEYXRlKCk7ICAgCiB9CiAKIFZPSUQgRElBTE9HX0VkaXRXcmFwKFZPSUQpCkBAIC0yNDQsMTcgKzI0NiwxNCBAQAogCiBWT0lEIERJQUxPR19IZWxwTm9XYXJyYW50eShWT0lEKQogewotICBwcmludGYoIk5QX0FCT1VUX05PX1dBUlJBTlRZXG4iKTsKICAgICAgICAgV2luZVdhcnJhbnR5KEdsb2JhbHMuaE1haW5XbmQsIEdsb2JhbHMubHBzekxhbmd1YWdlKTsKIH0KIAogVk9JRCBESUFMT0dfSGVscEFib3V0V2luZShWT0lEKQogewotICBwcmludGYoIk5QX0FCT1VUX1dJTkVcbiIpOwogICBTaGVsbEFib3V0KEdsb2JhbHMuaE1haW5XbmQsICJOb3RlcGFkIiwgIk5vdGVwYWRcbiIgV0lORV9SRUxFQVNFX0lORk8sIDApOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqICAgICAgICAgICBESUFMT0dfUGFnZVNldHVwCkBAIC0yNjgsNiArMjY3LDI1IEBACiAgIEZyZWVQcm9jSW5zdGFuY2UobHBmbkRsZyk7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICAgICAgICBESUFMT0dfVGltZURhdGUKKyAqLworCitWT0lEIERJQUxPR19UaW1lRGF0ZShWT0lEKQoreworICBTWVNURU1USU1FIHN0OworICAgaW50IEgsIE1pbiwgWSwgTSwgRDsKKyAgIEdldExvY2FsVGltZSgmc3QpOworICAgSCA9IHN0LndIb3VyOyBNaW4gPSBzdC53TWludXRlOyBZICA9IHN0LndZZWFyOyBNID0gc3Qud01vbnRoOyBEID0gc3Qud0RheTsKKyAgIHByaW50ZigiVGltZURhdGU9JWk6IiwgSCk7CisgICBpZiAoTWluIDwgMTApIHByaW50ZigiMCIpOworICAgcHJpbnRmKCIlaSAgJWkvIiwgTWluLCBZKTsKKyAgIGlmIChNIDwgMTApIHByaW50ZigiMCIpOworICAgcHJpbnRmKCIlaS8iLCBNKTsKKyAgIGlmIChEIDwgMTApIHByaW50ZigiMCIpOworICAgcHJpbnRmKCIlaVxuIiwgRCk7Cit9CiAKIC8qICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKgogICoKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL25vdGVwYWQvZGlhbG9nLmggYi9wcm9ncmFtcy9ub3RlcGFkL2RpYWxvZy5oCmluZGV4IDQ3NDkxYjQuLjRkNjg5ZjYgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL25vdGVwYWQvZGlhbG9nLmgKKysrIGIvcHJvZ3JhbXMvbm90ZXBhZC9kaWFsb2cuaApAQCAtMzUsNiArMzUsNyBAQAogVk9JRCBESUFMT0dfSGVscEFib3V0V2luZShWT0lEKTsKIAogVk9JRCBESUFMT0dfUGFnZVNldHVwKFZPSUQpOworVk9JRCBESUFMT0dfVGltZURhdGUoVk9JRCk7CiAKIC8qIExvY2FsIFZhcmlhYmxlczogICAgKi8KIC8qIGMtZmlsZS1zdHlsZTogIkdOVSIgKi8KZGlmZiAtLWdpdCBhL3Byb2dyYW1zL25vdGVwYWQvbGFuZ3VhZ2UuYyBiL3Byb2dyYW1zL25vdGVwYWQvbGFuZ3VhZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWYxNzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3JhbXMvbm90ZXBhZC9sYW5ndWFnZS5jCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogTm90ZXBhZAorICoKKyAqIENvcHlyaWdodCAxOTk3IE1hcmNlbCBCYXVyIDxtYmF1ckBnMjYuZXRoei5jaD4KKyAqIENvcHlyaWdodCAxOTk4IEthcmwgQmFja3N0cvZtIDxrYXJsX2JAZ2VvY2l0aWVzLmNvbT4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgImxhbmd1YWdlLmgiCisjaWZkZWYgV0lORUxJQgorI2luY2x1ZGUgIm9wdGlvbnMuaCIKKyNlbmRpZgorCitDSEFSIFNUUklOR19NRU5VX1h4W10gICAgICA9ICJNRU5VX1h4IjsKK0NIQVIgU1RSSU5HX1BBR0VTRVRVUF9YeFtdID0gIkRJQUxPR19QQUdFU0VUVVBfWHgiOworCitzdGF0aWMgQk9PTCBMQU5HVUFHRV9Mb2FkU3RyaW5nT3RoZXIoVUlOVCBudW0sIFVJTlQgaWRzLCBMUFNUUiBzdHIsIFVJTlQgbGVuKQoreworICBpZHMgLT0gR2xvYmFscy53U3RyaW5nVGFibGVPZmZzZXQ7CisgIGlkcyArPSBudW0gKiAweDEwMDsKKyAgcmV0dXJuKExvYWRTdHJpbmcoR2xvYmFscy5oSW5zdGFuY2UsIGlkcywgc3RyLCBsZW4pKTsKK307CisKK1ZPSUQgTEFOR1VBR0VfU2VsZWN0QnlOYW1lKExQQ1NUUiBsYW5nKQoreworICBJTlQgaTsKKyAgQ0hBUiBuZXdsYW5nWzNdOworCisgIGZvciAoaSA9IDA7IGkgPD0gTUFYX0xBTkdVQUdFX05VTUJFUjsgaSsrKQorICAgIGlmIChMQU5HVUFHRV9Mb2FkU3RyaW5nT3RoZXIoaSwgSURTX0xBTkdVQUdFX0lELCBuZXdsYW5nLCBzaXplb2YobmV3bGFuZykpICYmCisJIWxzdHJjbXAobGFuZywgbmV3bGFuZykpCisgICAgICB7CisgICAgICAgIExBTkdVQUdFX1NlbGVjdEJ5TnVtYmVyKGkpOworCXJldHVybjsKKyAgICAgIH0KKworICAvKiBGYWxsYmFjayAqLworICAgIGZvciAoaSA9IDA7IGkgPD0gTUFYX0xBTkdVQUdFX05VTUJFUjsgaSsrKQorICAgIGlmIChMQU5HVUFHRV9Mb2FkU3RyaW5nT3RoZXIoaSwgSURTX0xBTkdVQUdFX0lELCBuZXdsYW5nLCBzaXplb2YobmV3bGFuZykpKQorICAgICAgeworCUxBTkdVQUdFX1NlbGVjdEJ5TnVtYmVyKGkpOworCXJldHVybjsKKyAgICAgIH0KKworICBNZXNzYWdlQm94KEdsb2JhbHMuaE1haW5XbmQsICJObyBsYW5ndWFnZSBmb3VuZCIsICJGQVRBTCBFUlJPUiIsIE1CX09LKTsKKyAgUG9zdFF1aXRNZXNzYWdlKDEpOworfQorCitWT0lEIExBTkdVQUdFX1NlbGVjdEJ5TnVtYmVyKFVJTlQgbnVtKQoreworICBJTlQgICAgaTsKKyAgQ0hBUiAgIGxhbmdbM107CisgIENIQVIgICBjYXB0aW9uW01BWF9TVFJJTkdfTEVOXTsKKyAgQ0hBUiAgIGl0ZW1bTUFYX1NUUklOR19MRU5dOworICBITUVOVSAgaE1haW5NZW51OworCisgIC8qIFNlbGVjdCBzdHJpbmcgdGFibGUgKi8KKyAgR2xvYmFscy53U3RyaW5nVGFibGVPZmZzZXQgPSBudW0gKiAweDEwMDsKKworICAvKiBHZXQgTGFuZ3VhZ2UgaWQgKi8KKyAgTG9hZFN0cmluZyhHbG9iYWxzLmhJbnN0YW5jZSwgSURTX0xBTkdVQUdFX0lELCBsYW5nLCBzaXplb2YobGFuZykpOworICBHbG9iYWxzLmxwc3pMYW5ndWFnZSA9IGxhbmc7CisKKyAgLyogU2V0IGZyYW1lIGNhcHRpb24gKi8KKyAgTG9hZFN0cmluZyhHbG9iYWxzLmhJbnN0YW5jZSwgSURTX05PVEVQQUQsIGNhcHRpb24sIHNpemVvZihjYXB0aW9uKSk7CisgIFNldFdpbmRvd1RleHQoR2xvYmFscy5oTWFpblduZCwgY2FwdGlvbik7CisKKyAgLyogQ2hhbmdlIFJlc291cmNlIG5hbWVzICovCisgIGxzdHJjcHluKFNUUklOR19NRU5VX1h4ICAgICsgc2l6ZW9mKFNUUklOR19NRU5VX1h4KSAgICAtIDMsIGxhbmcsIDMpOworICBsc3RyY3B5bihTVFJJTkdfUEFHRVNFVFVQX1h4ICAgICsgc2l6ZW9mKFNUUklOR19QQUdFU0VUVVBfWHgpICAgIC0gMywgbGFuZywgMyk7CisKKyAgLyogQ3JlYXRlIG1lbnUgKi8KKyAgaE1haW5NZW51ID0gTG9hZE1lbnUoR2xvYmFscy5oSW5zdGFuY2UsIFNUUklOR19NRU5VX1h4KTsKKyAgICBHbG9iYWxzLmhGaWxlTWVudSAgICAgPSBHZXRTdWJNZW51KGhNYWluTWVudSwgMCk7CisgICAgR2xvYmFscy5oRWRpdE1lbnUgICAgID0gR2V0U3ViTWVudShoTWFpbk1lbnUsIDEpOworICAgIEdsb2JhbHMuaFNlYXJjaE1lbnUgICA9IEdldFN1Yk1lbnUoaE1haW5NZW51LCAyKTsKKyAgICBHbG9iYWxzLmhMYW5ndWFnZU1lbnUgPSBHZXRTdWJNZW51KGhNYWluTWVudSwgMyk7CisgICAgR2xvYmFscy5oSGVscE1lbnUgICAgID0gR2V0U3ViTWVudShoTWFpbk1lbnUsIDQpOworCisgIC8qIFJlbW92ZSBkdW1teSBpdGVtICovCisgIFJlbW92ZU1lbnUoR2xvYmFscy5oTGFuZ3VhZ2VNZW51LCAwLCBNRl9CWVBPU0lUSU9OKTsKKyAgLyogQWRkIGxhbmd1YWdlIGl0ZW1zICovCisgIGZvciAoaSA9IDA7IGkgPD0gTUFYX0xBTkdVQUdFX05VTUJFUjsgaSsrKQorICAgIGlmIChMQU5HVUFHRV9Mb2FkU3RyaW5nT3RoZXIoaSwgSURTX0xBTkdVQUdFX01FTlVfSVRFTSwgaXRlbSwgc2l6ZW9mKGl0ZW0pKSkKKyAgICAgIEFwcGVuZE1lbnUoR2xvYmFscy5oTGFuZ3VhZ2VNZW51LCBNRl9TVFJJTkcgfCBNRl9CWUNPTU1BTkQsCisJCSBOUF9GSVJTVF9MQU5HVUFHRSArIGksIGl0ZW0pOworCisgIFNldE1lbnUoR2xvYmFscy5oTWFpblduZCwgaE1haW5NZW51KTsKKworICAvKiBEZXN0cm95IG9sZCBtZW51ICovCisgIGlmIChHbG9iYWxzLmhNYWluTWVudSkgRGVzdHJveU1lbnUoR2xvYmFscy5oTWFpbk1lbnUpOworICBHbG9iYWxzLmhNYWluTWVudSA9IGhNYWluTWVudTsKKworI2lmZGVmIFdJTkVMSUIKKyAgLyogVXBkYXRlIHN5c3RlbSBtZW51cyAqLworICBmb3IgKGkgPSAwOyBMYW5ndWFnZXNbaV0ubmFtZSAmJiBsc3RyY21wKGxhbmcsIExhbmd1YWdlc1tpXS5uYW1lKTspIGkrKzsKKyAgaWYgKExhbmd1YWdlc1tpXS5uYW1lKSBPcHRpb25zLmxhbmd1YWdlID0gaTsKKworI2VuZGlmCit9CisKK1ZPSUQgTEFOR1VBR0VfRGVmYXVsdEhhbmRsZShXUEFSQU0gd1BhcmFtKQoreworICBpZiAoKHdQYXJhbSA+PU5QX0ZJUlNUX0xBTkdVQUdFKSAmJiAod1BhcmFtPD1OUF9MQVNUX0xBTkdVQUdFKSkKKyAgICAgICAgICBMQU5HVUFHRV9TZWxlY3RCeU51bWJlcih3UGFyYW0gLSBOUF9GSVJTVF9MQU5HVUFHRSk7CisgICAgIGVsc2UgcHJpbnRmKCJVbmltcGxlbWVudGVkIG1lbnUgY29tbWFuZCAlaVxuIiwgd1BhcmFtKTsKK30KKworVk9JRCBMQU5HVUFHRV9Jbml0KFZPSUQpCit7CisgICNpZmRlZiBXSU5FTElCCisgICBHbG9iYWxzLmxwc3pMYW5ndWFnZSA9IExhbmd1YWdlc1tPcHRpb25zLmxhbmd1YWdlXS5uYW1lOworICAjZWxzZQorICBDSEFSIGJ1ZmZlcltNQVhfUEFUSE5BTUVfTEVOXSwgKnA7CisKKyAgICBQUk9GSUxFX0dldFdpbmVJbmlTdHJpbmcoInByb2dyYW1zIiwgImxhbmd1YWdlIiwgImxhbmd1YWdlIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworICBHbG9iYWxzLmxwc3pMYW5ndWFnZSA9IHAgPSBMb2NhbExvY2soTG9jYWxBbGxvYyhMTUVNX0ZJWEVELCBsc3RybGVuKGJ1ZmZlcikpKTsKKyAgaG1lbWNweShwLCBidWZmZXIsIDEgKyBsc3RybGVuKGJ1ZmZlcikpOworICAjZW5kaWYKK30KKworLyogTG9jYWwgVmFyaWFibGVzOiAgICAqLworLyogYy1maWxlLXN0eWxlOiAiR05VIiAqLworLyogRW5kOiAgICAgICAgICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvbm90ZXBhZC9sYW5ndWFnZS5oIGIvcHJvZ3JhbXMvbm90ZXBhZC9sYW5ndWFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0OGM0ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncmFtcy9ub3RlcGFkL2xhbmd1YWdlLmgKQEAgLTAsMCArMSwxNSBAQAorLyoKKyAqIE5vdGVwYWQKKyAqCisgKiBDb3B5cmlnaHQgMTk5NyBNYXJjZWwgQmF1ciA8bWJhdXJAZzI2LmV0aHouY2g+CisgKiBDb3B5cmlnaHQgMTk5OCBLYXJsIEJhY2tzdHL2bSA8a2FybF9iQGdlb2NpdGllcy5jb20+CisgKi8KKworVk9JRCBMQU5HVUFHRV9TZWxlY3RCeU51bWJlcihVSU5UIG51bSk7CitWT0lEIExBTkdVQUdFX1NlbGVjdEJ5TmFtZShMUENTVFIgbGFuZyk7CitWT0lEIExBTkdVQUdFX0RlZmF1bHRIYW5kbGUoV1BBUkFNIHdQYXJhbSk7CitWT0lEIExBTkdVQUdFX0luaXQoVk9JRCk7CisKKy8qIExvY2FsIFZhcmlhYmxlczogICAgKi8KKy8qIGMtZmlsZS1zdHlsZTogIkdOVSIgKi8KKy8qIEVuZDogICAgICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL3Byb2dyYW1zL25vdGVwYWQvbGljZW5zZS5jIGIvcHJvZ3JhbXMvbm90ZXBhZC9saWNlbnNlLmMKaW5kZXggZWVlMzZlMS4uYjEwZjJlMyAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvbm90ZXBhZC9saWNlbnNlLmMKKysrIGIvcHJvZ3JhbXMvbm90ZXBhZC9saWNlbnNlLmMKQEAgLTcsMjEgKzcsMjMgQEAKIAogc3RhdGljIExJQ0VOU0UqIFNlbGVjdExhbmd1YWdlKExQQ1NUUiBMYW5ndWFnZSkKIHsKLS8qICBpZiAoIWxzdHJjbXAoTGFuZ3VhZ2UsICJDeiIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0N6KTsgKi8KLS8qICBpZiAoIWxzdHJjbXAoTGFuZ3VhZ2UsICJEYSIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0RhKTsgKi8KLS8qICBpZiAoIWxzdHJjbXAoTGFuZ3VhZ2UsICJEZSIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0RlKTsgKi8KLS8qICBpZiAoIWxzdHJjbXAoTGFuZ3VhZ2UsICJFbiIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0VuKTsgKi8KLS8qICBpZiAoIWxzdHJjbXAoTGFuZ3VhZ2UsICJFbyIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0VvKTsgKi8KLS8qICBpZiAoIWxzdHJjbXAoTGFuZ3VhZ2UsICJFcyIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0VzKTsgKi8KLS8qICBpZiAoIWxzdHJjbXAoTGFuZ3VhZ2UsICJGaSIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0ZpKTsgKi8KLS8qICBpZiAoIWxzdHJjbXAoTGFuZ3VhZ2UsICJGciIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0ZyKTsgKi8KLS8qICBpZiAoIWxzdHJjbXAoTGFuZ3VhZ2UsICJIdSIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0h1KTsgKi8KLS8qICBpZiAoIWxzdHJjbXAoTGFuZ3VhZ2UsICJJdCIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0l0KTsgKi8KLS8qICBpZiAoIWxzdHJjbXAoTGFuZ2F1Z2UsICJLbyIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0tvKTsgKi8KLS8qICBpZiAoIWxzdHJjbXAoTGFuZ3VhZ2UsICJObyIpKSByZXR1cm4oJldpbmVMaWNlbnNlX05vKTsgKi8KLS8qICBpZiAoIWxzdHJjbXAoTGFuZ3VhZ2UsICJQbCIpKSByZXR1cm4oJldpbmVMaWNlbnNlX1BsKTsgKi8KLS8qICBpZiAoIWxzdHJjbXAoTGFuZ3VhZ2UsICJQbyIpKSByZXR1cm4oJldpbmVMaWNlbnNlX1BvKTsgKi8KLS8qICBpZiAoIWxzdHJjbXAoTGFuZ3VhZ2UsICJWYSIpKSByZXR1cm4oJldpbmVMaWNlbnNlX1ZhKTsgKi8KKy8qICBpZiAobHN0cmNtcChMYW5ndWFnZSwgIkN6IikpIHJldHVybigmV2luZUxpY2Vuc2VfQ3opOyAqLworLyogIGlmIChsc3RyY21wKExhbmd1YWdlLCAiRGEiKSkgcmV0dXJuKCZXaW5lTGljZW5zZV9EYSk7ICovCisvKiAgaWYgKGxzdHJjbXAoTGFuZ3VhZ2UsICJEZSIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0VuKTsgKi8KKy8qICBpZiAobHN0cmNtcChMYW5ndWFnZSwgIkVuIikpIHJldHVybigmV2luZUxpY2Vuc2VfRW4pOyAqLworLyogIGlmIChsc3RyY21wKExhbmd1YWdlLCAiRW8iKSkgcmV0dXJuKCZXaW5lTGljZW5zZV9Fbyk7ICovCisvKiAgaWYgKGxzdHJjbXAoTGFuZ3VhZ2UsICJFcyIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0VzKTsgKi8KKy8qICBpZiAobHN0cmNtcChMYW5ndWFnZSwgIkZpIikpIHJldHVybigmV2luZUxpY2Vuc2VfRmkpOyAqLworLyogIGlmIChsc3RyY21wKExhbmd1YWdlLCAiRnIiKSkgcmV0dXJuKCZXaW5lTGljZW5zZV9Gcik7ICovCisvKiAgaWYgKGxzdHJjbXAoTGFuZ3VhZ2UsICJIdSIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0h1KTsgKi8KKy8qICBpZiAobHN0cmNtcChMYW5ndWFnZSwgIkl0IikpIHJldHVybigmV2luZUxpY2Vuc2VfSXQpOyAqLworLyogIGlmIChsc3RyY21wKExhbmdhdWdlLCAiS28iKSkgcmV0dXJuKCZXaW5lTGljZW5zZV9Lbyk7ICovCisvKiAgaWYgKGxzdHJjbXAoTGFuZ3VhZ2UsICJObyIpKSByZXR1cm4oJldpbmVMaWNlbnNlX05vKTsgKi8KKy8qICBpZiAobHN0cmNtcChMYW5ndWFnZSwgIlBsIikpIHJldHVybigmV2luZUxpY2Vuc2VfUGwpOyAqLworLyogIGlmIChsc3RyY21wKExhbmd1YWdlLCAiUG8iKSkgcmV0dXJuKCZXaW5lTGljZW5zZV9Qbyk7ICovCisvKiAgaWYgKGxzdHJjbXAoTGFuZ3VhZ2UsICJWYSIpKSByZXR1cm4oJldpbmVMaWNlbnNlX1ZhKTsgKi8KKy8qICBpZiAobHN0cmNtcChMYW5ndWFnZSwgIlN3IikpIHJldHVybigmV2luZUxpY2Vuc2VfU3cpOyAqLworLyogIGlmIChsc3RyY21wKExhbmd1YWdlLCAiQ2EiKSkgcmV0dXJuKCZXaW5lTGljZW5zZV9DYSk7ICovCiAgIHJldHVybigmV2luZUxpY2Vuc2VfRW4pOwogfQogCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9ub3RlcGFkL2xpY2Vuc2UuaCBiL3Byb2dyYW1zL25vdGVwYWQvbGljZW5zZS5oCmluZGV4IGM5YTFlOGQuLjVmOTljZGYgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL25vdGVwYWQvbGljZW5zZS5oCisrKyBiL3Byb2dyYW1zL25vdGVwYWQvbGljZW5zZS5oCkBAIC0yNiw0ICsyNiw1IEBACiAvKiBleHRlcm4gTElDRU5TRSBXaW5lTGljZW5zZV9QbDsgKi8KIC8qIGV4dGVybiBMSUNFTlNFIFdpbmVMaWNlbnNlX1BvOyAqLwogLyogZXh0ZXJuIExJQ0VOU0UgV2luZUxpY2Vuc2VfVmE7ICovCi0KKy8qIGV4dGVybiBMSUNFTlNFIFdpbmVMaWNlbnNlX1N3OyAqLworLyogZXh0ZXJuIExJQ0VOU0UgV2luZUxpY2Vuc2VfQ2E7ICovCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9ub3RlcGFkL21haW4uYyBiL3Byb2dyYW1zL25vdGVwYWQvbWFpbi5jCmluZGV4IGRiMTI5MjMuLmE3ZjhjZWEgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL25vdGVwYWQvbWFpbi5jCisrKyBiL3Byb2dyYW1zL25vdGVwYWQvbWFpbi5jCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgIm1haW4uaCIKICNpbmNsdWRlICJsaWNlbnNlLmgiCiAjaW5jbHVkZSAiZGlhbG9nLmgiCisjaW5jbHVkZSAibGFuZ3VhZ2UuaCIKICNpZmRlZiBXSU5FTElCCiAjaW5jbHVkZSAib3B0aW9ucy5oIgogI2luY2x1ZGUgInJlc291cmNlLmgiCkBAIC0yMCwxMzYgKzIxLDYgQEAKIAogTk9URVBBRF9HTE9CQUxTIEdsb2JhbHM7CiAKLUNIQVIgU1RSSU5HX01FTlVfWHhbXSAgICAgID0gIk1FTlVfWHgiOwotQ0hBUiBTVFJJTkdfUEFHRVNFVFVQX1h4W10gPSAiRElBTE9HX1BBR0VTRVRVUF9YeCI7Ci0KLXN0YXRpYyBCT09MIE1BSU5fTG9hZFN0cmluZ090aGVyTGFuZ3VhZ2UoVUlOVCBudW0sIFVJTlQgaWRzLCBMUFNUUiBzdHIsIFVJTlQgbGVuKQotewotICBpZHMgLT0gR2xvYmFscy53U3RyaW5nVGFibGVPZmZzZXQ7Ci0gIGlkcyArPSBudW0gKiAweDEwMDsKLSAgcmV0dXJuKExvYWRTdHJpbmcoR2xvYmFscy5oSW5zdGFuY2UsIGlkcywgc3RyLCBsZW4pKTsKLX07Ci0KLVZPSUQgTUFJTl9TZWxlY3RMYW5ndWFnZUJ5TmFtZShMUENTVFIgbGFuZykKLXsKLSAgSU5UIGk7Ci0gIENIQVIgbmV3bGFuZ1szXTsKLQotICBmb3IgKGkgPSAwOyBpIDw9IE1BWF9MQU5HVUFHRV9OVU1CRVI7IGkrKykKLSAgICBpZiAoTUFJTl9Mb2FkU3RyaW5nT3RoZXJMYW5ndWFnZShpLCBJRFNfTEFOR1VBR0VfSUQsIG5ld2xhbmcsIHNpemVvZihuZXdsYW5nKSkgJiYKLQkhbHN0cmNtcChsYW5nLCBuZXdsYW5nKSkKLSAgICAgIHsKLSAgICAgICAgTUFJTl9TZWxlY3RMYW5ndWFnZUJ5TnVtYmVyKGkpOwotCXJldHVybjsKLSAgICAgIH0KLQotICAvKiBGYWxsYmFjayAqLwotICAgIGZvciAoaSA9IDA7IGkgPD0gTUFYX0xBTkdVQUdFX05VTUJFUjsgaSsrKQotICAgIGlmIChNQUlOX0xvYWRTdHJpbmdPdGhlckxhbmd1YWdlKGksIElEU19MQU5HVUFHRV9JRCwgbmV3bGFuZywgc2l6ZW9mKG5ld2xhbmcpKSkKLSAgICAgIHsKLQlNQUlOX1NlbGVjdExhbmd1YWdlQnlOdW1iZXIoaSk7Ci0JcmV0dXJuOwotICAgICAgfQotCi0gIE1lc3NhZ2VCb3goR2xvYmFscy5oTWFpblduZCwgIk5vIGxhbmd1YWdlIGZvdW5kIiwgIkZBVEFMIEVSUk9SIiwgTUJfT0spOwotICBQb3N0UXVpdE1lc3NhZ2UoMSk7Ci19Ci0KLVZPSUQgTUFJTl9TZWxlY3RMYW5ndWFnZUJ5TnVtYmVyKFVJTlQgbnVtKQotewotICBJTlQgICAgaTsKLSAgQ0hBUiAgIGxhbmdbM107Ci0gIENIQVIgICBjYXB0aW9uW01BWF9TVFJJTkdfTEVOXTsKLSAgQ0hBUiAgIGl0ZW1bTUFYX1NUUklOR19MRU5dOwotICBITUVOVSAgaE1haW5NZW51OwotCi0gIC8qIFNlbGVjdCBzdHJpbmcgdGFibGUgKi8KLSAgR2xvYmFscy53U3RyaW5nVGFibGVPZmZzZXQgPSBudW0gKiAweDEwMDsKLQotICAvKiBHZXQgTGFuZ3VhZ2UgaWQgKi8KLSAgTG9hZFN0cmluZyhHbG9iYWxzLmhJbnN0YW5jZSwgSURTX0xBTkdVQUdFX0lELCBsYW5nLCBzaXplb2YobGFuZykpOwotICBHbG9iYWxzLmxwc3pMYW5ndWFnZSA9IGxhbmc7Ci0KLSAgLyogU2V0IGZyYW1lIGNhcHRpb24gKi8KLSAgTG9hZFN0cmluZyhHbG9iYWxzLmhJbnN0YW5jZSwgSURTX05PVEVQQUQsIGNhcHRpb24sIHNpemVvZihjYXB0aW9uKSk7Ci0gIFNldFdpbmRvd1RleHQoR2xvYmFscy5oTWFpblduZCwgY2FwdGlvbik7Ci0KLSAgLyogQ2hhbmdlIFJlc291cmNlIG5hbWVzICovCi0gIGxzdHJjcHluKFNUUklOR19NRU5VX1h4ICAgICsgc2l6ZW9mKFNUUklOR19NRU5VX1h4KSAgICAtIDMsIGxhbmcsIDMpOwotICBsc3RyY3B5bihTVFJJTkdfUEFHRVNFVFVQX1h4ICAgICsgc2l6ZW9mKFNUUklOR19QQUdFU0VUVVBfWHgpICAgIC0gMywgbGFuZywgMyk7Ci0KLSAgLyogQ3JlYXRlIG1lbnUgKi8KLSAgaE1haW5NZW51ID0gTG9hZE1lbnUoR2xvYmFscy5oSW5zdGFuY2UsIFNUUklOR19NRU5VX1h4KTsKLSAgICBHbG9iYWxzLmhGaWxlTWVudSAgICAgPSBHZXRTdWJNZW51KGhNYWluTWVudSwgMCk7Ci0gICAgR2xvYmFscy5oRWRpdE1lbnUgICAgID0gR2V0U3ViTWVudShoTWFpbk1lbnUsIDEpOwotICAgIEdsb2JhbHMuaFNlYXJjaE1lbnUgICA9IEdldFN1Yk1lbnUoaE1haW5NZW51LCAyKTsKLSAgICBHbG9iYWxzLmhMYW5ndWFnZU1lbnUgPSBHZXRTdWJNZW51KGhNYWluTWVudSwgMyk7Ci0gICAgR2xvYmFscy5oSGVscE1lbnUgICAgID0gR2V0U3ViTWVudShoTWFpbk1lbnUsIDQpOwotCi0gIC8qIFJlbW92ZSBkdW1teSBpdGVtICovCi0gIFJlbW92ZU1lbnUoR2xvYmFscy5oTGFuZ3VhZ2VNZW51LCAwLCBNRl9CWVBPU0lUSU9OKTsKLSAgLyogQWRkIGxhbmd1YWdlIGl0ZW1zICovCi0gIGZvciAoaSA9IDA7IGkgPD0gTUFYX0xBTkdVQUdFX05VTUJFUjsgaSsrKQotICAgIGlmIChNQUlOX0xvYWRTdHJpbmdPdGhlckxhbmd1YWdlKGksIElEU19MQU5HVUFHRV9NRU5VX0lURU0sIGl0ZW0sIHNpemVvZihpdGVtKSkpCi0gICAgICBBcHBlbmRNZW51KEdsb2JhbHMuaExhbmd1YWdlTWVudSwgTUZfU1RSSU5HIHwgTUZfQllDT01NQU5ELAotCQkgTlBfRklSU1RfTEFOR1VBR0UgKyBpLCBpdGVtKTsKLQotICBTZXRNZW51KEdsb2JhbHMuaE1haW5XbmQsIGhNYWluTWVudSk7Ci0KLSAgLyogRGVzdHJveSBvbGQgbWVudSAqLwotICBpZiAoR2xvYmFscy5oTWFpbk1lbnUpIERlc3Ryb3lNZW51KEdsb2JhbHMuaE1haW5NZW51KTsKLSAgR2xvYmFscy5oTWFpbk1lbnUgPSBoTWFpbk1lbnU7Ci0KLSNpZmRlZiBXSU5FTElCCi0gIC8qIFVwZGF0ZSBzeXN0ZW0gbWVudXMgKi8KLSAgZm9yIChpID0gMDsgTGFuZ3VhZ2VzW2ldLm5hbWUgJiYgbHN0cmNtcChsYW5nLCBMYW5ndWFnZXNbaV0ubmFtZSk7KSBpKys7Ci0gIGlmIChMYW5ndWFnZXNbaV0ubmFtZSkgT3B0aW9ucy5sYW5ndWFnZSA9IGk7Ci0KLSNlbmRpZgotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgICAgICAgTk9URVBBRF9SZWdpc3Rlckxhbmd1YWdlcwotICoKLSAqICBIYW5kbGUgbGFuZ3VhZ2Ugc3R1ZmYgYXQgc3RhcnR1cAotICovCi0KLXZvaWQgTk9URVBBRF9SZWdpc3Rlckxhbmd1YWdlcyh2b2lkKSB7Ci0KLSAgTFBDU1RSIG9wdF9sYW5nID0gIkVuIjsKLSAgQ0hBUiBsYW5nWzNdOwotICBJTlQgbGFuZ251bTsKLSAgCi0gLyogRmluZCBsYW5ndWFnZSBzcGVjaWZpYyBzdHJpbmcgdGFibGUgKi8KLSAgZm9yIChsYW5nbnVtID0gMDsgbGFuZ251bSA8PSBNQVhfTEFOR1VBR0VfTlVNQkVSOyBsYW5nbnVtKyspCi0gICAgewotICAgICAgR2xvYmFscy53U3RyaW5nVGFibGVPZmZzZXQgPSBsYW5nbnVtICogMHgxMDA7Ci0gICAgICBpZiAoTG9hZFN0cmluZyhHbG9iYWxzLmhJbnN0YW5jZSwgSURTX0xBTkdVQUdFX0lELCBsYW5nLCAKLSAgICAgICAgICAgIHNpemVvZihsYW5nKSkgJiYgIWxzdHJjbXAob3B0X2xhbmcsIGxhbmcpKQotICAgICAgYnJlYWs7Ci0gICAgfQotICBpZiAobGFuZ251bSA+IE1BWF9MQU5HVUFHRV9OVU1CRVIpCi0gICAgewotICAgICAgLyogRmluZCBmYWxsYmFjayBsYW5ndWFnZSAqLwotICAgICAgZm9yIChsYW5nbnVtID0gMDsgbGFuZ251bSA8PSBNQVhfTEFOR1VBR0VfTlVNQkVSOyBsYW5nbnVtKyspCi0JewotCSAgR2xvYmFscy53U3RyaW5nVGFibGVPZmZzZXQgPSBsYW5nbnVtICogMHgxMDA7Ci0JICBpZiAoTG9hZFN0cmluZyhHbG9iYWxzLmhJbnN0YW5jZSwgSURTX0xBTkdVQUdFX0lELCBsYW5nLCBzaXplb2YobGFuZykpKQotICAgICAgICAgIGJyZWFrOwotCX0KLSAgICAgIGlmIChsYW5nbnVtID4gTUFYX0xBTkdVQUdFX05VTUJFUikKLQl7Ci0JTWVzc2FnZUJveCgwLCAiTm8gbGFuZ3VhZ2UgZm91bmQiLCAiRkFUQUwgRVJST1IiLCBNQl9PSyk7Ci0JUG9zdFF1aXRNZXNzYWdlKDApOwotCX0KLSAgICB9Ci0KLSAgLyogQ2hhbmdlIFJlc291cmNlIG5hbWVzICovCi0gIGxzdHJjcHluKFNUUklOR19NRU5VX1h4ICsgbHN0cmxlbihTVFJJTkdfTUVOVV9YeCkgLSAyLCBsYW5nLCAzKTsKLX0KLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiAgICAgICAgICAgTk9URVBBRF9NZW51Q29tbWFuZApAQCAtMTkyLDkgKzYzLDcgQEAKICAgICAgCiAgICAgIC8vIEhhbmRsZSBsYW5ndWFnZXMKICAgICAgZGVmYXVsdDoKLSAgICAgICBpZiAoKHdQYXJhbSA+PU5QX0ZJUlNUX0xBTkdVQUdFKSAmJiAod1BhcmFtPD1OUF9MQVNUX0xBTkdVQUdFKSkKLSAgICAgICAgICBNQUlOX1NlbGVjdExhbmd1YWdlQnlOdW1iZXIod1BhcmFtIC0gTlBfRklSU1RfTEFOR1VBR0UpOwotICAgICBlbHNlIHByaW50ZigiVW5pbXBsZW1lbnRlZCBtZW51IGNvbW1hbmQgJWlcbiIsIHdQYXJhbSk7ICAKKyAgICAgIExBTkdVQUdFX0RlZmF1bHRIYW5kbGUod1BhcmFtKTsKICAgIH0KICAgIHJldHVybiAwOwogfQpAQCAtMjc4LDExICsxNDcsNyBAQAogICAgIEdsb2JhbHMubHBzekljb0ZpbGUgICA9ICJub3RlcGFkLmljbyI7CiAKICAgLyogU2VsZWN0IExhbmd1YWdlICovCi0jaWZkZWYgV0lORUxJQgotICBHbG9iYWxzLmxwc3pMYW5ndWFnZSA9IExhbmd1YWdlc1tPcHRpb25zLmxhbmd1YWdlXS5uYW1lOwotI2Vsc2UKLSAgR2xvYmFscy5scHN6TGFuZ3VhZ2UgPSAiRW4iOwotI2VuZGlmCisgICAgTEFOR1VBR0VfSW5pdCgpOwogCiAgICAgR2xvYmFscy5oSW5zdGFuY2UgICAgID0gaEluc3RhbmNlOwogICAgIEdsb2JhbHMuaE1haW5JY29uICAgICA9IEV4dHJhY3RJY29uKEdsb2JhbHMuaEluc3RhbmNlLCAKQEAgLTMxMSw3ICsxNzYsOCBAQAogCQkJQ1dfVVNFREVGQVVMVCwgMCwgQ1dfVVNFREVGQVVMVCwgMCwgMCwgCiAJCQlMb2FkTWVudShHbG9iYWxzLmhJbnN0YW5jZSwgU1RSSU5HX01FTlVfWHgpLAogCQkJR2xvYmFscy5oSW5zdGFuY2UsIDApOwotICAgIE1BSU5fU2VsZWN0TGFuZ3VhZ2VCeU5hbWUoR2xvYmFscy5scHN6TGFuZ3VhZ2UpOworCisgICAgTEFOR1VBR0VfU2VsZWN0QnlOYW1lKEdsb2JhbHMubHBzekxhbmd1YWdlKTsKIAogICAgIFNldE1lbnUoR2xvYmFscy5oTWFpblduZCwgR2xvYmFscy5oTWFpbk1lbnUpOwkJCiAJCQkKQEAgLTMyNiw5ICsxOTIsNiBAQAogICAgIHJldHVybiAwOwogfQogCi0KLQotCiAvKiBMb2NhbCBWYXJpYWJsZXM6ICAgICovCiAvKiBjLWZpbGUtc3R5bGU6ICJHTlUiICovCiAvKiBFbmQ6ICAgICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9ub3RlcGFkL21haW4uaCBiL3Byb2dyYW1zL25vdGVwYWQvbWFpbi5oCmluZGV4IGMxYjA4ZWYuLjY5ZTc0MTkgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL25vdGVwYWQvbWFpbi5oCisrKyBiL3Byb2dyYW1zL25vdGVwYWQvbWFpbi5oCkBAIC0zOCw4ICszOCw2IEBACiAvKiBmdW5jdGlvbiBwcm90b3R5cGVzICovCiAKIC8qIGNsYXNzIG5hbWVzICovCi1WT0lEIE1BSU5fU2VsZWN0TGFuZ3VhZ2VCeU5hbWUoTFBDU1RSKTsKLVZPSUQgTUFJTl9TZWxlY3RMYW5ndWFnZUJ5TnVtYmVyKFVJTlQpOwogCiAvKiBSZXNvdXJjZSBuYW1lcyAqLwogZXh0ZXJuIENIQVIgU1RSSU5HX01FTlVfWHhbXTsKQEAgLTU0LDExICs1MiwxOCBAQAogI2VuZGlmCiAKIC8qIHN0cmluZyB0YWJsZSBpbmRleCAqLwotI2RlZmluZSBJRFNfTEFOR1VBR0VfSUQgICAgICAgICAgICAgICAgU1RSSU5HSUQoMDApCi0jZGVmaW5lIElEU19MQU5HVUFHRV9NRU5VX0lURU0gICAgICAgICBTVFJJTkdJRCgwMSkKLSNkZWZpbmUgSURTX05PVEVQQUQgICAgICAgICAgICAgICAgICAgIFNUUklOR0lEKDAyKQotI2RlZmluZSBJRFNfVEVYVF9GSUxFU19UWFQJICAgICAgIFNUUklOR0lEKDAzKQotI2RlZmluZSBJRFNfQUxMX0ZJTEVTICAgICAgICAgICAgICAgICAgU1RSSU5HSUQoMDQpCisjZGVmaW5lIElEU19MQU5HVUFHRV9JRCAgICAgICAgICAgICAgICAJU1RSSU5HSUQoMDApCisjZGVmaW5lIElEU19MQU5HVUFHRV9NRU5VX0lURU0gICAgICAgICAJU1RSSU5HSUQoMDEpCisjZGVmaW5lIElEU19OT1RFUEFEICAgICAgICAgICAgICAgICAgICAJU1RSSU5HSUQoMDIpCisjZGVmaW5lIElEU19URVhUX0ZJTEVTX1RYVAkgICAgICAgCVNUUklOR0lEKDAzKQorI2RlZmluZSBJRFNfQUxMX0ZJTEVTICAgICAgICAgICAgICAgICAgCVNUUklOR0lEKDA0KQorI2RlZmluZSBJRFNfRVJST1IJCQlTVFJJTkdJRCgwNSkKKyNkZWZpbmUgSURTX1dBUk5JTkcJCQlTVFJJTkdJRCgwNikKKyNkZWZpbmUgSURTX0lORk8JCQlTVFJJTkdJRCgwNykKKyNkZWZpbmUgSURTX1RPT0xBUkdFCQkJU1RSSU5HSUQoMDgpCisjZGVmaW5lIElEU19OT1RFWFQJCQlTVFJJTkdJRCgwOSkKKyNkZWZpbmUgSURTX05PVEZPVU5ECQkJU1RSSU5HSUQoMEEpCisjZGVmaW5lIElEU19PVVRfT0ZfTUVNT1JZCQlTVFJJTkdJRCgwQikKIAogLyogbWFpbiBtZW51ICovCiAKQEAgLTEwOSw3ICsxMTQsNyBAQAogI2RlZmluZSBOUF9QQUdFU0VUVVBfQk9UVE9NICAgICAxMDExCiAjZGVmaW5lIE5QX1BBR0VTRVRVUF9CT1RUT01fVFhUCTEwMTIKICNkZWZpbmUgTlBfSEVMUAkJCTEwMTMKLSNkZWZpbmUgTlBfUEFHRVNFVFVQX0JPUkRFUiAJMTAxNAorI2RlZmluZSBOUF9QQUdFU0VUVVBfTUFSR0lOIAkxMDE0CiAKIAogLyogTG9jYWwgVmFyaWFibGVzOiAgICAqLwpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvbm90ZXBhZC9ub3RlcGFkLnJjIGIvcHJvZ3JhbXMvbm90ZXBhZC9ub3RlcGFkLnJjCmluZGV4IDM0OWQ2YzUuLjNmZjI4NGUgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL25vdGVwYWQvbm90ZXBhZC5yYworKysgYi9wcm9ncmFtcy9ub3RlcGFkL25vdGVwYWQucmMKQEAgLTY0LDEzICs2NCwxNCBAQAogCiBDT05DQVQoRElBTE9HX1BBR0VTRVRVUF8sIExBTkdVQUdFX0lEKSBESUFMT0cgMCwgMCwgMjI1LCA5NQogU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCitGT05UIDgsICJIZWx2IgogQ0FQVElPTiBESUFMT0dfUEFHRVNFVFVQX0NBUFRJT04KIHsKIExURVhUICAgICBESUFMT0dfUEFHRVNFVFVQX0hFQUQsIE5QX1BBR0VTRVRVUF9IRUFEX1RYVCwgICAgIDEwLCAwNywgIDQwLCAxNQogRURJVFRFWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlBfUEFHRVNFVFVQX0hFQUQsICAgICAgNjAsIDA1LCAgMTEwLCAxMiwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUAogTFRFWFQgICAgIERJQUxPR19QQUdFU0VUVVBfVEFJTCwgTlBfUEFHRVNFVFVQX1RBSUxfVFhULCAgICAgMTAsIDI0LCAgNDAsIDE1CiBFRElUVEVYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBOUF9QQUdFU0VUVVBfVEFJTCwgICAgICA2MCwgMjIsICAxMTAsIDEyLCBXU19CT1JERVIgfCBXU19UQUJTVE9QCi1HUk9VUEJPWCAgRElBTE9HX1BBR0VTRVRVUF9CT1JERVIsICBOUF9QQUdFU0VUVVBfQk9SREVSLCAgICAxMCwgNDMsIDE2MCwgNDUKK0dST1VQQk9YICBESUFMT0dfUEFHRVNFVFVQX01BUkdJTiwgIE5QX1BBR0VTRVRVUF9NQVJHSU4sICAgIDEwLCA0MywgMTYwLCA0NQogTFRFWFQgICAgIERJQUxPR19QQUdFU0VUVVBfTEVGVCwgTlBfUEFHRVNFVFVQX0xFRlRfVFhULCAgICAgMjAsIDU1LCAgMzAsIDEwLCBXU19DSElMRAogRURJVFRFWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlBfUEFHRVNFVFVQX0xFRlQsCSAgICA1MCwgNTUsICAzNSwgMTEsIFdTX0NISUxEIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUAogTFRFWFQgICAgIERJQUxPR19QQUdFU0VUVVBfVE9QLCBOUF9QQUdFU0VUVVBfVE9QX1RYVCwJICAgIDIwLCA3MywgIDMwLCAxMCwgV1NfQ0hJTEQKQEAgLTEwNCw0ICsxMDUsMTEgQEAKIEFERFNUUklORyhOT1RFUEFEKQogQUREU1RSSU5HKFRFWFRfRklMRVNfVFhUKQogQUREU1RSSU5HKEFMTF9GSUxFUykKK0FERFNUUklORyhFUlJPUikKK0FERFNUUklORyhXQVJOSU5HKQorQUREU1RSSU5HKElORk8pCitBRERTVFJJTkcoVE9PTEFSR0UpCitBRERTVFJJTkcoTk9URVhUKQorQUREU1RSSU5HKE5PVEZPVU5EKQorQUREU1RSSU5HKE9VVF9PRl9NRU1PUlkpCiB9CmRpZmYgLS1naXQgYS9wcm9ncmFtcy92aWV3L2dsb2JhbHMuaCBiL3Byb2dyYW1zL3ZpZXcvZ2xvYmFscy5oCmluZGV4IDQwYTI3YzEuLmRlYTFjNjAgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL3ZpZXcvZ2xvYmFscy5oCisrKyBiL3Byb2dyYW1zL3ZpZXcvZ2xvYmFscy5oCkBAIC0xLDMgKzEsNCBAQAorCiAvKiAgQWRkIGdsb2JhbCBmdW5jdGlvbiBwcm90b3R5cGVzIGhlcmUgKi8KIAogQk9PTCBJbml0QXBwbGljYXRpb24oSElOU1RBTkNFKTsKQEAgLTE0LDE1ICsxNSwxNyBAQAogZXh0ZXJuIGNoYXIgICAgICBzekFwcE5hbWVbXTsgICAgLyogVGhlIG5hbWUgb2YgdGhpcyBhcHBsaWNhdGlvbiAqLwogZXh0ZXJuIGNoYXIgICAgICBzelRpdGxlW107ICAgICAgLyogVGhlIHRpdGxlIGJhciB0ZXh0ICovCiAKKworCiB0eXBlZGVmIHN0cnVjdAogewotCURXT1JECWtleTsKLQlIQU5ETEUJaG1mOwotCVJFQ1QJYmJveDsKLQlXT1JECWluY2g7Ci0JRFdPUkQJcmVzZXJ2ZWQ7Ci0JV09SRAljaGVja3N1bTsKLX0gQVBNRklMRUhFQURFUjsKKwlEV09SRAlrZXkgV0lORV9QQUNLRUQ7CisJSEFORExFMTYJaG1mIFdJTkVfUEFDS0VEOworCVJFQ1QxNgliYm94IFdJTkVfUEFDS0VEOworCVdPUkQJaW5jaCBXSU5FX1BBQ0tFRDsKKwlEV09SRAlyZXNlcnZlZCBXSU5FX1BBQ0tFRDsKKwlXT1JECWNoZWNrc3VtIFdJTkVfUEFDS0VEOworfSBBUE1GSUxFSEVBREVSIFdJTkVfUEFDS0VEOwogCiAjZGVmaW5lIEFQTUhFQURFUl9LRVkJMHg5QUM2Q0REN2wKIApkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvdmlldy92aWV3LmMgYi9wcm9ncmFtcy92aWV3L3ZpZXcuYwppbmRleCA1MmZiOTlhLi4zZjE1MGI2IDEwMDY0NAotLS0gYS9wcm9ncmFtcy92aWV3L3ZpZXcuYworKysgYi9wcm9ncmFtcy92aWV3L3ZpZXcuYwpAQCAtNjcsNyArNjcsNyBAQAogCSAgICBpZiAoRmlsZU9wZW4oaHduZCwgZmlsZW5hbWUpKSB7CiAJICAgICAgaXNBbGR1cyA9IEZpbGVJc1BsYWNlYWJsZShmaWxlbmFtZSk7CiAJICAgICAgaWYgKGlzQWxkdXMpIHsKLSNpZiAwCisjaWYgMQogCQlobWYgPSBHZXRQbGFjZWFibGVNZXRhRmlsZShmaWxlbmFtZSk7CiAjZWxzZQogCQlNZXNzYWdlQm94KGh3bmQsICJUaGlzIGlzIGFuIEFsZHVzIHBsYWNlYWJsZSBtZXRhZmlsZTogSSBjYW4ndCBkZWFsIHdpdGggdGhvc2UhIiwKQEAgLTE0Myw2ICsxNDMsNyBAQAogfQogCiAvKiB0aGlzIGNvZGUgZG9lc24ndCB3b3JrICovCisjaWYgMQogSE1FVEFGSUxFIEdldFBsYWNlYWJsZU1ldGFGaWxlKCBMUENTVFIgc3pGaWxlTmFtZSApCiB7CiAgIEhBTkRMRSBoRGF0YTsKQEAgLTE1NywxMCArMTU4LDkgQEAKICAgX2xsc2VlayhmaCwgMCwgMCk7CiAgIGlmICghX2xyZWFkKGZoLCAoTFBTVFIpJkFQTUhlYWRlciwgc2l6ZW9mKEFQTUZJTEVIRUFERVIpKSkgcmV0dXJuIE5VTEw7CiAgIF9sbHNlZWsoZmgsIHNpemVvZihBUE1GSUxFSEVBREVSKSwgMCk7CisgIHByaW50Zigic2l6ZW9mKEFQTUZJTEVIRUFERVIpICVkXG4iLCBzaXplb2YoQVBNRklMRUhFQURFUikpOwogICBpZiAoIV9scmVhZChmaCwgKExQU1RSKSZtZkhlYWRlciwgc2l6ZW9mKE1FVEFIRUFERVIpKSkgcmV0dXJuIE5VTEw7CiAKLSAgLyogc29tZWhvdyBtdFNpemUgaXMgYmVpbmcgc3dhcHBlZCAqLwotCiAgIGlmICghKGhEYXRhID0gR2xvYmFsQWxsb2MoR0hORCwgKG1mSGVhZGVyLm10U2l6ZSAqIDJMKSkpKSByZXR1cm4gTlVMTDsKIAogICBpZiAoIShscERhdGEgPSBHbG9iYWxMb2NrKGhEYXRhKSkpCkBAIC0xODQsMTAgKzE4NCwxMiBAQAogICAKICAgd2lkdGggPSBBUE1IZWFkZXIuYmJveC5yaWdodCAtIEFQTUhlYWRlci5iYm94LmxlZnQ7CiAgIGhlaWdodCA9IEFQTUhlYWRlci5iYm94LmJvdHRvbSAtIEFQTUhlYWRlci5iYm94LnRvcDsKKworICBwcmludGYoIk9rISB3aWR0aCAlZCBoZWlnaHQgJWRcbiIsIHdpZHRoLCBoZWlnaHQpOwogICBkZWx0YXggPSAwOwogICBkZWx0YXkgPSAwIDsKICAgcmV0dXJuIGhtZjsKIH0KLQorI2VuZGlmCiAKIApkaWZmIC0tZ2l0IGEvcmVsYXkzMi9idWlsdGluMzIuYyBiL3JlbGF5MzIvYnVpbHRpbjMyLmMKaW5kZXggZDEyNDA5My4uYjVlNzlhYSAxMDA2NDQKLS0tIGEvcmVsYXkzMi9idWlsdGluMzIuYworKysgYi9yZWxheTMyL2J1aWx0aW4zMi5jCkBAIC0xMzYsNyArMTM2LDcgQEAKICAgICAgICAgICAgICsgZGxsLT5kZXNjci0+bmJfbmFtZXMgKiBzaXplb2YoTFBTVFIpCiAgICAgICAgICAgICArIGRsbC0+ZGVzY3ItPm5iX3JlZ19mdW5jcyAqIHNpemVvZihSRUdfRU5UUllfUE9JTlQpKTsKICNpZmRlZiBfX2kzODZfXwotICAgIGlmIChkZWJ1Z2dpbmdfaW5mbyhyZWxheSkpCisgICAgaWYgKFRSQUNFX09OKHJlbGF5KSkKICAgICAgICAgc2l6ZSArPSBkbGwtPmRlc2NyLT5uYl9mdW5jcyAqIHNpemVvZihERUJVR19FTlRSWV9QT0lOVCk7CiAjZW5kaWYKICAgICBhZGRyICA9IFZpcnR1YWxBbGxvYyggTlVMTCwgc2l6ZSwgTUVNX0NPTU1JVCwgUEFHRV9FWEVDVVRFX1JFQURXUklURSApOwpAQCAtMjAxLDcgKzIwMSw3IEBACiAgICAgc3RyY3B5KCBzZWMtPk5hbWUsICIuY29kZSIgKTsKICAgICBzZWMtPlNpemVPZlJhd0RhdGEgPSBkbGwtPmRlc2NyLT5uYl9yZWdfZnVuY3MgKiBzaXplb2YoUkVHX0VOVFJZX1BPSU5UKTsKICNpZmRlZiBfX2kzODZfXwotICAgIGlmIChkZWJ1Z2dpbmdfaW5mbyhyZWxheSkpCisgICAgaWYgKFRSQUNFX09OKHJlbGF5KSkKICAgICAgICAgc2VjLT5TaXplT2ZSYXdEYXRhICs9IGRsbC0+ZGVzY3ItPm5iX2Z1bmNzICogc2l6ZW9mKERFQlVHX0VOVFJZX1BPSU5UKTsKICNlbmRpZgogICAgIHNlYy0+TWlzYy5WaXJ0dWFsU2l6ZSA9IHNlYy0+U2l6ZU9mUmF3RGF0YTsKQEAgLTIyMiw3ICsyMjIsNyBAQAogCiAgICAgLyogQnVpbGQgdGhlIGZ1bmNzIHRhYmxlICovCiAKLSAgICBpZiAoZGVidWdnaW5nX2luZm8ocmVsYXkpKSBkbGwtPmRiZ19mdW5jcyA9IGRlYnVnOworICAgIGlmIChUUkFDRV9PTihyZWxheSkpIGRsbC0+ZGJnX2Z1bmNzID0gZGVidWc7CiAgICAgZm9yIChpID0gMDsgaSA8IGRsbC0+ZGVzY3ItPm5iX2Z1bmNzOyBpKyssIGZ1bmNzKyssIGRlYnVnKyspCiAgICAgewogICAgICAgICBCWVRFIGFyZ3MgPSBkbGwtPmRlc2NyLT5hcmdzW2ldOwpAQCAtMjM2LDcgKzIzNiw3IEBACiAgICAgICAgICAgICByZWdzLT5qbXAgICAgICAgICA9IDB4ZTk7CiAgICAgICAgICAgICByZWdzLT5jYWxsMzJfcmVncyA9IChEV09SRClDQUxMMzJfUmVncyAtIChEV09SRCkmcmVncy0+bm9wOwogICAgICAgICAgICAgcmVncy0+bm9wICAgICAgICAgPSAweDkwOTA7Ci0gICAgICAgICAgICBpZiAoZGVidWdnaW5nX2luZm8ocmVsYXkpKQorICAgICAgICAgICAgaWYgKFRSQUNFX09OKHJlbGF5KSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBkZWJ1Zy0+Y2FsbCAgICAgICA9IDB4ZTg7CiAgICAgICAgICAgICAgICAgZGVidWctPmNhbGxmcm9tMzIgPSAoRFdPUkQpcmVncyAtIChEV09SRCkmZGVidWctPnJldDsKQEAgLTI1MSw3ICsyNTEsNyBAQAogICAgICAgICAgICAgKmZ1bmNzID0gKExQVk9JRCkoKEJZVEUgKilkbGwtPmRlc2NyLT5mdW5jdGlvbnNbaV0gLSBhZGRyKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OiAgLyogbm9ybWFsIGZ1bmN0aW9uIChzdGRjYWxsIG9yIGNkZWNsKSAqLwotICAgICAgICAgICAgaWYgKGRlYnVnZ2luZ19pbmZvKHJlbGF5KSkKKyAgICAgICAgICAgIGlmIChUUkFDRV9PTihyZWxheSkpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgZGVidWctPmNhbGwgICAgICAgPSAweGU4OwogICAgICAgICAgICAgICAgIGRlYnVnLT5jYWxsZnJvbTMyID0gKERXT1JEKVJFTEFZX0NhbGxGcm9tMzIgLQpkaWZmIC0tZ2l0IGEvcmVsYXkzMi9jb21jdGwzMi5zcGVjIGIvcmVsYXkzMi9jb21jdGwzMi5zcGVjCmluZGV4IDA1ODM2NWQuLjZlMjI0ZDIgMTAwNjQ0Ci0tLSBhL3JlbGF5MzIvY29tY3RsMzIuc3BlYworKysgYi9yZWxheTMyL2NvbWN0bDMyLnNwZWMKQEAgLTMwLDQxICszMCw0MSBAQAogIyAyMyBwYXNjYWwxNiBEcmF3U3RhdHVzVGV4dCh3b3JkIHB0ciBwdHIgd29yZCkgRHJhd1N0YXR1c1RleHQxNgogIDIzIHN0dWIgRHJhd1N0YXR1c1RleHQKICAyNCBzdGRjYWxsIERyYXdTdGF0dXNUZXh0Vyhsb25nIHB0ciBwdHIgbG9uZykgRHJhd1N0YXR1c1RleHQzMlcKLSAyNSBzdHViIEltYWdlTGlzdF9BZGQKKyAyNSBzdGRjYWxsIEltYWdlTGlzdF9BZGQocHRyIGxvbmcgbG9uZykgSW1hZ2VMaXN0X0FkZAogIDI2IHN0dWIgSW1hZ2VMaXN0X0FkZEljb24KLSAyNyBzdHViIEltYWdlTGlzdF9BZGRNYXNrZWQKKyAyNyBzdGRjYWxsIEltYWdlTGlzdF9BZGRNYXNrZWQocHRyIGxvbmcgbG9uZykgSW1hZ2VMaXN0X0FkZE1hc2tlZAogIDI4IHN0dWIgSW1hZ2VMaXN0X0JlZ2luRHJhZwogIDI5IHN0dWIgSW1hZ2VMaXN0X0NvcHkKLSAzMCBzdHViIEltYWdlTGlzdF9DcmVhdGUKLSAzMSBzdHViIEltYWdlTGlzdF9EZXN0cm95CisgMzAgc3RkY2FsbCBJbWFnZUxpc3RfQ3JlYXRlKGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZykgSW1hZ2VMaXN0X0NyZWF0ZQorIDMxIHN0ZGNhbGwgSW1hZ2VMaXN0X0Rlc3Ryb3kocHRyKSBJbWFnZUxpc3RfRGVzdHJveQogIDMyIHN0dWIgSW1hZ2VMaXN0X0RyYWdFbnRlcgogIDMzIHN0dWIgSW1hZ2VMaXN0X0RyYWdMZWF2ZQogIDM0IHN0dWIgSW1hZ2VMaXN0X0RyYWdNb3ZlCiAgMzUgc3R1YiBJbWFnZUxpc3RfRHJhZ1Nob3dOb2xvY2sKLSAzNiBzdHViIEltYWdlTGlzdF9EcmF3CisgMzYgc3RkY2FsbCBJbWFnZUxpc3RfRHJhdyhwdHIgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nKSBJbWFnZUxpc3RfRHJhdwogIDM3IHN0dWIgSW1hZ2VMaXN0X0RyYXdFeAogIDM4IHN0dWIgSW1hZ2VMaXN0X0VuZERyYWcKLSAzOSBzdHViIEltYWdlTGlzdF9HZXRCa0NvbG9yCisgMzkgc3RkY2FsbCBJbWFnZUxpc3RfR2V0QmtDb2xvcihwdHIpIEltYWdlTGlzdF9HZXRCa0NvbG9yCiAgNDAgc3R1YiBJbWFnZUxpc3RfR2V0RHJhZ0ltYWdlCiAgNDEgc3R1YiBJbWFnZUxpc3RfR2V0SWNvbgotIDQyIHN0dWIgSW1hZ2VMaXN0X0dldEljb25TaXplCi0gNDMgc3R1YiBJbWFnZUxpc3RfR2V0SW1hZ2VDb3VudAotIDQ0IHN0dWIgSW1hZ2VMaXN0X0dldEltYWdlSW5mbworIDQyIHN0ZGNhbGwgSW1hZ2VMaXN0X0dldEljb25TaXplKHB0ciBwdHIgcHRyKSBJbWFnZUxpc3RfR2V0SWNvblNpemUKKyA0MyBzdGRjYWxsIEltYWdlTGlzdF9HZXRJbWFnZUNvdW50KHB0cikgSW1hZ2VMaXN0X0dldEltYWdlQ291bnQKKyA0NCBzdGRjYWxsIEltYWdlTGlzdF9HZXRJbWFnZUluZm8ocHRyIGxvbmcgcHRyKSBJbWFnZUxpc3RfR2V0SW1hZ2VJbmZvCiAgNDUgc3R1YiBJbWFnZUxpc3RfR2V0SW1hZ2VSZWN0CiAgNDYgc3R1YiBJbWFnZUxpc3RfTG9hZEltYWdlCi0gNDcgc3R1YiBJbWFnZUxpc3RfTG9hZEltYWdlQQotIDQ4IHN0dWIgSW1hZ2VMaXN0X0xvYWRJbWFnZVcKLSA0OSBzdHViIEltYWdlTGlzdF9NZXJnZQorIDQ3IHN0ZGNhbGwgSW1hZ2VMaXN0X0xvYWRJbWFnZUEobG9uZyBwdHIgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nKSBJbWFnZUxpc3RfTG9hZEltYWdlMzJBCisgNDggc3RkY2FsbCBJbWFnZUxpc3RfTG9hZEltYWdlVyhsb25nIHB0ciBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcpIEltYWdlTGlzdF9Mb2FkSW1hZ2UzMlcKKyA0OSBzdGRjYWxsIEltYWdlTGlzdF9NZXJnZShwdHIgbG9uZyBwdHIgbG9uZyBsb25nIGxvbmcpIEltYWdlTGlzdF9NZXJnZQogIDUwIHN0dWIgSW1hZ2VMaXN0X1JlYWQKICA1MSBzdHViIEltYWdlTGlzdF9SZW1vdmUKLSA1MiBzdHViIEltYWdlTGlzdF9SZXBsYWNlCi0gNTMgc3R1YiBJbWFnZUxpc3RfUmVwbGFjZUljb24KLSA1NCBzdHViIEltYWdlTGlzdF9TZXRCa0NvbG9yCisgNTIgc3RkY2FsbCBJbWFnZUxpc3RfUmVwbGFjZShwdHIgbG9uZyBsb25nIGxvbmcpIEltYWdlTGlzdF9SZXBsYWNlCisgNTMgc3RkY2FsbCBJbWFnZUxpc3RfUmVwbGFjZUljb24ocHRyIGxvbmcgbG9uZykgSW1hZ2VMaXN0X1JlcGxhY2VJY29uCisgNTQgc3RkY2FsbCBJbWFnZUxpc3RfU2V0QmtDb2xvcihwdHIgbG9uZykgSW1hZ2VMaXN0X1NldEJrQ29sb3IKICA1NSBzdHViIEltYWdlTGlzdF9TZXREcmFnQ3Vyc29ySW1hZ2UKICA1NiBzdHViIEltYWdlTGlzdF9TZXRGaWx0ZXIKICA1NyBzdHViIEltYWdlTGlzdF9TZXRJY29uU2l6ZQogIDU4IHN0dWIgSW1hZ2VMaXN0X1NldEltYWdlQ291bnQKLSA1OSBzdHViIEltYWdlTGlzdF9TZXRPdmVybGF5SW1hZ2UKKyA1OSBzdGRjYWxsIEltYWdlTGlzdF9TZXRPdmVybGF5SW1hZ2UocHRyIGxvbmcgbG9uZykgSW1hZ2VMaXN0X1NldE92ZXJsYXlJbWFnZQogIDYwIHN0dWIgSW1hZ2VMaXN0X1dyaXRlCiAgNjEgc3R1YiBJbml0Q29tbW9uQ29udHJvbHNFeAogIDYyIHN0dWIgUHJvcGVydHlTaGVldApkaWZmIC0tZ2l0IGEvcmVsYXkzMi9nZGkzMi5zcGVjIGIvcmVsYXkzMi9nZGkzMi5zcGVjCmluZGV4IDhlODI0MTMuLjFhYjRlNGIgMTAwNjQ0Ci0tLSBhL3JlbGF5MzIvZ2RpMzIuc3BlYworKysgYi9yZWxheTMyL2dkaTMyLnNwZWMKQEAgLTE2LDcgKzE2LDcgQEAKICAxMiBzdHViIENoZWNrQ29sb3JzSW5HYW11dAogIDEzIHN0dWIgQ2hvb3NlUGl4ZWxGb3JtYXQKICAxNCBzdGRjYWxsIENob3JkKGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nKSBDaG9yZDMyCi0gMTUgc3R1YiBDbG9zZUVuaE1ldGFGaWxlCisgMTUgc3RkY2FsbCBDbG9zZUVuaE1ldGFGaWxlKGxvbmcpIENsb3NlRW5oTWV0YUZpbGUzMgogIDE2IHN0ZGNhbGwgQ2xvc2VGaWd1cmUobG9uZykgQ2xvc2VGaWd1cmUzMgogIDE3IHN0dWIgQ2xvc2VNZXRhRmlsZQogIDE4IHN0dWIgQ29sb3JNYXRjaFRvVGFyZ2V0CkBAIC00Miw3ICs0Miw3IEBACiAgMzggc3RkY2FsbCBDcmVhdGVEaXNjYXJkYWJsZUJpdG1hcChsb25nIGxvbmcgbG9uZykgQ3JlYXRlRGlzY2FyZGFibGVCaXRtYXAzMgogIDM5IHN0ZGNhbGwgQ3JlYXRlRWxsaXB0aWNSZ24obG9uZyBsb25nIGxvbmcgbG9uZykgQ3JlYXRlRWxsaXB0aWNSZ24zMgogIDQwIHN0ZGNhbGwgQ3JlYXRlRWxsaXB0aWNSZ25JbmRpcmVjdChwdHIpIENyZWF0ZUVsbGlwdGljUmduSW5kaXJlY3QzMgotIDQxIHN0dWIgQ3JlYXRlRW5oTWV0YUZpbGVBCisgNDEgc3RkY2FsbCBDcmVhdGVFbmhNZXRhRmlsZUEobG9uZyBwdHIgcHRyIHB0cikgQ3JlYXRlRW5oTWV0YUZpbGUzMkEKICA0MiBzdHViIENyZWF0ZUVuaE1ldGFGaWxlVwogIDQzIHN0ZGNhbGwgQ3JlYXRlRm9udEEobG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nCiAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgc3RyKSBDcmVhdGVGb250MzJBCkBAIC03Miw3ICs3Miw3IEBACiAgNjUgc3RkY2FsbCBEUHRvTFAobG9uZyBwdHIgbG9uZykgRFB0b0xQMzIKICA2NiBzdHViIERlbGV0ZUNvbG9yU3BhY2UKICA2NyBzdGRjYWxsIERlbGV0ZURDKGxvbmcpIERlbGV0ZURDMzIKLSA2OCBzdHViIERlbGV0ZUVuaE1ldGFGaWxlCisgNjggc3RkY2FsbCBEZWxldGVFbmhNZXRhRmlsZShsb25nKSBEZWxldGVFbmhNZXRhRmlsZTMyCiAgNjkgc3R1YiBEZWxldGVNZXRhRmlsZQogIDcwIHN0ZGNhbGwgRGVsZXRlT2JqZWN0KGxvbmcpCURlbGV0ZU9iamVjdDMyCiAgNzEgc3R1YiBEZXNjcmliZVBpeGVsRm9ybWF0CkBAIC04Myw3ICs4Myw3IEBACiAgNzYgc3R1YiBFbmREb2MKICA3NyBzdHViIEVuZFBhZ2UKICA3OCBzdGRjYWxsIEVuZFBhdGgobG9uZykgRW5kUGF0aDMyCi0gNzkgc3R1YiBFbnVtRW5oTWV0YUZpbGUKKyA3OSBzdGRjYWxsIEVudW1FbmhNZXRhRmlsZShsb25nIGxvbmcgcHRyIHB0ciBwdHIpIEVudW1FbmhNZXRhRmlsZTMyCiAgODAgc3RkY2FsbCBFbnVtRm9udEZhbWlsaWVzQShsb25nIHN0ciBwdHIgbG9uZykgRW51bUZvbnRGYW1pbGllczMyQQogIDgxIHN0ZGNhbGwgRW51bUZvbnRGYW1pbGllc0V4QShsb25nIHN0ciBwdHIgbG9uZyBsb25nKSBFbnVtRm9udEZhbWlsaWVzRXgzMkEKICA4MiBzdGRjYWxsIEVudW1Gb250RmFtaWxpZXNFeFcobG9uZyB3c3RyIHB0ciBsb25nIGxvbmcpIEVudW1Gb250RmFtaWxpZXNFeDMyVwpAQCAtMTc4LDExICsxNzgsMTEgQEAKIDE3MSBzdGRjYWxsIEdldERldmljZUNhcHMobG9uZyBsb25nKSBHZXREZXZpY2VDYXBzMzIKIDE3MiBzdHViIEdldERldmljZUdhbW1hUmFtcAogMTczIHN0dWIgR2V0RVRNCi0xNzQgc3R1YiBHZXRFbmhNZXRhRmlsZUEKKzE3NCBzdGRjYWxsIEdldEVuaE1ldGFGaWxlQShwdHIpIEdldEVuaE1ldGFGaWxlMzJBCiAxNzUgc3R1YiBHZXRFbmhNZXRhRmlsZUJpdHMKLTE3NiBzdHViIEdldEVuaE1ldGFGaWxlRGVzY3JpcHRpb25BCisxNzYgc3RkY2FsbCBHZXRFbmhNZXRhRmlsZURlc2NyaXB0aW9uQShsb25nIGxvbmcgcHRyKSBHZXRFbmhNZXRhRmlsZURlc2NyaXB0aW9uMzJBCiAxNzcgc3R1YiBHZXRFbmhNZXRhRmlsZURlc2NyaXB0aW9uVwotMTc4IHN0dWIgR2V0RW5oTWV0YUZpbGVIZWFkZXIKKzE3OCBzdGRjYWxsIEdldEVuaE1ldGFGaWxlSGVhZGVyKGxvbmcgbG9uZyBwdHIpIEdldEVuaE1ldGFGaWxlSGVhZGVyMzIKIDE3OSBzdHViIEdldEVuaE1ldGFGaWxlUGFsZXR0ZUVudHJpZXMKIDE4MCBzdHViIEdldEVuaE1ldGFGaWxlVwogMTgxIHN0dWIgR2V0Rm9udERhdGEKQEAgLTI2Nyw4ICsyNjcsOCBAQAogMjYwIHN0ZGNhbGwgUGF0Qmx0KGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nKSBQYXRCbHQzMgogMjYxIHN0ZGNhbGwgUGF0aFRvUmVnaW9uKGxvbmcpIFBhdGhUb1JlZ2lvbjMyCiAyNjIgc3RkY2FsbCBQaWUobG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcpIFBpZTMyCi0yNjMgc3R1YiBQbGF5RW5oTWV0YUZpbGUKLTI2NCBzdHViIFBsYXlFbmhNZXRhRmlsZVJlY29yZAorMjYzIHN0ZGNhbGwgUGxheUVuaE1ldGFGaWxlKGxvbmcgbG9uZyBwdHIpIFBsYXlFbmhNZXRhRmlsZTMyCisyNjQgc3RkY2FsbCBQbGF5RW5oTWV0YUZpbGVSZWNvcmQobG9uZyBwdHIgcHRyIGxvbmcpIFBsYXlFbmhNZXRhRmlsZVJlY29yZDMyCiAyNjUgc3RkY2FsbCBQbGF5TWV0YUZpbGUobG9uZyBsb25nKSBQbGF5TWV0YUZpbGUzMgogMjY2IHN0dWIgUGxheU1ldGFGaWxlUmVjb3JkCiAyNjcgc3R1YiBQbGdCbHQKZGlmZiAtLWdpdCBhL3JlbGF5MzIva2VybmVsMzIuc3BlYyBiL3JlbGF5MzIva2VybmVsMzIuc3BlYwppbmRleCA1ZGE0ODZjLi45ZTFjZjkyIDEwMDY0NAotLS0gYS9yZWxheTMyL2tlcm5lbDMyLnNwZWMKKysrIGIvcmVsYXkzMi9rZXJuZWwzMi5zcGVjCkBAIC0yMCw2ICsyMCw3IEBACiAgCiAgMTAgc3R1YiBfS0VSTkVMMzJfc3RyaW5nY29udjEgI2Fuc2kyb2VtIG9yIHJldmVyc2U/CiAgCisgMTcgc3R1YiBfS0VSTkVMMzJfMTcKICAxOCBzdGRjYWxsIF9LRVJORUwzMl8xOChsb25nIGxvbmcpIF9LRVJORUwzMl8xOAogIDE5IHN0dWIgX0tFUk5FTDMyX2dldGhlYXBzZWdtZW50CiAgCkBAIC0zOTYsNyArMzk3LDcgQEAKIDQwNSBzdGRjYWxsIEdldFN5c3RlbVBvd2VyU3RhdHVzKHB0cikgR2V0U3lzdGVtUG93ZXJTdGF0dXMKIDQwNiBzdGRjYWxsIEdldFN5c3RlbVRpbWUocHRyKSBHZXRTeXN0ZW1UaW1lCiA0MDcgc3R1YiBHZXRTeXN0ZW1UaW1lQWRqdXN0bWVudAotNDA4IHN0dWIgR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUKKzQwOCBzdGRjYWxsIEdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lKHB0cikgR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUKIDQwOSBzdHViIEdldFRhcGVQYXJhbWV0ZXJzCiA0MTAgc3R1YiBHZXRUYXBlUG9zaXRpb24KIDQxMSBzdHViIEdldFRhcGVTdGF0dXMKQEAgLTQwOCw3ICs0MDksNyBAQAogNDE3IHN0ZGNhbGwgR2V0VGhyZWFkTG9jYWxlKCkgR2V0VGhyZWFkTG9jYWxlCiA0MTggc3RkY2FsbCBHZXRUaHJlYWRQcmlvcml0eShsb25nKSBHZXRUaHJlYWRQcmlvcml0eQogNDE5IHN0ZGNhbGwgR2V0VGhyZWFkU2VsZWN0b3JFbnRyeShsb25nIGxvbmcgcHRyKSBHZXRUaHJlYWRTZWxlY3RvckVudHJ5Ci00MjAgc3R1YiBHZXRUaHJlYWRUaW1lcworNDIwIHN0ZGNhbGwgR2V0VGhyZWFkVGltZXMobG9uZyBwdHIgcHRyIHB0ciBwdHIpIEdldFRocmVhZFRpbWVzCiA0MjEgc3RkY2FsbCBHZXRUaWNrQ291bnQoKSBHZXRUaWNrQ291bnQKIDQyMiBzdGRjYWxsIEdldFRpbWVGb3JtYXRBKGxvbmcgbG9uZyBwdHIgc3RyIHB0ciBsb25nKSBHZXRUaW1lRm9ybWF0MzJBCiA0MjMgc3R1YiBHZXRUaW1lRm9ybWF0VwpAQCAtNzM0LDcgKzczNSw3IEBACiA3NDMgc3RkY2FsbCBXcml0ZVByaXZhdGVQcm9maWxlU3RyaW5nVyh3c3RyIHdzdHIgd3N0ciB3c3RyKSBXcml0ZVByaXZhdGVQcm9maWxlU3RyaW5nMzJXCiA3NDQgc3R1YiBXcml0ZVByaXZhdGVQcm9maWxlU3RydWN0QQogNzQ1IHN0dWIgV3JpdGVQcml2YXRlUHJvZmlsZVN0cnVjdFcKLTc0NiBzdHViIFdyaXRlUHJvY2Vzc01lbW9yeQorNzQ2IHN0ZGNhbGwgV3JpdGVQcm9jZXNzTWVtb3J5KGxvbmcgcHRyIHB0ciBsb25nIHB0cikgV3JpdGVQcm9jZXNzTWVtb3J5CiA3NDcgc3R1YiBXcml0ZVByb2ZpbGVTZWN0aW9uQQogNzQ4IHN0dWIgV3JpdGVQcm9maWxlU2VjdGlvblcKIDc0OSBzdGRjYWxsIFdyaXRlUHJvZmlsZVN0cmluZ0Eoc3RyIHN0ciBzdHIpIFdyaXRlUHJvZmlsZVN0cmluZzMyQQpkaWZmIC0tZ2l0IGEvcmVsYXkzMi9sejMyLnNwZWMgYi9yZWxheTMyL2x6MzIuc3BlYwppbmRleCBhNTFhNWYxLi5hY2ZkMjRiIDEwMDY0NAotLS0gYS9yZWxheTMyL2x6MzIuc3BlYworKysgYi9yZWxheTMyL2x6MzIuc3BlYwpAQCAtMiw3ICsyLDcgQEAKIHR5cGUJd2luMzIKIAogMCBzdGRjYWxsIExaQ29weShsb25nIGxvbmcpIExaQ29weTMyCi0xIHN0ZGNhbGwgTFpPcGVuRmlsZUEocHRyIHB0ciBsb25nKSBMWk9wZW5GaWxlMzJBCisxIHN0ZGNhbGwgTFpPcGVuRmlsZUEoc3RyIHB0ciBsb25nKSBMWk9wZW5GaWxlMzJBCiAyIHN0ZGNhbGwgTFpJbml0KGxvbmcpIExaSW5pdDMyCiAzIHN0ZGNhbGwgTFpTZWVrKGxvbmcgbG9uZyBsb25nKSBMWlNlZWszMgogNCBzdGRjYWxsIExaUmVhZChsb25nIHB0ciBsb25nKSBMWlJlYWQzMgpAQCAtMTAsNiArMTAsNiBAQAogNiBzdGRjYWxsIExaU3RhcnQoKSBMWlN0YXJ0MzIKIDcgc3RkY2FsbCBDb3B5TFpGaWxlKGxvbmcgbG9uZykgQ29weUxaRmlsZTMyCiA4IHN0ZGNhbGwgTFpEb25lKCkgTFpEb25lCi05IHN0ZGNhbGwgR2V0RXhwYW5kZWROYW1lQShwdHIgcHRyKSBHZXRFeHBhbmRlZE5hbWUzMkEKLTEwIHN0ZGNhbGwgTFpPcGVuRmlsZVcocHRyIHB0ciBsb25nKSBMWk9wZW5GaWxlMzJXCi0xMSBzdGRjYWxsIEdldEV4cGFuZGVkTmFtZVcocHRyIHB0cikgR2V0RXhwYW5kZWROYW1lMzJXCis5IHN0ZGNhbGwgR2V0RXhwYW5kZWROYW1lQShzdHIgcHRyKSBHZXRFeHBhbmRlZE5hbWUzMkEKKzEwIHN0ZGNhbGwgTFpPcGVuRmlsZVcod3N0ciBwdHIgbG9uZykgTFpPcGVuRmlsZTMyVworMTEgc3RkY2FsbCBHZXRFeHBhbmRlZE5hbWVXKHdzdHIgcHRyKSBHZXRFeHBhbmRlZE5hbWUzMlcKZGlmZiAtLWdpdCBhL3JlbGF5MzIvb2xlY2xpMzIuc3BlYyBiL3JlbGF5MzIvb2xlY2xpMzIuc3BlYwppbmRleCAyMDM0YmJhLi5iYjg2MzUyIDEwMDY0NAotLS0gYS9yZWxheTMyL29sZWNsaTMyLnNwZWMKKysrIGIvcmVsYXkzMi9vbGVjbGkzMi5zcGVjCkBAIC01Niw0ICs1Niw0IEBACiAgIDU3IHN0dWIgT2xlRXhlY3V0ZQogICA1OCBzdHViIE9sZUNyZWF0ZUludmlzaWJsZQogICA1OSBzdHViIE9sZVF1ZXJ5Q2xpZW50VmVyc2lvbgotICA2MCBzdHViIE9sZUlzRGNNZXRhCisgIDYwIHN0ZGNhbGwgT2xlSXNEY01ldGEobG9uZykgT2xlSXNEY01ldGEzMgpkaWZmIC0tZ2l0IGEvcmVsYXkzMi9yZWxheTM4Ni5jIGIvcmVsYXkzMi9yZWxheTM4Ni5jCmluZGV4IDczNGMyYTUuLjQxMTVjN2IgMTAwNjQ0Ci0tLSBhL3JlbGF5MzIvcmVsYXkzODYuYworKysgYi9yZWxheTMyL3JlbGF5Mzg2LmMKQEAgLTUzLDcgKzUzLDcgQEAKICAgICBCWVRFICpyZWxheV9hZGRyID0gKEJZVEUgKilhcmdzWy0xXTsKICAgICBXT1JEIG5iX2FyZ3MgPSAqKFdPUkQgKikocmVsYXlfYWRkciArIDEpIC8gc2l6ZW9mKGludCk7CiAKLSAgICBhc3NlcnQoZGVidWdnaW5nX2luZm8ocmVsYXkpKTsKKyAgICBhc3NlcnQoVFJBQ0VfT04ocmVsYXkpKTsKICAgICBmdW5jID0gKEZBUlBST0MzMilCVUlMVElOMzJfR2V0RW50cnlQb2ludCggYnVmZmVyLCByZWxheV9hZGRyIC0gNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnR5cGVtYXNrICk7CiAgICAgcHJpbnRmKCAiQ2FsbCAlcygiLCBidWZmZXIgKTsKQEAgLTE4Myw3ICsxODMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoQ0FMTEJBQ0sgKmVudHJ5X3BvaW50KShDT05URVhUICopLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQllURSAqcmVsYXlfYWRkciwgaW50IHJldF9hZGRyICkKIHsKLSAgICBpZiAoIWRlYnVnZ2luZ19pbmZvKHJlbGF5KSkKKyAgICBpZiAoIVRSQUNFX09OKHJlbGF5KSkKICAgICB7CiAgICAgICAgIC8qIFNpbXBseSBjYWxsIHRoZSBlbnRyeSBwb2ludCAqLwogICAgICAgICBlbnRyeV9wb2ludCggJmNvbnRleHQgKTsKZGlmZiAtLWdpdCBhL3Jlc291cmNlcy9zeXNyZXNfU3cucmMgYi9yZXNvdXJjZXMvc3lzcmVzX1N3LnJjCmluZGV4IDI0NTYwYzMuLmFmOWJhNDkgMTAwNjQ0Ci0tLSBhL3Jlc291cmNlcy9zeXNyZXNfU3cucmMKKysrIGIvcmVzb3VyY2VzL3N5c3Jlc19Tdy5yYwpAQCAtNjUsNyArNjUsNyBAQAogIExURVhUICImS2F0YWxvZ2VyOiIsIC0xLCAxMTAsIDYsIDkyLCA5CiAgTFRFWFQgIiIsIDEwODgsIDExMCwgMTgsIDkyLCA5LCBTU19OT1BSRUZJWCB8IFdTX0dST1VQCiAgTElTVEJPWCAxMTIxLCAxMTAsIDMyLCA5MiwgNjgsIExCU19TVEFOREFSRCB8IExCU19PV05FUkRSQVdGSVhFRCB8IExCU19IQVNTVFJJTkdTIHwgTEJTX0RJU0FCTEVOT1NDUk9MTCB8IFdTX1RBQlNUT1AKLSBMVEVYVCAiTGlzdGEg9nZlciBmaWxlciBhdiAmdHlwZW46IiwgMTA4OSwgNiwgMTA0LCA5MCwgOQorIExURVhUICJMaXN0YSBmaWxlciBhdiAmdHlwZW46IiwgMTA4OSwgNiwgMTA0LCA5MCwgOQogIENPTUJPQk9YIDExMzYsIDYsIDExNCwgOTAsIDM2LCBDQlNfRFJPUERPV05MSVNUIHwgQ0JTX0FVVE9IU0NST0xMIHwgV1NfQk9SREVSIHwgV1NfVlNDUk9MTCB8IFdTX1RBQlNUT1AKICBMVEVYVCAiJkVuaGV0ZXI6IiwgMTA5MSwgMTEwLCAxMDQsIDkyLCA5CiAgQ09NQk9CT1ggMTEzNywgMTEwLCAxMTQsIDkyLCA2OCwgQ0JTX0RST1BET1dOTElTVCB8IENCU19PV05FUkRSQVdGSVhFRCB8IENCU19BVVRPSFNDUk9MTCB8IENCU19TT1JUIHwgQ0JTX0hBU1NUUklOR1MgfCBXU19CT1JERVIgfCBXU19WU0NST0xMIHwgV1NfVEFCU1RPUApkaWZmIC0tZ2l0IGEvc2NoZWR1bGVyL3Byb2Nlc3MuYyBiL3NjaGVkdWxlci9wcm9jZXNzLmMKaW5kZXggMjdkODc2NS4uMjcwZmRjOSAxMDA2NDQKLS0tIGEvc2NoZWR1bGVyL3Byb2Nlc3MuYworKysgYi9zY2hlZHVsZXIvcHJvY2Vzcy5jCkBAIC05MDYsNiArOTA2LDIwIEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFdyaXRlUHJvY2Vzc01lbW9yeSAgICAJCShLRVJORUwzMikKKyAqIEZJWE1FOiBjaGVjayB0aGlzLCBpZiB3ZSBldmVyIHJ1biB3aW4zMiBiaW5hcmllcyBpbiBkaWZmZXJlbnQgYWRkcmVzc3NwYWNlcworICoJICAuLi4gYW5kIGFkZCBhIHNpemVjaGVjaworICovCitCT09MMzIgV0lOQVBJIFdyaXRlUHJvY2Vzc01lbW9yeShIQU5ETEUzMiBoUHJvY2VzcywgTFBDVk9JRCBscEJhc2VBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEIGxwQnVmZmVyLCBEV09SRCBuU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRFdPUkQgbHBOdW1iZXJPZkJ5dGVzV3JpdHRlbiApCit7CisJbWVtY3B5KGxwQmFzZUFkZHJlc3MsbHBCdWZmZXIsblNpemUpOworCWlmIChscE51bWJlck9mQnl0ZXNXcml0dGVuKSAqbHBOdW1iZXJPZkJ5dGVzV3JpdHRlbiA9IG5TaXplOworCXJldHVybiBUUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBDb252ZXJ0VG9HbG9iYWxIYW5kbGUgICAgCQkoS0VSTkVMMzIpCiAgKiBGSVhNRTogdGhpcyBpcyBub3QgY29ycmVjdGx5IGltcGxlbWVudGVkLi4uCiAgKi8KZGlmZiAtLWdpdCBhL3NjaGVkdWxlci9zeW5jaHJvLmMgYi9zY2hlZHVsZXIvc3luY2hyby5jCmluZGV4IDgwNTZjNGEuLjJhODJhNDEgMTAwNjQ0Ci0tLSBhL3NjaGVkdWxlci9zeW5jaHJvLmMKKysrIGIvc2NoZWR1bGVyL3N5bmNocm8uYwpAQCAtMTQ1LDggKzE0NSw4IEBACiAKICAgICAvKiBOb3cgd2FpdCBmb3IgaXQgKi8KIAotICAgIGRwcmludGZfaW5mbyh3aW4zMiwgIlNZTkM6IHN0YXJ0aW5nIHdhaXQgKCVwICUwNHgpXG4iLAotICAgICAgICAgICAgICAgICAgIFRIUkVBRF9DdXJyZW50KCksIFRIUkVBRF9DdXJyZW50KCktPnRlYl9zZWwgKTsKKyAgICBUUkFDRSh3aW4zMiwgInN0YXJ0aW5nIHdhaXQgKCVwICUwNHgpXG4iLAorCQkgVEhSRUFEX0N1cnJlbnQoKSwgVEhSRUFEX0N1cnJlbnQoKS0+dGViX3NlbCApOwogCiAgICAgc2lncHJvY21hc2soIFNJR19TRVRNQVNLLCBOVUxMLCAmc2V0ICk7CiAgICAgc2lnZGVsc2V0KCAmc2V0LCBTSUdVU1IxICk7CkBAIC0xODEsOCArMTgxLDggQEAKICAgICAvKiBHcmFiIHRoZSBzeXN0ZW0gbG9jayBhZ2FpbiAqLwogCiAgICAgd2hpbGUgKGNvdW50LS0pIFNZU1RFTV9MT0NLKCk7Ci0gICAgZHByaW50Zl9pbmZvKHdpbjMyLCAiU1lOQzogd2FpdCBmaW5pc2hlZCAoJXAgJTA0eClcbiIsCi0gICAgICAgICAgICAgICAgICAgVEhSRUFEX0N1cnJlbnQoKSwgVEhSRUFEX0N1cnJlbnQoKS0+dGViX3NlbCApOworICAgIFRSQUNFKHdpbjMyLCAid2FpdCBmaW5pc2hlZCAoJXAgJTA0eClcbiIsCisJCSBUSFJFQURfQ3VycmVudCgpLCBUSFJFQURfQ3VycmVudCgpLT50ZWJfc2VsICk7CiAKICAgICAvKiBSZW1vdmUgb3Vyc2VsdmVzIGZyb20gdGhlIGxpc3RzICovCiAKQEAgLTI0NCw3ICsyNDQsNyBAQAogICAgICAgICBUSERCICp0aGRiID0gZW50cnktPnRocmVhZDsKICAgICAgICAgaWYgKFNZTkNfQ2hlY2tDb25kaXRpb24oICZ0aGRiLT53YWl0X3N0cnVjdCwgVEhEQl9UT19USFJFQURfSUQodGhkYikgKSkKICAgICAgICAgewotICAgICAgICAgICAgZHByaW50Zl9pbmZvKHdpbjMyLCAiU1lOQzogd2FraW5nIHVwICUwNHhcbiIsIHRoZGItPnRlYl9zZWwgKTsKKyAgICAgICAgICAgIFRSQUNFKHdpbjMyLCAid2FraW5nIHVwICUwNHhcbiIsIHRoZGItPnRlYl9zZWwgKTsKICAgICAgICAgICAgIGtpbGwoIHRoZGItPnVuaXhfcGlkLCBTSUdVU1IxICk7CiAgICAgICAgICAgICBpZiAoIS0tbWF4KSBicmVhazsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc2NoZWR1bGVyL3RocmVhZC5jIGIvc2NoZWR1bGVyL3RocmVhZC5jCmluZGV4IGZkZmIzNGIuLjNhOTIwNTIgMTAwNjQ0Ci0tLSBhL3NjaGVkdWxlci90aHJlYWQuYworKysgYi9zY2hlZHVsZXIvdGhyZWFkLmMKQEAgLTQxOCw2ICs0MTgsMTIgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBUbHNBbGxvYyAgIChLRVJORUwzMi41MzApCisgKgorICogQWxsb2NhdGVzIGEgdGhyZWFkIGxvY2FsIHN0b3JhZ2UgaW5kZXgKKyAqCisgKiBSRVRVUk5TCisgKglUTFMgSW5kZXgKKyAqCTB4RkZGRkZGRkY6IEZhaWx1cmUKICAqLwogRFdPUkQgV0lOQVBJIFRsc0FsbG9jKHZvaWQpCiB7CkBAIC00NTcsOSArNDYzLDEzIEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgVGxzR2V0VmFsdWUgICAoS0VSTkVMMzIuNTMyKQorICogUkVUVVJOUworICoJITA6IFZhbHVlIHN0b3JlZCBpbiBjYWxsaW5nIHRocmVhZCdzIFRMUyBzbG90IGZvciBpbmRleAorICoJMDogQ2hlY2sgR2V0TGFzdEVycm9yKCkgZm9yIGVycm9yIGNvZGUKICAqLwotTFBWT0lEIFdJTkFQSSBUbHNHZXRWYWx1ZSggRFdPUkQgaW5kZXggKQoteworTFBWT0lEIFdJTkFQSSBUbHNHZXRWYWx1ZSgKKwkgICAgICBEV09SRCBpbmRleCAvKiBUTFMgaW5kZXggdG8gcmV0cmlldmUgdmFsdWUgZm9yICovCispIHsKICAgICBUSERCICp0aHJlYWQgPSBUSFJFQURfQ3VycmVudCgpOwogICAgIGlmIChpbmRleCA+PSA2NCkKICAgICB7CkBAIC00NzMsOSArNDgzLDE0IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgVGxzU2V0VmFsdWUgICAoS0VSTkVMMzIuNTMzKQorICogUkVUVVJOUworICoJVFJVRTogU3VjY2Vzc2Z1bAorICogICAgICBGQUxTRTogRmFpbHVyZQogICovCi1CT09MMzIgV0lOQVBJIFRsc1NldFZhbHVlKCBEV09SRCBpbmRleCwgTFBWT0lEIHZhbHVlICkKLXsKK0JPT0wzMiBXSU5BUEkgVGxzU2V0VmFsdWUoCisJICAgICAgRFdPUkQgaW5kZXgsIC8qIFRMUyBpbmRleCB0byBzZXQgdmFsdWUgZm9yICovCisJICAgICAgTFBWT0lEIHZhbHVlIC8qIHZhbHVlIHRvIGJlIHN0b3JlZCAqLworKSB7CiAgICAgVEhEQiAqdGhyZWFkID0gVEhSRUFEX0N1cnJlbnQoKTsKICAgICBpZiAoaW5kZXggPj0gNjQpCiAgICAgewpAQCAtNTcwLDMgKzU4NSwxNyBAQAogICAgIGZwcmludGYoc3RkbmltcCwiU3VzcGVuZFRocmVhZCgweCUwOHgpLCBTVFVCIVxuIixoYW5kbGUpOwogICAgIHJldHVybiBUUlVFOwogfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldFRocmVhZFRpbWVzICAgKEtFUk5FTDMyKQorICovCitCT09MMzIgV0lOQVBJIEdldFRocmVhZFRpbWVzKCAKKwlIQU5ETEUzMiB0aHJlYWQsIAorCUxQRklMRVRJTUUgY3JlYXRpb250aW1lLAorCUxQRklMRVRJTUUgZXhpdHRpbWUsCisJTFBGSUxFVElNRSBrZXJuZWx0aW1lLAorCUxQRklMRVRJTUUgdXNlcnRpbWUKKykgeworCVNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CisJcmV0dXJuIEZBTFNFOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZmluZF9kZWJ1Z19jaGFubmVscyBiL3Rvb2xzL2ZpbmRfZGVidWdfY2hhbm5lbHMKaW5kZXggMzljNTY2Ni4uZGJlYzg3NyAxMDA2NDQKLS0tIGEvdG9vbHMvZmluZF9kZWJ1Z19jaGFubmVscworKysgYi90b29scy9maW5kX2RlYnVnX2NoYW5uZWxzCkBAIC0zNiw2ICszNiwxMyBAQAogICAgICogICAgKSAgZmlsZXM9IiRAIjs7CiBlc2FjCiAKLWdyZXAgLWggZHByaW50Zl8gJGZpbGVzIC9kZXYvbnVsbCB8IFwKLSAgICBzZWQgJ3MvLipkcHJpbnRmX1tBLVphLXowLTlfXVwrICooICpcKFtBLVphLXowLTlfXSpcKS4qL1wxL2cnIHwgXAotICAgIHNvcnQgfCB1bmlxCisoCitncmVwIC1oICJUUkFDRSAqKCIgJGZpbGVzIC9kZXYvbnVsbCB8IFwKKyAgICBzZWQgJ3MvLipUUkFDRSAqKCAqXChbQS1aYS16MC05X10qXCkuKi9cMS9nJworZ3JlcCAtaCAiRVJSICooIiAkZmlsZXMgL2Rldi9udWxsIHwgXAorICAgIHNlZCAncy8uKkVSUiAqKCAqXChbQS1aYS16MC05X10qXCkuKi9cMS9nJworZ3JlcCAtaCAiRklYTUUgKigiICRmaWxlcyAvZGV2L251bGwgfCBcCisgICAgc2VkICdzLy4qRklYTUUgKiggKlwoW0EtWmEtejAtOV9dKlwpLiovXDEvZycKK2dyZXAgLWggIldBUk4gKigiICRmaWxlcyAvZGV2L251bGwgfCBcCisgICAgc2VkICdzLy4qV0FSTiAqKCAqXChbQS1aYS16MC05X10qXCkuKi9cMS9nJworKSB8IHNvcnQgfCB1bmlxCmRpZmYgLS1naXQgYS90b29scy9tYWtlX1gxMXdyYXBwZXJzIGIvdG9vbHMvbWFrZV9YMTF3cmFwcGVycwppbmRleCAwOGI0NzBjLi4yYjM0YzhiIDEwMDc1NQotLS0gYS90b29scy9tYWtlX1gxMXdyYXBwZXJzCisrKyBiL3Rvb2xzL21ha2VfWDExd3JhcHBlcnMKQEAgLTIxMSwxMyArMjExLDEzIEBACiAjICAgIHByaW50IE9VVEggIiNkZWZpbmUgJGZuX25hbWUgVFMkZm5fbmFtZVxuIjsKICAgICBwcmludCBPVVRDICJ7XG4iOwogICAgIHByaW50IE9VVEMgIiAgJHJlc3VsdGRlY2w7XG4iIGlmICRyZXN1bHRkZWNsOwotICAgIHByaW50IE9VVEMgIiAgZHByaW50Zl9pbmZvKHgxMSwgXCJDYWxsICRmbl9uYW1lXFxuXCIpO1xuIjsKKyAgICBwcmludCBPVVRDICIgIFRSQUNFKHgxMSwgXCJDYWxsICRmbl9uYW1lXFxuXCIpO1xuIjsKICAgICBwcmludCBPVVRDICIgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7XG4iOwogICAgIHByaW50IE9VVEMgIiAgIjsKICAgICBwcmludCBPVVRDICJyID0gIiBpZiAkcmVzdWx0ZGVjbDsKICAgICBwcmludCBPVVRDICIkZm5fbmFtZSgkYWN0dWFscyk7XG4iOwogICAgIHByaW50IE9VVEMgIiAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTtcbiI7Ci0gICAgcHJpbnQgT1VUQyAiICBkcHJpbnRmX2luZm8oeDExLCBcIlJldCAkZm5fbmFtZVxcblwiKTtcbiI7CisgICAgcHJpbnQgT1VUQyAiICBUUkFDRSh4MTEsIFwiUmV0ICRmbl9uYW1lXFxuXCIpO1xuIjsKICAgICBwcmludCBPVVRDICIgIHJldHVybiByO1xuIiBpZiAkcmVzdWx0ZGVjbDsKICAgICBwcmludCBPVVRDICJ9XG4iOwogICAgICR3YW50eyRmbl9uYW1lfSA9IDI7CmRpZmYgLS1naXQgYS90b29scy9tYWtlX2RlYnVnIGIvdG9vbHMvbWFrZV9kZWJ1ZwppbmRleCA2NzQ1MWY2Li4yYzFkNWM2IDEwMDc1NQotLS0gYS90b29scy9tYWtlX2RlYnVnCisrKyBiL3Rvb2xzL21ha2VfZGVidWcKQEAgLTEzLDIxICsxMywzMiBAQAogREVCVUdfREVGU19IPSJpbmNsdWRlL2RlYnVnZGVmcy5oIgogCiBERUJVR19DSEFOTkVMUz0iJCggdG9vbHMvZmluZF9kZWJ1Z19jaGFubmVscyApIgorREVCVUdfQ0xBU1NFUz0iZml4bWUgZXJyIHdhcm4gdHJhY2UiCiAKIHsKICAgICBjYXQgPDxFT0YKIC8qIERvIG5vdCBtb2RpZnkgdGhpcyBmaWxlIC0tIGl0IGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkISAqLwogCi0jaWZuZGVmIF9fREVCVUdUT09MU19ICisjaWZuZGVmIF9fV0lORV9ERUJVR1RPT0xTX0gKICNpbmNsdWRlICJkZWJ1Z3Rvb2xzLmgiCiAjZW5kaWYKIAogRU9GCi0gICAgaT0wCisgICAgZWNobyAiLyogRGVmaW5pdGlvbnMgZm9yIGNoYW5uZWxzIGlkZW50aWZpZXJzICovIgorCisgICAgY2hubz0wCiAgICAgZm9yIGNoIGluICRERUJVR19DSEFOTkVMUwogICAgIGRvCi0JZWNobyAiI2RlZmluZSBkYmNoXyR7Y2h9ICRpIgotCWxldCBpPSRpKzEKKwllY2hvICIjZGVmaW5lIGRiY2hfJHtjaH0gJGNobm8iCisJbGV0IGNobm89JGNobm8rMQorICAgIGRvbmUKKworICAgIGVjaG8gIi8qIERlZmluaXRpb25zIGZvciBjbGFzc2VzIGlkZW50aWZpZXJzICovIgorICAgIGNsbm89MAorICAgIGZvciBjbCBpbiAkREVCVUdfQ0xBU1NFUworICAgIGRvCisJZWNobyAiI2RlZmluZSBkYmNsXyR7Y2x9ICRjbG5vIgorCWxldCBjbG5vPSRjbG5vKzEKICAgICBkb25lCiB9ID4gJERFQlVHX0gKIApAQCAtMzgsMTEgKzQ5LDExIEBACiAgICAgY2F0IDw8RU9GCiAvKiBEbyBub3QgbW9kaWZ5IHRoaXMgZmlsZSAtLSBpdCBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCEgKi8KIAotI2lmbmRlZiBfX0RFQlVHVE9PTFNfSAorI2lmbmRlZiBfX1dJTkVfREVCVUdUT09MU19ICiAjaW5jbHVkZSAiZGVidWd0b29scy5oIgogI2VuZGlmCiAKLSNkZWZpbmUgREVCVUdfQ0hBTk5FTF9DT1VOVCAkaQorI2RlZmluZSBERUJVR19DSEFOTkVMX0NPVU5UICRjaG5vCiAjaWZkZWYgREVCVUdfUlVOVElNRQogc2hvcnQgZGVidWdfbXNnX2VuYWJsZWRbXVtERUJVR19DTEFTU19DT1VOVF0gPSB7CiBFT0YKQEAgLTYwLDEwICs3MSwxNCBAQAogICAgIGRvbmUKICAgICBlY2hvICd9OycKICAgICAKLSAgICBjYXQgPDxFT0YKKyAgICBlY2hvICdjb25zdCBjaGFyKiBkZWJ1Z19jbF9uYW1lW10gPSB7JworICAgIGZvciBjaCBpbiAkREVCVUdfQ0xBU1NFUworICAgIGRvCisJZWNobyAiXCIke2NofVwiLCIKKyAgICBkb25lCisgICAgZWNobyAnfTsnCiAKLWNvbnN0IGNoYXIqIGRlYnVnX2NsX25hbWVbXSA9Ci17ICJmaXhtZSIsICJlcnIiLCAid2FybiIsICJpbmZvIiB9OworICAgIGNhdCA8PEVPRgogCiAjZW5kaWYgLypERUJVR19SVU5USU1FKi8KIApkaWZmIC0tZ2l0IGEvdHN4MTEvdHNfeGxpYi5jIGIvdHN4MTEvdHNfeGxpYi5jCmluZGV4IGQ4MWNiZGYuLjdjZWQ4MDEgMTAwNjQ0Ci0tLSBhL3RzeDExL3RzX3hsaWIuYworKysgYi90c3gxMS90c194bGliLmMKQEAgLTExLDEyNTIgKzExLDEyNTIgQEAKIFhGb250U3RydWN0ICogVFNYTG9hZFF1ZXJ5Rm9udChEaXNwbGF5KiBhMCwgY29uc3QgIGNoYXIqIGExKQogewogICBYRm9udFN0cnVjdCAqIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhMb2FkUXVlcnlGb250XG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYTG9hZFF1ZXJ5Rm9udFxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYTG9hZFF1ZXJ5Rm9udChhMCwgYTEpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhMb2FkUXVlcnlGb250XG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhMb2FkUXVlcnlGb250XG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIFhNb2RpZmllcktleW1hcAkqIFRTWEdldE1vZGlmaWVyTWFwcGluZyhEaXNwbGF5KiBhMCkKIHsKICAgWE1vZGlmaWVyS2V5bWFwCSogcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWEdldE1vZGlmaWVyTWFwcGluZ1xuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWEdldE1vZGlmaWVyTWFwcGluZ1xuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYR2V0TW9kaWZpZXJNYXBwaW5nKGEwKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYR2V0TW9kaWZpZXJNYXBwaW5nXG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhHZXRNb2RpZmllck1hcHBpbmdcbiIpOwogICByZXR1cm4gcjsKIH0KIAogWEltYWdlICogVFNYQ3JlYXRlSW1hZ2UoRGlzcGxheSogYTAsIFZpc3VhbCogYTEsIHVuc2lnbmVkIGludCBhMiwgaW50IGEzLCBpbnQgYTQsIGNoYXIqIGE1LCB1bnNpZ25lZCBpbnQgYTYsIHVuc2lnbmVkIGludCBhNywgaW50IGE4LCBpbnQgYTkpCiB7CiAgIFhJbWFnZSAqIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhDcmVhdGVJbWFnZVxuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWENyZWF0ZUltYWdlXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhDcmVhdGVJbWFnZShhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWENyZWF0ZUltYWdlXG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhDcmVhdGVJbWFnZVxuIik7CiAgIHJldHVybiByOwogfQogCiBYSW1hZ2UgKiBUU1hHZXRJbWFnZShEaXNwbGF5KiBhMCwgRHJhd2FibGUgYTEsIGludCBhMiwgaW50IGEzLCB1bnNpZ25lZCBpbnQgYTQsIHVuc2lnbmVkIGludCBhNSwgdW5zaWduZWQgbG9uZyBhNiwgaW50IGE3KQogewogICBYSW1hZ2UgKiByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYR2V0SW1hZ2VcbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhHZXRJbWFnZVxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYR2V0SW1hZ2UoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYR2V0SW1hZ2VcbiIpOworICBUUkFDRSh4MTEsICJSZXQgWEdldEltYWdlXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIERpc3BsYXkgKiBUU1hPcGVuRGlzcGxheShjb25zdCAgY2hhciogYTApCiB7CiAgIERpc3BsYXkgKiByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYT3BlbkRpc3BsYXlcbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhPcGVuRGlzcGxheVxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYT3BlbkRpc3BsYXkoYTApOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhPcGVuRGlzcGxheVxuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYT3BlbkRpc3BsYXlcbiIpOwogICByZXR1cm4gcjsKIH0KIAogdm9pZCAgVFNYcm1Jbml0aWFsaXplKHZvaWQpCiB7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhybUluaXRpYWxpemVcbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhybUluaXRpYWxpemVcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICBYcm1Jbml0aWFsaXplKCk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWHJtSW5pdGlhbGl6ZVxuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYcm1Jbml0aWFsaXplXG4iKTsKIH0KIAogY2hhciAqIFRTWEdldEF0b21OYW1lKERpc3BsYXkqIGEwLCBBdG9tIGExKQogewogICBjaGFyICogcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWEdldEF0b21OYW1lXG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYR2V0QXRvbU5hbWVcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWEdldEF0b21OYW1lKGEwLCBhMSk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWEdldEF0b21OYW1lXG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhHZXRBdG9tTmFtZVxuIik7CiAgIHJldHVybiByOwogfQogCiBjaGFyICogVFNYS2V5c3ltVG9TdHJpbmcoS2V5U3ltIGEwKQogewogICBjaGFyICogcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWEtleXN5bVRvU3RyaW5nXG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYS2V5c3ltVG9TdHJpbmdcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWEtleXN5bVRvU3RyaW5nKGEwKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYS2V5c3ltVG9TdHJpbmdcbiIpOworICBUUkFDRSh4MTEsICJSZXQgWEtleXN5bVRvU3RyaW5nXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIEF0b20gIFRTWEludGVybkF0b20oRGlzcGxheSogYTAsIGNvbnN0ICBjaGFyKiBhMSwgaW50IGEyKQogewogICBBdG9tICByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYSW50ZXJuQXRvbVxuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWEludGVybkF0b21cbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWEludGVybkF0b20oYTAsIGExLCBhMik7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWEludGVybkF0b21cbiIpOworICBUUkFDRSh4MTEsICJSZXQgWEludGVybkF0b21cbiIpOwogICByZXR1cm4gcjsKIH0KIAogQ29sb3JtYXAgIFRTWENyZWF0ZUNvbG9ybWFwKERpc3BsYXkqIGEwLCBXaW5kb3cgYTEsIFZpc3VhbCogYTIsIGludCBhMykKIHsKICAgQ29sb3JtYXAgIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhDcmVhdGVDb2xvcm1hcFxuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWENyZWF0ZUNvbG9ybWFwXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhDcmVhdGVDb2xvcm1hcChhMCwgYTEsIGEyLCBhMyk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWENyZWF0ZUNvbG9ybWFwXG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhDcmVhdGVDb2xvcm1hcFxuIik7CiAgIHJldHVybiByOwogfQogCiBDdXJzb3IgIFRTWENyZWF0ZVBpeG1hcEN1cnNvcihEaXNwbGF5KiBhMCwgUGl4bWFwIGExLCBQaXhtYXAgYTIsIFhDb2xvciogYTMsIFhDb2xvciogYTQsIHVuc2lnbmVkIGludCBhNSwgdW5zaWduZWQgaW50IGE2KQogewogICBDdXJzb3IgIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhDcmVhdGVQaXhtYXBDdXJzb3JcbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhDcmVhdGVQaXhtYXBDdXJzb3JcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWENyZWF0ZVBpeG1hcEN1cnNvcihhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNik7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWENyZWF0ZVBpeG1hcEN1cnNvclxuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYQ3JlYXRlUGl4bWFwQ3Vyc29yXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIEN1cnNvciAgVFNYQ3JlYXRlRm9udEN1cnNvcihEaXNwbGF5KiBhMCwgdW5zaWduZWQgaW50IGExKQogewogICBDdXJzb3IgIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhDcmVhdGVGb250Q3Vyc29yXG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYQ3JlYXRlRm9udEN1cnNvclxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYQ3JlYXRlRm9udEN1cnNvcihhMCwgYTEpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhDcmVhdGVGb250Q3Vyc29yXG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhDcmVhdGVGb250Q3Vyc29yXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIEdDICBUU1hDcmVhdGVHQyhEaXNwbGF5KiBhMCwgRHJhd2FibGUgYTEsIHVuc2lnbmVkIGxvbmcgYTIsIFhHQ1ZhbHVlcyogYTMpCiB7CiAgIEdDICByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYQ3JlYXRlR0NcbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhDcmVhdGVHQ1xuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYQ3JlYXRlR0MoYTAsIGExLCBhMiwgYTMpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhDcmVhdGVHQ1xuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYQ3JlYXRlR0NcbiIpOwogICByZXR1cm4gcjsKIH0KIAogUGl4bWFwICBUU1hDcmVhdGVQaXhtYXAoRGlzcGxheSogYTAsIERyYXdhYmxlIGExLCB1bnNpZ25lZCBpbnQgYTIsIHVuc2lnbmVkIGludCBhMywgdW5zaWduZWQgaW50IGE0KQogewogICBQaXhtYXAgIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhDcmVhdGVQaXhtYXBcbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhDcmVhdGVQaXhtYXBcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWENyZWF0ZVBpeG1hcChhMCwgYTEsIGEyLCBhMywgYTQpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhDcmVhdGVQaXhtYXBcbiIpOworICBUUkFDRSh4MTEsICJSZXQgWENyZWF0ZVBpeG1hcFxuIik7CiAgIHJldHVybiByOwogfQogCiBQaXhtYXAgIFRTWENyZWF0ZUJpdG1hcEZyb21EYXRhKERpc3BsYXkqIGEwLCBEcmF3YWJsZSBhMSwgY29uc3QgIGNoYXIqIGEyLCB1bnNpZ25lZCBpbnQgYTMsIHVuc2lnbmVkIGludCBhNCkKIHsKICAgUGl4bWFwICByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYQ3JlYXRlQml0bWFwRnJvbURhdGFcbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhDcmVhdGVCaXRtYXBGcm9tRGF0YVxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYQ3JlYXRlQml0bWFwRnJvbURhdGEoYTAsIGExLCBhMiwgYTMsIGE0KTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYQ3JlYXRlQml0bWFwRnJvbURhdGFcbiIpOworICBUUkFDRSh4MTEsICJSZXQgWENyZWF0ZUJpdG1hcEZyb21EYXRhXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIFdpbmRvdyAgVFNYR2V0U2VsZWN0aW9uT3duZXIoRGlzcGxheSogYTAsIEF0b20gYTEpCiB7CiAgIFdpbmRvdyAgcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWEdldFNlbGVjdGlvbk93bmVyXG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYR2V0U2VsZWN0aW9uT3duZXJcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWEdldFNlbGVjdGlvbk93bmVyKGEwLCBhMSk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWEdldFNlbGVjdGlvbk93bmVyXG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhHZXRTZWxlY3Rpb25Pd25lclxuIik7CiAgIHJldHVybiByOwogfQogCiBXaW5kb3cgIFRTWENyZWF0ZVdpbmRvdyhEaXNwbGF5KiBhMCwgV2luZG93IGExLCBpbnQgYTIsIGludCBhMywgdW5zaWduZWQgaW50IGE0LCB1bnNpZ25lZCBpbnQgYTUsIHVuc2lnbmVkIGludCBhNiwgaW50IGE3LCB1bnNpZ25lZCBpbnQgYTgsIFZpc3VhbCogYTksIHVuc2lnbmVkIGxvbmcgYTEwLCBYU2V0V2luZG93QXR0cmlidXRlcyogYTExKQogewogICBXaW5kb3cgIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhDcmVhdGVXaW5kb3dcbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhDcmVhdGVXaW5kb3dcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWENyZWF0ZVdpbmRvdyhhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhDcmVhdGVXaW5kb3dcbiIpOworICBUUkFDRSh4MTEsICJSZXQgWENyZWF0ZVdpbmRvd1xuIik7CiAgIHJldHVybiByOwogfQogCiBjaGFyICoqIFRTWExpc3RGb250cyhEaXNwbGF5KiBhMCwgY29uc3QgIGNoYXIqIGExLCBpbnQgYTIsIGludCogYTMpCiB7CiAgIGNoYXIgKiogcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWExpc3RGb250c1xuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWExpc3RGb250c1xuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYTGlzdEZvbnRzKGEwLCBhMSwgYTIsIGEzKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYTGlzdEZvbnRzXG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhMaXN0Rm9udHNcbiIpOwogICByZXR1cm4gcjsKIH0KIAogS2V5U3ltICBUU1hLZXljb2RlVG9LZXlzeW0oRGlzcGxheSogYTAsIHVuc2lnbmVkIGludCBhMSwgaW50IGEyKQogewogICBLZXlTeW0gIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhLZXljb2RlVG9LZXlzeW1cbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhLZXljb2RlVG9LZXlzeW1cbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWEtleWNvZGVUb0tleXN5bShhMCwgYTEsIGEyKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYS2V5Y29kZVRvS2V5c3ltXG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhLZXljb2RlVG9LZXlzeW1cbiIpOwogICByZXR1cm4gcjsKIH0KIAogS2V5U3ltICBUU1hMb29rdXBLZXlzeW0oWEtleUV2ZW50KiBhMCwgaW50IGExKQogewogICBLZXlTeW0gIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhMb29rdXBLZXlzeW1cbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhMb29rdXBLZXlzeW1cbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWExvb2t1cEtleXN5bShhMCwgYTEpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhMb29rdXBLZXlzeW1cbiIpOworICBUUkFDRSh4MTEsICJSZXQgWExvb2t1cEtleXN5bVxuIik7CiAgIHJldHVybiByOwogfQogCiBLZXlTeW0gKiBUU1hHZXRLZXlib2FyZE1hcHBpbmcoRGlzcGxheSogYTAsIHVuc2lnbmVkIGludCBhMSwgaW50IGEyLCBpbnQqIGEzKQogewogICBLZXlTeW0gKiByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYR2V0S2V5Ym9hcmRNYXBwaW5nXG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYR2V0S2V5Ym9hcmRNYXBwaW5nXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhHZXRLZXlib2FyZE1hcHBpbmcoYTAsIGExLCBhMiwgYTMpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhHZXRLZXlib2FyZE1hcHBpbmdcbiIpOworICBUUkFDRSh4MTEsICJSZXQgWEdldEtleWJvYXJkTWFwcGluZ1xuIik7CiAgIHJldHVybiByOwogfQogCiBjaGFyICogVFNYUmVzb3VyY2VNYW5hZ2VyU3RyaW5nKERpc3BsYXkqIGEwKQogewogICBjaGFyICogcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWFJlc291cmNlTWFuYWdlclN0cmluZ1xuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWFJlc291cmNlTWFuYWdlclN0cmluZ1xuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYUmVzb3VyY2VNYW5hZ2VyU3RyaW5nKGEwKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYUmVzb3VyY2VNYW5hZ2VyU3RyaW5nXG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhSZXNvdXJjZU1hbmFnZXJTdHJpbmdcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICAgVFNYSW5pdFRocmVhZHModm9pZCkKIHsKICAgaW50ICAgcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWEluaXRUaHJlYWRzXG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYSW5pdFRocmVhZHNcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWEluaXRUaHJlYWRzKCk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWEluaXRUaHJlYWRzXG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhJbml0VGhyZWFkc1xuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgKiBUU1hMaXN0RGVwdGhzKERpc3BsYXkqIGEwLCBpbnQgYTEsIGludCogYTIpCiB7CiAgIGludCAqIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhMaXN0RGVwdGhzXG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYTGlzdERlcHRoc1xuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYTGlzdERlcHRocyhhMCwgYTEsIGEyKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYTGlzdERlcHRoc1xuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYTGlzdERlcHRoc1xuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgICBUU1hSZWNvbmZpZ3VyZVdNV2luZG93KERpc3BsYXkqIGEwLCBXaW5kb3cgYTEsIGludCBhMiwgdW5zaWduZWQgaW50IGEzLCBYV2luZG93Q2hhbmdlcyogYTQpCiB7CiAgIGludCAgIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhSZWNvbmZpZ3VyZVdNV2luZG93XG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYUmVjb25maWd1cmVXTVdpbmRvd1xuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYUmVjb25maWd1cmVXTVdpbmRvdyhhMCwgYTEsIGEyLCBhMywgYTQpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhSZWNvbmZpZ3VyZVdNV2luZG93XG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhSZWNvbmZpZ3VyZVdNV2luZG93XG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgIFRTWFNldFdNUHJvdG9jb2xzKERpc3BsYXkqIGEwLCBXaW5kb3cgYTEsIEF0b20qIGEyLCBpbnQgYTMpCiB7CiAgIGludCAgIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhTZXRXTVByb3RvY29sc1xuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWFNldFdNUHJvdG9jb2xzXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhTZXRXTVByb3RvY29scyhhMCwgYTEsIGEyLCBhMyk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWFNldFdNUHJvdG9jb2xzXG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhTZXRXTVByb3RvY29sc1xuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWFNldFRyYW5zaWVudEZvckhpbnQoRGlzcGxheSogYTAsIFdpbmRvdyBhMSwgV2luZG93IGEyKQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhTZXRUcmFuc2llbnRGb3JIaW50XG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYU2V0VHJhbnNpZW50Rm9ySGludFxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYU2V0VHJhbnNpZW50Rm9ySGludChhMCwgYTEsIGEyKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYU2V0VHJhbnNpZW50Rm9ySGludFxuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYU2V0VHJhbnNpZW50Rm9ySGludFxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWEFjdGl2YXRlU2NyZWVuU2F2ZXIoRGlzcGxheSogYTApCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWEFjdGl2YXRlU2NyZWVuU2F2ZXJcbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhBY3RpdmF0ZVNjcmVlblNhdmVyXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhBY3RpdmF0ZVNjcmVlblNhdmVyKGEwKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYQWN0aXZhdGVTY3JlZW5TYXZlclxuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYQWN0aXZhdGVTY3JlZW5TYXZlclxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgICBUU1hBbGxvY0NvbG9yKERpc3BsYXkqIGEwLCBDb2xvcm1hcCBhMSwgWENvbG9yKiBhMikKIHsKICAgaW50ICAgcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWEFsbG9jQ29sb3JcbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhBbGxvY0NvbG9yXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhBbGxvY0NvbG9yKGEwLCBhMSwgYTIpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhBbGxvY0NvbG9yXG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhBbGxvY0NvbG9yXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgIFRTWEFsbG9jQ29sb3JDZWxscyhEaXNwbGF5KiBhMCwgQ29sb3JtYXAgYTEsIGludCBhMiwgdW5zaWduZWQgbG9uZyogYTMsIHVuc2lnbmVkIGludCBhNCwgdW5zaWduZWQgbG9uZyogYTUsIHVuc2lnbmVkIGludCBhNikKIHsKICAgaW50ICAgcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWEFsbG9jQ29sb3JDZWxsc1xuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWEFsbG9jQ29sb3JDZWxsc1xuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYQWxsb2NDb2xvckNlbGxzKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYQWxsb2NDb2xvckNlbGxzXG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhBbGxvY0NvbG9yQ2VsbHNcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hCZWxsKERpc3BsYXkqIGEwLCBpbnQgYTEpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWEJlbGxcbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhCZWxsXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhCZWxsKGEwLCBhMSk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWEJlbGxcbiIpOworICBUUkFDRSh4MTEsICJSZXQgWEJlbGxcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hDaGFuZ2VHQyhEaXNwbGF5KiBhMCwgR0MgYTEsIHVuc2lnbmVkIGxvbmcgYTIsIFhHQ1ZhbHVlcyogYTMpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWENoYW5nZUdDXG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYQ2hhbmdlR0NcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWENoYW5nZUdDKGEwLCBhMSwgYTIsIGEzKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYQ2hhbmdlR0NcbiIpOworICBUUkFDRSh4MTEsICJSZXQgWENoYW5nZUdDXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYQ2hhbmdlS2V5Ym9hcmRDb250cm9sKERpc3BsYXkqIGEwLCB1bnNpZ25lZCBsb25nIGExLCBYS2V5Ym9hcmRDb250cm9sKiBhMikKIHsKICAgaW50ICByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYQ2hhbmdlS2V5Ym9hcmRDb250cm9sXG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYQ2hhbmdlS2V5Ym9hcmRDb250cm9sXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhDaGFuZ2VLZXlib2FyZENvbnRyb2woYTAsIGExLCBhMik7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWENoYW5nZUtleWJvYXJkQ29udHJvbFxuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYQ2hhbmdlS2V5Ym9hcmRDb250cm9sXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYQ2hhbmdlUHJvcGVydHkoRGlzcGxheSogYTAsIFdpbmRvdyBhMSwgQXRvbSBhMiwgQXRvbSBhMywgaW50IGE0LCBpbnQgYTUsIGNvbnN0ICB1bnNpZ25lZCBjaGFyKiBhNiwgaW50IGE3KQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhDaGFuZ2VQcm9wZXJ0eVxuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWENoYW5nZVByb3BlcnR5XG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhDaGFuZ2VQcm9wZXJ0eShhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhDaGFuZ2VQcm9wZXJ0eVxuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYQ2hhbmdlUHJvcGVydHlcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hDaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzKERpc3BsYXkqIGEwLCBXaW5kb3cgYTEsIHVuc2lnbmVkIGxvbmcgYTIsIFhTZXRXaW5kb3dBdHRyaWJ1dGVzKiBhMykKIHsKICAgaW50ICByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYQ2hhbmdlV2luZG93QXR0cmlidXRlc1xuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWENoYW5nZVdpbmRvd0F0dHJpYnV0ZXNcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWENoYW5nZVdpbmRvd0F0dHJpYnV0ZXMoYTAsIGExLCBhMiwgYTMpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhDaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzXG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhDaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgIFRTWENoZWNrVHlwZWRXaW5kb3dFdmVudChEaXNwbGF5KiBhMCwgV2luZG93IGExLCBpbnQgYTIsIFhFdmVudCogYTMpCiB7CiAgIGludCAgIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhDaGVja1R5cGVkV2luZG93RXZlbnRcbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhDaGVja1R5cGVkV2luZG93RXZlbnRcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWENoZWNrVHlwZWRXaW5kb3dFdmVudChhMCwgYTEsIGEyLCBhMyk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWENoZWNrVHlwZWRXaW5kb3dFdmVudFxuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYQ2hlY2tUeXBlZFdpbmRvd0V2ZW50XG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgIFRTWENoZWNrV2luZG93RXZlbnQoRGlzcGxheSogYTAsIFdpbmRvdyBhMSwgbG9uZyBhMiwgWEV2ZW50KiBhMykKIHsKICAgaW50ICAgcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWENoZWNrV2luZG93RXZlbnRcbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhDaGVja1dpbmRvd0V2ZW50XG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhDaGVja1dpbmRvd0V2ZW50KGEwLCBhMSwgYTIsIGEzKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYQ2hlY2tXaW5kb3dFdmVudFxuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYQ2hlY2tXaW5kb3dFdmVudFxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWENvbnZlcnRTZWxlY3Rpb24oRGlzcGxheSogYTAsIEF0b20gYTEsIEF0b20gYTIsIEF0b20gYTMsIFdpbmRvdyBhNCwgVGltZSBhNSkKIHsKICAgaW50ICByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYQ29udmVydFNlbGVjdGlvblxuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWENvbnZlcnRTZWxlY3Rpb25cbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWENvbnZlcnRTZWxlY3Rpb24oYTAsIGExLCBhMiwgYTMsIGE0LCBhNSk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWENvbnZlcnRTZWxlY3Rpb25cbiIpOworICBUUkFDRSh4MTEsICJSZXQgWENvbnZlcnRTZWxlY3Rpb25cbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hDb3B5QXJlYShEaXNwbGF5KiBhMCwgRHJhd2FibGUgYTEsIERyYXdhYmxlIGEyLCBHQyBhMywgaW50IGE0LCBpbnQgYTUsIHVuc2lnbmVkIGludCBhNiwgdW5zaWduZWQgaW50IGE3LCBpbnQgYTgsIGludCBhOSkKIHsKICAgaW50ICByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYQ29weUFyZWFcbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhDb3B5QXJlYVxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYQ29weUFyZWEoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhDb3B5QXJlYVxuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYQ29weUFyZWFcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hDb3B5UGxhbmUoRGlzcGxheSogYTAsIERyYXdhYmxlIGExLCBEcmF3YWJsZSBhMiwgR0MgYTMsIGludCBhNCwgaW50IGE1LCB1bnNpZ25lZCBpbnQgYTYsIHVuc2lnbmVkIGludCBhNywgaW50IGE4LCBpbnQgYTksIHVuc2lnbmVkIGxvbmcgYTEwKQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhDb3B5UGxhbmVcbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhDb3B5UGxhbmVcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWENvcHlQbGFuZShhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYQ29weVBsYW5lXG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhDb3B5UGxhbmVcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hEZWZpbmVDdXJzb3IoRGlzcGxheSogYTAsIFdpbmRvdyBhMSwgQ3Vyc29yIGEyKQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhEZWZpbmVDdXJzb3JcbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhEZWZpbmVDdXJzb3JcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWERlZmluZUN1cnNvcihhMCwgYTEsIGEyKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYRGVmaW5lQ3Vyc29yXG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhEZWZpbmVDdXJzb3JcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hEZXN0cm95V2luZG93KERpc3BsYXkqIGEwLCBXaW5kb3cgYTEpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWERlc3Ryb3lXaW5kb3dcbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhEZXN0cm95V2luZG93XG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhEZXN0cm95V2luZG93KGEwLCBhMSk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWERlc3Ryb3lXaW5kb3dcbiIpOworICBUUkFDRSh4MTEsICJSZXQgWERlc3Ryb3lXaW5kb3dcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hEaXNwbGF5S2V5Y29kZXMoRGlzcGxheSogYTAsIGludCogYTEsIGludCogYTIpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWERpc3BsYXlLZXljb2Rlc1xuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWERpc3BsYXlLZXljb2Rlc1xuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYRGlzcGxheUtleWNvZGVzKGEwLCBhMSwgYTIpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhEaXNwbGF5S2V5Y29kZXNcbiIpOworICBUUkFDRSh4MTEsICJSZXQgWERpc3BsYXlLZXljb2Rlc1xuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWERyYXdBcmMoRGlzcGxheSogYTAsIERyYXdhYmxlIGExLCBHQyBhMiwgaW50IGEzLCBpbnQgYTQsIHVuc2lnbmVkIGludCBhNSwgdW5zaWduZWQgaW50IGE2LCBpbnQgYTcsIGludCBhOCkKIHsKICAgaW50ICByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYRHJhd0FyY1xuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWERyYXdBcmNcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWERyYXdBcmMoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWERyYXdBcmNcbiIpOworICBUUkFDRSh4MTEsICJSZXQgWERyYXdBcmNcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hEcmF3TGluZShEaXNwbGF5KiBhMCwgRHJhd2FibGUgYTEsIEdDIGEyLCBpbnQgYTMsIGludCBhNCwgaW50IGE1LCBpbnQgYTYpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWERyYXdMaW5lXG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYRHJhd0xpbmVcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWERyYXdMaW5lKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYRHJhd0xpbmVcbiIpOworICBUUkFDRSh4MTEsICJSZXQgWERyYXdMaW5lXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYRHJhd0xpbmVzKERpc3BsYXkqIGEwLCBEcmF3YWJsZSBhMSwgR0MgYTIsIFhQb2ludCogYTMsIGludCBhNCwgaW50IGE1KQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhEcmF3TGluZXNcbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhEcmF3TGluZXNcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWERyYXdMaW5lcyhhMCwgYTEsIGEyLCBhMywgYTQsIGE1KTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYRHJhd0xpbmVzXG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhEcmF3TGluZXNcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hEcmF3UG9pbnQoRGlzcGxheSogYTAsIERyYXdhYmxlIGExLCBHQyBhMiwgaW50IGEzLCBpbnQgYTQpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWERyYXdQb2ludFxuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWERyYXdQb2ludFxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYRHJhd1BvaW50KGEwLCBhMSwgYTIsIGEzLCBhNCk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWERyYXdQb2ludFxuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYRHJhd1BvaW50XG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYRHJhd1JlY3RhbmdsZShEaXNwbGF5KiBhMCwgRHJhd2FibGUgYTEsIEdDIGEyLCBpbnQgYTMsIGludCBhNCwgdW5zaWduZWQgaW50IGE1LCB1bnNpZ25lZCBpbnQgYTYpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWERyYXdSZWN0YW5nbGVcbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhEcmF3UmVjdGFuZ2xlXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhEcmF3UmVjdGFuZ2xlKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYRHJhd1JlY3RhbmdsZVxuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYRHJhd1JlY3RhbmdsZVxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWERyYXdTZWdtZW50cyhEaXNwbGF5KiBhMCwgRHJhd2FibGUgYTEsIEdDIGEyLCBYU2VnbWVudCogYTMsIGludCBhNCkKIHsKICAgaW50ICByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYRHJhd1NlZ21lbnRzXG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYRHJhd1NlZ21lbnRzXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhEcmF3U2VnbWVudHMoYTAsIGExLCBhMiwgYTMsIGE0KTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYRHJhd1NlZ21lbnRzXG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhEcmF3U2VnbWVudHNcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hEcmF3U3RyaW5nKERpc3BsYXkqIGEwLCBEcmF3YWJsZSBhMSwgR0MgYTIsIGludCBhMywgaW50IGE0LCBjb25zdCAgY2hhciogYTUsIGludCBhNikKIHsKICAgaW50ICByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYRHJhd1N0cmluZ1xuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWERyYXdTdHJpbmdcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWERyYXdTdHJpbmcoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhEcmF3U3RyaW5nXG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhEcmF3U3RyaW5nXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYRHJhd1RleHQoRGlzcGxheSogYTAsIERyYXdhYmxlIGExLCBHQyBhMiwgaW50IGEzLCBpbnQgYTQsIFhUZXh0SXRlbSogYTUsIGludCBhNikKIHsKICAgaW50ICByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYRHJhd1RleHRcbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhEcmF3VGV4dFxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYRHJhd1RleHQoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhEcmF3VGV4dFxuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYRHJhd1RleHRcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hGaWxsQXJjKERpc3BsYXkqIGEwLCBEcmF3YWJsZSBhMSwgR0MgYTIsIGludCBhMywgaW50IGE0LCB1bnNpZ25lZCBpbnQgYTUsIHVuc2lnbmVkIGludCBhNiwgaW50IGE3LCBpbnQgYTgpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWEZpbGxBcmNcbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhGaWxsQXJjXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhGaWxsQXJjKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhGaWxsQXJjXG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhGaWxsQXJjXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYRmlsbFBvbHlnb24oRGlzcGxheSogYTAsIERyYXdhYmxlIGExLCBHQyBhMiwgWFBvaW50KiBhMywgaW50IGE0LCBpbnQgYTUsIGludCBhNikKIHsKICAgaW50ICByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYRmlsbFBvbHlnb25cbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhGaWxsUG9seWdvblxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYRmlsbFBvbHlnb24oYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhGaWxsUG9seWdvblxuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYRmlsbFBvbHlnb25cbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hGaWxsUmVjdGFuZ2xlKERpc3BsYXkqIGEwLCBEcmF3YWJsZSBhMSwgR0MgYTIsIGludCBhMywgaW50IGE0LCB1bnNpZ25lZCBpbnQgYTUsIHVuc2lnbmVkIGludCBhNikKIHsKICAgaW50ICByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYRmlsbFJlY3RhbmdsZVxuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWEZpbGxSZWN0YW5nbGVcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWEZpbGxSZWN0YW5nbGUoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhGaWxsUmVjdGFuZ2xlXG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhGaWxsUmVjdGFuZ2xlXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYRmx1c2goRGlzcGxheSogYTApCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWEZsdXNoXG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYRmx1c2hcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWEZsdXNoKGEwKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYRmx1c2hcbiIpOworICBUUkFDRSh4MTEsICJSZXQgWEZsdXNoXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYRnJlZSh2b2lkKiBhMCkKIHsKICAgaW50ICByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYRnJlZVxuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWEZyZWVcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWEZyZWUoYTApOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhGcmVlXG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhGcmVlXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYRnJlZUNvbG9ybWFwKERpc3BsYXkqIGEwLCBDb2xvcm1hcCBhMSkKIHsKICAgaW50ICByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYRnJlZUNvbG9ybWFwXG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYRnJlZUNvbG9ybWFwXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhGcmVlQ29sb3JtYXAoYTAsIGExKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYRnJlZUNvbG9ybWFwXG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhGcmVlQ29sb3JtYXBcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hGcmVlQ29sb3JzKERpc3BsYXkqIGEwLCBDb2xvcm1hcCBhMSwgdW5zaWduZWQgbG9uZyogYTIsIGludCBhMywgdW5zaWduZWQgbG9uZyBhNCkKIHsKICAgaW50ICByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYRnJlZUNvbG9yc1xuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWEZyZWVDb2xvcnNcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWEZyZWVDb2xvcnMoYTAsIGExLCBhMiwgYTMsIGE0KTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYRnJlZUNvbG9yc1xuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYRnJlZUNvbG9yc1xuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWEZyZWVDdXJzb3IoRGlzcGxheSogYTAsIEN1cnNvciBhMSkKIHsKICAgaW50ICByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYRnJlZUN1cnNvclxuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWEZyZWVDdXJzb3JcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWEZyZWVDdXJzb3IoYTAsIGExKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYRnJlZUN1cnNvclxuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYRnJlZUN1cnNvclxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWEZyZWVGb250KERpc3BsYXkqIGEwLCBYRm9udFN0cnVjdCogYTEpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWEZyZWVGb250XG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYRnJlZUZvbnRcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWEZyZWVGb250KGEwLCBhMSk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWEZyZWVGb250XG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhGcmVlRm9udFxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWEZyZWVGb250TmFtZXMoY2hhcioqIGEwKQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhGcmVlRm9udE5hbWVzXG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYRnJlZUZvbnROYW1lc1xuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYRnJlZUZvbnROYW1lcyhhMCk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWEZyZWVGb250TmFtZXNcbiIpOworICBUUkFDRSh4MTEsICJSZXQgWEZyZWVGb250TmFtZXNcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hGcmVlR0MoRGlzcGxheSogYTAsIEdDIGExKQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhGcmVlR0NcbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhGcmVlR0NcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWEZyZWVHQyhhMCwgYTEpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhGcmVlR0NcbiIpOworICBUUkFDRSh4MTEsICJSZXQgWEZyZWVHQ1xuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWEZyZWVNb2RpZmllcm1hcChYTW9kaWZpZXJLZXltYXAqIGEwKQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhGcmVlTW9kaWZpZXJtYXBcbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhGcmVlTW9kaWZpZXJtYXBcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWEZyZWVNb2RpZmllcm1hcChhMCk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWEZyZWVNb2RpZmllcm1hcFxuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYRnJlZU1vZGlmaWVybWFwXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYRnJlZVBpeG1hcChEaXNwbGF5KiBhMCwgUGl4bWFwIGExKQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhGcmVlUGl4bWFwXG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYRnJlZVBpeG1hcFxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYRnJlZVBpeG1hcChhMCwgYTEpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhGcmVlUGl4bWFwXG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhGcmVlUGl4bWFwXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgIFRTWEdldEZvbnRQcm9wZXJ0eShYRm9udFN0cnVjdCogYTAsIEF0b20gYTEsIHVuc2lnbmVkIGxvbmcqIGEyKQogewogICBpbnQgICByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYR2V0Rm9udFByb3BlcnR5XG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYR2V0Rm9udFByb3BlcnR5XG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhHZXRGb250UHJvcGVydHkoYTAsIGExLCBhMik7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWEdldEZvbnRQcm9wZXJ0eVxuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYR2V0Rm9udFByb3BlcnR5XG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgIFRTWEdldEdlb21ldHJ5KERpc3BsYXkqIGEwLCBEcmF3YWJsZSBhMSwgV2luZG93KiBhMiwgaW50KiBhMywgaW50KiBhNCwgdW5zaWduZWQgaW50KiBhNSwgdW5zaWduZWQgaW50KiBhNiwgdW5zaWduZWQgaW50KiBhNywgdW5zaWduZWQgaW50KiBhOCkKIHsKICAgaW50ICAgcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWEdldEdlb21ldHJ5XG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYR2V0R2VvbWV0cnlcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWEdldEdlb21ldHJ5KGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhHZXRHZW9tZXRyeVxuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYR2V0R2VvbWV0cnlcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hHZXRJbnB1dEZvY3VzKERpc3BsYXkqIGEwLCBXaW5kb3cqIGExLCBpbnQqIGEyKQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhHZXRJbnB1dEZvY3VzXG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYR2V0SW5wdXRGb2N1c1xuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYR2V0SW5wdXRGb2N1cyhhMCwgYTEsIGEyKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYR2V0SW5wdXRGb2N1c1xuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYR2V0SW5wdXRGb2N1c1xuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWEdldEtleWJvYXJkQ29udHJvbChEaXNwbGF5KiBhMCwgWEtleWJvYXJkU3RhdGUqIGExKQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhHZXRLZXlib2FyZENvbnRyb2xcbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhHZXRLZXlib2FyZENvbnRyb2xcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWEdldEtleWJvYXJkQ29udHJvbChhMCwgYTEpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhHZXRLZXlib2FyZENvbnRyb2xcbiIpOworICBUUkFDRSh4MTEsICJSZXQgWEdldEtleWJvYXJkQ29udHJvbFxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWEdldFNjcmVlblNhdmVyKERpc3BsYXkqIGEwLCBpbnQqIGExLCBpbnQqIGEyLCBpbnQqIGEzLCBpbnQqIGE0KQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhHZXRTY3JlZW5TYXZlclxuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWEdldFNjcmVlblNhdmVyXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhHZXRTY3JlZW5TYXZlcihhMCwgYTEsIGEyLCBhMywgYTQpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhHZXRTY3JlZW5TYXZlclxuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYR2V0U2NyZWVuU2F2ZXJcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hHZXRXaW5kb3dQcm9wZXJ0eShEaXNwbGF5KiBhMCwgV2luZG93IGExLCBBdG9tIGEyLCBsb25nIGEzLCBsb25nIGE0LCBpbnQgYTUsIEF0b20gYTYsIEF0b20qIGE3LCBpbnQqIGE4LCB1bnNpZ25lZCBsb25nKiBhOSwgdW5zaWduZWQgbG9uZyogYTEwLCB1bnNpZ25lZCBjaGFyKiogYTExKQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhHZXRXaW5kb3dQcm9wZXJ0eVxuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWEdldFdpbmRvd1Byb3BlcnR5XG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhHZXRXaW5kb3dQcm9wZXJ0eShhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhHZXRXaW5kb3dQcm9wZXJ0eVxuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYR2V0V2luZG93UHJvcGVydHlcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICAgVFNYR2V0V2luZG93QXR0cmlidXRlcyhEaXNwbGF5KiBhMCwgV2luZG93IGExLCBYV2luZG93QXR0cmlidXRlcyogYTIpCiB7CiAgIGludCAgIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhHZXRXaW5kb3dBdHRyaWJ1dGVzXG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYR2V0V2luZG93QXR0cmlidXRlc1xuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYR2V0V2luZG93QXR0cmlidXRlcyhhMCwgYTEsIGEyKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYR2V0V2luZG93QXR0cmlidXRlc1xuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYR2V0V2luZG93QXR0cmlidXRlc1xuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWEdyYWJQb2ludGVyKERpc3BsYXkqIGEwLCBXaW5kb3cgYTEsIGludCBhMiwgdW5zaWduZWQgaW50IGEzLCBpbnQgYTQsIGludCBhNSwgV2luZG93IGE2LCBDdXJzb3IgYTcsIFRpbWUgYTgpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWEdyYWJQb2ludGVyXG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYR3JhYlBvaW50ZXJcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWEdyYWJQb2ludGVyKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhHcmFiUG9pbnRlclxuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYR3JhYlBvaW50ZXJcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hHcmFiU2VydmVyKERpc3BsYXkqIGEwKQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhHcmFiU2VydmVyXG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYR3JhYlNlcnZlclxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYR3JhYlNlcnZlcihhMCk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWEdyYWJTZXJ2ZXJcbiIpOworICBUUkFDRSh4MTEsICJSZXQgWEdyYWJTZXJ2ZXJcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hJbnN0YWxsQ29sb3JtYXAoRGlzcGxheSogYTAsIENvbG9ybWFwIGExKQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhJbnN0YWxsQ29sb3JtYXBcbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhJbnN0YWxsQ29sb3JtYXBcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWEluc3RhbGxDb2xvcm1hcChhMCwgYTEpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhJbnN0YWxsQ29sb3JtYXBcbiIpOworICBUUkFDRSh4MTEsICJSZXQgWEluc3RhbGxDb2xvcm1hcFxuIik7CiAgIHJldHVybiByOwogfQogCiBLZXlDb2RlICBUU1hLZXlzeW1Ub0tleWNvZGUoRGlzcGxheSogYTAsIEtleVN5bSBhMSkKIHsKICAgS2V5Q29kZSAgcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWEtleXN5bVRvS2V5Y29kZVxuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWEtleXN5bVRvS2V5Y29kZVxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYS2V5c3ltVG9LZXljb2RlKGEwLCBhMSk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWEtleXN5bVRvS2V5Y29kZVxuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYS2V5c3ltVG9LZXljb2RlXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYTWFwV2luZG93KERpc3BsYXkqIGEwLCBXaW5kb3cgYTEpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWE1hcFdpbmRvd1xuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWE1hcFdpbmRvd1xuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYTWFwV2luZG93KGEwLCBhMSk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWE1hcFdpbmRvd1xuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYTWFwV2luZG93XG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYTmV4dEV2ZW50KERpc3BsYXkqIGEwLCBYRXZlbnQqIGExKQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhOZXh0RXZlbnRcbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhOZXh0RXZlbnRcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWE5leHRFdmVudChhMCwgYTEpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhOZXh0RXZlbnRcbiIpOworICBUUkFDRSh4MTEsICJSZXQgWE5leHRFdmVudFxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWFBhcnNlR2VvbWV0cnkoY29uc3QgIGNoYXIqIGEwLCBpbnQqIGExLCBpbnQqIGEyLCB1bnNpZ25lZCBpbnQqIGEzLCB1bnNpZ25lZCBpbnQqIGE0KQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhQYXJzZUdlb21ldHJ5XG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYUGFyc2VHZW9tZXRyeVxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYUGFyc2VHZW9tZXRyeShhMCwgYTEsIGEyLCBhMywgYTQpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhQYXJzZUdlb21ldHJ5XG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhQYXJzZUdlb21ldHJ5XG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYUGVuZGluZyhEaXNwbGF5KiBhMCkKIHsKICAgaW50ICByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYUGVuZGluZ1xuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWFBlbmRpbmdcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWFBlbmRpbmcoYTApOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhQZW5kaW5nXG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhQZW5kaW5nXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYUHV0QmFja0V2ZW50KERpc3BsYXkqIGEwLCBYRXZlbnQqIGExKQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhQdXRCYWNrRXZlbnRcbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhQdXRCYWNrRXZlbnRcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWFB1dEJhY2tFdmVudChhMCwgYTEpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhQdXRCYWNrRXZlbnRcbiIpOworICBUUkFDRSh4MTEsICJSZXQgWFB1dEJhY2tFdmVudFxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWFB1dEltYWdlKERpc3BsYXkqIGEwLCBEcmF3YWJsZSBhMSwgR0MgYTIsIFhJbWFnZSogYTMsIGludCBhNCwgaW50IGE1LCBpbnQgYTYsIGludCBhNywgdW5zaWduZWQgaW50IGE4LCB1bnNpZ25lZCBpbnQgYTkpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWFB1dEltYWdlXG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYUHV0SW1hZ2VcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWFB1dEltYWdlKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYUHV0SW1hZ2VcbiIpOworICBUUkFDRSh4MTEsICJSZXQgWFB1dEltYWdlXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYUXVlcnlDb2xvcihEaXNwbGF5KiBhMCwgQ29sb3JtYXAgYTEsIFhDb2xvciogYTIpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWFF1ZXJ5Q29sb3JcbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhRdWVyeUNvbG9yXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhRdWVyeUNvbG9yKGEwLCBhMSwgYTIpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhRdWVyeUNvbG9yXG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhRdWVyeUNvbG9yXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgIFRTWFF1ZXJ5UG9pbnRlcihEaXNwbGF5KiBhMCwgV2luZG93IGExLCBXaW5kb3cqIGEyLCBXaW5kb3cqIGEzLCBpbnQqIGE0LCBpbnQqIGE1LCBpbnQqIGE2LCBpbnQqIGE3LCB1bnNpZ25lZCBpbnQqIGE4KQogewogICBpbnQgICByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYUXVlcnlQb2ludGVyXG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYUXVlcnlQb2ludGVyXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhRdWVyeVBvaW50ZXIoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWFF1ZXJ5UG9pbnRlclxuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYUXVlcnlQb2ludGVyXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgIFRTWFF1ZXJ5VHJlZShEaXNwbGF5KiBhMCwgV2luZG93IGExLCBXaW5kb3cqIGEyLCBXaW5kb3cqIGEzLCBXaW5kb3cqKiBhNCwgdW5zaWduZWQgaW50KiBhNSkKIHsKICAgaW50ICAgcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWFF1ZXJ5VHJlZVxuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWFF1ZXJ5VHJlZVxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYUXVlcnlUcmVlKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhRdWVyeVRyZWVcbiIpOworICBUUkFDRSh4MTEsICJSZXQgWFF1ZXJ5VHJlZVxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWFJlc2V0U2NyZWVuU2F2ZXIoRGlzcGxheSogYTApCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWFJlc2V0U2NyZWVuU2F2ZXJcbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhSZXNldFNjcmVlblNhdmVyXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhSZXNldFNjcmVlblNhdmVyKGEwKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYUmVzZXRTY3JlZW5TYXZlclxuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYUmVzZXRTY3JlZW5TYXZlclxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWFJlc3RhY2tXaW5kb3dzKERpc3BsYXkqIGEwLCBXaW5kb3cqIGExLCBpbnQgYTIpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWFJlc3RhY2tXaW5kb3dzXG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYUmVzdGFja1dpbmRvd3NcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWFJlc3RhY2tXaW5kb3dzKGEwLCBhMSwgYTIpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhSZXN0YWNrV2luZG93c1xuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYUmVzdGFja1dpbmRvd3NcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICAgVFNYU2VuZEV2ZW50KERpc3BsYXkqIGEwLCBXaW5kb3cgYTEsIGludCBhMiwgbG9uZyBhMywgWEV2ZW50KiBhNCkKIHsKICAgaW50ICAgcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWFNlbmRFdmVudFxuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWFNlbmRFdmVudFxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYU2VuZEV2ZW50KGEwLCBhMSwgYTIsIGEzLCBhNCk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWFNlbmRFdmVudFxuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYU2VuZEV2ZW50XG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYU2V0QXJjTW9kZShEaXNwbGF5KiBhMCwgR0MgYTEsIGludCBhMikKIHsKICAgaW50ICByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYU2V0QXJjTW9kZVxuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWFNldEFyY01vZGVcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWFNldEFyY01vZGUoYTAsIGExLCBhMik7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWFNldEFyY01vZGVcbiIpOworICBUUkFDRSh4MTEsICJSZXQgWFNldEFyY01vZGVcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hTZXRCYWNrZ3JvdW5kKERpc3BsYXkqIGEwLCBHQyBhMSwgdW5zaWduZWQgbG9uZyBhMikKIHsKICAgaW50ICByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYU2V0QmFja2dyb3VuZFxuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWFNldEJhY2tncm91bmRcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWFNldEJhY2tncm91bmQoYTAsIGExLCBhMik7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWFNldEJhY2tncm91bmRcbiIpOworICBUUkFDRSh4MTEsICJSZXQgWFNldEJhY2tncm91bmRcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hTZXRDbGlwTWFzayhEaXNwbGF5KiBhMCwgR0MgYTEsIFBpeG1hcCBhMikKIHsKICAgaW50ICByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYU2V0Q2xpcE1hc2tcbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhTZXRDbGlwTWFza1xuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYU2V0Q2xpcE1hc2soYTAsIGExLCBhMik7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWFNldENsaXBNYXNrXG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhTZXRDbGlwTWFza1xuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWFNldENsaXBPcmlnaW4oRGlzcGxheSogYTAsIEdDIGExLCBpbnQgYTIsIGludCBhMykKIHsKICAgaW50ICByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYU2V0Q2xpcE9yaWdpblxuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWFNldENsaXBPcmlnaW5cbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWFNldENsaXBPcmlnaW4oYTAsIGExLCBhMiwgYTMpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhTZXRDbGlwT3JpZ2luXG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhTZXRDbGlwT3JpZ2luXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYU2V0Q2xpcFJlY3RhbmdsZXMoRGlzcGxheSogYTAsIEdDIGExLCBpbnQgYTIsIGludCBhMywgWFJlY3RhbmdsZSogYTQsIGludCBhNSwgaW50IGE2KQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhTZXRDbGlwUmVjdGFuZ2xlc1xuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWFNldENsaXBSZWN0YW5nbGVzXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhTZXRDbGlwUmVjdGFuZ2xlcyhhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNik7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWFNldENsaXBSZWN0YW5nbGVzXG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhTZXRDbGlwUmVjdGFuZ2xlc1xuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWFNldERhc2hlcyhEaXNwbGF5KiBhMCwgR0MgYTEsIGludCBhMiwgY29uc3QgIGNoYXIqIGEzLCBpbnQgYTQpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWFNldERhc2hlc1xuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWFNldERhc2hlc1xuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYU2V0RGFzaGVzKGEwLCBhMSwgYTIsIGEzLCBhNCk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWFNldERhc2hlc1xuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYU2V0RGFzaGVzXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYU2V0RmlsbFN0eWxlKERpc3BsYXkqIGEwLCBHQyBhMSwgaW50IGEyKQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhTZXRGaWxsU3R5bGVcbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhTZXRGaWxsU3R5bGVcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWFNldEZpbGxTdHlsZShhMCwgYTEsIGEyKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYU2V0RmlsbFN0eWxlXG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhTZXRGaWxsU3R5bGVcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hTZXRGb3JlZ3JvdW5kKERpc3BsYXkqIGEwLCBHQyBhMSwgdW5zaWduZWQgbG9uZyBhMikKIHsKICAgaW50ICByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYU2V0Rm9yZWdyb3VuZFxuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWFNldEZvcmVncm91bmRcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWFNldEZvcmVncm91bmQoYTAsIGExLCBhMik7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWFNldEZvcmVncm91bmRcbiIpOworICBUUkFDRSh4MTEsICJSZXQgWFNldEZvcmVncm91bmRcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hTZXRGdW5jdGlvbihEaXNwbGF5KiBhMCwgR0MgYTEsIGludCBhMikKIHsKICAgaW50ICByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYU2V0RnVuY3Rpb25cbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhTZXRGdW5jdGlvblxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYU2V0RnVuY3Rpb24oYTAsIGExLCBhMik7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWFNldEZ1bmN0aW9uXG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhTZXRGdW5jdGlvblxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWFNldEdyYXBoaWNzRXhwb3N1cmVzKERpc3BsYXkqIGEwLCBHQyBhMSwgaW50IGEyKQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhTZXRHcmFwaGljc0V4cG9zdXJlc1xuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWFNldEdyYXBoaWNzRXhwb3N1cmVzXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhTZXRHcmFwaGljc0V4cG9zdXJlcyhhMCwgYTEsIGEyKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYU2V0R3JhcGhpY3NFeHBvc3VyZXNcbiIpOworICBUUkFDRSh4MTEsICJSZXQgWFNldEdyYXBoaWNzRXhwb3N1cmVzXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYU2V0SWNvbk5hbWUoRGlzcGxheSogYTAsIFdpbmRvdyBhMSwgY29uc3QgIGNoYXIqIGEyKQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhTZXRJY29uTmFtZVxuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWFNldEljb25OYW1lXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhTZXRJY29uTmFtZShhMCwgYTEsIGEyKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYU2V0SWNvbk5hbWVcbiIpOworICBUUkFDRSh4MTEsICJSZXQgWFNldEljb25OYW1lXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYU2V0SW5wdXRGb2N1cyhEaXNwbGF5KiBhMCwgV2luZG93IGExLCBpbnQgYTIsIFRpbWUgYTMpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWFNldElucHV0Rm9jdXNcbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhTZXRJbnB1dEZvY3VzXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhTZXRJbnB1dEZvY3VzKGEwLCBhMSwgYTIsIGEzKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYU2V0SW5wdXRGb2N1c1xuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYU2V0SW5wdXRGb2N1c1xuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWFNldExpbmVBdHRyaWJ1dGVzKERpc3BsYXkqIGEwLCBHQyBhMSwgdW5zaWduZWQgaW50IGEyLCBpbnQgYTMsIGludCBhNCwgaW50IGE1KQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhTZXRMaW5lQXR0cmlidXRlc1xuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWFNldExpbmVBdHRyaWJ1dGVzXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhTZXRMaW5lQXR0cmlidXRlcyhhMCwgYTEsIGEyLCBhMywgYTQsIGE1KTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYU2V0TGluZUF0dHJpYnV0ZXNcbiIpOworICBUUkFDRSh4MTEsICJSZXQgWFNldExpbmVBdHRyaWJ1dGVzXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYU2V0U2NyZWVuU2F2ZXIoRGlzcGxheSogYTAsIGludCBhMSwgaW50IGEyLCBpbnQgYTMsIGludCBhNCkKIHsKICAgaW50ICByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYU2V0U2NyZWVuU2F2ZXJcbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhTZXRTY3JlZW5TYXZlclxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYU2V0U2NyZWVuU2F2ZXIoYTAsIGExLCBhMiwgYTMsIGE0KTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYU2V0U2NyZWVuU2F2ZXJcbiIpOworICBUUkFDRSh4MTEsICJSZXQgWFNldFNjcmVlblNhdmVyXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYU2V0U2VsZWN0aW9uT3duZXIoRGlzcGxheSogYTAsIEF0b20gYTEsIFdpbmRvdyBhMiwgVGltZSBhMykKIHsKICAgaW50ICByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYU2V0U2VsZWN0aW9uT3duZXJcbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhTZXRTZWxlY3Rpb25Pd25lclxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYU2V0U2VsZWN0aW9uT3duZXIoYTAsIGExLCBhMiwgYTMpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhTZXRTZWxlY3Rpb25Pd25lclxuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYU2V0U2VsZWN0aW9uT3duZXJcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hTZXRTdWJ3aW5kb3dNb2RlKERpc3BsYXkqIGEwLCBHQyBhMSwgaW50IGEyKQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhTZXRTdWJ3aW5kb3dNb2RlXG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYU2V0U3Vid2luZG93TW9kZVxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYU2V0U3Vid2luZG93TW9kZShhMCwgYTEsIGEyKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYU2V0U3Vid2luZG93TW9kZVxuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYU2V0U3Vid2luZG93TW9kZVxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWFN0b3JlQ29sb3IoRGlzcGxheSogYTAsIENvbG9ybWFwIGExLCBYQ29sb3IqIGEyKQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhTdG9yZUNvbG9yXG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYU3RvcmVDb2xvclxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYU3RvcmVDb2xvcihhMCwgYTEsIGEyKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYU3RvcmVDb2xvclxuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYU3RvcmVDb2xvclxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWFN0b3JlTmFtZShEaXNwbGF5KiBhMCwgV2luZG93IGExLCBjb25zdCAgY2hhciogYTIpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWFN0b3JlTmFtZVxuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWFN0b3JlTmFtZVxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYU3RvcmVOYW1lKGEwLCBhMSwgYTIpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhTdG9yZU5hbWVcbiIpOworICBUUkFDRSh4MTEsICJSZXQgWFN0b3JlTmFtZVxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWFN5bmMoRGlzcGxheSogYTAsIGludCBhMSkKIHsKICAgaW50ICByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYU3luY1xuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWFN5bmNcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWFN5bmMoYTAsIGExKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYU3luY1xuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYU3luY1xuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWFRleHRFeHRlbnRzKFhGb250U3RydWN0KiBhMCwgY29uc3QgIGNoYXIqIGExLCBpbnQgYTIsIGludCogYTMsIGludCogYTQsIGludCogYTUsIFhDaGFyU3RydWN0KiBhNikKIHsKICAgaW50ICByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYVGV4dEV4dGVudHNcbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhUZXh0RXh0ZW50c1xuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYVGV4dEV4dGVudHMoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhUZXh0RXh0ZW50c1xuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYVGV4dEV4dGVudHNcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hUZXh0V2lkdGgoWEZvbnRTdHJ1Y3QqIGEwLCBjb25zdCAgY2hhciogYTEsIGludCBhMikKIHsKICAgaW50ICByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYVGV4dFdpZHRoXG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYVGV4dFdpZHRoXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhUZXh0V2lkdGgoYTAsIGExLCBhMik7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWFRleHRXaWR0aFxuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYVGV4dFdpZHRoXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYVW5ncmFiUG9pbnRlcihEaXNwbGF5KiBhMCwgVGltZSBhMSkKIHsKICAgaW50ICByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYVW5ncmFiUG9pbnRlclxuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWFVuZ3JhYlBvaW50ZXJcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWFVuZ3JhYlBvaW50ZXIoYTAsIGExKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYVW5ncmFiUG9pbnRlclxuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYVW5ncmFiUG9pbnRlclxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWFVuZ3JhYlNlcnZlcihEaXNwbGF5KiBhMCkKIHsKICAgaW50ICByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYVW5ncmFiU2VydmVyXG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYVW5ncmFiU2VydmVyXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhVbmdyYWJTZXJ2ZXIoYTApOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhVbmdyYWJTZXJ2ZXJcbiIpOworICBUUkFDRSh4MTEsICJSZXQgWFVuZ3JhYlNlcnZlclxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWFVuaW5zdGFsbENvbG9ybWFwKERpc3BsYXkqIGEwLCBDb2xvcm1hcCBhMSkKIHsKICAgaW50ICByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYVW5pbnN0YWxsQ29sb3JtYXBcbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhVbmluc3RhbGxDb2xvcm1hcFxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYVW5pbnN0YWxsQ29sb3JtYXAoYTAsIGExKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYVW5pbnN0YWxsQ29sb3JtYXBcbiIpOworICBUUkFDRSh4MTEsICJSZXQgWFVuaW5zdGFsbENvbG9ybWFwXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYVW5tYXBXaW5kb3coRGlzcGxheSogYTAsIFdpbmRvdyBhMSkKIHsKICAgaW50ICByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYVW5tYXBXaW5kb3dcbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhVbm1hcFdpbmRvd1xuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYVW5tYXBXaW5kb3coYTAsIGExKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYVW5tYXBXaW5kb3dcbiIpOworICBUUkFDRSh4MTEsICJSZXQgWFVubWFwV2luZG93XG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYV2FycFBvaW50ZXIoRGlzcGxheSogYTAsIFdpbmRvdyBhMSwgV2luZG93IGEyLCBpbnQgYTMsIGludCBhNCwgdW5zaWduZWQgaW50IGE1LCB1bnNpZ25lZCBpbnQgYTYsIGludCBhNywgaW50IGE4KQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhXYXJwUG9pbnRlclxuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWFdhcnBQb2ludGVyXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhXYXJwUG9pbnRlcihhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4KTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYV2FycFBvaW50ZXJcbiIpOworICBUUkFDRSh4MTEsICJSZXQgWFdhcnBQb2ludGVyXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAoKlRTWFN5bmNocm9uaXplKERpc3BsYXkgKmEwLCBCb29sIGExKSkoRGlzcGxheSAqKQogewogICBpbnQgKCpyKShEaXNwbGF5ICopOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYU3luY2hyb25pemVcbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhTeW5jaHJvbml6ZVxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYU3luY2hyb25pemUoYTAsIGExKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYU3luY2hyb25pemVcbiIpOworICBUUkFDRSh4MTEsICJSZXQgWFN5bmNocm9uaXplXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKQEAgLTEyNjQsOSArMTI2NCw5IEBACiAKIHZvaWQgVFNfWEluaXRJbWFnZUZ1bmNQdHJzKFhJbWFnZSAqYTApCiB7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIF9YSW5pdEltYWdlRnVuY1B0cnNcbiIpOworICBUUkFDRSh4MTEsICJDYWxsIF9YSW5pdEltYWdlRnVuY1B0cnNcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICBfWEluaXRJbWFnZUZ1bmNQdHJzKGEwKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBfWEluaXRJbWFnZUZ1bmNQdHJzXG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IF9YSW5pdEltYWdlRnVuY1B0cnNcbiIpOwogfQpkaWZmIC0tZ2l0IGEvdHN4MTEvdHNfeHBtLmMgYi90c3gxMS90c194cG0uYwppbmRleCA5ZWY2ZDljLi5jYjI1MmI0IDEwMDY0NAotLS0gYS90c3gxMS90c194cG0uYworKysgYi90c3gxMS90c194cG0uYwpAQCAtMTEsMjEgKzExLDIxIEBACiBpbnQgVFNYcG1DcmVhdGVQaXhtYXBGcm9tRGF0YShEaXNwbGF5ICphMCwgRHJhd2FibGUgYTEsIGNoYXIgKiphMiwgUGl4bWFwICphMywgUGl4bWFwICphNCwgWHBtQXR0cmlidXRlcyAqYTUpCiB7CiAgIGludCByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYcG1DcmVhdGVQaXhtYXBGcm9tRGF0YVxuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWHBtQ3JlYXRlUGl4bWFwRnJvbURhdGFcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWHBtQ3JlYXRlUGl4bWFwRnJvbURhdGEoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWHBtQ3JlYXRlUGl4bWFwRnJvbURhdGFcbiIpOworICBUUkFDRSh4MTEsICJSZXQgWHBtQ3JlYXRlUGl4bWFwRnJvbURhdGFcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50IFRTWHBtQXR0cmlidXRlc1NpemUodm9pZCkKIHsKICAgaW50IHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhwbUF0dHJpYnV0ZXNTaXplXG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYcG1BdHRyaWJ1dGVzU2l6ZVxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYcG1BdHRyaWJ1dGVzU2l6ZSgpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhwbUF0dHJpYnV0ZXNTaXplXG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhwbUF0dHJpYnV0ZXNTaXplXG4iKTsKICAgcmV0dXJuIHI7CiB9CmRpZmYgLS1naXQgYS90c3gxMS90c194cmVzb3VyY2UuYyBiL3RzeDExL3RzX3hyZXNvdXJjZS5jCmluZGV4IGIyNzJiMWUuLjZhZWU5MGQgMTAwNjQ0Ci0tLSBhL3RzeDExL3RzX3hyZXNvdXJjZS5jCisrKyBiL3RzeDExL3RzX3hyZXNvdXJjZS5jCkBAIC0xMiw2MSArMTIsNjEgQEAKIFhybVF1YXJrICBUU1hybVVuaXF1ZVF1YXJrKHZvaWQpCiB7CiAgIFhybVF1YXJrICByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYcm1VbmlxdWVRdWFya1xuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWHJtVW5pcXVlUXVhcmtcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWHJtVW5pcXVlUXVhcmsoKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYcm1VbmlxdWVRdWFya1xuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYcm1VbmlxdWVRdWFya1xuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgICBUU1hybUdldFJlc291cmNlKFhybURhdGFiYXNlIGEwLCBjb25zdCAgY2hhciogYTEsIGNvbnN0ICBjaGFyKiBhMiwgY2hhcioqIGEzLCBYcm1WYWx1ZSogYTQpCiB7CiAgIGludCAgIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhybUdldFJlc291cmNlXG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYcm1HZXRSZXNvdXJjZVxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYcm1HZXRSZXNvdXJjZShhMCwgYTEsIGEyLCBhMywgYTQpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhybUdldFJlc291cmNlXG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhybUdldFJlc291cmNlXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIFhybURhdGFiYXNlICBUU1hybUdldEZpbGVEYXRhYmFzZShjb25zdCAgY2hhciogYTApCiB7CiAgIFhybURhdGFiYXNlICByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYcm1HZXRGaWxlRGF0YWJhc2VcbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhybUdldEZpbGVEYXRhYmFzZVxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYcm1HZXRGaWxlRGF0YWJhc2UoYTApOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhybUdldEZpbGVEYXRhYmFzZVxuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYcm1HZXRGaWxlRGF0YWJhc2VcbiIpOwogICByZXR1cm4gcjsKIH0KIAogWHJtRGF0YWJhc2UgIFRTWHJtR2V0U3RyaW5nRGF0YWJhc2UoY29uc3QgIGNoYXIqIGEwKQogewogICBYcm1EYXRhYmFzZSAgcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWHJtR2V0U3RyaW5nRGF0YWJhc2VcbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhybUdldFN0cmluZ0RhdGFiYXNlXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhybUdldFN0cmluZ0RhdGFiYXNlKGEwKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYcm1HZXRTdHJpbmdEYXRhYmFzZVxuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYcm1HZXRTdHJpbmdEYXRhYmFzZVxuIik7CiAgIHJldHVybiByOwogfQogCiB2b2lkICBUU1hybU1lcmdlRGF0YWJhc2VzKFhybURhdGFiYXNlIGEwLCBYcm1EYXRhYmFzZSogYTEpCiB7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhybU1lcmdlRGF0YWJhc2VzXG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYcm1NZXJnZURhdGFiYXNlc1xuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIFhybU1lcmdlRGF0YWJhc2VzKGEwLCBhMSk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWHJtTWVyZ2VEYXRhYmFzZXNcbiIpOworICBUUkFDRSh4MTEsICJSZXQgWHJtTWVyZ2VEYXRhYmFzZXNcbiIpOwogfQogCiB2b2lkICBUU1hybVBhcnNlQ29tbWFuZChYcm1EYXRhYmFzZSogYTAsIFhybU9wdGlvbkRlc2NMaXN0IGExLCBpbnQgYTIsIGNvbnN0ICBjaGFyKiBhMywgaW50KiBhNCwgY2hhcioqIGE1KQogewotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYcm1QYXJzZUNvbW1hbmRcbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhybVBhcnNlQ29tbWFuZFxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIFhybVBhcnNlQ29tbWFuZChhMCwgYTEsIGEyLCBhMywgYTQsIGE1KTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYcm1QYXJzZUNvbW1hbmRcbiIpOworICBUUkFDRSh4MTEsICJSZXQgWHJtUGFyc2VDb21tYW5kXG4iKTsKIH0KZGlmZiAtLWdpdCBhL3RzeDExL3RzX3hzaG0uYyBiL3RzeDExL3RzX3hzaG0uYwppbmRleCA5ODkyZjhmLi5lM2FmZTZiIDEwMDY0NAotLS0gYS90c3gxMS90c194c2htLmMKKysrIGIvdHN4MTEvdHNfeHNobS5jCkBAIC0xMiw0MyArMTIsNDMgQEAKIEJvb2wgVFNYU2htUXVlcnlFeHRlbnNpb24oRGlzcGxheSAqYTApCiB7CiAgIEJvb2wgcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWFNobVF1ZXJ5RXh0ZW5zaW9uXG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYU2htUXVlcnlFeHRlbnNpb25cbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWFNobVF1ZXJ5RXh0ZW5zaW9uKGEwKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYU2htUXVlcnlFeHRlbnNpb25cbiIpOworICBUUkFDRSh4MTEsICJSZXQgWFNobVF1ZXJ5RXh0ZW5zaW9uXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCBUU1hTaG1QaXhtYXBGb3JtYXQoRGlzcGxheSAqYTApCiB7CiAgIGludCByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYU2htUGl4bWFwRm9ybWF0XG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYU2htUGl4bWFwRm9ybWF0XG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhTaG1QaXhtYXBGb3JtYXQoYTApOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhTaG1QaXhtYXBGb3JtYXRcbiIpOworICBUUkFDRSh4MTEsICJSZXQgWFNobVBpeG1hcEZvcm1hdFxuIik7CiAgIHJldHVybiByOwogfQogCiBTdGF0dXMgVFNYU2htRGV0YWNoKERpc3BsYXkgKmEwLCBYU2htU2VnbWVudEluZm8gKmExKQogewogICBTdGF0dXMgcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWFNobURldGFjaFxuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWFNobURldGFjaFxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYU2htRGV0YWNoKGEwLCBhMSk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWFNobURldGFjaFxuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYU2htRGV0YWNoXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIFN0YXR1cyBUU1hTaG1BdHRhY2goRGlzcGxheSAqYTAsIFhTaG1TZWdtZW50SW5mbyAqYTEpCiB7CiAgIFN0YXR1cyByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYU2htQXR0YWNoXG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYU2htQXR0YWNoXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhTaG1BdHRhY2goYTAsIGExKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYU2htQXR0YWNoXG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhTaG1BdHRhY2hcbiIpOwogICByZXR1cm4gcjsKIH0KZGlmZiAtLWdpdCBhL3RzeDExL3RzX3h1dGlsLmMgYi90c3gxMS90c194dXRpbC5jCmluZGV4IGFiNDQ3NTEuLjk1NTZjODIgMTAwNjQ0Ci0tLSBhL3RzeDExL3RzX3h1dGlsLmMKKysrIGIvdHN4MTEvdHNfeHV0aWwuYwpAQCAtMTMsMzQ3ICsxMywzNDcgQEAKIFhDbGFzc0hpbnQgKiBUU1hBbGxvY0NsYXNzSGludCh2b2lkKQogewogICBYQ2xhc3NIaW50ICogcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWEFsbG9jQ2xhc3NIaW50XG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYQWxsb2NDbGFzc0hpbnRcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWEFsbG9jQ2xhc3NIaW50KCk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWEFsbG9jQ2xhc3NIaW50XG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhBbGxvY0NsYXNzSGludFxuIik7CiAgIHJldHVybiByOwogfQogCiBYU2l6ZUhpbnRzICogVFNYQWxsb2NTaXplSGludHModm9pZCkKIHsKICAgWFNpemVIaW50cyAqIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhBbGxvY1NpemVIaW50c1xuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWEFsbG9jU2l6ZUhpbnRzXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhBbGxvY1NpemVIaW50cygpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhBbGxvY1NpemVIaW50c1xuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYQWxsb2NTaXplSGludHNcbiIpOwogICByZXR1cm4gcjsKIH0KIAogWFdNSGludHMgKiBUU1hBbGxvY1dNSGludHModm9pZCkKIHsKICAgWFdNSGludHMgKiByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYQWxsb2NXTUhpbnRzXG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYQWxsb2NXTUhpbnRzXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhBbGxvY1dNSGludHMoKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYQWxsb2NXTUhpbnRzXG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhBbGxvY1dNSGludHNcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hDbGlwQm94KFJlZ2lvbiBhMCwgWFJlY3RhbmdsZSogYTEpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWENsaXBCb3hcbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhDbGlwQm94XG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhDbGlwQm94KGEwLCBhMSk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWENsaXBCb3hcbiIpOworICBUUkFDRSh4MTEsICJSZXQgWENsaXBCb3hcbiIpOwogICByZXR1cm4gcjsKIH0KIAogUmVnaW9uICBUU1hDcmVhdGVSZWdpb24odm9pZCkKIHsKICAgUmVnaW9uICByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYQ3JlYXRlUmVnaW9uXG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYQ3JlYXRlUmVnaW9uXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhDcmVhdGVSZWdpb24oKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYQ3JlYXRlUmVnaW9uXG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhDcmVhdGVSZWdpb25cbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hEZWxldGVDb250ZXh0KERpc3BsYXkqIGEwLCBYSUQgYTEsIFhDb250ZXh0IGEyKQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhEZWxldGVDb250ZXh0XG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYRGVsZXRlQ29udGV4dFxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYRGVsZXRlQ29udGV4dChhMCwgYTEsIGEyKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYRGVsZXRlQ29udGV4dFxuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYRGVsZXRlQ29udGV4dFxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWERlc3Ryb3lSZWdpb24oUmVnaW9uIGEwKQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhEZXN0cm95UmVnaW9uXG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYRGVzdHJveVJlZ2lvblxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYRGVzdHJveVJlZ2lvbihhMCk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWERlc3Ryb3lSZWdpb25cbiIpOworICBUUkFDRSh4MTEsICJSZXQgWERlc3Ryb3lSZWdpb25cbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hFbXB0eVJlZ2lvbihSZWdpb24gYTApCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWEVtcHR5UmVnaW9uXG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYRW1wdHlSZWdpb25cbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWEVtcHR5UmVnaW9uKGEwKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYRW1wdHlSZWdpb25cbiIpOworICBUUkFDRSh4MTEsICJSZXQgWEVtcHR5UmVnaW9uXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYRXF1YWxSZWdpb24oUmVnaW9uIGEwLCBSZWdpb24gYTEpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWEVxdWFsUmVnaW9uXG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYRXF1YWxSZWdpb25cbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWEVxdWFsUmVnaW9uKGEwLCBhMSk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWEVxdWFsUmVnaW9uXG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhFcXVhbFJlZ2lvblxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWEZpbmRDb250ZXh0KERpc3BsYXkqIGEwLCBYSUQgYTEsIFhDb250ZXh0IGEyLCBYUG9pbnRlciogYTMpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWEZpbmRDb250ZXh0XG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYRmluZENvbnRleHRcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWEZpbmRDb250ZXh0KGEwLCBhMSwgYTIsIGEzKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYRmluZENvbnRleHRcbiIpOworICBUUkFDRSh4MTEsICJSZXQgWEZpbmRDb250ZXh0XG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIFhWaXN1YWxJbmZvICogVFNYR2V0VmlzdWFsSW5mbyhEaXNwbGF5KiBhMCwgbG9uZyBhMSwgWFZpc3VhbEluZm8qIGEyLCBpbnQqIGEzKQogewogICBYVmlzdWFsSW5mbyAqIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhHZXRWaXN1YWxJbmZvXG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYR2V0VmlzdWFsSW5mb1xuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYR2V0VmlzdWFsSW5mbyhhMCwgYTEsIGEyLCBhMyk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWEdldFZpc3VhbEluZm9cbiIpOworICBUUkFDRSh4MTEsICJSZXQgWEdldFZpc3VhbEluZm9cbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICAgVFNYR2V0V01TaXplSGludHMoRGlzcGxheSogYTAsIFdpbmRvdyBhMSwgWFNpemVIaW50cyogYTIsIGxvbmcqIGEzLCBBdG9tIGE0KQogewogICBpbnQgICByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYR2V0V01TaXplSGludHNcbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhHZXRXTVNpemVIaW50c1xuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYR2V0V01TaXplSGludHMoYTAsIGExLCBhMiwgYTMsIGE0KTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYR2V0V01TaXplSGludHNcbiIpOworICBUUkFDRSh4MTEsICJSZXQgWEdldFdNU2l6ZUhpbnRzXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYSW50ZXJzZWN0UmVnaW9uKFJlZ2lvbiBhMCwgUmVnaW9uIGExLCBSZWdpb24gYTIpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWEludGVyc2VjdFJlZ2lvblxuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWEludGVyc2VjdFJlZ2lvblxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYSW50ZXJzZWN0UmVnaW9uKGEwLCBhMSwgYTIpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhJbnRlcnNlY3RSZWdpb25cbiIpOworICBUUkFDRSh4MTEsICJSZXQgWEludGVyc2VjdFJlZ2lvblxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWExvb2t1cFN0cmluZyhYS2V5RXZlbnQqIGEwLCBjaGFyKiBhMSwgaW50IGEyLCBLZXlTeW0qIGEzLCBYQ29tcG9zZVN0YXR1cyogYTQpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWExvb2t1cFN0cmluZ1xuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWExvb2t1cFN0cmluZ1xuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYTG9va3VwU3RyaW5nKGEwLCBhMSwgYTIsIGEzLCBhNCk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWExvb2t1cFN0cmluZ1xuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYTG9va3VwU3RyaW5nXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYT2Zmc2V0UmVnaW9uKFJlZ2lvbiBhMCwgaW50IGExLCBpbnQgYTIpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWE9mZnNldFJlZ2lvblxuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWE9mZnNldFJlZ2lvblxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYT2Zmc2V0UmVnaW9uKGEwLCBhMSwgYTIpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhPZmZzZXRSZWdpb25cbiIpOworICBUUkFDRSh4MTEsICJSZXQgWE9mZnNldFJlZ2lvblxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgICBUU1hQb2ludEluUmVnaW9uKFJlZ2lvbiBhMCwgaW50IGExLCBpbnQgYTIpCiB7CiAgIGludCAgIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhQb2ludEluUmVnaW9uXG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYUG9pbnRJblJlZ2lvblxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYUG9pbnRJblJlZ2lvbihhMCwgYTEsIGEyKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYUG9pbnRJblJlZ2lvblxuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYUG9pbnRJblJlZ2lvblxuIik7CiAgIHJldHVybiByOwogfQogCiBSZWdpb24gIFRTWFBvbHlnb25SZWdpb24oWFBvaW50KiBhMCwgaW50IGExLCBpbnQgYTIpCiB7CiAgIFJlZ2lvbiAgcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWFBvbHlnb25SZWdpb25cbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhQb2x5Z29uUmVnaW9uXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhQb2x5Z29uUmVnaW9uKGEwLCBhMSwgYTIpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhQb2x5Z29uUmVnaW9uXG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhQb2x5Z29uUmVnaW9uXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYUmVjdEluUmVnaW9uKFJlZ2lvbiBhMCwgaW50IGExLCBpbnQgYTIsIHVuc2lnbmVkIGludCBhMywgdW5zaWduZWQgaW50IGE0KQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhSZWN0SW5SZWdpb25cbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhSZWN0SW5SZWdpb25cbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWFJlY3RJblJlZ2lvbihhMCwgYTEsIGEyLCBhMywgYTQpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhSZWN0SW5SZWdpb25cbiIpOworICBUUkFDRSh4MTEsICJSZXQgWFJlY3RJblJlZ2lvblxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWFNhdmVDb250ZXh0KERpc3BsYXkqIGEwLCBYSUQgYTEsIFhDb250ZXh0IGEyLCBjb25zdCAgY2hhciogYTMpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWFNhdmVDb250ZXh0XG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYU2F2ZUNvbnRleHRcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWFNhdmVDb250ZXh0KGEwLCBhMSwgYTIsIGEzKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYU2F2ZUNvbnRleHRcbiIpOworICBUUkFDRSh4MTEsICJSZXQgWFNhdmVDb250ZXh0XG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIHZvaWQgIFRTWFNldFdNUHJvcGVydGllcyhEaXNwbGF5KiBhMCwgV2luZG93IGExLCBYVGV4dFByb3BlcnR5KiBhMiwgWFRleHRQcm9wZXJ0eSogYTMsIGNoYXIqKiBhNCwgaW50IGE1LCBYU2l6ZUhpbnRzKiBhNiwgWFdNSGludHMqIGE3LCBYQ2xhc3NIaW50KiBhOCkKIHsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWFNldFdNUHJvcGVydGllc1xuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWFNldFdNUHJvcGVydGllc1xuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIFhTZXRXTVByb3BlcnRpZXMoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWFNldFdNUHJvcGVydGllc1xuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYU2V0V01Qcm9wZXJ0aWVzXG4iKTsKIH0KIAogdm9pZCAgVFNYU2V0V01TaXplSGludHMoRGlzcGxheSogYTAsIFdpbmRvdyBhMSwgWFNpemVIaW50cyogYTIsIEF0b20gYTMpCiB7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhTZXRXTVNpemVIaW50c1xuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWFNldFdNU2l6ZUhpbnRzXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgWFNldFdNU2l6ZUhpbnRzKGEwLCBhMSwgYTIsIGEzKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYU2V0V01TaXplSGludHNcbiIpOworICBUUkFDRSh4MTEsICJSZXQgWFNldFdNU2l6ZUhpbnRzXG4iKTsKIH0KIAogaW50ICBUU1hTZXRSZWdpb24oRGlzcGxheSogYTAsIEdDIGExLCBSZWdpb24gYTIpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWFNldFJlZ2lvblxuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWFNldFJlZ2lvblxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYU2V0UmVnaW9uKGEwLCBhMSwgYTIpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhTZXRSZWdpb25cbiIpOworICBUUkFDRSh4MTEsICJSZXQgWFNldFJlZ2lvblxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWFNocmlua1JlZ2lvbihSZWdpb24gYTAsIGludCBhMSwgaW50IGEyKQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhTaHJpbmtSZWdpb25cbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhTaHJpbmtSZWdpb25cbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWFNocmlua1JlZ2lvbihhMCwgYTEsIGEyKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYU2hyaW5rUmVnaW9uXG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhTaHJpbmtSZWdpb25cbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICAgVFNYU3RyaW5nTGlzdFRvVGV4dFByb3BlcnR5KGNoYXIqKiBhMCwgaW50IGExLCBYVGV4dFByb3BlcnR5KiBhMikKIHsKICAgaW50ICAgcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWFN0cmluZ0xpc3RUb1RleHRQcm9wZXJ0eVxuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWFN0cmluZ0xpc3RUb1RleHRQcm9wZXJ0eVxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYU3RyaW5nTGlzdFRvVGV4dFByb3BlcnR5KGEwLCBhMSwgYTIpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhTdHJpbmdMaXN0VG9UZXh0UHJvcGVydHlcbiIpOworICBUUkFDRSh4MTEsICJSZXQgWFN0cmluZ0xpc3RUb1RleHRQcm9wZXJ0eVxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWFN1YnRyYWN0UmVnaW9uKFJlZ2lvbiBhMCwgUmVnaW9uIGExLCBSZWdpb24gYTIpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWFN1YnRyYWN0UmVnaW9uXG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYU3VidHJhY3RSZWdpb25cbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWFN1YnRyYWN0UmVnaW9uKGEwLCBhMSwgYTIpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhTdWJ0cmFjdFJlZ2lvblxuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYU3VidHJhY3RSZWdpb25cbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hVbmlvblJlY3RXaXRoUmVnaW9uKFhSZWN0YW5nbGUqIGEwLCBSZWdpb24gYTEsIFJlZ2lvbiBhMikKIHsKICAgaW50ICByOwotICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYVW5pb25SZWN0V2l0aFJlZ2lvblxuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWFVuaW9uUmVjdFdpdGhSZWdpb25cbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWFVuaW9uUmVjdFdpdGhSZWdpb24oYTAsIGExLCBhMik7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWFVuaW9uUmVjdFdpdGhSZWdpb25cbiIpOworICBUUkFDRSh4MTEsICJSZXQgWFVuaW9uUmVjdFdpdGhSZWdpb25cbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hVbmlvblJlZ2lvbihSZWdpb24gYTAsIFJlZ2lvbiBhMSwgUmVnaW9uIGEyKQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhVbmlvblJlZ2lvblxuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWFVuaW9uUmVnaW9uXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhVbmlvblJlZ2lvbihhMCwgYTEsIGEyKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYVW5pb25SZWdpb25cbiIpOworICBUUkFDRSh4MTEsICJSZXQgWFVuaW9uUmVnaW9uXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYWG9yUmVnaW9uKFJlZ2lvbiBhMCwgUmVnaW9uIGExLCBSZWdpb24gYTIpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWFhvclJlZ2lvblxuIik7CisgIFRSQUNFKHgxMSwgIkNhbGwgWFhvclJlZ2lvblxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYWG9yUmVnaW9uKGEwLCBhMSwgYTIpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhYb3JSZWdpb25cbiIpOworICBUUkFDRSh4MTEsICJSZXQgWFhvclJlZ2lvblxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgVFNYRGVzdHJveUltYWdlKHN0cnVjdCBfWEltYWdlICphMCkKIHsKICAgaW50IHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhEZXN0cm95SW1hZ2VcbiIpOworICBUUkFDRSh4MTEsICJDYWxsIFhEZXN0cm95SW1hZ2VcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWERlc3Ryb3lJbWFnZShhMCk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWERlc3Ryb3lJbWFnZVxuIik7CisgIFRSQUNFKHgxMSwgIlJldCBYRGVzdHJveUltYWdlXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIHN0cnVjdCBfWEltYWdlICogVFNYU3ViSW1hZ2Uoc3RydWN0IF9YSW1hZ2UgKmEwLCBpbnQgYTEsIGludCBhMiwgdW5zaWduZWQgaW50IGEzLCB1bnNpZ25lZCBpbnQgYTQpCiB7CiAgIHN0cnVjdCBfWEltYWdlICogcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWFN1YkltYWdlXG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYU3ViSW1hZ2VcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWFN1YkltYWdlKGEwLCBhMSwgYTIsIGEzLCBhNCk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWFN1YkltYWdlXG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhTdWJJbWFnZVxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgVFNYQWRkUGl4ZWwoc3RydWN0IF9YSW1hZ2UgKmEwLCBsb25nIGExKQogewogICBpbnQgcjsKLSAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWEFkZFBpeGVsXG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYQWRkUGl4ZWxcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWEFkZFBpeGVsKGEwLCBhMSk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWEFkZFBpeGVsXG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhBZGRQaXhlbFxuIik7CiAgIHJldHVybiByOwogfQogCiBYQ29udGV4dCBUU1hVbmlxdWVDb250ZXh0KHZvaWQpCiB7CiAgIFhDb250ZXh0IHI7Ci0gIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhVbmlxdWVDb250ZXh0XG4iKTsKKyAgVFJBQ0UoeDExLCAiQ2FsbCBYVW5pcXVlQ29udGV4dFxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYVW5pcXVlQ29udGV4dCgpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhVbmlxdWVDb250ZXh0XG4iKTsKKyAgVFJBQ0UoeDExLCAiUmV0IFhVbmlxdWVDb250ZXh0XG4iKTsKICAgcmV0dXJuIHI7CiB9CmRpZmYgLS1naXQgYS93aW4zMi9jb2RlX3BhZ2UuYyBiL3dpbjMyL2NvZGVfcGFnZS5jCmluZGV4IGJjZDgwY2UuLjZlZjMzMzUgMTAwNjQ0Ci0tLSBhL3dpbjMyL2NvZGVfcGFnZS5jCisrKyBiL3dpbjMyL2NvZGVfcGFnZS5jCkBAIC0yMDcsNyArMjA3LDcgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBFbnVtU3lzdGVtQ29kZVBhZ2VzMzJBKENPREVQQUdFX0VOVU1QUk9DMzJBIGxwZm5Db2RlUGFnZUVudW0sRFdPUkQgZmxhZ3MpCiB7Ci0JZHByaW50Zl9pbmZvKHdpbjMyLCJFbnVtU3lzdGVtQ29kZVBhZ2VzMzJBKCVwLCUwOGx4KVxuIiwKKwlUUkFDRSh3aW4zMiwiKCVwLCUwOGx4KVxuIiwKIAkJbHBmbkNvZGVQYWdlRW51bSxmbGFncwogCSk7CiAJbHBmbkNvZGVQYWdlRW51bSgiNDM3Iik7CkBAIC0yMjEsNyArMjIxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZmxhZ3MpCiB7CiAgICAgV0NIQVIJKmNwOwotICAgIGRwcmludGZfaW5mbyh3aW4zMiwiRW51bVN5c3RlbUNvZGVQYWdlczMyVyglcCwlMDhseClcbiIsCisgICAgVFJBQ0Uod2luMzIsIiglcCwlMDhseClcbiIsCiAgICAgICAgICAgICAgICAgICBscGZuQ29kZVBhZ2VFbnVtLGZsYWdzICk7CiAKICAgICBjcCA9IEhFQVBfc3RyZHVwQXRvVyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgIjQzNyIgKTsKZGlmZiAtLWdpdCBhL3dpbjMyL2NvbnNvbGUuYyBiL3dpbjMyL2NvbnNvbGUuYwppbmRleCBkMmYxM2I1Li4zYmJmOWY2IDEwMDY0NAotLS0gYS93aW4zMi9jb25zb2xlLmMKKysrIGIvd2luMzIvY29uc29sZS5jCkBAIC00NCw2ICs0NCw3IEBACiAJaW50CW1hc3RlcjsJCQkvKiB4dGVybSBzaWRlIG9mIHB0eSAqLwogCWludAlzbGF2ZTsJCQkvKiB3aW5lIHNpZGUgb2YgcHR5ICovCiAJaW50CXBpZDsJCQkvKiB4dGVybSdzIHBpZCwgLTEgaWYgbm8geHRlcm0gKi8KKyAgICAgICAgTFBTVFIgICB0aXRsZTsgICAgICAgICAgICAgICAgICAvKiB0aXRsZSBvZiBjb25zb2xlICovCiB9IENPTlNPTEU7CiAKIApAQCAtNzksNiArODAsOSBAQAogCiAJb2JqLT50eXBlID0gSzMyT0JKX1VOS05PV047CiAKKwlpZiAoY29uc29sZS0+dGl0bGUpCisJICAJICBIZWFwRnJlZSggU3lzdGVtSGVhcCwgMCwgY29uc29sZS0+dGl0bGUgKTsKKwljb25zb2xlLT50aXRsZSA9IE5VTEw7CiAJLyogbWFrZSBzdXJlIGEgeHRlcm0gZXhpc3RzIHRvIGtpbGwgKi8KIAlpZiAoY29uc29sZS0+cGlkICE9IC0xKSB7CiAJCWtpbGwoY29uc29sZS0+cGlkLCBTSUdURVJNKTsKQEAgLTk0LDggKzk4LDggQEAKIAlDT05TT0xFICpjb25zb2xlID0gKENPTlNPTEUgKilwdHI7CiAJaW50IHJlc3VsdDsKIAotCWRwcmludGZfaW5mbyhjb25zb2xlLCAiQ09OU09MRV9SZWFkOiAlcCAlcCAlbGRcbiIsIHB0ciwgbHBCdWZmZXIsCi0JCSAgICAgIG5OdW1iZXJPZkNoYXJzKTsKKwlUUkFDRShjb25zb2xlLCAiJXAgJXAgJWxkXG4iLCBwdHIsIGxwQnVmZmVyLAorCQkgICAgIG5OdW1iZXJPZkNoYXJzKTsKIAogCSpscE51bWJlck9mQ2hhcnMgPSAwOyAKIApAQCAtMTA3LDYgKzExMSw3IEBACiAJcmV0dXJuIFRSVUU7CiB9CiAKKwogLyogbHBPdmVybGFwcGVkIGlzIGlnbm9yZWQgKi8KIHN0YXRpYyBCT09MMzIgQ09OU09MRV9Xcml0ZShLMzJPQkogKnB0ciwgTFBDVk9JRCBscEJ1ZmZlciwgCiAJCQkgICAgRFdPUkQgbk51bWJlck9mQ2hhcnMsCkBAIC0xMTUsMTkgKzEyMCwyOCBAQAogCUNPTlNPTEUgKmNvbnNvbGUgPSAoQ09OU09MRSAqKXB0cjsKIAlpbnQgcmVzdWx0OwogCi0JZHByaW50Zl9pbmZvKGNvbnNvbGUsICJDT05TT0xFX1dyaXRlOiAlcCAlcCAlbGRcbiIsIHB0ciwgbHBCdWZmZXIsCi0JCSAgICAgIG5OdW1iZXJPZkNoYXJzKTsKKwlUUkFDRShjb25zb2xlLCAiJXAgJXAgJWxkXG4iLCBwdHIsIGxwQnVmZmVyLAorCQkgICAgIG5OdW1iZXJPZkNoYXJzKTsKIAogCSpscE51bWJlck9mQ2hhcnMgPSAwOyAKIAotCS8qIEZJWE1FOiB0aGVyZSB3YXMgYSBsb29wIGhlcmUgYmVmb3JlLCB3aHk/Pz8gKi8KKwkvKiAKKwkgKiBJIGFzc3VtZSB0aGlzIGxvb3AgYXJvdW5kIEVBR0FJTiBpcyBoZXJlIGJlY2F1c2UKKwkgKiB3aW4zMiBkb2Vzbid0IGhhdmUgaW50ZXJydXB0ZWQgc3lzdGVtIGNhbGxzIAorCSAqLwogCi0JaWYgKChyZXN1bHQgPSB3cml0ZShjb25zb2xlLT5zbGF2ZSwgbHBCdWZmZXIsIG5OdW1iZXJPZkNoYXJzKSkgPT0gLTEpIHsKLQkJRklMRV9TZXREb3NFcnJvcigpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCSpscE51bWJlck9mQ2hhcnMgPSByZXN1bHQ7Ci0JcmV0dXJuIFRSVUU7CisJZm9yICg7OykKKyAgICAgICAgeworCQlyZXN1bHQgPSB3cml0ZShjb25zb2xlLT5zbGF2ZSwgbHBCdWZmZXIsIG5OdW1iZXJPZkNoYXJzKTsKKwkJaWYgKHJlc3VsdCAhPSAtMSkgeworCQkJKmxwTnVtYmVyT2ZDaGFycyA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworCQl9CisJCWlmIChlcnJubyAhPSBFSU5UUikgeworCQkJRklMRV9TZXREb3NFcnJvcigpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisgICAgICAgIH0KIH0KIAogCkBAIC0zNjUsNiArMzc5LDcgQEAKICAgICAgICAgY29uc29sZS0+aGVhZGVyLnR5cGUgICAgID0gSzMyT0JKX0NPTlNPTEU7CiAgICAgICAgIGNvbnNvbGUtPmhlYWRlci5yZWZjb3VudCA9IDE7CiAgICAgICAgIGNvbnNvbGUtPnBpZCAgICAgICAgICAgICA9IC0xOworICAgICAgICBjb25zb2xlLT50aXRsZSAgICAgICAgICAgPSBOVUxMOwogCiAJaWYgKHdpbmVfY3JlYXRlQ29uc29sZSgmbWFzdGVyLCAmc2xhdmUsICZwaWQpID09IEZBTFNFKSB7CiAJCUszMk9CSl9EZWNDb3VudCgmY29uc29sZS0+aGVhZGVyKTsKQEAgLTQxMyw2ICs0MjgsNyBAQAogCiAJU2V0TGFzdEVycm9yKEVSUk9SX1NVQ0NFU1MpOwogCVNZU1RFTV9VTkxPQ0soKTsKKwlTZXRDb25zb2xlVGl0bGUzMkEoIldpbmUgQ29uc29sZSIpOwogCXJldHVybiBUUlVFOwogfQogCkBAIC00NDksOCArNDY1LDggQEAKICAqLwogQk9PTDMyIFdJTkFQSSBTZXRDb25zb2xlTW9kZShIQU5ETEUzMiBoY29uLERXT1JEIG1vZGUpCiB7Ci0gICAgZnByaW50ZihzdGRuaW1wLCJTZXRDb25zb2xlTW9kZSglMDh4LCUwOGx4KVxuIixoY29uLG1vZGUpOwotICAgIHJldHVybiBUUlVFOworCWZwcmludGYoc3RkbmltcCwiU2V0Q29uc29sZU1vZGUoJTA4eCwlMDhseClcbiIsaGNvbixtb2RlKTsKKwlyZXR1cm4gVFJVRTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC00NTgsOCArNDc0LDE1IEBACiAgKi8KIERXT1JEIFdJTkFQSSBHZXRDb25zb2xlVGl0bGUzMkEoTFBTVFIgdGl0bGUsRFdPUkQgc2l6ZSkKIHsKLSAgICBsc3RyY3B5bjMyQSh0aXRsZSwiQ29uc29sZSIsc2l6ZSk7Ci0gICAgcmV0dXJuIHN0cmxlbigiQ29uc29sZSIpOworCVBEQjMyICpwZGIgPSBQUk9DRVNTX0N1cnJlbnQoKTsKKwlDT05TT0xFICpjb25zb2xlPSAoQ09OU09MRSAqKXBkYi0+Y29uc29sZTsKKworCWlmKGNvbnNvbGUtPnRpdGxlKSAKKwkgIHsKKwkgICAgbHN0cmNweW4zMkEodGl0bGUsY29uc29sZS0+dGl0bGUsc2l6ZSk7CisJICAgIHJldHVybiBzdHJsZW4odGl0bGUpOworCSAgfQorCXJldHVybiAwOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTQ2Nyw4ICs0OTAsMTQgQEAKICAqLwogRFdPUkQgV0lOQVBJIEdldENvbnNvbGVUaXRsZTMyVyhMUFdTVFIgdGl0bGUsRFdPUkQgc2l6ZSkKIHsKLSAgICBsc3RyY3B5bkF0b1codGl0bGUsIkNvbnNvbGUiLHNpemUpOwotICAgIHJldHVybiBzdHJsZW4oIkNvbnNvbGUiKTsKKwlQREIzMiAqcGRiID0gUFJPQ0VTU19DdXJyZW50KCk7CisJQ09OU09MRSAqY29uc29sZT0gKENPTlNPTEUgKilwZGItPmNvbnNvbGU7CisJaWYoY29uc29sZS0+dGl0bGUpIAorCSAgeworCSAgICBsc3RyY3B5bkF0b1codGl0bGUsY29uc29sZS0+dGl0bGUsc2l6ZSk7CisJICAgIHJldHVybiAobHN0cmxlbjMyVyh0aXRsZSkpOworCSAgfQorCXJldHVybiAwOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTUwNiwxMCArNTM1LDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEV09SRCBscE51bWJlck9mQ2hhcnNXcml0dGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBscFJlc2VydmVkICkKIHsKKyAgICAgICAgQk9PTDMyIHJldDsKKyAgICAgICAgTFBTVFIgeHN0cmluZz1IZWFwQWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIDAsIG5OdW1iZXJPZkNoYXJzVG9Xcml0ZSApOworCisJbHN0cmNweW5XdG9BKCB4c3RyaW5nLCAgbHBCdWZmZXIsbk51bWJlck9mQ2hhcnNUb1dyaXRlKTsKIAogCS8qIEZJWE1FOiBzaG91bGQgSSBjaGVjayBpZiB0aGlzIGlzIGEgY29uc29sZSBoYW5kbGU/ICovCi0JcmV0dXJuIFdyaXRlRmlsZShoQ29uc29sZU91dHB1dCwgbHBCdWZmZXIsIG5OdW1iZXJPZkNoYXJzVG9Xcml0ZSwKKwlyZXQ9IFdyaXRlRmlsZShoQ29uc29sZU91dHB1dCwgeHN0cmluZywgbk51bWJlck9mQ2hhcnNUb1dyaXRlLAogCQkJIGxwTnVtYmVyT2ZDaGFyc1dyaXR0ZW4sIE5VTEwpOworCUhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCB4c3RyaW5nICk7CisJcmV0dXJuIHJldDsKIAogfQogCkBAIC01NDYsOCArNTgxLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERXT1JEIGxwTnVtYmVyT2ZDaGFyc1JlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgbHBSZXNlcnZlZCApCiB7Ci0JcmV0dXJuIFJlYWRGaWxlKGhDb25zb2xlSW5wdXQsIGxwQnVmZmVyLCBuTnVtYmVyT2ZDaGFyc1RvUmVhZCwKKyAgICAgICAgQk9PTDMyIHJldDsKKwlMUFNUUiBidWYgPSAoTFBTVFIpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIAorCQkJCSAgICAgICBuTnVtYmVyT2ZDaGFyc1RvUmVhZCk7CisJcmV0ID0gUmVhZEZpbGUoaENvbnNvbGVJbnB1dCwgYnVmLCBuTnVtYmVyT2ZDaGFyc1RvUmVhZCwKIAkJCWxwTnVtYmVyT2ZDaGFyc1JlYWQsIE5VTEwpOworCWxzdHJjcHluQXRvVyhscEJ1ZmZlcixidWYsbk51bWJlck9mQ2hhcnNUb1JlYWQpOworCSpscE51bWJlck9mQ2hhcnNSZWFkID0gc3RybGVuKGJ1Zik7CisJSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIGJ1ZiApOworCXJldHVybiByZXQ7CiAKICNpZmRlZiBPTEQKIAlMUFNUUiBidWYgPSAoTFBTVFIpSEVBUF94YWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgCkBAIC01NjMsOCArNjA1LDggQEAKIAlsc3RyY3B5bkF0b1cobHBCdWZmZXIsYnVmLG5OdW1iZXJPZkNoYXJzVG9SZWFkKTsKIAkqbHBOdW1iZXJPZkNoYXJzUmVhZCA9IHN0cmxlbihidWYpOwogCUhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBidWYgKTsKLSNlbmRpZgogCXJldHVybiBUUlVFOworI2VuZGlmCiAKIH0KIApAQCAtNTczLDggKzYxNSwzNCBAQAogICovCiBCT09MMzIgV0lOQVBJIFNldENvbnNvbGVUaXRsZTMyQShMUENTVFIgdGl0bGUpCiB7Ci0gICAgZnByaW50ZihzdGRlcnIsIlNldENvbnNvbGVUaXRsZSglcylcbiIsdGl0bGUpOwotICAgIHJldHVybiBUUlVFOworCVBEQjMyICpwZGIgPSBQUk9DRVNTX0N1cnJlbnQoKTsKKwlDT05TT0xFICpjb25zb2xlOworCURXT1JEIHdyaXR0ZW47CisJY2hhciB0aXRsZWZvcm1hdFtdPSJcMDMzXTI7JXNcYSI7IC8qdGhpcyBzaG91bGQgd29yayBmb3IgeHRlcm1zKi8KKwlMUFNUUiB0aXRsZXN0cmluZzsgCisJQk9PTDMyIHJldD1GQUxTRTsKKworCVRSQUNFKGNvbnNvbGUsIlNldENvbnNvbGVUaXRsZSglcylcbiIsdGl0bGUpOworCQorCWNvbnNvbGUgPSAoQ09OU09MRSAqKXBkYi0+Y29uc29sZTsKKwlpZiAoIWNvbnNvbGUpCisJICByZXR1cm4gRkFMU0U7CisJaWYoY29uc29sZS0+dGl0bGUpIC8qIEZyZWUgb2xkIHRpdGxlLCBpZiB0aGVyZSBpcyBvbmUgKi8KKwkgIEhlYXBGcmVlKCBTeXN0ZW1IZWFwLCAwLCBjb25zb2xlLT50aXRsZSApOworCWNvbnNvbGUtPnRpdGxlID0gKExQU1RSKUhlYXBBbGxvYyhTeXN0ZW1IZWFwLCAwLHN0cmxlbih0aXRsZSkrMSk7CisJaWYoY29uc29sZS0+dGl0bGUpIHN0cmNweShjb25zb2xlLT50aXRsZSx0aXRsZSk7CisKKwl0aXRsZXN0cmluZyA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLHN0cmxlbih0aXRsZSkrc3RybGVuKHRpdGxlZm9ybWF0KSsxKTsKKwlpZiAoIXRpdGxlc3RyaW5nKQorCSAgcmV0dXJuIEZBTFNFOworCQorIAlzcHJpbnRmKHRpdGxlc3RyaW5nLHRpdGxlZm9ybWF0LHRpdGxlKTsKKwkvKiBVZ2x5IGNhc3RpbmcgKi8KKwlDT05TT0xFX1dyaXRlKChLMzJPQkogKiljb25zb2xlLHRpdGxlc3RyaW5nLHN0cmxlbih0aXRsZXN0cmluZyksJndyaXR0ZW4sTlVMTCk7CisJaWYgKHdyaXR0ZW4gPT0gc3RybGVuKHRpdGxlc3RyaW5nKSkKKwkgIHJldCA9VFJVRTsKKwlIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgdGl0bGVzdHJpbmcgKTsKKwlyZXR1cm4gcmV0OwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTU4MiwxMCArNjUwLDEyIEBACiAgKi8KIEJPT0wzMiBXSU5BUEkgU2V0Q29uc29sZVRpdGxlMzJXKCBMUENXU1RSIHRpdGxlICkKIHsKKyAgICBCT09MMzIgcmV0OworCiAgICAgTFBTVFIgdGl0bGVBID0gSEVBUF9zdHJkdXBXdG9BKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCB0aXRsZSApOwotICAgIGZwcmludGYoc3RkZXJyLCJTZXRDb25zb2xlVGl0bGUoJXMpXG4iLHRpdGxlQSk7CisgICAgcmV0ID0gU2V0Q29uc29sZVRpdGxlMzJBKHRpdGxlQSk7CiAgICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIHRpdGxlQSApOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiByZXQ7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNjc4LDMgKzc0OCwyMiBAQAogICBmcHJpbnRmIChzdGRuaW1wLCAiU2V0Q29uc29sZUN1cnNvckluZm8zMiAtLSBTVFVCIVxuIik7CiAgIHJldHVybiBUUlVFOwogfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgU2V0Q29uc29sZVdpbmRvd0luZm8zMiAgIChLRVJORUwzMi42MzQpCisgKi8KK0JPT0wzMiBXSU5BUEkgU2V0Q29uc29sZVdpbmRvd0luZm8zMihIQU5ETEUzMiBoY29uLCBCT09MMzIgZmxhZywgTFBTTUFMTF9SRUNUIHdpbmRvdykKK3sKKyAgZnByaW50ZiAoc3RkbmltcCwgIlNldENvbnNvbGVXaW5kb3dJbmZvMzItLSBTVFVCIVxuIik7CisgIHJldHVybiBUUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgKEtFUk5FTDMyLjYzMSkKKyAqLworQk9PTDMyIFdJTkFQSSBTZXRDb25zb2xlVGV4dEF0dHJpYnV0ZTMyKEhBTkRMRTMyIGhjb24sIERXT1JEIGF0dHJpYnV0ZXMpCit7CisgIGZwcmludGYgKHN0ZG5pbXAsICJTZXRDb25zb2xlVGV4dEF0dHJpYnV0ZTMyLS0gU1RVQiFcbiIpOworICByZXR1cm4gVFJVRTsKK30KKwpkaWZmIC0tZ2l0IGEvd2luMzIvZXhjZXB0LmMgYi93aW4zMi9leGNlcHQuYwppbmRleCAwOGNjNzBkLi5mZWRkNDBiIDEwMDY0NAotLS0gYS93aW4zMi9leGNlcHQuYworKysgYi93aW4zMi9leGNlcHQuYwpAQCAtODEsNyArODEsNyBAQAogICAgICAgICAgIChURUJfRVhDRVBUSU9OX0ZSQU1FKHBjb250ZXh0KSAhPSAoKHZvaWQgKikweGZmZmZmZmZmKSkgJiYKICAgICAgICAgICAoVEVCX0VYQ0VQVElPTl9GUkFNRShwY29udGV4dCkgIT0gcEVuZEZyYW1lKSkKICAgIHsKLSAgICAgICBkcHJpbnRmX2luZm8od2luMzIsICJjYWxsaW5nIGV4Y2VwdGlvbiBoYW5kbGVyIGF0IDB4JXhcbiIsCisgICAgICAgVFJBQ0Uod2luMzIsICJjYWxsaW5nIGV4Y2VwdGlvbiBoYW5kbGVyIGF0IDB4JXhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgKGludClURUJfRVhDRVBUSU9OX0ZSQU1FKHBjb250ZXh0KS0+SGFuZGxlciApOwogCiAgICAgICAgZGlzcGF0Y2g9MDsgICAgICAgCkBAIC04OSw3ICs4OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURUJfRVhDRVBUSU9OX0ZSQU1FKHBjb250ZXh0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjb250ZXh0LCAmZGlzcGF0Y2gpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICBkcHJpbnRmX2luZm8od2luMzIsImV4Y2VwdGlvbiBoYW5kbGVyIHJldHVybnMgMHgleCwgZGlzcGF0Y2g9MHgleFxuIiwKKyAgICAgICBUUkFDRSh3aW4zMiwiZXhjZXB0aW9uIGhhbmRsZXIgcmV0dXJucyAweCV4LCBkaXNwYXRjaD0weCV4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsLCAoaW50KSBkaXNwYXRjaCk7CiAgIAogICAgICAgIGlmICgJKHJldHZhbCA9PSBFeGNlcHRpb25Db2xsaWRlZFVud2luZCkgJiYKQEAgLTE0OSwxNCArMTQ5LDE0IEBACiAgICAgCiAgICAgd2hpbGUoKHBmcmFtZSE9TlVMTCkmJihwZnJhbWUhPSgodm9pZCAqKTB4RkZGRkZGRkYpKSkKICAgICB7Ci0gICAgICAgZHByaW50Zl9pbmZvKHdpbjMyLCJjYWxsaW5nIGV4Y2VwdGlvbiBoYW5kbGVyIGF0IDB4JXhcbiIsCisgICAgICAgVFJBQ0Uod2luMzIsImNhbGxpbmcgZXhjZXB0aW9uIGhhbmRsZXIgYXQgMHgleFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIHBmcmFtZS0+SGFuZGxlcik7CiAgICAgICAgZGlzcGF0Y2g9MDsgIAotICAgICAgIGRwcmludGZfaW5mbyhyZWxheSwiQ2FsbFRvMzIoZXhjZXB0PSVwLHJlY29yZD0lcCxmcmFtZT0lcCxjb250ZXh0PSVwLGRpc3BhdGNoPSVwKVxuIiwKKyAgICAgICBUUkFDRShyZWxheSwiKGV4Y2VwdD0lcCxyZWNvcmQ9JXAsZnJhbWU9JXAsY29udGV4dD0lcCxkaXNwYXRjaD0lcClcbiIsCiAgICAgICAgICAgICAgICAgICAgICBwZnJhbWUtPkhhbmRsZXIsICZyZWNvcmQsIHBmcmFtZSwgcGNvbnRleHQsICZkaXNwYXRjaCApOwogICAgICAgIHJldHZhbD1wZnJhbWUtPkhhbmRsZXIoJnJlY29yZCxwZnJhbWUscGNvbnRleHQsJmRpc3BhdGNoKTsKICAKLSAgICAgICBkcHJpbnRmX2luZm8od2luMzIsImV4Y2VwdGlvbiBoYW5kbGVyIHJldHVybnMgMHgleCwgZGlzcGF0Y2g9MHgleFxuIiwKKyAgICAgICBUUkFDRSh3aW4zMiwiZXhjZXB0aW9uIGhhbmRsZXIgcmV0dXJucyAweCV4LCBkaXNwYXRjaD0weCV4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsLCAoaW50KSBkaXNwYXRjaCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICBpZihyZXR2YWw9PUV4Y2VwdGlvbkNvbnRpbnVlRXhlY3V0aW9uKQpAQCAtMTY3LDcgKzE2Nyw3IEBACiAgICBpZiAocmV0dmFsIT1FeGNlcHRpb25Db250aW51ZUV4ZWN1dGlvbikKICAgIHsgICAgCiAgICAgICAgLyogRklYTUU6IHdoYXQgc2hvdWxkIHdlIGRvIGhlcmU/ICovCi0gICAgICAgZHByaW50Zl9pbmZvKHdpbjMyLCJubyBoYW5kbGVyIHdhbnRlZCB0byBoYW5kbGUgdGhlIGV4Y2VwdGlvbiwgZXhpdGluZ1xuIik7CisgICAgICAgVFJBQ0Uod2luMzIsIm5vIGhhbmRsZXIgd2FudGVkIHRvIGhhbmRsZSB0aGUgZXhjZXB0aW9uLCBleGl0aW5nXG4iKTsKICAgICAgICBFeGl0UHJvY2Vzcyhkd0V4Y2VwdGlvbkNvZGUpOyAvKiB3aGF0IHN0YXR1cyBzaG91bGQgYmUgdXNlZCBoZXJlID8gKi8KICAgIH0KIH0KZGlmZiAtLWdpdCBhL3dpbjMyL2ZpbGUuYyBiL3dpbjMyL2ZpbGUuYwppbmRleCA4NWVhMDFmLi44NmE5NTNlIDEwMDY0NAotLS0gYS93aW4zMi9maWxlLmMKKysrIGIvd2luMzIvZmlsZS5jCkBAIC0zNyw4ICszNyw4IEBACiAJSzMyT0JKICppb3B0cjsKIAlCT09MMzIgc3RhdHVzID0gRkFMU0U7CiAJCi0JZHByaW50Zl9pbmZvKGZpbGUsICJXcml0ZUZpbGU6ICVkICVwICVsZFxuIiwgaEZpbGUsIGxwQnVmZmVyLCAKLQkJICAgICAgbnVtYmVyT2ZCeXRlc1RvV3JpdGUpOworCVRSQUNFKGZpbGUsICIlZCAlcCAlbGRcbiIsIGhGaWxlLCBscEJ1ZmZlciwgCisJCSAgICAgbnVtYmVyT2ZCeXRlc1RvV3JpdGUpOwogCQogCWlmICghKGlvcHRyID0gSEFORExFX0dldE9ialB0ciggaEZpbGUsIEszMk9CSl9VTktOT1dOLCAwICkpKSAKIAkJcmV0dXJuIEhGSUxFX0VSUk9SMzI7CkBAIC01OCw4ICs1OCw4IEBACiAJSzMyT0JKICppb3B0cjsKIAlCT09MMzIgc3RhdHVzID0gRkFMU0U7CiAJCi0JZHByaW50Zl9pbmZvKGZpbGUsICJSZWFkRmlsZTogJWQgJXAgJWxkXG4iLCBoRmlsZSwgbHBCdWZmZXIsIAotCQkgICAgICBudW1iZXJPZkJ5dGVzVG9SZWFkKTsKKwlUUkFDRShmaWxlLCAiJWQgJXAgJWxkXG4iLCBoRmlsZSwgbHBCdWZmZXIsIAorCQkgICAgIG51bWJlck9mQnl0ZXNUb1JlYWQpOwogCQogCWlmICghKGlvcHRyID0gSEFORExFX0dldE9ialB0ciggaEZpbGUsIEszMk9CSl9VTktOT1dOLCAwICkpKSAKIAkJcmV0dXJuIEhGSUxFX0VSUk9SMzI7CkBAIC0xMTIsNyArMTEyLDcgQEAKICAgICBjcmVhdGVfZmxhZ3MgPSBUcmFuc2xhdGVDcmVhdGlvbkZsYWdzKGNyZWF0aW9uKTsKIAogICAgIGlmKHRlbXBsYXRlKQotICAgICAgICBkcHJpbnRmX2ZpeG1lKGZpbGUsICJDcmVhdGVGaWxlOiB0ZW1wbGF0ZSBoYW5kbGVzIG5vdCBzdXBwb3J0ZWQuXG4iKTsKKyAgICAgICAgRklYTUUoZmlsZSwgInRlbXBsYXRlIGhhbmRsZXMgbm90IHN1cHBvcnRlZC5cbiIpOwogCiAgICAgLyogSWYgdGhlIG5hbWUgc3RhcnRzIHdpdGggJ1xcPycgb3IgJ1xcLicsIGlnbm9yZSB0aGUgZmlyc3QgMyBjaGFycy4KICAgICAgKi8KQEAgLTEyMyw3ICsxMjMsNyBAQAogICAgICAqLwogICAgIGlmKCFzdHJuY21wKGZpbGVuYW1lLCAiXFxcXCIsIDIpKQogICAgIHsKLSAgICAgICAgZHByaW50Zl9maXhtZShmaWxlLCAiQ3JlYXRlRmlsZTogVU5DIG5hbWVzIG5vdCBzdXBwb3J0ZWQuXG4iKTsKKyAgICAgICAgRklYTUUoZmlsZSwgIlVOQyBuYW1lcyBub3Qgc3VwcG9ydGVkLlxuIik7CiAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CiAgICAgICAgIHJldHVybiBIRklMRV9FUlJPUjMyOwogICAgIH0KQEAgLTIyNSw3ICsyMjUsNyBAQAogICAgIGlmICghRE9TRlNfR2V0RnVsbE5hbWUoIGxwRmlsZU5hbWUsIFRSVUUsICZmdWxsX25hbWUgKSkKICAgICAgICAgcmV0dXJuIEZBTFNFOwogCi0gICAgZHByaW50Zl9pbmZvKGZpbGUsIlNldEZpbGVBdHRyaWJ1dGVzKCVzLCVseClcbiIsbHBGaWxlTmFtZSxhdHRyaWJ1dGVzKTsKKyAgICBUUkFDRShmaWxlLCIoJXMsJWx4KVxuIixscEZpbGVOYW1lLGF0dHJpYnV0ZXMpOwogICAgIGlmIChhdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfTk9STUFMKSB7CiAgICAgICBhdHRyaWJ1dGVzICY9IH5GSUxFX0FUVFJJQlVURV9OT1JNQUw7CiAgICAgICBpZiAoYXR0cmlidXRlcykKZGlmZiAtLWdpdCBhL3dpbjMyL2luaXQuYyBiL3dpbjMyL2luaXQuYwppbmRleCAxNDcyY2MwLi4wYjYxMTUzIDEwMDY0NAotLS0gYS93aW4zMi9pbml0LmMKKysrIGIvd2luMzIvaW5pdC5jCkBAIC04Miw3ICs4MiwxMCBAQAogICBjaGFyICpuYW1lOwogCiAgIG5hbWU9Z2V0bG9naW4oKTsKKyNpZiAwCisgIC8qIEZJWE1FOiBzaG91bGQgdXNlIGdldHB3dWlkKCkgaGVyZSAqLwogICBpZiAoIW5hbWUpIG5hbWU9Y3VzZXJpZChOVUxMKTsKKyNlbmRpZgogICBsZW4gPSBuYW1lID8gc3RybGVuKG5hbWUpIDogMDsKICAgaWYgKCFsZW4gfHwgIWxwU2l6ZSB8fCBsZW4gPiAqbHBTaXplKSB7CiAgICAgaWYgKGxwc3pOYW1lKSAqbHBzek5hbWUgPSAwOwpkaWZmIC0tZ2l0IGEvd2luMzIva2VybmVsMzIuYyBiL3dpbjMyL2tlcm5lbDMyLmMKaW5kZXggYjFkZDk0Mi4uN2VlY2IyMyAxMDA2NDQKLS0tIGEvd2luMzIva2VybmVsMzIuYworKysgYi93aW4zMi9rZXJuZWwzMi5jCkBAIC0xMDMsMTYgKzEwMywxNiBAQAogCVNFR1BUUgkJdGhrYnVmOwogCXN0cnVjdAl0aHVua3N0cnVjdAkqdGhzMTY7CiAKLQlkcHJpbnRmX2luZm8odGh1bmssIlRodW5rQ29ubmVjdDMyKDxzdHJ1Y3Q+LCVzLCVzLCVzLCV4LCVseClcbiIsCisJVFJBQ0UodGh1bmssIig8c3RydWN0PiwlcywlcywlcywleCwlbHgpXG4iLAogCQl0aHVua2Z1bjE2LG1vZHVsZTMyLG1vZHVsZTE2LGhtb2QzMixkbGxpbml0YXJnMQogCSk7Ci0JZHByaW50Zl9pbmZvKHRodW5rLCIJbWFnaWMgPSAlYyVjJWMlY1xuIiwKKwlUUkFDRSh0aHVuaywiCW1hZ2ljID0gJWMlYyVjJWNcbiIsCiAJCXRocy0+bWFnaWNbMF0sCiAJCXRocy0+bWFnaWNbMV0sCiAJCXRocy0+bWFnaWNbMl0sCiAJCXRocy0+bWFnaWNbM10KIAkpOwotCWRwcmludGZfaW5mbyh0aHVuaywiCWxlbmd0aCA9ICVseFxuIix0aHMtPmxlbmd0aCk7CisJVFJBQ0UodGh1bmssIglsZW5ndGggPSAlbHhcbiIsdGhzLT5sZW5ndGgpOwogCWlmIChsc3RybmNtcDMyQSh0aHMtPm1hZ2ljLCJTTDAxIiw0KSYmbHN0cm5jbXAzMkEodGhzLT5tYWdpYywiTFMwMSIsNCkpCiAJCXJldHVybiAwOwogCWhtbT1Mb2FkTW9kdWxlMTYobW9kdWxlMTYsTlVMTCk7CkBAIC0xMzAsNyArMTMwLDcgQEAKIAkJCXJldHVybiAwOwogCQl0aHMtPngwQyA9IChEV09SRCl0aHMxNjsKIAotCQlkcHJpbnRmX2luZm8odGh1bmssIgl0aHMxNiBtYWdpYyBpcyAweCUwOGx4XG4iLCooRFdPUkQqKXRoczE2LT5tYWdpYyk7CisJCVRSQUNFKHRodW5rLCIJdGhzMTYgbWFnaWMgaXMgMHglMDhseFxuIiwqKERXT1JEKil0aHMxNi0+bWFnaWMpOwogCQlpZiAoKigoRFdPUkQqKXRoczE2LT5tYWdpYykgIT0gMHgwMDAwMzA0QykKIAkJCXJldHVybiAwOwogCQlpZiAoISooV09SRCopKCgoTFBCWVRFKXRoczE2KSsweDEyKSkKQEAgLTE4Nyw5ICsxODcsOSBAQAogRFdPUkQgV0lOQVBJIFdPV0NhbGxiYWNrMTYoRkFSUFJPQzE2IGZwcm9jLERXT1JEIGFyZykKIHsKIAlEV09SRAlyZXQ7Ci0JZHByaW50Zl9pbmZvKHRodW5rLCJXT1dDYWxsYmFjazE2KCVwLDB4JTA4bHgpLi4uXG4iLGZwcm9jLGFyZyk7CisJVFJBQ0UodGh1bmssIiglcCwweCUwOGx4KS4uLlxuIixmcHJvYyxhcmcpOwogCXJldCA9ICBDYWxsYmFja3MtPkNhbGxXT1dDYWxsYmFja1Byb2MoZnByb2MsYXJnKTsKLQlkcHJpbnRmX2luZm8odGh1bmssIi4uLiByZXR1cm5zICVsZFxuIixyZXQpOworCVRSQUNFKHRodW5rLCIuLi4gcmV0dXJucyAlbGRcbiIscmV0KTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0yMTIsNyArMjEyLDcgQEAKIHsKIAlITU9EVUxFMzIJaG1vZCA9IExvYWRMaWJyYXJ5MTYoInN5c3RodW5rLmRsbCIpOwogCi0JZHByaW50Zl9pbmZvKHRodW5rLCAiX0tFUk5FTDMyXzUyOiBzeXN0aHVuay5kbGwgbW9kdWxlICVkXG4iLCBobW9kKTsKKwlUUkFDRSh0aHVuaywgInN5c3RodW5rLmRsbCBtb2R1bGUgJWRcbiIsIGhtb2QpOwogCQogCWlmIChobW9kPD0zMikKIAkJcmV0dXJuIDA7CkBAIC0yMzksMjUgKzIzOSwyNyBAQAogCiAJaG1vZCA9IExvYWRMaWJyYXJ5MTYoZGxsMTYpOwogCWlmIChobW9kPDMyKSB7Ci0JCWZwcmludGYoc3RkZXJyLCJLRVJORUwzMl80My0+ZmFpbGVkIHRvIGxvYWQgMTZiaXQgRExMICVzLCBlcnJvciAlZFxuIixkbGwxNixobW9kKTsKKwkJV0FSTih0aHVuaywiZmFpbGVkIHRvIGxvYWQgMTZiaXQgRExMICVzLCBlcnJvciAlZFxuIiwKKwkJCSAgICAgZGxsMTYsaG1vZCk7CiAJCXJldHVybiAwOwogCX0KIAlzZWdhZGRyID0gKERXT1JEKVdJTjMyX0dldFByb2NBZGRyZXNzMTYoaG1vZCwoTFBTVFIpdGhrYnVmKTsKIAlpZiAoIXNlZ2FkZHIpIHsKLQkJZnByaW50ZihzdGRlcnIsIktFUk5FTDMyXzQzLT5ubyAlcyBleHBvcnRlZCBmcm9tICVzIVxuIix0aGtidWYsZGxsMTYpOworCSAgICAgICAgV0FSTih0aHVuaywibm8gJXMgZXhwb3J0ZWQgZnJvbSAlcyFcbiIsdGhrYnVmLGRsbDE2KTsKIAkJcmV0dXJuIDA7CiAJfQogCWFkZHIgPSAoTFBEV09SRClQVFJfU0VHX1RPX0xJTihzZWdhZGRyKTsKIAlpZiAoYWRkclswXSAhPSBsZW4pIHsKLQkJZnByaW50ZihzdGRlcnIsIktFUk5FTDMyXzQzLT50aGtidWYgbGVuZ3RoIG1pc21hdGNoPyAlbGQgdnMgJWxkXG4iLGxlbixhZGRyWzBdKTsKKwkJV0FSTih0aHVuaywidGhrYnVmIGxlbmd0aCBtaXNtYXRjaD8gJWxkIHZzICVsZFxuIixsZW4sYWRkclswXSk7CiAJCXJldHVybiAwOwogCX0KIAlpZiAoIWFkZHJbMV0pCiAJCXJldHVybiAwOwogCSooRFdPUkQqKXRodW5rID0gYWRkclsxXTsKIAotCWRwcmludGZfaW5mbyh0aHVuaywgIl9LRVJORUwzMl80MzogbG9hZGVkIG1vZHVsZSAlZCwgZnVuYyAlcyAoJWQpIEAgJXAgKCVwKSwgcmV0dXJuaW5nICVwXG4iLAotCQkgICAgICBobW9kLCBISVdPUkQodGhrYnVmKT09MCA/ICI8b3JkaW5hbD4iIDogdGhrYnVmLCAoaW50KXRoa2J1ZiwgKHZvaWQqKXNlZ2FkZHIsIGFkZHIsICh2b2lkKilhZGRyWzFdKTsKKwlUUkFDRSh0aHVuaywgImxvYWRlZCBtb2R1bGUgJWQsIGZ1bmMgJXMgKCVkKSBAICVwICglcCksIHJldHVybmluZyAlcFxuIiwKKwkJICAgICBobW9kLCBISVdPUkQodGhrYnVmKT09MCA/ICI8b3JkaW5hbD4iIDogdGhrYnVmLCAoaW50KXRoa2J1ZiwgCisJCSAgICAgKHZvaWQqKXNlZ2FkZHIsIGFkZHIsICh2b2lkKilhZGRyWzFdKTsKIAogCXJldHVybiBhZGRyWzFdOwogfQpAQCAtMjc3LDExICsyNzksMTEgQEAKICAgICAgICAgRFdPUkQgcmV0LHN0YWNrc2l6ZTsKIAlUSERCICp0aGRiID0gVEhSRUFEX0N1cnJlbnQoKTsKIAotCWRwcmludGZfaW5mbyh0aHVuaywiS0VSTkVMMzJfNDUoJSVlYXg9MHglMDhseCglJWN4PTB4JTA0bHgsJSVlZHg9MHglMDhseCkpXG4iLAorCVRSQUNFKHRodW5rLCIoJSVlYXg9MHglMDhseCglJWN4PTB4JTA0bHgsJSVlZHg9MHglMDhseCkpXG4iLAogCQkoRFdPUkQpRUFYX3JlZyhjb250ZXh0KSwoRFdPUkQpQ1hfcmVnKGNvbnRleHQpLChEV09SRClFRFhfcmVnKGNvbnRleHQpCiAJKTsKIAlzdGFja3NpemUgPSBFQlBfcmVnKGNvbnRleHQpLUVTUF9yZWcoY29udGV4dCk7Ci0JZHByaW50Zl9pbmZvKHRodW5rLCIJc3RhY2tzaXplID0gJWxkXG4iLHN0YWNrc2l6ZSk7CisJVFJBQ0UodGh1bmssIglzdGFja3NpemUgPSAlbGRcbiIsc3RhY2tzaXplKTsKIAogCW1lbWNweSgmY29udGV4dDE2LGNvbnRleHQsc2l6ZW9mKGNvbnRleHQxNikpOwogCkBAIC0yOTQsNyArMjk2LDcgQEAKIAlyZXQgPSBDYWxsYmFja3MtPkNhbGxSZWdpc3RlckxvbmdQcm9jKCZjb250ZXh0MTYsMCk7CiAJU1RBQ0sxNl9QT1AoIHRoZGIsIHN0YWNrc2l6ZSApOwogCi0JZHByaW50Zl9pbmZvKHRodW5rLCIuIHJldHVybmVkICUwOGx4XG4iLHJldCk7CisJVFJBQ0UodGh1bmssIi4gcmV0dXJuZWQgJTA4bHhcbiIscmV0KTsKIAlFQVhfcmVnKGNvbnRleHQpIAkgPSByZXQ7CiB9CiAKQEAgLTMxMiwxMiArMzE0LDExIEBACiAJRFdPUkQJcmV0LHN0YWNrc2l6ZTsKIAlUSERCICp0aGRiID0gVEhSRUFEX0N1cnJlbnQoKTsKIAotCWRwcmludGZfaW5mbyh0aHVuaywiX0tFUk5FTDMyXzQwKEVEWD0weCUwOGx4KVxuIiwKLQkJRURYX3JlZyhjb250ZXh0KQotCSk7CisJX19SRVNUT1JFX0VTOworCVRSQUNFKHRodW5rLCIoRURYPTB4JTA4bHgpXG4iLCBFRFhfcmVnKGNvbnRleHQpICk7CiAJc3RhY2tzaXplID0gRUJQX3JlZyhjb250ZXh0KS1FU1BfcmVnKGNvbnRleHQpOwotCWRwcmludGZfaW5mbyh0aHVuaywiCXN0YWNrc2l6ZSA9ICVsZFxuIixzdGFja3NpemUpOwotCWRwcmludGZfaW5mbyh0aHVuaywib24gdG9wIG9mIHN0YWNrOiAweCUwNHhcbiIsKihXT1JEKilFU1BfcmVnKGNvbnRleHQpKTsKKwlUUkFDRSh0aHVuaywiCXN0YWNrc2l6ZSA9ICVsZFxuIixzdGFja3NpemUpOworCVRSQUNFKHRodW5rLCJvbiB0b3Agb2Ygc3RhY2s6IDB4JTA0eFxuIiwqKFdPUkQqKUVTUF9yZWcoY29udGV4dCkpOwogCiAJbWVtY3B5KCZjb250ZXh0MTYsY29udGV4dCxzaXplb2YoY29udGV4dDE2KSk7CiAKQEAgLTMyOSw3ICszMzAsNyBAQAogCXJldCA9IENhbGxiYWNrcy0+Q2FsbFJlZ2lzdGVyU2hvcnRQcm9jKCZjb250ZXh0MTYsMCk7CiAJU1RBQ0sxNl9QT1AoIHRoZGIsIHN0YWNrc2l6ZSApOwogCi0JZHByaW50Zl9pbmZvKHRodW5rLCIuIHJldHVybmVkICUwOGx4XG4iLHJldCk7CisJVFJBQ0UodGh1bmssIi4gcmV0dXJuZWQgJTA4bHhcbiIscmV0KTsKIAlFQVhfcmVnKGNvbnRleHQpIAkgPSByZXQ7CiB9CiAKQEAgLTM4NywyNSArMzg4LDI3IEBACiAJCiAJaG1vZCA9IExvYWRMaWJyYXJ5MTYoZGxsMTYpOwogCWlmIChobW9kPDMyKSB7Ci0JCWZwcmludGYoc3RkZXJyLCJLRVJORUwzMl80MS0+ZmFpbGVkIHRvIGxvYWQgMTZiaXQgRExMICVzLCBlcnJvciAlZFxuIixkbGwxNixobW9kKTsKKwkJV0FSTih0aHVuaywiZmFpbGVkIHRvIGxvYWQgMTZiaXQgRExMICVzLCBlcnJvciAlZFxuIiwKKwkJCSAgICAgZGxsMTYsaG1vZCk7CiAJCXJldHVybiBOVUxMOwogCX0KIAlzZWdhZGRyID0gKERXT1JEKVdJTjMyX0dldFByb2NBZGRyZXNzMTYoaG1vZCwoTFBTVFIpdGhrYnVmKTsKIAlpZiAoIXNlZ2FkZHIpIHsKLQkJZnByaW50ZihzdGRlcnIsIktFUk5FTDMyXzQxLT5ubyAlcyBleHBvcnRlZCBmcm9tICVzIVxuIix0aGtidWYsZGxsMTYpOworCQlXQVJOKHRodW5rLCJubyAlcyBleHBvcnRlZCBmcm9tICVzIVxuIix0aGtidWYsZGxsMTYpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJYWRkciA9IChMUERXT1JEKVBUUl9TRUdfVE9fTElOKHNlZ2FkZHIpOwogCWlmIChhZGRyWzBdICE9IGxlbikgewotCQlmcHJpbnRmKHN0ZGVyciwiS0VSTkVMMzJfNDEtPnRoa2J1ZiBsZW5ndGggbWlzbWF0Y2g/ICVsZCB2cyAlbGRcbiIsbGVuLGFkZHJbMF0pOworCQlXQVJOKHRodW5rLCJ0aGtidWYgbGVuZ3RoIG1pc21hdGNoPyAlbGQgdnMgJWxkXG4iLGxlbixhZGRyWzBdKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCWFkZHIyID0gUFRSX1NFR19UT19MSU4oYWRkclsxXSk7CiAJaWYgKEhJV09SRChhZGRyMikpCiAJCSooRFdPUkQqKXRodW5rID0gKERXT1JEKWFkZHIyOwogCi0JZHByaW50Zl9pbmZvKHRodW5rLCAiX0tFUk5FTDMyXzQxOiBsb2FkZWQgbW9kdWxlICVkLCBmdW5jICVzKCVkKSBAICVwICglcCksIHJldHVybmluZyAlcFxuIiwKLQkJICAgICAgaG1vZCwgSElXT1JEKHRoa2J1Zik9PTAgPyAiPG9yZGluYWw+IiA6IHRoa2J1ZiwgKGludCl0aGtidWYsICh2b2lkKilzZWdhZGRyLCBhZGRyLCBhZGRyMik7CisJVFJBQ0UodGh1bmssICJsb2FkZWQgbW9kdWxlICVkLCBmdW5jICVzKCVkKSBAICVwICglcCksIHJldHVybmluZyAlcFxuIiwKKwkJICAgICAgaG1vZCwgSElXT1JEKHRoa2J1Zik9PTAgPyAiPG9yZGluYWw+IiA6IHRoa2J1ZiwgKGludCl0aGtidWYsIAorCQkgICAgICh2b2lkKilzZWdhZGRyLCBhZGRyLCBhZGRyMik7CiAKIAlyZXR1cm4gYWRkcjI7CiB9CkBAIC00MTksNyArNDIyLDcgQEAKICAqLwogVk9JRCBXSU5BUEkgX0tFUk5FTDMyXzkwKENPTlRFWFQgKmNvbnRleHQpCiB7Ci0JZHByaW50Zl9pbmZvKHRodW5rLCAiX0tFUk5FTDMyXzkwOiBRVCBUaHVuayBwcmltaW5nOyBjb250ZXh0ICVwXG4iLCBjb250ZXh0KTsKKwlUUkFDRSh0aHVuaywgIlFUIFRodW5rIHByaW1pbmc7IGNvbnRleHQgJXBcbiIsIGNvbnRleHQpOwogCQogCV93cml0ZV9xdHRodW5rKChMUEJZVEUpRUFYX3JlZyhjb250ZXh0KSwqKERXT1JEKikoRUFYX3JlZyhjb250ZXh0KStFRFhfcmVnKGNvbnRleHQpKSk7CiAJLyogd2UganVzdCBjYWxsIHRoZSByZWFsIFFUX1RodW5rIHJpZ2h0IG5vdyAKQEAgLTQ0NiwyMyArNDQ5LDI1IEBACiAKIAlobW9kID0gTG9hZExpYnJhcnkxNihkbGwxNik7CiAJaWYgKGhtb2QgPCAzMikgewotCQlmcHJpbnRmKHN0ZGVyciwiS0VSTkVMMzJfNDYtPmNvdWxkbid0IGxvYWQgJXMsIGVycm9yICVkXG4iLGRsbDE2LGhtb2QpOworCQlXQVJOKHRodW5rLCJjb3VsZG4ndCBsb2FkICVzLCBlcnJvciAlZFxuIixkbGwxNixobW9kKTsKIAkJcmV0dXJuOwogCX0KIAlzZWdhZGRyID0gKFNFR1BUUilXSU4zMl9HZXRQcm9jQWRkcmVzczE2KGhtb2QsdGhrYnVmKTsKIAlpZiAoIXNlZ2FkZHIpIHsKLQkJZnByaW50ZihzdGRlcnIsIktFUk5FTDMyXzQ2LT4gaGF2ZW4ndCBmb3VuZCAlcyBpbiAlcyFcbiIsdGhrYnVmLGRsbDE2KTsKKwkJV0FSTih0aHVuaywiaGF2ZW4ndCBmb3VuZCAlcyBpbiAlcyFcbiIsdGhrYnVmLGRsbDE2KTsKIAkJcmV0dXJuOwogCX0KIAlhZGRyID0gKExQRFdPUkQpUFRSX1NFR19UT19MSU4oc2VnYWRkcik7CiAJaWYgKGFkZHJbMF0gIT0gbGVuKSB7Ci0JCWZwcmludGYoc3RkZXJyLCJLRVJORUwzMl80Ni0+IGxlbmd0aCBvZiB0aGtidWYgZGlmZmVycyBmcm9tIGV4cGVjdGVkIGxlbmd0aCEgKCVsZCB2cyAlbGQpXG4iLGFkZHJbMF0sbGVuKTsKKwkgICAgICAgIFdBUk4odGh1bmssImxlbmd0aCBvZiB0aGtidWYgZGlmZmVycyBmcm9tIGV4cGVjdGVkIGxlbmd0aCEgIgorCQkJICAgICAiKCVsZCB2cyAlbGQpXG4iLGFkZHJbMF0sbGVuKTsKIAkJcmV0dXJuOwogCX0KIAkqKERXT1JEKilQVFJfU0VHX1RPX0xJTihhZGRyWzFdKSA9IChEV09SRCl0aHVuazsKIAotCWRwcmludGZfaW5mbyh0aHVuaywgIl9LRVJORUwzMl80NjogbG9hZGVkIG1vZHVsZSAlZCwgZnVuYyAlcyglZCkgQCAlcCAoJXApXG4iLAotCQkgICAgICBobW9kLCBISVdPUkQodGhrYnVmKT09MCA/ICI8b3JkaW5hbD4iIDogdGhrYnVmLCAoaW50KXRoa2J1ZiwgKHZvaWQqKXNlZ2FkZHIsIGFkZHIpOworCVRSQUNFKHRodW5rLCAibG9hZGVkIG1vZHVsZSAlZCwgZnVuYyAlcyglZCkgQCAlcCAoJXApXG4iLAorCQkgICAgIGhtb2QsIEhJV09SRCh0aGtidWYpPT0wID8gIjxvcmRpbmFsPiIgOiB0aGtidWYsIAorCQkgICAgIChpbnQpdGhrYnVmLCAodm9pZCopc2VnYWRkciwgYWRkcik7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC00NzMsNyArNDc4LDcgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBfS0VSTkVMMzJfODcoKQogewotICAgIGRwcmludGZfaW5mbyh0aHVuaywgIl9LRVJORUwzMl84NzogWWVzLCB0aHVua2luZyBpcyBpbml0aWFsaXplZFxuIik7CisgICAgVFJBQ0UodGh1bmssICJZZXMsIHRodW5raW5nIGlzIGluaXRpYWxpemVkXG4iKTsKICAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtNDkwLDExICs0OTUsMTEgQEAKICAgICBEV09SRCBpLHJldDsKICAgICBEV09SRCAqYXJncyA9ICgoRFdPUkQgKikmZnVuKSArIDE7CiAKLSAgICBpZihkZWJ1Z2dpbmdfaW5mbyh0aHVuaykpeworICAgIGlmKFRSQUNFX09OKHRodW5rKSl7CiAgICAgICBkYmdfZGVjbF9zdHIodGh1bmssIDI1Nik7CiAgICAgICBmb3IgKGk9MDtpPG5yLzQ7aSsrKSAKIAlkc3ByaW50Zih0aHVuaywiMHglMDhseCwiLGFyZ3NbaV0pOwotICAgICAgZHByaW50Zl9pbmZvKHRodW5rLCJLRVJORUwzMl84OCglbGQsMHglMDhseCwlcCxbJXNdKVxuIiwKKyAgICAgIFRSQUNFKHRodW5rLCIoJWxkLDB4JTA4bHgsJXAsWyVzXSlcbiIsCiAJCSAgICBucixmbGFncyxmdW4sZGJnX3N0cih0aHVuaykpOwogICAgIH0KICAgICBzd2l0Y2ggKG5yKSB7CkBAIC01MzAsNyArNTM1LDcgQEAKIAlicmVhazsKIAogICAgIH0KLSAgICBkcHJpbnRmX2luZm8odGh1bmssIiByZXR1cm5pbmcgJWxkIC4uLlxuIixyZXQpOworICAgIFRSQUNFKHRodW5rLCIgcmV0dXJuaW5nICVsZCAuLi5cbiIscmV0KTsKICAgICByZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS93aW4zMi9wcm9jZXNzLmMgYi93aW4zMi9wcm9jZXNzLmMKaW5kZXggYzQ1NzFhYi4uMjMyNmY5ZiAxMDA2NDQKLS0tIGEvd2luMzIvcHJvY2Vzcy5jCisrKyBiL3dpbjMyL3Byb2Nlc3MuYwpAQCAtNTAsNyArNTAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRFdPUkQgbHBQcm9jZXNzQWZmaW5pdHlNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRFdPUkQgbHBTeXN0ZW1BZmZpbml0eU1hc2spCiB7Ci0JZHByaW50Zl9pbmZvKHRhc2ssIkdldFByb2Nlc3NBZmZpbml0eU1hc2soJXgsJWx4LCVseClcbiIsCisJVFJBQ0UodGFzaywiKCV4LCVseCwlbHgpXG4iLAogCQloUHJvY2VzcywobHBQcm9jZXNzQWZmaW5pdHlNYXNrPypscFByb2Nlc3NBZmZpbml0eU1hc2s6MCksCiAJCShscFN5c3RlbUFmZmluaXR5TWFzaz8qbHBTeXN0ZW1BZmZpbml0eU1hc2s6MCkpOwogCS8qIEl0IGlzIGRlZmluaXRlbHkgaW1wb3J0YW50IGZvciBhIHByb2Nlc3MgdG8ga25vdyBvbiB3aGF0IHByb2Nlc3NvcgpkaWZmIC0tZ2l0IGEvd2luMzIvdGhyZWFkLmMgYi93aW4zMi90aHJlYWQuYwppbmRleCBlM2Q4ZTcxLi5mZjBiODI0IDEwMDY0NAotLS0gYS93aW4zMi90aHJlYWQuYworKysgYi93aW4zMi90aHJlYWQuYwpAQCAtMTA0LDExICsxMDQsMTcgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAgICAgICAgICAgSW50ZXJsb2NrZWRFeGNoYW5nZQkJCQlbS0VSTkVMMzJdCSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotTE9ORyBXSU5BUEkgSW50ZXJsb2NrZWRFeGNoYW5nZShMUExPTkcgdGFyZ2V0LCBMT05HIHZhbHVlKQoteworICogICAgICAgICAgIEludGVybG9ja2VkRXhjaGFuZ2UJCQkJW0tFUk5FTDMyLj8/P10KKyAqCisgKiBBdG9taWNhbGx5IGV4Y2hhbmdlcyBhIHBhaXIgb2YgdmFsdWVzLgorICoKKyAqIFJFVFVSTlMKKyAqCVByaW9yIHZhbHVlIG9mIHZhbHVlIHBvaW50ZWQgdG8gYnkgVGFyZ2V0CisgKi8KK0xPTkcgV0lOQVBJIEludGVybG9ja2VkRXhjaGFuZ2UoCisJICAgIExQTE9ORyB0YXJnZXQsIC8qIEFkZHJlc3Mgb2YgMzItYml0IHZhbHVlIHRvIGV4Y2hhbmdlICovCisJICAgIExPTkcgdmFsdWUgICAgIC8qIE5ldyB2YWx1ZSBmb3IgdGhlIHZhbHVlIHBvaW50ZWQgdG8gYnkgdGFyZ2V0ICovCispIHsKICNpZiBkZWZpbmVkKF9faTM4Nl9fKSYmZGVmaW5lZChfX0dOVUNfXykJCiAJTE9ORyByZXQ7CiAJX19hc21fXyAoIC8qIGxvY2sgZm9yIFNNUCBzeXN0ZW1zICovCmRpZmYgLS1naXQgYS93aW4zMi90aW1lLmMgYi93aW4zMi90aW1lLmMKaW5kZXggMzMzYWI3Zi4uZmQ1M2EzZSAxMDA2NDQKLS0tIGEvd2luMzIvdGltZS5jCisrKyBiL3dpbjMyL3RpbWUuYwpAQCAtMTQwLDMgKzE0MCwxMCBAQAogICAgICAgICB3aGlsZSgxKSBzbGVlcCgxMDAwKTsgLyogU3BpbiBmb3JldmVyICovCiAgICAgdXNsZWVwKGNNaWxsaXNlY29uZHMqMTAwMCk7CiB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgIEdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lICAoS0VSTkVMMzIpCisgKi8KK1ZPSUQgV0lOQVBJIEdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lKExQRklMRVRJTUUgc3lzdGVtdGltZUFzZmlsZXRpbWUpIHsKKwlET1NGU19Vbml4VGltZVRvRmlsZVRpbWUodGltZShOVUxMKSxzeXN0ZW10aW1lQXNmaWxldGltZSxOVUxMKTsKK30KZGlmZiAtLWdpdCBhL3dpbmRvd3MvY2FyZXQuYyBiL3dpbmRvd3MvY2FyZXQuYwppbmRleCA1MGUzMjZiLi5lMDZlMzA0IDEwMDY0NAotLS0gYS93aW5kb3dzL2NhcmV0LmMKKysrIGIvd2luZG93cy9jYXJldC5jCkBAIC03Nyw3ICs3Nyw3IEBACiAgKi8KIHN0YXRpYyBWT0lEIENBUkVUX0NhbGxiYWNrKCBIV05EMzIgaHduZCwgVUlOVDMyIG1zZywgVUlOVDMyIGlkLCBEV09SRCBjdGltZSkKIHsKLSAgICBkcHJpbnRmX2luZm8oY2FyZXQsIkNBUkVUX0NhbGxiYWNrOiBod25kPSUwNHgsIHRpbWVyaWQ9JWQsIGNhcmV0PSVkXG4iLAorICAgIFRSQUNFKGNhcmV0LCJod25kPSUwNHgsIHRpbWVyaWQ9JWQsIGNhcmV0PSVkXG4iLAogICAgICAgICAgICAgICAgICAgaHduZCwgaWQsIENhcmV0Lm9uKTsKICAgICBDQVJFVF9EaXNwbGF5Q2FyZXQoQ0FSRVRfVE9HR0xFKTsKIH0KQEAgLTEzNiw3ICsxMzYsNyBAQAogQk9PTDMyIFdJTkFQSSBDcmVhdGVDYXJldDMyKCBIV05EMzIgaHduZCwgSEJJVE1BUDMyIGJpdG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIgd2lkdGgsIElOVDMyIGhlaWdodCApCiB7Ci0gICAgZHByaW50Zl9pbmZvKGNhcmV0LCJDcmVhdGVDYXJldDogaHduZD0lMDR4XG4iLCBod25kKTsKKyAgICBUUkFDRShjYXJldCwiaHduZD0lMDR4XG4iLCBod25kKTsKIAogICAgIGlmICghaHduZCkgcmV0dXJuIEZBTFNFOwogCkBAIC0xODgsNyArMTg4LDcgQEAKIHsKICAgICBpZiAoIUNhcmV0Lmh3bmQpIHJldHVybiBGQUxTRTsKIAotICAgIGRwcmludGZfaW5mbyhjYXJldCwiRGVzdHJveUNhcmV0OiBod25kPSUwNHgsIHRpbWVyaWQ9JWRcbiIsCisgICAgVFJBQ0UoY2FyZXQsImh3bmQ9JTA0eCwgdGltZXJpZD0lZFxuIiwKIAkJQ2FyZXQuaHduZCwgQ2FyZXQudGltZXJpZCk7CiAKICAgICBDQVJFVF9LaWxsVGltZXIoKTsKQEAgLTIxNiw3ICsyMTYsNyBAQAogICAgIGlmICghQ2FyZXQuaHduZCkgcmV0dXJuIEZBTFNFOwogICAgIGlmICgoeCA9PSBDYXJldC54KSAmJiAoeSA9PSBDYXJldC55KSkgcmV0dXJuIFRSVUU7CiAKLSAgICBkcHJpbnRmX2luZm8oY2FyZXQsIlNldENhcmV0UG9zOiB4PSVkLCB5PSVkXG4iLCB4LCB5KTsKKyAgICBUUkFDRShjYXJldCwieD0lZCwgeT0lZFxuIiwgeCwgeSk7CiAKICAgICBDQVJFVF9LaWxsVGltZXIoKTsKICAgICBDQVJFVF9EaXNwbGF5Q2FyZXQoQ0FSRVRfT0ZGKTsKQEAgLTI0OCw3ICsyNDgsNyBAQAogICAgIGlmICghQ2FyZXQuaHduZCkgcmV0dXJuIEZBTFNFOwogICAgIGlmIChod25kICYmIChDYXJldC5od25kICE9IGh3bmQpKSByZXR1cm4gRkFMU0U7CiAKLSAgICBkcHJpbnRmX2luZm8oY2FyZXQsIkhpZGVDYXJldDogaHduZD0lMDR4LCBoaWRkZW49JWRcbiIsCisgICAgVFJBQ0UoY2FyZXQsImh3bmQ9JTA0eCwgaGlkZGVuPSVkXG4iLAogICAgICAgICAgICAgICAgICAgaHduZCwgQ2FyZXQuaGlkZGVuKTsKIAogICAgIENBUkVUX0tpbGxUaW1lcigpOwpAQCAtMjc1LDcgKzI3NSw3IEBACiAgICAgaWYgKCFDYXJldC5od25kKSByZXR1cm4gRkFMU0U7CiAgICAgaWYgKGh3bmQgJiYgKENhcmV0Lmh3bmQgIT0gaHduZCkpIHJldHVybiBGQUxTRTsKIAotICAgIGRwcmludGZfaW5mbyhjYXJldCwiU2hvd0NhcmV0OiBod25kPSUwNHgsIGhpZGRlbj0lZFxuIiwKKyAgICBUUkFDRShjYXJldCwiaHduZD0lMDR4LCBoaWRkZW49JWRcbiIsCiAJCWh3bmQsIENhcmV0LmhpZGRlbik7CiAKICAgICBpZiAoQ2FyZXQuaGlkZGVuKQpAQCAtMzA2LDcgKzMwNiw3IEBACiB7CiAgICAgaWYgKCFDYXJldC5od25kKSByZXR1cm4gRkFMU0U7CiAKLSAgICBkcHJpbnRmX2luZm8oY2FyZXQsIlNldENhcmV0QmxpbmtUaW1lOiBod25kPSUwNHgsIG1zZWNzPSVkXG4iLAorICAgIFRSQUNFKGNhcmV0LCJod25kPSUwNHgsIG1zZWNzPSVkXG4iLAogCQlDYXJldC5od25kLCBtc2Vjcyk7CiAKICAgICBDYXJldC50aW1lb3V0ID0gbXNlY3M7CkBAIC0zNDAsNyArMzQwLDcgQEAKIHsKICAgICBpZiAoIUNhcmV0Lmh3bmQgfHwgIXB0KSByZXR1cm47CiAKLSAgICBkcHJpbnRmX2luZm8oY2FyZXQsIkdldENhcmV0UG9zOiBod25kPSUwNHgsIHB0PSVwLCB4PSVkLCB5PSVkXG4iLAorICAgIFRSQUNFKGNhcmV0LCJod25kPSUwNHgsIHB0PSVwLCB4PSVkLCB5PSVkXG4iLAogICAgICAgICAgICAgICAgICAgQ2FyZXQuaHduZCwgcHQsIENhcmV0LngsIENhcmV0LnkpOwogICAgIHB0LT54ID0gKElOVDE2KUNhcmV0Lng7CiAgICAgcHQtPnkgPSAoSU5UMTYpQ2FyZXQueTsKZGlmZiAtLWdpdCBhL3dpbmRvd3MvY2xhc3MuYyBiL3dpbmRvd3MvY2xhc3MuYwppbmRleCBmOTM1NWM4Li5kYmY5MTU0IDEwMDY0NAotLS0gYS93aW5kb3dzL2NsYXNzLmMKKysrIGIvd2luZG93cy9jbGFzcy5jCkBAIC0zMTcsNyArMzE3LDcgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgZHByaW50Zl9pbmZvKGNsYXNzLCAiUmVnaXN0ZXJDbGFzczE2OiBhdG9tPSUwNHggd25kcHJvYz0lMDhseCBoaW5zdD0lMDR4CisgICAgVFJBQ0UoY2xhc3MsICJhdG9tPSUwNHggd25kcHJvYz0lMDhseCBoaW5zdD0lMDR4CiBiZz0lMDR4IHN0eWxlPSUwOHggY2xzRXh0PSVkIHdpbkV4dD0lZCBjbGFzcz0lcCBuYW1lPSclcydcbiIsCiAgICAgICAgICAgICAgICAgICAgYXRvbSwgKERXT1JEKXdjLT5scGZuV25kUHJvYywgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgIHdjLT5oYnJCYWNrZ3JvdW5kLCB3Yy0+c3R5bGUsIHdjLT5jYkNsc0V4dHJhLApAQCAtMzM4LDkgKzMzOCwxMyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBSZWdpc3RlckNsYXNzMzJBICAgICAgKFVTRVIzMi40MjYpCisgKiBSRVRVUk5TCisgKgk+MDogVW5pcXVlIGlkZW50aWZpZXIKKyAqCTA6IEZhaWx1cmUKICAqLwotQVRPTSBXSU5BUEkgUmVnaXN0ZXJDbGFzczMyQSggY29uc3QgV05EQ0xBU1MzMkEqIHdjICkKLXsKK0FUT00gV0lOQVBJIFJlZ2lzdGVyQ2xhc3MzMkEoCisJICAgIGNvbnN0IFdORENMQVNTMzJBKiB3YyAvKiBBZGRyZXNzIG9mIHN0cnVjdHVyZSB3aXRoIGNsYXNzIGRhdGEgKi8KKykgewogICAgIEFUT00gYXRvbTsKICAgICBDTEFTUyAqY2xhc3NQdHI7CiAKQEAgLTM1NCw3ICszNTgsNyBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICBkcHJpbnRmX2luZm8oY2xhc3MsICJSZWdpc3RlckNsYXNzMzJBOiBhdG9tPSUwNHggd25kcHJvYz0lMDhseAorICAgIFRSQUNFKGNsYXNzLCAiYXRvbT0lMDR4IHduZHByb2M9JTA4bHgKIGhpbnN0PSUwNHggYmc9JTA0eCBzdHlsZT0lMDh4IGNsc0V4dD0lZCB3aW5FeHQ9JWQgY2xhc3M9JXAgbmFtZT0nJXMnXG4iLAogICAgICAgICAgICAgICAgICAgIGF0b20sIChEV09SRCl3Yy0+bHBmblduZFByb2MsIHdjLT5oSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgd2MtPmhickJhY2tncm91bmQsIHdjLT5zdHlsZSwgd2MtPmNiQ2xzRXh0cmEsCkBAIC0zODgsNyArMzkyLDcgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgZHByaW50Zl9pbmZvKGNsYXNzLCAiUmVnaXN0ZXJDbGFzczMyVzogYXRvbT0lMDR4IHduZHByb2M9JTA4bHggaGluc3Q9JTA0eCBiZz0lMDR4IHN0eWxlPSUwOHggY2xzRXh0PSVkIHdpbkV4dD0lZCBjbGFzcz0lcFxuIiwKKyAgICBUUkFDRShjbGFzcywgImF0b209JTA0eCB3bmRwcm9jPSUwOGx4IGhpbnN0PSUwNHggYmc9JTA0eCBzdHlsZT0lMDh4IGNsc0V4dD0lZCB3aW5FeHQ9JWQgY2xhc3M9JXBcbiIsCiAgICAgICAgICAgICAgICAgICAgYXRvbSwgKERXT1JEKXdjLT5scGZuV25kUHJvYywgd2MtPmhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICB3Yy0+aGJyQmFja2dyb3VuZCwgd2MtPnN0eWxlLCB3Yy0+Y2JDbHNFeHRyYSwKICAgICAgICAgICAgICAgICAgICB3Yy0+Y2JXbmRFeHRyYSwgY2xhc3NQdHIgKTsKQEAgLTQyMCw3ICs0MjQsNyBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICBkcHJpbnRmX2luZm8oY2xhc3MsICJSZWdpc3RlckNsYXNzRXgxNjogYXRvbT0lMDR4IHduZHByb2M9JTA4bHggaGluc3Q9JTA0eCBiZz0lMDR4IHN0eWxlPSUwOHggY2xzRXh0PSVkIHdpbkV4dD0lZCBjbGFzcz0lcFxuIiwKKyAgICBUUkFDRShjbGFzcywgImF0b209JTA0eCB3bmRwcm9jPSUwOGx4IGhpbnN0PSUwNHggYmc9JTA0eCBzdHlsZT0lMDh4IGNsc0V4dD0lZCB3aW5FeHQ9JWQgY2xhc3M9JXBcbiIsCiAgICAgICAgICAgICAgICAgICAgYXRvbSwgKERXT1JEKXdjLT5scGZuV25kUHJvYywgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgIHdjLT5oYnJCYWNrZ3JvdW5kLCB3Yy0+c3R5bGUsIHdjLT5jYkNsc0V4dHJhLAogICAgICAgICAgICAgICAgICAgIHdjLT5jYlduZEV4dHJhLCBjbGFzc1B0ciApOwpAQCAtNDU0LDcgKzQ1OCw3IEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgIGRwcmludGZfaW5mbyhjbGFzcywgIlJlZ2lzdGVyQ2xhc3NFeDMyQTogYXRvbT0lMDR4IHduZHByb2M9JTA4bHggaGluc3Q9JTA0eCBiZz0lMDR4IHN0eWxlPSUwOHggY2xzRXh0PSVkIHdpbkV4dD0lZCBjbGFzcz0lcFxuIiwKKyAgICBUUkFDRShjbGFzcywgImF0b209JTA0eCB3bmRwcm9jPSUwOGx4IGhpbnN0PSUwNHggYmc9JTA0eCBzdHlsZT0lMDh4IGNsc0V4dD0lZCB3aW5FeHQ9JWQgY2xhc3M9JXBcbiIsCiAgICAgICAgICAgICAgICAgICAgYXRvbSwgKERXT1JEKXdjLT5scGZuV25kUHJvYywgd2MtPmhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICB3Yy0+aGJyQmFja2dyb3VuZCwgd2MtPnN0eWxlLCB3Yy0+Y2JDbHNFeHRyYSwKICAgICAgICAgICAgICAgICAgICB3Yy0+Y2JXbmRFeHRyYSwgY2xhc3NQdHIgKTsKQEAgLTQ4Niw3ICs0OTAsNyBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICBkcHJpbnRmX2luZm8oY2xhc3MsICJSZWdpc3RlckNsYXNzRXgzMlc6IGF0b209JTA0eCB3bmRwcm9jPSUwOGx4IGhpbnN0PSUwNHggYmc9JTA0eCBzdHlsZT0lMDh4IGNsc0V4dD0lZCB3aW5FeHQ9JWQgY2xhc3M9JXBcbiIsCisgICAgVFJBQ0UoY2xhc3MsICJhdG9tPSUwNHggd25kcHJvYz0lMDhseCBoaW5zdD0lMDR4IGJnPSUwNHggc3R5bGU9JTA4eCBjbHNFeHQ9JWQgd2luRXh0PSVkIGNsYXNzPSVwXG4iLAogICAgICAgICAgICAgICAgICAgIGF0b20sIChEV09SRCl3Yy0+bHBmblduZFByb2MsIHdjLT5oSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgd2MtPmhickJhY2tncm91bmQsIHdjLT5zdHlsZSwgd2MtPmNiQ2xzRXh0cmEsCiAgICAgICAgICAgICAgICAgICAgd2MtPmNiV25kRXh0cmEsIGNsYXNzUHRyICk7CmRpZmYgLS1naXQgYS93aW5kb3dzL2NsaXBib2FyZC5jIGIvd2luZG93cy9jbGlwYm9hcmQuYwppbmRleCAzOTNiZWQ1Li41YzUxNWQzIDEwMDY0NAotLS0gYS93aW5kb3dzL2NsaXBib2FyZC5jCisrKyBiL3dpbmRvd3MvY2xpcGJvYXJkLmMKQEAgLTkyLDcgKzkyLDcgQEAKICAqLwogc3RhdGljIHZvaWQgQ0xJUEJPQVJEX0NoZWNrU2VsZWN0aW9uKFdORCogcFduZCkKIHsKLSAgICBkcHJpbnRmX2luZm8oY2xpcGJvYXJkLCJcdGNoZWNraW5nICUwOHhcbiIsICh1bnNpZ25lZClwV25kLT53aW5kb3cpOworICAgIFRSQUNFKGNsaXBib2FyZCwiXHRjaGVja2luZyAlMDh4XG4iLCAodW5zaWduZWQpcFduZC0+d2luZG93KTsKIAogICAgIGlmKCBzZWxlY3Rpb25BY3F1aXJlZCAmJiBzZWxlY3Rpb25XaW5kb3cgIT0gTm9uZSAmJgogICAgICAgICBwV25kLT53aW5kb3cgPT0gc2VsZWN0aW9uV2luZG93ICkKQEAgLTEwNiw3ICsxMDYsNyBAQAogICAgICAgICAgICAgIGlmKCBwV25kLT5wYXJlbnQtPmNoaWxkICE9IHBXbmQgKSAKICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uV2luZG93ID0gcFduZC0+cGFyZW50LT5jaGlsZC0+d2luZG93OwogCi0JZHByaW50Zl9pbmZvKGNsaXBib2FyZCwiXHRzd2l0Y2hpbmcgc2VsZWN0aW9uIGZyb20gJTA4eCB0byAlMDh4XG4iLCAKKwlUUkFDRShjbGlwYm9hcmQsIlx0c3dpdGNoaW5nIHNlbGVjdGlvbiBmcm9tICUwOHggdG8gJTA4eFxuIiwgCiAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClzZWxlY3Rpb25QcmV2V2luZG93LCAodW5zaWduZWQpc2VsZWN0aW9uV2luZG93KTsKIAogCWlmKCBzZWxlY3Rpb25XaW5kb3cgIT0gTm9uZSApCkBAIC0xNDYsNyArMTQ2LDcgQEAKIHsKICAgICBMUENMSVBGT1JNQVQgbHBGb3JtYXQgPSBDbGlwRm9ybWF0czsKIAotICAgIGRwcmludGZfaW5mbyhjbGlwYm9hcmQsIkRpc093bjogY2xpcGJvYXJkIG93bmVyID0gJTA0eCwgc2VsZWN0aW9uID0gJTA4eFxuIiwgCisgICAgVFJBQ0UoY2xpcGJvYXJkLCJjbGlwYm9hcmQgb3duZXIgPSAlMDR4LCBzZWxlY3Rpb24gPSAlMDh4XG4iLCAKIAkJCQloV25kQ2xpcE93bmVyLCAodW5zaWduZWQpc2VsZWN0aW9uV2luZG93KTsKIAogICAgIGlmKCBwV25kLT5od25kU2VsZiA9PSBoV25kQ2xpcE93bmVyKQpAQCAtMTU5LDcgKzE1OSw3IEBACiAJewogCSAgICBpZiggbHBGb3JtYXQtPndEYXRhUHJlc2VudCAmJiAhbHBGb3JtYXQtPmhEYXRhICkKIAkgICAgewotCQlkcHJpbnRmX2luZm8oY2xpcGJvYXJkLCJcdGRhdGEgbWlzc2luZyBmb3IgY2xpcGJvYXJkIGZvcm1hdCAlaVxuIiwgCisJCVRSQUNFKGNsaXBib2FyZCwiXHRkYXRhIG1pc3NpbmcgZm9yIGNsaXBib2FyZCBmb3JtYXQgJWlcbiIsIAogCQkJCSAgIGxwRm9ybWF0LT53Rm9ybWF0SUQpOyAKIAkJbHBGb3JtYXQtPndEYXRhUHJlc2VudCA9IDA7CiAJICAgIH0KQEAgLTIwNCw3ICsyMDQsNyBAQAogCiAgICAgaWYoICFoV25kICkgcmV0dXJuIEZBTFNFOwogCi0gICAgZHByaW50Zl9pbmZvKGNsaXBib2FyZCwiUmVxdWVzdGluZyBzZWxlY3Rpb24uLi5cbiIpOworICAgIFRSQUNFKGNsaXBib2FyZCwiUmVxdWVzdGluZyBzZWxlY3Rpb24uLi5cbiIpOwogCiAgIC8qIHJlcXVlc3QgZGF0YSB0eXBlIFhBX1NUUklORywgbGF0ZXIKICAgICogQ0xJUEJPQVJEX1JlYWRTZWxlY3Rpb24oKSB3aWxsIGJlIGludm9rZWQgCkBAIC0yMjQsNyArMjI0LDcgQEAKICAgICB3aGlsZShzZWxlY3Rpb25XYWl0KSBFVkVOVF9XYWl0TmV0RXZlbnQoIFRSVUUsIEZBTFNFICk7CiAKICAgLyogd2UgdHJlYXQgVW5peCB0ZXh0IGFzIENGX09FTVRFWFQgKi8KLSAgICBkcHJpbnRmX2luZm8oY2xpcGJvYXJkLCJcdGdvdCBDRl9PRU1URVhUID0gJWlcbiIsIAorICAgIFRSQUNFKGNsaXBib2FyZCwiXHRnb3QgQ0ZfT0VNVEVYVCA9ICVpXG4iLCAKIAkJICAgICAgQ2xpcEZvcm1hdHNbQ0ZfT0VNVEVYVC0xXS53RGF0YVByZXNlbnQpOwogCiAgICAgcmV0dXJuIChCT09MMzIpQ2xpcEZvcm1hdHNbQ0ZfT0VNVEVYVC0xXS53RGF0YVByZXNlbnQ7CkBAIC0yNjYsNyArMjY2LDcgQEAKIHsKICAgICBCT09MMzIgYlJldDsKIAotICAgIGRwcmludGZfaW5mbyhjbGlwYm9hcmQsIk9wZW5DbGlwYm9hcmQoJTA0eCkuLi5cbiIsIGhXbmQpOworICAgIFRSQUNFKGNsaXBib2FyZCwiKCUwNHgpLi4uXG4iLCBoV25kKTsKIAogICAgIGlmICghaHFDbGlwTG9jaykKICAgICB7CkBAIC0yNzcsNyArMjc3LDcgQEAKICAgICB9CiAgICAgZWxzZSBiUmV0ID0gRkFMU0U7CiAKLSAgICBkcHJpbnRmX2luZm8oY2xpcGJvYXJkLCIgICByZXR1cm5pbmcgJWlcbiIsIGJSZXQpOworICAgIFRSQUNFKGNsaXBib2FyZCwiICAgcmV0dXJuaW5nICVpXG4iLCBiUmV0KTsKICAgICByZXR1cm4gYlJldDsKIH0KIApAQCAtMjk2LDcgKzI5Niw3IEBACiAgKi8KIEJPT0wzMiBXSU5BUEkgQ2xvc2VDbGlwYm9hcmQzMih2b2lkKQogewotICAgIGRwcmludGZfaW5mbyhjbGlwYm9hcmQsIkNsb3NlQ2xpcGJvYXJkKCk7ICFcbiIpOworICAgIFRSQUNFKGNsaXBib2FyZCwiIVxuIik7CiAKICAgICBpZiAoaHFDbGlwTG9jayA9PSBHZXRUYXNrUXVldWUoMCkpCiAgICAgewpAQCAtMzI2LDcgKzMyNiw3IEBACiB7CiAgICAgTFBDTElQRk9STUFUIGxwRm9ybWF0ID0gQ2xpcEZvcm1hdHM7IAogCi0gICAgZHByaW50Zl9pbmZvKGNsaXBib2FyZCwiRW1wdHlDbGlwYm9hcmQoKVxuIik7CisgICAgVFJBQ0UoY2xpcGJvYXJkLCIodm9pZClcbiIpOwogCiAgICAgaWYgKGhxQ2xpcExvY2sgIT0gR2V0VGFza1F1ZXVlKDApKSByZXR1cm4gRkFMU0U7CiAKQEAgLTM1MSw3ICszNTEsNyBAQAogCXNlbGVjdGlvblByZXZXaW5kb3cgCT0gc2VsZWN0aW9uV2luZG93OwogCXNlbGVjdGlvbldpbmRvdyAJPSBOb25lOwogCi0JZHByaW50Zl9pbmZvKGNsaXBib2FyZCwgIlx0Z2l2aW5nIHVwIHNlbGVjdGlvbiAoc3B3ID0gJTA4eClcbiIsIAorCVRSQUNFKGNsaXBib2FyZCwgIlx0Z2l2aW5nIHVwIHNlbGVjdGlvbiAoc3B3ID0gJTA4eClcbiIsIAogCQkJCSAJKHVuc2lnbmVkKXNlbGVjdGlvblByZXZXaW5kb3cpOwogCiAJVFNYU2V0U2VsZWN0aW9uT3duZXIoZGlzcGxheSwgWEFfUFJJTUFSWSwgTm9uZSwgQ3VycmVudFRpbWUpOwpAQCAtMzg2LDggKzM4Niw3IEBACiAgICAgTFBDTElQRk9STUFUIGxwRm9ybWF0ID0gX19sb29rdXBfZm9ybWF0KCBDbGlwRm9ybWF0cywgd0Zvcm1hdCApOwogICAgIFdpbmRvdyAgICAgICBvd25lcjsKIAotICAgIGRwcmludGZfaW5mbyhjbGlwYm9hcmQsCi0JCSJTZXRDbGlwYm9hcmREYXRhKCUwNFgsICUwNHgpICFcbiIsIHdGb3JtYXQsIGhEYXRhKTsKKyAgICBUUkFDRShjbGlwYm9hcmQsICIoJTA0WCwgJTA0eCkgIVxuIiwgd0Zvcm1hdCwgaERhdGEpOwogCiAgICAgLyogTk9URTogSWYgdGhlIGhEYXRhIGlzIHplcm8gYW5kIGN1cnJlbnQgb3duZXIgZG9lc24ndCBtYXRjaAogICAgICAqIHRoZSB3aW5kb3cgdGhhdCBvcGVuZWQgdGhlIGNsaXBib2FyZCB0aGVuIHRoaXMgYXBwbGljYXRpb24KQEAgLTQxMSw3ICs0MTAsNyBAQAogCSAgICBzZWxlY3Rpb25BY3F1aXJlZCA9IFRydWU7CiAJICAgIHNlbGVjdGlvbldpbmRvdyA9IG93bmVyOwogCi0JICAgIGRwcmludGZfaW5mbyhjbGlwYm9hcmQsIkdyYWJiZWQgWCBzZWxlY3Rpb24sIG93bmVyPSglMDh4KVxuIiwgCisJICAgIFRSQUNFKGNsaXBib2FyZCwiR3JhYmJlZCBYIHNlbGVjdGlvbiwgb3duZXI9KCUwOHgpXG4iLCAKIAkJCQkJCSh1bnNpZ25lZCkgb3duZXIpOwogCX0KICAgICB9CkBAIC00NTksNyArNDU4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgIChXUEFSQU0xNilscEZvcm1hdC0+d0Zvcm1hdElELDBMKTsKICAgIGVsc2UKICAgIHsKLSAgICAgICBkcHJpbnRmX3dhcm4oY2xpcGJvYXJkLCAiXHRoV25kQ2xpcE93bmVyICglMDR4KSBpcyBsb3N0IVxuIiwgCisgICAgICAgV0FSTihjbGlwYm9hcmQsICJcdGhXbmRDbGlwT3duZXIgKCUwNHgpIGlzIGxvc3QhXG4iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFduZENsaXBPd25lcik7CiAgICAgICAgaFduZENsaXBPd25lciA9IDA7IGxwRm9ybWF0LT53RGF0YVByZXNlbnQgPSAwOwogICAgICAgIHJldHVybiBGQUxTRTsKQEAgLTQ3OSw3ICs0NzgsNyBAQAogICAgIExQU1RSICBscHN0clQ7CiAKICAgICBpZiggIWxwc3RyUyApIHJldHVybiBGQUxTRTsKLSAgICBkcHJpbnRmX2luZm8oY2xpcGJvYXJkLCJcdGNvbnZlcnRpbmcgZnJvbSAnJXMnIHRvICclcycsICVpIGNoYXJzXG4iLAorICAgIFRSQUNFKGNsaXBib2FyZCwiXHRjb252ZXJ0aW5nIGZyb20gJyVzJyB0byAnJXMnLCAlaSBjaGFyc1xuIiwKIAkJCSAgIAkgICAgICBscFNvdXJjZS0+TmFtZSwgbHBUYXJnZXQtPk5hbWUsIHNpemUpOwogCiAgICAgbHBUYXJnZXQtPmhEYXRhID0gR2xvYmFsQWxsb2MxNihHTUVNX1pFUk9JTklULCBzaXplKTsgCkBAIC00OTEsNyArNDkwLDcgQEAKIAkgICAgQ2hhclRvT2VtQnVmZjMyQShscHN0clMsIGxwc3RyVCwgc2l6ZSk7CiAJZWxzZQogCSAgICBPZW1Ub0NoYXJCdWZmMzJBKGxwc3RyUywgbHBzdHJULCBzaXplKTsKLQlkcHJpbnRmX2luZm8oY2xpcGJvYXJkLCJcdGdvdCAlc1xuIiwgbHBzdHJUKTsKKwlUUkFDRShjbGlwYm9hcmQsIlx0Z290ICVzXG4iLCBscHN0clQpOwogCXJldHVybiBUUlVFOwogICAgIH0KIApAQCAtNTA5LDcgKzUwOCw3IEBACiAKICAgICBpZiAoaHFDbGlwTG9jayAhPSBHZXRUYXNrUXVldWUoMCkpIHJldHVybiAwOwogCi0gICAgZHByaW50Zl9pbmZvKGNsaXBib2FyZCwiR2V0Q2xpcGJvYXJkRGF0YSglMDRYKVxuIiwgd0Zvcm1hdCk7CisgICAgVFJBQ0UoY2xpcGJvYXJkLCIoJTA0WClcbiIsIHdGb3JtYXQpOwogCiAgICAgaWYoIHdGb3JtYXQgPT0gQ0ZfVEVYVCAmJiAhbHBSZW5kZXJbQ0ZfVEVYVC0xXS53RGF0YVByZXNlbnQgCiAJCQkgICAmJiAgbHBSZW5kZXJbQ0ZfT0VNVEVYVC0xXS53RGF0YVByZXNlbnQgKQpAQCAtNTE3LDcgKzUxNiw3IEBACiAJbHBSZW5kZXIgPSAmQ2xpcEZvcm1hdHNbQ0ZfT0VNVEVYVC0xXTsKIAlscFVwZGF0ZSA9ICZDbGlwRm9ybWF0c1tDRl9URVhULTFdOwogCi0JZHByaW50Zl9pbmZvKGNsaXBib2FyZCwiXHRPRU1URVhUIC0+IFRFWFRcbiIpOworCVRSQUNFKGNsaXBib2FyZCwiXHRPRU1URVhUIC0+IFRFWFRcbiIpOwogICAgIH0KICAgICBlbHNlIGlmKCB3Rm9ybWF0ID09IENGX09FTVRFWFQgJiYgIWxwUmVuZGVyW0NGX09FTVRFWFQtMV0ud0RhdGFQcmVzZW50CiAJCQkJICAgJiYgIGxwUmVuZGVyW0NGX1RFWFQtMV0ud0RhdGFQcmVzZW50ICkKQEAgLTUyNSw3ICs1MjQsNyBAQAogICAgICAgICBscFJlbmRlciA9ICZDbGlwRm9ybWF0c1tDRl9URVhULTFdOwogCWxwVXBkYXRlID0gJkNsaXBGb3JtYXRzW0NGX09FTVRFWFQtMV07CiAJCi0JZHByaW50Zl9pbmZvKGNsaXBib2FyZCwiXHRURVhUIC0+IE9FTVRFWFRcbiIpOworCVRSQUNFKGNsaXBib2FyZCwiXHRURVhUIC0+IE9FTVRFWFRcbiIpOwogICAgIH0KICAgICBlbHNlCiAgICAgewpAQCAtNTM3LDcgKzUzNiw3IEBACiAgICAgaWYoIGxwVXBkYXRlICE9IGxwUmVuZGVyICYmICFscFVwZGF0ZS0+aERhdGEgKSAKIAlDTElQQk9BUkRfUmVuZGVyVGV4dChscFVwZGF0ZSwgbHBSZW5kZXIpOwogCi0gICAgZHByaW50Zl9pbmZvKGNsaXBib2FyZCwiXHRyZXR1cm5pbmcgJTA0eCAodHlwZSAlaSlcbiIsIAorICAgIFRSQUNFKGNsaXBib2FyZCwiXHRyZXR1cm5pbmcgJTA0eCAodHlwZSAlaSlcbiIsIAogCQkJICAgICAgbHBVcGRhdGUtPmhEYXRhLCBscFVwZGF0ZS0+d0Zvcm1hdElEKTsKICAgICByZXR1cm4gbHBVcGRhdGUtPmhEYXRhOwogfQpAQCAtNTY5LDcgKzU2OCw3IEBACiAgICAgSU5UMzIgRm9ybWF0Q291bnQgPSAwOwogICAgIExQQ0xJUEZPUk1BVCBscEZvcm1hdCA9IENsaXBGb3JtYXRzOyAKIAotICAgIGRwcmludGZfaW5mbyhjbGlwYm9hcmQsIkNvdW50Q2xpcGJvYXJkRm9ybWF0cygpXG4iKTsKKyAgICBUUkFDRShjbGlwYm9hcmQsIih2b2lkKVxuIik7CiAKICAgICBpZiggIXNlbGVjdGlvbkFjcXVpcmVkICkgQ0xJUEJPQVJEX1JlcXVlc3RYU2VsZWN0aW9uKCk7CiAKQEAgLTU4MSwxMyArNTgwLDEzIEBACiAJaWYgKGxwRm9ybWF0ID09IE5VTEwpIGJyZWFrOwogCWlmIChscEZvcm1hdC0+d0RhdGFQcmVzZW50KSAKIAl7Ci0gICAgICAgICAgICBkcHJpbnRmX2luZm8oY2xpcGJvYXJkLCAiXHRkYXRhIGZvdW5kIGZvciBmb3JtYXQgJWlcbiIsIGxwRm9ybWF0LT53Rm9ybWF0SUQpOworICAgICAgICAgICAgVFJBQ0UoY2xpcGJvYXJkLCAiXHRkYXRhIGZvdW5kIGZvciBmb3JtYXQgJWlcbiIsIGxwRm9ybWF0LT53Rm9ybWF0SUQpOwogCSAgICBGb3JtYXRDb3VudCsrOwogCX0KIAlscEZvcm1hdCA9IGxwRm9ybWF0LT5OZXh0Rm9ybWF0OwogICAgIH0KIAotICAgIGRwcmludGZfaW5mbyhjbGlwYm9hcmQsIlx0dG90YWwgJWRcbiIsIEZvcm1hdENvdW50KTsKKyAgICBUUkFDRShjbGlwYm9hcmQsIlx0dG90YWwgJWRcbiIsIEZvcm1hdENvdW50KTsKICAgICByZXR1cm4gRm9ybWF0Q291bnQ7CiB9CiAKQEAgLTYwOCw3ICs2MDcsNyBAQAogewogICAgIExQQ0xJUEZPUk1BVCBscEZvcm1hdCA9IENsaXBGb3JtYXRzOyAKIAotICAgIGRwcmludGZfaW5mbyhjbGlwYm9hcmQsIkVudW1DbGlwYm9hcmRGb3JtYXRzKCUwNFgpXG4iLCB3Rm9ybWF0KTsKKyAgICBUUkFDRShjbGlwYm9hcmQsIiglMDRYKVxuIiwgd0Zvcm1hdCk7CiAKICAgICBpZiggaHFDbGlwTG9jayAhPSBHZXRUYXNrUXVldWUoMCkgKSByZXR1cm4gMDsKIApAQCAtNjUxLDcgKzY1MCw3IEBACiAKICAgICBpZiAoRm9ybWF0TmFtZSA9PSBOVUxMKSByZXR1cm4gMDsKIAotICAgIGRwcmludGZfaW5mbyhjbGlwYm9hcmQsIlJlZ2lzdGVyQ2xpcGJvYXJkRm9ybWF0KCclcycpICFcbiIsIEZvcm1hdE5hbWUpOworICAgIFRSQUNFKGNsaXBib2FyZCwiKCclcycpICFcbiIsIEZvcm1hdE5hbWUpOwogCiAgICAgLyogd2FsayBmb3JtYXQgY2hhaW4gdG8gc2VlIGlmIGl0J3MgYWxyZWFkeSByZWdpc3RlcmVkICovCiAKQEAgLTcyNCwxNCArNzIzLDEyIEBACiB7CiAgICAgTFBDTElQRk9STUFUIGxwRm9ybWF0ID0gX19sb29rdXBfZm9ybWF0KCBDbGlwRm9ybWF0cywgd0Zvcm1hdCApOwogCi0gICAgZHByaW50Zl9pbmZvKGNsaXBib2FyZCwKLQkiR2V0Q2xpcGJvYXJkRm9ybWF0TmFtZSglMDRYLCAlcCwgJWQpICFcbiIsIHdGb3JtYXQsIHJldFN0ciwgbWF4bGVuKTsKKyAgICBUUkFDRShjbGlwYm9hcmQsICIoJTA0WCwgJXAsICVkKSAhXG4iLCB3Rm9ybWF0LCByZXRTdHIsIG1heGxlbik7CiAKICAgICBpZiAobHBGb3JtYXQgPT0gTlVMTCB8fCBscEZvcm1hdC0+TmFtZSA9PSBOVUxMIHx8IAogCWxwRm9ybWF0LT53Rm9ybWF0SUQgPCBDRl9SRUdGT1JNQVRCQVNFKSByZXR1cm4gMDsKIAotICAgIGRwcmludGZfaW5mbyhjbGlwYm9hcmQsCi0JCSJHZXRDbGlwYm9hcmRGb3JtYXQgLy8gTmFtZT0nJXMnICFcbiIsIGxwRm9ybWF0LT5OYW1lKTsKKyAgICBUUkFDRShjbGlwYm9hcmQsICJOYW1lPSclcycgIVxuIiwgbHBGb3JtYXQtPk5hbWUpOwogCiAgICAgbHN0cmNweW4zMkEoIHJldFN0ciwgbHBGb3JtYXQtPk5hbWUsIG1heGxlbiApOwogICAgIHJldHVybiBzdHJsZW4ocmV0U3RyKTsKQEAgLTc2Nyw3ICs3NjQsNyBAQAogewogICAgIEhXTkQzMiBod25kUHJldiA9IGhXbmRWaWV3ZXI7CiAKLSAgICBkcHJpbnRmX2luZm8oY2xpcGJvYXJkLCJTZXRDbGlwYm9hcmRWaWV3ZXIoJTA0eCk6IHJldHVybmluZyAlMDR4XG4iLCBoV25kLCBod25kUHJldik7CisgICAgVFJBQ0UoY2xpcGJvYXJkLCIoJTA0eCk6IHJldHVybmluZyAlMDR4XG4iLCBoV25kLCBod25kUHJldik7CiAKICAgICBoV25kVmlld2VyID0gaFduZDsKICAgICByZXR1cm4gaHduZFByZXY7CkBAIC04MDcsMTQgKzgwNCwxNCBAQAogewogICAgIEJPT0wzMiBiUmV0ID0gMDsKIAotICAgIGRwcmludGZfZml4bWUoY2xpcGJvYXJkLCAiQ2hhbmdlQ2xpcGJvYXJkQ2hhaW4oJTA0eCwgJTA0eCkgLSBzdHViP1xuIiwgCisgICAgRklYTUUoY2xpcGJvYXJkLCAiKCUwNHgsICUwNHgpIC0gc3R1Yj9cbiIsIAogCQkgICAgICBoV25kLCBoV25kTmV4dCk7CiAKICAgICBpZiggaFduZFZpZXdlciApCiAJYlJldCA9ICFTZW5kTWVzc2FnZTE2KCBoV25kVmlld2VyLCBXTV9DSEFOR0VDQkNIQUlOLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV1BBUkFNMTYpaFduZCwgKExQQVJBTSloV25kTmV4dCk7ICAgCiAgICAgZWxzZQotCWRwcmludGZfd2FybihjbGlwYm9hcmQsICJDaGFuZ2VDbGlwYm9hcmRDaGFpbjogaFduZFZpZXdlciBpcyBsb3N0XG4iKTsKKwlXQVJOKGNsaXBib2FyZCwgImhXbmRWaWV3ZXIgaXMgbG9zdFxuIik7CiAKICAgICBpZiggaFduZCA9PSBoV25kVmlld2VyICkgaFduZFZpZXdlciA9IGhXbmROZXh0OwogCkBAIC04MzcsNyArODM0LDcgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBJc0NsaXBib2FyZEZvcm1hdEF2YWlsYWJsZTMyKCBVSU5UMzIgd0Zvcm1hdCApCiB7Ci0gICAgZHByaW50Zl9pbmZvKGNsaXBib2FyZCwiSXNDbGlwYm9hcmRGb3JtYXRBdmFpbGFibGUoJTA0WCkgIVxuIiwgd0Zvcm1hdCk7CisgICAgVFJBQ0UoY2xpcGJvYXJkLCIoJTA0WCkgIVxuIiwgd0Zvcm1hdCk7CiAKICAgICBpZiggKHdGb3JtYXQgPT0gQ0ZfVEVYVCB8fCB3Rm9ybWF0ID09IENGX09FTVRFWFQpICYmCiAgICAgICAgICFzZWxlY3Rpb25BY3F1aXJlZCApIENMSVBCT0FSRF9SZXF1ZXN0WFNlbGVjdGlvbigpOwpAQCAtOTA3LDcgKzkwNCw3IEBACiAgICAgSEFORExFMTYgCSBoVGV4dCA9IDA7CiAgICAgTFBDTElQRk9STUFUIGxwRm9ybWF0ID0gQ2xpcEZvcm1hdHM7IAogCi0gICAgZHByaW50Zl9pbmZvKGNsaXBib2FyZCwiUmVhZFNlbGVjdGlvbiBjYWxsYmFja1xuIik7CisgICAgVFJBQ0UoY2xpcGJvYXJkLCJSZWFkU2VsZWN0aW9uIGNhbGxiYWNrXG4iKTsKIAogICAgIGlmKHByb3AgIT0gTm9uZSkKICAgICB7CkBAIC05MTYsMTYgKzkxMywxNiBAQAogCXVuc2lnbmVkIGxvbmcgCW5pdGVtcyxyZW1haW47CiAJdW5zaWduZWQgY2hhcioJdmFsPU5VTEw7CiAKLSAgICAgICAgZHByaW50Zl9pbmZvKGNsaXBib2FyZCwiXHRnb3QgcHJvcGVydHkgJXNcbiIsVFNYR2V0QXRvbU5hbWUoZGlzcGxheSxwcm9wKSk7CisgICAgICAgIFRSQUNFKGNsaXBib2FyZCwiXHRnb3QgcHJvcGVydHkgJXNcbiIsVFNYR2V0QXRvbU5hbWUoZGlzcGxheSxwcm9wKSk7CiAKICAgICAgICAgLyogVE9ETzogUHJvcGVydGllcyBsb25nZXIgdGhhbiA2NEsgKi8KIAogCWlmKFRTWEdldFdpbmRvd1Byb3BlcnR5KGRpc3BsYXksdyxwcm9wLDAsMHgzRkZGLFRydWUsWEFfU1RSSU5HLAogCSAgICAmYXR5cGUsICZhZm9ybWF0LCAmbml0ZW1zLCAmcmVtYWluLCAmdmFsKSAhPSBTdWNjZXNzKQotCSAgICBkcHJpbnRmX3dhcm4oY2xpcGJvYXJkLCAiXHRjb3VsZG4ndCByZWFkIHByb3BlcnR5XG4iKTsKKwkgICAgV0FSTihjbGlwYm9hcmQsICJcdGNvdWxkbid0IHJlYWQgcHJvcGVydHlcbiIpOwogCWVsc2UKIAl7Ci0gICAgICAgICAgIGRwcmludGZfaW5mbyhjbGlwYm9hcmQsIlx0VHlwZSAlcyxGb3JtYXQgJWQsbml0ZW1zICVsZCx2YWx1ZSAlc1xuIiwKKyAgICAgICAgICAgVFJBQ0UoY2xpcGJvYXJkLCJcdFR5cGUgJXMsRm9ybWF0ICVkLG5pdGVtcyAlbGQsdmFsdWUgJXNcbiIsCiAJCSAgICAgICAgICAgICBUU1hHZXRBdG9tTmFtZShkaXNwbGF5LGF0eXBlKSxhZm9ybWF0LG5pdGVtcyx2YWwpOwogCiAJICAgaWYoYXR5cGUgPT0gWEFfU1RSSU5HICYmIGFmb3JtYXQgPT0gOCkKQEAgLTkzMyw3ICs5MzAsNyBAQAogCSAgICAgIGludCAJaSxpbmxjb3VudCA9IDA7CiAJICAgICAgY2hhcioJbHBzdHI7CiAKLQkgICAgICBkcHJpbnRmX2luZm8oY2xpcGJvYXJkLCJcdHNlbGVjdGlvbiBpcyAnJXMnXG4iLHZhbCk7CisJICAgICAgVFJBQ0UoY2xpcGJvYXJkLCJcdHNlbGVjdGlvbiBpcyAnJXMnXG4iLHZhbCk7CiAKIAkgICAgICBmb3IoaT0wOyBpIDw9IG5pdGVtczsgaSsrKQogCQkgIGlmKCB2YWxbaV0gPT0gJ1xuJyApIGlubGNvdW50Kys7CkBAIC05ODUsNyArOTgyLDcgQEAKICAgICAgKiBzZWxlY3Rpb25QcmV2V2luZG93IGlzIG5vbnplcm8gaWYgQ2hlY2tTZWxlY3Rpb24oKSB3YXMgY2FsbGVkLiAKICAgICAgKi8KIAotICAgIGRwcmludGZfaW5mbyhjbGlwYm9hcmQsIlx0ZXZlbnQtPndpbmRvdyA9ICUwOHggKHN3ID0gJTA4eCwgc3B3PSUwOHgpXG4iLCAKKyAgICBUUkFDRShjbGlwYm9hcmQsIlx0ZXZlbnQtPndpbmRvdyA9ICUwOHggKHN3ID0gJTA4eCwgc3B3PSUwOHgpXG4iLCAKIAkgICh1bnNpZ25lZCl3LCAodW5zaWduZWQpc2VsZWN0aW9uV2luZG93LCAodW5zaWduZWQpc2VsZWN0aW9uUHJldldpbmRvdyApOwogCiAgICAgaWYoIHNlbGVjdGlvbkFjcXVpcmVkICkKZGlmZiAtLWdpdCBhL3dpbmRvd3MvZGNlLmMgYi93aW5kb3dzL2RjZS5jCmluZGV4IDIxZDEwODAuLjlhYjEwNWQgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZGNlLmMKKysrIGIvd2luZG93cy9kY2UuYwpAQCAtMTcyLDcgKzE3Miw3IEBACiAKICAgICBkY2UtPmhDbGlwUmduID0gMDsKIAotICAgIGRwcmludGZfaW5mbyhkYywiXHRyZXN0b3JpbmcgVmlzUmduXG4iKTsKKyAgICBUUkFDRShkYywiXHRyZXN0b3JpbmcgVmlzUmduXG4iKTsKIAogICAgIFJlc3RvcmVWaXNSZ24oZGNlLT5oREMpOwogfQpAQCAtMjI2LDEwICsyMjYsMTAgQEAKICAgICB7CiAJRENFICpkY2U7CiAKLQlkcHJpbnRmX2luZm8oZGMsIkludmFsaWRhdGVEQ0U6IHNjb3BlIGh3bmQgPSAlMDR4LCAoJWksJWkgLSAlaSwlaSlcbiIsCisJVFJBQ0UoZGMsInNjb3BlIGh3bmQgPSAlMDR4LCAoJWksJWkgLSAlaSwlaSlcbiIsCiAJCSAgICAgd25kU2NvcGUtPmh3bmRTZWxmLCBwUmVjdFVwZGF0ZS0+bGVmdCxwUmVjdFVwZGF0ZS0+dG9wLAogCQkgICAgIHBSZWN0VXBkYXRlLT5yaWdodCxwUmVjdFVwZGF0ZS0+Ym90dG9tKTsKLQlpZihkZWJ1Z2dpbmdfaW5mbyhkYykpIAorCWlmKFRSQUNFX09OKGRjKSkgCiAJICBEQ0VfRHVtcENhY2hlKCk7CiAKICAJLyogd2FsayBhbGwgRENFcyBhbmQgZml4dXAgbm9uLWVtcHR5IGVudHJpZXMgKi8KQEAgLTI2Nyw3ICsyNjcsNyBAQAogCQkJCXsKIAkJCQkgICAgLyogRG9uJ3QgYm90aGVyIHdpdGggdmlzaWJsZSByZWdpb25zIG9mIHVudXNlZCBEQ0VzICovCiAKLQkJCQkgICAgZHByaW50Zl9pbmZvKGRjLCJcdHB1cmdlZCAlMDh4IGRjZSBbJTA0eF1cbiIsIAorCQkJCSAgICBUUkFDRShkYywiXHRwdXJnZWQgJTA4eCBkY2UgWyUwNHhdXG4iLCAKIAkJCQkJCSh1bnNpZ25lZClkY2UsIHduZEN1cnJlbnQtPmh3bmRTZWxmKTsKIAogCQkJCSAgICBkY2UtPmh3bmRDdXJyZW50ID0gMDsKQEAgLTI3OCw3ICsyNzgsNyBAQAogCQkJCXsKIAkJCQkgICAgLyogU2V0IGRpcnR5IGJpdHMgaW4gdGhlIGhEQyBhbmQgRENFIHN0cnVjdHMgKi8KIAotCQkJCSAgICBkcHJpbnRmX2luZm8oZGMsIlx0Zml4ZWQgdXAgJTA4eCBkY2UgWyUwNHhdXG4iLCAKKwkJCQkgICAgVFJBQ0UoZGMsIlx0Zml4ZWQgdXAgJTA4eCBkY2UgWyUwNHhdXG4iLCAKIAkJCQkJCSh1bnNpZ25lZClkY2UsIHduZEN1cnJlbnQtPmh3bmRTZWxmKTsKIAogCQkJCSAgICBkY2UtPkRDWGZsYWdzIHw9IERDWF9EQ0VESVJUWTsKQEAgLTYwNSw3ICs2MDUsNyBAQAogICAgIEJPT0wzMgliVXBkYXRlVmlzUmduID0gVFJVRTsKICAgICBCT09MMzIJYlVwZGF0ZUNsaXBPcmlnaW4gPSBGQUxTRTsKIAotICAgIGRwcmludGZfaW5mbyhkYywiR2V0RENFeDogaHduZCAlMDR4LCBocmduQ2xpcCAlMDR4LCBmbGFncyAlMDh4XG4iLCAKKyAgICBUUkFDRShkYywiaHduZCAlMDR4LCBocmduQ2xpcCAlMDR4LCBmbGFncyAlMDh4XG4iLCAKIAkJCQlod25kLCBocmduQ2xpcCwgKHVuc2lnbmVkKWZsYWdzKTsKICAgICAKICAgICBpZiAoISh3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApKSkgcmV0dXJuIDA7CkBAIC02ODQsNyArNjg0LDcgQEAKIAkJICAgKChkY2UtPkRDWGZsYWdzICYgKERDWF9DTElQU0lCTElOR1MgfCBEQ1hfQ0xJUENISUxEUkVOIHwKIAkJCQkgICAgICBEQ1hfQ0FDSEUgfCBEQ1hfV0lORE9XIHwgRENYX1BBUkVOVENMSVApKSA9PSBkY3hGbGFncykpCiAJCXsKLQkJICAgIGRwcmludGZfaW5mbyhkYywiXHRmb3VuZCB2YWxpZCAlMDh4IGRjZSBbJTA0eF0sIGZsYWdzICUwOHhcbiIsIAorCQkgICAgVFJBQ0UoZGMsIlx0Zm91bmQgdmFsaWQgJTA4eCBkY2UgWyUwNHhdLCBmbGFncyAlMDh4XG4iLCAKIAkJCQkJKHVuc2lnbmVkKWRjZSwgaHduZCwgKHVuc2lnbmVkKWRjeEZsYWdzICk7CiAJCSAgICBiVXBkYXRlVmlzUmduID0gRkFMU0U7IAogCQkgICAgYlVwZGF0ZUNsaXBPcmlnaW4gPSBUUlVFOwpAQCAtNjk5LDcgKzY5OSw3IEBACiAgICAgICAgIGRjZSA9ICh3bmRQdHItPmNsYXNzLT5zdHlsZSAmIENTX09XTkRDKSA/IHduZFB0ci0+ZGNlIDogd25kUHRyLT5jbGFzcy0+ZGNlOwogCWlmKCBkY2UtPmh3bmRDdXJyZW50ID09IGh3bmQgKQogCXsKLQkgICAgZHByaW50Zl9pbmZvKGRjLCJcdHNraXBwaW5nIGhWaXNSZ24gdXBkYXRlXG4iKTsKKwkgICAgVFJBQ0UoZGMsIlx0c2tpcHBpbmcgaFZpc1JnbiB1cGRhdGVcbiIpOwogCSAgICBiVXBkYXRlVmlzUmduID0gRkFMU0U7IC8qIHVwZGF0ZWQgYXV0b21hdGljYWxseSwgdmlhIERDSG9vaygpICovCiAKIAkgICAgaWYoIChkY2UtPkRDWGZsYWdzICYgKERDWF9FWENMVURFUkdOIHwgRENYX0lOVEVSU0VDVFJHTikpICYmCkBAIC03MzMsNyArNzMzLDcgQEAKICAgICBEQ0VfU2V0RHJhd2FibGUoIHduZFB0ciwgZGMsIGZsYWdzLCBiVXBkYXRlQ2xpcE9yaWdpbiApOwogICAgIGlmKCBiVXBkYXRlVmlzUmduICkKICAgICB7Ci0JZHByaW50Zl9pbmZvKGRjLCJ1cGRhdGluZyB2aXNyZ24gZm9yICUwOHggZGNlLCBod25kIFslMDR4XVxuIiwgKHVuc2lnbmVkKWRjZSwgaHduZCk7CisJVFJBQ0UoZGMsInVwZGF0aW5nIHZpc3JnbiBmb3IgJTA4eCBkY2UsIGh3bmQgWyUwNHhdXG4iLCAodW5zaWduZWQpZGNlLCBod25kKTsKIAogCWlmIChmbGFncyAmIERDWF9QQVJFTlRDTElQKQogICAgICAgICB7CkBAIC03NjksNyArNzY5LDcgQEAKIAlTZWxlY3RWaXNSZ24oIGhkYywgaHJnblZpc2libGUgKTsKICAgICB9CiAgICAgZWxzZQotCWRwcmludGZfaW5mbyhkYywibm8gdmlzcmduIHVwZGF0ZSAlMDh4IGRjZSwgaHduZCBbJTA0eF1cbiIsICh1bnNpZ25lZClkY2UsIGh3bmQpOworCVRSQUNFKGRjLCJubyB2aXNyZ24gdXBkYXRlICUwOHggZGNlLCBod25kIFslMDR4XVxuIiwgKHVuc2lnbmVkKWRjZSwgaHduZCk7CiAKICAgICAvKiBhcHBseSBhZGRpdGlvbmFsIHJlZ2lvbiBvcGVyYXRpb24gKGlmIGFueSkgKi8KIApAQCAtNzgwLDcgKzc4MCw3IEBACiAJZGNlLT5EQ1hmbGFncyB8PSBmbGFncyAmIChEQ1hfS0VFUENMSVBSR04gfCBEQ1hfSU5URVJTRUNUUkdOIHwgRENYX0VYQ0xVREVSR04pOwogCWRjZS0+aENsaXBSZ24gPSBocmduQ2xpcDsKIAotCWRwcmludGZfaW5mbyhkYywgIlx0c2F2ZWQgVmlzUmduLCBjbGlwUmduID0gJTA0eFxuIiwgaHJnbkNsaXApOworCVRSQUNFKGRjLCAiXHRzYXZlZCBWaXNSZ24sIGNsaXBSZ24gPSAlMDR4XG4iLCBocmduQ2xpcCk7CiAKIAlTYXZlVmlzUmduKCBoZGMgKTsKICAgICAgICAgQ29tYmluZVJnbjMyKCBocmduVmlzaWJsZSwgSW5xdWlyZVZpc1JnbiggaGRjICksIGhyZ25DbGlwLApAQCAtNzkwLDcgKzc5MCw3IEBACiAKICAgICBpZiggaHJnblZpc2libGUgKSBEZWxldGVPYmplY3QzMiggaHJnblZpc2libGUgKTsKIAotICAgIGRwcmludGZfaW5mbyhkYywgIkdldERDRXgoJTA0eCwlMDR4LDB4JWx4KTogcmV0dXJuaW5nICUwNHhcbiIsIAorICAgIFRSQUNFKGRjLCAiKCUwNHgsJTA0eCwweCVseCk6IHJldHVybmluZyAlMDR4XG4iLCAKIAkgICAgICAgaHduZCwgaHJnbkNsaXAsIGZsYWdzLCBoZGMpOwogICAgIHJldHVybiBoZGM7CiB9CkBAIC04MDcsOSArODA3LDEzIEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEdldERDMzIgICAgKFVTRVIzMi4yMjkpCisgKiBSRVRVUk5TCisgKgk6SGFuZGxlIHRvIERDCisgKglOVUxMOiBGYWlsdXJlCiAgKi8KLUhEQzMyIFdJTkFQSSBHZXREQzMyKCBIV05EMzIgaHduZCApCi17CitIREMzMiBXSU5BUEkgR2V0REMzMigKKwkgICAgIEhXTkQzMiBod25kIC8qIGhhbmRsZSBvZiB3aW5kb3cgKi8KKykgewogICAgIGlmICghaHduZCkKICAgICAgICAgcmV0dXJuIEdldERDRXgzMiggR2V0RGVza3RvcFdpbmRvdzMyKCksIDAsIERDWF9DQUNIRSB8IERDWF9XSU5ET1cgKTsKICAgICByZXR1cm4gR2V0RENFeDMyKCBod25kLCAwLCBEQ1hfVVNFU1RZTEUgKTsKQEAgLTg0MSwxOCArODQ1LDI0IEBACiAgKi8KIElOVDE2IFdJTkFQSSBSZWxlYXNlREMxNiggSFdORDE2IGh3bmQsIEhEQzE2IGhkYyApCiB7Ci0gICAgcmV0dXJuIChJTlQzMilSZWxlYXNlREMzMiggaHduZCwgaGRjICk7CisgICAgcmV0dXJuIChJTlQxNilSZWxlYXNlREMzMiggaHduZCwgaGRjICk7CiB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgUmVsZWFzZURDMzIgICAgKFVTRVIzMi40MzkpCisgKgorICogUkVUVVJOUworICoJMTogU3VjY2VzcworICoJMDogRmFpbHVyZQogICovCi1JTlQzMiBXSU5BUEkgUmVsZWFzZURDMzIoIEhXTkQzMiBod25kLCBIREMzMiBoZGMgKQoteworSU5UMzIgV0lOQVBJIFJlbGVhc2VEQzMyKCAKKyAgICAgICAgICAgICBIV05EMzIgaHduZCAvKiBIYW5kbGUgb2Ygd2luZG93IC0gaWdub3JlZCAqLywgCisgICAgICAgICAgICAgSERDMzIgaGRjICAgLyogSGFuZGxlIG9mIGRldmljZSBjb250ZXh0ICovCispIHsKICAgICBEQ0UgKiBkY2UgPSBmaXJzdERDRTsKICAgICAKLSAgICBkcHJpbnRmX2luZm8oZGMsICJSZWxlYXNlREM6ICUwNHggJTA0eFxuIiwgaHduZCwgaGRjICk7CisgICAgVFJBQ0UoZGMsICIlMDR4ICUwNHhcbiIsIGh3bmQsIGhkYyApOwogICAgICAgICAKICAgICB3aGlsZSAoZGNlICYmIChkY2UtPmhEQyAhPSBoZGMpKSBkY2UgPSBkY2UtPm5leHQ7CiAKQEAgLTg3Miw3ICs4ODIsNyBAQAogICAgIEhSR04zMiBoVmlzUmduOwogICAgIERDRSAqZGNlID0gZmlyc3REQ0U7OwogCi0gICAgZHByaW50Zl9pbmZvKGRjLCJEQ0hvb2s6IGhEQyA9ICUwNHgsICVpXG4iLCBoREMsIGNvZGUpOworICAgIFRSQUNFKGRjLCJoREMgPSAlMDR4LCAlaVxuIiwgaERDLCBjb2RlKTsKIAogICAgIHdoaWxlIChkY2UgJiYgKGRjZS0+aERDICE9IGhEQykpIGRjZSA9IGRjZS0+bmV4dDsKICAgICBpZiAoIWRjZSkgcmV0dXJuIDA7CkBAIC04OTEsNyArOTAxLDcgQEAKIAkgICAgICAgU2V0SG9va0ZsYWdzKGhEQywgRENIRl9WQUxJREFURVZJU1JHTik7CiAJICAgICAgIGhWaXNSZ24gPSBEQ0VfR2V0VmlzUmduKGRjZS0+aHduZEN1cnJlbnQsIGRjZS0+RENYZmxhZ3MpOwogCi0JICAgICAgIGRwcmludGZfaW5mbyhkYywiXHRhcHBseWluZyBzYXZlZCBjbGlwUmduXG4iKTsKKwkgICAgICAgVFJBQ0UoZGMsIlx0YXBwbHlpbmcgc2F2ZWQgY2xpcFJnblxuIik7CiAgIAogCSAgICAgICAvKiBjbGlwIHRoaXMgcmVnaW9uIHdpdGggc2F2ZWQgY2xpcHBpbmcgcmVnaW9uICovCiAKQEAgLTkxMSw3ICs5MjEsNyBAQAogCSAgICAgICBEZWxldGVPYmplY3QzMiggaFZpc1JnbiApOwogCSAgIH0KICAgICAgICAgICAgZWxzZSAvKiBub24tZmF0YWwgYnV0IHNob3VsZG4ndCBoYXBwZW4gKi8KLQkgICAgIGRwcmludGZfd2FybihkYywgIkRDSG9vazogREMgaXMgbm90IGluIHVzZSFcbiIpOworCSAgICAgV0FSTihkYywgIkRDIGlzIG5vdCBpbiB1c2UhXG4iKTsKIAkgICBicmVhazsKIAogICAgICAgY2FzZSBEQ0hDX0RFTEVURURDOiAvKiBGSVhNRTogPz8gKi8KZGlmZiAtLWdpdCBhL3dpbmRvd3MvZGVmd25kLmMgYi93aW5kb3dzL2RlZnduZC5jCmluZGV4IGNjM2VjNjQuLjg3YTRkYWEgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZGVmd25kLmMKKysrIGIvd2luZG93cy9kZWZ3bmQuYwpAQCAtMzYsMTAgKzM2LDEwIEBACiB7CiAgICAgV1BBUkFNMTYgd3AgPSBTSVpFX1JFU1RPUkVEOwogCi0gICAgaWYgKCEoZmxhZ3MgJiBTV1BfTk9DTElFTlRNT1ZFKSkKKyAgICBpZiAoIShmbGFncyAmIFNXUF9OT01PVkUpKQogICAgICAgICBTZW5kTWVzc2FnZTE2KCB3bmRQdHItPmh3bmRTZWxmLCBXTV9NT1ZFLCAwLAogICAgICAgICAgICAgICAgICAgICBNQUtFTE9ORyh3bmRQdHItPnJlY3RDbGllbnQubGVmdCwgd25kUHRyLT5yZWN0Q2xpZW50LnRvcCkpOwotICAgIGlmICghKGZsYWdzICYgU1dQX05PQ0xJRU5UU0laRSkpCisgICAgaWYgKCEoZmxhZ3MgJiBTV1BfTk9TSVpFKSkKICAgICB7CiAgICAgICAgIGlmICh3bmRQdHItPmR3U3R5bGUgJiBXU19NQVhJTUlaRSkgd3AgPSBTSVpFX01BWElNSVpFRDsKICAgICAgICAgZWxzZSBpZiAod25kUHRyLT5kd1N0eWxlICYgV1NfTUlOSU1JWkUpIHdwID0gU0laRV9NSU5JTUlaRUQ7CkBAIC05Nyw3ICs5Nyw3IEBACiB7CiAgICAgQk9PTDMyIGJWaXNpYmxlID0gd25kUHRyLT5kd1N0eWxlICYgV1NfVklTSUJMRTsKIAotZHByaW50Zl9pbmZvKHdpbiwiU2V0UmVkcmF3OiAlMDR4ICVpXG4iLCB3bmRQdHItPmh3bmRTZWxmLCAod1BhcmFtIT0wKSApOworVFJBQ0Uod2luLCIlMDR4ICVpXG4iLCB3bmRQdHItPmh3bmRTZWxmLCAod1BhcmFtIT0wKSApOwogCiAgICAgaWYoIHdQYXJhbSApCiAgICAgewpAQCAtMTg0LDcgKzE4NCw3IEBACiAJCQlTWVNNRVRSSUNTX0NYSUNPTikvMjsKIAkgICAgICAgIGludCB5ID0gKHduZFB0ci0+cmVjdFdpbmRvdy5ib3R0b20gLSB3bmRQdHItPnJlY3RXaW5kb3cudG9wIC0KIAkJCVNZU01FVFJJQ1NfQ1lJQ09OKS8yOwotCQlkcHJpbnRmX2luZm8od2luLCJQYWludGluZyBjbGFzcyBpY29uOiB2aXMgcmVjdD0oJWksJWkgLSAlaSwlaSlcbiIsCisJCVRSQUNFKHdpbiwiUGFpbnRpbmcgY2xhc3MgaWNvbjogdmlzIHJlY3Q9KCVpLCVpIC0gJWksJWkpXG4iLAogCQlwcy5yY1BhaW50LmxlZnQsIHBzLnJjUGFpbnQudG9wLCBwcy5yY1BhaW50LnJpZ2h0LCBwcy5yY1BhaW50LmJvdHRvbSApOwogCSAgICAgICAgRHJhd0ljb24zMiggaGRjLCB4LCB5LCB3bmRQdHItPmNsYXNzLT5oSWNvbiApOwogCSAgICAgIH0KZGlmZiAtLWdpdCBhL3dpbmRvd3MvZGlhbG9nLmMgYi93aW5kb3dzL2RpYWxvZy5jCmluZGV4IDJlMmM4NWYuLmM2YWQ3MGMgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZGlhbG9nLmMKKysrIGIvd2luZG93cy9kaWFsb2cuYwpAQCAtODMsNyArODMsNyBAQAogICAgIGlmICghKHRtLnRtUGl0Y2hBbmRGYW1pbHkgJiBUTVBGX0ZJWEVEX1BJVENIKSkKICAgICAgICAgeEJhc2VVbml0ID0geEJhc2VVbml0ICogNSAvIDQ7CiAKLSAgICBkcHJpbnRmX2luZm8oZGlhbG9nLCAiRElBTE9HX0luaXQ6IGJhc2UgdW5pdHMgPSAlZCwlZFxuIiwKKyAgICBUUkFDRShkaWFsb2csICJiYXNlIHVuaXRzID0gJWQsJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgIHhCYXNlVW5pdCwgeUJhc2VVbml0ICk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CkBAIC0xNDYsMTIgKzE0NiwxMiBAQAogICAgIHAgKz0gKnAgKyAxOwogCiAgICAgaWYoaW50X2lkKQotICAgICAgZHByaW50Zl9pbmZvKGRpYWxvZywiICAgJXMgJTA0eCAlZCwgJWQsICVkLCAlZCwgJWQsICUwOGx4LCAlMDhseFxuIiwgCisgICAgICBUUkFDRShkaWFsb2csIiAgICVzICUwNHggJWQsICVkLCAlZCwgJWQsICVkLCAlMDhseCwgJTA4bHhcbiIsIAogCQkgICAgICBpbmZvLT5jbGFzc05hbWUsICBMT1dPUkQoaW5mby0+d2luZG93TmFtZSksCiAJCSAgICAgIGluZm8tPmlkLCBpbmZvLT54LCBpbmZvLT55LCBpbmZvLT5jeCwgaW5mby0+Y3ksCiAJCSAgICAgIGluZm8tPnN0eWxlLCAoRFdPUkQpaW5mby0+ZGF0YSk7CiAgICAgZWxzZQotICAgICAgZHByaW50Zl9pbmZvKGRpYWxvZywiICAgJXMgJyVzJyAlZCwgJWQsICVkLCAlZCwgJWQsICUwOGx4LCAlMDhseFxuIiwgCisgICAgICBUUkFDRShkaWFsb2csIiAgICVzICclcycgJWQsICVkLCAlZCwgJWQsICVkLCAlMDhseCwgJTA4bHhcbiIsIAogCQkgICAgICBpbmZvLT5jbGFzc05hbWUsICBpbmZvLT53aW5kb3dOYW1lLAogCQkgICAgICBpbmZvLT5pZCwgaW5mby0+eCwgaW5mby0+eSwgaW5mby0+Y3gsIGluZm8tPmN5LAogCQkgICAgICBpbmZvLT5zdHlsZSwgKERXT1JEKWluZm8tPmRhdGEpOwpAQCAtMjIxLDEyICsyMjEsMTIgQEAKICAgICBwKys7CiAKICAgICBpZihpbnRfaWQpCi0gICAgICBkcHJpbnRmX2luZm8oZGlhbG9nLCIgICAlcCAlMDR4ICVkLCAlZCwgJWQsICVkLCAlZCwgJTA4bHgsICUwOGx4LCAlMDhseFxuIiwgCisgICAgICBUUkFDRShkaWFsb2csIiAgICVwICUwNHggJWQsICVkLCAlZCwgJWQsICVkLCAlMDhseCwgJTA4bHgsICUwOGx4XG4iLCAKIAkJICAgICAgaW5mby0+Y2xhc3NOYW1lLCBMT1dPUkQoaW5mby0+d2luZG93TmFtZSksCiAJCSAgICAgIGluZm8tPmlkLCBpbmZvLT54LCBpbmZvLT55LCBpbmZvLT5jeCwgaW5mby0+Y3ksCiAJCSAgICAgIGluZm8tPnN0eWxlLCBpbmZvLT5leFN0eWxlLCAoRFdPUkQpaW5mby0+ZGF0YSk7CiAgICAgZWxzZQotICAgICAgZHByaW50Zl9pbmZvKGRpYWxvZywiICAgJXAgJyVwJyAlZCwgJWQsICVkLCAlZCwgJWQsICUwOGx4LCAlMDhseCwgJTA4bHhcbiIsIAorICAgICAgVFJBQ0UoZGlhbG9nLCIgICAlcCAnJXAnICVkLCAlZCwgJWQsICVkLCAlZCwgJTA4bHgsICUwOGx4LCAlMDhseFxuIiwgCiAJCSAgICAgIGluZm8tPmNsYXNzTmFtZSwgaW5mby0+d2luZG93TmFtZSwKIAkJICAgICAgaW5mby0+aWQsIGluZm8tPngsIGluZm8tPnksIGluZm8tPmN4LCBpbmZvLT5jeSwKIAkJICAgICAgaW5mby0+c3R5bGUsIGluZm8tPmV4U3R5bGUsIChEV09SRClpbmZvLT5kYXRhKTsKQEAgLTI0OCw3ICsyNDgsNyBAQAogICAgIERMR19DT05UUk9MX0lORk8gaW5mbzsKICAgICBIV05EMzIgaHduZEN0cmwsIGh3bmREZWZCdXR0b24gPSAwOwogCi0gICAgZHByaW50Zl9pbmZvKGRpYWxvZywgIiBCRUdJTlxuIiApOworICAgIFRSQUNFKGRpYWxvZywgIiBCRUdJTlxuIiApOwogICAgIHdoaWxlIChpdGVtcy0tKQogICAgIHsKICAgICAgICAgaWYgKCF3aW4zMikKQEAgLTMxMiw3ICszMTIsNyBAQAogICAgICAgICAgICAgZGxnSW5mby0+aWRSZXN1bHQgPSBHZXRXaW5kb3dXb3JkMzIoIGh3bmRDdHJsLCBHV1dfSUQgKTsKICAgICAgICAgfQogICAgIH0gICAgCi0gICAgZHByaW50Zl9pbmZvKGRpYWxvZywgIiBFTkRcbiIgKTsKKyAgICBUUkFDRShkaWFsb2csICIgRU5EXG4iICk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKQEAgLTMzMiw5ICszMzIsOSBAQAogICAgIHJlc3VsdC0+eSAgICAgICA9IEdFVF9XT1JEKHApOyAgcCArPSBzaXplb2YoV09SRCk7CiAgICAgcmVzdWx0LT5jeCAgICAgID0gR0VUX1dPUkQocCk7ICBwICs9IHNpemVvZihXT1JEKTsKICAgICByZXN1bHQtPmN5ICAgICAgPSBHRVRfV09SRChwKTsgIHAgKz0gc2l6ZW9mKFdPUkQpOwotICAgIGRwcmludGZfaW5mbyhkaWFsb2csICJESUFMT0cgJWQsICVkLCAlZCwgJWRcbiIsCisgICAgVFJBQ0UoZGlhbG9nLCAiRElBTE9HICVkLCAlZCwgJWQsICVkXG4iLAogICAgICAgICAgICAgICAgICAgICByZXN1bHQtPngsIHJlc3VsdC0+eSwgcmVzdWx0LT5jeCwgcmVzdWx0LT5jeSApOwotICAgIGRwcmludGZfaW5mbyhkaWFsb2csICIgU1RZTEUgJTA4bHhcbiIsIHJlc3VsdC0+c3R5bGUgKTsKKyAgICBUUkFDRShkaWFsb2csICIgU1RZTEUgJTA4bHhcbiIsIHJlc3VsdC0+c3R5bGUgKTsKIAogICAgIC8qIEdldCB0aGUgbWVudSBuYW1lICovCiAKQEAgLTM0NywxMSArMzQ3LDExIEBACiAgICAgY2FzZSAweGZmOgogICAgICAgICByZXN1bHQtPm1lbnVOYW1lID0gKExQQ1NUUikoVUlOVDMyKUdFVF9XT1JEKCBwICsgMSApOwogICAgICAgICBwICs9IDM7Ci0JZHByaW50Zl9pbmZvKGRpYWxvZywgIiBNRU5VICUwNHhcbiIsIExPV09SRChyZXN1bHQtPm1lbnVOYW1lKSApOworCVRSQUNFKGRpYWxvZywgIiBNRU5VICUwNHhcbiIsIExPV09SRChyZXN1bHQtPm1lbnVOYW1lKSApOwogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgICByZXN1bHQtPm1lbnVOYW1lID0gcDsKLSAgICAgICAgZHByaW50Zl9pbmZvKGRpYWxvZywgIiBNRU5VICclcydcbiIsIHAgKTsKKyAgICAgICAgVFJBQ0UoZGlhbG9nLCAiIE1FTlUgJyVzJ1xuIiwgcCApOwogICAgICAgICBwICs9IHN0cmxlbihwKSArIDE7CiAgICAgICAgIGJyZWFrOwogICAgIH0KQEAgLTM2MSw3ICszNjEsNyBAQAogICAgIGlmICgqcCkKICAgICB7CiAgICAgICAgIHJlc3VsdC0+Y2xhc3NOYW1lID0gcDsKLSAgICAgICAgZHByaW50Zl9pbmZvKGRpYWxvZywgIiBDTEFTUyAnJXMnXG4iLCByZXN1bHQtPmNsYXNzTmFtZSApOworICAgICAgICBUUkFDRShkaWFsb2csICIgQ0xBU1MgJyVzJ1xuIiwgcmVzdWx0LT5jbGFzc05hbWUgKTsKICAgICB9CiAgICAgZWxzZSByZXN1bHQtPmNsYXNzTmFtZSA9IERJQUxPR19DTEFTU19BVE9NOwogICAgIHAgKz0gc3RybGVuKHApICsgMTsKQEAgLTM3MCw3ICszNzAsNyBAQAogCiAgICAgcmVzdWx0LT5jYXB0aW9uID0gcDsKICAgICBwICs9IHN0cmxlbihwKSArIDE7Ci0gICAgZHByaW50Zl9pbmZvKGRpYWxvZywgIiBDQVBUSU9OICclcydcbiIsIHJlc3VsdC0+Y2FwdGlvbiApOworICAgIFRSQUNFKGRpYWxvZywgIiBDQVBUSU9OICclcydcbiIsIHJlc3VsdC0+Y2FwdGlvbiApOwogCiAgICAgLyogR2V0IHRoZSBmb250IG5hbWUgKi8KIApAQCAtMzgwLDcgKzM4MCw3IEBACiAgICAgICAgIHAgKz0gc2l6ZW9mKFdPUkQpOwogCXJlc3VsdC0+ZmFjZU5hbWUgPSBwOwogICAgICAgICBwICs9IHN0cmxlbihwKSArIDE7Ci0JZHByaW50Zl9pbmZvKGRpYWxvZywgIiBGT05UICVkLCclcydcbiIsCisJVFJBQ0UoZGlhbG9nLCAiIEZPTlQgJWQsJyVzJ1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC0+cG9pbnRTaXplLCByZXN1bHQtPmZhY2VOYW1lICk7CiAgICAgfQogICAgIHJldHVybiBwOwpAQCAtNDA0LDEwICs0MDQsMTAgQEAKICAgICByZXN1bHQtPnkgICAgICAgPSBHRVRfV09SRChwKTsgcCsrOwogICAgIHJlc3VsdC0+Y3ggICAgICA9IEdFVF9XT1JEKHApOyBwKys7CiAgICAgcmVzdWx0LT5jeSAgICAgID0gR0VUX1dPUkQocCk7IHArKzsKLSAgICBkcHJpbnRmX2luZm8oZGlhbG9nLCAiRElBTE9HICVkLCAlZCwgJWQsICVkXG4iLAorICAgIFRSQUNFKGRpYWxvZywgIkRJQUxPRyAlZCwgJWQsICVkLCAlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LT54LCByZXN1bHQtPnksIHJlc3VsdC0+Y3gsIHJlc3VsdC0+Y3kgKTsKLSAgICBkcHJpbnRmX2luZm8oZGlhbG9nLCAiIFNUWUxFICUwOGx4XG4iLCByZXN1bHQtPnN0eWxlICk7Ci0gICAgZHByaW50Zl9pbmZvKGRpYWxvZywgIiBFWFNUWUxFICUwOGx4XG4iLCByZXN1bHQtPmV4U3R5bGUgKTsKKyAgICBUUkFDRShkaWFsb2csICIgU1RZTEUgJTA4bHhcbiIsIHJlc3VsdC0+c3R5bGUgKTsKKyAgICBUUkFDRShkaWFsb2csICIgRVhTVFlMRSAlMDhseFxuIiwgcmVzdWx0LT5leFN0eWxlICk7CiAKICAgICAvKiBHZXQgdGhlIG1lbnUgbmFtZSAqLwogCkBAIC00MjAsMTEgKzQyMCwxMSBAQAogICAgIGNhc2UgMHhmZmZmOgogICAgICAgICByZXN1bHQtPm1lbnVOYW1lID0gKExQQ1NUUikoVUlOVDMyKUdFVF9XT1JEKCBwICsgMSApOwogICAgICAgICBwICs9IDI7Ci0JZHByaW50Zl9pbmZvKGRpYWxvZywgIiBNRU5VICUwNHhcbiIsIExPV09SRChyZXN1bHQtPm1lbnVOYW1lKSApOworCVRSQUNFKGRpYWxvZywgIiBNRU5VICUwNHhcbiIsIExPV09SRChyZXN1bHQtPm1lbnVOYW1lKSApOwogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgICByZXN1bHQtPm1lbnVOYW1lID0gKExQQ1NUUilwOwotICAgICAgICBkcHJpbnRmX2luZm8oZGlhbG9nLCAiIE1FTlUgJyVwJ1xuIiwgcCApOworICAgICAgICBUUkFDRShkaWFsb2csICIgTUVOVSAnJXAnXG4iLCBwICk7CiAgICAgICAgIHAgKz0gbHN0cmxlbjMyVyggKExQQ1dTVFIpcCApICsgMTsKICAgICAgICAgYnJlYWs7CiAgICAgfQpAQCAtNDQwLDExICs0NDAsMTEgQEAKICAgICBjYXNlIDB4ZmZmZjoKICAgICAgICAgcmVzdWx0LT5jbGFzc05hbWUgPSAoTFBDU1RSKShVSU5UMzIpR0VUX1dPUkQoIHAgKyAxICk7CiAgICAgICAgIHAgKz0gMjsKLQlkcHJpbnRmX2luZm8oZGlhbG9nLCAiIENMQVNTICUwNHhcbiIsIExPV09SRChyZXN1bHQtPmNsYXNzTmFtZSkgKTsKKwlUUkFDRShkaWFsb2csICIgQ0xBU1MgJTA0eFxuIiwgTE9XT1JEKHJlc3VsdC0+Y2xhc3NOYW1lKSApOwogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgICByZXN1bHQtPmNsYXNzTmFtZSA9IChMUENTVFIpcDsKLSAgICAgICAgZHByaW50Zl9pbmZvKGRpYWxvZywgIiBDTEFTUyAnJXAnXG4iLCBwICk7CisgICAgICAgIFRSQUNFKGRpYWxvZywgIiBDTEFTUyAnJXAnXG4iLCBwICk7CiAgICAgICAgIHAgKz0gbHN0cmxlbjMyVyggKExQQ1dTVFIpcCApICsgMTsKICAgICAgICAgYnJlYWs7CiAgICAgfQpAQCAtNDUzLDcgKzQ1Myw3IEBACiAKICAgICByZXN1bHQtPmNhcHRpb24gPSAoTFBDU1RSKXA7CiAgICAgcCArPSBsc3RybGVuMzJXKCAoTFBDV1NUUilwICkgKyAxOwotICAgIGRwcmludGZfaW5mbyhkaWFsb2csICIgQ0FQVElPTiAnJXAnXG4iLCByZXN1bHQtPmNhcHRpb24gKTsKKyAgICBUUkFDRShkaWFsb2csICIgQ0FQVElPTiAnJXAnXG4iLCByZXN1bHQtPmNhcHRpb24gKTsKIAogICAgIC8qIEdldCB0aGUgZm9udCBuYW1lICovCiAKQEAgLTQ2Myw3ICs0NjMsNyBAQAogICAgICAgICBwKys7CiAJcmVzdWx0LT5mYWNlTmFtZSA9IChMUENTVFIpcDsKICAgICAgICAgcCArPSBsc3RybGVuMzJXKCAoTFBDV1NUUilwICkgKyAxOwotCWRwcmludGZfaW5mbyhkaWFsb2csICIgRk9OVCAlZCwnJXAnXG4iLAorCVRSQUNFKGRpYWxvZywgIiBGT05UICVkLCclcCdcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQtPnBvaW50U2l6ZSwgcmVzdWx0LT5mYWNlTmFtZSApOwogICAgIH0KICAgICAvKiBGaXJzdCBjb250cm9sIGlzIG9uIGR3b3JkIGJvdW5kYXJ5ICovCkBAIC02NjYsNyArNjY2LDcgQEAKICAgICBIR0xPQkFMMTYgaG1lbTsKICAgICBMUENWT0lEIGRhdGE7CiAKLSAgICBkcHJpbnRmX2luZm8oZGlhbG9nLCAiQ3JlYXRlRGlhbG9nUGFyYW0xNjogJTA0eCwlMDhseCwlMDR4LCUwOGx4LCVsZFxuIiwKKyAgICBUUkFDRShkaWFsb2csICIlMDR4LCUwOGx4LCUwNHgsJTA4bHgsJWxkXG4iLAogICAgICAgICAgICAgICAgICAgIGhJbnN0LCAoRFdPUkQpZGxnVGVtcGxhdGUsIG93bmVyLCAoRFdPUkQpZGxnUHJvYywgcGFyYW0gKTsKIAogICAgIGlmICghKGhSc3JjID0gRmluZFJlc291cmNlMTYoIGhJbnN0LCBkbGdUZW1wbGF0ZSwgUlRfRElBTE9HICkpKSByZXR1cm4gMDsKQEAgLTkxNCw3ICs5MTQsNyBAQAogICAgIFdORCAqIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7CiAgICAgRElBTE9HSU5GTyAqIGRsZ0luZm8gPSAoRElBTE9HSU5GTyAqKXduZFB0ci0+d0V4dHJhOwogCi0gICAgZHByaW50Zl9pbmZvKGRpYWxvZywgIkVuZERpYWxvZzogJTA0eCAlZFxuIiwgaHduZCwgcmV0dmFsICk7CisgICAgVFJBQ0UoZGlhbG9nLCAiJTA0eCAlZFxuIiwgaHduZCwgcmV0dmFsICk7CiAKICAgICBpZiggZGxnSW5mbyApCiAgICAgewpAQCAtMTU1Niw3ICsxNTU2LDcgQEAKICAgICBCT09MMzIgcmV0OwogICAgIEhXTkQzMiBsaXN0Ym94ID0gR2V0RGxnSXRlbTMyKCBod25kLCBpZCApOwogCi0gICAgZHByaW50Zl9pbmZvKGRpYWxvZywgIkRsZ0RpclNlbGVjdDogJTA0eCAnJXMnICVkXG4iLCBod25kLCBzdHIsIGlkICk7CisgICAgVFJBQ0UoZGlhbG9nLCAiJTA0eCAnJXMnICVkXG4iLCBod25kLCBzdHIsIGlkICk7CiAgICAgaWYgKCFsaXN0Ym94KSByZXR1cm4gRkFMU0U7CiAgICAgaWYgKHdpbjMyKQogICAgIHsKQEAgLTE2MDUsNyArMTYwNSw3IEBACiAgICAgaWYgKHVuaWNvZGUpIGxzdHJjcHluQXRvVyggKExQV1NUUilzdHIsIHB0ciwgbGVuICk7CiAgICAgZWxzZSBsc3RyY3B5bjMyQSggc3RyLCBwdHIsIGxlbiApOwogICAgIFNFR1BUUl9GUkVFKCBidWZmZXIgKTsKLSAgICBkcHJpbnRmX2luZm8oZGlhbG9nLCAiUmV0dXJuaW5nICVkICclcydcbiIsIHJldCwgc3RyICk7CisgICAgVFJBQ0UoZGlhbG9nLCAiUmV0dXJuaW5nICVkICclcydcbiIsIHJldCwgc3RyICk7CiAgICAgcmV0dXJuIHJldDsKIH0KIApAQCAtMTYyNiw3ICsxNjI2LDcgQEAKICAgICAoKGF0dHJpYiAmIERETF9QT1NUTVNHUykgPyBQb3N0TWVzc2FnZTMyQSggaHduZCwgbXNnLCB3cGFyYW0sIGxwYXJhbSApIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTZW5kTWVzc2FnZTMyQSggaHduZCwgbXNnLCB3cGFyYW0sIGxwYXJhbSApKQogCi0gICAgZHByaW50Zl9pbmZvKGRpYWxvZywgIkRsZ0Rpckxpc3Q6ICUwNHggJyVzJyAlZCAlZCAlMDR4XG4iLAorICAgIFRSQUNFKGRpYWxvZywgIiUwNHggJyVzJyAlZCAlZCAlMDR4XG4iLAogICAgICAgICAgICAgICAgICAgICBoRGxnLCBzcGVjID8gc3BlYyA6ICJOVUxMIiwgaWRMQm94LCBpZFN0YXRpYywgYXR0cmliICk7CiAKICAgICBpZiAoc3BlYyAmJiBzcGVjWzBdICYmIChzcGVjWzFdID09ICc6JykpCkBAIC0xNjU4LDcgKzE2NTgsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgZHByaW50Zl9pbmZvKGRpYWxvZywgIkxpc3RCb3hEaXJlY3Rvcnk6IHBhdGg9JWM6XFwlcyBtYXNrPSVzXG4iLAorICAgIFRSQUNFKGRpYWxvZywgInBhdGg9JWM6XFwlcyBtYXNrPSVzXG4iLAogICAgICAgICAgICAgICAgICAgICAnQScgKyBkcml2ZSwgRFJJVkVfR2V0RG9zQ3dkKGRyaXZlKSwgc3BlYyApOwogCiAgICAgaWYgKGlkTEJveCAmJiAoKGh3bmQgPSBHZXREbGdJdGVtMzIoIGhEbGcsIGlkTEJveCApKSAhPSAwKSkKZGlmZiAtLWdpdCBhL3dpbmRvd3MvZHJpdmVyLmMgYi93aW5kb3dzL2RyaXZlci5jCmluZGV4IDg1ZWVmZTMuLjMxNzgzMWYgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZHJpdmVyLmMKKysrIGIvd2luZG93cy9kcml2ZXIuYwpAQCAtMzEsMTIgKzMxLDEyIEBACiAgICAgcHRyID0gc3RyOwogICAgIHdoaWxlIChsc3RybGVuMzJBKCBwdHIgKSAhPSAwKQogICAgIHsKLQlkcHJpbnRmX2luZm8oZHJpdmVyLCAiTG9hZFN0YXJ0dXBEcml2ZXJzIC8vIHN0cj0nJXMnXG4iLCBwdHIgKTsKKwlUUkFDRShkcml2ZXIsICJzdHI9JyVzJ1xuIiwgcHRyICk7CiAJaERydiA9IE9wZW5Ecml2ZXIoIHB0ciwgImRyaXZlcnMiLCAwTCApOwotCWRwcmludGZfaW5mbyhkcml2ZXIsICJMb2FkU3RhcnR1cERyaXZlcnMgLy8gaERydj0lMDR4XG4iLCBoRHJ2ICk7CisJVFJBQ0UoZHJpdmVyLCAiaERydj0lMDR4XG4iLCBoRHJ2ICk7CiAJcHRyICs9IGxzdHJsZW4zMkEocHRyKSArIDE7CiAgICAgfQotICAgIGRwcmludGZfaW5mbyhkcml2ZXIsICJMb2FkU3RhcnR1cERyaXZlcnMgLy8gZW5kIG9mIGxpc3QgIVxuIiApOworICAgIFRSQUNFKGRyaXZlciwgImVuZCBvZiBsaXN0ICFcbiIgKTsKIAogICAgIHJldHVybjsKIH0KQEAgLTUwLDcgKzUwLDcgQEAKICAgICBMUERSSVZFUklURU0gbHBkcnY7CiAgICAgTFJFU1VMVCByZXR2YWw7CiAKLSAgICBkcHJpbnRmX2luZm8oZHJpdmVyLCAiU2VuZERyaXZlck1lc3NhZ2UoJTA0eCwgJTA0WCwgJTA4bFgsICUwOGxYKVxuIiwKKyAgICBUUkFDRShkcml2ZXIsICIoJTA0eCwgJTA0WCwgJTA4bFgsICUwOGxYKVxuIiwKIAkJICAgIGhEcml2ZXIsIG1zZywgbFBhcmFtMSwgbFBhcmFtMiApOwogCiAgICAgbHBkcnYgPSAoTFBEUklWRVJJVEVNKUdsb2JhbExvY2sxNiggaERyaXZlciApOwpAQCAtNjMsNyArNjMsNyBAQAogICAgIHJldHZhbCA9IENhbGxiYWNrcy0+Q2FsbERyaXZlclByb2MoIGxwZHJ2LT5scERydlByb2MsIDBMIC8qIEZJWE1FICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhEcml2ZXIsIG1zZywgbFBhcmFtMSwgbFBhcmFtMiApOwogCi0gICAgZHByaW50Zl9pbmZvKGRyaXZlciwgIlNlbmREcml2ZXJNZXNzYWdlIC8vIHJldHZhbCA9ICVsZFxuIiwgcmV0dmFsICk7CisgICAgVFJBQ0UoZHJpdmVyLCAicmV0dmFsID0gJWxkXG4iLCByZXR2YWwgKTsKIAogICAgIEdsb2JhbFVubG9jazE2KCBoRHJpdmVyICk7CiAgICAgcmV0dXJuIHJldHZhbDsKQEAgLTc5LDEzICs3OSwxMyBAQAogICAgIGNoYXIgRHJ2TmFtZVsxMjhdOwogICAgIFdPUkQgb3JkaW5hbDsKIAotICAgIGRwcmludGZfaW5mbyhkcml2ZXIsIk9wZW5Ecml2ZXIoJyVzJywgJyVzJywgJTA4bFgpO1xuIiwKKyAgICBUUkFDRShkcml2ZXIsIignJXMnLCAnJXMnLCAlMDhsWCk7XG4iLAogCQkgICAgbHBEcml2ZXJOYW1lLCBscFNlY3Rpb25OYW1lLCBsUGFyYW0gKTsKIAogICAgIGlmIChscFNlY3Rpb25OYW1lID09IE5VTEwpIGxwU2VjdGlvbk5hbWUgPSAiZHJpdmVycyI7CiAgICAgR2V0UHJpdmF0ZVByb2ZpbGVTdHJpbmczMkEoIGxwU2VjdGlvbk5hbWUsIGxwRHJpdmVyTmFtZSwgIiIsIERydk5hbWUsCiAJCQkgICAgIHNpemVvZihEcnZOYW1lKSwgIlNZU1RFTS5JTkkiICk7Ci0gICAgZHByaW50Zl9pbmZvKGRyaXZlciwiT3BlbkRyaXZlciAvLyBEcnZOYW1lPSclcydcbiIsIERydk5hbWUgKTsKKyAgICBUUkFDRShkcml2ZXIsIkRydk5hbWU9JyVzJ1xuIiwgRHJ2TmFtZSApOwogICAgIGlmIChsc3RybGVuMzJBKERydk5hbWUpIDwgMSkgcmV0dXJuIDA7CiAKICAgICBscGRydiA9IGxwRHJ2SXRlbUxpc3Q7CkBAIC0xNDYsNyArMTQ2LDcgQEAKICAgICBTZW5kRHJpdmVyTWVzc2FnZSggaERydnIsIERSVl9FTkFCTEUsIDBMLCBsUGFyYW0gKTsKICAgICBTZW5kRHJpdmVyTWVzc2FnZSggaERydnIsIERSVl9PUEVOLCAwTCwgbFBhcmFtICk7CiAKLSAgICBkcHJpbnRmX2luZm8oZHJpdmVyLCAiT3BlbkRyaXZlciAvLyBoRHJ2cj0lMDR4IGxvYWRlZCAhXG4iLCBoRHJ2ciApOworICAgIFRSQUNFKGRyaXZlciwgImhEcnZyPSUwNHggbG9hZGVkICFcbiIsIGhEcnZyICk7CiAgICAgcmV0dXJuIGhEcnZyOwogfQogCkBAIC0xNTcsNyArMTU3LDcgQEAKIHsKICAgICBMUERSSVZFUklURU0gbHBkcnY7CiAKLSAgICBkcHJpbnRmX2luZm8oZHJpdmVyLCAiQ2xvc2VEcml2ZXIoJTA0eCwgJTA4bFgsICUwOGxYKTtcbiIsCisgICAgVFJBQ0UoZHJpdmVyLCAiKCUwNHgsICUwOGxYLCAlMDhsWCk7XG4iLAogCQkgICAgaERydnIsIGxQYXJhbTEsIGxQYXJhbTIgKTsKIAogICAgIGxwZHJ2ID0gKExQRFJJVkVSSVRFTSlHbG9iYWxMb2NrMTYoIGhEcnZyICk7CkBAIC0xODEsNyArMTgxLDcgQEAKIAkgICAgR2xvYmFsRnJlZTE2KCBoRHJ2ciApOwogCX0KIAotICAgICAgICBkcHJpbnRmX2luZm8oZHJpdmVyLCAiQ2xvc2VEcml2ZXIgLy8gaERydnI9JTA0eCBjbG9zZWQgIVxuIiwKKyAgICAgICAgVFJBQ0UoZHJpdmVyLCAiaERydnI9JTA0eCBjbG9zZWQgIVxuIiwKIAkJICAgICAgICBoRHJ2ciApOwogCXJldHVybiBUUlVFOwogICAgIH0KQEAgLTE5Niw3ICsxOTYsNyBAQAogICAgIExQRFJJVkVSSVRFTSBscGRydjsKICAgICBITU9EVUxFMTYgaE1vZHVsZSA9IDA7CiAKLSAgICBkcHJpbnRmX2luZm8oZHJpdmVyLCAiR2V0RHJpdmVyTW9kdWxlSGFuZGxlKCUwNHgpO1xuIiwgaERydnIpOworICAgIFRSQUNFKGRyaXZlciwgIiglMDR4KTtcbiIsIGhEcnZyKTsKIAogICAgIGxwZHJ2ID0gKExQRFJJVkVSSVRFTSlHbG9iYWxMb2NrMTYoIGhEcnZyICk7CiAgICAgaWYgKGxwZHJ2ICE9IE5VTEwgJiYgbHBkcnYtPmRpcy5oRHJpdmVyID09IGhEcnZyKQpAQCAtMjUyLDcgKzI1Miw3IEBACiB7CiAgICAgTFBEUklWRVJJVEVNIGxwZHJ2OwogCi0gICAgZHByaW50Zl9pbmZvKGRyaXZlciwgIkdldERyaXZlckluZm8oJTA0eCwgJXApO1xuIiwgaERydnIsIGxwRHJ2SW5mbyApOworICAgIFRSQUNFKGRyaXZlciwgIiglMDR4LCAlcCk7XG4iLCBoRHJ2ciwgbHBEcnZJbmZvICk7CiAKICAgICBpZiAobHBEcnZJbmZvID09IE5VTEwpIHJldHVybiBGQUxTRTsKIApAQCAtMjcyLDE3ICsyNzIsMTcgQEAKICAgICBMUERSSVZFUklURU0gbHBkcnY7CiAgICAgSERSVlIxNiBoUmV0RHJ2ID0gMDsKIAotICAgIGRwcmludGZfaW5mbyhkcml2ZXIsICJHZXROZXh0RHJpdmVyKCUwNHgsICUwOGxYKTtcbiIsIGhEcnZyLCBkd0ZsYWdzICk7CisgICAgVFJBQ0UoZHJpdmVyLCAiKCUwNHgsICUwOGxYKTtcbiIsIGhEcnZyLCBkd0ZsYWdzICk7CiAKICAgICBpZiAoaERydnIgPT0gMCkKICAgICB7CiAJaWYgKGxwRHJ2SXRlbUxpc3QgPT0gTlVMTCkKIAl7Ci0JICAgIGRwcmludGZfaW5mbyhkcml2ZXIsICJHZXROZXh0RHJpdmVyIC8vIGRyaXZlcnMgbGlzdCBlbXB0eSAhXG4iKTsKKwkgICAgVFJBQ0UoZHJpdmVyLCAiZHJpdmVycyBsaXN0IGVtcHR5ICFcbiIpOwogCSAgICBMb2FkU3RhcnR1cERyaXZlcnMoKTsKIAkgICAgaWYgKGxwRHJ2SXRlbUxpc3QgPT0gTlVMTCkgcmV0dXJuIDA7CiAJfQotCWRwcmludGZfaW5mbyhkcml2ZXIsIkdldE5leHREcml2ZXIgLy8gcmV0dXJuIGZpcnN0ICUwNHggIVxuIiwKKwlUUkFDRShkcml2ZXIsInJldHVybiBmaXJzdCAlMDR4ICFcbiIsCiAJCSAgICAgICAgbHBEcnZJdGVtTGlzdC0+ZGlzLmhEcml2ZXIgKTsKIAlyZXR1cm4gbHBEcnZJdGVtTGlzdC0+ZGlzLmhEcml2ZXI7CiAgICAgfQpAQCAtMzAzLDYgKzMwMyw2IEBACiAJR2xvYmFsVW5sb2NrMTYoIGhEcnZyICk7CiAgICAgfQogCi0gICAgZHByaW50Zl9pbmZvKGRyaXZlciwgIkdldE5leHREcml2ZXIgLy8gcmV0dXJuICUwNHggIVxuIiwgaFJldERydiApOworICAgIFRSQUNFKGRyaXZlciwgInJldHVybiAlMDR4ICFcbiIsIGhSZXREcnYgKTsKICAgICByZXR1cm4gaFJldERydjsKIH0KZGlmZiAtLWdpdCBhL3dpbmRvd3MvZXZlbnQuYyBiL3dpbmRvd3MvZXZlbnQuYwppbmRleCAwMzUwZjE0Li5lNTVjMDQ4IDEwMDY0NAotLS0gYS93aW5kb3dzL2V2ZW50LmMKKysrIGIvd2luZG93cy9ldmVudC5jCkBAIC0xNTQsNyArMTU0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKikmcFduZCApICE9IDApCiAgICAgICAgIHJldHVybjsgIC8qIE5vdCBmb3IgYSByZWdpc3RlcmVkIHdpbmRvdyAqLwogCi0gICAgZHByaW50Zl9pbmZvKGV2ZW50LCAiR290IGV2ZW50ICVzIGZvciBod25kICUwNHhcbiIsCisgICAgVFJBQ0UoZXZlbnQsICJHb3QgZXZlbnQgJXMgZm9yIGh3bmQgJTA0eFxuIiwKICAgICAgICAgICAgICAgICAgICBldmVudF9uYW1lc1tldmVudC0+dHlwZV0sIHBXbmQtPmh3bmRTZWxmICk7CiAKICAgICBzd2l0Y2goZXZlbnQtPnR5cGUpCkBAIC0yNDgsNyArMjQ4LDcgQEAKIAlicmVhazsKIAogICAgIGRlZmF1bHQ6ICAgIAotCWRwcmludGZfd2FybihldmVudCwgIlVucHJvY2Vzc2VkIGV2ZW50ICVzIGZvciBod25kICUwNHhcbiIsCisJV0FSTihldmVudCwgIlVucHJvY2Vzc2VkIGV2ZW50ICVzIGZvciBod25kICUwNHhcbiIsCiAJICAgICAgICBldmVudF9uYW1lc1tldmVudC0+dHlwZV0sIHBXbmQtPmh3bmRTZWxmICk7CiAJYnJlYWs7CiAgICAgfQpAQCAtNTA5LDcgKzUwOSw3IEBACiAgICAgICAgIFRTWFF1ZXJ5VHJlZSggZGlzcGxheSwgdywgJnJvb3QsICZwYXJlbnQsICZjaGlsZHJlbiwgJnRvdGFsICk7CiAgICAgICAgIGlmKCBjaGlsZHJlbiApIFRTWEZyZWUoIGNoaWxkcmVuICk7CiAgICAgfSB3aGlsZSggcGFyZW50ICYmIHBhcmVudCAhPSBhbmNlc3RvciApOwotICAgIGRwcmludGZfaW5mbyhldmVudCwgIlx0JTA4eCAtPiAlMDh4XG4iLCAodW5zaWduZWQpcHJldiwgKHVuc2lnbmVkKXcgKTsKKyAgICBUUkFDRShldmVudCwgIlx0JTA4eCAtPiAlMDh4XG4iLCAodW5zaWduZWQpcHJldiwgKHVuc2lnbmVkKXcgKTsKICAgICByZXR1cm4gKCBwYXJlbnQgKSA/IHcgOiAwIDsKIH0KIApAQCAtOTMxLDcgKzkzMSw3IEBACiAgICAgfQogCiAgICAgaWYocnByb3AgPT0gTm9uZSkgCi0gICAgICAgZHByaW50Zl9pbmZvKGV2ZW50LCJSZXF1ZXN0IGZvciAlcyBpZ25vcmVkXG4iLCBUU1hHZXRBdG9tTmFtZShkaXNwbGF5LGV2ZW50LT50YXJnZXQpKTsKKyAgICAgICBUUkFDRShldmVudCwiUmVxdWVzdCBmb3IgJXMgaWdub3JlZFxuIiwgVFNYR2V0QXRvbU5hbWUoZGlzcGxheSxldmVudC0+dGFyZ2V0KSk7CiAKICAgICByZXN1bHQudHlwZSA9IFNlbGVjdGlvbk5vdGlmeTsKICAgICByZXN1bHQuZGlzcGxheSA9IGRpc3BsYXk7CkBAIC05NTQsNyArOTU0LDcgQEAKICAgICBpZiAoZXZlbnQtPnRhcmdldCAhPSBYQV9TVFJJTkcpIENMSVBCT0FSRF9SZWFkU2VsZWN0aW9uKCAwLCBOb25lICk7CiAgICAgZWxzZSBDTElQQk9BUkRfUmVhZFNlbGVjdGlvbiggZXZlbnQtPnJlcXVlc3RvciwgZXZlbnQtPnByb3BlcnR5ICk7CiAKLSAgICBkcHJpbnRmX2luZm8oY2xpcGJvYXJkLCJcdFNlbGVjdGlvbk5vdGlmeSBkb25lIVxuIik7CisgICAgVFJBQ0UoY2xpcGJvYXJkLCJcdFNlbGVjdGlvbk5vdGlmeSBkb25lIVxuIik7CiB9CiAKIApAQCAtMTA4Niw3ICsxMDg2LDcgQEAKIAkgIH0gLyogV1NfRVhfQUNDRVBURklMRVMgKi8KICAgICAgICB9IC8qIGRuZFByb3RvY29sICovCiAgICAgICAgZWxzZQotCSAgZHByaW50Zl9pbmZvKGV2ZW50LCAidW5yZWNvZ25pemVkIENsaWVudE1lc3NhZ2VcbiIgKTsKKwkgIFRSQUNFKGV2ZW50LCAidW5yZWNvZ25pemVkIENsaWVudE1lc3NhZ2VcbiIgKTsKICAgICB9CiB9CiAKQEAgLTExNDQsNyArMTE0NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFiTW9kZUFzeW5jLCBHcmFiTW9kZUFzeW5jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSwgTm9uZSwgQ3VycmVudFRpbWUgKSA9PSBHcmFiU3VjY2VzcykgKQogCXsKLSAgICAgICAgICAgIGRwcmludGZfaW5mbyh3aW4sICJTZXRDYXB0dXJlKDB4JTA0eClcbiIsIGh3bmQgKTsKKyAgICAgICAgICAgIFRSQUNFKHdpbiwgIigweCUwNHgpXG4iLCBod25kICk7CiAgICAgICAgICAgICBjYXB0dXJlV25kICAgPSBod25kOwogCSAgICBjYXB0dXJlSFQgICAgPSBodDsKICAgICAgICAgfQpAQCAtMTE5MCw3ICsxMTkwLDcgQEAKICAqLwogdm9pZCBXSU5BUEkgUmVsZWFzZUNhcHR1cmUodm9pZCkKIHsKLSAgICBkcHJpbnRmX2luZm8od2luLCAiUmVsZWFzZUNhcHR1cmUoKSBbJTA0eF1cbiIsIGNhcHR1cmVXbmQgKTsKKyAgICBUUkFDRSh3aW4sICJjYXB0dXJlV25kPSUwNHhcbiIsIGNhcHR1cmVXbmQgKTsKICAgICBpZiggY2FwdHVyZVduZCApIEVWRU5UX0NhcHR1cmUoIDAsIDAgKTsKIH0KIApAQCAtMTI3MCw3ICsxMjcwLDcgQEAKIEJPT0wxNiBXSU5BUEkgRW5hYmxlSGFyZHdhcmVJbnB1dChCT09MMTYgYkVuYWJsZSkKIHsKICAgQk9PTDE2IGJPbGRTdGF0ZSA9IElucHV0RW5hYmxlZDsKLSAgZHByaW50Zl9maXhtZShldmVudCwiRW5hYmxlSGFyZHdhcmVJbnB1dCglZCkgLSBzdHViXG4iLCBiRW5hYmxlKTsKKyAgRklYTUUoZXZlbnQsIiglZCkgLSBzdHViXG4iLCBiRW5hYmxlKTsKICAgSW5wdXRFbmFibGVkID0gYkVuYWJsZTsKICAgcmV0dXJuIGJPbGRTdGF0ZTsKIH0KZGlmZiAtLWdpdCBhL3dpbmRvd3MvaG9vay5jIGIvd2luZG93cy9ob29rLmMKaW5kZXggY2ZmOGQxYS4uZmZkNWNlNSAxMDA2NDQKLS0tIGEvd2luZG93cy9ob29rLmMKKysrIGIvd2luZG93cy9ob29rLmMKQEAgLTg0Nyw3ICs4NDcsNyBAQAogCiAgICAgaWYgKChpZCA8IFdIX01JTkhPT0spIHx8IChpZCA+IFdIX01BWEhPT0spKSByZXR1cm4gMDsKIAotICAgIGRwcmludGZfaW5mbyhob29rLCAiU2V0dGluZyBob29rICVkOiAlMDh4ICUwNHggJTA0eFxuIiwKKyAgICBUUkFDRShob29rLCAiU2V0dGluZyBob29rICVkOiAlMDh4ICUwNHggJTA0eFxuIiwKICAgICAgICAgICAgICAgICAgIGlkLCAoVUlOVDMyKXByb2MsIGhJbnN0LCBoVGFzayApOwogCiAgICAgaWYgKCFoSW5zdCAmJiAodHlwZSE9SE9PS19XSU4xNikpCkBAIC04ODUsNyArODg1LDcgQEAKICAgICAgICAgZGF0YS0+bmV4dCA9IEhPT0tfc3lzdGVtSG9va3NbaWQgLSBXSF9NSU5IT09LXTsKICAgICAgICAgSE9PS19zeXN0ZW1Ib29rc1tpZCAtIFdIX01JTkhPT0tdID0gaGFuZGxlOwogICAgIH0KLSAgICBkcHJpbnRmX2luZm8oaG9vaywgIlNldHRpbmcgaG9vayAlZDogcmV0PSUwNHggW25leHQ9JTA0eF1cbiIsIAorICAgIFRSQUNFKGhvb2ssICJTZXR0aW5nIGhvb2sgJWQ6IHJldD0lMDR4IFtuZXh0PSUwNHhdXG4iLCAKIAkJCSAgIGlkLCBoYW5kbGUsIGRhdGEtPm5leHQgKTsKICAgICByZXR1cm4gaGFuZGxlOwogfQpAQCAtOTAxLDEzICs5MDEsMTMgQEAKICAgICBIT09LREFUQSAqZGF0YTsKICAgICBIQU5ETEUxNiAqcHJldkhvb2s7CiAKLSAgICBkcHJpbnRmX2luZm8oaG9vaywgIlJlbW92aW5nIGhvb2sgJTA0eFxuIiwgaG9vayApOworICAgIFRSQUNFKGhvb2ssICJSZW1vdmluZyBob29rICUwNHhcbiIsIGhvb2sgKTsKIAogICAgIGlmICghKGRhdGEgPSAoSE9PS0RBVEEgKilVU0VSX0hFQVBfTElOX0FERFIoaG9vaykpKSByZXR1cm4gRkFMU0U7CiAgICAgaWYgKGRhdGEtPmZsYWdzICYgSE9PS19JTlVTRSkKICAgICB7CiAgICAgICAgIC8qIE1hcmsgaXQgZm9yIGRlbGV0aW9uIGxhdGVyIG9uICovCi0gICAgICAgIGRwcmludGZfd2Fybihob29rLCAiSG9vayBzdGlsbCBydW5uaW5nLCBkZWxldGlvbiBkZWxheWVkXG4iICk7CisgICAgICAgIFdBUk4oaG9vaywgIkhvb2sgc3RpbGwgcnVubmluZywgZGVsZXRpb24gZGVsYXllZFxuIiApOwogICAgICAgICBkYXRhLT5wcm9jID0gKEhPT0tQUk9DMzIpMDsKICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQpAQCAtOTgxLDEyICs5ODEsMTIgQEAKICAgICBxdWV1ZS0+aEN1ckhvb2sgPSBob29rOwogICAgIGRhdGEtPmZsYWdzIHw9IEhPT0tfSU5VU0U7CiAKLSAgICBkcHJpbnRmX2luZm8oaG9vaywgIkNhbGxpbmcgaG9vayAlMDR4OiAlZCAlMDh4ICUwOGx4XG4iLAorICAgIFRSQUNFKGhvb2ssICJDYWxsaW5nIGhvb2sgJTA0eDogJWQgJTA4eCAlMDhseFxuIiwKICAgICAgICAgICAgICAgICAgIGhvb2ssIGNvZGUsIHdQYXJhbSwgbFBhcmFtICk7CiAKICAgICByZXQgPSBkYXRhLT5wcm9jKGNvZGUsIHdQYXJhbSwgbFBhcmFtKTsKIAotICAgIGRwcmludGZfaW5mbyhob29rLCAiUmV0IGhvb2sgJTA0eCA9ICUwOGx4XG4iLCBob29rLCByZXQgKTsKKyAgICBUUkFDRShob29rLCAiUmV0IGhvb2sgJTA0eCA9ICUwOGx4XG4iLCBob29rLCByZXQgKTsKIAogICAgIGRhdGEtPmZsYWdzICY9IH5IT09LX0lOVVNFOwogICAgIHF1ZXVlLT5oQ3VySG9vayA9IHByZXZIb29rOwpAQCAtMTI3NCw3ICsxMjc0LDcgQEAKIHsKICAgICBIQU5ETEUxNiBob29rID0gSE9PS19HZXRIb29rKCBpZCAsIEdldFRhc2tRdWV1ZSgwKSApOwogCi0gICAgZHByaW50Zl9pbmZvKGhvb2ssICJVbmhvb2tXaW5kb3dzSG9vazogJWQgJTA4bHhcbiIsIGlkLCAoRFdPUkQpcHJvYyApOworICAgIFRSQUNFKGhvb2ssICIlZCAlMDhseFxuIiwgaWQsIChEV09SRClwcm9jICk7CiAKICAgICB3aGlsZSAoaG9vaykKICAgICB7CkBAIC0xMjk0LDcgKzEyOTQsNyBAQAogewogICAgIEhBTkRMRTE2IGhvb2sgPSBIT09LX0dldEhvb2soIGlkICwgR2V0VGFza1F1ZXVlKDApICk7CiAKLSAgICBkcHJpbnRmX2luZm8oaG9vaywgIlVuaG9va1dpbmRvd3NIb29rOiAlZCAlMDhseFxuIiwgaWQsIChEV09SRClwcm9jICk7CisgICAgVFJBQ0UoaG9vaywgIiVkICUwOGx4XG4iLCBpZCwgKERXT1JEKXByb2MgKTsKIAogICAgIHdoaWxlIChob29rKQogICAgIHsKZGlmZiAtLWdpdCBhL3dpbmRvd3Mva2V5Ym9hcmQuYyBiL3dpbmRvd3Mva2V5Ym9hcmQuYwppbmRleCA5MDE4OWZjLi41NzE3ZGI1IDEwMDY0NAotLS0gYS93aW5kb3dzL2tleWJvYXJkLmMKKysrIGIvd2luZG93cy9rZXlib2FyZC5jCkBAIC0xODksMTIgKzE4OSwxMiBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoVFNYS2V5Y29kZVRvS2V5c3ltKGRpc3BsYXksICprY3AsIGspID09IFhLX01vZGVfc3dpdGNoKQogCQkgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgQWx0R3JNYXNrID0gMSA8PCBpOwotICAgICAgICAgICAgICAgICAgICAgICAgZHByaW50Zl9pbmZvKGtleSwgIkFsdEdyTWFzayBpcyAleFxuIiwgQWx0R3JNYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFKGtleSwgIkFsdEdyTWFzayBpcyAleFxuIiwgQWx0R3JNYXNrKTsKIAkJICAgIH0KICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoVFNYS2V5Y29kZVRvS2V5c3ltKGRpc3BsYXksICprY3AsIGspID09IFhLX051bV9Mb2NrKQogCQkgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgTnVtTG9ja01hc2sgPSAxIDw8IGk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkcHJpbnRmX2luZm8oa2V5LCAiTnVtTG9ja01hc2sgaXMgJXhcbiIsIE51bUxvY2tNYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFKGtleSwgIk51bUxvY2tNYXNrIGlzICV4XG4iLCBOdW1Mb2NrTWFzayk7CiAJCSAgICB9CiAgICAgICAgICAgICB9CiAgICAgfQpAQCAtMjgxLDExICsyODEsMTEgQEAKIAogICAgICAgICAgICAgICAgIHZrZXkgPSBPRU12a2V5OwogCQkgIAotICAgICAgICAgICAgICAgIGlmIChkZWJ1Z2dpbmdfaW5mbyhrZXlib2FyZCkpCisgICAgICAgICAgICAgICAgaWYgKFRSQUNFX09OKGtleWJvYXJkKSkKICAgICAgICAgICAgICAgICB7CiAJCSAgICBkYmdfZGVjbF9zdHIoa2V5Ym9hcmQsIDEwMjQpOwogCi0gICAgICAgICAgICAgICAgICAgIGRwcmludGZfaW5mbyhrZXlib2FyZCwgIk9FTSBzcGVjaWZpYyB2aXJ0dWFsIGtleSAlWCBhc3NpZ25lZCIKKyAgICAgICAgICAgICAgICAgICAgVFJBQ0Uoa2V5Ym9hcmQsICJPRU0gc3BlY2lmaWMgdmlydHVhbCBrZXkgJVggYXNzaWduZWQiCiAJCQkJICJ0byBrZXljb2RlICVYIDpcbiIsIE9FTXZrZXksIGUyLmtleWNvZGUpOwogICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwga2V5c3ltc19wZXJfa2V5Y29kZTsgaSArPSAxKQogICAgICAgICAgICAgICAgICAgICB7CkBAIC0yOTcsNyArMjk3LDcgQEAKIAkJCSAgICBrc25hbWUgPSAiTm9TeW1ib2wiOwogICAgICAgICAgICAgICAgICAgICAgICAgZHNwcmludGYoa2V5Ym9hcmQsICIlbFggKCVzKSAiLCBrZXlzeW0sIGtzbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZHByaW50Zl9pbmZvKGtleWJvYXJkLCAiKCVzKVxuIiwgZGJnX3N0cihrZXlib2FyZCkpOworICAgICAgICAgICAgICAgICAgICBUUkFDRShrZXlib2FyZCwgIiglcylcbiIsIGRiZ19zdHIoa2V5Ym9hcmQpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTMxOCwxNCArMzE4LDE0IEBACiAgICAgICAgZG9uJ3QgdHJlYXQgaXQuIEl0J3MgZnJvbSB0aGUgc2FtZSBrZXkgcHJlc3MuIFRoZW4gdGhlIHN0YXRlIGdvZXMgdG8gT04uCiAgICAgICAgQW5kIGZyb20gdGhlcmUsIGEgJ3JlbGVhc2UnIGV2ZW50IHdpbGwgc3dpdGNoIG9mZiB0aGUgdG9nZ2xlIGtleS4gKi8KICAgICAqU3RhdGU9RkFMU0U7Ci0gICAgZHByaW50Zl9pbmZvKGtleWJvYXJkLCJJTlRFUk0gOiBkb25cJ3QgdHJlYXQgcmVsZWFzZSBvZiB0b2dnbGUga2V5LiBJbnB1dEtleVN0YXRlVGFibGVbJSN4XSA9ICUjeFxuIix2a2V5LElucHV0S2V5U3RhdGVUYWJsZVt2a2V5XSk7CisgICAgVFJBQ0Uoa2V5Ym9hcmQsIklOVEVSTSA6IGRvblwndCB0cmVhdCByZWxlYXNlIG9mIHRvZ2dsZSBrZXkuIElucHV0S2V5U3RhdGVUYWJsZVslI3hdID0gJSN4XG4iLHZrZXksSW5wdXRLZXlTdGF0ZVRhYmxlW3ZrZXldKTsKICAgfSBlbHNlCiAgICAgewogCWlmICggSW5wdXRLZXlTdGF0ZVRhYmxlW3ZrZXldICYgMHgxICkgLyogaXQgd2FzIE9OICovCiAJICB7CiAJICAgIGlmIChFdnR5cGUhPUtleVByZXNzKQogCSAgICAgIHsKLQkJZHByaW50Zl9pbmZvKGtleWJvYXJkLCJPTiArIEtleVJlbGVhc2UgPT4gZ2VuZXJhdGluZyBET1dOIGFuZCBVUCBtZXNzYWdlcy5cbiIpOworCQlUUkFDRShrZXlib2FyZCwiT04gKyBLZXlSZWxlYXNlID0+IGdlbmVyYXRpbmcgRE9XTiBhbmQgVVAgbWVzc2FnZXMuXG4iKTsKIAkJbG9jYWxrZXlscC5scDEucHJldmlvdXMgPSAwOyAvKiA/ICovCiAJCWxvY2Fsa2V5bHAubHAxLnRyYW5zaXRpb24gPSAwOwogCQloYXJkd2FyZV9ldmVudCggV01fS0VZRE9XTiwgdmtleSwgbG9jYWxrZXlscC5scDIsCkBAIC0zMzksNyArMzM5LDcgQEAKIAllbHNlIC8qIGl0IHdhcyBPRkYgKi8KIAkgIGlmIChFdnR5cGU9PUtleVByZXNzKQogCSAgICB7Ci0JICAgICAgZHByaW50Zl9pbmZvKGtleWJvYXJkLCJPRkYgKyBLZXlwcmVzcyA9PiBnZW5lcmF0aW5nIERPV04gYW5kIFVQIG1lc3NhZ2VzLlxuIik7CisJICAgICAgVFJBQ0Uoa2V5Ym9hcmQsIk9GRiArIEtleXByZXNzID0+IGdlbmVyYXRpbmcgRE9XTiBhbmQgVVAgbWVzc2FnZXMuXG4iKTsKIAkgICAgICBoYXJkd2FyZV9ldmVudCggV01fS0VZRE9XTiwgdmtleSwgbG9jYWxrZXlscC5scDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF94LCBldmVudF95LCBldmVudF90aW1lLCAwICk7CiAJICAgICAgbG9jYWxrZXlscC5scDEucHJldmlvdXMgPSAxOwpAQCAtMzcyLDE1ICszNzIsMTUgQEAKICAgICBJTlQzMiBldmVudF95ID0gcFduZC0+cmVjdFdpbmRvdy50b3AgKyBldmVudC0+eTsKICAgICBEV09SRCBldmVudF90aW1lID0gZXZlbnQtPnRpbWUgLSBNU0dfV2luZVN0YXJ0VGlja3M7CiAKLSAgICBkcHJpbnRmX2luZm8oa2V5LCAiRVZFTlRfa2V5IDogc3RhdGUgPSAlWFxuIiwgZXZlbnQtPnN0YXRlKTsKKyAgICBUUkFDRShrZXksICJFVkVOVF9rZXkgOiBzdGF0ZSA9ICVYXG4iLCBldmVudC0+c3RhdGUpOwogICAgIGlmIChrZXlzeW0gPT0gWEtfTW9kZV9zd2l0Y2gpCiAJewotCWRwcmludGZfaW5mbyhrZXksICJBbHQgR3Iga2V5IGV2ZW50IHJlY2VpdmVkXG4iKTsKKwlUUkFDRShrZXksICJBbHQgR3Iga2V5IGV2ZW50IHJlY2VpdmVkXG4iKTsKIAlldmVudC0+a2V5Y29kZSA9IFRTWEtleXN5bVRvS2V5Y29kZShldmVudC0+ZGlzcGxheSwgWEtfQ29udHJvbF9MKTsKLQlkcHJpbnRmX2luZm8oa2V5LCAiQ29udHJvbF9MIGlzIGtleWNvZGUgMHgleFxuIiwgZXZlbnQtPmtleWNvZGUpOworCVRSQUNFKGtleSwgIkNvbnRyb2xfTCBpcyBrZXljb2RlIDB4JXhcbiIsIGV2ZW50LT5rZXljb2RlKTsKIAlLRVlCT0FSRF9IYW5kbGVFdmVudCggcFduZCwgZXZlbnQgKTsKIAlldmVudC0+a2V5Y29kZSA9IFRTWEtleXN5bVRvS2V5Y29kZShldmVudC0+ZGlzcGxheSwgWEtfQWx0X0wpOwotCWRwcmludGZfaW5mbyhrZXksICJBbHRfTCBpcyBrZXljb2RlIDB4JXhcbiIsIGV2ZW50LT5rZXljb2RlKTsKKwlUUkFDRShrZXksICJBbHRfTCBpcyBrZXljb2RlIDB4JXhcbiIsIGV2ZW50LT5rZXljb2RlKTsKIAlmb3JjZV9leHRlbmRlZCA9IFRSVUU7CiAJS0VZQk9BUkRfSGFuZGxlRXZlbnQoIHBXbmQsIGV2ZW50ICk7CiAJZm9yY2VfZXh0ZW5kZWQgPSBGQUxTRTsKQEAgLTM4OCwxMyArMzg4LDEzIEBACiAJfQogCiAgICAgU3RyW2FzY2lpX2NoYXJzXSA9ICdcMCc7Ci0gICAgaWYgKGRlYnVnZ2luZ19pbmZvKGtleSkpeworICAgIGlmIChUUkFDRV9PTihrZXkpKXsKIAljaGFyCSprc25hbWU7CiAKIAlrc25hbWUgPSBUU1hLZXlzeW1Ub1N0cmluZyhrZXlzeW0pOwogCWlmICgha3NuYW1lKQogCSAga3NuYW1lID0gIk5vIE5hbWUiOwotCWRwcmludGZfaW5mbyhrZXksICIlcyA6IGtleXN5bT0lbFggKCVzKSwgYXNjaWkgY2hhcnM9JXUgLyAlWCAvICclcydcbiIsIAorCVRSQUNFKGtleSwgIiVzIDoga2V5c3ltPSVsWCAoJXMpLCBhc2NpaSBjaGFycz0ldSAvICVYIC8gJyVzJ1xuIiwgCiAJCSAgICAgKGV2ZW50LT50eXBlID09IEtleVByZXNzKSA/ICJLZXlQcmVzcyIgOiAiS2V5UmVsZWFzZSIsCiAJCSAgICAga2V5c3ltLCBrc25hbWUsIGFzY2lpX2NoYXJzLCBTdHJbMF0gJiAweGZmLCBTdHIpOwogICAgIH0KQEAgLTQwMiw3ICs0MDIsNyBAQAogICAgIHZrZXkgPSBFVkVOVF9ldmVudF90b192a2V5KGV2ZW50KTsKICAgICBpZiAoZm9yY2VfZXh0ZW5kZWQpIHZrZXkgfD0gMHgxMDA7CiAKLSAgICBkcHJpbnRmX2luZm8oa2V5LCAia2V5Y29kZSAweCV4IGNvbnZlcnRlZCB0byB2a2V5IDB4JXhcbiIsCisgICAgVFJBQ0Uoa2V5LCAia2V5Y29kZSAweCV4IGNvbnZlcnRlZCB0byB2a2V5IDB4JXhcbiIsCiAJCSAgICBldmVudC0+a2V5Y29kZSwgdmtleSk7CiAKICAgIGlmICh2a2V5KQpAQCAtNDIzLDEwICs0MjMsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF90aW1lLCBrZXlscCk7CiAgICAgICBicmVhazsKICAgICBjYXNlIFZLX0NBUElUQUw6Ci0gICAgICBkcHJpbnRmX2luZm8oa2V5Ym9hcmQsIkNhcHMgTG9jayBldmVudC4gKHR5cGUgJWQpLiBTdGF0ZSBiZWZvcmUgOiAlIy4yeFxuIixldmVudC0+dHlwZSxJbnB1dEtleVN0YXRlVGFibGVbdmtleV0pOworICAgICAgVFJBQ0Uoa2V5Ym9hcmQsIkNhcHMgTG9jayBldmVudC4gKHR5cGUgJWQpLiBTdGF0ZSBiZWZvcmUgOiAlIy4yeFxuIixldmVudC0+dHlwZSxJbnB1dEtleVN0YXRlVGFibGVbdmtleV0pOwogICAgICAgS0VZQk9BUkRfR2VuZXJhdGVNc2coIFZLX0NBUElUQUwsIGV2ZW50LT50eXBlLCBldmVudF94LCBldmVudF95LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X3RpbWUsIGtleWxwICk7IAotICAgICAgZHByaW50Zl9pbmZvKGtleWJvYXJkLCJTdGF0ZSBhZnRlciA6ICUjLjJ4XG4iLElucHV0S2V5U3RhdGVUYWJsZVt2a2V5XSk7CisgICAgICBUUkFDRShrZXlib2FyZCwiU3RhdGUgYWZ0ZXIgOiAlIy4yeFxuIixJbnB1dEtleVN0YXRlVGFibGVbdmtleV0pOwogICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgIHsKQEAgLTQ1Nyw3ICs0NTcsNyBAQAogCQkJICAgICAgKElucHV0S2V5U3RhdGVUYWJsZVtWS19NRU5VXSAmIDB4ODApKSA/IDEgOiAwOwogCWlmICghKElucHV0S2V5U3RhdGVUYWJsZVtWS19OVU1MT0NLXSAmIDB4MDEpICE9ICEoZXZlbnQtPnN0YXRlICYgTnVtTG9ja01hc2spKQogCSAgeyAKLQkgICAgZHByaW50Zl9pbmZvKGtleWJvYXJkLCJBZGp1c3RpbmcgTnVtTG9jayBzdGF0ZS4gXG4iKTsKKwkgICAgVFJBQ0Uoa2V5Ym9hcmQsIkFkanVzdGluZyBOdW1Mb2NrIHN0YXRlLiBcbiIpOwogCSAgICBLRVlCT0FSRF9HZW5lcmF0ZU1zZyggVktfTlVNTE9DSywgS2V5UHJlc3MsIGV2ZW50X3gsIGV2ZW50X3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfdGltZSwga2V5bHAgKTsKIAkgICAgS0VZQk9BUkRfR2VuZXJhdGVNc2coIFZLX05VTUxPQ0ssIEtleVJlbGVhc2UsIGV2ZW50X3gsIGV2ZW50X3ksCkBAIC00NjUsMjAgKzQ2NSwyMCBAQAogCSAgfQogCWlmICghKElucHV0S2V5U3RhdGVUYWJsZVtWS19DQVBJVEFMXSAmIDB4MDEpICE9ICEoZXZlbnQtPnN0YXRlICYgTG9ja01hc2spKQogCSAgewotCSAgICBkcHJpbnRmX2luZm8oa2V5Ym9hcmQsIkFkanVzdGluZyBDYXBzIExvY2sgc3RhdGUuIFN0YXRlIGJlZm9yZSAlIy4yeCBcbiIsSW5wdXRLZXlTdGF0ZVRhYmxlW1ZLX0NBUElUQUxdKTsKKwkgICAgVFJBQ0Uoa2V5Ym9hcmQsIkFkanVzdGluZyBDYXBzIExvY2sgc3RhdGUuIFN0YXRlIGJlZm9yZSAlIy4yeCBcbiIsSW5wdXRLZXlTdGF0ZVRhYmxlW1ZLX0NBUElUQUxdKTsKIAkgICAgS0VZQk9BUkRfR2VuZXJhdGVNc2coIFZLX0NBUElUQUwsIEtleVByZXNzLCBldmVudF94LCBldmVudF95LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X3RpbWUsIGtleWxwICk7CiAJICAgIEtFWUJPQVJEX0dlbmVyYXRlTXNnKCBWS19DQVBJVEFMLCBLZXlSZWxlYXNlLCBldmVudF94LCBldmVudF95LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X3RpbWUsIGtleWxwICk7Ci0JICAgIGRwcmludGZfaW5mbyhrZXlib2FyZCwiU3RhdGUgYWZ0ZXIgJSMuMnggXG4iLElucHV0S2V5U3RhdGVUYWJsZVtWS19DQVBJVEFMXSk7CisJICAgIFRSQUNFKGtleWJvYXJkLCJTdGF0ZSBhZnRlciAlIy4yeCBcbiIsSW5wdXRLZXlTdGF0ZVRhYmxlW1ZLX0NBUElUQUxdKTsKIAkgIH0KIAkvKiBFbmQgb2YgaW50ZXJtZWRpYXJ5IHN0YXRlcy4gKi8KIAlOdW1TdGF0ZSA9IEZBTFNFOwogCUNhcHNTdGF0ZSA9IEZBTFNFOwogCi0JZHByaW50Zl9pbmZvKGtleSwiICAgICAgICAgICAgd1BhcmFtPSUwNFgsIGxQYXJhbT0lMDhsWFxuIiwgCisJVFJBQ0Uoa2V5LCIgICAgICAgICAgICB3UGFyYW09JTA0WCwgbFBhcmFtPSUwOGxYXG4iLCAKIAkJICAgIHZrZXksIGtleWxwLmxwMiApOwotCWRwcmludGZfaW5mbyhrZXksIiAgICAgICAgICAgIElucHV0S2V5U3RhdGU9JVhcbiIsCisJVFJBQ0Uoa2V5LCIgICAgICAgICAgICBJbnB1dEtleVN0YXRlPSVYXG4iLAogCQkgICAgSW5wdXRLZXlTdGF0ZVRhYmxlW3ZrZXldKTsKIAogCWhhcmR3YXJlX2V2ZW50KCBtZXNzYWdlLCB2a2V5LCBrZXlscC5scDIsCkBAIC01MjQsNyArNTI0LDcgQEAKIAkgICAgcmV0dmFsID0gKCAoV09SRCkoUXVldWVLZXlTdGF0ZVRhYmxlW3ZrZXldICYgMHg4MCkgPDwgOCApIHwKIAkJICAgICAgIChXT1JEKShRdWV1ZUtleVN0YXRlVGFibGVbdmtleV0gJiAweDAxKTsKIAl9Ci0gICAgZHByaW50Zl9pbmZvKGtleSwgIkdldEtleVN0YXRlKDB4JXgpIC0+ICV4XG4iLCB2a2V5LCByZXR2YWwpOworICAgIFRSQUNFKGtleSwgIigweCV4KSAtPiAleFxuIiwgdmtleSwgcmV0dmFsKTsKICAgICByZXR1cm4gcmV0dmFsOwogfQogCkBAIC01MzYsNyArNTM2LDcgQEAKICAqLwogVk9JRCBXSU5BUEkgR2V0S2V5Ym9hcmRTdGF0ZShMUEJZVEUgbHBLZXlTdGF0ZSkKIHsKLSAgICBkcHJpbnRmX2luZm8oa2V5LCAiR2V0S2V5Ym9hcmRTdGF0ZSgpXG4iKTsKKyAgICBUUkFDRShrZXksICIoJXApXG4iLCBscEtleVN0YXRlKTsKICAgICBpZiAobHBLZXlTdGF0ZSAhPSBOVUxMKSB7CiAJUXVldWVLZXlTdGF0ZVRhYmxlW1ZLX0xCVVRUT05dID0gTW91c2VCdXR0b25zU3RhdGVzWzBdID8gMHg4MCA6IDA7CiAJUXVldWVLZXlTdGF0ZVRhYmxlW1ZLX01CVVRUT05dID0gTW91c2VCdXR0b25zU3RhdGVzWzFdID8gMHg4MCA6IDA7CkBAIC01NTAsNyArNTUwLDcgQEAKICAqLwogVk9JRCBXSU5BUEkgU2V0S2V5Ym9hcmRTdGF0ZShMUEJZVEUgbHBLZXlTdGF0ZSkKIHsKLSAgICBkcHJpbnRmX2luZm8oa2V5LCAiU2V0S2V5Ym9hcmRTdGF0ZSgpXG4iKTsKKyAgICBUUkFDRShrZXksICIoJXApXG4iLCBscEtleVN0YXRlKTsKICAgICBpZiAobHBLZXlTdGF0ZSAhPSBOVUxMKSB7CiAJbWVtY3B5KFF1ZXVlS2V5U3RhdGVUYWJsZSwgbHBLZXlTdGF0ZSwgMjU2KTsKIAlNb3VzZUJ1dHRvbnNTdGF0ZXNbMF0gPSAoUXVldWVLZXlTdGF0ZVRhYmxlW1ZLX0xCVVRUT05dICE9IDApOwpAQCAtNTk5LDcgKzU5OSw3IEBACiAgICAgbWVtc2V0KCBBc3luY01vdXNlQnV0dG9uc1N0YXRlcywgMCwgc2l6ZW9mKEFzeW5jTW91c2VCdXR0b25zU3RhdGVzKSApOwogICAgIG1lbXNldCggQXN5bmNLZXlTdGF0ZVRhYmxlLCAwLCBzaXplb2YoQXN5bmNLZXlTdGF0ZVRhYmxlKSApOwogCi0gICAgZHByaW50Zl9pbmZvKGtleSwgIkdldEFzeW5jS2V5U3RhdGUoJXgpIC0+ICV4XG4iLCBuS2V5LCByZXR2YWwpOworICAgIFRSQUNFKGtleSwgIigleCkgLT4gJXhcbiIsIG5LZXksIHJldHZhbCk7CiAgICAgcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtNjM0LDE0ICs2MzQsMTQgQEAKICAgICAJaWYgKG1zZy0+bWVzc2FnZSA9PSBXTV9DSEFSKSB7CiAgICAgICAgIGlmICggIShmVmlydCAmIEZBTFQpICYmICEoZlZpcnQgJiBGVklSVEtFWSkgKQogICAgICAgICB7Ci0gICAJICBkcHJpbnRmX2luZm8oYWNjZWwsImZvdW5kIGFjY2VsIGZvciBXTV9DSEFSOiAoJyVjJylcbiIsCisgICAJICBUUkFDRShhY2NlbCwiZm91bmQgYWNjZWwgZm9yIFdNX0NIQVI6ICgnJWMnKVxuIiwKIAkJCW1zZy0+d1BhcmFtJjB4ZmYpOwogICAgCSAgc2VuZG1zZz1UUlVFOwogICAgCX0gIAogICAgICAgfSBlbHNlIHsKICAgICAgICBpZihmVmlydCAmIEZWSVJUS0VZKSB7CiAJSU5UMzIgbWFzayA9IDA7Ci0gICAgICAgIGRwcmludGZfaW5mbyhhY2NlbCwiZm91bmQgYWNjZWwgZm9yIHZpcnRfa2V5ICUwNHggKHNjYW4gJTA0eClcbiIsCisgICAgICAgIFRSQUNFKGFjY2VsLCJmb3VuZCBhY2NlbCBmb3IgdmlydF9rZXkgJTA0eCAoc2NhbiAlMDR4KVxuIiwKICAgCSAgICAgICAgICAgICAgICAgICAgICAgbXNnLT53UGFyYW0sMHhmZiAmIEhJV09SRChtc2ctPmxQYXJhbSkpOyAgICAgICAgICAgICAgICAKIAlpZihHZXRLZXlTdGF0ZTMyKFZLX1NISUZUKSAmIDB4ODAwMCkgbWFzayB8PSBGU0hJRlQ7CiAJaWYoR2V0S2V5U3RhdGUzMihWS19DT05UUk9MKSAmIDB4ODAwMCkgbWFzayB8PSBGQ09OVFJPTDsKQEAgLTY0OSw3ICs2NDksNyBAQAogCWlmKG1hc2sgPT0gKGZWaXJ0ICYgKEZTSElGVCB8IEZDT05UUk9MIHwgRkFMVCkpKQogICAgICAgICAgIHNlbmRtc2c9VFJVRTsJCQkgICAgCiAgICAgICAgIGVsc2UKLSAgICAgICAgICBkcHJpbnRmX2luZm8oYWNjZWwsIiwgYnV0IGluY29ycmVjdCBTSElGVC9DVFJML0FMVC1zdGF0ZVxuIik7CisgICAgICAgICAgVFJBQ0UoYWNjZWwsIiwgYnV0IGluY29ycmVjdCBTSElGVC9DVFJML0FMVC1zdGF0ZVxuIik7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CkBAIC02NTcsNyArNjU3LDcgQEAKICAgICAgICAgIHsKICAgICAgICAgICAgaWYgKChmVmlydCAmIEZBTFQpICYmIChtc2ctPmxQYXJhbSAmIDB4MjAwMDAwMDApKQogICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogXl4gQUxUIHByZXNzZWQgKi8KLQkgICAgZHByaW50Zl9pbmZvKGFjY2VsLCJmb3VuZCBhY2NlbCBmb3IgQWx0LSVjXG4iLCBtc2ctPndQYXJhbSYweGZmKTsKKwkgICAgVFJBQ0UoYWNjZWwsImZvdW5kIGFjY2VsIGZvciBBbHQtJWNcbiIsIG1zZy0+d1BhcmFtJjB4ZmYpOwogCSAgICBzZW5kbXNnPVRSVUU7CSAgICAKIAkgICB9IAogICAgICAgICAgfSAKQEAgLTcxNCw3ICs3MTQsNyBAQAogICAgICAgICAgIH0KICAgICAgICAgICBpZiAoIG1lc2c9PVdNX0NPTU1BTkQgfHwgbWVzZz09V01fU1lTQ09NTUFORCApCiAgICAgICAgICAgewotICAgICAgICAgICAgICBkcHJpbnRmX2luZm8oYWNjZWwsIiwgc2VuZGluZyAlcywgd1BhcmFtPSUweFxuIiwKKyAgICAgICAgICAgICAgVFJBQ0UoYWNjZWwsIiwgc2VuZGluZyAlcywgd1BhcmFtPSUweFxuIiwKICAgICAgICAgICAgICAgICAgIG1lc2c9PVdNX0NPTU1BTkQgPyAiV01fQ09NTUFORCIgOiAiV01fU1lTQ09NTUFORCIsCiAgICAgICAgICAgICAgICAgICBjbWQpOwogCSAgICAgIFNlbmRNZXNzYWdlMzJBKGhXbmQsIG1lc2csIGNtZCwgMHgwMDAxMDAwMEwpOwpAQCAtNzMwLDkgKzczMCw5IEBACiAJICAgICogICAjNTogaXQncyBhIG1lbnUgb3B0aW9uLCBidXQgd2luZG93IGlzIGljb25pYwogCSAgICAqICAgIzY6IGl0J3MgYSBtZW51IG9wdGlvbiwgYnV0IGRpc2FibGVkCiAJICAgICovCi0JICAgIGRwcmludGZfaW5mbyhhY2NlbCwiLCBidXQgd29uJ3Qgc2VuZCBXTV97U1lTfUNPTU1BTkQsIHJlYXNvbiBpcyAjJWRcbiIsbWVzZyk7CisJICAgIFRSQUNFKGFjY2VsLCIsIGJ1dCB3b24ndCBzZW5kIFdNX3tTWVN9Q09NTUFORCwgcmVhc29uIGlzICMlZFxuIixtZXNnKTsKIAkgICAgaWYobWVzZz09MCkKLQkgICAgICBkcHJpbnRmX2VycihhY2NlbCwgIiB1bmtub3duIHJlYXNvbiAtIHBsZWFzZSByZXBvcnQhIik7CisJICAgICAgRVJSKGFjY2VsLCAiIHVua25vd24gcmVhc29uIC0gcGxlYXNlIHJlcG9ydCEiKTsKIAkgIH0gICAgICAgICAgCiAgICAgICAgICAgcmV0dXJuIFRSVUU7ICAgICAgICAgCiAgICAgICB9CkBAIC03NTIsNyArNzUyLDcgQEAKIAltc2ctPm1lc3NhZ2UgIT0gV01fU1lTS0VZVVAgJiYKICAgICAJbXNnLT5tZXNzYWdlICE9IFdNX0NIQVIpIHJldHVybiAwOwogCi0gICAgZHByaW50Zl9pbmZvKGFjY2VsLCAiVHJhbnNsYXRlQWNjZWxlcmF0b3JzIGhBY2NlbD0lMDR4LCBoV25kPSUwNHgsXAorICAgIFRSQUNFKGFjY2VsLCAiVHJhbnNsYXRlQWNjZWxlcmF0b3JzIGhBY2NlbD0lMDR4LCBoV25kPSUwNHgsXAogbXNnLT5od25kPSUwNHgsIG1zZy0+bWVzc2FnZT0lMDR4XG4iLCBoQWNjZWwsaFduZCxtc2ctPmh3bmQsbXNnLT5tZXNzYWdlKTsKIAogICAgIGZvciAoaSA9IDA7IGxwQWNjZWxUYmxbaV0ua2V5IDsgaSsrKQpAQCAtNzc1LDcgKzc3NSw3IEBACiAJbXNnLT5tZXNzYWdlICE9IFdNX1NZU0tFWVVQICYmCiAgICAgCW1zZy0+bWVzc2FnZSAhPSBXTV9DSEFSKSByZXR1cm4gMDsKIAotICAgIGRwcmludGZfaW5mbyhhY2NlbCwgIlRyYW5zbGF0ZUFjY2VsZXJhdG9ycyBoQWNjZWw9JTA0eCwgaFduZD0lMDR4LFwKKyAgICBUUkFDRShhY2NlbCwgIlRyYW5zbGF0ZUFjY2VsZXJhdG9ycyBoQWNjZWw9JTA0eCwgaFduZD0lMDR4LFwKIG1zZy0+aHduZD0lMDR4LCBtc2ctPm1lc3NhZ2U9JTA0eFxuIiwgaEFjY2VsLGhXbmQsbXNnLT5od25kLG1zZy0+bWVzc2FnZSk7CiAgICAgU1RSVUNUMzJfTVNHMTZ0bzMyKG1zZywmbXNnMzIpOwogCkBAIC03OTMsNyArNzkzLDcgQEAKICAqLwogRFdPUkQgV0lOQVBJIE9lbUtleVNjYW4oV09SRCB3T2VtQ2hhcikKIHsKLSAgICBkcHJpbnRmX2luZm8oa2V5Ym9hcmQsIipPZW1LZXlTY2FuICglZClcbiIsd09lbUNoYXIpOworICAgIFRSQUNFKGtleWJvYXJkLCIqT2VtS2V5U2NhbiAoJWQpXG4iLHdPZW1DaGFyKTsKIAogICAgIHJldHVybiB3T2VtQ2hhcjsKIH0KQEAgLTgzMyw3ICs4MzMsNyBAQAogCSAga2V5Y29kZSA9IFRTWEtleXN5bVRvS2V5Y29kZShkaXNwbGF5LCBrZXlzeW0gfCAweEZFMDApOwogCX0KIAotCWRwcmludGZfaW5mbyhrZXlib2FyZCwiVmtLZXlTY2FuICclYycoJSNseCwgJWx1KTogZ290IGtleWNvZGUgJSMuMnhcbiIsCisJVFJBQ0Uoa2V5Ym9hcmQsIlZrS2V5U2NhbiAnJWMnKCUjbHgsICVsdSk6IGdvdCBrZXljb2RlICUjLjJ4XG4iLAogCQkJIGNDaGFyLGtleXN5bSxrZXlzeW0sa2V5Y29kZSk7CiAJCiAJaWYgKGtleWNvZGUpCkBAIC04NTYsNyArODU2LDcgQEAKIAkgICAgICBpbmRleCA6ID8gICAgIGFkZHMgMHgwNzAwIChjdHJsK2FsdCtzaGlmdCAodXNlZD8pKQogCSAgICAgKi8KIAkgIH0KLQlkcHJpbnRmX2luZm8oa2V5Ym9hcmQsIiAuLi4gcmV0dXJuaW5nICUjLjJ4XG4iLCBrZXljMnZrZXlba2V5Y29kZV0raGlnaGJ5dGUpOworCVRSQUNFKGtleWJvYXJkLCIgLi4uIHJldHVybmluZyAlIy4yeFxuIiwga2V5YzJ2a2V5W2tleWNvZGVdK2hpZ2hieXRlKTsKIAlyZXR1cm4ga2V5YzJ2a2V5W2tleWNvZGVdK2hpZ2hieXRlOyAgIC8qIGtleWNvZGUgLT4gKGtleWMydmtleSkgdmtleSAqLwogfQogCkBAIC04ODksNyArODg5LDcgQEAKICAqLwogSU5UMzIgV0lOQVBJIEdldEtleWJvYXJkVHlwZTMyKElOVDMyIG5UeXBlRmxhZykKIHsKLSAgZHByaW50Zl9pbmZvKGtleWJvYXJkLCJHZXRLZXlib2FyZFR5cGUoJWQpXG4iLG5UeXBlRmxhZyk7CisgIFRSQUNFKGtleWJvYXJkLCIoJWQpXG4iLG5UeXBlRmxhZyk7CiAgIHN3aXRjaChuVHlwZUZsYWcpCiAgICAgewogICAgIGNhc2UgMDogICAgICAvKiBLZXlib2FyZCB0eXBlICovCkBAIC05MzAsOSArOTMwLDkgQEAKICAqLwogVUlOVDE2IFdJTkFQSSBNYXBWaXJ0dWFsS2V5MTYoVUlOVDE2IHdDb2RlLCBVSU5UMTYgd01hcFR5cGUpCiB7Ci0jZGVmaW5lIHJldHVybk1WSyh2YWx1ZSkgeyBkcHJpbnRmX2luZm8oa2V5Ym9hcmQsInJldHVybmluZyAweCV4LlxuIix2YWx1ZSk7IHJldHVybiB2YWx1ZTsgfQorI2RlZmluZSByZXR1cm5NVksodmFsdWUpIHsgVFJBQ0Uoa2V5Ym9hcmQsInJldHVybmluZyAweCV4LlxuIix2YWx1ZSk7IHJldHVybiB2YWx1ZTsgfQogCi0JZHByaW50Zl9pbmZvKGtleWJvYXJkLCJNYXBWaXJ0dWFsS2V5IHdDb2RlPTB4JXggd01hcFR5cGU9JWQgLi4uIFxuIiwKKwlUUkFDRShrZXlib2FyZCwiTWFwVmlydHVhbEtleSB3Q29kZT0weCV4IHdNYXBUeXBlPSVkIC4uLiBcbiIsCiAJCQkgd0NvZGUsd01hcFR5cGUpOwogCXN3aXRjaCh3TWFwVHlwZSkgewogCQljYXNlIDA6CXsgLyogdmtleS1jb2RlIHRvIHNjYW4tY29kZSAqLwpAQCAtOTc3LDcgKzk3Nyw3IEBACiAgKi8KIElOVDE2IFdJTkFQSSBHZXRLQkNvZGVQYWdlMTYodm9pZCkKIHsKLSAgICBkcHJpbnRmX2luZm8oa2V5Ym9hcmQsIkdldEtCQ29kZVBhZ2UoKVxuIik7CisgICAgVFJBQ0Uoa2V5Ym9hcmQsIih2b2lkKVxuIik7CiAgICAgcmV0dXJuIDg1MDsKIH0KIApAQCAtOTg3LDcgKzk4Nyw3IEBACiAgKi8KIFVJTlQzMiBXSU5BUEkgR2V0S0JDb2RlUGFnZTMyKHZvaWQpCiB7Ci0gICAgZHByaW50Zl9pbmZvKGtleWJvYXJkLCJHZXRLYkNvZGVQYWdlKClcbiIpOworICAgIFRSQUNFKGtleWJvYXJkLCIodm9pZClcbiIpOwogICAgIHJldHVybiA4NTA7CiB9CiAKQEAgLTEwMjAsNyArMTAyMCw3IEBACiB7CiAgIC8qCWludCBpOyAqLwogCQotICAgIAlkcHJpbnRmX2luZm8oa2V5Ym9hcmQsIkdldEtleU5hbWVUZXh0KCVsZCw8cHRyPiwlZClcbiIsbFBhcmFtLG5TaXplKTsKKyAgICAJVFJBQ0Uoa2V5Ym9hcmQsIiglbGQsPHB0cj4sJWQpXG4iLGxQYXJhbSxuU2l6ZSk7CiAKIAlsUGFyYW0gPj49IDE2OwogCWxQYXJhbSAmPSAweGZmOwpAQCAtMTA2OCw3ICsxMDY4LDcgQEAKIAkgIHsKIAkgICAgaWYgKChlLmtleWNvZGUpICYmICgodmlydEtleTwweDEwKSB8fCAodmlydEtleT4weDEyKSkpIAogCQkvKiBpdCdzIG5vcm1hbCB0byBoYXZlIDIgc2hpZnQsIGNvbnRyb2wsIGFuZCBhbHQgISAqLwotCQlkcHJpbnRmX2luZm8oa2V5Ym9hcmQsIlRvQXNjaWkgOiBUaGUga2V5Y29kZXMgJWQgYW5kICVkIGFyZSBtYXRjaGluZyB0aGUgc2FtZSB2a2V5ICUjWFxuIiwKKwkJVFJBQ0Uoa2V5Ym9hcmQsIlRvQXNjaWkgOiBUaGUga2V5Y29kZXMgJWQgYW5kICVkIGFyZSBtYXRjaGluZyB0aGUgc2FtZSB2a2V5ICUjWFxuIiwKIAkJCQkgZS5rZXljb2RlLGtleWMsdmlydEtleSk7CiAJICAgIGUua2V5Y29kZSA9IGtleWM7CiAJICB9CkBAIC0xMDg4LDcgKzEwODgsNyBAQAogICAgIGUuc3RhdGUgPSAwOwogICAgIGlmIChscEtleVN0YXRlW1ZLX1NISUZUXSAmIDB4ODApCiAJZS5zdGF0ZSB8PSBTaGlmdE1hc2s7Ci0gICAgZHByaW50Zl9pbmZvKGtleWJvYXJkLCJUb0FzY2lpIDogbHBLZXlTdGF0ZVsweDE0KFZLX0NBUElUQUwpXT0lI3hcbiIsbHBLZXlTdGF0ZVtWS19DQVBJVEFMXSk7CisgICAgVFJBQ0Uoa2V5Ym9hcmQsIlRvQXNjaWkgOiBscEtleVN0YXRlWzB4MTQoVktfQ0FQSVRBTCldPSUjeFxuIixscEtleVN0YXRlW1ZLX0NBUElUQUxdKTsKICAgICBpZiAobHBLZXlTdGF0ZVtWS19DQVBJVEFMXSAmIDB4MDEpCiAJZS5zdGF0ZSB8PSBMb2NrTWFzazsKICAgICBpZiAobHBLZXlTdGF0ZVtWS19DT05UUk9MXSAmIDB4ODApCkBAIC0xMDk4LDcgKzEwOTgsNyBAQAogCSAgICBlLnN0YXRlIHw9IENvbnRyb2xNYXNrOwogICAgIGlmIChscEtleVN0YXRlW1ZLX05VTUxPQ0tdICYgMHgwMSkKIAllLnN0YXRlIHw9IE51bUxvY2tNYXNrOwotICAgIGRwcmludGZfaW5mbyhrZXksICJUb0FzY2lpKCUwNFgsICUwNFgpIDogZmFrZWQgc3RhdGUgPSAlWFxuIiwKKyAgICBUUkFDRShrZXksICIoJTA0WCwgJTA0WCkgOiBmYWtlZCBzdGF0ZSA9ICVYXG4iLAogCQl2aXJ0S2V5LCBzY2FuQ29kZSwgZS5zdGF0ZSk7CiAgICAgcmV0ID0gVFNYTG9va3VwU3RyaW5nKCZlLCAoTFBWT0lEKWxwQ2hhciwgMiwgJmtleXN5bSwgJmNzKTsKICAgICBpZiAocmV0ID09IDApCkBAIC0xMjEyLDcgKzEyMTIsNyBAQAogCQl9CiAJICAgIH0KIAl9Ci0gICAgZHByaW50Zl9pbmZvKGtleSwgIlRvQXNjaWkgYWJvdXQgdG8gcmV0dXJuICVkIHdpdGggY2hhciAleFxuIiwKKyAgICBUUkFDRShrZXksICJUb0FzY2lpIGFib3V0IHRvIHJldHVybiAlZCB3aXRoIGNoYXIgJXhcbiIsCiAJCXJldCwgKihjaGFyKilscENoYXIpOwogICAgIHJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS93aW5kb3dzL21kaS5jIGIvd2luZG93cy9tZGkuYwppbmRleCA2YmFlNjc0Li43MzlhYTY2IDEwMDY0NAotLS0gYS93aW5kb3dzL21kaS5jCisrKyBiL3dpbmRvd3MvbWRpLmMKQEAgLTExMiw3ICsxMTIsNyBAQAogCXduZFB0ciA9IFdJTl9GaW5kV25kUHRyKE1ESV9HZXRDaGlsZEJ5SUQoY2xpZW50V25kLGluZGV4KSk7CiAJaWYoICF3bmRQdHIgKQogCXsKLQkgICAgICBkcHJpbnRmX2luZm8obWRpLCJNRElNZW51RGVsZXRlSXRlbTogbm8gd2luZG93IGZvciBpZD0laVxuIixpbmRleCk7CisJICAgICAgVFJBQ0UobWRpLCJubyB3aW5kb3cgZm9yIGlkPSVpXG4iLGluZGV4KTsKIAkgICAgICBjb250aW51ZTsKIAl9CiAgICAgCkBAIC0xOTQsNyArMTk0LDcgQEAKICAgICBIV05EMzIgaHduZEZyYW1lID0gR2V0UGFyZW50MzIoaHduZCk7CiAgICAgSE1FTlUzMiBvbGRGcmFtZU1lbnUgPSBHZXRNZW51MzIoaHduZEZyYW1lKTsKIAotICAgIGRwcmludGZfaW5mbyhtZGksICJXTV9NRElTRVRNRU5VOiAlMDR4ICUwNHggJTA0eFxuIiwKKyAgICBUUkFDRShtZGksICIlMDR4ICUwNHggJTA0eFxuIiwKICAgICAgICAgICAgICAgICBod25kLCBobWVudUZyYW1lLCBobWVudVdpbmRvdyk7CiAKICAgICBjaSA9IChNRElDTElFTlRJTkZPICopIHctPndFeHRyYTsKQEAgLTI2NCw3ICsyNjQsNyBAQAogICAgIFdPUkQJICAgICB3SURtZW51ID0gY2ktPmlkRmlyc3RDaGlsZCArIGNpLT5uQWN0aXZlQ2hpbGRyZW47CiAgICAgY2hhcgkgICAgIGxwc3RyRGVmW109Imp1bmshIjsKIAotICAgIGRwcmludGZfaW5mbyhtZGksICJNRElDcmVhdGVDaGlsZDogb3JpZ2luICVpLCVpIC0gZGltICVpLCVpLCBzdHlsZSAlMDh4XG4iLCAKKyAgICBUUkFDRShtZGksICJvcmlnaW4gJWksJWkgLSBkaW0gJWksJWksIHN0eWxlICUwOHhcbiIsIAogICAgICAgICAgICAgICAgIGNzLT54LCBjcy0+eSwgY3MtPmN4LCBjcy0+Y3ksICh1bnNpZ25lZCljcy0+c3R5bGUpOyAgICAKICAgICAvKiBjYWxjdWxhdGUgcGxhY2VtZW50ICovCiAgICAgTURJX0NhbGNEZWZhdWx0Q2hpbGRQb3ModywgY2ktPm5Ub3RhbENyZWF0ZWQrKywgcG9zLCAwKTsKQEAgLTM1Myw3ICszNTMsNyBAQAogICAgICAgICAgICAgICAgIE1ESV9VcGRhdGVGcmFtZVRleHQoIHctPnBhcmVudCwgY2ktPnNlbGYsIE1ESV9SRVBBSU5URlJBTUUsIE5VTEwgKTsgCiAJICAgIH0KIAl9Ci0gICAgICAgIGRwcmludGZfaW5mbyhtZGksICJNRElDcmVhdGVDaGlsZDogY3JlYXRlZCBjaGlsZCAtICUwNHhcbiIsaHduZCk7CisgICAgICAgIFRSQUNFKG1kaSwgImNyZWF0ZWQgY2hpbGQgLSAlMDR4XG4iLGh3bmQpOwogICAgIH0KICAgICBlbHNlCiAgICAgewpAQCAtMzg4LDcgKzM4OCw3IEBACiAgICAgbHBNaW5NYXgtPnB0TWF4UG9zaXRpb24ueCA9IHJlY3QubGVmdDsKICAgICBscE1pbk1heC0+cHRNYXhQb3NpdGlvbi55ID0gcmVjdC50b3A7IAogCi0gICAgZHByaW50Zl9pbmZvKG1kaSwiXHRDaGlsZE1pbk1heEluZm86IG1heCByZWN0ICglaSwlaSAtICVpLCAlaSlcbiIsIAorICAgIFRSQUNFKG1kaSwibWF4IHJlY3QgKCVpLCVpIC0gJWksICVpKVxuIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LmxlZnQscmVjdC50b3AscmVjdC5yaWdodCxyZWN0LmJvdHRvbSk7CiB9CiAKQEAgLTQxMCw3ICs0MTAsNyBAQAogIAogICAgIGNpID0gKE1ESUNMSUVOVElORk8gKikgdy0+d0V4dHJhOwogCi0gICAgZHByaW50Zl9pbmZvKG1kaSwgIk1ESV9Td2l0Y2hBY3RpdmVDaGlsZDogZnJvbSAlMDR4LCB0byAlMDR4XG4iLGNoaWxkSHduZCxod25kVG8pOworICAgIFRSQUNFKG1kaSwgImZyb20gJTA0eCwgdG8gJTA0eFxuIixjaGlsZEh3bmQsaHduZFRvKTsKIAogICAgIGlmICggIWh3bmRUbyApIHJldHVybjsgLyogbm8gd2luZG93IHRvIHN3aXRjaCB0byAqLwogCkBAIC00NzAsNyArNDcwLDcgQEAKIAkKICAgICAgICAgY2ktPm5BY3RpdmVDaGlsZHJlbi0tOwogCi0gICAgICAgIGRwcmludGZfaW5mbyhtZGksIk1ESURlc3Ryb3lDaGlsZDogY2hpbGQgZGVzdHJveWVkIC0gJTA0eFxuIixjaGlsZCk7CisgICAgICAgIFRSQUNFKG1kaSwiY2hpbGQgZGVzdHJveWVkIC0gJTA0eFxuIixjaGlsZCk7CiAKICAgICAgICAgaWYgKGZsYWdEZXN0cm95KQogCXsKQEAgLTUwMSw3ICs1MDEsNyBAQAogICAgIGlmKCB3bmRQdHIgKQogICAgICAgICBpZiggd25kUHRyLT5kd1N0eWxlICYgV1NfRElTQUJMRUQgKSByZXR1cm4gMEw7CiAKLSAgICBkcHJpbnRmX2luZm8obWRpLCJNRElfQ2hpbGRBY3RpdmF0ZTogJTA0eFxuIiwgaFduZENoaWxkKTsKKyAgICBUUkFDRShtZGksIiUwNHhcbiIsIGhXbmRDaGlsZCk7CiAKICAgICBpZiggR2V0QWN0aXZlV2luZG93MzIoKSA9PSBjbGllbnRQdHItPnBhcmVudC0+aHduZFNlbGYgKQogICAgICAgICBpc0FjdGl2ZUZyYW1lV25kID0gVFJVRTsKQEAgLTYyNSw3ICs2MjUsNyBAQAogCSAgICAvKiB3YWxrIHRoZSBsaXN0IGFuZCBtb3ZlIHdpbmRvd3MgKi8KIAkgICAgd2hpbGUgKCAqcHBXbmQgKQogCSAgICB7Ci0JCWRwcmludGZfaW5mbyhtZGksICJNRElDYXNjYWRlOiBtb3ZlICUwNHggdG8gKCVkLCVkKSBzaXplIFslZCwlZF1cbiIsIAorCQlUUkFDRShtZGksICJtb3ZlICUwNHggdG8gKCVkLCVkKSBzaXplIFslZCwlZF1cbiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqcHBXbmQpLT5od25kU2VsZiwgcG9zWzBdLngsIHBvc1swXS55LCBwb3NbMV0ueCwgcG9zWzFdLnkpOwogCiAJCU1ESV9DYWxjRGVmYXVsdENoaWxkUG9zKGNsaWVudFduZCwgbisrLCBwb3MsIGRlbHRhKTsKQEAgLTY1OSw3ICs2NTksNyBAQAogICAgIHBwV25kID0gV0lOX0J1aWxkV2luQXJyYXkod25kQ2xpZW50LCBCV0FfU0tJUEhJRERFTiB8IEJXQV9TS0lQT1dORUQgfCBCV0FfU0tJUElDT05JQyB8CiAJICAgICgod1BhcmFtICYgTURJVElMRV9TS0lQRElTQUJMRUQpPyBCV0FfU0tJUERJU0FCTEVEIDogMCksICZ0b3RhbCApOwogCi0gICAgZHByaW50Zl9pbmZvKG1kaSwiTURJVGlsZTogJXUgd2luZG93cyB0byB0aWxlXG4iLCB0b3RhbCk7CisgICAgVFJBQ0UobWRpLCIldSB3aW5kb3dzIHRvIHRpbGVcbiIsIHRvdGFsKTsKIAogICAgIGlmKCBwcFduZCApCiAgICAgewpAQCAtNzI4LDcgKzcyOCw3IEBACiAgICAgV05EKgljaGlsZCA9IFdJTl9GaW5kV25kUHRyKGhDaGlsZCk7CiAgICAgSE1FTlUzMiAgCWhTeXNQb3B1cCA9IDA7CiAKLSAgICBkcHJpbnRmX2luZm8obWRpLCJNRElfQXVnbWVudEZyYW1lTWVudTogZnJhbWUgJXAsY2hpbGQgJTA0eFxuIixmcmFtZSxoQ2hpbGQpOworICAgIFRSQUNFKG1kaSwiZnJhbWUgJXAsY2hpbGQgJTA0eFxuIixmcmFtZSxoQ2hpbGQpOwogCiAgICAgaWYoICFmcmFtZS0+d0lEbWVudSB8fCAhY2hpbGQtPmhTeXNNZW51ICkgcmV0dXJuIDA7IAogCkBAIC03MzcsNyArNzM3LDcgQEAKICAgICBpZiAoIShoU3lzUG9wdXAgPSBMb2FkTWVudUluZGlyZWN0MzJBKFNZU1JFU19HZXRSZXNQdHIoU1lTUkVTX01FTlVfU1lTTUVOVSkpKSkKIAlyZXR1cm4gMDsKICAKLSAgICBkcHJpbnRmX2luZm8obWRpLCJcdGdvdCBwb3B1cCAlMDR4IGluIHN5c21lbnUgJTA0eFxuIiwgCisgICAgVFJBQ0UobWRpLCJcdGdvdCBwb3B1cCAlMDR4IGluIHN5c21lbnUgJTA0eFxuIiwgCiAJCWhTeXNQb3B1cCwgY2hpbGQtPmhTeXNNZW51KTsKICAKICAgICBpZiggIUluc2VydE1lbnUzMkEoZnJhbWUtPndJRG1lbnUsMCxNRl9CWVBPU0lUSU9OIHwgTUZfQklUTUFQIHwgTUZfUE9QVVAsCkBAIC03NzEsNyArNzcxLDcgQEAKIHsKICAgICBJTlQzMiBuSXRlbXMgPSBHZXRNZW51SXRlbUNvdW50MzIoZnJhbWVXbmQtPndJRG1lbnUpIC0gMTsKIAotICAgIGRwcmludGZfaW5mbyhtZGksIk1ESV9SZXN0b3JlRnJhbWVNZW51OiBmb3IgY2hpbGQgJTA0eFxuIixoQ2hpbGQpOworICAgIFRSQUNFKG1kaSwiZm9yIGNoaWxkICUwNHhcbiIsaENoaWxkKTsKIAogICAgIGlmKCBHZXRNZW51SXRlbUlEMzIoZnJhbWVXbmQtPndJRG1lbnUsbkl0ZW1zKSAhPSBTQ19SRVNUT1JFICkKIAlyZXR1cm4gMDsgCkBAIC03OTgsNyArNzk4LDcgQEAKICAgICBXTkQqICAgY2xpZW50V25kID0gV0lOX0ZpbmRXbmRQdHIoaENsaWVudCk7CiAgICAgTURJQ0xJRU5USU5GTyAqY2kgPSAoTURJQ0xJRU5USU5GTyAqKSBjbGllbnRXbmQtPndFeHRyYTsKIAotICAgIGRwcmludGZfaW5mbyhtZGksICJNREk6IHJlcGFpbnQgJWksIGZyYW1lVGV4dCAlc1xuIiwgcmVwYWludCwgKGxwVGl0bGUpP2xwVGl0bGU6Ik5VTEwiKTsKKyAgICBUUkFDRShtZGksICJyZXBhaW50ICVpLCBmcmFtZVRleHQgJXNcbiIsIHJlcGFpbnQsIChscFRpdGxlKT9scFRpdGxlOiJOVUxMIik7CiAKICAgICBpZiAoIWNsaWVudFduZCkKICAgICAgICAgICAgcmV0dXJuOwpAQCAtOTI1LDcgKzkyNSw3IEBACiAJTkNfSGFuZGxlTkNDYWxjU2l6ZSggdywgJnJlY3QgKTsKIAl3LT5yZWN0Q2xpZW50ID0gcmVjdDsKIAotCWRwcmludGZfaW5mbyhtZGksIk1ESTogQ2xpZW50IGNyZWF0ZWQgLSBod25kID0gJTA0eCwgaWRGaXJzdCA9ICV1XG4iLAorCVRSQUNFKG1kaSwiQ2xpZW50IGNyZWF0ZWQgLSBod25kID0gJTA0eCwgaWRGaXJzdCA9ICV1XG4iLAogCQkJICAgaHduZCwgY2ktPmlkRmlyc3RDaGlsZCApOwogCiAJcmV0dXJuIDA7CkBAIC0xMDE3LDcgKzEwMTcsNyBAQAogICAgICAgICAgICAgUE9JTlQxNiAgcHQgPSBNQUtFUE9JTlQxNihsUGFyYW0pOwogICAgICAgICAgICAgSFdORDE2IGNoaWxkID0gQ2hpbGRXaW5kb3dGcm9tUG9pbnQxNihod25kLCBwdCk7CiAKLQkgICAgZHByaW50Zl9pbmZvKG1kaSwiTURJQ2xpZW50OiBub3RpZmljYXRpb24gZnJvbSAlMDR4ICglaSwlaSlcbiIsY2hpbGQscHQueCxwdC55KTsKKwkgICAgVFJBQ0UobWRpLCJub3RpZmljYXRpb24gZnJvbSAlMDR4ICglaSwlaSlcbiIsY2hpbGQscHQueCxwdC55KTsKIAogICAgICAgICAgICAgaWYoIGNoaWxkICYmIGNoaWxkICE9IGh3bmQgJiYgY2hpbGQgIT0gY2ktPmh3bmRBY3RpdmVDaGlsZCApCiAgICAgICAgICAgICAgICAgU2V0V2luZG93UG9zMzIoY2hpbGQsIDAsMCwwLDAsMCwgU1dQX05PU0laRSB8IFNXUF9OT01PVkUgKTsKQEAgLTEyNjUsNyArMTI2NSw3IEBACiAJcmV0dXJuIDA7CiAKICAgICAgIGNhc2UgV01fTkNQQUlOVDoKLQlkcHJpbnRmX2luZm8obWRpLCJEZWZNRElDaGlsZFByb2M6IFdNX05DUEFJTlQgZm9yICUwNHgsIGFjdGl2ZSAlMDR4XG4iLAorCVRSQUNFKG1kaSwiV01fTkNQQUlOVCBmb3IgJTA0eCwgYWN0aXZlICUwNHhcbiIsCiAJCQkJCSAgICAgaHduZCwgY2ktPmh3bmRBY3RpdmVDaGlsZCApOwogCWJyZWFrOwogCkBAIC0xMzMyLDcgKzEzMzIsNyBAQAogCSAgICAgICAgU2VuZE1lc3NhZ2UxNiggaE1heENoaWxkLCBXTV9TRVRSRURSQVcsIFRSVUUsIDBMICk7CiAJICAgIH0KIAotCSAgICBkcHJpbnRmX2luZm8obWRpLCJcdE1ESTogbWF4aW1pemluZyBjaGlsZCAlMDR4XG4iLCBod25kICk7CisJICAgIFRSQUNFKG1kaSwibWF4aW1pemluZyBjaGlsZCAlMDR4XG4iLCBod25kICk7CiAKIAkgICAgY2ktPmh3bmRDaGlsZE1heGltaXplZCA9IGh3bmQ7IC8qICEhISAqLwogCkBAIC0xNTIzLDcgKzE1MjMsNyBAQAogCQkgICAgZGVmYXVsdDoKIAkJCSByZXR1cm4gMDsKIAkJfQotCSAgICAgICAgZHByaW50Zl9pbmZvKG1kaSwiVHJhbnNsYXRlTURJU3lzQWNjZWw6IHdQYXJhbSA9ICUwNHhcbiIsIHdQYXJhbSk7CisJICAgICAgICBUUkFDRShtZGksIndQYXJhbSA9ICUwNHhcbiIsIHdQYXJhbSk7CiAJICAgICAgICBTZW5kTWVzc2FnZTE2KCBjaS0+aHduZEFjdGl2ZUNoaWxkLCBXTV9TWVNDT01NQU5ELCAKIAkJCQkJd1BhcmFtLCAoTFBBUkFNKW1zZy0+d1BhcmFtKTsKIAkgICAgICAgIHJldHVybiAxOwpkaWZmIC0tZ2l0IGEvd2luZG93cy9tZXNzYWdlLmMgYi93aW5kb3dzL21lc3NhZ2UuYwppbmRleCA2YjYyN2EwLi4yOTRlMjU0IDEwMDY0NAotLS0gYS93aW5kb3dzL21lc3NhZ2UuYworKysgYi93aW5kb3dzL21lc3NhZ2UuYwpAQCAtMzU1LDcgKzM1NSw3IEBACiAgIHRtcE1zZyA9IFNFR1BUUl9ORVcoRVZFTlRNU0cxNik7CiAgIHd0aW1lPUhPT0tfQ2FsbEhvb2tzMTYoIFdIX0pPVVJOQUxQTEFZQkFDSywgSENfR0VUTkVYVCwgMCwKIAkJCSAgKExQQVJBTSlTRUdQVFJfR0VUKHRtcE1zZykpOwotICAvKiAgZHByaW50Zl9pbmZvKG1zZywiUGxheWJhY2sgd2FpdCB0aW1lID0lbGRcbiIsd3RpbWUpOyAqLworICAvKiAgVFJBQ0UobXNnLCJQbGF5YmFjayB3YWl0IHRpbWUgPSVsZFxuIix3dGltZSk7ICovCiAgIGlmICh3dGltZTw9MCkKICAgewogICAgd3RpbWU9MDsKQEAgLTU5NiwxMiArNTk2LDEyIEBACiAgICAgaWYgKElzVGFza0xvY2tlZCgpIHx8ICFJc1dpbmRvdzMyKGh3bmQpKSByZXR1cm4gMDsKIAogICAgIGRlYnVnU01STCs9NDsKLSAgICBkcHJpbnRmX2luZm8oc2VuZG1zZywiJSpzU006ICVzIFslMDR4XSAoJTA0eCAtPiAlMDR4KVxuIiwgCisgICAgVFJBQ0Uoc2VuZG1zZywiJSpzU006ICVzIFslMDR4XSAoJTA0eCAtPiAlMDR4KVxuIiwgCiAJCSAgICBwcmV2U01STCwgIiIsIFNQWV9HZXRNc2dOYW1lKG1zZyksIG1zZywgcXVldWUtPnNlbGYsIGhEZXN0UXVldWUgKTsKIAogICAgIGlmKCAhKHF1ZXVlLT53YWtlQml0cyAmIFFTX1NNUEFSQU1TRlJFRSkgKQogICAgIHsKLSAgICAgIGRwcmludGZfaW5mbyhzZW5kbXNnLCJcdEludGVydGFzayBTZW5kTWVzc2FnZTogc2xlZXBpbmcgc2luY2UgdW5yZXBsaWVkIFNlbmRNZXNzYWdlIHBlbmRpbmdcbiIpOworICAgICAgVFJBQ0Uoc2VuZG1zZywiXHRJbnRlcnRhc2sgU2VuZE1lc3NhZ2U6IHNsZWVwaW5nIHNpbmNlIHVucmVwbGllZCBTZW5kTWVzc2FnZSBwZW5kaW5nXG4iKTsKICAgICAgIHF1ZXVlLT5jaGFuZ2VCaXRzICY9IH5RU19TTVBBUkFNU0ZSRUU7CiAgICAgICBRVUVVRV9XYWl0Qml0cyggUVNfU01QQVJBTVNGUkVFICk7CiAgICAgfQpAQCAtNjE5LDcgKzYxOSw3IEBACiAgICAgcXVldWUtPndha2VCaXRzICY9IH5RU19TTVBBUkFNU0ZSRUU7CiAgICAgcXVldWUtPmZsYWdzID0gKHF1ZXVlLT5mbGFncyAmIH4oUVVFVUVfU01fV0lOMzJ8UVVFVUVfU01fVU5JQ09ERSkpIHwgZmxhZ3M7CiAKLSAgICBkcHJpbnRmX2luZm8oc2VuZG1zZywiJSpzc206IHNtUmVzdWx0SW5pdCA9ICUwOHhcbiIsIHByZXZTTVJMLCAiIiwgKHVuc2lnbmVkKSZxQ3RybCk7CisgICAgVFJBQ0Uoc2VuZG1zZywiJSpzc206IHNtUmVzdWx0SW5pdCA9ICUwOHhcbiIsIHByZXZTTVJMLCAiIiwgKHVuc2lnbmVkKSZxQ3RybCk7CiAKICAgICBxdWV1ZS0+c21SZXN1bHRJbml0ID0gJnFDdHJsOwogCkBAIC02MzQsMTEgKzYzNCwxMSBAQAogICAgICAgICBxdWV1ZS0+Y2hhbmdlQml0cyAmPSB+UVNfU01SRVNVTFQ7CiAgICAgICAgIERpcmVjdGVkWWllbGQoIGRlc3RRLT5oVGFzayApOwogICAgICAgICBRVUVVRV9XYWl0Qml0cyggUVNfU01SRVNVTFQgKTsKLQlkcHJpbnRmX2luZm8oc2VuZG1zZywiXHRzbTogaGF2ZSByZXN1bHQhXG4iKTsKKwlUUkFDRShzZW5kbXNnLCJcdHNtOiBoYXZlIHJlc3VsdCFcbiIpOwogICAgICAgfQogICAgICAgLyogZ290IHNvbWV0aGluZyAqLwogCi0gICAgICBkcHJpbnRmX2luZm8oc2VuZG1zZywiJSpzc206IHNtUmVzdWx0ID0gJTA4eFxuIiwgcHJldlNNUkwsICIiLCAodW5zaWduZWQpcXVldWUtPnNtUmVzdWx0ICk7CisgICAgICBUUkFDRShzZW5kbXNnLCIlKnNzbTogc21SZXN1bHQgPSAlMDh4XG4iLCBwcmV2U01STCwgIiIsICh1bnNpZ25lZClxdWV1ZS0+c21SZXN1bHQgKTsKIAogICAgICAgaWYgKHF1ZXVlLT5zbVJlc3VsdCkgeyAvKiBGSVhNRSwgc21SZXN1bHQgc2hvdWxkIGFsd2F5cyBiZSBzZXQgKi8KICAgICAgICAgcXVldWUtPnNtUmVzdWx0LT5sUmVzdWx0ID0gcXVldWUtPlNlbmRNZXNzYWdlUmV0dXJuOwpAQCAtNjQ3LDExICs2NDcsMTEgQEAKICAgICAgIHF1ZXVlLT53YWtlQml0cyAmPSB+UVNfU01SRVNVTFQ7CiAKICAgICAgIGlmKCBxdWV1ZS0+c21SZXN1bHQgIT0gJnFDdHJsICkKLQkgIGRwcmludGZfZXJyKHNlbmRtc2csICIlKnNzbTogd2VpcmQgc2NlbmVzIGluc2lkZSB0aGUgZ29sZG1pbmUhXG4iLCBwcmV2U01STCwgIiIpOworCSAgRVJSKHNlbmRtc2csICIlKnNzbTogd2VpcmQgc2NlbmVzIGluc2lkZSB0aGUgZ29sZG1pbmUhXG4iLCBwcmV2U01STCwgIiIpOwogICAgIH0KICAgICBxdWV1ZS0+c21SZXN1bHRJbml0ID0gTlVMTDsKICAgICAKLSAgICBkcHJpbnRmX2luZm8oc2VuZG1zZywiJSpzU006IFslMDR4XSByZXR1cm5pbmcgJTA4bHhcbiIsIHByZXZTTVJMLCAiIiwgbXNnLCBxQ3RybC5sUmVzdWx0KTsKKyAgICBUUkFDRShzZW5kbXNnLCIlKnNTTTogWyUwNHhdIHJldHVybmluZyAlMDhseFxuIiwgcHJldlNNUkwsICIiLCBtc2csIHFDdHJsLmxSZXN1bHQpOwogICAgIGRlYnVnU01STC09NDsKIAogICAgIHJldHVybiBxQ3RybC5sUmVzdWx0OwpAQCAtNjY4LDExICs2NjgsMTEgQEAKIAogICAgIGlmICghKHF1ZXVlID0gKE1FU1NBR0VRVUVVRSopR2xvYmFsTG9jazE2KCBHZXRUYXNrUXVldWUoMCkgKSkpIHJldHVybjsKIAotICAgIGRwcmludGZfaW5mbyhtc2csIlJlcGx5TWVzc2FnZSwgcXVldWUgJTA0eFxuIiwgcXVldWUtPnNlbGYpOworICAgIFRSQUNFKG1zZywiUmVwbHlNZXNzYWdlLCBxdWV1ZSAlMDR4XG4iLCBxdWV1ZS0+c2VsZik7CiAKICAgICB3aGlsZSggKHNlbmRlclEgPSAoTUVTU0FHRVFVRVVFKilHbG9iYWxMb2NrMTYoIHF1ZXVlLT5JblNlbmRNZXNzYWdlSGFuZGxlKSkpCiAgICAgewotICAgICAgZHByaW50Zl9pbmZvKG1zZywiXHRycG06IHJlcGx5aW5nIHRvICUwNHggKCUwNHggLT4gJTA0eClcbiIsCisgICAgICBUUkFDRShtc2csIlx0cnBtOiByZXBseWluZyB0byAlMDR4ICglMDR4IC0+ICUwNHgpXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZS0+bXNnLCBxdWV1ZS0+c2VsZiwgc2VuZGVyUS0+c2VsZik7CiAKICAgICAgIGlmKCBxdWV1ZS0+d2FrZUJpdHMgJiBRU19TRU5ETUVTU0FHRSApCkBAIC02ODQsMTAgKzY4NCwxMCBAQAogICAgICAgaWYoIShzZW5kZXJRLT53YWtlQml0cyAmIFFTX1NNUkVTVUxUKSApIGJyZWFrOwogICAgICAgT2xkWWllbGQoKTsKICAgICB9IAotICAgIGlmKCAhc2VuZGVyUSApIHsgZHByaW50Zl9pbmZvKG1zZywiXHRycG06IGRvbmVcbiIpOyByZXR1cm47IH0KKyAgICBpZiggIXNlbmRlclEgKSB7IFRSQUNFKG1zZywiXHRycG06IGRvbmVcbiIpOyByZXR1cm47IH0KIAogICAgIHNlbmRlclEtPlNlbmRNZXNzYWdlUmV0dXJuID0gcmVzdWx0OwotICAgIGRwcmludGZfaW5mbyhtc2csIlx0cnBtOiBzbVJlc3VsdCA9ICUwOHgsIHJlc3VsdCA9ICUwOGx4XG4iLCAKKyAgICBUUkFDRShtc2csIlx0cnBtOiBzbVJlc3VsdCA9ICUwOHgsIHJlc3VsdCA9ICUwOGx4XG4iLCAKIAkJCSh1bnNpZ25lZClxdWV1ZS0+c21SZXN1bHRDdXJyZW50LCByZXN1bHQgKTsKIAogICAgIHNlbmRlclEtPnNtUmVzdWx0ID0gcXVldWUtPnNtUmVzdWx0Q3VycmVudDsKQEAgLTkzNyw3ICs5MzcsNyBAQAogICAgIE1TR19QZWVrTWVzc2FnZSggbHBtc2csCiAgICAgICAgICAgICAgICAgICAgICBod25kLCBmaXJzdCwgbGFzdCwgUE1fUkVNT1ZFLCBGQUxTRSApOwogCi0gICAgZHByaW50Zl9pbmZvKG1zZywibWVzc2FnZSAlMDR4LCBod25kICUwNHgsIGZpbHRlciglMDR4IC0gJTA0eClcbiIsIGxwbXNnLT5tZXNzYWdlLAorICAgIFRSQUNFKG1zZywibWVzc2FnZSAlMDR4LCBod25kICUwNHgsIGZpbHRlciglMDR4IC0gJTA0eClcbiIsIGxwbXNnLT5tZXNzYWdlLAogCQkgICAgIAkJCQkgICAgICAgICAgICAgICAgIGh3bmQsIGZpcnN0LCBsYXN0ICk7CiAgICAgSE9PS19DYWxsSG9va3MxNiggV0hfR0VUTUVTU0FHRSwgSENfQUNUSU9OLCAwLCAoTFBBUkFNKW1zZyApOwogICAgIHJldHVybiAobHBtc2ctPm1lc3NhZ2UgIT0gV01fUVVJVCk7CkBAIC05NjgsMTcgKzk2OCwxNyBAQAogICAgIAogICAgIGlmIChod25kID09IEhXTkRfQlJPQURDQVNUKQogICAgIHsKLSAgICAgICAgZHByaW50Zl9pbmZvKG1zZywiUG9zdE1lc3NhZ2UgLy8gSFdORF9CUk9BRENBU1QgIVxuIik7CisgICAgICAgIFRSQUNFKG1zZywiSFdORF9CUk9BRENBU1QgIVxuIik7CiAgICAgICAgIGZvciAod25kUHRyID0gV0lOX0dldERlc2t0b3AoKS0+Y2hpbGQ7IHduZFB0cjsgd25kUHRyID0gd25kUHRyLT5uZXh0KQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAod25kUHRyLT5kd1N0eWxlICYgV1NfUE9QVVAgfHwgd25kUHRyLT5kd1N0eWxlICYgV1NfQ0FQVElPTikKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkcHJpbnRmX2luZm8obXNnLCJCUk9BRENBU1QgTWVzc2FnZSB0byBoV25kPSUwNHggbT0lMDRYIHc9JTA0WCBsPSUwOGxYICFcbiIsCisgICAgICAgICAgICAgICAgVFJBQ0UobXNnLCJCUk9BRENBU1QgTWVzc2FnZSB0byBoV25kPSUwNHggbT0lMDRYIHc9JTA0WCBsPSUwOGxYICFcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd25kUHRyLT5od25kU2VsZiwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOwogICAgICAgICAgICAgICAgIFBvc3RNZXNzYWdlMTYoIHduZFB0ci0+aHduZFNlbGYsIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtICk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgZHByaW50Zl9pbmZvKG1zZywiUG9zdE1lc3NhZ2UgLy8gRW5kIG9mIEhXTkRfQlJPQURDQVNUICFcbiIpOworICAgICAgICBUUkFDRShtc2csIkVuZCBvZiBIV05EX0JST0FEQ0FTVCAhXG4iKTsKICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogCkBAIC0xMDUxLDIwICsxMDUxLDIwIEBACiAgICAgewogICAgICAgICBpZiAoIShsaXN0ID0gV0lOX0J1aWxkV2luQXJyYXkoIFdJTl9HZXREZXNrdG9wKCksIDAsIE5VTEwgKSkpCiAgICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgZHByaW50Zl9pbmZvKG1zZywiU2VuZE1lc3NhZ2UgLy8gSFdORF9CUk9BRENBU1QgIVxuIik7CisgICAgICAgIFRSQUNFKG1zZywiSFdORF9CUk9BRENBU1QgIVxuIik7CiAgICAgICAgIGZvciAocHBXbmQgPSBsaXN0OyAqcHBXbmQ7IHBwV25kKyspCiAgICAgICAgIHsKICAgICAgICAgICAgIHduZFB0ciA9ICpwcFduZDsKICAgICAgICAgICAgIGlmICghSXNXaW5kb3czMih3bmRQdHItPmh3bmRTZWxmKSkgY29udGludWU7CiAgICAgICAgICAgICBpZiAod25kUHRyLT5kd1N0eWxlICYgV1NfUE9QVVAgfHwgd25kUHRyLT5kd1N0eWxlICYgV1NfQ0FQVElPTikKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkcHJpbnRmX2luZm8obXNnLCJCUk9BRENBU1QgTWVzc2FnZSB0byBoV25kPSUwNHggbT0lMDRYIHc9JTA0bFggbD0lMDhsWCAhXG4iLAorICAgICAgICAgICAgICAgIFRSQUNFKG1zZywiQlJPQURDQVNUIE1lc3NhZ2UgdG8gaFduZD0lMDR4IG09JTA0WCB3PSUwNGxYIGw9JTA4bFggIVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3bmRQdHItPmh3bmRTZWxmLCBtc2csIChEV09SRCl3UGFyYW0sIGxQYXJhbSk7CiAgICAgICAgICAgICAgICAgU2VuZE1lc3NhZ2UxNiggd25kUHRyLT5od25kU2VsZiwgbXNnLCB3UGFyYW0sIGxQYXJhbSApOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIEhlYXBGcmVlKCBTeXN0ZW1IZWFwLCAwLCBsaXN0ICk7Ci0gICAgICAgIGRwcmludGZfaW5mbyhtc2csIlNlbmRNZXNzYWdlIC8vIEVuZCBvZiBIV05EX0JST0FEQ0FTVCAhXG4iKTsKKyAgICAgICAgVFJBQ0UobXNnLCJFbmQgb2YgSFdORF9CUk9BRENBU1QgIVxuIik7CiAgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KIApAQCAtMTQyMywxNSArMTQyMywxNSBAQAogICAgIEJZVEUgd3BbMl07CiAgICAgCiAgICAgaWYgKG1lc3NhZ2UgIT0gV01fTU9VU0VNT1ZFICYmIG1lc3NhZ2UgIT0gV01fVElNRVIpCi0gICAgICAgIGRwcmludGZfaW5mbyhtc2csICJUcmFuc2xhdGVNZXNzYWdlKCVzLCAlMDRYLCAlMDhsWClcbiIsCisgICAgICAgIFRSQUNFKG1zZywgIiglcywgJTA0WCwgJTA4bFgpXG4iLAogCQkgICAgIFNQWV9HZXRNc2dOYW1lKG1lc3NhZ2UpLCB3UGFyYW0sIGxQYXJhbSApOwogICAgIGlmKG1lc3NhZ2UgPj0gV01fS0VZRklSU1QgJiYgbWVzc2FnZSA8PSBXTV9LRVlMQVNUKQotICAgICAgICBkcHJpbnRmX2luZm8oa2V5LCAiVHJhbnNsYXRlTWVzc2FnZSglcywgJTA0WCwgJTA4bFgpXG4iLAorICAgICAgICBUUkFDRShrZXksICIoJXMsICUwNFgsICUwOGxYKVxuIiwKIAkJICAgICBTUFlfR2V0TXNnTmFtZShtZXNzYWdlKSwgd1BhcmFtLCBsUGFyYW0gKTsKIAogICAgIGlmICgobWVzc2FnZSAhPSBXTV9LRVlET1dOKSAmJiAobWVzc2FnZSAhPSBXTV9TWVNLRVlET1dOKSkgcmV0dXJuIEZBTFNFOwogCi0gICAgZHByaW50Zl9pbmZvKGtleSwgIlRyYW5zbGF0aW5nIGtleSAlMDRYLCBzY2FuY29kZSAlMDRYXG4iLAorICAgIFRSQUNFKGtleSwgIlRyYW5zbGF0aW5nIGtleSAlMDRYLCBzY2FuY29kZSAlMDRYXG4iLAogICAgICAgICAgICAgICAgICB3UGFyYW0sIEhJV09SRChsUGFyYW0pICk7CiAKICAgICAvKiBGSVhNRSA6IHNob3VsZCBoYW5kbGUgVG9Bc2NpaSB5aWVsZGluZyAyICovCkBAIC0xNDYyLDE0ICsxNDYyLDE0IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgZGVhZF9jaGFyID0gMDsKICAgICAgICAgfQotICAgICAgICBkcHJpbnRmX2luZm8oa2V5LCAiMSAtPiBQb3N0TWVzc2FnZSglcylcbiIsIFNQWV9HZXRNc2dOYW1lKG1lc3NhZ2UpKTsKKyAgICAgICAgVFJBQ0Uoa2V5LCAiMSAtPiBQb3N0TWVzc2FnZSglcylcbiIsIFNQWV9HZXRNc2dOYW1lKG1lc3NhZ2UpKTsKICAgICAgICAgUG9zdE1lc3NhZ2UxNiggaHduZCwgbWVzc2FnZSwgd3BbMF0sIGxQYXJhbSApOwogICAgICAgICByZXR1cm4gVFJVRTsKIAogICAgIGNhc2UgLTEgOgogICAgICAgICBtZXNzYWdlID0gKG1lc3NhZ2UgPT0gV01fS0VZRE9XTikgPyBXTV9ERUFEQ0hBUiA6IFdNX1NZU0RFQURDSEFSOwogICAgICAgICBkZWFkX2NoYXIgPSB3cFswXTsKLSAgICAgICAgZHByaW50Zl9pbmZvKGtleSwgIi0xIC0+IFBvc3RNZXNzYWdlKCVzKVxuIiwKKyAgICAgICAgVFJBQ0Uoa2V5LCAiLTEgLT4gUG9zdE1lc3NhZ2UoJXMpXG4iLAogICAgICAgICAgICAgICAgICAgICAgU1BZX0dldE1zZ05hbWUobWVzc2FnZSkpOwogICAgICAgICBQb3N0TWVzc2FnZTE2KCBod25kLCBtZXNzYWdlLCB3cFswXSwgbFBhcmFtICk7CiAgICAgICAgIHJldHVybiBUUlVFOwpAQCAtMTY0Miw3ICsxNjQyLDcgQEAKICAqLwogV09SRCBXSU5BUEkgUmVnaXN0ZXJXaW5kb3dNZXNzYWdlMTYoIFNFR1BUUiBzdHIgKQogewotICAgIGRwcmludGZfaW5mbyhtc2csICJSZWdpc3RlcldpbmRvd01lc3NhZ2UxNjogJTA4bHhcbiIsIChEV09SRClzdHIgKTsKKyAgICBUUkFDRShtc2csICIlMDhseFxuIiwgKERXT1JEKXN0ciApOwogICAgIHJldHVybiBHbG9iYWxBZGRBdG9tMTYoIHN0ciApOwogfQogCkBAIC0xNjUyLDcgKzE2NTIsNyBAQAogICovCiBXT1JEIFdJTkFQSSBSZWdpc3RlcldpbmRvd01lc3NhZ2UzMkEoIExQQ1NUUiBzdHIgKQogewotICAgIGRwcmludGZfaW5mbyhtc2csICJSZWdpc3RlcldpbmRvd01lc3NhZ2UzMkE6ICVzXG4iLCBzdHIgKTsKKyAgICBUUkFDRShtc2csICIlc1xuIiwgc3RyICk7CiAgICAgcmV0dXJuIEdsb2JhbEFkZEF0b20zMkEoIHN0ciApOwogfQogCkBAIC0xNjYyLDcgKzE2NjIsNyBAQAogICovCiBXT1JEIFdJTkFQSSBSZWdpc3RlcldpbmRvd01lc3NhZ2UzMlcoIExQQ1dTVFIgc3RyICkKIHsKLSAgICBkcHJpbnRmX2luZm8obXNnLCAiUmVnaXN0ZXJXaW5kb3dNZXNzYWdlMzJXOiAlcFxuIiwgc3RyICk7CisgICAgVFJBQ0UobXNnLCAiJXBcbiIsIHN0ciApOwogICAgIHJldHVybiBHbG9iYWxBZGRBdG9tMzJXKCBzdHIgKTsKIH0KIApkaWZmIC0tZ2l0IGEvd2luZG93cy9ub25jbGllbnQuYyBiL3dpbmRvd3Mvbm9uY2xpZW50LmMKaW5kZXggMDNlYmU1MS4uNmQ3NWZjMSAxMDA2NDQKLS0tIGEvd2luZG93cy9ub25jbGllbnQuYworKysgYi93aW5kb3dzL25vbmNsaWVudC5jCkBAIC0yMDEsNyArMjAxLDcgQEAKICAgICBleFN0eWxlICY9IFdTX0VYX0RMR01PREFMRlJBTUU7CiAgICAgaWYgKGV4U3R5bGUgJiBXU19FWF9ETEdNT0RBTEZSQU1FKSBzdHlsZSAmPSB+V1NfVEhJQ0tGUkFNRTsKIAotICAgIGRwcmludGZfaW5mbyhub25jbGllbnQsICJBZGp1c3RXaW5kb3dSZWN0RXg6ICglZCwlZCktKCVkLCVkKSAlMDhseCAlZCAlMDhseFxuIiwKKyAgICBUUkFDRShub25jbGllbnQsICIoJWQsJWQpLSglZCwlZCkgJTA4bHggJWQgJTA4bHhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgcmVjdC0+bGVmdCwgcmVjdC0+dG9wLCByZWN0LT5yaWdodCwgcmVjdC0+Ym90dG9tLAogICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLCBtZW51LCBleFN0eWxlICk7CiAKQEAgLTI1NSw3ICsyNTUsNyBAQAogCXdpblJlY3QtPmJvdHRvbSAtPSB0bXBSZWN0LmJvdHRvbTsKIAogCWlmIChIQVNfTUVOVShwV25kKSkgewotCSAgICBkcHJpbnRmX2luZm8obm9uY2xpZW50LCAiTkNfSGFuZGxlTkNDYWxjU2l6ZTogQ2FsbGluZyAiCisJICAgIFRSQUNFKG5vbmNsaWVudCwgIkNhbGxpbmcgIgogCQkJICAgICAgICJHZXRNZW51QmFySGVpZ2h0IHdpdGggSFdORCAweCV4LCB3aWR0aCAlZCwgIgogCQkJICAgICAgICJhdCAoJWQsICVkKS5cbiIsIHBXbmQtPmh3bmRTZWxmLAogCQkJICAgICAgIHdpblJlY3QtPnJpZ2h0IC0gd2luUmVjdC0+bGVmdCwKQEAgLTMyMiw3ICszMjIsNyBAQAogICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKICAgICBpZiAoIXduZFB0cikgcmV0dXJuIEhURVJST1I7CiAKLSAgICBkcHJpbnRmX2luZm8obm9uY2xpZW50LCAiTkNfSGFuZGxlTkNIaXRUZXN0OiBod25kPSUwNHggcHQ9JWQsJWRcbiIsCisgICAgVFJBQ0Uobm9uY2xpZW50LCAiaHduZD0lMDR4IHB0PSVkLCVkXG4iLAogCQkgICAgICBod25kLCBwdC54LCBwdC55ICk7CiAKICAgICBHZXRXaW5kb3dSZWN0MTYoIGh3bmQsICZyZWN0ICk7CkBAIC0xMDEyLDcgKzEwMTIsNyBAQAogCiAgICAgYWN0aXZlICA9IHduZFB0ci0+ZmxhZ3MgJiBXSU5fTkNBQ1RJVkFURUQ7CiAKLSAgICBkcHJpbnRmX2luZm8obm9uY2xpZW50LCAiTkNfRG9OQ1BhaW50OiAlMDR4ICVkXG4iLCBod25kLCBhY3RpdmUgKTsKKyAgICBUUkFDRShub25jbGllbnQsICIlMDR4ICVkXG4iLCBod25kLCBhY3RpdmUgKTsKIAogICAgIGlmICghKGhkYyA9IEdldERDRXgzMiggaHduZCwgMCwgRENYX1VTRVNUWUxFIHwgRENYX1dJTkRPVyApKSkgcmV0dXJuOwogCkBAIC0xMTE5LDcgKzExMTksNyBAQAogCiAgICAgYWN0aXZlICA9IHduZFB0ci0+ZmxhZ3MgJiBXSU5fTkNBQ1RJVkFURUQ7CiAKLSAgICBkcHJpbnRmX2luZm8obm9uY2xpZW50LCAiTkNfRG9OQ1BhaW50OTU6ICUwNHggJWRcbiIsIGh3bmQsIGFjdGl2ZSApOworICAgIFRSQUNFKG5vbmNsaWVudCwgIiUwNHggJWRcbiIsIGh3bmQsIGFjdGl2ZSApOwogCiAgICAgaWYgKCEoaGRjID0gR2V0RENFeDMyKCBod25kLCAwLCBEQ1hfVVNFU1RZTEUgfCBEQ1hfV0lORE9XICkpKSByZXR1cm47CiAKQEAgLTExNzIsMTQgKzExNzIsMTQgQEAKIAlyLmJvdHRvbSA9IHJlY3QudG9wICsgc3lzTWV0cmljc1tTTV9DWU1FTlVdIC0gc3lzTWV0cmljc1tTTV9DWUJPUkRFUl07CiAJci50b3AgLT0gc3lzTWV0cmljc1tTTV9DWUJPUkRFUl07CiAJCi0JZHByaW50Zl9pbmZvKG5vbmNsaWVudCwgIkRvTkNQYWludDk1OiBDYWxsaW5nIERyYXdNZW51QmFyIHdpdGggIgorCVRSQUNFKG5vbmNsaWVudCwgIkNhbGxpbmcgRHJhd01lbnVCYXIgd2l0aCAiCiAJCQkgICJyZWN0ICglZCwgJWQpLSglZCwgJWQpXG4iLCByLmxlZnQsIHIudG9wLAogCQkJICByLnJpZ2h0LCByLmJvdHRvbSk7CiAKIAlyZWN0LnRvcCArPSBNRU5VX0RyYXdNZW51QmFyKCBoZGMsICZyLCBod25kLCBzdXBwcmVzc19tZW51cGFpbnQgKTsKICAgICB9CiAKLSAgICBkcHJpbnRmX2luZm8obm9uY2xpZW50LCAiQWZ0ZXIgTWVudUJhciwgcmVjdCBpcyAoJWQsICVkKS0oJWQsICVkKS5cbiIsCisgICAgVFJBQ0Uobm9uY2xpZW50LCAiQWZ0ZXIgTWVudUJhciwgcmVjdCBpcyAoJWQsICVkKS0oJWQsICVkKS5cbiIsCiAJCSAgICAgICByZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSApOwogCiAgICAgLyogRHJhdyB0aGUgaW5uZXIgZnJhbWVzICovCkBAIC0xODgxLDcgKzE4ODEsNyBAQAogICAgIFBPSU5UMzIgcHQzMjsKICAgICBVSU5UMTYgdUNvbW1hbmQgPSB3UGFyYW0gJiAweEZGRjA7CiAKLSAgICBkcHJpbnRmX2luZm8obm9uY2xpZW50LCAiSGFuZGxpbmcgV01fU1lTQ09NTUFORCAleCAlZCwlZFxuIiwgCisgICAgVFJBQ0Uobm9uY2xpZW50LCAiSGFuZGxpbmcgV01fU1lTQ09NTUFORCAleCAlZCwlZFxuIiwgCiAJCSAgICAgIHdQYXJhbSwgcHQueCwgcHQueSApOwogCiAgICAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0NISUxEICYmIHVDb21tYW5kICE9IFNDX0tFWU1FTlUgKQpkaWZmIC0tZ2l0IGEvd2luZG93cy9wYWludGluZy5jIGIvd2luZG93cy9wYWludGluZy5jCmluZGV4IDIwYzhiMTIuLmE3ODk4MmYzIDEwMDY0NAotLS0gYS93aW5kb3dzL3BhaW50aW5nLmMKKysrIGIvd2luZG93cy9wYWludGluZy5jCkBAIC0yOCw3ICsyOCw3IEBACiAgICAgUE9JTlQxNiBwdCA9IHswLCAwfTsgCiAgICAgSFJHTjMyIGhDbGlwID0gMTsKIAotICAgIGRwcmludGZfaW5mbyhub25jbGllbnQsIk5DVXBkYXRlOiBod25kICUwNHgsIGhyZ25VcGRhdGUgJTA0eFxuIiwgCisgICAgVFJBQ0Uobm9uY2xpZW50LCJod25kICUwNHgsIGhyZ25VcGRhdGUgJTA0eFxuIiwgCiAgICAgICAgICAgICAgICAgICAgICAgd25kLT5od25kU2VsZiwgd25kLT5ocmduVXBkYXRlICk7CiAKICAgICAvKiBkZXNrdG9wIHdpbmRvdyBkb2Vzbid0IGhhdmUgbm9uY2xpZW50IGFyZWEgKi8KQEAgLTExMCw3ICsxMTAsNyBAQAogCiAgICAgSGlkZUNhcmV0MzIoIGh3bmQgKTsKIAotICAgIGRwcmludGZfaW5mbyh3aW4sImhyZ25VcGRhdGUgPSAlMDR4LCBcbiIsIGhyZ25VcGRhdGUpOworICAgIFRSQUNFKHdpbiwiaHJnblVwZGF0ZSA9ICUwNHgsIFxuIiwgaHJnblVwZGF0ZSk7CiAKICAgICAvKiBXaGVuIGJJY29uIGlzIFRSVUUgaHJnblVwZGF0ZSBpcyBhdXRvbWF0aWNhbGx5IGluIHdpbmRvdyBjb29yZGluYXRlcwogICAgICAqIChiZWNhdXNlIHJlY3RDbGllbnQgPT0gcmVjdFdpbmRvdyBmb3IgV1NfTUlOSU1JWkUgd2luZG93cykuCkBAIC0xMzEsNyArMTMxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJJY29uID8gRENYX1dJTkRPVyA6IDApICk7CiAgICAgfQogCi0gICAgZHByaW50Zl9pbmZvKHdpbiwiaGRjID0gJTA0eFxuIiwgbHBzLT5oZGMpOworICAgIFRSQUNFKHdpbiwiaGRjID0gJTA0eFxuIiwgbHBzLT5oZGMpOwogCiAgICAgaWYgKCFscHMtPmhkYykKICAgICB7CkBAIC0xNDEsNyArMTQxLDcgQEAKIAogICAgIEdldFJnbkJveDE2KCBJbnF1aXJlVmlzUmduKGxwcy0+aGRjKSwgJmxwcy0+cmNQYWludCApOwogCi1kcHJpbnRmX2luZm8od2luLCJib3ggPSAoJWksJWkgLSAlaSwlaSlcbiIsIGxwcy0+cmNQYWludC5sZWZ0LCBscHMtPnJjUGFpbnQudG9wLAorVFJBQ0Uod2luLCJib3ggPSAoJWksJWkgLSAlaSwlaSlcbiIsIGxwcy0+cmNQYWludC5sZWZ0LCBscHMtPnJjUGFpbnQudG9wLAogCQkgICAgbHBzLT5yY1BhaW50LnJpZ2h0LCBscHMtPnJjUGFpbnQuYm90dG9tICk7CiAKICAgICBEUHRvTFAxNiggbHBzLT5oZGMsIChMUFBPSU5UMTYpJmxwcy0+cmNQYWludCwgMiApOwpAQCAtMjk1LDEzICsyOTUsMTMgQEAKICAgICBiSWNvbiA9ICh3bmRQdHItPmR3U3R5bGUgJiBXU19NSU5JTUlaRSAmJiB3bmRQdHItPmNsYXNzLT5oSWNvbik7CiAgICAgaWYgKHJlY3RVcGRhdGUpCiAgICAgewotICAgICAgICBkcHJpbnRmX2luZm8od2luLCAiUmVkcmF3V2luZG93OiAlMDR4ICVkLCVkLSVkLCVkICUwNHggZmxhZ3M9JTA0eFxuIiwKKyAgICAgICAgVFJBQ0Uod2luLCAiJTA0eCAlZCwlZC0lZCwlZCAlMDR4IGZsYWdzPSUwNHhcbiIsCiAgICAgICAgICAgICAgICAgICAgIGh3bmQsIHJlY3RVcGRhdGUtPmxlZnQsIHJlY3RVcGRhdGUtPnRvcCwKICAgICAgICAgICAgICAgICAgICAgcmVjdFVwZGF0ZS0+cmlnaHQsIHJlY3RVcGRhdGUtPmJvdHRvbSwgaHJnblVwZGF0ZSwgZmxhZ3MgKTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKLSAgICAgICAgZHByaW50Zl9pbmZvKHdpbiwgIlJlZHJhd1dpbmRvdzogJTA0eCBOVUxMICUwNHggZmxhZ3M9JTA0eFxuIiwKKyAgICAgICAgVFJBQ0Uod2luLCAiJTA0eCBOVUxMICUwNHggZmxhZ3M9JTA0eFxuIiwKICAgICAgICAgICAgICAgICAgICAgIGh3bmQsIGhyZ25VcGRhdGUsIGZsYWdzKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3dpbmRvd3MvcHJvcGVydHkuYyBiL3dpbmRvd3MvcHJvcGVydHkuYwppbmRleCAyMjEwNDhjLi45YzNhYzE4IDEwMDY0NAotLS0gYS93aW5kb3dzL3Byb3BlcnR5LmMKKysrIGIvd2luZG93cy9wcm9wZXJ0eS5jCkBAIC03MywxMCArNzMsMTAgQEAKICAgICBQUk9QRVJUWSAqcHJvcCA9IFBST1BfRmluZFByb3AoIGh3bmQsIHN0ciApOwogCiAgICAgaWYgKEhJV09SRChzdHIpKQotICAgICAgICBkcHJpbnRmX2luZm8ocHJvcCwgIkdldFByb3AoJTA4eCwnJXMnKTogcmV0dXJuaW5nICUwOHhcbiIsCisgICAgICAgIFRSQUNFKHByb3AsICIoJTA4eCwnJXMnKTogcmV0dXJuaW5nICUwOHhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgaHduZCwgc3RyLCBwcm9wID8gcHJvcC0+aGFuZGxlIDogMCApOwogICAgIGVsc2UKLSAgICAgICAgZHByaW50Zl9pbmZvKHByb3AsICJHZXRQcm9wKCUwOHgsIyUwNHgpOiByZXR1cm5pbmcgJTA4eFxuIiwKKyAgICAgICAgVFJBQ0UocHJvcCwgIiglMDh4LCMlMDR4KTogcmV0dXJuaW5nICUwOHhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgaHduZCwgTE9XT1JEKHN0ciksIHByb3AgPyBwcm9wLT5oYW5kbGUgOiAwICk7CiAKICAgICByZXR1cm4gcHJvcCA/IHByb3AtPmhhbmRsZSA6IDA7CkBAIC0xMTYsOSArMTE2LDkgQEAKICAgICBQUk9QRVJUWSAqcHJvcDsKIAogICAgIGlmIChISVdPUkQoc3RyKSkKLSAgICAgICAgZHByaW50Zl9pbmZvKHByb3AsICJTZXRQcm9wOiAlMDR4ICclcycgJTA4eFxuIiwgaHduZCwgc3RyLCBoYW5kbGUgKTsKKyAgICAgICAgVFJBQ0UocHJvcCwgIiUwNHggJyVzJyAlMDh4XG4iLCBod25kLCBzdHIsIGhhbmRsZSApOwogICAgIGVsc2UKLSAgICAgICAgZHByaW50Zl9pbmZvKHByb3AsICJTZXRQcm9wOiAlMDR4ICMlMDR4ICUwOHhcbiIsCisgICAgICAgIFRSQUNFKHByb3AsICIlMDR4ICMlMDR4ICUwOHhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgaHduZCwgTE9XT1JEKHN0ciksIGhhbmRsZSApOwogCiAgICAgaWYgKCEocHJvcCA9IFBST1BfRmluZFByb3AoIGh3bmQsIHN0ciApKSkKQEAgLTE3Nyw5ICsxNzcsOSBAQAogICAgIFdORCAqcFduZCA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7CiAKICAgICBpZiAoSElXT1JEKHN0cikpCi0gICAgICBkcHJpbnRmX2luZm8ocHJvcCwgIlJlbW92ZVByb3A6ICUwNHggJyVzJ1xuIiwgaHduZCwgc3RyICk7CisgICAgICBUUkFDRShwcm9wLCAiJTA0eCAnJXMnXG4iLCBod25kLCBzdHIgKTsKICAgICBlbHNlCi0gICAgICBkcHJpbnRmX2luZm8ocHJvcCwgIlJlbW92ZVByb3A6ICUwNHggIyUwNHhcbiIsIGh3bmQsIExPV09SRChzdHIpKTsKKyAgICAgIFRSQUNFKHByb3AsICIlMDR4ICMlMDR4XG4iLCBod25kLCBMT1dPUkQoc3RyKSk7CiAKIAogICAgIGlmICghcFduZCkgcmV0dXJuIE5VTEw7CkBAIC0yNjIsNyArMjYyLDcgQEAKICAgICBXTkQgKnBXbmQ7CiAgICAgSU5UMTYgcmV0ID0gLTE7CiAKLSAgICBkcHJpbnRmX2luZm8ocHJvcCwgIkVudW1Qcm9wczogJTA0eCAlMDh4XG4iLCBod25kLCAoVUlOVDMyKWZ1bmMgKTsKKyAgICBUUkFDRShwcm9wLCAiJTA0eCAlMDh4XG4iLCBod25kLCAoVUlOVDMyKWZ1bmMgKTsKICAgICBpZiAoIShwV25kID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKSkpIHJldHVybiAtMTsKICAgICBmb3IgKHByb3AgPSBwV25kLT5wUHJvcDsgKHByb3ApOyBwcm9wID0gbmV4dCkKICAgICB7CkBAIC0yNzAsNyArMjcwLDcgQEAKICAgICAgICAgLyogZnVuY3Rpb24gcmVtb3ZlcyB0aGUgY3VycmVudCBwcm9wZXJ0eS4gICAgKi8KICAgICAgICAgbmV4dCA9IHByb3AtPm5leHQ7CiAKLSAgICAgICAgZHByaW50Zl9pbmZvKHByb3AsICIgIENhbGxiYWNrOiBoYW5kbGU9JTA4eCBzdHI9JyVzJ1xuIiwKKyAgICAgICAgVFJBQ0UocHJvcCwgIiAgQ2FsbGJhY2s6IGhhbmRsZT0lMDh4IHN0cj0nJXMnXG4iLAogICAgICAgICAgICAgICAgICAgICAgIHByb3AtPmhhbmRsZSwgcHJvcC0+c3RyaW5nICk7CiAgICAgICAgIHJldCA9IGZ1bmMoIGh3bmQsIFNFR1BUUl9HRVQocHJvcC0+c3RyaW5nKSwgcHJvcC0+aGFuZGxlICk7CiAgICAgICAgIGlmICghcmV0KSBicmVhazsKQEAgLTMwNiw3ICszMDYsNyBAQAogICAgIFdORCAqcFduZDsKICAgICBJTlQzMiByZXQgPSAtMTsKIAotICAgIGRwcmludGZfaW5mbyhwcm9wLCAiRW51bVByb3BzRXgzMkE6ICUwNHggJTA4eCAlMDhseFxuIiwKKyAgICBUUkFDRShwcm9wLCAiJTA0eCAlMDh4ICUwOGx4XG4iLAogICAgICAgICAgICAgICAgICAgaHduZCwgKFVJTlQzMilmdW5jLCBsUGFyYW0gKTsKICAgICBpZiAoIShwV25kID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKSkpIHJldHVybiAtMTsKICAgICBmb3IgKHByb3AgPSBwV25kLT5wUHJvcDsgKHByb3ApOyBwcm9wID0gbmV4dCkKQEAgLTMxNSw3ICszMTUsNyBAQAogICAgICAgICAvKiBmdW5jdGlvbiByZW1vdmVzIHRoZSBjdXJyZW50IHByb3BlcnR5LiAgICAqLwogICAgICAgICBuZXh0ID0gcHJvcC0+bmV4dDsKIAotICAgICAgICBkcHJpbnRmX2luZm8ocHJvcCwgIiAgQ2FsbGJhY2s6IGhhbmRsZT0lMDh4IHN0cj0nJXMnXG4iLAorICAgICAgICBUUkFDRShwcm9wLCAiICBDYWxsYmFjazogaGFuZGxlPSUwOHggc3RyPSclcydcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgcHJvcC0+aGFuZGxlLCBwcm9wLT5zdHJpbmcgKTsKICAgICAgICAgcmV0ID0gZnVuYyggaHduZCwgcHJvcC0+c3RyaW5nLCBwcm9wLT5oYW5kbGUsIGxQYXJhbSApOwogICAgICAgICBpZiAoIXJldCkgYnJlYWs7CkBAIC0zMzMsNyArMzMzLDcgQEAKICAgICBXTkQgKnBXbmQ7CiAgICAgSU5UMzIgcmV0ID0gLTE7CiAKLSAgICBkcHJpbnRmX2luZm8ocHJvcCwgIkVudW1Qcm9wc0V4MzJXOiAlMDR4ICUwOHggJTA4bHhcbiIsCisgICAgVFJBQ0UocHJvcCwgIiUwNHggJTA4eCAlMDhseFxuIiwKICAgICAgICAgICAgICAgICAgIGh3bmQsIChVSU5UMzIpZnVuYywgbFBhcmFtICk7CiAgICAgaWYgKCEocFduZCA9IFdJTl9GaW5kV25kUHRyKCBod25kICkpKSByZXR1cm4gLTE7CiAgICAgZm9yIChwcm9wID0gcFduZC0+cFByb3A7IChwcm9wKTsgcHJvcCA9IG5leHQpCkBAIC0zNDIsNyArMzQyLDcgQEAKICAgICAgICAgLyogZnVuY3Rpb24gcmVtb3ZlcyB0aGUgY3VycmVudCBwcm9wZXJ0eS4gICAgKi8KICAgICAgICAgbmV4dCA9IHByb3AtPm5leHQ7CiAKLSAgICAgICAgZHByaW50Zl9pbmZvKHByb3AsICIgIENhbGxiYWNrOiBoYW5kbGU9JTA4eCBzdHI9JyVzJ1xuIiwKKyAgICAgICAgVFJBQ0UocHJvcCwgIiAgQ2FsbGJhY2s6IGhhbmRsZT0lMDh4IHN0cj0nJXMnXG4iLAogICAgICAgICAgICAgICAgICAgICAgIHByb3AtPmhhbmRsZSwgcHJvcC0+c3RyaW5nICk7CiAgICAgICAgIGlmIChISVdPUkQocHJvcC0+c3RyaW5nKSkKICAgICAgICAgewpkaWZmIC0tZ2l0IGEvd2luZG93cy9xdWV1ZS5jIGIvd2luZG93cy9xdWV1ZS5jCmluZGV4IGQzMDUzMzQuLjQ0YjBlYzUgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvcXVldWUuYworKysgYi93aW5kb3dzL3F1ZXVlLmMKQEAgLTEyMiw3ICsxMjIsNyBAQAogICAgIGludCBxdWV1ZVNpemU7CiAgICAgVERCICpwVGFzayA9IChUREIgKilHbG9iYWxMb2NrMTYoIEdldEN1cnJlbnRUYXNrKCkgKTsKIAotICAgIGRwcmludGZfaW5mbyhtc2csIkNyZWF0aW5nIG1lc3NhZ2UgcXVldWUuLi5cbiIpOworICAgIFRSQUNFKG1zZywiQ3JlYXRpbmcgbWVzc2FnZSBxdWV1ZS4uLlxuIik7CiAKICAgICBxdWV1ZVNpemUgPSBzaXplb2YoTUVTU0FHRVFVRVVFKSArIHNpemUgKiBzaXplb2YoUU1TRyk7CiAgICAgaWYgKCEoaFF1ZXVlID0gR2xvYmFsQWxsb2MxNiggR01FTV9GSVhFRCB8IEdNRU1fWkVST0lOSVQsIHF1ZXVlU2l6ZSApKSkKQEAgLTE1MiwxMSArMTUyLDExIEBACiAgICAgSFFVRVVFMTYgIHNlbmRlclE7CiAgICAgSFFVRVVFMTYgKnBQcmV2OwogCi0gICAgZHByaW50Zl9pbmZvKG1zZywiRGVsZXRpbmcgbWVzc2FnZSBxdWV1ZSAlMDR4XG4iLCBoUXVldWUpOworICAgIFRSQUNFKG1zZywiRGVsZXRpbmcgbWVzc2FnZSBxdWV1ZSAlMDR4XG4iLCBoUXVldWUpOwogCiAgICAgaWYgKCFoUXVldWUgfHwgIW1zZ1F1ZXVlKQogICAgIHsKLQlkcHJpbnRmX3dhcm4obXNnLCAiRGVsZXRlTXNnUXVldWU6IGludmFsaWQgYXJndW1lbnQuXG4iKTsKKwlXQVJOKG1zZywgImludmFsaWQgYXJndW1lbnQuXG4iKTsKIAlyZXR1cm4gMDsKICAgICB9CiAgICAgaWYoIHBDdXJzb3JRdWV1ZSA9PSBtc2dRdWV1ZSApIHBDdXJzb3JRdWV1ZSA9IE5VTEw7CkBAIC0yMjMsNyArMjIzLDcgQEAKICAqLwogdm9pZCBRVUVVRV9TZXRXYWtlQml0KCBNRVNTQUdFUVVFVUUgKnF1ZXVlLCBXT1JEIGJpdCApCiB7Ci0gICAgZHByaW50Zl9pbmZvKG1zZywiU2V0V2FrZUJpdDogcXVldWUgPSAlMDR4ICh3bT0lMDR4KSwgYml0ID0gJTA0eFxuIiwgCisgICAgVFJBQ0UobXNnLCJxdWV1ZSA9ICUwNHggKHdtPSUwNHgpLCBiaXQgPSAlMDR4XG4iLCAKIAkgICAgICAgICAgICAgICAgcXVldWUtPnNlbGYsIHF1ZXVlLT53YWtlTWFzaywgYml0ICk7CiAKICAgICBpZiAoYml0ICYgUVNfTU9VU0UpIHBNb3VzZVF1ZXVlID0gcXVldWU7CkBAIC0yNTcsNyArMjU3LDcgQEAKIHsKICAgICBNRVNTQUdFUVVFVUUgKnF1ZXVlOwogCi0gICAgZHByaW50Zl9pbmZvKG1zZywiV2FpdEJpdHM6IHEgJTA0eCB3YWl0aW5nIGZvciAlMDR4XG4iLCBHZXRUYXNrUXVldWUoMCksIGJpdHMpOworICAgIFRSQUNFKG1zZywicSAlMDR4IHdhaXRpbmcgZm9yICUwNHhcbiIsIEdldFRhc2tRdWV1ZSgwKSwgYml0cyk7CiAKICAgICBmb3IgKDs7KQogICAgIHsKQEAgLTI4MSw3ICsyODEsNyBAQAogICAgICAgICBxdWV1ZS0+d2FrZU1hc2sgPSBiaXRzIHwgUVNfU0VORE1FU1NBR0U7CiAJaWYocXVldWUtPmNoYW5nZUJpdHMgJiBiaXRzKSBjb250aW51ZTsKIAkKLQlkcHJpbnRmX2luZm8obXNnLCJ3YjogKCUwNHgpIHdha2VNYXNrIGlzICUwNHgsIHdhaXRpbmdcbiIsIHF1ZXVlLT5zZWxmLCBxdWV1ZS0+d2FrZU1hc2spOworCVRSQUNFKG1zZywiJTA0eCkgd2FrZU1hc2sgaXMgJTA0eCwgd2FpdGluZ1xuIiwgcXVldWUtPnNlbGYsIHF1ZXVlLT53YWtlTWFzayk7CiAKICAgICAgICAgV2FpdEV2ZW50KCAwICk7CiAgICAgfQpAQCAtMzAwLDEwICszMDAsMTAgQEAKICAgICBRU01DVFJMKiAgICAgIHByZXZDdHJsUHRyID0gTlVMTDsKICAgICBMUkVTVUxUICAgICAgIHJlc3VsdCA9IDA7CiAKLSAgICBkcHJpbnRmX2luZm8obXNnLCAiUmVjZWl2ZU1lc3NhZ2UsIHF1ZXVlICUwNHhcbiIsIHF1ZXVlLT5zZWxmICk7CisgICAgVFJBQ0UobXNnLCAiUmVjZWl2ZU1lc3NhZ2UsIHF1ZXVlICUwNHhcbiIsIHF1ZXVlLT5zZWxmICk7CiAgICAgaWYgKCEocXVldWUtPndha2VCaXRzICYgUVNfU0VORE1FU1NBR0UpIHx8CiAgICAgICAgICEoc2VuZGVyUSA9IChNRVNTQUdFUVVFVUUqKUdsb2JhbExvY2sxNiggcXVldWUtPmhTZW5kaW5nVGFzaykpKSAKLQl7IGRwcmludGZfaW5mbyhtc2csIlx0cmNtOiBub3RoaW5nIHRvIGRvXG4iKTsgcmV0dXJuOyB9CisJeyBUUkFDRShtc2csIlx0cmNtOiBub3RoaW5nIHRvIGRvXG4iKTsgcmV0dXJuOyB9CiAKICAgICBpZiggIXNlbmRlclEtPmhQcmV2U2VuZGluZ1Rhc2sgKQogICAgIHsKQEAgLTMyMCwxMSArMzIwLDExIEBACiAgICAgcXVldWUtPnNtUmVzdWx0Q3VycmVudCAgICAgPSBzZW5kZXJRLT5zbVJlc3VsdEluaXQ7CiAgICAgcXVldWUtPmhTZW5kaW5nVGFzawkgICAgICAgPSBzZW5kZXJRLT5oUHJldlNlbmRpbmdUYXNrOwogCi0gICAgZHByaW50Zl9pbmZvKG1zZywgIlx0cmNtOiBzbVJlc3VsdEN1cnJlbnQgPSAlMDh4LCBwcmV2Q3RybCA9ICUwOHhcbiIsIAorICAgIFRSQUNFKG1zZywgIlx0cmNtOiBzbVJlc3VsdEN1cnJlbnQgPSAlMDh4LCBwcmV2Q3RybCA9ICUwOHhcbiIsIAogCQkJCSh1bnNpZ25lZClxdWV1ZS0+c21SZXN1bHRDdXJyZW50LCAodW5zaWduZWQpcHJldkN0cmxQdHIgKTsKICAgICBRVUVVRV9TZXRXYWtlQml0KCBzZW5kZXJRLCBRU19TTVBBUkFNU0ZSRUUgKTsKIAotICAgIGRwcmludGZfaW5mbyhtc2csICJcdHJjbTogY2FsbGluZyB3bmRwcm9jIC0gJTA0eCAlMDR4ICUwNHglMDR4ICUwOHhcbiIsCisgICAgVFJBQ0UobXNnLCAiXHRyY206IGNhbGxpbmcgd25kcHJvYyAtICUwNHggJTA0eCAlMDR4JTA0eCAlMDh4XG4iLAogICAgICAgICAgICAgICAgIHNlbmRlclEtPmhXbmQsIHNlbmRlclEtPm1zZywgc2VuZGVyUS0+d1BhcmFtSGlnaCwKICAgICAgICAgICAgICAgICBzZW5kZXJRLT53UGFyYW0sICh1bnNpZ25lZClzZW5kZXJRLT5sUGFyYW0gKTsKIApAQCAtMzM3LDcgKzMzNyw3IEBACiAgICAgICAgIGlmIChzZW5kZXJRLT5mbGFncyAmIFFVRVVFX1NNX1dJTjMyKQogICAgICAgICB7CiAgICAgICAgICAgICBXUEFSQU0zMiB3UGFyYW0gPSBNQUtFTE9ORyggc2VuZGVyUS0+d1BhcmFtLCBzZW5kZXJRLT53UGFyYW1IaWdoICk7Ci0gICAgICAgICAgICBkcHJpbnRmX2luZm8obXNnLCAiXHRyY206IG1zZyBpcyBXaW4zMlxuIiApOworICAgICAgICAgICAgVFJBQ0UobXNnLCAiXHRyY206IG1zZyBpcyBXaW4zMlxuIiApOwogICAgICAgICAgICAgaWYgKHNlbmRlclEtPmZsYWdzICYgUVVFVUVfU01fVU5JQ09ERSkKICAgICAgICAgICAgICAgICByZXN1bHQgPSBDYWxsV2luZG93UHJvYzMyVyggd25kUHRyLT53aW5wcm9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXJRLT5oV25kLCBzZW5kZXJRLT5tc2csCkBAIC0zNTMsOSArMzUzLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRlclEtPndQYXJhbSwgc2VuZGVyUS0+bFBhcmFtICk7CiAKICAgICAgICAgcXVldWUtPkdldE1lc3NhZ2VFeHRyYUluZm9WYWwgPSBleHRyYUluZm87ICAvKiBSZXN0b3JlIGV4dHJhIGluZm8gKi8KLQlkcHJpbnRmX2luZm8obXNnLCJcdHJjbTogcmVzdWx0ID0gICUwOHhcbiIsICh1bnNpZ25lZClyZXN1bHQgKTsKKwlUUkFDRShtc2csIlx0cmNtOiByZXN1bHQgPSAgJTA4eFxuIiwgKHVuc2lnbmVkKXJlc3VsdCApOwogICAgIH0KLSAgICBlbHNlIGRwcmludGZfd2Fybihtc2csICJcdHJjbTogYmFkIGhXbmRcbiIpOworICAgIGVsc2UgV0FSTihtc2csICJcdHJjbTogYmFkIGhXbmRcbiIpOwogCiAgICAgLyogUmV0dXJuIHRoZSByZXN1bHQgdG8gdGhlIHNlbmRlciB0YXNrICovCiAgICAgUmVwbHlNZXNzYWdlMTYoIHJlc3VsdCApOwpAQCAtMzYzLDcgKzM2Myw3IEBACiAgICAgcXVldWUtPkluU2VuZE1lc3NhZ2VIYW5kbGUgPSBwcmV2U2VuZGVyOwogICAgIHF1ZXVlLT5zbVJlc3VsdEN1cnJlbnQgICAgID0gcHJldkN0cmxQdHI7CiAKLSAgICBkcHJpbnRmX2luZm8obXNnLCJSZWNlaXZlTWVzc2FnZTogZG9uZSFcbiIpOworICAgIFRSQUNFKG1zZywiZG9uZSFcbiIpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTQ0Nyw3ICs0NDcsNyBAQAogewogICAgIGludCBpLCBwb3MgPSBtc2dRdWV1ZS0+bmV4dE1lc3NhZ2U7CiAKLSAgICBkcHJpbnRmX2luZm8obXNnLCJRVUVVRV9GaW5kTXNnOiBod25kPSUwNHggcG9zPSVkXG4iLCBod25kLCBwb3MgKTsKKyAgICBUUkFDRShtc2csImh3bmQ9JTA0eCBwb3M9JWRcbiIsIGh3bmQsIHBvcyApOwogCiAgICAgaWYgKCFtc2dRdWV1ZS0+bXNnQ291bnQpIHJldHVybiAtMTsKICAgICBpZiAoIWh3bmQgJiYgIWZpcnN0ICYmICFsYXN0KSByZXR1cm4gcG9zOwpAQCAtNTM4LDcgKzUzOCw3IEBACiAgICAgICB9CiAgICAgICBpZiggIXF1ZXVlICkKICAgICAgIHsgCi0gICAgICAgIGRwcmludGZfd2Fybihtc2csICJXYWtlU29tZW9uZTogY291bGRuJ3QgZmluZCBxdWV1ZVxuIik7IAorICAgICAgICBXQVJOKG1zZywgImNvdWxkbid0IGZpbmQgcXVldWVcbiIpOyAKICAgICAgICAgcmV0dXJuOyAKICAgICAgIH0KICAgICB9CkBAIC03MzQsMTMgKzczNCwxMyBAQAogICAgIEhRVUVVRTE2IGhRdWV1ZSwgaE5ld1F1ZXVlOwogICAgIE1FU1NBR0VRVUVVRSAqcXVldWVQdHI7CiAKLSAgICBkcHJpbnRmX2luZm8obXNnLCJTZXRNZXNzYWdlUXVldWU6IHRhc2sgJTA0eCBzaXplICVpXG4iLCBHZXRDdXJyZW50VGFzaygpLCBzaXplKTsgCisgICAgVFJBQ0UobXNnLCJ0YXNrICUwNHggc2l6ZSAlaVxuIiwgR2V0Q3VycmVudFRhc2soKSwgc2l6ZSk7IAogCiAgICAgaWYgKChzaXplID4gTUFYX1FVRVVFX1NJWkUpIHx8IChzaXplIDw9IDApKSByZXR1cm4gVFJVRTsKIAogICAgIGlmKCAhKGhOZXdRdWV1ZSA9IFFVRVVFX0NyZWF0ZU1zZ1F1ZXVlKCBzaXplICkpKSAKICAgICB7Ci0JZHByaW50Zl93YXJuKG1zZywgIlNldE1lc3NhZ2VRdWV1ZTogZmFpbGVkIVxuIik7CisJV0FSTihtc2csICJmYWlsZWQhXG4iKTsKIAlyZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIHF1ZXVlUHRyID0gKE1FU1NBR0VRVUVVRSAqKUdsb2JhbExvY2sxNiggaE5ld1F1ZXVlICk7CmRpZmYgLS1naXQgYS93aW5kb3dzL3Njcm9sbC5jIGIvd2luZG93cy9zY3JvbGwuYwppbmRleCBjNjU2ZDU3Li45NjgyMDgyIDEwMDY0NAotLS0gYS93aW5kb3dzL3Njcm9sbC5jCisrKyBiL3dpbmRvd3Mvc2Nyb2xsLmMKQEAgLTUwLDcgKzUwLDcgQEAKICAgICBIV05EMzIgCWhDYXJldFduZCA9IENBUkVUX0dldEh3bmQoKTsKICAgICBXTkQqCXduZFNjcm9sbCA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7CiAKLSAgICBkcHJpbnRmX2luZm8oc2Nyb2xsLCJTY3JvbGxXaW5kb3c6IGh3bmQ9JTA0eCwgZHg9JWQsIGR5PSVkLCBscFJlY3QgPSVwIGNsaXBSZWN0PSVpLCVpLCVpLCVpXG4iLCAKKyAgICBUUkFDRShzY3JvbGwsImh3bmQ9JTA0eCwgZHg9JWQsIGR5PSVkLCBscFJlY3QgPSVwIGNsaXBSZWN0PSVpLCVpLCVpLCVpXG4iLCAKICAgICAgICAgICAgICAgICAgICBod25kLCBkeCwgZHksIHJlY3QsCiAgICAgICAgICAgICAgICAgICAgY2xpcFJlY3QgPyBjbGlwUmVjdC0+bGVmdCA6IDAsCiAgICAgICAgICAgICAgICAgICAgY2xpcFJlY3QgPyBjbGlwUmVjdC0+dG9wIDogMCwKQEAgLTEwNSw3ICsxMDUsNyBAQAogICAgIH0KIAogICAgIFBBSU5UX1JlZHJhd1dpbmRvdyggaHduZCwgTlVMTCwgaHJnblVwZGF0ZSwgUkRXX0FMTENISUxEUkVOIHwKLQkJCSAgICBSRFdfSU5WQUxJREFURSwgUkRXX0NfVVNFSFJHTiApOworICAgICAgICAgICAgICAgICBSRFdfSU5WQUxJREFURSB8IFJEV19FUkFTRSB8IFJEV19FUkFTRU5PVywgUkRXX0NfVVNFSFJHTiApOwogCiAgICAgRGVsZXRlT2JqZWN0MzIoIGhyZ25VcGRhdGUgKTsKICAgICBpZiggaENhcmV0V25kICkgCkBAIC0xNTYsNyArMTU2LDcgQEAKICAgICBJTlQzMiAgbGR4LCBsZHk7CiAgICAgREMgKmRjID0gKERDICopR0RJX0dldE9ialB0cihoZGMsIERDX01BR0lDKTsKIAotICAgIGRwcmludGZfaW5mbyhzY3JvbGwsIlNjcm9sbERDOiAlMDR4ICVkLCVkIGhyZ25VcGRhdGU9JTA0eCByY1VwZGF0ZSA9ICVwIGNsaXByYyA9ICglZCwlZC0lZCwlZCksIHJjPSglZCwlZC0lZCwlZClcbiIsCisgICAgVFJBQ0Uoc2Nyb2xsLCIlMDR4ICVkLCVkIGhyZ25VcGRhdGU9JTA0eCByY1VwZGF0ZSA9ICVwIGNsaXByYyA9ICglZCwlZC0lZCwlZCksIHJjPSglZCwlZC0lZCwlZClcbiIsCiAgICAgICAgICAgICAgICAgICAgKEhEQzE2KWhkYywgZHgsIGR5LCBocmduVXBkYXRlLCByY1VwZGF0ZSwgCiAJCSAgIHByTENsaXAgPyBwckxDbGlwLT5sZWZ0IDogMCwgcHJMQ2xpcCA/IHByTENsaXAtPnRvcCA6IDAsIHByTENsaXAgPyBwckxDbGlwLT5yaWdodCA6IDAsIHByTENsaXAgPyBwckxDbGlwLT5ib3R0b20gOiAwLAogCQkgICByYyA/IHJjLT5sZWZ0IDogMCwgcmMgPyByYy0+dG9wIDogMCwgcmMgPyByYy0+cmlnaHQgOiAwLCByYyA/IHJjLT5ib3R0b20gOiAwICk7CkBAIC0zNzMsNyArMzczLDcgQEAKIAlCT09MMzIgIGJVcGRhdGUgPSAocmNVcGRhdGUgfHwgaHJnblVwZGF0ZSB8fCBmbGFncyAmIChTV19JTlZBTElEQVRFIHwgU1dfRVJBU0UpKTsKIAlIUkdOMzIgIGhyZ25DbGlwID0gQ3JlYXRlUmVjdFJnbkluZGlyZWN0MzIoJmNsaXByYyk7CiAKLWRwcmludGZfaW5mbyhzY3JvbGwsIlNjcm9sbFdpbmRvd0V4OiAlMDR4LCAlZCwlZCBocmduVXBkYXRlPSUwNHggcmNVcGRhdGUgPSAlcCBcCitUUkFDRShzY3JvbGwsIiUwNHgsICVkLCVkIGhyZ25VcGRhdGU9JTA0eCByY1VwZGF0ZSA9ICVwIFwKIGNsaXByYyA9ICglZCwlZC0lZCwlZCksIHJjPSglZCwlZC0lZCwlZCkgJTA0eFxuIiwgICAgICAgICAgICAgCiAoSFdORDE2KWh3bmQsIGR4LCBkeSwgaHJnblVwZGF0ZSwgcmNVcGRhdGUsCiBjbGlwUmVjdD9jbGlwUmVjdC0+bGVmdDowLCBjbGlwUmVjdD9jbGlwUmVjdC0+dG9wOjAsIGNsaXBSZWN0P2NsaXBSZWN0LT5yaWdodDowLCBjbGlwUmVjdD9jbGlwUmVjdC0+Ym90dG9tOjAsCmRpZmYgLS1naXQgYS93aW5kb3dzL3RpbWVyLmMgYi93aW5kb3dzL3RpbWVyLmMKaW5kZXggNDUyNDU3My4uYTE0YWE2YSAxMDA2NDQKLS0tIGEvd2luZG93cy90aW1lci5jCisrKyBiL3dpbmRvd3MvdGltZXIuYwpAQCAtMjAwLDcgKzIwMCw3IEBACiAgICAgaWYgKCFwVGltZXIgfHwgKHBUaW1lci0+ZXhwaXJlcyA+IGN1clRpbWUpKSByZXR1cm4gRkFMU0U7IC8qIE5vIHRpbWVyICovCiAgICAgaWYgKHJlbW92ZSkJVElNRVJfUmVzdGFydFRpbWVyKCBwVGltZXIsIGN1clRpbWUgKTsgIC8qIFJlc3RhcnQgaXQgKi8KIAotICAgIGRwcmludGZfaW5mbyh0aW1lciwgIlRpbWVyIGV4cGlyZWQ6ICUwNHgsICUwNHgsICUwNHgsICUwOGx4XG4iLCAKKyAgICBUUkFDRSh0aW1lciwgIlRpbWVyIGV4cGlyZWQ6ICUwNHgsICUwNHgsICUwNHgsICUwOGx4XG4iLCAKIAkJICAgcFRpbWVyLT5od25kLCBwVGltZXItPm1zZywgcFRpbWVyLT5pZCwgKERXT1JEKXBUaW1lci0+cHJvYyk7CiAKICAgICAgIC8qIEJ1aWxkIHRoZSBtZXNzYWdlICovCkBAIC0yNjIsNyArMjYyLDcgQEAKICAgICBwVGltZXItPmV4cGlyZXMgPSBHZXRUaWNrQ291bnQoKSArIHRpbWVvdXQ7CiAgICAgcFRpbWVyLT5wcm9jICAgID0gKEhXSU5ET1dQUk9DKTA7CiAgICAgaWYgKHByb2MpIFdJTlBST0NfU2V0UHJvYyggJnBUaW1lci0+cHJvYywgcHJvYywgdHlwZSwgV0lOX1BST0NfVElNRVIgKTsKLSAgICBkcHJpbnRmX2luZm8odGltZXIsICJUaW1lciBhZGRlZDogJXAsICUwNHgsICUwNHgsICUwNHgsICUwOGx4XG4iLCAKKyAgICBUUkFDRSh0aW1lciwgIlRpbWVyIGFkZGVkOiAlcCwgJTA0eCwgJTA0eCwgJTA0eCwgJTA4bHhcbiIsIAogCQkgICBwVGltZXIsIHBUaW1lci0+aHduZCwgcFRpbWVyLT5tc2csIHBUaW1lci0+aWQsCiAgICAgICAgICAgICAgICAgICAgKERXT1JEKXBUaW1lci0+cHJvYyApOwogICAgIFRJTUVSX0luc2VydFRpbWVyKCBwVGltZXIgKTsKQEAgLTMwMiw3ICszMDIsNyBAQAogVUlOVDE2IFdJTkFQSSBTZXRUaW1lcjE2KCBIV05EMTYgaHduZCwgVUlOVDE2IGlkLCBVSU5UMTYgdGltZW91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNRVJQUk9DMTYgcHJvYyApCiB7Ci0gICAgZHByaW50Zl9pbmZvKHRpbWVyLCAiU2V0VGltZXIxNjogJTA0eCAlZCAlZCAlMDhseFxuIiwKKyAgICBUUkFDRSh0aW1lciwgIiUwNHggJWQgJWQgJTA4bHhcbiIsCiAgICAgICAgICAgICAgICAgICAgaHduZCwgaWQsIHRpbWVvdXQsIChMT05HKXByb2MgKTsKICAgICByZXR1cm4gVElNRVJfU2V0VGltZXIoIGh3bmQsIGlkLCB0aW1lb3V0LCAoV05EUFJPQzE2KXByb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5fUFJPQ18xNiwgRkFMU0UgKTsKQEAgLTMxNSw3ICszMTUsNyBAQAogVUlOVDMyIFdJTkFQSSBTZXRUaW1lcjMyKCBIV05EMzIgaHduZCwgVUlOVDMyIGlkLCBVSU5UMzIgdGltZW91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNRVJQUk9DMzIgcHJvYyApCiB7Ci0gICAgZHByaW50Zl9pbmZvKHRpbWVyLCAiU2V0VGltZXIzMjogJTA0eCAlZCAlZCAlMDhseFxuIiwKKyAgICBUUkFDRSh0aW1lciwgIiUwNHggJWQgJWQgJTA4bHhcbiIsCiAgICAgICAgICAgICAgICAgICAgaHduZCwgaWQsIHRpbWVvdXQsIChMT05HKXByb2MgKTsKICAgICByZXR1cm4gVElNRVJfU2V0VGltZXIoIGh3bmQsIGlkLCB0aW1lb3V0LCAoV05EUFJPQzE2KXByb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5fUFJPQ18zMkEsIEZBTFNFICk7CkBAIC0zMjgsNyArMzI4LDcgQEAKIFVJTlQxNiBXSU5BUEkgU2V0U3lzdGVtVGltZXIxNiggSFdORDE2IGh3bmQsIFVJTlQxNiBpZCwgVUlOVDE2IHRpbWVvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVSUFJPQzE2IHByb2MgKQogewotICAgIGRwcmludGZfaW5mbyh0aW1lciwgIlNldFN5c3RlbVRpbWVyMTY6ICUwNHggJWQgJWQgJTA4bHhcbiIsIAorICAgIFRSQUNFKHRpbWVyLCAiJTA0eCAlZCAlZCAlMDhseFxuIiwgCiAgICAgICAgICAgICAgICAgICAgaHduZCwgaWQsIHRpbWVvdXQsIChMT05HKXByb2MgKTsKICAgICByZXR1cm4gVElNRVJfU2V0VGltZXIoIGh3bmQsIGlkLCB0aW1lb3V0LCAoV05EUFJPQzE2KXByb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5fUFJPQ18xNiwgVFJVRSApOwpAQCAtMzQxLDcgKzM0MSw3IEBACiBVSU5UMzIgV0lOQVBJIFNldFN5c3RlbVRpbWVyMzIoIEhXTkQzMiBod25kLCBVSU5UMzIgaWQsIFVJTlQzMiB0aW1lb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1FUlBST0MzMiBwcm9jICkKIHsKLSAgICBkcHJpbnRmX2luZm8odGltZXIsICJTZXRTeXN0ZW1UaW1lcjMyOiAlMDR4ICVkICVkICUwOGx4XG4iLCAKKyAgICBUUkFDRSh0aW1lciwgIiUwNHggJWQgJWQgJTA4bHhcbiIsIAogICAgICAgICAgICAgICAgICAgIGh3bmQsIGlkLCB0aW1lb3V0LCAoTE9ORylwcm9jICk7CiAgICAgcmV0dXJuIFRJTUVSX1NldFRpbWVyKCBod25kLCBpZCwgdGltZW91dCwgKFdORFBST0MxNilwcm9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lOX1BST0NfMzJBLCBUUlVFICk7CkBAIC0zNTMsNyArMzUzLDcgQEAKICAqLwogQk9PTDE2IFdJTkFQSSBLaWxsVGltZXIxNiggSFdORDE2IGh3bmQsIFVJTlQxNiBpZCApCiB7Ci0gICAgZHByaW50Zl9pbmZvKHRpbWVyLCAiS2lsbFRpbWVyMTY6ICUwNHggJWRcbiIsIGh3bmQsIGlkICk7CisgICAgVFJBQ0UodGltZXIsICIlMDR4ICVkXG4iLCBod25kLCBpZCApOwogICAgIHJldHVybiBUSU1FUl9LaWxsVGltZXIoIGh3bmQsIGlkLCBGQUxTRSApOwogfQogCkBAIC0zNjMsNyArMzYzLDcgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBLaWxsVGltZXIzMiggSFdORDMyIGh3bmQsIFVJTlQzMiBpZCApCiB7Ci0gICAgZHByaW50Zl9pbmZvKHRpbWVyLCAiS2lsbFRpbWVyMzI6ICUwNHggJWRcbiIsIGh3bmQsIGlkICk7CisgICAgVFJBQ0UodGltZXIsICIlMDR4ICVkXG4iLCBod25kLCBpZCApOwogICAgIHJldHVybiBUSU1FUl9LaWxsVGltZXIoIGh3bmQsIGlkLCBGQUxTRSApOwogfQogCkBAIC0zNzMsNyArMzczLDcgQEAKICAqLwogQk9PTDE2IFdJTkFQSSBLaWxsU3lzdGVtVGltZXIxNiggSFdORDE2IGh3bmQsIFVJTlQxNiBpZCApCiB7Ci0gICAgZHByaW50Zl9pbmZvKHRpbWVyLCAiS2lsbFN5c3RlbVRpbWVyMTY6ICUwNHggJWRcbiIsIGh3bmQsIGlkICk7CisgICAgVFJBQ0UodGltZXIsICIlMDR4ICVkXG4iLCBod25kLCBpZCApOwogICAgIHJldHVybiBUSU1FUl9LaWxsVGltZXIoIGh3bmQsIGlkLCBUUlVFICk7CiB9CiAKQEAgLTM4Myw2ICszODMsNiBAQAogICovCiBCT09MMzIgV0lOQVBJIEtpbGxTeXN0ZW1UaW1lcjMyKCBIV05EMzIgaHduZCwgVUlOVDMyIGlkICkKIHsKLSAgICBkcHJpbnRmX2luZm8odGltZXIsICJLaWxsU3lzdGVtVGltZXIzMjogJTA0eCAlZFxuIiwgaHduZCwgaWQgKTsKKyAgICBUUkFDRSh0aW1lciwgIiUwNHggJWRcbiIsIGh3bmQsIGlkICk7CiAgICAgcmV0dXJuIFRJTUVSX0tpbGxUaW1lciggaHduZCwgaWQsIFRSVUUgKTsKIH0KZGlmZiAtLWdpdCBhL3dpbmRvd3MvdXNlci5jIGIvd2luZG93cy91c2VyLmMKaW5kZXggZjdhZWEwMS4uMWM0MjEzMSAxMDA2NDQKLS0tIGEvd2luZG93cy91c2VyLmMKKysrIGIvd2luZG93cy91c2VyLmMKQEAgLTMyNSwzICszMjUsMjggQEAKIAlmcHJpbnRmKHN0ZGVyciwgIlNldEV2ZW50SG9vayhscGZuRXZlbnRIb29rID0gJTA4eCk6IHN0dWIgIVxuIiwgKFVJTlQzMilscGZuRXZlbnRIb29rKTsKIAlyZXR1cm4gTlVMTDsKIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgVXNlclNlZVVzZXJEbyAgIChVU0VSLjIxNikKKyAqLworRFdPUkQgV0lOQVBJIFVzZXJTZWVVc2VyRG8oV09SRCB3UmVxVHlwZSwgV09SRCB3UGFyYW0xLCBXT1JEIHdQYXJhbTIsIFdPUkQgd1BhcmFtMykKK3sKKyAgICBzd2l0Y2ggKHdSZXFUeXBlKQorICAgIHsKKyAgICBjYXNlIFVTVURfTE9DQUxBTExPQzoKKyAgICAgICAgcmV0dXJuIExPQ0FMX0FsbG9jKFVTRVJfSGVhcFNlbCwgd1BhcmFtMSwgd1BhcmFtMyk7CisgICAgY2FzZSBVU1VEX0xPQ0FMRlJFRToKKyAgICAgICAgcmV0dXJuIExPQ0FMX0ZyZWUoVVNFUl9IZWFwU2VsLCB3UGFyYW0xKTsKKyAgICBjYXNlIFVTVURfTE9DQUxDT01QQUNUOgorICAgICAgICByZXR1cm4gTE9DQUxfQ29tcGFjdChVU0VSX0hlYXBTZWwsIHdQYXJhbTMsIDApOworICAgIGNhc2UgVVNVRF9MT0NBTEhFQVA6CisgICAgICAgIHJldHVybiBVU0VSX0hlYXBTZWw7CisgICAgY2FzZSBVU1VEX0ZJUlNUQ0xBU1M6CisgICAgICAgIEZJWE1FKGxvY2FsLCAicmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZmlyc3Qgd2luZG93IGNsYXNzLlxuIik7IAorICAgICAgICByZXR1cm4gKERXT1JEKS0xOworICAgIGRlZmF1bHQ6CisgICAgICAgIFdBUk4obG9jYWwsICJ3UmVxVHlwZSAlMDR4ICh1bmtub3duKSIsIHdSZXFUeXBlKTsKKyAgICAgICAgcmV0dXJuIChEV09SRCktMTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3dpbmRvd3Mvd2luLmMgYi93aW5kb3dzL3dpbi5jCmluZGV4IGQ0MzFiNTEuLmUwNDEyZGIgMTAwNjQ0Ci0tLSBhL3dpbmRvd3Mvd2luLmMKKysrIGIvd2luZG93cy93aW4uYwpAQCAtMjM1LDcgKzIzNSw3IEBACiAgICAgewogICAgICAgICBpZiAoIShwV25kLT5kd1N0eWxlICYgV1NfVklTSUJMRSkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGRwcmludGZfaW5mbyh3aW4sICJGaW5kV2luVG9SZXBhaW50OiBza2lwcGluZyB3aW5kb3cgJTA0eFxuIiwKKyAgICAgICAgICAgIFRSQUNFKHdpbiwgInNraXBwaW5nIHdpbmRvdyAlMDR4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgIHBXbmQtPmh3bmRTZWxmICk7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQpAQCAtMjU4LDcgKzI1OCw3IEBACiAgICAgICAgIHBXbmQgPSBwV25kLT5uZXh0OwogICAgIH0KICAgICBpZiAocFduZCkgaHduZFJldCA9IHBXbmQtPmh3bmRTZWxmOwotICAgIGRwcmludGZfaW5mbyh3aW4sIkZpbmRXaW5Ub1JlcGFpbnQ6IGZvdW5kICUwNHhcbiIsaHduZFJldCk7CisgICAgVFJBQ0Uod2luLCJmb3VuZCAlMDR4XG4iLGh3bmRSZXQpOwogICAgIHJldHVybiBod25kUmV0OwogfQogCkBAIC0yNzMsNyArMjczLDcgQEAKICAgICBIV05EMzIgaHduZCA9IHduZFB0ci0+aHduZFNlbGY7CiAgICAgV05EICpwV25kOwogCi0gICAgZHByaW50Zl9pbmZvKHdpbiwgIldJTl9EZXN0cm95V2luZG93OiAlMDR4XG4iLCB3bmRQdHItPmh3bmRTZWxmICk7CisgICAgVFJBQ0Uod2luLCAiJTA0eFxuIiwgd25kUHRyLT5od25kU2VsZiApOwogCiAjaWZkZWYgQ09ORklHX0lQQwogICAgIGlmIChtYWluX2Jsb2NrKQpAQCAtNDAzLDcgKzQwMyw3IEBACiAgICAgQ0xBU1MgKmNsYXNzOwogICAgIEhXTkQzMiBod25kRGVza3RvcDsKIAotICAgIGRwcmludGZfaW5mbyh3aW4sIkNyZWF0aW5nIGRlc2t0b3Agd2luZG93XG4iKTsKKyAgICBUUkFDRSh3aW4sIkNyZWF0aW5nIGRlc2t0b3Agd2luZG93XG4iKTsKIAogICAgIGlmICghSUNPTlRJVExFX0luaXQoKSB8fAogCSFXSU5QT1NfQ3JlYXRlSW50ZXJuYWxQb3NBdG9tKCkgfHwKQEAgLTQ2Nyw3ICs0NjcsNyBAQAogICAgIFBPSU5UMzIgbWF4U2l6ZSwgbWF4UG9zLCBtaW5UcmFjaywgbWF4VHJhY2s7CiAgICAgTFJFU1VMVCAoV0lOQVBJICpsb2NhbFNlbmQzMikoSFdORDMyLCBVSU5UMzIsIFdQQVJBTTMyLCBMUEFSQU0pOwogCi0gICAgZHByaW50Zl9pbmZvKHdpbiwgIkNyZWF0ZVdpbmRvd0V4OiAlcyAlcyAlMDhseCAlMDhseCAlZCwlZCAlZHglZCAiCisgICAgVFJBQ0Uod2luLCAiJXMgJXMgJTA4bHggJTA4bHggJWQsJWQgJWR4JWQgIgogCQkgIiUwNHggJTA0eCAlMDh4ICVwXG4iLCBkZWJ1Z3Jlcyhjcy0+bHBzek5hbWUpLCAKIAkJIGRlYnVncmVzKGNzLT5scHN6Q2xhc3MpLCBjcy0+ZHdFeFN0eWxlLCAKIAkJIGNzLT5zdHlsZSwgY3MtPngsIGNzLT55LCBjcy0+Y3gsIGNzLT5jeSwKQEAgLTUxNSw3ICs1MTUsNyBAQAogICAgIGlmICghKGh3bmQgPSBVU0VSX0hFQVBfQUxMT0MoIHNpemVvZigqd25kUHRyKSArIGNsYXNzUHRyLT5jYlduZEV4dHJhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBzaXplb2Yod25kUHRyLT53RXh0cmEpICkpKQogICAgIHsKLQlkcHJpbnRmX2luZm8od2luLCAiQ3JlYXRlV2luZG93RXg6IG91dCBvZiBtZW1vcnlcbiIgKTsKKwlUUkFDRSh3aW4sICJvdXQgb2YgbWVtb3J5XG4iICk7CiAJcmV0dXJuIDA7CiAgICAgfQogCkBAIC01NzQsNyArNTc0LDcgQEAKIAljYnRjLmh3bmRJbnNlcnRBZnRlciA9IGh3bmRMaW5rQWZ0ZXI7CiAJaWYgKCBIT09LX0NhbGxIb29rczMyQShXSF9DQlQsIEhDQlRfQ1JFQVRFV05ELCBod25kLCAoTFBBUkFNKSZjYnRjKSApCiAJewotCSAgICBkcHJpbnRmX2luZm8od2luLCAiQ3JlYXRlV2luZG93RXg6IENCVC1ob29rIHJldHVybmVkIDBcbiIpOworCSAgICBUUkFDRSh3aW4sICJDQlQtaG9vayByZXR1cm5lZCAwXG4iKTsKIAkgICAgVVNFUl9IRUFQX0ZSRUUoIGh3bmQgKTsKIAkgICAgcmV0dXJuIDA7CiAJfQpAQCAtNzc2LDE0ICs3NzYsMTQgQEAKICAgICAgICAgICAgIGlmICghKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0NISUxEKSAmJiAhd25kUHRyLT5vd25lcikKICAgICAgICAgICAgICAgICBIT09LX0NhbGxIb29rczE2KCBXSF9TSEVMTCwgSFNIRUxMX1dJTkRPV0NSRUFURUQsIGh3bmQsIDAgKTsKIAotICAgICAgICAgICAgZHByaW50Zl9pbmZvKHdpbiwgIkNyZWF0ZVdpbmRvd0V4OiBjcmVhdGVkIHdpbmRvdyAlMDR4XG4iLCBod25kKTsKKyAgICAgICAgICAgIFRSQUNFKHdpbiwgImNyZWF0ZWQgd2luZG93ICUwNHhcbiIsIGh3bmQpOwogICAgICAgICAgICAgcmV0dXJuIGh3bmQ7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKiBBYm9ydCB3aW5kb3cgY3JlYXRpb24gKi8KIAotICAgIGRwcmludGZfd2Fybih3aW4sICJDcmVhdGVXaW5kb3dFeDogYWJvcnRlZCBieSBXTV94eENSRUFURSFcbiIpOworICAgIFdBUk4od2luLCAiYWJvcnRlZCBieSBXTV94eENSRUFURSFcbiIpOwogICAgIFdJTl9VbmxpbmtXaW5kb3coIGh3bmQgKTsKICAgICBXSU5fRGVzdHJveVdpbmRvdyggd25kUHRyICk7CiAgICAgcmV0dXJuIDA7CkBAIC05NjUsNyArOTY1LDcgQEAKIAlXSU5fQ2hlY2tGb2N1cyhwV25kKTsKICAgICB9CiAgICAgZWxzZQotCWRwcmludGZfd2Fybih3aW4sICJcdGRlc3Ryb3llZCBpdHNlbGYgd2hpbGUgaW4gV01fREVTVFJPWSFcbiIpOworCVdBUk4od2luLCAiXHRkZXN0cm95ZWQgaXRzZWxmIHdoaWxlIGluIFdNX0RFU1RST1khXG4iKTsKIH0KIAogCkBAIC05ODUsNyArOTg1LDcgQEAKIHsKICAgICBXTkQgKiB3bmRQdHI7CiAKLSAgICBkcHJpbnRmX2luZm8od2luLCAiRGVzdHJveVdpbmRvdyglMDR4KVxuIiwgaHduZCk7CisgICAgVFJBQ0Uod2luLCAiKCUwNHgpXG4iLCBod25kKTsKICAgICAKICAgICAgIC8qIEluaXRpYWxpemF0aW9uICovCiAKQEAgLTExODgsNyArMTE4OCw3IEBACiB7CiAgICAgQVRPTSBhdG9tID0gMDsKIAotICAgIGRwcmludGZfaW5mbyh3aW4sICJGaW5kV2luZG93RXgxNjogJTA0eCAlMDR4ICclcycgJyVzJ1xuIiwgcGFyZW50LAorICAgIFRSQUNFKHdpbiwgIiUwNHggJTA0eCAnJXMnICclcydcbiIsIHBhcmVudCwKIAkJY2hpbGQsIEhJV09SRChjbGFzc05hbWUpPyhjaGFyICopUFRSX1NFR19UT19MSU4oY2xhc3NOYW1lKToiIiwKIAkJdGl0bGUgPyB0aXRsZSA6ICIiKTsKIApAQCAtMjIzOSw3ICsyMjM5LDcgQEAKIHsKICAgICBXTkQgKnduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGhXbmQpOwogCi0gICAgZHByaW50Zl9pbmZvKHdpbiwiRmxhc2hXaW5kb3c6ICUwNHhcbiIsIGhXbmQpOworICAgIFRSQUNFKHdpbiwiJTA0eFxuIiwgaFduZCk7CiAKICAgICBpZiAoIXduZFB0cikgcmV0dXJuIEZBTFNFOwogCkBAIC0yMjgyLDcgKzIyODIsNyBAQAogewogICAgIEhXTkQzMiBoV25kT2xkTW9kYWwgPSBod25kU3lzTW9kYWw7CiAgICAgaHduZFN5c01vZGFsID0gaFduZDsKLSAgICBkcHJpbnRmX2ZpeG1lKHdpbiwgIkVNUFRZIFNUVUIgISEgU2V0U3lzTW9kYWxXaW5kb3coJTA0eCkgIVxuIiwgaFduZCk7CisgICAgRklYTUUod2luLCAiRU1QVFkgU1RVQiAhISBTZXRTeXNNb2RhbFdpbmRvdyglMDR4KSAhXG4iLCBoV25kKTsKICAgICByZXR1cm4gaFduZE9sZE1vZGFsOwogfQogCkBAIC0yMzQwLDcgKzIzNDAsNyBAQAogCiAJIGlmKHB0clduZCkKICAgICAgICAgIHsKLQkgICAgZHByaW50Zl9pbmZvKG1zZywiRHJhZ1F1ZXJ5VXBkYXRlOiBod25kID0gJTA0eCwgJWQgJWQgLSAlZCAlZFxuIiwKKwkgICAgVFJBQ0UobXNnLCJod25kID0gJTA0eCwgJWQgJWQgLSAlZCAlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIHB0clduZC0+aHduZFNlbGYsIHB0clduZC0+cmVjdFdpbmRvdy5sZWZ0LCBwdHJXbmQtPnJlY3RXaW5kb3cudG9wLAogCQkJcHRyV25kLT5yZWN0V2luZG93LnJpZ2h0LCBwdHJXbmQtPnJlY3RXaW5kb3cuYm90dG9tICk7CiAgICAgICAgICAgICBpZiggIShwdHJXbmQtPmR3U3R5bGUgJiBXU19ESVNBQkxFRCkgKQpAQCAtMjQ3OSw3ICsyNDc5LDcgQEAKIAlscERyYWdJbmZvLT5wdCA9IG1zZy5wdDsKIAogCS8qIHVwZGF0ZSBEUkFHSU5GTyBzdHJ1Y3QgKi8KLQlkcHJpbnRmX2luZm8obXNnLCJkcmFnOiBscERJLT5oU2NvcGUgPSAlMDR4XG4iLGxwRHJhZ0luZm8tPmhTY29wZSk7CisJVFJBQ0UobXNnLCJscERJLT5oU2NvcGUgPSAlMDR4XG4iLGxwRHJhZ0luZm8tPmhTY29wZSk7CiAKIAlpZiggRFJBR19RdWVyeVVwZGF0ZShod25kU2NvcGUsIHNwRHJhZ0luZm8sIEZBTFNFKSA+IDAgKQogCSAgICBoQ3VycmVudEN1cnNvciA9IGhDdXJzb3I7CmRpZmYgLS1naXQgYS93aW5kb3dzL3dpbnBvcy5jIGIvd2luZG93cy93aW5wb3MuYwppbmRleCA1M2I0ZWQ1Li43NjAzODA3IDEwMDY0NAotLS0gYS93aW5kb3dzL3dpbnBvcy5jCisrKyBiL3dpbmRvd3Mvd2lucG9zLmMKQEAgLTg1LDcgKzg1LDcgQEAKICAgICBpZiggaHduZCA9PSBod25kQWN0aXZlICkKICAgICB7CiAJaHduZEFjdGl2ZSA9IDA7IAotCWRwcmludGZfd2Fybih3aW4sICJcdGF0dGVtcHQgdG8gYWN0aXZhdGUgZGVzdHJveWVkIHdpbmRvdyFcbiIpOworCVdBUk4od2luLCAiXHRhdHRlbXB0IHRvIGFjdGl2YXRlIGRlc3Ryb3llZCB3aW5kb3chXG4iKTsKICAgICB9CiAKICAgICBpZiggbHBQb3MgKQpAQCAtNzIzLDcgKzcyMyw3IEBACiB7ICAgIAogICAgIGludCBmbGFncyA9IFNXUF9OT1pPUkRFUiB8IFNXUF9OT0FDVElWQVRFOwogICAgIGlmICghcmVwYWludCkgZmxhZ3MgfD0gU1dQX05PUkVEUkFXOwotICAgIGRwcmludGZfaW5mbyh3aW4sICJNb3ZlV2luZG93OiAlMDR4ICVkLCVkICVkeCVkICVkXG4iLCAKKyAgICBUUkFDRSh3aW4sICIlMDR4ICVkLCVkICVkeCVkICVkXG4iLCAKIAkgICAgaHduZCwgeCwgeSwgY3gsIGN5LCByZXBhaW50ICk7CiAgICAgcmV0dXJuIFNldFdpbmRvd1BvczMyKCBod25kLCAwLCB4LCB5LCBjeCwgY3ksIGZsYWdzICk7CiB9CkBAIC03ODksNyArNzg5LDcgQEAKICAgICB7CiAJSFdORDE2IGhXbmQgPSBscFBvcy0+aHduZEljb25UaXRsZTsKIAotCWRwcmludGZfaW5mbyh3aW4sIlNob3dJY29uVGl0bGU6IDB4JTA0eCAlaVxuIiwgcFduZC0+aHduZFNlbGYsIChiU2hvdyAhPSAwKSApOworCVRSQUNFKHdpbiwiMHglMDR4ICVpXG4iLCBwV25kLT5od25kU2VsZiwgKGJTaG93ICE9IDApICk7CiAKIAlpZiggIWhXbmQgKQogCSAgICBscFBvcy0+aHduZEljb25UaXRsZSA9IGhXbmQgPSBJQ09OVElUTEVfQ3JlYXRlKCBwV25kICk7CkBAIC04NjYsNyArODY2LDcgQEAKIAogICAgICAgLyogU29tZSBzYW5pdHkgY2hlY2tzICovCiAKLSAgICBkcHJpbnRmX2luZm8od2luLCJHZXRNaW5NYXhJbmZvOiAlZCAlZCAvICVkICVkIC8gJWQgJWQgLyAlZCAlZFxuIiwKKyAgICBUUkFDRSh3aW4sIiVkICVkIC8gJWQgJWQgLyAlZCAlZCAvICVkICVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgIE1pbk1heC5wdE1heFNpemUueCwgTWluTWF4LnB0TWF4U2l6ZS55LAogICAgICAgICAgICAgICAgICAgICAgIE1pbk1heC5wdE1heFBvc2l0aW9uLngsIE1pbk1heC5wdE1heFBvc2l0aW9uLnksCiAgICAgICAgICAgICAgICAgICAgICAgTWluTWF4LnB0TWF4VHJhY2tTaXplLngsIE1pbk1heC5wdE1heFRyYWNrU2l6ZS55LApAQCAtODk3LDcgKzg5Nyw3IEBACiAgICAgTFBJTlRFUk5BTFBPUyBscFBvcyA9IFdJTlBPU19Jbml0SW50ZXJuYWxQb3MoIHduZFB0ciwgc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnduZFB0ci0+cmVjdFdpbmRvdyApOwogCi0gICAgZHByaW50Zl9pbmZvKHdpbiwiTWluTWF4aW1pemU6IDB4JTA0eCAldVxuIiwgd25kUHRyLT5od25kU2VsZiwgY21kICk7CisgICAgVFJBQ0Uod2luLCIweCUwNHggJXVcbiIsIHduZFB0ci0+aHduZFNlbGYsIGNtZCApOwogCiAgICAgaWYgKGxwUG9zICYmICFIT09LX0NhbGxIb29rczE2KFdIX0NCVCwgSENCVF9NSU5NQVgsIHduZFB0ci0+aHduZFNlbGYsIGNtZCkpCiAgICAgewpAQCAtOTk1LDcgKzk5NSw3IEBACiAKICAgICBpZiAoIXduZFB0cikgcmV0dXJuIEZBTFNFOwogCi0gICAgZHByaW50Zl9pbmZvKHdpbiwiU2hvd1dpbmRvdzogaHduZD0lMDR4LCBjbWQ9JWRcbiIsIGh3bmQsIGNtZCk7CisgICAgVFJBQ0Uod2luLCJod25kPSUwNHgsIGNtZD0lZFxuIiwgaHduZCwgY21kKTsKIAogICAgIHdhc1Zpc2libGUgPSAod25kUHRyLT5kd1N0eWxlICYgV1NfVklTSUJMRSkgIT0gMDsKIApAQCAtMTM3Myw3ICsxMzczLDcgQEAKICAgICBpZiggKHduZFRlbXAgPSBXSU5fRmluZFduZFB0cihod25kQWN0aXZlKSkgKQogCXdJY29uaXplZCA9IEhJV09SRCh3bmRUZW1wLT5kd1N0eWxlICYgV1NfTUlOSU1JWkUpOwogICAgIGVsc2UKLQlkcHJpbnRmX2luZm8od2luLCJXSU5QT1NfQWN0aXZhdGVXaW5kb3c6IG5vIGN1cnJlbnQgYWN0aXZlIHdpbmRvdy5cbiIpOworCVRSQUNFKHdpbiwibm8gY3VycmVudCBhY3RpdmUgd2luZG93LlxuIik7CiAKICAgICAvKiBjYWxsIENCVCBob29rIGNoYWluICovCiAgICAgaWYgKChjYnRTdHJ1Y3QgPSBTRUdQVFJfTkVXKENCVEFDVElWQVRFU1RSVUNUMTYpKSkKQEAgLTE2MTUsNyArMTYxNSw3IEBACiAgICAgfQogICAgIHJlc3VsdCA9IFNlbmRNZXNzYWdlMzJBKCBod25kLCBXTV9OQ0NBTENTSVpFLCBjYWxjVmFsaWRSZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBBUkFNKSZwYXJhbXMgKTsKLSAgICBkcHJpbnRmX2luZm8od2luLCAiV0lOUE9TX1NlbmROQ0NhbGNTaXplOiAlZCwlZC0lZCwlZFxuIiwKKyAgICBUUkFDRSh3aW4sICIlZCwlZC0lZCwlZFxuIiwKICAgICAgICAgICAgICAgICAgcGFyYW1zLnJncmNbMF0ubGVmdCwgcGFyYW1zLnJncmNbMF0udG9wLAogICAgICAgICAgICAgICAgICBwYXJhbXMucmdyY1swXS5yaWdodCwgcGFyYW1zLnJncmNbMF0uYm90dG9tICk7CiAgICAgKm5ld0NsaWVudFJlY3QgPSBwYXJhbXMucmdyY1swXTsKQEAgLTE4MTUsMTYgKzE4MTUsMTYgQEAKICBIUkdOMzIgZGlydHlSZ24gPSBDcmVhdGVSZWN0UmduMzIoMCwwLDAsMCk7CiAgaW50ICBvdGhlciwgbXk7CiAKLSBkcHJpbnRmX2luZm8od2luLCJjbGVhbmluZyB1cC4uLm5ldyB3bmQ9KCVpICVpLSVpICVpKSBvbGQgd25kPSglaSAlaS0laSAlaSlcblwKLVx0XHRuZXcgY2xpZW50PSglaSAlaS0laSAlaSkgb2xkIGNsaWVudD0oJWkgJWktJWkgJWkpXG4iLAotICAgICAgICAgICAgIFduZC0+cmVjdFdpbmRvdy5sZWZ0LCBXbmQtPnJlY3RXaW5kb3cudG9wLAotICAgICAgICAgICAgIFduZC0+cmVjdFdpbmRvdy5yaWdodCwgV25kLT5yZWN0V2luZG93LmJvdHRvbSwKLSAgICAgICAgICAgICBscE9sZFduZFJlY3QtPmxlZnQsIGxwT2xkV25kUmVjdC0+dG9wLAotICAgICAgICAgICAgIGxwT2xkV25kUmVjdC0+cmlnaHQsIGxwT2xkV25kUmVjdC0+Ym90dG9tLAotICAgICAgICAgICAgIFduZC0+cmVjdENsaWVudC5sZWZ0LCBXbmQtPnJlY3RDbGllbnQudG9wLAotICAgICAgICAgICAgIFduZC0+cmVjdENsaWVudC5yaWdodCwgV25kLT5yZWN0Q2xpZW50LmJvdHRvbSwKLSAgICAgICAgICAgICBscE9sZENsaWVudFJlY3QtPmxlZnQsIGxwT2xkQ2xpZW50UmVjdC0+dG9wLAotICAgICAgICAgICAgIGxwT2xkQ2xpZW50UmVjdC0+cmlnaHQsbHBPbGRDbGllbnRSZWN0LT5ib3R0b20gKTsKKyBUUkFDRSh3aW4sImNsZWFuaW5nIHVwLi4ubmV3IHduZD0oJWkgJWktJWkgJWkpIG9sZCB3bmQ9KCVpICVpLSVpICVpKVxuIiwKKwkgICAgICBXbmQtPnJlY3RXaW5kb3cubGVmdCwgV25kLT5yZWN0V2luZG93LnRvcCwKKwkgICAgICBXbmQtPnJlY3RXaW5kb3cucmlnaHQsIFduZC0+cmVjdFdpbmRvdy5ib3R0b20sCisJICAgICAgbHBPbGRXbmRSZWN0LT5sZWZ0LCBscE9sZFduZFJlY3QtPnRvcCwKKwkgICAgICBscE9sZFduZFJlY3QtPnJpZ2h0LCBscE9sZFduZFJlY3QtPmJvdHRvbSk7CisgVFJBQ0Uod2luLCJcdG5ldyBjbGllbnQ9KCVpICVpLSVpICVpKSBvbGQgY2xpZW50PSglaSAlaS0laSAlaSlcbiIsCisJICAgICAgV25kLT5yZWN0Q2xpZW50LmxlZnQsIFduZC0+cmVjdENsaWVudC50b3AsCisJICAgICAgV25kLT5yZWN0Q2xpZW50LnJpZ2h0LCBXbmQtPnJlY3RDbGllbnQuYm90dG9tLAorCSAgICAgIGxwT2xkQ2xpZW50UmVjdC0+bGVmdCwgbHBPbGRDbGllbnRSZWN0LT50b3AsCisJICAgICAgbHBPbGRDbGllbnRSZWN0LT5yaWdodCxscE9sZENsaWVudFJlY3QtPmJvdHRvbSApOwogCiAgaWYoIChscE9sZFduZFJlY3QtPnJpZ2h0IC0gbHBPbGRXbmRSZWN0LT5sZWZ0KSAhPSAoV25kLT5yZWN0V2luZG93LnJpZ2h0IC0gV25kLT5yZWN0V2luZG93LmxlZnQpIHx8CiAgICAgIChscE9sZFduZFJlY3QtPmJvdHRvbSAtIGxwT2xkV25kUmVjdC0+dG9wKSAhPSAoV25kLT5yZWN0V2luZG93LmJvdHRvbSAtIFduZC0+cmVjdFdpbmRvdy50b3ApICkKQEAgLTIwNTUsNyArMjA1NSw3IEBACiAgICAgaW50IAlyZXN1bHQgPSAwOwogICAgIFVJTlQzMiAJdUZsYWdzID0gMDsKIAotICAgIGRwcmludGZfaW5mbyh3aW4sIlNldFdpbmRvd1BvczogaHduZCAlMDR4LCAoJWksJWkpLSglaSwlaSkgZmxhZ3MgJTA4eFxuIiwgCisgICAgVFJBQ0Uod2luLCJod25kICUwNHgsICglaSwlaSktKCVpLCVpKSBmbGFncyAlMDh4XG4iLCAKIAkJCQkJCSBod25kLCB4LCB5LCB4K2N4LCB5K2N5LCBmbGFncyk7ICAKICAgICAgIC8qIENoZWNrIHdpbmRvdyBoYW5kbGUgKi8KIApAQCAtMjE5MCwxNiArMjE5MCwxNCBAQAogCiAgICAgICAgICAvKiBGSVhNRTogV1ZSX0FMSUdOeHh4ICovCiAKLSAgICAgICAgIGlmKCAhKHdpbnBvcy5mbGFncyAmIFNXUF9OT01PVkUpICYmCi0JICAgICAobmV3Q2xpZW50UmVjdC5sZWZ0ICE9IHduZFB0ci0+cmVjdENsaWVudC5sZWZ0IHx8Ci0JICAgICAgbmV3Q2xpZW50UmVjdC50b3AgIT0gd25kUHRyLT5yZWN0Q2xpZW50LnRvcCkgKQorICAgICAgICAgaWYoIG5ld0NsaWVudFJlY3QubGVmdCAhPSB3bmRQdHItPnJlY3RDbGllbnQubGVmdCB8fAorICAgICAgICAgICAgIG5ld0NsaWVudFJlY3QudG9wICE9IHduZFB0ci0+cmVjdENsaWVudC50b3AgKQogICAgICAgICAgICAgIHdpbnBvcy5mbGFncyAmPSB+U1dQX05PQ0xJRU5UTU9WRTsKIAotICAgICAgICAgaWYoICEod2lucG9zLmZsYWdzICYgU1dQX05PU0laRSkgJiYKLQkgICAgICgobmV3Q2xpZW50UmVjdC5yaWdodCAtIG5ld0NsaWVudFJlY3QubGVmdCAhPQotCSAgICAgICB3bmRQdHItPnJlY3RDbGllbnQucmlnaHQgLSB3bmRQdHItPnJlY3RDbGllbnQubGVmdCkgfHwKLQkgICAgICAobmV3Q2xpZW50UmVjdC5ib3R0b20gLSBuZXdDbGllbnRSZWN0LnRvcCAhPQotCSAgICAgICB3bmRQdHItPnJlY3RDbGllbnQuYm90dG9tIC0gd25kUHRyLT5yZWN0Q2xpZW50LnRvcCkpICkKKyAgICAgICAgIGlmKCAobmV3Q2xpZW50UmVjdC5yaWdodCAtIG5ld0NsaWVudFJlY3QubGVmdCAhPQorICAgICAgICAgICAgICB3bmRQdHItPnJlY3RDbGllbnQucmlnaHQgLSB3bmRQdHItPnJlY3RDbGllbnQubGVmdCkgfHwKKwkgICAgIChuZXdDbGllbnRSZWN0LmJvdHRvbSAtIG5ld0NsaWVudFJlY3QudG9wICE9CisJICAgICAgd25kUHRyLT5yZWN0Q2xpZW50LmJvdHRvbSAtIHduZFB0ci0+cmVjdENsaWVudC50b3ApICkKIAkgICAgIHdpbnBvcy5mbGFncyAmPSB+U1dQX05PQ0xJRU5UU0laRTsKICAgICB9CiAgICAgZWxzZQpAQCAtMjM5OCw3ICsyMzk2LDcgQEAKIAogICAgICAgLyogQW5kIGxhc3QsIHNlbmQgdGhlIFdNX1dJTkRPV1BPU0NIQU5HRUQgbWVzc2FnZSAqLwogCi0gICAgZHByaW50Zl9pbmZvKHdpbiwiXHRzdGF0dXMgZmxhZ3MgPSAlMDR4XG4iLCB3aW5wb3MuZmxhZ3MgJiBTV1BfQUdHX1NUQVRVU0ZMQUdTKTsKKyAgICBUUkFDRSh3aW4sIlx0c3RhdHVzIGZsYWdzID0gJTA0eFxuIiwgd2lucG9zLmZsYWdzICYgU1dQX0FHR19TVEFUVVNGTEFHUyk7CiAKICAgICBpZiAoICgod2lucG9zLmZsYWdzICYgU1dQX0FHR19TVEFUVVNGTEFHUykgIT0gU1dQX0FHR19OT1BPU0NIQU5HRSkgJiYgCiAJICEod2lucG9zLmZsYWdzICYgU1dQX05PU0VORENIQU5HSU5HKSkKZGlmZiAtLWdpdCBhL3dpbmRvd3Mvd2lucHJvYy5jIGIvd2luZG93cy93aW5wcm9jLmMKaW5kZXggMTQ3NGE3Ny4uM2I2MjdkZSAxMDA2NDQKLS0tIGEvd2luZG93cy93aW5wcm9jLmMKKysrIGIvd2luZG93cy93aW5wcm9jLmMKQEAgLTExNCw3ICsxMTQsNyBAQAogc3RhdGljIExSRVNVTFQgV0lOUFJPQ19DYWxsV25kUHJvYzMyKCBXTkRQUk9DMzIgcHJvYywgSFdORDMyIGh3bmQsIFVJTlQzMiBtc2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSApCiB7Ci0gICAgZHByaW50Zl9pbmZvKHJlbGF5LCAiQ2FsbFRvMzIod25kcHJvYz0lcCxod25kPSUwOHgsbXNnPSUwOHgsd3A9JTA4eCxscD0lMDhseClcbiIsCisgICAgVFJBQ0UocmVsYXksICIod25kcHJvYz0lcCxod25kPSUwOHgsbXNnPSUwOHgsd3A9JTA4eCxscD0lMDhseClcbiIsCiAgICAgICAgICAgICAgICAgICAgcHJvYywgaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSApOwogICAgIHJldHVybiBwcm9jKCBod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtICk7CiB9CkBAIC0yMjQsNyArMjI0LDcgQEAKICAgICAgICAgcHJvYy0+dXNlciAgPSB1c2VyOwogICAgIH0KICAgICBwcm9jLT5uZXh0ICA9IE5VTEw7Ci0gICAgZHByaW50Zl9pbmZvKHdpbiwgIldJTlBST0NfQWxsb2NXaW5Qcm9jKCUwOHgsJWQpOiByZXR1cm5pbmcgJTA4eFxuIiwKKyAgICBUUkFDRSh3aW4sICIoJTA4eCwlZCk6IHJldHVybmluZyAlMDh4XG4iLAogICAgICAgICAgICAgICAgICAoVUlOVDMyKWZ1bmMsIHR5cGUsIChVSU5UMzIpcHJvYyApOwogICAgIHJldHVybiBwcm9jOwogfQpAQCAtMzM5LDcgKzMzOSw3IEBACiAKICAgICAvKiBBZGQgdGhlIHdpbiBwcm9jIGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0ICovCiAKLSAgICBkcHJpbnRmX2luZm8od2luLCAiV0lOUFJPQ19TZXRQcm9jKCUwOHgsJTA4eCwlZCk6IHJlcz0lMDh4XG4iLAorICAgIFRSQUNFKHdpbiwgIiglMDh4LCUwOHgsJWQpOiByZXM9JTA4eFxuIiwKICAgICAgICAgICAgICAgICAgKFVJTlQzMikqcEZpcnN0LCAoVUlOVDMyKWZ1bmMsIHR5cGUsIChVSU5UMzIpcHJvYyApOwogICAgIHByb2MtPm5leHQgID0gKihXSU5ET1dQUk9DICoqKXBGaXJzdDsKICAgICAqKFdJTkRPV1BST0MgKiopcEZpcnN0ID0gcHJvYzsKQEAgLTM1OCw3ICszNTgsNyBAQAogICAgIHsKICAgICAgICAgV0lORE9XUFJPQyAqbmV4dCA9ICgoV0lORE9XUFJPQyAqKXByb2MpLT5uZXh0OwogICAgICAgICBpZiAoKChXSU5ET1dQUk9DICopcHJvYyktPnVzZXIgIT0gdXNlcikgYnJlYWs7Ci0gICAgICAgIGRwcmludGZfaW5mbyh3aW4sICJXSU5QUk9DX0ZyZWVQcm9jOiBmcmVlaW5nICUwOHhcbiIsIChVSU5UMzIpcHJvYyk7CisgICAgICAgIFRSQUNFKHdpbiwgImZyZWVpbmcgJTA4eFxuIiwgKFVJTlQzMilwcm9jKTsKICAgICAgICAgSGVhcEZyZWUoIFdpblByb2NIZWFwLCAwLCBwcm9jICk7CiAgICAgICAgIHByb2MgPSBuZXh0OwogICAgIH0K