ZGlmZiAtLWdpdCBhL0FOTk9VTkNFIGIvQU5OT1VOQ0UKaW5kZXggMTBkYzU3Ni4uMWMwMzM2OSAxMDA2NDQKLS0tIGEvQU5OT1VOQ0UKKysrIGIvQU5OT1VOQ0UKQEAgLTEsMTMgKzEsMTMgQEAKLVRoaXMgaXMgcmVsZWFzZSA5NzAyMTUgb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKK1RoaXMgaXMgcmVsZWFzZSA5NzAzMDUgb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKIGRldmVsb3BlcidzIG9ubHkgcmVsZWFzZS4gIFRoZXJlIGFyZSBtYW55IGJ1Z3MgYW5kIG1hbnkgdW5pbXBsZW1lbnRlZCBBUEkKIGZlYXR1cmVzLiAgTW9zdCBhcHBsaWNhdGlvbnMgc3RpbGwgZG8gbm90IHdvcmsgY29ycmVjdGx5LgogCiBQYXRjaGVzIHNob3VsZCBiZSBzdWJtaXR0ZWQgdG8gImp1bGxpYXJkQGxyYy5lcGZsLmNoIi4gIFBsZWFzZSBkb24ndAogZm9yZ2V0IHRvIGluY2x1ZGUgYSBDaGFuZ2VMb2cgZW50cnkuCiAKLVdIQVQnUyBORVcgd2l0aCBXaW5lLTk3MDIxNTogKHNlZSBDaGFuZ2VMb2cgZm9yIGRldGFpbHMpCi0JLSBNYW55IG1vcmUgV2luMzIgZnVuY3Rpb25zLgotCS0gSHVuZ2FyaWFuIGxhbmd1YWdlIHN1cHBvcnQuCitXSEFUJ1MgTkVXIHdpdGggV2luZS05NzAzMDU6IChzZWUgQ2hhbmdlTG9nIGZvciBkZXRhaWxzKQorCS0gQ29tcGxldGVkIHRyYW5zaXRpb24gdG8gbmV3IFdpbjMyIHR5cGVzLgorCS0gUG9saXNoIGxhbmd1YWdlIHN1cHBvcnQuCiAJLSBMb3RzIG9mIGJ1ZyBmaXhlcy4KIAogU2VlIHRoZSBSRUFETUUgZmlsZSBpbiB0aGUgZGlzdHJpYnV0aW9uIGZvciBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zLgpAQCAtMTYsMTAgKzE2LDEwIEBACiB0aGUgcmVsZWFzZSBpcyBhdmFpbGFibGUgYXQgdGhlIGZ0cCBzaXRlcy4gIFRoZSBzb3VyY2VzIHdpbGwgYmUgYXZhaWxhYmxlCiBmcm9tIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOgogCi0gIGZ0cDovL3N1bnNpdGUudW5jLmVkdS9wdWIvTGludXgvQUxQSEEvd2luZS9kZXZlbG9wbWVudC9XaW5lLTk3MDIxNS50YXIuZ3oKLSAgZnRwOi8vdHN4LTExLm1pdC5lZHUvcHViL2xpbnV4L0FMUEhBL1dpbmUvZGV2ZWxvcG1lbnQvV2luZS05NzAyMTUudGFyLmd6Ci0gIGZ0cDovL2Z0cC5pbmZvbWFnaWMuY29tL3B1Yi9taXJyb3JzL2xpbnV4L3dpbmUvZGV2ZWxvcG1lbnQvV2luZS05NzAyMTUudGFyLmd6Ci0gIGZ0cDovL2FyaXMuY29tL3B1Yi9saW51eC9BTFBIQS9XaW5lL2RldmVsb3BtZW50L1dpbmUtOTcwMjE1LnRhci5negorICBmdHA6Ly9zdW5zaXRlLnVuYy5lZHUvcHViL0xpbnV4L0FMUEhBL3dpbmUvZGV2ZWxvcG1lbnQvV2luZS05NzAzMDUudGFyLmd6CisgIGZ0cDovL3RzeC0xMS5taXQuZWR1L3B1Yi9saW51eC9BTFBIQS9XaW5lL2RldmVsb3BtZW50L1dpbmUtOTcwMzA1LnRhci5negorICBmdHA6Ly9mdHAuaW5mb21hZ2ljLmNvbS9wdWIvbWlycm9ycy9saW51eC93aW5lL2RldmVsb3BtZW50L1dpbmUtOTcwMzA1LnRhci5negorICBmdHA6Ly9hcmlzLmNvbS9wdWIvbGludXgvQUxQSEEvV2luZS9kZXZlbG9wbWVudC9XaW5lLTk3MDMwNS50YXIuZ3oKIAogSXQgc2hvdWxkIGFsc28gYmUgYXZhaWxhYmxlIGZyb20gYW55IHNpdGUgdGhhdCBtaXJyb3JzIHRzeC0xMSBvciBzdW5zaXRlLgogCmRpZmYgLS1naXQgYS9DaGFuZ2VMb2cgYi9DaGFuZ2VMb2cKaW5kZXggMmI0OTJiZi4uM2E3MjJiNiAxMDA2NDQKLS0tIGEvQ2hhbmdlTG9nCisrKyBiL0NoYW5nZUxvZwpAQCAtMSw0ICsxLDEwNCBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU3VuIE1hciAgMiAxNDo1NzozNyAxOTk3ICBBbGV4YW5kcmUgSnVsbGlhcmQgIDxqdWxsaWFyZEBscmMuZXBmbC5jaD4KKworCSogWyovKl0KKwlDb21wbGV0ZWQgdHJhbnNpdGlvbiB0byBuZXcgV2luMzIgdHlwZXMuCisKKwkqIFt0b29scy9idWlsZC5jXQorCUNoYW5nZWQgQ2FsbFRvMTZfcmVncyB0byB0YWtlIGEgQ09OVEVYVCBhcmd1bWVudC4KKworCSogW21lbW9yeS92aXJ0dWFsLmNdCisJUmV3cm90ZSBWaXJ0dWFsKiBmdW5jdGlvbnMuIEltcGxlbWVudGVkIENyZWF0ZUZpbGVNYXBwaW5nIGFuZAorCU9wZW5GaWxlTWFwcGluZy4gQnJva2UgTWFwVmlld09mRmlsZSA7LSkKKworCSogW3dpbjMyL2szMm9iai5jXQorCUltcGxlbWVudGVkIG5hbWVkIG9iamVjdHMuCisKK1N1biBNYXIgIDIgMDA6MzM6MjEgMTk5NyAgTWlrb2xhaiBaYWxld3NraSA8em1pa29sYWpAZnJlZS5wb2xib3gucGw+CisKKwkqIFttaXNjL29sZTJubHMuY10gW3Jlc291cmNlcy9zeXNyZXNfUGwuY10KKwlBZGRlZCBQb2xpc2ggbGFuZ3VhZ2Ugc3VwcG9ydC4KKworU2F0IE1hciAgMSAxMzozMToyNSAxOTk3ICBEYXZpZCBGYXVyZSA8ZGF2aWQuZmF1cmVAaWZoYW15Lmluc2EtbHlvbi5mcj4KKworCSogW3dpbmRvd3Mva2V5Ym9hcmQuY10KKwlXcm90ZSBWa0tleVNjYW4gYW5kIHRlc3RlZCB3aXRoIFdpbndvcmQuIFdvcmtzIG9rIGV4Y2VwdCBmb3IgZGVhZAorCWNoYXJzLgorCitGcmkgRmViIDI4IDA5OjM0OjAzIDE5OTcgIEpvaG4gSGFydmV5IDxqb2huQGRpdmlzaW9uLmNvLnVrPgorCisJKiBbZ3JhcGhpY3Mvd2luMTZkcnYvZm9udC5jXSBbZ3JhcGhpY3Mvd2luMTZkcnYvaW5pdC5jXQorCSAgW2dyYXBoaWNzL3dpbjE2ZHJ2L29iZWN0cy5jXQorCUFkZGVkIHN0YXJ0IG9mIFNlbGVjdE9iamVjdCBjYWxsIGZvciBwcmludGVyIGRyaXZlci4gV3JpdGUgc2hvdWxkCisJbm93IHJ1biB3aXRoIHRoZSBwcmludGVyIGRyaXZlciBlbmFibGVkLgorCitXZWQgRmViIDI2IDIwOjAzOjMyIDE5OTcgIE1hcmN1cyBNZWlzc25lciA8bXNtZWlzc25AY2lwLmluZm9ybWF0aWsudW5pLWVybGFuZ2VuLmRlPgorCisJKiBbZGVidWdnZXIvKi5jXQorCVJlLWFkZGVkIGEgZGlzYXNzZW1ibHkgY29tbWFuZCAobGlzdCBzZXJ2ZXMgYW5vdGhlciBmdW5jdGlvbmFsaXR5CisJbm93KS4KKworCSogW2xvYWRlci9wZV9yZXNvdXJjZS5jXQorCUFkZGVkICMgc3VwcG9ydC4KKworCSogW21pc2Mvb2xlMm5scy5jXQorCUdldFN0cmluZ1R5cGUqIGFkZGVkLgorCisJKiBbb2JqZWN0cy9jb2xvci5jXQorCVZHQTE2IGZpeGVzLgorCisJKiBbd2luZG93cy9jbGFzcy5jXQorCUxvb2sgZm9yIGdsb2JhbCB3aWRnZXQgY2xhc3NlcyB0b28gaW4gR2V0Q2xhc3NJbmZvMzIuCisKKwkqIFt3aW5kb3dzL3N5c21ldHJpY3MuY10gW2luY2x1ZGUvd2luZG93cy5oXQorCUFkZGVkIFdpbjMyIHN5c21ldHJpY3MuCisKK1NhdCBGZWIgMjIgMjM6NTY6MjkgMTk5NyAgSnVra2EgSWl2b25lbiA8aWl2b25lbkBjYy5oZWxzaW5raS5maT4KKworCSogW2RvY3VtZW50YXRpb24vbGFuZ3VhZ2VzXQorCVRoZSBmb3VydGggY2FzZSB1cGRhdGVkLgorCisJKiBbaWYxNjMyL250ZGxsLnNwZWNdCisJQWRkZWQgc29tZSBpcyogYW5kIHRvKiBmdW5jdGlvbnMuCisKK1NhdCBGZWIgMjIgMjM6MDU6NDcgMTk5NyAgTW9ydGVuIFdlbGluZGVyICA8dGVycmFAZGlrdS5kaz4KKworCSogW2NvbmZpZ3VyZS5pbl0KKwlBZGQgdGVzdHMgZm9yIHdhaXQ0IGFuZCB3YWl0cGlkLgorCisJKiBbbG9hZGVyL3NpZ25hbC5jXQorCUNsZWFuIHVwIE9TLWRlcGVuZGVudCBjb2RlLiAgSSBob3BlIEkgZ290IGl0IHJpZ2h0LCA6LSkKKworCSogW3Rvb2xzL3dpbmVjb25mXQorCVJlY29nbmlzZSB2ZmF0IGZpbGUgc3lzdGVtcy4gIElnbm9yZSBmbG9wcHkgZHJpdmVzIHNwZWNpZmllZCBpbgorCS9ldGMvZnN0YWIuCisKKwkqIFtmaWxlcy8qXQorCUZpeCBmdW5jdGlvbiBuYW1lcyBpbiBlcnJvciBtZXNzYWdlcy4KKworU2F0IEZlYiAyMiAwNjoxNToxMyAxOTk3ICBQYWJsbyBTYXJhdHhhZ2EgPHNydHhnQGNoYW5hZS5zdGJlbi5iZT4KKworCSogW3dpbmRvd3Mva2V5Ym9hcmQuY10gW3dpbmRvd3MvbWVzc2FnZS5jXQorCVN1cHBvcnQgZm9yIG1vcmUgbGF0aW4gYWxwaGFiZXQgZGVhZCBrZXlzIGZvciBpc28tODg1OS17MSwyLDMsNCw5fQorCWNoYXJhY3RlcnMgc2V0cy4KKworRnJpIEZlYiAyMSAyMDozNzo1MCAxOTk3ICBIdXcgRCBNIERhdmllcyA8aC5kYXZpZXMxQHBoeXNpY3Mub3hmb3JkLmFjLnVrPgorCisJKiBbY29udHJvbHMvZWRpdC5jXQorCUZpeCBpbmNvcnJlY3QgYXJnIG9yZGVyIGluIExPQ0FMX0FsbG9jKCkgY2FsbC4KKworRnJpIEZlYiAyMSAxODoxOToxNyAxOTk3ICBBbmRyZXcgVGF5bG9yICA8YW5kcmV3QHJpc2Nhbi5jb20+CisKKwkqIFttdWx0aW1lZGlhL21tc3lzdGVtLmNdIFttdWx0aW1lZGlhL21jaXN0cmluZy5jXQorCUZpeGVkIGJ1ZyByZWxhdGVkIHRvIGRldmljZSBJRHMgcmV0dXJuZWQgYnkgbXVsdGltZWRpYQorCXN5c3RlbS4gIEltcGxlbWVudGVkIG1jaUdldERldmljZUlELgorCitTYXQgRmViIDE1IDAwOjU4OjE5IDE5OTcgIEppbWVuIENoaW5nICA8amNoaW5nQGFsb2hhLmNvbT4KKworCSogW2RlYnVnZ2VyL2RiZy55XQorCURvIG5vdCBkZXJlZmVyZW5jZSBpbnZhbGlkIGV4cHJlc3Npb25zLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTYXQgRmViIDE1IDExOjU5OjE3IDE5OTcgIEFsZXhhbmRyZSBKdWxsaWFyZCAgPGp1bGxpYXJkQGxyYy5lcGZsLmNoPgogCiAJKiBbKi8qXQpkaWZmIC0tZ2l0IGEvY29uZmlndXJlIGIvY29uZmlndXJlCmluZGV4IDEzNzQwYjUuLjlmZjM3MWIgMTAwNzU1Ci0tLSBhL2NvbmZpZ3VyZQorKysgYi9jb25maWd1cmUKQEAgLTIwNDMsNyArMjA0Myw3IEBACiBmaQogCiAKLWZvciBhY19mdW5jIGluIG1lbW1vdmUgdGNnZXRhdHRyIHVzbGVlcAorZm9yIGFjX2Z1bmMgaW4gbWVtbW92ZSB0Y2dldGF0dHIgdXNsZWVwIHdhaXQ0IHdhaXRwaWQKIGRvCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgogZWNobyAiY29uZmlndXJlOjIwNTA6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CmRpZmYgLS1naXQgYS9jb25maWd1cmUuaW4gYi9jb25maWd1cmUuaW4KaW5kZXggMThmODAzYy4uMTg1YTQ2NCAxMDA2NDQKLS0tIGEvY29uZmlndXJlLmluCisrKyBiL2NvbmZpZ3VyZS5pbgpAQCAtMTA0LDcgKzEwNCw3IEBACiAKIGRubCAqKioqIENoZWNrIGZvciBmdW5jdGlvbnMgYW5kIGhlYWRlciBmaWxlcyAqKioqCiAKLUFDX0NIRUNLX0ZVTkNTKG1lbW1vdmUgdGNnZXRhdHRyIHVzbGVlcCkKK0FDX0NIRUNLX0ZVTkNTKG1lbW1vdmUgdGNnZXRhdHRyIHVzbGVlcCB3YWl0NCB3YWl0cGlkKQogQUNfSEVBREVSX1NUQVQoKQogQUNfQ19DT05TVCgpCiBBQ19UWVBFX1NJWkVfVCgpCmRpZmYgLS1naXQgYS9jb250cm9scy9idXR0b24uYyBiL2NvbnRyb2xzL2J1dHRvbi5jCmluZGV4IDkyNzU5YjcuLjIwNTg4ODcgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL2J1dHRvbi5jCisrKyBiL2NvbnRyb2xzL2J1dHRvbi5jCkBAIC0zMDMsOSArMzAzLDkgQEAKICAgICAgICAgICAgIFBCX1BhaW50R3JheU9uR3JheShoREMsaW5mb1B0ci0+aEZvbnQsJnJjLHduZFB0ci0+dGV4dCk7CiAgICAgICAgIGVsc2UKICAgICAgICAgewotICAgICAgICAgICAgU2V0VGV4dENvbG9yKCBoREMsICh3bmRQdHItPmR3U3R5bGUgJiBXU19ESVNBQkxFRCkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRTeXNDb2xvcjMyKENPTE9SX0dSQVlURVhUKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFN5c0NvbG9yMzIoQ09MT1JfQlROVEVYVCkgKTsKKyAgICAgICAgICAgIFNldFRleHRDb2xvcjMyKCBoREMsICh3bmRQdHItPmR3U3R5bGUgJiBXU19ESVNBQkxFRCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0U3lzQ29sb3IzMihDT0xPUl9HUkFZVEVYVCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0U3lzQ29sb3IzMihDT0xPUl9CVE5URVhUKSApOwogICAgICAgICAgICAgRHJhd1RleHQzMkEoIGhEQywgd25kUHRyLT50ZXh0LCAtMSwgJnJjLAogICAgICAgICAgICAgICAgICAgICAgICAgIERUX1NJTkdMRUxJTkUgfCBEVF9DRU5URVIgfCBEVF9WQ0VOVEVSICk7CiAgICAgICAgICAgICAvKiBkbyB3ZSBoYXZlIHRoZSBmb2N1cz8gKi8KQEAgLTMzOCwxMCArMzM4LDEwIEBACiAKIHZvaWQgUEJfUGFpbnRHcmF5T25HcmF5KEhEQzMyIGhEQyxIRk9OVDMyIGhGb250LFJFQ1QzMiAqcmMsY2hhciAqdGV4dCkKIHsKLSAgICBzdGF0aWMgaW50IFBhdHRlcm5bXSA9IHsweEFBLDB4NTUsMHhBQSwweDU1LDB4QUEsMHg1NSwweEFBLDB4NTV9OwotICAgIEhCSVRNQVAxNiBoYm0gID0gQ3JlYXRlQml0bWFwKDgsIDgsIDEsIDEsIFBhdHRlcm4pOworICAgIHN0YXRpYyBjb25zdCBpbnQgUGF0dGVybltdID0gezB4QUEsMHg1NSwweEFBLDB4NTUsMHhBQSwweDU1LDB4QUEsMHg1NX07CisgICAgSEJJVE1BUDMyIGhibSAgPSBDcmVhdGVCaXRtYXAzMiggOCwgOCwgMSwgMSwgUGF0dGVybiApOwogICAgIEhEQzMyIGhkY01lbSA9IENyZWF0ZUNvbXBhdGlibGVEQzMyKGhEQyk7Ci0gICAgSEJJVE1BUDE2IGhibU1lbTsKKyAgICBIQklUTUFQMzIgaGJtTWVtOwogICAgIEhCUlVTSDE2IGhCcjsKICAgICBSRUNUMzIgcmVjdCxyYzI7CiAKQEAgLTM1MCw3ICszNTAsNyBAQAogICAgIHJjMj1yZWN0OwogICAgIHJlY3QubGVmdD0ocmMtPnJpZ2h0LXJlY3QucmlnaHQpLzI7ICAgICAgIC8qIGZvciBjZW50ZXJpbmcgdGV4dCBiaXRtYXAgKi8KICAgICByZWN0LnRvcD0ocmMtPmJvdHRvbS1yZWN0LmJvdHRvbSkvMjsKLSAgICBoYm1NZW0gPSBDcmVhdGVDb21wYXRpYmxlQml0bWFwKCBoREMscmVjdC5yaWdodCxyZWN0LmJvdHRvbSk7CisgICAgaGJtTWVtID0gQ3JlYXRlQ29tcGF0aWJsZUJpdG1hcDMyKCBoREMscmVjdC5yaWdodCxyZWN0LmJvdHRvbSApOwogICAgIFNlbGVjdE9iamVjdDMyKCBoZGNNZW0sIGhibU1lbSk7CiAgICAgaEJyID0gU2VsZWN0T2JqZWN0MzIoIGhkY01lbSwgQ3JlYXRlUGF0dGVybkJydXNoMzIoaGJtKSApOwogICAgIERlbGV0ZU9iamVjdDMyKCBoYm0gKTsKQEAgLTQxNyw3ICs0MTcsNyBAQAogICAgICAgICBpZiggdGV4dGxlbiAmJiBhY3Rpb24gIT0gT0RBX1NFTEVDVCApCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICh3bmRQdHItPmR3U3R5bGUgJiBXU19ESVNBQkxFRCkKLSAgICAgICAgICAgICAgICBTZXRUZXh0Q29sb3IoIGhEQywgR2V0U3lzQ29sb3IzMihDT0xPUl9HUkFZVEVYVCkgKTsKKyAgICAgICAgICAgICAgICBTZXRUZXh0Q29sb3IzMiggaERDLCBHZXRTeXNDb2xvcjMyKENPTE9SX0dSQVlURVhUKSApOwogICAgICAgICAgICAgRHJhd1RleHQxNiggaERDLCB3bmRQdHItPnRleHQsIHRleHRsZW4sICZydGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgIERUX1NJTkdMRUxJTkUgfCBEVF9WQ0VOVEVSICk7CiAgICAgICAgIH0KQEAgLTQ4Niw3ICs0ODYsNyBAQAogCiAgICAgaWYgKCF3bmRQdHItPnRleHQpIHJldHVybjsKICAgICBpZiAod25kUHRyLT5kd1N0eWxlICYgV1NfRElTQUJMRUQpCi0gICAgICAgIFNldFRleHRDb2xvciggaERDLCBHZXRTeXNDb2xvcjMyKENPTE9SX0dSQVlURVhUKSApOworICAgICAgICBTZXRUZXh0Q29sb3IzMiggaERDLCBHZXRTeXNDb2xvcjMyKENPTE9SX0dSQVlURVhUKSApOwogICAgIHJjLmxlZnQgKz0gMTA7CiAgICAgRHJhd1RleHQxNiggaERDLCB3bmRQdHItPnRleHQsIC0xLCAmcmMsIERUX1NJTkdMRUxJTkUgfCBEVF9OT0NMSVAgKTsKIH0KZGlmZiAtLWdpdCBhL2NvbnRyb2xzL2NvbWJvLmMgYi9jb250cm9scy9jb21iby5jCmluZGV4IDcyYWNhNDQuLmY4ZmNjZjggMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL2NvbWJvLmMKKysrIGIvY29udHJvbHMvY29tYm8uYwpAQCAtMzgsOCArMzgsOCBAQAogI2RlZmluZSBDQkxNTV9FREdFICAgNCAgICAvKiBkaXN0YW5jZSBpbnNpZGUgYm94IHdoaWNoIGlzIHNhbWUgYXMgbW92aW5nIG1vdXNlCiAJCQkgICAgIG91dHNpZGUgYm94LCB0byB0cmlnZ2VyIHNjcm9sbGluZyBvZiBDQkwgKi8KIAotc3RhdGljIEJPT0wgQ0JDaGVja1NpemUoSFdORDE2IGh3bmQpOwotc3RhdGljIEJPT0wgQ0JMQ2hlY2tTaXplKEhXTkQxNiBod25kKTsKK3N0YXRpYyBCT09MMzIgQ0JDaGVja1NpemUoSFdORDE2IGh3bmQpOworc3RhdGljIEJPT0wzMiBDQkxDaGVja1NpemUoSFdORDE2IGh3bmQpOwogCiBzdGF0aWMgSEJJVE1BUDE2IGhDb21ib0JpdCA9IDA7CiBzdGF0aWMgV09SRCBDQml0SGVpZ2h0LCBDQml0V2lkdGg7CkBAIC04MSw3ICs4MSw3IEBACiAgIHJldHVybiBUUlVFOwogfQogCi12b2lkIENvbWJvVXBkYXRlV2luZG93KEhXTkQxNiBod25kLCBMUEhFQURMSVNUIGxwaGwsIExQSEVBRENPTUJPIGxwaGMsIEJPT0wgcmVwYWludCkKK3ZvaWQgQ29tYm9VcGRhdGVXaW5kb3coSFdORDE2IGh3bmQsIExQSEVBRExJU1QgbHBobCwgTFBIRUFEQ09NQk8gbHBoYywgQk9PTDMyIHJlcGFpbnQpCiB7CiAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaHduZCk7CiAKQEAgLTYyOCw3ICs2MjgsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICBDQkNoZWNrU2l6ZQogICovCi1zdGF0aWMgQk9PTCBDQkNoZWNrU2l6ZShIV05EMTYgaHduZCkKK3N0YXRpYyBCT09MMzIgQ0JDaGVja1NpemUoSFdORDE2IGh3bmQpCiB7CiAgIExQSEVBRENPTUJPICBscGhjID0gQ29tYm9HZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwogICBMUEhFQURMSVNUICAgbHBobCA9IENvbWJvR2V0TGlzdEhlYWRlcihod25kKTsKQEAgLTcxMSw3ICs3MTEsNyBAQAogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBJRF9FRElUOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXBkYXRlIExJU1RCT1ggd2luZG93ICovCi0gICAgICAgICAgICAgICAgIGlkPUdldFdpbmRvd1dvcmQoaHduZCxHV1dfSUQpOworICAgICAgICAgICAgICAgICBpZCA9IEdldFdpbmRvd1dvcmQzMihod25kLEdXV19JRCk7CiAgICAgICAgICAgICAgICAgIHN3aXRjaCAoSElXT1JEKGxQYXJhbSkpCiAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgIGNhc2UgRU5fVVBEQVRFOkdldFdpbmRvd1RleHQzMkEobHBoYy0+aFduZEVkaXQsYnVmZmVyLDI1NSk7CkBAIC03ODYsNyArNzg2LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIENvbWJvV25kUHJvYwogICovCi1MUkVTVUxUIENvbWJvQm94V25kUHJvYyhIV05EMTYgaHduZCwgVUlOVCBtZXNzYWdlLCBXUEFSQU0xNiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCitMUkVTVUxUIENvbWJvQm94V25kUHJvYyhIV05EMTYgaHduZCwgVUlOVDE2IG1lc3NhZ2UsIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKICAgICBzd2l0Y2gobWVzc2FnZSkgewkKICAgICAgY2FzZSBXTV9OQ0NSRUFURTogcmV0dXJuIENCTkNDcmVhdGUoaHduZCwgd1BhcmFtLCBsUGFyYW0pOwpAQCAtMTE2NSw3ICsxMTY1LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgQ0JMQ2hlY2tTaXplCiAgKi8KLXN0YXRpYyBCT09MIENCTENoZWNrU2l6ZShIV05EMTYgaHduZCkKK3N0YXRpYyBCT09MMzIgQ0JMQ2hlY2tTaXplKEhXTkQxNiBod25kKQogewogICBMUEhFQURDT01CTyAgbHBoYyA9IENvbWJvR2V0U3RvcmFnZUhlYWRlcihod25kKTsKICAgTFBIRUFETElTVCAgIGxwaGwgPSBDb21ib0dldExpc3RIZWFkZXIoaHduZCk7CkBAIC0xMjE4LDcgKzEyMTgsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQ29tYm9MQm94V25kUHJvYwogICovCi1MUkVTVUxUIENvbWJvTEJveFduZFByb2MoSFdORDE2IGh3bmQsIFVJTlQgbWVzc2FnZSwgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQorTFJFU1VMVCBDb21ib0xCb3hXbmRQcm9jKEhXTkQxNiBod25kLCBVSU5UMTYgbWVzc2FnZSwgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewogICAgIHN3aXRjaChtZXNzYWdlKSB7CQogICAgICBjYXNlIFdNX0NSRUFURTogcmV0dXJuIENCTENyZWF0ZShod25kLCB3UGFyYW0sIGxQYXJhbSk7CmRpZmYgLS1naXQgYS9jb250cm9scy9kZXNrdG9wLmMgYi9jb250cm9scy9kZXNrdG9wLmMKaW5kZXggZGI4NzZhOC4uMjQ2NmVhNyAxMDA2NDQKLS0tIGEvY29udHJvbHMvZGVza3RvcC5jCisrKyBiL2NvbnRyb2xzL2Rlc2t0b3AuYwpAQCAtNCw3ICs0LDYgQEAKICAqIENvcHlyaWdodCAxOTk0IEFsZXhhbmRyZSBKdWxsaWFyZAogICovCiAKLSNkZWZpbmUgTk9fVFJBTlNJVElPTl9UWVBFUyAgLyogVGhpcyBmaWxlIGlzIFdpbjMyLWNsZWFuICovCiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KQEAgLTkxLDggKzkwLDggQEAKIAkgKGluZm9QdHItPmJpdG1hcFNpemUuY3kgPCByZWN0LmJvdHRvbSkpKSkKICAgICB7CiAJICAvKiBTZXQgY29sb3JzIGluIGNhc2UgcGF0dGVybiBpcyBhIG1vbm9jaHJvbWUgYml0bWFwICovCi0JU2V0QmtDb2xvciggaGRjLCBSR0IoMCwwLDApICk7Ci0JU2V0VGV4dENvbG9yKCBoZGMsIEdldFN5c0NvbG9yMzIoQ09MT1JfQkFDS0dST1VORCkgKTsKKwlTZXRCa0NvbG9yMzIoIGhkYywgUkdCKDAsMCwwKSApOworCVNldFRleHRDb2xvcjMyKCBoZGMsIEdldFN5c0NvbG9yMzIoQ09MT1JfQkFDS0dST1VORCkgKTsKIAlGaWxsUmVjdDMyKCBoZGMsICZyZWN0LCBpbmZvUHRyLT5oYnJ1c2hQYXR0ZXJuICk7CiAgICAgfQogCkBAIC0yNDMsNyArMjQyLDcgQEAKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHBhdHRlcm5baV0gPSBwYXRbaV0gJiAweGZmZmY7Ci0JaGJpdG1hcCA9IENyZWF0ZUJpdG1hcCggOCwgOCwgMSwgMSwgKExQU1RSKXBhdHRlcm4gKTsKKwloYml0bWFwID0gQ3JlYXRlQml0bWFwMzIoIDgsIDgsIDEsIDEsIChMUFNUUilwYXR0ZXJuICk7CiAJaW5mb1B0ci0+aGJydXNoUGF0dGVybiA9IENyZWF0ZVBhdHRlcm5CcnVzaDMyKCBoYml0bWFwICk7CiAJRGVsZXRlT2JqZWN0MzIoIGhiaXRtYXAgKTsKICAgICB9CmRpZmYgLS1naXQgYS9jb250cm9scy9lZGl0LmMgYi9jb250cm9scy9lZGl0LmMKaW5kZXggOGU3YjU5Zi4uMzE4NzY5OCAxMDA2NDQKLS0tIGEvY29udHJvbHMvZWRpdC5jCisrKyBiL2NvbnRyb2xzL2VkaXQuYwpAQCAtMTMsOCArMTMsNiBAQAogICoKICAqLwogCi0KLSNkZWZpbmUgTk9fVFJBTlNJVElPTl9UWVBFUwkvKiBUaGlzIGZpbGUgaXMgV2luMzItY2xlYW4gKi8KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgpAQCAtMTc3OCw5ICsxNzc2LDEwIEBACiAJCXJldHVybiAwOwogCUJrQ29sb3IgPSBHZXRCa0NvbG9yMzIoaGRjKTsKIAlUZXh0Q29sb3IgPSBHZXRUZXh0Q29sb3IzMihoZGMpOwotCWlmIChyZXYpIHsKLQkJU2V0QmtDb2xvcihoZGMsIEdldFN5c0NvbG9yMzIoQ09MT1JfSElHSExJR0hUKSk7Ci0JCVNldFRleHRDb2xvcihoZGMsIEdldFN5c0NvbG9yMzIoQ09MT1JfSElHSExJR0hUVEVYVCkpOworCWlmIChyZXYpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNldEJrQ29sb3IzMihoZGMsIEdldFN5c0NvbG9yMzIoQ09MT1JfSElHSExJR0hUKSk7CisgICAgICAgICAgICBTZXRUZXh0Q29sb3IzMihoZGMsIEdldFN5c0NvbG9yMzIoQ09MT1JfSElHSExJR0hUVEVYVCkpOwogCX0KIAl0ZXh0ID0gRURJVF9HZXRQYXNzd29yZFBvaW50ZXIod25kUHRyKTsKIAlsaSA9IChJTlQzMilFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGxpbmUsIDApOwpAQCAtMTc4OCw5ICsxNzg3LDEwIEBACiAJcmV0ID0gKElOVDMyKUxPV09SRChUYWJiZWRUZXh0T3V0MzJBKGhkYywgeCwgeSwgdGV4dCArIGxpICsgY29sLCBjb3VudCwKIAkJCQkJZXMtPk51bVRhYlN0b3BzLCBlcy0+VGFiU3RvcHMsIC14b2ZmKSk7CiAJZnJlZSh0ZXh0KTsKLQlpZiAocmV2KSB7Ci0JCVNldEJrQ29sb3IoaGRjLCBCa0NvbG9yKTsKLQkJU2V0VGV4dENvbG9yKGhkYywgVGV4dENvbG9yKTsKKwlpZiAocmV2KQorICAgICAgICB7CisgICAgICAgICAgICBTZXRCa0NvbG9yMzIoaGRjLCBCa0NvbG9yKTsKKyAgICAgICAgICAgIFNldFRleHRDb2xvcjMyKGhkYywgVGV4dENvbG9yKTsKIAl9CiAJcmV0dXJuIHJldDsKIH0KQEAgLTE4NjMsNyArMTg2Myw3IEBACiAJaWYgKEVESVRfR2V0UmVkcmF3KHduZFB0cikpIHsKIAkJaWYgKHduZFB0ci0+aHduZFNlbGYgPT0gR2V0Rm9jdXMzMigpKSB7CiAJCQlwb3MgPSBFRElUX0VNX1Bvc0Zyb21DaGFyKHduZFB0ciwgbmUsIDApOwotCQkJU2V0Q2FyZXRQb3MoKElOVDE2KUxPV09SRChwb3MpLCAoSU5UMTYpSElXT1JEKHBvcykpOworCQkJU2V0Q2FyZXRQb3MxNigoSU5UMTYpTE9XT1JEKHBvcyksIChJTlQxNilISVdPUkQocG9zKSk7CiAJCX0KIAkJT1JERVJfSU5UMzIocywgbnMpOwogCQlPUkRFUl9JTlQzMihzLCBuZSk7CkBAIC0yMTM3LDkgKzIxMzcsOSBAQAogCQl9CiAJCWRwcmludGZfZWRpdChzdGRkZWIsICJlZGl0OiBFTV9HRVRIQU5ETEU6IGxvY2FsIGhlYXAgaW5pdGlhbGl6ZWRcbiIpOwogCX0KLQlpZiAoIShuZXdCdWYgPSBMT0NBTF9BbGxvYyh3bmRQdHItPmhJbnN0YW5jZSwKLQkJCQlFRElUX1dNX0dldFRleHRMZW5ndGgod25kUHRyLCAwLCAwKSArIDEsCi0JCQkJTE1FTV9NT1ZFQUJMRSkpKSB7CisJaWYgKCEobmV3QnVmID0gTE9DQUxfQWxsb2Mod25kUHRyLT5oSW5zdGFuY2UsIExNRU1fTU9WRUFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVESVRfV01fR2V0VGV4dExlbmd0aCh3bmRQdHIsIDAsIDApICsgMSkpKQorICAgICAgICB7CiAJCWZwcmludGYoc3RkZXJyLCAiZWRpdDogRU1fR0VUSEFORExFOiBjb3VsZCBub3QgYWxsb2NhdGUgbmV3IDE2IGJpdCBidWZmZXJcbiIpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0zMTIyLDcgKzMxMjIsNyBAQAogCUdsb2JhbFVubG9jazE2KGhkc3QpOwogCU9wZW5DbGlwYm9hcmQzMih3bmRQdHItPmh3bmRTZWxmKTsKIAlFbXB0eUNsaXBib2FyZDMyKCk7Ci0JU2V0Q2xpcGJvYXJkRGF0YShDRl9URVhULCBoZHN0KTsKKwlTZXRDbGlwYm9hcmREYXRhMTYoQ0ZfVEVYVCwgaGRzdCk7CiAJQ2xvc2VDbGlwYm9hcmQzMigpOwogCXJldHVybiAtMTsKIH0KQEAgLTM1MzAsNyArMzUzMCw3IEBACiAJSU5UMzIgczsKIAlJTlQzMiBlOwogCi0JRGVzdHJveUNhcmV0KCk7CisJRGVzdHJveUNhcmV0MzIoKTsKIAlpZighKHduZFB0ci0+ZHdTdHlsZSAmIEVTX05PSElERVNFTCkpIHsKIAkJRURJVF9FTV9HZXRTZWwod25kUHRyLCAoV1BBUkFNMzIpJnMsIChMUEFSQU0pJmUpOwogCQlFRElUX0ludmFsaWRhdGVUZXh0KHduZFB0ciwgcywgZSk7CkBAIC0zNjg4LDcgKzM2ODgsNyBAQAogCQlvbGRGb250ID0gKEhGT05UMzIpU2VsZWN0T2JqZWN0MzIoaGRjLCBoRm9udCk7CiAJRURJVF9TRU5EX0NUTENPTE9SKHduZFB0ciwgaGRjKTsKIAlpZiAoIUlzV2luZG93RW5hYmxlZDMyKHduZFB0ci0+aHduZFNlbGYpKQotCQlTZXRUZXh0Q29sb3IoaGRjLCBHZXRTeXNDb2xvcjMyKENPTE9SX0dSQVlURVhUKSk7CisJCVNldFRleHRDb2xvcjMyKGhkYywgR2V0U3lzQ29sb3IzMihDT0xPUl9HUkFZVEVYVCkpOwogCUdldENsaXBCb3gzMihoZGMsICZyY1Jnbik7CiAJZm9yIChpID0gZnYgOyBpIDw9IE1JTihmdiArIHZsYywgZnYgKyBsYyAtIDEpIDsgaSsrICkgewogCQlFRElUX0dldExpbmVSZWN0KHduZFB0ciwgaSwgMCwgLTEsICZyY0xpbmUpOwpAQCAtMzY5OSw3ICszNjk5LDcgQEAKIAlpZiAod25kUHRyLT5od25kU2VsZiA9PSBHZXRGb2N1czMyKCkpIHsKIAkJRURJVF9HZXRTZWwod25kUHRyLCBOVUxMLCAmZSk7CiAJCXBvcyA9IEVESVRfRU1fUG9zRnJvbUNoYXIod25kUHRyLCBlLCAwKTsKLQkJU2V0Q2FyZXRQb3MoKElOVDE2KUxPV09SRChwb3MpLCAoSU5UMTYpSElXT1JEKHBvcykpOworCQlTZXRDYXJldFBvczE2KCAoSU5UMTYpTE9XT1JEKHBvcyksIChJTlQxNilISVdPUkQocG9zKSApOwogCX0KIAlFbmRQYWludDMyKHduZFB0ci0+aHduZFNlbGYsICZwcyk7CiAJcmV0dXJuIDA7CkBAIC0zNzE3LDcgKzM3MTcsOCBAQAogCUxQU1RSIHNyYzsKIAogCU9wZW5DbGlwYm9hcmQzMih3bmRQdHItPmh3bmRTZWxmKTsKLQlpZiAoKGhzcmMgPSBHZXRDbGlwYm9hcmREYXRhKENGX1RFWFQpKSkgeworCWlmICgoaHNyYyA9IEdldENsaXBib2FyZERhdGExNihDRl9URVhUKSkpCisgICAgICAgIHsKIAkJc3JjID0gKExQU1RSKUdsb2JhbExvY2sxNihoc3JjKTsKIAkJRURJVF9FTV9SZXBsYWNlU2VsKHduZFB0ciwgKFdQQVJBTTMyKVRSVUUsIChMUEFSQU0pc3JjKTsKIAkJR2xvYmFsVW5sb2NrMTYoaHNyYyk7CkBAIC0zNzUzLDcgKzM3NTQsNyBAQAogCUlOVDMyIGU7CiAKIAlFRElUX0dldFNlbCh3bmRQdHIsICZzLCAmZSk7Ci0JQ3JlYXRlQ2FyZXQod25kUHRyLT5od25kU2VsZiwgMCwgMiwgRURJVF9HZXRMaW5lSGVpZ2h0KHduZFB0cikpOworCUNyZWF0ZUNhcmV0MzIoIHduZFB0ci0+aHduZFNlbGYsIDAsIDIsIEVESVRfR2V0TGluZUhlaWdodCh3bmRQdHIpICk7CiAJRURJVF9TZXRTZWwod25kUHRyLCBzLCBlKTsKIAlpZighKHduZFB0ci0+ZHdTdHlsZSAmIEVTX05PSElERVNFTCkpCiAJCUVESVRfSW52YWxpZGF0ZVRleHQod25kUHRyLCBzLCBlKTsKQEAgLTM3OTEsOCArMzc5Miw5IEBACiAJaWYgKChCT09MMzIpbFBhcmFtICYmIEVESVRfR2V0UmVkcmF3KHduZFB0cikpCiAJCUludmFsaWRhdGVSZWN0MzIoIHduZFB0ci0+aHduZFNlbGYsIE5VTEwsIFRSVUUgKTsKIAlpZiAod25kUHRyLT5od25kU2VsZiA9PSBHZXRGb2N1czMyKCkpIHsKLQkJRGVzdHJveUNhcmV0KCk7Ci0JCUNyZWF0ZUNhcmV0KHduZFB0ci0+aHduZFNlbGYsIDAsIDIsIEVESVRfR2V0TGluZUhlaWdodCh3bmRQdHIpKTsKKwkJRGVzdHJveUNhcmV0MzIoKTsKKwkJQ3JlYXRlQ2FyZXQzMiggd25kUHRyLT5od25kU2VsZiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCBFRElUX0dldExpbmVIZWlnaHQod25kUHRyKSApOwogCQlFRElUX1NldFNlbCh3bmRQdHIsIHMsIGUpOwogCQlTaG93Q2FyZXQzMih3bmRQdHItPmh3bmRTZWxmKTsKIAl9CmRpZmYgLS1naXQgYS9jb250cm9scy9saXN0Ym94LmMgYi9jb250cm9scy9saXN0Ym94LmMKaW5kZXggZGIwMDExNi4uNTdhZmNmNCAxMDA2NDQKLS0tIGEvY29udHJvbHMvbGlzdGJveC5jCisrKyBiL2NvbnRyb2xzL2xpc3Rib3guYwpAQCAtNCw3ICs0LDYgQEAKICAqIENvcHlyaWdodCAxOTk2IEFsZXhhbmRyZSBKdWxsaWFyZAogICovCiAKLSNkZWZpbmUgTk9fVFJBTlNJVElPTl9UWVBFUyAgLyogVGhpcyBmaWxlIGlzIFdpbjMyLWNsZWFuICovCiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlICJ3aW5kb3dzLmgiCkBAIC00NzAsMTYgKzQ2OSwxNiBAQAogICAgICAgICB9CiAgICAgICAgIGlmIChpdGVtICYmIGl0ZW0tPnNlbGVjdGVkKQogICAgICAgICB7Ci0gICAgICAgICAgICBTZXRCa0NvbG9yKCBoZGMsIEdldFN5c0NvbG9yMzIoIENPTE9SX0hJR0hMSUdIVCApICk7Ci0gICAgICAgICAgICBTZXRUZXh0Q29sb3IoIGhkYywgR2V0U3lzQ29sb3IzMiggQ09MT1JfSElHSExJR0hUVEVYVCApICk7CisgICAgICAgICAgICBTZXRCa0NvbG9yMzIoIGhkYywgR2V0U3lzQ29sb3IzMiggQ09MT1JfSElHSExJR0hUICkgKTsKKyAgICAgICAgICAgIFNldFRleHRDb2xvcjMyKCBoZGMsIEdldFN5c0NvbG9yMzIoIENPTE9SX0hJR0hMSUdIVFRFWFQgKSApOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewotICAgICAgICAgICAgU2V0QmtDb2xvciggaGRjLCBHZXRTeXNDb2xvcjMyKCBDT0xPUl9XSU5ET1cgKSApOworICAgICAgICAgICAgU2V0QmtDb2xvcjMyKCBoZGMsIEdldFN5c0NvbG9yMzIoIENPTE9SX1dJTkRPVyApICk7CiAgICAgICAgICAgICBpZiAod25kLT5kd1N0eWxlICYgV1NfRElTQUJMRUQpCi0gICAgICAgICAgICAgICAgU2V0VGV4dENvbG9yKCBoZGMsIEdldFN5c0NvbG9yMzIoIENPTE9SX0dSQVlURVhUICkgKTsKKyAgICAgICAgICAgICAgICBTZXRUZXh0Q29sb3IzMiggaGRjLCBHZXRTeXNDb2xvcjMyKCBDT0xPUl9HUkFZVEVYVCApICk7CiAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgU2V0VGV4dENvbG9yKCBoZGMsIEdldFN5c0NvbG9yMzIoIENPTE9SX1dJTkRPV1RFWFQgKSApOworICAgICAgICAgICAgICAgIFNldFRleHRDb2xvcjMyKCBoZGMsIEdldFN5c0NvbG9yMzIoIENPTE9SX1dJTkRPV1RFWFQgKSApOwogICAgICAgICB9CiAgICAgICAgIGRwcmludGZfbGlzdGJveCggc3RkZGViLCAiTGlzdGJveCAlMDR4OiBwYWludGluZyAlZCAoJXMpIGFjdGlvbj0lMDJ4ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAicmVjdD0lZCwlZC0lZCwlZFxuIiwKQEAgLTg1Niw3ICs4NTUsNyBAQAogICAgICAgICAgICAgaWYgKCFJU19PV05FUkRSQVcoZGVzY3IpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBib3R0b20gb2YgdGhlIGNvbHVtbiAqLwotICAgICAgICAgICAgICAgIFNldEJrQ29sb3IoIGhkYywgR2V0U3lzQ29sb3IzMiggQ09MT1JfV0lORE9XICkgKTsKKyAgICAgICAgICAgICAgICBTZXRCa0NvbG9yMzIoIGhkYywgR2V0U3lzQ29sb3IzMiggQ09MT1JfV0lORE9XICkgKTsKICAgICAgICAgICAgICAgICBpZiAocmVjdC50b3AgPCBkZXNjci0+aGVpZ2h0KQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcmVjdC5ib3R0b20gPSBkZXNjci0+aGVpZ2h0OwpAQCAtODgxLDcgKzg4MCw3IEBACiAgICAgaWYgKCFJU19PV05FUkRSQVcoZGVzY3IpKQogICAgIHsKICAgICAgICAgLyogQ2xlYXIgdGhlIHJlbWFpbmRlciBvZiB0aGUgY2xpZW50IGFyZWEgKi8KLSAgICAgICAgU2V0QmtDb2xvciggaGRjLCBHZXRTeXNDb2xvcjMyKCBDT0xPUl9XSU5ET1cgKSApOworICAgICAgICBTZXRCa0NvbG9yMzIoIGhkYywgR2V0U3lzQ29sb3IzMiggQ09MT1JfV0lORE9XICkgKTsKICAgICAgICAgaWYgKHJlY3QudG9wIDwgZGVzY3ItPmhlaWdodCkKICAgICAgICAgewogICAgICAgICAgICAgcmVjdC5ib3R0b20gPSBkZXNjci0+aGVpZ2h0OwpkaWZmIC0tZ2l0IGEvY29udHJvbHMvbWVudS5jIGIvY29udHJvbHMvbWVudS5jCmluZGV4IDZmMGMwNzEuLjI5ZDA3M2MgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL21lbnUuYworKysgYi9jb250cm9scy9tZW51LmMKQEAgLTExLDcgKzExLDYgQEAKICAqIFRoaXMgaXMgcHJvYmFibHkgbm90IHRoZSBtZWFuaW5nIHRoaXMgc3R5bGUgaGFzIGluIE1TLVdpbmRvd3MuCiAgKi8KIAotI2RlZmluZSBOT19UUkFOU0lUSU9OX1RZUEVTICAvKiBUaGlzIGZpbGUgaXMgV2luMzItY2xlYW4gKi8KICNpbmNsdWRlIDxjdHlwZS5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CkBAIC02MDAsMTggKzU5OSwxOCBAQAogICAgIGlmIChscGl0ZW0tPml0ZW1fZmxhZ3MgJiBNRl9ISUxJVEUpCiAgICAgewogCWlmIChscGl0ZW0tPml0ZW1fZmxhZ3MgJiBNRl9HUkFZRUQpCi0JICAgIFNldFRleHRDb2xvciggaGRjLCBHZXRTeXNDb2xvcjMyKCBDT0xPUl9HUkFZVEVYVCApICk7CisJICAgIFNldFRleHRDb2xvcjMyKCBoZGMsIEdldFN5c0NvbG9yMzIoIENPTE9SX0dSQVlURVhUICkgKTsKIAllbHNlCi0JICAgIFNldFRleHRDb2xvciggaGRjLCBHZXRTeXNDb2xvcjMyKCBDT0xPUl9ISUdITElHSFRURVhUICkgKTsKLQlTZXRCa0NvbG9yKCBoZGMsIEdldFN5c0NvbG9yMzIoIENPTE9SX0hJR0hMSUdIVCApICk7CisJICAgIFNldFRleHRDb2xvcjMyKCBoZGMsIEdldFN5c0NvbG9yMzIoIENPTE9SX0hJR0hMSUdIVFRFWFQgKSApOworCVNldEJrQ29sb3IzMiggaGRjLCBHZXRTeXNDb2xvcjMyKCBDT0xPUl9ISUdITElHSFQgKSApOwogICAgIH0KICAgICBlbHNlCiAgICAgewogCWlmIChscGl0ZW0tPml0ZW1fZmxhZ3MgJiBNRl9HUkFZRUQpCi0JICAgIFNldFRleHRDb2xvciggaGRjLCBHZXRTeXNDb2xvcjMyKCBDT0xPUl9HUkFZVEVYVCApICk7CisJICAgIFNldFRleHRDb2xvcjMyKCBoZGMsIEdldFN5c0NvbG9yMzIoIENPTE9SX0dSQVlURVhUICkgKTsKIAllbHNlCi0JICAgIFNldFRleHRDb2xvciggaGRjLCBHZXRTeXNDb2xvcjMyKCBDT0xPUl9NRU5VVEVYVCApICk7Ci0JU2V0QmtDb2xvciggaGRjLCBHZXRTeXNDb2xvcjMyKCBDT0xPUl9NRU5VICkgKTsKKwkgICAgU2V0VGV4dENvbG9yMzIoIGhkYywgR2V0U3lzQ29sb3IzMiggQ09MT1JfTUVOVVRFWFQgKSApOworCVNldEJrQ29sb3IzMiggaGRjLCBHZXRTeXNDb2xvcjMyKCBDT0xPUl9NRU5VICkgKTsKICAgICB9CiAKICAgICBpZiAoIW1lbnVCYXIpCkBAIC04NjksOCArODY4LDggQEAKICAgICAgIC8qIERpc3BsYXkgdGhlIHdpbmRvdyAqLwogCiAgICAgU2V0V2luZG93UG9zMzIoIG1lbnUtPmhXbmQsIEhXTkRfVE9QLCAwLCAwLCAwLCAwLAotCQkgICAgU1dQX1NIT1dXSU5ET1cgfCBTV1BfTk9TSVpFIHwgU1dQX05PTU9WRSB8IFNXUF9OT0FDVElWQVRFICk7Ci0gICAgVXBkYXRlV2luZG93KCBtZW51LT5oV25kICk7CisJCSAgICBTV1BfU0hPV1dJTkRPVyB8IFNXUF9OT1NJWkUgfCBTV1BfTk9NT1ZFIHwgU1dQX05PQUNUSVZBVEUpOworICAgIFVwZGF0ZVdpbmRvdzMyKCBtZW51LT5oV25kICk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKQEAgLTEzMTAsOCArMTMwOSw4IEBACiAgICAgewogCWlmICghKGl0ZW0tPml0ZW1fZmxhZ3MgJiAoTUZfR1JBWUVEIHwgTUZfRElTQUJMRUQpKSkKIAl7Ci0JICAgIFBvc3RNZXNzYWdlKCBod25kT3duZXIsIChtZW51LT53RmxhZ3MgJiBNRl9TWVNNRU5VKSA/IAotCQkJV01fU1lTQ09NTUFORCA6IFdNX0NPTU1BTkQsIGl0ZW0tPml0ZW1faWQsIDAgKTsKKwkgICAgUG9zdE1lc3NhZ2UxNiggaHduZE93bmVyLCAobWVudS0+d0ZsYWdzICYgTUZfU1lTTUVOVSkgPyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdNX1NZU0NPTU1BTkQgOiBXTV9DT01NQU5ELCBpdGVtLT5pdGVtX2lkLCAwICk7CiAJICAgIHJldHVybiBGQUxTRTsKIAl9CiAJZWxzZSByZXR1cm4gVFJVRTsKQEAgLTE0NzMsNyArMTQ3Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBHZXRTeXN0ZW1NZW51MzIoICpod25kT3duZXIsIDApIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKmhtZW51KSk7CiAKLSAgICBpZiggbCA9PSAwIHx8ICFJc01lbnUzMihMT1dPUkQobCkpIHx8ICFJc1dpbmRvdyhISVdPUkQobCkpICkgcmV0dXJuIDA7CisgICAgaWYoIGwgPT0gMCB8fCAhSXNNZW51MzIoTE9XT1JEKGwpKSB8fCAhSXNXaW5kb3czMihISVdPUkQobCkpICkgcmV0dXJuIDA7CiAKICAgICAvKiBzaHV0ZG93biBjdXJyZW50IG1lbnUgLQogICAgICAqIGFsbCB0aGVzZSBjaGVja3MgZm9yIHN5c3RlbSBwb3B1cCB3aW5kb3cgYXJlIG5lZWRlZApAQCAtMTkzOCw3ICsxOTM3LDcgQEAKIAkJaWYoIHVJdGVtID09IE5PX1NFTEVDVEVEX0lURU0gKQogCQkgICAgTUVOVV9TZWxlY3RJdGVtUmVsKCB3bmRQdHItPmh3bmRTZWxmLCBoVHJhY2tNZW51LCBJVEVNX05FWFQgKTsKIAkJZWxzZQotCQkgICAgUG9zdE1lc3NhZ2UoIHduZFB0ci0+aHduZFNlbGYsIFdNX0tFWURPV04sIFZLX0RPV04sIDBMICk7CisJCSAgICBQb3N0TWVzc2FnZTE2KCB3bmRQdHItPmh3bmRTZWxmLCBXTV9LRVlET1dOLCBWS19ET1dOLCAwTCApOwogCiAJCU1FTlVfVHJhY2tNZW51KCBoVHJhY2tNZW51LCBUUE1fTEVGVEFMSUdOIHwgVFBNX0xFRlRCVVRUT04sCiAJCQkJMCwgMCwgd25kUHRyLT5od25kU2VsZiwgTlVMTCApOwpkaWZmIC0tZ2l0IGEvY29udHJvbHMvb2xkbGJveC5jIGIvY29udHJvbHMvb2xkbGJveC5jCmluZGV4IDg3ZTZhNWEuLmNiZWNmZDkgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL29sZGxib3guYworKysgYi9jb250cm9scy9vbGRsYm94LmMKQEAgLTY2LDcgKzY2LDcgQEAKICAgU2V0V2luZG93TG9uZzMyQShod25kLCAwLCAoTE9ORylscGhsKTsKICAgTGlzdEJveEluaXRpYWxpemUobHBobCk7CiAgIGxwaGwtPkRyYXdDdGxUeXBlICAgID0gQ3RsVHlwZTsKLSAgbHBobC0+Q3RsSUQgICAgICAgICAgPSBHZXRXaW5kb3dXb3JkKGh3bmQsR1dXX0lEKTsKKyAgbHBobC0+Q3RsSUQgICAgICAgICAgPSBHZXRXaW5kb3dXb3JkMTYoaHduZCxHV1dfSUQpOwogICBscGhsLT5iUmVkcmF3RmxhZyAgICA9IFRSVUU7CiAgIGxwaGwtPmlOdW1TdG9wcyAgICAgID0gMDsKICAgbHBobC0+VGFiU3RvcHMgICAgICAgPSBOVUxMOwpAQCAtMTYwLDEwICsxNjAsMTAgQEAKIH0KIAogCi1MUExJU1RTVFJVQ1QgTGlzdEJveEdldEl0ZW0oTFBIRUFETElTVCBscGhsLCBVSU5UIHVJbmRleCkKK0xQTElTVFNUUlVDVCBMaXN0Qm94R2V0SXRlbShMUEhFQURMSVNUIGxwaGwsIFVJTlQxNiB1SW5kZXgpCiB7CiAgIExQTElTVFNUUlVDVCBscGxzOwotICBVSU5UICAgICAgICAgQ291bnQgPSAwOworICBVSU5UMTYgICAgICAgICBDb3VudCA9IDA7CiAKICAgaWYgKHVJbmRleCA+PSBscGhsLT5JdGVtc0NvdW50KSByZXR1cm4gTlVMTDsKIApAQCAtMTk5LDcgKzE5OSw3IEBACiAgICAgICBPbGRCa01vZGUgPSBTZXRCa01vZGUzMihoZGMsIFRSQU5TUEFSRU5UKTsKIAogICAgICAgaWYgKGl0ZW1TdGF0ZSAhPSAwKSB7Ci0JZHdPbGRUZXh0Q29sb3IgPSBTZXRUZXh0Q29sb3IoaGRjLCAweDAwRkZGRkZGTCk7CisJZHdPbGRUZXh0Q29sb3IgPSBTZXRUZXh0Q29sb3IzMihoZGMsIDB4MDBGRkZGRkZMKTsKIAlGaWxsUmVjdDE2KGhkYywgcmVjdCwgR2V0U3RvY2tPYmplY3QzMihCTEFDS19CUlVTSCkpOwogICAgICAgfQogCkBAIC0yMTMsNyArMjEzLDcgQEAKICAgICAgIH0KIAogICAgICAgaWYgKGl0ZW1TdGF0ZSAhPSAwKSB7Ci0JU2V0VGV4dENvbG9yKGhkYywgZHdPbGRUZXh0Q29sb3IpOworCVNldFRleHRDb2xvcjMyKGhkYywgZHdPbGRUZXh0Q29sb3IpOwogICAgICAgfQogICAgICAgCiAgICAgICBTZXRCa01vZGUzMihoZGMsIE9sZEJrTW9kZSk7CkBAIC0zMDMsNyArMzAzLDcgQEAKICAgcmV0dXJuIGxwbHNuZXc7CiB9CiAKLXN0YXRpYyBpbnQgTGlzdEJveEFza0NvbXBhcmUoTFBIRUFETElTVCBscGhsLCBpbnQgc3RhcnRJdGVtLCBTRUdQVFIgbWF0Y2hEYXRhLCBCT09MIGV4YWN0TWF0Y2ggKQorc3RhdGljIGludCBMaXN0Qm94QXNrQ29tcGFyZShMUEhFQURMSVNUIGxwaGwsIGludCBzdGFydEl0ZW0sIFNFR1BUUiBtYXRjaERhdGEsIEJPT0wzMiBleGFjdE1hdGNoICkKIHsKICAvKiAgRG8gYmluYXJ5IHNlYXJjaCBmb3Igc29ydGVkIGxpc3Rib3hlcy4gTGlua2VkIGxpc3QgaXRlbSBzdG9yYWdlIHNvcnQgb2YgCiAgICogIGRlZmVhdHMgdGhlIHB1cnBvc2UgKCBmb3JjZXMgdG8gdHJhdmVyc2UgaXRlbSBsaXN0IGFsbCB0aGUgdGltZSApIGJ1dCBNJCBkb2VzIGl0IHRoaXMgd2F5Li4uCkBAIC00MDEsMTggKzQwMSwxOCBAQAogIHJldHVybiAoZXhhY3RNYXRjaCk/IExCX0VSUjogcG9zOwogfQogCi1pbnQgTGlzdEJveEluc2VydFN0cmluZyhMUEhFQURMSVNUIGxwaGwsIFVJTlQgdUluZGV4LCBMUENTVFIgbmV3c3RyKQoraW50IExpc3RCb3hJbnNlcnRTdHJpbmcoTFBIRUFETElTVCBscGhsLCBVSU5UMTYgdUluZGV4LCBMUENTVFIgbmV3c3RyKQogewogICBMUExJU1RTVFJVQ1QgKmxwcGxzLCBscGxzbmV3LCBscGxzOwogICBIQU5ETEUxNiBoU3RyOwogICBMUFNUUglzdHI7Ci0gIFVJTlQJQ291bnQ7CisgIFVJTlQxNglDb3VudDsKICAgICAKICAgZHByaW50Zl9saXN0Ym94KHN0ZGRlYiwiTGlzdEJveEluc2VydFN0cmluZyglZCwgJXApO1xuIiwgdUluZGV4LCBuZXdzdHIpOwogICAgIAogICBpZiAoIW5ld3N0cikgcmV0dXJuIC0xOwogCi0gIGlmICh1SW5kZXggPT0gKFVJTlQpLTEpCisgIGlmICh1SW5kZXggPT0gKFVJTlQxNiktMSkKICAgICB1SW5kZXggPSBscGhsLT5JdGVtc0NvdW50OwogCiAgIGxwcGxzID0gJmxwaGwtPmxwRmlyc3Q7CkBAIC00NjYsNyArNDY2LDcgQEAKIAogaW50IExpc3RCb3hBZGRTdHJpbmcoTFBIRUFETElTVCBscGhsLCBTRUdQVFIgaXRlbURhdGEpCiB7Ci0gICAgVUlOVCAJcG9zID0gKFVJTlQpIC0xOworICAgIFVJTlQxNiAJcG9zID0gKFVJTlQxNikgLTE7CiAgICAgTFBDU1RSCW5ld3N0ciA9IChscGhsLT5IYXNTdHJpbmdzKT8oTFBDU1RSKVBUUl9TRUdfVE9fTElOKGl0ZW1EYXRhKTooTFBDU1RSKWl0ZW1EYXRhOwogCiAgICAgaWYgKCBscGhsLT5kd1N0eWxlICYgTEJTX1NPUlQgKSAKQEAgLTQ3Niw3ICs0NzYsNyBAQAogfQogCiAKLWludCBMaXN0Qm94R2V0VGV4dChMUEhFQURMSVNUIGxwaGwsIFVJTlQgdUluZGV4LCBMUFNUUiBPdXRTdHIpCitpbnQgTGlzdEJveEdldFRleHQoTFBIRUFETElTVCBscGhsLCBVSU5UMTYgdUluZGV4LCBMUFNUUiBPdXRTdHIpCiB7CiAgIExQTElTVFNUUlVDVCBscGxzOwogCkBAIC00OTgsNyArNDk4LDcgQEAKIH0KIAogCi1EV09SRCBMaXN0Qm94R2V0SXRlbURhdGEoTFBIRUFETElTVCBscGhsLCBVSU5UIHVJbmRleCkKK0RXT1JEIExpc3RCb3hHZXRJdGVtRGF0YShMUEhFQURMSVNUIGxwaGwsIFVJTlQxNiB1SW5kZXgpCiB7CiAgIExQTElTVFNUUlVDVCBscGxzOwogCkBAIC01MDgsNyArNTA4LDcgQEAKIH0KIAogCi1pbnQgTGlzdEJveFNldEl0ZW1EYXRhKExQSEVBRExJU1QgbHBobCwgVUlOVCB1SW5kZXgsIERXT1JEIEl0ZW1EYXRhKQoraW50IExpc3RCb3hTZXRJdGVtRGF0YShMUEhFQURMSVNUIGxwaGwsIFVJTlQxNiB1SW5kZXgsIERXT1JEIEl0ZW1EYXRhKQogewogICBMUExJU1RTVFJVQ1QgbHBscyA9IExpc3RCb3hHZXRJdGVtKGxwaGwsIHVJbmRleCk7CiAKQEAgLTUxOCwxMCArNTE4LDEwIEBACiB9CiAKIAotaW50IExpc3RCb3hEZWxldGVTdHJpbmcoTFBIRUFETElTVCBscGhsLCBVSU5UIHVJbmRleCkKK2ludCBMaXN0Qm94RGVsZXRlU3RyaW5nKExQSEVBRExJU1QgbHBobCwgVUlOVDE2IHVJbmRleCkKIHsKICAgTFBMSVNUU1RSVUNUIGxwbHMsIGxwbHMyOwotICBVSU5UCUNvdW50OworICBVSU5UMTYJQ291bnQ7CiAKICAgaWYgKHVJbmRleCA+PSBscGhsLT5JdGVtc0NvdW50KSByZXR1cm4gTEJfRVJSOwogCkBAIC01NjEsMTMgKzU2MSwxMyBAQAogICByZXR1cm4gbHBobC0+SXRlbXNDb3VudDsKIH0KIAotc3RhdGljIGludCBsYkZpbmRTdHJpbmcoTFBIRUFETElTVCBscGhsLCBVSU5UIG5GaXJzdCwgU0VHUFRSIE1hdGNoU3RyLCBCT09MIG1hdGNoKQorc3RhdGljIGludCBsYkZpbmRTdHJpbmcoTFBIRUFETElTVCBscGhsLCBVSU5UMTYgbkZpcnN0LCBTRUdQVFIgTWF0Y2hTdHIsIEJPT0wzMiBtYXRjaCkKIHsKICAgLyogIG1hdGNoIGlzIGVpdGhlciBNQVRDSF9TVUJTVFIgb3IgTUFUQ0hfRVhBQ1QgKi8KIAogICBMUExJU1RTVFJVQ1QgbHBsczsKLSAgVUlOVAkgICAgICAgQ291bnQ7Ci0gIFVJTlQgICAgICAgICBGaXJzdCAgICAgID0gbkZpcnN0ICsgMTsKKyAgVUlOVDE2CSAgICAgICBDb3VudDsKKyAgVUlOVDE2ICAgICAgICAgRmlyc3QgICAgICA9IG5GaXJzdCArIDE7CiAgIGludAkgICAgICAgc19sZW5ndGggICA9IDA7CiAgIExQU1RSICAgICAgICBscE1hdGNoU3RyID0gKExQU1RSKU1hdGNoU3RyOwogCkBAIC02MjQsMTIgKzYyNCwxMiBAQAogICByZXR1cm4gTEJfRVJSOwogfQogCi1pbnQgTGlzdEJveEZpbmRTdHJpbmcoTFBIRUFETElTVCBscGhsLCBVSU5UIG5GaXJzdCwgU0VHUFRSIE1hdGNoU3RyKQoraW50IExpc3RCb3hGaW5kU3RyaW5nKExQSEVBRExJU1QgbHBobCwgVUlOVDE2IG5GaXJzdCwgU0VHUFRSIE1hdGNoU3RyKQogewogICByZXR1cm4gbGJGaW5kU3RyaW5nKGxwaGwsIG5GaXJzdCwgTWF0Y2hTdHIsIE1BVENIX1NVQlNUUiApOwogfQogCi1pbnQgTGlzdEJveEZpbmRTdHJpbmdFeGFjdChMUEhFQURMSVNUIGxwaGwsIFVJTlQgbkZpcnN0LCBTRUdQVFIgTWF0Y2hTdHIpCitpbnQgTGlzdEJveEZpbmRTdHJpbmdFeGFjdChMUEhFQURMSVNUIGxwaGwsIFVJTlQxNiBuRmlyc3QsIFNFR1BUUiBNYXRjaFN0cikKIHsKICAgcmV0dXJuIGxiRmluZFN0cmluZyhscGhsLCBuRmlyc3QsIE1hdGNoU3RyLCBNQVRDSF9FWEFDVCApOwogfQpAQCAtNjc2LDcgKzY3Niw3IEBACiAgICAgbHBscy0+aXRlbVN0YXRlID0gMDsKICAgfQogCi0gIGlmICgod0luZGV4ICE9IChVSU5UKS0xKSAmJiAod0luZGV4IDwgbHBobC0+SXRlbXNDb3VudCkpCisgIGlmICgod0luZGV4ICE9IChVSU5UMTYpLTEpICYmICh3SW5kZXggPCBscGhsLT5JdGVtc0NvdW50KSkKICAgewogICAgIGxwaGwtPkl0ZW1Gb2N1c2VkID0gd0luZGV4OwogICAgIGxwbHMgPSBMaXN0Qm94R2V0SXRlbShscGhsLCB3SW5kZXgpOwpAQCAtNjkzLDcgKzY5Myw3IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZGlyIGxpc3RpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLUxPTkcgTGlzdEJveERpcmVjdG9yeShMUEhFQURMSVNUIGxwaGwsIFVJTlQgYXR0cmliLCBMUENTVFIgZmlsZXNwZWMpCitMT05HIExpc3RCb3hEaXJlY3RvcnkoTFBIRUFETElTVCBscGhsLCBVSU5UMTYgYXR0cmliLCBMUENTVFIgZmlsZXNwZWMpCiB7CiAgICAgcmV0dXJuIDA7CiB9CkBAIC03NDUsNyArNzQ1LDcgQEAKIGludCBMaXN0Qm94RmluZE5leHRNYXRjaChMUEhFQURMSVNUIGxwaGwsIFdPUkQgd0NoYXIpCiB7CiAgIExQTElTVFNUUlVDVCBscGxzOwotICBVSU5UCSAgICAgICBjb3VudCxmaXJzdDsKKyAgVUlOVDE2IGNvdW50LGZpcnN0OwogCiAgIGlmICgoY2hhcil3Q2hhciA8ICcgJykgcmV0dXJuIExCX0VSUjsKICAgaWYgKCFscGhsLT5IYXNTdHJpbmdzKSByZXR1cm4gTEJfRVJSOwpkaWZmIC0tZ2l0IGEvY29udHJvbHMvc2Nyb2xsLmMgYi9jb250cm9scy9zY3JvbGwuYwppbmRleCAxNGMzZjQwLi44MTlmZjVkIDEwMDY0NAotLS0gYS9jb250cm9scy9zY3JvbGwuYworKysgYi9jb250cm9scy9zY3JvbGwuYwpAQCAtNSw3ICs1LDYgQEAKICAqIENvcHlyaWdodCAxOTk0LCAxOTk2IEFsZXhhbmRyZSBKdWxsaWFyZAogICovCiAKLSNkZWZpbmUgTk9fVFJBTlNJVElPTl9UWVBFUyAgLyogVGhpcyBmaWxlIGlzIFdpbjMyLWNsZWFuICovCiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KZGlmZiAtLWdpdCBhL2NvbnRyb2xzL3N0YXRpYy5jIGIvY29udHJvbHMvc3RhdGljLmMKaW5kZXggOTg0MmYwNi4uNzdlNmM1NSAxMDA2NDQKLS0tIGEvY29udHJvbHMvc3RhdGljLmMKKysrIGIvY29udHJvbHMvc3RhdGljLmMKQEAgLTY3LDcgKzY3LDggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFN0YXRpY1duZFByb2MKICAqLwotTFJFU1VMVCBTdGF0aWNXbmRQcm9jKCBIV05EMTYgaFduZCwgVUlOVCB1TXNnLCBXUEFSQU0xNiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCitMUkVTVUxUIFN0YXRpY1duZFByb2MoIEhXTkQxNiBoV25kLCBVSU5UMTYgdU1zZywgV1BBUkFNMTYgd1BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICBMUEFSQU0gbFBhcmFtICkKIHsKICAgICBMUkVTVUxUIGxSZXN1bHQgPSAwOwogICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaFduZCk7CkBAIC0xNDAsNyArMTQxLDcgQEAKICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICBERUZXTkRfU2V0VGV4dCggd25kUHRyLCAoTFBTVFIpUFRSX1NFR19UT19MSU4obFBhcmFtKSApOwogCSAgICBJbnZhbGlkYXRlUmVjdDMyKCBoV25kLCBOVUxMLCBGQUxTRSApOwotCSAgICBVcGRhdGVXaW5kb3coIGhXbmQgKTsKKwkgICAgVXBkYXRlV2luZG93MzIoIGhXbmQgKTsKIAkgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBXTV9TRVRGT05UOgpAQCAtMTQ5LDcgKzE1MCw3IEBACiAgICAgICAgICAgICBpZiAoTE9XT1JEKGxQYXJhbSkpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgSW52YWxpZGF0ZVJlY3QzMiggaFduZCwgTlVMTCwgRkFMU0UgKTsKLSAgICAgICAgICAgICAgICBVcGRhdGVXaW5kb3coIGhXbmQgKTsKKyAgICAgICAgICAgICAgICBVcGRhdGVXaW5kb3czMiggaFduZCApOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAKQEAgLTE2OCw3ICsxNjksNyBAQAogCWNhc2UgU1RNX1NFVElDT046CiAgICAgICAgICAgICBsUmVzdWx0ID0gU1RBVElDX1NldEljb24oIHduZFB0ciwgKEhJQ09OMTYpd1BhcmFtICk7CiAgICAgICAgICAgICBJbnZhbGlkYXRlUmVjdDMyKCBoV25kLCBOVUxMLCBGQUxTRSApOwotICAgICAgICAgICAgVXBkYXRlV2luZG93KCBoV25kICk7CisgICAgICAgICAgICBVcGRhdGVXaW5kb3czMiggaFduZCApOwogCSAgICBicmVhazsKIAogCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9jb250cm9scy9zdGF0dXMuYyBiL2NvbnRyb2xzL3N0YXR1cy5jCmluZGV4IDE3YzQzNzIuLmZlZWY5NmMgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL3N0YXR1cy5jCisrKyBiL2NvbnRyb2xzL3N0YXR1cy5jCkBAIC00LDcgKzQsNiBAQAogICogQ29weXJpZ2h0IDE5OTYgQnJ1Y2UgTWlsbmVyCiAgKi8KIAotI2RlZmluZSBOT19UUkFOU0lUSU9OX1RZUEVTICAvKiBUaGlzIGZpbGUgaXMgV2luMzItY2xlYW4gKi8KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL3dpZGdldHMuYyBiL2NvbnRyb2xzL3dpZGdldHMuYwppbmRleCAwZDVlMjE5Li5mZmMyYTIzIDEwMDY0NAotLS0gYS9jb250cm9scy93aWRnZXRzLmMKKysrIGIvY29udHJvbHMvd2lkZ2V0cy5jCkBAIC05NCw3ICs5NCw3IEBACiAgKiAKICAqIEluaXRpYWxpemUgdGhlIGJ1aWx0LWluIHdpbmRvdyBjbGFzc2VzLgogICovCi1CT09MIFdJREdFVFNfSW5pdCh2b2lkKQorQk9PTDMyIFdJREdFVFNfSW5pdCh2b2lkKQogewogICAgIGludCBpOwogICAgIGNoYXIgKm5hbWU7CmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9NYWtlZmlsZS5pbiBiL2RlYnVnZ2VyL01ha2VmaWxlLmluCmluZGV4IDNmNWQ0OWQuLjJhYjcyZDEgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyL01ha2VmaWxlLmluCisrKyBiL2RlYnVnZ2VyL01ha2VmaWxlLmluCkBAIC0xLDQgKzEsNCBAQAotREVGUyAgICAgID0gLURfX1dJTkVfXyAtRE5PX1RSQU5TSVRJT05fVFlQRVMKK0RFRlMgICAgICA9IC1EX19XSU5FX18KIFRPUFNSQ0RJUiA9IEB0b3Bfc3JjZGlyQAogVE9QT0JKRElSID0gLi4KIFNSQ0RJUiAgICA9IEBzcmNkaXJACmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9kYmcueSBiL2RlYnVnZ2VyL2RiZy55CmluZGV4IGI4NzI5MWEuLjBmMGI5ZmIgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyL2RiZy55CisrKyBiL2RlYnVnZ2VyL2RiZy55CkBAIC00OSw3ICs0OSw3IEBACiAldG9rZW4gdEVOQUJMRSB0RElTQUJMRSB0QlJFQUsgdERFTEVURSB0U0VUIHRNT0RFIHRQUklOVCB0RVhBTSB0QUJPUlQKICV0b2tlbiB0Q0xBU1MgdE1PRFVMRSB0U1RBQ0sgdFNFR01FTlRTIHRSRUdTIHRXTkQgdFFVRVVFIHRMT0NBTAogJXRva2VuIHRFT0wgdFNUUklORwotJXRva2VuIHRGUkFNRSB0U0hBUkUgdENPTkQgdERJU1BMQVkgdFVORElTUExBWQorJXRva2VuIHRGUkFNRSB0U0hBUkUgdENPTkQgdERJU1BMQVkgdFVORElTUExBWSB0RElTQVNTRU1CTEUKICV0b2tlbiB0U1RFUEkgdE5FWFRJIHRGSU5JU0ggdFNIT1cgdERJUgogJXRva2VuIDxzdHJpbmc+IHRQQVRICiAldG9rZW4gPHN0cmluZz4gdElERU5USUZJRVIgdFNUUklORwpAQCAtMTQ1LDYgKzE0NSw3IEBACiAgICAgfCB0Q09ORCB0TlVNIHRFT0wgICAgICAgICAgeyBERUJVR19BZGRCUENvbmRpdGlvbigkMiwgTlVMTCk7IH0KICAgICB8IHRDT05EIHROVU0gZXhwciB0RU9MICAgICB7IERFQlVHX0FkZEJQQ29uZGl0aW9uKCQyLCAkMyk7IH0KICAgICB8IGxpc3RfY29tbWFuZAorICAgIHwgZGlzYXNzZW1ibGVfY29tbWFuZAogICAgIHwgc2V0X2NvbW1hbmQKICAgICB8IHhfY29tbWFuZAogICAgIHwgcHJpbnRfY29tbWFuZApAQCAtMTYyLDYgKzE2MywxMSBAQAogICAgICAgdElERU5USUZJRVIgICAgICAgICAgICAgICAgICAgIHsgJCQgPSAkMTsgfQogICAgIHwgdFBBVEgJCQkgICAgIHsgJCQgPSAkMTsgfQogCitkaXNhc3NlbWJsZV9jb21tYW5kOgorICAgICAgdERJU0FTU0VNQkxFIHRFT0wgICAgICAgICAgICAgIHsgREVCVUdfRGlzYXNzZW1ibGUoIE5VTEwsIE5VTEwsIDEwICk7IH0KKyAgICB8IHRESVNBU1NFTUJMRSBleHByX2FkZHIgdEVPTCAgICB7IERFQlVHX0Rpc2Fzc2VtYmxlKCAmICQyLCBOVUxMLCAxMCApOyB9CisgICAgfCB0RElTQVNTRU1CTEUgZXhwcl9hZGRyICcsJyBleHByX2FkZHIgdEVPTCB7IERFQlVHX0Rpc2Fzc2VtYmxlKCAmICQyLCAmICQ0LCAwICk7IH0KKwogbGlzdF9jb21tYW5kOgogICAgICAgdExJU1QgdEVPTCAgICAgICAgICAgICAgIHsgREVCVUdfTGlzdCggTlVMTCwgTlVMTCwgMTAgKTsgfQogICAgIHwgdExJU1QgJy0nIHRFT0wJICAgICAgIHsgREVCVUdfTGlzdCggTlVMTCwgTlVMTCwgLTEwICk7IH0KQEAgLTI5NCw3ICszMDAsNyBAQAogCiBleHByX3ZhbHVlOgogICAgICAgZXhwciAgICAgICAgeyBEQkdfQUREUiBhZGRyICA9IERFQlVHX0V2YWxFeHByKCQxKTsKLQkJICAgICQkID0gKih1bnNpZ25lZCBpbnQgKikgYWRkci5vZmY7IH0KKwkJICAgICQkID0gYWRkci5vZmYgPyAqKHVuc2lnbmVkIGludCAqKSBhZGRyLm9mZiA6IDA7IH0KIC8qCiAgKiBUaGUgZXhwciBydWxlIGJ1aWxkcyBhbiBleHByZXNzaW9uIHRyZWUuICBXaGVuIHdlIGFyZSBkb25lLCB3ZSBjYWxsCiAgKiBFdmFsRXhwciB0byBldmFsdWF0ZSB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24uICBUaGUgYWR2YW50YWdlIG9mCmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9kZWJ1Zy5sIGIvZGVidWdnZXIvZGVidWcubAppbmRleCBkMzNiNGMwLi4xMzIyZGY2IDEwMDY0NAotLS0gYS9kZWJ1Z2dlci9kZWJ1Zy5sCisrKyBiL2RlYnVnZ2VyL2RlYnVnLmwKQEAgLTExMiw3ICsxMTIsOCBAQAogPElOSVRJQUw+ZnJhbWV8ZnJhbXxmcmF8ZnIJCXsgQkVHSU4oTk9DTUQpOyByZXR1cm4gdEZSQU1FOyB9CiA8SU5JVElBTD5saXN0fGxpc3xsaXxsCQkJeyBCRUdJTihQQVRIX0VYUEVDVEVEKTsgcmV0dXJuIHRMSVNUOyB9CiA8SU5JVElBTD5lbmFibGV8ZW5hYmx8ZW5hYnxlbmEJCXsgQkVHSU4oTk9DTUQpOyByZXR1cm4gdEVOQUJMRTt9Ci08SU5JVElBTD5kaXNhYmxlfGRpc2FibHxkaXNhYnxkaXNhfGRpcwl7IEJFR0lOKE5PQ01EKTsgcmV0dXJuIHRESVNBQkxFOyB9Cis8SU5JVElBTD5kaXNhYmxlfGRpc2FibHxkaXNhYnxkaXNhfGRpcyAgeyBCRUdJTihOT0NNRCk7IHJldHVybiB0RElTQUJMRTsgfQorPElOSVRJQUw+ZGlzYXNzZW1ibGV8ZGlzYXNzZW1ibHxkaXNhc3NlbWJ8ZGlzYXNzZW18ZGlzYXNzZXxkaXNhc3N8ZGlzYXMgeyBCRUdJTihOT0NNRCk7IHJldHVybiB0RElTQVNTRU1CTEU7IH0KIDxJTklUSUFMLElORk9fQ01ELERFTF9DTUQ+ZGlzcGxheXxkaXNwbGF8ZGlzcGx8ZGlzcAl7IEJFR0lOKEZPUk1BVF9FWFBFQ1RFRCk7IHJldHVybiB0RElTUExBWTsgfQogPElOSVRJQUw+dW5kaXNwbGF5fHVuZGlzcGxhfHVuZGlzcGx8dW5kaXNwfHVuZGlzfHVuZGl8dW5kCXsgQkVHSU4oTk9DTUQpOyByZXR1cm4gdFVORElTUExBWTsgfQogPElOSVRJQUw+ZGVsZXRlfGRlbGV0fGRlbGV8ZGVsCQl7IEJFR0lOKERFTF9DTUQpOyByZXR1cm4gdERFTEVURTsgfQpkaWZmIC0tZ2l0IGEvZGVidWdnZXIvZGlzcGxheS5jIGIvZGVidWdnZXIvZGlzcGxheS5jCmluZGV4IGZkN2U4YzYuLmIzYWM0MGQgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyL2Rpc3BsYXkuYworKysgYi9kZWJ1Z2dlci9kaXNwbGF5LmMKQEAgLTE0LDcgKzE0LDYgQEAKICNpbmNsdWRlICJtb2R1bGUuaCIKICNpbmNsdWRlICJzZWxlY3RvcnMuaCIKICNpbmNsdWRlICJkZWJ1Z2dlci5oIgotI2luY2x1ZGUgInRvb2xoZWxwLmgiCiAjaW5jbHVkZSAieG1hbGxvYy5oIgogCiAjaW5jbHVkZSA8c3RkYXJnLmg+CmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9leHByLmMgYi9kZWJ1Z2dlci9leHByLmMKaW5kZXggNjk2OGMwNi4uMTczNWVkYSAxMDA2NDQKLS0tIGEvZGVidWdnZXIvZXhwci5jCisrKyBiL2RlYnVnZ2VyL2V4cHIuYwpAQCAtMTQsNyArMTQsNiBAQAogI2luY2x1ZGUgIm1vZHVsZS5oIgogI2luY2x1ZGUgInNlbGVjdG9ycy5oIgogI2luY2x1ZGUgImRlYnVnZ2VyLmgiCi0jaW5jbHVkZSAidG9vbGhlbHAuaCIKICNpbmNsdWRlICJ4bWFsbG9jLmgiCiAKICNpbmNsdWRlICJleHByLmgiCmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9pbmZvLmMgYi9kZWJ1Z2dlci9pbmZvLmMKaW5kZXggZGQ1Yjc2YS4uMTBmZmM5NyAxMDA2NDQKLS0tIGEvZGVidWdnZXIvaW5mby5jCisrKyBiL2RlYnVnZ2VyL2luZm8uYwpAQCAtMTIxLDcgKzEyMSw3IEBACiAgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBoZWxwdGV4dFtdID0KIHsKICJUaGUgY29tbWFuZHMgYWNjZXB0ZWQgYnkgdGhlIFdpbmUgZGVidWdnZXIgYXJlIGEgcmVhc29uYWJsZSIsCi0ib2YgdGhlIGNvbW1hbmRzIHRoYXQgZ2RiIGFjY2VwdHMuIiwKKyJzdWJzZXQgb2YgdGhlIGNvbW1hbmRzIHRoYXQgZ2RiIGFjY2VwdHMuIiwKICJUaGUgY29tbWFuZHMgY3VycmVudGx5IGFyZToiLAogIiAgYnJlYWsgWyo8YWRkcj5dICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGJyZWFrIGJwbnVtIiwKICIgIGRpc2FibGUgYnBudW0gICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZSBicG51bSIsCkBAIC0xMzQsMTAgKzEzNCwxMSBAQAogIiAgeCA8YWRkcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgPGV4cHI+IiwKICIgIHNldCA8cmVnPiA9IDxleHByPiAgICAgICAgICAgICAgICAgICAgIHNldCAqPGFkZHI+ID0gPGV4cHI+IiwKICIgIHVwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd24iLAotIiAgbGlzdCA8bGluZXM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUgPG4+IiwKLSIgIGZpbmlzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3cgZGlyIiwKLSIgIGRpciA8cGF0aD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkgPGV4cHI+IiwKLSIgIGRlbGV0ZSBkaXNwbGF5IDxkaXNudW0+ICAgICAgICAgICAgICAgIHVuZGlzcGxheSA8ZGlzbnVtPlxuIiwKKyIgIGxpc3QgPGxpbmVzPiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2Fzc2VtYmxlIFs8YWRkcj5dWyw8YWRkcj5dIiwKKyIgIGZyYW1lIDxuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaCIsCisiICBzaG93IGRpciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXIgPHBhdGg+IiwKKyIgIGRpc3BsYXkgPGV4cHI+ICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGlzcGxheSA8ZGlzbnVtPiIsCisiICBkZWxldGUgZGlzcGxheSA8ZGlzbnVtPlxuIiwKIAogIldpbmUtc3BlY2lmaWMgY29tbWFuZHM6IiwKICIgIG1vZGUgWzE2LDMyXSAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbGsgW3duZCxjbGFzcyxxdWV1ZV0gPGhhbmRsZT4iLApkaWZmIC0tZ2l0IGEvZGVidWdnZXIvc291cmNlLmMgYi9kZWJ1Z2dlci9zb3VyY2UuYwppbmRleCBkOWM2NDEyLi4yZTNmMDczIDEwMDY0NAotLS0gYS9kZWJ1Z2dlci9zb3VyY2UuYworKysgYi9kZWJ1Z2dlci9zb3VyY2UuYwpAQCAtNDI2LDYgKzQyNiw5NCBAQAogICBERUJVR19lbmRfc291cmNlbGluZSA9IGVuZDsKIH0KIAorREJHX0FERFIgREVCVUdfTGFzdERpc2Fzc2VtYmxlPXtOVUxMLDAsMH07CisKK3N0YXRpYyBpbnQKK19kaXNhc3NlbWJsZShEQkdfQUREUiAqYWRkcikKK3sKKwlERUJVR19QcmludEFkZHJlc3MoIGFkZHIsIGRiZ19tb2RlLCBUUlVFICk7CisJZnByaW50ZihzdGRlcnIsIjogIik7CisJaWYgKCFEQkdfQ0hFQ0tfUkVBRF9QVFIoIGFkZHIsIDEgKSkgcmV0dXJuIDA7CisJREVCVUdfRGlzYXNtKCBhZGRyLCBUUlVFICk7CisJZnByaW50ZihzdGRlcnIsIlxuIik7CisJcmV0dXJuIDE7Cit9CisKK3ZvaWQKK19kaXNhc3NlbWJsZV9maXhhZGRyKERCR19BRERSICphZGRyKSB7CisgICAgRFdPUkQgc2VnMjsKKyAgICBzdHJ1Y3QgZGF0YXR5cGUgKnRlc3R0eXBlOworCisgICAgREJHX0ZJWF9BRERSX1NFRyhhZGRyLENTX3JlZygmREVCVUdfY29udGV4dCkpOworICAgIGlmKCBhZGRyLT50eXBlICE9IE5VTEwgKQorICAgICAgeworICAgICAgICBpZiggYWRkci0+dHlwZSA9PSBERUJVR19UeXBlSW50Q29uc3QgKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBXZSBrbm93IHRoYXQgd2UgaGF2ZSB0aGUgYWN0dWFsIG9mZnNldCBzdG9yZWQgc29tZXdoZXJlCisgICAgICAgICAgICAgKiBlbHNlIGluIDMyLWJpdCBzcGFjZS4gIEdyYWIgaXQsIGFuZCB3ZQorICAgICAgICAgICAgICogc2hvdWxkIGJlIGFsbCBzZXQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHNlZzIgPSBhZGRyLT5zZWc7CisgICAgICAgICAgICBhZGRyLT5zZWcgPSAwOworICAgICAgICAgICAgYWRkci0+b2ZmID0gREVCVUdfR2V0RXhwclZhbHVlKGFkZHIsIE5VTEwpOworICAgICAgICAgICAgYWRkci0+c2VnID0gc2VnMjsKKyAgICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIURCR19DSEVDS19SRUFEX1BUUiggYWRkciwgMSApKSByZXR1cm47CisgICAgICAgICAgICBERUJVR19UeXBlRGVyZWZQb2ludGVyKGFkZHIsICZ0ZXN0dHlwZSk7CisgICAgICAgICAgICBpZiggdGVzdHR5cGUgIT0gTlVMTCB8fCBhZGRyLT50eXBlID09IERFQlVHX1R5cGVJbnRDb25zdCApCisgICAgICAgICAgICAgICAgYWRkci0+b2ZmID0gREVCVUdfR2V0RXhwclZhbHVlKGFkZHIsIE5VTEwpOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICBlbHNlIGlmICghYWRkci0+c2VnICYmICFhZGRyLT5vZmYpCisgICAgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwiSW52YWxpZCBleHByZXNzaW9uXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KK30KKwordm9pZAorREVCVUdfRGlzYXNzZW1ibGUoY29uc3QgREJHX0FERFIgKnhzdGFydCxjb25zdCBEQkdfQUREUiAqeGVuZCxpbnQgb2Zmc2V0KQoreworICBpbnQgaTsKKyAgREJHX0FERFIJbGFzdDsKKyAgREJHX0FERFIJZW5kLHN0YXJ0OworCisKKyAgaWYgKHhzdGFydCkgeworICAgIHN0YXJ0PSp4c3RhcnQ7CisgICAgX2Rpc2Fzc2VtYmxlX2ZpeGFkZHIoJnN0YXJ0KTsKKyAgfQorICBpZiAoeGVuZCkgeworICAgIGVuZD0qeGVuZDsKKyAgICBfZGlzYXNzZW1ibGVfZml4YWRkcigmZW5kKTsKKyAgfQorICBpZiAoIXhzdGFydCAmJiAheGVuZCkgeworICAgIGxhc3QgPSBERUJVR19MYXN0RGlzYXNzZW1ibGU7CisgICAgaWYgKCFsYXN0LnNlZyAmJiAhbGFzdC5vZmYpIHsKKyAgICAgIGxhc3Quc2VnID0gKENTX3JlZygmREVCVUdfY29udGV4dCk9PVdJTkVfQ09ERV9TRUxFQ1RPUik/MDpDU19yZWcoJkRFQlVHX2NvbnRleHQpOworICAgICAgbGFzdC5vZmYgPSBFSVBfcmVnKCZERUJVR19jb250ZXh0KTsKKyAgICB9CisgICAgZm9yIChpPTA7aTxvZmZzZXQ7aSsrKQorICAgICAgaWYgKCFfZGlzYXNzZW1ibGUoJmxhc3QpKSBicmVhazsKKyAgICBtZW1jcHkoJkRFQlVHX0xhc3REaXNhc3NlbWJsZSwmbGFzdCxzaXplb2YobGFzdCkpOworICAgIHJldHVybjsKKyAgfQorICBsYXN0ID0gc3RhcnQ7CisgIGlmICgheGVuZCkgeworICAgIGZvciAoaT0wO2k8b2Zmc2V0O2krKykKKyAgICAgIGlmICghX2Rpc2Fzc2VtYmxlKCZsYXN0KSkgYnJlYWs7CisgICAgbWVtY3B5KCZERUJVR19MYXN0RGlzYXNzZW1ibGUsJmxhc3Qsc2l6ZW9mKGxhc3QpKTsKKyAgICByZXR1cm47CisgIH0KKyAgd2hpbGUgKGxhc3Qub2ZmIDw9IGVuZC5vZmYpCisgICAgaWYgKCFfZGlzYXNzZW1ibGUoJmxhc3QpKSBicmVhazsKKyAgbWVtY3B5KCZERUJVR19MYXN0RGlzYXNzZW1ibGUsJmxhc3Qsc2l6ZW9mKGxhc3QpKTsKKyAgcmV0dXJuOworfQorCiAKIAogI2lmIDAKZGlmZiAtLWdpdCBhL2RvY3VtZW50YXRpb24vZGVidWdnaW5nIGIvZG9jdW1lbnRhdGlvbi9kZWJ1Z2dpbmcKaW5kZXggNGI4YmVhZC4uNTFiZDBmYyAxMDA2NDQKLS0tIGEvZG9jdW1lbnRhdGlvbi9kZWJ1Z2dpbmcKKysrIGIvZG9jdW1lbnRhdGlvbi9kZWJ1Z2dpbmcKQEAgLTgsNyArOCw4IEBACiAKIHxVbmV4cGVjdGVkIFdpbmRvd3MgcHJvZ3JhbSBzZWdmYXVsdCAtIG9wY29kZSA9IDhiCiB8U2VnbWVudGF0aW9uIGZhdWx0IGluIFdpbmRvd3MgcHJvZ3JhbSAxYjc6YzQxLgotfFJlYWRpbmcgc3ltYm9scyBmcm9tIGZpbGUgL3Jvb3Qvd2luZS93aW5lLnN5bQorfExvYWRpbmcgc3ltYm9scyBmcm9tIEVMRiBmaWxlIC9yb290L3dpbmUvd2luZS4uLgorfC4uLi5tb3JlIExvYWRpbmcgc3ltYm9scyBmcm9tIC4uLgogfEluIDE2IGJpdCBtb2RlLgogfFJlZ2lzdGVyIGR1bXA6CiB8IENTOjAxYjcgU1M6MDE2ZiBEUzowMjg3IEVTOjAwMDAKQEAgLTIyLDE0ICsyMywxNCBAQAogfAogfDAwNTA6IHNlbD0wMjg3IGJhc2U9NDAyMTFkMzAgbGltaXQ9MGI5M2YgKGJ5dGVzKSAxNi1iaXQgcnctCiB8QmFja3RyYWNlOgotfDAgMHgwMWI3OjB4MGM0MSAoUFhTUlYuRk9OR0VURkFDRU5BTUUrMHg3YykKLXwxIDB4MDFiNzoweDFlNWIgKFBYU1JWLkZPTlBVVENBVEZPTlQrMHgyY2QpCit8MCAweDAxYjc6MHgwYzQxIChQWFNSVl9GT05HRVRGQUNFTkFNRSsweDdjKQorfDEgMHgwMWI3OjB4MWU1YiAoUFhTUlZfRk9OUFVUQ0FURk9OVCsweDJjZCkKIHwyIDB4MDFhNzoweDA1YWEKLXwzIDB4MDFiNzoweDA3NjggKFBYU1JWLkZPTklOSVRGT05UUysweDgxKQotfDQgMHgwMTRmOjB4MDNlZCAoUERPWFdJTi5AU1FMQ1VSQ0IkUTZDQlRZUEVVTE44Q0JTQ1RZUEUrMHgxYjEpCit8MyAweDAxYjc6MHgwNzY4IChQWFNSVl9GT05JTklURk9OVFMrMHg4MSkKK3w0IDB4MDE0ZjoweDAzZWQgKFBET1hXSU5fQFNRTENVUkNCJFE2Q0JUWVBFVUxOOENCU0NUWVBFKzB4MWIxKQogfDUgMHgwMTNmOjB4MDBhYwogfAotfDB4MDFiNzoweDBjNDEgKFBYU1JWLkZPTkdFVEZBQ0VOQU1FKzB4N2MpOiAgbW92dyAgICAgICAgJWVzOjB4MzgoJWJ4KSwlZHgKK3wweDAxYjc6MHgwYzQxIChQWFNSVl9GT05HRVRGQUNFTkFNRSsweDdjKTogIG1vdncgICAgICAgICVlczoweDM4KCVieCksJWR4CiAKIFN0ZXBzIHRvIGRlYnVnIGEgY3Jhc2guIFlvdSBtYXkgc3RvcCBhdCBhbnkgc3RlcCwgYnV0IHBsZWFzZSByZXBvcnQgdGhlIGJ1ZwogYW5kIHByb3ZpZGUgYXMgbXVjaCBvZiB0aGUgaW5mb3JtYXRpb24gZ2F0aGVyZWQgdG8gdGhlIG5ld3Nncm91cCBvciB0aGUKQEAgLTY3LDIzICs2OCwxMiBAQAogIDMuIElmIHlvdSBoYXZlIGZvdW5kIGEgbWlzYmVoYXZpbmcgZnVuY3Rpb24sIHRyeSB0byBmaW5kIG91dCB3aHkgaXQKICAgICBtaXNiZWhhdmVzLiBGaW5kIHRoZSBmdW5jdGlvbiBpbiB0aGUgc291cmNlIGNvZGUuIFRyeSB0byBtYWtlIHNlbnNlIG9mCiAgICAgdGhlIGFyZ3VtZW50cyBwYXNzZWQuIFVzdWFsbHkgdGhlcmUgaXMgYQotICAgICJkcHJpbnRmX3h5eihzdGRkZWIsIkZuY3Rpb24oLi4uKSIuLi4pOyIgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKKyAgICAiZHByaW50Zl94eXooc3RkZGViLCJGdW5jdGlvbiguLi4pIi4uLik7IiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQogICAgIGZ1bmN0aW9uLiBSZXJ1biB3aW5lIHdpdGggIi1kZWJ1Z21zZyAreHl6LCtyZWxheSIgYWRkZWQgdG8gdGhlCiAgICAgY29tbWFuZGxpbmUuCiAKLSA0LiBJZiB0aGUgY3Jhc2ggaGFwcGVuZWQgaW4gYSBmdW5jdGlvbiBpbiBXSU5FLCBmaW5kIG91dCB0aGUgZXhhY3QgbGluZSB1c2luZwotICAgIGdkYiAodGhlIHNhbXBsZSBjcmFzaCBoYXMgYW5vdGhlciByZWFzb24pOgotfC4uLiBzb21ld2hlcmUgaW4gdGhlIGJhY2t0cmFjZSAuLi4KLXw1IDB4MDgwZTVhZDggKENyZWF0ZVdpbmRvd0V4MzJBKzB4ZDgpCi18Li4uCi18JCBnZGIgd2luZQotfC4uLgotfChnZGIpIGwgKjB4MDgwZTVhZDgKLXwweDgwZTVhZDggaXMgaW4gQ3JlYXRlV2luZG93RXgzMkEgKHdpbi5jOjgzNykuCi18Li4uCi18ODM3ICAgICAgICAgcmV0dXJuIFdJTl9DcmVhdGVXaW5kb3dFeCggJmNzLCBjbGFzc0F0b20sIEZBTFNFICk7Ci18Li4uCi0KKyA0LiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIGhvdyB0byBkZWJ1ZyB1c2luZyB0aGUgaW50ZXJuYWwgZGVidWdnZXIgY2FuIGJlIAorICAgIGZvdW5kIGluIGRlYnVnZ2VyL1JFQURNRS4KIAogIDUuIElmIHRob3NlIGluZm9ybWF0aW9uIGlzbid0IGNsZWFyIGVub3VnaCBvciBpZiB5b3Ugd2FudCB0byBrbm93IG1vcmUgYWJvdXQKICAgICB3aGF0J3MgaGFwcGVuaW5nIGluIHRoZSBmdW5jdGlvbiBpdHNlbGYsIHRyeSBydW5uaW5nIHdpbmUgd2l0aCAiLWRlYnVnbXNnCkBAIC05Niw3ICs4Niw3IEBACiAgIAogIDcuIFlvdSBjYW4gYWxzbyBzZXQgYSBicmVha3BvaW50IGZvciB0aGF0IGZ1bmN0aW9uLiBTdGFydCB3aW5lIHdpdGggdGhlCiAgICAgIi1kZWJ1ZyIgb3B0aW9uIGFkZGVkIHRvIHRoZSBjb21tYW5kbGluZS4gQWZ0ZXIgbG9hZGluZyB0aGUgZXhlY3V0YWJsZQotICAgIHdpbmUgd2lsbCBlbnRlciB0aGUgaW50ZXJuYWwgZGVidWdnZXIuIFVzZSAiYnJlYWsgS0VSTkVMLkxTVFJMRU4iCisgICAgd2luZSB3aWxsIGVudGVyIHRoZSBpbnRlcm5hbCBkZWJ1Z2dlci4gVXNlICJicmVhayBLRVJORUxfTFNUUkxFTiIKICAgICAocmVwbGFjZSBieSBmdW5jdGlvbiB5b3Ugd2FudCB0byBkZWJ1ZywgQ0FTRSBJUyBSRUxFVkFOVC4pIHRvIHNldCBhCiAgICAgYnJlYWtwb2ludC4gIFRoZW4gdXNlICJjb250aW51ZSIgdG8gc3RhcnQgbm9ybWFsIHByb2dyYW0tZXhlY3V0aW9uLiBXaW5lCiAgICAgd2lsbCBzdG9wIGlmIGl0IHJlYWNoZXMgdGhlIGJyZWFrcG9pbnQuIElmIHRoZSBwcm9ncmFtIGlzbid0IHlldCBhdCB0aGUKQEAgLTEyMywxMCArMTEzLDkgQEAKIAogICBTaW5jZSB0aGUgZmFpbHVyZSBoYXBwZW5zIHVzdWFsbHkgZGlyZWN0bHkgYmVmb3JlIHNldHRpbmcgdXAgdGhlIE1lc3NhZ2Vib3gKICAgeW91IGNhbiBzdGFydCB3aW5lIHdpdGggIi1kZWJ1ZyIgYWRkZWQgdG8gdGhlIGNvbW1hbmRsaW5lLCBzZXQgYSBicmVha3BvaW50Ci0gIGF0ICJVU0VSLk1FU1NBR0VCT1giICh3aW4xNiBwcm9ncmFtcykgIlVTRVIzMi5NZXNzYWdlQm94IiAod2luMzIgUHJvZ3JhbXMpCi0gIGFuZCBwcm9jZWVkIHdpdGggImNvbnRpbnVlIi4gV2l0aCAiLWRlYnVnbXNnICthbGwiIFdpbmUgd2lsbCBub3cgc3RvcAotICBkaXJlY3RseSBkaXJlY3RseSBiZWZvcmUgc2V0dGluZyB1cCB0aGUgTWVzc2FnZWJveC4gIFByb2NlZWQgYXMgZXhwbGFpbmVkCi0gIGFib3ZlLgorICBhdCAiTWVzc2FnZUJveDMyQSIgKGNhbGxlZCBieSB3aW4xNiBhbmQgd2luMzIgcHJvZ3JhbXMpIGFuZCBwcm9jZWVkIHdpdGgKKyAgImNvbnRpbnVlIi4gV2l0aCAiLWRlYnVnbXNnICthbGwiIFdpbmUgd2lsbCBub3cgc3RvcCBkaXJlY3RseSBkaXJlY3RseQorICBiZWZvcmUgc2V0dGluZyB1cCB0aGUgTWVzc2FnZWJveC4gIFByb2NlZWQgYXMgZXhwbGFpbmVkIGFib3ZlLgogCiAKIERpc2Fzc2VtYmxpbmcgcHJvZ3JhbXM6CkBAIC0xODcsMTIgKzE3NiwxMiBAQAogfENhbGwgV1BST0NTLjI0OiBUQVNLX1JFU0NIRURVTEUoKSByZXQ9MDAzZjowNzU5IGRzPTAwMDAKIHxSZXQgIFdQUk9DUy4yNDogVEFTS19SRVNDSEVEVUxFKCkgcmV0dmFsPTB4MDAwMCByZXQ9MDAzZjowNzU5IGRzPTA4YTcKIHxDYWxsVG8xNihmdW5jPTAxNTc6MDAxYSxkcz0wOGE3LDB4MTFkNywweDAwMDAsMHgwMDAwLDB4M2NiNCwweDFmNDAsMHgwMDAwLDB4MDAwMCwweDA4YTcpCi18UmVhZGluZyBzeW1ib2xzIGZyb20gZmlsZSAvcm9vdC93aW5lL3dpbmUuc3ltCi18U3RvcHBlZCBvbiBicmVha3BvaW50IDEgYXQgMHgwMTU3OjB4MDAxYQorfExvYWRpbmcgc3ltYm9scyBmcm9tIEVMRiBmaWxlIC9ob21lL21hcmN1cy93aW5lL3dpbmUuLi4KK3wuLi5tb3JlIExvYWRpbmcgc3ltYm9scyAuLi4gCit8U3RvcHBlZCBvbiBicmVha3BvaW50IDEgYXQgMHgwMTU3OjB4MDAxYSAoV1BST0NTX1ZYRF9QQUdFRklMRSsweGZmZmZlZWVhKQogfEluIDE2IGJpdCBtb2RlLgotfDB4MDE1NzoweDAwMWE6ICB4b3J3CSVicCwlYnAKLXxXaW5lLWRiZz4gYnJlYWsgVVNFUi5NRVNTQUdFQk9YICAgICAgICAgICAgICAgICAgICAgICA8LS0tLSBTZXQgQnJlYWtwb2ludAotfEJyZWFrcG9pbnQgMiBhdCAweDAwNjc6MHgwMDAwMDAwMCAoVVNFUi5NRVNTQUdFQk9YKQorfFdpbmUtZGJnPmJyZWFrIE1lc3NhZ2VCb3gzMkEgICAgICAgICAgICAgICAgICAgICAgICAgIDwtLS0tIFNldCBCcmVha3BvaW50Cit8QnJlYWtwb2ludCAyIGF0IDB4MDgwZTc5MmMgKE1lc3NhZ2VCb3gzMkEgW21zZ2JveC5jOjE5OF0pCiB8V2luZS1kYmc+YyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC0tLS0gQ29udGludWUKIHxDYWxsIEtFUk5FTC45MTogSU5JVFRBU0soKSByZXQ9MDE1NzowMDIyIGRzPTA4YTcKIHwgICAgIEFYPTAwMDAgQlg9M2NiNCBDWD0xZjQwIERYPTAwMDAgU0k9MDAwMCBEST0wOGE3IEVTPTExZDcgRUZMPTAwMDAwMjg2CkBAIC0yMTksOSArMjA4LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KIAkJCQkgICB8IC0xIGFrYS4gSEZJTEVfRVJST1IKIAotfFN0b3BwZWQgb24gYnJlYWtwb2ludCAyIGF0IDB4MDA2NzoweDAwMDAwMDAwIChVU0VSLk1FU1NBR0VCT1gpCit8Q2FsbCBVU0VSLjE6IE1FU1NBR0VCT1goMHgwMDAwLDA4ZWY6ODM2MiwwMDAwOjAwMDAsMHgxMDMwKSByZXQ9MDVkNzowODRmIGRzPTA4ZWZTdG9wcGVkIG9uIGJyZWFrcG9pbnQgMiBhdCAweDA4MGU3OTJjIChNZXNzYWdlQm94MzJBIFttc2dib3guYzoxOThdKQorfDE5OCAgICAgewogfEluIDMyIGJpdCBtb2RlLgotfDB4MDA2NzoweDAwMDAwMDAwIChVU0VSLk1FU1NBR0VCT1gpOiAgcHVzaHcJJWJwCit8V2luZS1kYmc+IF8KIAogICAgIE5vdywgd2Ugc2VlIHRoYXQgT1BFTkZJTEUgc2VlbSB0byBoYXZlIHJldHVybmVkIDB4RkZGRiAob3IgLTEpLiBDaGVja2luZwogICAgIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBPcGVuRmlsZSBpbiBmaWxlcy9maWxlLmMsIHRoaXMgc2lnbmFscyBhbiBlcnJvci4KQEAgLTIzNywyMyArMjI3LDI5IEBACiB8bWFyY3VzQGpldCAkIHdpbmUgd2lud29yZC5leGUgLWRlYnVnbXNnICtyZWxheSwrZmlsZSAtZGVidWcKIHwuLi4uLm11Y2ggbW9yZSBkZWJ1Z291dHB1dCAuLi4uLgogfAotfENhbGwgS0VSTkVMLjk3OiBHRVRURU1QRklMRU5BTUUoMHgwMGMzLDA4YTc6ODM1MCwweDAwMDAsMDhhNzo4MjM0KSByZXQ9MDU4ZjowOWIxIGRzPTA4YTcKLXxGSUxFX0NyZWF0ZTogJ0M6fmRvY2QwM2QudG1wJyAwMWI2IDEKLXxGSUxFX1NldERvc0Vycm9yOiBlcnJubyA9IDEzCi18R2V0VGVtcEZpbGVOYW1lOiByZXR1cm5pbmcgQzpcfkRPQ0QwM0QuVE1QCi18UmV0ICBLRVJORUwuOTc6IEdFVFRFTVBGSUxFTkFNRSgpIHJldHZhbD0weGQwM2QgcmV0PTA1OGY6MDliMSBkcz0wOGE3Ci18Q2FsbCBLRVJORUwuNzQ6IE9QRU5GSUxFKDA4YTc6ODIzNCwwOGE3OjgyYzYsMHgxMDEyKSByZXQ9MDU4ZjowOWQ4IGRzPTA4YTcKLXxPcGVuRmlsZTogQzpcfkRPQ0QwM0QuVE1QIDEwMTIKLXxGSUxFX0FsbG9jVGFza0hhbmRsZTogcmV0dXJuaW5nIHRhc2sgaGFuZGxlIDEsIGRvc19maWxlIDAsIGZpbGUgMSBvZiAyNTQKLXxGSUxFX0NyZWF0ZTogJ0M6XH5ET0NEMDNELlRNUCcgMDFiNiAwCi18RklMRV9TZXREb3NFcnJvcjogZXJybm8gPSAxMwotfE9wZW5GaWxlKEM6XH5ET0NEMDNELlRNUCk6IHJldHVybiA9IEhGSUxFX0VSUk9SCi18RklMRV9GcmVlVGFza0hhbmRsZTogZG9zPTEgZmlsZT0wCi18UmV0ICBLRVJORUwuNzQ6IE9QRU5GSUxFKCkgcmV0dmFsPTB4ZmZmZiByZXQ9MDU4ZjowOWQ4IGRzPTA4YTcKIAotICAgIFRoZSBmaWxlbmFtZSBpcyAiQzpcfkRPQ0QwM0QuVE1QIi4gT2YgY291cnNlLCBDOlwgaXMgd3JpdGVhYmxlIGZvciB0aGUKK3xDYWxsIEtFUk5FTC45NzogR0VUVEVNUEZJTEVOQU1FKDB4MDBjMywwOGVmOjgzNTAsMHgwMDAwLDA4ZWY6ODIzNCkgcmV0PTA1ZDc6MDliMSBkcz0wOGVmCit8RklMRV9DcmVhdGU6ICdDOlx+ZG9jOGI5My50bXAnIDAxYjYgMQorfEZJTEVfU2V0RG9zRXJyb3I6IGVycm5vID0gMTMKKworfFdhcm5pbmc6IEdldFRlbXBGaWxlTmFtZSByZXR1cm5zICdDOlx+ZG9jOGI5My50bXAnLCB3aGljaCBkb2Vzbid0IHNlZW0gdG8gYmUgd3JpdGVhYmxlLgorfFBsZWFzZSBjaGVjayB5b3VyIGNvbmZpZ3VyYXRpb24gZmlsZSBpZiB0aGlzIGdlbmVyYXRlcyBhIGZhaWx1cmUuCisgXiBXYXJuaW5nIG1lc3NhZ2UKKworfEdldFRlbXBGaWxlTmFtZTogcmV0dXJuaW5nIEM6XH5kb2M4YjkzLnRtcAorfFJldCAgS0VSTkVMLjk3OiBHRVRURU1QRklMRU5BTUUoKSByZXR2YWw9MHg4YjkzIHJldD0wNWQ3OjA5YjEgZHM9MDhlZgorfENhbGwgS0VSTkVMLjc0OiBPUEVORklMRSgwOGVmOjgyMzQsMDhlZjo4MmM2LDB4MTAxMikgcmV0PTA1ZDc6MDlkOCBkcz0wOGVmCit8T3BlbkZpbGU6IEM6XH5kb2M4YjkzLnRtcCAxMDEyCit8RklMRV9DcmVhdGU6ICdDOlx+ZG9jOGI5My50bXAnIDAxYjYgMAorfEZJTEVfU2V0RG9zRXJyb3I6IGVycm5vID0gMTMKK3xPcGVuRmlsZShDOlx+ZG9jOGI5My50bXApOiByZXR1cm4gPSBIRklMRV9FUlJPUgorfFJldCAgS0VSTkVMLjc0OiBPUEVORklMRSgpIHJldHZhbD0weGZmZmYgcmV0PTA1ZDc6MDlkOCBkcz0wOGVmCisKKworICAgIFRoZSBmaWxlbmFtZSBpcyAiQzpcfmRvY2QwM2QudG1wIi4gT2YgY291cnNlLCBDOlwgaXMgd3JpdGVhYmxlIGZvciB0aGUKICAgICBzdXBlcnVzZXIgb25seSwgc28gdGhlIG9wZW4gZmFpbHMgZm9yIGEgbm9ybWFsIHVzZXIgYW5kIE9wZW5GaWxlIHJldHVybnMKLSAgICAtMSwgd2hpY2ggaW4gdHVybiBnZW5lcmF0ZXMgdGhpcyBtZXNzYWdlYm94LgorICAgIC0xLCB3aGljaCBpbiB0dXJuIGdlbmVyYXRlcyB0aGlzIG1lc3NhZ2Vib3guIChBcyBzYWlkIGJ5IHRoZSB3YXJuaW5nCisgICAgbWVzc2FnZS4pCiAKIAogV3JpdHRlbiBieSBNYXJjdXMgTWVpc3NuZXIgPG1zbWVpc3NuQGNpcC5pbmZvcm1hdGlrLnVuaS1lcmxhbmdlbi5kZT4sCmRpZmYgLS1naXQgYS9kb2N1bWVudGF0aW9uL2xhbmd1YWdlcyBiL2RvY3VtZW50YXRpb24vbGFuZ3VhZ2VzCmluZGV4IDcxZjJkNmIuLmVmNGFhNmQgMTAwNjQ0Ci0tLSBhL2RvY3VtZW50YXRpb24vbGFuZ3VhZ2VzCisrKyBiL2RvY3VtZW50YXRpb24vbGFuZ3VhZ2VzCkBAIC0xLDYgKzEsOCBAQAogVGhpcyBmaWxlIGRvY3VtZW50cyB0aGUgbmVjZXNzYXJ5IHByb2NlZHVyZSBmb3IgYWRkaW5nIGEgbmV3IGxhbmd1YWdlCiB0byB0aGUgbGlzdCBvZiBsYW5ndWFnZXMgdGhhdCBXaW5lIGNhbiBkaXNwbGF5IHN5c3RlbSBtZW51cyBhbmQgZm9ybXMKLWluLgoraW4uIEN1cnJlbnRseSBhdCBsZWFzdCB0aGUgZm9sbG93aW5nIGxhbmd1YWdlcyBhcmUgc3RpbGwgbWlzc2luZzogCitCdWxnYXJpYW4sIENoaW5lc2UsIEdyZWVrLCBJY2VsYW5kaWMsIEphcGFuZXNlLCBEdXRjaCwgUG9saXNoLCBQb3J0dWd1ZXNlLAorUm9tYW5pYW4sIFJ1c3NpYW4sIENyb2F0aWFuLCBTbG92YWssIFN3ZWRpc2gsIFR1cmtpc2gsIGFuZCBTbG92YW5pYW4uCiAKIFRvIGFkZCBhIG5ldyBsYW5ndWFnZSB5b3UgbmVlZCB0byBiZSBhYmxlIHRvIHRyYW5zbGF0ZSB0aGUgcmVsYXRpdmVseQogZmV3IHRleHRzLCBvZiBjb3Vyc2UuICBZb3Ugd2lsbCBuZWVkIHZlcnkgbGl0dGxlIGtub3dsZWRnZSBvZgpAQCAtMjIsOSArMjQsOCBAQAogMy4gIEVkaXQgaW5jbHVkZS9vcHRpb25zLmggZW51bSAiV0lORV9MQU5HVUFHRSIgdG8gaGF2ZSBhIG1lbWJlciBjYWxsZWQKICAgICBMQU5HX1hYIHdoZXJlIFhYIGlzIHRoZSBuZXcgYWJicmV2aWF0aW9uLgogCi00LiAgRWRpdCBtaXNjL29sZTJubHMuYyBmdW5jdGlvbiAiR2V0VXNlckRlZmF1bHRMQ0lEIiB0byBjb250YWluIGFuCi0gICAgZXh0cmEgY2FzZSBmb3IgeW91ciBsYW5ndWFnZS4gIFRoZSBjb3JyZWN0IHJldHVybiB2YWx1ZXMgc2VlbSB0bwotICAgIGJlIGEgbXlzdGVyeSwgYnV0IGRvbid0IHdvcnJ5LgorNC4gIEVkaXQgbWlzYy9vbGUybmxzLmMgZnVuY3Rpb24gIkdldFVzZXJEZWZhdWx0TENJRCIgdG8gY29udGFpbiBhCisgICAgY2FzZSBmb3IgeW91ciBsYW5ndWFnZSBieSB1bmNvbW1lbnRpbmcgdGhlIHJldHVybiB2YWx1ZSBvZiBpdC4KIAogNS4gIEVkaXQgcmVzb3VyY2VzL3N5c3JlYy5jIHRvIGluY2x1ZGUgInN5c3Jlc19YWC5oIiB3aGVyZSBYWCBpcyB0aGUKICAgICBhYmJyZXZpYXRpb24gZm9yIHlvdXIgbGFuZ3VhZ2UuICAoVGhhdCBmaWxlIHdpbGwgYmUgcHJvZHVjZWQgYXV0by0KZGlmZiAtLWdpdCBhL2ZpbGVzL01ha2VmaWxlLmluIGIvZmlsZXMvTWFrZWZpbGUuaW4KaW5kZXggNGEyNzM1ZS4uNzg4YWU2ZCAxMDA2NDQKLS0tIGEvZmlsZXMvTWFrZWZpbGUuaW4KKysrIGIvZmlsZXMvTWFrZWZpbGUuaW4KQEAgLTEsNiArMSw2IEBACiBwcmVmaXggICAgID0gQHByZWZpeEAKIHN5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKLURFRlMgICAgICAgPSAtRF9fV0lORV9fICAtRE5PX1RSQU5TSVRJT05fVFlQRVMgLURFVENESVI9XCIkKHN5c2NvbmZkaXIpXCIKK0RFRlMgICAgICAgPSAtRF9fV0lORV9fIC1ERVRDRElSPVwiJChzeXNjb25mZGlyKVwiCiBUT1BTUkNESVIgID0gQHRvcF9zcmNkaXJACiBUT1BPQkpESVIgID0gLi4KIFNSQ0RJUiAgICAgPSBAc3JjZGlyQApkaWZmIC0tZ2l0IGEvZmlsZXMvZHJpdmUuYyBiL2ZpbGVzL2RyaXZlLmMKaW5kZXggOGIwNDQ5My4uZGFiZWJmOCAxMDA2NDQKLS0tIGEvZmlsZXMvZHJpdmUuYworKysgYi9maWxlcy9kcml2ZS5jCkBAIC01ODIsNyArNTgyLDcgQEAKICAqLwogVUlOVDE2IEdldERyaXZlVHlwZTE2KCBVSU5UMTYgZHJpdmUgKQogewotICAgIGRwcmludGZfZG9zZnMoIHN0ZGRlYiwgIkdldERyaXZlVHlwZSglYzopXG4iLCAnQScgKyBkcml2ZSApOworICAgIGRwcmludGZfZG9zZnMoIHN0ZGRlYiwgIkdldERyaXZlVHlwZTE2KCVjOilcbiIsICdBJyArIGRyaXZlICk7CiAgICAgc3dpdGNoKERSSVZFX0dldFR5cGUoZHJpdmUpKQogICAgIHsKICAgICBjYXNlIFRZUEVfRkxPUFBZOiAgcmV0dXJuIERSSVZFX1JFTU9WQUJMRTsKZGlmZiAtLWdpdCBhL2ZpbGVzL2ZpbGUuYyBiL2ZpbGVzL2ZpbGUuYwppbmRleCA5ZThhMDQyLi4xNWI2YjFhIDEwMDY0NAotLS0gYS9maWxlcy9maWxlLmMKKysrIGIvZmlsZXMvZmlsZS5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8c3lzL2Vycm5vLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgogI2luY2x1ZGUgPHRpbWUuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDx1dGltZS5oPgpAQCAtMzMsMTUgKzM0LDkgQEAKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBLMzJPQkogICAgaGVhZGVyOwotICAgIGludCAgICAgICB1bml4X2hhbmRsZTsKLSAgICBpbnQgICAgICAgbW9kZTsKLSAgICBjaGFyICAgICAqdW5peF9uYW1lOwotICAgIERXT1JEICAgICB0eXBlOyAgICAgICAgIC8qIFR5cGUgZm9yIHdpbjMyIGFwcHMgKi8KLX0gRE9TX0ZJTEU7CisjaWYgZGVmaW5lZChNQVBfQU5PTllNT1VTKSAmJiAhZGVmaW5lZChNQVBfQU5PTikKKyNkZWZpbmUgTUFQX0FOT04gTUFQX0FOT05ZTU9VUworI2VuZGlmCiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC00OSwxMCArNDQsMTAgQEAKICAqCiAgKiBBbGxvY2F0ZSBhIGZpbGUuCiAgKi8KLXN0YXRpYyBIRklMRTMyIEZJTEVfQWxsb2MoIERPU19GSUxFICoqZmlsZSApCitzdGF0aWMgSEZJTEUzMiBGSUxFX0FsbG9jKCBGSUxFX09CSkVDVCAqKmZpbGUgKQogewogICAgIEhGSUxFMzIgaGFuZGxlOwotICAgICpmaWxlID0gSGVhcEFsbG9jKCBTeXN0ZW1IZWFwLCAwLCBzaXplb2YoRE9TX0ZJTEUpICk7CisgICAgKmZpbGUgPSBIZWFwQWxsb2MoIFN5c3RlbUhlYXAsIDAsIHNpemVvZihGSUxFX09CSkVDVCkgKTsKICAgICBpZiAoISpmaWxlKQogICAgIHsKICAgICAgICAgRE9TX0VSUk9SKCBFUl9Ub29NYW55T3BlbkZpbGVzLCBFQ19Qcm9ncmFtRXJyb3IsIFNBX0Fib3J0LCBFTF9EaXNrICk7CkBAIC03Nyw3ICs3Miw3IEBACiAgKi8KIHZvaWQgRklMRV9EZXN0cm95KCBLMzJPQkogKnB0ciApCiB7Ci0gICAgRE9TX0ZJTEUgKmZpbGUgPSAoRE9TX0ZJTEUgKilwdHI7CisgICAgRklMRV9PQkpFQ1QgKmZpbGUgPSAoRklMRV9PQkpFQ1QgKilwdHI7CiAgICAgYXNzZXJ0KCBwdHItPnR5cGUgPT0gSzMyT0JKX0ZJTEUgKTsKIAogICAgIGlmIChmaWxlLT51bml4X2hhbmRsZSAhPSAtMSkgY2xvc2UoIGZpbGUtPnVuaXhfaGFuZGxlICk7CkBAIC05Myw5ICs4OCw5IEBACiAgKiBSZXR1cm4gdGhlIERPUyBmaWxlIGFzc29jaWF0ZWQgdG8gYSB0YXNrIGZpbGUgaGFuZGxlLiBGSUxFX1JlbGVhc2VGaWxlIG11c3QKICAqIGJlIGNhbGxlZCB0byByZWxlYXNlIHRoZSBmaWxlLgogICovCi1zdGF0aWMgRE9TX0ZJTEUgKkZJTEVfR2V0RmlsZSggSEZJTEUzMiBoYW5kbGUgKQorc3RhdGljIEZJTEVfT0JKRUNUICpGSUxFX0dldEZpbGUoIEhGSUxFMzIgaGFuZGxlICkKIHsKLSAgICByZXR1cm4gKERPU19GSUxFICopUFJPQ0VTU19HZXRPYmpQdHIoIGhhbmRsZSwgSzMyT0JKX0ZJTEUgKTsKKyAgICByZXR1cm4gKEZJTEVfT0JKRUNUICopUFJPQ0VTU19HZXRPYmpQdHIoIGhhbmRsZSwgSzMyT0JKX0ZJTEUgKTsKIH0KIAogCkBAIC0xMDQsNyArOTksNyBAQAogICoKICAqIFJlbGVhc2UgYSBET1MgZmlsZSBvYnRhaW5lZCB3aXRoIEZJTEVfR2V0RmlsZS4KICAqLwotc3RhdGljIHZvaWQgRklMRV9SZWxlYXNlRmlsZSggRE9TX0ZJTEUgKmZpbGUgKQorc3RhdGljIHZvaWQgRklMRV9SZWxlYXNlRmlsZSggRklMRV9PQkpFQ1QgKmZpbGUgKQogewogICAgIEszMk9CSl9EZWNDb3VudCggJmZpbGUtPmhlYWRlciApOwogfQpAQCAtMTE3LDcgKzExMiw3IEBACiAgKi8KIGludCBGSUxFX0dldFVuaXhIYW5kbGUoIEhGSUxFMzIgaEZpbGUgKQogewotICAgIERPU19GSUxFICpmaWxlOworICAgIEZJTEVfT0JKRUNUICpmaWxlOwogICAgIGludCByZXQ7CiAKICAgICBpZiAoIShmaWxlID0gRklMRV9HZXRGaWxlKCBoRmlsZSApKSkgcmV0dXJuIC0xOwpAQCAtMTgzLDcgKzE3OCw3IEBACiBIRklMRTMyIEZJTEVfRHVwVW5peEhhbmRsZSggaW50IGZkICkKIHsKICAgICBIRklMRTMyIGhhbmRsZTsKLSAgICBET1NfRklMRSAqZmlsZTsKKyAgICBGSUxFX09CSkVDVCAqZmlsZTsKIAogICAgIGlmICgoaGFuZGxlID0gRklMRV9BbGxvYyggJmZpbGUgKSkgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUzMikKICAgICB7CkBAIC0yMDQsNyArMTk5LDcgQEAKIHN0YXRpYyBIRklMRTMyIEZJTEVfT3BlblVuaXhGaWxlKCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbW9kZSApCiB7CiAgICAgSEZJTEUzMiBoYW5kbGU7Ci0gICAgRE9TX0ZJTEUgKmZpbGU7CisgICAgRklMRV9PQkpFQ1QgKmZpbGU7CiAgICAgc3RydWN0IHN0YXQgc3Q7CiAKICAgICBpZiAoKGhhbmRsZSA9IEZJTEVfQWxsb2MoICZmaWxlICkpID09IElOVkFMSURfSEFORExFX1ZBTFVFMzIpCkBAIC0yMjgsNyArMjIzLDcgQEAKICAgICAgICAgcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFMzI7CiAgICAgfQogCi0gICAgLyogRmlsZSBvcGVuZWQgT0ssIG5vdyBmaWxsIHRoZSBET1NfRklMRSAqLworICAgIC8qIEZpbGUgb3BlbmVkIE9LLCBub3cgZmlsbCB0aGUgRklMRV9PQkpFQ1QgKi8KIAogICAgIGZpbGUtPnVuaXhfbmFtZSA9IEhFQVBfc3RyZHVwQSggU3lzdGVtSGVhcCwgMCwgbmFtZSApOwogICAgIHJldHVybiBoYW5kbGU7CkBAIC0yNzAsNyArMjY1LDcgQEAKIHN0YXRpYyBIRklMRTMyIEZJTEVfQ3JlYXRlKCBMUENTVFIgcGF0aCwgaW50IG1vZGUsIGludCB1bmlxdWUgKQogewogICAgIEhGSUxFMzIgaGFuZGxlOwotICAgIERPU19GSUxFICpmaWxlOworICAgIEZJTEVfT0JKRUNUICpmaWxlOwogICAgIGNvbnN0IGNoYXIgKnVuaXhOYW1lOwogICAgIERPU19GVUxMX05BTUUgZnVsbF9uYW1lOwogCkBAIC0zMDAsNyArMjk1LDcgQEAKICAgICAgICAgcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFMzI7CiAgICAgfSAKIAotICAgIC8qIEZpbGUgY3JlYXRlZCBPSywgbm93IGZpbGwgdGhlIERPU19GSUxFICovCisgICAgLyogRmlsZSBjcmVhdGVkIE9LLCBub3cgZmlsbCB0aGUgRklMRV9PQkpFQ1QgKi8KIAogICAgIGZpbGUtPnVuaXhfbmFtZSA9IEhFQVBfc3RyZHVwQSggU3lzdGVtSGVhcCwgMCwgZnVsbF9uYW1lLmxvbmdfbmFtZSApOwogICAgIHJldHVybiBoYW5kbGU7CkBAIC0zNTgsNyArMzUzLDcgQEAKIERXT1JEIEdldEZpbGVJbmZvcm1hdGlvbkJ5SGFuZGxlKCBIRklMRTMyIGhGaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJZX0hBTkRMRV9GSUxFX0lORk9STUFUSU9OICppbmZvICkKIHsKLSAgICBET1NfRklMRSAqZmlsZTsKKyAgICBGSUxFX09CSkVDVCAqZmlsZTsKICAgICBEV09SRCByZXQgPSAwOwogICAgIHN0cnVjdCBzdGF0IHN0OwogCkBAIC00NTgsNyArNDUzLDcgQEAKICAqLwogSEZJTEUzMiBGSUxFX0R1cCggSEZJTEUzMiBoRmlsZSApCiB7Ci0gICAgRE9TX0ZJTEUgKmZpbGU7CisgICAgRklMRV9PQkpFQ1QgKmZpbGU7CiAgICAgSEZJTEUzMiBoYW5kbGU7CiAKICAgICBkcHJpbnRmX2ZpbGUoIHN0ZGRlYiwgIkZJTEVfRHVwIGZvciBoYW5kbGUgJWRcbiIsIGhGaWxlICk7CkBAIC00NzcsNyArNDcyLDcgQEAKICAqLwogSEZJTEUzMiBGSUxFX0R1cDIoIEhGSUxFMzIgaEZpbGUxLCBIRklMRTMyIGhGaWxlMiApCiB7Ci0gICAgRE9TX0ZJTEUgKmZpbGU7CisgICAgRklMRV9PQkpFQ1QgKmZpbGU7CiAKICAgICBkcHJpbnRmX2ZpbGUoIHN0ZGRlYiwgIkZJTEVfRHVwMiBmb3IgaGFuZGxlICVkXG4iLCBoRmlsZTEgKTsKICAgICBpZiAoIShmaWxlID0gRklMRV9HZXRGaWxlKCBoRmlsZTEgKSkpIHJldHVybiBIRklMRV9FUlJPUjMyOwpAQCAtNTQzLDcgKzUzOCw4IEBACiAgICAgICAgICAgICBIRklMRTMyIGhhbmRsZSA9IEZJTEVfQ3JlYXRlKCBidWZmZXIsIDA2NjYsIFRSVUUgKTsKICAgICAgICAgICAgIGlmIChoYW5kbGUgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUzMikKICAgICAgICAgICAgIHsgIC8qIFdlIGNyZWF0ZWQgaXQgKi8KLSAgICAgICAgICAgICAgICBkcHJpbnRmX2ZpbGUoIHN0ZGRlYiwgIkdldFRlbXBGaWxlTmFtZTogY3JlYXRlZCAlc1xuIiwgYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBkcHJpbnRmX2ZpbGUoIHN0ZGRlYiwgIkdldFRlbXBGaWxlTmFtZTMyQTogY3JlYXRlZCAlc1xuIiwKKwkJCSAgICAgIGJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgQ2xvc2VIYW5kbGUoIGhhbmRsZSApOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtNTY2LDcgKzU2Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAiUGxlYXNlIGNoZWNrIHlvdXIgY29uZmlndXJhdGlvbiBmaWxlIGlmIHRoaXMgZ2VuZXJhdGVzIGEgZmFpbHVyZS5cbiIsCiAgICAgICAgICAgICAgICAgICAgICBidWZmZXIpOwogICAgIH0KLSAgICBkcHJpbnRmX2ZpbGUoIHN0ZGRlYiwgIkdldFRlbXBGaWxlTmFtZTogcmV0dXJuaW5nICVzXG4iLCBidWZmZXIgKTsKKyAgICBkcHJpbnRmX2ZpbGUoIHN0ZGRlYiwgIkdldFRlbXBGaWxlTmFtZTMyQTogcmV0dXJuaW5nICVzXG4iLCBidWZmZXIgKTsKICAgICByZXR1cm4gdW5pcXVlID8gdW5pcXVlIDogbnVtOwogfQogCkBAIC03NTgsNyArNzU0LDcgQEAKIHsKICAgICBMT05HIG1heGxlbjsKIAotICAgIGRwcmludGZfZmlsZSggc3RkZGViLCAiX2hyZWFkMTY6ICVkICUwOGx4ICVsZFxuIiwKKyAgICBkcHJpbnRmX2ZpbGUoIHN0ZGRlYiwgIldJTjE2X2hyZWFkOiAlZCAlMDhseCAlbGRcbiIsCiAgICAgICAgICAgICAgICAgICBoRmlsZSwgKERXT1JEKWJ1ZmZlciwgY291bnQgKTsKIAogICAgIC8qIFNvbWUgcHJvZ3JhbXMgcGFzcyBhIGNvdW50IGxhcmdlciB0aGFuIHRoZSBhbGxvY2F0ZWQgYnVmZmVyICovCkBAIC03ODIsNyArNzc4LDcgQEAKICAqLwogVUlOVDMyIF9scmVhZDMyKCBIRklMRTMyIGhGaWxlLCBMUFZPSUQgYnVmZmVyLCBVSU5UMzIgY291bnQgKQogewotICAgIERPU19GSUxFICpmaWxlOworICAgIEZJTEVfT0JKRUNUICpmaWxlOwogICAgIFVJTlQzMiByZXN1bHQ7CiAKICAgICBkcHJpbnRmX2ZpbGUoIHN0ZGRlYiwgIl9scmVhZDMyOiAlZCAlcCAlZFxuIiwgaEZpbGUsIGJ1ZmZlciwgY291bnQgKTsKQEAgLTgzMiw3ICs4MjgsNyBAQAogSEZJTEUzMiBfbGNyZWF0X3VuaXEoIExQQ1NUUiBwYXRoLCBJTlQzMiBhdHRyICkKIHsKICAgICBpbnQgbW9kZSA9IChhdHRyICYgMSkgPyAwNDQ0IDogMDY2NjsKLSAgICBkcHJpbnRmX2ZpbGUoIHN0ZGRlYiwgIl9sY3JlYXQ6ICVzICUwMnhcbiIsIHBhdGgsIGF0dHIgKTsKKyAgICBkcHJpbnRmX2ZpbGUoIHN0ZGRlYiwgIl9sY3JlYXRfdW5pcTogJXMgJTAyeFxuIiwgcGF0aCwgYXR0ciApOwogICAgIHJldHVybiBGSUxFX0NyZWF0ZSggcGF0aCwgbW9kZSwgVFJVRSApOwogfQogCkBAIC04NDMsNyArODM5LDcgQEAKIERXT1JEIFNldEZpbGVQb2ludGVyKCBIRklMRTMyIGhGaWxlLCBMT05HIGRpc3RhbmNlLCBMT05HICpoaWdod29yZCwKICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBtZXRob2QgKQogewotICAgIERPU19GSUxFICpmaWxlOworICAgIEZJTEVfT0JKRUNUICpmaWxlOwogICAgIGludCBvcmlnaW4sIHJlc3VsdDsKIAogICAgIGlmIChoaWdod29yZCAmJiAqaGlnaHdvcmQpCkBAIC04NTgsOSArODU0LDkgQEAKICAgICBpZiAoIShmaWxlID0gRklMRV9HZXRGaWxlKCBoRmlsZSApKSkgcmV0dXJuIDB4ZmZmZmZmZmY7CiAgICAgc3dpdGNoKG1ldGhvZCkKICAgICB7Ci0gICAgICAgIGNhc2UgMTogIG9yaWdpbiA9IFNFRUtfQ1VSOyBicmVhazsKLSAgICAgICAgY2FzZSAyOiAgb3JpZ2luID0gU0VFS19FTkQ7IGJyZWFrOwotICAgICAgICBkZWZhdWx0OiBvcmlnaW4gPSBTRUVLX1NFVDsgYnJlYWs7CisgICAgICAgIGNhc2UgRklMRV9DVVJSRU5UOiBvcmlnaW4gPSBTRUVLX0NVUjsgYnJlYWs7CisgICAgICAgIGNhc2UgRklMRV9FTkQ6ICAgICBvcmlnaW4gPSBTRUVLX0VORDsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICBvcmlnaW4gPSBTRUVLX1NFVDsgYnJlYWs7CiAgICAgfQogCiAgICAgaWYgKChyZXN1bHQgPSBsc2VlayggZmlsZS0+dW5peF9oYW5kbGUsIGRpc3RhbmNlLCBvcmlnaW4gKSkgPT0gLTEpCkBAIC05MDQsNyArOTAwLDcgQEAKIHsKICAgICBJTlQzMiB1bml4TW9kZTsKIAotICAgIGRwcmludGZfZmlsZShzdGRkZWIsICJfbG9wZW4oJyVzJywlMDR4KVxuIiwgcGF0aCwgbW9kZSApOworICAgIGRwcmludGZfZmlsZShzdGRkZWIsICJfbG9wZW4zMignJXMnLCUwNHgpXG4iLCBwYXRoLCBtb2RlICk7CiAKICAgICBzd2l0Y2gobW9kZSAmIDMpCiAgICAgewpAQCAtOTcyLDEwICs5NjgsMTAgQEAKICAqLwogTE9ORyBfaHdyaXRlMzIoIEhGSUxFMzIgaEZpbGUsIExQQ1NUUiBidWZmZXIsIExPTkcgY291bnQgKQogewotICAgIERPU19GSUxFICpmaWxlOworICAgIEZJTEVfT0JKRUNUICpmaWxlOwogICAgIExPTkcgcmVzdWx0OwogCi0gICAgZHByaW50Zl9maWxlKCBzdGRkZWIsICJfaHdyaXRlOiAlZCAlcCAlbGRcbiIsIGhGaWxlLCBidWZmZXIsIGNvdW50ICk7CisgICAgZHByaW50Zl9maWxlKCBzdGRkZWIsICJfaHdyaXRlMzI6ICVkICVwICVsZFxuIiwgaEZpbGUsIGJ1ZmZlciwgY291bnQgKTsKIAogICAgIGlmICghKGZpbGUgPSBGSUxFX0dldEZpbGUoIGhGaWxlICkpKSByZXR1cm4gSEZJTEVfRVJST1IzMjsKICAgICBpZiAoY291bnQgPT0gMCkgIC8qIEV4cGFuZCBvciB0cnVuY2F0ZSBhdCBjdXJyZW50IHBvc2l0aW9uICovCkBAIC05OTksNyArOTk1LDcgQEAKICAgICBQREIgKnBkYiA9IChQREIgKilHbG9iYWxMb2NrMTYoIGhQREIgKTsKICAgICBCWVRFICpmaWxlcyA9IFBUUl9TRUdfVE9fTElOKCBwZGItPmZpbGVIYW5kbGVzUHRyICk7CiAKLSAgICBkcHJpbnRmX2ZpbGUoIHN0ZGRlYiwgIlNldEhhbmRsZUNvdW50KCVkKVxuIiwgY291bnQgKTsKKyAgICBkcHJpbnRmX2ZpbGUoIHN0ZGRlYiwgIlNldEhhbmRsZUNvdW50MTYoJWQpXG4iLCBjb3VudCApOwogCiAgICAgaWYgKGNvdW50IDwgMjApIGNvdW50ID0gMjA7ICAvKiBObyBwb2ludCBpbiBnb2luZyBiZWxvdyAyMCAqLwogICAgIGVsc2UgaWYgKGNvdW50ID4gMjU0KSBjb3VudCA9IDI1NDsKQEAgLTEwNTYsNyArMTA1Miw3IEBACiAgKi8KIEJPT0wzMiBGbHVzaEZpbGVCdWZmZXJzKCBIRklMRTMyIGhGaWxlICkKIHsKLSAgICBET1NfRklMRSAqZmlsZTsKKyAgICBGSUxFX09CSkVDVCAqZmlsZTsKICAgICBCT09MMzIgcmV0OwogCiAgICAgZHByaW50Zl9maWxlKCBzdGRkZWIsICJGbHVzaEZpbGVCdWZmZXJzKCVkKVxuIiwgaEZpbGUgKTsKQEAgLTEwNzcsNyArMTA3Myw3IEBACiAgKi8KIEJPT0wzMiBTZXRFbmRPZkZpbGUoIEhGSUxFMzIgaEZpbGUgKQogewotICAgIERPU19GSUxFICpmaWxlOworICAgIEZJTEVfT0JKRUNUICpmaWxlOwogICAgIEJPT0wzMiByZXQgPSBUUlVFOwogCiAgICAgZHByaW50Zl9maWxlKCBzdGRkZWIsICJTZXRFbmRPZkZpbGUoJWQpXG4iLCBoRmlsZSApOwpAQCAtMTE0Niw3ICsxMTQyLDcgQEAKICAqLwogQk9PTDMyIEZJTEVfU2V0RmlsZVR5cGUoIEhGSUxFMzIgaEZpbGUsIERXT1JEIHR5cGUgKQogewotICAgIERPU19GSUxFICpmaWxlID0gRklMRV9HZXRGaWxlKCBoRmlsZSApOworICAgIEZJTEVfT0JKRUNUICpmaWxlID0gRklMRV9HZXRGaWxlKCBoRmlsZSApOwogICAgIGlmICghZmlsZSkgcmV0dXJuIEZBTFNFOwogICAgIGZpbGUtPnR5cGUgPSB0eXBlOwogICAgIEZJTEVfUmVsZWFzZUZpbGUoIGZpbGUgKTsKQEAgLTExNTUsMTEgKzExNTEsNDggQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBGSUxFX21tYXAKKyAqLworTFBWT0lEIEZJTEVfbW1hcCggRklMRV9PQkpFQ1QgKmZpbGUsIExQVk9JRCBzdGFydCwKKyAgICAgICAgICAgICAgICAgIERXT1JEIHNpemVfaGlnaCwgRFdPUkQgc2l6ZV9sb3csCisgICAgICAgICAgICAgICAgICBEV09SRCBvZmZzZXRfaGlnaCwgRFdPUkQgb2Zmc2V0X2xvdywKKyAgICAgICAgICAgICAgICAgIGludCBwcm90LCBpbnQgZmxhZ3MgKQoreworICAgIGludCBmZCA9IC0xOworCisgICAgaWYgKHNpemVfaGlnaCB8fCBvZmZzZXRfaGlnaCkKKyAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiRklMRV9tbWFwOiBvZmZzZXRzIGxhcmdlciB0aGFuIDRHYiBub3Qgc3VwcG9ydGVkXG4iKTsKKworICAgIGlmICghZmlsZSkKKyAgICB7CisjaWZkZWYgTUFQX0FOT04KKyAgICAgICAgZmxhZ3MgfD0gTUFQX0FOT047CisjZWxzZQorICAgICAgICBzdGF0aWMgaW50IGZkemVybyA9IC0xOworCisgICAgICAgIGlmIChmZHplcm8gPT0gLTEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoZmR6ZXJvID0gb3BlbiggIi9kZXYvemVybyIsIE9fUkRPTkxZICkpID09IC0xKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBlcnJvciggIi9kZXYvemVybzogb3BlbiIgKTsKKyAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZkID0gZmR6ZXJvOworI2VuZGlmICAvKiBNQVBfQU5PTiAqLworICAgIH0KKyAgICBlbHNlIGZkID0gZmlsZS0+dW5peF9oYW5kbGU7CisKKyAgICByZXR1cm4gbW1hcCggc3RhcnQsIHNpemVfbG93LCBwcm90LCBmbGFncywgZmQsIG9mZnNldF9sb3cgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBHZXRGaWxlVHlwZSAgIChLRVJORUwzMi4yMjIpCiAgKi8KIERXT1JEIEdldEZpbGVUeXBlKCBIRklMRTMyIGhGaWxlICkKIHsKLSAgICBET1NfRklMRSAqZmlsZSA9IEZJTEVfR2V0RmlsZShoRmlsZSk7CisgICAgRklMRV9PQkpFQ1QgKmZpbGUgPSBGSUxFX0dldEZpbGUoaEZpbGUpOwogICAgIGlmICghZmlsZSkgcmV0dXJuIEZJTEVfVFlQRV9VTktOT1dOOyAvKiBGSVhNRTogY29ycmVjdD8gKi8KICAgICBGSUxFX1JlbGVhc2VGaWxlKCBmaWxlICk7CiAgICAgcmV0dXJuIGZpbGUtPnR5cGU7CkBAIC0xMjY3LDcgKzEzMDAsNyBAQAogICAgICAgICAgICAgICAgICAgICBjb25zdCBGSUxFVElNRSAqbHBMYXN0QWNjZXNzVGltZSwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklMRVRJTUUgKmxwTGFzdFdyaXRlVGltZSApCiB7Ci0gICAgRE9TX0ZJTEUgKmZpbGUgPSBGSUxFX0dldEZpbGUoaEZpbGUpOworICAgIEZJTEVfT0JKRUNUICpmaWxlID0gRklMRV9HZXRGaWxlKGhGaWxlKTsKICAgICBzdHJ1Y3QgdXRpbWJ1ZiB1dGltYnVmOwogICAgIAogICAgIGlmICghZmlsZSkgcmV0dXJuIEZJTEVfVFlQRV9VTktOT1dOOyAvKiBGSVhNRTogY29ycmVjdD8gKi8KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL01ha2VmaWxlLmluIGIvZ3JhcGhpY3MvTWFrZWZpbGUuaW4KaW5kZXggNTMzOTU5Ni4uZGRiMTEyOSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvTWFrZWZpbGUuaW4KKysrIGIvZ3JhcGhpY3MvTWFrZWZpbGUuaW4KQEAgLTEsNCArMSw0IEBACi1ERUZTICAgICAgPSAtRF9fV0lORV9fIC1ETk9fVFJBTlNJVElPTl9UWVBFUworREVGUyAgICAgID0gLURfX1dJTkVfXwogVE9QU1JDRElSID0gQHRvcF9zcmNkaXJACiBUT1BPQkpESVIgPSAuLgogU1JDRElSICAgID0gQHNyY2RpckAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL21ldGFmaWxlZHJ2L01ha2VmaWxlLmluIGIvZ3JhcGhpY3MvbWV0YWZpbGVkcnYvTWFrZWZpbGUuaW4KaW5kZXggZmY1MzhmMi4uYjBjZDgzNSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvbWV0YWZpbGVkcnYvTWFrZWZpbGUuaW4KKysrIGIvZ3JhcGhpY3MvbWV0YWZpbGVkcnYvTWFrZWZpbGUuaW4KQEAgLTEsNCArMSw0IEBACi1ERUZTICAgICAgPSAtRF9fV0lORV9fIC1ETk9fVFJBTlNJVElPTl9UWVBFUworREVGUyAgICAgID0gLURfX1dJTkVfXwogVE9QU1JDRElSID0gQHRvcF9zcmNkaXJACiBUT1BPQkpESVIgPSAuLi8uLgogU1JDRElSICAgID0gQHNyY2RpckAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3dpbjE2ZHJ2L01ha2VmaWxlLmluIGIvZ3JhcGhpY3Mvd2luMTZkcnYvTWFrZWZpbGUuaW4KaW5kZXggYWQ3MWI5OS4uMGM0MDhhZCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3Mvd2luMTZkcnYvTWFrZWZpbGUuaW4KKysrIGIvZ3JhcGhpY3Mvd2luMTZkcnYvTWFrZWZpbGUuaW4KQEAgLTEsNCArMSw0IEBACi1ERUZTICAgICAgPSAtRF9fV0lORV9fIC1ETk9fVFJBTlNJVElPTl9UWVBFUworREVGUyAgICAgID0gLURfX1dJTkVfXwogVE9QU1JDRElSID0gQHRvcF9zcmNkaXJACiBUT1BPQkpESVIgPSAuLi8uLgogU1JDRElSICAgID0gQHNyY2RpckAKQEAgLTgsNiArOCw3IEBACiBDX1NSQ1MgPSBcCiAJZm9udC5jIFwKIAlpbml0LmMgXAorCW9iamVjdHMuYyBcCiAJdGV4dC5jCiAKIGFsbDogJChNT0RVTEUpLm8KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3dpbjE2ZHJ2L2ZvbnQuYyBiL2dyYXBoaWNzL3dpbjE2ZHJ2L2ZvbnQuYwppbmRleCA2ZWRjOGRmLi42NzhlZDkwIDEwMDY0NAotLS0gYS9ncmFwaGljcy93aW4xNmRydi9mb250LmMKKysrIGIvZ3JhcGhpY3Mvd2luMTZkcnYvZm9udC5jCkBAIC04LDYgKzgsNyBAQAogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJ3aW4xNmRydi5oIgogI2luY2x1ZGUgImdkaS5oIgorI2luY2x1ZGUgImZvbnQuaCIKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTcxLDMgKzcyLDEwIEBACiAKICAgICByZXR1cm4gVFJVRTsKIH0KKworSEZPTlQzMiBXSU4xNkRSVl9GT05UX1NlbGVjdE9iamVjdCggREMgKiBkYywgSEZPTlQzMiBoZm9udCwgRk9OVE9CSiAqIGZvbnQpCit7CisgICAgLyogVFREICovCisgICAgcHJpbnRmKCJJbiBXSU4xNkRSVl9GT05UX1NlbGVjdE9iamVjdFxuIik7CisgICAgcmV0dXJuIEdldFN0b2NrT2JqZWN0MzIoU1lTVEVNX0ZJWEVEX0ZPTlQpOworfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3Mvd2luMTZkcnYvaW5pdC5jIGIvZ3JhcGhpY3Mvd2luMTZkcnYvaW5pdC5jCmluZGV4IDNhOWI3NDIuLmZlYzBlYjAgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3dpbjE2ZHJ2L2luaXQuYworKysgYi9ncmFwaGljcy93aW4xNmRydi9pbml0LmMKQEAgLTc1LDcgKzc1LDcgQEAKICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwU2NhbGVWaWV3cG9ydEV4dEV4ICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcFNjYWxlV2luZG93RXh0RXggKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwU2VsZWN0Q2xpcFJnbiAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBTZWxlY3RPYmplY3QgKi8KKyAgICBXSU4xNkRSVl9TZWxlY3RPYmplY3QsICAgICAgICAgICAvKiBwU2VsZWN0T2JqZWN0ICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcFNlbGVjdFBhbGV0dGUgKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwU2V0QmtDb2xvciAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBTZXRCa01vZGUgKi8KQEAgLTY5MCw4ICs2OTAsNyBAQAogICAgIC8qIHBhc3NpbmcgaW5mb3JtYXRpb24gb24gdGhlIGF2YWlsYWJsZSBmb250cyAqLwogICAgIGlmIChwTFBELT5wYVByaW50ZXJGb250cyA9PSBOVUxMKQogICAgIHsKLQlwZm5DYWxsYmFjayA9IEdldFByb2NBZGRyZXNzMTYoR2V0TW9kdWxlSGFuZGxlKCJHREkiKSwgCi0JCQkJICAgICAoTUFLRUlOVFJFU09VUkNFKDE1OCkpKTsKKwlwZm5DYWxsYmFjayA9IE1PRFVMRV9HZXRFbnRyeVBvaW50KCBHZXRNb2R1bGVIYW5kbGUxNigiR0RJIiksIDE1OCApOwogICAgICAgICAKIAlpZiAocGZuQ2FsbGJhY2sgIT0gTlVMTCkKIAl7CkBAIC04MTMsNyArODEyLDcgQEAKICAgICBpZiAoKHBMUEQgPSBGaW5kUHJpbnRlckRyaXZlckZyb21QREVWSUNFKGxwRGVzdERldikpICE9IE5VTEwpCiAgICAgewogCUxPTkcgbFAxLCBsUDQsIGxQNSwgbFA3LCBsUDgsIGxQOSwgbFAxMCwgbFAxMTsgIAotCVdPUkQgd1AyLCB3UDMsIHdQMTI7CisJV09SRCB3UDIsIHdQMywgd1A2LCB3UDEyOwogICAgICAgICBJTlQxNiBpUDY7CiAKIAlTRUdQVFIgU2VnUHRyID0gcExQRC0+VGh1bmtCdWZTZWdQdHI7CkBAIC05NDUsNyArOTQ0LDcgQEAKIEV4dHJhY3RQUShIUFEgaFBRKSAKIHsgCiAgICAgc3RydWN0IGhwcSAqcXVldWUsICpwcmV2LCAqY3VycmVudCwgKmN1cnJlbnRQcmV2OwotICAgIGludCBrZXkgPSAwLCB0YWcgPSAtMTsKKyAgICBpbnQga2V5LCB0YWcgPSAtMTsKICAgICBjdXJyZW50UHJldiA9IHByZXYgPSBOVUxMOwogICAgIHF1ZXVlID0gY3VycmVudCA9IGhwcXVldWU7CiAgICAgaWYgKGN1cnJlbnQpCkBAIC0xMTQ2LDcgKzExNDUsNyBAQAogCiAgICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJXcml0ZURpYWxvZzogJTA0eCAlMDR4IFwiJXNcIlxuIiwgaEpvYiwgIGNjaE1zZywgbHBNc2cpOwogCi0gICAgblJldCA9IE1lc3NhZ2VCb3gxNiggMCwgbHBNc2csICJQcmludGluZyBFcnJvciIsIE1CX09LQ0FOQ0VMKTsKKyAgICBuUmV0ID0gTWVzc2FnZUJveDE2KE5VTEwsIGxwTXNnLCAiUHJpbnRpbmcgRXJyb3IiLCBNQl9PS0NBTkNFTCk7CiAgICAgcmV0dXJuIG5SZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3dpbjE2ZHJ2L29iamVjdHMuYyBiL2dyYXBoaWNzL3dpbjE2ZHJ2L29iamVjdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODY1NzkwCi0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3Mvd2luMTZkcnYvb2JqZWN0cy5jCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBHREkgb2JqZWN0cworICoKKyAqIENvcHlyaWdodCAxOTkzIEFsZXhhbmRyZSBKdWxsaWFyZAorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImJpdG1hcC5oIgorI2luY2x1ZGUgImJydXNoLmgiCisjaW5jbHVkZSAiZm9udC5oIgorI2luY2x1ZGUgInBlbi5oIgorI2luY2x1ZGUgInN0ZGRlYnVnLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKworCitleHRlcm4gSEJJVE1BUDMyIFdJTjE2RFJWX0JJVE1BUF9TZWxlY3RPYmplY3QoIERDICogZGMsIEhCSVRNQVAzMiBoYml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUTUFQT0JKICogYm1wICk7CitleHRlcm4gSEJSVVNIMzIgV0lOMTZEUlZfQlJVU0hfU2VsZWN0T2JqZWN0KCBEQyAqIGRjLCBIQlJVU0gzMiBoYnJ1c2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlJVU0hPQkogKiBicnVzaCApOworZXh0ZXJuIEhGT05UMzIgV0lOMTZEUlZfRk9OVF9TZWxlY3RPYmplY3QoIERDICogZGMsIEhGT05UMzIgaGZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPTlRPQkogKiBmb250ICk7CitleHRlcm4gSFBFTjMyIFdJTjE2RFJWX1BFTl9TZWxlY3RPYmplY3QoIERDICogZGMsIEhQRU4zMiBocGVuLCBQRU5PQkogKiBwZW4gKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBYMTFEUlZfU2VsZWN0T2JqZWN0CisgKi8KK0hHRElPQkozMiBXSU4xNkRSVl9TZWxlY3RPYmplY3QoIERDICpkYywgSEdESU9CSjMyIGhhbmRsZSApCit7CisgICAgR0RJT0JKSERSICpwdHIgPSBHRElfR2V0T2JqUHRyKCBoYW5kbGUsIE1BR0lDX0RPTlRDQVJFICk7CisKKyAgICBpZiAoIXB0cikgcmV0dXJuIDA7CisgICAgZHByaW50Zl9nZGkoc3RkZGViLCAiU2VsZWN0T2JqZWN0OiBoZGM9JTA0eCAlMDR4XG4iLCBkYy0+aFNlbGYsIGhhbmRsZSApOworICAgIAorICAgIHN3aXRjaChwdHItPndNYWdpYykKKyAgICB7CisgICAgY2FzZSBQRU5fTUFHSUM6CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiV0lOMTZEUlZfU2VsZWN0T2JqZWN0IGZvciBQRU4gbm90IGltcGxlbWVudGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSBCUlVTSF9NQUdJQzoKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJXSU4xNkRSVl9TZWxlY3RPYmplY3QgZm9yIEJSVVNIIG5vdCBpbXBsZW1lbnRlZFxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIGNhc2UgQklUTUFQX01BR0lDOgorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIldJTjE2RFJWX1NlbGVjdE9iamVjdCBmb3IgQklUTUFQIG5vdCBpbXBsZW1lbnRlZFxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIGNhc2UgRk9OVF9NQUdJQzoKKyAgICAgICAgcmV0dXJuIFdJTjE2RFJWX0ZPTlRfU2VsZWN0T2JqZWN0KCBkYywgaGFuZGxlLCAoRk9OVE9CSiAqKXB0ciApOwkgIAorICAgIGNhc2UgUkVHSU9OX01BR0lDOgorCSAgcmV0dXJuIChIR0RJT0JKMTYpU2VsZWN0Q2xpcFJnbjE2KCBkYy0+aFNlbGYsIGhhbmRsZSApOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3gxMWRydi9NYWtlZmlsZS5pbiBiL2dyYXBoaWNzL3gxMWRydi9NYWtlZmlsZS5pbgppbmRleCA5MDAxZGFkLi5kYWE4NjBjIDEwMDY0NAotLS0gYS9ncmFwaGljcy94MTFkcnYvTWFrZWZpbGUuaW4KKysrIGIvZ3JhcGhpY3MveDExZHJ2L01ha2VmaWxlLmluCkBAIC0xLDQgKzEsNCBAQAotREVGUyAgICAgID0gLURfX1dJTkVfXyAtRE5PX1RSQU5TSVRJT05fVFlQRVMKK0RFRlMgICAgICA9IC1EX19XSU5FX18KIFRPUFNSQ0RJUiA9IEB0b3Bfc3JjZGlyQAogVE9QT0JKRElSID0gLi4vLi4KIFNSQ0RJUiAgICA9IEBzcmNkaXJACmRpZmYgLS1naXQgYS9ncmFwaGljcy94MTFkcnYvYml0bWFwLmMgYi9ncmFwaGljcy94MTFkcnYvYml0bWFwLmMKaW5kZXggZDBjYzgyNS4uYjMwMjI0OCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MveDExZHJ2L2JpdG1hcC5jCisrKyBiL2dyYXBoaWNzL3gxMWRydi9iaXRtYXAuYwpAQCAtNTYsNyArNTYsOCBAQAogICAgIGlmICghKGRjLT53LmZsYWdzICYgRENfTUVNT1JZKSkgcmV0dXJuIDA7CiAKICAgICBpZiAoZGMtPncuaFZpc1JnbikKLSAgICAgICBTZXRSZWN0UmduKGRjLT53LmhWaXNSZ24sIDAsIDAsIGJtcC0+Yml0bWFwLmJtV2lkdGgsIGJtcC0+Yml0bWFwLmJtSGVpZ2h0ICk7CisgICAgICAgU2V0UmVjdFJnbjMyKCBkYy0+dy5oVmlzUmduLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgYm1wLT5iaXRtYXAuYm1XaWR0aCwgYm1wLT5iaXRtYXAuYm1IZWlnaHQgKTsKICAgICBlbHNlCiAgICAgeyAKICAgICAgICBocmduID0gQ3JlYXRlUmVjdFJnbjMyKDAsIDAsIGJtcC0+Yml0bWFwLmJtV2lkdGgsIGJtcC0+Yml0bWFwLmJtSGVpZ2h0KTsKZGlmZiAtLWdpdCBhL2lmMTYzMi9NYWtlZmlsZS5pbiBiL2lmMTYzMi9NYWtlZmlsZS5pbgppbmRleCAzZjE2ZWM0Li4xNDBjYTc1IDEwMDY0NAotLS0gYS9pZjE2MzIvTWFrZWZpbGUuaW4KKysrIGIvaWYxNjMyL01ha2VmaWxlLmluCkBAIC0xLDQgKzEsNCBAQAotREVGUyAgICAgID0gLURfX1dJTkVfXyAtRE5PX1RSQU5TSVRJT05fVFlQRVMKK0RFRlMgICAgICA9IC1EX19XSU5FX18KIFRPUFNSQ0RJUiA9IEB0b3Bfc3JjZGlyQAogVE9QT0JKRElSID0gLi4KIFNSQ0RJUiAgICA9IEBzcmNkaXJACmRpZmYgLS1naXQgYS9pZjE2MzIvYnVpbHRpbi5jIGIvaWYxNjMyL2J1aWx0aW4uYwppbmRleCAzYTQzODZjLi40NGI4NmVlIDEwMDY0NAotLS0gYS9pZjE2MzIvYnVpbHRpbi5jCisrKyBiL2lmMTYzMi9idWlsdGluLmMKQEAgLTE4NywxNCArMTg3LDE0IEBACiAKICAgICAvKiBTZXQgdGhlIFVTRVIgYW5kIEdESSBoZWFwIHNlbGVjdG9ycyAqLwogCi0gICAgcE1vZHVsZSAgICAgID0gTU9EVUxFX0dldFB0ciggR2V0TW9kdWxlSGFuZGxlKCAiVVNFUiIgKSk7CisgICAgcE1vZHVsZSAgICAgID0gTU9EVUxFX0dldFB0ciggR2V0TW9kdWxlSGFuZGxlMTYoICJVU0VSIiApKTsKICAgICBVU0VSX0hlYXBTZWwgPSAoTkVfU0VHX1RBQkxFKCBwTW9kdWxlICkgKyBwTW9kdWxlLT5kZ3JvdXAgLSAxKS0+c2VsZWN0b3I7Ci0gICAgcE1vZHVsZSAgICAgID0gTU9EVUxFX0dldFB0ciggR2V0TW9kdWxlSGFuZGxlKCAiR0RJIiApKTsKKyAgICBwTW9kdWxlICAgICAgPSBNT0RVTEVfR2V0UHRyKCBHZXRNb2R1bGVIYW5kbGUxNiggIkdESSIgKSk7CiAgICAgR0RJX0hlYXBTZWwgID0gKE5FX1NFR19UQUJMRSggcE1vZHVsZSApICsgcE1vZHVsZS0+ZGdyb3VwIC0gMSktPnNlbGVjdG9yOwogCiAgICAgLyogSW5pdGlhbGl6ZSBLRVJORUwuMTc4IChfX1dJTkZMQUdTKSB3aXRoIHRoZSBjb3JyZWN0IGZsYWdzIHZhbHVlICovCiAKLSAgICBoTW9kdWxlID0gR2V0TW9kdWxlSGFuZGxlKCAiS0VSTkVMIiApOworICAgIGhNb2R1bGUgPSBHZXRNb2R1bGVIYW5kbGUxNiggIktFUk5FTCIgKTsKICAgICBNT0RVTEVfU2V0RW50cnlQb2ludCggaE1vZHVsZSwgMTc4LCBHZXRXaW5GbGFncygpICk7CiAKICAgICAvKiBJbml0aWFsaXplIHRoZSByZWFsLW1vZGUgc2VsZWN0b3IgZW50cnkgcG9pbnRzICovCkBAIC0yMDMsNyArMjAzLDcgQEAKIAogICAgIC8qIFNldCBpbnRlcnJ1cHQgdmVjdG9ycyBmcm9tIGVudHJ5IHBvaW50cyBpbiBXUFJPQ1MuRExMICovCiAKLSAgICBoTW9kdWxlID0gR2V0TW9kdWxlSGFuZGxlKCAiV1BST0NTIiApOworICAgIGhNb2R1bGUgPSBHZXRNb2R1bGVIYW5kbGUxNiggIldQUk9DUyIgKTsKICAgICBmb3IgKHZlY3RvciA9IDA7IHZlY3RvciA8IDI1NjsgdmVjdG9yKyspCiAgICAgewogICAgICAgICBGQVJQUk9DMTYgcHJvYyA9IE1PRFVMRV9HZXRFbnRyeVBvaW50KCBoTW9kdWxlLApkaWZmIC0tZ2l0IGEvaWYxNjMyL2dkaS5zcGVjIGIvaWYxNjMyL2dkaS5zcGVjCmluZGV4IGFmOGRjMzEuLjcxZGEzYmMgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9nZGkuc3BlYworKysgYi9pZjE2MzIvZ2RpLnNwZWMKQEAgLTIsNyArMiw3IEBACiB0eXBlCXdpbjE2CiBoZWFwCTY1NDg4ICAjIDY1NTM2IC0gMTYgKGluc3RhbmNlIGRhdGEpIC0gMzIgKHN0b2NrIG9iamVjdHMpCiAKLTEgICBwYXNjYWwgU2V0QmtDb2xvcih3b3JkIGxvbmcpIFNldEJrQ29sb3IKKzEgICBwYXNjYWwgICBTZXRCa0NvbG9yKHdvcmQgbG9uZykgU2V0QmtDb2xvcjE2CiAyICAgcGFzY2FsMTYgU2V0QmtNb2RlKHdvcmQgd29yZCkgU2V0QmtNb2RlMTYKIDMgICBwYXNjYWwxNiBTZXRNYXBNb2RlKHdvcmQgd29yZCkgU2V0TWFwTW9kZTE2CiA0ICAgcGFzY2FsMTYgU2V0Uk9QMih3b3JkIHdvcmQpIFNldFJPUDIxNgpAQCAtMTAsNyArMTAsNyBAQAogNiAgIHBhc2NhbDE2IFNldFBvbHlGaWxsTW9kZSh3b3JkIHdvcmQpIFNldFBvbHlGaWxsTW9kZTE2CiA3ICAgcGFzY2FsMTYgU2V0U3RyZXRjaEJsdE1vZGUod29yZCB3b3JkKSBTZXRTdHJldGNoQmx0TW9kZTE2CiA4ICAgcGFzY2FsMTYgU2V0VGV4dENoYXJhY3RlckV4dHJhKHdvcmQgc193b3JkKSBTZXRUZXh0Q2hhcmFjdGVyRXh0cmExNgotOSAgIHBhc2NhbCBTZXRUZXh0Q29sb3Iod29yZCBsb25nKSBTZXRUZXh0Q29sb3IKKzkgICBwYXNjYWwgICBTZXRUZXh0Q29sb3Iod29yZCBsb25nKSBTZXRUZXh0Q29sb3IxNgogMTAgIHBhc2NhbDE2IFNldFRleHRKdXN0aWZpY2F0aW9uKHdvcmQgc193b3JkIHNfd29yZCkgU2V0VGV4dEp1c3RpZmljYXRpb24xNgogMTEgIHBhc2NhbCBTZXRXaW5kb3dPcmcod29yZCBzX3dvcmQgc193b3JkKSBTZXRXaW5kb3dPcmcKIDEyICBwYXNjYWwgU2V0V2luZG93RXh0KHdvcmQgc193b3JkIHNfd29yZCkgU2V0V2luZG93RXh0CkBAIC01NCwxMCArNTQsMTAgQEAKIDQ1ICBwYXNjYWwxNiBTZWxlY3RPYmplY3Qod29yZCB3b3JkKSBTZWxlY3RPYmplY3QxNgogIzQ2ICBwYXNjYWwgX19HUD8KIDQ3ICBwYXNjYWwxNiBDb21iaW5lUmduKHdvcmQgd29yZCB3b3JkIHNfd29yZCkgQ29tYmluZVJnbjE2Ci00OCAgcGFzY2FsMTYgQ3JlYXRlQml0bWFwKHdvcmQgd29yZCB3b3JkIHdvcmQgcHRyKSBDcmVhdGVCaXRtYXAKKzQ4ICBwYXNjYWwxNiBDcmVhdGVCaXRtYXAod29yZCB3b3JkIHdvcmQgd29yZCBwdHIpIENyZWF0ZUJpdG1hcDE2CiA0OSAgcGFzY2FsMTYgQ3JlYXRlQml0bWFwSW5kaXJlY3QocHRyKSBDcmVhdGVCaXRtYXBJbmRpcmVjdDE2CiA1MCAgcGFzY2FsMTYgQ3JlYXRlQnJ1c2hJbmRpcmVjdChwdHIpIENyZWF0ZUJydXNoSW5kaXJlY3QxNgotNTEgIHBhc2NhbDE2IENyZWF0ZUNvbXBhdGlibGVCaXRtYXAod29yZCB3b3JkIHdvcmQpIENyZWF0ZUNvbXBhdGlibGVCaXRtYXAKKzUxICBwYXNjYWwxNiBDcmVhdGVDb21wYXRpYmxlQml0bWFwKHdvcmQgd29yZCB3b3JkKSBDcmVhdGVDb21wYXRpYmxlQml0bWFwMTYKIDUyICBwYXNjYWwxNiBDcmVhdGVDb21wYXRpYmxlREMod29yZCkgQ3JlYXRlQ29tcGF0aWJsZURDMTYKIDUzICBwYXNjYWwxNiBDcmVhdGVEQyhwdHIgcHRyIHB0ciBwdHIpIENyZWF0ZURDMTYKIDU0ICBwYXNjYWwxNiBDcmVhdGVFbGxpcHRpY1JnbihzX3dvcmQgc193b3JkIHNfd29yZCBzX3dvcmQpIENyZWF0ZUVsbGlwdGljUmduMTYKQEAgLTgwLDcgKzgwLDcgQEAKIDcxICBwYXNjYWwxNiBFbnVtT2JqZWN0cyh3b3JkIHdvcmQgc2VncHRyIGxvbmcpIFRIVU5LX0VudW1PYmplY3RzMTYKIDcyICBwYXNjYWwxNiBFcXVhbFJnbih3b3JkIHdvcmQpIEVxdWFsUmduMTYKIDczICBwYXNjYWwxNiBFeGNsdWRlVmlzUmVjdCh3b3JkIHNfd29yZCBzX3dvcmQgc193b3JkIHNfd29yZCkgRXhjbHVkZVZpc1JlY3QKLTc0ICBwYXNjYWwgR2V0Qml0bWFwQml0cyh3b3JkIGxvbmcgcHRyKSBHZXRCaXRtYXBCaXRzCis3NCAgcGFzY2FsIEdldEJpdG1hcEJpdHMod29yZCBsb25nIHB0cikgR2V0Qml0bWFwQml0czE2CiA3NSAgcGFzY2FsICAgR2V0QmtDb2xvcih3b3JkKSBHZXRCa0NvbG9yMTYKIDc2ICBwYXNjYWwxNiBHZXRCa01vZGUod29yZCkgR2V0QmtNb2RlMTYKIDc3ICBwYXNjYWwxNiBHZXRDbGlwQm94KHdvcmQgcHRyKSBHZXRDbGlwQm94MTYKQEAgLTExMyw5ICsxMTMsOSBAQAogMTAzIHBhc2NhbDE2IFB0VmlzaWJsZSh3b3JkIHNfd29yZCBzX3dvcmQpIFB0VmlzaWJsZTE2CiAxMDQgcGFzY2FsMTYgUmVjdFZpc2libGVPbGQod29yZCBwdHIpIFJlY3RWaXNpYmxlMTYKIDEwNSBwYXNjYWwxNiBTZWxlY3RWaXNSZ24od29yZCB3b3JkKSBTZWxlY3RWaXNSZ24KLTEwNiBwYXNjYWwgU2V0Qml0bWFwQml0cyh3b3JkIGxvbmcgcHRyKSBTZXRCaXRtYXBCaXRzCisxMDYgcGFzY2FsIFNldEJpdG1hcEJpdHMod29yZCBsb25nIHB0cikgU2V0Qml0bWFwQml0czE2CiAxMTcgcGFzY2FsIFNldERDT3JnKHdvcmQgc193b3JkIHNfd29yZCkgU2V0RENPcmcKLTExOSBwYXNjYWwxNiBBZGRGb250UmVzb3VyY2UocHRyKSBBZGRGb250UmVzb3VyY2UKKzExOSBwYXNjYWwxNiBBZGRGb250UmVzb3VyY2UocHRyKSBBZGRGb250UmVzb3VyY2UxNgogIzEyMSBwYXNjYWwgRGVhdGgKICMxMjIgcGFzY2FsIFJlU3VyUmVjdGlvbgogMTIzIHBhc2NhbDE2IFBsYXlNZXRhRmlsZSh3b3JkIHdvcmQpIFBsYXlNZXRhRmlsZTE2CkBAIC0xMzEsNyArMTMxLDcgQEAKIDEzMyBwYXNjYWwxNiBHZXRFbnZpcm9ubWVudChwdHIgcHRyIHdvcmQpIEdldEVudmlyb25tZW50CiAxMzQgcGFzY2FsMTYgR2V0UmduQm94KHdvcmQgcHRyKSBHZXRSZ25Cb3gxNgogIzEzNSBwYXNjYWwgU2NhbkxyCi0xMzYgcGFzY2FsMTYgUmVtb3ZlRm9udFJlc291cmNlKHB0cikgUmVtb3ZlRm9udFJlc291cmNlCisxMzYgcGFzY2FsMTYgUmVtb3ZlRm9udFJlc291cmNlKHB0cikgUmVtb3ZlRm9udFJlc291cmNlMTYKIDE0OCBwYXNjYWwgU2V0QnJ1c2hPcmcod29yZCBzX3dvcmQgc193b3JkKSBTZXRCcnVzaE9yZwogMTQ5IHBhc2NhbCBHZXRCcnVzaE9yZyh3b3JkKSBHZXRCcnVzaE9yZwogMTUwIHBhc2NhbDE2IFVucmVhbGl6ZU9iamVjdCh3b3JkKSBVbnJlYWxpemVPYmplY3QxNgpAQCAtMTM5LDcgKzEzOSw3IEBACiAxNTMgcGFzY2FsMTYgQ3JlYXRlSUMocHRyIHB0ciBwdHIgcHRyKSBDcmVhdGVJQzE2CiAxNTQgcGFzY2FsICAgR2V0TmVhcmVzdENvbG9yKHdvcmQgbG9uZykgR2V0TmVhcmVzdENvbG9yMTYKIDE1NSBzdHViIFF1ZXJ5QWJvcnQKLTE1NiBwYXNjYWwxNiBDcmVhdGVEaXNjYXJkYWJsZUJpdG1hcCh3b3JkIHdvcmQgd29yZCkgQ3JlYXRlRGlzY2FyZGFibGVCaXRtYXAKKzE1NiBwYXNjYWwxNiBDcmVhdGVEaXNjYXJkYWJsZUJpdG1hcCh3b3JkIHdvcmQgd29yZCkgQ3JlYXRlRGlzY2FyZGFibGVCaXRtYXAxNgogMTU4IHBhc2NhbDE2IEVudW1DYWxsYmFjayhwdHIgcHRyIHdvcmQgbG9uZykgV2luZUVudW1ERm9udENhbGxiYWNrCiAxNTkgcGFzY2FsMTYgR2V0TWV0YUZpbGVCaXRzKHdvcmQpIEdldE1ldGFGaWxlQml0cwogMTYwIHBhc2NhbDE2IFNldE1ldGFGaWxlQml0cyh3b3JkKSBTZXRNZXRhRmlsZUJpdHMKQEAgLTE0OCwxMCArMTQ4LDEwIEBACiAxNjMgcGFzY2FsICAgU2V0Qml0bWFwRGltZW5zaW9uKHdvcmQgc193b3JkIHNfd29yZCkgU2V0Qml0bWFwRGltZW5zaW9uCiAxNjkgc3R1YiBJc0RDRGlydHkKIDE3MCBzdHViIFNldERDU3RhdHVzCi0xNzIgcGFzY2FsMTYgU2V0UmVjdFJnbih3b3JkIHNfd29yZCBzX3dvcmQgc193b3JkIHNfd29yZCkgU2V0UmVjdFJnbgorMTcyIHBhc2NhbDE2IFNldFJlY3RSZ24od29yZCBzX3dvcmQgc193b3JkIHNfd29yZCBzX3dvcmQpIFNldFJlY3RSZ24xNgogMTczIHBhc2NhbDE2IEdldENsaXBSZ24od29yZCkgR2V0Q2xpcFJnbjE2CiAxNzUgcGFzY2FsMTYgRW51bU1ldGFGaWxlKHdvcmQgd29yZCBzZWdwdHIgbG9uZykgVEhVTktfRW51bU1ldGFGaWxlMTYKLTE3NiBwYXNjYWwxNiBQbGF5TWV0YUZpbGVSZWNvcmQod29yZCBwdHIgcHRyIHdvcmQpIFBsYXlNZXRhRmlsZVJlY29yZAorMTc2IHBhc2NhbDE2IFBsYXlNZXRhRmlsZVJlY29yZCh3b3JkIHB0ciBwdHIgd29yZCkgUGxheU1ldGFGaWxlUmVjb3JkMTYKIDE3OSBwYXNjYWwxNiBHZXREQ1N0YXRlKHdvcmQpIEdldERDU3RhdGUKIDE4MCBwYXNjYWwxNiBTZXREQ1N0YXRlKHdvcmQgd29yZCkgU2V0RENTdGF0ZQogMTgxIHBhc2NhbDE2IFJlY3RJblJlZ2lvbk9sZCh3b3JkIHB0cikgUmVjdEluUmVnaW9uMTYKQEAgLTIxOCwxNyArMjE4LDE3IEBACiAzMDYgc3R1YiBFTkdJTkVNQUtFRk9OVERJUgogMzA3IHBhc2NhbDE2IEdldENoYXJBQkNXaWR0aHMod29yZCB3b3JkIHdvcmQgcHRyKSBHZXRDaGFyQUJDV2lkdGhzMTYKIDMwOCBzdHViIEdldE91dExpbmVUZXh0TWV0cmljcwotMzA5IHBhc2NhbCAgIEdldEdseXBoT3V0TGluZSh3b3JkIHdvcmQgd29yZCBwdHIgbG9uZyBwdHIgcHRyKSBHZXRHbHlwaE91dExpbmUKLTMxMCBwYXNjYWwxNiBDcmVhdGVTY2FsYWJsZUZvbnRSZXNvdXJjZSh3b3JkIHB0ciBwdHIgcHRyKSBDcmVhdGVTY2FsYWJsZUZvbnRSZXNvdXJjZQorMzA5IHBhc2NhbCAgIEdldEdseXBoT3V0bGluZSh3b3JkIHdvcmQgd29yZCBwdHIgbG9uZyBwdHIgcHRyKSBHZXRHbHlwaE91dGxpbmUxNgorMzEwIHBhc2NhbDE2IENyZWF0ZVNjYWxhYmxlRm9udFJlc291cmNlKHdvcmQgcHRyIHB0ciBwdHIpIENyZWF0ZVNjYWxhYmxlRm9udFJlc291cmNlMTYKIDMxMSBzdHViIEdldEZvbnREYXRhCiAzMTIgc3R1YiBDb252ZXJ0T3V0TGluZUZvbnRGaWxlCi0zMTMgcGFzY2FsMTYgR2V0UmFzdGVyaXplckNhcHMocHRyIHdvcmQpIEdldFJhc3Rlcml6ZXJDYXBzCiszMTMgcGFzY2FsMTYgR2V0UmFzdGVyaXplckNhcHMocHRyIHdvcmQpIEdldFJhc3Rlcml6ZXJDYXBzMTYKIDMxNCBzdHViIEVuZ2luZUV4dFRleHRPdXQKIDMxNSBzdHViIEVuZ2luZVJlYWxpemVGb250RXh0CiAzMTYgc3R1YiBFbmdpbmVHZXRDaGFyV2lkdGhTdHIKIDMxNyBzdHViIEVuZ2luZUdldEdseXBoQm1wRXh0CiAzMzAgcGFzY2FsMTYgRW51bUZvbnRGYW1pbGllcyh3b3JkIHB0ciBzZWdwdHIgbG9uZykgVEhVTktfRW51bUZvbnRGYW1pbGllczE2Ci0zMzIgcGFzY2FsMTYgR2V0S2VybmluZ1BhaXJzKHdvcmQgd29yZCBwdHIpIEdldEtlcm5pbmdQYWlycworMzMyIHBhc2NhbDE2IEdldEtlcm5pbmdQYWlycyh3b3JkIHdvcmQgcHRyKSBHZXRLZXJuaW5nUGFpcnMxNgogMzQ1IHBhc2NhbDE2IEdldFRleHRBbGlnbih3b3JkKSBHZXRUZXh0QWxpZ24xNgogMzQ2IHBhc2NhbDE2IFNldFRleHRBbGlnbih3b3JkIHdvcmQpIFNldFRleHRBbGlnbjE2CiAzNDggcGFzY2FsMTYgQ2hvcmQod29yZCBzX3dvcmQgc193b3JkIHNfd29yZCBzX3dvcmQgc193b3JkIHNfd29yZApAQCAtMjQ2LDcgKzI0Niw3IEBACiAzNjMgcGFzY2FsMTYgR2V0UGFsZXR0ZUVudHJpZXMod29yZCB3b3JkIHdvcmQgcHRyKSBHZXRQYWxldHRlRW50cmllczE2CiAzNjQgcGFzY2FsMTYgU2V0UGFsZXR0ZUVudHJpZXMod29yZCB3b3JkIHdvcmQgcHRyKSBTZXRQYWxldHRlRW50cmllczE2CiAzNjUgcGFzY2FsMTYgUmVhbGl6ZURlZmF1bHRQYWxldHRlKHdvcmQpIFJlYWxpemVEZWZhdWx0UGFsZXR0ZQotMzY2IHBhc2NhbDE2IFVwZGF0ZUNvbG9ycyh3b3JkKSBVcGRhdGVDb2xvcnMKKzM2NiBwYXNjYWwxNiBVcGRhdGVDb2xvcnMod29yZCkgVXBkYXRlQ29sb3JzMTYKIDM2NyBwYXNjYWwxNiBBbmltYXRlUGFsZXR0ZSh3b3JkIHdvcmQgd29yZCBwdHIpIEFuaW1hdGVQYWxldHRlMTYKIDM2OCBwYXNjYWwxNiBSZXNpemVQYWxldHRlKHdvcmQgd29yZCkgUmVzaXplUGFsZXR0ZTE2CiAzNzAgcGFzY2FsMTYgR2V0TmVhcmVzdFBhbGV0dGVJbmRleCh3b3JkIGxvbmcpIEdldE5lYXJlc3RQYWxldHRlSW5kZXgxNgpkaWZmIC0tZ2l0IGEvaWYxNjMyL2dkaTMyLnNwZWMgYi9pZjE2MzIvZ2RpMzIuc3BlYwppbmRleCBkZDY1NjAzLi45MGI1MDJjIDEwMDY0NAotLS0gYS9pZjE2MzIvZ2RpMzIuc3BlYworKysgYi9pZjE2MzIvZ2RpMzIuc3BlYwpAQCAtNCw5ICs0LDkgQEAKIAogMDAwMCBzdHViIEFib3J0RG9jCiAwMDAxIHN0dWIgQWJvcnRQYXRoCi0wMDAyIHN0ZGNhbGwgQWRkRm9udFJlc291cmNlQShwdHIpIEFkZEZvbnRSZXNvdXJjZQorMDAwMiBzdGRjYWxsIEFkZEZvbnRSZXNvdXJjZUEocHRyKSBBZGRGb250UmVzb3VyY2UzMkEKIDAwMDMgc3R1YiBBZGRGb250UmVzb3VyY2VUcmFja2luZwotMDAwNCBzdHViIEFkZEZvbnRSZXNvdXJjZVcKKzAwMDQgc3RkY2FsbCBBZGRGb250UmVzb3VyY2VXKHB0cikgQWRkRm9udFJlc291cmNlMzJXCiAwMDA1IHN0dWIgQW5nbGVBcmMKIDAwMDYgc3RkY2FsbCBBbmltYXRlUGFsZXR0ZShsb25nIGxvbmcgbG9uZyBwdHIpIEFuaW1hdGVQYWxldHRlMzIKIDAwMDcgc3RkY2FsbCBBcmMobG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcpIEFyYzMyCkBAIC0yNywxMiArMjcsMTIgQEAKIDAwMjIgc3R1YiBDb3B5RW5oTWV0YUZpbGVXCiAwMDIzIHN0ZGNhbGwgQ29weU1ldGFGaWxlQShsb25nIHB0cikgQ29weU1ldGFGaWxlMzJBCiAwMDI0IHN0ZGNhbGwgQ29weU1ldGFGaWxlVyhsb25nIHB0cikgQ29weU1ldGFGaWxlMzJXCi0wMDI1IHN0ZGNhbGwgQ3JlYXRlQml0bWFwKGxvbmcgbG9uZyBsb25nIGxvbmcgcHRyKSBDcmVhdGVCaXRtYXAKKzAwMjUgc3RkY2FsbCBDcmVhdGVCaXRtYXAobG9uZyBsb25nIGxvbmcgbG9uZyBwdHIpIENyZWF0ZUJpdG1hcDMyCiAwMDI2IHN0ZGNhbGwgQ3JlYXRlQml0bWFwSW5kaXJlY3QocHRyKSBDcmVhdGVCaXRtYXBJbmRpcmVjdDMyCiAwMDI3IHN0ZGNhbGwgQ3JlYXRlQnJ1c2hJbmRpcmVjdChwdHIpIENyZWF0ZUJydXNoSW5kaXJlY3QzMgogMDAyOCBzdHViIENyZWF0ZUNvbG9yU3BhY2VBCiAwMDI5IHN0dWIgQ3JlYXRlQ29sb3JTcGFjZVcKLTAwMzAgc3RkY2FsbCBDcmVhdGVDb21wYXRpYmxlQml0bWFwKGxvbmcgbG9uZyBsb25nKSBDcmVhdGVDb21wYXRpYmxlQml0bWFwCiswMDMwIHN0ZGNhbGwgQ3JlYXRlQ29tcGF0aWJsZUJpdG1hcChsb25nIGxvbmcgbG9uZykgQ3JlYXRlQ29tcGF0aWJsZUJpdG1hcDMyCiAwMDMxIHN0ZGNhbGwgQ3JlYXRlQ29tcGF0aWJsZURDKGxvbmcpIENyZWF0ZUNvbXBhdGlibGVEQzMyCiAwMDMyIHN0ZGNhbGwgQ3JlYXRlRENBKHB0ciBwdHIgcHRyIHB0cikgQ3JlYXRlREMzMkEKIDAwMzMgc3RkY2FsbCBDcmVhdGVEQ1cocHRyIHB0ciBwdHIgcHRyKSBDcmVhdGVEQzMyVwpAQCAtNDAsNyArNDAsNyBAQAogMDAzNSBzdHViIENyZWF0ZURJQlBhdHRlcm5CcnVzaFB0CiAwMDM2IHN0dWIgQ3JlYXRlRElCU2VjdGlvbgogMDAzNyBzdGRjYWxsIENyZWF0ZURJQml0bWFwKGxvbmcgcHRyIGxvbmcgcHRyIHB0ciBsb25nKSBDcmVhdGVESUJpdG1hcDMyCi0wMDM4IHN0ZGNhbGwgQ3JlYXRlRGlzY2FyZGFibGVCaXRtYXAobG9uZyBsb25nIGxvbmcpIENyZWF0ZURpc2NhcmRhYmxlQml0bWFwCiswMDM4IHN0ZGNhbGwgQ3JlYXRlRGlzY2FyZGFibGVCaXRtYXAobG9uZyBsb25nIGxvbmcpIENyZWF0ZURpc2NhcmRhYmxlQml0bWFwMzIKIDAwMzkgc3RkY2FsbCBDcmVhdGVFbGxpcHRpY1Jnbihsb25nIGxvbmcgbG9uZyBsb25nKSBDcmVhdGVFbGxpcHRpY1JnbjMyCiAwMDQwIHN0ZGNhbGwgQ3JlYXRlRWxsaXB0aWNSZ25JbmRpcmVjdChwdHIpIENyZWF0ZUVsbGlwdGljUmduSW5kaXJlY3QzMgogMDA0MSBzdHViIENyZWF0ZUVuaE1ldGFGaWxlQQpAQCAtNjcsOCArNjcsOCBAQAogMDA2MCBzdGRjYWxsIENyZWF0ZVJlY3RSZ25JbmRpcmVjdChwdHIpIENyZWF0ZVJlY3RSZ25JbmRpcmVjdDMyCiAwMDYxIHN0ZGNhbGwgQ3JlYXRlUm91bmRSZWN0UmduKGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nKQogICAgICAgICAgICAgIENyZWF0ZVJvdW5kUmVjdFJnbjMyCi0wMDYyIHN0dWIgQ3JlYXRlU2NhbGFibGVGb250UmVzb3VyY2VBCi0wMDYzIHN0dWIgQ3JlYXRlU2NhbGFibGVGb250UmVzb3VyY2VXCiswMDYyIHN0ZGNhbGwgQ3JlYXRlU2NhbGFibGVGb250UmVzb3VyY2VBKGxvbmcgcHRyIHB0ciBwdHIpIENyZWF0ZVNjYWxhYmxlRm9udFJlc291cmNlMzJBCiswMDYzIHN0ZGNhbGwgQ3JlYXRlU2NhbGFibGVGb250UmVzb3VyY2VXKGxvbmcgcHRyIHB0ciBwdHIpIENyZWF0ZVNjYWxhYmxlRm9udFJlc291cmNlMzJXCiAwMDY0IHN0ZGNhbGwgQ3JlYXRlU29saWRCcnVzaChsb25nKSBDcmVhdGVTb2xpZEJydXNoMzIKIDAwNjUgc3RkY2FsbCBEUHRvTFAobG9uZyBwdHIgbG9uZykgRFB0b0xQMzIKIDAwNjYgc3R1YiBEZWxldGVDb2xvclNwYWNlCkBAIC0xNDgsNyArMTQ4LDcgQEAKIDAxNDAgc3R1YiBHZGlTZXRTZXJ2ZXJBdHRyCiAwMTQxIHN0dWIgR2V0QXJjRGlyZWN0aW9uCiAwMTQyIHN0dWIgR2V0QXNwZWN0UmF0aW9GaWx0ZXJFeAotMDE0MyBzdGRjYWxsIEdldEJpdG1hcEJpdHMobG9uZyBsb25nIHB0cikgR2V0Qml0bWFwQml0cworMDE0MyBzdGRjYWxsIEdldEJpdG1hcEJpdHMobG9uZyBsb25nIHB0cikgR2V0Qml0bWFwQml0czMyCiAwMTQ0IHN0ZGNhbGwgR2V0Qml0bWFwRGltZW5zaW9uRXgobG9uZyBwdHIpIEdldEJpdG1hcERpbWVuc2lvbkV4MzIKIDAxNDUgc3RkY2FsbCBHZXRCa0NvbG9yKGxvbmcpIEdldEJrQ29sb3IzMgogMDE0NiBzdGRjYWxsIEdldEJrTW9kZShsb25nKSBHZXRCa01vZGUzMgpAQCAtMTkxLDE0ICsxOTEsMTQgQEAKIDAxODMgc3R1YiBHZXRGb250UmVzb3VyY2VJbmZvCiAwMTg0IHN0dWIgR2V0Rm9udFJlc291cmNlSW5mb1cKIDAxODUgc3R1YiBHZXRHbHlwaE91dGxpbmUKLTAxODYgc3R1YiBHZXRHbHlwaE91dGxpbmVBCi0wMTg3IHN0dWIgR2V0R2x5cGhPdXRsaW5lVworMDE4NiBzdGRjYWxsIEdldEdseXBoT3V0bGluZUEobG9uZyBsb25nIGxvbmcgcHRyIGxvbmcgcHRyIHB0cikgR2V0R2x5cGhPdXRsaW5lMzJBCiswMTg3IHN0ZGNhbGwgR2V0R2x5cGhPdXRsaW5lVyhsb25nIGxvbmcgbG9uZyBwdHIgbG9uZyBwdHIgcHRyKSBHZXRHbHlwaE91dGxpbmUzMlcKIDAxODggc3R1YiBHZXRHcmFwaGljc01vZGUKIDAxODkgc3R1YiBHZXRJQ01Qcm9maWxlQQogMDE5MCBzdHViIEdldElDTVByb2ZpbGVXCiAwMTkxIHN0dWIgR2V0S2VybmluZ1BhaXJzCi0wMTkyIHN0dWIgR2V0S2VybmluZ1BhaXJzQQotMDE5MyBzdHViIEdldEtlcm5pbmdQYWlyc1cKKzAxOTIgc3RkY2FsbCBHZXRLZXJuaW5nUGFpcnNBKGxvbmcgbG9uZyBwdHIpIEdldEtlcm5pbmdQYWlyczMyQQorMDE5MyBzdGRjYWxsIEdldEtlcm5pbmdQYWlyc1cobG9uZyBsb25nIHB0cikgR2V0S2VybmluZ1BhaXJzMzJXCiAwMTk0IHN0dWIgR2V0TG9nQ29sb3JTcGFjZUEKIDAxOTUgc3R1YiBHZXRMb2dDb2xvclNwYWNlVwogMDE5NiBzdGRjYWxsIEdldE1hcE1vZGUobG9uZykgR2V0TWFwTW9kZTMyCkBAIC0yMjEsNyArMjIxLDcgQEAKIDAyMTMgc3RkY2FsbCBHZXRQb2x5RmlsbE1vZGUobG9uZykgR2V0UG9seUZpbGxNb2RlMzIKIDAyMTQgc3RkY2FsbCBHZXRST1AyKGxvbmcpIEdldFJPUDIzMgogMDIxNSBzdHViIEdldFJhbmRvbVJnbgotMDIxNiBzdHViIEdldFJhc3Rlcml6ZXJDYXBzCiswMjE2IHN0ZGNhbGwgR2V0UmFzdGVyaXplckNhcHMocHRyIGxvbmcpIEdldFJhc3Rlcml6ZXJDYXBzMzIKIDAyMTcgc3R1YiBHZXRSZWdpb25EYXRhCiAwMjE4IHN0ZGNhbGwgR2V0UmVsQWJzKGxvbmcpIEdldFJlbEFiczMyCiAwMjE5IHN0ZGNhbGwgR2V0UmduQm94KGxvbmcgcHRyKSBHZXRSZ25Cb3gzMgpAQCAtMjg5LDkgKzI4OSw5IEBACiAwMjgxIHN0ZGNhbGwgUmVjdEluUmVnaW9uKGxvbmcgcHRyKSBSZWN0SW5SZWdpb24zMgogMDI4MiBzdGRjYWxsIFJlY3RWaXNpYmxlKGxvbmcgcHRyKSBSZWN0VmlzaWJsZTMyCiAwMjgzIHN0ZGNhbGwgUmVjdGFuZ2xlKGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZykgUmVjdGFuZ2xlMzIKLTAyODQgc3R1YiBSZW1vdmVGb250UmVzb3VyY2VBCiswMjg0IHN0ZGNhbGwgUmVtb3ZlRm9udFJlc291cmNlQShwdHIpIFJlbW92ZUZvbnRSZXNvdXJjZTMyQQogMDI4NSBzdHViIFJlbW92ZUZvbnRSZXNvdXJjZVRyYWNraW5nCi0wMjg2IHN0dWIgUmVtb3ZlRm9udFJlc291cmNlVworMDI4NiBzdGRjYWxsIFJlbW92ZUZvbnRSZXNvdXJjZVcocHRyKSBSZW1vdmVGb250UmVzb3VyY2UzMlcKIDAyODcgc3RkY2FsbCBSZXNldERDQShsb25nIHB0cikgUmVzZXREQzMyQQogMDI4OCBzdGRjYWxsIFJlc2V0RENXKGxvbmcgcHRyKSBSZXNldERDMzJXCiAwMjg5IHN0ZGNhbGwgUmVzaXplUGFsZXR0ZShsb25nIGxvbmcpIFJlc2l6ZVBhbGV0dGUzMgpAQCAtMzA4LDkgKzMwOCw5IEBACiAwMzAwIHN0ZGNhbGwgU2VsZWN0UGFsZXR0ZShsb25nIGxvbmcgbG9uZykgU2VsZWN0UGFsZXR0ZTMyCiAwMzAxIHN0dWIgU2V0QWJvcnRQcm9jCiAwMzAyIHN0dWIgU2V0QXJjRGlyZWN0aW9uCi0wMzAzIHN0ZGNhbGwgU2V0Qml0bWFwQml0cyhsb25nIGxvbmcgcHRyKSBTZXRCaXRtYXBCaXRzCiswMzAzIHN0ZGNhbGwgU2V0Qml0bWFwQml0cyhsb25nIGxvbmcgcHRyKSBTZXRCaXRtYXBCaXRzMzIKIDAzMDQgc3RkY2FsbCBTZXRCaXRtYXBEaW1lbnNpb25FeChsb25nIGxvbmcgbG9uZyBwdHIpIFNldEJpdG1hcERpbWVuc2lvbkV4MzIKLTAzMDUgc3RkY2FsbCBTZXRCa0NvbG9yKGxvbmcgbG9uZykgU2V0QmtDb2xvcgorMDMwNSBzdGRjYWxsIFNldEJrQ29sb3IobG9uZyBsb25nKSBTZXRCa0NvbG9yMzIKIDAzMDYgc3RkY2FsbCBTZXRCa01vZGUobG9uZyBsb25nKSBTZXRCa01vZGUzMgogMDMwNyBzdHViIFNldEJvdW5kc1JlY3QKIDAzMDggc3RkY2FsbCBTZXRCcnVzaE9yZ0V4KGxvbmcgbG9uZyBsb25nIHB0cikgU2V0QnJ1c2hPcmdFeApAQCAtMzM4LDEzICszMzgsMTMgQEAKIDAzMjkgc3R1YiBTZXRQaXhlbFYKIDAzMzAgc3RkY2FsbCBTZXRQb2x5RmlsbE1vZGUobG9uZyBsb25nKSBTZXRQb2x5RmlsbE1vZGUzMgogMDMzMSBzdGRjYWxsIFNldFJPUDIobG9uZyBsb25nKSBTZXRST1AyMzIKLTAzMzIgc3RkY2FsbCBTZXRSZWN0UmduKGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZykgU2V0UmVjdFJnbgorMDMzMiBzdGRjYWxsIFNldFJlY3RSZ24obG9uZyBsb25nIGxvbmcgbG9uZyBsb25nKSBTZXRSZWN0UmduMzIKIDAzMzMgc3RkY2FsbCBTZXRSZWxBYnMobG9uZyBsb25nKSBTZXRSZWxBYnMzMgogMDMzNCBzdGRjYWxsIFNldFN0cmV0Y2hCbHRNb2RlKGxvbmcgbG9uZykgU2V0U3RyZXRjaEJsdE1vZGUzMgogMDMzNSBzdGRjYWxsIFNldFN5c3RlbVBhbGV0dGVVc2UobG9uZyBsb25nKSBTZXRTeXN0ZW1QYWxldHRlVXNlMzIKIDAzMzYgc3RkY2FsbCBTZXRUZXh0QWxpZ24obG9uZyBsb25nKSBTZXRUZXh0QWxpZ24zMgogMDMzNyBzdGRjYWxsIFNldFRleHRDaGFyYWN0ZXJFeHRyYShsb25nIGxvbmcpIFNldFRleHRDaGFyYWN0ZXJFeHRyYTMyCi0wMzM4IHN0ZGNhbGwgU2V0VGV4dENvbG9yKGxvbmcgbG9uZykgU2V0VGV4dENvbG9yCiswMzM4IHN0ZGNhbGwgU2V0VGV4dENvbG9yKGxvbmcgbG9uZykgU2V0VGV4dENvbG9yMzIKIDAzMzkgc3RkY2FsbCBTZXRUZXh0SnVzdGlmaWNhdGlvbihsb25nIGxvbmcgbG9uZykgU2V0VGV4dEp1c3RpZmljYXRpb24zMgogMDM0MCBzdGRjYWxsIFNldFZpZXdwb3J0RXh0RXgobG9uZyBsb25nIGxvbmcgcHRyKSBTZXRWaWV3cG9ydEV4dEV4MzIKIDAzNDEgc3RkY2FsbCBTZXRWaWV3cG9ydE9yZ0V4KGxvbmcgbG9uZyBsb25nIHB0cikgU2V0Vmlld3BvcnRPcmdFeDMyCkBAIC0zNjcsNyArMzY3LDcgQEAKIDAzNTYgc3RkY2FsbCBUZXh0T3V0Vyhsb25nIGxvbmcgbG9uZyBwdHIgbG9uZykgVGV4dE91dDMyVwogMDM1NyBzdHViIFVubG9hZE5ldHdvcmtGb250cwogMDM1OCBzdGRjYWxsIFVucmVhbGl6ZU9iamVjdChsb25nKSBVbnJlYWxpemVPYmplY3QzMgotMDM1OSBzdHViIFVwZGF0ZUNvbG9ycworMDM1OSBzdGRjYWxsIFVwZGF0ZUNvbG9ycyhsb25nKSBVcGRhdGVDb2xvcnMzMgogMDM2MCBzdHViIFdpZGVuUGF0aAogMDM2MSBzdHViIHBzdGFja0Nvbm5lY3QKICNsYXRlIGFkZGl0aW9ucwpkaWZmIC0tZ2l0IGEvaWYxNjMyL2tlcm5lbC5zcGVjIGIvaWYxNjMyL2tlcm5lbC5zcGVjCmluZGV4IDc1ZmFhOWIuLjQyMmU2OGUgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9rZXJuZWwuc3BlYworKysgYi9pZjE2MzIva2VybmVsLnNwZWMKQEAgLTQxLDcgKzQxLDcgQEAKIDM4ICBwYXNjYWwgICBTZXRUYXNrU2lnbmFsUHJvYyh3b3JkIHNlZ3B0cikgU2V0VGFza1NpZ25hbFByb2MKIDQxICByZXR1cm4gRW5hYmxlRG9zIDAgMAogNDIgIHJldHVybiBEaXNhYmxlRG9zIDAgMAotNDUgIHBhc2NhbDE2IExvYWRNb2R1bGUocHRyIHB0cikgTG9hZE1vZHVsZQorNDUgIHBhc2NhbDE2IExvYWRNb2R1bGUocHRyIHB0cikgTG9hZE1vZHVsZTE2CiA0NiAgcGFzY2FsMTYgRnJlZU1vZHVsZSh3b3JkKSBGcmVlTW9kdWxlMTYKIDQ3ICBwYXNjYWwxNiBHZXRNb2R1bGVIYW5kbGUoc2VncHRyKSBXSU4xNl9HZXRNb2R1bGVIYW5kbGUKIDQ4ICBwYXNjYWwxNiBHZXRNb2R1bGVVc2FnZSh3b3JkKSBHZXRNb2R1bGVVc2FnZQpAQCAtOTIsNyArOTIsNyBAQAogOTMgIHBhc2NhbDE2IEdldENvZGVIYW5kbGUoc2VncHRyKSBHZXRDb2RlSGFuZGxlCiA5NCAgc3R1YiBEZWZpbmVIYW5kbGVUYWJsZQogOTUgIHBhc2NhbDE2IExvYWRMaWJyYXJ5KHB0cikgTG9hZExpYnJhcnkxNgotOTYgIHBhc2NhbDE2IEZyZWVMaWJyYXJ5KHdvcmQpIEZyZWVMaWJyYXJ5Cis5NiAgcGFzY2FsMTYgRnJlZUxpYnJhcnkod29yZCkgRnJlZUxpYnJhcnkxNgogOTcgIHBhc2NhbDE2IEdldFRlbXBGaWxlTmFtZShieXRlIHB0ciB3b3JkIHB0cikgR2V0VGVtcEZpbGVOYW1lMTYKIDk4ICByZXR1cm4gR2V0TGFzdERpc2tDaGFuZ2UgMCAwCiA5OSAgc3R1YiBHZXRMUEVyck1vZGUKQEAgLTExMSw3ICsxMTEsNyBAQAogMTEyIHBhc2NhbDE2IEdsb2JhbFVuV2lyZSh3b3JkKSBHbG9iYWxVbldpcmUxNgogMTEzIGVxdWF0ZSBfX0FIU0hJRlQgMwogMTE0IGVxdWF0ZSBfX0FISU5DUiA4Ci0xMTUgcGFzY2FsMTYgT3V0cHV0RGVidWdTdHJpbmcocHRyKSBPdXRwdXREZWJ1Z1N0cmluZworMTE1IHBhc2NhbDE2IE91dHB1dERlYnVnU3RyaW5nKHB0cikgT3V0cHV0RGVidWdTdHJpbmcxNgogMTE2IHN0dWIgSW5pdExpYgogMTE3IHBhc2NhbDE2IE9sZFlpZWxkKCkgT2xkWWllbGQKIDExOCByZWdpc3RlciBHZXRUYXNrUXVldWVEUygpIEdldFRhc2tRdWV1ZURTCkBAIC0yNjEsNyArMjYxLDcgQEAKICMzNTEgQlVOTllfMzUxCiAzNTIgcGFzY2FsICAgbHN0cmNhdG4oc2VncHRyIHNlZ3B0ciB3b3JkKSBsc3RyY2F0bjE2CiAzNTMgcGFzY2FsICAgbHN0cmNweW4oc2VncHRyIHNlZ3B0ciB3b3JkKSBsc3RyY3B5bjE2Ci0zNTQgcGFzY2FsICAgR2V0QXBwQ29tcGF0RmxhZ3Mod29yZCkgR2V0QXBwQ29tcGF0RmxhZ3MKKzM1NCBwYXNjYWwgICBHZXRBcHBDb21wYXRGbGFncyh3b3JkKSBHZXRBcHBDb21wYXRGbGFnczE2CiAzNTUgcGFzY2FsMTYgR2V0V2luRGVidWdJbmZvKHB0ciB3b3JkKSBHZXRXaW5EZWJ1Z0luZm8KIDM1NiBwYXNjYWwxNiBTZXRXaW5EZWJ1Z0luZm8ocHRyKSBTZXRXaW5EZWJ1Z0luZm8KIDM2MCBzdHViIE9wZW5GaWxlRXgKZGlmZiAtLWdpdCBhL2lmMTYzMi9rZXJuZWwzMi5zcGVjIGIvaWYxNjMyL2tlcm5lbDMyLnNwZWMKaW5kZXggMmM1MWI4Zi4uZjgyODFlZSAxMDA2NDQKLS0tIGEvaWYxNjMyL2tlcm5lbDMyLnNwZWMKKysrIGIvaWYxNjMyL2tlcm5lbDMyLnNwZWMKQEAgLTI3OCwxMCArMjc4LDEwIEBACiAwMjczIHN0ZGNhbGwgR2V0U3RhcnR1cEluZm9BKHB0cikgR2V0U3RhcnR1cEluZm8zMkEKIDAyNzQgc3RkY2FsbCBHZXRTdGFydHVwSW5mb1cocHRyKSBHZXRTdGFydHVwSW5mbzMyVwogMDI3NSBzdGRjYWxsIEdldFN0ZEhhbmRsZShsb25nKQlHZXRTdGRIYW5kbGUKLTAyNzYgc3R1YiBHZXRTdHJpbmdUeXBlQQotMDI3NyBzdHViIEdldFN0cmluZ1R5cGVFeEEKLTAyNzggc3R1YiBHZXRTdHJpbmdUeXBlRXhXCi0wMjc5IHN0dWIgR2V0U3RyaW5nVHlwZVcKKzAyNzYgc3RkY2FsbCBHZXRTdHJpbmdUeXBlQShsb25nIGxvbmcgcHRyIGxvbmcgcHRyKSBHZXRTdHJpbmdUeXBlMzJBCiswMjc3IHN0ZGNhbGwgR2V0U3RyaW5nVHlwZUV4QShsb25nIGxvbmcgcHRyIGxvbmcgcHRyKSBHZXRTdHJpbmdUeXBlRXgzMkEKKzAyNzggc3RkY2FsbCBHZXRTdHJpbmdUeXBlRXhXKGxvbmcgbG9uZyBwdHIgbG9uZyBwdHIpIEdldFN0cmluZ1R5cGVFeDMyVworMDI3OSBzdGRjYWxsIEdldFN0cmluZ1R5cGVXKGxvbmcgcHRyIGxvbmcgcHRyKSBHZXRTdHJpbmdUeXBlMzJXCiAwMjgwIHN0ZGNhbGwgR2V0U3lzdGVtRGVmYXVsdExDSUQoKSBHZXRTeXN0ZW1EZWZhdWx0TENJRAogMDI4MSBzdGRjYWxsIEdldFN5c3RlbURlZmF1bHRMYW5nSUQoKSBHZXRTeXN0ZW1EZWZhdWx0TGFuZ0lECiAwMjgyIHN0ZGNhbGwgR2V0U3lzdGVtRGlyZWN0b3J5QShwdHIgbG9uZykgR2V0U3lzdGVtRGlyZWN0b3J5MzJBCkBAIC0zNTMsMTMgKzM1MywxMyBAQAogMDM0OCBzdGRjYWxsIEludGVybG9ja2VkRXhjaGFuZ2UocHRyKSBJbnRlcmxvY2tlZEV4Y2hhbmdlCiAwMzQ5IHN0ZGNhbGwgSW50ZXJsb2NrZWRJbmNyZW1lbnQocHRyKSBJbnRlcmxvY2tlZEluY3JlbWVudAogMDM1MCBzdHViIEludmFsaWRhdGVDb25zb2xlRElCaXRzCi0wMzUxIHN0ZGNhbGwgSXNCYWRDb2RlUHRyKHB0ciBsb25nKQlXSU4zMl9Jc0JhZENvZGVQdHIKLTAzNTIgc3R1YiBJc0JhZEh1Z2VSZWFkUHRyCi0wMzUzIHN0dWIgSXNCYWRIdWdlV3JpdGVQdHIKLTAzNTQgc3RkY2FsbCBJc0JhZFJlYWRQdHIocHRyIGxvbmcpCVdJTjMyX0lzQmFkUmVhZFB0cgotMDM1NSBzdHViIElzQmFkU3RyaW5nUHRyQQotMDM1NiBzdHViIElzQmFkU3RyaW5nUHRyVwotMDM1NyBzdGRjYWxsIElzQmFkV3JpdGVQdHIocHRyIGxvbmcpCVdJTjMyX0lzQmFkV3JpdGVQdHIKKzAzNTEgc3RkY2FsbCBJc0JhZENvZGVQdHIocHRyIGxvbmcpIElzQmFkQ29kZVB0cjMyCiswMzUyIHN0ZGNhbGwgSXNCYWRIdWdlUmVhZFB0cihwdHIgbG9uZykgSXNCYWRIdWdlUmVhZFB0cjMyCiswMzUzIHN0ZGNhbGwgSXNCYWRIdWdlV3JpdGVQdHIocHRyIGxvbmcpIElzQmFkSHVnZVdyaXRlUHRyMzIKKzAzNTQgc3RkY2FsbCBJc0JhZFJlYWRQdHIocHRyIGxvbmcpIElzQmFkUmVhZFB0cjMyCiswMzU1IHN0ZGNhbGwgSXNCYWRTdHJpbmdQdHJBKHB0ciBsb25nKSBJc0JhZFN0cmluZ1B0cjMyQQorMDM1NiBzdGRjYWxsIElzQmFkU3RyaW5nUHRyVyhwdHIgbG9uZykgSXNCYWRTdHJpbmdQdHIzMlcKKzAzNTcgc3RkY2FsbCBJc0JhZFdyaXRlUHRyKHB0ciBsb25nKSBJc0JhZFdyaXRlUHRyMzIKIDAzNTggc3RkY2FsbCBJc0RCQ1NMZWFkQnl0ZShsb25nKSBJc0RCQ1NMZWFkQnl0ZTMyCiAwMzU5IHN0ZGNhbGwgSXNEQkNTTGVhZEJ5dGVFeChsb25nIGxvbmcpIElzREJDU0xlYWRCeXRlRXgKIDAzNjAgc3R1YiBJc1ZhbGlkQ29kZVBhZ2UKQEAgLTM4OCw3ICszODgsNyBAQAogMDM4MyBzdHViIExvY2tGaWxlRXgKIDAzODQgc3RkY2FsbCBMb2NrUmVzb3VyY2UobG9uZykgTG9ja1Jlc291cmNlMzIKIDAzODUgc3RkY2FsbCBNYXBWaWV3T2ZGaWxlKGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZykgTWFwVmlld09mRmlsZQotMDM4NiBzdGRjYWxsIE1hcFZpZXdPZkZpbGVFeChsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZykgTWFwVmlld09mRmlsZUV4CiswMzg2IHN0ZGNhbGwgTWFwVmlld09mRmlsZUV4KGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBwdHIpIE1hcFZpZXdPZkZpbGVFeAogMDM4NyBzdGRjYWxsIE1vdmVGaWxlQShwdHIgcHRyKSBNb3ZlRmlsZTMyQQogMDM4OCBzdHViIE1vdmVGaWxlRXhBCiAwMzg5IHN0dWIgTW92ZUZpbGVFeFcKQEAgLTM5OSwxNSArMzk5LDE1IEBACiAwMzk0IHN0dWIgT3BlbkV2ZW50QQogMDM5NSBzdHViIE9wZW5FdmVudFcKIDAzOTYgc3RkY2FsbCBPcGVuRmlsZShwdHIgcHRyIGxvbmcpIE9wZW5GaWxlMzIKLTAzOTcgc3RkY2FsbCBPcGVuRmlsZU1hcHBpbmdBKGxvbmcgbG9uZyBwdHIpIE9wZW5GaWxlTWFwcGluZwotMDM5OCBzdHViIE9wZW5GaWxlTWFwcGluZ1cKKzAzOTcgc3RkY2FsbCBPcGVuRmlsZU1hcHBpbmdBKGxvbmcgbG9uZyBwdHIpIE9wZW5GaWxlTWFwcGluZzMyQQorMDM5OCBzdGRjYWxsIE9wZW5GaWxlTWFwcGluZ1cobG9uZyBsb25nIHB0cikgT3BlbkZpbGVNYXBwaW5nMzJXCiAwMzk5IHN0dWIgT3Blbk11dGV4QQogMDQwMCBzdHViIE9wZW5NdXRleFcKIDA0MDEgc3R1YiBPcGVuUHJvY2VzcwogMDQwMiBzdHViIE9wZW5Qcm9maWxlVXNlck1hcHBpbmcKIDA0MDMgc3R1YiBPcGVuU2VtYXBob3JlQQogMDQwNCBzdHViIE9wZW5TZW1hcGhvcmVXCi0wNDA1IHN0ZGNhbGwgT3V0cHV0RGVidWdTdHJpbmdBKHB0cikgT3V0cHV0RGVidWdTdHJpbmcKKzA0MDUgc3RkY2FsbCBPdXRwdXREZWJ1Z1N0cmluZ0EocHRyKSBPdXRwdXREZWJ1Z1N0cmluZzMyQQogMDQwNiBzdHViIE91dHB1dERlYnVnU3RyaW5nVwogMDQwNyBzdHViIFBlZWtDb25zb2xlSW5wdXRBCiAwNDA4IHN0dWIgUGVla0NvbnNvbGVJbnB1dFcKQEAgLTU1MCwxNSArNTUwLDE1IEBACiAwNTQ1IHN0dWIgVmVyTGFuZ3VhZ2VOYW1lQQogMDU0NiBzdHViIFZlckxhbmd1YWdlTmFtZVcKIDA1NDcgc3R1YiBWZXJpZnlDb25zb2xlSW9IYW5kbGUKLTA1NDggICAgc3RkY2FsbCBWaXJ0dWFsQWxsb2MocHRyIGxvbmcgbG9uZyBsb25nKSBWaXJ0dWFsQWxsb2MKKzA1NDggc3RkY2FsbCBWaXJ0dWFsQWxsb2MocHRyIGxvbmcgbG9uZyBsb25nKSBWaXJ0dWFsQWxsb2MKIDA1NDkgc3R1YiBWaXJ0dWFsQnVmZmVyRXhjZXB0aW9uSGFuZGxlcgotMDU1MCAgICBzdGRjYWxsIFZpcnR1YWxGcmVlKHB0ciBsb25nIGxvbmcpIFZpcnR1YWxGcmVlCi0wNTUxIHN0dWIgVmlydHVhbExvY2sKKzA1NTAgc3RkY2FsbCBWaXJ0dWFsRnJlZShwdHIgbG9uZyBsb25nKSBWaXJ0dWFsRnJlZQorMDU1MSBzdGRjYWxsIFZpcnR1YWxMb2NrKHB0ciBsb25nKSBWaXJ0dWFsTG9jawogMDU1MiBzdGRjYWxsIFZpcnR1YWxQcm90ZWN0KHB0ciBsb25nIGxvbmcgcHRyKSBWaXJ0dWFsUHJvdGVjdAotMDU1MyBzdHViIFZpcnR1YWxQcm90ZWN0RXgKKzA1NTMgc3RkY2FsbCBWaXJ0dWFsUHJvdGVjdEV4KGxvbmcgcHRyIGxvbmcgbG9uZyBwdHIpIFZpcnR1YWxQcm90ZWN0RXgKIDA1NTQgc3RkY2FsbCBWaXJ0dWFsUXVlcnkocHRyIHB0ciBsb25nKSBWaXJ0dWFsUXVlcnkKLTA1NTUgc3R1YiBWaXJ0dWFsUXVlcnlFeAotMDU1NiBzdHViIFZpcnR1YWxVbmxvY2sKKzA1NTUgc3RkY2FsbCBWaXJ0dWFsUXVlcnlFeChsb25nIHB0ciBwdHIgbG9uZykgVmlydHVhbFF1ZXJ5RXgKKzA1NTYgc3RkY2FsbCBWaXJ0dWFsVW5sb2NrKHB0ciBsb25nKSBWaXJ0dWFsVW5sb2NrCiAwNTU3IHN0dWIgV2FpdENvbW1FdmVudAogMDU1OCBzdHViIFdhaXRGb3JEZWJ1Z0V2ZW50CiAwNTU5IHN0dWIgV2FpdEZvck11bHRpcGxlT2JqZWN0cwpAQCAtNjU5LDMgKzY1OSwyNCBAQAogMDY1MyBzdHViIFJlZ2lzdGVyU2VydmljZVByb2Nlc3MKIDA2NTQgc3R1YiBRdWV1ZVVzZXJBUEMKIDA2NTUgc3R1YiBDb252ZXJ0VG9HbG9iYWxIYW5kbGUKKzA2NTYgc3R1YiBTTWFwTFNfSVBfRUJQXzgKKzA2NTcgc3R1YiBTTWFwTFNfSVBfRUJQXzE2CiswNjU4IHN0dWIgU01hcExTX0lQX0VCUF8yMAorMDY1OSBzdHViIFNVbk1hcExTX0lQX0VCUF84CiswNjYwIHN0dWIgU1VuTWFwTFNfSVBfRUJQXzE2CiswNjYxIHN0dWIgU1VuTWFwTFNfSVBfRUJQXzIwCiswNjYyIHN0dWIgTWFwU0wKKzA2NjMgc3R1YiBLMzJUaGsxNjMyRXBpbG9nCiswNjY0IHN0dWIgSzMyVGhrMTYzMlByb2xvZworMDY2NSBzdHViIEdldFByb2Nlc3NGbGFncworMDY2NiBzdHViIFNNYXBMU19JUF9FQlBfMjQKKzA2Njcgc3R1YiBTVW5NYXBMU19JUF9FQlBfMjQKKzA2Njggc3R1YiBTTWFwTFNfSVBfRUJQXzMyCiswNjY5IHN0dWIgU1VuTWFwTFNfSVBfRUJQXzMyCiswNjcwIHN0dWIgU01hcExTX0lQX0VCUF8yOAorMDY3MSBzdHViIFNVbk1hcExTX0lQX0VCUF8yOAorMDY3MiBzdHViIFNNYXBMU19JUF9FQlBfNDAKKzA2NzMgc3R1YiBTVW5NYXBMU19JUF9FQlBfNDAKKzA2NzQgc3R1YiBGcmVlU0xDYWxsYmFjaworMDY3NSBzdHViIEFsbG9jU0xDYWxsYmFjaworMDY3NiBzdHViIENhbGxiYWNrMjgKZGlmZiAtLWdpdCBhL2lmMTYzMi9tbXN5c3RlbS5zcGVjIGIvaWYxNjMyL21tc3lzdGVtLnNwZWMKaW5kZXggNmVjNzUyYy4uNDgyZmY1MCAxMDA2NDQKLS0tIGEvaWYxNjMyL21tc3lzdGVtLnNwZWMKKysrIGIvaWYxNjMyL21tc3lzdGVtLnNwZWMKQEAgLTUsNyArNSw3IEBACiAyICAgICAgcGFzY2FsICBTTkRQTEFZU09VTkQocHRyIHdvcmQpIHNuZFBsYXlTb3VuZAogNSAgICAgIHBhc2NhbCAgTU1TWVNURU1HRVRWRVJTSU9OKCkgbW1zeXN0ZW1HZXRWZXJzaW9uCiA2ICAgICAgcGFzY2FsICBEcml2ZXJQcm9jKGxvbmcgd29yZCB3b3JkIGxvbmcgbG9uZykgRHJpdmVyUHJvYwotMzAgICAgIHBhc2NhbDE2IE91dHB1dERlYnVnU3RyKHB0cikgT3V0cHV0RGVidWdTdHJpbmcKKzMwICAgICBwYXNjYWwxNiBPdXRwdXREZWJ1Z1N0cihwdHIpIE91dHB1dERlYnVnU3RyaW5nMTYKIDMxICAgICBwYXNjYWwgIERyaXZlckNhbGxiYWNrKGxvbmcgd29yZCB3b3JkIHdvcmQgbG9uZyBsb25nIGxvbmcpCiAgICAgICAgICAgICAgICBEcml2ZXJDYWxsYmFjawogIzMyICAgIHBhc2NhbCAgU1RBQ0tFTlRFUgpAQCAtOTYsNyArOTYsNyBAQAogNjA3ICAgIHBhc2NhbCAgdGltZUdldFRpbWUoKSB0aW1lR2V0VGltZQogNzAxICAgIHBhc2NhbCAgTUNJU0VORENPTU1BTkQod29yZCB3b3JkIGxvbmcgbG9uZykgbWNpU2VuZENvbW1hbmQKIDcwMiAgICBwYXNjYWwgIE1DSVNFTkRTVFJJTkcocHRyIHB0ciB3b3JkIHdvcmQpIG1jaVNlbmRTdHJpbmcKLTcwMyAgICBwYXNjYWwgIE1DSUdFVERFVklDRUlEKHB0cikgbWNpU2VuZENvbW1hbmQKKzcwMyAgICBwYXNjYWwgIE1DSUdFVERFVklDRUlEKHB0cikgbWNpR2V0RGV2aWNlSUQKIDcwNiAgICBwYXNjYWwgIE1DSUdFVEVSUk9SU1RSSU5HKGxvbmcgcHRyIHdvcmQpIG1jaUdldEVycm9yU3RyaW5nCiAjOTAwICAgcGFzY2FsICBNTVRBU0tDUkVBVEUKICM5MDIgICBwYXNjYWwgIE1NVEFTS0JMT0NLCmRpZmYgLS1naXQgYS9pZjE2MzIvbnRkbGwuc3BlYyBiL2lmMTYzMi9udGRsbC5zcGVjCmluZGV4IDIyMDhlOTEuLjdhYzYwOGYgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9udGRsbC5zcGVjCisrKyBiL2lmMTYzMi9udGRsbC5zcGVjCkBAIC04OTIsMTUgKzg5MiwxNSBAQAogODg4IHN0dWIgY29zCiA4ODkgc3R1YiBmYWJzCiA4OTAgc3R1YiBmbG9vcgotODkxIHN0dWIgaXNhbHBoYQotODkyIHN0dWIgaXNkaWdpdAotODkzIHN0dWIgaXNsb3dlcgotODk0IHN0dWIgaXNwcmludAotODk1IHN0dWIgaXNzcGFjZQotODk2IHN0dWIgaXN1cHBlcgorODkxIHN0ZGNhbGwgaXNhbHBoYShsb25nKSBDUlRETExfaXNhbHBoYQorODkyIHN0ZGNhbGwgaXNkaWdpdChsb25nKSBDUlRETExfaXNkaWdpdAorODkzIHN0ZGNhbGwgaXNsb3dlcihsb25nKSBDUlRETExfaXNsb3dlcgorODk0IHN0ZGNhbGwgaXNwcmludChsb25nKSBDUlRETExfaXNwcmludAorODk1IHN0ZGNhbGwgaXNzcGFjZShsb25nKSBDUlRETExfaXNzcGFjZQorODk2IHN0ZGNhbGwgaXN1cHBlcihsb25nKSBDUlRETExfaXN1cHBlcgogODk3IHN0dWIgaXN3YWxwaGEKIDg5OCBzdHViIGlzd2N0eXBlCi04OTkgc3R1YiBpc3hkaWdpdAorODk5IHN0ZGNhbGwgaXN4ZGlnaXQobG9uZykgQ1JURExMX2lzeGRpZ2l0CiA5MDAgc3R1YiBsYWJzCiA5MDEgc3R1YiBsb2cKIDkwMiBzdHViIG1ic3Rvd2NzCkBAIC05MzAsOCArOTMwLDggQEAKIDkyNiBzdHViIHN0cnN0cgogOTI3IHN0ZGNhbGwgc3dwcmludGYoKSBDUlRETExfc3dwcmludGYKIDkyOCBzdHViIHRhbgotOTI5IHN0dWIgdG9sb3dlcgotOTMwIHN0dWIgdG91cHBlcgorOTI5IHN0ZGNhbGwgdG9sb3dlcihsb25nKSBDUlRETExfdG9sb3dlcgorOTMwIHN0ZGNhbGwgdG91cHBlcihsb25nKSBDUlRETExfdG91cHBlcgogOTMxIHN0dWIgdG93bG93ZXIKIDkzMiBzdHViIHRvd3VwcGVyCiA5MzMgc3R1YiB2c3ByaW50ZgpkaWZmIC0tZ2l0IGEvaWYxNjMyL29sZTJubHMuc3BlYyBiL2lmMTYzMi9vbGUybmxzLnNwZWMKaW5kZXggNDliMmIyZi4uMWZiNWJjMyAxMDA2NDQKLS0tIGEvaWYxNjMyL29sZTJubHMuc3BlYworKysgYi9pZjE2MzIvb2xlMm5scy5zcGVjCkBAIC03LDcgKzcsNyBAQAogNCBwYXNjYWwgR2V0U3lzdGVtRGVmYXVsdExhbmdJRCgpICBHZXRTeXN0ZW1EZWZhdWx0TGFuZ0lECiA1IHBhc2NhbCBHZXRMb2NhbGVJbmZvQShsb25nIGxvbmcgcHRyIHdvcmQpIEdldExvY2FsZUluZm9BCiA2IHN0dWIgTENNQVBTVFJJTkdBCi03IHN0dWIgR0VUU1RSSU5HVFlQRUEKKzcgcGFzY2FsMTYgR2V0U3RyaW5nVHlwZUEobG9uZyBsb25nIHB0ciB3b3JkIHB0cikgR2V0U3RyaW5nVHlwZTE2CiA4IHBhc2NhbDE2IENvbXBhcmVTdHJpbmdBKGxvbmcgbG9uZyBwdHIgd29yZCBwdHIgd29yZCkgQ29tcGFyZVN0cmluZzE2CiAjOSBXRVAKIDEwIHN0dWIgTElCTUFJTgpkaWZmIC0tZ2l0IGEvaWYxNjMyL3JlbGF5LmMgYi9pZjE2MzIvcmVsYXkuYwppbmRleCA3NWI0ZWI4Li4wNDViYjE2IDEwMDY0NAotLS0gYS9pZjE2MzIvcmVsYXkuYworKysgYi9pZjE2MzIvcmVsYXkuYwpAQCAtMTkwLDE1ICsxOTAsMjggQEAKICAqIChzdGFjays0KSAgIGFyZzEKICAqIChzdGFjaykgICAgIGZ1bmMgdG8gY2FsbAogICovCi12b2lkIFJFTEFZX0RlYnVnQ2FsbFRvMTYoIGludCogc3RhY2ssIGludCBuYmFyZ3MgKQordm9pZCBSRUxBWV9EZWJ1Z0NhbGxUbzE2KCBpbnQqIHN0YWNrLCBpbnQgbmJfYXJncyApCiB7CiAgICAgaWYgKCFkZWJ1Z2dpbmdfcmVsYXkpIHJldHVybjsKIAotICAgIHByaW50ZiggIkNhbGxUbzE2KGZ1bmM9JTA0eDolMDR4LGRzPSUwNHgiLAotICAgICAgICAgICAgSElXT1JEKHN0YWNrWzBdKSwgTE9XT1JEKHN0YWNrWzBdKSwgQ1VSUkVOVF9EUyApOwotICAgIHN0YWNrKys7Ci0gICAgd2hpbGUgKG5iYXJncy0tKSBwcmludGYoICIsMHglMDR4IiwgKnN0YWNrKysgKTsKLSAgICBwcmludGYoICIpXG4iICk7CisgICAgaWYgKG5iX2FyZ3MgPT0gLTEpICAvKiBSZWdpc3RlciBmdW5jdGlvbiAqLworICAgIHsKKyAgICAgICAgQ09OVEVYVCAqY29udGV4dCA9ICooQ09OVEVYVCAqKilzdGFjazsKKyAgICAgICAgcHJpbnRmKCAiQ2FsbFRvMTYoZnVuYz0lMDRseDolMDR4LGRzPSUwNGx4KVxuIiwKKyAgICAgICAgICAgICAgICBDU19yZWcoY29udGV4dCksIElQX3JlZyhjb250ZXh0KSwgRFNfcmVnKGNvbnRleHQpICk7CisgICAgICAgIHByaW50ZiggIiAgICAgQVg9JTA0eCBCWD0lMDR4IENYPSUwNHggRFg9JTA0eCBTST0lMDR4IERJPSUwNHggQlA9JTA0eCBFUz0lMDR4XG4iLAorICAgICAgICAgICAgICAgIEFYX3JlZyhjb250ZXh0KSwgQlhfcmVnKGNvbnRleHQpLCBDWF9yZWcoY29udGV4dCksCisgICAgICAgICAgICAgICAgRFhfcmVnKGNvbnRleHQpLCBTSV9yZWcoY29udGV4dCksIERJX3JlZyhjb250ZXh0KSwKKyAgICAgICAgICAgICAgICBCUF9yZWcoY29udGV4dCksIChXT1JEKUVTX3JlZyhjb250ZXh0KSApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwcmludGYoICJDYWxsVG8xNihmdW5jPSUwNHg6JTA0eCxkcz0lMDR4IiwKKyAgICAgICAgICAgICAgICBISVdPUkQoc3RhY2tbMF0pLCBMT1dPUkQoc3RhY2tbMF0pLCBDVVJSRU5UX0RTICk7CisgICAgICAgIHN0YWNrKys7CisgICAgICAgIHdoaWxlIChuYl9hcmdzLS0pIHByaW50ZiggIiwweCUwNHgiLCAqc3RhY2srKyApOworICAgICAgICBwcmludGYoICIpXG4iICk7CisgICAgfQogfQogCiAKQEAgLTM0OSw3ICszNjIsOCBAQAogICAgICAgICBzdGF0aWMgRkFSUFJPQzE2IGVudHJ5UG9pbnQgPSBOVUxMOwogCiAgICAgICAgIGlmICghZW50cnlQb2ludCkgIC8qIEdldCBlbnRyeSBwb2ludCBmb3IgVGhyb3coKSAqLwotICAgICAgICAgICAgZW50cnlQb2ludCA9IE1PRFVMRV9HZXRFbnRyeVBvaW50KCBHZXRNb2R1bGVIYW5kbGUoIktFUk5FTCIpLCA1NiApOworICAgICAgICAgICAgZW50cnlQb2ludCA9IE1PRFVMRV9HZXRFbnRyeVBvaW50KCBHZXRNb2R1bGVIYW5kbGUxNigiS0VSTkVMIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU2ICk7CiAgICAgICAgIHBGcmFtZS0+ZW50cnlfY3MgPSBTRUxFQ1RPUk9GKGVudHJ5UG9pbnQpOwogICAgICAgICBwRnJhbWUtPmVudHJ5X2lwID0gT0ZGU0VUT0YoZW50cnlQb2ludCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvaWYxNjMyL3NoZWxsLnNwZWMgYi9pZjE2MzIvc2hlbGwuc3BlYwppbmRleCBjOWM5MDdkLi5lYWY2ZWM5IDEwMDY0NAotLS0gYS9pZjE2MzIvc2hlbGwuc3BlYworKysgYi9pZjE2MzIvc2hlbGwuc3BlYwpAQCAtMTIsMTEgKzEyLDExIEBACiAgMTEgcGFzY2FsMTYgRHJhZ1F1ZXJ5RmlsZSh3b3JkIHNfd29yZCBwdHIgc193b3JkKSBEcmFnUXVlcnlGaWxlCiAgMTIgcGFzY2FsMTYgRHJhZ0ZpbmlzaCh3b3JkKSBEcmFnRmluaXNoCiAgMTMgcGFzY2FsMTYgRHJhZ1F1ZXJ5UG9pbnQod29yZCBwdHIpIERyYWdRdWVyeVBvaW50Ci0gMjAgcGFzY2FsMTYgU2hlbGxFeGVjdXRlKHdvcmQgcHRyIHB0ciBwdHIgcHRyIHNfd29yZCkgU2hlbGxFeGVjdXRlIAotIDIxIHBhc2NhbDE2IEZpbmRFeGVjdXRhYmxlKHB0ciBwdHIgcHRyKSBGaW5kRXhlY3V0YWJsZQorIDIwIHBhc2NhbDE2IFNoZWxsRXhlY3V0ZSh3b3JkIHB0ciBwdHIgcHRyIHB0ciBzX3dvcmQpIFNoZWxsRXhlY3V0ZTE2CisgMjEgcGFzY2FsMTYgRmluZEV4ZWN1dGFibGUocHRyIHB0ciBwdHIpIEZpbmRFeGVjdXRhYmxlMTYKICAyMiBwYXNjYWwxNiBTaGVsbEFib3V0KHdvcmQgcHRyIHB0ciB3b3JkKSBTaGVsbEFib3V0MTYKICAzMyBwYXNjYWwxNiBBYm91dERsZ1Byb2Mod29yZCB3b3JkIHdvcmQgbG9uZykgQWJvdXREbGdQcm9jMTYKLSAzNCBwYXNjYWwxNiBFeHRyYWN0SWNvbih3b3JkIHB0ciBzX3dvcmQpIEV4dHJhY3RJY29uCisgMzQgcGFzY2FsMTYgRXh0cmFjdEljb24od29yZCBwdHIgc193b3JkKSBFeHRyYWN0SWNvbjE2CiAgMzYgcGFzY2FsMTYgRXh0cmFjdEFzc29jaWF0ZWRJY29uKHdvcmQgcHRyIHB0cikgRXh0cmFjdEFzc29jaWF0ZWRJY29uCiAgMzcgcGFzY2FsICAgRG9FbnZpcm9ubWVudFN1YnN0KHB0ciB3b3JkKSBEb0Vudmlyb25tZW50U3Vic3QKICAzOCBwYXNjYWwgICBGaW5kRW52aXJvbm1lbnRTdHJpbmcocHRyKSBGaW5kRW52aXJvbm1lbnRTdHJpbmcKZGlmZiAtLWdpdCBhL2lmMTYzMi9zaGVsbDMyLnNwZWMgYi9pZjE2MzIvc2hlbGwzMi5zcGVjCmluZGV4IGI3YzY1ZjcuLmJlZjcwNzMgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9zaGVsbDMyLnNwZWMKKysrIGIvaWYxNjMyL3NoZWxsMzIuc3BlYwpAQCAtODYsNyArODYsNyBAQAogMDA4MSBzdHViIFNoZVNob3J0ZW5QYXRoVwogMDA4MiBzdGRjYWxsIFNoZWxsQWJvdXRBKGxvbmcgcHRyIHB0ciBsb25nKSBTaGVsbEFib3V0MzJBCiAwMDgzIHN0ZGNhbGwgU2hlbGxBYm91dFcobG9uZyBwdHIgcHRyIGxvbmcpIFNoZWxsQWJvdXQzMlcKLTAwODQgc3RkY2FsbCBTaGVsbEV4ZWN1dGVBKGxvbmcgcHRyIHB0ciBwdHIgcHRyIGxvbmcpIFNoZWxsRXhlY3V0ZQorMDA4NCBzdGRjYWxsIFNoZWxsRXhlY3V0ZUEobG9uZyBwdHIgcHRyIHB0ciBwdHIgbG9uZykgU2hlbGxFeGVjdXRlMzJBCiAwMDg1IHN0dWIgU2hlbGxFeGVjdXRlRXgKIDAwODYgc3R1YiBTaGVsbEV4ZWN1dGVFeEEKIDAwODcgc3R1YiBTaGVsbEV4ZWN1dGVFeFcKZGlmZiAtLWdpdCBhL2lmMTYzMi90aHVuay5jIGIvaWYxNjMyL3RodW5rLmMKaW5kZXggMWQzM2U2Ny4uZjU2NjEwMyAxMDA2NDQKLS0tIGEvaWYxNjMyL3RodW5rLmMKKysrIGIvaWYxNjMyL3RodW5rLmMKQEAgLTE0OCw3ICsxNDgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRkVOVU1QUk9DMTYgZnVuYywgTFBBUkFNIGxQYXJhbSApCiB7CiAgICAgREVDTF9USFVOSyggdGh1bmssIGZ1bmMsIENhbGxUbzE2X3dvcmRfd2xsd2wgKTsKLSAgICByZXR1cm4gRW51bU1ldGFGaWxlKCBoZGMsIGhtZiwgKE1GRU5VTVBST0MxNikmdGh1bmssIGxQYXJhbSApOworICAgIHJldHVybiBFbnVtTWV0YUZpbGUxNiggaGRjLCBobWYsIChNRkVOVU1QUk9DMTYpJnRodW5rLCBsUGFyYW0gKTsKIH0KIAogCkBAIC01ODEsNyArNTgxLDcgQEAKICAgICBUSFVOSyAqdGh1bmssICpvbGRUaHVuazsKIAogICAgIGlmICghZGVmRENIb29rUHJvYykgIC8qIEdldCBEQ0hvb2sgV2luMTYgZW50cnkgcG9pbnQgKi8KLSAgICAgICAgZGVmRENIb29rUHJvYyA9IE1PRFVMRV9HZXRFbnRyeVBvaW50KCBHZXRNb2R1bGVIYW5kbGUoIlVTRVIiKSwgMzYyICk7CisgICAgICAgIGRlZkRDSG9va1Byb2MgPSBNT0RVTEVfR2V0RW50cnlQb2ludCggR2V0TW9kdWxlSGFuZGxlMTYoIlVTRVIiKSwgMzYyICk7CiAKICAgICBpZiAocHJvYyAhPSBkZWZEQ0hvb2tQcm9jKQogICAgIHsKQEAgLTYxMCw4ICs2MTAsOCBAQAogICAgICAgICBpZiAodGh1bmsgPT0gKFRIVU5LICopRENIb29rKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIWRlZkRDSG9va1Byb2MpICAvKiBHZXQgRENIb29rIFdpbjE2IGVudHJ5IHBvaW50ICovCi0gICAgICAgICAgICAgICAgZGVmRENIb29rUHJvYyA9IE1PRFVMRV9HZXRFbnRyeVBvaW50KCBHZXRNb2R1bGVIYW5kbGUoIlVTRVIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM2MiApOworICAgICAgICAgICAgICAgIGRlZkRDSG9va1Byb2MgPSBNT0RVTEVfR2V0RW50cnlQb2ludChHZXRNb2R1bGVIYW5kbGUxNigiVVNFUiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNjIgKTsKICAgICAgICAgICAgICpwaG9va1Byb2MgPSBkZWZEQ0hvb2tQcm9jOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgKnBob29rUHJvYyA9IHRodW5rLT5wcm9jOwpAQCAtNjQ0LDYgKzY0NCw2IEBACiAJKTsKIAlmcHJpbnRmKHN0ZG5pbXAsIgl4MSA9ICVseFxuIix0aHMtPngxKTsKIAlmcHJpbnRmKHN0ZG5pbXAsIgl4MiA9ICVseFxuIix0aHMtPngyKTsKLQlobW09TG9hZE1vZHVsZShtb2R1bGUxNixOVUxMKTsKKwlobW09TG9hZE1vZHVsZTE2KG1vZHVsZTE2LE5VTEwpOwogCXJldHVybiBUUlVFOwogfQpkaWZmIC0tZ2l0IGEvaWYxNjMyL3VzZXIuc3BlYyBiL2lmMTYzMi91c2VyLnNwZWMKaW5kZXggMWJmZjFjYS4uNTY0ZTc5MCAxMDA2NDQKLS0tIGEvaWYxNjMyL3VzZXIuc3BlYworKysgYi9pZjE2MzIvdXNlci5zcGVjCkBAIC00Nyw3ICs0Nyw3IEBACiA0NCAgcGFzY2FsMTYgT3Blbkljb24od29yZCkgT3Blbkljb24xNgogNDUgIHBhc2NhbDE2IEJyaW5nV2luZG93VG9Ub3Aod29yZCkgQnJpbmdXaW5kb3dUb1RvcDE2CiA0NiAgcGFzY2FsMTYgR2V0UGFyZW50KHdvcmQpIEdldFBhcmVudDE2Ci00NyAgcGFzY2FsMTYgSXNXaW5kb3cod29yZCkgSXNXaW5kb3cKKzQ3ICBwYXNjYWwxNiBJc1dpbmRvdyh3b3JkKSBJc1dpbmRvdzE2CiA0OCAgcGFzY2FsMTYgSXNDaGlsZCh3b3JkIHdvcmQpIElzQ2hpbGQxNgogNDkgIHBhc2NhbDE2IElzV2luZG93VmlzaWJsZSh3b3JkKSBJc1dpbmRvd1Zpc2libGUxNgogNTAgIHBhc2NhbDE2IEZpbmRXaW5kb3coc2VncHRyIHB0cikgRmluZFdpbmRvdzE2CkBAIC0xMDcsMTQgKzEwNywxNCBAQAogMTA1IHBhc2NhbDE2IEZsYXNoV2luZG93KHdvcmQgd29yZCkgRmxhc2hXaW5kb3cxNgogMTA2IHBhc2NhbDE2IEdldEtleVN0YXRlKHdvcmQpIEdldEtleVN0YXRlMTYKIDEwNyBwYXNjYWwgICBEZWZXaW5kb3dQcm9jKHdvcmQgd29yZCB3b3JkIGxvbmcpIERlZldpbmRvd1Byb2MxNgotMTA4IHBhc2NhbDE2IEdldE1lc3NhZ2Uoc2VncHRyIHdvcmQgd29yZCB3b3JkKSBHZXRNZXNzYWdlCisxMDggcGFzY2FsMTYgR2V0TWVzc2FnZShzZWdwdHIgd29yZCB3b3JkIHdvcmQpIEdldE1lc3NhZ2UxNgogMTA5IHBhc2NhbDE2IFBlZWtNZXNzYWdlKHB0ciB3b3JkIHdvcmQgd29yZCB3b3JkKSBQZWVrTWVzc2FnZTE2Ci0xMTAgcGFzY2FsMTYgUG9zdE1lc3NhZ2Uod29yZCB3b3JkIHdvcmQgbG9uZykgUG9zdE1lc3NhZ2UKKzExMCBwYXNjYWwxNiBQb3N0TWVzc2FnZSh3b3JkIHdvcmQgd29yZCBsb25nKSBQb3N0TWVzc2FnZTE2CiAxMTEgcGFzY2FsICAgU2VuZE1lc3NhZ2Uod29yZCB3b3JkIHdvcmQgbG9uZykgU2VuZE1lc3NhZ2UxNgogMTEyIHBhc2NhbDE2IFdhaXRNZXNzYWdlKCkgV2FpdE1lc3NhZ2UKIDExMyBwYXNjYWwxNiBUcmFuc2xhdGVNZXNzYWdlKHB0cikgVHJhbnNsYXRlTWVzc2FnZTE2CiAxMTQgcGFzY2FsICAgRGlzcGF0Y2hNZXNzYWdlKHB0cikgRGlzcGF0Y2hNZXNzYWdlMTYKLTExNSBwYXNjYWwxNiBSZXBseU1lc3NhZ2UobG9uZykgUmVwbHlNZXNzYWdlCisxMTUgcGFzY2FsMTYgUmVwbHlNZXNzYWdlKGxvbmcpIFJlcGx5TWVzc2FnZTE2CiAxMTYgcGFzY2FsMTYgUG9zdEFwcE1lc3NhZ2Uod29yZCB3b3JkIHdvcmQgbG9uZykgUG9zdEFwcE1lc3NhZ2UxNgogMTE4IHBhc2NhbDE2IFJlZ2lzdGVyV2luZG93TWVzc2FnZShzZWdwdHIpIFJlZ2lzdGVyV2luZG93TWVzc2FnZTE2CiAxMTcgcGFzY2FsMTYgV2luZG93RnJvbURDKHdvcmQpIFdpbmRvd0Zyb21EQzE2CkBAIC0xMjMsMjkgKzEyMywyOSBAQAogMTIxIHBhc2NhbCAgIFNldFdpbmRvd3NIb29rKHNfd29yZCBzZWdwdHIpIFRIVU5LX1NldFdpbmRvd3NIb29rMTYKIDEyMiBwYXNjYWwgICBDYWxsV2luZG93UHJvYyhzZWdwdHIgd29yZCB3b3JkIHdvcmQgbG9uZykgQ2FsbFdpbmRvd1Byb2MxNgogMTIzIHBhc2NhbDE2IENhbGxNc2dGaWx0ZXIoc2VncHRyIHNfd29yZCkgQ2FsbE1zZ0ZpbHRlcjE2Ci0xMjQgcGFzY2FsMTYgVXBkYXRlV2luZG93KHdvcmQpIFVwZGF0ZVdpbmRvdworMTI0IHBhc2NhbDE2IFVwZGF0ZVdpbmRvdyh3b3JkKSBVcGRhdGVXaW5kb3cxNgogMTI1IHBhc2NhbDE2IEludmFsaWRhdGVSZWN0KHdvcmQgcHRyIHdvcmQpIEludmFsaWRhdGVSZWN0MTYKIDEyNiBwYXNjYWwxNiBJbnZhbGlkYXRlUmduKHdvcmQgd29yZCB3b3JkKSBJbnZhbGlkYXRlUmduMTYKIDEyNyBwYXNjYWwxNiBWYWxpZGF0ZVJlY3Qod29yZCBwdHIpIFZhbGlkYXRlUmVjdDE2CiAxMjggcGFzY2FsMTYgVmFsaWRhdGVSZ24od29yZCB3b3JkKSBWYWxpZGF0ZVJnbjE2Ci0xMjkgcGFzY2FsMTYgR2V0Q2xhc3NXb3JkKHdvcmQgc193b3JkKSBHZXRDbGFzc1dvcmQKLTEzMCBwYXNjYWwxNiBTZXRDbGFzc1dvcmQod29yZCBzX3dvcmQgd29yZCkgU2V0Q2xhc3NXb3JkCisxMjkgcGFzY2FsMTYgR2V0Q2xhc3NXb3JkKHdvcmQgc193b3JkKSBHZXRDbGFzc1dvcmQxNgorMTMwIHBhc2NhbDE2IFNldENsYXNzV29yZCh3b3JkIHNfd29yZCB3b3JkKSBTZXRDbGFzc1dvcmQxNgogMTMxIHBhc2NhbCAgIEdldENsYXNzTG9uZyh3b3JkIHNfd29yZCkgR2V0Q2xhc3NMb25nMTYKIDEzMiBwYXNjYWwgICBTZXRDbGFzc0xvbmcod29yZCBzX3dvcmQgbG9uZykgU2V0Q2xhc3NMb25nMTYKLTEzMyBwYXNjYWwxNiBHZXRXaW5kb3dXb3JkKHdvcmQgc193b3JkKSBHZXRXaW5kb3dXb3JkCi0xMzQgcGFzY2FsMTYgU2V0V2luZG93V29yZCh3b3JkIHNfd29yZCB3b3JkKSBTZXRXaW5kb3dXb3JkCisxMzMgcGFzY2FsMTYgR2V0V2luZG93V29yZCh3b3JkIHNfd29yZCkgR2V0V2luZG93V29yZDE2CisxMzQgcGFzY2FsMTYgU2V0V2luZG93V29yZCh3b3JkIHNfd29yZCB3b3JkKSBTZXRXaW5kb3dXb3JkMTYKIDEzNSBwYXNjYWwgICBHZXRXaW5kb3dMb25nKHdvcmQgc193b3JkKSBHZXRXaW5kb3dMb25nMTYKIDEzNiBwYXNjYWwgICBTZXRXaW5kb3dMb25nKHdvcmQgc193b3JkIGxvbmcpIFNldFdpbmRvd0xvbmcxNgogMTM3IHBhc2NhbDE2IE9wZW5DbGlwYm9hcmQod29yZCkgT3BlbkNsaXBib2FyZDE2CiAxMzggcGFzY2FsMTYgQ2xvc2VDbGlwYm9hcmQoKSBDbG9zZUNsaXBib2FyZDE2CiAxMzkgcGFzY2FsMTYgRW1wdHlDbGlwYm9hcmQoKSBFbXB0eUNsaXBib2FyZDE2CiAxNDAgcGFzY2FsMTYgR2V0Q2xpcGJvYXJkT3duZXIoKSBHZXRDbGlwYm9hcmRPd25lcjE2Ci0xNDEgcGFzY2FsMTYgU2V0Q2xpcGJvYXJkRGF0YSh3b3JkIHdvcmQpIFNldENsaXBib2FyZERhdGEKLTE0MiBwYXNjYWwxNiBHZXRDbGlwYm9hcmREYXRhKHdvcmQpIEdldENsaXBib2FyZERhdGEKKzE0MSBwYXNjYWwxNiBTZXRDbGlwYm9hcmREYXRhKHdvcmQgd29yZCkgU2V0Q2xpcGJvYXJkRGF0YTE2CisxNDIgcGFzY2FsMTYgR2V0Q2xpcGJvYXJkRGF0YSh3b3JkKSBHZXRDbGlwYm9hcmREYXRhMTYKIDE0MyBwYXNjYWwxNiBDb3VudENsaXBib2FyZEZvcm1hdHMoKSBDb3VudENsaXBib2FyZEZvcm1hdHMxNgogMTQ0IHBhc2NhbDE2IEVudW1DbGlwYm9hcmRGb3JtYXRzKHdvcmQpIEVudW1DbGlwYm9hcmRGb3JtYXRzMTYKIDE0NSBwYXNjYWwxNiBSZWdpc3RlckNsaXBib2FyZEZvcm1hdChwdHIpIFJlZ2lzdGVyQ2xpcGJvYXJkRm9ybWF0MTYKLTE0NiBwYXNjYWwxNiBHZXRDbGlwYm9hcmRGb3JtYXROYW1lKHdvcmQgcHRyIHNfd29yZCkgR2V0Q2xpcGJvYXJkRm9ybWF0TmFtZQorMTQ2IHBhc2NhbDE2IEdldENsaXBib2FyZEZvcm1hdE5hbWUod29yZCBwdHIgc193b3JkKSBHZXRDbGlwYm9hcmRGb3JtYXROYW1lMTYKIDE0NyBwYXNjYWwxNiBTZXRDbGlwYm9hcmRWaWV3ZXIod29yZCkgU2V0Q2xpcGJvYXJkVmlld2VyMTYKIDE0OCBwYXNjYWwxNiBHZXRDbGlwYm9hcmRWaWV3ZXIoKSBHZXRDbGlwYm9hcmRWaWV3ZXIxNgogMTQ5IHBhc2NhbDE2IENoYW5nZUNsaXBib2FyZENoYWluKHdvcmQgcHRyKSBDaGFuZ2VDbGlwYm9hcmRDaGFpbjE2CkBAIC0xNjIsMTIgKzE2MiwxMiBAQAogMTYwIHBhc2NhbDE2IERyYXdNZW51QmFyKHdvcmQpIERyYXdNZW51QmFyMTYKIDE2MSBwYXNjYWwxNiBHZXRNZW51U3RyaW5nKHdvcmQgd29yZCBwdHIgc193b3JkIHdvcmQpIEdldE1lbnVTdHJpbmcxNgogMTYyIHBhc2NhbDE2IEhpbGl0ZU1lbnVJdGVtKHdvcmQgd29yZCB3b3JkIHdvcmQpIEhpbGl0ZU1lbnVJdGVtMTYKLTE2MyBwYXNjYWwxNiBDcmVhdGVDYXJldCh3b3JkIHdvcmQgd29yZCB3b3JkKSBDcmVhdGVDYXJldAotMTY0IHBhc2NhbDE2IERlc3Ryb3lDYXJldCgpIERlc3Ryb3lDYXJldAotMTY1IHBhc2NhbDE2IFNldENhcmV0UG9zKHdvcmQgd29yZCkgU2V0Q2FyZXRQb3MKKzE2MyBwYXNjYWwxNiBDcmVhdGVDYXJldCh3b3JkIHdvcmQgd29yZCB3b3JkKSBDcmVhdGVDYXJldDE2CisxNjQgcGFzY2FsMTYgRGVzdHJveUNhcmV0KCkgRGVzdHJveUNhcmV0MTYKKzE2NSBwYXNjYWwxNiBTZXRDYXJldFBvcyh3b3JkIHdvcmQpIFNldENhcmV0UG9zMTYKIDE2NiBwYXNjYWwxNiBIaWRlQ2FyZXQod29yZCkgSGlkZUNhcmV0MTYKIDE2NyBwYXNjYWwxNiBTaG93Q2FyZXQod29yZCkgU2hvd0NhcmV0MTYKLTE2OCBwYXNjYWwxNiBTZXRDYXJldEJsaW5rVGltZSh3b3JkKSBTZXRDYXJldEJsaW5rVGltZQorMTY4IHBhc2NhbDE2IFNldENhcmV0QmxpbmtUaW1lKHdvcmQpIFNldENhcmV0QmxpbmtUaW1lMTYKIDE2OSBwYXNjYWwxNiBHZXRDYXJldEJsaW5rVGltZSgpIEdldENhcmV0QmxpbmtUaW1lMTYKIDE3MCBwYXNjYWwxNiBBcnJhbmdlSWNvbmljV2luZG93cyh3b3JkKSBBcnJhbmdlSWNvbmljV2luZG93czE2CiAxNzEgcGFzY2FsMTYgV2luSGVscCh3b3JkIHB0ciB3b3JkIGxvbmcpIFdpbkhlbHAxNgpAQCAtMjM3LDggKzIzNyw4IEBACiAyMzQgcGFzY2FsMTYgVW5ob29rV2luZG93c0hvb2soc193b3JkIHNlZ3B0cikgVEhVTktfVW5ob29rV2luZG93c0hvb2sxNgogMjM1IHBhc2NhbCAgIERlZkhvb2tQcm9jKHNfd29yZCB3b3JkIGxvbmcgcHRyKSBEZWZIb29rUHJvYzE2CiAyMzYgcGFzY2FsMTYgR2V0Q2FwdHVyZSgpIEdldENhcHR1cmUxNgotMjM3IHBhc2NhbDE2IEdldFVwZGF0ZVJnbih3b3JkIHdvcmQgd29yZCkgR2V0VXBkYXRlUmduCi0yMzggcGFzY2FsMTYgRXhjbHVkZVVwZGF0ZVJnbih3b3JkIHdvcmQpIEV4Y2x1ZGVVcGRhdGVSZ24KKzIzNyBwYXNjYWwxNiBHZXRVcGRhdGVSZ24od29yZCB3b3JkIHdvcmQpIEdldFVwZGF0ZVJnbjE2CisyMzggcGFzY2FsMTYgRXhjbHVkZVVwZGF0ZVJnbih3b3JkIHdvcmQpIEV4Y2x1ZGVVcGRhdGVSZ24xNgogMjM5IHBhc2NhbDE2IERpYWxvZ0JveFBhcmFtKHdvcmQgc2VncHRyIHdvcmQgc2VncHRyIGxvbmcpIERpYWxvZ0JveFBhcmFtMTYKIDI0MCBwYXNjYWwxNiBEaWFsb2dCb3hJbmRpcmVjdFBhcmFtKHdvcmQgd29yZCB3b3JkIHNlZ3B0ciBsb25nKQogICAgICAgICAgICAgIERpYWxvZ0JveEluZGlyZWN0UGFyYW0xNgpAQCAtMzE2LDcgKzMxNiw3IEBACiAzMzEgcGFzY2FsMTYgRW5hYmxlSGFyZHdhcmVJbnB1dCh3b3JkKSBFbmFibGVIYXJkd2FyZUlucHV0CiAzMzIgcGFzY2FsMTYgVXNlcllpZWxkKCkgVXNlcllpZWxkCiAzMzMgc3R1YiBJc1VzZXJJZGxlCi0zMzQgcGFzY2FsICAgR2V0UXVldWVTdGF0dXMod29yZCkgR2V0UXVldWVTdGF0dXMKKzMzNCBwYXNjYWwgICBHZXRRdWV1ZVN0YXR1cyh3b3JkKSBHZXRRdWV1ZVN0YXR1czE2CiAzMzUgcGFzY2FsMTYgR2V0SW5wdXRTdGF0ZSgpIEdldElucHV0U3RhdGUxNgogMzM2IHN0dWIgTG9hZEN1cnNvckljb25IYW5kbGVyCiAzMzcgcGFzY2FsICAgR2V0TW91c2VFdmVudFByb2MoKSBHZXRNb3VzZUV2ZW50UHJvYwpAQCAtMzUzLDggKzM1Myw3IEBACiAzOTggcGFzY2FsMTYgR2V0Q2xhc3NJbmZvRXgod29yZCBzZWdwdHIgcHRyKSBHZXRDbGFzc0luZm9FeDE2CiAzOTkgc3R1YiBDaGlsZFdpbmRvd0Zyb21Qb2ludEV4CiA0MDAgc3R1YiBGaW5hbFVzZXJJbml0Ci00MDIgcGFzY2FsMTYgR2V0UHJpb3JpdHlDbGlwYm9hcmRGb3JtYXQod29yZCBwdHIgc193b3JkKQotICAgICAgICAgICAgIEdldFByaW9yaXR5Q2xpcGJvYXJkRm9ybWF0Cis0MDIgcGFzY2FsMTYgR2V0UHJpb3JpdHlDbGlwYm9hcmRGb3JtYXQod29yZCBwdHIgc193b3JkKSBHZXRQcmlvcml0eUNsaXBib2FyZEZvcm1hdDE2CiA0MDMgcGFzY2FsMTYgVW5yZWdpc3RlckNsYXNzKHNlZ3B0ciB3b3JkKSBVbnJlZ2lzdGVyQ2xhc3MxNgogNDA0IHBhc2NhbDE2IEdldENsYXNzSW5mbyh3b3JkIHNlZ3B0ciBwdHIpIEdldENsYXNzSW5mbzE2CiA0MDYgcGFzY2FsMTYgQ3JlYXRlQ3Vyc29yKHdvcmQgd29yZCB3b3JkIHdvcmQgd29yZCBwdHIgcHRyKSBDcmVhdGVDdXJzb3IxNgpAQCAtNDA4LDcgKzQwNyw3IEBACiA0NjEgcGFzY2FsMTYgU2V0SW50ZXJuYWxXaW5kb3dQb3Mod29yZCB3b3JkIHB0ciBwdHIpIFNldEludGVybmFsV2luZG93UG9zMTYKIDQ2MiBwYXNjYWwxNiBDYWxjQ2hpbGRTY3JvbGwod29yZCB3b3JkKSBDYWxjQ2hpbGRTY3JvbGwKIDQ2MyBwYXNjYWwxNiBTY3JvbGxDaGlsZHJlbih3b3JkIHdvcmQgd29yZCBsb25nKSBTY3JvbGxDaGlsZHJlbjE2Ci00NjQgcGFzY2FsICAgRHJhZ09iamVjdCh3b3JkIHdvcmQgd29yZCB3b3JkIHdvcmQgd29yZCkgRHJhZ09iamVjdAorNDY0IHBhc2NhbCAgIERyYWdPYmplY3Qod29yZCB3b3JkIHdvcmQgd29yZCB3b3JkIHdvcmQpIERyYWdPYmplY3QxNgogNDY1IHBhc2NhbDE2IERyYWdEZXRlY3Qod29yZCBsb25nKSBEcmFnRGV0ZWN0MTYKIDQ2NiBwYXNjYWwxNiBEcmF3Rm9jdXNSZWN0KHdvcmQgcHRyKSBEcmF3Rm9jdXNSZWN0MTYKIDQ3MCBzdHViIFN0cmluZ0Z1bmMKZGlmZiAtLWdpdCBhL2lmMTYzMi91c2VyMzIuc3BlYyBiL2lmMTYzMi91c2VyMzIuc3BlYwppbmRleCAyMGFjMjE0Li43MWY3ZjBiIDEwMDY0NAotLS0gYS9pZjE2MzIvdXNlcjMyLnNwZWMKKysrIGIvaWYxNjMyL3VzZXIzMi5zcGVjCkBAIC02Nyw3ICs2Nyw3IEBACiAwMDYyIHN0ZGNhbGwgQ291bnRDbGlwYm9hcmRGb3JtYXRzKCkgQ291bnRDbGlwYm9hcmRGb3JtYXRzMzIKIDAwNjMgc3R1YiBDcmVhdGVBY2NlbGVyYXRvclRhYmxlQQogMDA2NCBzdHViIENyZWF0ZUFjY2VsZXJhdG9yVGFibGVXCi0wMDY1IHN0ZGNhbGwgQ3JlYXRlQ2FyZXQobG9uZyBsb25nIGxvbmcgbG9uZykgQ3JlYXRlQ2FyZXQKKzAwNjUgc3RkY2FsbCBDcmVhdGVDYXJldChsb25nIGxvbmcgbG9uZyBsb25nKSBDcmVhdGVDYXJldDMyCiAwMDY2IHN0ZGNhbGwgQ3JlYXRlQ3Vyc29yKGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBwdHIgcHRyKSBDcmVhdGVDdXJzb3IzMgogMDA2NyBzdHViIENyZWF0ZURlc2t0b3BBCiAwMDY4IHN0dWIgQ3JlYXRlRGVza3RvcFcKQEAgLTEzNCw3ICsxMzQsNyBAQAogMDEyNyBzdGRjYWxsIERlZmVyV2luZG93UG9zKGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZykgRGVmZXJXaW5kb3dQb3MzMgogMDEyOCBzdGRjYWxsIERlbGV0ZU1lbnUobG9uZyBsb25nIGxvbmcpIERlbGV0ZU1lbnUzMgogMDEyOSBzdHViIERlc3Ryb3lBY2NlbGVyYXRvclRhYmxlCi0wMTMwIHN0ZGNhbGwgRGVzdHJveUNhcmV0KCkgRGVzdHJveUNhcmV0CiswMTMwIHN0ZGNhbGwgRGVzdHJveUNhcmV0KCkgRGVzdHJveUNhcmV0MzIKIDAxMzEgc3RkY2FsbCBEZXN0cm95Q3Vyc29yKGxvbmcpIERlc3Ryb3lDdXJzb3IzMgogMDEzMiBzdGRjYWxsIERlc3Ryb3lJY29uKGxvbmcpIERlc3Ryb3lJY29uMzIKIDAxMzMgc3RkY2FsbCBEZXN0cm95TWVudShsb25nKSBEZXN0cm95TWVudTMyCkBAIC0xOTgsNyArMTk4LDcgQEAKIDAxOTEgc3R1YiBFbnVtV2luZG93U3RhdGlvbnNXCiAwMTkyIHN0ZGNhbGwgRW51bVdpbmRvd3MocHRyIGxvbmcpIFRIVU5LX0VudW1XaW5kb3dzMzIKIDAxOTMgc3RkY2FsbCBFcXVhbFJlY3QocHRyIHB0cikgRXF1YWxSZWN0MzIKLTAxOTQgc3RkY2FsbCBFeGNsdWRlVXBkYXRlUmduKGxvbmcgbG9uZykgRXhjbHVkZVVwZGF0ZVJnbgorMDE5NCBzdGRjYWxsIEV4Y2x1ZGVVcGRhdGVSZ24obG9uZyBsb25nKSBFeGNsdWRlVXBkYXRlUmduMzIKIDAxOTUgc3RkY2FsbCBFeGl0V2luZG93c0V4KGxvbmcgbG9uZykgRXhpdFdpbmRvd3NFeAogMDE5NiBzdGRjYWxsIEZpbGxSZWN0KGxvbmcgcHRyIGxvbmcpIEZpbGxSZWN0MzIKIDAxOTcgc3RkY2FsbCBGaW5kV2luZG93QShwdHIgcHRyKSBGaW5kV2luZG93MzJBCkBAIC0yMDksNyArMjA5LDcgQEAKIDAyMDIgc3RkY2FsbCBGcmFtZVJlY3QobG9uZyBwdHIgbG9uZykgRnJhbWVSZWN0MzIKIDAyMDMgc3R1YiBGcmVlRERFbFBhcmFtCiAwMjA0IHN0ZGNhbGwgR2V0QWN0aXZlV2luZG93KCkgR2V0QWN0aXZlV2luZG93MzIKLTAyMDUgc3RkY2FsbCBHZXRBcHBDb21wYXRGbGFncyhsb25nKSBHZXRBcHBDb21wYXRGbGFncworMDIwNSBzdGRjYWxsIEdldEFwcENvbXBhdEZsYWdzKGxvbmcpIEdldEFwcENvbXBhdEZsYWdzMzIKIDAyMDYgc3RkY2FsbCBHZXRBc3luY0tleVN0YXRlKGxvbmcpIEdldEFzeW5jS2V5U3RhdGUzMgogMDIwNyBzdGRjYWxsIEdldENhcHR1cmUoKSBHZXRDYXB0dXJlMzIKIDAyMDggc3RkY2FsbCBHZXRDYXJldEJsaW5rVGltZSgpIEdldENhcmV0QmxpbmtUaW1lMzIKQEAgLTIyMiwxMiArMjIyLDEyIEBACiAwMjE1IHN0ZGNhbGwgR2V0Q2xhc3NMb25nVyhsb25nIGxvbmcpIEdldENsYXNzTG9uZzMyVwogMDIxNiBzdGRjYWxsIEdldENsYXNzTmFtZUEobG9uZyBwdHIgbG9uZykgR2V0Q2xhc3NOYW1lMzJBCiAwMjE3IHN0ZGNhbGwgR2V0Q2xhc3NOYW1lVyhsb25nIHB0ciBsb25nKSBHZXRDbGFzc05hbWUzMlcKLTAyMTggc3RkY2FsbCBHZXRDbGFzc1dvcmQobG9uZyBsb25nKSBHZXRDbGFzc1dvcmQKKzAyMTggc3RkY2FsbCBHZXRDbGFzc1dvcmQobG9uZyBsb25nKSBHZXRDbGFzc1dvcmQzMgogMDIxOSBzdGRjYWxsIEdldENsaWVudFJlY3QobG9uZyBsb25nKSBHZXRDbGllbnRSZWN0MzIKIDAyMjAgc3RkY2FsbCBHZXRDbGlwQ3Vyc29yKHB0cikgR2V0Q2xpcEN1cnNvcjMyCi0wMjIxIHN0ZGNhbGwgR2V0Q2xpcGJvYXJkRGF0YShsb25nKSBHZXRDbGlwYm9hcmREYXRhCi0wMjIyIHN0dWIgR2V0Q2xpcGJvYXJkRm9ybWF0TmFtZUEKLTAyMjMgc3R1YiBHZXRDbGlwYm9hcmRGb3JtYXROYW1lVworMDIyMSBzdGRjYWxsIEdldENsaXBib2FyZERhdGEobG9uZykgR2V0Q2xpcGJvYXJkRGF0YTMyCiswMjIyIHN0ZGNhbGwgR2V0Q2xpcGJvYXJkRm9ybWF0TmFtZUEobG9uZyBwdHIgbG9uZykgR2V0Q2xpcGJvYXJkRm9ybWF0TmFtZTMyQQorMDIyMyBzdGRjYWxsIEdldENsaXBib2FyZEZvcm1hdE5hbWVXKGxvbmcgcHRyIGxvbmcpIEdldENsaXBib2FyZEZvcm1hdE5hbWUzMlcKIDAyMjQgc3RkY2FsbCBHZXRDbGlwYm9hcmRPd25lcigpIEdldENsaXBib2FyZE93bmVyMzIKIDAyMjUgc3RkY2FsbCBHZXRDbGlwYm9hcmRWaWV3ZXIobG9uZykgR2V0Q2xpcGJvYXJkVmlld2VyMzIKIDAyMjYgc3RkY2FsbCBHZXRDdXJzb3IoKSBHZXRDdXJzb3IzMgpAQCAtMjczLDExICsyNzMsMTEgQEAKIDAyNjYgc3RkY2FsbCBHZXRNZW51U3RhdGUobG9uZyBsb25nIGxvbmcpIEdldE1lbnVTdGF0ZTMyCiAwMjY3IHN0ZGNhbGwgR2V0TWVudVN0cmluZ0EobG9uZyBsb25nIHB0ciBsb25nIGxvbmcpIEdldE1lbnVTdHJpbmczMkEKIDAyNjggc3RkY2FsbCBHZXRNZW51U3RyaW5nVyhsb25nIGxvbmcgcHRyIGxvbmcgbG9uZykgR2V0TWVudVN0cmluZzMyVwotMDI2OSBzdGRjYWxsIEdldE1lc3NhZ2VBKHB0ciBsb25nIGxvbmcgbG9uZykgVVNFUjMyX0dldE1lc3NhZ2VBCiswMjY5IHN0ZGNhbGwgR2V0TWVzc2FnZUEocHRyIGxvbmcgbG9uZyBsb25nKSBHZXRNZXNzYWdlMzJBCiAwMjcwIHN0ZGNhbGwgR2V0TWVzc2FnZUV4dHJhSW5mbygpIEdldE1lc3NhZ2VFeHRyYUluZm8KIDAyNzEgc3RkY2FsbCBHZXRNZXNzYWdlUG9zKCkgR2V0TWVzc2FnZVBvcwogMDI3MiBzdGRjYWxsIEdldE1lc3NhZ2VUaW1lKCkgR2V0TWVzc2FnZVRpbWUKLTAyNzMgc3RkY2FsbCBHZXRNZXNzYWdlVyhwdHIgbG9uZyBsb25nIGxvbmcpIFVTRVIzMl9HZXRNZXNzYWdlQQorMDI3MyBzdGRjYWxsIEdldE1lc3NhZ2VXKHB0ciBsb25nIGxvbmcgbG9uZykgR2V0TWVzc2FnZTMyVwogMDI3NCBzdGRjYWxsIEdldE5leHREbGdHcm91cEl0ZW0obG9uZyBsb25nIGxvbmcpIEdldE5leHREbGdHcm91cEl0ZW0zMgogMDI3NSBzdGRjYWxsIEdldE5leHREbGdUYWJJdGVtKGxvbmcgbG9uZyBsb25nKSBHZXROZXh0RGxnVGFiSXRlbTMyCiAwMjc2IHN0ZGNhbGwgR2V0T3BlbkNsaXBib2FyZFdpbmRvdygpIEdldE9wZW5DbGlwYm9hcmRXaW5kb3czMgpAQCAtMzAxLDcgKzMwMSw3IEBACiAwMjk0IHN0dWIgR2V0VGhyZWFkRGVza3RvcAogMDI5NSBzdGRjYWxsIEdldFRvcFdpbmRvdyhsb25nKSBHZXRUb3BXaW5kb3czMgogMDI5NiBzdGRjYWxsIEdldFVwZGF0ZVJlY3QobG9uZyBwdHIgbG9uZykgR2V0VXBkYXRlUmVjdDMyCi0wMjk3IHN0ZGNhbGwgR2V0VXBkYXRlUmduKGxvbmcgbG9uZyBsb25nKSBHZXRVcGRhdGVSZ24KKzAyOTcgc3RkY2FsbCBHZXRVcGRhdGVSZ24obG9uZyBsb25nIGxvbmcpIEdldFVwZGF0ZVJnbjMyCiAwMjk4IHN0dWIgR2V0VXNlck9iamVjdEluZm9ybWF0aW9uQQogMDI5OSBzdHViIEdldFVzZXJPYmplY3RJbmZvcm1hdGlvblcKIDAzMDAgc3R1YiBHZXRVc2VyT2JqZWN0U2VjdXJpdHkKQEAgLTMxNyw3ICszMTcsNyBAQAogMDMxMCBzdGRjYWxsIEdldFdpbmRvd1RleHRMZW5ndGhXKGxvbmcpIEdldFdpbmRvd1RleHRMZW5ndGgzMlcKIDAzMTEgc3RkY2FsbCBHZXRXaW5kb3dUZXh0Vyhsb25nIHB0ciBsb25nKSBHZXRXaW5kb3dUZXh0MzJXCiAwMzEyIHN0ZGNhbGwgR2V0V2luZG93VGhyZWFkUHJvY2Vzc0lkKGxvbmcgcHRyKSBHZXRXaW5kb3dUaHJlYWRQcm9jZXNzSWQKLTAzMTMgc3RkY2FsbCBHZXRXaW5kb3dXb3JkKGxvbmcgbG9uZykgR2V0V2luZG93V29yZAorMDMxMyBzdGRjYWxsIEdldFdpbmRvd1dvcmQobG9uZyBsb25nKSBHZXRXaW5kb3dXb3JkMzIKIDAzMTQgc3RkY2FsbCBHcmF5U3RyaW5nQShsb25nIGxvbmcgcHRyIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nKSBUSFVOS19HcmF5U3RyaW5nMzJBCiAwMzE1IHN0ZGNhbGwgR3JheVN0cmluZ1cobG9uZyBsb25nIHB0ciBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZykgVEhVTktfR3JheVN0cmluZzMyVwogMDMxNiBzdGRjYWxsIEhpZGVDYXJldChsb25nKSBIaWRlQ2FyZXQzMgpAQCAtMzUxLDcgKzM1MSw3IEBACiAwMzQ0IHN0ZGNhbGwgSXNJY29uaWMobG9uZykgSXNJY29uaWMzMgogMDM0NSBzdGRjYWxsIElzTWVudShsb25nKSBJc01lbnUzMgogMDM0NiBzdGRjYWxsIElzUmVjdEVtcHR5KHB0cikgSXNSZWN0RW1wdHkzMgotMDM0NyBzdGRjYWxsIElzV2luZG93KGxvbmcpIElzV2luZG93CiswMzQ3IHN0ZGNhbGwgSXNXaW5kb3cobG9uZykgSXNXaW5kb3czMgogMDM0OCBzdGRjYWxsIElzV2luZG93RW5hYmxlZChsb25nKSBJc1dpbmRvd0VuYWJsZWQzMgogMDM0OSBzdGRjYWxsIElzV2luZG93VW5pY29kZShsb25nKSBJc1dpbmRvd1VuaWNvZGUKIDAzNTAgc3RkY2FsbCBJc1dpbmRvd1Zpc2libGUobG9uZykgSXNXaW5kb3dWaXNpYmxlMzIKQEAgLTQyMiw4ICs0MjIsOCBAQAogMDQxNSBzdGRjYWxsIFBlZWtNZXNzYWdlQShwdHIgbG9uZyBsb25nIGxvbmcgbG9uZykgUGVla01lc3NhZ2UzMkEKIDA0MTYgc3RkY2FsbCBQZWVrTWVzc2FnZVcocHRyIGxvbmcgbG9uZyBsb25nIGxvbmcpIFBlZWtNZXNzYWdlMzJXCiAwNDE3IHN0dWIgUGxheVNvdW5kRXZlbnQKLTA0MTggc3RkY2FsbCBQb3N0TWVzc2FnZUEobG9uZyBsb25nIGxvbmcgbG9uZykgUG9zdE1lc3NhZ2UKLTA0MTkgc3RkY2FsbCBQb3N0TWVzc2FnZVcobG9uZyBsb25nIGxvbmcgbG9uZykgUG9zdE1lc3NhZ2UKKzA0MTggc3RkY2FsbCBQb3N0TWVzc2FnZUEobG9uZyBsb25nIGxvbmcgbG9uZykgUG9zdE1lc3NhZ2UzMkEKKzA0MTkgc3RkY2FsbCBQb3N0TWVzc2FnZVcobG9uZyBsb25nIGxvbmcgbG9uZykgUG9zdE1lc3NhZ2UzMlcKIDA0MjAgc3RkY2FsbCBQb3N0UXVpdE1lc3NhZ2UobG9uZykgUG9zdFF1aXRNZXNzYWdlMzIKIDA0MjEgc3R1YiBQb3N0VGhyZWFkTWVzc2FnZUEKIDA0MjIgc3R1YiBQb3N0VGhyZWFkTWVzc2FnZVcKQEAgLTQ2OCwxMiArNDY4LDEyIEBACiAwNDYxIHN0dWIgU2VydmVyU2V0RnVuY3Rpb25Qb2ludGVycwogMDQ2MiBzdGRjYWxsIFNldEFjdGl2ZVdpbmRvdyhsb25nKSBTZXRBY3RpdmVXaW5kb3czMgogMDQ2MyBzdGRjYWxsIFNldENhcHR1cmUobG9uZykgU2V0Q2FwdHVyZTMyCi0wNDY0IHN0ZGNhbGwgU2V0Q2FyZXRCbGlua1RpbWUobG9uZykgU2V0Q2FyZXRCbGlua1RpbWUKLTA0NjUgc3RkY2FsbCBTZXRDYXJldFBvcyhsb25nIGxvbmcpIFNldENhcmV0UG9zCiswNDY0IHN0ZGNhbGwgU2V0Q2FyZXRCbGlua1RpbWUobG9uZykgU2V0Q2FyZXRCbGlua1RpbWUzMgorMDQ2NSBzdGRjYWxsIFNldENhcmV0UG9zKGxvbmcgbG9uZykgU2V0Q2FyZXRQb3MzMgogMDQ2NiBzdGRjYWxsIFNldENsYXNzTG9uZ0EobG9uZyBsb25nIGxvbmcpIFNldENsYXNzTG9uZzMyQQogMDQ2NyBzdGRjYWxsIFNldENsYXNzTG9uZ1cobG9uZyBsb25nIGxvbmcpIFNldENsYXNzTG9uZzMyVwotMDQ2OCBzdGRjYWxsIFNldENsYXNzV29yZChsb25nIGxvbmcgbG9uZykgU2V0Q2xhc3NXb3JkCi0wNDY5IHN0ZGNhbGwgU2V0Q2xpcGJvYXJkRGF0YShsb25nIGxvbmcpIFNldENsaXBib2FyZERhdGEKKzA0Njggc3RkY2FsbCBTZXRDbGFzc1dvcmQobG9uZyBsb25nIGxvbmcpIFNldENsYXNzV29yZDMyCiswNDY5IHN0ZGNhbGwgU2V0Q2xpcGJvYXJkRGF0YShsb25nIGxvbmcpIFNldENsaXBib2FyZERhdGEzMgogMDQ3MCBzdGRjYWxsIFNldENsaXBib2FyZFZpZXdlcihsb25nKSBTZXRDbGlwYm9hcmRWaWV3ZXIzMgogMDQ3MSBzdGRjYWxsIFNldEN1cnNvcihsb25nKSBTZXRDdXJzb3IzMgogMDQ3MiBzdHViIFNldEN1cnNvckNvbnRlbnRzCkBAIC01MjcsNyArNTI3LDcgQEAKIDA1MjAgc3R1YiBTZXRXaW5kb3dTdGF0aW9uVXNlcgogMDUyMSBzdGRjYWxsIFNldFdpbmRvd1RleHRBKGxvbmcgcHRyKSBTZXRXaW5kb3dUZXh0MzJBCiAwNTIyIHN0ZGNhbGwgU2V0V2luZG93VGV4dFcobG9uZyBwdHIpIFNldFdpbmRvd1RleHQzMlcKLTA1MjMgc3RkY2FsbCBTZXRXaW5kb3dXb3JkKGxvbmcgbG9uZyBsb25nKSBTZXRXaW5kb3dXb3JkCiswNTIzIHN0ZGNhbGwgU2V0V2luZG93V29yZChsb25nIGxvbmcgbG9uZykgU2V0V2luZG93V29yZDMyCiAwNTI0IHN0ZGNhbGwgU2V0V2luZG93c0hvb2tBKGxvbmcgcHRyKSBTZXRXaW5kb3dzSG9vazMyQQogMDUyNSBzdGRjYWxsIFNldFdpbmRvd3NIb29rRXhBKGxvbmcgbG9uZyBsb25nIGxvbmcpIFNldFdpbmRvd3NIb29rRXgzMkEKIDA1MjYgc3RkY2FsbCBTZXRXaW5kb3dzSG9va0V4Vyhsb25nIGxvbmcgbG9uZyBsb25nKSBTZXRXaW5kb3dzSG9va0V4MzJXCkBAIC01NzAsNyArNTcwLDcgQEAKIDA1NjMgc3RkY2FsbCBVbnJlZ2lzdGVyQ2xhc3NXKHB0ciBsb25nKSBVbnJlZ2lzdGVyQ2xhc3MzMlcKIDA1NjQgc3R1YiBVbnJlZ2lzdGVySG90S2V5CiAwNTY1IHN0dWIgVXBkYXRlUGVyVXNlclN5c3RlbVBhcmFtZXRlcnMKLTA1NjYgc3RkY2FsbCBVcGRhdGVXaW5kb3cobG9uZykgVXBkYXRlV2luZG93CiswNTY2IHN0ZGNhbGwgVXBkYXRlV2luZG93KGxvbmcpIFVwZGF0ZVdpbmRvdzMyCiAwNTY3IHN0dWIgVXNlckNsaWVudERsbEluaXRpYWxpemUKIDA1Njggc3R1YiBVc2VyUmVhbGl6ZVBhbGV0dGUKIDA1Njkgc3R1YiBVc2VyUmVnaXN0ZXJXb3dIYW5kbGVycwpAQCAtNjAzLDMgKzYwMyw1IEBACiAwNTk1IHN0dWIgUmVnaXN0ZXJTZXJ2aWNlc1Byb2Nlc3MKIDA1OTYgc3R1YiBTZXRXaW5kb3dSZ24KIDA1OTcgc3R1YiBUb1VuaWNvZGVFeAorMDU5OCBzdHViIERyYXdDYXB0aW9uVGVtcEEKKzA1OTkgc3R1YiBSZWdpc3Rlck5ldHdvcmtDYXBhYmlsaXRpZXMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWR2YXBpMzIuaCBiL2luY2x1ZGUvYWR2YXBpMzIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JkOGNmZi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FkdmFwaTMyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNpZm5kZWYgX19XSU5FX0FEVkFQSTMyX0gKLSNkZWZpbmUgX19XSU5FX0FEVkFQSTMyX0gKLSNpbmNsdWRlICJzaGVsbC5oIgotCi1CT09MIEdldFVzZXJOYW1lQSAoY2hhciAqIGxwQnVmZmVyLCBEV09SRCAgKm5TaXplKTsKLQotI2VuZGlmICAvKiBfX1dJTkVfQURWQVBJMzJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jYWxsYmFjay5oIGIvaW5jbHVkZS9jYWxsYmFjay5oCmluZGV4IDlkY2YxNjUuLjdlZjVmYjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2FsbGJhY2suaAorKysgYi9pbmNsdWRlL2NhbGxiYWNrLmgKQEAgLTgsNiArOCw3IEBACiAjZGVmaW5lIF9fV0lORV9DQUxMQkFDS19ICiAKICNpbmNsdWRlICJ3aW50eXBlcy5oIgorI2luY2x1ZGUgIndpbm50LmgiCiAKIGV4dGVybgogaW50IENhbGxUbzMyX0xhcmdlU3RhY2soIGludCAoKmZ1bmMpKCksIGludCBuYmFyZ3MsIC4uLiApOwpAQCAtMjAsNiArMjEsNyBAQAogCiAjaWZuZGVmIFdJTkVMSUIKIAorZXh0ZXJuIHZvaWQgQ2FsbFRvMTZfcmVnc18gICAgICggY29uc3QgQ09OVEVYVCAqY29udGV4dCApOwogZXh0ZXJuIFdPUkQgQ2FsbFRvMTZfd29yZF93ICAgICggRkFSUFJPQzE2LCBXT1JEICk7CiBleHRlcm4gV09SRCBDYWxsVG8xNl93b3JkX3d3ICAgKCBGQVJQUk9DMTYsIFdPUkQsIFdPUkQgKTsKIGV4dGVybiBXT1JEIENhbGxUbzE2X3dvcmRfd2wgICAoIEZBUlBST0MxNiwgV09SRCwgTE9ORyApOwpAQCAtNDYsMTAgKzQ4LDYgQEAKIAkJCQkgICAgICAgTE9ORywgV09SRCwgTE9ORywgTE9ORywgTE9ORywgTE9ORywgCiAJCQkJICAgICAgIExPTkcsIFdPUkQpOwogCi0KLWV4dGVybiBXT1JEIENhbGxUbzE2X3JlZ3NfKCBGQVJQUk9DMTYgZnVuYywgV09SRCBkcywgV09SRCBlcywgV09SRCBicCwgV09SRCBheCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXT1JEIGJ4LCBXT1JEIGN4LCBXT1JEIGR4LCBXT1JEIHNpLCBXT1JEIGRpICk7Ci0KICNkZWZpbmUgQ2FsbERyaXZlclByb2MoIGZ1bmMsIGR3SWQsIG1zZywgaGRydnIsIGxwYXJhbTEsIGxwYXJhbTIgKSBcCiAgICAgQ2FsbFRvMTZfbG9uZ19sd3dsbCggZnVuYywgZHdJZCwgbXNnLCBoZHJ2ciwgbHBhcmFtMSwgbHBhcmFtMiApCiAjZGVmaW5lIENhbGxUaW1lRnVuY1Byb2MoIGZ1bmMsIGlkLCBtc2csIGR3VXNlciwgZHcxLCBkdzIgKSBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsaXBib2FyZC5oIGIvaW5jbHVkZS9jbGlwYm9hcmQuaAppbmRleCAzNGYzYmNmLi5kMDA3MGRmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsaXBib2FyZC5oCisrKyBiL2luY2x1ZGUvY2xpcGJvYXJkLmgKQEAgLTQsNiArNCw2IEBACiB2b2lkIENMSVBCT0FSRF9SZWFkU2VsZWN0aW9uKFdpbmRvdyB3LEF0b20gcHJvcCk7CiB2b2lkIENMSVBCT0FSRF9SZWxlYXNlU2VsZWN0aW9uKFdpbmRvdyB3LEhXTkQzMiBod25kKTsKIHZvaWQgQ0xJUEJPQVJEX0Rpc093bihXTkQqIHBXbmQpOwotQk9PTCBDTElQQk9BUkRfSXNQcmVzZW50KFdPUkQgd0Zvcm1hdCk7CitCT09MMzIgQ0xJUEJPQVJEX0lzUHJlc2VudChXT1JEIHdGb3JtYXQpOwogCiAjZW5kaWYgLyogX19XSU5FX0NMSVBCT0FSRF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbWJvLmggYi9pbmNsdWRlL2NvbWJvLmgKaW5kZXggNjQ1MTFlNS4uODJmZTg2YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb21iby5oCisrKyBiL2luY2x1ZGUvY29tYm8uaApAQCAtMTcsNSArMTcsNSBAQAogICBCT09MMTYgIGJSZWRyYXdGbGFnOwogfSBIRUFEQ09NQk8sKkxQSEVBRENPTUJPOwogCi1MUkVTVUxUIENvbWJvQm94V25kUHJvYyhIV05EMTYgaHduZCwgVUlOVCBtZXNzYWdlLCBXUEFSQU0xNiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwotTFJFU1VMVCBDb21ib0xCb3hXbmRQcm9jKEhXTkQxNiBod25kLCBVSU5UIG1lc3NhZ2UsIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CitMUkVTVUxUIENvbWJvQm94V25kUHJvYyhIV05EMTYgaHduZCwgVUlOVDE2IG1lc3NhZ2UsIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CitMUkVTVUxUIENvbWJvTEJveFduZFByb2MoSFdORDE2IGh3bmQsIFVJTlQxNiBtZXNzYWdlLCBXUEFSQU0xNiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb21tZGxnLmggYi9pbmNsdWRlL2NvbW1kbGcuaAppbmRleCAxNzYxOTkxLi40ZTg1NTYxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbW1kbGcuaAorKysgYi9pbmNsdWRlL2NvbW1kbGcuaApAQCAtNjIsOCArNjIsOCBAQAogCVNFR1BUUiAJCWxwc3RySW5pdGlhbERpcjsKIAlTRUdQVFIgCQlscHN0clRpdGxlOwogCURXT1JECQlGbGFnczsKLQlVSU5UCQluRmlsZU9mZnNldDsKLQlVSU5UCQluRmlsZUV4dGVuc2lvbjsKKwlVSU5UMTYJCW5GaWxlT2Zmc2V0OworCVVJTlQxNgkJbkZpbGVFeHRlbnNpb247CiAJU0VHUFRSCQlscHN0ckRlZkV4dDsKIAlMUEFSQU0gCQlsQ3VzdERhdGE7CiAgICAgICAgIFdORFBST0MxNiAgICAgICBscGZuSG9vazsKQEAgLTEwMSw4ICsxMDEsOCBAQAogCURXT1JECQlGbGFnczsgICAgICAgICAgICAgICAgICAvKiBvbmUgb3IgbW9yZSBvZiB0aGUgRlJfPz8gKi8KIAlTRUdQVFIJCWxwc3RyRmluZFdoYXQ7ICAgICAgICAgIC8qIHB0ci4gdG8gc2VhcmNoIHN0cmluZyAgICAqLwogCVNFR1BUUgkJbHBzdHJSZXBsYWNlV2l0aDsgICAgICAgLyogcHRyLiB0byByZXBsYWNlIHN0cmluZyAgICovCi0JVUlOVAkJd0ZpbmRXaGF0TGVuOyAgICAgICAgICAgLyogc2l6ZSBvZiBmaW5kIGJ1ZmZlciAgICAgICovCi0JVUlOVCAJCXdSZXBsYWNlV2l0aExlbjsgICAgICAgIC8qIHNpemUgb2YgcmVwbGFjZSBidWZmZXIgICAqLworCVVJTlQxNgkJd0ZpbmRXaGF0TGVuOyAgICAgICAgICAgLyogc2l6ZSBvZiBmaW5kIGJ1ZmZlciAgICAgICovCisJVUlOVDE2IAkJd1JlcGxhY2VXaXRoTGVuOyAgICAgICAgLyogc2l6ZSBvZiByZXBsYWNlIGJ1ZmZlciAgICovCiAJTFBBUkFNIAkJbEN1c3REYXRhOyAgICAgICAgICAgICAgLyogZGF0YSBwYXNzZWQgdG8gaG9vayBmbi4gICovCiAgICAgICAgIFdORFBST0MxNiAgICAgICBscGZuSG9vazsKIAlTRUdQVFIgCQlscFRlbXBsYXRlTmFtZTsgICAgICAgICAvKiBjdXN0b20gdGVtcGxhdGUgbmFtZSAgICAgKi8KQEAgLTE0NSw3ICsxNDUsNyBAQAogCQkJCQkJCS8qIGNvbnRhaW5zIGN1c3QuIGRsZy4gdGVtcGxhdGUgICovCiAJU0VHUFRSCQkJbHBzelN0eWxlIFdJTkVfUEFDS0VEOyAgLyogcmV0dXJuIHRoZSBzdHlsZSBmaWVsZCBoZXJlICAgKi8KIAkJCQkJCQkvKiBtdXN0IGJlIExGX0ZBQ0VTSVpFIG9yIGJpZ2dlciAqLwotCVVJTlQJCQluRm9udFR5cGU7ICAgICAgICAgIAkvKiBzYW1lIHZhbHVlIHJlcG9ydGVkIHRvIHRoZSAgICAqLworCVVJTlQxNgkJCW5Gb250VHlwZTsgICAgICAgICAgCS8qIHNhbWUgdmFsdWUgcmVwb3J0ZWQgdG8gdGhlICAgICovCiAJCQkJCQkgICAgCS8qIEVudW1Gb250cyBjYWxsYmFjayB3aXRoIHRoZSAgICovCiAJCQkJCQkJLyogZXh0cmEgRk9OVFRZUEVfIGJpdHMgYWRkZWQgICAgKi8KIAlzaG9ydAkJCW5TaXplTWluIFdJTkVfUEFDS0VEOyAgIC8qIG1pbmltdW0gcHQgc2l6ZSBhbGxvd2VkICYgKi8KQEAgLTIxMCwxMSArMjEwLDExIEBACiAJSEdMT0JBTDE2ICAgICAgIGhEZXZOYW1lczsKIAlIREMxNgkgICAgICAgCWhEQzsKIAlEV09SRCAJCUZsYWdzOwotCVVJTlQJCW5Gcm9tUGFnZTsKLQlVSU5UCQluVG9QYWdlOwotCVVJTlQJCW5NaW5QYWdlOwotCVVJTlQJCW5NYXhQYWdlOwotCVVJTlQJCW5Db3BpZXM7CisJVUlOVDE2CQluRnJvbVBhZ2U7CisJVUlOVDE2CQluVG9QYWdlOworCVVJTlQxNgkJbk1pblBhZ2U7CisJVUlOVDE2CQluTWF4UGFnZTsKKwlVSU5UMTYJCW5Db3BpZXM7CiAJSElOU1RBTkNFMTYgCWhJbnN0YW5jZTsKIAlMUEFSQU0gCQlsQ3VzdERhdGE7CiAgICAgICAgIFdORFBST0MxNiAgICAgICBscGZuUHJpbnRIb29rOwpAQCAtMjUwLDEwICsyNTAsMTAgQEAKICNkZWZpbmUgUERfSElERVBSSU5UVE9GSUxFICAgICAgICAgICAweDAwMTAwMDAwCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlVSU5UIAl3RHJpdmVyT2Zmc2V0OwotCVVJTlQgCXdEZXZpY2VPZmZzZXQ7Ci0JVUlOVCAJd091dHB1dE9mZnNldDsKLQlVSU5UIAl3RGVmYXVsdDsKKwlVSU5UMTYgCXdEcml2ZXJPZmZzZXQ7CisJVUlOVDE2IAl3RGV2aWNlT2Zmc2V0OworCVVJTlQxNiAJd091dHB1dE9mZnNldDsKKwlVSU5UMTYgCXdEZWZhdWx0OwogCX0gREVWTkFNRVM7CiB0eXBlZGVmIERFVk5BTUVTICogTFBERVZOQU1FUzsKIApAQCAtMjc1LDI0ICsyNzUsMjQgQEAKICNkZWZpbmUgQ0RFUlJfTk9IT09LICAgICAgICAgICAweDAwMEIKICNkZWZpbmUgQ0RFUlJfUkVHSVNURVJNU0dGQUlMICAweDAwMEMKIAotQk9PTCAgQ2hvb3NlQ29sb3IoTFBDSE9PU0VDT0xPUiBscENoQ29sKTsKK0JPT0wxNiAgQ2hvb3NlQ29sb3IoTFBDSE9PU0VDT0xPUiBscENoQ29sKTsKIERXT1JEIENvbW1EbGdFeHRlbmRlZEVycm9yKHZvaWQpOwogSFdORDE2IEZpbmRUZXh0KCBTRUdQVFIgZmluZCk7Ci1zaG9ydCBHZXRGaWxlVGl0bGUoTFBDU1RSIGxwRmlsZSwgTFBTVFIgbHBUaXRsZSwgVUlOVCBjYkJ1Zik7Ci1CT09MICBHZXRPcGVuRmlsZU5hbWUoU0VHUFRSIG9mbik7Ci1CT09MICBHZXRTYXZlRmlsZU5hbWUoU0VHUFRSIG9mbik7Ci1CT09MICBQcmludERsZyggU0VHUFRSIHByaW50KTsKK3Nob3J0IEdldEZpbGVUaXRsZShMUENTVFIgbHBGaWxlLCBMUFNUUiBscFRpdGxlLCBVSU5UMTYgY2JCdWYpOworQk9PTDE2ICBHZXRPcGVuRmlsZU5hbWUoU0VHUFRSIG9mbik7CitCT09MMTYgIEdldFNhdmVGaWxlTmFtZShTRUdQVFIgb2ZuKTsKK0JPT0wxNiAgUHJpbnREbGcoIFNFR1BUUiBwcmludCk7CiBIV05EMTYgUmVwbGFjZVRleHQoIFNFR1BUUiBmaW5kKTsKLUJPT0wgIENob29zZUZvbnQoTFBDSE9PU0VGT05UIGxwQ2hGb250KTsKK0JPT0wxNiAgQ2hvb3NlRm9udChMUENIT09TRUZPTlQgbHBDaEZvbnQpOwogCi1MUkVTVUxUIEZpbGVPcGVuRGxnUHJvYyhIV05EMTYgaFduZCwgVUlOVCB3TXNnLCBXUEFSQU0xNiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwotTFJFU1VMVCBGaWxlU2F2ZURsZ1Byb2MoSFdORDE2IGhXbmQsIFVJTlQgd01zZywgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKLUxSRVNVTFQgQ29sb3JEbGdQcm9jKEhXTkQxNiBoV25kLCBVSU5UIHdNc2csIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7Ci1MUkVTVUxUIEZpbmRUZXh0RGxnUHJvYyhIV05EMTYgaFduZCwgVUlOVCB3TXNnLCBXUEFSQU0xNiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwotTFJFU1VMVCBSZXBsYWNlVGV4dERsZ1Byb2MoSFdORDE2IGhXbmQsIFVJTlQgd01zZywgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKLUxSRVNVTFQgUHJpbnREbGdQcm9jKEhXTkQxNiBoV25kLCBVSU5UIHdNc2csIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7Ci1MUkVTVUxUIFByaW50U2V0dXBEbGdQcm9jKEhXTkQxNiBoV25kLCBVSU5UIHdNc2csIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7Ci1MUkVTVUxUIEZvcm1hdENoYXJEbGdQcm9jKEhXTkQxNiBoV25kLCBVSU5UIHdNc2csIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CitMUkVTVUxUIEZpbGVPcGVuRGxnUHJvYyhIV05EMTYgaFduZCwgVUlOVDE2IHdNc2csIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CitMUkVTVUxUIEZpbGVTYXZlRGxnUHJvYyhIV05EMTYgaFduZCwgVUlOVDE2IHdNc2csIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CitMUkVTVUxUIENvbG9yRGxnUHJvYyhIV05EMTYgaFduZCwgVUlOVDE2IHdNc2csIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CitMUkVTVUxUIEZpbmRUZXh0RGxnUHJvYyhIV05EMTYgaFduZCwgVUlOVDE2IHdNc2csIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CitMUkVTVUxUIFJlcGxhY2VUZXh0RGxnUHJvYyhIV05EMTYgaFduZCwgVUlOVDE2IHdNc2csIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CitMUkVTVUxUIFByaW50RGxnUHJvYyhIV05EMTYgaFduZCwgVUlOVDE2IHdNc2csIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CitMUkVTVUxUIFByaW50U2V0dXBEbGdQcm9jKEhXTkQxNiBoV25kLCBVSU5UMTYgd01zZywgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKK0xSRVNVTFQgRm9ybWF0Q2hhckRsZ1Byb2MoSFdORDE2IGhXbmQsIFVJTlQxNiB3TXNnLCBXUEFSQU0xNiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlnLmguaW4gYi9pbmNsdWRlL2NvbmZpZy5oLmluCmluZGV4IGNmMDBkMjguLjEyY2Q4MmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlnLmguaW4KKysrIGIvaW5jbHVkZS9jb25maWcuaC5pbgpAQCAtMjYsMyArMjYsOSBAQAogCiAvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHVzbGVlcCBmdW5jdGlvbi4gICovCiAjdW5kZWYgSEFWRV9VU0xFRVAKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB3YWl0NCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9XQUlUNAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHdhaXRwaWQgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfV0FJVFBJRApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kZGVfcHJvYy5oIGIvaW5jbHVkZS9kZGVfcHJvYy5oCmluZGV4IDg0Njk3Y2YuLmU4YTdhYjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZGRlX3Byb2MuaAorKysgYi9pbmNsdWRlL2RkZV9wcm9jLmgKQEAgLTUxLDkgKzUxLDkgQEAKIHZvaWQgZGRlX3duZF9zZXR1cCgpOwkJICAgLyogc2V0dXAgRGF0YSBzdHJ1Y3R1cmUgb2YgRERFIHdpbmRvd3MgKi8KIAogLyogU2VuZCBhY2suIHRvIGhuZCBpbmRpY2F0aW5nIHRoYXQgcG9zdGVkL3NlbnQgbXNnLiBnb3QgdG8gZGVzdGluYXRpb24qLwotdm9pZCBkZGVfcHJvY19zZW5kX2FjayhIV05EMTYgd25kLCBCT09MIHZhbCk7Ci1CT09MIERERV9Qb3N0TWVzc2FnZSggTVNHMTYgKm1zZyk7Ci1CT09MIERERV9TZW5kTWVzc2FnZSggTVNHMTYgKm1zZyk7Cit2b2lkIGRkZV9wcm9jX3NlbmRfYWNrKEhXTkQxNiB3bmQsIEJPT0wzMiB2YWwpOworQk9PTDMyIERERV9Qb3N0TWVzc2FnZSggTVNHMTYgKm1zZyk7CitCT09MMzIgRERFX1NlbmRNZXNzYWdlKCBNU0cxNiAqbXNnKTsKIGludCBEREVfR2V0UmVtb3RlTWVzc2FnZSgpOwogdm9pZCBEREVfRGVzdHJveVdpbmRvdyhIV05EMTYgaHduZCk7IC8qIGRlbGV0ZSBEREUgaW5mbyByZWdhcmRpbmcgaHduZCAqLwogdm9pZCBEREVfVGVzdERERShIV05EMTYgaHduZCk7CSAgIC8qIGRvIHdlIGhhdmUgZGRlIGhhbmRsaW5nIGluIHRoZSB3aW5kb3cgPyovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RlYnVnLmggYi9pbmNsdWRlL2RlYnVnLmgKaW5kZXggN2RjMDMzMC4uMzJiZDcyYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kZWJ1Zy5oCisrKyBiL2luY2x1ZGUvZGVidWcuaApAQCAtNzgsNiArNzgsNyBAQAogI3VuZGVmIERFQlVHX1RJTUVSCiAjdW5kZWYgREVCVUdfVE9PTEhFTFAKICN1bmRlZiBERUJVR19WRVIKKyN1bmRlZiBERUJVR19WSVJUVUFMCiAjdW5kZWYgREVCVUdfVlhECiAjdW5kZWYgREVCVUdfV0lOCiAjdW5kZWYgREVCVUdfV0lOMTZEUlYKQEAgLTE1OCw2ICsxNTksNyBAQAogI2RlZmluZSBERUJVR19USU1FUgogI2RlZmluZSBERUJVR19UT09MSEVMUAogI2RlZmluZSBERUJVR19WRVIKKyNkZWZpbmUgREVCVUdfVklSVFVBTAogI2RlZmluZSBERUJVR19WWEQKICNkZWZpbmUgREVCVUdfV0lOCiAjZGVmaW5lIERFQlVHX1dJTjE2RFJWCkBAIC01MjgsNiArNTMwLDExIEBACiAjZWxzZQogICAgIDAsCiAjZW5kaWYKKyNpZmRlZiBERUJVR19WSVJUVUFMCisgICAgMSwKKyNlbHNlCisgICAgMCwKKyNlbmRpZgogI2lmZGVmIERFQlVHX1ZYRAogICAgIDEsCiAjZWxzZQpAQCAtMTQ5Nyw4ICsxNTA0LDIxIEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl92eGQgaWYoIWRlYnVnX21zZ19lbmFibGVkWzcyXSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3Z4ZCBkZWJ1Z19tc2dfZW5hYmxlZFs3Ml0KKyNkZWZpbmUgZHByaW50Zl92aXJ0dWFsIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs3Ml0pIDsgZWxzZSBmcHJpbnRmCisjZGVmaW5lIGRlYnVnZ2luZ192aXJ0dWFsIGRlYnVnX21zZ19lbmFibGVkWzcyXQorI2Vsc2UKKyNpZmRlZiBERUJVR19WSVJUVUFMCisjZGVmaW5lIGRwcmludGZfdmlydHVhbCBmcHJpbnRmCisjZGVmaW5lIGRlYnVnZ2luZ192aXJ0dWFsIDEKKyNlbHNlCisjZGVmaW5lIGRwcmludGZfdmlydHVhbCB3aGlsZSgwKSBmcHJpbnRmCisjZGVmaW5lIGRlYnVnZ2luZ192aXJ0dWFsIDAKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBERUJVR19SVU5USU1FCisjZGVmaW5lIGRwcmludGZfdnhkIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs3M10pIDsgZWxzZSBmcHJpbnRmCisjZGVmaW5lIGRlYnVnZ2luZ192eGQgZGVidWdfbXNnX2VuYWJsZWRbNzNdCiAjZWxzZQogI2lmZGVmIERFQlVHX1ZYRAogI2RlZmluZSBkcHJpbnRmX3Z4ZCBmcHJpbnRmCkBAIC0xNTEwLDggKzE1MzAsOCBAQAogI2VuZGlmCiAKICNpZmRlZiBERUJVR19SVU5USU1FCi0jZGVmaW5lIGRwcmludGZfd2luIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs3M10pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ193aW4gZGVidWdfbXNnX2VuYWJsZWRbNzNdCisjZGVmaW5lIGRwcmludGZfd2luIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs3NF0pIDsgZWxzZSBmcHJpbnRmCisjZGVmaW5lIGRlYnVnZ2luZ193aW4gZGVidWdfbXNnX2VuYWJsZWRbNzRdCiAjZWxzZQogI2lmZGVmIERFQlVHX1dJTgogI2RlZmluZSBkcHJpbnRmX3dpbiBmcHJpbnRmCkBAIC0xNTIzLDggKzE1NDMsOCBAQAogI2VuZGlmCiAKICNpZmRlZiBERUJVR19SVU5USU1FCi0jZGVmaW5lIGRwcmludGZfd2luMTZkcnYgaWYoIWRlYnVnX21zZ19lbmFibGVkWzc0XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3dpbjE2ZHJ2IGRlYnVnX21zZ19lbmFibGVkWzc0XQorI2RlZmluZSBkcHJpbnRmX3dpbjE2ZHJ2IGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs3NV0pIDsgZWxzZSBmcHJpbnRmCisjZGVmaW5lIGRlYnVnZ2luZ193aW4xNmRydiBkZWJ1Z19tc2dfZW5hYmxlZFs3NV0KICNlbHNlCiAjaWZkZWYgREVCVUdfV0lOMTZEUlYKICNkZWZpbmUgZHByaW50Zl93aW4xNmRydiBmcHJpbnRmCkBAIC0xNTM2LDggKzE1NTYsOCBAQAogI2VuZGlmCiAKICNpZmRlZiBERUJVR19SVU5USU1FCi0jZGVmaW5lIGRwcmludGZfd2luMzIgaWYoIWRlYnVnX21zZ19lbmFibGVkWzc1XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3dpbjMyIGRlYnVnX21zZ19lbmFibGVkWzc1XQorI2RlZmluZSBkcHJpbnRmX3dpbjMyIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs3Nl0pIDsgZWxzZSBmcHJpbnRmCisjZGVmaW5lIGRlYnVnZ2luZ193aW4zMiBkZWJ1Z19tc2dfZW5hYmxlZFs3Nl0KICNlbHNlCiAjaWZkZWYgREVCVUdfV0lOMzIKICNkZWZpbmUgZHByaW50Zl93aW4zMiBmcHJpbnRmCkBAIC0xNTQ5LDggKzE1NjksOCBAQAogI2VuZGlmCiAKICNpZmRlZiBERUJVR19SVU5USU1FCi0jZGVmaW5lIGRwcmludGZfd2luc29jayBpZighZGVidWdfbXNnX2VuYWJsZWRbNzZdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfd2luc29jayBkZWJ1Z19tc2dfZW5hYmxlZFs3Nl0KKyNkZWZpbmUgZHByaW50Zl93aW5zb2NrIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs3N10pIDsgZWxzZSBmcHJpbnRmCisjZGVmaW5lIGRlYnVnZ2luZ193aW5zb2NrIGRlYnVnX21zZ19lbmFibGVkWzc3XQogI2Vsc2UKICNpZmRlZiBERUJVR19XSU5TT0NLCiAjZGVmaW5lIGRwcmludGZfd2luc29jayBmcHJpbnRmCkBAIC0xNjM3LDYgKzE2NTcsNyBAQAogICAgICJ0aW1lciIsCiAgICAgInRvb2xoZWxwIiwKICAgICAidmVyIiwKKyAgICAidmlydHVhbCIsCiAgICAgInZ4ZCIsCiAgICAgIndpbiIsCiAgICAgIndpbjE2ZHJ2IiwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZGVidWdnZXIuaCBiL2luY2x1ZGUvZGVidWdnZXIuaAppbmRleCAxYTFmMDJhLi5hNjY3MGNlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2RlYnVnZ2VyLmgKKysrIGIvaW5jbHVkZS9kZWJ1Z2dlci5oCkBAIC0zMDcsNiArMzA3LDcgQEAKIGV4dGVybiB2b2lkIERFQlVHX0xpc3Qoc3RydWN0IGxpc3RfaWQgKiBsaW5lMSwgc3RydWN0IGxpc3RfaWQgKiBsaW5lMiwgIAogCQkgICAgICAgaW50IGRlbHRhKTsKIGV4dGVybiB2b2lkIERFQlVHX051a2VQYXRoKHZvaWQpOworZXh0ZXJuIHZvaWQgREVCVUdfRGlzYXNzZW1ibGUoIGNvbnN0IERCR19BRERSICosIGNvbnN0IERCR19BRERSKiwgaW50IG9mZnNldCApOwogCiAgIC8qIGRlYnVnZ2VyL2RiZy55ICovCiBleHRlcm4gdm9pZCB3aW5lX2RlYnVnKCBpbnQgc2lnbmFsLCBTSUdDT05URVhUICpyZWdzICk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2RyaXZlci5oIGIvaW5jbHVkZS9kcml2ZXIuaAppbmRleCAxNmVlMGUyLi4zZWI3YjdkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2RyaXZlci5oCisrKyBiL2luY2x1ZGUvZHJpdmVyLmgKQEAgLTU0LDcgKzU0LDcgQEAKICAgICBXT1JEICAgICAgICAgICAgICAgICAgY291bnQ7CiAgICAgc3RydWN0IHRhZ0RSSVZFUklURU0gKmxwUHJldkl0ZW07CiAgICAgc3RydWN0IHRhZ0RSSVZFUklURU0gKmxwTmV4dEl0ZW07Ci0gICAgRFJJVkVSUFJPQyAgICAgICAgICAgIGxwRHJ2UHJvYzsKKyAgICBEUklWRVJQUk9DMTYgICAgICAgICAgbHBEcnZQcm9jOwogfSBEUklWRVJJVEVNLCAqTFBEUklWRVJJVEVNOwogCiBMUkVTVUxUIERlZkRyaXZlclByb2MoRFdPUkQgZHdEZXZJRCwgSERSVlIxNiBoRHJpdiwgVUlOVDE2IHdNc2csIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9maWxlLmggYi9pbmNsdWRlL2ZpbGUuaAppbmRleCBhMmJkMzc2Li5iYjMzMTU3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2ZpbGUuaAorKysgYi9pbmNsdWRlL2ZpbGUuaApAQCAtMTMsNiArMTMsMTYgQEAKIAogI2RlZmluZSBNQVhfUEFUSE5BTUVfTEVOICAgMTAyNAogCisvKiBUaGUgZmlsZSBvYmplY3QgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgSzMyT0JKICAgIGhlYWRlcjsKKyAgICBpbnQgICAgICAgdW5peF9oYW5kbGU7CisgICAgaW50ICAgICAgIG1vZGU7CisgICAgY2hhciAgICAgKnVuaXhfbmFtZTsKKyAgICBEV09SRCAgICAgdHlwZTsgICAgICAgICAvKiBUeXBlIGZvciB3aW4zMiBhcHBzICovCit9IEZJTEVfT0JKRUNUOworCiAvKiBEZWZpbml0aW9uIG9mIGEgZnVsbCBET1MgZmlsZSBuYW1lICovCiB0eXBlZGVmIHN0cnVjdAogewpAQCAtMzMsNiArNDMsMTAgQEAKIGV4dGVybiBIRklMRTMyIEZJTEVfRHVwMiggSEZJTEUzMiBoRmlsZTEsIEhGSUxFMzIgaEZpbGUyICk7CiBleHRlcm4gSEZJTEUzMiBGSUxFX09wZW4oIExQQ1NUUiBwYXRoLCBJTlQzMiBtb2RlICk7CiBleHRlcm4gQk9PTDMyIEZJTEVfU2V0RmlsZVR5cGUoIEhGSUxFMzIgaEZpbGUsIERXT1JEIHR5cGUgKTsKK2V4dGVybiBMUFZPSUQgRklMRV9tbWFwKCBGSUxFX09CSkVDVCAqZmlsZSwgTFBWT0lEIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIHNpemVfaGlnaCwgRFdPUkQgc2l6ZV9sb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgb2Zmc2V0X2hpZ2gsIERXT1JEIG9mZnNldF9sb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByb3QsIGludCBmbGFncyApOwogZXh0ZXJuIEhGSUxFMzIgX2xjcmVhdF91bmlxKCBMUENTVFIgcGF0aCwgSU5UMzIgYXR0ciApOwogCiAvKiBmaWxlcy9kaXJlY3RvcnkuYyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mb250LmggYi9pbmNsdWRlL2ZvbnQuaAppbmRleCAxMjQ1NmFkLi41MjhmZDY2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2ZvbnQuaAorKysgYi9pbmNsdWRlL2ZvbnQuaApAQCAtMjQsMjYgKzI0LDYgQEAKICNkZWZpbmUgTUFYX0ZPTlRTCTI1NgogZXh0ZXJuIExQTE9HRk9OVDE2IGxwTG9nRm9udExpc3RbTUFYX0ZPTlRTKzFdOwogCi0vKiBtYXkgYmUgc3dpdGNoZWQuLi4gKi8KLSNkZWZpbmUgR0dPX0JJVE1BUAkweDRGNEQKLSNkZWZpbmUgR0dPX05BVElWRQkweDRGNTAKLXR5cGVkZWYgc3RydWN0Ci17Ci0JVUlOVDE2CWdtQmxhY2tCb3hYOwotCVVJTlQxNglnbUJsYWNrQm94WTsKLQlQT0lOVDE2CWdtcHRHbHlwaE9yaWdpbjsKLQlpbnQJZ21DZWxsSW5jWDsKLQlpbnQJZ21DZWxsSW5jWTsKLX0gR0xZUEhNRVRSSUNTLCpMUEdMWVBITUVUUklDUzsKLXR5cGVkZWYgc3RydWN0Ci17Ci0JRFdPUkQJZU0xMTsgLyogYWxsIHR5cGUgRklYRUQgaW4gQm9ybGFuZHMgSGFuZGJvb2sgKi8KLQlEV09SRAllTTEyOyAKLQlEV09SRAllTTIxOwotCURXT1JECWVNMjI7Ci19IE1BVDIsKkxQTUFUMjsKLQotCiBleHRlcm4gQk9PTDMyIEZPTlRfSW5pdCggdm9pZCApOwogZXh0ZXJuIElOVDE2IEZPTlRfR2V0T2JqZWN0MTYoIEZPTlRPQkogKiBmb250LCBJTlQxNiBjb3VudCwgTFBTVFIgYnVmZmVyICk7CiBleHRlcm4gSU5UMzIgRk9OVF9HZXRPYmplY3QzMkEoIEZPTlRPQkogKiBmb250LCBJTlQzMiBjb3VudCwgTFBTVFIgYnVmZmVyICk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2hhbmRsZTMyLmggYi9pbmNsdWRlL2hhbmRsZTMyLmgKaW5kZXggNzY5OWVlZC4uOWZhMzAyMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9oYW5kbGUzMi5oCisrKyBiL2luY2x1ZGUvaGFuZGxlMzIuaApAQCAtNDIsNSArNDIsOCBAQAogCiBleHRlcm4gdm9pZCBLMzJPQkpfSW5jQ291bnQoIEszMk9CSiAqcHRyICk7CiBleHRlcm4gdm9pZCBLMzJPQkpfRGVjQ291bnQoIEszMk9CSiAqcHRyICk7CitleHRlcm4gQk9PTDMyIEszMk9CSl9BZGROYW1lKCBLMzJPQkogKm9iaiwgTFBDU1RSIG5hbWUgKTsKK2V4dGVybiBLMzJPQkogKkszMk9CSl9GaW5kTmFtZSggTFBDU1RSIG5hbWUgKTsKK2V4dGVybiBLMzJPQkogKkszMk9CSl9GaW5kTmFtZVR5cGUoIExQQ1NUUiBuYW1lLCBLMzJPQkpfVFlQRSB0eXBlICk7CiAKICNlbmRpZiAvKiBfX1dJTkVfSEFORExFMzJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saWJyZXMuaCBiL2luY2x1ZGUvbGlicmVzLmgKaW5kZXggNjAxNGEzYi4uYWRkZWI4NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saWJyZXMuaAorKysgYi9pbmNsdWRlL2xpYnJlcy5oCkBAIC00LDggKzQsNiBAQAogI2lmbmRlZiBfX1dJTkVfTElCUkVTX0gKICNkZWZpbmUgX19XSU5FX0xJQlJFU19ICiAKLSNpZmRlZiBXSU5FTElCCi0KICNpbmNsdWRlICJ3aW50eXBlcy5oIgogI2luY2x1ZGUgInJlc291cmNlLmgiCiAKQEAgLTE4LDYgKzE2LDQgQEAKIGV4dGVybiBMUFZPSUQgTElCUkVTX0xvY2tSZXNvdXJjZSggSEdMT0JBTDMyIGhhbmRsZSApOwogZXh0ZXJuIERXT1JEIExJQlJFU19TaXplb2ZSZXNvdXJjZSggSElOU1RBTkNFMzIgaE1vZHVsZSwgSFJTUkMzMiBoUnNyYyApOwogCi0jZW5kaWYgLyogV0lORUxJQiAqLwotCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGlzdGJveC5oIGIvaW5jbHVkZS9saXN0Ym94LmgKaW5kZXggZDNmOTdhZC4uMjdjZWUwNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saXN0Ym94LmgKKysrIGIvaW5jbHVkZS9saXN0Ym94LmgKQEAgLTQsNyArNCw3IEBACiAKIHR5cGVkZWYgc3RydWN0IHRhZ0xJU1RTVFJVQ1QgewogICAgICAgICBNRUFTVVJFSVRFTVNUUlVDVDE2IG1pczsKLSAgICAgICAgVUlOVCAgICAgICAgICAgIGl0ZW1TdGF0ZTsKKyAgICAgICAgVUlOVDE2ICAgICAgICAgICAgaXRlbVN0YXRlOwogICAgICAgICBSRUNUMTYgICAgICAgICAgaXRlbVJlY3Q7CiAJSExPQ0FMMTYJaERhdGE7CiAJY2hhciAgICAgICAgICAgICppdGVtVGV4dDsKQEAgLTI4LDEyICsyOCwxMiBAQAogCURXT1JEICAgZHdTdHlsZTsgICAgICAvKiBhZGRlZCBmb3IgQ09NQk9MQk9YIHN0eWxlIGZha2luZyAqLwogCUhXTkQxNiAgaFBhcmVudDsKIAlIRk9OVDE2IGhGb250OwotCUJPT0wgICAgYlJlZHJhd0ZsYWc7Ci0gICAgICAgIEJPT0wgICAgSGFzU3RyaW5nczsKLSAgICAgICAgQk9PTCAgICBPd25lckRyYXduOworCUJPT0wzMiAgYlJlZHJhd0ZsYWc7CisgICAgICAgIEJPT0wzMiAgSGFzU3RyaW5nczsKKyAgICAgICAgQk9PTDMyICBPd25lckRyYXduOwogCVdPUkQgICAgaU51bVN0b3BzOwogCUxQSU5UMTYgVGFiU3RvcHM7Ci0gICAgICAgIEJPT0wgICAgbmVlZE1lYXN1cmU7CisgICAgICAgIEJPT0wzMiAgbmVlZE1lYXN1cmU7CiAJSEdMT0JBTDE2IEhlYXBTZWw7CiAvKglNREVTQyAgICpIZWFwOyAqLwogfSBIRUFETElTVCwqTFBIRUFETElTVDsKQEAgLTQ0LDIyICs0NCwyMiBAQAogCiBleHRlcm4gdm9pZCBMaXN0Qm94U2VuZE5vdGlmaWNhdGlvbihMUEhFQURMSVNUIGxwaGwsIFdPUkQgY29kZSk7CiAKLWV4dGVybiBMUExJU1RTVFJVQ1QgTGlzdEJveEdldEl0ZW0oTFBIRUFETElTVCBscGhsLCBVSU5UIHVJbmRleCk7CitleHRlcm4gTFBMSVNUU1RSVUNUIExpc3RCb3hHZXRJdGVtKExQSEVBRExJU1QgbHBobCwgVUlOVDE2IHVJbmRleCk7CiBleHRlcm4gaW50IExpc3RNYXhGaXJzdFZpc2libGUoTFBIRUFETElTVCBscGhsKTsKIGV4dGVybiBpbnQgTGlzdEJveFNjcm9sbFRvRm9jdXMoTFBIRUFETElTVCBscGhsKTsKIGV4dGVybiBpbnQgTGlzdEJveEFkZFN0cmluZyhMUEhFQURMSVNUIGxwaGwsIFNFR1BUUiBpdGVtRGF0YSk7Ci1leHRlcm4gaW50IExpc3RCb3hJbnNlcnRTdHJpbmcoTFBIRUFETElTVCBscGhsLCBVSU5UIHVJbmRleCwgTFBDU1RSIG5ld3N0cik7Ci1leHRlcm4gaW50IExpc3RCb3hHZXRUZXh0KExQSEVBRExJU1QgbHBobCwgVUlOVCB1SW5kZXgsIExQU1RSIE91dFN0cik7Ci1leHRlcm4gRFdPUkQgTGlzdEJveEdldEl0ZW1EYXRhKExQSEVBRExJU1QgbHBobCwgVUlOVCB1SW5kZXgpOwotZXh0ZXJuIGludCBMaXN0Qm94U2V0SXRlbURhdGEoTFBIRUFETElTVCBscGhsLCBVSU5UIHVJbmRleCwgRFdPUkQgSXRlbURhdGEpOwotZXh0ZXJuIGludCBMaXN0Qm94RGVsZXRlU3RyaW5nKExQSEVBRExJU1QgbHBobCwgVUlOVCB1SW5kZXgpOwotZXh0ZXJuIGludCBMaXN0Qm94RmluZFN0cmluZyhMUEhFQURMSVNUIGxwaGwsIFVJTlQgbkZpcnN0LCBTRUdQVFIgTWF0Y2hTdHIpOwotZXh0ZXJuIGludCBMaXN0Qm94RmluZFN0cmluZ0V4YWN0KExQSEVBRExJU1QgbHBobCwgVUlOVCBuRmlyc3QsIFNFR1BUUiBNYXRjaFN0cik7CitleHRlcm4gaW50IExpc3RCb3hJbnNlcnRTdHJpbmcoTFBIRUFETElTVCBscGhsLCBVSU5UMTYgdUluZGV4LCBMUENTVFIgbmV3c3RyKTsKK2V4dGVybiBpbnQgTGlzdEJveEdldFRleHQoTFBIRUFETElTVCBscGhsLCBVSU5UMTYgdUluZGV4LCBMUFNUUiBPdXRTdHIpOworZXh0ZXJuIERXT1JEIExpc3RCb3hHZXRJdGVtRGF0YShMUEhFQURMSVNUIGxwaGwsIFVJTlQxNiB1SW5kZXgpOworZXh0ZXJuIGludCBMaXN0Qm94U2V0SXRlbURhdGEoTFBIRUFETElTVCBscGhsLCBVSU5UMTYgdUluZGV4LCBEV09SRCBJdGVtRGF0YSk7CitleHRlcm4gaW50IExpc3RCb3hEZWxldGVTdHJpbmcoTFBIRUFETElTVCBscGhsLCBVSU5UMTYgdUluZGV4KTsKK2V4dGVybiBpbnQgTGlzdEJveEZpbmRTdHJpbmcoTFBIRUFETElTVCBscGhsLCBVSU5UMTYgbkZpcnN0LCBTRUdQVFIgTWF0Y2hTdHIpOworZXh0ZXJuIGludCBMaXN0Qm94RmluZFN0cmluZ0V4YWN0KExQSEVBRExJU1QgbHBobCwgVUlOVDE2IG5GaXJzdCwgU0VHUFRSIE1hdGNoU3RyKTsKIGV4dGVybiBpbnQgTGlzdEJveFJlc2V0Q29udGVudChMUEhFQURMSVNUIGxwaGwpOwogZXh0ZXJuIGludCBMaXN0Qm94U2V0Q3VyU2VsKExQSEVBRExJU1QgbHBobCwgV09SRCB3SW5kZXgpOwogZXh0ZXJuIGludCBMaXN0Qm94U2V0U2VsKExQSEVBRExJU1QgbHBobCwgV09SRCB3SW5kZXgsIFdPUkQgc3RhdGUpOwogZXh0ZXJuIGludCBMaXN0Qm94R2V0U2VsKExQSEVBRExJU1QgbHBobCwgV09SRCB3SW5kZXgpOwotZXh0ZXJuIExPTkcgTGlzdEJveERpcmVjdG9yeShMUEhFQURMSVNUIGxwaGwsIFVJTlQgYXR0cmliLCBMUENTVFIgZmlsZXNwZWMpOworZXh0ZXJuIExPTkcgTGlzdEJveERpcmVjdG9yeShMUEhFQURMSVNUIGxwaGwsIFVJTlQxNiBhdHRyaWIsIExQQ1NUUiBmaWxlc3BlYyk7CiBleHRlcm4gaW50IExpc3RCb3hHZXRJdGVtUmVjdChMUEhFQURMSVNUIGxwaGwsIFdPUkQgd0luZGV4LCBMUFJFQ1QxNiByZWN0KTsKIGV4dGVybiBpbnQgTGlzdEJveFNldEl0ZW1IZWlnaHQoTFBIRUFETElTVCBscGhsLCBXT1JEIHdJbmRleCwgbG9uZyBoZWlnaHQpOwogZXh0ZXJuIGludCBMaXN0Qm94RmluZE5leHRNYXRjaChMUEhFQURMSVNUIGxwaGwsIFdPUkQgd0NoYXIpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZGkuaCBiL2luY2x1ZGUvbWRpLmgKaW5kZXggZWU2MTcxZi4uMGFkMjcwMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZGkuaAorKysgYi9pbmNsdWRlL21kaS5oCkBAIC0yMCw3ICsyMCw3IEBACiAKICNkZWZpbmUgV01fTURJQ0FMQ0NISUxEU0NST0xMICAgMHgxMEFDIC8qIHRoaXMgaXMgZXhhY3RseSB3aGF0IFdpbmRvd3MgdXNlcyAqLwogCi1leHRlcm4gTFJFU1VMVCBNRElDbGllbnRXbmRQcm9jKEhXTkQxNiBod25kLCBVSU5UIG1lc3NhZ2UsIAorZXh0ZXJuIExSRVNVTFQgTURJQ2xpZW50V25kUHJvYyhIV05EMTYgaHduZCwgVUlOVDE2IG1lc3NhZ2UsIAogCQkJCVdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7IC8qIG1kaS5jICovCiAKIHR5cGVkZWYgc3RydWN0IHRhZ01ESVdDTApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tbXN5c3RlbS5oIGIvaW5jbHVkZS9tbXN5c3RlbS5oCmluZGV4IDRmOTYwMTQuLjU2YmM2MTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbW1zeXN0ZW0uaAorKysgYi9pbmNsdWRlL21tc3lzdGVtLmgKQEAgLTE5LDcgKzE5LDcgQEAKIHR5cGVkZWYgV09SRCAgICBWRVJTSU9OOyAgICAgICAgLyogbWFqb3IgKGhpZ2ggYnl0ZSksIG1pbm9yIChsb3cgYnl0ZSkgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIFVJTlQgICAgd1R5cGU7ICAgICAgICAgICAgICAvKiBpbmRpY2F0ZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSB1bmlvbiAqLworICAgIFVJTlQxNiAgICB3VHlwZTsgICAgICAgICAgICAgIC8qIGluZGljYXRlcyB0aGUgY29udGVudHMgb2YgdGhlIHVuaW9uICovCiAgICAgdW5pb24gewogICAgICAgICBEV09SRCBtczsgICAgICAgICAgICAgICAvKiBtaWxsaXNlY29uZHMgKi8KICAgICAgICAgRFdPUkQgc2FtcGxlOyAgICAgICAgICAgLyogc2FtcGxlcyAqLwpAQCAtMTA4LDcgKzEwOCw3IEBACiAjZGVmaW5lIENBTExCQUNLX1RBU0sgICAgICAgMHgwMDAyMDAwMGwgICAgLyogZHdDYWxsYmFjayBpcyBhIEhUQVNLICovCiAjZGVmaW5lIENBTExCQUNLX0ZVTkNUSU9OICAgMHgwMDAzMDAwMGwgICAgLyogZHdDYWxsYmFjayBpcyBhIEZBUlBST0MgKi8KIAotdHlwZWRlZiB2b2lkICgqTFBEUlZDQUxMQkFDSykgKEhEUlZSMTYgaCwgVUlOVCB1TWVzc2FnZSwgRFdPUkQgZHdVc2VyLCBEV09SRCBkdzEsIERXT1JEIGR3Mik7Cit0eXBlZGVmIHZvaWQgKCpMUERSVkNBTExCQUNLKSAoSERSVlIxNiBoLCBVSU5UMTYgdU1lc3NhZ2UsIERXT1JEIGR3VXNlciwgRFdPUkQgZHcxLCBEV09SRCBkdzIpOwogCiAjZGVmaW5lIE1NX01JQ1JPU09GVCAgICAgICAgICAgIDEgICAgICAgLyogTWljcm9zb2Z0IENvcnAuICovCiAKQEAgLTEzMiw3ICsxMzIsNyBAQAogV09SRCBtbXN5c3RlbUdldFZlcnNpb24odm9pZCk7CiB2b2lkIE91dHB1dERlYnVnU3RyKExQQ1NUUik7CiAKLUJPT0wgc25kUGxheVNvdW5kKExQQ1NUUiBscHN6U291bmROYW1lLCBVSU5UIHVGbGFncyk7CitCT09MMTYgc25kUGxheVNvdW5kKExQQ1NUUiBscHN6U291bmROYW1lLCBVSU5UMTYgdUZsYWdzKTsKIAogI2RlZmluZSBTTkRfU1lOQyAgICAgICAgICAgIDB4MDAwMCAgLyogcGxheSBzeW5jaHJvbm91c2x5IChkZWZhdWx0KSAqLwogI2RlZmluZSBTTkRfQVNZTkMgICAgICAgICAgIDB4MDAwMSAgLyogcGxheSBhc3luY2hyb25vdXNseSAqLwpAQCAtMTgyLDEyICsxODIsMTIgQEAKICNkZWZpbmUgV0hEUl9JTlFVRVVFICAgIDB4MDAwMDAwMTAgIC8qIHJlc2VydmVkIGZvciBkcml2ZXIgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIFVJTlQgICAgd01pZDsgICAgICAgICAgICAgICAgICAvKiBtYW51ZmFjdHVyZXIgSUQgKi8KLSAgICBVSU5UICAgIHdQaWQ7ICAgICAgICAgICAgICAgICAgLyogcHJvZHVjdCBJRCAqLworICAgIFVJTlQxNiAgICB3TWlkOyAgICAgICAgICAgICAgICAgIC8qIG1hbnVmYWN0dXJlciBJRCAqLworICAgIFVJTlQxNiAgICB3UGlkOyAgICAgICAgICAgICAgICAgIC8qIHByb2R1Y3QgSUQgKi8KICAgICBWRVJTSU9OIHZEcml2ZXJWZXJzaW9uOyAgICAgICAgLyogdmVyc2lvbiBvZiB0aGUgZHJpdmVyICovCiAgICAgY2hhciAgICBzelBuYW1lW01BWFBOQU1FTEVOXTsgIC8qIHByb2R1Y3QgbmFtZSAoTlVMTCB0ZXJtaW5hdGVkIHN0cmluZykgKi8KICAgICBEV09SRCAgIGR3Rm9ybWF0czsgICAgICAgICAgICAgLyogZm9ybWF0cyBzdXBwb3J0ZWQgKi8KLSAgICBVSU5UICAgIHdDaGFubmVsczsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHNvdXJjZXMgc3VwcG9ydGVkICovCisgICAgVUlOVDE2ICAgIHdDaGFubmVsczsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHNvdXJjZXMgc3VwcG9ydGVkICovCiAgICAgRFdPUkQgICBkd1N1cHBvcnQ7ICAgICAgICAgICAgIC8qIGZ1bmN0aW9uYWxpdHkgc3VwcG9ydGVkIGJ5IGRyaXZlciAqLwogfSBXQVZFT1VUQ0FQUywgKkxQV0FWRU9VVENBUFM7CiAKQEAgLTE5OCwxMiArMTk4LDEyIEBACiAjZGVmaW5lIFdBVkVDQVBTX1NZTkMgICAgICAgICAgIDB4MDAxMAogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgVUlOVCAgICB3TWlkOyAgICAgICAgICAgICAgICAgICAgLyogbWFudWZhY3R1cmVyIElEICovCi0gICAgVUlOVCAgICB3UGlkOyAgICAgICAgICAgICAgICAgICAgLyogcHJvZHVjdCBJRCAqLworICAgIFVJTlQxNiAgICB3TWlkOyAgICAgICAgICAgICAgICAgICAgLyogbWFudWZhY3R1cmVyIElEICovCisgICAgVUlOVDE2ICAgIHdQaWQ7ICAgICAgICAgICAgICAgICAgICAvKiBwcm9kdWN0IElEICovCiAgICAgVkVSU0lPTiB2RHJpdmVyVmVyc2lvbjsgICAgICAgICAgLyogdmVyc2lvbiBvZiB0aGUgZHJpdmVyICovCiAgICAgY2hhciAgICBzelBuYW1lW01BWFBOQU1FTEVOXTsgICAgLyogcHJvZHVjdCBuYW1lIChOVUxMIHRlcm1pbmF0ZWQgc3RyaW5nKSAqLwogICAgIERXT1JEICAgZHdGb3JtYXRzOyAgICAgICAgICAgICAgIC8qIGZvcm1hdHMgc3VwcG9ydGVkICovCi0gICAgVUlOVCAgICB3Q2hhbm5lbHM7ICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNoYW5uZWxzIHN1cHBvcnRlZCAqLworICAgIFVJTlQxNiAgICB3Q2hhbm5lbHM7ICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNoYW5uZWxzIHN1cHBvcnRlZCAqLwogfSBXQVZFSU5DQVBTLCAqTFBXQVZFSU5DQVBTOwogCiAjZGVmaW5lIFdBVkVfSU5WQUxJREZPUk1BVCAgICAgMHgwMDAwMDAwMCAgICAgICAvKiBpbnZhbGlkIGZvcm1hdCAqLwpAQCAtMjM2LDU3ICsyMzYsNTcgQEAKICAgICBXT1JEICAgICAgICB3Qml0c1BlclNhbXBsZTsKIH0gUENNV0FWRUZPUk1BVCwgKkxQUENNV0FWRUZPUk1BVDsKIAotVUlOVCB3YXZlT3V0R2V0TnVtRGV2cyh2b2lkKTsKLVVJTlQgd2F2ZU91dEdldERldkNhcHMoVUlOVCB1RGV2aWNlSUQsIFdBVkVPVVRDQVBTICogbHBDYXBzLAotICAgIFVJTlQgdVNpemUpOwotVUlOVCB3YXZlT3V0R2V0Vm9sdW1lKFVJTlQgdURldmljZUlELCBEV09SRCAqIGxwZHdWb2x1bWUpOwotVUlOVCB3YXZlT3V0U2V0Vm9sdW1lKFVJTlQgdURldmljZUlELCBEV09SRCBkd1ZvbHVtZSk7Ci1VSU5UIHdhdmVPdXRHZXRFcnJvclRleHQoVUlOVCB1RXJyb3IsIExQU1RSIGxwVGV4dCwgVUlOVCB1U2l6ZSk7Ci1VSU5UIHdhdmVHZXRFcnJvclRleHQoVUlOVCB1RXJyb3IsIExQU1RSIGxwVGV4dCwgVUlOVCB1U2l6ZSk7Ci1VSU5UIHdhdmVPdXRPcGVuKEhXQVZFT1VUMTYgKiBscGhXYXZlT3V0LCBVSU5UIHVEZXZpY2VJRCwKK1VJTlQxNiB3YXZlT3V0R2V0TnVtRGV2cyh2b2lkKTsKK1VJTlQxNiB3YXZlT3V0R2V0RGV2Q2FwcyhVSU5UMTYgdURldmljZUlELCBXQVZFT1VUQ0FQUyAqIGxwQ2FwcywKKyAgICBVSU5UMTYgdVNpemUpOworVUlOVDE2IHdhdmVPdXRHZXRWb2x1bWUoVUlOVDE2IHVEZXZpY2VJRCwgRFdPUkQgKiBscGR3Vm9sdW1lKTsKK1VJTlQxNiB3YXZlT3V0U2V0Vm9sdW1lKFVJTlQxNiB1RGV2aWNlSUQsIERXT1JEIGR3Vm9sdW1lKTsKK1VJTlQxNiB3YXZlT3V0R2V0RXJyb3JUZXh0KFVJTlQxNiB1RXJyb3IsIExQU1RSIGxwVGV4dCwgVUlOVDE2IHVTaXplKTsKK1VJTlQxNiB3YXZlR2V0RXJyb3JUZXh0KFVJTlQxNiB1RXJyb3IsIExQU1RSIGxwVGV4dCwgVUlOVDE2IHVTaXplKTsKK1VJTlQxNiB3YXZlT3V0T3BlbihIV0FWRU9VVDE2ICogbHBoV2F2ZU91dCwgVUlOVDE2IHVEZXZpY2VJRCwKICAgICBjb25zdCBMUFdBVkVGT1JNQVQgbHBGb3JtYXQsIERXT1JEIGR3Q2FsbGJhY2ssIERXT1JEIGR3SW5zdGFuY2UsIERXT1JEIGR3RmxhZ3MpOwotVUlOVCB3YXZlT3V0Q2xvc2UoSFdBVkVPVVQxNiBoV2F2ZU91dCk7Ci1VSU5UIHdhdmVPdXRQcmVwYXJlSGVhZGVyKEhXQVZFT1VUMTYgaFdhdmVPdXQsCi0gICAgIFdBVkVIRFIgKiBscFdhdmVPdXRIZHIsIFVJTlQgdVNpemUpOwotVUlOVCB3YXZlT3V0VW5wcmVwYXJlSGVhZGVyKEhXQVZFT1VUMTYgaFdhdmVPdXQsCi0gICAgV0FWRUhEUiAqIGxwV2F2ZU91dEhkciwgVUlOVCB1U2l6ZSk7Ci1VSU5UIHdhdmVPdXRXcml0ZShIV0FWRU9VVDE2IGhXYXZlT3V0LCBXQVZFSERSICogbHBXYXZlT3V0SGRyLAotICAgIFVJTlQgdVNpemUpOwotVUlOVCB3YXZlT3V0UGF1c2UoSFdBVkVPVVQxNiBoV2F2ZU91dCk7Ci1VSU5UIHdhdmVPdXRSZXN0YXJ0KEhXQVZFT1VUMTYgaFdhdmVPdXQpOwotVUlOVCB3YXZlT3V0UmVzZXQoSFdBVkVPVVQxNiBoV2F2ZU91dCk7Ci1VSU5UIHdhdmVPdXRCcmVha0xvb3AoSFdBVkVPVVQxNiBoV2F2ZU91dCk7Ci1VSU5UIHdhdmVPdXRHZXRQb3NpdGlvbihIV0FWRU9VVDE2IGhXYXZlT3V0LCBNTVRJTUUgKiBscEluZm8sCi0gICAgVUlOVCB1U2l6ZSk7Ci1VSU5UIHdhdmVPdXRHZXRQaXRjaChIV0FWRU9VVDE2IGhXYXZlT3V0LCBEV09SRCAqIGxwZHdQaXRjaCk7Ci1VSU5UIHdhdmVPdXRTZXRQaXRjaChIV0FWRU9VVDE2IGhXYXZlT3V0LCBEV09SRCBkd1BpdGNoKTsKLVVJTlQgd2F2ZU91dEdldFBsYXliYWNrUmF0ZShIV0FWRU9VVDE2IGhXYXZlT3V0LCBEV09SRCAqIGxwZHdSYXRlKTsKLVVJTlQgd2F2ZU91dFNldFBsYXliYWNrUmF0ZShIV0FWRU9VVDE2IGhXYXZlT3V0LCBEV09SRCBkd1JhdGUpOwotVUlOVCB3YXZlT3V0R2V0SUQoSFdBVkVPVVQxNiBoV2F2ZU91dCwgVUlOVCAqIGxwdURldmljZUlEKTsKK1VJTlQxNiB3YXZlT3V0Q2xvc2UoSFdBVkVPVVQxNiBoV2F2ZU91dCk7CitVSU5UMTYgd2F2ZU91dFByZXBhcmVIZWFkZXIoSFdBVkVPVVQxNiBoV2F2ZU91dCwKKyAgICAgV0FWRUhEUiAqIGxwV2F2ZU91dEhkciwgVUlOVDE2IHVTaXplKTsKK1VJTlQxNiB3YXZlT3V0VW5wcmVwYXJlSGVhZGVyKEhXQVZFT1VUMTYgaFdhdmVPdXQsCisgICAgV0FWRUhEUiAqIGxwV2F2ZU91dEhkciwgVUlOVDE2IHVTaXplKTsKK1VJTlQxNiB3YXZlT3V0V3JpdGUoSFdBVkVPVVQxNiBoV2F2ZU91dCwgV0FWRUhEUiAqIGxwV2F2ZU91dEhkciwKKyAgICBVSU5UMTYgdVNpemUpOworVUlOVDE2IHdhdmVPdXRQYXVzZShIV0FWRU9VVDE2IGhXYXZlT3V0KTsKK1VJTlQxNiB3YXZlT3V0UmVzdGFydChIV0FWRU9VVDE2IGhXYXZlT3V0KTsKK1VJTlQxNiB3YXZlT3V0UmVzZXQoSFdBVkVPVVQxNiBoV2F2ZU91dCk7CitVSU5UMTYgd2F2ZU91dEJyZWFrTG9vcChIV0FWRU9VVDE2IGhXYXZlT3V0KTsKK1VJTlQxNiB3YXZlT3V0R2V0UG9zaXRpb24oSFdBVkVPVVQxNiBoV2F2ZU91dCwgTU1USU1FICogbHBJbmZvLAorICAgIFVJTlQxNiB1U2l6ZSk7CitVSU5UMTYgd2F2ZU91dEdldFBpdGNoKEhXQVZFT1VUMTYgaFdhdmVPdXQsIERXT1JEICogbHBkd1BpdGNoKTsKK1VJTlQxNiB3YXZlT3V0U2V0UGl0Y2goSFdBVkVPVVQxNiBoV2F2ZU91dCwgRFdPUkQgZHdQaXRjaCk7CitVSU5UMTYgd2F2ZU91dEdldFBsYXliYWNrUmF0ZShIV0FWRU9VVDE2IGhXYXZlT3V0LCBEV09SRCAqIGxwZHdSYXRlKTsKK1VJTlQxNiB3YXZlT3V0U2V0UGxheWJhY2tSYXRlKEhXQVZFT1VUMTYgaFdhdmVPdXQsIERXT1JEIGR3UmF0ZSk7CitVSU5UMTYgd2F2ZU91dEdldElEKEhXQVZFT1VUMTYgaFdhdmVPdXQsIFVJTlQxNiAqIGxwdURldmljZUlEKTsKIAotRFdPUkQgd2F2ZU91dE1lc3NhZ2UoSFdBVkVPVVQxNiBoV2F2ZU91dCwgVUlOVCB1TWVzc2FnZSwgRFdPUkQgZHcxLCBEV09SRCBkdzIpOworRFdPUkQgd2F2ZU91dE1lc3NhZ2UoSFdBVkVPVVQxNiBoV2F2ZU91dCwgVUlOVDE2IHVNZXNzYWdlLCBEV09SRCBkdzEsIERXT1JEIGR3Mik7CiAKLVVJTlQgd2F2ZUluR2V0TnVtRGV2cyh2b2lkKTsKLVVJTlQgd2F2ZUluR2V0RGV2Q2FwcyhVSU5UIHVEZXZpY2VJRCwgV0FWRUlOQ0FQUyAqIGxwQ2FwcywKLSAgICBVSU5UIHVTaXplKTsKLVVJTlQgd2F2ZUluR2V0RXJyb3JUZXh0KFVJTlQgdUVycm9yLCBMUFNUUiBscFRleHQsIFVJTlQgdVNpemUpOwotVUlOVCB3YXZlSW5PcGVuKEhXQVZFSU4xNiAqIGxwaFdhdmVJbiwgVUlOVCB1RGV2aWNlSUQsCitVSU5UMTYgd2F2ZUluR2V0TnVtRGV2cyh2b2lkKTsKK1VJTlQxNiB3YXZlSW5HZXREZXZDYXBzKFVJTlQxNiB1RGV2aWNlSUQsIFdBVkVJTkNBUFMgKiBscENhcHMsCisgICAgVUlOVDE2IHVTaXplKTsKK1VJTlQxNiB3YXZlSW5HZXRFcnJvclRleHQoVUlOVDE2IHVFcnJvciwgTFBTVFIgbHBUZXh0LCBVSU5UMTYgdVNpemUpOworVUlOVDE2IHdhdmVJbk9wZW4oSFdBVkVJTjE2ICogbHBoV2F2ZUluLCBVSU5UMTYgdURldmljZUlELAogICAgIGNvbnN0IExQV0FWRUZPUk1BVCBscEZvcm1hdCwgRFdPUkQgZHdDYWxsYmFjaywgRFdPUkQgZHdJbnN0YW5jZSwgRFdPUkQgZHdGbGFncyk7Ci1VSU5UIHdhdmVJbkNsb3NlKEhXQVZFSU4xNiBoV2F2ZUluKTsKLVVJTlQgd2F2ZUluUHJlcGFyZUhlYWRlcihIV0FWRUlOMTYgaFdhdmVJbiwKLSAgICBXQVZFSERSICogbHBXYXZlSW5IZHIsIFVJTlQgdVNpemUpOwotVUlOVCB3YXZlSW5VbnByZXBhcmVIZWFkZXIoSFdBVkVJTjE2IGhXYXZlSW4sCi0gICAgV0FWRUhEUiAqIGxwV2F2ZUluSGRyLCBVSU5UIHVTaXplKTsKLVVJTlQgd2F2ZUluQWRkQnVmZmVyKEhXQVZFSU4xNiBoV2F2ZUluLAotICAgIFdBVkVIRFIgKiBscFdhdmVJbkhkciwgVUlOVCB1U2l6ZSk7Ci1VSU5UIHdhdmVJblN0YXJ0KEhXQVZFSU4xNiBoV2F2ZUluKTsKLVVJTlQgd2F2ZUluU3RvcChIV0FWRUlOMTYgaFdhdmVJbik7Ci1VSU5UIHdhdmVJblJlc2V0KEhXQVZFSU4xNiBoV2F2ZUluKTsKLVVJTlQgd2F2ZUluR2V0UG9zaXRpb24oSFdBVkVJTjE2IGhXYXZlSW4sIE1NVElNRSAqIGxwSW5mbywKLSAgICBVSU5UIHVTaXplKTsKLVVJTlQgd2F2ZUluR2V0SUQoSFdBVkVJTjE2IGhXYXZlSW4sIFVJTlQgKiBscHVEZXZpY2VJRCk7CitVSU5UMTYgd2F2ZUluQ2xvc2UoSFdBVkVJTjE2IGhXYXZlSW4pOworVUlOVDE2IHdhdmVJblByZXBhcmVIZWFkZXIoSFdBVkVJTjE2IGhXYXZlSW4sCisgICAgV0FWRUhEUiAqIGxwV2F2ZUluSGRyLCBVSU5UMTYgdVNpemUpOworVUlOVDE2IHdhdmVJblVucHJlcGFyZUhlYWRlcihIV0FWRUlOMTYgaFdhdmVJbiwKKyAgICBXQVZFSERSICogbHBXYXZlSW5IZHIsIFVJTlQxNiB1U2l6ZSk7CitVSU5UMTYgd2F2ZUluQWRkQnVmZmVyKEhXQVZFSU4xNiBoV2F2ZUluLAorICAgIFdBVkVIRFIgKiBscFdhdmVJbkhkciwgVUlOVDE2IHVTaXplKTsKK1VJTlQxNiB3YXZlSW5TdGFydChIV0FWRUlOMTYgaFdhdmVJbik7CitVSU5UMTYgd2F2ZUluU3RvcChIV0FWRUlOMTYgaFdhdmVJbik7CitVSU5UMTYgd2F2ZUluUmVzZXQoSFdBVkVJTjE2IGhXYXZlSW4pOworVUlOVDE2IHdhdmVJbkdldFBvc2l0aW9uKEhXQVZFSU4xNiBoV2F2ZUluLCBNTVRJTUUgKiBscEluZm8sCisgICAgVUlOVDE2IHVTaXplKTsKK1VJTlQxNiB3YXZlSW5HZXRJRChIV0FWRUlOMTYgaFdhdmVJbiwgVUlOVDE2ICogbHB1RGV2aWNlSUQpOwogCi1EV09SRCB3YXZlSW5NZXNzYWdlKEhXQVZFSU4xNiBoV2F2ZUluLCBVSU5UIHVNZXNzYWdlLCBEV09SRCBkdzEsIERXT1JEIGR3Mik7CitEV09SRCB3YXZlSW5NZXNzYWdlKEhXQVZFSU4xNiBoV2F2ZUluLCBVSU5UMTYgdU1lc3NhZ2UsIERXT1JEIGR3MSwgRFdPUkQgZHcyKTsKIAogI2RlZmluZSBNSURJRVJSX1VOUFJFUEFSRUQgICAgKE1JRElFUlJfQkFTRSArIDApICAgLyogaGVhZGVyIG5vdCBwcmVwYXJlZCAqLwogI2RlZmluZSBNSURJRVJSX1NUSUxMUExBWUlORyAgKE1JRElFUlJfQkFTRSArIDEpICAgLyogc3RpbGwgc29tZXRoaW5nIHBsYXlpbmcgKi8KQEAgLTMyNywxNCArMzI3LDE0IEBACiAjZGVmaW5lIE1JRElfVU5DQUNIRSAgICAgICAgNAogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgVUlOVCAgICB3TWlkOyAgICAgICAgICAgICAgICAgIC8qIG1hbnVmYWN0dXJlciBJRCAqLwotICAgIFVJTlQgICAgd1BpZDsgICAgICAgICAgICAgICAgICAvKiBwcm9kdWN0IElEICovCisgICAgVUlOVDE2ICAgIHdNaWQ7ICAgICAgICAgICAgICAgICAgLyogbWFudWZhY3R1cmVyIElEICovCisgICAgVUlOVDE2ICAgIHdQaWQ7ICAgICAgICAgICAgICAgICAgLyogcHJvZHVjdCBJRCAqLwogICAgIFZFUlNJT04gdkRyaXZlclZlcnNpb247ICAgICAgICAvKiB2ZXJzaW9uIG9mIHRoZSBkcml2ZXIgKi8KICAgICBjaGFyICAgIHN6UG5hbWVbTUFYUE5BTUVMRU5dOyAgLyogcHJvZHVjdCBuYW1lIChOVUxMIHRlcm1pbmF0ZWQgc3RyaW5nKSAqLwotICAgIFVJTlQgICAgd1RlY2hub2xvZ3k7ICAgICAgICAgICAvKiB0eXBlIG9mIGRldmljZSAqLwotICAgIFVJTlQgICAgd1ZvaWNlczsgICAgICAgICAgICAgICAvKiAjIG9mIHZvaWNlcyAoaW50ZXJuYWwgc3ludGggb25seSkgKi8KLSAgICBVSU5UICAgIHdOb3RlczsgICAgICAgICAgICAgICAgLyogbWF4ICMgb2Ygbm90ZXMgKGludGVybmFsIHN5bnRoIG9ubHkpICovCi0gICAgVUlOVCAgICB3Q2hhbm5lbE1hc2s7ICAgICAgICAgIC8qIGNoYW5uZWxzIHVzZWQgKGludGVybmFsIHN5bnRoIG9ubHkpICovCisgICAgVUlOVDE2ICAgIHdUZWNobm9sb2d5OyAgICAgICAgICAgLyogdHlwZSBvZiBkZXZpY2UgKi8KKyAgICBVSU5UMTYgICAgd1ZvaWNlczsgICAgICAgICAgICAgICAvKiAjIG9mIHZvaWNlcyAoaW50ZXJuYWwgc3ludGggb25seSkgKi8KKyAgICBVSU5UMTYgICAgd05vdGVzOyAgICAgICAgICAgICAgICAvKiBtYXggIyBvZiBub3RlcyAoaW50ZXJuYWwgc3ludGggb25seSkgKi8KKyAgICBVSU5UMTYgICAgd0NoYW5uZWxNYXNrOyAgICAgICAgICAvKiBjaGFubmVscyB1c2VkIChpbnRlcm5hbCBzeW50aCBvbmx5KSAqLwogICAgIERXT1JEICAgZHdTdXBwb3J0OyAgICAgICAgICAgICAvKiBmdW5jdGlvbmFsaXR5IHN1cHBvcnRlZCBieSBkcml2ZXIgKi8KIH0gTUlESU9VVENBUFMsICpMUE1JRElPVVRDQVBTOwogCkBAIC0zNDksOCArMzQ5LDggQEAKICNkZWZpbmUgTUlESUNBUFNfQ0FDSEUgICAgICAgICAgIDB4MDAwNAogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgVUlOVCAgICB3TWlkOyAgICAgICAgICAgICAgICAgIC8qIG1hbnVmYWN0dXJlciBJRCAqLwotICAgIFVJTlQgICAgd1BpZDsgICAgICAgICAgICAgICAgICAvKiBwcm9kdWN0IElEICovCisgICAgVUlOVDE2ICAgIHdNaWQ7ICAgICAgICAgICAgICAgICAgLyogbWFudWZhY3R1cmVyIElEICovCisgICAgVUlOVDE2ICAgIHdQaWQ7ICAgICAgICAgICAgICAgICAgLyogcHJvZHVjdCBJRCAqLwogICAgIFZFUlNJT04gdkRyaXZlclZlcnNpb247ICAgICAgICAvKiB2ZXJzaW9uIG9mIHRoZSBkcml2ZXIgKi8KICAgICBjaGFyICAgIHN6UG5hbWVbTUFYUE5BTUVMRU5dOyAgLyogcHJvZHVjdCBuYW1lIChOVUxMIHRlcm1pbmF0ZWQgc3RyaW5nKSAqLwogfSBNSURJSU5DQVBTLCAqTFBNSURJSU5DQVBTOwpAQCAtMzY5LDYwICszNjksNjAgQEAKICNkZWZpbmUgTUhEUl9QUkVQQVJFRCAgIDB4MDAwMDAwMDIgICAgICAgLyogc2V0IGlmIGhlYWRlciBwcmVwYXJlZCAqLwogI2RlZmluZSBNSERSX0lOUVVFVUUgICAgMHgwMDAwMDAwNCAgICAgICAvKiByZXNlcnZlZCBmb3IgZHJpdmVyICovCiAKLVVJTlQgbWlkaU91dEdldE51bURldnModm9pZCk7Ci1VSU5UIG1pZGlPdXRHZXREZXZDYXBzKFVJTlQgdURldmljZUlELAotICAgIE1JRElPVVRDQVBTICogbHBDYXBzLCBVSU5UIHVTaXplKTsKLVVJTlQgbWlkaU91dEdldFZvbHVtZShVSU5UIHVEZXZpY2VJRCwgRFdPUkQgKiBscGR3Vm9sdW1lKTsKLVVJTlQgbWlkaU91dFNldFZvbHVtZShVSU5UIHVEZXZpY2VJRCwgRFdPUkQgZHdWb2x1bWUpOwotVUlOVCBtaWRpT3V0R2V0RXJyb3JUZXh0KFVJTlQgdUVycm9yLCBMUFNUUiBscFRleHQsIFVJTlQgdVNpemUpOwotVUlOVCBtaWRpR2V0RXJyb3JUZXh0KFVJTlQgdUVycm9yLCBMUFNUUiBscFRleHQsIFVJTlQgdVNpemUpOwotVUlOVCBtaWRpT3V0T3BlbihITUlESU9VVDE2ICogbHBoTWlkaU91dCwgVUlOVCB1RGV2aWNlSUQsCitVSU5UMTYgbWlkaU91dEdldE51bURldnModm9pZCk7CitVSU5UMTYgbWlkaU91dEdldERldkNhcHMoVUlOVDE2IHVEZXZpY2VJRCwKKyAgICBNSURJT1VUQ0FQUyAqIGxwQ2FwcywgVUlOVDE2IHVTaXplKTsKK1VJTlQxNiBtaWRpT3V0R2V0Vm9sdW1lKFVJTlQxNiB1RGV2aWNlSUQsIERXT1JEICogbHBkd1ZvbHVtZSk7CitVSU5UMTYgbWlkaU91dFNldFZvbHVtZShVSU5UMTYgdURldmljZUlELCBEV09SRCBkd1ZvbHVtZSk7CitVSU5UMTYgbWlkaU91dEdldEVycm9yVGV4dChVSU5UMTYgdUVycm9yLCBMUFNUUiBscFRleHQsIFVJTlQxNiB1U2l6ZSk7CitVSU5UMTYgbWlkaUdldEVycm9yVGV4dChVSU5UMTYgdUVycm9yLCBMUFNUUiBscFRleHQsIFVJTlQxNiB1U2l6ZSk7CitVSU5UMTYgbWlkaU91dE9wZW4oSE1JRElPVVQxNiAqIGxwaE1pZGlPdXQsIFVJTlQxNiB1RGV2aWNlSUQsCiAgICAgRFdPUkQgZHdDYWxsYmFjaywgRFdPUkQgZHdJbnN0YW5jZSwgRFdPUkQgZHdGbGFncyk7Ci1VSU5UIG1pZGlPdXRDbG9zZShITUlESU9VVDE2IGhNaWRpT3V0KTsKLVVJTlQgbWlkaU91dFByZXBhcmVIZWFkZXIoSE1JRElPVVQxNiBoTWlkaU91dCwKLSAgICBNSURJSERSICogbHBNaWRpT3V0SGRyLCBVSU5UIHVTaXplKTsKLVVJTlQgbWlkaU91dFVucHJlcGFyZUhlYWRlcihITUlESU9VVDE2IGhNaWRpT3V0LAotICAgIE1JRElIRFIgKiBscE1pZGlPdXRIZHIsIFVJTlQgdVNpemUpOwotVUlOVCBtaWRpT3V0U2hvcnRNc2coSE1JRElPVVQxNiBoTWlkaU91dCwgRFdPUkQgZHdNc2cpOwotVUlOVCBtaWRpT3V0TG9uZ01zZyhITUlESU9VVDE2IGhNaWRpT3V0LAotICAgIE1JRElIRFIgKiBscE1pZGlPdXRIZHIsIFVJTlQgdVNpemUpOwotVUlOVCBtaWRpT3V0UmVzZXQoSE1JRElPVVQxNiBoTWlkaU91dCk7Ci1VSU5UIG1pZGlPdXRDYWNoZVBhdGNoZXMoSE1JRElPVVQxNiBoTWlkaU91dCwKLSAgICBVSU5UIHVCYW5rLCBXT1JEICogbHB3UGF0Y2hBcnJheSwgVUlOVCB1RmxhZ3MpOwotVUlOVCBtaWRpT3V0Q2FjaGVEcnVtUGF0Y2hlcyhITUlESU9VVDE2IGhNaWRpT3V0LAotICAgIFVJTlQgdVBhdGNoLCBXT1JEICogbHB3S2V5QXJyYXksIFVJTlQgdUZsYWdzKTsKLVVJTlQgbWlkaU91dEdldElEKEhNSURJT1VUMTYgaE1pZGlPdXQsIFVJTlQgKiBscHVEZXZpY2VJRCk7CitVSU5UMTYgbWlkaU91dENsb3NlKEhNSURJT1VUMTYgaE1pZGlPdXQpOworVUlOVDE2IG1pZGlPdXRQcmVwYXJlSGVhZGVyKEhNSURJT1VUMTYgaE1pZGlPdXQsCisgICAgTUlESUhEUiAqIGxwTWlkaU91dEhkciwgVUlOVDE2IHVTaXplKTsKK1VJTlQxNiBtaWRpT3V0VW5wcmVwYXJlSGVhZGVyKEhNSURJT1VUMTYgaE1pZGlPdXQsCisgICAgTUlESUhEUiAqIGxwTWlkaU91dEhkciwgVUlOVDE2IHVTaXplKTsKK1VJTlQxNiBtaWRpT3V0U2hvcnRNc2coSE1JRElPVVQxNiBoTWlkaU91dCwgRFdPUkQgZHdNc2cpOworVUlOVDE2IG1pZGlPdXRMb25nTXNnKEhNSURJT1VUMTYgaE1pZGlPdXQsCisgICAgTUlESUhEUiAqIGxwTWlkaU91dEhkciwgVUlOVDE2IHVTaXplKTsKK1VJTlQxNiBtaWRpT3V0UmVzZXQoSE1JRElPVVQxNiBoTWlkaU91dCk7CitVSU5UMTYgbWlkaU91dENhY2hlUGF0Y2hlcyhITUlESU9VVDE2IGhNaWRpT3V0LAorICAgIFVJTlQxNiB1QmFuaywgV09SRCAqIGxwd1BhdGNoQXJyYXksIFVJTlQxNiB1RmxhZ3MpOworVUlOVDE2IG1pZGlPdXRDYWNoZURydW1QYXRjaGVzKEhNSURJT1VUMTYgaE1pZGlPdXQsCisgICAgVUlOVDE2IHVQYXRjaCwgV09SRCAqIGxwd0tleUFycmF5LCBVSU5UMTYgdUZsYWdzKTsKK1VJTlQxNiBtaWRpT3V0R2V0SUQoSE1JRElPVVQxNiBoTWlkaU91dCwgVUlOVDE2ICogbHB1RGV2aWNlSUQpOwogCi1EV09SRCBtaWRpT3V0TWVzc2FnZShITUlESU9VVDE2IGhNaWRpT3V0LCBVSU5UIHVNZXNzYWdlLCBEV09SRCBkdzEsIERXT1JEIGR3Mik7CitEV09SRCBtaWRpT3V0TWVzc2FnZShITUlESU9VVDE2IGhNaWRpT3V0LCBVSU5UMTYgdU1lc3NhZ2UsIERXT1JEIGR3MSwgRFdPUkQgZHcyKTsKIAotVUlOVCBtaWRpSW5HZXROdW1EZXZzKHZvaWQpOwotVUlOVCBtaWRpSW5HZXREZXZDYXBzKFVJTlQgdURldmljZUlELAotICAgIExQTUlESUlOQ0FQUyBscENhcHMsIFVJTlQgdVNpemUpOwotVUlOVCBtaWRpSW5HZXRFcnJvclRleHQoVUlOVCB1RXJyb3IsIExQU1RSIGxwVGV4dCwgVUlOVCB1U2l6ZSk7Ci1VSU5UIG1pZGlJbk9wZW4oSE1JRElJTjE2ICogbHBoTWlkaUluLCBVSU5UIHVEZXZpY2VJRCwKK1VJTlQxNiBtaWRpSW5HZXROdW1EZXZzKHZvaWQpOworVUlOVDE2IG1pZGlJbkdldERldkNhcHMoVUlOVDE2IHVEZXZpY2VJRCwKKyAgICBMUE1JRElJTkNBUFMgbHBDYXBzLCBVSU5UMTYgdVNpemUpOworVUlOVDE2IG1pZGlJbkdldEVycm9yVGV4dChVSU5UMTYgdUVycm9yLCBMUFNUUiBscFRleHQsIFVJTlQxNiB1U2l6ZSk7CitVSU5UMTYgbWlkaUluT3BlbihITUlESUlOMTYgKiBscGhNaWRpSW4sIFVJTlQxNiB1RGV2aWNlSUQsCiAgICAgRFdPUkQgZHdDYWxsYmFjaywgRFdPUkQgZHdJbnN0YW5jZSwgRFdPUkQgZHdGbGFncyk7Ci1VSU5UIG1pZGlJbkNsb3NlKEhNSURJSU4xNiBoTWlkaUluKTsKLVVJTlQgbWlkaUluUHJlcGFyZUhlYWRlcihITUlESUlOMTYgaE1pZGlJbiwKLSAgICBNSURJSERSICogbHBNaWRpSW5IZHIsIFVJTlQgdVNpemUpOwotVUlOVCBtaWRpSW5VbnByZXBhcmVIZWFkZXIoSE1JRElJTjE2IGhNaWRpSW4sCi0gICAgTUlESUhEUiAqIGxwTWlkaUluSGRyLCBVSU5UIHVTaXplKTsKLVVJTlQgbWlkaUluQWRkQnVmZmVyKEhNSURJSU4xNiBoTWlkaUluLAotICAgIE1JRElIRFIgKiBscE1pZGlJbkhkciwgVUlOVCB1U2l6ZSk7Ci1VSU5UIG1pZGlJblN0YXJ0KEhNSURJSU4xNiBoTWlkaUluKTsKLVVJTlQgbWlkaUluU3RvcChITUlESUlOMTYgaE1pZGlJbik7Ci1VSU5UIG1pZGlJblJlc2V0KEhNSURJSU4xNiBoTWlkaUluKTsKLVVJTlQgbWlkaUluR2V0SUQoSE1JRElJTjE2IGhNaWRpSW4sIFVJTlQgKiBscHVEZXZpY2VJRCk7CitVSU5UMTYgbWlkaUluQ2xvc2UoSE1JRElJTjE2IGhNaWRpSW4pOworVUlOVDE2IG1pZGlJblByZXBhcmVIZWFkZXIoSE1JRElJTjE2IGhNaWRpSW4sCisgICAgTUlESUhEUiAqIGxwTWlkaUluSGRyLCBVSU5UMTYgdVNpemUpOworVUlOVDE2IG1pZGlJblVucHJlcGFyZUhlYWRlcihITUlESUlOMTYgaE1pZGlJbiwKKyAgICBNSURJSERSICogbHBNaWRpSW5IZHIsIFVJTlQxNiB1U2l6ZSk7CitVSU5UMTYgbWlkaUluQWRkQnVmZmVyKEhNSURJSU4xNiBoTWlkaUluLAorICAgIE1JRElIRFIgKiBscE1pZGlJbkhkciwgVUlOVDE2IHVTaXplKTsKK1VJTlQxNiBtaWRpSW5TdGFydChITUlESUlOMTYgaE1pZGlJbik7CitVSU5UMTYgbWlkaUluU3RvcChITUlESUlOMTYgaE1pZGlJbik7CitVSU5UMTYgbWlkaUluUmVzZXQoSE1JRElJTjE2IGhNaWRpSW4pOworVUlOVDE2IG1pZGlJbkdldElEKEhNSURJSU4xNiBoTWlkaUluLCBVSU5UMTYgKiBscHVEZXZpY2VJRCk7CiAKLURXT1JEIG1pZGlJbk1lc3NhZ2UoSE1JRElJTjE2IGhNaWRpSW4sIFVJTlQgdU1lc3NhZ2UsIERXT1JEIGR3MSwgRFdPUkQgZHcyKTsKK0RXT1JEIG1pZGlJbk1lc3NhZ2UoSE1JRElJTjE2IGhNaWRpSW4sIFVJTlQxNiB1TWVzc2FnZSwgRFdPUkQgZHcxLCBEV09SRCBkdzIpOwogCiAjZGVmaW5lIEFVWF9NQVBQRVIgICAgICgtMSkKIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIFVJTlQgICAgd01pZDsgICAgICAgICAgICAgICAgICAvKiBtYW51ZmFjdHVyZXIgSUQgKi8KLSAgICBVSU5UICAgIHdQaWQ7ICAgICAgICAgICAgICAgICAgLyogcHJvZHVjdCBJRCAqLworICAgIFVJTlQxNiAgICB3TWlkOyAgICAgICAgICAgICAgICAgIC8qIG1hbnVmYWN0dXJlciBJRCAqLworICAgIFVJTlQxNiAgICB3UGlkOyAgICAgICAgICAgICAgICAgIC8qIHByb2R1Y3QgSUQgKi8KICAgICBWRVJTSU9OIHZEcml2ZXJWZXJzaW9uOyAgICAgICAgLyogdmVyc2lvbiBvZiB0aGUgZHJpdmVyICovCiAgICAgY2hhciAgICBzelBuYW1lW01BWFBOQU1FTEVOXTsgIC8qIHByb2R1Y3QgbmFtZSAoTlVMTCB0ZXJtaW5hdGVkIHN0cmluZykgKi8KLSAgICBVSU5UICAgIHdUZWNobm9sb2d5OyAgICAgICAgICAgLyogdHlwZSBvZiBkZXZpY2UgKi8KKyAgICBVSU5UMTYgICAgd1RlY2hub2xvZ3k7ICAgICAgICAgICAvKiB0eXBlIG9mIGRldmljZSAqLwogICAgIERXT1JEICAgZHdTdXBwb3J0OyAgICAgICAgICAgICAvKiBmdW5jdGlvbmFsaXR5IHN1cHBvcnRlZCBieSBkcml2ZXIgKi8KIH0gQVVYQ0FQUywgKkxQQVVYQ0FQUzsKIApAQCAtNDMyLDM1ICs0MzIsMzUgQEAKICNkZWZpbmUgQVVYQ0FQU19WT0xVTUUgICAgICAgICAgMHgwMDAxICAvKiBzdXBwb3J0cyB2b2x1bWUgY29udHJvbCAqLwogI2RlZmluZSBBVVhDQVBTX0xSVk9MVU1FICAgICAgICAweDAwMDIgIC8qIHNlcGFyYXRlIGxlZnQtcmlnaHQgdm9sdW1lIGNvbnRyb2wgKi8KIAotVUlOVCBhdXhHZXROdW1EZXZzKHZvaWQpOwotVUlOVCBhdXhHZXREZXZDYXBzKFVJTlQgdURldmljZUlELCBBVVhDQVBTICogbHBDYXBzLCBVSU5UIHVTaXplKTsKLVVJTlQgYXV4U2V0Vm9sdW1lKFVJTlQgdURldmljZUlELCBEV09SRCBkd1ZvbHVtZSk7Ci1VSU5UIGF1eEdldFZvbHVtZShVSU5UIHVEZXZpY2VJRCwgRFdPUkQgKiBscGR3Vm9sdW1lKTsKK1VJTlQxNiBhdXhHZXROdW1EZXZzKHZvaWQpOworVUlOVDE2IGF1eEdldERldkNhcHMoVUlOVDE2IHVEZXZpY2VJRCwgQVVYQ0FQUyAqIGxwQ2FwcywgVUlOVDE2IHVTaXplKTsKK1VJTlQxNiBhdXhTZXRWb2x1bWUoVUlOVDE2IHVEZXZpY2VJRCwgRFdPUkQgZHdWb2x1bWUpOworVUlOVDE2IGF1eEdldFZvbHVtZShVSU5UMTYgdURldmljZUlELCBEV09SRCAqIGxwZHdWb2x1bWUpOwogCi1EV09SRCBhdXhPdXRNZXNzYWdlKFVJTlQgdURldmljZUlELCBVSU5UIHVNZXNzYWdlLCBEV09SRCBkdzEsIERXT1JEIGR3Mik7CitEV09SRCBhdXhPdXRNZXNzYWdlKFVJTlQxNiB1RGV2aWNlSUQsIFVJTlQxNiB1TWVzc2FnZSwgRFdPUkQgZHcxLCBEV09SRCBkdzIpOwogCiAjZGVmaW5lIFRJTUVSUl9OT0VSUk9SICAgICAgICAoMCkgICAgICAgICAgICAgICAgICAvKiBubyBlcnJvciAqLwogI2RlZmluZSBUSU1FUlJfTk9DQU5ETyAgICAgICAgKFRJTUVSUl9CQVNFKzEpICAgICAgLyogcmVxdWVzdCBub3QgY29tcGxldGVkICovCiAjZGVmaW5lIFRJTUVSUl9TVFJVQ1QgICAgICAgICAoVElNRVJSX0JBU0UrMzMpICAgICAvKiB0aW1lIHN0cnVjdCBzaXplICovCiAKLXR5cGVkZWYgdm9pZCAoKkxQVElNRUNBTExCQUNLKSAoVUlOVCB1VGltZXJJRCwgVUlOVCB1TWVzc2FnZSwgRFdPUkQgZHdVc2VyLCBEV09SRCBkdzEsIERXT1JEIGR3Mik7Cit0eXBlZGVmIHZvaWQgKCpMUFRJTUVDQUxMQkFDSykgKFVJTlQxNiB1VGltZXJJRCwgVUlOVDE2IHVNZXNzYWdlLCBEV09SRCBkd1VzZXIsIERXT1JEIGR3MSwgRFdPUkQgZHcyKTsKIAogI2RlZmluZSBUSU1FX09ORVNIT1QgICAgMCAgIC8qIHByb2dyYW0gdGltZXIgZm9yIHNpbmdsZSBldmVudCAqLwogI2RlZmluZSBUSU1FX1BFUklPRElDICAgMSAgIC8qIHByb2dyYW0gZm9yIGNvbnRpbnVvdXMgcGVyaW9kaWMgZXZlbnQgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIFVJTlQgICAgd1BlcmlvZE1pbjsgICAgIC8qIG1pbmltdW0gcGVyaW9kIHN1cHBvcnRlZCAgKi8KLSAgICBVSU5UICAgIHdQZXJpb2RNYXg7ICAgICAvKiBtYXhpbXVtIHBlcmlvZCBzdXBwb3J0ZWQgICovCisgICAgVUlOVDE2ICAgIHdQZXJpb2RNaW47ICAgICAvKiBtaW5pbXVtIHBlcmlvZCBzdXBwb3J0ZWQgICovCisgICAgVUlOVDE2ICAgIHdQZXJpb2RNYXg7ICAgICAvKiBtYXhpbXVtIHBlcmlvZCBzdXBwb3J0ZWQgICovCiB9IFRJTUVDQVBTLCAqTFBUSU1FQ0FQUzsKIAotVUlOVCB0aW1lR2V0U3lzdGVtVGltZShNTVRJTUUgKiBscFRpbWUsIFVJTlQgdVNpemUpOworVUlOVDE2IHRpbWVHZXRTeXN0ZW1UaW1lKE1NVElNRSAqIGxwVGltZSwgVUlOVDE2IHVTaXplKTsKIERXT1JEIHRpbWVHZXRUaW1lKHZvaWQpOwotVUlOVCB0aW1lU2V0RXZlbnQoVUlOVCB1RGVsYXksIFVJTlQgdVJlc29sdXRpb24sCi0gICAgTFBUSU1FQ0FMTEJBQ0sgbHBGdW5jdGlvbiwgRFdPUkQgZHdVc2VyLCBVSU5UIHVGbGFncyk7Ci1VSU5UIHRpbWVLaWxsRXZlbnQoVUlOVCB1VGltZXJJRCk7Ci1VSU5UIHRpbWVHZXREZXZDYXBzKFRJTUVDQVBTICogbHBUaW1lQ2FwcywgVUlOVCB1U2l6ZSk7Ci1VSU5UIHRpbWVCZWdpblBlcmlvZChVSU5UIHVQZXJpb2QpOwotVUlOVCB0aW1lRW5kUGVyaW9kKFVJTlQgdVBlcmlvZCk7CitVSU5UMTYgdGltZVNldEV2ZW50KFVJTlQxNiB1RGVsYXksIFVJTlQxNiB1UmVzb2x1dGlvbiwKKyAgICBMUFRJTUVDQUxMQkFDSyBscEZ1bmN0aW9uLCBEV09SRCBkd1VzZXIsIFVJTlQxNiB1RmxhZ3MpOworVUlOVDE2IHRpbWVLaWxsRXZlbnQoVUlOVDE2IHVUaW1lcklEKTsKK1VJTlQxNiB0aW1lR2V0RGV2Q2FwcyhUSU1FQ0FQUyAqIGxwVGltZUNhcHMsIFVJTlQxNiB1U2l6ZSk7CitVSU5UMTYgdGltZUJlZ2luUGVyaW9kKFVJTlQxNiB1UGVyaW9kKTsKK1VJTlQxNiB0aW1lRW5kUGVyaW9kKFVJTlQxNiB1UGVyaW9kKTsKIAogI2RlZmluZSBKT1lFUlJfTk9FUlJPUiAgICAgICAgKDApICAgICAgICAgICAgICAgICAgLyogbm8gZXJyb3IgKi8KICNkZWZpbmUgSk9ZRVJSX1BBUk1TICAgICAgICAgIChKT1lFUlJfQkFTRSs1KSAgICAgIC8qIGJhZCBwYXJhbWV0ZXJzICovCkBAIC00ODAsMzUgKzQ4MCwzNSBAQAogI2RlZmluZSBKT1lTVElDS0lEMiAgICAgICAgIDEKIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIFVJTlQgd01pZDsgICAgICAgICAgICAgICAgICAvKiBtYW51ZmFjdHVyZXIgSUQgKi8KLSAgICBVSU5UIHdQaWQ7ICAgICAgICAgICAgICAgICAgLyogcHJvZHVjdCBJRCAqLworICAgIFVJTlQxNiB3TWlkOyAgICAgICAgICAgICAgICAgIC8qIG1hbnVmYWN0dXJlciBJRCAqLworICAgIFVJTlQxNiB3UGlkOyAgICAgICAgICAgICAgICAgIC8qIHByb2R1Y3QgSUQgKi8KICAgICBjaGFyIHN6UG5hbWVbTUFYUE5BTUVMRU5dOyAgLyogcHJvZHVjdCBuYW1lIChOVUxMIHRlcm1pbmF0ZWQgc3RyaW5nKSAqLwotICAgIFVJTlQgd1htaW47ICAgICAgICAgICAgICAgICAvKiBtaW5pbXVtIHggcG9zaXRpb24gdmFsdWUgKi8KLSAgICBVSU5UIHdYbWF4OyAgICAgICAgICAgICAgICAgLyogbWF4aW11bSB4IHBvc2l0aW9uIHZhbHVlICovCi0gICAgVUlOVCB3WW1pbjsgICAgICAgICAgICAgICAgIC8qIG1pbmltdW0geSBwb3NpdGlvbiB2YWx1ZSAqLwotICAgIFVJTlQgd1ltYXg7ICAgICAgICAgICAgICAgICAvKiBtYXhpbXVtIHkgcG9zaXRpb24gdmFsdWUgKi8KLSAgICBVSU5UIHdabWluOyAgICAgICAgICAgICAgICAgLyogbWluaW11bSB6IHBvc2l0aW9uIHZhbHVlICovCi0gICAgVUlOVCB3Wm1heDsgICAgICAgICAgICAgICAgIC8qIG1heGltdW0geiBwb3NpdGlvbiB2YWx1ZSAqLwotICAgIFVJTlQgd051bUJ1dHRvbnM7ICAgICAgICAgICAvKiBudW1iZXIgb2YgYnV0dG9ucyAqLwotICAgIFVJTlQgd1BlcmlvZE1pbjsgICAgICAgICAgICAvKiBtaW5pbXVtIG1lc3NhZ2UgcGVyaW9kIHdoZW4gY2FwdHVyZWQgKi8KLSAgICBVSU5UIHdQZXJpb2RNYXg7ICAgICAgICAgICAgLyogbWF4aW11bSBtZXNzYWdlIHBlcmlvZCB3aGVuIGNhcHR1cmVkICovCisgICAgVUlOVDE2IHdYbWluOyAgICAgICAgICAgICAgICAgLyogbWluaW11bSB4IHBvc2l0aW9uIHZhbHVlICovCisgICAgVUlOVDE2IHdYbWF4OyAgICAgICAgICAgICAgICAgLyogbWF4aW11bSB4IHBvc2l0aW9uIHZhbHVlICovCisgICAgVUlOVDE2IHdZbWluOyAgICAgICAgICAgICAgICAgLyogbWluaW11bSB5IHBvc2l0aW9uIHZhbHVlICovCisgICAgVUlOVDE2IHdZbWF4OyAgICAgICAgICAgICAgICAgLyogbWF4aW11bSB5IHBvc2l0aW9uIHZhbHVlICovCisgICAgVUlOVDE2IHdabWluOyAgICAgICAgICAgICAgICAgLyogbWluaW11bSB6IHBvc2l0aW9uIHZhbHVlICovCisgICAgVUlOVDE2IHdabWF4OyAgICAgICAgICAgICAgICAgLyogbWF4aW11bSB6IHBvc2l0aW9uIHZhbHVlICovCisgICAgVUlOVDE2IHdOdW1CdXR0b25zOyAgICAgICAgICAgLyogbnVtYmVyIG9mIGJ1dHRvbnMgKi8KKyAgICBVSU5UMTYgd1BlcmlvZE1pbjsgICAgICAgICAgICAvKiBtaW5pbXVtIG1lc3NhZ2UgcGVyaW9kIHdoZW4gY2FwdHVyZWQgKi8KKyAgICBVSU5UMTYgd1BlcmlvZE1heDsgICAgICAgICAgICAvKiBtYXhpbXVtIG1lc3NhZ2UgcGVyaW9kIHdoZW4gY2FwdHVyZWQgKi8KIH0gSk9ZQ0FQUywgKkxQSk9ZQ0FQUzsKIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIFVJTlQgd1hwb3M7ICAgICAgICAgICAgICAgICAvKiB4IHBvc2l0aW9uICovCi0gICAgVUlOVCB3WXBvczsgICAgICAgICAgICAgICAgIC8qIHkgcG9zaXRpb24gKi8KLSAgICBVSU5UIHdacG9zOyAgICAgICAgICAgICAgICAgLyogeiBwb3NpdGlvbiAqLwotICAgIFVJTlQgd0J1dHRvbnM7ICAgICAgICAgICAgICAvKiBidXR0b24gc3RhdGVzICovCisgICAgVUlOVDE2IHdYcG9zOyAgICAgICAgICAgICAgICAgLyogeCBwb3NpdGlvbiAqLworICAgIFVJTlQxNiB3WXBvczsgICAgICAgICAgICAgICAgIC8qIHkgcG9zaXRpb24gKi8KKyAgICBVSU5UMTYgd1pwb3M7ICAgICAgICAgICAgICAgICAvKiB6IHBvc2l0aW9uICovCisgICAgVUlOVDE2IHdCdXR0b25zOyAgICAgICAgICAgICAgLyogYnV0dG9uIHN0YXRlcyAqLwogfSBKT1lJTkZPLCAqTFBKT1lJTkZPOwogCi1VSU5UIGpveUdldERldkNhcHMoVUlOVCB1Sm95SUQsIEpPWUNBUFMgKiBscENhcHMsIFVJTlQgdVNpemUpOwotVUlOVCBqb3lHZXROdW1EZXZzKHZvaWQpOwotVUlOVCBqb3lHZXRQb3MoVUlOVCB1Sm95SUQsIEpPWUlORk8gKiBscEluZm8pOwotVUlOVCBqb3lHZXRUaHJlc2hvbGQoVUlOVCB1Sm95SUQsIFVJTlQgKiBscHVUaHJlc2hvbGQpOwotVUlOVCBqb3lSZWxlYXNlQ2FwdHVyZShVSU5UIHVKb3lJRCk7Ci1VSU5UIGpveVNldENhcHR1cmUoSFdORDE2IGh3bmQsIFVJTlQgdUpveUlELCBVSU5UIHVQZXJpb2QsCi0gICAgQk9PTCBiQ2hhbmdlZCk7Ci1VSU5UIGpveVNldFRocmVzaG9sZChVSU5UIHVKb3lJRCwgVUlOVCB1VGhyZXNob2xkKTsKK1VJTlQxNiBqb3lHZXREZXZDYXBzKFVJTlQxNiB1Sm95SUQsIEpPWUNBUFMgKiBscENhcHMsIFVJTlQxNiB1U2l6ZSk7CitVSU5UMTYgam95R2V0TnVtRGV2cyh2b2lkKTsKK1VJTlQxNiBqb3lHZXRQb3MoVUlOVDE2IHVKb3lJRCwgSk9ZSU5GTyAqIGxwSW5mbyk7CitVSU5UMTYgam95R2V0VGhyZXNob2xkKFVJTlQxNiB1Sm95SUQsIFVJTlQxNiAqIGxwdVRocmVzaG9sZCk7CitVSU5UMTYgam95UmVsZWFzZUNhcHR1cmUoVUlOVDE2IHVKb3lJRCk7CitVSU5UMTYgam95U2V0Q2FwdHVyZShIV05EMTYgaHduZCwgVUlOVDE2IHVKb3lJRCwgVUlOVDE2IHVQZXJpb2QsCisgICAgQk9PTDE2IGJDaGFuZ2VkKTsKK1VJTlQxNiBqb3lTZXRUaHJlc2hvbGQoVUlOVDE2IHVKb3lJRCwgVUlOVDE2IHVUaHJlc2hvbGQpOwogCiAjZGVmaW5lIE1NSU9FUlJfQkFTRSAgICAgICAgICAgIDI1NgogI2RlZmluZSBNTUlPRVJSX0ZJTEVOT1RGT1VORCAgICAoTU1JT0VSUl9CQVNFICsgMSkgIC8qIGZpbGUgbm90IGZvdW5kICovCkBAIC01MjUsMTQgKzUyNSwxNCBAQAogI2RlZmluZSBDRlNFUENIQVIgICAgICAgJysnICAgICAgICAgICAgIC8qIGNvbXBvdW5kIGZpbGUgbmFtZSBzZXBhcmF0b3IgY2hhci4gKi8KIAogdHlwZWRlZiBEV09SRCAgICAgICAgICAgRk9VUkNDOyAgICAgICAgIC8qIGEgZm91ciBjaGFyYWN0ZXIgY29kZSAqLwotdHlwZWRlZiBMT05HICgqTFBNTUlPUFJPQykoTFBTVFIgbHBtbWlvaW5mbywgVUlOVCB1TWVzc2FnZSwKK3R5cGVkZWYgTE9ORyAoKkxQTU1JT1BST0MpKExQU1RSIGxwbW1pb2luZm8sIFVJTlQxNiB1TWVzc2FnZSwKICAgICAgICAgICAgIExQQVJBTSBsUGFyYW0xLCBMUEFSQU0gbFBhcmFtMik7CiAKIHR5cGVkZWYgc3RydWN0IHsKICAgICAgICAgRFdPUkQgICAgICAgICAgIGR3RmxhZ3M7ICAgICAgICAvKiBnZW5lcmFsIHN0YXR1cyBmbGFncyAqLwogICAgICAgICBGT1VSQ0MgICAgICAgICAgZmNjSU9Qcm9jOyAgICAgIC8qIHBvaW50ZXIgdG8gSS9PIHByb2NlZHVyZSAqLwogICAgICAgICBMUE1NSU9QUk9DICAgICAgcElPUHJvYzsgICAgICAgIC8qIHBvaW50ZXIgdG8gSS9PIHByb2NlZHVyZSAqLwotICAgICAgICBVSU5UICAgICAgICAgICAgd0Vycm9yUmV0OyAgICAgIC8qIHBsYWNlIGZvciBlcnJvciB0byBiZSByZXR1cm5lZCAqLworICAgICAgICBVSU5UMTYgICAgICAgICAgICB3RXJyb3JSZXQ7ICAgICAgLyogcGxhY2UgZm9yIGVycm9yIHRvIGJlIHJldHVybmVkICovCiAgICAgICAgIEhUQVNLMTYgICAgICAgICBodGFzazsgICAgICAgICAgLyogYWx0ZXJuYXRlIGxvY2FsIHRhc2sgKi8KICAgICAgICAgLyogZmllbGRzIG1haW50YWluZWQgYnkgTU1JTyBmdW5jdGlvbnMgZHVyaW5nIGJ1ZmZlcmVkIEkvTyAqLwogICAgICAgICBMT05HICAgICAgICAgICAgY2NoQnVmZmVyOyAgICAgIC8qIHNpemUgb2YgSS9PIGJ1ZmZlciAob3IgMEwpICovCkBAIC02MjEsNDggKzYyMSw0OCBAQAogICAgICAgICAgICAgICAgICggKERXT1JEKShCWVRFKShjaDApIHwgKCAoRFdPUkQpKEJZVEUpKGNoMSkgPDwgOCApIHwgICAgXAogICAgICAgICAgICAgICAgICggKERXT1JEKShCWVRFKShjaDIpIDw8IDE2ICkgfCAoIChEV09SRCkoQllURSkoY2gzKSA8PCAyNCApICkKIAotRk9VUkNDIG1taW9TdHJpbmdUb0ZPVVJDQyhMUENTVFIgc3osIFVJTlQgdUZsYWdzKTsKK0ZPVVJDQyBtbWlvU3RyaW5nVG9GT1VSQ0MoTFBDU1RSIHN6LCBVSU5UMTYgdUZsYWdzKTsKIExQTU1JT1BST0MgbW1pb0luc3RhbGxJT1Byb2MoRk9VUkNDIGZjY0lPUHJvYywgTFBNTUlPUFJPQyBwSU9Qcm9jLAogICAgIERXT1JEIGR3RmxhZ3MpOwogSE1NSU8xNiBtbWlvT3BlbihMUFNUUiBzekZpbGVOYW1lLCBNTUlPSU5GTyAqIGxwbW1pb2luZm8sCiAgICAgRFdPUkQgZHdPcGVuRmxhZ3MpOwogCi1VSU5UIG1taW9SZW5hbWUoTFBDU1RSIHN6RmlsZU5hbWUsIExQQ1NUUiBzek5ld0ZpbGVOYW1lLAorVUlOVDE2IG1taW9SZW5hbWUoTFBDU1RSIHN6RmlsZU5hbWUsIExQQ1NUUiBzek5ld0ZpbGVOYW1lLAogICAgICBNTUlPSU5GTyAqIGxwbW1pb2luZm8sIERXT1JEIGR3UmVuYW1lRmxhZ3MpOwogCi1VSU5UIG1taW9DbG9zZShITU1JTzE2IGhtbWlvLCBVSU5UIHVGbGFncyk7CitVSU5UMTYgbW1pb0Nsb3NlKEhNTUlPMTYgaG1taW8sIFVJTlQxNiB1RmxhZ3MpOwogTE9ORyBtbWlvUmVhZChITU1JTzE2IGhtbWlvLCBIUFNUUiBwY2gsIExPTkcgY2NoKTsKIExPTkcgbW1pb1dyaXRlKEhNTUlPMTYgaG1taW8sIEhQQ1NUUiBwY2gsIExPTkcgY2NoKTsKIExPTkcgbW1pb1NlZWsoSE1NSU8xNiBobW1pbywgTE9ORyBsT2Zmc2V0LCBpbnQgaU9yaWdpbik7Ci1VSU5UIG1taW9HZXRJbmZvKEhNTUlPMTYgaG1taW8sIE1NSU9JTkZPICogbHBtbWlvaW5mbywgVUlOVCB1RmxhZ3MpOwotVUlOVCBtbWlvU2V0SW5mbyhITU1JTzE2IGhtbWlvLCBjb25zdCBNTUlPSU5GTyAqIGxwbW1pb2luZm8sIFVJTlQgdUZsYWdzKTsKLVVJTlQgbW1pb1NldEJ1ZmZlcihITU1JTzE2IGhtbWlvLCBMUFNUUiBwY2hCdWZmZXIsIExPTkcgY2NoQnVmZmVyLAotICAgIFVJTlQgdUZsYWdzKTsKLVVJTlQgbW1pb0ZsdXNoKEhNTUlPMTYgaG1taW8sIFVJTlQgdUZsYWdzKTsKLVVJTlQgbW1pb0FkdmFuY2UoSE1NSU8xNiBobW1pbywgTU1JT0lORk8gKiBscG1taW9pbmZvLCBVSU5UIHVGbGFncyk7Ci1MT05HIG1taW9TZW5kTWVzc2FnZShITU1JTzE2IGhtbWlvLCBVSU5UIHVNZXNzYWdlLAorVUlOVDE2IG1taW9HZXRJbmZvKEhNTUlPMTYgaG1taW8sIE1NSU9JTkZPICogbHBtbWlvaW5mbywgVUlOVDE2IHVGbGFncyk7CitVSU5UMTYgbW1pb1NldEluZm8oSE1NSU8xNiBobW1pbywgY29uc3QgTU1JT0lORk8gKiBscG1taW9pbmZvLCBVSU5UMTYgdUZsYWdzKTsKK1VJTlQxNiBtbWlvU2V0QnVmZmVyKEhNTUlPMTYgaG1taW8sIExQU1RSIHBjaEJ1ZmZlciwgTE9ORyBjY2hCdWZmZXIsCisgICAgVUlOVDE2IHVGbGFncyk7CitVSU5UMTYgbW1pb0ZsdXNoKEhNTUlPMTYgaG1taW8sIFVJTlQxNiB1RmxhZ3MpOworVUlOVDE2IG1taW9BZHZhbmNlKEhNTUlPMTYgaG1taW8sIE1NSU9JTkZPICogbHBtbWlvaW5mbywgVUlOVDE2IHVGbGFncyk7CitMT05HIG1taW9TZW5kTWVzc2FnZShITU1JTzE2IGhtbWlvLCBVSU5UMTYgdU1lc3NhZ2UsCiAgICAgTFBBUkFNIGxQYXJhbTEsIExQQVJBTSBsUGFyYW0yKTsKLVVJTlQgbW1pb0Rlc2NlbmQoSE1NSU8xNiBobW1pbywgTU1DS0lORk8gKiBscGNrLAotICAgIGNvbnN0IE1NQ0tJTkZPICogbHBja1BhcmVudCwgVUlOVCB1RmxhZ3MpOwotVUlOVCBtbWlvQXNjZW5kKEhNTUlPMTYgaG1taW8sIE1NQ0tJTkZPICogbHBjaywgVUlOVCB1RmxhZ3MpOwotVUlOVCBtbWlvQ3JlYXRlQ2h1bmsoSE1NSU8xNiBobW1pbywgTU1DS0lORk8gKiBscGNrLCBVSU5UIHVGbGFncyk7CitVSU5UMTYgbW1pb0Rlc2NlbmQoSE1NSU8xNiBobW1pbywgTU1DS0lORk8gKiBscGNrLAorICAgIGNvbnN0IE1NQ0tJTkZPICogbHBja1BhcmVudCwgVUlOVDE2IHVGbGFncyk7CitVSU5UMTYgbW1pb0FzY2VuZChITU1JTzE2IGhtbWlvLCBNTUNLSU5GTyAqIGxwY2ssIFVJTlQxNiB1RmxhZ3MpOworVUlOVDE2IG1taW9DcmVhdGVDaHVuayhITU1JTzE2IGhtbWlvLCBNTUNLSU5GTyAqIGxwY2ssIFVJTlQxNiB1RmxhZ3MpOwogCi10eXBlZGVmIFVJTlQgKCpZSUVMRFBST0MpIChVSU5UIHVEZXZpY2VJRCwgRFdPUkQgZHdZaWVsZERhdGEpOwordHlwZWRlZiBVSU5UMTYgKCpZSUVMRFBST0MpIChVSU5UMTYgdURldmljZUlELCBEV09SRCBkd1lpZWxkRGF0YSk7CiAKLURXT1JEIG1jaVNlbmRDb21tYW5kIChVSU5UIHVEZXZpY2VJRCwgVUlOVCB1TWVzc2FnZSwKK0RXT1JEIG1jaVNlbmRDb21tYW5kIChVSU5UMTYgdURldmljZUlELCBVSU5UMTYgdU1lc3NhZ2UsCiAgICAgRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yKTsKIERXT1JEIG1jaVNlbmRTdHJpbmcgKExQQ1NUUiBscHN0ckNvbW1hbmQsCi0gICAgTFBTVFIgbHBzdHJSZXR1cm5TdHJpbmcsIFVJTlQgdVJldHVybkxlbmd0aCwgSFdORDE2IGh3bmRDYWxsYmFjayk7Ci1VSU5UIG1jaUdldERldmljZUlEIChMUENTVFIgbHBzdHJOYW1lKTsKLVVJTlQgbWNpR2V0RGV2aWNlSURGcm9tRWxlbWVudElEIChEV09SRCBkd0VsZW1lbnRJRCwKKyAgICBMUFNUUiBscHN0clJldHVyblN0cmluZywgVUlOVDE2IHVSZXR1cm5MZW5ndGgsIEhXTkQxNiBod25kQ2FsbGJhY2spOworVUlOVDE2IG1jaUdldERldmljZUlEIChMUENTVFIgbHBzdHJOYW1lKTsKK1VJTlQxNiBtY2lHZXREZXZpY2VJREZyb21FbGVtZW50SUQgKERXT1JEIGR3RWxlbWVudElELAogICAgIExQQ1NUUiBscHN0clR5cGUpOwotQk9PTCBtY2lHZXRFcnJvclN0cmluZyAoRFdPUkQgd0Vycm9yLCBMUFNUUiBscHN0ckJ1ZmZlciwKLSAgICBVSU5UIHVMZW5ndGgpOwotQk9PTCBtY2lTZXRZaWVsZFByb2MgKFVJTlQgdURldmljZUlELCBZSUVMRFBST0MgZnBZaWVsZFByb2MsCitCT09MMTYgbWNpR2V0RXJyb3JTdHJpbmcgKERXT1JEIHdFcnJvciwgTFBTVFIgbHBzdHJCdWZmZXIsCisgICAgVUlOVDE2IHVMZW5ndGgpOworQk9PTDE2IG1jaVNldFlpZWxkUHJvYyAoVUlOVDE2IHVEZXZpY2VJRCwgWUlFTERQUk9DIGZwWWllbGRQcm9jLAogICAgIERXT1JEIGR3WWllbGREYXRhKTsKIAotSFRBU0sxNiBtY2lHZXRDcmVhdG9yVGFzayhVSU5UIHVEZXZpY2VJRCk7Ci1ZSUVMRFBST0MgbWNpR2V0WWllbGRQcm9jIChVSU5UIHVEZXZpY2VJRCwgRFdPUkQgKiBscGR3WWllbGREYXRhKTsKK0hUQVNLMTYgbWNpR2V0Q3JlYXRvclRhc2soVUlOVDE2IHVEZXZpY2VJRCk7CitZSUVMRFBST0MgbWNpR2V0WWllbGRQcm9jIChVSU5UMTYgdURldmljZUlELCBEV09SRCAqIGxwZHdZaWVsZERhdGEpOwogCiAjZGVmaW5lIE1DSUVSUl9JTlZBTElEX0RFVklDRV9JRCAgICAgICAgKE1DSUVSUl9CQVNFICsgMSkKICNkZWZpbmUgTUNJRVJSX1VOUkVDT0dOSVpFRF9LRVlXT1JEICAgICAoTUNJRVJSX0JBU0UgKyAzKQpAQCAtOTI4LDExICs5MjgsMTEgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgewogCURXT1JEICAgZHdDYWxsYmFjazsKLQlVSU5UICAgIHdEZXZpY2VJRDsKLQlVSU5UICAgIHdSZXNlcnZlZDA7Ci0JTFBDU1RSICBscHN0ckRldmljZVR5cGU7Ci0JTFBDU1RSICBscHN0ckVsZW1lbnROYW1lOwotCUxQQ1NUUiAgbHBzdHJBbGlhczsKKwlVSU5UMTYgIHdEZXZpY2VJRDsKKwlVSU5UMTYgIHdSZXNlcnZlZDA7CisJU0VHUFRSICBscHN0ckRldmljZVR5cGU7CisJU0VHUFRSICBscHN0ckVsZW1lbnROYW1lOworCVNFR1BUUiAgbHBzdHJBbGlhczsKIH0gTUNJX09QRU5fUEFSTVMsICpMUE1DSV9PUEVOX1BBUk1TOwogCiB0eXBlZGVmIHN0cnVjdCB7CkBAIC05NzAsOCArOTcwLDggQEAKIAlMUFNUUiAgIGxwc3RyUmV0dXJuOwogCURXT1JEICAgZHdSZXRTaXplOwogCURXT1JEICAgZHdOdW1iZXI7Ci0JVUlOVCAgICB3RGV2aWNlVHlwZTsKLQlVSU5UICAgIHdSZXNlcnZlZDA7CisJVUlOVDE2ICAgIHdEZXZpY2VUeXBlOworCVVJTlQxNiAgICB3UmVzZXJ2ZWQwOwogfSBNQ0lfU1lTSU5GT19QQVJNUywgKkxQTUNJX1NZU0lORk9fUEFSTVM7CiAKIHR5cGVkZWYgc3RydWN0IHsKQEAgLTk4Myw5ICs5ODMsOSBAQAogdHlwZWRlZiBzdHJ1Y3QgewogCURXT1JEICAgZHdDYWxsYmFjazsKIAlpbnQgICAgIG5WaXJ0S2V5OwotCVVJTlQgICAgd1Jlc2VydmVkMDsKKwlVSU5UMTYgICAgd1Jlc2VydmVkMDsKIAlIV05EMTYgIGh3bmRCcmVhazsKLQlVSU5UICAgIHdSZXNlcnZlZDE7CisJVUlOVDE2ICAgIHdSZXNlcnZlZDE7CiB9IE1DSV9CUkVBS19QQVJNUywgKkxQTUNJX0JSRUFLX1BBUk1TOwogCiB0eXBlZGVmIHN0cnVjdCB7CkBAIC0xMDkyLDExICsxMDkyLDExIEBACiAKIHR5cGVkZWYgc3RydWN0IHsKIAlEV09SRCAgIGR3Q2FsbGJhY2s7Ci0JVUlOVCAgICB3RGV2aWNlSUQ7Ci0JVUlOVCAgICB3UmVzZXJ2ZWQwOwotCUxQQ1NUUiAgbHBzdHJEZXZpY2VUeXBlOwotCUxQQ1NUUiAgbHBzdHJFbGVtZW50TmFtZTsKLQlMUENTVFIgIGxwc3RyQWxpYXM7CisJVUlOVDE2ICB3RGV2aWNlSUQ7CisJVUlOVDE2ICB3UmVzZXJ2ZWQwOworCVNFR1BUUiAgbHBzdHJEZXZpY2VUeXBlOworCVNFR1BUUiAgbHBzdHJFbGVtZW50TmFtZTsKKwlTRUdQVFIgIGxwc3RyQWxpYXM7CiAJRFdPUkQgICBkd0J1ZmZlclNlY29uZHM7CiB9IE1DSV9XQVZFX09QRU5fUEFSTVMsICpMUE1DSV9XQVZFX09QRU5fUEFSTVM7CiAKQEAgLTExMTAsMjAgKzExMTAsMjAgQEAKIAlEV09SRCAgIGR3Q2FsbGJhY2s7CiAJRFdPUkQgICBkd1RpbWVGb3JtYXQ7CiAJRFdPUkQgICBkd0F1ZGlvOwotCVVJTlQgICAgd0lucHV0OwotCVVJTlQgICAgd1Jlc2VydmVkMDsKLQlVSU5UICAgIHdPdXRwdXQ7Ci0JVUlOVCAgICB3UmVzZXJ2ZWQxOwotCVVJTlQgICAgd0Zvcm1hdFRhZzsKLQlVSU5UICAgIHdSZXNlcnZlZDI7Ci0JVUlOVCAgICBuQ2hhbm5lbHM7Ci0JVUlOVCAgICB3UmVzZXJ2ZWQzOworCVVJTlQxNiAgICB3SW5wdXQ7CisJVUlOVDE2ICAgIHdSZXNlcnZlZDA7CisJVUlOVDE2ICAgIHdPdXRwdXQ7CisJVUlOVDE2ICAgIHdSZXNlcnZlZDE7CisJVUlOVDE2ICAgIHdGb3JtYXRUYWc7CisJVUlOVDE2ICAgIHdSZXNlcnZlZDI7CisJVUlOVDE2ICAgIG5DaGFubmVsczsKKwlVSU5UMTYgICAgd1Jlc2VydmVkMzsKIAlEV09SRCAgIG5TYW1wbGVzUGVyU2VjOwogCURXT1JEICAgbkF2Z0J5dGVzUGVyU2VjOwotCVVJTlQgICAgbkJsb2NrQWxpZ247Ci0JVUlOVCAgICB3UmVzZXJ2ZWQ0OwotCVVJTlQgICAgd0JpdHNQZXJTYW1wbGU7Ci0JVUlOVCAgICB3UmVzZXJ2ZWQ1OworCVVJTlQxNiAgICBuQmxvY2tBbGlnbjsKKwlVSU5UMTYgICAgd1Jlc2VydmVkNDsKKwlVSU5UMTYgICAgd0JpdHNQZXJTYW1wbGU7CisJVUlOVDE2ICAgIHdSZXNlcnZlZDU7CiB9IE1DSV9XQVZFX1NFVF9QQVJNUywgKiBMUE1DSV9XQVZFX1NFVF9QQVJNUzsKIAogI2RlZmluZSAgICAgTUNJX1NFUV9ESVZfUFBRTiAgICAgICAgICAgICgwICsgTUNJX1NFUV9PRkZTRVQpCkBAIC0xMjEzLDE0ICsxMjEzLDE0IEBACiAKIHR5cGVkZWYgc3RydWN0IHsKIAlEV09SRCAgIGR3Q2FsbGJhY2s7Ci0JVUlOVCAgICB3RGV2aWNlSUQ7Ci0JVUlOVCAgICB3UmVzZXJ2ZWQwOwotCUxQQ1NUUiAgbHBzdHJEZXZpY2VUeXBlOwotCUxQQ1NUUiAgbHBzdHJFbGVtZW50TmFtZTsKLQlMUENTVFIgIGxwc3RyQWxpYXM7CisJVUlOVDE2ICB3RGV2aWNlSUQ7CisJVUlOVDE2ICB3UmVzZXJ2ZWQwOworCVNFR1BUUiAgbHBzdHJEZXZpY2VUeXBlOworCVNFR1BUUiAgbHBzdHJFbGVtZW50TmFtZTsKKwlTRUdQVFIgIGxwc3RyQWxpYXM7CiAJRFdPUkQgICBkd1N0eWxlOwogCUhXTkQxNiAgaFduZFBhcmVudDsKLQlVSU5UICAgIHdSZXNlcnZlZDE7CisJVUlOVDE2ICB3UmVzZXJ2ZWQxOwogfSBNQ0lfQU5JTV9PUEVOX1BBUk1TLCAqTFBNQ0lfQU5JTV9PUEVOX1BBUk1TOwogCiB0eXBlZGVmIHN0cnVjdCB7CkBAIC0xMjM4LDkgKzEyMzgsOSBAQAogdHlwZWRlZiBzdHJ1Y3QgewogCURXT1JEICAgZHdDYWxsYmFjazsKIAlIV05EMTYgIGhXbmQ7Ci0JVUlOVCAgICB3UmVzZXJ2ZWQxOwotCVVJTlQgICAgbkNtZFNob3c7Ci0JVUlOVCAgICB3UmVzZXJ2ZWQyOworCVVJTlQxNiAgICB3UmVzZXJ2ZWQxOworCVVJTlQxNiAgICBuQ21kU2hvdzsKKwlVSU5UMTYgICAgd1Jlc2VydmVkMjsKIAlMUENTVFIgIGxwc3RyVGV4dDsKIH0gTUNJX0FOSU1fV0lORE9XX1BBUk1TLCAqTFBNQ0lfQU5JTV9XSU5ET1dfUEFSTVM7CiAKQEAgLTEyOTMsMjIgKzEyOTMsMjIgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgewogCURXT1JEICAgZHdDYWxsYmFjazsKLQlVSU5UICAgIHdEZXZpY2VJRDsKLQlVSU5UICAgIHdSZXNlcnZlZDA7CisJVUlOVDE2ICAgIHdEZXZpY2VJRDsKKwlVSU5UMTYgICAgd1Jlc2VydmVkMDsKIAlMUENTVFIgIGxwc3RyRGV2aWNlVHlwZTsKIAlMUENTVFIgIGxwc3RyRWxlbWVudE5hbWU7CiAJTFBDU1RSICBscHN0ckFsaWFzOwogCURXT1JEICAgZHdTdHlsZTsKIAlIV05EMTYgIGhXbmRQYXJlbnQ7Ci0JVUlOVCAgICB3UmVzZXJ2ZWQxOworCVVJTlQxNiAgICB3UmVzZXJ2ZWQxOwogfSBNQ0lfT1ZMWV9PUEVOX1BBUk1TLCAqTFBNQ0lfT1ZMWV9PUEVOX1BBUk1TOwogCiB0eXBlZGVmIHN0cnVjdCB7CiAJRFdPUkQgICBkd0NhbGxiYWNrOwogCUhXTkQxNiAgaFduZDsKLQlVSU5UICAgIHdSZXNlcnZlZDE7Ci0JVUlOVCAgICBuQ21kU2hvdzsKLQlVSU5UICAgIHdSZXNlcnZlZDI7CisJVUlOVDE2ICAgIHdSZXNlcnZlZDE7CisJVUlOVDE2ICAgIG5DbWRTaG93OworCVVJTlQxNiAgICB3UmVzZXJ2ZWQyOwogCUxQQ1NUUiAgbHBzdHJUZXh0OwogfSBNQ0lfT1ZMWV9XSU5ET1dfUEFSTVMsICpMUE1DSV9PVkxZX1dJTkRPV19QQVJNUzsKIApAQCAtMTQ5NCwzMCArMTQ5NCwzMCBAQAogfSBNSURJT1BFTkRFU0MsICpMUE1JRElPUEVOREVTQzsKIAogdHlwZWRlZiBzdHJ1Y3QgewotCVVJTlQJCQl3RGVsYXk7Ci0JVUlOVAkJCXdSZXNvbHV0aW9uOworCVVJTlQxNgkJCXdEZWxheTsKKwlVSU5UMTYJCQl3UmVzb2x1dGlvbjsKIAlMUFRJTUVDQUxMQkFDSwlscEZ1bmN0aW9uOwogCURXT1JECQkJZHdVc2VyOwotCVVJTlQJCQl3RmxhZ3M7CisJVUlOVDE2CQkJd0ZsYWdzOwogfSBUSU1FUkVWRU5ULCAqTFBUSU1FUkVWRU5UOwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JVUlOVCAgICB3RGV2aWNlSUQ7CQkJCS8qIGRldmljZSBJRCAqLworCVVJTlQxNiAgICB3RGV2aWNlSUQ7CQkJCS8qIGRldmljZSBJRCAqLwogCUxQU1RSIAlscHN0clBhcmFtczsJCQkvKiBwYXJhbWV0ZXIgc3RyaW5nIGZvciBlbnRyeSBpbiBTWVNURU0uSU5JICovCi0JVUlOVCAgICB3Q3VzdG9tQ29tbWFuZFRhYmxlOwkvKiBjdXN0b20gY29tbWFuZCB0YWJsZSAoMHhGRkZGIGlmIG5vbmUpICovCisJVUlOVDE2ICAgIHdDdXN0b21Db21tYW5kVGFibGU7CS8qIGN1c3RvbSBjb21tYW5kIHRhYmxlICgweEZGRkYgaWYgbm9uZSkgKi8KIAkJCQkJCQkJCS8qIGZpbGxlZCBpbiBieSB0aGUgZHJpdmVyICovCi0JVUlOVCAgICB3VHlwZTsJCQkJCS8qIGRyaXZlciB0eXBlICovCisJVUlOVDE2ICAgIHdUeXBlOwkJCQkJLyogZHJpdmVyIHR5cGUgKi8KIAkJCQkJCQkJCS8qIGZpbGxlZCBpbiBieSB0aGUgZHJpdmVyICovCiB9IE1DSV9PUEVOX0RSSVZFUl9QQVJNUywgKiBMUE1DSV9PUEVOX0RSSVZFUl9QQVJNUzsKIAotRFdPUkQgbWNpR2V0RHJpdmVyRGF0YShVSU5UIHVEZXZpY2VJRCk7Ci1CT09MICBtY2lTZXREcml2ZXJEYXRhKFVJTlQgdURldmljZUlELCBEV09SRCBkd0RhdGEpOwotVUlOVCAgbWNpRHJpdmVyWWllbGQoVUlOVCB1RGV2aWNlSUQpOwotQk9PTCAgbWNpRHJpdmVyTm90aWZ5KEhXTkQxNiBod25kQ2FsbGJhY2ssIFVJTlQgdURldmljZUlELAotICAgIFVJTlQgdVN0YXR1cyk7Ci1VSU5UICBtY2lMb2FkQ29tbWFuZFJlc291cmNlKEhJTlNUQU5DRTE2IGhJbnN0YW5jZSwKLSAgICBMUENTVFIgbHBSZXNOYW1lLCBVSU5UIHVUeXBlKTsKLUJPT0wgIG1jaUZyZWVDb21tYW5kUmVzb3VyY2UoVUlOVCB1VGFibGUpOworRFdPUkQgbWNpR2V0RHJpdmVyRGF0YShVSU5UMTYgdURldmljZUlEKTsKK0JPT0wxNiAgbWNpU2V0RHJpdmVyRGF0YShVSU5UMTYgdURldmljZUlELCBEV09SRCBkd0RhdGEpOworVUlOVDE2ICBtY2lEcml2ZXJZaWVsZChVSU5UMTYgdURldmljZUlEKTsKK0JPT0wxNiAgbWNpRHJpdmVyTm90aWZ5KEhXTkQxNiBod25kQ2FsbGJhY2ssIFVJTlQxNiB1RGV2aWNlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMTYgdVN0YXR1cyk7CitVSU5UMTYgIG1jaUxvYWRDb21tYW5kUmVzb3VyY2UoSElOU1RBTkNFMTYgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBscFJlc05hbWUsIFVJTlQxNiB1VHlwZSk7CitCT09MMTYgIG1jaUZyZWVDb21tYW5kUmVzb3VyY2UoVUlOVDE2IHVUYWJsZSk7CiAKICNkZWZpbmUgRENCX05VTEwJCTB4MDAwMAogI2RlZmluZSBEQ0JfV0lORE9XCQkweDAwMDEJCQkvKiBkd0NhbGxiYWNrIGlzIGEgSFdORCAqLwpAQCAtMTUyNiw4ICsxNTI2LDggQEAKICNkZWZpbmUgRENCX1RZUEVNQVNLCTB4MDAwNwogI2RlZmluZSBEQ0JfTk9TV0lUQ0gJMHgwMDA4CQkJLyogZG9uJ3Qgc3dpdGNoIHN0YWNrcyBmb3IgY2FsbGJhY2sgKi8KIAotQk9PTCBEcml2ZXJDYWxsYmFjayhEV09SRCBkd0NhbGxCYWNrLCBVSU5UIHVGbGFncywgSEFORExFMTYgaERldiwgCi0JCVdPUkQgd01zZywgRFdPUkQgZHdVc2VyLCBEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIpOworQk9PTDE2IERyaXZlckNhbGxiYWNrKERXT1JEIGR3Q2FsbEJhY2ssIFVJTlQxNiB1RmxhZ3MsIEhBTkRMRTE2IGhEZXYsIAorICAgICAgICAgICAgICAgICAgICAgIFdPUkQgd01zZywgRFdPUkQgZHdVc2VyLCBEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIpOwogRFdPUkQgYXV4TWVzc2FnZShXT1JEIHdEZXZJRCwgV09SRCB3TXNnLCBEV09SRCBkd1VzZXIsIAogCQkJCQlEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIpOwogRFdPUkQgbWlkTWVzc2FnZShXT1JEIHdEZXZJRCwgV09SRCB3TXNnLCBEV09SRCBkd1VzZXIsIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tb2R1bGUuaCBiL2luY2x1ZGUvbW9kdWxlLmgKaW5kZXggOTUzY2RmYi4uODcyYjQ5OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tb2R1bGUuaAorKysgYi9pbmNsdWRlL21vZHVsZS5oCkBAIC0xMzcsNyArMTM3LDcgQEAKIGV4dGVybiB2b2lkIEJVSUxUSU5fUHJpbnRETExzKHZvaWQpOwogCiAvKiBuZV9pbWFnZS5jICovCi1leHRlcm4gQk9PTDE2IE5FX0xvYWRTZWdtZW50KCBITU9EVUxFMTYgaE1vZHVsZSwgV09SRCBzZWdudW0gKTsKK2V4dGVybiBCT09MMzIgTkVfTG9hZFNlZ21lbnQoIEhNT0RVTEUxNiBoTW9kdWxlLCBXT1JEIHNlZ251bSApOwogZXh0ZXJuIHZvaWQgTkVfRml4dXBQcm9sb2dzKCBORV9NT0RVTEUgKnBNb2R1bGUgKTsKIGV4dGVybiB2b2lkIE5FX0luaXRpYWxpemVETExzKCBITU9EVUxFMTYgaE1vZHVsZSApOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL29sZS5oIGIvaW5jbHVkZS9vbGUuaAppbmRleCBmZGZmNTc3Li4wNjkyZWUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL29sZS5oCisrKyBiL2luY2x1ZGUvb2xlLmgKQEAgLTEzOSwxMyArMTM5LDEzIEBACiB9IE9MRV9SRUxFQVNFX01FVEhPRDsKIAogdHlwZWRlZiBzdHJ1Y3QgX09MRVRBUkdFVERFVklDRSB7Ci0JVUlOVAlvdGREZXZpY2VOYW1lT2Zmc2V0OwotCVVJTlQJb3RkRHJpdmVyTmFtZU9mZnNldDsKLQlVSU5UCW90ZFBvcnROYW1lT2Zmc2V0OwotCVVJTlQJb3RkRXh0RGV2bW9kZU9mZnNldDsKLQlVSU5UCW90ZEV4dERldm1vZGVTaXplOwotCVVJTlQJb3RkRW52aXJvbm1lbnRPZmZzZXQ7Ci0JVUlOVAlvdGRFbnZpcm9ubWVudFNpemU7CisJVUlOVDE2CW90ZERldmljZU5hbWVPZmZzZXQ7CisJVUlOVDE2CW90ZERyaXZlck5hbWVPZmZzZXQ7CisJVUlOVDE2CW90ZFBvcnROYW1lT2Zmc2V0OworCVVJTlQxNglvdGRFeHREZXZtb2RlT2Zmc2V0OworCVVJTlQxNglvdGRFeHREZXZtb2RlU2l6ZTsKKwlVSU5UMTYJb3RkRW52aXJvbm1lbnRPZmZzZXQ7CisJVUlOVDE2CW90ZEVudmlyb25tZW50U2l6ZTsKIAlCWVRFCW90ZERhdGFbMV07CiAJLyogLi4uICovCiB9IE9MRVRBUkdFVERFVklDRTsKQEAgLTIwNiw4ICsyMDYsOCBAQAogdHlwZWRlZiBzdHJ1Y3QgX09MRU9CSkVDVFZUQkwgewogICAgICAgICB2b2lkICogIAkoKlF1ZXJ5UHJvdG9jb2wpKExQT0xFT0JKRUNULE9MRV9MUENTVFIpOwogCU9MRVNUQVRVUwkoKlJlbGVhc2UpKExQT0xFT0JKRUNUKTsKLQlPTEVTVEFUVVMJKCpTaG93KShMUE9MRU9CSkVDVCxCT09MKTsKLQlPTEVTVEFUVVMJKCpEb1ZlcmIpKExQT0xFT0JKRUNULFVJTlQsQk9PTCxCT09MKTsKKwlPTEVTVEFUVVMJKCpTaG93KShMUE9MRU9CSkVDVCxCT09MMTYpOworCU9MRVNUQVRVUwkoKkRvVmVyYikoTFBPTEVPQkpFQ1QsVUlOVDE2LEJPT0wxNixCT09MMTYpOwogCU9MRVNUQVRVUwkoKkdldERhdGEpKExQT0xFT0JKRUNULE9MRUNMSVBGT1JNQVQsSEFORExFMTYgKik7CiAJT0xFU1RBVFVTCSgqU2V0RGF0YSkoTFBPTEVPQkpFQ1QsT0xFQ0xJUEZPUk1BVCxIQU5ETEUxNik7CiAJT0xFU1RBVFVTCSgqU2V0VGFyZ2V0RGV2aWNlKShMUE9MRU9CSkVDVCxIR0xPQkFMMTYpOwpAQCAtMjIyLDggKzIyMiw4IEBACiAJT0xFU1RBVFVTCSgqRXF1YWwpKExQT0xFT0JKRUNULExQT0xFT0JKRUNUKTsKIAlPTEVTVEFUVVMJKCpDb3B5VG9DbGlwQm9hcmQpKExQT0xFT0JKRUNUKTsKIAlPTEVTVEFUVVMJKCpEcmF3KShMUE9MRU9CSkVDVCxIREMxNixMUFJFQ1QxNixMUFJFQ1QxNixIREMxNik7Ci0JT0xFU1RBVFVTCSgqQWN0aXZhdGUpKExQT0xFT0JKRUNULFVJTlQsQk9PTCxCT09MLEhXTkQxNixMUFJFQ1QxNik7Ci0JT0xFU1RBVFVTCSgqRXhlY3V0ZSkoTFBPTEVPQkpFQ1QsSEdMT0JBTDE2LFVJTlQpOworCU9MRVNUQVRVUwkoKkFjdGl2YXRlKShMUE9MRU9CSkVDVCxVSU5UMTYsQk9PTDE2LEJPT0wxNixIV05EMTYsTFBSRUNUMTYpOworCU9MRVNUQVRVUwkoKkV4ZWN1dGUpKExQT0xFT0JKRUNULEhHTE9CQUwxNixVSU5UMTYpOwogCU9MRVNUQVRVUwkoKkNsb3NlKShMUE9MRU9CSkVDVCk7CiAJT0xFU1RBVFVTCSgqVXBkYXRlKShMUE9MRU9CSkVDVCk7CiAJT0xFU1RBVFVTCSgqUmVjb25uZWN0KShMUE9MRU9CSkVDVCk7CkBAIC0yNDEsNyArMjQxLDcgQEAKIAlPTEVTVEFUVVMJKCpRdWVyeVJlbGVhc2VFcnJvcikoTFBPTEVPQkpFQ1QpOwogCU9MRV9SRUxFQVNFX01FVEhPRCAoKlF1ZXJ5UmVsZWFzZU1ldGhvZCkoTFBPTEVPQkpFQ1QpOwogCU9MRVNUQVRVUwkoKlJlcXVlc3REYXRhKShMUE9MRU9CSkVDVCxPTEVDTElQRk9STUFUKTsKLQlPTEVTVEFUVVMJKCpPYmplY3RMb25nKShMUE9MRU9CSkVDVCxVSU5ULExQTE9ORyk7CisJT0xFU1RBVFVTCSgqT2JqZWN0TG9uZykoTFBPTEVPQkpFQ1QsVUlOVDE2LExQTE9ORyk7CiB9IE9MRU9CSkVDVFZUQkw7CiB0eXBlZGVmIE9MRU9CSkVDVFZUQkwqCUxQT0xFT0JKRUNUVlRCTDsKIApAQCAtMjUxLDcgKzI1MSw3IEBACiAKIAogT0xFU1RBVFVTIE9sZVJlZ2lzdGVyU2VydmVyKExQQ1NUUixMUE9MRVNFUlZFUixMSFNFUlZFUiAqLEhJTlNUQU5DRTE2LE9MRV9TRVJWRVJfVVNFKTsKLU9MRVNUQVRVUyBPbGVVbmJsb2NrU2VydmVyKExIU0VSVkVSLEJPT0wgKik7CitPTEVTVEFUVVMgT2xlVW5ibG9ja1NlcnZlcihMSFNFUlZFUixCT09MMTYgKik7CiBPTEVTVEFUVVMgT2xlUmVnaXN0ZXJTZXJ2ZXJEb2MoTEhTRVJWRVIsTFBDU1RSLExQT0xFU0VSVkVSRE9DLExIU0VSVkVSRE9DICopOwogT0xFU1RBVFVTIE9sZVJlZ2lzdGVyQ2xpZW50RG9jKExQQ1NUUixMUENTVFIsTE9ORyxMSENMSUVOVERPQyAqKTsKIE9MRVNUQVRVUyBPbGVSZW5hbWVDbGllbnREb2MoTEhDTElFTlRET0MsTFBDU1RSKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3B0aW9ucy5oIGIvaW5jbHVkZS9vcHRpb25zLmgKaW5kZXggNDIxZjNlNi4uM2YwNTFkNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9vcHRpb25zLmgKKysrIGIvaW5jbHVkZS9vcHRpb25zLmgKQEAgLTIzLDcgKzIzLDggQEAKICAgICBMQU5HX0VvLCAgLyogRXNwZXJhbnRvICovCiAgICAgTEFOR19JdCwgIC8qIEl0YWxpYW4gKi8KICAgICBMQU5HX0tvLCAgLyogS29yZWFuICovCi0gICAgTEFOR19IdSAgIC8qIEh1bmdhcmlhbiAqLworICAgIExBTkdfSHUsICAvKiBIdW5nYXJpYW4gKi8KKyAgICBMQU5HX1BsICAgLyogUG9saXNoICovCiB9IFdJTkVfTEFOR1VBR0U7CiAKIHR5cGVkZWYgc3RydWN0CmRpZmYgLS1naXQgYS9pbmNsdWRlL3BlZXhlLmggYi9pbmNsdWRlL3BlZXhlLmgKaW5kZXggYzc1NDUwYy4uZDYwYWZmYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wZWV4ZS5oCisrKyBiL2luY2x1ZGUvcGVleGUuaApAQCAtNCw2ICs0LDcgQEAKICNpZm5kZWYgX19XSU5FX1BFRVhFX0gKICNkZWZpbmUgX19XSU5FX1BFRVhFX0gKIAorI2luY2x1ZGUgIndpbnR5cGVzLmgiCiAKIHR5cGVkZWYgc3RydWN0IF9JTUFHRV9GSUxFX0hFQURFUiB7CiAJV09SRAlNYWNoaW5lOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zZWxlY3RvcnMuaCBiL2luY2x1ZGUvc2VsZWN0b3JzLmgKaW5kZXggNjczYTJmNS4uY2JiMDBlZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zZWxlY3RvcnMuaAorKysgYi9pbmNsdWRlL3NlbGVjdG9ycy5oCkBAIC0xOCwzOCArMTgsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTDMyIHJlYWRvbmx5ICk7CiBleHRlcm4gdm9pZCBTRUxFQ1RPUl9GcmVlQmxvY2soIFdPUkQgc2VsLCBXT1JEIGNvdW50ICk7CiAKLSNpZm5kZWYgV0lORUxJQgotCi0jaWZkZWYgbGludXgKLSNkZWZpbmUgV0lORV9EQVRBX1NFTEVDVE9SIDB4MmIKLSNkZWZpbmUgV0lORV9DT0RFX1NFTEVDVE9SIDB4MjMKLSNlbmRpZiAgLyogbGludXggKi8KLQotI2lmZGVmIF9fTmV0QlNEX18KLSNkZWZpbmUgV0lORV9EQVRBX1NFTEVDVE9SIDB4MWYKLSNkZWZpbmUgV0lORV9DT0RFX1NFTEVDVE9SIDB4MTcKLSNlbmRpZiAgLyogTmV0QlNEICovCi0KLSNpZmRlZiBfX0ZyZWVCU0RfXwotI2RlZmluZSBXSU5FX0RBVEFfU0VMRUNUT1IgMHgyNwotI2RlZmluZSBXSU5FX0NPREVfU0VMRUNUT1IgMHgxZgotI2VuZGlmICAvKiBGcmVlQlNEICovCi0KLSNpZiBkZWZpbmVkKF9fc3ZyNF9fKSB8fCBkZWZpbmVkKF9TQ09fRFMpCi0jZGVmaW5lIFdJTkVfREFUQV9TRUxFQ1RPUiAweDFmCi0jZGVmaW5lIFdJTkVfQ09ERV9TRUxFQ1RPUiAweDE3Ci0jZW5kaWYgIC8qIHN2cjQgfHwgU0NPX0RTICovCi0KLSNpZmRlZiBfX0VNWF9fIC8qIElzIHRoaXMgYWx3YXlzIHRydWU/ICovCi0jZGVmaW5lIFdJTkVfREFUQV9TRUxFQ1RPUiAweDUzCi0jZGVmaW5lIFdJTkVfQ09ERV9TRUxFQ1RPUiAweDViCi0jZW5kaWYgIC8qIE9TLzIgKi8KLQotI2Vsc2UgIC8qIFdJTkVMSUIgKi8KLQotI2RlZmluZSBXSU5FX0RBVEFfU0VMRUNUT1IgMHgwMAotI2RlZmluZSBXSU5FX0NPREVfU0VMRUNUT1IgMHgwMAotCi0jZW5kaWYgIC8qIFdJTkVMSUIgKi8KKyNpZiBkZWZpbmVkKGxpbnV4KQorIyBkZWZpbmUgV0lORV9EQVRBX1NFTEVDVE9SIDB4MmIKKyMgZGVmaW5lIFdJTkVfQ09ERV9TRUxFQ1RPUiAweDIzCisjZWxpZiBkZWZpbmVkKF9fTmV0QlNEX18pCisjIGRlZmluZSBXSU5FX0RBVEFfU0VMRUNUT1IgMHgxZgorIyBkZWZpbmUgV0lORV9DT0RFX1NFTEVDVE9SIDB4MTcKKyNlbGlmIGRlZmluZWQoX19GcmVlQlNEX18pCisjIGRlZmluZSBXSU5FX0RBVEFfU0VMRUNUT1IgMHgyNworIyBkZWZpbmUgV0lORV9DT0RFX1NFTEVDVE9SIDB4MWYKKyNlbGlmIGRlZmluZWQoX19zdnI0X18pIHx8IGRlZmluZWQoX1NDT19EUykKKyMgZGVmaW5lIFdJTkVfREFUQV9TRUxFQ1RPUiAweDFmCisjIGRlZmluZSBXSU5FX0NPREVfU0VMRUNUT1IgMHgxNworI2VsaWYgZGVmaW5lZChfX0VNWF9fKQorIyBkZWZpbmUgV0lORV9EQVRBX1NFTEVDVE9SIDB4NTMgLyogSXMgdGhpcyBhbHdheXMgdHJ1ZT8gKi8KKyMgZGVmaW5lIFdJTkVfQ09ERV9TRUxFQ1RPUiAweDViCisjZWxzZQorIyBkZWZpbmUgV0lORV9EQVRBX1NFTEVDVE9SIDB4MDAKKyMgZGVmaW5lIFdJTkVfQ09ERV9TRUxFQ1RPUiAweDAwCisjZW5kaWYKIAogI2VuZGlmIC8qIF9fV0lORV9TRUxFQ1RPUlNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zdGF0aWMuaCBiL2luY2x1ZGUvc3RhdGljLmgKaW5kZXggYzY2NGNjNC4uNDVhOGZmZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zdGF0aWMuaAorKysgYi9pbmNsdWRlL3N0YXRpYy5oCkBAIC0xNyw2ICsxNyw3IEBACiAgICAgSElDT04xNiAgaEljb247ICAgLyogSWNvbiBoYW5kbGUgZm9yIFNTX0lDT04gY29udHJvbHMgKi8gCiB9IFNUQVRJQ0lORk87CiAKLWV4dGVybiBMUkVTVUxUIFN0YXRpY1duZFByb2MoSFdORDE2IGhXbmQsVUlOVCB1TXNnLFdQQVJBTTE2IHdQYXJhbSxMUEFSQU0gbFBhcmFtICk7CitleHRlcm4gTFJFU1VMVCBTdGF0aWNXbmRQcm9jKCBIV05EMTYgaFduZCwgVUlOVDE2IHVNc2csIFdQQVJBTTE2IHdQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSBsUGFyYW0gKTsKIAogI2VuZGlmICAvKiBfX1dJTkVfU1RBVElDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc3RkZGVidWcuaCBiL2luY2x1ZGUvc3RkZGVidWcuaAppbmRleCBkMDlmMjVkLi40NmMwMTJjIDEwMDY0NAotLS0gYS9pbmNsdWRlL3N0ZGRlYnVnLmgKKysrIGIvaW5jbHVkZS9zdGRkZWJ1Zy5oCkBAIC0xNDgsNiArMTQ4LDcgQEAKICN1bmRlZiBERUJVR19USU1FUgogI3VuZGVmIERFQlVHX1RPT0xIRUxQCiAjdW5kZWYgREVCVUdfVkVSCisjdW5kZWYgREVCVUdfVklSVFVBTAogI3VuZGVmIERFQlVHX1ZYRAogI3VuZGVmIERFQlVHX1dJTgogI3VuZGVmIERFQlVHX1dJTjE2RFJWCkBAIC0yMjgsNiArMjI5LDcgQEAKICNkZWZpbmUgREVCVUdfVElNRVIKICNkZWZpbmUgREVCVUdfVE9PTEhFTFAKICNkZWZpbmUgREVCVUdfVkVSCisjZGVmaW5lIERFQlVHX1ZJUlRVQUwKICNkZWZpbmUgREVCVUdfVlhECiAjZGVmaW5lIERFQlVHX1dJTgogI2RlZmluZSBERUJVR19XSU4xNkRSVgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zdHJlc3MuaCBiL2luY2x1ZGUvc3RyZXNzLmgKaW5kZXggMGQxZWY5My4uODZmNzE4YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zdHJlc3MuaAorKysgYi9pbmNsdWRlL3N0cmVzcy5oCkBAIC0xMSwxNiArMTEsMTYgQEAKICNkZWZpbmUgRURTX0NVUgkJMgogI2RlZmluZSBFRFNfVEVNUAkzCiAKLUJPT0wJQWxsb2NHRElNZW0oVUlOVCk7Ci1CT09MCUFsbG9jTWVtKERXT1JEKTsKLUJPT0wJQWxsb2NVc2VyTWVtKFVJTlQpOwotaW50CUFsbG9jRGlza1NwYWNlKGxvbmcsIFVJTlQpOworQk9PTDE2CUFsbG9jR0RJTWVtKFVJTlQxNik7CitCT09MMTYJQWxsb2NNZW0oRFdPUkQpOworQk9PTDE2CUFsbG9jVXNlck1lbShVSU5UMTYpOworaW50CUFsbG9jRGlza1NwYWNlKGxvbmcsIFVJTlQxNik7CiBpbnQJQWxsb2NGaWxlSGFuZGxlcyhpbnQpOwogaW50CUdldEZyZWVGaWxlSGFuZGxlcyh2b2lkKTsKIHZvaWQJRnJlZUFsbEdESU1lbSh2b2lkKTsKIHZvaWQJRnJlZUFsbE1lbSh2b2lkKTsKIHZvaWQJRnJlZUFsbFVzZXJNZW0odm9pZCk7Ci12b2lkCVVuQWxsb2NEaXNrU3BhY2UoVUlOVCk7Cit2b2lkCVVuQWxsb2NEaXNrU3BhY2UoVUlOVDE2KTsKIHZvaWQJVW5BbGxvY0ZpbGVIYW5kbGVzKHZvaWQpOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdG9vbGhlbHAuaCBiL2luY2x1ZGUvdG9vbGhlbHAuaAppbmRleCBkYmViZTgxLi5mYmYyMWE4IDEwMDY0NAotLS0gYS9pbmNsdWRlL3Rvb2xoZWxwLmgKKysrIGIvaW5jbHVkZS90b29saGVscC5oCkBAIC04LDYgKzgsOCBAQAogI2RlZmluZSBNQVhfUEFUSAkyNTUKICNkZWZpbmUgTUFYX0NMQVNTTkFNRQkyNTUKIAorI3ByYWdtYSBwYWNrKDEpCisKIC8qIEdsb2JhbCBoZWFwICovCiAKIHR5cGVkZWYgc3RydWN0CkBAIC0zNDMsNCArMzQ1LDcgQEAKICAgICBGQVJQUk9DMTYgICBscGZuRXJyb3JBZGRyOwogICAgIHZvaWQgICAgICAqKmxwQmFkUGFyYW07CiB9IE5GWUxPR1BBUkFNRVJST1I7CisKKyNwcmFnbWEgcGFjayg0KQorCiAjZW5kaWYgLyogX19XSU5FX1RPT0xIRUxQX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdzMyc3lzLmggYi9pbmNsdWRlL3czMnN5cy5oCmluZGV4IDYzODhiNmMuLjk0YzhkMjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdzMyc3lzLmgKKysrIGIvaW5jbHVkZS93MzJzeXMuaApAQCAtOCwxMCArOCwxMCBAQAogI2RlZmluZSBfX1dJTkVfX1czMlNZU19ICiAKIHR5cGVkZWYgc3RydWN0IF9XSU4zMlNJTkZPIHsKLSAgICBCWVRFIGJNYWpvcjsKLSAgICBCWVRFIGJNaW5vcjsKLSAgICBXT1JEIHdCdWlsZE51bWJlcjsKLSAgICBCT09MIGZEZWJ1ZzsKKyAgICBCWVRFICAgYk1ham9yOworICAgIEJZVEUgICBiTWlub3I7CisgICAgV09SRCAgIHdCdWlsZE51bWJlcjsKKyAgICBCT09MMTYgZkRlYnVnOwogfSBXSU4zMlNJTkZPLCAqTFBXSU4zMlNJTkZPOwogCiAjZW5kaWYgLyogX19XSU5FX1czMlNZU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbjE2ZHJ2LmggYi9pbmNsdWRlL3dpbjE2ZHJ2LmgKaW5kZXggYzZkNzM0OS4uNmIyYzhhOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW4xNmRydi5oCisrKyBiL2luY2x1ZGUvd2luMTZkcnYuaApAQCAtMTYxLDQgKzE2MSw3IEBACiBleHRlcm4gQk9PTDMyIFdJTjE2RFJWX0V4dFRleHRPdXQoIERDICpkYywgSU5UMzIgeCwgSU5UMzIgeSwgVUlOVDMyIGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJFQ1QzMiAqbHByZWN0LCBMUENTVFIgc3RyLCBVSU5UMzIgY291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UMzIgKmxwRHggKTsKK2V4dGVybiBIR0RJT0JKMzIgV0lOMTZEUlZfU2VsZWN0T2JqZWN0KCBEQyAqZGMsIEhHRElPQkozMiBoYW5kbGUgKTsKKworCiAjZW5kaWYgIC8qIF9fV0lORV9XSU4xNkRSVl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbmJhc2UuaCBiL2luY2x1ZGUvd2luYmFzZS5oCmluZGV4IDQ1Y2U3NTQuLmVkMDcxZWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvd2luYmFzZS5oCisrKyBiL2luY2x1ZGUvd2luYmFzZS5oCkBAIC0yOSw2ICsyOSwxMCBAQAogI2RlZmluZSBNRU1fTUFQUEVEICAgICAgICAgICAgICAweDAwMDQwMDAwCiAjZGVmaW5lIE1FTV9UT1BfRE9XTiAgICAgICAgICAgIDB4MDAxMDAwMDAKIAorI2RlZmluZSBGSUxFX0JFR0lOICAgICAgICAgICAgICAwCisjZGVmaW5lIEZJTEVfQ1VSUkVOVCAgICAgICAgICAgIDEKKyNkZWZpbmUgRklMRV9FTkQgICAgICAgICAgICAgICAgMgorCiAjZGVmaW5lIEZJTEVfQ0FTRV9TRU5TSVRJVkVfU0VBUkNIICAgICAgMHgwMDAwMDAwMQogI2RlZmluZSBGSUxFX0NBU0VfUFJFU0VSVkVEX05BTUVTICAgICAgIDB4MDAwMDAwMDIKICNkZWZpbmUgRklMRV9VTklDT0RFX09OX0RJU0sgICAgICAgICAgICAweDAwMDAwMDA0CmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbmRvd3MuaCBiL2luY2x1ZGUvd2luZG93cy5oCmluZGV4IDNiYzk1MDUuLjY0NDhmNjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvd2luZG93cy5oCisrKyBiL2luY2x1ZGUvd2luZG93cy5oCkBAIC0xNDI2LDYgKzE0MjYsNDUgQEAKICNkZWZpbmUgRVRPX09QQVFVRSAgICAgICAgICAweDAyCiAjZGVmaW5lIEVUT19DTElQUEVEICAgICAgICAgMHgwNAogCit0eXBlZGVmIHN0cnVjdAoreworICAgIFVJTlQxNglnbUJsYWNrQm94WDsKKyAgICBVSU5UMTYJZ21CbGFja0JveFk7CisgICAgUE9JTlQxNglnbXB0R2x5cGhPcmlnaW47CisgICAgSU5UMTYJZ21DZWxsSW5jWDsKKyAgICBJTlQxNglnbUNlbGxJbmNZOworfSBHTFlQSE1FVFJJQ1MxNiwgKkxQR0xZUEhNRVRSSUNTMTY7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgVUlOVDMyCWdtQmxhY2tCb3hYOworICAgIFVJTlQzMglnbUJsYWNrQm94WTsKKyAgICBQT0lOVDMyCWdtcHRHbHlwaE9yaWdpbjsKKyAgICBJTlQxNglnbUNlbGxJbmNYOworICAgIElOVDE2CWdtQ2VsbEluY1k7Cit9IEdMWVBITUVUUklDUzMyLCAqTFBHTFlQSE1FVFJJQ1MzMjsKKworREVDTF9XSU5FTElCX1RZUEUoR0xZUEhNRVRSSUNTKTsKK0RFQ0xfV0lORUxJQl9UWVBFKExQR0xZUEhNRVRSSUNTKTsKKworI2RlZmluZSBHR09fTUVUUklDUyAgICAgICAgIDAKKyNkZWZpbmUgR0dPX0JJVE1BUCAgICAgICAgICAxCisjZGVmaW5lIEdHT19OQVRJVkUgICAgICAgICAgMgorCit0eXBlZGVmIHN0cnVjdAoreworICAgIFVJTlQxNiAgZnJhY3Q7CisgICAgSU5UMTYgICB2YWx1ZTsKK30gRklYRUQ7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgIEZJWEVEICBlTTExOworICAgICBGSVhFRCAgZU0xMjsKKyAgICAgRklYRUQgIGVNMjE7CisgICAgIEZJWEVEICBlTTIyOworfSBNQVQyLCAqTFBNQVQyOworCiAgIC8qIGZvciBHZXRDaGFyQUJDV2lkdGhzKCkgKi8KIHR5cGVkZWYgc3RydWN0CiB7CkBAIC0xNDQ3LDkgKzE0ODYsOSBAQAogICAvKiBSYXN0ZXJpemVyIHN0YXR1cyAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBXT1JEIG5TaXplOwotICAgIFdPUkQgd0ZsYWdzOwotICAgIFdPUkQgbkxhbmd1YWdlSUQ7CisgICAgSU5UMTYgblNpemU7CisgICAgSU5UMTYgd0ZsYWdzOworICAgIElOVDE2IG5MYW5ndWFnZUlEOwogfSBSQVNURVJJWkVSX1NUQVRVUywgKkxQUkFTVEVSSVpFUl9TVEFUVVM7CiAKICNkZWZpbmUgVFRfQVZBSUxBQkxFICAgICAgICAweDAwMDEKQEAgLTE3MTYsOCArMTc1NSw0MSBAQAogI2RlZmluZSBTTV9NRU5VRFJPUEFMSUdOTUVOVCAgNDAKICNkZWZpbmUgU01fUEVOV0lORE9XUyAgICAgICAgIDQxCiAjZGVmaW5lIFNNX0RCQ1NFTkFCTEVEICAgICAgICA0MgorI2RlZmluZSBTTV9DTU9VU0VCVVRUT05TICAgICAgNDMKKyNkZWZpbmUgU01fQ1hGSVhFREZSQU1FCSAgICAgIFNNX0NYRExHRlJBTUUKKyNkZWZpbmUgU01fQ1lGSVhFREZSQU1FCSAgICAgIFNNX0NZRExHRlJBTUUKKyNkZWZpbmUgU01fQ1hTSVpFRlJBTUUJICAgICAgU01fQ1hGUkFNRQorI2RlZmluZSBTTV9DWVNJWkVGUkFNRQkgICAgICBTTV9DWUZSQU1FCisjZGVmaW5lIFNNX1NFQ1VSRQkgICAgICA0NAorI2RlZmluZSBTTV9DWEVER0UJICAgICAgNDUKKyNkZWZpbmUgU01fQ1lFREdFCSAgICAgIDQ2CisjZGVmaW5lIFNNX0NYTUlOU1BBQ0lORwkgICAgICA0NworI2RlZmluZSBTTV9DWU1JTlNQQUNJTkcJICAgICAgNDgKKyNkZWZpbmUgU01fQ1hTTUlDT04JICAgICAgNDkKKyNkZWZpbmUgU01fQ1lTTUlDT04JICAgICAgNTAKKyNkZWZpbmUgU01fQ1lTTUNBUFRJT04JICAgICAgNTEKKyNkZWZpbmUgU01fQ1hTTVNJWkUJICAgICAgNTIKKyNkZWZpbmUgU01fQ1lTTVNJWkUJICAgICAgNTMKKyNkZWZpbmUgU01fQ1hNRU5VU0laRQkgICAgICA1NAorI2RlZmluZSBTTV9DWU1FTlVTSVpFCSAgICAgIDU1CisjZGVmaW5lIFNNX0FSUkFOR0UJICAgICAgNTYKKyNkZWZpbmUgU01fQ1hNSU5JTUlaRUQJICAgICAgNTcKKyNkZWZpbmUgU01fQ1lNSU5JTUlaRUQJICAgICAgNTgKKyNkZWZpbmUgU01fQ1hNQVhUUkFDSwkgICAgICA1OQorI2RlZmluZSBTTV9DWU1BWFRSQUNLCSAgICAgIDYwCisjZGVmaW5lIFNNX0NYTUFYSU1JWkVECSAgICAgIDYxCisjZGVmaW5lIFNNX0NZTUFYSU1JWkVECSAgICAgIDYyCisjZGVmaW5lIFNNX05FVFdPUksJICAgICAgNjMKKyNkZWZpbmUgU01fQ0xFQU5CT09UCSAgICAgIDY3CisjZGVmaW5lIFNNX0NYRFJBRwkgICAgICA2OAorI2RlZmluZSBTTV9DWURSQUcJICAgICAgNjkKKyNkZWZpbmUgU01fU0hPV1NPVU5EUwkgICAgICA3MAorI2RlZmluZSBTTV9DWE1FTlVDSEVDSwkgICAgICA3MQorI2RlZmluZSBTTV9DWU1FTlVDSEVDSwkgICAgICA3MgorI2RlZmluZSBTTV9TTE9XTUFDSElORQkgICAgICA3MworI2RlZmluZSBTTV9NSURFQVNURU5BQkxFRCAgICAgNzQKIAotI2RlZmluZSBTTV9DTUVUUklDUyAgICAgICAgICAgNDMKKyNkZWZpbmUgU01fQ01FVFJJQ1MgICAgICAgICAgIDc1CiAKICAgLyogRGV2aWNlLWluZGVwZW5kZW50IGJpdG1hcHMgKi8KIApAQCAtMjIzMiw2ICsyMzA0LDcgQEAKICNkZWZpbmUJV0ZfU01BTExGUkFNRQkweDAyMDAKICNkZWZpbmUJV0ZfODB4ODcJMHgwNDAwCiAjZGVmaW5lCVdGX1BBR0lORwkweDA4MDAKKyNkZWZpbmUJV0ZfV0lOMzJXT1cgICAgIDB4NDAwMAkvKiB1bmRvYyAqLwogI2RlZmluZQlXRl9XTE8gICAgICAgICAgMHg4MDAwCiAKICNkZWZpbmUgTUFLRUlOVFJFU09VUkNFKGkpIChTRUdQVFIpKChEV09SRCkoKFdPUkQpKGkpKSkKQEAgLTQ2NTksNiArNDczMiw1MiBAQAogREVDTF9XSU5FTElCX1RZUEVfQVcoRU5VTVJFU05BTUVQUk9DKTsKIERFQ0xfV0lORUxJQl9UWVBFX0FXKEVOVU1SRVNMQU5HUFJPQyk7CiAKKy8qIENoYXJhY3RlciBUeXBlIEZsYWdzICovCisjZGVmaW5lCUNUX0NUWVBFMQkJMHgwMDAwMDAwMQkvKiB1c3VhbCBjdHlwZSAqLworI2RlZmluZQlDVF9DVFlQRTIJCTB4MDAwMDAwMDIJLyogYmlkaXJlY3Rpb25hbCBsYXlvdXQgaW5mbyAqLworI2RlZmluZQlDVF9DVFlQRTMJCTB4MDAwMDAwMDQJLyogdGV4dHByb2Nlc3NpbmcgaW5mbyAqLworCisvKiBDVHlwZSAxIEZsYWcgQml0cyAqLworI2RlZmluZSBDMV9VUFBFUgkJMHgwMDAxCisjZGVmaW5lIEMxX0xPV0VSCQkweDAwMDIKKyNkZWZpbmUgQzFfRElHSVQJCTB4MDAwNAorI2RlZmluZSBDMV9TUEFDRQkJMHgwMDA4CisjZGVmaW5lIEMxX1BVTkNUCQkweDAwMTAKKyNkZWZpbmUgQzFfQ05UUkwJCTB4MDAyMAorI2RlZmluZSBDMV9CTEFOSwkJMHgwMDQwCisjZGVmaW5lIEMxX1hESUdJVAkJMHgwMDgwCisjZGVmaW5lIEMxX0FMUEhBCQkweDAxMDAKKworLyogQ1R5cGUgMiBGbGFnIEJpdHMgKi8KKyNkZWZpbmUJQzJfTEVGVFRPUklHSFQJCTB4MDAwMQorI2RlZmluZQlDMl9SSUdIVFRPTEVGVAkJMHgwMDAyCisjZGVmaW5lCUMyX0VVUk9QRU5VTUJFUgkJMHgwMDAzCisjZGVmaW5lCUMyX0VVUk9QRVNFUEFSQVRPUgkweDAwMDQKKyNkZWZpbmUJQzJfRVVST1BFVEVSTUlOQVRPUgkweDAwMDUKKyNkZWZpbmUJQzJfQVJBQklDTlVNQkVSCQkweDAwMDYKKyNkZWZpbmUJQzJfQ09NTU9OU0VQQVJBVE9SCTB4MDAwNworI2RlZmluZQlDMl9CTE9DS1NFUEFSQVRPUgkweDAwMDgKKyNkZWZpbmUJQzJfU0VHTUVOVFNFUEFSQVRPUgkweDAwMDkKKyNkZWZpbmUJQzJfV0hJVEVTUEFDRQkJMHgwMDBBCisjZGVmaW5lCUMyX09USEVSTkVVVFJBTAkJMHgwMDBCCisjZGVmaW5lCUMyX05PVEFQUExJQ0FCTEUJMHgwMDAwCisKKy8qIENUeXBlIDMgRmxhZyBCaXRzICovCisjZGVmaW5lCUMzX05PTlNQQUNJTkcJCTB4MDAwMQorI2RlZmluZQlDM19ESUFDUklUSUMJCTB4MDAwMgorI2RlZmluZQlDM19WT1dFTE1BUksJCTB4MDAwNAorI2RlZmluZQlDM19TWU1CT0wJCTB4MDAwOAorI2RlZmluZQlDM19LQVRBS0FOQQkJMHgwMDEwCisjZGVmaW5lCUMzX0hJUkFHQU5BCQkweDAwMjAKKyNkZWZpbmUJQzNfSEFMRldJRFRICQkweDAwNDAKKyNkZWZpbmUJQzNfRlVMTFdJRFRICQkweDAwODAKKyNkZWZpbmUJQzNfSURFT0dSQVBICQkweDAxMDAKKyNkZWZpbmUJQzNfS0FTSElEQQkJMHgwMjAwCisjZGVmaW5lCUMzX0xFWElDQUwJCTB4MDQwMAorI2RlZmluZQlDM19BTFBIQQkJMHg4MDAwCisjZGVmaW5lCUMzX05PVEFQUExJQ0FCTEUJMHgwMDAwCisKKwogI3ByYWdtYSBwYWNrKDQpCiAKIC8qIERlY2xhcmF0aW9ucyBmb3IgZnVuY3Rpb25zIHRoYXQgZXhpc3Qgb25seSBpbiBXaW4xNiAqLwpAQCAtNDcwNCw2ICs0ODIzLDcgQEAKIEhEQzE2ICAgICAgR2V0RENTdGF0ZShIREMxNik7CiBIV05EMTYgICAgIEdldERlc2t0b3BId25kKHZvaWQpOwogU0VHUFRSICAgICBHZXRET1NFbnZpcm9ubWVudCh2b2lkKTsKK0lOVDE2ICAgICAgR2V0RW52aXJvbm1lbnQoTFBDU1RSLExQU1RSLFVJTlQxNik7CiBITU9EVUxFMTYgIEdldEV4ZVB0cihIQU5ETEUxNik7CiBXT1JEICAgICAgIEdldEV4ZVZlcnNpb24odm9pZCk7CiBEV09SRCAgICAgIEdldEhlYXBTcGFjZXMoSE1PRFVMRTE2KTsKQEAgLTQ3MTEsNiArNDgzMSw3IEBACiBJTlQxNiAgICAgIEdldEluc3RhbmNlRGF0YShISU5TVEFOQ0UxNixXT1JELElOVDE2KTsKIEhHTE9CQUwxNiAgR2V0TWV0YUZpbGVCaXRzKEhNRVRBRklMRTE2KTsKIEJPT0wxNiAgICAgR2V0TW9kdWxlTmFtZShISU5TVEFOQ0UxNixMUFNUUixJTlQxNik7CitJTlQxNiAgICAgIEdldE1vZHVsZVVzYWdlKEhJTlNUQU5DRTE2KTsKIEZBUlBST0MxNiAgR2V0TW91c2VFdmVudFByb2Modm9pZCk7CiBVSU5UMTYgICAgIEdldE51bVRhc2tzKHZvaWQpOwogRFdPUkQgICAgICBHZXRTZWxlY3RvckJhc2UoV09SRCk7CkBAIC00NzcwLDYgKzQ4OTEsNyBAQAogRFdPUkQgICAgICBTZXREQ09yZyhIREMxNixJTlQxNixJTlQxNik7CiBWT0lEICAgICAgIFNldERDU3RhdGUoSERDMTYsSERDMTYpOwogQk9PTDE2ICAgICBTZXREZXNrUGF0dGVybih2b2lkKTsKK0lOVDE2ICAgICAgU2V0RW52aXJvbm1lbnQoTFBDU1RSLExQQ1NUUixVSU5UMTYpOwogV09SRCAgICAgICBTZXRIb29rRmxhZ3MoSERDMTYsV09SRCk7CiBITUVUQUZJTEUxNiBTZXRNZXRhRmlsZUJpdHMoSEdMT0JBTDE2KTsKIFZPSUQgICAgICAgU2V0UHJpb3JpdHkoSFRBU0sxNixJTlQxNik7CkBAIC00ODc4LDYgKzUwMDAsOSBAQAogRFdPUkQgICAgICBHZXRTaG9ydFBhdGhOYW1lMzJXKExQQ1dTVFIsTFBXU1RSLERXT1JEKTsKICNkZWZpbmUgICAgR2V0U2hvcnRQYXRoTmFtZSBXSU5FTElCX05BTUVfQVcoR2V0U2hvcnRQYXRoTmFtZSkKIEhGSUxFMzIgICAgR2V0U3RkSGFuZGxlKERXT1JEKTsKK0JPT0wzMiAgICAgR2V0U3RyaW5nVHlwZUV4MzJBKExDSUQsRFdPUkQsTFBDU1RSLElOVDMyLExQV09SRCk7CitCT09MMzIgICAgIEdldFN0cmluZ1R5cGVFeDMyVyhMQ0lELERXT1JELExQQ1dTVFIsSU5UMzIsTFBXT1JEKTsKKyNkZWZpbmUgICAgR2V0U3RyaW5nVHlwZUV4IFdJTkVMSUJfTkFNRV9BVyhHZXRTdHJpbmdUeXBlRXgpCiBWT0lEICAgICAgIEdldFN5c3RlbUluZm8oTFBTWVNURU1fSU5GTyk7CiBCT09MMzIgICAgIEdldFN5c3RlbVBvd2VyU3RhdHVzKExQU1lTVEVNX1BPV0VSX1NUQVRVUyk7CiBWT0lEICAgICAgIEdldFN5c3RlbVRpbWUoTFBTWVNURU1USU1FKTsKQEAgLTQ4OTksMTMgKzUwMjQsMTcgQEAKIEJPT0wzMiAgICAgSXNXaW5kb3dVbmljb2RlKEhXTkQzMik7CiBCT09MMzIgICAgIElzVmFsaWRMb2NhbGUoRFdPUkQsRFdPUkQpOwogQk9PTDMyICAgICBMb2NhbEZpbGVUaW1lVG9GaWxlVGltZShjb25zdCBGSUxFVElNRSosTFBGSUxFVElNRSk7Ci1MUFZPSUQgICAgIE1hcFZpZXdPZkZpbGVFeChIQU5ETEUzMixEV09SRCxEV09SRCxEV09SRCxEV09SRCxEV09SRCk7CitMUFZPSUQgICAgIE1hcFZpZXdPZkZpbGUoSEFORExFMzIsRFdPUkQsRFdPUkQsRFdPUkQsRFdPUkQpOworTFBWT0lEICAgICBNYXBWaWV3T2ZGaWxlRXgoSEFORExFMzIsRFdPUkQsRFdPUkQsRFdPUkQsRFdPUkQsTFBWT0lEKTsKIElOVDMyICAgICAgTWVzc2FnZUJveEV4MzJBKEhXTkQzMixMUENTVFIsTFBDU1RSLFVJTlQzMixXT1JEKTsKIElOVDMyICAgICAgTWVzc2FnZUJveEV4MzJXKEhXTkQzMixMUENXU1RSLExQQ1dTVFIsVUlOVDMyLFdPUkQpOwogI2RlZmluZSAgICBNZXNzYWdlQm94RXggV0lORUxJQl9OQU1FX0FXKE1lc3NhZ2VCb3hFeCkKIEJPT0wzMiAgICAgTW92ZUZpbGUzMkEoTFBDU1RSLExQQ1NUUik7CiBCT09MMzIgICAgIE1vdmVGaWxlMzJXKExQQ1dTVFIsTFBDV1NUUik7CiAjZGVmaW5lICAgIE1vdmVGaWxlIFdJTkVMSUJfTkFNRV9BVyhNb3ZlRmlsZSkKK0hBTkRMRTMyICAgT3BlbkZpbGVNYXBwaW5nMzJBKERXT1JELEJPT0wzMixMUENTVFIpOworSEFORExFMzIgICBPcGVuRmlsZU1hcHBpbmczMlcoRFdPUkQsQk9PTDMyLExQQ1dTVFIpOworI2RlZmluZSAgICBPcGVuRmlsZU1hcHBpbmcgV0lORUxJQl9OQU1FX0FXKE9wZW5GaWxlTWFwcGluZykKIERXT1JEICAgICAgUXVlcnlEb3NEZXZpY2UzMkEoTFBDU1RSLExQU1RSLERXT1JEKTsKIERXT1JEICAgICAgUXVlcnlEb3NEZXZpY2UzMlcoTFBDV1NUUixMUFdTVFIsRFdPUkQpOwogI2RlZmluZSAgICBRdWVyeURvc0RldmljZSBXSU5FTElCX05BTUVfQVcoUXVlcnlEb3NEZXZpY2UpCkBAIC00OTYyLDggKzUwOTEsMTUgQEAKIEJPT0wzMiAgICAgVGxzRnJlZShEV09SRCk7CiBMUFZPSUQgICAgIFRsc0dldFZhbHVlKERXT1JEKTsKIEJPT0wzMiAgICAgVGxzU2V0VmFsdWUoRFdPUkQsTFBWT0lEKTsKK0JPT0wzMiAgICAgVW5tYXBWaWV3T2ZGaWxlKExQVk9JRCk7CiBMUFZPSUQgICAgIFZpcnR1YWxBbGxvYyhMUFZPSUQsRFdPUkQsRFdPUkQsRFdPUkQpOwogQk9PTDMyICAgICBWaXJ0dWFsRnJlZShMUFZPSUQsRFdPUkQsRFdPUkQpOworQk9PTDMyICAgICBWaXJ0dWFsTG9jayhMUFZPSUQsRFdPUkQpOworQk9PTDMyICAgICBWaXJ0dWFsUHJvdGVjdChMUFZPSUQsRFdPUkQsRFdPUkQsTFBEV09SRCk7CitCT09MMzIgICAgIFZpcnR1YWxQcm90ZWN0RXgoSEFORExFMzIsTFBWT0lELERXT1JELERXT1JELExQRFdPUkQpOworQk9PTDMyICAgICBWaXJ0dWFsUXVlcnkoTFBDVk9JRCxMUE1FTU9SWV9CQVNJQ19JTkZPUk1BVElPTixEV09SRCk7CitCT09MMzIgICAgIFZpcnR1YWxRdWVyeUV4KEhBTkRMRTMyLExQQ1ZPSUQsTFBNRU1PUllfQkFTSUNfSU5GT1JNQVRJT04sRFdPUkQpOworQk9PTDMyICAgICBWaXJ0dWFsVW5sb2NrKExQVk9JRCxEV09SRCk7CiBCT09MMzIgICAgIFdyaXRlQ29uc29sZTMyQShIQU5ETEUzMixMUFZPSUQsRFdPUkQsTFBEV09SRCxMUFZPSUQpOwogQk9PTDMyICAgICBXcml0ZUNvbnNvbGUzMlcoSEFORExFMzIsTFBWT0lELERXT1JELExQRFdPUkQsTFBWT0lEKTsKICNkZWZpbmUgICAgV3JpdGVDb25zb2xlIFdJTkVMSUJfTkFNRV9BVyhXcml0ZUNvbnNvbGUpCkBAIC00OTczLDE1ICs1MTA5LDYgQEAKIC8qIERlY2xhcmF0aW9ucyBmb3IgZnVuY3Rpb25zIHRoYXQgYXJlIHRoZSBzYW1lIGluIFdpbjE2IGFuZCBXaW4zMiAqLwogCiBWT0lEICAgICAgIENsb3NlU291bmQoVk9JRCk7Ci1IQklUTUFQMTYgIENyZWF0ZUJpdG1hcChJTlQzMixJTlQzMixVSU5UMzIsVUlOVDMyLExQQ1ZPSUQpOwotQk9PTDE2ICAgICBDcmVhdGVDYXJldChIV05EMzIsSEJJVE1BUDMyLElOVDMyLElOVDMyKTsKLUhCSVRNQVAxNiAgQ3JlYXRlQ29tcGF0aWJsZUJpdG1hcChIREMzMixJTlQzMixJTlQzMik7Ci1IQklUTUFQMTYgIENyZWF0ZURpc2NhcmRhYmxlQml0bWFwKEhEQzMyLElOVDMyLElOVDMyKTsKLUJPT0wxNiAgICAgRGVzdHJveUNhcmV0KHZvaWQpOwotSU5UMTYgICAgICBFeGNsdWRlVXBkYXRlUmduKEhEQzMyLEhXTkQzMik7Ci1EV09SRCAgICAgIEdldEFwcENvbXBhdEZsYWdzKEhUQVNLMzIpOwotTE9ORyAgICAgICBHZXRCaXRtYXBCaXRzKEhCSVRNQVAzMixMT05HLExQVk9JRCk7Ci1XT1JEICAgICAgIEdldENsYXNzV29yZChIV05EMzIsSU5UMzIpOwogRFdPUkQgICAgICBHZXREaWFsb2dCYXNlVW5pdHModm9pZCk7CiBWT0lEICAgICAgIEdldEtleWJvYXJkU3RhdGUoTFBCWVRFKTsKIERXT1JEICAgICAgR2V0TGFzdEVycm9yKHZvaWQpOwpAQCAtNDk5MCwyOCArNTExNywxNyBAQAogRFdPUkQgICAgICBHZXRNZXNzYWdlUG9zKHZvaWQpOwogTE9ORyAgICAgICBHZXRNZXNzYWdlVGltZSh2b2lkKTsKIERXT1JEICAgICAgR2V0VGlja0NvdW50KHZvaWQpOwotSU5UMTYgICAgICBHZXRVcGRhdGVSZ24oSFdORDMyLEhSR04zMixCT09MMzIpOwotV09SRCAgICAgICBHZXRXaW5kb3dXb3JkKEhXTkQzMixJTlQzMik7CiBBVE9NICAgICAgIEdsb2JhbERlbGV0ZUF0b20oQVRPTSk7Ci1CT09MMTYgICAgIElzV2luZG93KEhXTkQzMik7CiBWT0lEICAgICAgIExaRG9uZSh2b2lkKTsKIERXT1JEICAgICAgT2VtS2V5U2NhbihXT1JEKTsKIERXT1JEICAgICAgUmVnQ2xvc2VLZXkoSEtFWSk7CiBEV09SRCAgICAgIFJlZ0ZsdXNoS2V5KEhLRVkpOwogVk9JRCAgICAgICBSZWxlYXNlQ2FwdHVyZSh2b2lkKTsKLUxPTkcgICAgICAgU2V0Qml0bWFwQml0cyhIQklUTUFQMzIsTE9ORyxMUENWT0lEKTsKLUNPTE9SUkVGICAgU2V0QmtDb2xvcihIREMzMixDT0xPUlJFRik7Ci1CT09MMTYgICAgIFNldENhcmV0QmxpbmtUaW1lKFVJTlQzMik7Ci1CT09MMTYgICAgIFNldENhcmV0UG9zKElOVDMyLElOVDMyKTsKLVdPUkQgICAgICAgU2V0Q2xhc3NXb3JkKEhXTkQzMixJTlQzMixXT1JEKTsKIFZPSUQgICAgICAgU2V0S2V5Ym9hcmRTdGF0ZShMUEJZVEUpOwogVk9JRCAgICAgICBTZXRMYXN0RXJyb3IoRFdPUkQpOwotVk9JRCAgICAgICBTZXRSZWN0UmduKEhSR04zMixJTlQzMixJTlQzMixJTlQzMixJTlQzMik7Ci1DT0xPUlJFRiAgIFNldFRleHRDb2xvcihIREMzMixDT0xPUlJFRik7Ci1XT1JEICAgICAgIFNldFdpbmRvd1dvcmQoSFdORDMyLElOVDMyLFdPUkQpOwotVk9JRCAgICAgICBVcGRhdGVXaW5kb3coSFdORDMyKTsKIFZPSUQgICAgICAgV2FpdE1lc3NhZ2UoVk9JRCk7CiAKKwogLyogRGVjbGFyYXRpb25zIGZvciBmdW5jdGlvbnMgdGhhdCBjaGFuZ2UgYmV0d2VlbiBXaW4xNiBhbmQgV2luMzIgKi8KIAogSU5UMTYgICAgICBBY2Nlc3NSZXNvdXJjZTE2KEhJTlNUQU5DRTE2LEhSU1JDMTYpOwpAQCAtNTAyMSw2ICs1MTM3LDEwIEBACiBBVE9NICAgICAgIEFkZEF0b20zMkEoTFBDU1RSKTsKIEFUT00gICAgICAgQWRkQXRvbTMyVyhMUENXU1RSKTsKICNkZWZpbmUgICAgQWRkQXRvbSBXSU5FTElCX05BTUVfQVcoQWRkQXRvbSkKK0lOVDE2ICAgICAgQWRkRm9udFJlc291cmNlMTYoTFBDU1RSKTsKK0lOVDMyICAgICAgQWRkRm9udFJlc291cmNlMzJBKExQQ1NUUik7CitJTlQzMiAgICAgIEFkZEZvbnRSZXNvdXJjZTMyVyhMUENXU1RSKTsKKyNkZWZpbmUgICAgQWRkRm9udFJlc291cmNlIFdJTkVMSUJfTkFNRV9BVyhBZGRGb250UmVzb3VyY2UpCiBCT09MMTYgICAgIEFkanVzdFdpbmRvd1JlY3QxNihMUFJFQ1QxNixEV09SRCxCT09MMTYpOwogQk9PTDMyICAgICBBZGp1c3RXaW5kb3dSZWN0MzIoTFBSRUNUMzIsRFdPUkQsQk9PTDMyKTsKICNkZWZpbmUgICAgQWRqdXN0V2luZG93UmVjdCBXSU5FTElCX05BTUUoQWRqdXN0V2luZG93UmVjdCkKQEAgLTUyMDcsMTIgKzUzMjcsMjEgQEAKIElOVDE2ICAgICAgQ291bnRWb2ljZU5vdGVzMTYoSU5UMTYpOwogRFdPUkQgICAgICBDb3VudFZvaWNlTm90ZXMzMihEV09SRCk7CiAjZGVmaW5lICAgIENvdW50Vm9pY2VOb3RlcyBXSU5FTElCX05BTUUoQ291bnRWb2ljZU5vdGVzKQorSEJJVE1BUDE2ICBDcmVhdGVCaXRtYXAxNihJTlQxNixJTlQxNixVSU5UMTYsVUlOVDE2LExQQ1ZPSUQpOworSEJJVE1BUDMyICBDcmVhdGVCaXRtYXAzMihJTlQzMixJTlQzMixVSU5UMzIsVUlOVDMyLExQQ1ZPSUQpOworI2RlZmluZSAgICBDcmVhdGVCaXRtYXAgV0lORUxJQl9OQU1FKENyZWF0ZUJpdG1hcCkKIEhCSVRNQVAxNiAgQ3JlYXRlQml0bWFwSW5kaXJlY3QxNihjb25zdCBCSVRNQVAxNiopOwogSEJJVE1BUDMyICBDcmVhdGVCaXRtYXBJbmRpcmVjdDMyKGNvbnN0IEJJVE1BUDMyKik7CiAjZGVmaW5lICAgIENyZWF0ZUJpdG1hcEluZGlyZWN0IFdJTkVMSUJfTkFNRShDcmVhdGVCaXRtYXBJbmRpcmVjdCkKIEhCUlVTSDE2ICAgQ3JlYXRlQnJ1c2hJbmRpcmVjdDE2KGNvbnN0IExPR0JSVVNIMTYqKTsKIEhCUlVTSDMyICAgQ3JlYXRlQnJ1c2hJbmRpcmVjdDMyKGNvbnN0IExPR0JSVVNIMzIqKTsKICNkZWZpbmUgICAgQ3JlYXRlQnJ1c2hJbmRpcmVjdCBXSU5FTElCX05BTUUoQ3JlYXRlQnJ1c2hJbmRpcmVjdCkKK1ZPSUQgICAgICAgQ3JlYXRlQ2FyZXQxNihIV05EMTYsSEJJVE1BUDE2LElOVDE2LElOVDE2KTsKK0JPT0wzMiAgICAgQ3JlYXRlQ2FyZXQzMihIV05EMzIsSEJJVE1BUDMyLElOVDMyLElOVDMyKTsKKyNkZWZpbmUgICAgQ3JlYXRlQ2FyZXQgV0lORUxJQl9OQU1FKENyZWF0ZUNhcmV0KQorSEJJVE1BUDE2ICBDcmVhdGVDb21wYXRpYmxlQml0bWFwMTYoSERDMTYsSU5UMTYsSU5UMTYpOworSEJJVE1BUDMyICBDcmVhdGVDb21wYXRpYmxlQml0bWFwMzIoSERDMzIsSU5UMzIsSU5UMzIpOworI2RlZmluZSAgICBDcmVhdGVDb21wYXRpYmxlQml0bWFwIFdJTkVMSUJfTkFNRShDcmVhdGVDb21wYXRpYmxlQml0bWFwKQogSERDMTYgICAgICBDcmVhdGVDb21wYXRpYmxlREMxNihIREMxNik7CiBIREMzMiAgICAgIENyZWF0ZUNvbXBhdGlibGVEQzMyKEhEQzMyKTsKICNkZWZpbmUgICAgQ3JlYXRlQ29tcGF0aWJsZURDIFdJTkVMSUJfTkFNRShDcmVhdGVDb21wYXRpYmxlREMpCkBAIC01MjU4LDYgKzUzODcsOSBAQAogQk9PTDMyICAgICBDcmVhdGVEaXJlY3RvcnlFeDMyQShMUENTVFIsTFBDU1RSLExQU0VDVVJJVFlfQVRUUklCVVRFUyk7CiBCT09MMzIgICAgIENyZWF0ZURpcmVjdG9yeUV4MzJXKExQQ1dTVFIsTFBDV1NUUixMUFNFQ1VSSVRZX0FUVFJJQlVURVMpOwogI2RlZmluZSAgICBDcmVhdGVEaXJlY3RvcnlFeCBXSU5FTElCX05BTUVfQVcoQ3JlYXRlRGlyZWN0b3J5RXgpCitIQklUTUFQMTYgIENyZWF0ZURpc2NhcmRhYmxlQml0bWFwMTYoSERDMTYsSU5UMTYsSU5UMTYpOworSEJJVE1BUDMyICBDcmVhdGVEaXNjYXJkYWJsZUJpdG1hcDMyKEhEQzMyLElOVDMyLElOVDMyKTsKKyNkZWZpbmUgICAgQ3JlYXRlRGlzY2FyZGFibGVCaXRtYXAgV0lORUxJQl9OQU1FKENyZWF0ZURpc2NhcmRhYmxlQml0bWFwKQogSFJHTjE2ICAgICBDcmVhdGVFbGxpcHRpY1JnbjE2KElOVDE2LElOVDE2LElOVDE2LElOVDE2KTsKIEhSR04zMiAgICAgQ3JlYXRlRWxsaXB0aWNSZ24zMihJTlQzMixJTlQzMixJTlQzMixJTlQzMik7CiAjZGVmaW5lICAgIENyZWF0ZUVsbGlwdGljUmduIFdJTkVMSUJfTkFNRShDcmVhdGVFbGxpcHRpY1JnbikKQEAgLTUzMTksNiArNTQ1MSwxMCBAQAogSFJHTjE2ICAgICBDcmVhdGVSb3VuZFJlY3RSZ24xNihJTlQxNixJTlQxNixJTlQxNixJTlQxNixJTlQxNixJTlQxNik7CiBIUkdOMzIgICAgIENyZWF0ZVJvdW5kUmVjdFJnbjMyKElOVDMyLElOVDMyLElOVDMyLElOVDMyLElOVDMyLElOVDMyKTsKICNkZWZpbmUgICAgQ3JlYXRlUm91bmRSZWN0UmduIFdJTkVMSUJfTkFNRShDcmVhdGVSb3VuZFJlY3RSZ24pCitCT09MMTYgICAgIENyZWF0ZVNjYWxhYmxlRm9udFJlc291cmNlMTYoVUlOVDE2LExQQ1NUUixMUENTVFIsTFBDU1RSKTsKK0JPT0wzMiAgICAgQ3JlYXRlU2NhbGFibGVGb250UmVzb3VyY2UzMkEoRFdPUkQsTFBDU1RSLExQQ1NUUixMUENTVFIpOworQk9PTDMyICAgICBDcmVhdGVTY2FsYWJsZUZvbnRSZXNvdXJjZTMyVyhEV09SRCxMUENXU1RSLExQQ1dTVFIsTFBDV1NUUik7CisjZGVmaW5lICAgIENyZWF0ZVNjYWxhYmxlRm9udFJlc291cmNlIFdJTkVMSUJfTkFNRV9BVyhDcmVhdGVTY2FsYWJsZUZvbnRSZXNvdXJjZSkKIEhCUlVTSDE2ICAgQ3JlYXRlU29saWRCcnVzaDE2KENPTE9SUkVGKTsKIEhCUlVTSDMyICAgQ3JlYXRlU29saWRCcnVzaDMyKENPTE9SUkVGKTsKICNkZWZpbmUgICAgQ3JlYXRlU29saWRCcnVzaCBXSU5FTElCX05BTUUoQ3JlYXRlU29saWRCcnVzaCkKQEAgLTUzNzgsNiArNTUxNCw5IEBACiBCT09MMTYgICAgIERlbGV0ZU9iamVjdDE2KEhHRElPQkoxNik7CiBCT09MMzIgICAgIERlbGV0ZU9iamVjdDMyKEhHRElPQkozMik7CiAjZGVmaW5lICAgIERlbGV0ZU9iamVjdCBXSU5FTElCX05BTUUoRGVsZXRlT2JqZWN0KQorVk9JRCAgICAgICBEZXN0cm95Q2FyZXQxNih2b2lkKTsKK0JPT0wzMiAgICAgRGVzdHJveUNhcmV0MzIodm9pZCk7CisjZGVmaW5lICAgIERlc3Ryb3lDYXJldCBXSU5FTElCX05BTUUoRGVzdHJveUNhcmV0KQogQk9PTDE2ICAgICBEZXN0cm95Q3Vyc29yMTYoSENVUlNPUjE2KTsKIEJPT0wzMiAgICAgRGVzdHJveUN1cnNvcjMyKEhDVVJTT1IzMik7CiAjZGVmaW5lICAgIERlc3Ryb3lDdXJzb3IgV0lORUxJQl9OQU1FKERlc3Ryb3lDdXJzb3IpCkBAIC01NDM2LDYgKzU1NzUsOSBAQAogQk9PTDE2ICAgICBEcmFnRGV0ZWN0MTYoSFdORDE2LFBPSU5UMTYpOwogQk9PTDMyICAgICBEcmFnRGV0ZWN0MzIoSFdORDMyLFBPSU5UMzIpOwogI2RlZmluZSAgICBEcmFnRGV0ZWN0IFdJTkVMSUJfTkFNRShEcmFnRGV0ZWN0KQorRFdPUkQgICAgICBEcmFnT2JqZWN0MTYoSFdORDE2LEhXTkQxNixVSU5UMTYsSEFORExFMTYsV09SRCxIQ1VSU09SMTYpOworRFdPUkQgICAgICBEcmFnT2JqZWN0MzIoSFdORDMyLEhXTkQzMixVSU5UMzIsRFdPUkQsSENVUlNPUjMyKTsKKyNkZWZpbmUgICAgRHJhZ09iamVjdCBXSU5FTElCX05BTUUoRHJhZ09iamVjdCkKIEJPT0wxNiAgICAgRHJhd0VkZ2UxNihIREMxNixMUFJFQ1QxNixVSU5UMTYsVUlOVDE2KTsKIEJPT0wzMiAgICAgRHJhd0VkZ2UzMihIREMzMixMUFJFQ1QzMixVSU5UMzIsVUlOVDMyKTsKICNkZWZpbmUgICAgRHJhd0VkZ2UgV0lORUxJQl9OQU1FKERyYXdFZGdlKQpAQCAtNTQ5Nyw2ICs1NjM5LDkgQEAKIElOVDMyICAgICAgRW51bUZvbnRzMzJBKEhEQzMyLExQQ1NUUixGT05URU5VTVBST0MzMkEsTFBBUkFNKTsKIElOVDMyICAgICAgRW51bUZvbnRzMzJXKEhEQzMyLExQQ1dTVFIsRk9OVEVOVU1QUk9DMzJXLExQQVJBTSk7CiAjZGVmaW5lICAgIEVudW1Gb250cyBXSU5FTElCX05BTUVfQVcoRW51bUZvbnRzKQorQk9PTDE2ICAgICBFbnVtTWV0YUZpbGUxNihIREMxNixITUVUQUZJTEUxNixNRkVOVU1QUk9DMTYsTFBBUkFNKTsKK0JPT0wzMiAgICAgRW51bU1ldGFGaWxlMzIoSERDMzIsSE1FVEFGSUxFMzIsTUZFTlVNUFJPQzMyLExQQVJBTSk7CisjZGVmaW5lICAgIEVudW1NZXRhRmlsZSBXSU5FTElCX05BTUUoRW51bU1ldGFGaWxlKQogSU5UMTYgICAgICBFbnVtT2JqZWN0czE2KEhEQzE2LElOVDE2LEdPQkpFTlVNUFJPQzE2LExQQVJBTSk7CiBJTlQzMiAgICAgIEVudW1PYmplY3RzMzIoSERDMzIsSU5UMzIsR09CSkVOVU1QUk9DMzIsTFBBUkFNKTsKICNkZWZpbmUgICAgRW51bU9iamVjdHMgV0lORUxJQl9OQU1FKEVudW1PYmplY3RzKQpAQCAtNTUyNiwxMiArNTY3MSwxOSBAQAogSU5UMTYgICAgICBFeGNsdWRlQ2xpcFJlY3QxNihIREMxNixJTlQxNixJTlQxNixJTlQxNixJTlQxNik7CiBJTlQzMiAgICAgIEV4Y2x1ZGVDbGlwUmVjdDMyKEhEQzMyLElOVDMyLElOVDMyLElOVDMyLElOVDMyKTsKICNkZWZpbmUgICAgRXhjbHVkZUNsaXBSZWN0IFdJTkVMSUJfTkFNRShFeGNsdWRlQ2xpcFJlY3QpCitJTlQxNiAgICAgIEV4Y2x1ZGVVcGRhdGVSZ24xNihIREMxNixIV05EMTYpOworSU5UMzIgICAgICBFeGNsdWRlVXBkYXRlUmduMzIoSERDMzIsSFdORDMyKTsKKyNkZWZpbmUgICAgRXhjbHVkZVVwZGF0ZVJnbiBXSU5FTElCX05BTUUoRXhjbHVkZVVwZGF0ZVJnbikKIEJPT0wxNiAgICAgRXhpdFdpbmRvd3MxNihEV09SRCxVSU5UMTYpOwogI2RlZmluZSAgICBFeGl0V2luZG93czMyKGEsYikgRXhpdFdpbmRvd3NFeChFV1hfTE9HT0ZGLDB4ZmZmZmZmZmYpCiAjZGVmaW5lICAgIEV4aXRXaW5kb3dzIFdJTkVMSUJfTkFNRShFeGl0V2luZG93cykKIEJPT0wxNiAgICAgRXh0Rmxvb2RGaWxsMTYoSERDMTYsSU5UMTYsSU5UMTYsQ09MT1JSRUYsVUlOVDE2KTsKIEJPT0wzMiAgICAgRXh0Rmxvb2RGaWxsMzIoSERDMzIsSU5UMzIsSU5UMzIsQ09MT1JSRUYsVUlOVDMyKTsKICNkZWZpbmUgICAgRXh0Rmxvb2RGaWxsIFdJTkVMSUJfTkFNRShFeHRGbG9vZEZpbGwpCitISUNPTjE2ICAgIEV4dHJhY3RJY29uMTYoSElOU1RBTkNFMTYsTFBDU1RSLFVJTlQxNik7CitISUNPTjMyICAgIEV4dHJhY3RJY29uMzJBKEhJTlNUQU5DRTMyLExQQ1NUUixVSU5UMzIpOworSElDT04zMiAgICBFeHRyYWN0SWNvbjMyVyhISU5TVEFOQ0UzMixMUENXU1RSLFVJTlQzMik7CisjZGVmaW5lICAgIEV4dHJhY3RJY29uIFdJTkVMSUJfTkFNRV9BVyhFeHRyYWN0SWNvbikKIEJPT0wxNiAgICAgRXh0VGV4dE91dDE2KEhEQzE2LElOVDE2LElOVDE2LFVJTlQxNixjb25zdCBSRUNUMTYqLExQQ1NUUixVSU5UMTYsY29uc3QgSU5UMTYqKTsKIEJPT0wzMiAgICAgRXh0VGV4dE91dDMyQShIREMzMixJTlQzMixJTlQzMixVSU5UMzIsY29uc3QgUkVDVDMyKixMUENTVFIsVUlOVDMyLGNvbnN0IElOVDMyKik7CiBCT09MMzIgICAgIEV4dFRleHRPdXQzMlcoSERDMzIsSU5UMzIsSU5UMzIsVUlOVDMyLGNvbnN0IFJFQ1QzMiosTFBDV1NUUixVSU5UMzIsY29uc3QgSU5UMzIqKTsKQEAgLTU1NTMsNiArNTcwNSwxMCBAQAogQk9PTDE2ICAgICBGaW5kQ2xvc2UxNihIQU5ETEUxNik7CiBCT09MMzIgICAgIEZpbmRDbG9zZTMyKEhBTkRMRTMyKTsKICNkZWZpbmUgICAgRmluZENsb3NlIFdJTkVMSUJfTkFNRShGaW5kQ2xvc2UpCitISU5TVEFOQ0UxNiBGaW5kRXhlY3V0YWJsZTE2KExQQ1NUUixMUENTVFIsTFBTVFIpOworSElOU1RBTkNFMzIgRmluZEV4ZWN1dGFibGUzMkEoTFBDU1RSLExQQ1NUUixMUFNUUik7CitISU5TVEFOQ0UzMiBGaW5kRXhlY3V0YWJsZTMyVyhMUENXU1RSLExQQ1dTVFIsTFBXU1RSKTsKKyNkZWZpbmUgICAgRmluZEV4ZWN1dGFibGUgV0lORUxJQl9OQU1FX0FXKEZpbmRFeGVjdXRhYmxlKQogSEFORExFMTYgICBGaW5kRmlyc3RGaWxlMTYoTFBDU1RSLExQV0lOMzJfRklORF9EQVRBMzJBKTsKIEhBTkRMRTMyICAgRmluZEZpcnN0RmlsZTMyQShMUENTVFIsTFBXSU4zMl9GSU5EX0RBVEEzMkEpOwogSEFORExFMzIgICBGaW5kRmlyc3RGaWxlMzJXKExQQ1dTVFIsTFBXSU4zMl9GSU5EX0RBVEEzMlcpOwpAQCAtNTU4NSw2ICs1NzQxLDkgQEAKIEJPT0wxNiAgICAgRnJhbWVSZ24xNihIREMxNixIUkdOMTYsSEJSVVNIMTYsSU5UMTYsSU5UMTYpOwogQk9PTDMyICAgICBGcmFtZVJnbjMyKEhEQzMyLEhSR04zMixIQlJVU0gzMixJTlQzMixJTlQzMik7CiAjZGVmaW5lICAgIEZyYW1lUmduIFdJTkVMSUJfTkFNRShGcmFtZVJnbikKK1ZPSUQgICAgICAgRnJlZUxpYnJhcnkxNihISU5TVEFOQ0UxNik7CitCT09MMzIgICAgIEZyZWVMaWJyYXJ5MzIoSE1PRFVMRTMyKTsKKyNkZWZpbmUgICAgRnJlZUxpYnJhcnkgV0lORUxJQl9OQU1FKEZyZWVMaWJyYXJ5KQogQk9PTDE2ICAgICBGcmVlTW9kdWxlMTYoSE1PRFVMRTE2KTsKICNkZWZpbmUgICAgRnJlZU1vZHVsZTMyKGhhbmRsZSkgRnJlZUxpYnJhcnkzMihoYW5kbGUpCiAjZGVmaW5lICAgIEZyZWVNb2R1bGUgV0lORUxJQl9OQU1FKEZyZWVNb2R1bGUpCkBAIC01NTk3LDYgKzU3NTYsOSBAQAogSFdORDE2ICAgICBHZXRBY3RpdmVXaW5kb3cxNih2b2lkKTsKIEhXTkQzMiAgICAgR2V0QWN0aXZlV2luZG93MzIodm9pZCk7CiAjZGVmaW5lICAgIEdldEFjdGl2ZVdpbmRvdyBXSU5FTElCX05BTUUoR2V0QWN0aXZlV2luZG93KQorRFdPUkQgICAgICBHZXRBcHBDb21wYXRGbGFnczE2KEhUQVNLMTYpOworRFdPUkQgICAgICBHZXRBcHBDb21wYXRGbGFnczMyKEhUQVNLMzIpOworI2RlZmluZSAgICBHZXRBcHBDb21wYXRGbGFncyBXSU5FTElCX05BTUUoR2V0QXBwQ29tcGF0RmxhZ3MpCiBXT1JEICAgICAgIEdldEFzeW5jS2V5U3RhdGUxNihJTlQxNik7CiBXT1JEICAgICAgIEdldEFzeW5jS2V5U3RhdGUzMihJTlQzMik7CiAjZGVmaW5lICAgIEdldEFzeW5jS2V5U3RhdGUgV0lORUxJQl9OQU1FKEdldEFzeW5jS2V5U3RhdGUpCkBAIC01NjA0LDYgKzU3NjYsOSBAQAogVUlOVDMyICAgICBHZXRBdG9tTmFtZTMyQShBVE9NLExQU1RSLElOVDMyKTsKIFVJTlQzMiAgICAgR2V0QXRvbU5hbWUzMlcoQVRPTSxMUFdTVFIsSU5UMzIpOwogI2RlZmluZSAgICBHZXRBdG9tTmFtZSBXSU5FTElCX05BTUVfQVcoR2V0QXRvbU5hbWUpCitMT05HICAgICAgIEdldEJpdG1hcEJpdHMxNihIQklUTUFQMTYsTE9ORyxMUFZPSUQpOworTE9ORyAgICAgICBHZXRCaXRtYXBCaXRzMzIoSEJJVE1BUDMyLExPTkcsTFBWT0lEKTsKKyNkZWZpbmUgICAgR2V0Qml0bWFwQml0cyBXSU5FTElCX05BTUUoR2V0Qml0bWFwQml0cykKIEJPT0wxNiAgICAgR2V0Qml0bWFwRGltZW5zaW9uRXgxNihIQklUTUFQMTYsTFBTSVpFMTYpOwogQk9PTDMyICAgICBHZXRCaXRtYXBEaW1lbnNpb25FeDMyKEhCSVRNQVAzMixMUFNJWkUzMik7CiAjZGVmaW5lICAgIEdldEJpdG1hcERpbWVuc2lvbkV4IFdJTkVMSUJfTkFNRShHZXRCaXRtYXBEaW1lbnNpb25FeCkKQEAgLTU2NDksOSArNTgxNCwxOSBAQAogSU5UMzIgICAgICBHZXRDbGFzc05hbWUzMkEoSFdORDMyLExQU1RSLElOVDMyKTsKIElOVDMyICAgICAgR2V0Q2xhc3NOYW1lMzJXKEhXTkQzMixMUFdTVFIsSU5UMzIpOwogI2RlZmluZSAgICBHZXRDbGFzc05hbWUgV0lORUxJQl9OQU1FX0FXKEdldENsYXNzTmFtZSkKK1dPUkQgICAgICAgR2V0Q2xhc3NXb3JkMTYoSFdORDE2LElOVDE2KTsKK1dPUkQgICAgICAgR2V0Q2xhc3NXb3JkMzIoSFdORDMyLElOVDMyKTsKKyNkZWZpbmUgICAgR2V0Q2xhc3NXb3JkIFdJTkVMSUJfTkFNRShHZXRDbGFzc1dvcmQpCiB2b2lkICAgICAgIEdldENsaWVudFJlY3QxNihIV05EMTYsTFBSRUNUMTYpOwogdm9pZCAgICAgICBHZXRDbGllbnRSZWN0MzIoSFdORDMyLExQUkVDVDMyKTsKICNkZWZpbmUgICAgR2V0Q2xpZW50UmVjdCBXSU5FTElCX05BTUUoR2V0Q2xpZW50UmVjdCkKK0hBTkRMRTE2ICAgR2V0Q2xpcGJvYXJkRGF0YTE2KFVJTlQxNik7CitIQU5ETEUzMiAgIEdldENsaXBib2FyZERhdGEzMihVSU5UMzIpOworI2RlZmluZSAgICBHZXRDbGlwYm9hcmREYXRhIFdJTkVMSUJfTkFNRShHZXRDbGlwYm9hcmREYXRhKQorSU5UMTYgICAgICBHZXRDbGlwYm9hcmRGb3JtYXROYW1lMTYoVUlOVDE2LExQU1RSLElOVDE2KTsKK0lOVDMyICAgICAgR2V0Q2xpcGJvYXJkRm9ybWF0TmFtZTMyQShVSU5UMzIsTFBTVFIsSU5UMzIpOworSU5UMzIgICAgICBHZXRDbGlwYm9hcmRGb3JtYXROYW1lMzJXKFVJTlQzMixMUFdTVFIsSU5UMzIpOworI2RlZmluZSAgICBHZXRDbGlwYm9hcmRGb3JtYXROYW1lIFdJTkVMSUJfTkFNRV9BVyhHZXRDbGlwYm9hcmRGb3JtYXROYW1lKQogSFdORDE2ICAgICBHZXRDbGlwYm9hcmRPd25lcjE2KHZvaWQpOwogSFdORDMyICAgICBHZXRDbGlwYm9hcmRPd25lcjMyKHZvaWQpOwogI2RlZmluZSAgICBHZXRDbGlwYm9hcmRPd25lciBXSU5FTElCX05BTUUoR2V0Q2xpcGJvYXJkT3duZXIpCkBAIC01NzQ3LDYgKzU5MjIsMTAgQEAKIERXT1JEICAgICAgR2V0RnJlZVNwYWNlMTYoVUlOVDE2KTsKICNkZWZpbmUgICAgR2V0RnJlZVNwYWNlMzIodykgKDB4MTAwMDAwTCkKICNkZWZpbmUgICAgR2V0RnJlZVNwYWNlIFdJTkVMSUJfTkFNRShHZXRGcmVlU3BhY2UpCitEV09SRCAgICAgIEdldEdseXBoT3V0TGluZTE2KEhEQzE2LFVJTlQxNixVSU5UMTYsTFBHTFlQSE1FVFJJQ1MxNixEV09SRCxMUFZPSUQsY29uc3QgTUFUMiopOworRFdPUkQgICAgICBHZXRHbHlwaE91dExpbmUzMkEoSERDMzIsVUlOVDMyLFVJTlQzMixMUEdMWVBITUVUUklDUzMyLERXT1JELExQVk9JRCxjb25zdCBNQVQyKik7CitEV09SRCAgICAgIEdldEdseXBoT3V0TGluZTMyVyhIREMzMixVSU5UMzIsVUlOVDMyLExQR0xZUEhNRVRSSUNTMzIsRFdPUkQsTFBWT0lELGNvbnN0IE1BVDIqKTsKKyNkZWZpbmUgICAgR2V0R2x5cGhPdXRMaW5lIFdJTkVMSUJfTkFNRV9BVyhHZXRHbHlwaE91dExpbmUpCiBCT09MMTYgICAgIEdldElucHV0U3RhdGUxNih2b2lkKTsKIEJPT0wzMiAgICAgR2V0SW5wdXRTdGF0ZTMyKHZvaWQpOwogI2RlZmluZSAgICBHZXRJbnB1dFN0YXRlIFdJTkVMSUJfTkFNRShHZXRJbnB1dFN0YXRlKQpAQCAtNTc1Niw2ICs1OTM1LDEwIEBACiBJTlQxNiAgICAgIEdldEtCQ29kZVBhZ2UxNih2b2lkKTsKIFVJTlQzMiAgICAgR2V0S0JDb2RlUGFnZTMyKHZvaWQpOwogI2RlZmluZSAgICBHZXRLQkNvZGVQYWdlIFdJTkVMSUJfTkFNRShHZXRLQkNvZGVQYWdlKQorSU5UMTYgICAgICBHZXRLZXJuaW5nUGFpcnMxNihIREMxNixJTlQxNixMUEtFUk5JTkdQQUlSMTYpOworRFdPUkQgICAgICBHZXRLZXJuaW5nUGFpcnMzMkEoSERDMzIsRFdPUkQsTFBLRVJOSU5HUEFJUjMyKTsKK0RXT1JEICAgICAgR2V0S2VybmluZ1BhaXJzMzJXKEhEQzMyLERXT1JELExQS0VSTklOR1BBSVIzMik7CisjZGVmaW5lICAgIEdldEtlcm5pbmdQYWlycyBXSU5FTElCX05BTUVfQVcoR2V0S2VybmluZ1BhaXJzKQogSU5UMTYgICAgICBHZXRLZXlib2FyZFR5cGUxNihJTlQxNik7CiBJTlQzMiAgICAgIEdldEtleWJvYXJkVHlwZTMyKElOVDMyKTsKICNkZWZpbmUgICAgR2V0S2V5Ym9hcmRUeXBlIFdJTkVMSUJfTkFNRShHZXRLZXlib2FyZFR5cGUpCkBAIC01NzkxLDYgKzU5NzQsMTAgQEAKIElOVDMyICAgICAgR2V0TWVudVN0cmluZzMyQShITUVOVTMyLFVJTlQzMixMUFNUUixJTlQzMixVSU5UMzIpOwogSU5UMzIgICAgICBHZXRNZW51U3RyaW5nMzJXKEhNRU5VMzIsVUlOVDMyLExQV1NUUixJTlQzMixVSU5UMzIpOwogI2RlZmluZSAgICBHZXRNZW51U3RyaW5nIFdJTkVMSUJfTkFNRV9BVyhHZXRNZW51U3RyaW5nKQorQk9PTDE2ICAgICBHZXRNZXNzYWdlMTYoU0VHUFRSLEhXTkQxNixVSU5UMTYsVUlOVDE2KTsKK0JPT0wzMiAgICAgR2V0TWVzc2FnZTMyQShMUE1TRzMyLEhXTkQzMixVSU5UMzIsVUlOVDMyKTsKK0JPT0wzMiAgICAgR2V0TWVzc2FnZTMyVyhMUE1TRzMyLEhXTkQzMixVSU5UMzIsVUlOVDMyKTsKKyNkZWZpbmUgICAgR2V0TWVzc2FnZSBXSU5FTElCX05BTUVfQVcoR2V0TWVzc2FnZSkKIEhNRVRBRklMRTE2IEdldE1ldGFGaWxlMTYoTFBDU1RSKTsKIEhNRVRBRklMRTMyIEdldE1ldGFGaWxlMzJBKExQQ1NUUik7CiBITUVUQUZJTEUzMiBHZXRNZXRhRmlsZTMyVyhMUENXU1RSKTsKQEAgLTU3OTksNiArNTk4NiwxMCBAQAogRFdPUkQgICAgICBHZXRNb2R1bGVGaWxlTmFtZTMyQShITU9EVUxFMzIsTFBTVFIsRFdPUkQpOwogRFdPUkQgICAgICBHZXRNb2R1bGVGaWxlTmFtZTMyVyhITU9EVUxFMzIsTFBXU1RSLERXT1JEKTsKICNkZWZpbmUgICAgR2V0TW9kdWxlRmlsZU5hbWUgV0lORUxJQl9OQU1FX0FXKEdldE1vZHVsZUZpbGVOYW1lKQorSE1PRFVMRTE2ICBHZXRNb2R1bGVIYW5kbGUxNihMUENTVFIpOworSE1PRFVMRTMyICBHZXRNb2R1bGVIYW5kbGUzMkEoTFBDU1RSKTsKK0hNT0RVTEUzMiAgR2V0TW9kdWxlSGFuZGxlMzJXKExQQ1NUUik7CisjZGVmaW5lICAgIEdldE1vZHVsZUhhbmRsZSBXSU5FTElCX05BTUVfQVcoR2V0TW9kdWxlSGFuZGxlKQogRFdPUkQgICAgICBHZXROZWFyZXN0Q29sb3IxNihIREMxNixEV09SRCk7CiBEV09SRCAgICAgIEdldE5lYXJlc3RDb2xvcjMyKEhEQzMyLERXT1JEKTsKICNkZWZpbmUgICAgR2V0TmVhcmVzdENvbG9yIFdJTkVMSUJfTkFNRShHZXROZWFyZXN0Q29sb3IpCkBAIC01ODMzLDYgKzYwMjQsOSBAQAogSU5UMTYgICAgICBHZXRQb2x5RmlsbE1vZGUxNihIREMxNik7CiBJTlQzMiAgICAgIEdldFBvbHlGaWxsTW9kZTMyKEhEQzMyKTsKICNkZWZpbmUgICAgR2V0UG9seUZpbGxNb2RlIFdJTkVMSUJfTkFNRShHZXRQb2x5RmlsbE1vZGUpCitJTlQxNiAgICAgIEdldFByaW9yaXR5Q2xpcGJvYXJkRm9ybWF0MTYoVUlOVDE2KixJTlQxNik7CitJTlQzMiAgICAgIEdldFByaW9yaXR5Q2xpcGJvYXJkRm9ybWF0MzIoVUlOVDMyKixJTlQzMik7CisjZGVmaW5lICAgIEdldFByaW9yaXR5Q2xpcGJvYXJkRm9ybWF0IFdJTkVMSUJfTkFNRShHZXRQcmlvcml0eUNsaXBib2FyZEZvcm1hdCkKIFVJTlQxNiAgICAgR2V0UHJpdmF0ZVByb2ZpbGVJbnQxNihMUENTVFIsTFBDU1RSLElOVDE2LExQQ1NUUik7CiBVSU5UMzIgICAgIEdldFByaXZhdGVQcm9maWxlSW50MzJBKExQQ1NUUixMUENTVFIsSU5UMzIsTFBDU1RSKTsKIFVJTlQzMiAgICAgR2V0UHJpdmF0ZVByb2ZpbGVJbnQzMlcoTFBDV1NUUixMUENXU1RSLElOVDMyLExQQ1dTVFIpOwpAQCAtNTg1Niw2ICs2MDUwLDEyIEBACiBIQU5ETEUzMiAgIEdldFByb3AzMkEoSFdORDMyLExQQ1NUUik7CiBIQU5ETEUzMiAgIEdldFByb3AzMlcoSFdORDMyLExQQ1dTVFIpOwogI2RlZmluZSAgICBHZXRQcm9wIFdJTkVMSUJfTkFNRV9BVyhHZXRQcm9wKQorRFdPUkQgICAgICBHZXRRdWV1ZVN0YXR1czE2KFVJTlQxNik7CitEV09SRCAgICAgIEdldFF1ZXVlU3RhdHVzMzIoVUlOVDMyKTsKKyNkZWZpbmUgICAgR2V0UXVldWVTdGF0dXMgV0lORUxJQl9OQU1FKEdldFF1ZXVlU3RhdHVzKQorQk9PTDE2ICAgICBHZXRSYXN0ZXJpemVyQ2FwczE2KExQUkFTVEVSSVpFUl9TVEFUVVMsVUlOVDE2KTsKK0JPT0wzMiAgICAgR2V0UmFzdGVyaXplckNhcHMzMihMUFJBU1RFUklaRVJfU1RBVFVTLFVJTlQzMik7CisjZGVmaW5lICAgIEdldFJhc3Rlcml6ZXJDYXBzIFdJTkVMSUJfTkFNRShHZXRSYXN0ZXJpemVyQ2FwcykKIElOVDE2ICAgICAgR2V0UmVsQWJzMTYoSERDMTYpOwogSU5UMzIgICAgICBHZXRSZWxBYnMzMihIREMzMik7CiAjZGVmaW5lICAgIEdldFJlbEFicyBXSU5FTElCX05BTUUoR2V0UmVsQWJzKQpAQCAtNTg4MCw2ICs2MDgwLDEwIEBACiBJTlQxNiAgICAgIEdldFN0cmV0Y2hCbHRNb2RlMTYoSERDMTYpOwogSU5UMzIgICAgICBHZXRTdHJldGNoQmx0TW9kZTMyKEhEQzMyKTsKICNkZWZpbmUgICAgR2V0U3RyZXRjaEJsdE1vZGUgV0lORUxJQl9OQU1FKEdldFN0cmV0Y2hCbHRNb2RlKQorQk9PTDE2ICAgICBHZXRTdHJpbmdUeXBlMTYoTENJRCxEV09SRCxMUENTVFIsSU5UMTYsTFBXT1JEKTsKK0JPT0wzMiAgICAgR2V0U3RyaW5nVHlwZTMyQShMQ0lELERXT1JELExQQ1NUUixJTlQzMixMUFdPUkQpOworQk9PTDMyICAgICBHZXRTdHJpbmdUeXBlMzJXKERXT1JELExQQ1dTVFIsSU5UMzIsTFBXT1JEKTsKKyNkZWZpbmUgICAgR2V0U3RyaW5nVHlwZSBXSU5FTElCX05BTUVfQVcoR2V0U3RyaW5nVHlwZSkKIEhNRU5VMTYgICAgR2V0U3ViTWVudTE2KEhNRU5VMTYsSU5UMTYpOwogSE1FTlUzMiAgICBHZXRTdWJNZW51MzIoSE1FTlUzMixJTlQzMik7CiAjZGVmaW5lICAgIEdldFN1Yk1lbnUgV0lORUxJQl9OQU1FKEdldFN1Yk1lbnUpCkBAIC01OTUyLDYgKzYxNTYsOSBAQAogQk9PTDE2ICAgICBHZXRVcGRhdGVSZWN0MTYoSFdORDE2LExQUkVDVDE2LEJPT0wxNik7CiBCT09MMzIgICAgIEdldFVwZGF0ZVJlY3QzMihIV05EMzIsTFBSRUNUMzIsQk9PTDMyKTsKICNkZWZpbmUgICAgR2V0VXBkYXRlUmVjdCBXSU5FTElCX05BTUUoR2V0VXBkYXRlUmVjdCkKK0lOVDE2ICAgICAgR2V0VXBkYXRlUmduMTYoSFdORDE2LEhSR04xNixCT09MMTYpOworSU5UMzIgICAgICBHZXRVcGRhdGVSZ24zMihIV05EMzIsSFJHTjMyLEJPT0wzMik7CisjZGVmaW5lICAgIEdldFVwZGF0ZVJnbiBXSU5FTElCX05BTUUoR2V0VXBkYXRlUmduKQogTE9ORyAgICAgICBHZXRWZXJzaW9uMTYodm9pZCk7CiBMT05HICAgICAgIEdldFZlcnNpb24zMih2b2lkKTsKICNkZWZpbmUgICAgR2V0VmVyc2lvbiBXSU5FTElCX05BTUUoR2V0VmVyc2lvbikKQEAgLTYwMDEsNiArNjIwOCw5IEBACiBJTlQzMiAgICAgIEdldFdpbmRvd1RleHRMZW5ndGgzMkEoSFdORDMyKTsKIElOVDMyICAgICAgR2V0V2luZG93VGV4dExlbmd0aDMyVyhIV05EMzIpOwogI2RlZmluZSAgICBHZXRXaW5kb3dUZXh0TGVuZ3RoIFdJTkVMSUJfTkFNRV9BVyhHZXRXaW5kb3dUZXh0TGVuZ3RoKQorV09SRCAgICAgICBHZXRXaW5kb3dXb3JkMTYoSFdORDE2LElOVDE2KTsKK1dPUkQgICAgICAgR2V0V2luZG93V29yZDMyKEhXTkQzMixJTlQzMik7CisjZGVmaW5lICAgIEdldFdpbmRvd1dvcmQgV0lORUxJQl9OQU1FKEdldFdpbmRvd1dvcmQpCiBBVE9NICAgICAgIEdsb2JhbEFkZEF0b20xNihTRUdQVFIpOwogQVRPTSAgICAgICBHbG9iYWxBZGRBdG9tMzJBKExQQ1NUUik7CiBBVE9NICAgICAgIEdsb2JhbEFkZEF0b20zMlcoTFBDV1NUUik7CkBAIC02MDU5LDcgKzYyNjksNyBAQAogQk9PTDMyICAgICBHcmF5U3RyaW5nMzJXKEhEQzMyLEhCUlVTSDMyLEdSQVlTVFJJTkdQUk9DMzIsTFBBUkFNLAogICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyLElOVDMyLElOVDMyLElOVDMyLElOVDMyKTsKICNkZWZpbmUgICAgR3JheVN0cmluZyBXSU5FTElCX05BTUVfQVcoR3JheVN0cmluZykKLUJPT0wxNiAgICAgSGlkZUNhcmV0MTYoSFdORDE2KTsKK1ZPSUQgICAgICAgSGlkZUNhcmV0MTYoSFdORDE2KTsKIEJPT0wzMiAgICAgSGlkZUNhcmV0MzIoSFdORDMyKTsKICNkZWZpbmUgICAgSGlkZUNhcmV0IFdJTkVMSUJfTkFNRShIaWRlQ2FyZXQpCiBCT09MMTYgICAgIEhpbGl0ZU1lbnVJdGVtMTYoSFdORDE2LEhNRU5VMTYsVUlOVDE2LFVJTlQxNik7CkBAIC02MTAzLDcgKzYzMTMsNyBAQAogQk9PTDMyICAgICBJc0JhZEh1Z2VSZWFkUHRyMzIoTFBDVk9JRCxVSU5UMzIpOwogI2RlZmluZSAgICBJc0JhZEh1Z2VSZWFkUHRyIFdJTkVMSUJfTkFNRShJc0JhZEh1Z2VSZWFkUHRyKQogQk9PTDE2ICAgICBJc0JhZEh1Z2VXcml0ZVB0cjE2KFNFR1BUUixEV09SRCk7Ci1CT09MMzIgICAgIElzQmFkSHVnZVdyaXRlUHRyMzIoTFBDVk9JRCxVSU5UMzIpOworQk9PTDMyICAgICBJc0JhZEh1Z2VXcml0ZVB0cjMyKExQVk9JRCxVSU5UMzIpOwogI2RlZmluZSAgICBJc0JhZEh1Z2VXcml0ZVB0ciBXSU5FTElCX05BTUUoSXNCYWRIdWdlV3JpdGVQdHIpCiBCT09MMTYgICAgIElzQmFkUmVhZFB0cjE2KFNFR1BUUixVSU5UMTYpOwogQk9PTDMyICAgICBJc0JhZFJlYWRQdHIzMihMUENWT0lELFVJTlQzMik7CkBAIC02MTU2LDYgKzYzNjYsOSBAQAogQk9PTDE2ICAgICBJc1JlY3RFbXB0eTE2KGNvbnN0IFJFQ1QxNiopOwogQk9PTDMyICAgICBJc1JlY3RFbXB0eTMyKGNvbnN0IFJFQ1QzMiopOwogI2RlZmluZSAgICBJc1JlY3RFbXB0eSBXSU5FTElCX05BTUUoSXNSZWN0RW1wdHkpCitCT09MMTYgICAgIElzV2luZG93MTYoSFdORDE2KTsKK0JPT0wzMiAgICAgSXNXaW5kb3czMihIV05EMzIpOworI2RlZmluZSAgICBJc1dpbmRvdyBXSU5FTElCX05BTUUoSXNXaW5kb3cpCiBCT09MMTYgICAgIElzV2luZG93RW5hYmxlZDE2KEhXTkQxNik7CiBCT09MMzIgICAgIElzV2luZG93RW5hYmxlZDMyKEhXTkQzMik7CiAjZGVmaW5lICAgIElzV2luZG93RW5hYmxlZCBXSU5FTElCX05BTUUoSXNXaW5kb3dFbmFibGVkKQpAQCAtNjIxNSw2ICs2NDI4LDkgQEAKIEhNRU5VMzIgICAgTG9hZE1lbnVJbmRpcmVjdDMyQShMUENWT0lEKTsKIEhNRU5VMzIgICAgTG9hZE1lbnVJbmRpcmVjdDMyVyhMUENWT0lEKTsKICNkZWZpbmUgICAgTG9hZE1lbnVJbmRpcmVjdCBXSU5FTElCX05BTUVfQVcoTG9hZE1lbnVJbmRpcmVjdCkKK0hJTlNUQU5DRTE2IExvYWRNb2R1bGUxNihMUENTVFIsTFBWT0lEKTsKK0RXT1JEICAgICAgTG9hZE1vZHVsZTMyKExQQ1NUUixMUFZPSUQpOworI2RlZmluZSAgICBMb2FkTW9kdWxlIFdJTkVMSUJfTkFNRShMb2FkTW9kdWxlKQogSEdMT0JBTDE2ICBMb2FkUmVzb3VyY2UxNihISU5TVEFOQ0UxNixIUlNSQzE2KTsKIEhHTE9CQUwzMiAgTG9hZFJlc291cmNlMzIoSElOU1RBTkNFMzIsSFJTUkMzMik7CiAjZGVmaW5lICAgIExvYWRSZXNvdXJjZSBXSU5FTElCX05BTUUoTG9hZFJlc291cmNlKQpAQCAtNjM0Nyw2ICs2NTYzLDEwIEBACiBJTlQxNiAgICAgIE9wZW5Tb3VuZDE2KHZvaWQpOwogVk9JRCAgICAgICBPcGVuU291bmQzMih2b2lkKTsKICNkZWZpbmUgICAgT3BlblNvdW5kIFdJTkVMSUJfTkFNRShPcGVuU291bmQpCitWT0lEICAgICAgIE91dHB1dERlYnVnU3RyaW5nMTYoTFBDU1RSKTsKK1ZPSUQgICAgICAgT3V0cHV0RGVidWdTdHJpbmczMkEoTFBDU1RSKTsKK1ZPSUQgICAgICAgT3V0cHV0RGVidWdTdHJpbmczMlcoTFBDV1NUUik7CisjZGVmaW5lICAgIE91dHB1dERlYnVnU3RyaW5nIFdJTkVMSUJfTkFNRV9BVyhPdXRwdXREZWJ1Z1N0cmluZykKIEJPT0wxNiAgICAgUGFpbnRSZ24xNihIREMxNixIUkdOMTYpOwogQk9PTDMyICAgICBQYWludFJnbjMyKEhEQzMyLEhSR04zMik7CiAjZGVmaW5lICAgIFBhaW50UmduIFdJTkVMSUJfTkFNRShQYWludFJnbikKQEAgLTYzNjMsNiArNjU4Myw5IEBACiBCT09MMTYgICAgIFBsYXlNZXRhRmlsZTE2KEhEQzE2LEhNRVRBRklMRTE2KTsKIEJPT0wzMiAgICAgUGxheU1ldGFGaWxlMzIoSERDMzIsSE1FVEFGSUxFMzIpOwogI2RlZmluZSAgICBQbGF5TWV0YUZpbGUgV0lORUxJQl9OQU1FKFBsYXlNZXRhRmlsZSkKK1ZPSUQgICAgICAgUGxheU1ldGFGaWxlUmVjb3JkMTYoSERDMTYsTFBIQU5ETEVUQUJMRTE2LExQTUVUQVJFQ09SRCxVSU5UMTYpOworQk9PTDMyICAgICBQbGF5TWV0YUZpbGVSZWNvcmQzMihIREMzMixMUEhBTkRMRVRBQkxFMzIsTFBNRVRBUkVDT1JELFVJTlQzMik7CisjZGVmaW5lICAgIFBsYXlNZXRhRmlsZVJlY29yZCBXSU5FTElCX05BTUUoUGxheU1ldGFGaWxlUmVjb3JkKQogQk9PTDE2ICAgICBQb2x5UG9seWdvbjE2KEhEQzE2LExQUE9JTlQxNixMUElOVDE2LFVJTlQxNik7CiBCT09MMzIgICAgIFBvbHlQb2x5Z29uMzIoSERDMzIsTFBQT0lOVDMyLExQSU5UMzIsVUlOVDMyKTsKICNkZWZpbmUgICAgUG9seVBvbHlnb24gV0lORUxJQl9OQU1FKFBvbHlQb2x5Z29uKQpAQCAtNjM3OCw2ICs2NjAxLDEwIEBACiAjZGVmaW5lICAgIFBvc3RBcHBNZXNzYWdlMzJXKHRocmVhZCxtc2csd3BhcmFtLGxwYXJhbSkgXAogICAgICAgICAgICBQb3N0VGhyZWFkTWVzc2FnZTMyVygoRFdPUkQpKHRocmVhZCksbXNnLHdwYXJhbSxscGFyYW0pCiAjZGVmaW5lICAgIFBvc3RBcHBNZXNzYWdlIFdJTkVMSUJfTkFNRV9BVyhQb3N0QXBwTWVzc2FnZSkKK0JPT0wxNiAgICAgUG9zdE1lc3NhZ2UxNihIV05EMTYsVUlOVDE2LFdQQVJBTTE2LExQQVJBTSk7CitCT09MMzIgICAgIFBvc3RNZXNzYWdlMzJBKEhXTkQzMixVSU5UMzIsV1BBUkFNMzIsTFBBUkFNKTsKK0JPT0wzMiAgICAgUG9zdE1lc3NhZ2UzMlcoSFdORDMyLFVJTlQzMixXUEFSQU0zMixMUEFSQU0pOworI2RlZmluZSAgICBQb3N0TWVzc2FnZSBXSU5FTElCX05BTUVfQVcoUG9zdE1lc3NhZ2UpCiB2b2lkICAgICAgIFBvc3RRdWl0TWVzc2FnZTE2KElOVDE2KTsKIHZvaWQgICAgICAgUG9zdFF1aXRNZXNzYWdlMzIoSU5UMzIpOwogI2RlZmluZSAgICBQb3N0UXVpdE1lc3NhZ2UgV0lORUxJQl9OQU1FKFBvc3RRdWl0TWVzc2FnZSkKQEAgLTY0NjQsMTcgKzY2OTEsMjQgQEAKIElOVDE2ICAgICAgUmVsZWFzZURDMTYoSFdORDE2LEhEQzE2KTsKIElOVDMyICAgICAgUmVsZWFzZURDMzIoSFdORDMyLEhEQzMyKTsKICNkZWZpbmUgICAgUmVsZWFzZURDIFdJTkVMSUJfTkFNRShSZWxlYXNlREMpCi1IQU5ETEUxNiAgIFJlbW92ZVByb3AxNihIV05EMTYsTFBDU1RSKTsKLUhBTkRMRTMyICAgUmVtb3ZlUHJvcDMyQShIV05EMzIsTFBDU1RSKTsKLUhBTkRMRTMyICAgUmVtb3ZlUHJvcDMyVyhIV05EMzIsTFBDV1NUUik7Ci0jZGVmaW5lICAgIFJlbW92ZVByb3AgV0lORUxJQl9OQU1FX0FXKFJlbW92ZVByb3ApCiBCT09MMTYgICAgIFJlbW92ZURpcmVjdG9yeTE2KExQQ1NUUik7CiBCT09MMzIgICAgIFJlbW92ZURpcmVjdG9yeTMyQShMUENTVFIpOwogQk9PTDMyICAgICBSZW1vdmVEaXJlY3RvcnkzMlcoTFBDV1NUUik7CiAjZGVmaW5lICAgIFJlbW92ZURpcmVjdG9yeSBXSU5FTElCX05BTUVfQVcoUmVtb3ZlRGlyZWN0b3J5KQorQk9PTDE2ICAgICBSZW1vdmVGb250UmVzb3VyY2UxNihMUENTVFIpOworQk9PTDMyICAgICBSZW1vdmVGb250UmVzb3VyY2UzMkEoTFBDU1RSKTsKK0JPT0wzMiAgICAgUmVtb3ZlRm9udFJlc291cmNlMzJXKExQQ1dTVFIpOworI2RlZmluZSAgICBSZW1vdmVGb250UmVzb3VyY2UgV0lORUxJQl9OQU1FX0FXKFJlbW92ZUZvbnRSZXNvdXJjZSkKIEJPT0wxNiAgICAgUmVtb3ZlTWVudTE2KEhNRU5VMTYsVUlOVDE2LFVJTlQxNik7CiBCT09MMzIgICAgIFJlbW92ZU1lbnUzMihITUVOVTMyLFVJTlQzMixVSU5UMzIpOwogI2RlZmluZSAgICBSZW1vdmVNZW51IFdJTkVMSUJfTkFNRShSZW1vdmVNZW51KQorSEFORExFMTYgICBSZW1vdmVQcm9wMTYoSFdORDE2LExQQ1NUUik7CitIQU5ETEUzMiAgIFJlbW92ZVByb3AzMkEoSFdORDMyLExQQ1NUUik7CitIQU5ETEUzMiAgIFJlbW92ZVByb3AzMlcoSFdORDMyLExQQ1dTVFIpOworI2RlZmluZSAgICBSZW1vdmVQcm9wIFdJTkVMSUJfTkFNRV9BVyhSZW1vdmVQcm9wKQorVk9JRCAgICAgICBSZXBseU1lc3NhZ2UxNihMUkVTVUxUKTsKK0JPT0wzMiAgICAgUmVwbHlNZXNzYWdlMzIoTFJFU1VMVCk7CisjZGVmaW5lICAgIFJlcGx5TWVzc2FnZSBXSU5FTElCX05BTUUoUmVwbHlNZXNzYWdlKQogSERDMTYgICAgICBSZXNldERDMTYoSERDMTYsY29uc3QgREVWTU9ERTE2ICopOwogSERDMzIgICAgICBSZXNldERDMzJBKEhEQzMyLGNvbnN0IERFVk1PREUzMkEgKik7CiBIREMzMiAgICAgIFJlc2V0REMzMlcoSERDMzIsY29uc3QgREVWTU9ERTMyVyAqKTsKQEAgLTY1MzYsMTkgKzY3NzAsMzcgQEAKIEhXTkQxNiAgICAgU2V0QWN0aXZlV2luZG93MTYoSFdORDE2KTsKIEhXTkQzMiAgICAgU2V0QWN0aXZlV2luZG93MzIoSFdORDMyKTsKICNkZWZpbmUgICAgU2V0QWN0aXZlV2luZG93IFdJTkVMSUJfTkFNRShTZXRBY3RpdmVXaW5kb3cpCitMT05HICAgICAgIFNldEJpdG1hcEJpdHMxNihIQklUTUFQMTYsTE9ORyxMUENWT0lEKTsKK0xPTkcgICAgICAgU2V0Qml0bWFwQml0czMyKEhCSVRNQVAzMixMT05HLExQQ1ZPSUQpOworI2RlZmluZSAgICBTZXRCaXRtYXBCaXRzIFdJTkVMSUJfTkFNRShTZXRCaXRtYXBCaXRzKQogQk9PTDE2ICAgICBTZXRCaXRtYXBEaW1lbnNpb25FeDE2KEhCSVRNQVAxNixJTlQxNixJTlQxNixMUFNJWkUxNik7CiBCT09MMzIgICAgIFNldEJpdG1hcERpbWVuc2lvbkV4MzIoSEJJVE1BUDMyLElOVDMyLElOVDMyLExQU0laRTMyKTsKICNkZWZpbmUgICAgU2V0Qml0bWFwRGltZW5zaW9uRXggV0lORUxJQl9OQU1FKFNldEJpdG1hcERpbWVuc2lvbkV4KQorQ09MT1JSRUYgICBTZXRCa0NvbG9yMTYoSERDMTYsQ09MT1JSRUYpOworQ09MT1JSRUYgICBTZXRCa0NvbG9yMzIoSERDMzIsQ09MT1JSRUYpOworI2RlZmluZSAgICBTZXRCa0NvbG9yIFdJTkVMSUJfTkFNRShTZXRCa0NvbG9yKQogSU5UMTYgICAgICBTZXRCa01vZGUxNihIREMxNixJTlQxNik7CiBJTlQzMiAgICAgIFNldEJrTW9kZTMyKEhEQzMyLElOVDMyKTsKICNkZWZpbmUgICAgU2V0QmtNb2RlIFdJTkVMSUJfTkFNRShTZXRCa01vZGUpCiBIV05EMTYgICAgIFNldENhcHR1cmUxNihIV05EMTYpOwogSFdORDMyICAgICBTZXRDYXB0dXJlMzIoSFdORDMyKTsKICNkZWZpbmUgICAgU2V0Q2FwdHVyZSBXSU5FTElCX05BTUUoU2V0Q2FwdHVyZSkKK1ZPSUQgICAgICAgU2V0Q2FyZXRCbGlua1RpbWUxNihVSU5UMTYpOworQk9PTDMyICAgICBTZXRDYXJldEJsaW5rVGltZTMyKFVJTlQzMik7CisjZGVmaW5lICAgIFNldENhcmV0QmxpbmtUaW1lIFdJTkVMSUJfTkFNRShTZXRDYXJldEJsaW5rVGltZSkKK1ZPSUQgICAgICAgU2V0Q2FyZXRQb3MxNihJTlQxNixJTlQxNik7CitCT09MMzIgICAgIFNldENhcmV0UG9zMzIoSU5UMzIsSU5UMzIpOworI2RlZmluZSAgICBTZXRDYXJldFBvcyBXSU5FTElCX05BTUUoU2V0Q2FyZXRQb3MpCiBMT05HICAgICAgIFNldENsYXNzTG9uZzE2KEhXTkQxNixJTlQxNixMT05HKTsKIExPTkcgICAgICAgU2V0Q2xhc3NMb25nMzJBKEhXTkQzMixJTlQzMixMT05HKTsKIExPTkcgICAgICAgU2V0Q2xhc3NMb25nMzJXKEhXTkQzMixJTlQzMixMT05HKTsKICNkZWZpbmUgICAgU2V0Q2xhc3NMb25nIFdJTkVMSUJfTkFNRV9BVyhTZXRDbGFzc0xvbmcpCitXT1JEICAgICAgIFNldENsYXNzV29yZDE2KEhXTkQxNixJTlQxNixXT1JEKTsKK1dPUkQgICAgICAgU2V0Q2xhc3NXb3JkMzIoSFdORDMyLElOVDMyLFdPUkQpOworI2RlZmluZSAgICBTZXRDbGFzc1dvcmQgV0lORUxJQl9OQU1FKFNldENsYXNzV29yZCkKK0hBTkRMRTE2ICAgU2V0Q2xpcGJvYXJkRGF0YTE2KFVJTlQxNixIQU5ETEUxNik7CitIQU5ETEUzMiAgIFNldENsaXBib2FyZERhdGEzMihVSU5UMzIsSEFORExFMzIpOworI2RlZmluZSAgICBTZXRDbGlwYm9hcmREYXRhIFdJTkVMSUJfTkFNRShTZXRDbGlwYm9hcmREYXRhKQogSFdORDE2ICAgICBTZXRDbGlwYm9hcmRWaWV3ZXIxNihIV05EMTYpOwogSFdORDMyICAgICBTZXRDbGlwYm9hcmRWaWV3ZXIzMihIV05EMzIpOwogI2RlZmluZSAgICBTZXRDbGlwYm9hcmRWaWV3ZXIgV0lORUxJQl9OQU1FKFNldENsaXBib2FyZFZpZXdlcikKQEAgLTY2NDIsNiArNjg5NCw5IEBACiB2b2lkICAgICAgIFNldFJlY3RFbXB0eTE2KExQUkVDVDE2KTsKIHZvaWQgICAgICAgU2V0UmVjdEVtcHR5MzIoTFBSRUNUMzIpOwogI2RlZmluZSAgICBTZXRSZWN0RW1wdHkgV0lORUxJQl9OQU1FKFNldFJlY3RFbXB0eSkKK1ZPSUQgICAgICAgU2V0UmVjdFJnbjE2KEhSR04xNixJTlQxNixJTlQxNixJTlQxNixJTlQxNik7CitWT0lEICAgICAgIFNldFJlY3RSZ24zMihIUkdOMzIsSU5UMzIsSU5UMzIsSU5UMzIsSU5UMzIpOworI2RlZmluZSAgICBTZXRSZWN0UmduIFdJTkVMSUJfTkFNRShTZXRSZWN0UmduKQogSU5UMTYgICAgICBTZXRSZWxBYnMxNihIREMxNixJTlQxNik7CiBJTlQzMiAgICAgIFNldFJlbEFiczMyKEhEQzMyLElOVDMyKTsKICNkZWZpbmUgICAgU2V0UmVsQWJzIFdJTkVMSUJfTkFNRShTZXRSZWxBYnMpCkBAIC02Njg0LDYgKzY5MzksOSBAQAogSU5UMTYgICAgICBTZXRUZXh0Q2hhcmFjdGVyRXh0cmExNihIREMxNixJTlQxNik7CiBJTlQzMiAgICAgIFNldFRleHRDaGFyYWN0ZXJFeHRyYTMyKEhEQzMyLElOVDMyKTsKICNkZWZpbmUgICAgU2V0VGV4dENoYXJhY3RlckV4dHJhIFdJTkVMSUJfTkFNRShTZXRUZXh0Q2hhcmFjdGVyRXh0cmEpCitDT0xPUlJFRiAgIFNldFRleHRDb2xvcjE2KEhEQzE2LENPTE9SUkVGKTsKK0NPTE9SUkVGICAgU2V0VGV4dENvbG9yMzIoSERDMzIsQ09MT1JSRUYpOworI2RlZmluZSAgICBTZXRUZXh0Q29sb3IgV0lORUxJQl9OQU1FKFNldFRleHRDb2xvcikKIElOVDE2ICAgICAgU2V0VGV4dEp1c3RpZmljYXRpb24xNihIREMxNixJTlQxNixJTlQxNik7CiBCT09MMzIgICAgIFNldFRleHRKdXN0aWZpY2F0aW9uMzIoSERDMzIsSU5UMzIsSU5UMzIpOwogI2RlZmluZSAgICBTZXRUZXh0SnVzdGlmaWNhdGlvbiBXSU5FTElCX05BTUUoU2V0VGV4dEp1c3RpZmljYXRpb24pCkBAIC02NzQyLDExICs3MDAwLDE4IEBACiB2b2lkICAgICAgIFNldFdpbmRvd1RleHQzMkEoSFdORDMyLExQQ1NUUik7CiB2b2lkICAgICAgIFNldFdpbmRvd1RleHQzMlcoSFdORDMyLExQQ1dTVFIpOwogI2RlZmluZSAgICBTZXRXaW5kb3dUZXh0IFdJTkVMSUJfTkFNRV9BVyhTZXRXaW5kb3dUZXh0KQorV09SRCAgICAgICBTZXRXaW5kb3dXb3JkMTYoSFdORDE2LElOVDE2LFdPUkQpOworV09SRCAgICAgICBTZXRXaW5kb3dXb3JkMzIoSFdORDMyLElOVDMyLFdPUkQpOworI2RlZmluZSAgICBTZXRXaW5kb3dXb3JkIFdJTkVMSUJfTkFNRShTZXRXaW5kb3dXb3JkKQogQk9PTDE2ICAgICBTaGVsbEFib3V0MTYoSFdORDE2LExQQ1NUUixMUENTVFIsSElDT04xNik7CiBCT09MMzIgICAgIFNoZWxsQWJvdXQzMkEoSFdORDMyLExQQ1NUUixMUENTVFIsSElDT04zMik7CiBCT09MMzIgICAgIFNoZWxsQWJvdXQzMlcoSFdORDMyLExQQ1dTVFIsTFBDV1NUUixISUNPTjMyKTsKICNkZWZpbmUgICAgU2hlbGxBYm91dCBXSU5FTElCX05BTUVfQVcoU2hlbGxBYm91dCkKLUJPT0wxNiAgICAgU2hvd0NhcmV0MTYoSFdORDE2KTsKK0hJTlNUQU5DRTE2IFNoZWxsRXhlY3V0ZTE2KEhXTkQxNixMUENTVFIsTFBDU1RSLExQQ1NUUixMUENTVFIsSU5UMTYpOworSElOU1RBTkNFMzIgU2hlbGxFeGVjdXRlMzJBKEhXTkQzMixMUENTVFIsTFBDU1RSLExQQ1NUUixMUENTVFIsSU5UMzIpOworSElOU1RBTkNFMzIgU2hlbGxFeGVjdXRlMzJXKEhXTkQzMixMUENXU1RSLExQQ1dTVFIsTFBDV1NUUixMUENXU1RSLElOVDMyKTsKKyNkZWZpbmUgICAgU2hlbGxFeGVjdXRlIFdJTkVMSUJfTkFNRV9BVyhTaGVsbEV4ZWN1dGUpCitWT0lEICAgICAgIFNob3dDYXJldDE2KEhXTkQxNik7CiBCT09MMzIgICAgIFNob3dDYXJldDMyKEhXTkQzMik7CiAjZGVmaW5lICAgIFNob3dDYXJldCBXSU5FTElCX05BTUUoU2hvd0NhcmV0KQogSU5UMTYgICAgICBTaG93Q3Vyc29yMTYoQk9PTDE2KTsKQEAgLTY4MzgsOCArNzEwMywxNCBAQAogQk9PTDMyICAgICBVbnJlZ2lzdGVyQ2xhc3MzMkEoTFBDU1RSLEhJTlNUQU5DRTMyKTsKIEJPT0wzMiAgICAgVW5yZWdpc3RlckNsYXNzMzJXKExQQ1dTVFIsSElOU1RBTkNFMzIpOwogI2RlZmluZSAgICBVbnJlZ2lzdGVyQ2xhc3MgV0lORUxJQl9OQU1FX0FXKFVucmVnaXN0ZXJDbGFzcykKLXZvaWQgICAgICAgVmFsaWRhdGVSZWN0MTYoSFdORDE2LGNvbnN0IFJFQ1QxNiopOwotdm9pZCAgICAgICBWYWxpZGF0ZVJlY3QzMihIV05EMzIsY29uc3QgUkVDVDMyKik7CitJTlQxNiAgICAgIFVwZGF0ZUNvbG9yczE2KEhEQzE2KTsKK0JPT0wzMiAgICAgVXBkYXRlQ29sb3JzMzIoSERDMzIpOworI2RlZmluZSAgICBVcGRhdGVDb2xvcnMgV0lORUxJQl9OQU1FKFVwZGF0ZUNvbG9ycykKK1ZPSUQgICAgICAgVXBkYXRlV2luZG93MTYoSFdORDE2KTsKK1ZPSUQgICAgICAgVXBkYXRlV2luZG93MzIoSFdORDMyKTsKKyNkZWZpbmUgICAgVXBkYXRlV2luZG93IFdJTkVMSUJfTkFNRShVcGRhdGVXaW5kb3cpCitWT0lEICAgICAgIFZhbGlkYXRlUmVjdDE2KEhXTkQxNixjb25zdCBSRUNUMTYqKTsKK1ZPSUQgICAgICAgVmFsaWRhdGVSZWN0MzIoSFdORDMyLGNvbnN0IFJFQ1QzMiopOwogI2RlZmluZSAgICBWYWxpZGF0ZVJlY3QgV0lORUxJQl9OQU1FKFZhbGlkYXRlUmVjdCkKIFZPSUQgICAgICAgVmFsaWRhdGVSZ24xNihIV05EMTYsSFJHTjE2KTsKIFZPSUQgICAgICAgVmFsaWRhdGVSZ24zMihIV05EMzIsSFJHTjMyKTsKQEAgLTY5NjMsNiArNzIzNCw3IEBACiBJTlQzMiAgICAgIExvYWRNZXNzYWdlMzJXKEhJTlNUQU5DRTMyLFVJTlQzMixXT1JELExQV1NUUixJTlQzMik7CiBTRUdQVFIgICAgIFdJTjE2X0dsb2JhbExvY2sxNihIR0xPQkFMMTYpOwogU0VHUFRSICAgICBXSU4xNl9Mb2NrUmVzb3VyY2UoSEdMT0JBTDE2KTsKK0xPTkcgICAgICAgV0lOMTZfaHJlYWQoSEZJTEUxNixTRUdQVFIsTE9ORyk7CiBJTlQzMiAgICAgIGxzdHJuY21wMzJBKExQQ1NUUixMUENTVFIsSU5UMzIpOwogSU5UMzIgICAgICBsc3RybmNtcDMyVyhMUENXU1RSLExQQ1dTVFIsSU5UMzIpOwogSU5UMzIgICAgICBsc3RybmNtcGkzMkEoTFBDU1RSLExQQ1NUUixJTlQzMik7CkBAIC02OTcyLDY1ICs3MjQ0LDYgQEAKIExQV1NUUiAgICAgbHN0cmNweW5BdG9XKExQV1NUUixMUENTVFIsSU5UMzIpOwogTFBTVFIgICAgICBsc3RyY3B5bld0b0EoTFBTVFIsTFBDV1NUUixJTlQzMik7CiAKLS8qIExpYnJhcnkgZGF0YSB0eXBlcyBkZWZpbmVkIGFzIGEgdHJhbnNpdGlvbiBhaWQgZm9yIHRoZSBlbXVsYXRvci4gKi8KLS8qIFRoZXNlIHNob3VsZCBfbm90XyBiZSB1c2VkIGluIHRoZSBlbXVsYXRvciBhbmQgd2lsbCBiZSByZW1vdmVkIHNvbWVkYXkuICovCi0KLSNpZm5kZWYgTk9fVFJBTlNJVElPTl9UWVBFUwotCi0jaWZkZWYgX19XSU5FX18KLSMgaWZkZWYgV0lORUxJQjMyCi10eXBlZGVmIElOVDMyIElOVDsKLXR5cGVkZWYgVUlOVDMyIFVJTlQ7Ci10eXBlZGVmIEJPT0wzMiBCT09MOwotIyBlbHNlICAvKiBXSU5FTElCMzIgKi8KLXR5cGVkZWYgSU5UMTYgSU5UOwotdHlwZWRlZiBVSU5UMTYgVUlOVDsKLXR5cGVkZWYgQk9PTDE2IEJPT0w7Ci0jIGVuZGlmICAvKiBXSU5FTElCMzIgKi8KLSNlbmRpZiAgLyogX19XSU5FX18gKi8KLQotSU5UICAgICAgICBBZGRGb250UmVzb3VyY2UoTFBDU1RSKTsKLWludCAgICAgICAgQ29udmVydFJlcXVlc3QoSFdORDE2LExQS0FOSklTVFJVQ1QpOwotRFdPUkQgICAgICBEcmFnT2JqZWN0KEhXTkQxNiwgSFdORDE2LCBXT1JELCBIQU5ETEUxNiwgV09SRCwgSENVUlNPUjE2KTsKLUJPT0wgICAgICAgRW51bU1ldGFGaWxlKEhEQzE2LEhNRVRBRklMRTE2LE1GRU5VTVBST0MxNixMUEFSQU0pOwotSElDT04xNiAgICBFeHRyYWN0SWNvbihISU5TVEFOQ0UxNixMUENTVFIsV09SRCk7Ci1ISU5TVEFOQ0UxNiBGaW5kRXhlY3V0YWJsZShMUENTVFIsTFBDU1RSLExQU1RSKTsKLXZvaWQgICAgICAgRnJlZUxpYnJhcnkoSElOU1RBTkNFMTYpOwotSEFORExFMTYgICBHZXRDbGlwYm9hcmREYXRhKFdPUkQpOwotaW50ICAgICAgICBHZXRDbGlwYm9hcmRGb3JtYXROYW1lKFdPUkQsTFBTVFIsc2hvcnQpOwotaW50ICAgICAgICBHZXRFbnZpcm9ubWVudChMUFNUUixMUFNUUixXT1JEKTsKLWludCAgICAgICAgR2V0S2VybmluZ1BhaXJzKEhEQzE2LGludCxMUEtFUk5JTkdQQUlSMTYpOwotQk9PTCAgICAgICBHZXRNZXNzYWdlKFNFR1BUUixIV05EMTYsVUlOVCxVSU5UKTsKLUhNT0RVTEUxNiAgR2V0TW9kdWxlSGFuZGxlKExQQ1NUUik7Ci1JTlQxNiAgICAgIEdldE1vZHVsZVVzYWdlKEhJTlNUQU5DRTE2KTsKLWludCAgICAgICAgR2V0UHJpb3JpdHlDbGlwYm9hcmRGb3JtYXQoV09SRCosc2hvcnQpOwotRFdPUkQgICAgICBHZXRRdWV1ZVN0YXR1cyhVSU5UKTsKLUJPT0wgICAgICAgR2V0UmFzdGVyaXplckNhcHMoTFBSQVNURVJJWkVSX1NUQVRVUyxVSU5UKTsKLUhJTlNUQU5DRTE2IExvYWRNb2R1bGUoTFBDU1RSLExQVk9JRCk7Ci12b2lkICAgICAgIE91dHB1dERlYnVnU3RyaW5nKExQQ1NUUik7Ci12b2lkICAgICAgIFBsYXlNZXRhRmlsZVJlY29yZChIREMxNixMUEhBTkRMRVRBQkxFMTYsTFBNRVRBUkVDT1JELFdPUkQpOwotQk9PTCAgICAgICBQb3N0TWVzc2FnZShIV05EMTYsV09SRCxXT1JELExPTkcpOwotQk9PTCAgICAgICBSZW1vdmVGb250UmVzb3VyY2UoTFBTVFIpOwotdm9pZCAgICAgICBSZXBseU1lc3NhZ2UoTFJFU1VMVCk7Ci1IQU5ETEUxNiAgIFNldENsaXBib2FyZERhdGEoV09SRCxIQU5ETEUxNik7Ci1pbnQgICAgICAgIFNldEVudmlyb25tZW50KExQQ1NUUixMUENTVFIsV09SRCk7Ci1ISU5TVEFOQ0UxNiBTaGVsbEV4ZWN1dGUoSFdORDE2LExQQ1NUUixMUENTVFIsTFBTVFIsTFBDU1RSLElOVCk7Ci1pbnQgICAgICAgIFVwZGF0ZUNvbG9ycyhIREMxNik7Ci0KLS8qIENhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXJzIHR5cGVzLiAqLwotCi0jaWZkZWYgV0lORUxJQgotdHlwZWRlZiBMT05HICgqRFJJVkVSUFJPQykoRFdPUkQsIEhEUlZSMTYsIFVJTlQsIExQQVJBTSwgTFBBUkFNKTsKLXR5cGVkZWYgaW50ICgqRURJVFdPUkRCUkVBS1BST0MpKExQU1RSIGxwY2gsIGludCBpY2hDdXJyZW50LCBpbnQgY2NoLGludCBjb2RlKTsKLSNlbHNlCi10eXBlZGVmIFNFR1BUUiBEUklWRVJQUk9DOwotdHlwZWRlZiBTRUdQVFIgRURJVFdPUkRCUkVBS1BST0M7Ci0jZW5kaWYKLQotI2VuZGlmICAvKiBOT19UUkFOU0lUSU9OX1RZUEVTICovCi0KLSNkZWZpbmUgV0lORUxJQl9VTklNUCh4KSBmcHJpbnRmIChzdGRlcnIsICJXaW5lTGliOiBVbmltcGxlbWVudGVkICVzXG4iLCB4KQotCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS93aW5lcnJvci5oIGIvaW5jbHVkZS93aW5lcnJvci5oCmluZGV4IDI4Y2MwMDUuLjc1NzE2YmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvd2luZXJyb3IuaAorKysgYi9pbmNsdWRlL3dpbmVycm9yLmgKQEAgLTIxLDYgKzIxLDcgQEAKICNkZWZpbmUgRVJST1JfT1VUT0ZNRU1PUlkgICAgICAgICAgIDE0CiAjZGVmaW5lIEVSUk9SX05PX01PUkVfRklMRVMgICAgICAgICAxOAogI2RlZmluZSBFUlJPUl9TSEFSSU5HX1ZJT0xBVElPTiAgICAgMzIKKyNkZWZpbmUgRVJST1JfRFVQX05BTUUgICAgICAgICAgICAgIDUyCiAjZGVmaW5lIEVSUk9SX0ZJTEVfRVhJU1RTICAgICAgICAgICA4MAogI2RlZmluZSBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUiAgICAgODcKICNkZWZpbmUgRVJST1JfQlJPS0VOX1BJUEUgICAgICAgICAgIDEwOQpAQCAtMjksNiArMzAsNyBAQAogI2RlZmluZSBFUlJPUl9TRUVLX09OX0RFVklDRSAgICAgICAgMTMyCiAjZGVmaW5lIEVSUk9SX0RJUl9OT1RfRU1QVFkgICAgICAgICAxNDUKICNkZWZpbmUgRVJST1JfQlVTWSAgICAgICAgICAgICAgICAgIDE3MAorI2RlZmluZSBFUlJPUl9BTFJFQURZX0VYSVNUUyAgICAgICAgMTgzCiAjZGVmaW5lIEVSUk9SX0ZJTEVOQU1FX0VYQ0VEX1JBTkdFICAyMDYKICNkZWZpbmUgRVJST1JfTU9SRV9EQVRBICAgICAgICAgICAgIDIzNAogI2RlZmluZSBFUlJPUl9OT19NT1JFX0lURU1TICAgICAgICAgMjU5CmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbnNvY2suaCBiL2luY2x1ZGUvd2luc29jay5oCmluZGV4IDBkZmU3YTMuLmVkODEzYjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvd2luc29jay5oCisrKyBiL2luY2x1ZGUvd2luc29jay5oCkBAIC00OTksNyArNDk5LDcgQEAKICAgc3RydWN0IF9fV1NJTkZPKiAgICAgIHByZXYsKm5leHQ7CiAKICAgdW5zaWduZWQJCWZsYWdzOwotICBpbnQJCQllcnJubzsKKyAgaW50CQkJZXJyOwogICBJTlQxNgkJCW51bV9zdGFydHVwOwogICBJTlQxNgkJCW51bV9hc3luY19ycTsKICAgSU5UMTYJCQlsYXN0X2ZyZWU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbnR5cGVzLmggYi9pbmNsdWRlL3dpbnR5cGVzLmgKaW5kZXggYzZiNjlhYi4uMDVkMzg2OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW50eXBlcy5oCisrKyBiL2luY2x1ZGUvd2ludHlwZXMuaApAQCAtMTY4LDYgKzE2OCwxMyBAQAogdHlwZWRlZiBMUkVTVUxUICgqRExHUFJPQzE2KShIV05EMTYsVUlOVDE2LFdQQVJBTTE2LExQQVJBTSk7CiB0eXBlZGVmIExSRVNVTFQgKCpETEdQUk9DMzIpKEhXTkQzMixVSU5UMzIsV1BBUkFNMzIsTFBBUkFNKTsKIERFQ0xfV0lORUxJQl9UWVBFKERMR1BST0MpOwordHlwZWRlZiBMUkVTVUxUICgqRFJJVkVSUFJPQzE2KShEV09SRCxIRFJWUjE2LFVJTlQxNixMUEFSQU0sTFBBUkFNKTsKK3R5cGVkZWYgTFJFU1VMVCAoKkRSSVZFUlBST0MzMikoRFdPUkQsSERSVlIzMixVSU5UMzIsTFBBUkFNLExQQVJBTSk7CitERUNMX1dJTkVMSUJfVFlQRShEUklWRVJQUk9DKTsKK3R5cGVkZWYgSU5UMTYgICAoKkVESVRXT1JEQlJFQUtQUk9DMTYpKExQU1RSLElOVDE2LElOVDE2LElOVDE2KTsKK3R5cGVkZWYgSU5UMzIgICAoKkVESVRXT1JEQlJFQUtQUk9DMzJBKShMUFNUUixJTlQzMixJTlQzMixJTlQzMik7Cit0eXBlZGVmIElOVDMyICAgKCpFRElUV09SREJSRUFLUFJPQzMyVykoTFBXU1RSLElOVDMyLElOVDMyLElOVDMyKTsKK0RFQ0xfV0lORUxJQl9UWVBFX0FXKEVESVRXT1JEQlJFQUtQUk9DKTsKIHR5cGVkZWYgTFJFU1VMVCAoKkZBUlBST0MxNikoKTsKIHR5cGVkZWYgTFJFU1VMVCAoKkZBUlBST0MzMikoKTsKIERFQ0xfV0lORUxJQl9UWVBFKEZBUlBST0MpOwpkaWZmIC0tZ2l0IGEvaXBjL2RkZV9wcm9jLmMgYi9pcGMvZGRlX3Byb2MuYwppbmRleCA1OWQ4OTQyLi4yZjcyYmMzIDEwMDY0NAotLS0gYS9pcGMvZGRlX3Byb2MuYworKysgYi9pcGMvZGRlX3Byb2MuYwpAQCAtMTQ4LDcgKzE0OCw3IEBACiB9CiAKIC8qIHdhaXQgZm9yIGRkZSAtIGFja25vd2xlZGdlIG1lc3NhZ2UgLSBvciB0aW1vdXQgKi8KLXN0YXRpYyBCT09MIGdldF9hY2soKQorc3RhdGljIEJPT0wzMiBnZXRfYWNrKCkKIHsKICAgICBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OwogICAgIGludCBzaXplOwpAQCAtMTg2LDcgKzE4Niw3IEBACiB9CiAKIC8qIFRyYW5zZmVyIG9uZSBtZXNzYWdlIHRvIGEgZ2l2ZW4gcHJvY2VzcyAqLwotc3RhdGljIEJPT0wgRERFX0RvT25lTWVzc2FnZSAoaW50IHByb2NfaWR4LCBpbnQgc2l6ZSwgc3RydWN0IG1zZ2J1ZiAqbXNnYnVmKQorc3RhdGljIEJPT0wzMiBEREVfRG9PbmVNZXNzYWdlIChpbnQgcHJvY19pZHgsIGludCBzaXplLCBzdHJ1Y3QgbXNnYnVmICptc2didWYpCiB7CiAgIGRkZV9wcm9jIHByb2M9ICZtYWluX2Jsb2NrLT5wcm9jWyBwcm9jX2lkeCBdOwogCkBAIC0yOTAsMTMgKzI5MCwxMyBAQAogICByZXR1cm4gMDsJCQkKIH0KIAotc3RhdGljIEJPT0wgRERFX0RvTWVzc2FnZSggTVNHMTYgKm1zZywgaW50IHR5cGUgKQorc3RhdGljIEJPT0wzMiBEREVfRG9NZXNzYWdlKCBNU0cxNiAqbXNnLCBpbnQgdHlwZSApCiB7CiAgIGludCBwcm9jX2lkeDsKIAogICBNU0cxNiAqcmVtb3RlX21lc3NhZ2U7CiAgIHN0cnVjdCBtc2dfZGF0IG1zZ19kYXQ7Ci0gIEJPT0wgc3VjY2VzczsKKyAgQk9PTDMyIHN1Y2Nlc3M7CiAgIAogICBpZiAobXNnLT53UGFyYW0gPT0gMCkKICAgICAgIHJldHVybiBGQUxTRTsKQEAgLTM0NiwxOCArMzQ2LDE4IEBACiAgIH0KIH0KIAotQk9PTCBEREVfU2VuZE1lc3NhZ2UoIE1TRzE2ICptc2cpCitCT09MMzIgRERFX1NlbmRNZXNzYWdlKCBNU0cxNiAqbXNnKQogewogICByZXR1cm4gRERFX0RvTWVzc2FnZShtc2csIERERV9TRU5EKTsKIH0KIAotQk9PTCBEREVfUG9zdE1lc3NhZ2UoIE1TRzE2ICptc2cpCitCT09MMzIgRERFX1Bvc3RNZXNzYWdlKCBNU0cxNiAqbXNnKQogewogICByZXR1cm4gRERFX0RvTWVzc2FnZShtc2csIERERV9QT1NUKTsKIH0KIAogCi12b2lkIGRkZV9wcm9jX3NlbmRfYWNrKEhXTkQgd25kLCBCT09MIHZhbCkgewordm9pZCBkZGVfcHJvY19zZW5kX2FjayhIV05EIHduZCwgQk9PTDMyIHZhbCkgewogICAgaW50IHByb2MsbXNnOwogCiAgICBzdGF0aWMgc3RydWN0IG1zZ2J1ZiBtc2dfYWNrPXtEREVfQUNLLHsnMCd9fTsKQEAgLTM4NCw4ICszODQsOCBAQAogICBNU0cxNiAqcmVtb3RlX21lc3NhZ2U7CiAgIGludCBzaXplOwogICBzdHJ1Y3QgbXNnX2RhdCBtc2dfZGF0OwotICBCT09MIHdhc19zZW50OwkJICAgLyogc2VudC9yZWNlaXZlZCAqLwotICBCT09MIHBhc3NlZDsKKyAgQk9PTDMyIHdhc19zZW50OwkJICAgLyogc2VudC9yZWNlaXZlZCAqLworICBCT09MMzIgcGFzc2VkOwogICBXTkQgKnduZFB0cjsKIAogICBpZiAoY3Vycl9wcm9jX2lkeD09LTEpCSAgIC8qIGRvIHdlIGhhdmUgRERFIGluaXRpYWxpemVkID8gKi8KQEAgLTY2Nyw3ICs2NjcsNyBAQAogICAgIG1haW5fYmxvY2stPndpbmRvd3NbaV0ucHJvY19pZHggPSBGUkVFX1dORDsKIH0KIAotc3RhdGljIEJPT0wgRERFX1Byb2NIYXNXaW5kb3dzKGludCBwcm9jX2lkeCkKK3N0YXRpYyBCT09MMzIgRERFX1Byb2NIYXNXaW5kb3dzKGludCBwcm9jX2lkeCkKIHsKICAgV05EX0RBVEEgKnRlc3RlZDsKICAgaW50IGk7CmRpZmYgLS1naXQgYS9pcGMvZ2VuZXJpY19oYXNoLmMgYi9pcGMvZ2VuZXJpY19oYXNoLmMKaW5kZXggZGYwNDQ5Yi4uOThkNGUxNyAxMDA2NDQKLS0tIGEvaXBjL2dlbmVyaWNfaGFzaC5jCisrKyBiL2lwYy9nZW5lcmljX2hhc2guYwpAQCAtMjQsMTIgKzI0LDEyIEBACiAJICAgICAgIChpKSooc2l6ZSkpICkKIAogc3RhdGljIEhBU0hfSVRFTSAqbG9jYXRlX2VudHJ5KEhBU0hfQ09OVEFJTkVSKiBoYXNoLCBEV09SRCBrZXksCi0JCQkgICAgICAgSEFTSF9WQUwgKnNlZWtlZF9kYXRhLCBCT09MIHNraXBfZGVsZXRlZCk7CisJCQkgICAgICAgSEFTSF9WQUwgKnNlZWtlZF9kYXRhLCBCT09MMzIgc2tpcF9kZWxldGVkKTsKIAogc3RhdGljIHZvaWQgY29weV9oYXNoX2l0ZW1zKEhBU0hfQ09OVEFJTkVSICpoYXNoLCBIQVNIX0lURU0gKm9sZF9pdGVtcywKIAkJCSAgICBpbnQgb2xkX25faXRlbXMpOwogCi1zdGF0aWMgQk9PTCBhcnJheXNfaW5pdGlhbGl6ZWQgPSBGQUxTRTsKK3N0YXRpYyBCT09MMzIgYXJyYXlzX2luaXRpYWxpemVkID0gRkFMU0U7CiBzdGF0aWMgaW50IHByaW1lc1tOT19PRl9QUklNRVNdOwogc3RhdGljIGludCBiZXN0X3ByaW1lc1tOT19PRl9QUklNRVNdOwogc3RhdGljIGludCBub19vZl9wcmltZXM7CkBAIC0zNyw3ICszNyw3IEBACiBzdGF0aWMgaW50IG1heF9udW07CiAKIC8qIGJpbmFyeSBzZWFyY2ggZm9yIGBudW0nIGluIHRoZSBgcHJpbWVzJyBhcnJheSAqLwotc3RhdGljIEJPT0wgcHJpbWVfYmluYXJ5X3NlYXJjaF9mb3VuZChpbnQgbnVtKQorc3RhdGljIEJPT0wzMiBwcmltZV9iaW5hcnlfc2VhcmNoX2ZvdW5kKGludCBudW0pCiB7CiAgIGludCBtaW5faWR4LCBtYXhfaWR4LCBpZHg7CiAgIApAQCAtNTYsNyArNTYsNyBAQAogICByZXR1cm4gRkFMU0U7CiB9CiAKLXN0YXRpYyBCT09MIGlzX3ByaW1lKGludCBudW0pCitzdGF0aWMgQk9PTDMyIGlzX3ByaW1lKGludCBudW0pCiB7CiAgIGludCBpOwogICBpZiAoKG51bSAmIDB4MSkgPT0gMCkJCSAgIC8qIGNhbiBiZSBkaXZpZGVkIGJ5IDIgKi8KQEAgLTIxOCw3ICsyMTgsNyBAQAogc3RhdGljIHZvaWQgc3RhdGljX2NvbGxlY3RfZ2FyYmdlKEhBU0hfQ09OVEFJTkVSICpoYXNoKQogewogICAgaW50IGk7Ci0gICBCT09MIGNoYW5nZTsKKyAgIEJPT0wzMiBjaGFuZ2U7CiAgICBIQVNIX0lURU0gKml0ZW1zOwogICAgSEFTSF9JVEVNICpsb2NhdGVkOwogICAgSEFTSF9JVEVNICppdGVtOwpAQCAtNTE2LDkgKzUxNiw5IEBACiAKIAogLyoqKioqKioqKiogSGFzaCB1c2FnZSAqKioqKioqKioqKioqLwotc3RhdGljIF9faW5saW5lX18gQk9PTAorc3RhdGljIF9faW5saW5lX18gQk9PTDMyCiBjb3JyZWN0X2VudHJ5KEhBU0hfSVRFTSAqaXRlbSwgaW50IGtleSwgSEFTSF9WQUwgKnNlZWtlZF9kYXRhLAotCSAgICAgIEhBU0hfSVRFTV9URVNUICppc19jb3JyZWN0X2l0ZW0sIEJPT0wgc2tpcF9kZWxldGVkKQorCSAgICAgIEhBU0hfSVRFTV9URVNUICppc19jb3JyZWN0X2l0ZW0sIEJPT0wzMiBza2lwX2RlbGV0ZWQpCiB7CiAgICBzd2l0Y2goaXRlbS0+a2V5KSB7CiAgICAgICBjYXNlIEZSRUVfRU5UUlk6CkBAIC01NDksNyArNTQ5LDcgQEAKICAqLwogCiBzdGF0aWMgSEFTSF9JVEVNICpsb2NhdGVfZW50cnkoSEFTSF9DT05UQUlORVIqIGhhc2gsIERXT1JEIGtleSwKLQkJCSAgICAgICBIQVNIX1ZBTCAqc2Vla2VkX2RhdGEsIEJPT0wgc2tpcF9kZWxldGVkKQorCQkJICAgICAgIEhBU0hfVkFMICpzZWVrZWRfZGF0YSwgQk9PTDMyIHNraXBfZGVsZXRlZCkKIHsKICAgIERXT1JEIGhhc2hfaWR4LCBoYXNoX2xlYXBzOwogICAgSEFTSF9JVEVNICppdGVtOwpAQCAtNjE5LDcgKzYxOSw3IEBACiB9CiAKIAotQk9PTCBoYXNoX2FkZF9pdGVtKEhBU0hfQ09OVEFJTkVSKiBoYXNoLCBpbnQga2V5LCBIQVNIX1ZBTCAqZGF0YSkKK0JPT0wzMiBoYXNoX2FkZF9pdGVtKEhBU0hfQ09OVEFJTkVSKiBoYXNoLCBpbnQga2V5LCBIQVNIX1ZBTCAqZGF0YSkKIHsKICAgICBIQVNIX1NIQVJFRCAqc2hhcmVkOwogICAgIEhBU0hfSVRFTSAqaXRlbTsKQEAgLTY0OSw3ICs2NDksNyBAQAogfQogCiAKLUJPT0wgaGFzaF9kZWxldGVfaXRlbShIQVNIX0NPTlRBSU5FUiogaGFzaCwgaW50IGtleSwgSEFTSF9WQUwgKnNlZWtlZF9kYXRhKQorQk9PTDMyIGhhc2hfZGVsZXRlX2l0ZW0oSEFTSF9DT05UQUlORVIqIGhhc2gsIGludCBrZXksIEhBU0hfVkFMICpzZWVrZWRfZGF0YSkKIHsKICAgICBIQVNIX0lURU0gKml0ZW07CiAgICAgCmRpZmYgLS1naXQgYS9pcGMvZ2VuZXJpY19oYXNoLmggYi9pcGMvZ2VuZXJpY19oYXNoLmgKaW5kZXggNmJkMjk2Zi4uZGFhMzQwOSAxMDA2NDQKLS0tIGEvaXBjL2dlbmVyaWNfaGFzaC5oCisrKyBiL2lwYy9nZW5lcmljX2hhc2guaApAQCAtNDgsNyArNDgsNyBAQAogCQkJCS8qIGNoYW5nZXMgdG8gdGhlIHBvaW50ZXIuICovCiAgICAgSEFTSF9QVFIgaXRlbXM7CQkvKiBwb2ludGVyIHRvIHRoZSBpdGVtcyAqLwogfSBIQVNIX1NIQVJFRDsKLXR5cGVkZWYgQk9PTCBIQVNIX0lURU1fVEVTVChIQVNIX1ZBTCAqdmFsdWUsIEhBU0hfVkFMICpzZWVrZWRfZGF0YSk7Cit0eXBlZGVmIEJPT0wzMiBIQVNIX0lURU1fVEVTVChIQVNIX1ZBTCAqdmFsdWUsIEhBU0hfVkFMICpzZWVrZWRfZGF0YSk7CiAKIC8qIE5PVEU6CiAgKiAxLiBLZXlzIDAgYW5kIC0xIGFyZSByZXNlcnZlZC4KQEAgLTYyLDcgKzYyLDcgQEAKIAkJCQkgICAoRnVuY3Rpb24gb2YgbWF4aW11bV9sb2FkKSAqLwogCiAgICAgaW50IGxhc3RfcHRyX3VwZGF0ZTsJLyogdG8gYmUgY29tcGFyZWQgd2l0aCBzaGFyZWQucHRyX3VwZGF0ZXMgKi8KLSAgICBCT09MIHNoYXJlZF93YXNfbWFsbG9jZWQ7CS8qIE5lZWQgdGhhdCB0byBrbm93IGhvdyB0byBkZXN0cm95IGhhc2ggKi8KKyAgICBCT09MMzIgc2hhcmVkX3dhc19tYWxsb2NlZDsJLyogTmVlZCB0aGF0IHRvIGtub3cgaG93IHRvIGRlc3Ryb3kgaGFzaCAqLwogICAgIAogICAgIC8qIFRoaXMgaXMgYW4gb3B0aW9uYWwgaGFuZGxlci4KICAgICAgKiBJZiBub3QgTlVMTCwgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBkaXN0aW5ndWlzaGluZyBiZXR3ZWVuCkBAIC0xMjksOCArMTI5LDggQEAKICAqICAgICAgICAyLiBkYXRhIHRvIHN0b3JlLiAoZm9yIGhhc2hfYWRkX2l0ZW0pLgogICovCiBIQVNIX1ZBTCAqaGFzaF9sb2NhdGVfaXRlbShIQVNIX0NPTlRBSU5FUiogaGFzaCxpbnQga2V5LCBIQVNIX1ZBTCogc2Vla2VkX2RhdGEpOwotQk9PTCBoYXNoX2FkZF9pdGVtKEhBU0hfQ09OVEFJTkVSKiAgICAgICAgaGFzaCwgaW50IGtleSwgSEFTSF9WQUwqIGRhdGEpOwotQk9PTCBoYXNoX2RlbGV0ZV9pdGVtKEhBU0hfQ09OVEFJTkVSKiAgICAgaGFzaCwgaW50IGtleSwgSEFTSF9WQUwqIHNlZWtlZF9kYXRhKTsKK0JPT0wzMiBoYXNoX2FkZF9pdGVtKEhBU0hfQ09OVEFJTkVSKiBoYXNoLCBpbnQga2V5LCBIQVNIX1ZBTCogZGF0YSk7CitCT09MMzIgaGFzaF9kZWxldGVfaXRlbShIQVNIX0NPTlRBSU5FUiogaGFzaCwgaW50IGtleSwgSEFTSF9WQUwqIHNlZWtlZF9kYXRhKTsKIAogCiB2b2lkICpyZXRfbnVsbCgpOwkJLyogZnVuY3Rpb24gcmV0dXJuaW5nIG51bGwgKHVzZWQgZm9yICovCmRpZmYgLS1naXQgYS9saWJyYXJ5L2xpYnJlcy5jIGIvbGlicmFyeS9saWJyZXMuYwppbmRleCBlYmUxNTVkLi5jYzViZDNhIDEwMDY0NAotLS0gYS9saWJyYXJ5L2xpYnJlcy5jCisrKyBiL2xpYnJhcnkvbGlicmVzLmMKQEAgLTU4LDcgKzU4LDcgQEAKICAgICAgIHR5cGVpZD1hdG9pKHR5cGUrMSk7CiAgICAgZWxzZQogICAgIHsKLSAgICAgIFdJTkVMSUJfVU5JTVAoIkxJQlJFU19GaW5kUmVzb3VyY2UxNigqLCosdHlwZT1zdHJpbmcpIik7CisgICAgICBmcHJpbnRmKHN0ZGVyciwiTElCUkVTX0ZpbmRSZXNvdXJjZTE2KCosKix0eXBlPXN0cmluZykiKTsKICAgICAgIHJldHVybiAwOwogICAgIH0KICAgfQpAQCAtMTEyLDcgKzExMiw3IEBACiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0gICAgICBXSU5FTElCX1VOSU1QKCJMSUJSRVNfRmluZFJlc291cmNlMzIoKiwqLHR5cGU9c3RyaW5nKSIpOworICAgICAgZnByaW50ZihzdGRlcnIsIkxJQlJFU19GaW5kUmVzb3VyY2UzMigqLCosdHlwZT1zdHJpbmcpIik7CiAgICAgICByZXR1cm4gMDsKICAgICB9CiAgIH0KQEAgLTE1NCw3ICsxNTQsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCSAgICBMSUJSRVNfRnJlZVJlc291cmNlICAgIAogICovCi1CT09MIExJQlJFU19GcmVlUmVzb3VyY2UoIEhHTE9CQUwzMiBoYW5kbGUgKQorQk9PTDMyIExJQlJFU19GcmVlUmVzb3VyY2UoIEhHTE9CQUwzMiBoYW5kbGUgKQogewogICByZXR1cm4gMDsgLyogT2Jzb2xldGUgaW4gV2luMzIgKi8KIH0KQEAgLTE2NSw3ICsxNjUsNyBAQAogICovCiBJTlQzMiBMSUJSRVNfQWNjZXNzUmVzb3VyY2UoIEhJTlNUQU5DRTMyIGhNb2R1bGUsIEhSU1JDMzIgaFJzcmMgKQogewotICBXSU5FTElCX1VOSU1QKCJMSUJSRVNfQWNjZXNzUmVzb3VyY2UoKSIpOworICBmcHJpbnRmKHN0ZGVyciwiTElCUkVTX0FjY2Vzc1Jlc291cmNlKCkiKTsKICAgcmV0dXJuIC0xOyAvKiBPYnNvbGV0ZSBpbiBXaW4zMiAqLwogfQogCkBAIC0xODQsNyArMTg0LDcgQEAKICAqLwogSEdMT0JBTDMyIExJQlJFU19BbGxvY1Jlc291cmNlKCBISU5TVEFOQ0UzMiBoTW9kdWxlLCBIUlNSQzMyIGhSc3JjLCBEV09SRCBzaXplKQogewotICBXSU5FTElCX1VOSU1QKCJMSUJSRVNfQWxsb2NSZXNvdXJjZSgpIik7CisgIGZwcmludGYoc3RkZXJyLCJMSUJSRVNfQWxsb2NSZXNvdXJjZSgpIik7CiAgIHJldHVybiAwOyAvKiBPYnNvbGV0ZSBpbiBXaW4zMiAqLwogfQogCmRpZmYgLS1naXQgYS9saWJyYXJ5L21pc2NzdHVicy5jIGIvbGlicmFyeS9taXNjc3R1YnMuYwppbmRleCBlNjE3N2VlLi4wYjAyMWRhIDEwMDY0NAotLS0gYS9saWJyYXJ5L21pc2NzdHVicy5jCisrKyBiL2xpYnJhcnkvbWlzY3N0dWJzLmMKQEAgLTQ1LDE4ICs0NSwxOCBAQAogICB9CiB9CiAKLWV4dGVybiBMUkVTVUxUIENvbG9yRGxnUHJvYyhIV05EMTYsVUlOVCxXUEFSQU0xNixMUEFSQU0pOwotZXh0ZXJuIExSRVNVTFQgQ29tYm9Cb3hXbmRQcm9jKEhXTkQxNixVSU5ULFdQQVJBTTE2LExQQVJBTSk7Ci1leHRlcm4gTFJFU1VMVCBDb21ib0xCb3hXbmRQcm9jKEhXTkQxNixVSU5ULFdQQVJBTTE2LExQQVJBTSk7Ci1leHRlcm4gTFJFU1VMVCBGaWxlT3BlbkRsZ1Byb2MoSFdORDE2LFVJTlQsV1BBUkFNMTYsTFBBUkFNKTsKLWV4dGVybiBMUkVTVUxUIEZpbGVTYXZlRGxnUHJvYyhIV05EMTYsVUlOVCxXUEFSQU0xNixMUEFSQU0pOwotZXh0ZXJuIExSRVNVTFQgRmluZFRleHREbGdQcm9jKEhXTkQxNixVSU5ULFdQQVJBTTE2LExQQVJBTSk7Ci1leHRlcm4gTFJFU1VMVCBNRElDbGllbnRXbmRQcm9jKEhXTkQxNixVSU5ULFdQQVJBTTE2LExQQVJBTSk7Ci1leHRlcm4gTFJFU1VMVCBQcmludERsZ1Byb2MoSFdORDE2LFVJTlQsV1BBUkFNMTYsTFBBUkFNKTsKLWV4dGVybiBMUkVTVUxUIFByaW50U2V0dXBEbGdQcm9jKEhXTkQxNixVSU5ULFdQQVJBTTE2LExQQVJBTSk7Ci1leHRlcm4gTFJFU1VMVCBSZXBsYWNlVGV4dERsZ1Byb2MoSFdORDE2LFVJTlQsV1BBUkFNMTYsTFBBUkFNKTsKLWV4dGVybiBMUkVTVUxUIFNjcm9sbEJhclduZFByb2MoSFdORDE2LFVJTlQsV1BBUkFNMTYsTFBBUkFNKTsKLWV4dGVybiBMUkVTVUxUIFN0YXRpY1duZFByb2MoSFdORDE2LFVJTlQsV1BBUkFNMTYsTFBBUkFNKTsKK2V4dGVybiBMUkVTVUxUIENvbG9yRGxnUHJvYyhIV05EMTYsVUlOVDE2LFdQQVJBTTE2LExQQVJBTSk7CitleHRlcm4gTFJFU1VMVCBDb21ib0JveFduZFByb2MoSFdORDE2LFVJTlQxNixXUEFSQU0xNixMUEFSQU0pOworZXh0ZXJuIExSRVNVTFQgQ29tYm9MQm94V25kUHJvYyhIV05EMTYsVUlOVDE2LFdQQVJBTTE2LExQQVJBTSk7CitleHRlcm4gTFJFU1VMVCBGaWxlT3BlbkRsZ1Byb2MoSFdORDE2LFVJTlQxNixXUEFSQU0xNixMUEFSQU0pOworZXh0ZXJuIExSRVNVTFQgRmlsZVNhdmVEbGdQcm9jKEhXTkQxNixVSU5UMTYsV1BBUkFNMTYsTFBBUkFNKTsKK2V4dGVybiBMUkVTVUxUIEZpbmRUZXh0RGxnUHJvYyhIV05EMTYsVUlOVDE2LFdQQVJBTTE2LExQQVJBTSk7CitleHRlcm4gTFJFU1VMVCBNRElDbGllbnRXbmRQcm9jKEhXTkQxNixVSU5UMTYsV1BBUkFNMTYsTFBBUkFNKTsKK2V4dGVybiBMUkVTVUxUIFByaW50RGxnUHJvYyhIV05EMTYsVUlOVDE2LFdQQVJBTTE2LExQQVJBTSk7CitleHRlcm4gTFJFU1VMVCBQcmludFNldHVwRGxnUHJvYyhIV05EMTYsVUlOVDE2LFdQQVJBTTE2LExQQVJBTSk7CitleHRlcm4gTFJFU1VMVCBSZXBsYWNlVGV4dERsZ1Byb2MoSFdORDE2LFVJTlQxNixXUEFSQU0xNixMUEFSQU0pOworZXh0ZXJuIExSRVNVTFQgU2Nyb2xsQmFyV25kUHJvYyhIV05EMTYsVUlOVDE2LFdQQVJBTTE2LExQQVJBTSk7CitleHRlcm4gTFJFU1VMVCBTdGF0aWNXbmRQcm9jKEhXTkQxNixVSU5UMTYsV1BBUkFNMTYsTFBBUkFNKTsKIGV4dGVybiBMUkVTVUxUIFRBU0tfUmVzY2hlZHVsZSh2b2lkKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9sb2FkZXIvbWFpbi5jIGIvbG9hZGVyL21haW4uYwppbmRleCA2NDg1NGQ2Li44ZmQ4YjVkIDEwMDY0NAotLS0gYS9sb2FkZXIvbWFpbi5jCisrKyBiL2xvYWRlci9tYWluLmMKQEAgLTYwLDEwICs2MCwxNCBAQAogICAgIGV4dGVybiBCT09MMzIgUkVMQVlfSW5pdCh2b2lkKTsKICAgICBleHRlcm4gQk9PTDMyIFdJTjE2RFJWX0luaXQodm9pZCk7CiAgICAgZXh0ZXJuIEJPT0wzMiBTSUdOQUxfSW5pdCh2b2lkKTsKKyAgICBleHRlcm4gQk9PTDMyIFZJUlRVQUxfSW5pdCh2b2lkKTsKICAgICBleHRlcm4gQk9PTDMyIFdJREdFVFNfSW5pdCh2b2lkKTsKIAogICAgIGludCBxdWV1ZVNpemU7CiAKKyAgICAvKiBJbml0aWFsaXplIHZpcnR1YWwgbWVtb3J5IG1hbmFnZW1lbnQgKi8KKyAgICBpZiAoIVZJUlRVQUxfSW5pdCgpKSByZXR1cm4gMDsKKwogICAgIC8qIENyZWF0ZSB0aGUgc3lzdGVtIGFuZCBTRUdQVFIgaGVhcHMgKi8KICAgICBpZiAoIShTeXN0ZW1IZWFwID0gSGVhcENyZWF0ZSggSEVBUF9HUk9XQUJMRSwgMHgxMDAwMCwgMCApKSkgcmV0dXJuIDA7CiAgICAgaWYgKCEoU2VncHRySGVhcCA9IEhlYXBDcmVhdGUoIEhFQVBfV0lORV9TRUdQVFIsIDAsIDAgKSkpIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbG9hZGVyL21vZHVsZS5jIGIvbG9hZGVyL21vZHVsZS5jCmluZGV4IDRmNGMxZTQuLmIyNDc0ODkgMTAwNjQ0Ci0tLSBhL2xvYWRlci9tb2R1bGUuYworKysgYi9sb2FkZXIvbW9kdWxlLmMKQEAgLTg0OCw3ICs4NDgsNyBAQAogICAgIEZBUlBST0MxNiByZXQ7CiAgICAgc3RhdGljIEhNT0RVTEUxNiBoTW9kdWxlID0gMDsKIAotICAgIGlmICghaE1vZHVsZSkgaE1vZHVsZSA9IEdldE1vZHVsZUhhbmRsZSggIldQUk9DUyIgKTsKKyAgICBpZiAoIWhNb2R1bGUpIGhNb2R1bGUgPSBHZXRNb2R1bGVIYW5kbGUxNiggIldQUk9DUyIgKTsKICAgICBvcmRpbmFsID0gTU9EVUxFX0dldE9yZGluYWwoIGhNb2R1bGUsIG5hbWUgKTsKICAgICBpZiAoIShyZXQgPSBNT0RVTEVfR2V0RW50cnlQb2ludCggaE1vZHVsZSwgb3JkaW5hbCApKSkKICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiR2V0V25kUHJvYzE2OiAlcyBub3QgZm91bmQsIHBsZWFzZSByZXBvcnRcbiIsIG5hbWUgKTsKQEAgLTExMjksNyArMTEyOSw3IEBACiAJCVNFR1RBQkxFRU5UUlkgKiBwU2VnVGFibGUgPSAoU0VHVEFCTEVFTlRSWSAqKSBORV9TRUdfVEFCTEUocE1vZHVsZSk7CiAJCVNFTEZMT0FESEVBREVSICpzZWxmbG9hZGhlYWRlcjsKICAgICAgICAgICAgICAgICBTVEFDSzE2RlJBTUUgKnN0YWNrMTZUb3A7Ci0JCUhNT0RVTEUxNiBoc2VsZmxvYWQgPSBHZXRNb2R1bGVIYW5kbGUoIldQUk9DUyIpOworCQlITU9EVUxFMTYgaHNlbGZsb2FkID0gR2V0TW9kdWxlSGFuZGxlMTYoIldQUk9DUyIpOwogCQlXT1JEIG9sZHNzLCBvbGRzcCwgc2F2ZWRfZGdyb3VwID0gcFNlZ1RhYmxlW3BNb2R1bGUtPmRncm91cCAtIDFdLnNlbGVjdG9yOwogCQlmcHJpbnRmIChzdGRlcnIsICJXYXJuaW5nOiAgJSouKnMgaXMgYSBzZWxmLWxvYWRpbmcgbW9kdWxlXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdXBwb3J0IGZvciBzZWxmLWxvYWRpbmcgbW9kdWxlcyBpcyB2ZXJ5IGV4cGVyaW1lbnRhbFxuIiwKQEAgLTExNDIsNyArMTE0Miw3IEBACiAJCXNlbGZsb2FkaGVhZGVyLT5FbnRyeUFkZHJQcm9jID0gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU9EVUxFX0dldEVudHJ5UG9pbnQoaHNlbGZsb2FkLDI3KTsKIAkJc2VsZmxvYWRoZWFkZXItPk15QWxsb2MgID0gTU9EVUxFX0dldEVudHJ5UG9pbnQoaHNlbGZsb2FkLDI4KTsKLQkJc2VsZmxvYWRoZWFkZXItPlNldE93bmVyID0gTU9EVUxFX0dldEVudHJ5UG9pbnQoR2V0TW9kdWxlSGFuZGxlKCJLRVJORUwiKSw0MDMpOworCQlzZWxmbG9hZGhlYWRlci0+U2V0T3duZXIgPSBNT0RVTEVfR2V0RW50cnlQb2ludChHZXRNb2R1bGVIYW5kbGUxNigiS0VSTkVMIiksNDAzKTsKIAkJcE1vZHVsZS0+c2VsZl9sb2FkaW5nX3NlbCA9IEdsb2JhbEhhbmRsZVRvU2VsKAogCQkJCQlHTE9CQUxfQWxsb2MgKEdNRU1fWkVST0lOSVQsCiAJCQkJCTB4RkYwMCwgaE1vZHVsZSwgRkFMU0UsIEZBTFNFLCBGQUxTRSkKQEAgLTEyNjIsOSArMTI2Miw5IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCSAgICBMb2FkTW9kdWxlICAgIChLRVJORUwuNDUpCisgKgkgICAgTG9hZE1vZHVsZTE2ICAgIChLRVJORUwuNDUpCiAgKi8KLUhJTlNUQU5DRTE2IExvYWRNb2R1bGUoIExQQ1NUUiBuYW1lLCBMUFZPSUQgcGFyYW1CbG9jayApCitISU5TVEFOQ0UxNiBMb2FkTW9kdWxlMTYoIExQQ1NUUiBuYW1lLCBMUFZPSUQgcGFyYW1CbG9jayApCiB7CiAgICAgcmV0dXJuIE1PRFVMRV9Mb2FkKCBuYW1lLCBwYXJhbUJsb2NrLCBUUlVFICk7CiB9CkBAIC0xMjg4LDcgKzEyODgsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkgICAgR2V0TW9kdWxlSGFuZGxlICAgIChLRVJORUwuNDcpCisgKgkgICAgR2V0TW9kdWxlSGFuZGxlMTYgICAgKEtFUk5FTC40NykKICAqLwogSE1PRFVMRTE2IFdJTjE2X0dldE1vZHVsZUhhbmRsZSggU0VHUFRSIG5hbWUgKQogewpAQCAtMTI5Niw3ICsxMjk2LDcgQEAKICAgICByZXR1cm4gTU9EVUxFX0ZpbmRNb2R1bGUoIFBUUl9TRUdfVE9fTElOKG5hbWUpICk7CiB9CiAKLUhNT0RVTEUxNiBHZXRNb2R1bGVIYW5kbGUoIExQQ1NUUiBuYW1lICkKK0hNT0RVTEUxNiBHZXRNb2R1bGVIYW5kbGUxNiggTFBDU1RSIG5hbWUgKQogewogICAgIHJldHVybiBNT0RVTEVfRmluZE1vZHVsZSggbmFtZSApOwogfQpAQCAtMTQxMCw5ICsxNDEwLDkgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBGcmVlTGlicmFyeSAgIChLRVJORUwuOTYpCisgKiAgICAgICAgICAgRnJlZUxpYnJhcnkxNiAgIChLRVJORUwuOTYpCiAgKi8KLXZvaWQgRnJlZUxpYnJhcnkoIEhJTlNUQU5DRTE2IGhhbmRsZSApCit2b2lkIEZyZWVMaWJyYXJ5MTYoIEhJTlNUQU5DRTE2IGhhbmRsZSApCiB7CiAgICAgZHByaW50Zl9tb2R1bGUoIHN0ZGRlYiwiRnJlZUxpYnJhcnk6ICUwNHhcbiIsIGhhbmRsZSApOwogICAgIEZyZWVNb2R1bGUxNiggaGFuZGxlICk7CkBAIC0xNDc3LDcgKzE0NzcsNyBAQAogCXBhcmFtcy5jbWRMaW5lICA9IChTRUdQVFIpV0lOMTZfR2xvYmFsTG9jazE2KCBjbWRMaW5lSGFuZGxlICk7CiAJcGFyYW1zLnNob3dDbWQgID0gKFNFR1BUUilXSU4xNl9HbG9iYWxMb2NrMTYoIGNtZFNob3dIYW5kbGUgKTsKIAlwYXJhbXMucmVzZXJ2ZWQgPSAwOwotCWhhbmRsZSA9IExvYWRNb2R1bGUoIGZpbGVuYW1lLCAmcGFyYW1zICk7CisJaGFuZGxlID0gTG9hZE1vZHVsZTE2KCBmaWxlbmFtZSwgJnBhcmFtcyApOwogCWlmIChoYW5kbGUgPT0gMikgIC8qIGZpbGUgbm90IGZvdW5kICovCiAJewogCSAgICAvKiBDaGVjayB0aGF0IHRoZSBvcmlnaW5hbCBmaWxlIG5hbWUgZGlkIG5vdCBoYXZlIGEgc3VmZml4ICovCkBAIC0xNDg3LDcgKzE0ODcsNyBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHAgPSBmaWxlbmFtZSArIHN0cmxlbihmaWxlbmFtZSk7CiAgICAgICAgICAgICAgICAgc3RyY3B5KCBwLCAiLmV4ZSIgKTsKLSAgICAgICAgICAgICAgICBoYW5kbGUgPSBMb2FkTW9kdWxlKCBmaWxlbmFtZSwgJnBhcmFtcyApOworICAgICAgICAgICAgICAgIGhhbmRsZSA9IExvYWRNb2R1bGUxNiggZmlsZW5hbWUsICZwYXJhbXMgKTsKICAgICAgICAgICAgICAgICAqcCA9ICdcMCc7ICAvKiBSZW1vdmUgZXh0ZW5zaW9uICovCiAgICAgICAgICAgICB9CiAJfQpAQCAtMTY3NSw3ICsxNjc1LDcgQEAKICAqLwogQk9PTDE2IE1vZHVsZUZpbmROYW1lKCBNT0RVTEVFTlRSWSAqbHBtZSwgTFBDU1RSIG5hbWUgKQogewotICAgIGxwbWUtPndOZXh0ID0gR2V0TW9kdWxlSGFuZGxlKCBuYW1lICk7CisgICAgbHBtZS0+d05leHQgPSBHZXRNb2R1bGVIYW5kbGUxNiggbmFtZSApOwogICAgIHJldHVybiBNb2R1bGVOZXh0KCBscG1lICk7CiB9CiAKZGlmZiAtLWdpdCBhL2xvYWRlci9uZV9pbWFnZS5jIGIvbG9hZGVyL25lX2ltYWdlLmMKaW5kZXggOWJiZGYyMS4uZjgxY2Y4MiAxMDA2NDQKLS0tIGEvbG9hZGVyL25lX2ltYWdlLmMKKysrIGIvbG9hZGVyL25lX2ltYWdlLmMKQEAgLTMxLDcgKzMxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIE5FX0xvYWRTZWdtZW50CiAgKi8KLUJPT0wgTkVfTG9hZFNlZ21lbnQoIEhNT0RVTEUxNiBoTW9kdWxlLCBXT1JEIHNlZ251bSApCitCT09MMzIgTkVfTG9hZFNlZ21lbnQoIEhNT0RVTEUxNiBoTW9kdWxlLCBXT1JEIHNlZ251bSApCiB7CiAgICAgTkVfTU9EVUxFICpwTW9kdWxlOwogICAgIFNFR1RBQkxFRU5UUlkgKnBTZWdUYWJsZSwgKnBTZWc7CkBAIC02Miw4ICs2Miw4IEBACiAgICAgbHNlZWsoIGZkLCBwU2VnLT5maWxlcG9zIDw8IHBNb2R1bGUtPmFsaWdubWVudCwgU0VFS19TRVQgKTsKICAgICBzaXplID0gcFNlZy0+c2l6ZSA/IHBTZWctPnNpemUgOiAweDEwMDAwOwogICAgIG1lbSA9IEdsb2JhbExvY2sxNihwU2VnLT5zZWxlY3Rvcik7Ci0gICAgaWYgKHBNb2R1bGUtPmZsYWdzICYgTkVfRkZMQUdTX1NFTEZMT0FEICYmIHNlZ251bSA+IDEpIHsJCi0jaWZuZGVmIFdJTkVMSUIKKyAgICBpZiAocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfU0VMRkxPQUQgJiYgc2VnbnVtID4gMSkKKyAgICB7CiAgCS8qIEltcGxlbWVudCBzZWxmIGxvYWRpbmcgc2VnbWVudHMgKi8KICAJU0VMRkxPQURIRUFERVIgKnNlbGZsb2FkaGVhZGVyOwogICAgICAgICBTVEFDSzE2RlJBTUUgKnN0YWNrMTZUb3A7CkBAIC0xMTAsMTAgKzExMCw3IEBACiAgCQogIAlJRjE2MzJfU2F2ZWQxNl9zcyA9IG9sZHNzOwogIAlJRjE2MzJfU2F2ZWQxNl9zcCA9IG9sZHNwOwotI2Vsc2UKLQlmcHJpbnRmKHN0ZGVyciwiSkJQOiBJZ25vcmluZyBzZWxmIGxvYWRpbmcgc2VnbWVudHMgaW4gTkVfTG9hZFNlZ21lbnQuXG4iKTsKLSNlbmRpZgotICAgICB9CisgICAgfQogICAgIGVsc2UgaWYgKCEocFNlZy0+ZmxhZ3MgJiBORV9TRUdGTEFHU19JVEVSQVRFRCkpCiAgICAgICByZWFkKGZkLCBtZW0sIHNpemUpOwogICAgIGVsc2UgewpAQCAtMzYyLDkgKzM1OSw2IEBACiAgKi8KIHZvaWQgTkVfRml4dXBQcm9sb2dzKCBORV9NT0RVTEUgKnBNb2R1bGUgKQogewotI2lmZGVmIFdJTkVMSUIKLQlmcHJpbnRmKHN0ZGVyciwiTkVfRml4dXBQcm9sb2dzIHNob3VsZCBub3QgYmUgY2FsbGVkIGZvciBsaWJ3aW5lXG4iKTsKLSNlbHNlCiAgICAgU0VHVEFCTEVFTlRSWSAqcFNlZ1RhYmxlOwogICAgIFdPUkQgZGdyb3VwID0gMDsKICAgICBXT1JEIHNlbDsKQEAgLTQ0Myw3ICs0MzcsNiBAQAogICAgICAgICAgICAgcCArPSAoc2VsID09IDB4ZmYpID8gNiA6IDM7ICAKICAgICAgICAgfQogICAgIH0KLSNlbmRpZgogfQogCiAKQEAgLTQ1MiwxMiArNDQ1LDExIEBACiAgKgogICogQ2FsbCB0aGUgRExMIGluaXRpYWxpemF0aW9uIGNvZGUKICAqLwotc3RhdGljIEJPT0wgTkVfSW5pdERMTCggSE1PRFVMRTE2IGhNb2R1bGUgKQorc3RhdGljIEJPT0wzMiBORV9Jbml0RExMKCBITU9EVUxFMTYgaE1vZHVsZSApCiB7Ci0jaWZuZGVmIFdJTkVMSUIKLSAgICBpbnQgY3NfcmVnLCBkc19yZWcsIGlwX3JlZywgY3hfcmVnLCBkaV9yZWcsIGJwX3JlZzsKICAgICBORV9NT0RVTEUgKnBNb2R1bGU7CiAgICAgU0VHVEFCTEVFTlRSWSAqcFNlZ1RhYmxlOworICAgIENPTlRFWFQgY29udGV4dDsKIAogICAgIC8qIFJlZ2lzdGVycyBhdCBpbml0aWFsaXphdGlvbiBtdXN0IGJlOgogICAgICAqIGN4ICAgICBoZWFwIHNpemUKQEAgLTQ3Myw2ICs0NjUsOCBAQAogICAgICAgICAocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfV0lOMzIpKSByZXR1cm4gVFJVRTsgLypub3QgYSBsaWJyYXJ5Ki8KICAgICBpZiAoIXBNb2R1bGUtPmNzKSByZXR1cm4gVFJVRTsgIC8qIG5vIGluaXRpYWxpemF0aW9uIGNvZGUgKi8KIAorICAgIG1lbXNldCggJmNvbnRleHQsIDAsIHNpemVvZihjb250ZXh0KSApOworCiAgICAgaWYgKCEocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfU0lOR0xFREFUQSkpCiAgICAgewogICAgICAgICBpZiAocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfTVVMVElQTEVEQVRBIHx8IHBNb2R1bGUtPmRncm91cCkKQEAgLTQ4MywzMSArNDc3LDI4IEBACiAgICAgICAgIH0KICAgICAgICAgZWxzZSAgLyogREFUQSBOT05FIERMTCAqLwogICAgICAgICB7Ci0gICAgICAgICAgICBkc19yZWcgPSAwOwotICAgICAgICAgICAgY3hfcmVnID0gMDsKKyAgICAgICAgICAgIERTX3JlZygmY29udGV4dCkgID0gMDsKKyAgICAgICAgICAgIEVDWF9yZWcoJmNvbnRleHQpID0gMDsKICAgICAgICAgfQogICAgIH0KICAgICBlbHNlICAvKiBEQVRBIFNJTkdMRSBETEwgKi8KICAgICB7Ci0gICAgICAgIGRzX3JlZyA9IHBTZWdUYWJsZVtwTW9kdWxlLT5kZ3JvdXAtMV0uc2VsZWN0b3I7Ci0gICAgICAgIGN4X3JlZyA9IHBNb2R1bGUtPmhlYXBfc2l6ZTsKKyAgICAgICAgRFNfcmVnKCZjb250ZXh0KSAgPSBwU2VnVGFibGVbcE1vZHVsZS0+ZGdyb3VwLTFdLnNlbGVjdG9yOworICAgICAgICBFQ1hfcmVnKCZjb250ZXh0KSA9IHBNb2R1bGUtPmhlYXBfc2l6ZTsKICAgICB9CiAKLSAgICBjc19yZWcgPSBwU2VnVGFibGVbcE1vZHVsZS0+Y3MtMV0uc2VsZWN0b3I7Ci0gICAgaXBfcmVnID0gcE1vZHVsZS0+aXA7Ci0gICAgZGlfcmVnID0gZHNfcmVnID8gZHNfcmVnIDogaE1vZHVsZTsKLSAgICBicF9yZWcgPSBJRjE2MzJfU2F2ZWQxNl9zcCArICgoV09SRCkmKChTVEFDSzE2RlJBTUUqKTEpLT5icCAtIDEpOworICAgIENTX3JlZygmY29udGV4dCkgID0gcFNlZ1RhYmxlW3BNb2R1bGUtPmNzLTFdLnNlbGVjdG9yOworICAgIEVJUF9yZWcoJmNvbnRleHQpID0gcE1vZHVsZS0+aXA7CisgICAgRUJQX3JlZygmY29udGV4dCkgPSBJRjE2MzJfU2F2ZWQxNl9zcCArIChXT1JEKSYoKFNUQUNLMTZGUkFNRSopMCktPmJwOworICAgIEVESV9yZWcoJmNvbnRleHQpID0gRFNfcmVnKCZjb250ZXh0KSA/IERTX3JlZygmY29udGV4dCkgOiBoTW9kdWxlOworCiAKICAgICBwTW9kdWxlLT5jcyA9IDA7ICAvKiBEb24ndCBpbml0aWFsaXplIGl0IHR3aWNlICovCi0gICAgZHByaW50Zl9kbGwoIHN0ZGRlYiwgIkNhbGxpbmcgTGliTWFpbiwgY3M6aXA9JTA0eDolMDR4IGRzPSUwNHggZGk9JTA0eCBjeD0lMDR4XG4iLCAKLSAgICAgICAgICAgICAgICAgY3NfcmVnLCBpcF9yZWcsIGRzX3JlZywgZGlfcmVnLCBjeF9yZWcgKTsKLSAgICByZXR1cm4gQ2FsbFRvMTZfcmVnc18oIChGQVJQUk9DMTYpKGNzX3JlZyA8PCAxNiB8IGlwX3JlZyksIGRzX3JlZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyplcyovLCAwIC8qYnAqLywgMCAvKmF4Ki8sIDAgLypieCovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY3hfcmVnLCAwIC8qZHgqLywgMCAvKnNpKi8sIGRpX3JlZyApOwotI2Vsc2UKLSAgICBmcHJpbnRmKCBzdGRlcnIsIkpCUDogSWdub3JpbmcgY2FsbCB0byBMaWJNYWluXG4iICk7Ci0gICAgcmV0dXJuIEZBTFNFOwotI2VuZGlmCisgICAgZHByaW50Zl9kbGwoIHN0ZGRlYiwgIkNhbGxpbmcgTGliTWFpbiwgY3M6aXA9JTA0bHg6JTA0eCBkcz0lMDRseCBkaT0lMDR4IGN4PSUwNHhcbiIsIAorICAgICAgICAgICAgICAgICBDU19yZWcoJmNvbnRleHQpLCBJUF9yZWcoJmNvbnRleHQpLCBEU19yZWcoJmNvbnRleHQpLAorICAgICAgICAgICAgICAgICBESV9yZWcoJmNvbnRleHQpLCBDWF9yZWcoJmNvbnRleHQpICk7CisgICAgQ2FsbFRvMTZfcmVnc18oICZjb250ZXh0ICk7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIApkaWZmIC0tZ2l0IGEvbG9hZGVyL3BlX2ltYWdlLmMgYi9sb2FkZXIvcGVfaW1hZ2UuYwppbmRleCA1OWQxNWNiLi4yNGNmM2U5IDEwMDY0NAotLS0gYS9sb2FkZXIvcGVfaW1hZ2UuYworKysgYi9sb2FkZXIvcGVfaW1hZ2UuYwpAQCAtNDA2LDkgKzQwNiw5IEBACiAJbG9hZF9hZGRyID0gcGUtPmxvYWRfYWRkciA9IChpbnQpeG1hbGxvYyhwZS0+dm1hX3NpemUpOwogCW1lbXNldCggbG9hZF9hZGRyLCAwLCBwZS0+dm1hX3NpemUpOwogI2Vsc2UKLQlsb2FkX2FkZHIgPSAgcGUtPmxvYWRfYWRkciA9IFZpcnR1YWxBbGxvYyggTlVMTCwgcGUtPnZtYV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVNX0NPTU1JVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0VfRVhFQ1VURV9SRUFEV1JJVEUgKTsKKwlsb2FkX2FkZHIgPSAoaW50KSBWaXJ0dWFsQWxsb2MoIE5VTEwsIHBlLT52bWFfc2l6ZSwgTUVNX0NPTU1JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRV9FWEVDVVRFX1JFQURXUklURSApOworICAgICAgICBwZS0+bG9hZF9hZGRyID0gbG9hZF9hZGRyOwogI2VuZGlmCiAKIAlkcHJpbnRmX3dpbjMyKHN0ZGRlYiwgIkxvYWQgYWRkciBpcyByZWFsbHkgJXgsIHJhbmdlICV4XG4iLApAQCAtNTEwLDkgKzUxMCwxMSBAQAogCQlbSU1BR0VfRElSRUNUT1JZX0VOVFJZX0dMT0JBTFBUUl0uU2l6ZSkKIAkJZHByaW50Zl93aW4zMihzdGRuaW1wLCJHbG9iYWwgUG9pbnRlciAoTUlQUykgaWdub3JlZFxuIik7CiAKKyNpZmRlZiBOT1QJLyogd2UgaW5pdGlhbGl6ZSB0aGlzIGxhdGVyICovCiAJaWYocGUtPnBlX2hlYWRlci0+T3B0aW9uYWxIZWFkZXIuRGF0YURpcmVjdG9yeQogCQlbSU1BR0VfRElSRUNUT1JZX0VOVFJZX1RMU10uU2l6ZSkKIAkJIGRwcmludGZfd2luMzIoc3RkbmltcCwiVGhyZWFkIGxvY2FsIHN0b3JhZ2UgaWdub3JlZFxuIik7CisjZW5kaWYKIAogCWlmKHBlLT5wZV9oZWFkZXItPk9wdGlvbmFsSGVhZGVyLkRhdGFEaXJlY3RvcnkKIAkJW0lNQUdFX0RJUkVDVE9SWV9FTlRSWV9MT0FEX0NPTkZJR10uU2l6ZSkKQEAgLTY0Nyw0ICs2NDksMzAgQEAKIAl9CiAJUEVfSW5pdERMTCggaE1vZHVsZSApOwogfQorCit2b2lkIFBFX0luaXRUbHMoIFBFX01PRFVMRSAqbW9kdWxlICkKK3sKKyAgIC8qIEZJWE1FOiB0bHMgY2FsbGJhY2tzID8/PyAqLworICAgRFdPUkQgIGluZGV4OworICAgRFdPUkQgIGRhdGFzaXplOworICAgRFdPUkQgIHNpemU7CisgICBMUFZPSUQgbWVtOworICAgTFBJTUFHRV9UTFNfRElSRUNUT1JZIHBkaXI7CisKKyAgICBpZiAoIW1vZHVsZS0+cGVfaGVhZGVyLT5PcHRpb25hbEhlYWRlci5EYXRhRGlyZWN0b3J5W0lNQUdFX0ZJTEVfVEhSRUFEX0xPQ0FMX1NUT1JBR0VdLlZpcnR1YWxBZGRyZXNzKQorICAgICAgICByZXR1cm47CisKKyAgICBwZGlyID0gKExQVk9JRCkobW9kdWxlLT5sb2FkX2FkZHIgKyBtb2R1bGUtPnBlX2hlYWRlci0+T3B0aW9uYWxIZWFkZXIuCisgICAgICAgICAgICAgICBEYXRhRGlyZWN0b3J5W0lNQUdFX0ZJTEVfVEhSRUFEX0xPQ0FMX1NUT1JBR0VdLlZpcnR1YWxBZGRyZXNzKTsKKyAgICBpbmRleCA9IFRsc0FsbG9jKCk7CisgICAgZGF0YXNpemUgPSBwZGlyLT5FbmRBZGRyZXNzT2ZSYXdEYXRhLXBkaXItPlN0YXJ0QWRkcmVzc09mUmF3RGF0YTsKKyAgICBzaXplICAgICA9IGRhdGFzaXplICsgcGRpci0+U2l6ZU9mWmVyb0ZpbGw7CisgICAgICAgIAorICAgIG1lbSA9IFZpcnR1YWxBbGxvYygwLHNpemUsIE1FTV9SRVNFUlZFfE1FTV9DT01NSVQsIFBBR0VfUkVBRFdSSVRFICk7CisgICAgCisgICAgbWVtY3B5KG1lbSwoTFBWT0lEKSBwZGlyLT5TdGFydEFkZHJlc3NPZlJhd0RhdGEsIGRhdGFzaXplKTsKKyAgICBUbHNTZXRWYWx1ZShpbmRleCxtZW0pOworICAgICoocGRpci0+QWRkcmVzc09mSW5kZXgpPWluZGV4OyAgIAorfQorCiAjZW5kaWYgLyogV0lORUxJQiAqLwpkaWZmIC0tZ2l0IGEvbG9hZGVyL3BlX3Jlc291cmNlLmMgYi9sb2FkZXIvcGVfcmVzb3VyY2UuYwppbmRleCAwODY1NWQwLi4yZDJiYmFmIDEwMDY0NAotLS0gYS9sb2FkZXIvcGVfcmVzb3VyY2UuYworKysgYi9sb2FkZXIvcGVfcmVzb3VyY2UuYwpAQCAtMTEsNiArMTEsNyBAQAogICogQ29weXJpZ2h0IDE5OTcgTWFyY3VzIE1laXNzbmVyCiAgKi8KIAorI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgIndpbnR5cGVzLmgiCiAjaW5jbHVkZSAid2luZG93cy5oIgpAQCAtNTQsNyArNTUsMTIgQEAKICAgICBpbnQgbmFtZWxlbjsKIAogICAgIGlmIChISVdPUkQobmFtZSkpIHsKLSAgICAvKiBGSVhNRTogd2hhdCBhYm91dCAjeHh4IG5hbWVzPyAqLworICAgIAlpZiAobmFtZVswXT09JyMnKSB7CisJCWNoYXIJYnVmWzEwXTsKKworCQlsc3RyY3B5bld0b0EoYnVmLG5hbWUrMSwxMCk7CisJCXJldHVybiBHZXRSZXNEaXJFbnRyeVcocmVzZGlycHRyLChMUENXU1RSKWF0b2koYnVmKSxyb290KTsKKwl9CiAJZW50cnlUYWJsZSA9IChMUElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWV9FTlRSWSkgKAogCQkJKEJZVEUgKikgcmVzZGlycHRyICsgCiAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZKSk7CmRpZmYgLS1naXQgYS9sb2FkZXIvcmVzb3VyY2UuYyBiL2xvYWRlci9yZXNvdXJjZS5jCmluZGV4IGQyZjUwZmUuLjM3ZGM5YzEgMTAwNjQ0Ci0tLSBhL2xvYWRlci9yZXNvdXJjZS5jCisrKyBiL2xvYWRlci9yZXNvdXJjZS5jCkBAIC0xMTEsOSArMTExLDE1IEBACiAgICAgaWYgKCFoTW9kdWxlKSBoTW9kdWxlID0gR2V0VGFza0RTKCk7CiAgICAgaE1vZHVsZSA9IEdldEV4ZVB0ciggaE1vZHVsZSApOyAgLyogSW4gY2FzZSB3ZSB3ZXJlIHBhc3NlZCBhbiBoSW5zdGFuY2UgKi8KICAgICBkcHJpbnRmX3Jlc291cmNlKHN0ZGRlYiwgIkZpbmRSZXNvdXJjZTMyVzogbW9kdWxlPSUwOHggdHlwZT0iLCBoTW9kdWxlICk7Ci0gICAgUHJpbnRJZCggdHlwZSApOworICAgIGlmIChISVdPUkQodHlwZSkpCisgICAgCWRwcmludGZfcmVzb3VyY2Uoc3RkZGViLCIlcCIsdHlwZSk7CisgICAgZWxzZQorCWRwcmludGZfcmVzb3VyY2Uoc3RkZGViLCIjJXAiLHR5cGUpOwogICAgIGRwcmludGZfcmVzb3VyY2UoIHN0ZGRlYiwgIiBuYW1lPSIgKTsKLSAgICBQcmludElkKCBuYW1lICk7CisgICAgaWYgKEhJV09SRChuYW1lKSkKKyAgICAJZHByaW50Zl9yZXNvdXJjZShzdGRkZWIsIiVwIixuYW1lKTsKKyAgICBlbHNlCisJZHByaW50Zl9yZXNvdXJjZShzdGRkZWIsIiMlcCIsbmFtZSk7CiAgICAgZHByaW50Zl9yZXNvdXJjZSggc3RkZGViLCAiXG4iICk7CiAgICAgaWYgKCEocE1vZHVsZSA9IE1PRFVMRV9HZXRQdHIoIGhNb2R1bGUgKSkpIHJldHVybiAwOwogICAgIGlmICghKHBNb2R1bGUtPmZsYWdzICYgTkVfRkZMQUdTX1dJTjMyKSkgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9sb2FkZXIvc2lnbmFsLmMgYi9sb2FkZXIvc2lnbmFsLmMKaW5kZXggZTFmYmExZi4uMTc3MzllYyAxMDA2NDQKLS0tIGEvbG9hZGVyL3NpZ25hbC5jCisrKyBiL2xvYWRlci9zaWduYWwuYwpAQCAtNDgsNiArNDgsMjEgQEAKIAllcnJubyA9IC1zaWc7CiAJcmV0dXJuIC0xOwogfQorI2VuZGlmIC8qIGxpbnV4ICovCisKKworI2lmZGVmIGxpbnV4CisjZGVmaW5lIEhBTkRMRVJfREVGKG5hbWUpIHZvaWQgbmFtZSAoaW50IHNpZ25hbCwgU0lHQ09OVEVYVCBjb250ZXh0X3N0cnVjdCkKKyNkZWZpbmUgSEFORExFUl9QUk9MT0cgU0lHQ09OVEVYVCAqY29udGV4dCA9ICZjb250ZXh0X3N0cnVjdDsgKHZvaWQpY29udGV4dDsgeworI2RlZmluZSBIQU5ETEVSX0VQSUxPRyB9CisjZWxpZiBkZWZpbmVkKF9fc3ZyNF9fKSB8fCBkZWZpbmVkKF9TQ09fRFMpCisjZGVmaW5lIEhBTkRMRVJfREVGKG5hbWUpIHZvaWQgbmFtZSAoaW50IHNpZ25hbCwgdm9pZCAqc2lnaW5mbywgU0lHQ09OVEVYVCAqY29udGV4dCkKKyNkZWZpbmUgSEFORExFUl9QUk9MT0cgIC8qIG5vdGhpbmcgKi8KKyNkZWZpbmUgSEFORExFUl9FUElMT0cgIC8qIG5vdGhpbmcgKi8KKyNlbHNlCisjZGVmaW5lIEhBTkRMRVJfREVGKG5hbWUpIHZvaWQgbmFtZSAoaW50IHNpZ25hbCwgaW50IGNvZGUsIFNJR0NPTlRFWFQgKmNvbnRleHQpCisjZGVmaW5lIEhBTkRMRVJfUFJPTE9HICAvKiBub3RoaW5nICovCisjZGVmaW5lIEhBTkRMRVJfRVBJTE9HICAvKiBub3RoaW5nICovCiAjZW5kaWYKIAogZXh0ZXJuIEJPT0wzMiBJTlNUUl9FbXVsYXRlSW5zdHJ1Y3Rpb24oIFNJR0NPTlRFWFQgKmNvbnRleHQgKTsKQEAgLTU3LDE5ICs3MiwxMyBAQAogICoKICAqIFNJR0FMUk0gaGFuZGxlci4KICAqLwotI2lmZGVmIGxpbnV4Ci1zdGF0aWMgdm9pZCB3aW5lX3RpbWVyKGludCBzaWduYWwsIFNJR0NPTlRFWFQgY29udGV4dF9zdHJ1Y3QpCitzdGF0aWMKK0hBTkRMRVJfREVGKHdpbmVfdGltZXIpCiB7Ci0jZWxpZiBkZWZpbmVkKF9fc3ZyNF9fKQotc3RhdGljIHZvaWQgd2luZV90aW1lcihpbnQgc2lnbmFsLCB2b2lkICpzaWdpbmZvLCBTSUdDT05URVhUICpjb250ZXh0KQotewotI2Vsc2UKLXN0YXRpYyB2b2lkIHdpbmVfdGltZXIoaW50IHNpZ25hbCwgaW50IGNvZGUsIFNJR0NPTlRFWFQgKmNvbnRleHQpCi17Ci0jZW5kaWYKLSAgICAvKiBTaG91bGQgZG8gcmVhbC10aW1lIHRpbWVycyBoZXJlICovCi0KLSAgICBET1NNRU1fVGljaygpOworICBIQU5ETEVSX1BST0xPRzsKKyAgLyogU2hvdWxkIGRvIHJlYWwtdGltZSB0aW1lcnMgaGVyZSAqLworICBET1NNRU1fVGljaygpOworICBIQU5ETEVSX0VQSUxPRzsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTc3LDE5ICs4NiwxMyBAQAogICogCiAgKiBIYW5kbGUgQ3RybC1DIGFuZCBzdWNoCiAgKi8KLSNpZmRlZiBsaW51eAotc3RhdGljIHZvaWQgU0lHTkFMX2JyZWFrKGludCBzaWduYWwsIFNJR0NPTlRFWFQgY29udGV4dF9zdHJ1Y3QpCitzdGF0aWMKK0hBTkRMRVJfREVGKFNJR05BTF9icmVhaykKIHsKLSAgICBTSUdDT05URVhUICpjb250ZXh0ID0gJmNvbnRleHRfc3RydWN0OwotI2VsaWYgZGVmaW5lZChfX3N2cjRfXykgfHwgZGVmaW5lZChfU0NPX0RTKQotc3RhdGljIHZvaWQgU0lHTkFMX2JyZWFrKGludCBzaWduYWwsIHZvaWQgKnNpZ2luZm8sIFNJR0NPTlRFWFQgKmNvbnRleHQpCi17Ci0jZWxzZQotc3RhdGljIHZvaWQgU0lHTkFMX2JyZWFrKGludCBzaWduYWwsIGludCBjb2RlLCBTSUdDT05URVhUICpjb250ZXh0KQotewotI2VuZGlmCi0gICAgaWYgKE9wdGlvbnMuZGVidWcpIHdpbmVfZGVidWcoIHNpZ25hbCwgY29udGV4dCApOyAgLyogRW50ZXIgb3VyIGRlYnVnZ2VyICovCi0gICAgZXhpdCgwKTsKKyAgSEFORExFUl9QUk9MT0c7CisgIGlmIChPcHRpb25zLmRlYnVnKSB3aW5lX2RlYnVnKCBzaWduYWwsIGNvbnRleHQgKTsgIC8qIEVudGVyIG91ciBkZWJ1Z2dlciAqLworICBleGl0KDApOworICBIQU5ETEVSX0VQSUxPRzsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTk3LDEzICsxMDAsMTkgQEAKICAqIAogICogd2FpdDQgdGVybWluYXRlZCBjaGlsZCBwcm9jZXNzZXMKICAqLwotc3RhdGljIHZvaWQgU0lHTkFMX2NoaWxkKHZvaWQpCitzdGF0aWMKK0hBTkRMRVJfREVGKFNJR05BTF9jaGlsZCkKIHsKLSNpZiBkZWZpbmVkKF9fc3ZyNF9fKSB8fCBkZWZpbmVkKF9fRU1YX18pCi0gICAgd2FpdChOVUxMKTsKKyAgSEFORExFUl9QUk9MT0c7CisjaWZkZWYgSEFWRV9XQUlUNAorICB3YWl0NCggMCwgTlVMTCwgV05PSEFORywgTlVMTCk7CisjZWxpZiBkZWZpbmVkIChIQVZFX1dBSVRQSUQpCisgIC8qIEkgYW0gc29ydC1vZiBndWVzc2luZyB0aGF0IHRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlIHdhaXQ0IGNhbGwuICAqLworICB3YWl0cGlkICgwLCBOVUxMLCBXTk9IQU5HKTsKICNlbHNlCi0gICAgd2FpdDQoIDAsIE5VTEwsIFdOT0hBTkcsIE5VTEwpOworICB3YWl0KE5VTEwpOwogI2VuZGlmCisgIEhBTkRMRVJfRVBJTE9HOwogfQogCiAKQEAgLTExMiwxOCArMTIxLDEyIEBACiAgKgogICogU0lHVFJBUCBoYW5kbGVyLgogICovCi0jaWZkZWYgbGludXgKLXN0YXRpYyB2b2lkIFNJR05BTF90cmFwKGludCBzaWduYWwsIFNJR0NPTlRFWFQgY29udGV4dF9zdHJ1Y3QpCitzdGF0aWMKK0hBTkRMRVJfREVGKFNJR05BTF90cmFwKQogewotICAgIFNJR0NPTlRFWFQgKmNvbnRleHQgPSAmY29udGV4dF9zdHJ1Y3Q7Ci0jZWxpZiBkZWZpbmVkKF9fc3ZyNF9fKSB8fCBkZWZpbmVkKF9TQ09fRFMpCi1zdGF0aWMgdm9pZCBTSUdOQUxfdHJhcChpbnQgc2lnbmFsLCB2b2lkICpzaWdpbmZvLCBTSUdDT05URVhUICpjb250ZXh0KQotewotI2Vsc2UKLXN0YXRpYyB2b2lkIFNJR05BTF90cmFwKGludCBzaWduYWwsIGludCBjb2RlLCBTSUdDT05URVhUICpjb250ZXh0KQotewotI2VuZGlmCi0gICAgd2luZV9kZWJ1Zyggc2lnbmFsLCBjb250ZXh0ICk7ICAvKiBFbnRlciBvdXIgZGVidWdnZXIgKi8KKyAgSEFORExFUl9QUk9MT0c7CisgIHdpbmVfZGVidWcoIHNpZ25hbCwgY29udGV4dCApOyAgLyogRW50ZXIgb3VyIGRlYnVnZ2VyICovCisgIEhBTkRMRVJfRVBJTE9HOwogfQogCiAKQEAgLTEzMiwzMCArMTM1LDI0IEBACiAgKgogICogU2VnZmF1bHQgaGFuZGxlci4KICAqLwotI2lmZGVmIGxpbnV4Ci1zdGF0aWMgdm9pZCBTSUdOQUxfZmF1bHQoaW50IHNpZ25hbCwgU0lHQ09OVEVYVCBjb250ZXh0X3N0cnVjdCkKK3N0YXRpYworSEFORExFUl9ERUYoU0lHTkFMX2ZhdWx0KQogewotICAgIFNJR0NPTlRFWFQgKmNvbnRleHQgPSAmY29udGV4dF9zdHJ1Y3Q7Ci0jZWxpZiBkZWZpbmVkKF9fc3ZyNF9fKSB8fCBkZWZpbmVkKF9TQ09fRFMpCi1zdGF0aWMgdm9pZCBTSUdOQUxfZmF1bHQoaW50IHNpZ25hbCwgdm9pZCAqc2lnaW5mbywgU0lHQ09OVEVYVCAqY29udGV4dCkKLXsKLSNlbHNlCi1zdGF0aWMgdm9pZCBTSUdOQUxfZmF1bHQoaW50IHNpZ25hbCwgaW50IGNvZGUsIFNJR0NPTlRFWFQgKmNvbnRleHQpCi17Ci0jZW5kaWYKLSAgICBpZiAoQ1Nfc2lnKGNvbnRleHQpID09IFdJTkVfQ09ERV9TRUxFQ1RPUikKKyAgSEFORExFUl9QUk9MT0c7CisgIGlmIChDU19zaWcoY29udGV4dCkgPT0gV0lORV9DT0RFX1NFTEVDVE9SKQogICAgIHsKICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiU2VnbWVudGF0aW9uIGZhdWx0IGluIFdpbmUgcHJvZ3JhbSAoJXg6JWx4KS4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGxlYXNlIGRlYnVnLlxuIiwKICAgICAgICAgICAgICAgICAgQ1Nfc2lnKGNvbnRleHQpLCBFSVBfc2lnKGNvbnRleHQpICk7CiAgICAgfQotICAgIGVsc2UKKyAgZWxzZQogICAgIHsKICAgICAgICAgaWYgKElOU1RSX0VtdWxhdGVJbnN0cnVjdGlvbiggY29udGV4dCApKSByZXR1cm47CiAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIlNlZ21lbnRhdGlvbiBmYXVsdCBpbiBXaW5kb3dzIHByb2dyYW0gJXg6JWx4LlxuIiwKICAgICAgICAgICAgICAgICAgQ1Nfc2lnKGNvbnRleHQpLCBFSVBfc2lnKGNvbnRleHQpICk7CiAgICAgfQotICAgIHdpbmVfZGVidWcoIHNpZ25hbCwgY29udGV4dCApOworICB3aW5lX2RlYnVnKCBzaWduYWwsIGNvbnRleHQgKTsKKyAgSEFORExFUl9FUElMT0c7CiB9CiAKIApkaWZmIC0tZ2l0IGEvbG9hZGVyL3Rhc2suYyBiL2xvYWRlci90YXNrLmMKaW5kZXggZDlhNjY2Zi4uMzhlNjAyOCAxMDA2NDQKLS0tIGEvbG9hZGVyL3Rhc2suYworKysgYi9sb2FkZXIvdGFzay5jCkBAIC00MCw2ICs0MCw3IEBACiAjZGVmaW5lIE1JTl9USFVOS1MgIDMyCiAKIGV4dGVybiB2b2lkIFVTRVJfQXBwRXhpdCggSFRBU0sxNiwgSElOU1RBTkNFMTYsIEhRVUVVRTE2ICk7CitleHRlcm4gdm9pZCBQRV9Jbml0VGxzKCBQRV9NT0RVTEUgKm1vZHVsZSApOwogCiAgIC8qIFNhdmVkIDE2LWJpdCBzdGFjayBmb3IgY3VycmVudCBwcm9jZXNzIChXaW4xNiBvbmx5KSAqLwogV09SRCBJRjE2MzJfU2F2ZWQxNl9zcyA9IDA7CkBAIC0zMTUsNyArMzE2LDcgQEAKICAqCiAgKiBGcmVlIGEgTWFrZVByb2NJbnN0YW5jZSgpIHRodW5rLgogICovCi1zdGF0aWMgQk9PTCBUQVNLX0ZyZWVUaHVuayggSFRBU0sxNiBoVGFzaywgU0VHUFRSIHRodW5rICkKK3N0YXRpYyBCT09MMzIgVEFTS19GcmVlVGh1bmsoIEhUQVNLMTYgaFRhc2ssIFNFR1BUUiB0aHVuayApCiB7CiAgICAgVERCICpwVGFzazsKICAgICBUSFVOS1MgKnBUaHVuazsKQEAgLTM0Nyw3ICszNDgsNiBAQAogI2lmbmRlZiBXSU5FTElCCiBzdGF0aWMgdm9pZCBUQVNLX0NhbGxUb1N0YXJ0KHZvaWQpCiB7Ci0gICAgaW50IGNzX3JlZywgZHNfcmVnLCBpcF9yZWc7CiAgICAgaW50IGV4aXRfY29kZSA9IDE7CiAgICAgVERCICpwVGFzayA9IChUREIgKilHbG9iYWxMb2NrMTYoIGhDdXJyZW50VGFzayApOwogICAgIE5FX01PRFVMRSAqcE1vZHVsZSA9IE1PRFVMRV9HZXRQdHIoIHBUYXNrLT5oTW9kdWxlICk7CkBAIC0zODQsMTkgKzM4NCwyMiBAQAogICAgICAgICAgKiBzcyAgIHN0YWNrIHNlbGVjdG9yCiAgICAgICAgICAqIHNwICAgdG9wIG9mIHRoZSBzdGFjawogICAgICAgICAgKi8KKyAgICAgICAgQ09OVEVYVCBjb250ZXh0OwogCi0gICAgICAgIGNzX3JlZyA9IHBTZWdUYWJsZVtwTW9kdWxlLT5jcyAtIDFdLnNlbGVjdG9yOwotICAgICAgICBpcF9yZWcgPSBwTW9kdWxlLT5pcDsKLSAgICAgICAgZHNfcmVnID0gcFNlZ1RhYmxlW3BNb2R1bGUtPmRncm91cCAtIDFdLnNlbGVjdG9yOworICAgICAgICBtZW1zZXQoICZjb250ZXh0LCAwLCBzaXplb2YoY29udGV4dCkgKTsKKyAgICAgICAgQ1NfcmVnKCZjb250ZXh0KSAgPSBwU2VnVGFibGVbcE1vZHVsZS0+Y3MgLSAxXS5zZWxlY3RvcjsKKyAgICAgICAgRFNfcmVnKCZjb250ZXh0KSAgPSBwU2VnVGFibGVbcE1vZHVsZS0+ZGdyb3VwIC0gMV0uc2VsZWN0b3I7CisgICAgICAgIEVTX3JlZygmY29udGV4dCkgID0gcFRhc2stPmhQREI7CisgICAgICAgIEVJUF9yZWcoJmNvbnRleHQpID0gcE1vZHVsZS0+aXA7CisgICAgICAgIEVCWF9yZWcoJmNvbnRleHQpID0gcE1vZHVsZS0+c3RhY2tfc2l6ZTsKKyAgICAgICAgRUNYX3JlZygmY29udGV4dCkgPSBwTW9kdWxlLT5oZWFwX3NpemU7CisgICAgICAgIEVESV9yZWcoJmNvbnRleHQpID0gY29udGV4dC5TZWdEczsKIAotICAgICAgICBkcHJpbnRmX3Rhc2soIHN0ZGRlYiwgIlN0YXJ0aW5nIG1haW4gcHJvZ3JhbTogY3M6aXA9JTA0eDolMDR4IGRzPSUwNHggc3M6c3A9JTA0eDolMDR4XG4iLAotICAgICAgICAgICAgICAgICAgICAgIGNzX3JlZywgaXBfcmVnLCBkc19yZWcsCi0gICAgICAgICAgICAgICAgICAgICAgSUYxNjMyX1NhdmVkMTZfc3MsIElGMTYzMl9TYXZlZDE2X3NwKTsKKyAgICAgICAgZHByaW50Zl90YXNrKCBzdGRkZWIsICJTdGFydGluZyBtYWluIHByb2dyYW06IGNzOmlwPSUwNGx4OiUwNHggZHM9JTA0bHggc3M6c3A9JTA0eDolMDR4XG4iLAorICAgICAgICAgICAgICAgICAgICAgIENTX3JlZygmY29udGV4dCksIElQX3JlZygmY29udGV4dCksIERTX3JlZygmY29udGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgSUYxNjMyX1NhdmVkMTZfc3MsIElGMTYzMl9TYXZlZDE2X3NwICk7CiAKLSAgICAgICAgQ2FsbFRvMTZfcmVnc18oIChGQVJQUk9DMTYpKGNzX3JlZyA8PCAxNiB8IGlwX3JlZyksIGRzX3JlZywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBUYXNrLT5oUERCIC8qZXMqLywgMCAvKmJwKi8sIDAgLypheCovLAotICAgICAgICAgICAgICAgICAgICAgICAgcE1vZHVsZS0+c3RhY2tfc2l6ZSAvKmJ4Ki8sIHBNb2R1bGUtPmhlYXBfc2l6ZSAvKmN4Ki8sCi0gICAgICAgICAgICAgICAgICAgICAgICAwIC8qZHgqLywgMCAvKnNpKi8sIGRzX3JlZyAvKmRpKi8gKTsKKyAgICAgICAgQ2FsbFRvMTZfcmVnc18oICZjb250ZXh0ICk7CiAgICAgICAgIC8qIFRoaXMgc2hvdWxkIG5ldmVyIHJldHVybiAqLwogICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJUQVNLX0NhbGxUb1N0YXJ0OiBNYWluIHByb2dyYW0gcmV0dXJuZWQhXG4iICk7CiAgICAgICAgIFRBU0tfS2lsbEN1cnJlbnRUYXNrKCAxICk7CkBAIC00OTgsNyArNTAxLDggQEAKICAgICBwVGFzay0+cGRiLmludDIwID0gMHgyMGNkOwogICAgIHBUYXNrLT5wZGIuZGlzcGF0Y2hlclswXSA9IDB4OWE7ICAvKiBsam1wICovCiAjaWZuZGVmIFdJTkVMSUIKLSAgICAqKEZBUlBST0MxNiAqKSZwVGFzay0+cGRiLmRpc3BhdGNoZXJbMV0gPSBNT0RVTEVfR2V0RW50cnlQb2ludCggR2V0TW9kdWxlSGFuZGxlKCJLRVJORUwiKSwgMTAyICk7ICAvKiBLRVJORUwuMTAyIGlzIERPUzNDYWxsKCkgKi8KKyAgICAqKEZBUlBST0MxNiAqKSZwVGFzay0+cGRiLmRpc3BhdGNoZXJbMV0gPSBNT0RVTEVfR2V0RW50cnlQb2ludCgKKyAgICAgICAgICAgIEdldE1vZHVsZUhhbmRsZTE2KCJLRVJORUwiKSwgMTAyICk7ICAvKiBLRVJORUwuMTAyIGlzIERPUzNDYWxsKCkgKi8KICNlbmRpZgogICAgIHBUYXNrLT5wZGIuc2F2ZWRpbnQyMiA9IElOVF9HZXRIYW5kbGVyKCAweDIyICk7CiAgICAgcFRhc2stPnBkYi5zYXZlZGludDIzID0gSU5UX0dldEhhbmRsZXIoIDB4MjMgKTsKQEAgLTU0MSw2ICs1NDUsMTEgQEAKICAgICAgICAgICAgIChMUFRIUkVBRF9TVEFSVF9ST1VUSU5FKShwTW9kdWxlLT5wZV9tb2R1bGUtPmxvYWRfYWRkciArCiAgICAgICAgICAgICBwTW9kdWxlLT5wZV9tb2R1bGUtPnBlX2hlYWRlci0+T3B0aW9uYWxIZWFkZXIuQWRkcmVzc09mRW50cnlQb2ludCk7CiAgICAgICAgIHBUYXNrLT50aGRiID0gVEhSRUFEX0NyZWF0ZSggcGRiMzIsIDAsIHN0YXJ0ICk7CisjaWZuZGVmIFdJTkVMSUIKKyAgICAgICAgLyogRklYTUU6IHNob3VsZCBub3QgYmUgZG9uZSBoZXJlICovCisgICAgICAgIHBDdXJyZW50VGhyZWFkID0gcFRhc2stPnRoZGI7CisgICAgICAgIFBFX0luaXRUbHMoIHBNb2R1bGUtPnBlX21vZHVsZSApOworI2VuZGlmCiAgICAgfQogICAgIGVsc2UKICAgICAgICAgcFRhc2stPnRoZGIgPSBUSFJFQURfQ3JlYXRlKCBwZGIzMiwgMCwgTlVMTCApOwpAQCAtMTUwMSw5ICsxNTEwLDE4IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0QXBwQ29tcGF0RmxhZ3MgICAoS0VSTkVMLjM1NCkgKFVTRVIzMi4yMDUpCisgKiAgICAgICAgICAgR2V0QXBwQ29tcGF0RmxhZ3MxNiAgIChLRVJORUwuMzU0KQogICovCi1EV09SRCBHZXRBcHBDb21wYXRGbGFncyggSFRBU0szMiBoVGFzayApCitEV09SRCBHZXRBcHBDb21wYXRGbGFnczE2KCBIVEFTSzE2IGhUYXNrICkKK3sKKyAgICByZXR1cm4gR2V0QXBwQ29tcGF0RmxhZ3MzMiggaFRhc2sgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHZXRBcHBDb21wYXRGbGFnczMyICAgKFVTRVIzMi4yMDUpCisgKi8KK0RXT1JEIEdldEFwcENvbXBhdEZsYWdzMzIoIEhUQVNLMzIgaFRhc2sgKQogewogICAgIFREQiAqcFRhc2s7CiAKZGlmZiAtLWdpdCBhL21lbW9yeS9NYWtlZmlsZS5pbiBiL21lbW9yeS9NYWtlZmlsZS5pbgppbmRleCBkNDczY2QwLi4wMjE0ZjkxIDEwMDY0NAotLS0gYS9tZW1vcnkvTWFrZWZpbGUuaW4KKysrIGIvbWVtb3J5L01ha2VmaWxlLmluCkBAIC0xLDQgKzEsNCBAQAotREVGUyAgICAgID0gLURfX1dJTkVfXyAtRE5PX1RSQU5TSVRJT05fVFlQRVMKK0RFRlMgICAgICA9IC1EX19XSU5FX18KIFRPUFNSQ0RJUiA9IEB0b3Bfc3JjZGlyQAogVE9QT0JKRElSID0gLi4KIFNSQ0RJUiAgICA9IEBzcmNkaXJACkBAIC0xMiw3ICsxMiw4IEBACiAJbGR0LmMgXAogCWxvY2FsLmMgXAogCXNlbGVjdG9yLmMgXAotCXN0cmluZy5jCisJc3RyaW5nLmMgXAorCXZpcnR1YWwuYwogCiBhbGw6ICQoTU9EVUxFKS5vCiAKZGlmZiAtLWdpdCBhL21lbW9yeS9nbG9iYWwuYyBiL21lbW9yeS9nbG9iYWwuYwppbmRleCAzYjE1NTQ5Li4xYTVjMTJlIDEwMDY0NAotLS0gYS9tZW1vcnkvZ2xvYmFsLmMKKysrIGIvbWVtb3J5L2dsb2JhbC5jCkBAIC02MDQsNyArNjA0LDcgQEAKICAgIAogICAgaWYoIGxwQmxvY2sgKQogICAgewotICAgICAgIEhNT0RVTEUxNiBoTW9kdWxlID0gR2V0TW9kdWxlSGFuZGxlKCJLRVJORUwiKTsKKyAgICAgICBITU9EVUxFMTYgaE1vZHVsZSA9IEdldE1vZHVsZUhhbmRsZTE2KCJLRVJORUwiKTsKICAgICAgICBXT1JECSB3U2VsZWN0b3I7CiAgICAKICAgICAgICB3U2VsZWN0b3IgPSBHTE9CQUxfQ3JlYXRlQmxvY2soR01FTV9GSVhFRCwgbHBCbG9jaywgc2l6ZSwgCmRpZmYgLS1naXQgYS9tZW1vcnkvaGVhcC5jIGIvbWVtb3J5L2hlYXAuYwppbmRleCA0OTRiMTE1Li43NWU1YWRjIDEwMDY0NAotLS0gYS9tZW1vcnkvaGVhcC5jCisrKyBiL21lbW9yeS9oZWFwLmMKQEAgLTI2NiwxMiArMjY2LDEyIEBACiAgICAgRFdPUkQgc2l6ZSA9IChEV09SRCkoKGNoYXIgKilwdHIgLSAoY2hhciAqKXN1YmhlYXApOwogICAgIHNpemUgPSAoc2l6ZSArIDB4ZmZmKSAmIDB4ZmZmZmYwMDA7ICAvKiBBbGlnbiBzaXplIG9uIGEgcGFnZSBib3VuZGFyeSAqLwogICAgIGlmIChzaXplID49IHN1YmhlYXAtPmNvbW1pdFNpemUpIHJldHVybiBUUlVFOwotICAgIGlmICghVmlydHVhbEZyZWUoIChjaGFyICopc3ViaGVhcCArIHN1YmhlYXAtPmNvbW1pdFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgc2l6ZSAtIHN1YmhlYXAtPmNvbW1pdFNpemUsIE1FTV9ERUNPTU1JVCApKQorICAgIGlmICghVmlydHVhbEZyZWUoIChjaGFyICopc3ViaGVhcCArIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgc3ViaGVhcC0+Y29tbWl0U2l6ZSAtIHNpemUsIE1FTV9ERUNPTU1JVCApKQogICAgIHsKICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiSEVBUF9EZWNvbW1pdDogY291bGQgbm90IGRlY29tbWl0ICUwOGx4IGJ5dGVzIGF0ICUwOGx4IGZvciBoZWFwICUwOGx4XG4iLAotICAgICAgICAgICAgICAgICBzaXplIC0gc3ViaGVhcC0+Y29tbWl0U2l6ZSwKLSAgICAgICAgICAgICAgICAgKERXT1JEKSgoY2hhciAqKXN1YmhlYXAgKyBzdWJoZWFwLT5jb21taXRTaXplKSwKKyAgICAgICAgICAgICAgICAgc3ViaGVhcC0+Y29tbWl0U2l6ZSAtIHNpemUsCisgICAgICAgICAgICAgICAgIChEV09SRCkoKGNoYXIgKilzdWJoZWFwICsgc2l6ZSksCiAgICAgICAgICAgICAgICAgIChEV09SRClzdWJoZWFwLT5oZWFwICk7CiAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CkBAIC0zODIsNyArMzgyLDYgQEAKICAgICAgICAgLyogRnJlZSB0aGUgbWVtb3J5ICovCiAgICAgICAgIHN1YmhlYXAtPm1hZ2ljID0gMDsKICAgICAgICAgaWYgKHN1YmhlYXAtPnNlbGVjdG9yKSBGcmVlU2VsZWN0b3IoIHN1YmhlYXAtPnNlbGVjdG9yICk7Ci0gICAgICAgIFZpcnR1YWxGcmVlKCBzdWJoZWFwLCBzdWJoZWFwLT5zaXplLCBNRU1fREVDT01NSVQgKTsKICAgICAgICAgVmlydHVhbEZyZWUoIHN1YmhlYXAsIDAsIE1FTV9SRUxFQVNFICk7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC04NTMsNyArODUyLDYgQEAKICAgICB7CiAgICAgICAgIFNVQkhFQVAgKm5leHQgPSBzdWJoZWFwLT5uZXh0OwogICAgICAgICBpZiAoc3ViaGVhcC0+c2VsZWN0b3IpIEZyZWVTZWxlY3Rvciggc3ViaGVhcC0+c2VsZWN0b3IgKTsKLSAgICAgICAgVmlydHVhbEZyZWUoIHN1YmhlYXAsIHN1YmhlYXAtPmNvbW1pdFNpemUsIE1FTV9ERUNPTU1JVCApOwogICAgICAgICBWaXJ0dWFsRnJlZSggc3ViaGVhcCwgMCwgTUVNX1JFTEVBU0UgKTsKICAgICAgICAgc3ViaGVhcCA9IG5leHQ7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVtb3J5L3NlbGVjdG9yLmMgYi9tZW1vcnkvc2VsZWN0b3IuYwppbmRleCBiYmIyNWM2Li4xZGEwNzY4IDEwMDY0NAotLS0gYS9tZW1vcnkvc2VsZWN0b3IuYworKysgYi9tZW1vcnkvc2VsZWN0b3IuYwpAQCAtNyw2ICs3LDcgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAibGR0LmgiCisjaW5jbHVkZSAibWlzY2VtdS5oIgogI2luY2x1ZGUgInNlbGVjdG9ycy5oIgogI2luY2x1ZGUgInN0YWNrZnJhbWUuaCIKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgpkaWZmIC0tZ2l0IGEvbWVtb3J5L3ZpcnR1YWwuYyBiL21lbW9yeS92aXJ0dWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNjMzk3YQotLS0gL2Rldi9udWxsCisrKyBiL21lbW9yeS92aXJ0dWFsLmMKQEAgLTAsMCArMSw5NzYgQEAKKy8qCisgKiBXaW4zMiB2aXJ0dWFsIG1lbW9yeSBmdW5jdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgMTk5NyBBbGV4YW5kcmUgSnVsbGlhcmQKKyAqLworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSAid2luYmFzZS5oIgorI2luY2x1ZGUgIndpbmVycm9yLmgiCisjaW5jbHVkZSAiZmlsZS5oIgorI2luY2x1ZGUgImhlYXAuaCIKKyNpbmNsdWRlICJwcm9jZXNzLmgiCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgInN0ZGRlYnVnLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKworLyogRmlsZSBtYXBwaW5nICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIEszMk9CSiAgICAgICAgaGVhZGVyOworICAgIERXT1JEICAgICAgICAgc2l6ZV9oaWdoOworICAgIERXT1JEICAgICAgICAgc2l6ZV9sb3c7CisgICAgRklMRV9PQkpFQ1QgICpmaWxlOworICAgIEJZVEUgICAgICAgICAgcHJvdGVjdDsKK30gRklMRV9NQVBQSU5HOworCisvKiBGaWxlIHZpZXcgKi8KK3R5cGVkZWYgc3RydWN0IF9GVgoreworICAgIHN0cnVjdCBfRlYgICAqbmV4dDsgICAgIC8qIE5leHQgdmlldyAqLworICAgIHN0cnVjdCBfRlYgICAqcHJldjsgICAgIC8qIFByZXYgdmlldyAqLworICAgIFVJTlQzMiAgICAgICAgYmFzZTsgICAgIC8qIEJhc2UgYWRkcmVzcyAqLworICAgIFVJTlQzMiAgICAgICAgc2l6ZTsgICAgIC8qIFNpemUgaW4gYnl0ZXMgKi8KKyAgICBVSU5UMzIgICAgICAgIGZsYWdzOyAgICAvKiBBbGxvY2F0aW9uIGZsYWdzICovCisgICAgRklMRV9NQVBQSU5HICptYXBwaW5nOyAgLyogRmlsZSBtYXBwaW5nICovCisgICAgQllURSAgICAgICAgICBwcm90ZWN0OyAgLyogUHJvdGVjdGlvbiBmb3IgYWxsIHBhZ2VzIGF0IGFsbG9jYXRpb24gdGltZSAqLworICAgIEJZVEUgICAgICAgICAgcHJvdFsxXTsgIC8qIFByb3RlY3Rpb24gYnl0ZSBmb3IgZWFjaCBwYWdlICovCit9IEZJTEVfVklFVzsKKworLyogUGVyLXBhZ2UgcHJvdGVjdGlvbiBieXRlIHZhbHVlcyAqLworI2RlZmluZSBWUFJPVF9SRUFEICAgICAgIDB4MDEKKyNkZWZpbmUgVlBST1RfV1JJVEUgICAgICAweDAyCisjZGVmaW5lIFZQUk9UX0VYRUMgICAgICAgMHgwNAorI2RlZmluZSBWUFJPVF9XUklURUNPUFkgIDB4MDgKKyNkZWZpbmUgVlBST1RfR1VBUkQgICAgICAweDEwCisjZGVmaW5lIFZQUk9UX05PQ0FDSEUgICAgMHgyMAorI2RlZmluZSBWUFJPVF9DT01NSVRURUQgIDB4NDAKKworLyogUGVyLXZpZXcgZmxhZ3MgKi8KKyNkZWZpbmUgVkZMQUdfU1lTVEVNICAgICAweDAxCisKKy8qIENvbnZlcnNpb24gZnJvbSBWUFJPVF8qIHRvIFdpbjMyIGZsYWdzICovCitzdGF0aWMgY29uc3QgQllURSBWSVJUVUFMX1dpbjMyRmxhZ3NbMTZdID0KK3sKKyAgICBQQUdFX05PQUNDRVNTLCAgICAgICAgICAgICAgLyogMCAqLworICAgIFBBR0VfUkVBRE9OTFksICAgICAgICAgICAgICAvKiBSRUFEICovCisgICAgUEFHRV9SRUFEV1JJVEUsICAgICAgICAgICAgIC8qIFdSSVRFICovCisgICAgUEFHRV9SRUFEV1JJVEUsICAgICAgICAgICAgIC8qIFJFQUQgfCBXUklURSAqLworICAgIFBBR0VfRVhFQ1VURSwgICAgICAgICAgICAgICAvKiBFWEVDICovCisgICAgUEFHRV9FWEVDVVRFX1JFQUQsICAgICAgICAgIC8qIFJFQUQgfCBFWEVDICovCisgICAgUEFHRV9FWEVDVVRFX1JFQURXUklURSwgICAgIC8qIFdSSVRFIHwgRVhFQyAqLworICAgIFBBR0VfRVhFQ1VURV9SRUFEV1JJVEUsICAgICAvKiBSRUFEIHwgV1JJVEUgfCBFWEVDICovCisgICAgUEFHRV9XUklURUNPUFksICAgICAgICAgICAgIC8qIFdSSVRFQ09QWSAqLworICAgIFBBR0VfV1JJVEVDT1BZLCAgICAgICAgICAgICAvKiBSRUFEIHwgV1JJVEVDT1BZICovCisgICAgUEFHRV9XUklURUNPUFksICAgICAgICAgICAgIC8qIFdSSVRFIHwgV1JJVEVDT1BZICovCisgICAgUEFHRV9XUklURUNPUFksICAgICAgICAgICAgIC8qIFJFQUQgfCBXUklURSB8IFdSSVRFQ09QWSAqLworICAgIFBBR0VfRVhFQ1VURV9XUklURUNPUFksICAgICAvKiBFWEVDIHwgV1JJVEVDT1BZICovCisgICAgUEFHRV9FWEVDVVRFX1dSSVRFQ09QWSwgICAgIC8qIFJFQUQgfCBFWEVDIHwgV1JJVEVDT1BZICovCisgICAgUEFHRV9FWEVDVVRFX1dSSVRFQ09QWSwgICAgIC8qIFdSSVRFIHwgRVhFQyB8IFdSSVRFQ09QWSAqLworICAgIFBBR0VfRVhFQ1VURV9XUklURUNPUFkgICAgICAvKiBSRUFEIHwgV1JJVEUgfCBFWEVDIHwgV1JJVEVDT1BZICovCit9OworCisKK3N0YXRpYyBGSUxFX1ZJRVcgKlZJUlRVQUxfRmlyc3RWaWV3OworCitzdGF0aWMgVUlOVDMyIHBhZ2Vfc2hpZnQ7CitzdGF0aWMgVUlOVDMyIHBhZ2VfbWFzazsKKworI2RlZmluZSBST1VORF9BRERSKGFkZHIpIFwKKyAgICgoVUlOVDMyKShhZGRyKSAmIH5wYWdlX21hc2spCisKKyNkZWZpbmUgUk9VTkRfU0laRShhZGRyLHNpemUpIFwKKyAgICgoKFVJTlQzMikoc2l6ZSkgKyAoKFVJTlQzMikoYWRkcikgJiBwYWdlX21hc2spICsgcGFnZV9tYXNrKSAmIH5wYWdlX21hc2spCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgVklSVFVBTF9EZXN0cm95TWFwcGluZworICoKKyAqIERlc3Ryb3kgYSBGSUxFX01BUFBJTkcgb2JqZWN0LgorICovCit2b2lkIFZJUlRVQUxfRGVzdHJveU1hcHBpbmcoIEszMk9CSiAqcHRyICkKK3sKKyAgICBGSUxFX01BUFBJTkcgKm1hcHBpbmcgPSAoRklMRV9NQVBQSU5HICopcHRyOworICAgIGFzc2VydCggcHRyLT50eXBlID09IEszMk9CSl9NRU1fTUFQUEVEX0ZJTEUgKTsKKworICAgIGlmIChtYXBwaW5nLT5maWxlKSBLMzJPQkpfRGVjQ291bnQoICZtYXBwaW5nLT5maWxlLT5oZWFkZXIgKTsKKyAgICBwdHItPnR5cGUgPSBLMzJPQkpfVU5LTk9XTjsKKyAgICBIZWFwRnJlZSggU3lzdGVtSGVhcCwgMCwgbWFwcGluZyApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFZJUlRVQUxfR2V0UHJvdFN0cgorICovCitzdGF0aWMgY29uc3QgY2hhciAqVklSVFVBTF9HZXRQcm90U3RyKCBCWVRFIHByb3QgKQoreworICAgIHN0YXRpYyBjaGFyIGJ1ZmZlcls2XTsKKyAgICBidWZmZXJbMF0gPSAocHJvdCAmIFZQUk9UX0NPTU1JVFRFRCkgPyAnYycgOiAnLSc7CisgICAgYnVmZmVyWzFdID0gKHByb3QgJiBWUFJPVF9HVUFSRCkgPyAnZycgOiAnLSc7CisgICAgYnVmZmVyWzJdID0gKHByb3QgJiBWUFJPVF9SRUFEKSA/ICdyJyA6ICctJzsKKyAgICBidWZmZXJbM10gPSAocHJvdCAmIFZQUk9UX1dSSVRFKSA/CisgICAgICAgICAgICAgICAgICAgICgocHJvdCAmIFZQUk9UX1dSSVRFQ09QWSkgPyAndycgOiAnVycpIDogJy0nOworICAgIGJ1ZmZlcls0XSA9IChwcm90ICYgVlBST1RfRVhFQykgPyAneCcgOiAnLSc7CisgICAgYnVmZmVyWzVdID0gMDsKKyAgICByZXR1cm4gYnVmZmVyOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFZJUlRVQUxfRHVtcFZpZXcKKyAqLworc3RhdGljIHZvaWQgVklSVFVBTF9EdW1wVmlldyggRklMRV9WSUVXICp2aWV3ICkKK3sKKyAgICBVSU5UMzIgaSwgY291bnQ7CisgICAgVUlOVDMyIGFkZHIgPSB2aWV3LT5iYXNlOworICAgIEJZVEUgcHJvdCA9IHZpZXctPnByb3RbMF07CisKKyAgICBkcHJpbnRmX3ZpcnR1YWwoIHN0ZGRlYiwgIlZpZXc6ICUwOHggLSAlMDh4JXNcbiIsCisgICAgICAgICAgICAgICAgICAgICB2aWV3LT5iYXNlLCB2aWV3LT5iYXNlICsgdmlldy0+c2l6ZSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAodmlldy0+ZmxhZ3MgJiBWRkxBR19TWVNURU0pID8gIiAoc3lzdGVtKSIgOiAiIiApOworCisgICAgZm9yIChjb3VudCA9IGkgPSAxOyBpIDwgdmlldy0+c2l6ZSA+PiBwYWdlX3NoaWZ0OyBpKyssIGNvdW50KyspCisgICAgeworICAgICAgICBpZiAodmlldy0+cHJvdFtpXSA9PSBwcm90KSBjb250aW51ZTsKKyAgICAgICAgZHByaW50Zl92aXJ0dWFsKCBzdGRkZWIsICIgICAgJTA4eCAtICUwOHggJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYWRkciwgYWRkciArIChjb3VudCA8PCBwYWdlX3NoaWZ0KSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgVklSVFVBTF9HZXRQcm90U3RyKHByb3QpICk7CisgICAgICAgIGFkZHIgKz0gKGNvdW50IDw8IHBhZ2Vfc2hpZnQpOworICAgICAgICBwcm90ID0gdmlldy0+cHJvdFtpXTsKKyAgICAgICAgY291bnQgPSAwOworICAgIH0KKyAgICBpZiAoY291bnQpCisgICAgICAgIGRwcmludGZfdmlydHVhbCggc3RkZGViLCAiICAgICUwOHggLSAlMDh4ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIsIGFkZHIgKyAoY291bnQgPDwgcGFnZV9zaGlmdCkgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgIFZJUlRVQUxfR2V0UHJvdFN0cihwcm90KSApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFZJUlRVQUxfRHVtcAorICovCit2b2lkIFZJUlRVQUxfRHVtcCh2b2lkKQoreworICAgIEZJTEVfVklFVyAqdmlldyA9IFZJUlRVQUxfRmlyc3RWaWV3OworICAgIGRwcmludGZfdmlydHVhbCggc3RkZGViLCAiXG5EdW1wIG9mIGFsbCB2aXJ0dWFsIG1lbW9yeSB2aWV3czpcblxuIiApOworICAgIHdoaWxlICh2aWV3KQorICAgIHsKKyAgICAgICAgVklSVFVBTF9EdW1wVmlldyggdmlldyApOworICAgICAgICB2aWV3ID0gdmlldy0+bmV4dDsKKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgVklSVFVBTF9GaW5kVmlldworICoKKyAqIEZpbmQgdGhlIHZpZXcgY29udGFpbmluZyBhIGdpdmVuIGFkZHJlc3MuCisgKi8KK3N0YXRpYyBGSUxFX1ZJRVcgKlZJUlRVQUxfRmluZFZpZXcoIFVJTlQzMiBhZGRyICkKK3sKKyAgICBGSUxFX1ZJRVcgKnZpZXcgPSBWSVJUVUFMX0ZpcnN0VmlldzsKKyAgICB3aGlsZSAodmlldykKKyAgICB7CisgICAgICAgIGlmICh2aWV3LT5iYXNlID4gYWRkcikgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmICh2aWV3LT5iYXNlICsgdmlldy0+c2l6ZSA+IGFkZHIpIHJldHVybiB2aWV3OworICAgICAgICB2aWV3ID0gdmlldy0+bmV4dDsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgVklSVFVBTF9DcmVhdGVWaWV3CisgKgorICogQ3JlYXRlIGEgbmV3IHZpZXcgYW5kIGFkZCBpdCBpbiB0aGUgbGlua2VkIGxpc3QuCisgKi8KK3N0YXRpYyBGSUxFX1ZJRVcgKlZJUlRVQUxfQ3JlYXRlVmlldyggVUlOVDMyIGJhc2UsIFVJTlQzMiBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMzIgZmxhZ3MsIEJZVEUgdnByb3QgKQoreworICAgIEZJTEVfVklFVyAqdmlldywgKnByZXY7CisKKyAgICAvKiBDcmVhdGUgdGhlIHZpZXcgc3RydWN0dXJlICovCisKKyAgICBzaXplID4+PSBwYWdlX3NoaWZ0OworICAgIHZpZXcgPSAoRklMRV9WSUVXICopeG1hbGxvYyggc2l6ZW9mKCp2aWV3KSArIHNpemUgLSAxICk7CisgICAgdmlldy0+YmFzZSAgICA9IGJhc2U7CisgICAgdmlldy0+c2l6ZSAgICA9IHNpemUgPDwgcGFnZV9zaGlmdDsKKyAgICB2aWV3LT5mbGFncyAgID0gZmxhZ3M7CisgICAgdmlldy0+cHJvdGVjdCA9IHZwcm90OworICAgIG1lbXNldCggdmlldy0+cHJvdCwgdnByb3QsIHNpemUgKTsKKworICAgIC8qIEluc2VydCBpdCBpbiB0aGUgbGlua2VkIGxpc3QgKi8KKworICAgIGlmICghVklSVFVBTF9GaXJzdFZpZXcgfHwgKFZJUlRVQUxfRmlyc3RWaWV3LT5iYXNlID4gYmFzZSkpCisgICAgeworICAgICAgICB2aWV3LT5uZXh0ID0gVklSVFVBTF9GaXJzdFZpZXc7CisgICAgICAgIHZpZXctPnByZXYgPSBOVUxMOworICAgICAgICBpZiAodmlldy0+bmV4dCkgdmlldy0+bmV4dC0+cHJldiA9IHZpZXc7CisgICAgICAgIFZJUlRVQUxfRmlyc3RWaWV3ID0gdmlldzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcHJldiA9IFZJUlRVQUxfRmlyc3RWaWV3OworICAgICAgICB3aGlsZSAocHJldi0+bmV4dCAmJiAocHJldi0+bmV4dC0+YmFzZSA8IGJhc2UpKSBwcmV2ID0gcHJldi0+bmV4dDsKKyAgICAgICAgdmlldy0+bmV4dCA9IHByZXYtPm5leHQ7CisgICAgICAgIHZpZXctPnByZXYgPSBwcmV2OworICAgICAgICBpZiAodmlldy0+bmV4dCkgdmlldy0+bmV4dC0+cHJldiA9IHZpZXc7CisgICAgICAgIHByZXYtPm5leHQgID0gdmlldzsKKyAgICB9CisgICAgaWYgKGRlYnVnZ2luZ192aXJ0dWFsKSBWSVJUVUFMX0R1bXBWaWV3KCB2aWV3ICk7CisgICAgcmV0dXJuIHZpZXc7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgVklSVFVBTF9EZWxldGVWaWV3CisgKgorICogRGVsZXRlIGFuIHZpZXcuCisgKi8KK3N0YXRpYyB2b2lkIFZJUlRVQUxfRGVsZXRlVmlldyggRklMRV9WSUVXICp2aWV3ICkKK3sKKyAgICBtdW5tYXAoICh2b2lkICopdmlldy0+YmFzZSwgdmlldy0+c2l6ZSApOworICAgIGlmICh2aWV3LT5uZXh0KSB2aWV3LT5uZXh0LT5wcmV2ID0gdmlldy0+cHJldjsKKyAgICBpZiAodmlldy0+cHJldikgdmlldy0+cHJldi0+bmV4dCA9IHZpZXctPm5leHQ7CisgICAgZWxzZSBWSVJUVUFMX0ZpcnN0VmlldyA9IHZpZXctPm5leHQ7CisgICAgZnJlZSggdmlldyApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFZJUlRVQUxfR2V0VW5peFByb3QKKyAqCisgKiBDb252ZXJ0IHBhZ2UgcHJvdGVjdGlvbnMgdG8gcHJvdGVjdGlvbiBmb3IgbW1hcC9tcHJvdGVjdC4KKyAqLworc3RhdGljIGludCBWSVJUVUFMX0dldFVuaXhQcm90KCBCWVRFIHZwcm90ICkKK3sKKyAgICBpbnQgcHJvdCA9IDA7CisgICAgaWYgKCh2cHJvdCAmIFZQUk9UX0NPTU1JVFRFRCkgJiYgISh2cHJvdCAmIFZQUk9UX0dVQVJEKSkKKyAgICB7CisgICAgICAgIGlmICh2cHJvdCAmIFZQUk9UX1JFQUQpIHByb3QgfD0gUFJPVF9SRUFEOworICAgICAgICBpZiAodnByb3QgJiBWUFJPVF9XUklURSkgcHJvdCB8PSBQUk9UX1dSSVRFOworICAgICAgICBpZiAodnByb3QgJiBWUFJPVF9FWEVDKSBwcm90IHw9IFBST1RfRVhFQzsKKyAgICB9CisgICAgcmV0dXJuIHByb3Q7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgVklSVFVBTF9HZXRXaW4zMlByb3QKKyAqCisgKiBDb252ZXJ0IHBhZ2UgcHJvdGVjdGlvbnMgdG8gV2luMzIgZmxhZ3MuCisgKi8KK3N0YXRpYyB2b2lkIFZJUlRVQUxfR2V0V2luMzJQcm90KCBCWVRFIHZwcm90LCBEV09SRCAqcHJvdGVjdCwgRFdPUkQgKnN0YXRlICkKK3sKKyAgICAqcHJvdGVjdCA9IFZJUlRVQUxfV2luMzJGbGFnc1t2cHJvdCAmIDB4MGZdOworICAgIGlmICh2cHJvdCAmIFZQUk9UX0dVQVJEKSAqcHJvdGVjdCB8PSBQQUdFX0dVQVJEOworICAgIGlmICh2cHJvdCAmIFZQUk9UX05PQ0FDSEUpICpwcm90ZWN0IHw9IFBBR0VfTk9DQUNIRTsKKworICAgIGlmIChzdGF0ZSkgKnN0YXRlID0gKHZwcm90ICYgVlBST1RfQ09NTUlUVEVEKSA/IE1FTV9DT01NSVQgOiBNRU1fUkVTRVJWRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBWSVJUVUFMX0dldFByb3QKKyAqCisgKiBCdWlsZCBwYWdlIHByb3RlY3Rpb25zIGZyb20gV2luMzIgZmxhZ3MuCisgKi8KK3N0YXRpYyBCWVRFIFZJUlRVQUxfR2V0UHJvdCggRFdPUkQgcHJvdGVjdCApCit7CisgICAgQllURSB2cHJvdDsKKworICAgIHN3aXRjaChwcm90ZWN0ICYgMHhmZikKKyAgICB7CisgICAgY2FzZSBQQUdFX1JFQURPTkxZOgorICAgICAgICB2cHJvdCA9IFZQUk9UX1JFQUQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUEFHRV9SRUFEV1JJVEU6CisgICAgICAgIHZwcm90ID0gVlBST1RfUkVBRCB8IFZQUk9UX1dSSVRFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBBR0VfV1JJVEVDT1BZOgorICAgICAgICB2cHJvdCA9IFZQUk9UX1JFQUQgfCBWUFJPVF9XUklURSB8IFZQUk9UX1dSSVRFQ09QWTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQQUdFX0VYRUNVVEU6CisgICAgICAgIHZwcm90ID0gVlBST1RfRVhFQzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQQUdFX0VYRUNVVEVfUkVBRDoKKyAgICAgICAgdnByb3QgPSBWUFJPVF9FWEVDIHwgVlBST1RfUkVBRDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQQUdFX0VYRUNVVEVfUkVBRFdSSVRFOgorICAgICAgICB2cHJvdCA9IFZQUk9UX0VYRUMgfCBWUFJPVF9SRUFEIHwgVlBST1RfV1JJVEUgfCBWUFJPVF9XUklURUNPUFk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUEFHRV9FWEVDVVRFX1dSSVRFQ09QWToKKyAgICAgICAgdnByb3QgPSBWUFJPVF9FWEVDIHwgVlBST1RfUkVBRCB8IFZQUk9UX1dSSVRFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBBR0VfTk9BQ0NFU1M6CisgICAgZGVmYXVsdDoKKyAgICAgICAgdnByb3QgPSAwOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKHByb3RlY3QgJiBQQUdFX0dVQVJEKSB2cHJvdCB8PSBWUFJPVF9HVUFSRDsKKyAgICBpZiAocHJvdGVjdCAmIFBBR0VfTk9DQUNIRSkgdnByb3QgfD0gVlBST1RfTk9DQUNIRTsKKyAgICByZXR1cm4gdnByb3Q7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgVklSVFVBTF9TZXRQcm90CisgKgorICogQ2hhbmdlIHRoZSBwcm90ZWN0aW9uIG9mIGEgcmFuZ2Ugb2YgcGFnZXMuCisgKi8KK3N0YXRpYyBCT09MMzIgVklSVFVBTF9TZXRQcm90KCBGSUxFX1ZJRVcgKnZpZXcsIFVJTlQzMiBiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiBzaXplLCBCWVRFIHZwcm90ICkKK3sKKyAgICBkcHJpbnRmX3ZpcnR1YWwoIHN0ZGRlYiwgIlZJUlRVQUxfU2V0UHJvdDogJTA4eC0lMDh4ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgYmFzZSwgYmFzZSArIHNpemUgLSAxLCBWSVJUVUFMX0dldFByb3RTdHIoIHZwcm90ICkgKTsKKworICAgIGlmIChtcHJvdGVjdCggKHZvaWQgKiliYXNlLCBzaXplLCBWSVJUVUFMX0dldFVuaXhQcm90KHZwcm90KSApKQorICAgICAgICByZXR1cm4gRkFMU0U7ICAvKiBGSVhNRTogbGFzdCBlcnJvciAqLworCisgICAgbWVtc2V0KCB2aWV3LT5wcm90ICsgKChiYXNlIC0gdmlldy0+YmFzZSkgPj4gcGFnZV9zaGlmdCksCisgICAgICAgICAgICB2cHJvdCwgc2l6ZSA+PiBwYWdlX3NoaWZ0ICk7CisgICAgaWYgKGRlYnVnZ2luZ192aXJ0dWFsKSBWSVJUVUFMX0R1bXBWaWV3KCB2aWV3ICk7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICBWSVJUVUFMX0NoZWNrRmxhZ3MKKyAqCisgKiBDaGVjayB0aGF0IGFsbCBwYWdlcyBpbiBhIHJhbmdlIGhhdmUgdGhlIGdpdmVuIGZsYWdzLgorICovCitzdGF0aWMgQk9PTDMyIFZJUlRVQUxfQ2hlY2tGbGFncyggVUlOVDMyIGJhc2UsIFVJTlQzMiBzaXplLCBCWVRFIGZsYWdzICkKK3sKKyAgICBGSUxFX1ZJRVcgKnZpZXc7CisgICAgVUlOVDMyIHBhZ2U7CisKKyAgICBpZiAoIXNpemUpIHJldHVybiBUUlVFOworICAgIGlmICghKHZpZXcgPSBWSVJUVUFMX0ZpbmRWaWV3KCBiYXNlICkpKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKHZpZXctPmJhc2UgKyB2aWV3LT5zaXplIDwgYmFzZSArIHNpemUpIHJldHVybiBGQUxTRTsKKyAgICBwYWdlID0gKGJhc2UgLSB2aWV3LT5iYXNlKSA+PiBwYWdlX3NoaWZ0OworICAgIHNpemUgPSBST1VORF9TSVpFKCBiYXNlLCBzaXplICkgPj4gcGFnZV9zaGlmdDsKKyAgICB3aGlsZSAoc2l6ZS0tKSBpZiAoKHZpZXctPnByb3RbcGFnZSsrXSAmIGZsYWdzKSAhPSBmbGFncykgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBUUlVFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFZJUlRVQUxfSW5pdAorICovCitCT09MMzIgVklSVFVBTF9Jbml0KHZvaWQpCit7CisgICAgU1lTVEVNX0lORk8gc3lzaW5mbzsKKyAgICBHZXRTeXN0ZW1JbmZvKCAmc3lzaW5mbyApOworCisgICAgcGFnZV9tYXNrID0gc3lzaW5mby5kd1BhZ2VTaXplIC0gMTsKKyAgICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIHBvd2VyIG9mIDIgKi8KKyAgICBhc3NlcnQoICEoc3lzaW5mby5kd1BhZ2VTaXplICYgcGFnZV9tYXNrKSApOworICAgIHBhZ2Vfc2hpZnQgPSAwOworICAgIHdoaWxlICgoMSA8PCBwYWdlX3NoaWZ0KSAhPSBzeXNpbmZvLmR3UGFnZVNpemUpIHBhZ2Vfc2hpZnQrKzsKKworI2lmZGVmIGxpbnV4CisgICAgeworCUZJTEUgKmYgPSBmb3BlbiggIi9wcm9jL3NlbGYvbWFwcyIsICJyIiApOworICAgICAgICBpZiAoZikKKyAgICAgICAgeworICAgICAgICAgICAgY2hhciBidWZmZXJbODBdOworICAgICAgICAgICAgd2hpbGUgKGZnZXRzKCBidWZmZXIsIHNpemVvZihidWZmZXIpLCBmICkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHN0YXJ0LCBlbmQsIG9mZnNldDsKKyAgICAgICAgICAgICAgICBjaGFyIHIsIHcsIHgsIHA7CisgICAgICAgICAgICAgICAgQllURSB2cHJvdCA9IFZQUk9UX0NPTU1JVFRFRDsKKworICAgICAgICAgICAgICAgIHNzY2FuZiggYnVmZmVyLCAiJXgtJXggJWMlYyVjJWMgJXgiLAorICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0LCAmZW5kLCAmciwgJncsICZ4LCAmcCwgJm9mZnNldCApOworICAgICAgICAgICAgICAgIGlmIChyID09ICdyJykgdnByb3QgfD0gVlBST1RfUkVBRDsKKyAgICAgICAgICAgICAgICBpZiAodyA9PSAndycpIHZwcm90IHw9IFZQUk9UX1dSSVRFOworICAgICAgICAgICAgICAgIGlmICh4ID09ICd4JykgdnByb3QgfD0gVlBST1RfRVhFQzsKKyAgICAgICAgICAgICAgICBpZiAocCA9PSAncCcpIHZwcm90IHw9IFZQUk9UX1dSSVRFQ09QWTsKKyAgICAgICAgICAgICAgICBWSVJUVUFMX0NyZWF0ZVZpZXcoIHN0YXJ0LCBlbmQgLSBzdGFydCwgVkZMQUdfU1lTVEVNLCB2cHJvdCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmNsb3NlKCBmICk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgIC8qIGxpbnV4ICovCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICBWaXJ0dWFsQWxsb2MgICAoS0VSTkVMMzIuNTQ4KQorICovCitMUFZPSUQgVmlydHVhbEFsbG9jKCBMUFZPSUQgYWRkciwgRFdPUkQgc2l6ZSwgRFdPUkQgdHlwZSwgRFdPUkQgcHJvdGVjdCApCit7CisgICAgRklMRV9WSUVXICp2aWV3OworICAgIFVJTlQzMiBiYXNlLCBwdHIsIHZpZXdfc2l6ZTsKKyAgICBCWVRFIHZwcm90OworCisgICAgZHByaW50Zl92aXJ0dWFsKCBzdGRkZWIsICJWaXJ0dWFsQWxsb2M6ICUwOHggJTA4bHggJWx4ICUwOGx4XG4iLAorICAgICAgICAgICAgICAgICAgICAgKFVJTlQzMilhZGRyLCBzaXplLCB0eXBlLCBwcm90ZWN0ICk7CisKKyAgICAvKiBSb3VuZCBwYXJhbWV0ZXJzIHRvIGEgcGFnZSBib3VuZGFyeSAqLworCisgICAgaWYgKHNpemUgPiAweDdmYzAwMDAwKSAgLyogMkdiIC0gNE1iICovCisgICAgeworICAgICAgICBTZXRMYXN0RXJyb3IoIEVSUk9SX09VVE9GTUVNT1JZICk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoYWRkcikKKyAgICB7CisgICAgICAgIGlmICh0eXBlICYgTUVNX1JFU0VSVkUpIC8qIFJvdW5kIGRvd24gdG8gNjRrIGJvdW5kYXJ5ICovCisgICAgICAgICAgICBiYXNlID0gKChVSU5UMzIpYWRkciArIDB4ZmZmZikgJiB+MHhmZmZmOworICAgICAgICBlbHNlCisgICAgICAgICAgICBiYXNlID0gUk9VTkRfQUREUiggYWRkciApOworICAgICAgICBzaXplID0gKCgoVUlOVDMyKWFkZHIgKyBzaXplICsgcGFnZV9tYXNrKSAmIH5wYWdlX21hc2spIC0gYmFzZTsKKyAgICAgICAgaWYgKGJhc2UgKyBzaXplIDwgYmFzZSkgIC8qIERpc2FsbG93IHdyYXAtYXJvdW5kICovCisgICAgICAgIHsKKyAgICAgICAgICAgIFNldExhc3RFcnJvciggRVJST1JfSU5WQUxJRF9QQVJBTUVURVIgKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJhc2UgPSAwOworICAgICAgICBzaXplID0gKHNpemUgKyBwYWdlX21hc2spICYgfnBhZ2VfbWFzazsKKyAgICB9CisKKyAgICAvKiBDb21wdXRlIHRoZSBwcm90ZWN0aW9uIGZsYWdzICovCisKKyAgICBpZiAoISh0eXBlICYgKE1FTV9DT01NSVQgfCBNRU1fUkVTRVJWRSkpIHx8CisgICAgICAgICh0eXBlICYgfihNRU1fQ09NTUlUIHwgTUVNX1JFU0VSVkUpKSkKKyAgICB7CisgICAgICAgIFNldExhc3RFcnJvciggRVJST1JfSU5WQUxJRF9QQVJBTUVURVIgKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICh0eXBlICYgTUVNX0NPTU1JVCkKKyAgICAgICAgdnByb3QgPSBWSVJUVUFMX0dldFByb3QoIHByb3RlY3QgKSB8IFZQUk9UX0NPTU1JVFRFRDsKKyAgICBlbHNlIHZwcm90ID0gMDsKKworICAgIC8qIFJlc2VydmUgdGhlIG1lbW9yeSAqLworCisgICAgaWYgKCh0eXBlICYgTUVNX1JFU0VSVkUpIHx8ICFiYXNlKQorICAgIHsKKyAgICAgICAgdmlld19zaXplID0gc2l6ZSArIChiYXNlID8gMCA6IDB4MTAwMDApOworICAgICAgICBwdHIgPSAoVUlOVDMyKUZJTEVfbW1hcCggTlVMTCwgKExQVk9JRCliYXNlLCAwLCB2aWV3X3NpemUsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWSVJUVUFMX0dldFVuaXhQcm90KCB2cHJvdCApLCBNQVBfUFJJVkFURSApOworICAgICAgICBpZiAocHRyID09IChVSU5UMzIpLTEpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNldExhc3RFcnJvciggRVJST1JfT1VUT0ZNRU1PUlkgKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmICghYmFzZSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogUmVsZWFzZSB0aGUgZXh0cmEgbWVtb3J5IHdoaWxlIGtlZXBpbmcgdGhlIHJhbmdlICovCisgICAgICAgICAgICAvKiBzdGFydGluZyBvbiBhIDY0ayBib3VuZGFyeS4gKi8KKworICAgICAgICAgICAgaWYgKHB0ciAmIDB4ZmZmZjAwMDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbXVubWFwKCAodm9pZCAqKXB0ciwgMHgxMDAwMCAtIChwdHIgJiAweGZmZmYpICk7CisgICAgICAgICAgICAgICAgdmlld19zaXplIC09IChwdHIgJiAweGZmZmYpOworICAgICAgICAgICAgICAgIHB0ciA9IChwdHIgKyAweDEwMDAwKSAmIDB4ZmZmZjAwMDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodmlld19zaXplID4gc2l6ZSkKKyAgICAgICAgICAgICAgICBtdW5tYXAoICh2b2lkICopKHB0ciArIHNpemUpLCB2aWV3X3NpemUgLSBzaXplICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEodmlldyA9IFZJUlRVQUxfQ3JlYXRlVmlldyggcHRyLCBzaXplLCAwLCB2cHJvdCApKSkKKyAgICAgICAgeworICAgICAgICAgICAgbXVubWFwKCAodm9pZCAqKXB0ciwgc2l6ZSApOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7ICAvKiBGSVhNRTogbGFzdCBlcnJvciAqLworICAgICAgICB9CisgICAgICAgIGlmIChkZWJ1Z2dpbmdfdmlydHVhbCkgVklSVFVBTF9EdW1wVmlldyggdmlldyApOworICAgICAgICByZXR1cm4gKExQVk9JRClwdHI7CisgICAgfQorCisgICAgLyogQ29tbWl0IHRoZSBwYWdlcyAqLworCisgICAgaWYgKCEodmlldyA9IFZJUlRVQUxfRmluZFZpZXcoIGJhc2UgKSkgfHwKKyAgICAgICAgKGJhc2UgKyBzaXplID4gdmlldy0+YmFzZSArIHZpZXctPnNpemUpKQorICAgIHsKKyAgICAgICAgU2V0TGFzdEVycm9yKCBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUiApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoIVZJUlRVQUxfU2V0UHJvdCggdmlldywgYmFzZSwgc2l6ZSwgdnByb3QgKSkgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIChMUFZPSUQpYmFzZTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgIFZpcnR1YWxGcmVlICAgKEtFUk5FTDMyLjU1MCkKKyAqLworQk9PTDMyIFZpcnR1YWxGcmVlKCBMUFZPSUQgYWRkciwgRFdPUkQgc2l6ZSwgRFdPUkQgdHlwZSApCit7CisgICAgRklMRV9WSUVXICp2aWV3OworICAgIFVJTlQzMiBiYXNlOworCisgICAgZHByaW50Zl92aXJ0dWFsKCBzdGRkZWIsICJWaXJ0dWFsRnJlZTogJTA4eCAlMDhseCAlbHhcbiIsCisgICAgICAgICAgICAgICAgICAgICAoVUlOVDMyKWFkZHIsIHNpemUsIHR5cGUgKTsKKworICAgIC8qIEZpeCB0aGUgcGFyYW1ldGVycyAqLworCisgICAgc2l6ZSA9IFJPVU5EX1NJWkUoIGFkZHIsIHNpemUgKTsKKyAgICBiYXNlID0gUk9VTkRfQUREUiggYWRkciApOworCisgICAgaWYgKCEodmlldyA9IFZJUlRVQUxfRmluZFZpZXcoIGJhc2UgKSkgfHwKKyAgICAgICAgKGJhc2UgKyBzaXplID4gdmlldy0+YmFzZSArIHZpZXctPnNpemUpKQorICAgIHsKKyAgICAgICAgU2V0TGFzdEVycm9yKCBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUiApOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgLyogQ29tcHV0ZSB0aGUgcHJvdGVjdGlvbiBmbGFncyAqLworCisgICAgaWYgKCh0eXBlICE9IE1FTV9ERUNPTU1JVCkgJiYgKHR5cGUgIT0gTUVNX1JFTEVBU0UpKQorICAgIHsKKyAgICAgICAgU2V0TGFzdEVycm9yKCBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUiApOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgLyogRnJlZSB0aGUgcGFnZXMgKi8KKworICAgIGlmICh0eXBlID09IE1FTV9SRUxFQVNFKQorICAgIHsKKyAgICAgICAgaWYgKHNpemUgfHwgKGJhc2UgIT0gdmlldy0+YmFzZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNldExhc3RFcnJvciggRVJST1JfSU5WQUxJRF9QQVJBTUVURVIgKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBWSVJUVUFMX0RlbGV0ZVZpZXcoIHZpZXcgKTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgICAgLyogRGVjb21taXQgdGhlIHBhZ2VzICovCisKKyAgICByZXR1cm4gVklSVFVBTF9TZXRQcm90KCB2aWV3LCBiYXNlLCBzaXplLCAwICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICBWaXJ0dWFsTG9jayAgIChLRVJORUwzMi41NTEpCisgKi8KK0JPT0wzMiBWaXJ0dWFsTG9jayggTFBWT0lEIGFkZHIsIERXT1JEIHNpemUgKQoreworICAgIHJldHVybiBUUlVFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgVmlydHVhbFVubG9jayAgIChLRVJORUwzMi41NTYpCisgKi8KK0JPT0wzMiBWaXJ0dWFsVW5sb2NrKCBMUFZPSUQgYWRkciwgRFdPUkQgc2l6ZSApCit7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICBWaXJ0dWFsUHJvdGVjdCAgIChLRVJORUwzMi41NTIpCisgKi8KK0JPT0wzMiBWaXJ0dWFsUHJvdGVjdCggTFBWT0lEIGFkZHIsIERXT1JEIHNpemUsIERXT1JEIG5ld19wcm90LAorICAgICAgICAgICAgICAgICAgICAgICBMUERXT1JEIG9sZF9wcm90ICkKK3sKKyAgICBGSUxFX1ZJRVcgKnZpZXc7CisgICAgVUlOVDMyIGJhc2UsIGk7CisgICAgQllURSB2cHJvdCwgKnA7CisKKyAgICBkcHJpbnRmX3ZpcnR1YWwoIHN0ZGRlYiwgIlZpcnR1YWxQcm90ZWN0OiAlMDh4ICUwOGx4ICUwOGx4XG4iLAorICAgICAgICAgICAgICAgICAgICAgKFVJTlQzMilhZGRyLCBzaXplLCBuZXdfcHJvdCApOworCisgICAgLyogRml4IHRoZSBwYXJhbWV0ZXJzICovCisKKyAgICBzaXplID0gUk9VTkRfU0laRSggYWRkciwgc2l6ZSApOworICAgIGJhc2UgPSBST1VORF9BRERSKCBhZGRyICk7CisKKyAgICBpZiAoISh2aWV3ID0gVklSVFVBTF9GaW5kVmlldyggYmFzZSApKSB8fAorICAgICAgICAoYmFzZSArIHNpemUgPiB2aWV3LT5iYXNlICsgdmlldy0+c2l6ZSkpCisgICAgeworICAgICAgICBTZXRMYXN0RXJyb3IoIEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSICk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICAvKiBNYWtlIHN1cmUgYWxsIHRoZSBwYWdlcyBhcmUgY29tbWl0dGVkICovCisKKyAgICBwID0gdmlldy0+cHJvdCArICgoYmFzZSAtIHZpZXctPmJhc2UpID4+IHBhZ2Vfc2hpZnQpOworICAgIGZvciAoaSA9IHNpemUgPj4gcGFnZV9zaGlmdDsgaTsgaS0tLCBwKyspCisgICAgeworICAgICAgICBpZiAoISgqcCAmIFZQUk9UX0NPTU1JVFRFRCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNldExhc3RFcnJvciggRVJST1JfSU5WQUxJRF9QQVJBTUVURVIgKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFZJUlRVQUxfR2V0V2luMzJQcm90KCB2aWV3LT5wcm90WzBdLCBvbGRfcHJvdCwgTlVMTCApOworICAgIHZwcm90ID0gVklSVFVBTF9HZXRQcm90KCBuZXdfcHJvdCApIHwgVlBST1RfQ09NTUlUVEVEOworICAgIHJldHVybiBWSVJUVUFMX1NldFByb3QoIHZpZXcsIGJhc2UsIHNpemUsIHZwcm90ICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICBWaXJ0dWFsUHJvdGVjdEV4ICAgKEtFUk5FTDMyLjU1MykKKyAqLworQk9PTDMyIFZpcnR1YWxQcm90ZWN0RXgoIEhBTkRMRTMyIGhhbmRsZSwgTFBWT0lEIGFkZHIsIERXT1JEIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgbmV3X3Byb3QsIExQRFdPUkQgb2xkX3Byb3QgKQoreworICAgIEJPT0wzMiByZXQgPSBGQUxTRTsKKworICAgIFBEQjMyICpwZGIgPSAoUERCMzIgKilQUk9DRVNTX0dldE9ialB0ciggaGFuZGxlLCBLMzJPQkpfUFJPQ0VTUyApOworICAgIGlmIChwZGIpCisgICAgeworICAgICAgICBpZiAocGRiID09IHBDdXJyZW50UHJvY2VzcykKKyAgICAgICAgICAgIHJldCA9IFZpcnR1YWxQcm90ZWN0KCBhZGRyLCBzaXplLCBuZXdfcHJvdCwgb2xkX3Byb3QgKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIlVuc3VwcG9ydGVkOiBWaXJ0dWFsUHJvdGVjdEV4IG9uIG90aGVyIHByb2Nlc3NcbiIpOworICAgICAgICBLMzJPQkpfRGVjQ291bnQoICZwZGItPmhlYWRlciApOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgVmlydHVhbFF1ZXJ5ICAgKEtFUk5FTDMyLjU1NCkKKyAqLworQk9PTDMyIFZpcnR1YWxRdWVyeSggTFBDVk9JRCBhZGRyLCBMUE1FTU9SWV9CQVNJQ19JTkZPUk1BVElPTiBpbmZvLCBEV09SRCBsZW4gKQoreworICAgIEZJTEVfVklFVyAqdmlldyA9IFZJUlRVQUxfRmlyc3RWaWV3OworICAgIFVJTlQzMiBiYXNlID0gUk9VTkRfQUREUiggYWRkciApOworICAgIFVJTlQzMiBhbGxvY19iYXNlID0gMDsKKyAgICBVSU5UMzIgc2l6ZSA9IDA7CisKKyAgICAvKiBGaW5kIHRoZSB2aWV3IGNvbnRhaW5pbmcgdGhlIGFkZHJlc3MgKi8KKworICAgIGZvciAoOzspCisgICAgeworICAgICAgICBpZiAoIXZpZXcpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNpemUgPSAweGZmZmYwMDAwIC0gYWxsb2NfYmFzZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICh2aWV3LT5iYXNlID4gYmFzZSkKKyAgICAgICAgeworICAgICAgICAgICAgc2l6ZSA9IHZpZXctPmJhc2UgLSBhbGxvY19iYXNlOworICAgICAgICAgICAgdmlldyA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAodmlldy0+YmFzZSArIHZpZXctPnNpemUgPiBiYXNlKQorICAgICAgICB7CisgICAgICAgICAgICBhbGxvY19iYXNlID0gdmlldy0+YmFzZTsKKyAgICAgICAgICAgIHNpemUgPSB2aWV3LT5zaXplOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYWxsb2NfYmFzZSA9IHZpZXctPmJhc2UgKyB2aWV3LT5zaXplOworICAgICAgICB2aWV3ID0gdmlldy0+bmV4dDsKKyAgICB9CisKKyAgICAvKiBGaWxsIHRoZSBpbmZvIHN0cnVjdHVyZSAqLworCisgICAgaWYgKCF2aWV3KQorICAgIHsKKyAgICAgICAgaW5mby0+U3RhdGUgICAgICAgICAgICAgPSBNRU1fRlJFRTsKKyAgICAgICAgaW5mby0+UHJvdGVjdCAgICAgICAgICAgPSAwOworICAgICAgICBpbmZvLT5BbGxvY2F0aW9uUHJvdGVjdCA9IDA7CisgICAgICAgIGluZm8tPlR5cGUgICAgICAgICAgICAgID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQllURSB2cHJvdCA9IHZpZXctPnByb3RbKGJhc2UgLSBhbGxvY19iYXNlKSA+PiBwYWdlX3NoaWZ0XTsKKyAgICAgICAgVklSVFVBTF9HZXRXaW4zMlByb3QoIHZwcm90LCAmaW5mby0+UHJvdGVjdCwgJmluZm8tPlN0YXRlICk7CisgICAgICAgIGZvciAoc2l6ZSA9IGJhc2UgLSBhbGxvY19iYXNlOyBzaXplIDwgdmlldy0+c2l6ZTsgc2l6ZSArPSBwYWdlX21hc2srMSkKKyAgICAgICAgICAgIGlmICh2aWV3LT5wcm90W3NpemUgPj4gcGFnZV9zaGlmdF0gIT0gdnByb3QpIGJyZWFrOworICAgICAgICBpbmZvLT5BbGxvY2F0aW9uUHJvdGVjdCA9IHZpZXctPnByb3RlY3Q7CisgICAgICAgIGluZm8tPlR5cGUgICAgICAgICAgICAgID0gTUVNX1BSSVZBVEU7ICAvKiBGSVhNRSAqLworICAgIH0KKworICAgIGluZm8tPkJhc2VBZGRyZXNzICAgID0gKExQVk9JRCliYXNlOworICAgIGluZm8tPkFsbG9jYXRpb25CYXNlID0gKExQVk9JRClhbGxvY19iYXNlOworICAgIGluZm8tPlJlZ2lvblNpemUgICAgID0gc2l6ZSAtIChiYXNlIC0gYWxsb2NfYmFzZSk7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICBWaXJ0dWFsUXVlcnlFeCAgIChLRVJORUwzMi41NTUpCisgKi8KK0JPT0wzMiBWaXJ0dWFsUXVlcnlFeCggSEFORExFMzIgaGFuZGxlLCBMUENWT0lEIGFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgIExQTUVNT1JZX0JBU0lDX0lORk9STUFUSU9OIGluZm8sIERXT1JEIGxlbiApCit7CisgICAgQk9PTDMyIHJldCA9IEZBTFNFOworCisgICAgUERCMzIgKnBkYiA9IChQREIzMiAqKVBST0NFU1NfR2V0T2JqUHRyKCBoYW5kbGUsIEszMk9CSl9QUk9DRVNTICk7CisgICAgaWYgKHBkYikKKyAgICB7CisgICAgICAgIGlmIChwZGIgPT0gcEN1cnJlbnRQcm9jZXNzKQorICAgICAgICAgICAgcmV0ID0gVmlydHVhbFF1ZXJ5KCBhZGRyLCBpbmZvLCBsZW4gKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIlVuc3VwcG9ydGVkOiBWaXJ0dWFsUXVlcnlFeCBvbiBvdGhlciBwcm9jZXNzXG4iKTsKKyAgICAgICAgSzMyT0JKX0RlY0NvdW50KCAmcGRiLT5oZWFkZXIgKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgIElzQmFkUmVhZFB0cjMyICAgKEtFUk5FTDMyLjM1NCkKKyAqLworQk9PTDMyIElzQmFkUmVhZFB0cjMyKCBMUENWT0lEIHB0ciwgVUlOVDMyIHNpemUgKQoreworICAgIHJldHVybiAhVklSVFVBTF9DaGVja0ZsYWdzKCAoVUlOVDMyKXB0ciwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlBST1RfUkVBRCB8IFZQUk9UX0NPTU1JVFRFRCApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgSXNCYWRXcml0ZVB0cjMyICAgKEtFUk5FTDMyLjM1NykKKyAqLworQk9PTDMyIElzQmFkV3JpdGVQdHIzMiggTFBWT0lEIHB0ciwgVUlOVDMyIHNpemUgKQoreworICAgIHJldHVybiAhVklSVFVBTF9DaGVja0ZsYWdzKCAoVUlOVDMyKXB0ciwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlBST1RfV1JJVEUgfCBWUFJPVF9DT01NSVRURUQgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgIElzQmFkSHVnZVJlYWRQdHIzMiAgIChLRVJORUwzMi4zNTIpCisgKi8KK0JPT0wzMiBJc0JhZEh1Z2VSZWFkUHRyMzIoIExQQ1ZPSUQgcHRyLCBVSU5UMzIgc2l6ZSApCit7CisgICAgcmV0dXJuIElzQmFkUmVhZFB0cjMyKCBwdHIsIHNpemUgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgIElzQmFkSHVnZVdyaXRlUHRyMzIgICAoS0VSTkVMMzIuMzUzKQorICovCitCT09MMzIgSXNCYWRIdWdlV3JpdGVQdHIzMiggTFBWT0lEIHB0ciwgVUlOVDMyIHNpemUgKQoreworICAgIHJldHVybiBJc0JhZFdyaXRlUHRyMzIoIHB0ciwgc2l6ZSApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgSXNCYWRDb2RlUHRyMzIgICAoS0VSTkVMMzIuMzUxKQorICovCitCT09MMzIgSXNCYWRDb2RlUHRyMzIoIEZBUlBST0MzMiBwdHIgKQoreworICAgIHJldHVybiAhVklSVFVBTF9DaGVja0ZsYWdzKCAoVUlOVDMyKXB0ciwgMSwgVlBST1RfRVhFQyB8IFZQUk9UX0NPTU1JVFRFRCApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgSXNCYWRTdHJpbmdQdHIzMkEgICAoS0VSTkVMMzIuMzU1KQorICovCitCT09MMzIgSXNCYWRTdHJpbmdQdHIzMkEoIExQQ1NUUiBzdHIsIFVJTlQzMiBtYXggKQoreworICAgIEZJTEVfVklFVyAqdmlldzsKKyAgICBVSU5UMzIgcGFnZSwgY291bnQ7CisKKyAgICBpZiAoIW1heCkgcmV0dXJuIEZBTFNFOworICAgIGlmICghKHZpZXcgPSBWSVJUVUFMX0ZpbmRWaWV3KCAoVUlOVDMyKXN0ciApKSkgcmV0dXJuIFRSVUU7CisgICAgcGFnZSAgPSAoKFVJTlQzMilzdHIgLSB2aWV3LT5iYXNlKSA+PiBwYWdlX3NoaWZ0OworICAgIGNvdW50ID0gcGFnZV9tYXNrICsgMSAtICgoVUlOVDMyKXN0ciAmIHBhZ2VfbWFzayk7CisKKyAgICB3aGlsZSAobWF4KQorICAgIHsKKyAgICAgICAgaWYgKCh2aWV3LT5wcm90W3BhZ2VdICYgKFZQUk9UX1JFQUQgfCBWUFJPVF9DT01NSVRURUQpKSAhPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChWUFJPVF9SRUFEIHwgVlBST1RfQ09NTUlUVEVEKSkKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICBpZiAoY291bnQgPiBtYXgpIGNvdW50ID0gbWF4OworICAgICAgICBtYXggLT0gY291bnQ7CisgICAgICAgIHdoaWxlIChjb3VudC0tKSBpZiAoISpzdHIrKykgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoKytwYWdlID49IHZpZXctPnNpemUgPj4gcGFnZV9zaGlmdCkgcmV0dXJuIFRSVUU7CisgICAgICAgIGNvdW50ID0gcGFnZV9tYXNrICsgMTsKKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgSXNCYWRTdHJpbmdQdHIzMlcgICAoS0VSTkVMMzIuMzU2KQorICovCitCT09MMzIgSXNCYWRTdHJpbmdQdHIzMlcoIExQQ1dTVFIgc3RyLCBVSU5UMzIgbWF4ICkKK3sKKyAgICBGSUxFX1ZJRVcgKnZpZXc7CisgICAgVUlOVDMyIHBhZ2UsIGNvdW50OworCisgICAgaWYgKCFtYXgpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoISh2aWV3ID0gVklSVFVBTF9GaW5kVmlldyggKFVJTlQzMilzdHIgKSkpIHJldHVybiBUUlVFOworICAgIHBhZ2UgID0gKChVSU5UMzIpc3RyIC0gdmlldy0+YmFzZSkgPj4gcGFnZV9zaGlmdDsKKyAgICBjb3VudCA9IChwYWdlX21hc2sgKyAxIC0gKChVSU5UMzIpc3RyICYgcGFnZV9tYXNrKSkgLyBzaXplb2YoV0NIQVIpOworCisgICAgd2hpbGUgKG1heCkKKyAgICB7CisgICAgICAgIGlmICgodmlldy0+cHJvdFtwYWdlXSAmIChWUFJPVF9SRUFEIHwgVlBST1RfQ09NTUlUVEVEKSkgIT0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVlBST1RfUkVBRCB8IFZQUk9UX0NPTU1JVFRFRCkpCisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgaWYgKGNvdW50ID4gbWF4KSBjb3VudCA9IG1heDsKKyAgICAgICAgbWF4IC09IGNvdW50OworICAgICAgICB3aGlsZSAoY291bnQtLSkgaWYgKCEqc3RyKyspIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCsrcGFnZSA+PSB2aWV3LT5zaXplID4+IHBhZ2Vfc2hpZnQpIHJldHVybiBUUlVFOworICAgICAgICBjb3VudCA9IChwYWdlX21hc2sgKyAxKSAvIHNpemVvZihXQ0hBUik7CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgIENyZWF0ZUZpbGVNYXBwaW5nMzJBICAgKEtFUk5FTDMyLjQ2KQorICovCitIQU5ETEUzMiBDcmVhdGVGaWxlTWFwcGluZzMyQSggSEZJTEUzMiBoRmlsZSwgTFBTRUNVUklUWV9BVFRSSUJVVEVTIGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgcHJvdGVjdCwgRFdPUkQgc2l6ZV9oaWdoLCBEV09SRCBzaXplX2xvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgbmFtZSApCit7CisgICAgRklMRV9NQVBQSU5HICptYXBwaW5nID0gTlVMTDsKKyAgICBIQU5ETEUzMiBoYW5kbGU7CisKKyAgICBLMzJPQkogKm9iaiA9IEszMk9CSl9GaW5kTmFtZSggbmFtZSApOworICAgIGlmIChvYmopCisgICAgeworICAgICAgICBpZiAob2JqLT50eXBlID09IEszMk9CSl9NRU1fTUFQUEVEX0ZJTEUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNldExhc3RFcnJvciggRVJST1JfQUxSRUFEWV9FWElTVFMgKTsKKyAgICAgICAgICAgIHJldHVybiBQUk9DRVNTX0FsbG9jSGFuZGxlKCBvYmosIDAgKTsKKyAgICAgICAgfQorICAgICAgICBTZXRMYXN0RXJyb3IoIEVSUk9SX0RVUF9OQU1FICk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHByaW50ZiggIkNyZWF0ZUZpbGVNYXBwaW5nMzJBKCV4LCVwLCUwOGx4LCUwOGx4JTA4bHgsJXMpXG4iLAorICAgICAgICAgICAgaEZpbGUsIGF0dHIsIHByb3RlY3QsIHNpemVfaGlnaCwgc2l6ZV9sb3csIG5hbWUgKTsKKworICAgIGlmIChoRmlsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRTMyKQorICAgIHsKKyAgICAgICAgaWYgKCFzaXplX2hpZ2ggJiYgIXNpemVfbG93KQorICAgICAgICB7CisgICAgICAgICAgICBTZXRMYXN0RXJyb3IoIEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSICk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBvYmogPSBOVUxMOworICAgIH0KKyAgICBlbHNlICAvKiBXZSBoYXZlIGEgZmlsZSAqLworICAgIHsKKyAgICAgICAgQllfSEFORExFX0ZJTEVfSU5GT1JNQVRJT04gaW5mbzsKKyAgICAgICAgaWYgKCEob2JqID0gUFJPQ0VTU19HZXRPYmpQdHIoIGhGaWxlLCBLMzJPQkpfRklMRSApKSkgZ290byBlcnJvcjsKKyAgICAgICAgaWYgKCFHZXRGaWxlSW5mb3JtYXRpb25CeUhhbmRsZSggaEZpbGUsICZpbmZvICkpIGdvdG8gZXJyb3I7CisgICAgICAgIGlmICghc2l6ZV9oaWdoICYmICFzaXplX2xvdykKKyAgICAgICAgeworICAgICAgICAgICAgc2l6ZV9oaWdoID0gaW5mby5uRmlsZVNpemVIaWdoOworICAgICAgICAgICAgc2l6ZV9sb3cgID0gaW5mby5uRmlsZVNpemVMb3c7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKHNpemVfaGlnaCA+IGluZm8ubkZpbGVTaXplSGlnaCkgfHwKKyAgICAgICAgICAgICAgICAgKChzaXplX2hpZ2ggPT0gaW5mby5uRmlsZVNpemVIaWdoKSAmJgorICAgICAgICAgICAgICAgICAgKHNpemVfbG93ID4gaW5mby5uRmlsZVNpemVMb3cpKSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogV2UgaGF2ZSB0byBncm93IHRoZSBmaWxlICovCisgICAgICAgICAgICBpZiAoU2V0RmlsZVBvaW50ZXIoIGhGaWxlLCBzaXplX2xvdywgJnNpemVfaGlnaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9CRUdJTiApID09IDB4ZmZmZmZmZmYpIGdvdG8gZXJyb3I7CisgICAgICAgICAgICBpZiAoIVNldEVuZE9mRmlsZSggaEZpbGUgKSkgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghKG1hcHBpbmcgPSBIZWFwQWxsb2MoIFN5c3RlbUhlYXAsIDAsIHNpemVvZigqbWFwcGluZykgKSkpIGdvdG8gZXJyb3I7CisgICAgbWFwcGluZy0+cHJvdGVjdCAgID0gVklSVFVBTF9HZXRQcm90KCBwcm90ZWN0ICkgfCBWUFJPVF9DT01NSVRURUQ7CisgICAgbWFwcGluZy0+c2l6ZV9oaWdoID0gc2l6ZV9oaWdoOworICAgIG1hcHBpbmctPnNpemVfbG93ICA9IHNpemVfbG93OworICAgIG1hcHBpbmctPmZpbGUgICAgICA9IChGSUxFX09CSkVDVCAqKW9iajsKKworICAgIGhhbmRsZSA9IFBST0NFU1NfQWxsb2NIYW5kbGUoICZtYXBwaW5nLT5oZWFkZXIsIDAgKTsKKyAgICBpZiAoaGFuZGxlICE9IElOVkFMSURfSEFORExFX1ZBTFVFMzIpIHJldHVybiBoYW5kbGU7CisKK2Vycm9yOgorICAgIGlmIChvYmopIEszMk9CSl9EZWNDb3VudCggb2JqICk7CisgICAgaWYgKG1hcHBpbmcpIEhlYXBGcmVlKCBTeXN0ZW1IZWFwLCAwLCBtYXBwaW5nICk7CisgICAgcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICBDcmVhdGVGaWxlTWFwcGluZzMyVyAgIChLRVJORUwzMi40NykKKyAqLworSEFORExFMzIgQ3JlYXRlRmlsZU1hcHBpbmczMlcoIEhGSUxFMzIgaEZpbGUsIExQU0VDVVJJVFlfQVRUUklCVVRFUyBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIHByb3RlY3QsIERXT1JEIHNpemVfaGlnaCwgRFdPUkQgc2l6ZV9sb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDV1NUUiBuYW1lICkKK3sKKyAgICBMUFNUUiBuYW1lQSA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbmFtZSApOworICAgIEhBTkRMRTMyIHJldCA9IENyZWF0ZUZpbGVNYXBwaW5nMzJBKCBoRmlsZSwgYXR0ciwgcHJvdGVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV9oaWdoLCBzaXplX2xvdywgbmFtZUEgKTsKKyAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbmFtZUEgKTsKKyAgICByZXR1cm4gcmV0OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgT3BlbkZpbGVNYXBwaW5nMzJBICAgKEtFUk5FTDMyLjM5NykKKyAqLworSEFORExFMzIgT3BlbkZpbGVNYXBwaW5nMzJBKCBEV09SRCBhY2Nlc3MsIEJPT0wzMiBpbmhlcml0LCBMUENTVFIgbmFtZSApCit7CisgICAgSzMyT0JKICpvYmogPSBLMzJPQkpfRmluZE5hbWVUeXBlKCBuYW1lLCBLMzJPQkpfTUVNX01BUFBFRF9GSUxFICk7CisgICAgaWYgKCFvYmopIHJldHVybiAwOworICAgIHJldHVybiBQUk9DRVNTX0FsbG9jSGFuZGxlKCBvYmosIDAgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgIE9wZW5GaWxlTWFwcGluZzMyVyAgIChLRVJORUwzMi4zOTgpCisgKi8KK0hBTkRMRTMyIE9wZW5GaWxlTWFwcGluZzMyVyggRFdPUkQgYWNjZXNzLCBCT09MMzIgaW5oZXJpdCwgTFBDV1NUUiBuYW1lICkKK3sKKyAgICBMUFNUUiBuYW1lQSA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbmFtZSApOworICAgIEhBTkRMRTMyIHJldCA9IE9wZW5GaWxlTWFwcGluZzMyQSggYWNjZXNzLCBpbmhlcml0LCBuYW1lQSApOworICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBuYW1lQSApOworICAgIHJldHVybiByZXQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICBNYXBWaWV3T2ZGaWxlICAgKEtFUk5FTDMyLjM4NSkKKyAqLworTFBWT0lEIE1hcFZpZXdPZkZpbGUoIEhBTkRMRTMyIG1hcHBpbmcsIERXT1JEIGFjY2VzcywgRFdPUkQgb2Zmc2V0X2hpZ2gsCisgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgb2Zmc2V0X2xvdywgRFdPUkQgY291bnQgKQoreworICAgIHJldHVybiBNYXBWaWV3T2ZGaWxlRXgoIG1hcHBpbmcsIGFjY2Vzcywgb2Zmc2V0X2hpZ2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0X2xvdywgY291bnQsIE5VTEwgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgIE1hcFZpZXdPZkZpbGVFeCAgIChLRVJORUwzMi4zODYpCisgKi8KK0xQVk9JRCBNYXBWaWV3T2ZGaWxlRXgoIEhBTkRMRTMyIGhhbmRsZSwgRFdPUkQgYWNjZXNzLCBEV09SRCBvZmZzZXRfaGlnaCwKKyAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIG9mZnNldF9sb3csIERXT1JEIGNvdW50LCBMUFZPSUQgYWRkciApCit7CisgICAgRklMRV9NQVBQSU5HICptYXBwaW5nOworICAgIExQVk9JRCByZXQ7CisKKyAgICBpZiAoIShtYXBwaW5nID0gKEZJTEVfTUFQUElORyAqKVBST0NFU1NfR2V0T2JqUHRyKCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEszMk9CSl9NRU1fTUFQUEVEX0ZJTEUgKSkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0ID0gRklMRV9tbWFwKG1hcHBpbmctPmZpbGUsIGFkZHIsIG1hcHBpbmctPnNpemVfaGlnaCwgbWFwcGluZy0+c2l6ZV9sb3csCisgICAgICAgICAgICAgICAgICAgIG9mZnNldF9oaWdoLCBvZmZzZXRfbG93LCBtYXBwaW5nLT5wcm90ZWN0LCBNQVBfUFJJVkFURSApOworCisgICAgSzMyT0JKX0RlY0NvdW50KCAmbWFwcGluZy0+aGVhZGVyICk7CisgICAgcmV0dXJuIHJldDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgIFVubWFwVmlld09mRmlsZSAgIChLRVJORUwzMi41NDApCisgKi8KK0JPT0wzMiBVbm1hcFZpZXdPZkZpbGUoIExQVk9JRCBhZGRyICkKK3sKKyAgICBGSUxFX1ZJRVcgKnZpZXc7CisgICAgVUlOVDMyIGJhc2UgPSBST1VORF9BRERSKCBhZGRyICk7CisgICAgaWYgKCEodmlldyA9IFZJUlRVQUxfRmluZFZpZXcoIGJhc2UgKSkgfHwgKGJhc2UgIT0gdmlldy0+YmFzZSkpCisgICAgeworICAgICAgICBTZXRMYXN0RXJyb3IoIEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSICk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgVklSVFVBTF9EZWxldGVWaWV3KCB2aWV3ICk7CisgICAgcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9taXNjL2NsaXBib2FyZC5jIGIvbWlzYy9jbGlwYm9hcmQuYwppbmRleCBiYzY0YWFjLi45MjgyYTQ0IDEwMDY0NAotLS0gYS9taXNjL2NsaXBib2FyZC5jCisrKyBiL21pc2MvY2xpcGJvYXJkLmMKQEAgLTQ1LDcgKzQ1LDcgQEAKIHN0YXRpYyBIV05EMzIgaFduZENsaXBXaW5kb3cgPSAwOyAgIC8qIHdpbmRvdyB0aGF0IG9wZW5lZCBjbGlwYm9hcmQgKi8KIHN0YXRpYyBIV05EMzIgaFduZFZpZXdlciAgICAgPSAwOyAgIC8qIHN0YXJ0IG9mIHZpZXdlcnMgY2hhaW4gKi8KIAotc3RhdGljIEJPT0wgYkNsaXBDaGFuZ2VkICA9IEZBTFNFOworc3RhdGljIEJPT0wzMiBiQ2xpcENoYW5nZWQgID0gRkFMU0U7CiBzdGF0aWMgV09SRCBMYXN0UmVnRm9ybWF0ID0gQ0ZfUkVHRk9STUFUQkFTRTsKIAogc3RhdGljIEJvb2wgICBzZWxlY3Rpb25XYWl0ID0gRmFsc2U7CkBAIC0xNTgsNyArMTU4LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQlDTElQQk9BUkRfUmVxdWVzdFhTZWxlY3Rpb24KICAqLwotQk9PTCBDTElQQk9BUkRfUmVxdWVzdFhTZWxlY3Rpb24oKQorQk9PTDMyIENMSVBCT0FSRF9SZXF1ZXN0WFNlbGVjdGlvbigpCiB7CiAgIEhXTkQzMiBoV25kID0gKGhXbmRDbGlwV2luZG93KSA/IGhXbmRDbGlwV2luZG93IDogR2V0QWN0aXZlV2luZG93MzIoKTsKIApAQCAtMTg0LDEzICsxODQsMTMgQEAKICAgZHByaW50Zl9jbGlwYm9hcmQoc3RkZGViLCJcdGdvdCBDRl9PRU1URVhUID0gJWlcbiIsIAogCQkgICAgQ2xpcEZvcm1hdHNbQ0ZfT0VNVEVYVC0xXS53RGF0YVByZXNlbnQpOwogCi0gIHJldHVybiAoQk9PTClDbGlwRm9ybWF0c1tDRl9PRU1URVhULTFdLndEYXRhUHJlc2VudDsKKyAgcmV0dXJuIChCT09MMzIpQ2xpcEZvcm1hdHNbQ0ZfT0VNVEVYVC0xXS53RGF0YVByZXNlbnQ7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQlDTElQQk9BUkRfSXNQcmVzZW50CiAgKi8KLUJPT0wgQ0xJUEJPQVJEX0lzUHJlc2VudChXT1JEIHdGb3JtYXQpCitCT09MMzIgQ0xJUEJPQVJEX0lzUHJlc2VudChXT1JEIHdGb3JtYXQpCiB7CiAgICAgTFBDTElQRk9STUFUIGxwRm9ybWF0ID0gQ2xpcEZvcm1hdHM7IAogCkBAIC0zMzIsOSArMzMyLDkgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQkJU2V0Q2xpcGJvYXJkRGF0YQlbVVNFUi4xNDFdCisgKiAgICAgICAgICAgIFNldENsaXBib2FyZERhdGExNiAgIChVU0VSLjE0MSkKICAqLwotSEFORExFMTYgU2V0Q2xpcGJvYXJkRGF0YShXT1JEIHdGb3JtYXQsIEhBTkRMRTE2IGhEYXRhKQorSEFORExFMTYgU2V0Q2xpcGJvYXJkRGF0YTE2KCBVSU5UMTYgd0Zvcm1hdCwgSEFORExFMTYgaERhdGEgKQogewogICAgIExQQ0xJUEZPUk1BVCBscEZvcm1hdCA9IENsaXBGb3JtYXRzOyAKICAgICBXaW5kb3cgICAgICAgb3duZXI7CkBAIC0zODcsMTMgKzM4NywyNCBAQAogICAgIHJldHVybiBscEZvcm1hdC0+aERhdGE7CiB9CiAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgIFNldENsaXBib2FyZERhdGEzMiAgIChVU0VSMzIuNDY5KQorICovCitIQU5ETEUzMiBTZXRDbGlwYm9hcmREYXRhMzIoIFVJTlQzMiB3Rm9ybWF0LCBIQU5ETEUzMiBoRGF0YSApCit7CisgICAgZnByaW50Ziggc3RkZXJyLCAiU2V0Q2xpcGJvYXJkRGF0YTogZW1wdHkgc3R1YlxuIiApOworICAgIHJldHVybiAwOworfQorCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgICAgICAgICAgQ0xJUEJPQVJEX1JlbmRlckZvcm1hdAogICovCiBCT09MMzIgQ0xJUEJPQVJEX1JlbmRlckZvcm1hdChMUENMSVBGT1JNQVQgbHBGb3JtYXQpCiB7CiAgaWYoIGxwRm9ybWF0LT53RGF0YVByZXNlbnQgJiYgIWxwRm9ybWF0LT5oRGF0YSApCi0gICBpZiggSXNXaW5kb3coaFduZENsaXBPd25lcikgKQorICAgaWYoIElzV2luZG93MzIoaFduZENsaXBPd25lcikgKQogICAgICAgIFNlbmRNZXNzYWdlMTYoaFduZENsaXBPd25lcixXTV9SRU5ERVJGT1JNQVQsCiAgICAgICAgICAgICAgICAgICAgICAoV1BBUkFNMTYpbHBGb3JtYXQtPndGb3JtYXRJRCwwTCk7CiAgICBlbHNlCkBAIC00MTEsNyArNDIyLDcgQEAKICAqLwogQk9PTDMyIENMSVBCT0FSRF9SZW5kZXJUZXh0KExQQ0xJUEZPUk1BVCBscFRhcmdldCwgTFBDTElQRk9STUFUIGxwU291cmNlKQogewotICBVSU5UCQlzaXplID0gR2xvYmFsU2l6ZTE2KCBscFNvdXJjZS0+aERhdGEgKTsKKyAgVUlOVDE2IHNpemUgPSBHbG9iYWxTaXplMTYoIGxwU291cmNlLT5oRGF0YSApOwogICBMUENTVFIJbHBzdHJTID0gKExQU1RSKUdsb2JhbExvY2sxNihscFNvdXJjZS0+aERhdGEpOwogICBMUFNUUgkJbHBzdHJUOwogCkBAIC00MzcsOSArNDQ4LDkgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCUdldENsaXBib2FyZERhdGEJW1VTRVIuMTQyXQorICogICAgICAgICAgICAgR2V0Q2xpcGJvYXJkRGF0YTE2ICAgKFVTRVIuMTQyKQogICovCi1IQU5ETEUxNiBHZXRDbGlwYm9hcmREYXRhKFdPUkQgd0Zvcm1hdCkKK0hBTkRMRTE2IEdldENsaXBib2FyZERhdGExNiggVUlOVDE2IHdGb3JtYXQgKQogewogICAgIExQQ0xJUEZPUk1BVCBscFJlbmRlciA9IENsaXBGb3JtYXRzOyAKICAgICBMUENMSVBGT1JNQVQgbHBVcGRhdGUgPSBOVUxMOwpAQCAtNDg2LDYgKzQ5NywxNSBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgR2V0Q2xpcGJvYXJkRGF0YTMyICAgKFVTRVIzMi4yMjEpCisgKi8KK0hBTkRMRTMyIEdldENsaXBib2FyZERhdGEzMiggVUlOVDMyIHdGb3JtYXQgKQoreworICAgIGZwcmludGYoIHN0ZGVyciwgIkdldENsaXBib2FyZERhdGEzMjogZW1wdHkgc3R1YlxuIiApOworICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBDb3VudENsaXBib2FyZEZvcm1hdHMxNiAgIChVU0VSLjE0MykKICAqLwogSU5UMTYgQ291bnRDbGlwYm9hcmRGb3JtYXRzMTYodm9pZCkKQEAgLTY0NCwxNCArNjY0LDIzIEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCQlHZXRDbGlwYm9hcmRGb3JtYXROYW1lCVtVU0VSLjE0Nl0KKyAqICAgICAgICAgICAgR2V0Q2xpcGJvYXJkRm9ybWF0TmFtZTE2ICAgKFVTRVIuMTQ2KQogICovCi1pbnQgR2V0Q2xpcGJvYXJkRm9ybWF0TmFtZShXT1JEIHdGb3JtYXQsIExQU1RSIHJldFN0ciwgc2hvcnQgbWF4bGVuKQorSU5UMTYgR2V0Q2xpcGJvYXJkRm9ybWF0TmFtZTE2KCBVSU5UMTYgd0Zvcm1hdCwgTFBTVFIgcmV0U3RyLCBJTlQxNiBtYXhsZW4gKQoreworICAgIHJldHVybiBHZXRDbGlwYm9hcmRGb3JtYXROYW1lMzJBKCB3Rm9ybWF0LCByZXRTdHIsIG1heGxlbiApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICBHZXRDbGlwYm9hcmRGb3JtYXROYW1lMzJBICAgKFVTRVIzMi4yMjIpCisgKi8KK0lOVDMyIEdldENsaXBib2FyZEZvcm1hdE5hbWUzMkEoIFVJTlQzMiB3Rm9ybWF0LCBMUFNUUiByZXRTdHIsIElOVDMyIG1heGxlbiApCiB7CiAgICAgTFBDTElQRk9STUFUIGxwRm9ybWF0ID0gQ2xpcEZvcm1hdHM7IAogCiAgICAgZHByaW50Zl9jbGlwYm9hcmQoc3RkZGViLAotCSJHZXRDbGlwYm9hcmRGb3JtYXQoJTA0WCwgJXAsICVkKSAhXG4iLCB3Rm9ybWF0LCByZXRTdHIsIG1heGxlbik7CisJIkdldENsaXBib2FyZEZvcm1hdE5hbWUoJTA0WCwgJXAsICVkKSAhXG4iLCB3Rm9ybWF0LCByZXRTdHIsIG1heGxlbik7CiAKICAgICB3aGlsZShUUlVFKSB7CiAJaWYgKGxwRm9ybWF0ID09IE5VTEwpIHJldHVybiAwOwpAQCAtNjY1LDE0ICs2OTQsMjUgQEAKICAgICBkcHJpbnRmX2NsaXBib2FyZChzdGRkZWIsCiAJCSJHZXRDbGlwYm9hcmRGb3JtYXQgLy8gTmFtZT0nJXMnICFcbiIsIGxwRm9ybWF0LT5OYW1lKTsKIAotICAgIHN0cm5jcHkocmV0U3RyLCBscEZvcm1hdC0+TmFtZSwgbWF4bGVuIC0gMSk7Ci0gICAgcmV0U3RyW21heGxlbl0gPSAwOwotCisgICAgbHN0cmNweW4zMkEoIHJldFN0ciwgbHBGb3JtYXQtPk5hbWUsIG1heGxlbiApOwogICAgIHJldHVybiBzdHJsZW4ocmV0U3RyKTsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgR2V0Q2xpcGJvYXJkRm9ybWF0TmFtZTMyVyAgIChVU0VSMzIuMjIzKQorICovCitJTlQzMiBHZXRDbGlwYm9hcmRGb3JtYXROYW1lMzJXKCBVSU5UMzIgd0Zvcm1hdCwgTFBXU1RSIHJldFN0ciwgSU5UMzIgbWF4bGVuICkKK3sKKyAgICBMUFNUUiBwID0gSEVBUF94YWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIDAsIG1heGxlbiApOworICAgIElOVDMyIHJldCA9IEdldENsaXBib2FyZEZvcm1hdE5hbWUzMkEoIHdGb3JtYXQsIHAsIG1heGxlbiApOworICAgIGxzdHJjcHluQXRvVyggcmV0U3RyLCBwLCBtYXhsZW4gKTsKKyAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgcCApOworICAgIHJldHVybiByZXQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgIFNldENsaXBib2FyZFZpZXdlcjE2ICAgKFVTRVIuMTQ3KQogICovCiBIV05EMTYgU2V0Q2xpcGJvYXJkVmlld2VyMTYoIEhXTkQxNiBoV25kICkKQEAgLTcxNCw3ICs3NTQsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCQlDaGFuZ2VDbGlwYm9hcmRDaGFpbglbVVNFUi4xNDldCisgKiAgICAgICAgICAgQ2hhbmdlQ2xpcGJvYXJkQ2hhaW4xNiAgIChVU0VSLjE0OSkKICAqLwogQk9PTDE2IENoYW5nZUNsaXBib2FyZENoYWluMTYoSFdORDE2IGhXbmQsIEhXTkQxNiBoV25kTmV4dCkKIHsKQEAgLTcyMiw3ICs3NjIsNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQkJQ2hhbmdlQ2xpcGJvYXJkQ2hhaW4JW1VTRVIzMi4yMV0KKyAqICAgICAgICAgICBDaGFuZ2VDbGlwYm9hcmRDaGFpbjMyICAgKFVTRVIzMi4yMSkKICAqLwogQk9PTDMyIENoYW5nZUNsaXBib2FyZENoYWluMzIoSFdORDMyIGhXbmQsIEhXTkQzMiBoV25kTmV4dCkKIHsKQEAgLTc4NSwxMyArODI1LDIzIEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCUdldFByaW9yaXR5Q2xpcGJvYXJkRm9ybWF0CVtVU0VSLjQwMl0KKyAqICAgICAgICAgICAgIEdldFByaW9yaXR5Q2xpcGJvYXJkRm9ybWF0MTYgICAoVVNFUi40MDIpCiAgKi8KLWludCBHZXRQcmlvcml0eUNsaXBib2FyZEZvcm1hdChXT1JEICpscFByaW9yaXR5TGlzdCwgc2hvcnQgbkNvdW50KQorSU5UMTYgR2V0UHJpb3JpdHlDbGlwYm9hcmRGb3JtYXQxNiggVUlOVDE2ICpscFByaW9yaXR5TGlzdCwgSU5UMTYgbkNvdW50KQogewotICAgIGRwcmludGZfY2xpcGJvYXJkKHN0ZG5pbXAsCi0JIkdldFByaW9yaXR5Q2xpcGJvYXJkRm9ybWF0KCVwLCAlZCkgIVxuIiwgbHBQcmlvcml0eUxpc3QsIG5Db3VudCk7CisgICAgZnByaW50Ziggc3RkZXJyLCAiR2V0UHJpb3JpdHlDbGlwYm9hcmRGb3JtYXQxNiglcCwgJWQpOiBzdHViXG4iLAorICAgICAgICAgICAgIGxwUHJpb3JpdHlMaXN0LCBuQ291bnQgKTsKKyAgICByZXR1cm4gMDsKK30KIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgIEdldFByaW9yaXR5Q2xpcGJvYXJkRm9ybWF0MzIgICAoVVNFUjMyCisgKi8KK0lOVDMyIEdldFByaW9yaXR5Q2xpcGJvYXJkRm9ybWF0MzIoIFVJTlQzMiAqbHBQcmlvcml0eUxpc3QsIElOVDMyIG5Db3VudCApCit7CisgICAgZnByaW50Ziggc3RkZXJyLCAiR2V0UHJpb3JpdHlDbGlwYm9hcmRGb3JtYXQzMiglcCwgJWQpOiBzdHViXG4iLAorICAgICAgICAgICAgIGxwUHJpb3JpdHlMaXN0LCBuQ291bnQgKTsKICAgICByZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvbWlzYy9jb21tZGxnLmMgYi9taXNjL2NvbW1kbGcuYwppbmRleCA3ZWJlOTRjLi4wN2NlZDc5IDEwMDY0NAotLS0gYS9taXNjL2NvbW1kbGcuYworKysgYi9taXNjL2NvbW1kbGcuYwpAQCAtMzIsOSArMzIsOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAJCQkJRmlsZURsZ19Jbml0CQkJW2ludGVybmFsXQogICovCi1zdGF0aWMgQk9PTCBGaWxlRGxnX0luaXQoKQorc3RhdGljIEJPT0wzMiBGaWxlRGxnX0luaXQoKQogewotICAgIHN0YXRpYyBCT09MIGluaXRpYWxpemVkID0gMDsKKyAgICBzdGF0aWMgQk9PTDMyIGluaXRpYWxpemVkID0gMDsKICAgICAKICAgICBpZiAoIWluaXRpYWxpemVkKSB7CiAJaWYgKCFoRm9sZGVyKSBoRm9sZGVyID0gTG9hZEJpdG1hcDE2KDAsIE1BS0VJTlRSRVNPVVJDRShPQk1fRk9MREVSKSk7CkBAIC01Niw3ICs1Niw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBHZXRPcGVuRmlsZU5hbWUgICAoQ09NTURMRy4xKQogICovCi1CT09MIEdldE9wZW5GaWxlTmFtZSggU0VHUFRSIG9mbiApCitCT09MMTYgR2V0T3BlbkZpbGVOYW1lKCBTRUdQVFIgb2ZuICkKIHsKICAgICBISU5TVEFOQ0UxNiBoSW5zdDsKICAgICBIQU5ETEUxNiBoRGxnVG1wbCA9IDAsIGhSZXNJbmZvOwpAQCAtMTE0LDcgKzExNCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBHZXRTYXZlRmlsZU5hbWUgICAoQ09NTURMRy4yKQogICovCi1CT09MIEdldFNhdmVGaWxlTmFtZSggU0VHUFRSIG9mbikKK0JPT0wxNiBHZXRTYXZlRmlsZU5hbWUoIFNFR1BUUiBvZm4pCiB7CiAgICAgSElOU1RBTkNFMTYgaEluc3Q7CiAgICAgSEFORExFMTYgaERsZ1RtcGwgPSAwOwpAQCAtMTkzLDcgKzE5Myw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCQlGSUxFRExHX1NjYW5EaXIJCQlbaW50ZXJuYWxdCiAgKi8KLXN0YXRpYyBCT09MIEZJTEVETEdfU2NhbkRpcihIV05EMTYgaFduZCwgTFBTVFIgbmV3UGF0aCkKK3N0YXRpYyBCT09MMzIgRklMRURMR19TY2FuRGlyKEhXTkQxNiBoV25kLCBMUFNUUiBuZXdQYXRoKQogewogICAgIGludCBsZW47CiAgICAgY2hhciBzdHJbNTEyXTsKQEAgLTI1NSw5ICsyNTUsOSBAQAogCiAJaWYgKHNhdmVkbGcpICAgICAgIC8qIHVzZSBfZ3JheV8gdGV4dCBpbiBGaWxlU2F2ZURsZyAqLwogCSAgaWYgKCFscGRpcy0+aXRlbVN0YXRlKQotCSAgICBTZXRUZXh0Q29sb3IobHBkaXMtPmhEQyxHZXRTeXNDb2xvcjMyKENPTE9SX0dSQVlURVhUKSApOworCSAgICBTZXRUZXh0Q29sb3IzMihscGRpcy0+aERDLEdldFN5c0NvbG9yMzIoQ09MT1JfR1JBWVRFWFQpICk7CiAJICBlbHNlICAKLQkgICAgU2V0VGV4dENvbG9yKGxwZGlzLT5oREMsR2V0U3lzQ29sb3IzMihDT0xPUl9XSU5ET1dURVhUKSApOworCSAgICBTZXRUZXh0Q29sb3IzMihscGRpcy0+aERDLEdldFN5c0NvbG9yMzIoQ09MT1JfV0lORE9XVEVYVCkgKTsKIAkgICAgLyogaW52ZXJzaW9uIG9mIGdyYXkgd291bGQgYmUgYmFkIHJlYWRhYmxlICovCSAgCSAgCiAKIAlUZXh0T3V0MTYobHBkaXMtPmhEQywgbHBkaXMtPnJjSXRlbS5sZWZ0LCBscGRpcy0+cmNJdGVtLnRvcCwKQEAgLTQzMSw4ICs0MzEsOCBAQAogICBpZiAobHBvZm4tPkZsYWdzICYgT0ZOX0hJREVSRUFET05MWSkKICAgICBTaG93V2luZG93MzIoR2V0RGxnSXRlbTMyKGhXbmQsIGNoeDEpLCBTV19ISURFKTsgCiAgIGlmIChGSUxFRExHX0hvb2tDYWxsQ2hrKGxwb2ZuKSkKLSAgICAgcmV0dXJuIChCT09MKUNhbGxXaW5kb3dQcm9jMTYobHBvZm4tPmxwZm5Ib29rLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFduZCwgIFdNX0lOSVRESUFMT0csIHdQYXJhbSwgbFBhcmFtICk7CisgICAgIHJldHVybiAoQk9PTDE2KUNhbGxXaW5kb3dQcm9jMTYobHBvZm4tPmxwZm5Ib29rLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoV25kLCAgV01fSU5JVERJQUxPRywgd1BhcmFtLCBsUGFyYW0gKTsKICAgZWxzZSAgCiAgICAgIHJldHVybiBUUlVFOwogfQpAQCAtNDQ3LDcgKzQ0Nyw3IEBACiAgIE9QRU5GSUxFTkFNRSBvZm4yOwogICBjaGFyIHRtcHN0cls1MTJdLCB0bXBzdHIyWzUxMl07CiAgIExQU1RSIHBzdHIsIHBzdHIyOwotICBVSU5UIGNvbnRyb2wsbm90aWZpY2F0aW9uOworICBVSU5UMTYgY29udHJvbCxub3RpZmljYXRpb247CiAKICAgLyogTm90aWZpY2F0aW9ucyBhcmUgcGFja2FnZWQgZGlmZmVyZW50bHkgaW4gV2luMzIgKi8KICAgY29udHJvbCA9IHdQYXJhbTsKQEAgLTYwOCw3ICs2MDgsNyBAQAogCX0KICAgICAgIGlmIChGSUxFRExHX0hvb2tDYWxsQ2hrKGxwb2ZuKSkKICAgICAgIHsKLSAgICAgICBsUmV0PSAoQk9PTClDYWxsV2luZG93UHJvYzE2KGxwb2ZuLT5scGZuSG9vaywKKyAgICAgICBsUmV0PSAoQk9PTDE2KUNhbGxXaW5kb3dQcm9jMTYobHBvZm4tPmxwZm5Ib29rLAogICAgICAgICAgICAgICAgaFduZCwgUmVnaXN0ZXJXaW5kb3dNZXNzYWdlMzJBKCBGSUxFT0tTVFJJTkcgKSwgMCwgbFBhcmFtICk7CiAgICAgICAgaWYgKGxSZXQpICAgICAgIAogICAgICAgIHsKQEAgLTYzMiwxNCArNjMyLDE0IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBGaWxlT3BlbkRsZ1Byb2MgICAoQ09NTURMRy42KQogICovCi1MUkVTVUxUIEZpbGVPcGVuRGxnUHJvYyhIV05EMTYgaFduZCwgVUlOVCB3TXNnLCBXUEFSQU0xNiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCitMUkVTVUxUIEZpbGVPcGVuRGxnUHJvYyhIV05EMTYgaFduZCwgVUlOVDE2IHdNc2csIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsgIAogIExQT1BFTkZJTEVOQU1FIGxwb2ZuID0gKExQT1BFTkZJTEVOQU1FKVBUUl9TRUdfVE9fTElOKEdldFdpbmRvd0xvbmczMkEoaFduZCwgRFdMX1VTRVIpKTsKICAKICBpZiAod01zZyE9V01fSU5JVERJQUxPRykKICAgaWYgKEZJTEVETEdfSG9va0NhbGxDaGsobHBvZm4pKQogICB7Ci0gICBMUkVTVUxUICBsUmV0PShCT09MKUNhbGxXaW5kb3dQcm9jMTYobHBvZm4tPmxwZm5Ib29rLCBoV25kLCB3TXNnLCB3UGFyYW0sIGxQYXJhbSk7CisgICBMUkVTVUxUICBsUmV0PShCT09MMTYpQ2FsbFdpbmRvd1Byb2MxNihscG9mbi0+bHBmbkhvb2ssIGhXbmQsIHdNc2csIHdQYXJhbSwgbFBhcmFtKTsKICAgIGlmIChsUmV0KSAgIAogICAgIHJldHVybiBsUmV0OyAgICAgICAgIC8qIGVsc2UgY29udGludWUgbWVzc2FnZSBwcm9jZXNzaW5nICovCiAgIH0gICAgICAgICAgICAgCkBAIC02NzUsMTQgKzY3NSwxNCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgRmlsZVNhdmVEbGdQcm9jICAgKENPTU1ETEcuNykKICAqLwotTFJFU1VMVCBGaWxlU2F2ZURsZ1Byb2MoSFdORDE2IGhXbmQsIFVJTlQgd01zZywgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQorTFJFU1VMVCBGaWxlU2F2ZURsZ1Byb2MoSFdORDE2IGhXbmQsIFVJTlQxNiB3TXNnLCBXUEFSQU0xNiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7CiAgTFBPUEVORklMRU5BTUUgbHBvZm4gPSAoTFBPUEVORklMRU5BTUUpUFRSX1NFR19UT19MSU4oR2V0V2luZG93TG9uZzMyQShoV25kLCBEV0xfVVNFUikpOwogIAogIGlmICh3TXNnIT1XTV9JTklURElBTE9HKQogICBpZiAoRklMRURMR19Ib29rQ2FsbENoayhscG9mbikpCiAgIHsKLSAgIExSRVNVTFQgIGxSZXQ9KEJPT0wpQ2FsbFdpbmRvd1Byb2MxNihscG9mbi0+bHBmbkhvb2ssIGhXbmQsIHdNc2csIHdQYXJhbSwgbFBhcmFtKTsKKyAgIExSRVNVTFQgIGxSZXQ9KEJPT0wxNilDYWxsV2luZG93UHJvYzE2KGxwb2ZuLT5scGZuSG9vaywgaFduZCwgd01zZywgd1BhcmFtLCBsUGFyYW0pOwogICAgaWYgKGxSZXQpICAgCiAgICAgcmV0dXJuIGxSZXQ7ICAgICAgICAgLyogZWxzZSBjb250aW51ZSBtZXNzYWdlIHByb2Nlc3NpbmcgKi8KICAgfSAgICAgICAgICAgICAKQEAgLTg2MCw3ICs4NjAsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgRmluZFRleHREbGdQcm9jICAgKENPTU1ETEcuMTMpCiAgKi8KLUxSRVNVTFQgRmluZFRleHREbGdQcm9jKEhXTkQxNiBoV25kLCBVSU5UIHdNc2csIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK0xSRVNVTFQgRmluZFRleHREbGdQcm9jKEhXTkQxNiBoV25kLCBVSU5UMTYgd01zZywgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewogICAgIHN3aXRjaCAod01zZykgewogCWNhc2UgV01fSU5JVERJQUxPRzoKQEAgLTk4MCw3ICs5ODAsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgUmVwbGFjZVRleHREbGdQcm9jICAgKENPTU1ETEcuMTQpCiAgKi8KLUxSRVNVTFQgUmVwbGFjZVRleHREbGdQcm9jKEhXTkQxNiBoV25kLCBVSU5UIHdNc2csIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK0xSRVNVTFQgUmVwbGFjZVRleHREbGdQcm9jKEhXTkQxNiBoV25kLCBVSU5UMTYgd01zZywgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewogICAgIHN3aXRjaCAod01zZykgewogCWNhc2UgV01fSU5JVERJQUxPRzoKQEAgLTk5NSwxMCArOTk1LDEwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBQcmludERsZyAgIChDT01NRExHLjIwKQogICovCi1CT09MIFByaW50RGxnKCBTRUdQVFIgcHJpbnRkbGcgKQorQk9PTDE2IFByaW50RGxnKCBTRUdQVFIgcHJpbnRkbGcgKQogewogICAgIEhBTkRMRTE2IGhJbnN0OwotICAgIEJPT0wgYlJldCA9IEZBTFNFOworICAgIEJPT0wxNiBiUmV0ID0gRkFMU0U7CiAgICAgTFBDVk9JRCB0ZW1wbGF0ZTsKICAgICBIV05EMzIgaHduZERpYWxvZzsKICAgICBMUFBSSU5URExHIGxwUHJpbnQgPSAoTFBQUklOVERMRylQVFJfU0VHX1RPX0xJTihwcmludGRsZyk7CkBAIC0xMDI5LDcgKzEwMjksNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgUHJpbnREbGdQcm9jICAgKENPTU1ETEcuMjEpCiAgKi8KLUxSRVNVTFQgUHJpbnREbGdQcm9jKEhXTkQxNiBoV25kLCBVSU5UIHdNc2csIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK0xSRVNVTFQgUHJpbnREbGdQcm9jKEhXTkQxNiBoV25kLCBVSU5UMTYgd01zZywgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewogICBzd2l0Y2ggKHdNc2cpCiAgICAgewpAQCAtMTA1Niw3ICsxMDU2LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFByaW50U2V0dXBEbGdQcm9jICAgKENPTU1ETEcuMjIpCiAgKi8KLUxSRVNVTFQgUHJpbnRTZXR1cERsZ1Byb2MoSFdORDE2IGhXbmQsIFVJTlQgd01zZywgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQorTFJFU1VMVCBQcmludFNldHVwRGxnUHJvYyhIV05EMTYgaFduZCwgVUlOVDE2IHdNc2csIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKICAgc3dpdGNoICh3TXNnKQogICAgIHsKQEAgLTEwOTEsNyArMTA5MSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBHZXRGaWxlVGl0bGUgICAoQ09NTURMRy4yNykKICAqLwotc2hvcnQgR2V0RmlsZVRpdGxlKExQQ1NUUiBscEZpbGUsIExQU1RSIGxwVGl0bGUsIFVJTlQgY2JCdWYpCitzaG9ydCBHZXRGaWxlVGl0bGUoTFBDU1RSIGxwRmlsZSwgTFBTVFIgbHBUaXRsZSwgVUlOVDE2IGNiQnVmKQogewogICAgIGludCBpLCBsZW47CiAgICAgZHByaW50Zl9jb21tZGxnKHN0ZGRlYiwiR2V0RmlsZVRpdGxlKCVwICVwICVkKTsgXG4iLCBscEZpbGUsIGxwVGl0bGUsIGNiQnVmKTsKQEAgLTExMjcsMTEgKzExMjcsMTEgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIENob29zZUNvbG9yICAgKENPTU1ETEcuNSkKICAqLwotQk9PTCBDaG9vc2VDb2xvcihMUENIT09TRUNPTE9SIGxwQ2hDb2wpCitCT09MMTYgQ2hvb3NlQ29sb3IoTFBDSE9PU0VDT0xPUiBscENoQ29sKQogewogICAgIEhJTlNUQU5DRTE2IGhJbnN0OwogICAgIEhBTkRMRTE2IGhEbGdUbXBsID0gMDsKLSAgICBCT09MIGJSZXQgPSBGQUxTRSwgd2luMzJGb3JtYXQgPSBGQUxTRTsKKyAgICBCT09MMTYgYlJldCA9IEZBTFNFLCB3aW4zMkZvcm1hdCA9IEZBTFNFOwogICAgIExQQ1ZPSUQgdGVtcGxhdGU7CiAgICAgSFdORDMyIGh3bmREaWFsb2c7CiAKQEAgLTEyMDQsMTAgKzEyMDQsMTAgQEAKICBIREMxNiBoZGNNZW07ICAgICAgICAvKiBjb2xvciBncmFwaCB1c2VkIGZvciBCaXRCbHQoKSAqLwogIEhCSVRNQVAxNiBoYm1NZW07ICAgIC8qIGNvbG9yIGdyYXBoIGJpdG1hcCAqLyAgICAKICBSRUNUMTYgZnVsbHNpemU7ICAgICAvKiBvcmlnaW5hbCBkaWFsb2cgd2luZG93IHNpemUgKi8KLSBVSU5UIG1zZXRyZ2I7ICAgICAgICAvKiAjIG9mIFNFVFJHQlNUUklORyBtZXNzYWdlICh0b2RheSBub3QgdXNlZCkgICovCisgVUlOVDE2IG1zZXRyZ2I7ICAgICAgICAvKiAjIG9mIFNFVFJHQlNUUklORyBtZXNzYWdlICh0b2RheSBub3QgdXNlZCkgICovCiAgUkVDVDE2IG9sZDNhbmdsZTsgICAgLyogbGFzdCBwb3NpdGlvbiBvZiBsLW1hcmtlciAqLwogIFJFQ1QxNiBvbGRjcm9zczsgICAgIC8qIGxhc3QgcG9zaXRpb24gb2YgY29sb3Ivc2F0dWF0aW9uIG1hcmtlciAqLwotIEJPT0wgdXBkYXRpbmc7ICAgICAgIC8qIHRvIHByZXZlbnQgcmVjdXJzaXZlIFdNX0NPTU1BTkQvRU5fVVBEQVRFIHByb2Nlc2luZyAqLworIEJPT0wzMiB1cGRhdGluZzsgICAgIC8qIHRvIHByZXZlbnQgcmVjdXJzaXZlIFdNX0NPTU1BTkQvRU5fVVBEQVRFIHByb2Nlc2luZyAqLwogIGludCBoOwogIGludCBzOwogIGludCBsOyAgICAgICAgICAgICAgIC8qIGZvciB0ZW1wb3Jhcnkgc3RvcmluZyBvZiBodWUsc2F0LGx1bSAqLwpAQCAtMTQ0Nyw3ICsxNDQ3LDcgQEAKICBHZXRXaW5kb3dSZWN0MTYoaHduZCwmcmVjdCk7CiAgaWYgKFB0SW5SZWN0MTYoJnJlY3QscG9pbnQpKQogIHsKLSAgUG9zdE1lc3NhZ2UoaERsZyxXTV9DT01NQU5ELDB4MmM5LDApOworICBQb3N0TWVzc2FnZTE2KGhEbGcsV01fQ09NTUFORCwweDJjOSwwKTsKICAgcmV0dXJuIDE7CiAgfQogIHJldHVybiAwOwpAQCAtMTYzMiw3ICsxNjMyLDcgQEAKICBHZXRDbGllbnRSZWN0MTYoaHduZCwmY2xpZW50KTsKICBoZGM9R2V0REMzMihod25kKTsKICBscHAtPmhkY01lbSA9IENyZWF0ZUNvbXBhdGlibGVEQzMyKGhkYyk7Ci0gbHBwLT5oYm1NZW0gPSBDcmVhdGVDb21wYXRpYmxlQml0bWFwKGhkYyxjbGllbnQucmlnaHQsY2xpZW50LmJvdHRvbSk7CisgbHBwLT5oYm1NZW0gPSBDcmVhdGVDb21wYXRpYmxlQml0bWFwMzIoaGRjLGNsaWVudC5yaWdodCxjbGllbnQuYm90dG9tKTsKICBTZWxlY3RPYmplY3QzMihscHAtPmhkY01lbSxscHAtPmhibU1lbSk7CiAKICB4ZGlmPWNsaWVudC5yaWdodCAvWFNURVBTOwpAQCAtMTg3OSw3ICsxODc5LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDX0hvb2tDYWxsQ2hrICAgICAgICAgICAgICAgICBbaW50ZXJuYWxdCiAgKi8KLXN0YXRpYyBCT09MIENDX0hvb2tDYWxsQ2hrKExQQ0hPT1NFQ09MT1IgbHBjYykKK3N0YXRpYyBCT09MMzIgQ0NfSG9va0NhbGxDaGsoTFBDSE9PU0VDT0xPUiBscGNjKQogewogIGlmIChscGNjKQogICBpZihscGNjLT5GbGFncyAmIENDX0VOQUJMRUhPT0spCkBAIC0xOTY0LDcgKzE5NjQsNyBAQAogc3RhdGljIExSRVNVTFQgQ0NfV01Db21tYW5kKEhXTkQxNiBoRGxnLCBXUEFSQU0xNiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pIAogewogICAgIGludCByLGcsYixpLHh4OwotICAgIFVJTlQgY29rbXNnOworICAgIFVJTlQxNiBjb2ttc2c7CiAgICAgSERDMzIgaGRjOwogICAgIENPTE9SUkVGICpjcjsKICAgICBzdHJ1Y3QgQ0NQUklWQVRFICogbHBwPShzdHJ1Y3QgQ0NQUklWQVRFICopR2V0V2luZG93TG9uZzMyQShoRGxnLCBEV0xfVVNFUik7IApAQCAtMjE2Myw3ICsyMTYzLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIENvbG9yRGxnUHJvYyAgIChDT01NRExHLjgpCiAgKi8KLUxSRVNVTFQgQ29sb3JEbGdQcm9jKEhXTkQxNiBoRGxnLCBVSU5UIG1lc3NhZ2UsCitMUkVTVUxUIENvbG9yRGxnUHJvYyhIV05EMTYgaERsZywgVUlOVDE2IG1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICBXUEFSQU0xNiB3UGFyYW0sIExPTkcgbFBhcmFtKQogewogIGludCByZXM7CkBAIC0yMjIyLDExICsyMjIyLDExIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgICAgICAgICAgICAgQ2hvb3NlRm9udCAgIChDT01NRExHLjE1KSAgICAgCiAgKi8KLUJPT0wgQ2hvb3NlRm9udChMUENIT09TRUZPTlQgbHBDaEZvbnQpCitCT09MMTYgQ2hvb3NlRm9udChMUENIT09TRUZPTlQgbHBDaEZvbnQpCiB7CiAgICAgSElOU1RBTkNFMTYgaEluc3Q7CiAgICAgSEFORExFMTYgaERsZ1RtcGwgPSAwOwotICAgIEJPT0wgYlJldCA9IEZBTFNFLCB3aW4zMkZvcm1hdCA9IEZBTFNFOworICAgIEJPT0wxNiBiUmV0ID0gRkFMU0UsIHdpbjMyRm9ybWF0ID0gRkFMU0U7CiAgICAgTFBDVk9JRCB0ZW1wbGF0ZTsKICAgICBIV05EMzIgaHduZERpYWxvZzsKIApAQCAtMjI4OSw3ICsyMjg5LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgICAgICAgICAgICAgIENGbl9Ib29rQ2FsbENoayAgICAgICAgICAgICAgICAgW2ludGVybmFsXQogICovCi1zdGF0aWMgQk9PTCBDRm5fSG9va0NhbGxDaGsoTFBDSE9PU0VGT05UIGxwY2YpCitzdGF0aWMgQk9PTDMyIENGbl9Ib29rQ2FsbENoayhMUENIT09TRUZPTlQgbHBjZikKIHsKICBpZiAobHBjZikKICAgaWYobHBjZi0+RmxhZ3MgJiBDRl9FTkFCTEVIT09LKQpAQCAtMjQ3OSw3ICsyNDc5LDcgQEAKICAgaWYgKCFoQml0bWFwVFQpCiAgICAgaEJpdG1hcFRUID0gTG9hZEJpdG1hcDE2KDAsIE1BS0VJTlRSRVNPVVJDRShPQk1fVFJUWVBFKSk7CiAJCQkgCi0gIGlmICghKGxwY2YtPkZsYWdzICYgQ0ZfU0hPV0hFTFApIHx8ICFJc1dpbmRvdyhscGNmLT5od25kT3duZXIpKQorICBpZiAoIShscGNmLT5GbGFncyAmIENGX1NIT1dIRUxQKSB8fCAhSXNXaW5kb3czMihscGNmLT5od25kT3duZXIpKQogICAgIFNob3dXaW5kb3czMihHZXREbGdJdGVtMzIoaERsZyxwc2hIZWxwKSxTV19ISURFKTsKICAgaWYgKCEobHBjZi0+RmxhZ3MgJiBDRl9BUFBMWSkpCiAgICAgU2hvd1dpbmRvdzMyKEdldERsZ0l0ZW0zMihoRGxnLHBzaDMpLFNXX0hJREUpOwpAQCAtMjY5Miw3ICsyNjkyLDcgQEAKICAgaWYgKGxwY2YtPkZsYWdzICYgQ0ZfRUZGRUNUUykKICAgIGlmIChISVdPUkQobFBhcmFtKT09Q1RMQ09MT1JfU1RBVElDICYmIEdldERsZ0N0cmxJRDMyKExPV09SRChsUGFyYW0pKT09c3RjNikKICAgIHsKLSAgICAgU2V0VGV4dENvbG9yKHdQYXJhbSxscGNmLT5yZ2JDb2xvcnMpOworICAgICBTZXRUZXh0Q29sb3IzMih3UGFyYW0sbHBjZi0+cmdiQ29sb3JzKTsKICAgICAgcmV0dXJuIEdldFN0b2NrT2JqZWN0MzIoV0hJVEVfQlJVU0gpOwogICAgfQogICByZXR1cm4gMDsKQEAgLTI4MzgsNyArMjgzOCw3IEBACiAgICAgICAgICAgICAgICAgICAgIDIuIHNvbWUgQ0ZfLi4gZmxhZ3MgYXJlIG5vdCBzdXBwb3J0ZWQKICAgICAgICAgICAgICAgICAgICAgMy4gc29tZSBUVHlwZSBleHRlbnNpb25zCiAgKi8KLUxSRVNVTFQgRm9ybWF0Q2hhckRsZ1Byb2MoSFdORDE2IGhEbGcsIFVJTlQgbWVzc2FnZSwgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQorTFJFU1VMVCBGb3JtYXRDaGFyRGxnUHJvYyhIV05EMTYgaERsZywgVUlOVDE2IG1lc3NhZ2UsIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKICAgTFBDSE9PU0VGT05UIGxwY2Y9KExQQ0hPT1NFRk9OVClHZXRXaW5kb3dMb25nMzJBKGhEbGcsIERXTF9VU0VSKTsgIAogICBpZiAobWVzc2FnZSE9V01fSU5JVERJQUxPRykKZGlmZiAtLWdpdCBhL21pc2MvZHJpdmVyLmMgYi9taXNjL2RyaXZlci5jCmluZGV4IGM1MzVmZmQuLjRlYjA4ODAgMTAwNjQ0Ci0tLSBhL21pc2MvZHJpdmVyLmMKKysrIGIvbWlzYy9kcml2ZXIuYwpAQCAtMTEwLDcgKzExMCw3IEBACiAgICAgbHBuZXdkcnYgPSAoTFBEUklWRVJJVEVNKUdsb2JhbExvY2sxNiggaERydnIgKTsKICAgICBpZiAobHBuZXdkcnYgPT0gTlVMTCkgcmV0dXJuIDA7CiAgICAgbHBuZXdkcnYtPmRpcy5sZW5ndGggPSBzaXplb2YoIERSSVZFUklORk9TVFJVQ1QxNiApOwotICAgIGxwbmV3ZHJ2LT5kaXMuaE1vZHVsZSA9IExvYWRNb2R1bGUoIERydk5hbWUsIChMUFZPSUQpLTEgKTsKKyAgICBscG5ld2Rydi0+ZGlzLmhNb2R1bGUgPSBMb2FkTW9kdWxlMTYoIERydk5hbWUsIChMUFZPSUQpLTEgKTsKICAgICBpZiAoIWxwbmV3ZHJ2LT5kaXMuaE1vZHVsZSkKICAgICB7CiAJR2xvYmFsVW5sb2NrMTYoIGhEcnZyICk7CkBAIC0xMjIsOCArMTIyLDggQEAKICAgICBscG5ld2Rydi0+Y291bnQgPSAxOwogICAgIG9yZGluYWwgPSBNT0RVTEVfR2V0T3JkaW5hbCggbHBuZXdkcnYtPmRpcy5oTW9kdWxlLCAiRFJJVkVSUFJPQyIgKTsKICAgICBpZiAoIW9yZGluYWwgfHwKLSAgICAgICAgIShscG5ld2Rydi0+bHBEcnZQcm9jID0gTU9EVUxFX0dldEVudHJ5UG9pbnQoIGxwbmV3ZHJ2LT5kaXMuaE1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGluYWwgKSkpCisgICAgICAgICEobHBuZXdkcnYtPmxwRHJ2UHJvYyA9IChEUklWRVJQUk9DMTYpTU9EVUxFX0dldEVudHJ5UG9pbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscG5ld2Rydi0+ZGlzLmhNb2R1bGUsIG9yZGluYWwgKSkpCiAgICAgewogCUZyZWVNb2R1bGUxNiggbHBuZXdkcnYtPmRpcy5oTW9kdWxlICk7CiAJR2xvYmFsVW5sb2NrMTYoIGhEcnZyICk7CmRpZmYgLS1naXQgYS9taXNjL2VzY2FwZS5jIGIvbWlzYy9lc2NhcGUuYwppbmRleCBhNDI4MjdjLi5kNzQyZmMxIDEwMDY0NAotLS0gYS9taXNjL2VzY2FwZS5jCisrKyBiL21pc2MvZXNjYXBlLmMKQEAgLTQsNyArNCw2IEBACiAgKiBDb3B5cmlnaHQgMTk5NCAgQm9iIEFtc3RhZHQKICAqLwogCi0jZGVmaW5lIE5PX1RSQU5TSVRJT05fVFlQRVMKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJnZGkuaCIKZGlmZiAtLWdpdCBhL21pc2MvZXhlYy5jIGIvbWlzYy9leGVjLmMKaW5kZXggMTQzZGZlMy4uZTc5M2Y4YiAxMDA2NDQKLS0tIGEvbWlzYy9leGVjLmMKKysrIGIvbWlzYy9leGVjLmMKQEAgLTIsNyArMiw2IEBACiAgKiAgICAgV2luZG93cyBFeGVjICYgSGVscAogICovCiAKLSNkZWZpbmUgTk9fVFJBTlNJVElPTl9UWVBFUyAgLyogVGhpcyBmaWxlIGlzIFdpbjMyLWNsZWFuICovCiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KQEAgLTYxLDcgKzYwLDcgQEAKICAgICBmb3IgKHBwV25kID0gbGlzdCwgaSA9IDA7ICpwcFduZDsgcHBXbmQrKywgaSsrKQogICAgIHsKICAgICAgICAgLyogTWFrZSBzdXJlIHRoYXQgdGhlIHdpbmRvdyBzdGlsbCBleGlzdHMgKi8KLSAgICAgICAgaWYgKCFJc1dpbmRvdyggKCpwcFduZCktPmh3bmRTZWxmICkpIGNvbnRpbnVlOworICAgICAgICBpZiAoIUlzV2luZG93MzIoICgqcHBXbmQpLT5od25kU2VsZiApKSBjb250aW51ZTsKIAlpZiAoIVNlbmRNZXNzYWdlMTYoICgqcHBXbmQpLT5od25kU2VsZiwgV01fUVVFUllFTkRTRVNTSU9OLCAwLCAwICkpCiAgICAgICAgICAgICBicmVhazsKICAgICB9CkBAIC03MSw3ICs3MCw3IEBACiAKICAgICBmb3IgKHBwV25kID0gbGlzdDsgaSA+IDA7IGktLSwgcHBXbmQrKykKICAgICB7Ci0gICAgICAgIGlmICghSXNXaW5kb3coICgqcHBXbmQpLT5od25kU2VsZiApKSBjb250aW51ZTsKKyAgICAgICAgaWYgKCFJc1dpbmRvdzMyKCAoKnBwV25kKS0+aHduZFNlbGYgKSkgY29udGludWU7CiAJU2VuZE1lc3NhZ2UxNiggKCpwcFduZCktPmh3bmRTZWxmLCBXTV9FTkRTRVNTSU9OLCByZXN1bHQsIDAgKTsKICAgICB9CiAgICAgSGVhcEZyZWUoIFN5c3RlbUhlYXAsIDAsIGxpc3QgKTsKZGlmZiAtLWdpdCBhL21pc2MvbHN0ci5jIGIvbWlzYy9sc3RyLmMKaW5kZXggNzM1YTU5ZS4uMjljNjBlZSAxMDA2NDQKLS0tIGEvbWlzYy9sc3RyLmMKKysrIGIvbWlzYy9sc3RyLmMKQEAgLTEyNyw5ICsxMjcsOSBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIE91dHB1dERlYnVnU3RyaW5nICAgKEtFUk5FTC4xMTUpCisgKiAgICAgICAgICAgT3V0cHV0RGVidWdTdHJpbmcxNiAgIChLRVJORUwuMTE1KQogICovCi12b2lkIE91dHB1dERlYnVnU3RyaW5nKCBMUENTVFIgc3RyICkKK3ZvaWQgT3V0cHV0RGVidWdTdHJpbmcxNiggTFBDU1RSIHN0ciApCiB7CiAgICAgY2hhciAqbW9kdWxlOwogICAgIGNoYXIgKnAsICpidWZmZXIgPSBIZWFwQWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIDAsIHN0cmxlbihzdHIpKzEgKTsKQEAgLTE0NSw2ICsxNDUsMjggQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBPdXRwdXREZWJ1Z1N0cmluZzMyQSAgIChLRVJORUwzMgorICovCit2b2lkIE91dHB1dERlYnVnU3RyaW5nMzJBKCBMUENTVFIgc3RyICkKK3sKKyAgICBPdXRwdXREZWJ1Z1N0cmluZzE2KCBzdHIgKTsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIE91dHB1dERlYnVnU3RyaW5nMzJXICAgKEtFUk5FTDMyCisgKi8KK3ZvaWQgT3V0cHV0RGVidWdTdHJpbmczMlcoIExQQ1dTVFIgc3RyICkKK3sKKyAgICBMUFNUUiBwID0gSEVBUF9zdHJkdXBXdG9BKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBzdHIgKTsKKyAgICBPdXRwdXREZWJ1Z1N0cmluZzMyQSggcCApOworICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBwICk7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBDaGFyTmV4dDMyQSAgIChVU0VSMzIuMjgpCiAgKi8KIExQU1RSIENoYXJOZXh0MzJBKCBMUENTVFIgcHRyICkKQEAgLTU0NCw2ICs1NjYsMTAgQEAKIAkJCQkJCQlmbXRzdHI9SGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxzdHJsZW4oZikrMik7CiAJCQkJCQkJc3ByaW50ZihmbXRzdHIsIiUlJXMiLGYpOwogCQkJCQkJCWY9eCsxOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlmbXRzdHI9SGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxzdHJsZW4oZikpOworCQkJCQkJCXNwcmludGYoZm10c3RyLCIlJSVzIixmKTsKKwkJCQkJCQlmKz1zdHJsZW4oZik7IC8qYXQgXDAqLwogCQkJCQkJfQogCQkJCQl9IGVsc2UKIAkJCQkJCWZtdHN0cj1IRUFQX3N0cmR1cEEoR2V0UHJvY2Vzc0hlYXAoKSwwLCIlcyIpOwpAQCAtNzM0LDYgKzc2MCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtdHN0cj1IZWFwQWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIDAsIHN0cmxlbihmKSsyKTsKIAkJCQkJCQlzcHJpbnRmKGZtdHN0ciwiJSUlcyIsZik7CiAJCQkJCQkJZj14KzE7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWZtdHN0cj1IZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLHN0cmxlbihmKSk7CisJCQkJCQkJc3ByaW50ZihmbXRzdHIsIiUlJXMiLGYpOworCQkJCQkJCWYrPXN0cmxlbihmKTsgLyphdCBcMCovCiAJCQkJCQl9CiAJCQkJCX0gZWxzZQogCQkJCQkJZm10c3RyPUhFQVBfc3RyZHVwQSggR2V0UHJvY2Vzc0hlYXAoKSwwLCIlcyIpOwpkaWZmIC0tZ2l0IGEvbWlzYy9semV4cGFuZC5jIGIvbWlzYy9semV4cGFuZC5jCmluZGV4IGExNDliMmQuLjQ4ZDY3ZTQgMTAwNjQ0Ci0tLSBhL21pc2MvbHpleHBhbmQuYworKysgYi9taXNjL2x6ZXhwYW5kLmMKQEAgLTcsNyArNyw2IEBACiAgKiBGSVhNRTogcmV0dXJuIHZhbHVlcyBtaWdodCBiZSB3cm9uZwogICovCiAKLSNkZWZpbmUgTk9fVFJBTlNJVElPTl9UWVBFUyAgLyogVGhpcyBmaWxlIGlzIFdpbjMyLWNsZWFuICovCiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KZGlmZiAtLWdpdCBhL21pc2MvbWFpbi5jIGIvbWlzYy9tYWluLmMKaW5kZXggMTY4NzIyNi4uOTZhOTE1YSAxMDA2NDQKLS0tIGEvbWlzYy9tYWluLmMKKysrIGIvbWlzYy9tYWluLmMKQEAgLTcwLDYgKzcwLDcgQEAKICAgICB7Ikl0IiwweDA0MTB9LAkvKiBMQU5HX0l0ICovCiAgICAgeyJLbyIsMHgwNDEyfSwJLyogTEFOR19LbyAqLwogICAgIHsiSHUiLDB4MDQzNn0sCS8qIExBTkdfSHUgKi8KKyAgICB7IlBsIiwweDA0MTV9LCAgICAgIC8qIExBTkdfUGwgKi8KICAgICB7TlVMTCwwfQogfTsKIApAQCAtMTYyLDcgKzE2Myw3IEBACiAgICIgICAgLWZpeGVkbWFwICAgICAgIFVzZSBhIFwic3RhbmRhcmRcIiBjb2xvciBtYXBcbiIgXAogICAiICAgIC1pY29uaWMgICAgICAgICBTdGFydCBhcyBhbiBpY29uXG4iIFwKICAgIiAgICAtaXBjICAgICAgICAgICAgRW5hYmxlIElQQyBmYWNpbGl0aWVzXG4iIFwKLSAgIiAgICAtbGFuZ3VhZ2UgeHggICAgU2V0IHRoZSBsYW5ndWFnZSAob25lIG9mIEVuLEVzLERlLE5vLEZyLEZpLERhLEN6LEVvLEl0LEtvLEh1KVxuIiBcCisgICIgICAgLWxhbmd1YWdlIHh4ICAgIFNldCB0aGUgbGFuZ3VhZ2UgKG9uZSBvZiBFbixFcyxEZSxObyxGcixGaSxEYSxDeixFbyxJdCxLbyxcbiAgICAgICAgICAgICAgICAgICAgSHUsUGwpXG4iIFwKICAgIiAgICAtbWFuYWdlZCAgICAgICAgQWxsb3cgdGhlIHdpbmRvdyBtYW5hZ2VyIHRvIG1hbmFnZSBjcmVhdGVkIHdpbmRvd3NcbiIgXAogICAiICAgIC1tb2RlIG1vZGUgICAgICBTdGFydCBXaW5lIGluIGEgcGFydGljdWxhciBtb2RlIChzdGFuZGFyZCBvciBlbmhhbmNlZClcbiIgXAogICAiICAgIC1uYW1lIG5hbWUgICAgICBTZXQgdGhlIGFwcGxpY2F0aW9uIG5hbWVcbiIgXApAQCAtMjQwLDcgKzI0MSw3IEBACiAgKi8KICNpZmRlZiBERUJVR19SVU5USU1FCiAKLUJPT0wgUGFyc2VEZWJ1Z09wdGlvbnMoY2hhciAqb3B0aW9ucykKK0JPT0wzMiBQYXJzZURlYnVnT3B0aW9ucyhjaGFyICpvcHRpb25zKQogewogICBpbnQgbDsKICAgaWYgKHN0cmxlbihvcHRpb25zKTwzKQpAQCAtODExLDE0ICs4MTIsMTQgQEAKICAgICBicmVhazsKICAgfQogICBpZiggZ2V0VmVyc2lvbkV4LmR3UGxhdGZvcm1JZCA9PSBWRVJfUExBVEZPUk1fV0lOMzJfTlQgKQotICAgICAgcmVzdWx0IHw9IDB4NDAwMDsgLyogdW5kb2N1bWVudGVkIFdGX1dJTk5UICovCisgICAgICByZXN1bHQgfD0gV0ZfV0lOMzJXT1c7IC8qIHVuZG9jdW1lbnRlZCBXRl9XSU5OVCAqLwogICByZXR1cm4gcmVzdWx0OwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCVNldEVudmlyb25tZW50IChHREkuMTMyKQorICogICAgICAgICAgU2V0RW52aXJvbm1lbnQgICAoR0RJLjEzMikKICAqLwotaW50IFNldEVudmlyb25tZW50KExQQ1NUUiBscFBvcnROYW1lLCBMUENTVFIgbHBFbnZpcm9uLCBXT1JEIG5Db3VudCkKK0lOVDE2IFNldEVudmlyb25tZW50KCBMUENTVFIgbHBQb3J0TmFtZSwgTFBDU1RSIGxwRW52aXJvbiwgVUlOVDE2IG5Db3VudCApCiB7CiAgICAgTFBFTlZFTlRSWQlscE5ld0VudjsKICAgICBMUEVOVkVOVFJZCWxwRW52ID0gbHBFbnZMaXN0OwpAQCAtODg1LDkgKzg4Niw5IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKglHZXRFbnZpcm9ubWVudCAoR0RJLjEzNCkKKyAqICAgICAgICAgICBHZXRFbnZpcm9ubWVudCAgIChHREkuMTM0KQogICovCi1pbnQgR2V0RW52aXJvbm1lbnQoTFBTVFIgbHBQb3J0TmFtZSwgTFBTVFIgbHBFbnZpcm9uLCBXT1JEIG5NYXhTaXopCitJTlQxNiBHZXRFbnZpcm9ubWVudCggTFBDU1RSIGxwUG9ydE5hbWUsIExQU1RSIGxwRW52aXJvbiwgVUlOVDE2IG5NYXhTaXogKQogewogICAgIFdPUkQgICAgICAgbkNvdW50OwogICAgIExQRU5WRU5UUlkgbHBFbnYgPSBscEVudkxpc3Q7CkBAIC05NDQsOSArOTQ1LDkgQEAKIAkJY2FzZSBTUElfR0VUQkVFUDoKIAkJCVhHZXRLZXlib2FyZENvbnRyb2woZGlzcGxheSwgJmtleWJvYXJkX3N0YXRlKTsKIAkJCWlmIChrZXlib2FyZF9zdGF0ZS5iZWxsX3BlcmNlbnQgPT0gMCkKLQkJCQkqKEJPT0wgKikgbHB2UGFyYW0gPSBGQUxTRTsKKwkJCQkqKEJPT0wxNiAqKSBscHZQYXJhbSA9IEZBTFNFOwogCQkJZWxzZQotCQkJCSooQk9PTCAqKSBscHZQYXJhbSA9IFRSVUU7CisJCQkJKihCT09MMTYgKikgbHB2UGFyYW0gPSBUUlVFOwogCQkJYnJlYWs7CiAJCQogCQljYXNlIFNQSV9HRVRCT1JERVI6CkBAIC05NTUsMjUgKzk1NiwyNSBAQAogCiAJCWNhc2UgU1BJX0dFVEZBU1RUQVNLU1dJVENIOgogCQkgICAgaWYgKCBHZXRQcm9maWxlSW50MzJBKCAid2luZG93cyIsICJDb29sU3dpdGNoIiwgMSApID09IDEgKQotCQkJICAqKEJPT0wgKikgbHB2UGFyYW0gPSBUUlVFOworCQkJICAqKEJPT0wxNiAqKSBscHZQYXJhbSA9IFRSVUU7CiAJCQllbHNlCi0JCQkgICooQk9PTCAqKSBscHZQYXJhbSA9IEZBTFNFOworCQkJICAqKEJPT0wxNiAqKSBscHZQYXJhbSA9IEZBTFNFOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBTUElfR0VUR1JJREdSQU5VTEFSSVRZOgotICAgICAgICAgICAgICAgICAgICAqKElOVCAqKSBscHZQYXJhbSA9IEdldFByb2ZpbGVJbnQzMkEoICJkZXNrdG9wIiwgCisgICAgICAgICAgICAgICAgICAgICooSU5UMTYgKikgbHB2UGFyYW0gPSBHZXRQcm9maWxlSW50MzJBKCAiZGVza3RvcCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHcmlkR3JhbnVsYXJpdHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgICAgICBjYXNlIFNQSV9HRVRJQ09OVElUTEVXUkFQOgotICAgICAgICAgICAgICAgICAgICAqKEJPT0wgKikgbHB2UGFyYW0gPSBHZXRQcm9maWxlSW50MzJBKCAiZGVza3RvcCIsCisgICAgICAgICAgICAgICAgICAgICooQk9PTDE2ICopIGxwdlBhcmFtID0gR2V0UHJvZmlsZUludDMyQSggImRlc2t0b3AiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSWNvblRpdGxlV3JhcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgICAgICBjYXNlIFNQSV9HRVRLRVlCT0FSRERFTEFZOgotICAgICAgICAgICAgICAgICAgICAqKElOVCAqKSBscHZQYXJhbSA9IEdldFByb2ZpbGVJbnQzMkEoICJrZXlib2FyZCIsCisgICAgICAgICAgICAgICAgICAgICooSU5UMTYgKikgbHB2UGFyYW0gPSBHZXRQcm9maWxlSW50MzJBKCAia2V5Ym9hcmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLZXlib2FyZERlbGF5IiwgMSApOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKIApAQCAtOTg5LDE1ICs5OTAsMTUgQEAKIAogCQljYXNlIFNQSV9HRVRTQ1JFRU5TQVZFQUNUSVZFOgogICAgICAgICAgICAgICAgICAgICBpZiAoIEdldFByb2ZpbGVJbnQzMkEoICJ3aW5kb3dzIiwgIlNjcmVlblNhdmVBY3RpdmUiLCAxICkgPT0gMSApCi0gICAgICAgICAgICAgICAgICAgICAgICAqKEJPT0wgKikgbHB2UGFyYW0gPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgKihCT09MMTYgKikgbHB2UGFyYW0gPSBUUlVFOwogICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAqKEJPT0wgKikgbHB2UGFyYW0gPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICooQk9PTDE2ICopIGxwdlBhcmFtID0gRkFMU0U7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCiAJCWNhc2UgU1BJX0dFVFNDUkVFTlNBVkVUSU1FT1VUOgogCQkJLyogRklYTUUgR2V0UHJvZmlsZUludCggIndpbmRvd3MiLCAiU2NyZWVuU2F2ZVRpbWVvdXQiLCAzMDAgKTsgKi8KIAkJCVhHZXRTY3JlZW5TYXZlcihkaXNwbGF5LCAmdGltZW91dCwgJnRlbXAsJnRlbXAsJnRlbXApOwotCQkJKihJTlQgKikgbHB2UGFyYW0gPSB0aW1lb3V0ICogMTAwMDsKKwkJCSooSU5UMTYgKikgbHB2UGFyYW0gPSB0aW1lb3V0ICogMTAwMDsKIAkJCWJyZWFrOwogCiAJCWNhc2UgU1BJX0lDT05IT1JJWk9OVEFMU1BBQ0lORzoKQEAgLTExMTIsNyArMTExMyw3IEBACiAgICAgICAgIHJldHVybiBTZXREZXNrV2FsbFBhcGVyMzIoTlVMTCk7CiAKICAgICBjYXNlIFNQSV9TRVRERVNLUEFUVEVSTjoKLSAgICAgICAgaWYgKChJTlQpIHVQYXJhbSA9PSAtMSkKKyAgICAgICAgaWYgKChJTlQzMikgdVBhcmFtID09IC0xKQogICAgICAgICB7CiAgICAgICAgICAgICBHZXRQcm9maWxlU3RyaW5nMzJBKCJEZXNrdG9wIiwgIlBhdHRlcm4iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjE3MCA4NSAxNzAgODUgMTcwIDg1IDE3MCA4NSIsIApkaWZmIC0tZ2l0IGEvbWlzYy9uZXR3b3JrLmMgYi9taXNjL25ldHdvcmsuYwppbmRleCAxNTZkYjUzLi41YzFlYWNlIDEwMDY0NAotLS0gYS9taXNjL25ldHdvcmsuYworKysgYi9taXNjL25ldHdvcmsuYwpAQCAtMTU0LDcgKzE1NCw3IEBACiAgKgkJCQlXTmV0R2V0Q29ubmVjdGlvbglbVVNFUi41MTJdCiAgKi8KIGludCBXTmV0R2V0Q29ubmVjdGlvbihMUFNUUiBscExvY2FsTmFtZSwgCi0JTFBTVFIgbHBSZW1vdGVOYW1lLCBVSU5UICpjYlJlbW90ZU5hbWUpCisJTFBTVFIgbHBSZW1vdGVOYW1lLCBVSU5UMTYgKmNiUmVtb3RlTmFtZSkKIHsKICAgICBjb25zdCBjaGFyICpwYXRoOwogCkBAIC0yMTAsNyArMjEwLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQkJV05ldEdldFVzZXIJCQlbVVNFUi41MTZdCiAgKi8KLVVJTlQgV05ldEdldFVzZXIoTFBTVFIgbHBMb2NhbE5hbWUsIExQU1RSIGxwVXNlck5hbWUsIERXT1JEICpscFNpemUpCitVSU5UMTYgV05ldEdldFVzZXIoTFBTVFIgbHBMb2NhbE5hbWUsIExQU1RSIGxwVXNlck5hbWUsIERXT1JEICpscFNpemUpCiB7CiAJcHJpbnRmKCJFTVBUWSBTVFVCICEhISBXTmV0R2V0VXNlciglcCwgJXAsICVwKTtcbiIsIAogCQkJCQkJCWxwTG9jYWxOYW1lLCBscFVzZXJOYW1lLCBscFNpemUpOwpAQCAtMjIwLDcgKzIyMCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQkJCVdOZXRBZGRDb25uZWN0aW9uCVtVU0VSLjUxN10KICAqLwotVUlOVCBXTmV0QWRkQ29ubmVjdGlvbihMUFNUUiBscE5ldFBhdGgsIExQU1RSIGxwUGFzc1dvcmQsIExQU1RSIGxwTG9jYWxOYW1lKQorVUlOVDE2IFdOZXRBZGRDb25uZWN0aW9uKExQU1RSIGxwTmV0UGF0aCwgTFBTVFIgbHBQYXNzV29yZCwgTFBTVFIgbHBMb2NhbE5hbWUpCiB7CiAJcHJpbnRmKCJFTVBUWSBTVFVCICEhISBXTmV0QWRkQ29ubmVjdGlvbignJXMnLCAlcCwgJyVzJyk7XG4iLAogCQkJCQkJCWxwTmV0UGF0aCwgbHBQYXNzV29yZCwgbHBMb2NhbE5hbWUpOwpAQCAtMjMxLDExICsyMzEsMTEgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQkJV05ldENhbmNlbENvbm5lY3Rpb24JW1VTRVIuNTE4XQogICovCi1VSU5UIFdOZXRDYW5jZWxDb25uZWN0aW9uKExQU1RSIGxwTmFtZSwgQk9PTCBiRm9yY2UpCitVSU5UMTYgV05ldENhbmNlbENvbm5lY3Rpb24oTFBTVFIgbHBOYW1lLCBCT09MMTYgYkZvcmNlKQogewotCXByaW50ZigiRU1QVFkgU1RVQiAhISEgV05ldENhbmNlbENvbm5lY3Rpb24oJyVzJywgJTA0WCk7XG4iLAotCQkJCQkJCQkJCQlscE5hbWUsIGJGb3JjZSk7Ci0JcmV0dXJuCVdOX05FVF9FUlJPUjsKKyAgICBwcmludGYoIkVNUFRZIFNUVUIgISEhIFdOZXRDYW5jZWxDb25uZWN0aW9uKCclcycsICUwNFgpO1xuIiwKKyAgICAgICAgICAgbHBOYW1lLCBiRm9yY2UpOworICAgIHJldHVybiBXTl9ORVRfRVJST1I7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjgwLDcgKzI4MCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgICBXbmV0Q29ubmVjdERpYWxvZyAgICAgICBbVVNFUi41MjVdCiAgKi8KLVVJTlQgV05ldENvbm5lY3REaWFsb2coSFdORDE2IGhXbmRQYXJlbnQsIFdPUkQgaVR5cGUpCitVSU5UMTYgV05ldENvbm5lY3REaWFsb2coSFdORDE2IGhXbmRQYXJlbnQsIFdPUkQgaVR5cGUpCiB7CiAJcHJpbnRmKCJFTVBUWSBTVFVCICEhISBXTmV0Q29ubmVjdERpYWxvZyglMDR4LCAlNFgpXG4iLCBoV25kUGFyZW50LCBpVHlwZSk7CiAJcmV0dXJuIFdOX1NVQ0NFU1M7CkBAIC0yOTksNyArMjk5LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgIFduZXRDb25uZWN0aW9uRGlhbG9nICAgICBbVVNFUi41MjddCiAgKi8KLVVJTlQgV05ldENvbm5lY3Rpb25EaWFsb2coSFdORDE2IGhXbmRQYXJlbnQsIFdPUkQgaVR5cGUpCitVSU5UMTYgV05ldENvbm5lY3Rpb25EaWFsb2coSFdORDE2IGhXbmRQYXJlbnQsIFdPUkQgaVR5cGUpCiB7CiAJcHJpbnRmKCJFTVBUWSBTVFVCICEhISBXTmV0Q29ubmVjdGlvbkRpYWxvZyglMDR4LCAlNFgpXG4iLCAKIAkJaFduZFBhcmVudCwgaVR5cGUpOwpAQCAtMzYxLDcgKzM2MSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQkJCVdOZXRBZGRDb25uZWN0aW9uMglbVVNFUi4/Pz9dCiAgKi8KLVVJTlQgV05ldEFkZENvbm5lY3Rpb24yKExQU1RSIGxwTmV0UGF0aCwgTFBTVFIgbHBQYXNzV29yZCwgCitVSU5UMTYgV05ldEFkZENvbm5lY3Rpb24yKExQU1RSIGxwTmV0UGF0aCwgTFBTVFIgbHBQYXNzV29yZCwgCiAJCUxQU1RSIGxwTG9jYWxOYW1lLCBMUFNUUiBscFVzZXJOYW1lKQogewogCXByaW50ZigiRU1QVFkgU1RVQiAhISEgV05ldEFkZENvbm5lY3Rpb24yKCclcycsICVwLCAnJXMnLCAnJXMnKTtcbiIsCkBAIC0zNzIsNyArMzcyLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQkJV05ldENsb3NlRW51bQkJW1VTRVIuPz8/XQogICovCi1VSU5UIFdOZXRDbG9zZUVudW0oSEFORExFMTYgaEVudW0pCitVSU5UMTYgV05ldENsb3NlRW51bShIQU5ETEUxNiBoRW51bSkKIHsKIAlwcmludGYoIkVNUFRZIFNUVUIgISEhIFdOZXRDbG9zZUVudW0oJTA0eCk7XG4iLCBoRW51bSk7CiAJcmV0dXJuIFdOX05FVF9FUlJPUjsKQEAgLTM4MSw3ICszODEsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJCQlXTmV0RW51bVJlc291cmNlCVtVU0VSLj8/P10KICAqLwotVUlOVCBXTmV0RW51bVJlc291cmNlKEhBTkRMRTE2IGhFbnVtLCBEV09SRCBjUmVxdSwgCitVSU5UMTYgV05ldEVudW1SZXNvdXJjZShIQU5ETEUxNiBoRW51bSwgRFdPUkQgY1JlcXUsIAogCQkJCURXT1JEICpscENvdW50LCBMUFZPSUQgbHBCdWYpCiB7CiAJcHJpbnRmKCJFTVBUWSBTVFVCICEhISBXTmV0RW51bVJlc291cmNlKCUwNHgsICUwOGxYLCAlcCwgJXApO1xuIiwgCkBAIC0zOTIsOCArMzkyLDggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQkJV05ldE9wZW5FbnVtCQlbVVNFUi4/Pz9dCiAgKi8KLVVJTlQgV05ldE9wZW5FbnVtKERXT1JEIGR3U2NvcGUsIERXT1JEIGR3VHlwZSwgCi0JTFBORVRSRVNPVVJDRSBscE5ldCwgSEFORExFMTYgKmxwaEVudW0pCitVSU5UMTYgV05ldE9wZW5FbnVtKERXT1JEIGR3U2NvcGUsIERXT1JEIGR3VHlwZSwgCisgICAgICAgICAgICAgICAgICAgIExQTkVUUkVTT1VSQ0UgbHBOZXQsIEhBTkRMRTE2ICpscGhFbnVtKQogewogCXByaW50ZigiRU1QVFkgU1RVQiAhISEgV05ldE9wZW5FbnVtKCUwOGxYLCAlMDhsWCwgJXAsICVwKTtcbiIsCiAgICAgICAgICAgICAgICBkd1Njb3BlLCBkd1R5cGUsIGxwTmV0LCBscGhFbnVtKTsKZGlmZiAtLWdpdCBhL21pc2MvbnRkbGwuYyBiL21pc2MvbnRkbGwuYwppbmRleCBmOWQ4OTg1Li5hODNiMDQ5IDEwMDY0NAotLS0gYS9taXNjL250ZGxsLmMKKysrIGIvbWlzYy9udGRsbC5jCkBAIC0zNjksNiArMzY5LDE1IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgIFJ0bEluaXRVbmljb2RlU3RyaW5nCQkJW05URExMXQorICovCitWT0lECitSdGxGcmVlVW5pY29kZVN0cmluZyhMUFVOSUNPREVfU1RSSU5HIHN0cikgeworCWlmIChzdHItPkJ1ZmZlcikKKwkJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHN0cik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgICAgIFJ0bFVuaWNvZGVUb09lbU4JCQlbTlRETExdCiAgKi8KIERXT1JEIC8qIE5UU1RBVFVTICovCmRpZmYgLS1naXQgYS9taXNjL29sZTJubHMuYyBiL21pc2Mvb2xlMm5scy5jCmluZGV4IDZjYjNiMWQuLmViYmQ3MGQgMTAwNjQ0Ci0tLSBhL21pc2Mvb2xlMm5scy5jCisrKyBiL21pc2Mvb2xlMm5scy5jCkBAIC01LDYgKzUsNyBAQAogICovCiAKICNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgogI2luY2x1ZGUgPG1hbGxvYy5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJoZWFwLmgiCkBAIC0xNTAsNyArMTUxLDcgQEAKICAgICBjYXNlIExBTkdfS286IHJldHVybiAweDEyOyAgICAgICAgIC8qIEtvcmVhbiAqLwogIC8qIGNhc2UgTEFOR19EdTogcmV0dXJuIDB4MTM7ICovICAgICAgLyogRHV0Y2ggKi8KICAgICBjYXNlIExBTkdfTm86IHJldHVybiAweDE0OyAgICAgICAgIC8qIE5vcndlZ2lhbiAqLwotIC8qIGNhc2UgTEFOR19QbDogcmV0dXJuIDB4MTU7ICovICAgICAgLyogUG9saXNoICovCisgICAgY2FzZSBMQU5HX1BsOiByZXR1cm4gMHgxNTsgICAgICAgICAvKiBQb2xpc2ggKi8KICAvKiBjYXNlIExBTkdfUG86IHJldHVybiAweDE2OyAqLyAgICAgIC8qIFBvcnR1Z3Vlc2UgKi8KICAvKiBjYXNlIExBTkdfUm86IHJldHVybiAweDE4OyAqLyAgICAgIC8qIFJvbWFuaWFuICovCiAgLyogY2FzZSBMQU5HX1J1OiByZXR1cm4gMHgxOTsgKi8gICAgICAvKiBSdXNzaWFuICovCkBAIC0xMzg1LDYgKzEzODYsMTI5IEBACiAJfQogICAgIGJyZWFrOyAgLyogTEFORyhFbikgKi8KIAorICAgIGNhc2UgTEFOR19QbDoKKyAgICAJc3dpdGNoIChMQ1R5cGUpIHsKK0xPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCI5IikKK0xPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCJQb2xza2kiKQorTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIlBvbGlzaCIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZMQU5HTkFNRSwgInBvbCIpCitMT0NWQUwoTE9DQUxFX1NOQVRJVkVMQU5HTkFNRSwiUG9sc2tpIikKK0xPQ1ZBTChMT0NBTEVfSUNPVU5UUlksIjQ5IikKK0xPQ1ZBTChMT0NBTEVfU0NPVU5UUlksIlBvbHNrYSIpCitMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCJQb2xhbmQiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWQ1RSWU5BTUUsIlBsIikKK0xPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCJQb2xza2EiKQorTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCI5IikKK0xPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT1VOVFJZLCI0OSIpCitMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UsIjEyNTIiKQorTE9DVkFMKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSwiMTI1MiIpCitMT0NWQUwoTE9DQUxFX1NMSVNULCI7IikKK0xPQ1ZBTChMT0NBTEVfSU1FQVNVUkUsIjAiKQorTE9DVkFMKExPQ0FMRV9TREVDSU1BTCwiLCIpCitMT0NWQUwoTE9DQUxFX1NUSE9VU0FORCwiICIpCisvKgorTE9DVkFMKExPQ0FMRV9TR1JPVVBJTkcpCisqLworTE9DVkFMKExPQ0FMRV9JRElHSVRTLCIyIikKK0xPQ1ZBTChMT0NBTEVfSUxaRVJPLCIxIikKKy8qCitMT0NWQUwoTE9DQUxFX0lORUdOVU1CRVIpCitJcyB0aGlzICIwMTIzNDU2Nzg5IiA/PworTE9DVkFMKExPQ0FMRV9TTkFUSVZFRElHSVRTKQorKi8KK0xPQ1ZBTChMT0NBTEVfU0NVUlJFTkNZLCJ6XHhCMyIpCisvKgorTE9DVkFMKExPQ0FMRV9TSU5UTFNZTUJPTCkKK0xPQ1ZBTChMT0NBTEVfU01PTkRFQ0lNQUxTRVApCitMT0NWQUwoTE9DQUxFX1NNT05USE9VU0FORFNFUCkKK0xPQ1ZBTChMT0NBTEVfU01PTkdST1VQSU5HKQorKi8KK0xPQ1ZBTChMT0NBTEVfSUNVUlJESUdJVFMsIjIiKQorLyoKK0xPQ1ZBTChMT0NBTEVfSUlOVExDVVJSRElHSVRTKQorKi8KK0xPQ1ZBTChMT0NBTEVfSUNVUlJFTkNZLCIzIikKK0xPQ1ZBTChMT0NBTEVfSU5FR0NVUlIsIjgiKQorTE9DVkFMKExPQ0FMRV9TREFURSwiLiIpCitMT0NWQUwoTE9DQUxFX1NUSU1FLCI6IikKK0xPQ1ZBTChMT0NBTEVfU1NIT1JUREFURSwiZGQuTU0ueXl5eSIpCitMT0NWQUwoTE9DQUxFX1NMT05HREFURSwiZGRkLCBkLiBNTU1NIHl5eXkiKQorLyoKK0xPQ1ZBTChMT0NBTEVfU1RJTUVGT1JNQVQpCisqLworTE9DVkFMKExPQ0FMRV9JREFURSwiMSIpCisvKgorTE9DVkFMKExPQ0FMRV9JTERBVEUpCisqLworTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCisvKgorTE9DVkFMKExPQ0FMRV9JVElNRU1BUktQT1NOKQorTE9DVkFMKExPQ0FMRV9JQ0VOVFVSWSkKKyovCitMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQorLyoKK0xPQ1ZBTChMT0NBTEVfSURBWUxaRVJPKQorTE9DVkFMKExPQ0FMRV9JTU9OTFpFUk8pCitMT0NWQUwoTE9DQUxFX1MxMTU5KQorTE9DVkFMKExPQ0FMRV9TMjM1OSkKK0xPQ1ZBTChMT0NBTEVfSUNBTEVOREFSVFlQRSkKK0xPQ1ZBTChMT0NBTEVfSU9QVElPTkFMQ0FMRU5EQVIpCitMT0NWQUwoTE9DQUxFX0lGSVJTVERBWU9GV0VFSykKK0xPQ1ZBTChMT0NBTEVfSUZJUlNUV0VFS09GWUVBUikKKyovCitMT0NWQUwoTE9DQUxFX1NEQVlOQU1FMSwiUG9uaWVkemlhXDI2M2VrIikKK0xPQ1ZBTChMT0NBTEVfU0RBWU5BTUUyLCJXdG9yZWsiKQorTE9DVkFMKExPQ0FMRV9TREFZTkFNRTMsIlNyb2RhIikKK0xPQ1ZBTChMT0NBTEVfU0RBWU5BTUU0LCJDendhcnRlayIpCitMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNSwiUGlceEI5dGVrIikKK0xPQ1ZBTChMT0NBTEVfU0RBWU5BTUU2LCJTb2JvdGEiKQorTE9DVkFMKExPQ0FMRV9TREFZTkFNRTcsIk5pZWR6aWVsYSIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMSwiUG8iKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTIsIld0IikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUzLCJTciIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNCwiQ3oiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTUsIlB0IikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU2LCJTbyIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNywiTmkiKQorTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMSwiU3R5Y3plXHhGMSIpCitMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUyLCJMdXR5IikKK0xPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTMsIk1hcnplYyIpCitMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU0LCJLd2llY2llXHhGMSIpCitMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU1LCJNYWoiKQorTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNiwiQ3plcndpZWMiKQorTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNywiTGlwaWVjIikKK0xPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTgsIlNpZXJwaWVceEYxIikKK0xPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTksIldyemVzaWVceEYxIikKK0xPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEwLCJQYVwyMzdkemllcm5payIpCitMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMSwiTGlzdGFwYWQiKQorTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMTIsIkdydWR6aWVceEYxIikKK0xPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEzLCIiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMSwiU3R5IikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTIsIkx1dCIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUzLCJNYXIiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNCwiS3dpIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTUsIk1haiIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU2LCJDemUiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNywiTGlwIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTgsIlNpZSIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU5LCJXcnoiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTAsIlBhXHg5RiIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMSwiTGlzIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEyLCJHcnUiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTMsIiIpCisvKgorTE9DVkFMKExPQ0FMRV9TUE9TSVRJVkVTSUdOKQorTE9DVkFMKExPQ0FMRV9TTkVHQVRJVkVTSUdOKQorTE9DVkFMKExPQ0FMRV9JUE9TU0lHTlBPU04pCitMT0NWQUwoTE9DQUxFX0lORUdTSUdOUE9TTikKK0xPQ1ZBTChMT0NBTEVfSVBPU1NZTVBSRUNFREVTKQorTE9DVkFMKExPQ0FMRV9JUE9TU0VQQllTUEFDRSkKK0xPQ1ZBTChMT0NBTEVfSU5FR1NZTVBSRUNFREVTKQorTE9DVkFMKExPQ0FMRV9JTkVHU0VQQllTUEFDRSkKKyovCisJZGVmYXVsdDogZm91bmQ9MDticmVhazsKKwl9CisgICAgYnJlYWs7ICAvKiBMQU5HKFBsKSAqLwogCiAvKkluc2VydCBvdGhlciBsYW5ndWFnZXMgaGVyZSovCiAKQEAgLTE0ODksOSArMTYxMywxMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgU2V0TG9jYWxJbmZvQSAgICAgICAoS0VSTkVMMzIuNDk5KQogICovCi1CT09MIFNldExvY2FsZUluZm9BKERXT1JEIGxjaWQsIERXT1JEIGxjdHlwZSwgTFBDU1RSIGRhdGEpIHsKLQlmcHJpbnRmKHN0ZG5pbXAsIlNldExvY2FsZUluZm9BKCVsZCwlbGQsJXMpXG4iLGxjaWQsbGN0eXBlLGRhdGEpOwotCXJldHVybiBUUlVFOworQk9PTDE2IFNldExvY2FsZUluZm9BKERXT1JEIGxjaWQsIERXT1JEIGxjdHlwZSwgTFBDU1RSIGRhdGEpCit7CisgICAgZnByaW50ZihzdGRuaW1wLCJTZXRMb2NhbGVJbmZvQSglbGQsJWxkLCVzKVxuIixsY2lkLGxjdHlwZSxkYXRhKTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNTQ4LDMgKzE2NzMsOTMgQEAKIAl9CiAJcmV0dXJuIFRSVUU7CiB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgIEdldFN0cmluZ1R5cGVBICAgICAgICAgICAgICAgIChPTEUyTkxTLjcpCisgKi8KK0JPT0wxNgorR2V0U3RyaW5nVHlwZTE2KExDSUQgbG9jYWxlLERXT1JEIGR3SW5mb1R5cGUsTFBDU1RSIHNyYyxJTlQxNiBjY2hTcmMsTFBXT1JEIGNoYXJ0eXBlKSB7CisJcmV0dXJuIEdldFN0cmluZ1R5cGVFeDMyQShsb2NhbGUsZHdJbmZvVHlwZSxzcmMsY2NoU3JjLGNoYXJ0eXBlKTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgIEdldFN0cmluZ1R5cGVBICAgICAgICAgICAgICAgIChLRVJORUwzMi4yNzcpCisgKi8KK0JPT0wzMgorR2V0U3RyaW5nVHlwZTMyQShMQ0lEIGxvY2FsZSxEV09SRCBkd0luZm9UeXBlLExQQ1NUUiBzcmMsSU5UMzIgY2NoU3JjLExQV09SRCBjaGFydHlwZSkgeworCXJldHVybiBHZXRTdHJpbmdUeXBlRXgzMkEobG9jYWxlLGR3SW5mb1R5cGUsc3JjLGNjaFNyYyxjaGFydHlwZSk7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICBHZXRTdHJpbmdUeXBlRXhBICAgICAgICAgICAgICAgIChLRVJORUwzMi4yNzYpCisgKi8KK0JPT0wzMgorR2V0U3RyaW5nVHlwZUV4MzJBKExDSUQgbG9jYWxlLERXT1JEIGR3SW5mb1R5cGUsTFBDU1RSIHNyYyxJTlQzMiBjY2hTcmMsTFBXT1JEIGNoYXJ0eXBlKSB7CisJaW50CWk7CisKKwlzd2l0Y2ggKGR3SW5mb1R5cGUpIHsKKwljYXNlIENUX0NUWVBFMjoKKwkJZnByaW50ZihzdGRlcnIsIkdldFN0cmluZ1R5cGUzMkE6Q1RfQ1RZUEUyIG5vdCBzdXBwb3J0ZWQuXG4iKTsKKwkJcmV0dXJuIEZBTFNFOworCWNhc2UgQ1RfQ1RZUEUzOgorCQlmcHJpbnRmKHN0ZGVyciwiR2V0U3RyaW5nVHlwZTMyQTpDVF9DVFlQRTMgbm90IHN1cHBvcnRlZC5cbiIpOworCQlyZXR1cm4gRkFMU0U7CisJZGVmYXVsdDpicmVhazsKKwl9CisJaWYgKGNjaFNyYz09LTEpCisJCWNjaFNyYz1sc3RybGVuMzJBKHNyYyk7CisJZm9yIChpPTA7aTxjY2hTcmM7aSsrKSB7CisJCWNoYXJ0eXBlW2ldID0gMDsKKwkJaWYgKGlzZGlnaXQoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0RJR0lUOworCQlpZiAoaXNhbHBoYShzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfQUxQSEE7CisJCWlmIChpc2xvd2VyKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9MT1dFUjsKKwkJaWYgKGlzdXBwZXIoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX1VQUEVSOworCQlpZiAoaXNzcGFjZShzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfU1BBQ0U7CisJCWlmIChpc3B1bmN0KHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9QVU5DVDsKKwkJaWYgKGlzY250cmwoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0NOVFJMOworCQlpZiAoaXNibGFuayhzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfQkxBTks7CisJCS8qIEMxX1hESUdJVCAqLworCX0KKwlyZXR1cm4gVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgR2V0U3RyaW5nVHlwZVcgICAgICAgICAgICAgICAgKEtFUk5FTDMyLjI3OSkKKyAqIFllcywgdGhpcyBpcyBtaXNzaW5nIExDSUQgbG9jYWxlLiBNUyBmYXVsdC4KKyAqLworQk9PTDMyCitHZXRTdHJpbmdUeXBlMzJXKERXT1JEIGR3SW5mb1R5cGUsTFBDV1NUUiBzcmMsSU5UMzIgY2NoU3JjLExQV09SRCBjaGFydHlwZSkgeworCXJldHVybiBHZXRTdHJpbmdUeXBlRXgzMlcoMC8qZGVmYXVsdGxvY2FsZSovLGR3SW5mb1R5cGUsc3JjLGNjaFNyYyxjaGFydHlwZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgIEdldFN0cmluZ1R5cGVXICAgICAgICAgICAgICAgIChLRVJORUwzMi4yNzgpCisgKiBGSVhNRTogdW5pY29kZSBjaGFycyBhcmUgYXNzdW1lZCBjaGFycworICovCitCT09MMzIKK0dldFN0cmluZ1R5cGVFeDMyVyhMQ0lEIGxvY2FsZSxEV09SRCBkd0luZm9UeXBlLExQQ1dTVFIgc3JjLElOVDMyIGNjaFNyYyxMUFdPUkQgY2hhcnR5cGUpIHsKKwlpbnQJaTsKKworCXN3aXRjaCAoZHdJbmZvVHlwZSkgeworCWNhc2UgQ1RfQ1RZUEUyOgorCQlmcHJpbnRmKHN0ZGVyciwiR2V0U3RyaW5nVHlwZTMyVzpDVF9DVFlQRTIgbm90IHN1cHBvcnRlZC5cbiIpOworCQlyZXR1cm4gRkFMU0U7CisJY2FzZSBDVF9DVFlQRTM6CisJCWZwcmludGYoc3RkZXJyLCJHZXRTdHJpbmdUeXBlMzJXOkNUX0NUWVBFMyBub3Qgc3VwcG9ydGVkLlxuIik7CisJCXJldHVybiBGQUxTRTsKKwlkZWZhdWx0OmJyZWFrOworCX0KKwlpZiAoY2NoU3JjPT0tMSkKKwkJY2NoU3JjPWxzdHJsZW4zMlcoc3JjKTsKKwlmb3IgKGk9MDtpPGNjaFNyYztpKyspIHsKKwkJY2hhcnR5cGVbaV0gPSAwOworCQlpZiAoaXNkaWdpdChzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfRElHSVQ7CisJCWlmIChpc2FscGhhKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9BTFBIQTsKKwkJaWYgKGlzbG93ZXIoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0xPV0VSOworCQlpZiAoaXN1cHBlcihzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfVVBQRVI7CisJCWlmIChpc3NwYWNlKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9TUEFDRTsKKwkJaWYgKGlzcHVuY3Qoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX1BVTkNUOworCQlpZiAoaXNjbnRybChzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfQ05UUkw7CisJCWlmIChpc2JsYW5rKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9CTEFOSzsKKwkJLyogQzFfWERJR0lUICovCisJfQorCXJldHVybiBUUlVFOworfQpkaWZmIC0tZ2l0IGEvbWlzYy9vbGVjbGkuYyBiL21pc2Mvb2xlY2xpLmMKaW5kZXggNDQxZjdiNC4uMmM3YWI4OCAxMDA2NDQKLS0tIGEvbWlzYy9vbGVjbGkuYworKysgYi9taXNjL29sZWNsaS5jCkBAIC00Nyw3ICs0Nyw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBPbGVJc0RjTWV0YQogICovCi1CT09MIE9sZUlzRGNNZXRhKEhEQzE2IGhkYykKK0JPT0wxNiBPbGVJc0RjTWV0YShIREMxNiBoZGMpCiB7CiAJZHByaW50Zl9vbGUoc3RkZGViLCJPbGVJc0RDTWV0YSglMDR4KVxuIixoZGMpOwogCXJldHVybiBHRElfR2V0T2JqUHRyKCBoZGMsIE1FVEFGSUxFX0RDX01BR0lDICkgIT0gMDsKZGlmZiAtLWdpdCBhL21pc2Mvb2xlc3ZyLmMgYi9taXNjL29sZXN2ci5jCmluZGV4IDQ5MGFiNDguLmI5ZTQxZmYgMTAwNjQ0Ci0tLSBhL21pc2Mvb2xlc3ZyLmMKKysrIGIvbWlzYy9vbGVzdnIuYwpAQCAtMzksNyArMzksNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgT2xlVW5ibG9ja1NlcnZlcgogICovCi1PTEVTVEFUVVMgT2xlVW5ibG9ja1NlcnZlcihMSFNFUlZFUiBoU2VydmVyLCBCT09MICpibG9jaykKK09MRVNUQVRVUyBPbGVVbmJsb2NrU2VydmVyKExIU0VSVkVSIGhTZXJ2ZXIsIEJPT0wxNiAqYmxvY2spCiB7CiAgICAgZnByaW50ZihzdGRuaW1wLCJPbGVVbmJsb2NrU2VydmVyOiVsZFxuIixoU2VydmVyKTsKICAgICAvKiBubyBtb3JlIGJsb2NrZWQgbWVzc2FnZXMgOikgKi8KZGlmZiAtLWdpdCBhL21pc2Mvc2hlbGwuYyBiL21pc2Mvc2hlbGwuYwppbmRleCA3YTFiY2U5Li5mOTdmNTNhIDEwMDY0NAotLS0gYS9taXNjL3NoZWxsLmMKKysrIGIvbWlzYy9zaGVsbC5jCkBAIC00NywxMyArNDcsMTMgQEAKIAogI3ByYWdtYSBwYWNrKDQpCiAKLWV4dGVybiBIR0xPQkFMMTYgQ1VSU09SSUNPTl9Mb2FkSGFuZGxlciggSEdMT0JBTDE2LCBISU5TVEFOQ0UxNiwgQk9PTCk7CitleHRlcm4gSEdMT0JBTDE2IENVUlNPUklDT05fTG9hZEhhbmRsZXIoIEhHTE9CQUwxNiwgSElOU1RBTkNFMTYsIEJPT0wzMik7CiBleHRlcm4gV09SRCAJR2V0SWNvbklEKCBIR0xPQkFMMTYgaFJlc291cmNlLCBEV09SRCByZXNUeXBlICk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJCQlEcmFnQWNjZXB0RmlsZXMJCVtTSEVMTC45XQogICovCi12b2lkIERyYWdBY2NlcHRGaWxlcyhIV05EMTYgaFduZCwgQk9PTCBiKQordm9pZCBEcmFnQWNjZXB0RmlsZXMoSFdORDE2IGhXbmQsIEJPT0wxNiBiKQogewogICAgIFdORCogd25kID0gV0lOX0ZpbmRXbmRQdHIoaFduZCk7CiAKQEAgLTY2LDcgKzY2LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJCQlEcmFnUXVlcnlGaWxlCQlbU0hFTEwuMTFdCiAgKi8KLVVJTlQgRHJhZ1F1ZXJ5RmlsZShIRFJPUDE2IGhEcm9wLCBXT1JEIHdGaWxlLCBMUFNUUiBscHN6RmlsZSwgV09SRCB3TGVuZ3RoKQorVUlOVDE2IERyYWdRdWVyeUZpbGUoSERST1AxNiBoRHJvcCwgV09SRCB3RmlsZSwgTFBTVFIgbHBzekZpbGUsIFdPUkQgd0xlbmd0aCkKIHsKICAgICAvKiBoRHJvcCBpcyBhIGdsb2JhbCBtZW1vcnkgYmxvY2sgYWxsb2NhdGVkIHdpdGggR01FTV9TSEFSRSAKICAgICAgKiB3aXRoIERST1BGSUxFU1RSVUNUIGFzIGEgaGVhZGVyIGFuZCBmaWxlbmFtZXMgZm9sbG93aW5nCkBAIC0xMTYsNyArMTE2LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJCQlEcmFnUXVlcnlQb2ludAkJW1NIRUxMLjEzXQogICovCi1CT09MIERyYWdRdWVyeVBvaW50KEhEUk9QMTYgaERyb3AsIFBPSU5UMTYgKnApCitCT09MMTYgRHJhZ1F1ZXJ5UG9pbnQoSERST1AxNiBoRHJvcCwgUE9JTlQxNiAqcCkKIHsKICAgICBMUERST1BGSUxFU1RSVUNUIGxwRHJvcEZpbGVTdHJ1Y3Q7ICAKICAgICBCT09MMTYgICAgICAgICAgIGJSZXQ7CkBAIC0yODEsMTEgKzI4MSwxMSBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCQkJU2hlbGxFeGVjdXRlCQlbU0hFTEwuMjBdCisgKgkJCQlTaGVsbEV4ZWN1dGUxNgkJW1NIRUxMLjIwXQogICovCi1ISU5TVEFOQ0UxNiBTaGVsbEV4ZWN1dGUoSFdORDE2IGhXbmQsIExQQ1NUUiBscE9wZXJhdGlvbiwgTFBDU1RSIGxwRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBMUFNUUiBscFBhcmFtZXRlcnMsIExQQ1NUUiBscERpcmVjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgaVNob3dDbWQpCitISU5TVEFOQ0UxNiBTaGVsbEV4ZWN1dGUxNiggSFdORDE2IGhXbmQsIExQQ1NUUiBscE9wZXJhdGlvbiwgTFBDU1RSIGxwRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgbHBQYXJhbWV0ZXJzLCBMUENTVFIgbHBEaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMTYgaVNob3dDbWQgKQogewogICAgIEhJTlNUQU5DRTE2IHJldHZhbD0zMTsKICAgICBjaGFyIGNtZFsyNTZdOwpAQCAtMzE2LDEwICszMTYsMjQgQEAKICAgICByZXR1cm4gV2luRXhlYzMyKGNtZCxpU2hvd0NtZCk7CiB9CiAKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQkJCUZpbmRFeGVjdXRhYmxlCQlbU0hFTEwuMjFdCisgKiAgICAgICAgICAgICBTaGVsbEV4ZWN1dGUzMkEgICAoU0hFTEwzMi44NCkKICAqLwotSElOU1RBTkNFMTYgRmluZEV4ZWN1dGFibGUoTFBDU1RSIGxwRmlsZSwgTFBDU1RSIGxwRGlyZWN0b3J5LCBMUFNUUiBscFJlc3VsdCkKK0hJTlNUQU5DRTMyIFNoZWxsRXhlY3V0ZTMyQSggSFdORDMyIGhXbmQsIExQQ1NUUiBscE9wZXJhdGlvbiwgTFBDU1RSIGxwRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIGxwUGFyYW1ldGVycywgTFBDU1RSIGxwRGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMiBpU2hvd0NtZCApCit7CisgICAgcmV0dXJuIFNoZWxsRXhlY3V0ZTE2KCBoV25kLCBscE9wZXJhdGlvbiwgbHBGaWxlLCBscFBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBscERpcmVjdG9yeSwgaVNob3dDbWQgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgRmluZEV4ZWN1dGFibGUxNiAgIChTSEVMTC4yMSkKKyAqLworSElOU1RBTkNFMTYgRmluZEV4ZWN1dGFibGUxNiggTFBDU1RSIGxwRmlsZSwgTFBDU1RSIGxwRGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBTVFIgbHBSZXN1bHQgKQogewogICAgIEhJTlNUQU5DRTE2IHJldHZhbD0zMTsgICAgLyogZGVmYXVsdCAtICdObyBhc3NvY2lhdGlvbiB3YXMgZm91bmQnICovCiAKQEAgLTU3OCw3ICs1OTIsNyBAQAogICoKICAqIFRoaXMgYWJvcnRpb24gaXMgY2FsbGVkIGRpcmVjdGx5IGJ5IFByb2dtYW4KICAqLwotSEdMT0JBTDE2IEludGVybmFsRXh0cmFjdEljb24oSElOU1RBTkNFMTYgaEluc3RhbmNlLCBMUENTVFIgbHBzekV4ZUZpbGVOYW1lLCBVSU5UIG5JY29uSW5kZXgsIFdPUkQgbiApCitIR0xPQkFMMTYgSW50ZXJuYWxFeHRyYWN0SWNvbihISU5TVEFOQ0UxNiBoSW5zdGFuY2UsIExQQ1NUUiBscHN6RXhlRmlsZU5hbWUsIFVJTlQxNiBuSWNvbkluZGV4LCBXT1JEIG4gKQogewogICBIR0xPQkFMMTYgCWhSZXQgPSAwOwogICBIR0xPQkFMMTYqCVJldFB0ciA9IE5VTEw7CkBAIC02MDAsOSArNjE0LDkgQEAKICAgaWYoIHBEYXRhICkgCiAgIHsKICAgICBISUNPTjE2CSBoSWNvbiA9IDA7Ci0gICAgQk9PTAkgaWNvRmlsZSA9IEZBTFNFOwotICAgIFVJTlQgICAgICAgICBpY29uRGlyQ291bnQgPSAwOwotICAgIFVJTlQgICAgICAgICBpY29uQ291bnQgPSAwOworICAgIEJPT0wzMgkgaWNvRmlsZSA9IEZBTFNFOworICAgIFVJTlQxNiAgICAgICAgIGljb25EaXJDb3VudCA9IDA7CisgICAgVUlOVDE2ICAgICAgICAgaWNvbkNvdW50ID0gMDsKICAgICBORV9UWVBFSU5GTyogcFRJbmZvID0gKE5FX1RZUEVJTkZPKikocERhdGEgKyAyKTsKICAgICBORV9OQU1FSU5GTyogcEljb25TdG9yYWdlID0gTlVMTDsKICAgICBORV9OQU1FSU5GTyogcEljb25EaXIgPSBOVUxMOwpAQCAtNjM4LDEwICs2NTIsMTAgQEAKICAgICAvKiBsb2FkIHJlc291cmNlcyBhbmQgY3JlYXRlIGljb25zICovCiAKICAgICBpZiggKHBJY29uU3RvcmFnZSAmJiBwSWNvbkRpcikgfHwgaWNvRmlsZSApCi0gICAgICBpZiggbkljb25JbmRleCA9PSAoVUlOVCktMSApIFJldFB0clswXSA9IGljb25EaXJDb3VudDsKKyAgICAgIGlmKCBuSWNvbkluZGV4ID09IChVSU5UMTYpLTEgKSBSZXRQdHJbMF0gPSBpY29uRGlyQ291bnQ7CiAgICAgICBlbHNlIGlmKCBuSWNvbkluZGV4IDwgaWNvbkRpckNvdW50ICkKICAgICAgICAgewotCSAgIFVJTlQgICBpLCBpY29uOworCSAgIFVJTlQxNiAgIGksIGljb247CiAKIAkgICBpZiggbiA+IGljb25EaXJDb3VudCAtIG5JY29uSW5kZXggKSBuID0gaWNvbkRpckNvdW50IC0gbkljb25JbmRleDsKIApAQCAtNjgwLDkgKzY5NCwxMCBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCQkJRXh0cmFjdEljb24gCQlbU0hFTEwuMzRdCisgKiAgICAgICAgICAgICBFeHRyYWN0SWNvbjE2ICAgKFNIRUxMLjM0KQogICovCi1ISUNPTjE2IEV4dHJhY3RJY29uKEhJTlNUQU5DRTE2IGhJbnN0YW5jZSwgTFBDU1RSIGxwc3pFeGVGaWxlTmFtZSwgV09SRCBuSWNvbkluZGV4KQorSElDT04xNiBFeHRyYWN0SWNvbjE2KCBISU5TVEFOQ0UxNiBoSW5zdGFuY2UsIExQQ1NUUiBscHN6RXhlRmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiBuSWNvbkluZGV4ICkKIHsKICAgSEdMT0JBTDE2IGhhbmRsZSA9IEludGVybmFsRXh0cmFjdEljb24oaEluc3RhbmNlLGxwc3pFeGVGaWxlTmFtZSxuSWNvbkluZGV4LCAxKTsKIApAQCAtNjk3LDYgKzcxMiwxOCBAQAogICByZXR1cm4gMDsKIH0KIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgRXh0cmFjdEljb24zMkEgICAoU0hFTEwzMi4yMCkKKyAqLworSElDT04zMiBFeHRyYWN0SWNvbjMyQSggSElOU1RBTkNFMzIgaEluc3RhbmNlLCBMUENTVFIgbHBzekV4ZUZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIG5JY29uSW5kZXggKQoreworICAgIC8qIEZJWE1FICovCisgICAgcmV0dXJuIEV4dHJhY3RJY29uMTYoIGhJbnN0YW5jZSwgbHBzekV4ZUZpbGVOYW1lLCBuSWNvbkluZGV4ICk7Cit9CisKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQkJCUV4dHJhY3RBc3NvY2lhdGVkSWNvbglbU0hFTEwuMzZdCiAgKiAKQEAgLTcwNSw3ICs3MzIsNyBAQAogICovCiBISUNPTjE2IEV4dHJhY3RBc3NvY2lhdGVkSWNvbihISU5TVEFOQ0UxNiBoSW5zdCxMUFNUUiBscEljb25QYXRoLExQV09SRCBscGlJY29uKQogewotICAgIEhJQ09OMTYgaEljb24gPSBFeHRyYWN0SWNvbihoSW5zdCwgbHBJY29uUGF0aCwgKmxwaUljb24pOworICAgIEhJQ09OMTYgaEljb24gPSBFeHRyYWN0SWNvbjE2KGhJbnN0LCBscEljb25QYXRoLCAqbHBpSWNvbik7CiAKICAgICBpZiggaEljb24gPCAyICkKICAgICAgIHsKQEAgLTcxMywxMiArNzQwLDEyIEBACiAJaWYoIGhJY29uID09IDEgKSAvKiBubyBpY29ucyBmb3VuZCBpbiBnaXZlbiBmaWxlICovCiAJICB7CiAJICAgIGNoYXIgIHRlbXBQYXRoWzB4ODBdOwotCSAgICBVSU5UICB1UmV0ID0gRmluZEV4ZWN1dGFibGUobHBJY29uUGF0aCxOVUxMLHRlbXBQYXRoKTsKKwkgICAgVUlOVDE2ICB1UmV0ID0gRmluZEV4ZWN1dGFibGUxNihscEljb25QYXRoLE5VTEwsdGVtcFBhdGgpOwogCiAJICAgIGlmKCB1UmV0ID4gMzIgJiYgdGVtcFBhdGhbMF0gKQogCSAgICAgIHsKIAkJc3RyY3B5KGxwSWNvblBhdGgsdGVtcFBhdGgpOwotCSAgICAgICAgaEljb24gPSBFeHRyYWN0SWNvbihoSW5zdCwgbHBJY29uUGF0aCwgKmxwaUljb24pOworCSAgICAgICAgaEljb24gPSBFeHRyYWN0SWNvbjE2KGhJbnN0LCBscEljb25QYXRoLCAqbHBpSWNvbik7CiAKIAkJaWYoIGhJY29uID4gMiApIHJldHVybiBoSWNvbjsKIAkgICAgICB9CkBAIC03NDQsNyArNzcxLDcgQEAKICAqLwogTFBTVFIgU0hFTExfRmluZFN0cmluZyhMUFNUUiBscEVudiwgTFBDU1RSIGVudHJ5KQogewotICBVSU5UIAlsID0gc3RybGVuKGVudHJ5KTsgCisgIFVJTlQxNiAJbCA9IHN0cmxlbihlbnRyeSk7IAogICBmb3IoIDsgKmxwRW52IDsgbHBFbnYrPXN0cmxlbihscEVudikrMSApCiAgICAgIHsKICAgICAgICBpZiggbHN0cm5jbXBpMzJBKGxwRW52LCBlbnRyeSwgbCkgKSBjb250aW51ZTsKZGlmZiAtLWdpdCBhL21pc2Mvc3B5LmMgYi9taXNjL3NweS5jCmluZGV4IDdiMTlhMzQuLjMyMTZmNGEgMTAwNjQ0Ci0tLSBhL21pc2Mvc3B5LmMKKysrIGIvbWlzYy9zcHkuYwpAQCAtNSw3ICs1LDYgQEAKICAqICAgICAgICAgICAxOTk1LCBBbGV4IEtvcm9ia2EgIAogICovCiAKLSNkZWZpbmUgTk9fVFJBTlNJVElPTl9UWVBFUyAgLyogVGhpcyBmaWxlIGlzIFdpbjMyLWNsZWFuICovCiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KZGlmZiAtLWdpdCBhL21pc2Mvc3RyZXNzLmMgYi9taXNjL3N0cmVzcy5jCmluZGV4IDMyMjNmYTcuLmQ4MDAzMjMgMTAwNjQ0Ci0tLSBhL21pc2Mvc3RyZXNzLmMKKysrIGIvbWlzYy9zdHJlc3MuYwpAQCAtOCw3ICs4LDcgQEAKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiAKLWludCBBbGxvY0Rpc2tTcGFjZShsb25nIGxMZWZ0LCBVSU5UIHVEcml2ZSkKK2ludCBBbGxvY0Rpc2tTcGFjZShsb25nIGxMZWZ0LCBVSU5UMTYgdURyaXZlKQogewogCWRwcmludGZfc3RyZXNzKHN0ZG5pbXAsICJzdHJlc3MuZGxsOiBBbGxvY0Rpc2tTcGFjZSAlZCwgJWxkXG4iLCB1RHJpdmUsIGxMZWZ0KTsKIApAQCAtMjUsMjEgKzI1LDIxIEBACiAJCXJldHVybiAxOwogfQogCi1CT09MIEFsbG9jR0RJTWVtKFVJTlQgdUxlZnQpCitCT09MMTYgQWxsb2NHRElNZW0oVUlOVDE2IHVMZWZ0KQogewogCWRwcmludGZfc3RyZXNzKHN0ZGRlYiwgInN0cmVzcy5kbGw6IEFsbG9jR0RJTWVtICVkXG4iLCB1TGVmdCk7CiAKIAlyZXR1cm4gMTsKIH0KIAotQk9PTCBBbGxvY01lbShEV09SRCBkd0xlZnQpCitCT09MMTYgQWxsb2NNZW0oRFdPUkQgZHdMZWZ0KQogewogCWRwcmludGZfc3RyZXNzKHN0ZG5pbXAsICJzdHJlc3MuZGxsOiBBbGxvY01lbSAlbGRcbiIsIGR3TGVmdCk7CiAKIAlyZXR1cm4gMTsKIH0KIAotQk9PTCBBbGxvY1VzZXJNZW0oVUlOVCB1Q29udGlnKQorQk9PTDE2IEFsbG9jVXNlck1lbShVSU5UMTYgdUNvbnRpZykKIHsKIAlkcHJpbnRmX3N0cmVzcyhzdGRkZWIsICJzdHJlc3MuZGxsOiBBbGxvY1VzZXJNZW0gJWRcbiIsIHVDb250aWcpOwogCkBAIC03Nyw3ICs3Nyw3IEBACiAjZW5kaWYKIH0KIAotdm9pZCBVbkFsbG9jRGlza1NwYWNlKFVJTlQgZHJpdmUpCit2b2lkIFVuQWxsb2NEaXNrU3BhY2UoVUlOVDE2IGRyaXZlKQogewogCWRwcmludGZfc3RyZXNzKHN0ZGRlYiwgInN0cmVzcy5kbGw6IFVuQWxsb2NEaXNrU3BhY2UgJWRcbiIsIGRyaXZlKTsKIH0KZGlmZiAtLWdpdCBhL21pc2Mvc3lzdGVtLmMgYi9taXNjL3N5c3RlbS5jCmluZGV4IGVlNjBhMDMuLmFhZWVhZTUgMTAwNjQ0Ci0tLSBhL21pc2Mvc3lzdGVtLmMKKysrIGIvbWlzYy9zeXN0ZW0uYwpAQCAtMTEsNyArMTEsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgSW5xdWlyZVN5c3RlbSAgIChTWVNURU0uMSkKICAqLwotRFdPUkQgSW5xdWlyZVN5c3RlbSggV09SRCBjb2RlLCBXT1JEIGRyaXZlLCBCT09MIGVuYWJsZSApCitEV09SRCBJbnF1aXJlU3lzdGVtKCBXT1JEIGNvZGUsIFdPUkQgZHJpdmUsIEJPT0wxNiBlbmFibGUgKQogewogICAgIFdPUkQgZHJpdmV0eXBlOwogCmRpZmYgLS1naXQgYS9taXNjL3dpbnNvY2suYyBiL21pc2Mvd2luc29jay5jCmluZGV4IGI4NGNmNmMuLjY2NTJiOGEgMTAwNjQ0Ci0tLSBhL21pc2Mvd2luc29jay5jCisrKyBiL21pc2Mvd2luc29jay5jCkBAIC0zNjAsNyArMzYwLDcgQEAKIAogICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NBR2V0TGFzdEVycm9yKCUwOHgpIiwgKHVuc2lnbmVkKXB3c2kpOwogCi0gIHJldCA9IChwd3NpKSA/IHB3c2ktPmVycm5vIDogV1NBTk9USU5JVElBTElTRUQ7CisgIHJldCA9IChwd3NpKSA/IHB3c2ktPmVyciA6IFdTQU5PVElOSVRJQUxJU0VEOwogCiAgIGRwcmludGZfd2luc29jayhzdGRkZWIsICIgPSAlaVxuIiwgKGludClyZXQpOwogICByZXR1cm4gcmV0OwpAQCAtMzcyLDE1ICszNzIsMTUgQEAKIAogICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NBU2V0TGFzdEVycm9yKCUwOHgpOiAlZFxuIiwgKHVuc2lnbmVkKXB3c2ksIChpbnQpaUVycm9yKTsKIAotICBpZiggcHdzaSApIHB3c2ktPmVycm5vID0gaUVycm9yOworICBpZiggcHdzaSApIHB3c2ktPmVyciA9IGlFcnJvcjsKIH0KIAogaW50IF9jaGVja193cyhMUFdTSU5GTyBwd3NpLCB3c19zb2NrZXQqIHB3cykKIHsKICAgaWYoIHB3c2kgKQotICAgIGlmKCBwd3NpLT5mbGFncyAmIFdTSV9CTE9DS0lOR0NBTEwgKSBwd3NpLT5lcnJubyA9IFdTQUVJTlBST0dSRVNTOworICAgIGlmKCBwd3NpLT5mbGFncyAmIFdTSV9CTE9DS0lOR0NBTEwgKSBwd3NpLT5lcnIgPSBXU0FFSU5QUk9HUkVTUzsKICAgICBlbHNlIGlmKCBXU0lfQ0hFQ0tfUkFOR0UocHdzaSwgcHdzKSApIHJldHVybiAxOwotICAgIGVsc2UgcHdzaS0+ZXJybm8gPSBXU0FFTk9UU09DSzsKKyAgICBlbHNlIHB3c2ktPmVyciA9IFdTQUVOT1RTT0NLOwogICByZXR1cm4gMDsKIH0KIApAQCAtNDI2LDkgKzQyNiw5IEBACiAJICBwd3NpLT5mbGFncyAmPSB+V1NJX0JMT0NLSU5HQ0FMTDsgCiAJICByZXR1cm4gKFNPQ0tFVDE2KVdTX1BUUjJIQU5ETEUocG5ldyk7CiAgICAgICAgIH0gCi0JZWxzZSBwd3NpLT5lcnJubyA9IFdTQUVOT0JVRlM7CisJZWxzZSBwd3NpLT5lcnIgPSBXU0FFTk9CVUZTOwogICAgICB9IAotICAgICBlbHNlIHB3c2ktPmVycm5vID0gd3NhRXJybm8oKTsKKyAgICAgZWxzZSBwd3NpLT5lcnIgPSB3c2FFcnJubygpOwogCiAgICAgIHB3c2ktPmZsYWdzICY9IH5XU0lfQkxPQ0tJTkdDQUxMOwogICB9CkBAIC00NTYsMTQgKzQ1NiwxNCBAQAogCSAgICAgZXJybm8gPSBsb2NfZXJybm87CiAJICAgICBzd2l0Y2goZXJybm8pCiAJICAgICB7Ci0JCWNhc2UgRUJBREY6IHB3c2ktPmVycm5vID0gV1NBRU5PVFNPQ0s7IGJyZWFrOwotCQljYXNlIEVBRERSTk9UQVZBSUw6IHB3c2ktPmVycm5vID0gV1NBRUlOVkFMOyBicmVhazsKLQkJZGVmYXVsdDogcHdzaS0+ZXJybm8gPSB3c2FFcnJubygpOworCQljYXNlIEVCQURGOiBwd3NpLT5lcnIgPSBXU0FFTk9UU09DSzsgYnJlYWs7CisJCWNhc2UgRUFERFJOT1RBVkFJTDogcHdzaS0+ZXJyID0gV1NBRUlOVkFMOyBicmVhazsKKwkJZGVmYXVsdDogcHdzaS0+ZXJyID0gd3NhRXJybm8oKTsKIAkgICAgIH0KIAkgIH0KIAkgIGVsc2UgcmV0dXJuIDA7Ci0gICAgICAgZWxzZSBwd3NpLT5lcnJubyA9IFdTQUVBRk5PU1VQUE9SVDsKLSAgICBlbHNlIHB3c2ktPmVycm5vID0gV1NBRUZBVUxUOworICAgICAgIGVsc2UgcHdzaS0+ZXJyID0gV1NBRUFGTk9TVVBQT1JUOworICAgIGVsc2UgcHdzaS0+ZXJyID0gV1NBRUZBVUxUOwogICByZXR1cm4gU09DS0VUX0VSUk9SOwogfQogCkBAIC00ODMsNyArNDgzLDcgQEAKICAgICBwd3MtPmZsYWdzID0gKHVuc2lnbmVkKXB3c2ktPmxhc3RfZnJlZTsKICAgICBwd3NpLT5sYXN0X2ZyZWUgPSBwd3MgLSAmcHdzaS0+c29ja1swXTsKICAgICBpZiAoY2xvc2UoZmQpID09IDApIHJldHVybiAwOwotICAgIHB3c2ktPmVycm5vID0gKGVycm5vID09IEVCQURGKSA/IFdTQUVOT1RTT0NLIDogd3NhRXJybm8oKTsKKyAgICBwd3NpLT5lcnIgPSAoZXJybm8gPT0gRUJBREYpID8gV1NBRU5PVFNPQ0sgOiB3c2FFcnJubygpOwogICB9CiAgIHJldHVybiBTT0NLRVRfRVJST1I7CiB9CkBAIC01MTIsNyArNTEyLDcgQEAKICAgICAgICAgcHdzLT5mbGFncyAmPSB+KFdTX0ZEX0lOQUNUSVZFIHwgV1NfRkRfQ09OTkVDVCk7IAogICAgICAgICByZXR1cm4gMDsgCiAgICAgfQotICAgIHB3c2ktPmVycm5vID0gKGVycm5vID09IEVJTlBST0dSRVNTKSA/IFdTQUVXT1VMREJMT0NLIDogd3NhRXJybm8oKTsKKyAgICBwd3NpLT5lcnIgPSAoZXJybm8gPT0gRUlOUFJPR1JFU1MpID8gV1NBRVdPVUxEQkxPQ0sgOiB3c2FFcnJubygpOwogICB9CiAgIHJldHVybiBTT0NLRVRfRVJST1I7CiB9CkBAIC01MzUsNyArNTM1LDcgQEAKICAgICAgICAqbmFtZWxlbiA9IChJTlQxNiluYW1lbGVuMzI7IAogICAgICAgICByZXR1cm4gMDsgCiAgICAgfQotICAgIHB3c2ktPmVycm5vID0gKGhfZXJybm8gPCAwKSA/IHdzYUVycm5vKCkgOiB3c2FIZXJybm8oKTsKKyAgICBwd3NpLT5lcnIgPSAoaF9lcnJubyA8IDApID8gd3NhRXJybm8oKSA6IHdzYUhlcnJubygpOwogICB9CiAgIHJldHVybiBTT0NLRVRfRVJST1I7CiB9CkBAIC01NTUsNyArNTU1LDcgQEAKIAkqbmFtZWxlbiA9IChJTlQxNiluYW1lbGVuMzI7IAogCSByZXR1cm4gMDsgCiAgICAgfQotICAgIHB3c2ktPmVycm5vID0gKGhfZXJybm8gPCAwKSA/IHdzYUVycm5vKCkgOiB3c2FIZXJybm8oKTsKKyAgICBwd3NpLT5lcnIgPSAoaF9lcnJubyA8IDApID8gd3NhRXJybm8oKSA6IHdzYUhlcnJubygpOwogICB9CiAgIHJldHVybiBTT0NLRVRfRVJST1I7CiB9CkBAIC01NzYsNyArNTc2LDcgQEAKICAgICAgY29udmVydF9zb2Nrb3B0KCZsZXZlbCwgJm9wdG5hbWUpOwogICAgICBpZiAoZ2V0c29ja29wdChwd3MtPmZkLCAoaW50KSBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCAmb3B0bGVuMzIpID09IDAgKQogICAgICB7ICpvcHRsZW4gPSAoSU5UMTYpb3B0bGVuMzI7IHJldHVybiAwOyB9Ci0gICAgIHB3c2ktPmVycm5vID0gKGVycm5vID09IEVCQURGKSA/IFdTQUVOT1RTT0NLIDogd3NhRXJybm8oKTsKKyAgICAgcHdzaS0+ZXJyID0gKGVycm5vID09IEVCQURGKSA/IFdTQUVOT1RTT0NLIDogd3NhRXJybm8oKTsKICAgfQogICByZXR1cm4gU09DS0VUX0VSUk9SOwogfQpAQCAtNjA0LDEzICs2MDQsMTMgQEAKIAlpZiggcHdzaS0+ZGJ1ZmZlciA9PSBOVUxMICkKIAkgICAgaWYoKHB3c2ktPmRidWZmZXIgPSAoY2hhciopIFNFR1BUUl9BTExPQygzMikpID09IE5VTEwgKQogCSAgICB7Ci0JCXB3c2ktPmVycm5vID0gV1NBRU5PQlVGUzsKKwkJcHdzaS0+ZXJyID0gV1NBRU5PQlVGUzsKIAkJcmV0dXJuIChTRUdQVFIpTlVMTDsKIAkgICAgfQogCXN0cm5jcHkocHdzaS0+ZGJ1ZmZlciwgcywgMzIgKTsKIAlyZXR1cm4gU0VHUFRSX0dFVChwd3NpLT5kYnVmZmVyKTsgCiAgICAgfQotICAgIHB3c2ktPmVycm5vID0gd3NhRXJybm8oKTsKKyAgICBwd3NpLT5lcnIgPSB3c2FFcnJubygpOwogICB9CiAgIHJldHVybiAoU0VHUFRSKU5VTEw7CiB9CkBAIC02MzIsMTggKzYzMiwxOCBAQAogCWNhc2UgV1NfRklPTkJJTzogICAgbmV3Y21kPUZJT05CSU87ICAKIAkJCSAgICBpZiggcHdzLT5wX2FvcCAmJiAqYXJncCA9PSAwICkgCiAJCQkgICAgeyAKLQkJCQlwd3NpLT5lcnJubyA9IFdTQUVJTlZBTDsgCisJCQkJcHdzaS0+ZXJyID0gV1NBRUlOVkFMOyAKIAkJCQlyZXR1cm4gU09DS0VUX0VSUk9SOyAKIAkJCSAgICB9CiAJCQkgICAgYnJlYWs7CiAJY2FzZSBXU19TSU9DQVRNQVJLOiBuZXdjbWQ9U0lPQ0FUTUFSSzsgYnJlYWs7CiAJY2FzZSBXU19JT1coJ2YnLDEyNSx1X2xvbmcpOiAKIAkJCSAgZnByaW50ZihzdGRlcnIsIldhcm5pbmc6IFdTMS4xIHNob3VsZG4ndCBiZSB1c2luZyBhc3luYyBJL09cbiIpOwotCQkJICBwd3NpLT5lcnJubyA9IFdTQUVJTlZBTDsgcmV0dXJuIFNPQ0tFVF9FUlJPUjsKKwkJCSAgcHdzaS0+ZXJyID0gV1NBRUlOVkFMOyByZXR1cm4gU09DS0VUX0VSUk9SOwogCWRlZmF1bHQ6CSAgZnByaW50ZihzdGRlcnIsIldhcm5pbmc6IFVua25vd24gV1NfSU9DVEwgY21kICglMDh4KVxuIiwgY21kKTsKICAgICB9CiAgICAgaWYoIGlvY3RsKHB3cy0+ZmQsIG5ld2NtZCwgKGNoYXIqKWFyZ3AgKSA9PSAwICkgcmV0dXJuIDA7Ci0gICAgcHdzaS0+ZXJybm8gPSAoZXJybm8gPT0gRUJBREYpID8gV1NBRU5PVFNPQ0sgOiB3c2FFcnJubygpOyAKKyAgICBwd3NpLT5lcnIgPSAoZXJybm8gPT0gRUJBREYpID8gV1NBRU5PVFNPQ0sgOiB3c2FFcnJubygpOyAKICAgfQogICByZXR1cm4gU09DS0VUX0VSUk9SOwogfQpAQCAtNjY1LDcgKzY2NSw3IEBACiAgICAgZWxzZSBub3RpZnlfY2xpZW50KHB3cywgV1NfRkRfQUNDRVBUKTsKIAogICAgIGlmIChsaXN0ZW4ocHdzLT5mZCwgYmFja2xvZykgPT0gMCkgcmV0dXJuIDA7Ci0gICAgcHdzaS0+ZXJybm8gPSB3c2FFcnJubygpOworICAgIHB3c2ktPmVyciA9IHdzYUVycm5vKCk7CiAgIH0KICAgcmV0dXJuIFNPQ0tFVF9FUlJPUjsKIH0KQEAgLTY4Niw3ICs2ODYsNyBAQAogCW5vdGlmeV9jbGllbnQocHdzLCBXU19GRF9SRUFEKTsKIAlyZXR1cm4gKElOVDE2KWxlbmd0aDsKICAgICB9Ci0gICAgcHdzaS0+ZXJybm8gPSB3c2FFcnJubygpOworICAgIHB3c2ktPmVyciA9IHdzYUVycm5vKCk7CiAgIH0KICAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIiAtPiBFUlJPUlxuIik7CiAgIHJldHVybiBTT0NLRVRfRVJST1I7CkBAIC03MTAsNyArNzEwLDcgQEAKICAgICAgICBub3RpZnlfY2xpZW50KHB3cywgV1NfRkRfUkVBRCk7CiAgICAgICAgcmV0dXJuIChJTlQxNilsZW5ndGg7CiAgICAgfQotICAgIHB3c2ktPmVycm5vID0gd3NhRXJybm8oKTsKKyAgICBwd3NpLT5lcnIgPSB3c2FFcnJubygpOwogICB9CiAgIHJldHVybiBTT0NLRVRfRVJST1I7CiB9CkBAIC03NDQsNyArNzQ0LDcgQEAKIAkgIH0KIAkgIHJldHVybiBoaWdoZmQ7IAogICAgICB9Ci0gICAgIHB3c2ktPmVycm5vID0gd3NhRXJybm8oKTsKKyAgICAgcHdzaS0+ZXJyID0gd3NhRXJybm8oKTsKICAgfSAKICAgcmV0dXJuIFNPQ0tFVF9FUlJPUjsKIH0KQEAgLTc2Miw3ICs3NjIsNyBAQAogICAgIGlmICgobGVuZ3RoID0gc2VuZChwd3MtPmZkLCBidWYsIGxlbiwgZmxhZ3MpKSA8IDAgKSAKICAgICB7ICAKIAlsZW5ndGggPSBTT0NLRVRfRVJST1I7Ci0JcHdzaS0+ZXJybm8gPSB3c2FFcnJubygpOworCXB3c2ktPmVyciA9IHdzYUVycm5vKCk7CiAgICAgfQogICAgIG5vdGlmeV9jbGllbnQocHdzLCBXU19GRF9XUklURSk7CiAgICAgcmV0dXJuIChJTlQxNilsZW5ndGg7CkBAIC03ODUsNyArNzg1LDcgQEAKICAgICBpZiAoKGxlbmd0aCA9IHNlbmR0byhwd3MtPmZkLCBidWYsIGxlbiwgZmxhZ3MsIHRvLCB0b2xlbikpIDwgMCApCiAgICAgewogCWxlbmd0aCA9IFNPQ0tFVF9FUlJPUjsKLSAgICAgICAgcHdzaS0+ZXJybm8gPSB3c2FFcnJubygpOworICAgICAgICBwd3NpLT5lcnIgPSB3c2FFcnJubygpOwogICAgIH0KICAgICBub3RpZnlfY2xpZW50KHB3cywgV1NfRkRfV1JJVEUpOwogICAgIHJldHVybiAoSU5UMTYpbGVuZ3RoOwpAQCAtODE0LDcgKzgxNCw3IEBACiAJb3B0bGVuID0gc2l6ZW9mKGxpbmdlcjMyKTsKICAgICB9CiAgICAgaWYgKHNldHNvY2tvcHQocHdzLT5mZCwgbGV2ZWwsIG9wdG5hbWUsIG9wdHZhbCwgb3B0bGVuKSA9PSAwKSByZXR1cm4gMDsKLSAgICBwd3NpLT5lcnJubyA9IHdzYUVycm5vKCk7CisgICAgcHdzaS0+ZXJyID0gd3NhRXJybm8oKTsKICAgfQogICByZXR1cm4gU09DS0VUX0VSUk9SOwogfQpAQCAtODMyLDcgKzgzMiw3IEBACiAgICAgY2FuY2VsX2FzeW5jX3NlbGVjdChwd3MpOwogCiAgICAgaWYgKHNodXRkb3duKHB3cy0+ZmQsIGhvdykgPT0gMCkgcmV0dXJuIDA7Ci0gICAgcHdzaS0+ZXJybm8gPSB3c2FFcnJubygpOworICAgIHB3c2ktPmVyciA9IHdzYUVycm5vKCk7CiAgIH0KICAgcmV0dXJuIFNPQ0tFVF9FUlJPUjsKIH0KQEAgLTg1Myw3ICs4NTMsNyBAQAogICAgIHsKIAljYXNlIEFGX0lORVQ6CiAJY2FzZSBBRl9VTlNQRUM6IGJyZWFrOwotCWRlZmF1bHQ6ICAgICAgICBwd3NpLT5lcnJubyA9IFdTQUVBRk5PU1VQUE9SVDsgcmV0dXJuIElOVkFMSURfU09DS0VUOworCWRlZmF1bHQ6ICAgICAgICBwd3NpLT5lcnIgPSBXU0FFQUZOT1NVUFBPUlQ7IHJldHVybiBJTlZBTElEX1NPQ0tFVDsKICAgICB9CiAKICAgICAvKiBjaGVjayB0aGUgc29ja2V0IHR5cGUgKi8KQEAgLTg2MiwxMiArODYyLDEyIEBACiAJY2FzZSBTT0NLX1NUUkVBTToKIAljYXNlIFNPQ0tfREdSQU06CiAJY2FzZSBTT0NLX1JBVzogYnJlYWs7Ci0JZGVmYXVsdDogICAgICAgcHdzaS0+ZXJybm8gPSBXU0FFU09DS1ROT1NVUFBPUlQ7IHJldHVybiBJTlZBTElEX1NPQ0tFVDsKKwlkZWZhdWx0OiAgICAgICBwd3NpLT5lcnIgPSBXU0FFU09DS1ROT1NVUFBPUlQ7IHJldHVybiBJTlZBTElEX1NPQ0tFVDsKICAgICB9CiAKICAgICAvKiBjaGVjayB0aGUgcHJvdG9jb2wgdHlwZSAqLwogICAgIGlmICggcHJvdG9jb2wgPCAwICkgIC8qIGRvbid0IHN1cHBvcnQgbmVnYXRpdmUgdmFsdWVzICovCi0gICAgeyBwd3NpLT5lcnJubyA9IFdTQUVQUk9UT05PU1VQUE9SVDsgcmV0dXJuIElOVkFMSURfU09DS0VUOyB9CisgICAgeyBwd3NpLT5lcnIgPSBXU0FFUFJPVE9OT1NVUFBPUlQ7IHJldHVybiBJTlZBTElEX1NPQ0tFVDsgfQogCiAgICAgaWYgKCBhZiA9PSBBRl9VTlNQRUMpICAvKiBkaWQgdGhleSBub3Qgc3BlY2lmeSB0aGUgYWRkcmVzcyBmYW1pbHk/ICovCiAgICAgICAgIHN3aXRjaChwcm90b2NvbCkgCkBAIC04NzYsNyArODc2LDcgQEAKICAgICAgICAgICAgICBpZiAodHlwZSA9PSBTT0NLX1NUUkVBTSkgeyBhZiA9IEFGX0lORVQ7IGJyZWFrOyB9CiAgICAgICAgICAgY2FzZSBJUFBST1RPX1VEUDoKICAgICAgICAgICAgICBpZiAodHlwZSA9PSBTT0NLX0RHUkFNKSAgeyBhZiA9IEFGX0lORVQ7IGJyZWFrOyB9Ci0gICAgICAgICAgZGVmYXVsdDogcHdzaS0+ZXJybm8gPSBXU0FFUFJPVE9UWVBFOyByZXR1cm4gSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgICAgZGVmYXVsdDogcHdzaS0+ZXJyID0gV1NBRVBST1RPVFlQRTsgcmV0dXJuIElOVkFMSURfU09DS0VUOwogICAgICAgICB9CiAKICAgICBpZiAoKHNvY2sgPSBzb2NrZXQoYWYsIHR5cGUsIHByb3RvY29sKSkgPj0gMCkgCkBAIC04ODgsNyArODg4LDcgQEAKICAgICAgICAgaWYoIHBuZXcgKSByZXR1cm4gKFNPQ0tFVDE2KVdTX1BUUjJIQU5ETEUocG5ldyk7CiAJewogICAgICAgICAgIGNsb3NlKHNvY2spOwotICAgICAgICAgIHB3c2ktPmVycm5vID0gV1NBRU5PQlVGUzsKKyAgICAgICAgICBwd3NpLT5lcnIgPSBXU0FFTk9CVUZTOwogICAgICAgICAgIHJldHVybiBJTlZBTElEX1NPQ0tFVDsKIAl9CiAgICAgfQpAQCAtODk2LDggKzg5Niw4IEBACiAgICAgaWYgKGVycm5vID09IEVQRVJNKSAvKiByYXcgc29ja2V0IGRlbmllZCAqLwogICAgIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJXU19TT0NLRVQ6IG5vdCBlbm91Z2ggcHJpdmlsZWdlc1xuIik7Ci0gICAgICAgIHB3c2ktPmVycm5vID0gV1NBRVNPQ0tUTk9TVVBQT1JUOwotICAgIH0gZWxzZSBwd3NpLT5lcnJubyA9IHdzYUVycm5vKCk7CisgICAgICAgIHB3c2ktPmVyciA9IFdTQUVTT0NLVE5PU1VQUE9SVDsKKyAgICB9IGVsc2UgcHdzaS0+ZXJyID0gd3NhRXJybm8oKTsKICAgfQogIAogICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiXHRcdGZhaWxlZCFcbiIpOwpAQCAtOTI3LDggKzkyNyw4IEBACiAgICAgaWYoIChob3N0ID0gZ2V0aG9zdGJ5YWRkcihhZGRyLCBsZW4sIHR5cGUpKSAhPSBOVUxMICkKICAgICAgIGlmKCBXU19kdXBfaGUocHdzaSwgaG9zdCwgV1NfRFVQX1NFR1BUUikgKQogICAgICAgICAgIHJldHVybiBTRUdQVFJfR0VUKHB3c2ktPmJ1ZmZlcik7Ci0gICAgICBlbHNlIHB3c2ktPmVycm5vID0gV1NBRU5PQlVGUzsKLSAgICBlbHNlIHB3c2ktPmVycm5vID0gKGhfZXJybm8gPCAwKSA/IHdzYUVycm5vKCkgOiB3c2FIZXJybm8oKTsKKyAgICAgIGVsc2UgcHdzaS0+ZXJyID0gV1NBRU5PQlVGUzsKKyAgICBlbHNlIHB3c2ktPmVyciA9IChoX2Vycm5vIDwgMCkgPyB3c2FFcnJubygpIDogd3NhSGVycm5vKCk7CiAgIH0gCiAgIHJldHVybiBOVUxMOwogfQpAQCAtOTQ4LDggKzk0OCw4IEBACiAgICAgaWYoIChob3N0ID0gZ2V0aG9zdGJ5bmFtZShuYW1lKSkgIT0gTlVMTCApCiAgICAgICBpZiggV1NfZHVwX2hlKHB3c2ksIGhvc3QsIFdTX0RVUF9TRUdQVFIpICkKICAgICAgICAgICByZXR1cm4gU0VHUFRSX0dFVChwd3NpLT5idWZmZXIpOwotICAgICAgZWxzZSBwd3NpLT5lcnJubyA9IFdTQUVOT0JVRlM7Ci0gICAgZWxzZSBwd3NpLT5lcnJubyA9IChoX2Vycm5vIDwgMCkgPyB3c2FFcnJubygpIDogd3NhSGVycm5vKCk7CisgICAgICBlbHNlIHB3c2ktPmVyciA9IFdTQUVOT0JVRlM7CisgICAgZWxzZSBwd3NpLT5lcnIgPSAoaF9lcnJubyA8IDApID8gd3NhRXJybm8oKSA6IHdzYUhlcnJubygpOwogICB9CiAgIHJldHVybiBOVUxMOwogfQpAQCAtOTYzLDcgKzk2Myw3IEBACiAgIGlmKCBwd3NpICkKICAgewogICAgIGlmIChnZXRob3N0bmFtZShuYW1lLCBuYW1lbGVuKSA9PSAwKSByZXR1cm4gMDsKLSAgICBwd3NpLT5lcnJubyA9IChlcnJubyA9PSBFSU5WQUwpID8gV1NBRUZBVUxUIDogd3NhRXJybm8oKTsKKyAgICBwd3NpLT5lcnIgPSAoZXJybm8gPT0gRUlOVkFMKSA/IFdTQUVGQVVMVCA6IHdzYUVycm5vKCk7CiAgIH0KICAgcmV0dXJuIFNPQ0tFVF9FUlJPUjsKIH0KQEAgLTk4Myw4ICs5ODMsOCBAQAogICAgIGlmKCAocHJvdG8gPSBnZXRwcm90b2J5bmFtZShuYW1lKSkgIT0gTlVMTCApCiAgICAgICBpZiggV1NfZHVwX3BlKHB3c2ksIHByb3RvLCBXU19EVVBfU0VHUFRSKSApCiAgICAgICAgICAgcmV0dXJuIFNFR1BUUl9HRVQocHdzaS0+YnVmZmVyKTsKLSAgICAgIGVsc2UgcHdzaS0+ZXJybm8gPSBXU0FFTk9CVUZTOwotICAgIGVsc2UgcHdzaS0+ZXJybm8gPSAoaF9lcnJubyA8IDApID8gd3NhRXJybm8oKSA6IHdzYUhlcnJubygpOworICAgICAgZWxzZSBwd3NpLT5lcnIgPSBXU0FFTk9CVUZTOworICAgIGVsc2UgcHdzaS0+ZXJyID0gKGhfZXJybm8gPCAwKSA/IHdzYUVycm5vKCkgOiB3c2FIZXJybm8oKTsKICAgfQogICByZXR1cm4gTlVMTDsKIH0KQEAgLTEwMDQsOCArMTAwNCw4IEBACiAgICAgaWYoIChwcm90byA9IGdldHByb3RvYnludW1iZXIobnVtYmVyKSkgIT0gTlVMTCApCiAgICAgICBpZiggV1NfZHVwX3BlKHB3c2ksIHByb3RvLCBXU19EVVBfU0VHUFRSKSApCiAgICAgICAgICAgcmV0dXJuIFNFR1BUUl9HRVQocHdzaS0+YnVmZmVyKTsKLSAgICAgIGVsc2UgcHdzaS0+ZXJybm8gPSBXU0FFTk9CVUZTOwotICAgIGVsc2UgcHdzaS0+ZXJybm8gPSBXU0FOT19EQVRBOworICAgICAgZWxzZSBwd3NpLT5lcnIgPSBXU0FFTk9CVUZTOworICAgIGVsc2UgcHdzaS0+ZXJyID0gV1NBTk9fREFUQTsKICAgfQogICByZXR1cm4gTlVMTDsKIH0KQEAgLTEwMjYsOCArMTAyNiw4IEBACiAgICAgaWYoIChzZXJ2ID0gZ2V0c2VydmJ5bmFtZShuYW1lLCBwcm90bykpICE9IE5VTEwgKQogICAgICAgaWYoIFdTX2R1cF9zZShwd3NpLCBzZXJ2LCBXU19EVVBfU0VHUFRSKSApCiAgICAgICAgICAgcmV0dXJuIFNFR1BUUl9HRVQocHdzaS0+YnVmZmVyKTsKLSAgICAgIGVsc2UgcHdzaS0+ZXJybm8gPSBXU0FFTk9CVUZTOwotICAgIGVsc2UgcHdzaS0+ZXJybm8gPSAoaF9lcnJubyA8IDApID8gd3NhRXJybm8oKSA6IHdzYUhlcnJubygpOworICAgICAgZWxzZSBwd3NpLT5lcnIgPSBXU0FFTk9CVUZTOworICAgIGVsc2UgcHdzaS0+ZXJyID0gKGhfZXJybm8gPCAwKSA/IHdzYUVycm5vKCkgOiB3c2FIZXJybm8oKTsKICAgfQogICByZXR1cm4gTlVMTDsKIH0KQEAgLTEwNDcsOCArMTA0Nyw4IEBACiAgICAgaWYoIChzZXJ2ID0gZ2V0c2VydmJ5cG9ydChwb3J0LCBwcm90bykpICE9IE5VTEwgKQogICAgICAgaWYoIFdTX2R1cF9zZShwd3NpLCBzZXJ2LCBXU19EVVBfU0VHUFRSKSApCiAgICAgICAgICAgcmV0dXJuIFNFR1BUUl9HRVQocHdzaS0+YnVmZmVyKTsKLSAgICAgIGVsc2UgcHdzaS0+ZXJybm8gPSBXU0FFTk9CVUZTOwotICAgIGVsc2UgcHdzaS0+ZXJybm8gPSAoaF9lcnJubyA8IDApID8gd3NhRXJybm8oKSA6IHdzYUhlcnJubygpOworICAgICAgZWxzZSBwd3NpLT5lcnIgPSBXU0FFTk9CVUZTOworICAgIGVsc2UgcHdzaS0+ZXJyID0gKGhfZXJybm8gPCAwKSA/IHdzYUVycm5vKCkgOiB3c2FIZXJybm8oKTsKICAgfQogICByZXR1cm4gTlVMTDsKIH0KQEAgLTEwOTEsNyArMTA5MSw3IEBACiAJIHBfYW9wLT5oV25kLCBwX2FvcC0+dU1zZywgKEhBTkRMRTE2KVdTX1BUUjJIQU5ETEUocF9hb3ApLCAoTFBBUkFNKWxMZW5ndGgpOwogI2VuZGlmCiAKLSAgUG9zdE1lc3NhZ2UocF9hb3AtPmhXbmQsIHBfYW9wLT51TXNnLCAoSEFORExFMTYpV1NfUFRSMkhBTkRMRShwX2FvcCksIChMUEFSQU0pbExlbmd0aCk7CisgIFBvc3RNZXNzYWdlMTYocF9hb3AtPmhXbmQsIHBfYW9wLT51TXNnLCAoSEFORExFMTYpV1NfUFRSMkhBTkRMRShwX2FvcCksIChMUEFSQU0pbExlbmd0aCk7CiAgIHJldHVybiBBT1BfQ09OVFJPTF9SRU1PVkU7CiB9CiAKQEAgLTExNTQsOCArMTE1NCw4IEBACiAgICAgICAgICAgICAgICAgIH0KICAgICAgIH0KICAgICAgIFdTX0ZSRUUoYXN5bmNfY3RsLndzX2FvcCk7Ci0gICAgICBwd3NpLT5lcnJubyA9IHdzYUVycm5vKCk7Ci0gIH0gZWxzZSBwd3NpLT5lcnJubyA9IFdTQUVXT1VMREJMT0NLOworICAgICAgcHdzaS0+ZXJyID0gd3NhRXJybm8oKTsKKyAgfSBlbHNlIHB3c2ktPmVyciA9IFdTQUVXT1VMREJMT0NLOwogICByZXR1cm4gMDsKIH0KIApAQCAtMTI2OCw3ICsxMjY4LDcgQEAKIAlXU19GUkVFKHBfYW9wKTsKIAlyZXR1cm4gMDsKICAgICB9Ci0gICAgZWxzZSBwd3NpLT5lcnJubyA9IFdTQUVJTlZBTDsKKyAgICBlbHNlIHB3c2ktPmVyciA9IFdTQUVJTlZBTDsKICAgcmV0dXJuIFNPQ0tFVF9FUlJPUjsKIH0KIApAQCAtMTMxMSw4ICsxMzExLDggQEAKICAgICAgICAgICBwcmludGYoImFzeW5jIGV2ZW50IC0gaFduZCAlMDR4LCB1TXNnICUwNHggWyUwOHhdXG4iLAogICAgICAgICAgICAgICAgICAgcHdzLT5wX2FvcC0+aFduZCwgcHdzLT5wX2FvcC0+dU1zZywgaXBhY2subFBhcmFtICk7CiAjZW5kaWYKLQkgIFBvc3RNZXNzYWdlKHB3cy0+cF9hb3AtPmhXbmQsIHB3cy0+cF9hb3AtPnVNc2csIAotCQkgICAgIChXUEFSQU0xNilpcGFjay53UGFyYW0sIChMUEFSQU0paXBhY2subFBhcmFtICk7CisJICBQb3N0TWVzc2FnZTE2KHB3cy0+cF9hb3AtPmhXbmQsIHB3cy0+cF9hb3AtPnVNc2csIAorICAgICAgICAgICAgICAgICAgICAgICAgKFdQQVJBTTE2KWlwYWNrLndQYXJhbSwgKExQQVJBTSlpcGFjay5sUGFyYW0gKTsKICAgICAgIH0KICAgICAgIGVsc2UgZnByaW50ZihzdGRlcnIsIkFzeW5jU2VsZWN0OnN0cmF5IGFzeW5jX29wIGluIHNvY2tldCAlMDR4IVxuIiwgaXBhY2sud1BhcmFtKTsKICAgICB9CkBAIC0xMzg4LDcgKzEzODgsNyBAQAogCQkJICAodW5zaWduZWQpcHdzaSwgcywgaFduZCwgdU1zZywgKHVuc2lnbmVkKWxFdmVudCApOwogICBpZiggX2NoZWNrX3dzKHB3c2ksIHB3cykgKQogICAgIGlmKCBpbml0X2FzeW5jX3NlbGVjdChwd3MsIGhXbmQsIHVNc2csIGxFdmVudCkgPT0gMCApIHJldHVybiAwOwotICAgIGVsc2UgcHdzaS0+ZXJybm8gPSBXU0FFTk9CVUZTOworICAgIGVsc2UgcHdzaS0+ZXJyID0gV1NBRU5PQlVGUzsKICAgcmV0dXJuIFNPQ0tFVF9FUlJPUjsgCiB9CiAKZGlmZiAtLWdpdCBhL21pc2Mvd3NwcmludGYuYyBiL21pc2Mvd3NwcmludGYuYwppbmRleCBiZGY2MzM0Li5iZGI2NzEzIDEwMDY0NAotLS0gYS9taXNjL3dzcHJpbnRmLmMKKysrIGIvbWlzYy93c3ByaW50Zi5jCkBAIC00LDcgKzQsNiBAQAogICogQ29weXJpZ2h0IDE5OTYgQWxleGFuZHJlIEp1bGxpYXJkCiAgKi8KIAotI2RlZmluZSBOT19UUkFOU0lUSU9OX1RZUEVTICAvKiBUaGlzIGZpbGUgaXMgV2luMzItY2xlYW4gKi8KICNpbmNsdWRlIDxzdGRhcmcuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgpkaWZmIC0tZ2l0IGEvbWlzY2VtdS9NYWtlZmlsZS5pbiBiL21pc2NlbXUvTWFrZWZpbGUuaW4KaW5kZXggNzk5NTBlYS4uZDZjMGI1MiAxMDA2NDQKLS0tIGEvbWlzY2VtdS9NYWtlZmlsZS5pbgorKysgYi9taXNjZW11L01ha2VmaWxlLmluCkBAIC0xLDQgKzEsNCBAQAotREVGUyAgICAgID0gLURfX1dJTkVfXyAtRE5PX1RSQU5TSVRJT05fVFlQRVMKK0RFRlMgICAgICA9IC1EX19XSU5FX18KIFRPUFNSQ0RJUiA9IEB0b3Bfc3JjZGlyQAogVE9QT0JKRElSID0gLi4KIFNSQ0RJUiAgICA9IEBzcmNkaXJACmRpZmYgLS1naXQgYS9tc2Rvcy9NYWtlZmlsZS5pbiBiL21zZG9zL01ha2VmaWxlLmluCmluZGV4IDFjNzY4MmIuLmMzODBmZWIgMTAwNjQ0Ci0tLSBhL21zZG9zL01ha2VmaWxlLmluCisrKyBiL21zZG9zL01ha2VmaWxlLmluCkBAIC0xLDQgKzEsNCBAQAotREVGUyAgICAgID0gLURfX1dJTkVfXyAtRE5PX1RSQU5TSVRJT05fVFlQRVMKK0RFRlMgICAgICA9IC1EX19XSU5FX18KIFRPUFNSQ0RJUiA9IEB0b3Bfc3JjZGlyQAogVE9QT0JKRElSID0gLi4KIFNSQ0RJUiAgICA9IEBzcmNkaXJACmRpZmYgLS1naXQgYS9tc2Rvcy9kb3NtZW0uYyBiL21zZG9zL2Rvc21lbS5jCmluZGV4IDA3ZDc4MWYuLmJhODY2YTQgMTAwNjQ0Ci0tLSBhL21zZG9zL2Rvc21lbS5jCisrKyBiL21zZG9zL2Rvc21lbS5jCkBAIC0yMDQsNyArMjA0LDggQEAKICAgICAgKiAtIGl0IGlzIG1vc3RseSB3YXN0ZWQgYnV0IHdlIHVzZSBjYW4gc29tZSBvZiBpdCB0byAKICAgICAgKiAgIHN0b3JlIGludGVybmFsIHRyYW5zbGF0aW9uIHRhYmxlcywgZXRjLi4uCiAgICAgICovCi0gICAgRE9TTUVNX2Rvc21lbSA9IFZpcnR1YWxBbGxvYyhOVUxMLDB4MTAwMDAwLE1FTV9DT01NSVQsUEFHRV9FWEVDVVRFX1JFQURXUklURSk7CisgICAgRE9TTUVNX2Rvc21lbSA9IFZpcnR1YWxBbGxvYyggTlVMTCwgMHgxMDAwMDAsIE1FTV9DT01NSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRV9FWEVDVVRFX1JFQURXUklURSApOwogICAgIGlmICghRE9TTUVNX2Rvc21lbSkKICAgICB7CiAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBET1MgbWVtb3J5LlxuIiApOwpAQCAtMzQ4LDYgKzM0OSw3IEBACiAgICByZXR1cm4gRkFMU0U7CiB9CiAKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgRE9TTUVNX01hcExpbmVhclRvRG9zCiAgKgpAQCAtMzU1LDE0ICszNTcsMTMgQEAKICAqLwogVUlOVDMyIERPU01FTV9NYXBMaW5lYXJUb0RvcyhMUFZPSUQgcHRyKQogewotI2lmbmRlZiBXSU5FTElCCi0gICBpZiAoKChjaGFyKilwdHIgPj0gRE9TTUVNX2Rvc21lbSkgJiYKLSAgICAgICAgKChjaGFyKilwdHIgPCBET1NNRU1fZG9zbWVtKzB4MTAwMDAwKSkgIAorICAgIGlmICgoKGNoYXIqKXB0ciA+PSBET1NNRU1fZG9zbWVtKSAmJgorICAgICAgICAoKGNoYXIqKXB0ciA8IERPU01FTV9kb3NtZW0gKyAweDEwMDAwMCkpCiAJICByZXR1cm4gKFVJTlQzMilwdHIgLSAoVUlOVDMyKURPU01FTV9kb3NtZW07Ci0jZW5kaWYKLSAgIHJldHVybiAoVUlOVDMyKXB0cjsKKyAgICByZXR1cm4gKFVJTlQzMilwdHI7CiB9CiAKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgRE9TTUVNX01hcERvc1RvTGluZWFyCiAgKgpAQCAtMzcwLDEyICszNzEsMTEgQEAKICAqLwogTFBWT0lEIERPU01FTV9NYXBEb3NUb0xpbmVhcihVSU5UMzIgcHRyKQogewotI2lmbmRlZiBXSU5FTElCCi0gICBpZiAoIHB0ciA8IDEwMDAwMDAgKSByZXR1cm4gKExQVk9JRCkocHRyICsgKFVJTlQzMilET1NNRU1fZG9zbWVtKTsKLSNlbmRpZgotICAgcmV0dXJuIChMUFZPSUQpcHRyOworICAgIGlmIChwdHIgPCAweDEwMDAwMCkgcmV0dXJuIChMUFZPSUQpKHB0ciArIChVSU5UMzIpRE9TTUVNX2Rvc21lbSk7CisgICAgcmV0dXJuIChMUFZPSUQpcHRyOwogfQogCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIERPU01FTV9NYXBSZWFsVG9MaW5lYXIKICAqCkBAIC0zOTgsNyArMzk4LDcgQEAKICAqLwogV09SRCBET1NNRU1fQWxsb2NTZWxlY3RvcihXT1JEIHJlYWxzZWwpCiB7Ci0JSE1PRFVMRTE2IGhNb2R1bGUgPSBHZXRNb2R1bGVIYW5kbGUoIktFUk5FTCIpOworCUhNT0RVTEUxNiBoTW9kdWxlID0gR2V0TW9kdWxlSGFuZGxlMTYoIktFUk5FTCIpOwogCVdPUkQJc2VsOwogCiAJc2VsPUdMT0JBTF9DcmVhdGVCbG9jaygKZGlmZiAtLWdpdCBhL21zZG9zL2RwbWkuYyBiL21zZG9zL2RwbWkuYwppbmRleCA1MDk2MzY4Li40YWQyNDhlIDEwMDY0NAotLS0gYS9tc2Rvcy9kcG1pLmMKKysrIGIvbXNkb3MvZHBtaS5jCkBAIC0xMDMsOCArMTAzLDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChlbnRyeVBvaW50KSAKICAgICAgICAgICAgICAgICBBWF9yZWcoY29udGV4dCkgPSBMT1dPUkQoTU9EVUxFX0dldEVudHJ5UG9pbnQoIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0TW9kdWxlSGFuZGxlKCAiS0VSTkVMIiApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnlQb2ludCApKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRNb2R1bGVIYW5kbGUxNiggIktFUk5FTCIgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeVBvaW50ICkpOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogCmRpZmYgLS1naXQgYS9tc2Rvcy9pbnQyMS5jIGIvbXNkb3MvaW50MjEuYwppbmRleCA3OWMwZDg3Li4zN2RjNmYwIDEwMDY0NAotLS0gYS9tc2Rvcy9pbnQyMS5jCisrKyBiL21zZG9zL2ludDIxLmMKQEAgLTQyOCw3ICs0MjgsNyBAQAogCSAgcmV0dXJuOwogCX0KICAgICAgIGlmICgoYWN0aW9uICYgMHgwNyk9PSAyKSB7Ci0JLyogVHJ1bmNhdGUgaXQsIGJ1dCBmaXJzdCBjaGVjayBpZiBvcGVuZCBmb3Igd3JpdGUgKi8KKwkvKiBUcnVuY2F0ZSBpdCwgYnV0IGZpcnN0IGNoZWNrIGlmIG9wZW5lZCBmb3Igd3JpdGUgKi8KIAlpZiAoKEJMX3JlZyhjb250ZXh0KSAmIDB4MDAwNyk9PSAwKSB7CiAJICBCWF9yZWcoY29udGV4dCkgPSBBWF9yZWcoY29udGV4dCk7CiAJICBDbG9zZUZpbGUoY29udGV4dCk7CkBAIC00NTYsNyArNDU2LDcgQEAKIAlEWF9yZWcoY29udGV4dCkgPSBTSV9yZWcoY29udGV4dCk7CiAJSU5UMjFfQ3JlYXRlRmlsZShjb250ZXh0KTsKIAlpZiAoRUZMX3JlZyhjb250ZXh0KSAmIDB4MDAwMSkgeyAvKm5vIGZpbGUgb3BlbiwgZmxhZ3Mgc2V0ICovCi0JICBkcHJpbnRmX2ludChzdGRkZWIsICJpbnQyMTogZXh0ZW5kZWQgb3Blbi9jcmVhdGU6IHRydW5jZmFpbGVkIik7CisJICBkcHJpbnRmX2ludChzdGRkZWIsICJpbnQyMTogZXh0ZW5kZWQgb3Blbi9jcmVhdGU6IHRydW5jIGZhaWxlZCIpOwogCSAgcmV0dXJuOwogCX0KIAlDWF9yZWcoY29udGV4dCkgPSAzOwpkaWZmIC0tZ2l0IGEvbXNkb3MvaW50MmYuYyBiL21zZG9zL2ludDJmLmMKaW5kZXggOWNmZDc5Ni4uZDhkYmFlMSAxMDA2NDQKLS0tIGEvbXNkb3MvaW50MmYuYworKysgYi9tc2Rvcy9pbnQyZi5jCkBAIC0xMDIsNyArMTAyLDcgQEAKIAlicmVhazsKIAogICAgIGNhc2UgMHg4NDogIC8qIEdldCBkZXZpY2UgQVBJIGVudHJ5IHBvaW50ICovCi0gICAgICAgIGFkZHIgPSAoRFdPUkQpTU9EVUxFX0dldEVudHJ5UG9pbnQoIEdldE1vZHVsZUhhbmRsZSgiV1BST0NTIiksCisgICAgICAgIGFkZHIgPSAoRFdPUkQpTU9EVUxFX0dldEVudHJ5UG9pbnQoIEdldE1vZHVsZUhhbmRsZTE2KCJXUFJPQ1MiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlhEX0JBU0UgKyBCWF9yZWcoY29udGV4dCkgKTsKICAgICAgICAgaWYgKCFhZGRyKSAgLyogbm90IHN1cHBvcnRlZCAqLwogICAgICAgICB7CmRpZmYgLS1naXQgYS9tdWx0aW1lZGlhL2F1ZGlvLmMgYi9tdWx0aW1lZGlhL2F1ZGlvLmMKaW5kZXggNWE5YjQ1Zi4uOTMyZDFmOSAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS9hdWRpby5jCisrKyBiL211bHRpbWVkaWEvYXVkaW8uYwpAQCAtNCwxMiArNCw2IEBACiAgKiBDb3B5cmlnaHQgMTk5NCBNYXJ0aW4gQXlvdHRlCiAgKi8KIAotI2lmbmRlZiBXSU5FTElCCi0jZGVmaW5lIEJVSUxUSU5fTU1TWVNURU0KLSNlbmRpZiAKLQotI2lmZGVmIEJVSUxUSU5fTU1TWVNURU0KLQogI2RlZmluZSBFTVVMQVRFX1NCMTYKIAogI2luY2x1ZGUgPHN0ZGlvLmg+CkBAIC0zMiw2ICsyNiw4IEBACiAjaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCitpbnQgTU1TWVNURU1fRGV2SURUb0luZGV4KFVJTlQxNik7CisKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQogI2RlZmluZSBTT1VORF9ERVYgIi9kZXYvZHNwIgogCkBAIC02OSw3ICs2NSw3IEBACiAKIHR5cGVkZWYgc3RydWN0IHsKICAgICBpbnQgICAgIG5Vc2VDb3VudDsgICAgICAgICAgLyogSW5jcmVtZW50ZWQgZm9yIGVhY2ggc2hhcmVkIG9wZW4gKi8KLSAgICBCT09MICAgIGZTaGFyZWFibGU7ICAgICAgICAgLyogVFJVRSBpZiBmaXJzdCBvcGVuIHdhcyBzaGFyZWFibGUgKi8KKyAgICBCT09MMTYgIGZTaGFyZWFibGU7ICAgICAgICAgLyogVFJVRSBpZiBmaXJzdCBvcGVuIHdhcyBzaGFyZWFibGUgKi8KICAgICBXT1JEICAgIHdOb3RpZnlEZXZpY2VJRDsgICAgLyogTUNJIGRldmljZSBJRCB3aXRoIGEgcGVuZGluZyBub3RpZmljYXRpb24gKi8KICAgICBIQU5ETEUxNiBoQ2FsbGJhY2s7ICAgICAgICAgIC8qIENhbGxiYWNrIGhhbmRsZSBmb3IgcGVuZGluZyBub3RpZmljYXRpb24gKi8KIAlITU1JTzE2CWhGaWxlOwkJCQkvKiBtbWlvIGZpbGUgaGFuZGxlIG9wZW4gYXMgRWxlbWVudAkJKi8KQEAgLTg2LDEzICs4MiwxNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlXQVZFX05vdGlmeUNsaWVudAkJCVtpbnRlcm5hbF0KICovCi1zdGF0aWMgRFdPUkQgV0FWRV9Ob3RpZnlDbGllbnQoVUlOVCB3RGV2SUQsIFdPUkQgd01zZywgCitzdGF0aWMgRFdPUkQgV0FWRV9Ob3RpZnlDbGllbnQoVUlOVDE2IHdEZXZJRCwgV09SRCB3TXNnLCAKIAkJCQlEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIpCiB7Ci0JaWYgKFdJbkRldlt3RGV2SURdLndGbGFncyAhPSBEQ0JfTlVMTCAmJiAhRHJpdmVyQ2FsbGJhY2soCi0JCVdJbkRldlt3RGV2SURdLndhdmVEZXNjLmR3Q2FsbEJhY2ssIFdJbkRldlt3RGV2SURdLndGbGFncywgCi0JCVdJbkRldlt3RGV2SURdLndhdmVEZXNjLmhXYXZlLCB3TXNnLCAKLQkJV0luRGV2W3dEZXZJRF0ud2F2ZURlc2MuZHdJbnN0YW5jZSwgZHdQYXJhbTEsIGR3UGFyYW0yKSkgeworCWludCBpbmRleCA9IE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpOworCisJaWYgKFdJbkRldltpbmRleF0ud0ZsYWdzICE9IERDQl9OVUxMICYmICFEcml2ZXJDYWxsYmFjaygKKwkJV0luRGV2W2luZGV4XS53YXZlRGVzYy5kd0NhbGxCYWNrLCBXSW5EZXZbaW5kZXhdLndGbGFncywgCisJCVdJbkRldltpbmRleF0ud2F2ZURlc2MuaFdhdmUsIHdNc2csIAorCQlXSW5EZXZbaW5kZXhdLndhdmVEZXNjLmR3SW5zdGFuY2UsIGR3UGFyYW0xLCBkd1BhcmFtMikpIHsKIAkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiV0FWRV9Ob3RpZnlDbGllbnQgLy8gY2FuJ3Qgbm90aWZ5IGNsaWVudCAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PRVJST1I7CiAJCX0KQEAgLTEwMiw4ICsxMDAsOSBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCVdBVkVfbWNpT3BlbgkqLwotc3RhdGljIERXT1JEIFdBVkVfbWNpT3BlbihVSU5UIHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfV0FWRV9PUEVOX1BBUk1TIGxwUGFybXMpCitzdGF0aWMgRFdPUkQgV0FWRV9tY2lPcGVuKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX1dBVkVfT1BFTl9QQVJNUyBscFBhcm1zKQogeworCWludCBpbmRleCA9IE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpOwogCUhMT0NBTDE2CWhGb3JtYXQ7CiAJTFBQQ01XQVZFRk9STUFUCWxwV2F2ZUZvcm1hdDsKIAlITE9DQUwxNgloRGVzYzsKQEAgLTExNSwxOSArMTE0LDIyIEBACiAJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiV0FWRV9tY2lPcGVuKCUwNFgsICUwOGxYLCAlcClcbiIsIAogCQkJCXdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKLQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaU9wZW4gLy8gd0RldklEPSUwNFhcbiIsIHdEZXZJRCk7Ci0JaWYgKE1DSVdhdkRldlt3RGV2SURdLm5Vc2VDb3VudCA+IDApIHsKKworCXdEZXZJRCA9IGxwUGFybXMtPndEZXZpY2VJRDsKKwlpbmRleCA9IE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpOworCisJaWYgKE1DSVdhdkRldltpbmRleF0ublVzZUNvdW50ID4gMCkgewogCQkvKiBUaGUgZHJpdmVyIGFscmVhZHkgb3BlbiBvbiB0aGlzIGNoYW5uZWwgKi8KIAkJLyogSWYgdGhlIGRyaXZlciB3YXMgb3BlbmVkIHNoYXJlYWJsZSBiZWZvcmUgYW5kIHRoaXMgb3BlbiBzcGVjaWZpZXMgKi8KIAkJLyogc2hhcmVhYmxlIHRoZW4gaW5jcmVtZW50IHRoZSB1c2UgY291bnQgKi8KLQkJaWYgKE1DSVdhdkRldlt3RGV2SURdLmZTaGFyZWFibGUgJiYgKGR3RmxhZ3MgJiBNQ0lfT1BFTl9TSEFSRUFCTEUpKQotCQkJKytNQ0lXYXZEZXZbd0RldklEXS5uVXNlQ291bnQ7CisJCWlmIChNQ0lXYXZEZXZbaW5kZXhdLmZTaGFyZWFibGUgJiYgKGR3RmxhZ3MgJiBNQ0lfT1BFTl9TSEFSRUFCTEUpKQorCQkJKytNQ0lXYXZEZXZbaW5kZXhdLm5Vc2VDb3VudDsKIAkJZWxzZQogCQkJcmV0dXJuIE1DSUVSUl9NVVNUX1VTRV9TSEFSRUFCTEU7CiAJCX0KIAllbHNlIHsKLQkJTUNJV2F2RGV2W3dEZXZJRF0ublVzZUNvdW50ID0gMTsKLQkJTUNJV2F2RGV2W3dEZXZJRF0uZlNoYXJlYWJsZSA9IGR3RmxhZ3MgJiBNQ0lfT1BFTl9TSEFSRUFCTEU7CisJCU1DSVdhdkRldltpbmRleF0ublVzZUNvdW50ID0gMTsKKwkJTUNJV2F2RGV2W2luZGV4XS5mU2hhcmVhYmxlID0gZHdGbGFncyAmIE1DSV9PUEVOX1NIQVJFQUJMRTsKIAkJfQogCWxwUGFybXMtPndEZXZpY2VJRCA9IHdEZXZJRDsKIAlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaU9wZW4gLy8gd0RldklEPSUwNFhcbiIsIHdEZXZJRCk7CkBAIC0xMzksMjAgKzE0MSwyMCBAQAogCQlpZiAoc3RybGVuKGxwc3RyRWxlbWVudE5hbWUpID4gMCkgewogCQkJc3RyY3B5KHN0ciwgbHBzdHJFbGVtZW50TmFtZSk7CiAJCQlDaGFyVXBwZXIzMkEoc3RyKTsKLQkJCU1DSVdhdkRldlt3RGV2SURdLmhGaWxlID0gbW1pb09wZW4oc3RyLCBOVUxMLCAKKwkJCU1DSVdhdkRldltpbmRleF0uaEZpbGUgPSBtbWlvT3BlbihzdHIsIE5VTEwsIAogCQkJCU1NSU9fQUxMT0NCVUYgfCBNTUlPX1JFQURXUklURSB8IE1NSU9fRVhDTFVTSVZFKTsKLQkJCWlmIChNQ0lXYXZEZXZbd0RldklEXS5oRmlsZSA9PSAwKSB7CisJCQlpZiAoTUNJV2F2RGV2W2luZGV4XS5oRmlsZSA9PSAwKSB7CiAJCQkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiV0FWRV9tY2lPcGVuIC8vIGNhbid0IGZpbmQgZmlsZT0nJXMnICFcbiIsIHN0cik7CiAJCQkJcmV0dXJuIE1DSUVSUl9GSUxFX05PVF9GT1VORDsKIAkJCQl9CiAJCQl9CiAJCWVsc2UgCi0JCQlNQ0lXYXZEZXZbd0RldklEXS5oRmlsZSA9IDA7CisJCQlNQ0lXYXZEZXZbaW5kZXhdLmhGaWxlID0gMDsKIAkJfQotCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIldBVkVfbWNpT3BlbiAvLyBoRmlsZT0ldVxuIiwgTUNJV2F2RGV2W3dEZXZJRF0uaEZpbGUpOwotCW1lbWNweSgmTUNJV2F2RGV2W3dEZXZJRF0ub3BlblBhcm1zLCBscFBhcm1zLCBzaXplb2YoTUNJX1dBVkVfT1BFTl9QQVJNUykpOwotCU1DSVdhdkRldlt3RGV2SURdLndOb3RpZnlEZXZpY2VJRCA9IGxwUGFybXMtPndEZXZpY2VJRDsKLQlscFdhdmVGb3JtYXQgPSAmTUNJV2F2RGV2W3dEZXZJRF0uV2F2ZUZvcm1hdDsKKwlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaU9wZW4gLy8gaEZpbGU9JXVcbiIsIE1DSVdhdkRldltpbmRleF0uaEZpbGUpOworCW1lbWNweSgmTUNJV2F2RGV2W2luZGV4XS5vcGVuUGFybXMsIGxwUGFybXMsIHNpemVvZihNQ0lfV0FWRV9PUEVOX1BBUk1TKSk7CisJTUNJV2F2RGV2W2luZGV4XS53Tm90aWZ5RGV2aWNlSUQgPSBscFBhcm1zLT53RGV2aWNlSUQ7CisJbHBXYXZlRm9ybWF0ID0gJk1DSVdhdkRldltpbmRleF0uV2F2ZUZvcm1hdDsKIAloRGVzYyA9IFVTRVJfSEVBUF9BTExPQyhzaXplb2YoV0FWRU9QRU5ERVNDKSk7CiAJbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaERlc2MpOwogCWxwRGVzYy0+aFdhdmUgPSAwOwpAQCAtMTY0LDEwICsxNjYsMTAgQEAKIAlscFdhdmVGb3JtYXQtPndmLm5BdmdCeXRlc1BlclNlYyA9IDExMDI1OwogCWxwV2F2ZUZvcm1hdC0+d2YubkJsb2NrQWxpZ24gPSAxOwogKi8KLQlpZiAoTUNJV2F2RGV2W3dEZXZJRF0uaEZpbGUgIT0gMCkgeworCWlmIChNQ0lXYXZEZXZbaW5kZXhdLmhGaWxlICE9IDApIHsKIAkJTU1DS0lORk8JbW1ja0luZm87CiAJCU1NQ0tJTkZPCWNrTWFpblJJRkY7Ci0JCWlmIChtbWlvRGVzY2VuZChNQ0lXYXZEZXZbd0RldklEXS5oRmlsZSwgJmNrTWFpblJJRkYsIE5VTEwsIDApICE9IDApIHsKKwkJaWYgKG1taW9EZXNjZW5kKE1DSVdhdkRldltpbmRleF0uaEZpbGUsICZja01haW5SSUZGLCBOVUxMLCAwKSAhPSAwKSB7CiAJCQlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCQkJfQogCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLApAQCAtMTc5LDE5ICsxODEsMTkgQEAKIAkJCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJCQl9CiAJCW1tY2tJbmZvLmNraWQgPSBtbWlvRk9VUkNDKCdmJywgJ20nLCAndCcsICcgJyk7Ci0JCWlmIChtbWlvRGVzY2VuZChNQ0lXYXZEZXZbd0RldklEXS5oRmlsZSwgJm1tY2tJbmZvLCAmY2tNYWluUklGRiwgTU1JT19GSU5EQ0hVTkspICE9IDApIHsKKwkJaWYgKG1taW9EZXNjZW5kKE1DSVdhdkRldltpbmRleF0uaEZpbGUsICZtbWNrSW5mbywgJmNrTWFpblJJRkYsIE1NSU9fRklORENIVU5LKSAhPSAwKSB7CiAJCQlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCQkJfQogCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAogCQkJCSJXQVZFX21jaU9wZW4gLy8gQ2h1bmsgRm91bmQgY2tpZD0lLjRzIGZjY1R5cGU9JS40cyBja3NpemU9JTA4bFggXG4iLAogCQkJCShMUFNUUikmbW1ja0luZm8uY2tpZCwgKExQU1RSKSZtbWNrSW5mby5mY2NUeXBlLAogCQkJCW1tY2tJbmZvLmNrc2l6ZSk7Ci0JCWlmIChtbWlvUmVhZChNQ0lXYXZEZXZbd0RldklEXS5oRmlsZSwgKEhQU1RSKSBscFdhdmVGb3JtYXQsCisJCWlmIChtbWlvUmVhZChNQ0lXYXZEZXZbaW5kZXhdLmhGaWxlLCAoSFBTVFIpIGxwV2F2ZUZvcm1hdCwKIAkJICAgIChsb25nKSBzaXplb2YoUENNV0FWRUZPUk1BVCkpICE9IChsb25nKSBzaXplb2YoUENNV0FWRUZPUk1BVCkpIHsKIAkJCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJCQl9CiAJCW1tY2tJbmZvLmNraWQgPSBtbWlvRk9VUkNDKCdkJywgJ2EnLCAndCcsICdhJyk7Ci0JCWlmIChtbWlvRGVzY2VuZChNQ0lXYXZEZXZbd0RldklEXS5oRmlsZSwgJm1tY2tJbmZvLCAmY2tNYWluUklGRiwgTU1JT19GSU5EQ0hVTkspICE9IDApIHsKKwkJaWYgKG1taW9EZXNjZW5kKE1DSVdhdkRldltpbmRleF0uaEZpbGUsICZtbWNrSW5mbywgJmNrTWFpblJJRkYsIE1NSU9fRklORENIVU5LKSAhPSAwKSB7CiAJCQlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCQkJfQogCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLApAQCAtMjA5LDggKzIxMSw4IEBACiAJbHBEZXNjLT5scEZvcm1hdCA9IChMUFdBVkVGT1JNQVQpIFVTRVJfSEVBUF9MSU5fQUREUihoRm9ybWF0KTsKIAltZW1jcHkobHBEZXNjLT5scEZvcm1hdCwgbHBXYXZlRm9ybWF0LCBzaXplb2YoUENNV0FWRUZPUk1BVCkpOwogCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX1NFR19BRERSKGhEZXNjKTsKLQlkd1JldCA9IHdvZE1lc3NhZ2UoMCwgV09ETV9PUEVOLCAwLCAoRFdPUkQpbHBEZXNjLCBDQUxMQkFDS19OVUxMKTsKLQlkd1JldCA9IHdpZE1lc3NhZ2UoMCwgV0lETV9PUEVOLCAwLCAoRFdPUkQpbHBEZXNjLCBDQUxMQkFDS19OVUxMKTsKKwlkd1JldCA9IHdvZE1lc3NhZ2Uod0RldklELCBXT0RNX09QRU4sIDAsIChEV09SRClscERlc2MsIENBTExCQUNLX05VTEwpOworCWR3UmV0ID0gd2lkTWVzc2FnZSh3RGV2SUQsIFdJRE1fT1BFTiwgMCwgKERXT1JEKWxwRGVzYywgQ0FMTEJBQ0tfTlVMTCk7CiAJVVNFUl9IRUFQX0ZSRUUoaEZvcm1hdCk7CiAJVVNFUl9IRUFQX0ZSRUUoaERlc2MpOwogCXJldHVybiAwOwpAQCAtMjE5LDIwICsyMjEsMjEgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJV0FWRV9tY2lDbG9zZQkJW2ludGVybmFsXQogKi8KLXN0YXRpYyBEV09SRCBXQVZFX21jaUNsb3NlKFVJTlQgd0RldklELCBEV09SRCBkd1BhcmFtLCBMUE1DSV9HRU5FUklDX1BBUk1TIGxwUGFybXMpCitzdGF0aWMgRFdPUkQgV0FWRV9tY2lDbG9zZShVSU5UMTYgd0RldklELCBEV09SRCBkd1BhcmFtLCBMUE1DSV9HRU5FUklDX1BBUk1TIGxwUGFybXMpCiB7CisJaW50IGluZGV4ID0gTU1TWVNURU1fRGV2SURUb0luZGV4KHdEZXZJRCk7CiAJRFdPUkQJCWR3UmV0OwogCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCiAJCSJXQVZFX21jaUNsb3NlKCV1LCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd1BhcmFtLCBscFBhcm1zKTsKLQlNQ0lXYXZEZXZbd0RldklEXS5uVXNlQ291bnQtLTsKLQlpZiAoTUNJV2F2RGV2W3dEZXZJRF0ublVzZUNvdW50ID09IDApIHsKLQkJaWYgKE1DSVdhdkRldlt3RGV2SURdLmhGaWxlICE9IDApIHsKLQkJCW1taW9DbG9zZShNQ0lXYXZEZXZbd0RldklEXS5oRmlsZSwgMCk7Ci0JCQlNQ0lXYXZEZXZbd0RldklEXS5oRmlsZSA9IDA7CisJTUNJV2F2RGV2W2luZGV4XS5uVXNlQ291bnQtLTsKKwlpZiAoTUNJV2F2RGV2W2luZGV4XS5uVXNlQ291bnQgPT0gMCkgeworCQlpZiAoTUNJV2F2RGV2W2luZGV4XS5oRmlsZSAhPSAwKSB7CisJCQltbWlvQ2xvc2UoTUNJV2F2RGV2W2luZGV4XS5oRmlsZSwgMCk7CisJCQlNQ0lXYXZEZXZbaW5kZXhdLmhGaWxlID0gMDsKIAkJCX0KLQkJZHdSZXQgPSB3b2RNZXNzYWdlKDAsIFdPRE1fQ0xPU0UsIDAsIDBMLCAwTCk7CisJCWR3UmV0ID0gd29kTWVzc2FnZSh3RGV2SUQsIFdPRE1fQ0xPU0UsIDAsIDBMLCAwTCk7CiAJCWlmIChkd1JldCAhPSBNTVNZU0VSUl9OT0VSUk9SKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwotCQlkd1JldCA9IHdpZE1lc3NhZ2UoMCwgV0lETV9DTE9TRSwgMCwgMEwsIDBMKTsKKwkJZHdSZXQgPSB3aWRNZXNzYWdlKHdEZXZJRCwgV0lETV9DTE9TRSwgMCwgMEwsIDBMKTsKIAkJaWYgKGR3UmV0ICE9IE1NU1lTRVJSX05PRVJST1IpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJCX0KIAlyZXR1cm4gMDsKQEAgLTI0Miw4ICsyNDUsOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlXQVZFX21jaVBsYXkJCVtpbnRlcm5hbF0KICovCi1zdGF0aWMgRFdPUkQgV0FWRV9tY2lQbGF5KFVJTlQgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9QTEFZX1BBUk1TIGxwUGFybXMpCitzdGF0aWMgRFdPUkQgV0FWRV9tY2lQbGF5KFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX1BMQVlfUEFSTVMgbHBQYXJtcykKIHsKKwlpbnQgaW5kZXggPSBNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKTsKIAlpbnQJCQkJc3RhcnQsIGVuZDsKIAlMT05HCQkJYnVmc2l6ZSwgY291bnQ7CiAJSEdMT0JBTDE2CQloRGF0YTsKQEAgLTI1Myw5ICsyNTcsOSBAQAogCURXT1JECQkJZHdSZXQ7CiAJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwKIAkJICJXQVZFX21jaVBsYXkoJXUsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwotCWlmIChNQ0lXYXZEZXZbd0RldklEXS5oRmlsZSA9PSAwKSB7Ci0gICAgICAgIGRwcmludGZfbWNpd2F2ZShzdGRkZWIsIldBVkVfbWNpUGxheSAvLyBjYW4ndCBmaW5kIGZpbGU9JyVzJyAhXG4iLAotCQkJCU1DSVdhdkRldlt3RGV2SURdLm9wZW5QYXJtcy5scHN0ckVsZW1lbnROYW1lKTsKKwlpZiAoTUNJV2F2RGV2W2luZGV4XS5oRmlsZSA9PSAwKSB7CisgICAgICAgIGRwcmludGZfbWNpd2F2ZShzdGRkZWIsIldBVkVfbWNpUGxheSAvLyBjYW4ndCBmaW5kIGZpbGU9JyUwOGx4JyAhXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgTUNJV2F2RGV2W2luZGV4XS5vcGVuUGFybXMubHBzdHJFbGVtZW50TmFtZSk7CiAJCXJldHVybiBNQ0lFUlJfRklMRV9OT1RfRk9VTkQ7CiAJCX0KIAlzdGFydCA9IDE7IAkJZW5kID0gOTk5OTk7CkBAIC0yODYsNyArMjkwLDcgQEAKIAkJfQogI2VuZGlmCiAJYnVmc2l6ZSA9IDY0MDAwOwotCWxwV2F2ZUhkciA9ICZNQ0lXYXZEZXZbd0RldklEXS5XYXZlSGRyOworCWxwV2F2ZUhkciA9ICZNQ0lXYXZEZXZbaW5kZXhdLldhdmVIZHI7CiAJaERhdGEgPSBHbG9iYWxBbGxvYzE2KEdNRU1fTU9WRUFCTEUsIGJ1ZnNpemUpOwogCWxwV2F2ZUhkci0+bHBEYXRhID0gKExQU1RSKSBXSU4xNl9HbG9iYWxMb2NrMTYoaERhdGEpOwogCWxwV2F2ZUhkci0+ZHdVc2VyID0gMEw7CkBAIC0yOTYsOSArMzAwLDkgQEAKIAlscDE2V2F2ZUhkciA9IChMUFdBVkVIRFIpIFVTRVJfSEVBUF9TRUdfQUREUihoV2F2ZUhkcik7CiAJbWVtY3B5KFBUUl9TRUdfVE9fTElOKGxwMTZXYXZlSGRyKSwgbHBXYXZlSGRyLCBzaXplb2YoV0FWRUhEUikpOwogCWxwV2F2ZUhkciA9IFBUUl9TRUdfVE9fTElOKGxwMTZXYXZlSGRyKTsKLQlkd1JldCA9IHdvZE1lc3NhZ2UoMCwgV09ETV9QUkVQQVJFLCAwLCAoRFdPUkQpbHAxNldhdmVIZHIsIHNpemVvZihXQVZFSERSKSk7CisJZHdSZXQgPSB3b2RNZXNzYWdlKHdEZXZJRCwgV09ETV9QUkVQQVJFLCAwLCAoRFdPUkQpbHAxNldhdmVIZHIsIHNpemVvZihXQVZFSERSKSk7CiAJd2hpbGUoVFJVRSkgewotCQljb3VudCA9IG1taW9SZWFkKE1DSVdhdkRldlt3RGV2SURdLmhGaWxlLCAKKwkJY291bnQgPSBtbWlvUmVhZChNQ0lXYXZEZXZbaW5kZXhdLmhGaWxlLCAKIAkJCVBUUl9TRUdfVE9fTElOKGxwV2F2ZUhkci0+bHBEYXRhKSwgYnVmc2l6ZSk7CiAJCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIldBVkVfbWNpUGxheSAvLyBtbWlvUmVhZCBidWZzaXplPSVsZCBjb3VudD0lbGRcbiIsIGJ1ZnNpemUsIGNvdW50KTsKIAkJaWYgKGNvdW50IDwgMSkgYnJlYWs7CkBAIC0zMDYsOSArMzEwLDkgQEAKIC8qCQlscFdhdmVIZHItPmR3Qnl0ZXNSZWNvcmRlZCA9IGNvdW50OyAqLwogCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaVBsYXkgLy8gYmVmb3JlIFdPRE1fV1JJVEUgbHBXYXZlSGRyPSVwIGR3QnVmZmVyTGVuZ3RoPSVsdSBkd0J5dGVzUmVjb3JkZWQ9JWx1XG4iLAogCQkJCWxwV2F2ZUhkciwgbHBXYXZlSGRyLT5kd0J1ZmZlckxlbmd0aCwgbHBXYXZlSGRyLT5kd0J5dGVzUmVjb3JkZWQpOwotCQlkd1JldCA9IHdvZE1lc3NhZ2UoMCwgV09ETV9XUklURSwgMCwgKERXT1JEKWxwMTZXYXZlSGRyLCBzaXplb2YoV0FWRUhEUikpOworCQlkd1JldCA9IHdvZE1lc3NhZ2Uod0RldklELCBXT0RNX1dSSVRFLCAwLCAoRFdPUkQpbHAxNldhdmVIZHIsIHNpemVvZihXQVZFSERSKSk7CiAJCX0KLQlkd1JldCA9IHdvZE1lc3NhZ2UoMCwgV09ETV9VTlBSRVBBUkUsIDAsIChEV09SRClscDE2V2F2ZUhkciwgc2l6ZW9mKFdBVkVIRFIpKTsKKwlkd1JldCA9IHdvZE1lc3NhZ2Uod0RldklELCBXT0RNX1VOUFJFUEFSRSwgMCwgKERXT1JEKWxwMTZXYXZlSGRyLCBzaXplb2YoV0FWRUhEUikpOwogCWlmIChscFdhdmVIZHItPmxwRGF0YSAhPSBOVUxMKSB7CiAJCUdsb2JhbFVubG9jazE2KGhEYXRhKTsKIAkJR2xvYmFsRnJlZTE2KGhEYXRhKTsKQEAgLTMxOCw3ICszMjIsNyBAQAogCWlmIChkd0ZsYWdzICYgTUNJX05PVElGWSkgewogCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaVBsYXkgLy8gTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIGxwUGFybXMtPmR3Q2FsbGJhY2spOwogCQltY2lEcml2ZXJOb3RpZnkoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAotCQkJTUNJV2F2RGV2W3dEZXZJRF0ud05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOworCQkJTUNJV2F2RGV2W2luZGV4XS53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CiAJCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTMyNyw4ICszMzEsOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlXQVZFX21jaVJlY29yZAkJCVtpbnRlcm5hbF0KICovCi1zdGF0aWMgRFdPUkQgV0FWRV9tY2lSZWNvcmQoVUlOVCB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX1JFQ09SRF9QQVJNUyBscFBhcm1zKQorc3RhdGljIERXT1JEIFdBVkVfbWNpUmVjb3JkKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX1JFQ09SRF9QQVJNUyBscFBhcm1zKQogeworCWludCBpbmRleCA9IE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpOwogCWludAkJCQlzdGFydCwgZW5kOwogCUxPTkcJCQlidWZzaXplOwogCUhHTE9CQUwxNgkJaERhdGE7CkBAIC0zMzksOSArMzQ0LDkgQEAKIAogCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCiAJCSJXQVZFX21jaVJlY29yZCgldSwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7Ci0JaWYgKE1DSVdhdkRldlt3RGV2SURdLmhGaWxlID09IDApIHsKLQkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiV0FWRV9tY2lSZWNvcmQgLy8gY2FuJ3QgZmluZCBmaWxlPSclcycgIVxuIiwgCi0JCQkJTUNJV2F2RGV2W3dEZXZJRF0ub3BlblBhcm1zLmxwc3RyRWxlbWVudE5hbWUpOworCWlmIChNQ0lXYXZEZXZbaW5kZXhdLmhGaWxlID09IDApIHsKKwkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiV0FWRV9tY2lSZWNvcmQgLy8gY2FuJ3QgZmluZCBmaWxlPSclMDhseCcgIVxuIiwgCisJCQkJTUNJV2F2RGV2W2luZGV4XS5vcGVuUGFybXMubHBzdHJFbGVtZW50TmFtZSk7CiAJCXJldHVybiBNQ0lFUlJfRklMRV9OT1RfRk9VTkQ7CiAJCX0KIAlzdGFydCA9IDE7IAkJZW5kID0gOTk5OTk7CkBAIC0zNTUsNyArMzYwLDcgQEAKIAkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiV0FWRV9tY2lSZWNvcmQgLy8gTUNJX1RPPSVkIFxuIiwgZW5kKTsKIAkJfQogCWJ1ZnNpemUgPSA2NDAwMDsKLQlscFdhdmVIZHIgPSAmTUNJV2F2RGV2W3dEZXZJRF0uV2F2ZUhkcjsKKwlscFdhdmVIZHIgPSAmTUNJV2F2RGV2W2luZGV4XS5XYXZlSGRyOwogCWhEYXRhID0gR2xvYmFsQWxsb2MxNihHTUVNX01PVkVBQkxFLCBidWZzaXplKTsKIAlscFdhdmVIZHItPmxwRGF0YSA9IChMUFNUUikgV0lOMTZfR2xvYmFsTG9jazE2KGhEYXRhKTsKIAlscFdhdmVIZHItPmR3QnVmZmVyTGVuZ3RoID0gYnVmc2l6ZTsKQEAgLTM2NiwxOCArMzcxLDE4IEBACiAJbHAxNldhdmVIZHIgPSAoTFBXQVZFSERSKSBVU0VSX0hFQVBfU0VHX0FERFIoaFdhdmVIZHIpOwogCW1lbWNweShQVFJfU0VHX1RPX0xJTihscDE2V2F2ZUhkciksIGxwV2F2ZUhkciwgc2l6ZW9mKFdBVkVIRFIpKTsKIAlscFdhdmVIZHIgPSBQVFJfU0VHX1RPX0xJTihscDE2V2F2ZUhkcik7Ci0JZHdSZXQgPSB3aWRNZXNzYWdlKDAsIFdJRE1fUFJFUEFSRSwgMCwgKERXT1JEKWxwMTZXYXZlSGRyLCBzaXplb2YoV0FWRUhEUikpOworCWR3UmV0ID0gd2lkTWVzc2FnZSh3RGV2SUQsIFdJRE1fUFJFUEFSRSwgMCwgKERXT1JEKWxwMTZXYXZlSGRyLCBzaXplb2YoV0FWRUhEUikpOwogICAgIGRwcmludGZfbWNpd2F2ZShzdGRkZWIsIldBVkVfbWNpUmVjb3JkIC8vIGFmdGVyIFdJRE1fUFJFUEFSRSBcbiIpOwogCXdoaWxlKFRSVUUpIHsKIAkJbHBXYXZlSGRyLT5kd0J5dGVzUmVjb3JkZWQgPSAwOwotCQlkd1JldCA9IHdpZE1lc3NhZ2UoMCwgV0lETV9TVEFSVCwgMCwgMEwsIDBMKTsKKwkJZHdSZXQgPSB3aWRNZXNzYWdlKHdEZXZJRCwgV0lETV9TVEFSVCwgMCwgMEwsIDBMKTsKIAkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwKICAgICAgICAgICAgICAgICAgICAgIldBVkVfbWNpUmVjb3JkIC8vIGFmdGVyIFdJRE1fU1RBUlQgbHBXYXZlSGRyPSVwIGR3Qnl0ZXNSZWNvcmRlZD0lbHVcbiIsCiAJCQkJCWxwV2F2ZUhkciwgbHBXYXZlSGRyLT5kd0J5dGVzUmVjb3JkZWQpOwogCQlpZiAobHBXYXZlSGRyLT5kd0J5dGVzUmVjb3JkZWQgPT0gMCkgYnJlYWs7CiAJCX0KIAlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaVJlY29yZCAvLyBiZWZvcmUgV0lETV9VTlBSRVBBUkUgXG4iKTsKLQlkd1JldCA9IHdpZE1lc3NhZ2UoMCwgV0lETV9VTlBSRVBBUkUsIDAsIChEV09SRClscDE2V2F2ZUhkciwgc2l6ZW9mKFdBVkVIRFIpKTsKKwlkd1JldCA9IHdpZE1lc3NhZ2Uod0RldklELCBXSURNX1VOUFJFUEFSRSwgMCwgKERXT1JEKWxwMTZXYXZlSGRyLCBzaXplb2YoV0FWRUhEUikpOwogCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIldBVkVfbWNpUmVjb3JkIC8vIGFmdGVyIFdJRE1fVU5QUkVQQVJFIFxuIik7CiAJaWYgKGxwV2F2ZUhkci0+bHBEYXRhICE9IE5VTEwpIHsKIAkJR2xvYmFsVW5sb2NrMTYoaERhdGEpOwpAQCAtMzg4LDcgKzM5Myw3IEBACiAJaWYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSB7CiAJICBkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaVJlY29yZCAvLyBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdDYWxsYmFjayk7CiAJCW1jaURyaXZlck5vdGlmeSgoSFdORDE2KUxPV09SRChscFBhcm1zLT5kd0NhbGxiYWNrKSwgCi0JCQlNQ0lXYXZEZXZbd0RldklEXS53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CisJCQlNQ0lXYXZEZXZbaW5kZXhdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKIAkJfQogCXJldHVybiAwOwogfQpAQCAtMzk3LDcgKzQwMiw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCVdBVkVfbWNpU3RvcAkJCVtpbnRlcm5hbF0KICovCi1zdGF0aWMgRFdPUkQgV0FWRV9tY2lTdG9wKFVJTlQgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9HRU5FUklDX1BBUk1TIGxwUGFybXMpCitzdGF0aWMgRFdPUkQgV0FWRV9tY2lTdG9wKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcykKIHsKIAlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAogCQkiV0FWRV9tY2lTdG9wKCV1LCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKQEAgLTQwOSw3ICs0MTQsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlXQVZFX21jaVBhdXNlCQkJW2ludGVybmFsXQogKi8KLXN0YXRpYyBEV09SRCBXQVZFX21jaVBhdXNlKFVJTlQgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9HRU5FUklDX1BBUk1TIGxwUGFybXMpCitzdGF0aWMgRFdPUkQgV0FWRV9tY2lQYXVzZShVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9HRU5FUklDX1BBUk1TIGxwUGFybXMpCiB7CiAJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwKIAkJIldBVkVfbWNpUGF1c2UoJXUsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwpAQCAtNDIxLDcgKzQyNiw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCVdBVkVfbWNpUmVzdW1lCQkJW2ludGVybmFsXQogKi8KLXN0YXRpYyBEV09SRCBXQVZFX21jaVJlc3VtZShVSU5UIHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfR0VORVJJQ19QQVJNUyBscFBhcm1zKQorc3RhdGljIERXT1JEIFdBVkVfbWNpUmVzdW1lKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcykKIHsKIAlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAogCQkiV0FWRV9tY2lSZXN1bWUoJXUsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwpAQCAtNDMzLDcgKzQzOCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCVdBVkVfbWNpU2V0CQkJW2ludGVybmFsXQogKi8KLXN0YXRpYyBEV09SRCBXQVZFX21jaVNldChVSU5UIHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfU0VUX1BBUk1TIGxwUGFybXMpCitzdGF0aWMgRFdPUkQgV0FWRV9tY2lTZXQoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfU0VUX1BBUk1TIGxwUGFybXMpCiB7CiAJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwKIAkJIldBVkVfbWNpU2V0KCV1LCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKQEAgLTUwMiw4ICs1MDcsOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlXQVZFX21jaVN0YXR1cwkJW2ludGVybmFsXQogKi8KLXN0YXRpYyBEV09SRCBXQVZFX21jaVN0YXR1cyhVSU5UIHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfU1RBVFVTX1BBUk1TIGxwUGFybXMpCitzdGF0aWMgRFdPUkQgV0FWRV9tY2lTdGF0dXMoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfU1RBVFVTX1BBUk1TIGxwUGFybXMpCiB7CisJaW50IGluZGV4ID0gTU1TWVNURU1fRGV2SURUb0luZGV4KHdEZXZJRCk7CiAJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwKIAkJIldBVkVfbWNpU3RhdHVzKCV1LCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwpAQCAtNTkxLDcgKzU5Nyw3IEBACiAJaWYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSB7CiAJCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIldBVkVfbWNpU3RhdHVzIC8vIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCBscFBhcm1zLT5kd0NhbGxiYWNrKTsKIAkJbWNpRHJpdmVyTm90aWZ5KChIV05EMTYpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKLQkJCU1DSVdhdkRldlt3RGV2SURdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKKwkJCU1DSVdhdkRldltpbmRleF0ud05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOwogCQl9CiAgCXJldHVybiAwOwogfQpAQCAtNTk5LDcgKzYwNSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCVdBVkVfbWNpR2V0RGV2Q2FwcwkJW2ludGVybmFsXQogKi8KLXN0YXRpYyBEV09SRCBXQVZFX21jaUdldERldkNhcHMoVUlOVCB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIAorc3RhdGljIERXT1JEIFdBVkVfbWNpR2V0RGV2Q2FwcyhVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCAKIAkJCQkJTFBNQ0lfR0VUREVWQ0FQU19QQVJNUyBscFBhcm1zKQogewogCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCkBAIC02NTAsOCArNjU2LDkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJV0FWRV9tY2lJbmZvCQkJW2ludGVybmFsXQogKi8KLXN0YXRpYyBEV09SRCBXQVZFX21jaUluZm8oVUlOVCB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0lORk9fUEFSTVMgbHBQYXJtcykKK3N0YXRpYyBEV09SRCBXQVZFX21jaUluZm8oVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfSU5GT19QQVJNUyBscFBhcm1zKQogeworCWludCBpbmRleCA9IE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpOwogCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCiAJCSJXQVZFX21jaUluZm8oJXUsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CkBAIC02NjIsNyArNjY5LDcgQEAKIAkJCWJyZWFrOwogCQljYXNlIE1DSV9JTkZPX0ZJTEU6CiAJCQlscFBhcm1zLT5scHN0clJldHVybiA9IAotCQkJCShMUFNUUilNQ0lXYXZEZXZbd0RldklEXS5vcGVuUGFybXMubHBzdHJFbGVtZW50TmFtZTsKKwkJCQkoTFBTVFIpTUNJV2F2RGV2W2luZGV4XS5vcGVuUGFybXMubHBzdHJFbGVtZW50TmFtZTsKIAkJCWJyZWFrOwogCQljYXNlIE1DSV9XQVZFX0lOUFVUOgogCQkJbHBQYXJtcy0+bHBzdHJSZXR1cm4gPSAiTGludXggU291bmQgU3lzdGVtIDAuNSI7CkBAIC03NTIsNiArNzU5LDcgQEAKICovCiBzdGF0aWMgRFdPUkQgd29kT3BlbihXT1JEIHdEZXZJRCwgTFBXQVZFT1BFTkRFU0MgbHBEZXNjLCBEV09SRCBkd0ZsYWdzKQogeworCWludCBpbmRleCA9IE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpOwogCWludCAJCWF1ZGlvOwogCWludAkJCWFidWZfc2l6ZTsKIAlpbnQJCQlzbXBscmF0ZTsKQEAgLTc2OSw3ICs3NzcsNyBAQAogCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd29kT3BlbicgLy8gTUFYX1dBVk9VVERSViByZWFjaGVkICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfQUxMT0NBVEVEOwogCQl9Ci0JV091dERldlt3RGV2SURdLnVuaXhkZXYgPSAwOworCVdPdXREZXZbaW5kZXhdLnVuaXhkZXYgPSAwOwogCWF1ZGlvID0gb3BlbiAoU09VTkRfREVWLCBPX1dST05MWSwgMCk7CiAJaWYgKGF1ZGlvID09IC0xKSB7CiAJCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIkxpbnV4ICd3b2RPcGVuJyAvLyBjYW4ndCBvcGVuICFcbiIpOwpAQCAtNzgzLDggKzc5MSw4IEBACiAJCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd29kT3BlbicgLy8gU05EQ1RMX0RTUF9HRVRCTEtTSVpFIEludmFsaWQgYnVmc2l6ZSAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJCX0KLQlXT3V0RGV2W3dEZXZJRF0ud0ZsYWdzID0gSElXT1JEKGR3RmxhZ3MgJiBDQUxMQkFDS19UWVBFTUFTSyk7Ci0Jc3dpdGNoKFdPdXREZXZbd0RldklEXS53RmxhZ3MpIHsKKwlXT3V0RGV2W2luZGV4XS53RmxhZ3MgPSBISVdPUkQoZHdGbGFncyAmIENBTExCQUNLX1RZUEVNQVNLKTsKKwlzd2l0Y2goV091dERldltpbmRleF0ud0ZsYWdzKSB7CiAJCWNhc2UgRENCX05VTEw6CiAJCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAkiTGludXggJ3dvZE9wZW4nIC8vIENBTExCQUNLX05VTEwgIVxuIik7CiAJCQlicmVhazsKQEAgLTc5OCwxMSArODA2LDExIEBACiAJCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAkiTGludXggJ3dvZE9wZW4nIC8vIENBTExCQUNLX0ZVTkNUSU9OICFcbiIpOwogCQkJYnJlYWs7CiAJCX0KLQlXT3V0RGV2W3dEZXZJRF0ubHBRdWV1ZUhkciA9IE5VTEw7Ci0JV091dERldlt3RGV2SURdLnVuaXhkZXYgPSBhdWRpbzsKLQlXT3V0RGV2W3dEZXZJRF0uZHdUb3RhbFBsYXllZCA9IDA7Ci0JV091dERldlt3RGV2SURdLmJ1ZnNpemUgPSBhYnVmX3NpemU7Ci0JbWVtY3B5KCZXT3V0RGV2W3dEZXZJRF0ud2F2ZURlc2MsIGxwRGVzYywgc2l6ZW9mKFdBVkVPUEVOREVTQykpOworCVdPdXREZXZbaW5kZXhdLmxwUXVldWVIZHIgPSBOVUxMOworCVdPdXREZXZbaW5kZXhdLnVuaXhkZXYgPSBhdWRpbzsKKwlXT3V0RGV2W2luZGV4XS5kd1RvdGFsUGxheWVkID0gMDsKKwlXT3V0RGV2W2luZGV4XS5idWZzaXplID0gYWJ1Zl9zaXplOworCW1lbWNweSgmV091dERldltpbmRleF0ud2F2ZURlc2MsIGxwRGVzYywgc2l6ZW9mKFdBVkVPUEVOREVTQykpOwogLyoJbHBGb3JtYXQgPSAoTFBXQVZFRk9STUFUKSBQVFJfU0VHX1RPX0xJTihscERlc2MtPmxwRm9ybWF0KTsgKi8KIAlscEZvcm1hdCA9IGxwRGVzYy0+bHBGb3JtYXQ7CiAJaWYgKGxwRm9ybWF0LT53Rm9ybWF0VGFnICE9IFdBVkVfRk9STUFUX1BDTSkgewpAQCAtODE0LDMxICs4MjIsMzEgQEAKIAkJCQlscEZvcm1hdC0+blNhbXBsZXNQZXJTZWMpOwogCQlyZXR1cm4gV0FWRVJSX0JBREZPUk1BVDsKIAkJfQotCW1lbWNweSgmV091dERldlt3RGV2SURdLkZvcm1hdCwgbHBGb3JtYXQsIHNpemVvZihQQ01XQVZFRk9STUFUKSk7Ci0JaWYgKFdPdXREZXZbd0RldklEXS5Gb3JtYXQud2YubkNoYW5uZWxzID09IDApIHJldHVybiBXQVZFUlJfQkFERk9STUFUOwotCWlmIChXT3V0RGV2W3dEZXZJRF0uRm9ybWF0LndmLm5TYW1wbGVzUGVyU2VjID09IDApIHJldHVybiBXQVZFUlJfQkFERk9STUFUOworCW1lbWNweSgmV091dERldltpbmRleF0uRm9ybWF0LCBscEZvcm1hdCwgc2l6ZW9mKFBDTVdBVkVGT1JNQVQpKTsKKwlpZiAoV091dERldltpbmRleF0uRm9ybWF0LndmLm5DaGFubmVscyA9PSAwKSByZXR1cm4gV0FWRVJSX0JBREZPUk1BVDsKKwlpZiAoV091dERldltpbmRleF0uRm9ybWF0LndmLm5TYW1wbGVzUGVyU2VjID09IDApIHJldHVybiBXQVZFUlJfQkFERk9STUFUOwogCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIkxpbnV4ICd3b2RPcGVuJyAvLyB3Qml0c1BlclNhbXBsZT0ldSAhXG4iLAotCQkJCVdPdXREZXZbd0RldklEXS5Gb3JtYXQud0JpdHNQZXJTYW1wbGUpOwotCWlmIChXT3V0RGV2W3dEZXZJRF0uRm9ybWF0LndCaXRzUGVyU2FtcGxlID09IDApIHsKLQkJV091dERldlt3RGV2SURdLkZvcm1hdC53Qml0c1BlclNhbXBsZSA9IDggKgotCQkoV091dERldlt3RGV2SURdLkZvcm1hdC53Zi5uQXZnQnl0ZXNQZXJTZWMgLwotCQlXT3V0RGV2W3dEZXZJRF0uRm9ybWF0LndmLm5TYW1wbGVzUGVyU2VjKSAvCi0JCVdPdXREZXZbd0RldklEXS5Gb3JtYXQud2YubkNoYW5uZWxzOworCQkJCVdPdXREZXZbaW5kZXhdLkZvcm1hdC53Qml0c1BlclNhbXBsZSk7CisJaWYgKFdPdXREZXZbaW5kZXhdLkZvcm1hdC53Qml0c1BlclNhbXBsZSA9PSAwKSB7CisJCVdPdXREZXZbaW5kZXhdLkZvcm1hdC53Qml0c1BlclNhbXBsZSA9IDggKgorCQkoV091dERldltpbmRleF0uRm9ybWF0LndmLm5BdmdCeXRlc1BlclNlYyAvCisJCVdPdXREZXZbaW5kZXhdLkZvcm1hdC53Zi5uU2FtcGxlc1BlclNlYykgLworCQlXT3V0RGV2W2luZGV4XS5Gb3JtYXQud2YubkNoYW5uZWxzOwogCQl9Ci0Jc2FtcGxlc2l6ZSA9IFdPdXREZXZbd0RldklEXS5Gb3JtYXQud0JpdHNQZXJTYW1wbGU7Ci0Jc21wbHJhdGUgPSBXT3V0RGV2W3dEZXZJRF0uRm9ybWF0LndmLm5TYW1wbGVzUGVyU2VjOwotCWRzcF9zdGVyZW8gPSAoV091dERldlt3RGV2SURdLkZvcm1hdC53Zi5uQ2hhbm5lbHMgPiAxKSA/IFRSVUUgOiBGQUxTRTsKKwlzYW1wbGVzaXplID0gV091dERldltpbmRleF0uRm9ybWF0LndCaXRzUGVyU2FtcGxlOworCXNtcGxyYXRlID0gV091dERldltpbmRleF0uRm9ybWF0LndmLm5TYW1wbGVzUGVyU2VjOworCWRzcF9zdGVyZW8gPSAoV091dERldltpbmRleF0uRm9ybWF0LndmLm5DaGFubmVscyA+IDEpID8gVFJVRSA6IEZBTFNFOwogCUlPQ1RMKGF1ZGlvLCBTTkRDVExfRFNQX1NQRUVELCBzbXBscmF0ZSk7CiAJSU9DVEwoYXVkaW8sIFNORENUTF9EU1BfU0FNUExFU0laRSwgc2FtcGxlc2l6ZSk7CiAJSU9DVEwoYXVkaW8sIFNORENUTF9EU1BfU1RFUkVPLCBkc3Bfc3RlcmVvKTsKIAlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd29kT3BlbicgLy8gd0JpdHNQZXJTYW1wbGU9JXUgIVxuIiwKLQkJCQlXT3V0RGV2W3dEZXZJRF0uRm9ybWF0LndCaXRzUGVyU2FtcGxlKTsKKwkJCQlXT3V0RGV2W2luZGV4XS5Gb3JtYXQud0JpdHNQZXJTYW1wbGUpOwogCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIkxpbnV4ICd3b2RPcGVuJyAvLyBuQXZnQnl0ZXNQZXJTZWM9JWx1ICFcbiIsCi0JCQkJV091dERldlt3RGV2SURdLkZvcm1hdC53Zi5uQXZnQnl0ZXNQZXJTZWMpOworCQkJCVdPdXREZXZbaW5kZXhdLkZvcm1hdC53Zi5uQXZnQnl0ZXNQZXJTZWMpOwogCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIkxpbnV4ICd3b2RPcGVuJyAvLyBuU2FtcGxlc1BlclNlYz0lbHUgIVxuIiwKLQkJCQlXT3V0RGV2W3dEZXZJRF0uRm9ybWF0LndmLm5TYW1wbGVzUGVyU2VjKTsKKwkJCQlXT3V0RGV2W2luZGV4XS5Gb3JtYXQud2YublNhbXBsZXNQZXJTZWMpOwogCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIkxpbnV4ICd3b2RPcGVuJyAvLyBuQ2hhbm5lbHM9JXUgIVxuIiwKLQkJCQlXT3V0RGV2W3dEZXZJRF0uRm9ybWF0LndmLm5DaGFubmVscyk7CisJCQkJV091dERldltpbmRleF0uRm9ybWF0LndmLm5DaGFubmVscyk7CiAJaWYgKFdBVkVfTm90aWZ5Q2xpZW50KHdEZXZJRCwgV09NX09QRU4sIDBMLCAwTCkgIT0gTU1TWVNFUlJfTk9FUlJPUikgewogCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd29kT3BlbicgLy8gY2FuJ3Qgbm90aWZ5IGNsaWVudCAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07CkBAIC04NTEsMTUgKzg1OSwxNiBAQAogKi8KIHN0YXRpYyBEV09SRCB3b2RDbG9zZShXT1JEIHdEZXZJRCkKIHsKKwlpbnQgaW5kZXggPSBNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKTsKIAlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJ3b2RDbG9zZSgldSk7XG4iLCB3RGV2SUQpOwotCWlmIChXT3V0RGV2W3dEZXZJRF0udW5peGRldiA9PSAwKSB7CisJaWYgKFdPdXREZXZbaW5kZXhdLnVuaXhkZXYgPT0gMCkgewogCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd29kQ2xvc2UnIC8vIGNhbid0IGNsb3NlICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAkJfQotCWNsb3NlKFdPdXREZXZbd0RldklEXS51bml4ZGV2KTsKLQlXT3V0RGV2W3dEZXZJRF0udW5peGRldiA9IDA7Ci0JV091dERldlt3RGV2SURdLmJ1ZnNpemUgPSAwOwotCVdPdXREZXZbd0RldklEXS5scFF1ZXVlSGRyID0gTlVMTDsKKwljbG9zZShXT3V0RGV2W2luZGV4XS51bml4ZGV2KTsKKwlXT3V0RGV2W2luZGV4XS51bml4ZGV2ID0gMDsKKwlXT3V0RGV2W2luZGV4XS5idWZzaXplID0gMDsKKwlXT3V0RGV2W2luZGV4XS5scFF1ZXVlSGRyID0gTlVMTDsKIAlpZiAoV0FWRV9Ob3RpZnlDbGllbnQod0RldklELCBXT01fQ0xPU0UsIDBMLCAwTCkgIT0gTU1TWVNFUlJfTk9FUlJPUikgewogCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd29kQ2xvc2UnIC8vIGNhbid0IG5vdGlmeSBjbGllbnQgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOwpAQCAtODcyLDEwICs4ODEsMTEgQEAKICovCiBzdGF0aWMgRFdPUkQgd29kV3JpdGUoV09SRCB3RGV2SUQsIExQV0FWRUhEUiBscFdhdmVIZHIsIERXT1JEIGR3U2l6ZSkKIHsKKwlpbnQgaW5kZXggPSBNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKTsKIAlpbnQJCWNvdW50OwogCUxQU1RSCWxwRGF0YTsKIAlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJ3b2RXcml0ZSgldSwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBXYXZlSGRyLCBkd1NpemUpOwotCWlmIChXT3V0RGV2W3dEZXZJRF0udW5peGRldiA9PSAwKSB7CisJaWYgKFdPdXREZXZbaW5kZXhdLnVuaXhkZXYgPT0gMCkgewogICAgICAgICBkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd29kV3JpdGUnIC8vIGNhbid0IHBsYXkgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCQl9CkBAIC04ODcsMTYgKzg5NywxNiBAQAogCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCiAJCSJ3b2RXcml0ZSgpIC8vIGR3QnVmZmVyTGVuZ3RoICVsdSAhXG4iLCBscFdhdmVIZHItPmR3QnVmZmVyTGVuZ3RoKTsKIAlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAotCQkid29kV3JpdGUoKSAvLyBXT3V0RGV2WyV1XS51bml4ZGV2ICV1ICFcbiIsIHdEZXZJRCwgV091dERldlt3RGV2SURdLnVuaXhkZXYpOworCQkid29kV3JpdGUoKSAvLyBXT3V0RGV2WyV1XS51bml4ZGV2ICV1ICFcbiIsIHdEZXZJRCwgV091dERldltpbmRleF0udW5peGRldik7CiAJbHBEYXRhID0gUFRSX1NFR19UT19MSU4obHBXYXZlSGRyLT5scERhdGEpOwotCWNvdW50ID0gd3JpdGUgKFdPdXREZXZbd0RldklEXS51bml4ZGV2LCBscERhdGEsIGxwV2F2ZUhkci0+ZHdCdWZmZXJMZW5ndGgpOworCWNvdW50ID0gd3JpdGUgKFdPdXREZXZbaW5kZXhdLnVuaXhkZXYsIGxwRGF0YSwgbHBXYXZlSGRyLT5kd0J1ZmZlckxlbmd0aCk7CiAJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwKIAkJIndvZFdyaXRlKCkgLy8gd3JpdGUgcmV0dXJuZWQgY291bnQgJXUgIVxuIiwgY291bnQpOwogCWlmIChjb3VudCAhPSBscFdhdmVIZHItPmR3QnVmZmVyTGVuZ3RoKSB7CiAJCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIkxpbnV4ICd3b2RXcml0ZScgLy8gZXJyb3Igd3JpdHRpbmcgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCQl9Ci0JV091dERldlt3RGV2SURdLmR3VG90YWxQbGF5ZWQgKz0gY291bnQ7CisJV091dERldltpbmRleF0uZHdUb3RhbFBsYXllZCArPSBjb3VudDsKIAlscFdhdmVIZHItPmR3RmxhZ3MgJj0gfldIRFJfSU5RVUVVRTsKIAlscFdhdmVIZHItPmR3RmxhZ3MgfD0gV0hEUl9ET05FOwogCWlmIChXQVZFX05vdGlmeUNsaWVudCh3RGV2SUQsIFdPTV9ET05FLCAwTCwgMEwpICE9IE1NU1lTRVJSX05PRVJST1IpIHsKQEAgLTkxMSwyMSArOTIxLDIyIEBACiAqLwogc3RhdGljIERXT1JEIHdvZFByZXBhcmUoV09SRCB3RGV2SUQsIExQV0FWRUhEUiBscFdhdmVIZHIsIERXT1JEIGR3U2l6ZSkKIHsKKwlpbnQgaW5kZXggPSBNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKTsKIAlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAogCQkid29kUHJlcGFyZSgldSwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBXYXZlSGRyLCBkd1NpemUpOwotCWlmIChXT3V0RGV2W3dEZXZJRF0udW5peGRldiA9PSAwKSB7CisJaWYgKFdPdXREZXZbaW5kZXhdLnVuaXhkZXYgPT0gMCkgewogCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd29kUHJlcGFyZScgLy8gY2FuJ3QgcHJlcGFyZSAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJCX0KIAkvKiB0aGUgQ09PTCB3YXZlZWRpdG9yIGZlZWxzIG11Y2ggYmV0dGVyIHdpdGhvdXQgdGhpcyBjaGVjay4uLiAKIAkgKiBzb21lb25lIHBsZWFzZSBoYXZlIGEgbG9vayBhdCBhdmFpbGFibGUgZG9jdW1lbnRhdGlvbgotCWlmIChXT3V0RGV2W3dEZXZJRF0ubHBRdWV1ZUhkciAhPSBOVUxMKSB7CisJaWYgKFdPdXREZXZbaW5kZXhdLmxwUXVldWVIZHIgIT0gTlVMTCkgewogCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd29kUHJlcGFyZScgLy8gYWxyZWFkeSBwcmVwYXJlICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAl9CiAJKi8KLQlXT3V0RGV2W3dEZXZJRF0uZHdUb3RhbFBsYXllZCA9IDA7Ci0JV091dERldlt3RGV2SURdLmxwUXVldWVIZHIgPSBscFdhdmVIZHI7CisJV091dERldltpbmRleF0uZHdUb3RhbFBsYXllZCA9IDA7CisJV091dERldltpbmRleF0ubHBRdWV1ZUhkciA9IGxwV2F2ZUhkcjsKIAlpZiAobHBXYXZlSGRyLT5kd0ZsYWdzICYgV0hEUl9JTlFVRVVFKSByZXR1cm4gV0FWRVJSX1NUSUxMUExBWUlORzsKIAlscFdhdmVIZHItPmR3RmxhZ3MgfD0gV0hEUl9QUkVQQVJFRDsKIAlscFdhdmVIZHItPmR3RmxhZ3MgJj0gfldIRFJfRE9ORTsKQEAgLTkzNyw5ICs5NDgsMTAgQEAKICovCiBzdGF0aWMgRFdPUkQgd29kVW5wcmVwYXJlKFdPUkQgd0RldklELCBMUFdBVkVIRFIgbHBXYXZlSGRyLCBEV09SRCBkd1NpemUpCiB7CisJaW50IGluZGV4ID0gTU1TWVNURU1fRGV2SURUb0luZGV4KHdEZXZJRCk7CiAJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwKIAkJIndvZFVucHJlcGFyZSgldSwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBXYXZlSGRyLCBkd1NpemUpOwotCWlmIChXT3V0RGV2W3dEZXZJRF0udW5peGRldiA9PSAwKSB7CisJaWYgKFdPdXREZXZbaW5kZXhdLnVuaXhkZXYgPT0gMCkgewogCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd29kVW5wcmVwYXJlJyAvLyBjYW4ndCB1bnByZXBhcmUgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCQl9CkBAIC05NTEsOCArOTYzLDkgQEAKICovCiBzdGF0aWMgRFdPUkQgd29kUmVzdGFydChXT1JEIHdEZXZJRCkKIHsKKwlpbnQgaW5kZXggPSBNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKTsKIAlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJ3b2RSZXN0YXJ0KCV1KTtcbiIsIHdEZXZJRCk7Ci0JaWYgKFdPdXREZXZbd0RldklEXS51bml4ZGV2ID09IDApIHsKKwlpZiAoV091dERldltpbmRleF0udW5peGRldiA9PSAwKSB7CiAJCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIkxpbnV4ICd3b2RSZXN0YXJ0JyAvLyBjYW4ndCByZXN0YXJ0ICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAkJfQpAQCAtOTY0LDggKzk3Nyw5IEBACiAqLwogc3RhdGljIERXT1JEIHdvZFJlc2V0KFdPUkQgd0RldklEKQogewotICAgIGRwcmludGZfbWNpd2F2ZShzdGRkZWIsIndvZFJlc2V0KCV1KTtcbiIsIHdEZXZJRCk7Ci0JaWYgKFdPdXREZXZbd0RldklEXS51bml4ZGV2ID09IDApIHsKKwlpbnQgaW5kZXggPSBNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKTsKKwlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJ3b2RSZXNldCgldSk7XG4iLCB3RGV2SUQpOworCWlmIChXT3V0RGV2W2luZGV4XS51bml4ZGV2ID09IDApIHsKIAkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiTGludXggJ3dvZFJlc2V0JyAvLyBjYW4ndCByZXNldCAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJCX0KQEAgLTk3OCwzMCArOTkyLDMxIEBACiAqLwogc3RhdGljIERXT1JEIHdvZEdldFBvc2l0aW9uKFdPUkQgd0RldklELCBMUE1NVElNRSBscFRpbWUsIERXT1JEIHVTaXplKQogeworCWludCBpbmRleCA9IE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpOwogCWludAkJdGltZTsKIAlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJ3b2RHZXRQb3NpdGlvbigldSwgJXAsICVsdSk7XG4iLCB3RGV2SUQsIGxwVGltZSwgdVNpemUpOwotCWlmIChXT3V0RGV2W3dEZXZJRF0udW5peGRldiA9PSAwKSB7CisJaWYgKFdPdXREZXZbaW5kZXhdLnVuaXhkZXYgPT0gMCkgewogCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd29kR2V0UG9zaXRpb24nIC8vIGNhbid0IGdldCBwb3MgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCQl9CiAJaWYgKGxwVGltZSA9PSBOVUxMKQlyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKIAlzd2l0Y2gobHBUaW1lLT53VHlwZSkgewogCQljYXNlIFRJTUVfQllURVM6Ci0JCQlscFRpbWUtPnUuY2IgPSBXT3V0RGV2W3dEZXZJRF0uZHdUb3RhbFBsYXllZDsKKwkJCWxwVGltZS0+dS5jYiA9IFdPdXREZXZbaW5kZXhdLmR3VG90YWxQbGF5ZWQ7CiAJCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJ3b2RHZXRQb3NpdGlvbiAvLyBUSU1FX0JZVEVTPSVsdVxuIiwgbHBUaW1lLT51LmNiKTsKIAkJCWJyZWFrOwogCQljYXNlIFRJTUVfU0FNUExFUzoKIAkJCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIndvZEdldFBvc2l0aW9uIC8vIGR3VG90YWxQbGF5ZWQ9JWx1XG4iLCAKLQkJCQkJV091dERldlt3RGV2SURdLmR3VG90YWxQbGF5ZWQpOworCQkJCQlXT3V0RGV2W2luZGV4XS5kd1RvdGFsUGxheWVkKTsKIAkJCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIndvZEdldFBvc2l0aW9uIC8vIHdCaXRzUGVyU2FtcGxlPSV1XG4iLCAKLQkJCQkJV091dERldlt3RGV2SURdLkZvcm1hdC53Qml0c1BlclNhbXBsZSk7Ci0JCQlscFRpbWUtPnUuc2FtcGxlID0gV091dERldlt3RGV2SURdLmR3VG90YWxQbGF5ZWQgKiA4IC8KLQkJCQkJCVdPdXREZXZbd0RldklEXS5Gb3JtYXQud0JpdHNQZXJTYW1wbGU7CisJCQkJCVdPdXREZXZbaW5kZXhdLkZvcm1hdC53Qml0c1BlclNhbXBsZSk7CisJCQlscFRpbWUtPnUuc2FtcGxlID0gV091dERldltpbmRleF0uZHdUb3RhbFBsYXllZCAqIDggLworCQkJCQkJV091dERldltpbmRleF0uRm9ybWF0LndCaXRzUGVyU2FtcGxlOwogCQkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwid29kR2V0UG9zaXRpb24gLy8gVElNRV9TQU1QTEVTPSVsdVxuIiwgbHBUaW1lLT51LnNhbXBsZSk7CiAJCQlicmVhazsKIAkJY2FzZSBUSU1FX1NNUFRFOgotCQkJdGltZSA9IFdPdXREZXZbd0RldklEXS5kd1RvdGFsUGxheWVkIC8KLQkJCQkoV091dERldlt3RGV2SURdLkZvcm1hdC53Zi5uQXZnQnl0ZXNQZXJTZWMgLyAxMDAwKTsKKwkJCXRpbWUgPSBXT3V0RGV2W2luZGV4XS5kd1RvdGFsUGxheWVkIC8KKwkJCQkoV091dERldltpbmRleF0uRm9ybWF0LndmLm5BdmdCeXRlc1BlclNlYyAvIDEwMDApOwogCQkJbHBUaW1lLT51LnNtcHRlLmhvdXIgPSB0aW1lIC8gMTA4MDAwOwogCQkJdGltZSAtPSBscFRpbWUtPnUuc21wdGUuaG91ciAqIDEwODAwMDsKIAkJCWxwVGltZS0+dS5zbXB0ZS5taW4gPSB0aW1lIC8gMTgwMDsKQEAgLTEwMTksOCArMTAzNCw4IEBACiAJCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJ3b2RHZXRQb3NpdGlvbigpIGZvcm1hdCBub3Qgc3VwcG9ydGVkICEgdXNlIFRJTUVfTVMgIVxuIik7CiAJCQlscFRpbWUtPndUeXBlID0gVElNRV9NUzsKIAkJY2FzZSBUSU1FX01TOgotCQkJbHBUaW1lLT51Lm1zID0gV091dERldlt3RGV2SURdLmR3VG90YWxQbGF5ZWQgLwotCQkJCQkoV091dERldlt3RGV2SURdLkZvcm1hdC53Zi5uQXZnQnl0ZXNQZXJTZWMgLyAxMDAwKTsKKwkJCWxwVGltZS0+dS5tcyA9IFdPdXREZXZbaW5kZXhdLmR3VG90YWxQbGF5ZWQgLworCQkJCQkoV091dERldltpbmRleF0uRm9ybWF0LndmLm5BdmdCeXRlc1BlclNlYyAvIDEwMDApOwogCQkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwid29kR2V0UG9zaXRpb24gLy8gVElNRV9NUz0lbHVcbiIsIGxwVGltZS0+dS5tcyk7CiAJCQlicmVhazsKIAkJfQpAQCAtMTIwMyw2ICsxMjE4LDcgQEAKICovCiBzdGF0aWMgRFdPUkQgd2lkT3BlbihXT1JEIHdEZXZJRCwgTFBXQVZFT1BFTkRFU0MgbHBEZXNjLCBEV09SRCBkd0ZsYWdzKQogeworCWludCBpbmRleCA9IE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpOwogCWludCAJCWF1ZGlvOwogCWludAkJCWFidWZfc2l6ZTsKIAlpbnQJCQlzbXBscmF0ZTsKQEAgLTEyMTgsNyArMTIzNCw3IEBACiAJCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIkxpbnV4ICd3aWRPcGVuJyAvLyBNQVhfV0FWSU5EUlYgcmVhY2hlZCAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX0FMTE9DQVRFRDsKIAkJfQotCVdJbkRldlt3RGV2SURdLnVuaXhkZXYgPSAwOworCVdJbkRldltpbmRleF0udW5peGRldiA9IDA7CiAJYXVkaW8gPSBvcGVuIChTT1VORF9ERVYsIE9fUkRPTkxZLCAwKTsKIAlpZiAoYXVkaW8gPT0gLTEpIHsKIAkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiTGludXggJ3dpZE9wZW4nIC8vIGNhbid0IG9wZW4gIVxuIik7CkBAIC0xMjMyLDggKzEyNDgsOCBAQAogCQkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiTGludXggJ3dpZE9wZW4nIC8vIFNORENUTF9EU1BfR0VUQkxLU0laRSBJbnZhbGlkIGJ1ZnNpemUgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCQl9Ci0JV0luRGV2W3dEZXZJRF0ud0ZsYWdzID0gSElXT1JEKGR3RmxhZ3MgJiBDQUxMQkFDS19UWVBFTUFTSyk7Ci0Jc3dpdGNoKFdJbkRldlt3RGV2SURdLndGbGFncykgeworCVdJbkRldltpbmRleF0ud0ZsYWdzID0gSElXT1JEKGR3RmxhZ3MgJiBDQUxMQkFDS19UWVBFTUFTSyk7CisJc3dpdGNoKFdJbkRldltpbmRleF0ud0ZsYWdzKSB7CiAJCWNhc2UgRENCX05VTEw6CiAJCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAkiTGludXggJ3dpZE9wZW4nIC8vIENBTExCQUNLX05VTEwgIVxuIik7CiAJCQlicmVhazsKQEAgLTEyNDcsNDEgKzEyNjMsNDEgQEAKIAkJCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCSJMaW51eCAnd2lkT3BlbicgLy8gQ0FMTEJBQ0tfRlVOQ1RJT04gIVxuIik7CiAJCQlicmVhazsKIAkJfQotCVdJbkRldlt3RGV2SURdLmxwUXVldWVIZHIgPSBOVUxMOwotCVdJbkRldlt3RGV2SURdLnVuaXhkZXYgPSBhdWRpbzsKLQlXSW5EZXZbd0RldklEXS5idWZzaXplID0gYWJ1Zl9zaXplOwotCVdJbkRldlt3RGV2SURdLmR3VG90YWxSZWNvcmRlZCA9IDA7Ci0JbWVtY3B5KCZXSW5EZXZbd0RldklEXS53YXZlRGVzYywgbHBEZXNjLCBzaXplb2YoV0FWRU9QRU5ERVNDKSk7CisJV0luRGV2W2luZGV4XS5scFF1ZXVlSGRyID0gTlVMTDsKKwlXSW5EZXZbaW5kZXhdLnVuaXhkZXYgPSBhdWRpbzsKKwlXSW5EZXZbaW5kZXhdLmJ1ZnNpemUgPSBhYnVmX3NpemU7CisJV0luRGV2W2luZGV4XS5kd1RvdGFsUmVjb3JkZWQgPSAwOworCW1lbWNweSgmV0luRGV2W2luZGV4XS53YXZlRGVzYywgbHBEZXNjLCBzaXplb2YoV0FWRU9QRU5ERVNDKSk7CiAgICAgICAgIGxwRm9ybWF0ID0gbHBEZXNjLT5scEZvcm1hdDsKIAlpZiAobHBGb3JtYXQtPndGb3JtYXRUYWcgIT0gV0FWRV9GT1JNQVRfUENNKSB7CiAJCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIkxpbnV4ICd3aWRPcGVuJyAvLyBCYWQgZm9ybWF0ICUwNFggIVxuIiwKIAkJCQkJbHBGb3JtYXQtPndGb3JtYXRUYWcpOwogCQlyZXR1cm4gV0FWRVJSX0JBREZPUk1BVDsKIAkJfQotCW1lbWNweSgmV0luRGV2W3dEZXZJRF0uRm9ybWF0LCBscEZvcm1hdCwgc2l6ZW9mKFBDTVdBVkVGT1JNQVQpKTsKLQlXSW5EZXZbd0RldklEXS5Gb3JtYXQud0JpdHNQZXJTYW1wbGUgPSA4OyAvKiA8LS0tLS0tLS0tLS0tLS0gKi8KLQlpZiAoV0luRGV2W3dEZXZJRF0uRm9ybWF0LndmLm5DaGFubmVscyA9PSAwKSByZXR1cm4gV0FWRVJSX0JBREZPUk1BVDsKLQlpZiAoV0luRGV2W3dEZXZJRF0uRm9ybWF0LndmLm5TYW1wbGVzUGVyU2VjID09IDApIHJldHVybiBXQVZFUlJfQkFERk9STUFUOwotCWlmIChXSW5EZXZbd0RldklEXS5Gb3JtYXQud0JpdHNQZXJTYW1wbGUgPT0gMCkgewotCQlXSW5EZXZbd0RldklEXS5Gb3JtYXQud0JpdHNQZXJTYW1wbGUgPSA4ICoKLQkJKFdJbkRldlt3RGV2SURdLkZvcm1hdC53Zi5uQXZnQnl0ZXNQZXJTZWMgLwotCQlXSW5EZXZbd0RldklEXS5Gb3JtYXQud2YublNhbXBsZXNQZXJTZWMpIC8KLQkJV0luRGV2W3dEZXZJRF0uRm9ybWF0LndmLm5DaGFubmVsczsKKwltZW1jcHkoJldJbkRldltpbmRleF0uRm9ybWF0LCBscEZvcm1hdCwgc2l6ZW9mKFBDTVdBVkVGT1JNQVQpKTsKKwlXSW5EZXZbaW5kZXhdLkZvcm1hdC53Qml0c1BlclNhbXBsZSA9IDg7IC8qIDwtLS0tLS0tLS0tLS0tLSAqLworCWlmIChXSW5EZXZbaW5kZXhdLkZvcm1hdC53Zi5uQ2hhbm5lbHMgPT0gMCkgcmV0dXJuIFdBVkVSUl9CQURGT1JNQVQ7CisJaWYgKFdJbkRldltpbmRleF0uRm9ybWF0LndmLm5TYW1wbGVzUGVyU2VjID09IDApIHJldHVybiBXQVZFUlJfQkFERk9STUFUOworCWlmIChXSW5EZXZbaW5kZXhdLkZvcm1hdC53Qml0c1BlclNhbXBsZSA9PSAwKSB7CisJCVdJbkRldltpbmRleF0uRm9ybWF0LndCaXRzUGVyU2FtcGxlID0gOCAqCisJCShXSW5EZXZbaW5kZXhdLkZvcm1hdC53Zi5uQXZnQnl0ZXNQZXJTZWMgLworCQlXSW5EZXZbaW5kZXhdLkZvcm1hdC53Zi5uU2FtcGxlc1BlclNlYykgLworCQlXSW5EZXZbaW5kZXhdLkZvcm1hdC53Zi5uQ2hhbm5lbHM7CiAJCX0KLQlzYW1wbGVzaXplID0gV0luRGV2W3dEZXZJRF0uRm9ybWF0LndCaXRzUGVyU2FtcGxlOwotCXNtcGxyYXRlID0gV0luRGV2W3dEZXZJRF0uRm9ybWF0LndmLm5TYW1wbGVzUGVyU2VjOwotCWRzcF9zdGVyZW8gPSAoV0luRGV2W3dEZXZJRF0uRm9ybWF0LndmLm5DaGFubmVscyA+IDEpID8gVFJVRSA6IEZBTFNFOworCXNhbXBsZXNpemUgPSBXSW5EZXZbaW5kZXhdLkZvcm1hdC53Qml0c1BlclNhbXBsZTsKKwlzbXBscmF0ZSA9IFdJbkRldltpbmRleF0uRm9ybWF0LndmLm5TYW1wbGVzUGVyU2VjOworCWRzcF9zdGVyZW8gPSAoV0luRGV2W2luZGV4XS5Gb3JtYXQud2YubkNoYW5uZWxzID4gMSkgPyBUUlVFIDogRkFMU0U7CiAJSU9DVEwoYXVkaW8sIFNORENUTF9EU1BfU1BFRUQsIHNtcGxyYXRlKTsKIAlJT0NUTChhdWRpbywgU05EQ1RMX0RTUF9TQU1QTEVTSVpFLCBzYW1wbGVzaXplKTsKIAlJT0NUTChhdWRpbywgU05EQ1RMX0RTUF9TVEVSRU8sIGRzcF9zdGVyZW8pOwogCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIkxpbnV4ICd3aWRPcGVuJyAvLyB3Qml0c1BlclNhbXBsZT0ldSAhXG4iLAotCQkJCVdJbkRldlt3RGV2SURdLkZvcm1hdC53Qml0c1BlclNhbXBsZSk7CisJCQkJV0luRGV2W2luZGV4XS5Gb3JtYXQud0JpdHNQZXJTYW1wbGUpOwogCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIkxpbnV4ICd3aWRPcGVuJyAvLyBuU2FtcGxlc1BlclNlYz0lbHUgIVxuIiwKLQkJCQlXSW5EZXZbd0RldklEXS5Gb3JtYXQud2YublNhbXBsZXNQZXJTZWMpOworCQkJCVdJbkRldltpbmRleF0uRm9ybWF0LndmLm5TYW1wbGVzUGVyU2VjKTsKIAlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd2lkT3BlbicgLy8gbkNoYW5uZWxzPSV1ICFcbiIsCi0JCQkJV0luRGV2W3dEZXZJRF0uRm9ybWF0LndmLm5DaGFubmVscyk7CisJCQkJV0luRGV2W2luZGV4XS5Gb3JtYXQud2YubkNoYW5uZWxzKTsKIAlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd2lkT3BlbicgLy8gbkF2Z0J5dGVzUGVyU2VjPSVsdVxuIiwKLQkJCVdJbkRldlt3RGV2SURdLkZvcm1hdC53Zi5uQXZnQnl0ZXNQZXJTZWMpOyAKKwkJCVdJbkRldltpbmRleF0uRm9ybWF0LndmLm5BdmdCeXRlc1BlclNlYyk7IAogCWlmIChXQVZFX05vdGlmeUNsaWVudCh3RGV2SUQsIFdJTV9PUEVOLCAwTCwgMEwpICE9IE1NU1lTRVJSX05PRVJST1IpIHsKIAkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiTGludXggJ3dpZE9wZW4nIC8vIGNhbid0IG5vdGlmeSBjbGllbnQgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOwpAQCAtMTI5NCwxNCArMTMxMCwxNSBAQAogKi8KIHN0YXRpYyBEV09SRCB3aWRDbG9zZShXT1JEIHdEZXZJRCkKIHsKKwlpbnQgaW5kZXggPSBNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKTsKIAlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJ3aWRDbG9zZSgldSk7XG4iLCB3RGV2SUQpOwotCWlmIChXSW5EZXZbd0RldklEXS51bml4ZGV2ID09IDApIHsKKwlpZiAoV0luRGV2W2luZGV4XS51bml4ZGV2ID09IDApIHsKIAkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiTGludXggJ3dpZENsb3NlJyAvLyBjYW4ndCBjbG9zZSAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJCX0KLQljbG9zZShXSW5EZXZbd0RldklEXS51bml4ZGV2KTsKLQlXSW5EZXZbd0RldklEXS51bml4ZGV2ID0gMDsKLQlXSW5EZXZbd0RldklEXS5idWZzaXplID0gMDsKKwljbG9zZShXSW5EZXZbaW5kZXhdLnVuaXhkZXYpOworCVdJbkRldltpbmRleF0udW5peGRldiA9IDA7CisJV0luRGV2W2luZGV4XS5idWZzaXplID0gMDsKIAlpZiAoV0FWRV9Ob3RpZnlDbGllbnQod0RldklELCBXSU1fQ0xPU0UsIDBMLCAwTCkgIT0gTU1TWVNFUlJfTk9FUlJPUikgewogCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd2lkQ2xvc2UnIC8vIGNhbid0IG5vdGlmeSBjbGllbnQgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOwpAQCAtMTMxNCwxMSArMTMzMSwxMiBAQAogKi8KIHN0YXRpYyBEV09SRCB3aWRBZGRCdWZmZXIoV09SRCB3RGV2SUQsIExQV0FWRUhEUiBscFdhdmVIZHIsIERXT1JEIGR3U2l6ZSkKIHsKKwlpbnQgaW5kZXggPSBNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKTsKIAlpbnQJCQljb3VudAk9IDE7CiAJTFBXQVZFSERSIAlscFdJSGRyOwogCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCiAJCSJ3aWRBZGRCdWZmZXIoJXUsICVwLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGxwV2F2ZUhkciwgZHdTaXplKTsKLQlpZiAoV0luRGV2W3dEZXZJRF0udW5peGRldiA9PSAwKSB7CisJaWYgKFdJbkRldltpbmRleF0udW5peGRldiA9PSAwKSB7CiAJCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIkxpbnV4ICd3aWRBZGRCdWZmZXInIC8vIGNhbid0IGRvIGl0ICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAkJfQpAQCAtMTMzNCwxNCArMTM1MiwxNCBAQAogCWxwV2F2ZUhkci0+ZHdGbGFncyB8PSBXSERSX0lOUVVFVUU7CiAJbHBXYXZlSGRyLT5kd0ZsYWdzICY9IH5XSERSX0RPTkU7CiAJbHBXYXZlSGRyLT5kd0J5dGVzUmVjb3JkZWQgPSAwOwotCWlmIChXSW5EZXZbd0RldklEXS5scFF1ZXVlSGRyID09IE5VTEwpIHsKKwlpZiAoV0luRGV2W2luZGV4XS5scFF1ZXVlSGRyID09IE5VTEwpIHsKIAkJLyogYmVnaW4gdGhlIHF1ZXVlIHdpdGggYSBmaXJzdCBoZWFkZXIgLi4uICovCi0JCVdJbkRldlt3RGV2SURdLmxwUXVldWVIZHIgPSBscFdhdmVIZHI7Ci0JCVdJbkRldlt3RGV2SURdLmR3VG90YWxSZWNvcmRlZCA9IDA7CisJCVdJbkRldltpbmRleF0ubHBRdWV1ZUhkciA9IGxwV2F2ZUhkcjsKKwkJV0luRGV2W2luZGV4XS5kd1RvdGFsUmVjb3JkZWQgPSAwOwogCQl9CiAJZWxzZSB7CiAJCS8qIGFkZGVkIHRvIHRoZSBxdWV1ZSwgZXhjZXB0IGlmIGl0J3MgdGhlIG9uZSBqdXN0IHByZXBhcmVkIC4uLiAqLwotCQlscFdJSGRyID0gV0luRGV2W3dEZXZJRF0ubHBRdWV1ZUhkcjsKKwkJbHBXSUhkciA9IFdJbkRldltpbmRleF0ubHBRdWV1ZUhkcjsKIAkJd2hpbGUgKGxwV0lIZHItPmxwTmV4dCAhPSBOVUxMKSB7CiAJCQlscFdJSGRyID0gbHBXSUhkci0+bHBOZXh0OwogCQkJY291bnQrKzsKQEAgLTEzNTksMTMgKzEzNzcsMTQgQEAKICovCiBzdGF0aWMgRFdPUkQgd2lkUHJlcGFyZShXT1JEIHdEZXZJRCwgTFBXQVZFSERSIGxwV2F2ZUhkciwgRFdPUkQgZHdTaXplKQogeworCWludCBpbmRleCA9IE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpOwogCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCiAJCSJ3aWRQcmVwYXJlKCV1LCAlcCwgJTA4bFgpO1xuIiwgd0RldklELCBscFdhdmVIZHIsIGR3U2l6ZSk7Ci0JaWYgKFdJbkRldlt3RGV2SURdLnVuaXhkZXYgPT0gMCkgeworCWlmIChXSW5EZXZbaW5kZXhdLnVuaXhkZXYgPT0gMCkgewogCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd2lkUHJlcGFyZScgLy8gY2FuJ3QgcHJlcGFyZSAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJCX0KLQlpZiAoV0luRGV2W3dEZXZJRF0ubHBRdWV1ZUhkciAhPSBOVUxMKSB7CisJaWYgKFdJbkRldltpbmRleF0ubHBRdWV1ZUhkciAhPSBOVUxMKSB7CiAJCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIkxpbnV4ICd3aWRQcmVwYXJlJyAvLyBhbHJlYWR5IHByZXBhcmUgIVxuIik7CiAJCXJldHVybiBXQVZFUlJfQkFERk9STUFUOwogCQl9CkBAIC0xMzgzLDE2ICsxNDAyLDE3IEBACiAqLwogc3RhdGljIERXT1JEIHdpZFVucHJlcGFyZShXT1JEIHdEZXZJRCwgTFBXQVZFSERSIGxwV2F2ZUhkciwgRFdPUkQgZHdTaXplKQogeworCWludCBpbmRleCA9IE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpOwogCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCiAJCSJ3aWRVbnByZXBhcmUoJXUsICVwLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGxwV2F2ZUhkciwgZHdTaXplKTsKLQlpZiAoV0luRGV2W3dEZXZJRF0udW5peGRldiA9PSAwKSB7CisJaWYgKFdJbkRldltpbmRleF0udW5peGRldiA9PSAwKSB7CiAJCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIkxpbnV4ICd3aWRVbnByZXBhcmUnIC8vIGNhbid0IHVucHJlcGFyZSAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJCX0KIAlscFdhdmVIZHItPmR3RmxhZ3MgJj0gfldIRFJfUFJFUEFSRUQ7CiAJbHBXYXZlSGRyLT5kd0ZsYWdzICY9IH5XSERSX0lOUVVFVUU7CiAJbHBXYXZlSGRyLT5kd0ZsYWdzIHw9IFdIRFJfRE9ORTsKLQlXSW5EZXZbd0RldklEXS5scFF1ZXVlSGRyID0gTlVMTDsKKwlXSW5EZXZbaW5kZXhdLmxwUXVldWVIZHIgPSBOVUxMOwogCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCiAJCSJMaW51eCAnd2lkVW5wcmVwYXJlJyAvLyBhbGwgaGVhZGVycyB1bnByZXBhcmVkICFcbiIpOwogCXJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwpAQCAtMTQwMywzMCArMTQyMywzMSBAQAogKi8KIHN0YXRpYyBEV09SRCB3aWRTdGFydChXT1JEIHdEZXZJRCkKIHsKKwlpbnQgaW5kZXggPSBNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKTsKIAlpbnQJCQljb3VudAk9IDE7CiAJTFBXQVZFSERSIAlscFdJSGRyOwogCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIndpZFN0YXJ0KCV1KTtcbiIsIHdEZXZJRCk7Ci0JaWYgKFdJbkRldlt3RGV2SURdLnVuaXhkZXYgPT0gMCkgeworCWlmIChXSW5EZXZbaW5kZXhdLnVuaXhkZXYgPT0gMCkgewogCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAkiTGludXggJ3dpZFN0YXJ0JyAvLyBjYW4ndCBzdGFydCByZWNvcmRpbmcgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCQl9Ci0JaWYgKFdJbkRldlt3RGV2SURdLmxwUXVldWVIZHIgPT0gTlVMTCB8fCAKLQkJV0luRGV2W3dEZXZJRF0ubHBRdWV1ZUhkci0+bHBEYXRhID09IE5VTEwpIHsKKwlpZiAoV0luRGV2W2luZGV4XS5scFF1ZXVlSGRyID09IE5VTEwgfHwgCisJCVdJbkRldltpbmRleF0ubHBRdWV1ZUhkci0+bHBEYXRhID09IE5VTEwpIHsKIAkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiTGludXggJ3dpZFN0YXJ0JyAvLyBuZXZlciBiZWVuIHByZXBhcmVkICFcbiIpOwogCQlyZXR1cm4gV0FWRVJSX1VOUFJFUEFSRUQ7CiAJCX0KLQlscFdJSGRyID0gV0luRGV2W3dEZXZJRF0ubHBRdWV1ZUhkcjsKKwlscFdJSGRyID0gV0luRGV2W2luZGV4XS5scFF1ZXVlSGRyOwogCXdoaWxlKGxwV0lIZHIgIT0gTlVMTCkgewogCQlscFdJSGRyLT5kd0J1ZmZlckxlbmd0aCAmPSAweEZGRkY7CiAJCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCiAJCQkid2lkU3RhcnQgLy8gcmVjb3JkaW5nIGJ1ZiMldT0lcCBzaXplPSVsdSBcbiIsCiAJCQljb3VudCwgbHBXSUhkci0+bHBEYXRhLCBscFdJSGRyLT5kd0J1ZmZlckxlbmd0aCk7CiAJCWZmbHVzaChzdGRkZWIpOwotCQlyZWFkIChXSW5EZXZbd0RldklEXS51bml4ZGV2LCAKKwkJcmVhZCAoV0luRGV2W2luZGV4XS51bml4ZGV2LCAKIAkJCVBUUl9TRUdfVE9fTElOKGxwV0lIZHItPmxwRGF0YSksCiAJCQlscFdJSGRyLT5kd0J1ZmZlckxlbmd0aCk7CiAJCWxwV0lIZHItPmR3Qnl0ZXNSZWNvcmRlZCA9IGxwV0lIZHItPmR3QnVmZmVyTGVuZ3RoOwotCQlXSW5EZXZbd0RldklEXS5kd1RvdGFsUmVjb3JkZWQgKz0gbHBXSUhkci0+ZHdCeXRlc1JlY29yZGVkOworCQlXSW5EZXZbaW5kZXhdLmR3VG90YWxSZWNvcmRlZCArPSBscFdJSGRyLT5kd0J5dGVzUmVjb3JkZWQ7CiAJCWxwV0lIZHItPmR3RmxhZ3MgJj0gfldIRFJfSU5RVUVVRTsKIAkJbHBXSUhkci0+ZHdGbGFncyB8PSBXSERSX0RPTkU7CiAJCWlmIChXQVZFX05vdGlmeUNsaWVudCh3RGV2SUQsIFdJTV9EQVRBLCAoRFdPUkQpbHBXSUhkciwgMEwpICE9IApAQCAtMTQ0Nyw4ICsxNDY4LDkgQEAKICovCiBzdGF0aWMgRFdPUkQgd2lkU3RvcChXT1JEIHdEZXZJRCkKIHsKKwlpbnQgaW5kZXggPSBNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKTsKIAlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJ3aWRTdG9wKCV1KTtcbiIsIHdEZXZJRCk7Ci0JaWYgKFdJbkRldlt3RGV2SURdLnVuaXhkZXYgPT0gMCkgeworCWlmIChXSW5EZXZbaW5kZXhdLnVuaXhkZXYgPT0gMCkgewogCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd2lkU3RvcCcgLy8gY2FuJ3Qgc3RvcCAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJCX0KQEAgLTE0NjAsOCArMTQ4Miw5IEBACiAqLwogc3RhdGljIERXT1JEIHdpZFJlc2V0KFdPUkQgd0RldklEKQogeworCWludCBpbmRleCA9IE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpOwogCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIndpZFJlc2V0KCV1KTtcbiIsIHdEZXZJRCk7Ci0JaWYgKFdJbkRldlt3RGV2SURdLnVuaXhkZXYgPT0gMCkgeworCWlmIChXSW5EZXZbaW5kZXhdLnVuaXhkZXYgPT0gMCkgewogCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd2lkUmVzZXQnIC8vIGNhbid0IHJlc2V0ICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAkJfQpAQCAtMTQ3MywxMSArMTQ5NiwxMiBAQAogKi8KIHN0YXRpYyBEV09SRCB3aWRHZXRQb3NpdGlvbihXT1JEIHdEZXZJRCwgTFBNTVRJTUUgbHBUaW1lLCBEV09SRCB1U2l6ZSkKIHsKKwlpbnQgaW5kZXggPSBNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKTsKIAlpbnQJCXRpbWU7CiAgICAgCiAJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwKIAkJIndpZEdldFBvc2l0aW9uKCV1LCAlcCwgJWx1KTtcbiIsIHdEZXZJRCwgbHBUaW1lLCB1U2l6ZSk7Ci0JaWYgKFdJbkRldlt3RGV2SURdLnVuaXhkZXYgPT0gMCkgeworCWlmIChXSW5EZXZbaW5kZXhdLnVuaXhkZXYgPT0gMCkgewogCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd2lkR2V0UG9zaXRpb24nIC8vIGNhbid0IGdldCBwb3MgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCQl9CkBAIC0xNDg1LDMwICsxNTA5LDMwIEBACiAJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwid2lkR2V0UG9zaXRpb24gLy8gd1R5cGU9JTA0WCAhXG4iLCAKIAkJCWxwVGltZS0+d1R5cGUpOwogCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIndpZEdldFBvc2l0aW9uIC8vIHdCaXRzUGVyU2FtcGxlPSV1XG4iLAotCQkJV0luRGV2W3dEZXZJRF0uRm9ybWF0LndCaXRzUGVyU2FtcGxlKTsgCisJCQlXSW5EZXZbaW5kZXhdLkZvcm1hdC53Qml0c1BlclNhbXBsZSk7IAogCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIndpZEdldFBvc2l0aW9uIC8vIG5TYW1wbGVzUGVyU2VjPSVsdVxuIiwKLQkJCVdJbkRldlt3RGV2SURdLkZvcm1hdC53Zi5uU2FtcGxlc1BlclNlYyk7IAorCQkJV0luRGV2W2luZGV4XS5Gb3JtYXQud2YublNhbXBsZXNQZXJTZWMpOyAKIAlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJ3aWRHZXRQb3NpdGlvbiAvLyBuQ2hhbm5lbHM9JXVcbiIsCi0JCQlXSW5EZXZbd0RldklEXS5Gb3JtYXQud2YubkNoYW5uZWxzKTsgCisJCQlXSW5EZXZbaW5kZXhdLkZvcm1hdC53Zi5uQ2hhbm5lbHMpOyAKIAlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJ3aWRHZXRQb3NpdGlvbiAvLyBuQXZnQnl0ZXNQZXJTZWM9JWx1XG4iLAotCQkJV0luRGV2W3dEZXZJRF0uRm9ybWF0LndmLm5BdmdCeXRlc1BlclNlYyk7IAorCQkJV0luRGV2W2luZGV4XS5Gb3JtYXQud2YubkF2Z0J5dGVzUGVyU2VjKTsgCiAJZmZsdXNoKHN0ZGRlYik7CiAJc3dpdGNoKGxwVGltZS0+d1R5cGUpIHsKIAkJY2FzZSBUSU1FX0JZVEVTOgotCQkJbHBUaW1lLT51LmNiID0gV0luRGV2W3dEZXZJRF0uZHdUb3RhbFJlY29yZGVkOworCQkJbHBUaW1lLT51LmNiID0gV0luRGV2W2luZGV4XS5kd1RvdGFsUmVjb3JkZWQ7CiAJCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAogCQkJICAgICJ3aWRHZXRQb3NpdGlvbiAvLyBUSU1FX0JZVEVTPSVsdVxuIiwgbHBUaW1lLT51LmNiKTsKIAkJCWJyZWFrOwogCQljYXNlIFRJTUVfU0FNUExFUzoKLQkJCWxwVGltZS0+dS5zYW1wbGUgPSBXSW5EZXZbd0RldklEXS5kd1RvdGFsUmVjb3JkZWQgKiA4IC8KLQkJCQkJICBXSW5EZXZbd0RldklEXS5Gb3JtYXQud0JpdHNQZXJTYW1wbGU7CisJCQlscFRpbWUtPnUuc2FtcGxlID0gV0luRGV2W2luZGV4XS5kd1RvdGFsUmVjb3JkZWQgKiA4IC8KKwkJCQkJICBXSW5EZXZbaW5kZXhdLkZvcm1hdC53Qml0c1BlclNhbXBsZTsKIAkJCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCiAJCQkJCSJ3aWRHZXRQb3NpdGlvbiAvLyBUSU1FX1NBTVBMRVM9JWx1XG4iLCAKIAkJCQkJbHBUaW1lLT51LnNhbXBsZSk7CiAJCQlicmVhazsKIAkJY2FzZSBUSU1FX1NNUFRFOgotCQkJdGltZSA9IFdJbkRldlt3RGV2SURdLmR3VG90YWxSZWNvcmRlZCAvCi0JCQkJKFdJbkRldlt3RGV2SURdLkZvcm1hdC53Zi5uQXZnQnl0ZXNQZXJTZWMgLyAxMDAwKTsKKwkJCXRpbWUgPSBXSW5EZXZbaW5kZXhdLmR3VG90YWxSZWNvcmRlZCAvCisJCQkJKFdJbkRldltpbmRleF0uRm9ybWF0LndmLm5BdmdCeXRlc1BlclNlYyAvIDEwMDApOwogCQkJbHBUaW1lLT51LnNtcHRlLmhvdXIgPSB0aW1lIC8gMTA4MDAwOwogCQkJdGltZSAtPSBscFRpbWUtPnUuc21wdGUuaG91ciAqIDEwODAwMDsKIAkJCWxwVGltZS0+dS5zbXB0ZS5taW4gPSB0aW1lIC8gMTgwMDsKQEAgLTE1MjUsOCArMTU0OSw4IEBACiAJCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJ3aWRHZXRQb3NpdGlvbigpIGZvcm1hdCBub3Qgc3VwcG9ydGVkICEgdXNlIFRJTUVfTVMgIVxuIik7CiAJCQlscFRpbWUtPndUeXBlID0gVElNRV9NUzsKIAkJY2FzZSBUSU1FX01TOgotCQkJbHBUaW1lLT51Lm1zID0gV0luRGV2W3dEZXZJRF0uZHdUb3RhbFJlY29yZGVkIC8KLQkJCQkJKFdJbkRldlt3RGV2SURdLkZvcm1hdC53Zi5uQXZnQnl0ZXNQZXJTZWMgLyAxMDAwKTsKKwkJCWxwVGltZS0+dS5tcyA9IFdJbkRldltpbmRleF0uZHdUb3RhbFJlY29yZGVkIC8KKwkJCQkJKFdJbkRldltpbmRleF0uRm9ybWF0LndmLm5BdmdCeXRlc1BlclNlYyAvIDEwMDApOwogCQkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwKIAkJCSAgICAgICJ3aWRHZXRQb3NpdGlvbiAvLyBUSU1FX01TPSVsdVxuIiwgbHBUaW1lLT51Lm1zKTsKIAkJCWJyZWFrOwpAQCAtMTY0MSw2ICsxNjY1LDMgQEAKIAlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKICNlbmRpZgogfQotCi0KLSNlbmRpZiAvKiAjaWZkZWYgQlVJTFRJTl9NTVNZU1RFTSAqLwpkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9qb3lzdGljay5jIGIvbXVsdGltZWRpYS9qb3lzdGljay5jCmluZGV4IGFiMjgxOTAuLjhiYzdkZWIgMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvam95c3RpY2suYworKysgYi9tdWx0aW1lZGlhL2pveXN0aWNrLmMKQEAgLTY3LDcgKzY3LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJCUpveVNldENhcHR1cmUJCVtNTVNZU1RFTS4xMDZdCiAgKi8KLVdPUkQgSm95U2V0Q2FwdHVyZShIV05EMTYgaFduZCwgV09SRCB3SUQsIFdPUkQgd1BlcmlvZCwgQk9PTCBiQ2hhbmdlZCkKK1dPUkQgSm95U2V0Q2FwdHVyZShIV05EMTYgaFduZCwgV09SRCB3SUQsIFdPUkQgd1BlcmlvZCwgQk9PTDE2IGJDaGFuZ2VkKQogewogICAgIGZwcmludGYoc3RkbmltcCwgIkVNUFRZIFNUVUIgISEhIEpveVNldENhcHR1cmUoJTA0WCwgJTA0WCwgJWQsICVkKTtcbiIsCiAJICAgIGhXbmQsIHdJRCwgd1BlcmlvZCwgYkNoYW5nZWQpOwpkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9tY2lhbmltLmMgYi9tdWx0aW1lZGlhL21jaWFuaW0uYwppbmRleCBlNmU4NGYzLi5iYWJjZjI1IDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL21jaWFuaW0uYworKysgYi9tdWx0aW1lZGlhL21jaWFuaW0uYwpAQCAtNCwxMiArNCw2IEBACiAgKiBDb3B5cmlnaHQgMTk5NCBNYXJ0aW4gQXlvdHRlCiAgKi8KIAotI2lmbmRlZiBXSU5FTElCCi0jZGVmaW5lIEJVSUxUSU5fTU1TWVNURU0KLSNlbmRpZiAKLQotI2lmZGVmIEJVSUxUSU5fTU1TWVNURU0KLQogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CkBAIC0yMyw2ICsxNyw4IEBACiAjaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCitpbnQgTU1TWVNURU1fRGV2SURUb0luZGV4KFVJTlQxNik7CisKICNkZWZpbmUgTUFYX0FOSU1EUlYgCQkyCiAKICNkZWZpbmUgQU5JTUZSQU1FU19QRVJTRUMgCTMwCkBAIC0zMiwxNSArMjgsMTUgQEAKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQogdHlwZWRlZiBzdHJ1Y3QgewogICAgIGludCAgICAgblVzZUNvdW50OyAgICAgICAgICAvKiBJbmNyZW1lbnRlZCBmb3IgZWFjaCBzaGFyZWQgb3BlbiAqLwotICAgIEJPT0wgICAgZlNoYXJlYWJsZTsgICAgICAgICAvKiBUUlVFIGlmIGZpcnN0IG9wZW4gd2FzIHNoYXJlYWJsZSAqLworICAgIEJPT0wxNiAgZlNoYXJlYWJsZTsgICAgICAgICAvKiBUUlVFIGlmIGZpcnN0IG9wZW4gd2FzIHNoYXJlYWJsZSAqLwogICAgIFdPUkQgICAgd05vdGlmeURldmljZUlEOyAgICAvKiBNQ0kgZGV2aWNlIElEIHdpdGggYSBwZW5kaW5nIG5vdGlmaWNhdGlvbiAqLwogICAgIEhBTkRMRTE2IGhDYWxsYmFjazsgICAgICAgICAgLyogQ2FsbGJhY2sgaGFuZGxlIGZvciBwZW5kaW5nIG5vdGlmaWNhdGlvbiAqLwogCU1DSV9PUEVOX1BBUk1TIG9wZW5QYXJtczsKIAlEV09SRAlkd1RpbWVGb3JtYXQ7CiAJaW50CQltb2RlOwotCVVJTlQJbkN1clRyYWNrOworCVVJTlQxNgluQ3VyVHJhY2s7CiAJRFdPUkQJZHdDdXJGcmFtZTsKLQlVSU5UCW5UcmFja3M7CisJVUlOVDE2CW5UcmFja3M7CiAJRFdPUkQJZHdUb3RhbExlbjsKIAlMUERXT1JECWxwZHdUcmFja0xlbjsKIAlMUERXT1JECWxwZHdUcmFja1BvczsKQEAgLTU1LDI2ICs1MSwyNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlBTklNX21jaU9wZW4JCQlbaW50ZXJuYWxdCiAqLwotc3RhdGljIERXT1JEIEFOSU1fbWNpT3BlbihVSU5UIHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfT1BFTl9QQVJNUyBscFBhcm1zKQorc3RhdGljIERXT1JEIEFOSU1fbWNpT3BlbihVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9PUEVOX1BBUk1TIGxwUGFybXMpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKKwlpbnQgaW5kZXggPSBNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKTsKIAlMUFNUUgkJbHBzdHJFbGVtZW50TmFtZTsKIAljaGFyCQlzdHJbMTI4XTsKIAlkcHJpbnRmX21jaWFuaW0oc3RkZGViLCJBTklNX21jaU9wZW4oJTA0WCwgJTA4bFgsICVwKTtcbiIsIAogCQkJCQl3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7Ci0JaWYgKEFuaW1EZXZbd0RldklEXS5uVXNlQ291bnQgPiAwKSB7CisJaWYgKEFuaW1EZXZbaW5kZXhdLm5Vc2VDb3VudCA+IDApIHsKIAkJLyogVGhlIGRyaXZlciBhbHJlYWR5IG9wZW4gb24gdGhpcyBjaGFubmVsICovCiAJCS8qIElmIHRoZSBkcml2ZXIgd2FzIG9wZW5lZCBzaGFyZWFibGUgYmVmb3JlIGFuZCB0aGlzIG9wZW4gc3BlY2lmaWVzICovCiAJCS8qIHNoYXJlYWJsZSB0aGVuIGluY3JlbWVudCB0aGUgdXNlIGNvdW50ICovCi0JCWlmIChBbmltRGV2W3dEZXZJRF0uZlNoYXJlYWJsZSAmJiAoZHdGbGFncyAmIE1DSV9PUEVOX1NIQVJFQUJMRSkpCi0JCQkrK0FuaW1EZXZbd0RldklEXS5uVXNlQ291bnQ7CisJCWlmIChBbmltRGV2W2luZGV4XS5mU2hhcmVhYmxlICYmIChkd0ZsYWdzICYgTUNJX09QRU5fU0hBUkVBQkxFKSkKKwkJCSsrQW5pbURldltpbmRleF0ublVzZUNvdW50OwogCQllbHNlCiAJCQlyZXR1cm4gTUNJRVJSX01VU1RfVVNFX1NIQVJFQUJMRTsKIAkJfQogCWVsc2UgewotCQlBbmltRGV2W3dEZXZJRF0ublVzZUNvdW50ID0gMTsKLQkJQW5pbURldlt3RGV2SURdLmZTaGFyZWFibGUgPSBkd0ZsYWdzICYgTUNJX09QRU5fU0hBUkVBQkxFOworCQlBbmltRGV2W2luZGV4XS5uVXNlQ291bnQgPSAxOworCQlBbmltRGV2W2luZGV4XS5mU2hhcmVhYmxlID0gZHdGbGFncyAmIE1DSV9PUEVOX1NIQVJFQUJMRTsKIAkJfQogCWRwcmludGZfbWNpYW5pbShzdGRkZWIsIkFOSU1fbWNpT3BlbiAvLyB3RGV2SUQ9JTA0WFxuIiwgd0RldklEKTsKIAlscFBhcm1zLT53RGV2aWNlSUQgPSB3RGV2SUQ7CkBAIC04OCwyMSArODUsMjEgQEAKIAkJCUNoYXJVcHBlcjMyQShzdHIpOwogCQkJfQogCQl9Ci0JbWVtY3B5KCZBbmltRGV2W3dEZXZJRF0ub3BlblBhcm1zLCBscFBhcm1zLCBzaXplb2YoTUNJX09QRU5fUEFSTVMpKTsKLQlBbmltRGV2W3dEZXZJRF0ud05vdGlmeURldmljZUlEID0gbHBQYXJtcy0+d0RldmljZUlEOwotCUFuaW1EZXZbd0RldklEXS5tb2RlID0gMDsKLQlBbmltRGV2W3dEZXZJRF0uZHdUaW1lRm9ybWF0ID0gTUNJX0ZPUk1BVF9UTVNGOwotCUFuaW1EZXZbd0RldklEXS5uQ3VyVHJhY2sgPSAwOwotCUFuaW1EZXZbd0RldklEXS5uVHJhY2tzID0gMDsKLQlBbmltRGV2W3dEZXZJRF0uZHdUb3RhbExlbiA9IDA7Ci0JQW5pbURldlt3RGV2SURdLmxwZHdUcmFja0xlbiA9IE5VTEw7Ci0JQW5pbURldlt3RGV2SURdLmxwZHdUcmFja1BvcyA9IE5VTEw7CisJbWVtY3B5KCZBbmltRGV2W2luZGV4XS5vcGVuUGFybXMsIGxwUGFybXMsIHNpemVvZihNQ0lfT1BFTl9QQVJNUykpOworCUFuaW1EZXZbaW5kZXhdLndOb3RpZnlEZXZpY2VJRCA9IGxwUGFybXMtPndEZXZpY2VJRDsKKwlBbmltRGV2W2luZGV4XS5tb2RlID0gMDsKKwlBbmltRGV2W2luZGV4XS5kd1RpbWVGb3JtYXQgPSBNQ0lfRk9STUFUX1RNU0Y7CisJQW5pbURldltpbmRleF0ubkN1clRyYWNrID0gMDsKKwlBbmltRGV2W2luZGV4XS5uVHJhY2tzID0gMDsKKwlBbmltRGV2W2luZGV4XS5kd1RvdGFsTGVuID0gMDsKKwlBbmltRGV2W2luZGV4XS5scGR3VHJhY2tMZW4gPSBOVUxMOworCUFuaW1EZXZbaW5kZXhdLmxwZHdUcmFja1BvcyA9IE5VTEw7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSB7CiAJCWRwcmludGZfbWNpYW5pbShzdGRkZWIsCiAJCQkiQU5JTV9tY2lPcGVuIC8vIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCAKIAkJCWxwUGFybXMtPmR3Q2FsbGJhY2spOwogCQltY2lEcml2ZXJOb3RpZnkoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAotCQkJQW5pbURldlt3RGV2SURdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKKwkJCUFuaW1EZXZbaW5kZXhdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKIAkJfQogIAlyZXR1cm4gMDsKICNlbHNlCkBAIC0xMTMsMTMgKzExMCwxNCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlBTklNX21jaUNsb3NlCQlbaW50ZXJuYWxdCiAqLwotc3RhdGljIERXT1JEIEFOSU1fbWNpQ2xvc2UoVUlOVCB3RGV2SUQsIERXT1JEIGR3UGFyYW0sIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcykKK3N0YXRpYyBEV09SRCBBTklNX21jaUNsb3NlKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3UGFyYW0sIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcykKIHsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQorCWludCBpbmRleCA9IE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpOwogCWRwcmludGZfbWNpYW5pbShzdGRkZWIsIkFOSU1fbWNpQ2xvc2UoJXUsICUwOGxYLCAlcCk7XG4iLCAKIAkJCQl3RGV2SUQsIGR3UGFyYW0sIGxwUGFybXMpOwotCWlmIChBbmltRGV2W3dEZXZJRF0ubHBkd1RyYWNrTGVuICE9IE5VTEwpIGZyZWUoQW5pbURldlt3RGV2SURdLmxwZHdUcmFja0xlbik7Ci0JaWYgKEFuaW1EZXZbd0RldklEXS5scGR3VHJhY2tQb3MgIT0gTlVMTCkgZnJlZShBbmltRGV2W3dEZXZJRF0ubHBkd1RyYWNrUG9zKTsKKwlpZiAoQW5pbURldltpbmRleF0ubHBkd1RyYWNrTGVuICE9IE5VTEwpIGZyZWUoQW5pbURldltpbmRleF0ubHBkd1RyYWNrTGVuKTsKKwlpZiAoQW5pbURldltpbmRleF0ubHBkd1RyYWNrUG9zICE9IE5VTEwpIGZyZWUoQW5pbURldltpbmRleF0ubHBkd1RyYWNrUG9zKTsKICNlbmRpZgogICAgICAgICByZXR1cm4gMDsKIH0KQEAgLTEyNyw3ICsxMjUsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlBTklNX21jaUdldERldkNhcHMJW2ludGVybmFsXQogKi8KLXN0YXRpYyBEV09SRCBBTklNX21jaUdldERldkNhcHMoVUlOVCB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIAorc3RhdGljIERXT1JEIEFOSU1fbWNpR2V0RGV2Q2FwcyhVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCAKIAkJCQkJCUxQTUNJX0dFVERFVkNBUFNfUEFSTVMgbHBQYXJtcykKIHsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQpAQCAtMTgzLDE0ICsxODEsMTUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJQU5JTV9DYWxjVGltZQkJCVtpbnRlcm5hbF0KICovCi1zdGF0aWMgRFdPUkQgQU5JTV9DYWxjVGltZShVSU5UIHdEZXZJRCwgRFdPUkQgZHdGb3JtYXRUeXBlLCBEV09SRCBkd0ZyYW1lKQorc3RhdGljIERXT1JEIEFOSU1fQ2FsY1RpbWUoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGb3JtYXRUeXBlLCBEV09SRCBkd0ZyYW1lKQogewogCURXT1JECWR3VGltZSA9IDA7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLQlVSU5UCXdUcmFjazsKLQlVSU5UCXdNaW51dGVzOwotCVVJTlQJd1NlY29uZHM7Ci0JVUlOVAl3RnJhbWVzOworCWludCBpbmRleCA9IE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpOworCVVJTlQxNgl3VHJhY2s7CisJVUlOVDE2CXdNaW51dGVzOworCVVJTlQxNgl3U2Vjb25kczsKKwlVSU5UMTYJd0ZyYW1lczsKIAlkcHJpbnRmX21jaWFuaW0oc3RkZGViLCJBTklNX0NhbGNUaW1lKCV1LCAlMDhsWCwgJWx1KTtcbiIsIAogCQkJd0RldklELCBkd0Zvcm1hdFR5cGUsIGR3RnJhbWUpOwogICAgIApAQCAtMjEzLDExICsyMTIsMTEgQEAKIAkJCS8qIHVua25vd24gZm9ybWF0ICEgZm9yY2UgVE1TRiAhIC4uLiAqLwogCQkJZHdGb3JtYXRUeXBlID0gTUNJX0ZPUk1BVF9UTVNGOwogCQljYXNlIE1DSV9GT1JNQVRfVE1TRjoKLQkJCWZvciAod1RyYWNrID0gMDsgd1RyYWNrIDwgQW5pbURldlt3RGV2SURdLm5UcmFja3M7IHdUcmFjaysrKSB7Ci0vKgkJCQlkd1RpbWUgKz0gQW5pbURldlt3RGV2SURdLmxwZHdUcmFja0xlblt3VHJhY2sgLSAxXTsKKwkJCWZvciAod1RyYWNrID0gMDsgd1RyYWNrIDwgQW5pbURldltpbmRleF0ublRyYWNrczsgd1RyYWNrKyspIHsKKy8qCQkJCWR3VGltZSArPSBBbmltRGV2W2luZGV4XS5scGR3VHJhY2tMZW5bd1RyYWNrIC0gMV07CiAJCQkJcHJpbnRmKCJBZGRpbmcgdHJrIyV1IGN1cnBvcz0ldSBcbiIsIGR3VGltZSk7CiAJCQkJaWYgKGR3VGltZSA+PSBkd0ZyYW1lKSBicmVhazsgKi8KLQkJCQlpZiAoQW5pbURldlt3RGV2SURdLmxwZHdUcmFja1Bvc1t3VHJhY2sgLSAxXSA+PSBkd0ZyYW1lKSBicmVhazsKKwkJCQlpZiAoQW5pbURldltpbmRleF0ubHBkd1RyYWNrUG9zW3dUcmFjayAtIDFdID49IGR3RnJhbWUpIGJyZWFrOwogCQkJCX0KIAkJCXdNaW51dGVzID0gZHdGcmFtZSAvIEFOSU1GUkFNRVNfUEVSTUlOOwogCQkJd1NlY29uZHMgPSAoZHdGcmFtZSAtIEFOSU1GUkFNRVNfUEVSTUlOICogd01pbnV0ZXMpIC8gQU5JTUZSQU1FU19QRVJTRUM7CkBAIC0yMzcsMTEgKzIzNiwxMiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlBTklNX0NhbGNGcmFtZQkJCVtpbnRlcm5hbF0KICovCi1zdGF0aWMgRFdPUkQgQU5JTV9DYWxjRnJhbWUoVUlOVCB3RGV2SUQsIERXT1JEIGR3Rm9ybWF0VHlwZSwgRFdPUkQgZHdUaW1lKQorc3RhdGljIERXT1JEIEFOSU1fQ2FsY0ZyYW1lKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3Rm9ybWF0VHlwZSwgRFdPUkQgZHdUaW1lKQogewogCURXT1JECWR3RnJhbWUgPSAwOwogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCi0JVUlOVAl3VHJhY2s7CisJaW50IGluZGV4ID0gTU1TWVNURU1fRGV2SURUb0luZGV4KHdEZXZJRCk7CisJVUlOVDE2CXdUcmFjazsKIAlkcHJpbnRmX21jaWFuaW0oc3RkZGViLCJBTklNX0NhbGNGcmFtZSgldSwgJTA4bFgsICVsdSk7XG4iLCAKIAkJCXdEZXZJRCwgZHdGb3JtYXRUeXBlLCBkd1RpbWUpOwogCkBAIC0yNzEsOCArMjcxLDggQEAKIAkJCQlNQ0lfVE1TRl9TRUNPTkQoZHdUaW1lKSwgTUNJX1RNU0ZfRlJBTUUoZHdUaW1lKSk7CiAJCQlkcHJpbnRmX21jaWFuaW0oc3RkZGViLAogCQkJCSJBTklNX0NhbGNGcmFtZSAvLyBUTVNGIHRyYWNrcG9zWyV1XT0lbHVcbiIsCi0JCQkJd1RyYWNrLCBBbmltRGV2W3dEZXZJRF0ubHBkd1RyYWNrUG9zW3dUcmFjayAtIDFdKTsKLQkJCWR3RnJhbWUgPSBBbmltRGV2W3dEZXZJRF0ubHBkd1RyYWNrUG9zW3dUcmFjayAtIDFdOworCQkJCXdUcmFjaywgQW5pbURldltpbmRleF0ubHBkd1RyYWNrUG9zW3dUcmFjayAtIDFdKTsKKwkJCWR3RnJhbWUgPSBBbmltRGV2W2luZGV4XS5scGR3VHJhY2tQb3Nbd1RyYWNrIC0gMV07CiAJCQlkd0ZyYW1lICs9IEFOSU1GUkFNRVNfUEVSTUlOICogTUNJX1RNU0ZfTUlOVVRFKGR3VGltZSk7CiAJCQlkd0ZyYW1lICs9IEFOSU1GUkFNRVNfUEVSU0VDICogTUNJX1RNU0ZfU0VDT05EKGR3VGltZSk7CiAJCQlkd0ZyYW1lICs9IE1DSV9UTVNGX0ZSQU1FKGR3VGltZSk7CkBAIC0yODYsOSArMjg2LDEwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCUFOSU1fbWNpSW5mbwkJCVtpbnRlcm5hbF0KICovCi1zdGF0aWMgRFdPUkQgQU5JTV9tY2lJbmZvKFVJTlQgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9JTkZPX1BBUk1TIGxwUGFybXMpCitzdGF0aWMgRFdPUkQgQU5JTV9tY2lJbmZvKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0lORk9fUEFSTVMgbHBQYXJtcykKIHsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQorCWludCBpbmRleCA9IE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpOwogCWRwcmludGZfbWNpYW5pbShzdGRkZWIsIkFOSU1fbWNpSW5mbygldSwgJTA4bFgsICVwKTtcbiIsIAogCQl3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CkBAIC0yOTksNyArMzAwLDcgQEAKIAkJCWJyZWFrOwogCQljYXNlIE1DSV9JTkZPX0ZJTEU6CiAJCQlscFBhcm1zLT5scHN0clJldHVybiA9IAotCQkJCShMUFNUUilBbmltRGV2W3dEZXZJRF0ub3BlblBhcm1zLmxwc3RyRWxlbWVudE5hbWU7CisJCQkJKExQU1RSKUFuaW1EZXZbaW5kZXhdLm9wZW5QYXJtcy5scHN0ckVsZW1lbnROYW1lOwogCQkJYnJlYWs7CiAJCWNhc2UgTUNJX0FOSU1fSU5GT19URVhUOgogCQkJbHBQYXJtcy0+bHBzdHJSZXR1cm4gPSAiQW5pbWF0aW9uIFdpbmRvdyI7CkBAIC0zMjAsOSArMzIxLDEwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCUFOSU1fbWNpU3RhdHVzCQlbaW50ZXJuYWxdCiAqLwotc3RhdGljIERXT1JEIEFOSU1fbWNpU3RhdHVzKFVJTlQgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9TVEFUVVNfUEFSTVMgbHBQYXJtcykKK3N0YXRpYyBEV09SRCBBTklNX21jaVN0YXR1cyhVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9TVEFUVVNfUEFSTVMgbHBQYXJtcykKIHsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQorCWludCBpbmRleCA9IE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpOwogCWRwcmludGZfbWNpYW5pbShzdGRkZWIsIkFOSU1fbWNpU3RhdHVzKCV1LCAlMDhsWCwgJXApO1xuIiwgCiAJCQl3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CkBAIC0zMzEsMzAgKzMzMywzMCBAQAogCQkJIkFOSU1fbWNpU3RhdHVzIC8vIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCAKIAkJCWxwUGFybXMtPmR3Q2FsbGJhY2spOwogCQltY2lEcml2ZXJOb3RpZnkoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAotCQkJQW5pbURldlt3RGV2SURdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKKwkJCUFuaW1EZXZbaW5kZXhdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKIAkJfQogCWlmIChkd0ZsYWdzICYgTUNJX1NUQVRVU19JVEVNKSB7CiAJCXN3aXRjaChscFBhcm1zLT5kd0l0ZW0pIHsKIAkJCWNhc2UgTUNJX1NUQVRVU19DVVJSRU5UX1RSQUNLOgotCQkJCWxwUGFybXMtPmR3UmV0dXJuID0gQW5pbURldlt3RGV2SURdLm5DdXJUcmFjazsKKwkJCQlscFBhcm1zLT5kd1JldHVybiA9IEFuaW1EZXZbaW5kZXhdLm5DdXJUcmFjazsKIAkJCQlkcHJpbnRmX21jaWFuaW0oc3RkZGViLCJBTklNX21jaVN0YXR1cyAvLyBDVVJSRU5UX1RSQUNLPSVsdSFcbiIsIGxwUGFybXMtPmR3UmV0dXJuKTsKIAkJCSAJcmV0dXJuIDA7CiAJCQljYXNlIE1DSV9TVEFUVVNfTEVOR1RIOgogCQkJCWlmIChkd0ZsYWdzICYgTUNJX1RSQUNLKSB7CiAJCQkJCWRwcmludGZfbWNpYW5pbShzdGRkZWIsIkFOSU1fbWNpU3RhdHVzIC8vIE1DSV9UUkFDSyAjJWx1IExFTkdUSD0/Pz8gIVxuIiwKIAkJCQkJCQkJCQkJCQkJbHBQYXJtcy0+ZHdUcmFjayk7Ci0JCQkJCWlmIChscFBhcm1zLT5kd1RyYWNrID4gQW5pbURldlt3RGV2SURdLm5UcmFja3MpCisJCQkJCWlmIChscFBhcm1zLT5kd1RyYWNrID4gQW5pbURldltpbmRleF0ublRyYWNrcykKIAkJCQkJCXJldHVybiBNQ0lFUlJfT1VUT0ZSQU5HRTsKLQkJCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSBBbmltRGV2W3dEZXZJRF0ubHBkd1RyYWNrTGVuW2xwUGFybXMtPmR3VHJhY2tdOworCQkJCQlscFBhcm1zLT5kd1JldHVybiA9IEFuaW1EZXZbaW5kZXhdLmxwZHdUcmFja0xlbltscFBhcm1zLT5kd1RyYWNrXTsKIAkJCQkJfQogCQkJCWVsc2UKLQkJCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSBBbmltRGV2W3dEZXZJRF0uZHdUb3RhbExlbjsKKwkJCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSBBbmltRGV2W2luZGV4XS5kd1RvdGFsTGVuOwogCQkJCWxwUGFybXMtPmR3UmV0dXJuID0gQU5JTV9DYWxjVGltZSh3RGV2SUQsIAotCQkJCQlBbmltRGV2W3dEZXZJRF0uZHdUaW1lRm9ybWF0LCBscFBhcm1zLT5kd1JldHVybik7CisJCQkJCUFuaW1EZXZbaW5kZXhdLmR3VGltZUZvcm1hdCwgbHBQYXJtcy0+ZHdSZXR1cm4pOwogICAgICAgICAgICAgICAgIAkJZHByaW50Zl9tY2lhbmltKHN0ZGRlYiwiQU5JTV9tY2lTdGF0dXMgLy8gTEVOR1RIPSVsdSAhXG4iLCBscFBhcm1zLT5kd1JldHVybik7CiAJCQkgCXJldHVybiAwOwogCQkJY2FzZSBNQ0lfU1RBVFVTX01PREU6Ci0JCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSBBbmltRGV2W3dEZXZJRF0ubW9kZTsKKwkJCQlscFBhcm1zLT5kd1JldHVybiA9IEFuaW1EZXZbaW5kZXhdLm1vZGU7CiAJCQkJZHByaW50Zl9tY2lhbmltKHN0ZGRlYiwiQU5JTV9tY2lTdGF0dXMgLy8gTUNJX1NUQVRVU19NT0RFPSUwOGxYICFcbiIsCiAJCQkJCQkJCQkJCQlscFBhcm1zLT5kd1JldHVybik7CiAJCQkgCXJldHVybiAwOwpAQCAtMzY5LDE5ICszNzEsMTkgQEAKIAkJCQlpZiAobHBQYXJtcy0+ZHdSZXR1cm4gPT0gKFdPUkQpLTEpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJCQkgCXJldHVybiAwOwogCQkJY2FzZSBNQ0lfU1RBVFVTX1BPU0lUSU9OOgotCQkJCWxwUGFybXMtPmR3UmV0dXJuID0gQW5pbURldlt3RGV2SURdLmR3Q3VyRnJhbWU7CisJCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSBBbmltRGV2W2luZGV4XS5kd0N1ckZyYW1lOwogCQkJCWlmIChkd0ZsYWdzICYgTUNJX1NUQVRVU19TVEFSVCkgewogCQkJCQlscFBhcm1zLT5kd1JldHVybiA9IDA7CiAJCQkJCWRwcmludGZfbWNpYW5pbShzdGRkZWIsIkNEQVVESU9fbWNpU3RhdHVzIC8vIGdldCBNQ0lfU1RBVFVTX1NUQVJUICFcbiIpOwogCQkJCQl9CiAJCQkJaWYgKGR3RmxhZ3MgJiBNQ0lfVFJBQ0spIHsKLQkJCQkJaWYgKGxwUGFybXMtPmR3VHJhY2sgPiBBbmltRGV2W3dEZXZJRF0ublRyYWNrcykKKwkJCQkJaWYgKGxwUGFybXMtPmR3VHJhY2sgPiBBbmltRGV2W2luZGV4XS5uVHJhY2tzKQogCQkJCQkJcmV0dXJuIE1DSUVSUl9PVVRPRlJBTkdFOwotCQkJCQlscFBhcm1zLT5kd1JldHVybiA9IEFuaW1EZXZbd0RldklEXS5scGR3VHJhY2tQb3NbbHBQYXJtcy0+ZHdUcmFjayAtIDFdOworCQkJCQlscFBhcm1zLT5kd1JldHVybiA9IEFuaW1EZXZbaW5kZXhdLmxwZHdUcmFja1Bvc1tscFBhcm1zLT5kd1RyYWNrIC0gMV07CiAJCQkJCWRwcmludGZfbWNpYW5pbShzdGRkZWIsIkFOSU1fbWNpU3RhdHVzIC8vIGdldCBNQ0lfVFJBQ0sgIyVsdSAhXG4iLCBscFBhcm1zLT5kd1RyYWNrKTsKIAkJCQkJfQogCQkJCWxwUGFybXMtPmR3UmV0dXJuID0gQU5JTV9DYWxjVGltZSh3RGV2SUQsIAotCQkJCQlBbmltRGV2W3dEZXZJRF0uZHdUaW1lRm9ybWF0LCBscFBhcm1zLT5kd1JldHVybik7CisJCQkJCUFuaW1EZXZbaW5kZXhdLmR3VGltZUZvcm1hdCwgbHBQYXJtcy0+ZHdSZXR1cm4pOwogCQkJCQlkcHJpbnRmX21jaWFuaW0oc3RkZGViLCJBTklNX21jaVN0YXR1cyAvLyBNQ0lfU1RBVFVTX1BPU0lUSU9OPSUwOGxYICFcbiIsCiAJCQkJCQkJCQkJCQkJCWxwUGFybXMtPmR3UmV0dXJuKTsKIAkJCSAJcmV0dXJuIDA7CkBAIC00MDksMzUgKzQxMSwzNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlBTklNX21jaVBsYXkJCQlbaW50ZXJuYWxdCiAqLwotc3RhdGljIERXT1JEIEFOSU1fbWNpUGxheShVSU5UIHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfUExBWV9QQVJNUyBscFBhcm1zKQorc3RhdGljIERXT1JEIEFOSU1fbWNpUGxheShVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9QTEFZX1BBUk1TIGxwUGFybXMpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKKwlpbnQgaW5kZXggPSBNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKTsKIAlpbnQgCXN0YXJ0LCBlbmQ7CiAJZHByaW50Zl9tY2lhbmltKHN0ZGRlYiwiQU5JTV9tY2lQbGF5KCV1LCAlMDhsWCwgJXApO1xuIiwgCiAJCXdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKLQlzdGFydCA9IDA7IAkJZW5kID0gQW5pbURldlt3RGV2SURdLmR3VG90YWxMZW47Ci0JQW5pbURldlt3RGV2SURdLm5DdXJUcmFjayA9IDE7CisJc3RhcnQgPSAwOyAJCWVuZCA9IEFuaW1EZXZbaW5kZXhdLmR3VG90YWxMZW47CisJQW5pbURldltpbmRleF0ubkN1clRyYWNrID0gMTsKIAlpZiAoZHdGbGFncyAmIE1DSV9GUk9NKSB7CiAJCXN0YXJ0ID0gQU5JTV9DYWxjRnJhbWUod0RldklELCAKLQkJCUFuaW1EZXZbd0RldklEXS5kd1RpbWVGb3JtYXQsIGxwUGFybXMtPmR3RnJvbSk7IAorCQkJQW5pbURldltpbmRleF0uZHdUaW1lRm9ybWF0LCBscFBhcm1zLT5kd0Zyb20pOyAKICAgICAgICAgZHByaW50Zl9tY2lhbmltKHN0ZGRlYiwiQU5JTV9tY2lQbGF5IC8vIE1DSV9GUk9NPSUwOGxYIC0+ICV1IFxuIiwKIAkJCQlscFBhcm1zLT5kd0Zyb20sIHN0YXJ0KTsKIAkJfQogCWlmIChkd0ZsYWdzICYgTUNJX1RPKSB7CiAJCWVuZCA9IEFOSU1fQ2FsY0ZyYW1lKHdEZXZJRCwgCi0JCQlBbmltRGV2W3dEZXZJRF0uZHdUaW1lRm9ybWF0LCBscFBhcm1zLT5kd1RvKTsKKwkJCUFuaW1EZXZbaW5kZXhdLmR3VGltZUZvcm1hdCwgbHBQYXJtcy0+ZHdUbyk7CiAgICAgICAgIAlkcHJpbnRmX21jaWFuaW0oc3RkZGViLAogCQkJIkFOSU1fbWNpUGxheSAvLyBNQ0lfVE89JTA4bFggLT4gJXUgXG4iLAogCQkJbHBQYXJtcy0+ZHdUbywgZW5kKTsKIAkJfQotCUFuaW1EZXZbd0RldklEXS5tb2RlID0gTUNJX01PREVfUExBWTsKKwlBbmltRGV2W2luZGV4XS5tb2RlID0gTUNJX01PREVfUExBWTsKIAlpZiAoZHdGbGFncyAmIE1DSV9OT1RJRlkpIHsKIAkJZHByaW50Zl9tY2lhbmltKHN0ZGRlYiwKIAkJCSJBTklNX21jaVBsYXkgLy8gTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIAogCQkJbHBQYXJtcy0+ZHdDYWxsYmFjayk7CiAJCW1jaURyaXZlck5vdGlmeSgoSFdORDE2KUxPV09SRChscFBhcm1zLT5kd0NhbGxiYWNrKSwgCi0JCQlBbmltRGV2W3dEZXZJRF0ud05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOworCQkJQW5pbURldltpbmRleF0ud05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOwogCQl9CiAJcmV0dXJuIDA7CiAjZWxzZQpAQCAtNDQ4LDE5ICs0NTEsMjAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJQU5JTV9tY2lTdG9wCQkJW2ludGVybmFsXQogKi8KLXN0YXRpYyBEV09SRCBBTklNX21jaVN0b3AoVUlOVCB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcykKK3N0YXRpYyBEV09SRCBBTklNX21jaVN0b3AoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfR0VORVJJQ19QQVJNUyBscFBhcm1zKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCisJaW50IGluZGV4ID0gTU1TWVNURU1fRGV2SURUb0luZGV4KHdEZXZJRCk7CiAJZHByaW50Zl9tY2lhbmltKHN0ZGRlYiwiQU5JTV9tY2lTdG9wKCV1LCAlMDhsWCwgJXApO1xuIiwgCiAJCQl3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7Ci0JQW5pbURldlt3RGV2SURdLm1vZGUgPSBNQ0lfTU9ERV9TVE9QOworCUFuaW1EZXZbaW5kZXhdLm1vZGUgPSBNQ0lfTU9ERV9TVE9QOwogCWlmIChkd0ZsYWdzICYgTUNJX05PVElGWSkgewogCQlkcHJpbnRmX21jaWFuaW0oc3RkZGViLAogCQkJIkFOSU1fbWNpU3RvcCAvLyBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgCiAJCQlscFBhcm1zLT5kd0NhbGxiYWNrKTsKIAkJbWNpRHJpdmVyTm90aWZ5KChIV05EMTYpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKLQkJCUFuaW1EZXZbd0RldklEXS53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CisJCQlBbmltRGV2W2luZGV4XS53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CiAJCX0KICAJcmV0dXJuIDA7CiAjZWxzZQpAQCAtNDcxLDE5ICs0NzUsMjAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJQU5JTV9tY2lQYXVzZQkJW2ludGVybmFsXQogKi8KLXN0YXRpYyBEV09SRCBBTklNX21jaVBhdXNlKFVJTlQgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9HRU5FUklDX1BBUk1TIGxwUGFybXMpCitzdGF0aWMgRFdPUkQgQU5JTV9tY2lQYXVzZShVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9HRU5FUklDX1BBUk1TIGxwUGFybXMpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKKwlpbnQgaW5kZXggPSBNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKTsKIAlkcHJpbnRmX21jaWFuaW0oc3RkZGViLCJBTklNX21jaVBhdXNlKCV1LCAlMDhsWCwgJXApO1xuIiwgCiAJCXdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKLQlBbmltRGV2W3dEZXZJRF0ubW9kZSA9IE1DSV9NT0RFX1BBVVNFOworCUFuaW1EZXZbaW5kZXhdLm1vZGUgPSBNQ0lfTU9ERV9QQVVTRTsKIAlpZiAoZHdGbGFncyAmIE1DSV9OT1RJRlkpIHsKIAkJZHByaW50Zl9tY2lhbmltKHN0ZGRlYiwKIAkJCSJBTklNX21jaVBhdXNlIC8vIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCAKIAkJCWxwUGFybXMtPmR3Q2FsbGJhY2spOwogCQltY2lEcml2ZXJOb3RpZnkoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAotCQkJQW5pbURldlt3RGV2SURdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKKwkJCUFuaW1EZXZbaW5kZXhdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKIAkJfQogCXJldHVybiAwOwogI2Vsc2UKQEAgLTQ5NCwxOSArNDk5LDIwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCUFOSU1fbWNpUmVzdW1lCQlbaW50ZXJuYWxdCiAqLwotc3RhdGljIERXT1JEIEFOSU1fbWNpUmVzdW1lKFVJTlQgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9HRU5FUklDX1BBUk1TIGxwUGFybXMpCitzdGF0aWMgRFdPUkQgQU5JTV9tY2lSZXN1bWUoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfR0VORVJJQ19QQVJNUyBscFBhcm1zKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCisJaW50IGluZGV4ID0gTU1TWVNURU1fRGV2SURUb0luZGV4KHdEZXZJRCk7CiAJZHByaW50Zl9tY2lhbmltKHN0ZGRlYiwiQU5JTV9tY2lSZXN1bWUoJXUsICUwOGxYLCAlcCk7XG4iLCAKIAkJd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwotCUFuaW1EZXZbd0RldklEXS5tb2RlID0gTUNJX01PREVfU1RPUDsKKwlBbmltRGV2W2luZGV4XS5tb2RlID0gTUNJX01PREVfU1RPUDsKIAlpZiAoZHdGbGFncyAmIE1DSV9OT1RJRlkpIHsKIAkJZHByaW50Zl9tY2lhbmltKHN0ZGRlYiwKIAkJCSJBTklNX21jaVJlc3VtZSAvLyBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgCiAJCQlscFBhcm1zLT5kd0NhbGxiYWNrKTsKIAkJbWNpRHJpdmVyTm90aWZ5KChIV05EMTYpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKLQkJCUFuaW1EZXZbd0RldklEXS53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CisJCQlBbmltRGV2W2luZGV4XS53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CiAJCX0KIAlyZXR1cm4gMDsKICNlbHNlCkBAIC01MTcsMjEgKzUyMywyMiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlBTklNX21jaVNlZWsJCQlbaW50ZXJuYWxdCiAqLwotc3RhdGljIERXT1JEIEFOSU1fbWNpU2VlayhVSU5UIHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfU0VFS19QQVJNUyBscFBhcm1zKQorc3RhdGljIERXT1JEIEFOSU1fbWNpU2VlayhVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9TRUVLX1BBUk1TIGxwUGFybXMpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKKwlpbnQgaW5kZXggPSBNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKTsKIAlEV09SRAlkd1JldDsKIAlNQ0lfUExBWV9QQVJNUyBQbGF5UGFybXM7CiAJZHByaW50Zl9tY2lhbmltKHN0ZGRlYiwiQU5JTV9tY2lTZWVrKCV1LCAlMDhsWCwgJXApO1xuIiwgCiAJCXdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKLQlBbmltRGV2W3dEZXZJRF0ubW9kZSA9IE1DSV9NT0RFX1NFRUs7CisJQW5pbURldltpbmRleF0ubW9kZSA9IE1DSV9NT0RFX1NFRUs7CiAJc3dpdGNoKGR3RmxhZ3MpIHsKIAkJY2FzZSBNQ0lfU0VFS19UT19TVEFSVDoKIAkJCVBsYXlQYXJtcy5kd0Zyb20gPSAwOwogCQkJYnJlYWs7CiAJCWNhc2UgTUNJX1NFRUtfVE9fRU5EOgotCQkJUGxheVBhcm1zLmR3RnJvbSA9IEFuaW1EZXZbd0RldklEXS5kd1RvdGFsTGVuOworCQkJUGxheVBhcm1zLmR3RnJvbSA9IEFuaW1EZXZbaW5kZXhdLmR3VG90YWxMZW47CiAJCQlicmVhazsKIAkJY2FzZSBNQ0lfVE86CiAJCQlQbGF5UGFybXMuZHdGcm9tID0gbHBQYXJtcy0+ZHdUbzsKQEAgLTU0NSw3ICs1NTIsNyBAQAogCQkJIkFOSU1fbWNpU2VlayAvLyBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgCiAJCQlscFBhcm1zLT5kd0NhbGxiYWNrKTsKIAkJbWNpRHJpdmVyTm90aWZ5KChIV05EMTYpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKLQkJCUFuaW1EZXZbd0RldklEXS53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CisJCQlBbmltRGV2W2luZGV4XS53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CiAJCX0KIAlyZXR1cm4gZHdSZXQ7CiAjZWxzZQpAQCAtNTU3LDkgKzU2NCwxMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlBTklNX21jaVNldAkJCVtpbnRlcm5hbF0KICovCi1zdGF0aWMgRFdPUkQgQU5JTV9tY2lTZXQoVUlOVCB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX1NFVF9QQVJNUyBscFBhcm1zKQorc3RhdGljIERXT1JEIEFOSU1fbWNpU2V0KFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX1NFVF9QQVJNUyBscFBhcm1zKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCisJaW50IGluZGV4ID0gTU1TWVNURU1fRGV2SURUb0luZGV4KHdEZXZJRCk7CiAJZHByaW50Zl9tY2lhbmltKHN0ZGRlYiwiQU5JTV9tY2lTZXQoJXUsICUwOGxYLCAlcCk7XG4iLCAKIAkJd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwpAQCAtNTgzLDcgKzU5MSw3IEBACiAJCQkJZnByaW50ZihzdGRlcnIsIkFOSU1fbWNpU2V0IC8vIGJhZCB0aW1lIGZvcm1hdCAhXG4iKTsKIAkJCQlyZXR1cm4gTUNJRVJSX0JBRF9USU1FX0ZPUk1BVDsKIAkJCX0KLQkJQW5pbURldlt3RGV2SURdLmR3VGltZUZvcm1hdCA9IGxwUGFybXMtPmR3VGltZUZvcm1hdDsKKwkJQW5pbURldltpbmRleF0uZHdUaW1lRm9ybWF0ID0gbHBQYXJtcy0+ZHdUaW1lRm9ybWF0OwogCQl9CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfU0VUX1ZJREVPKSByZXR1cm4gTUNJRVJSX1VOU1VQUE9SVEVEX0ZVTkNUSU9OOwogCWlmIChkd0ZsYWdzICYgTUNJX1NFVF9PTikgcmV0dXJuIE1DSUVSUl9VTlNVUFBPUlRFRF9GVU5DVElPTjsKQEAgLTU5Myw3ICs2MDEsNyBAQAogCQkJIkFOSU1fbWNpU2V0IC8vIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCAKIAkJCWxwUGFybXMtPmR3Q2FsbGJhY2spOwogCQltY2lEcml2ZXJOb3RpZnkoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAotCQkJQW5pbURldlt3RGV2SURdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKKwkJCUFuaW1EZXZbaW5kZXhdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKIAkJfQogCXJldHVybiAwOwogI2Vsc2UKQEAgLTY3NSw1ICs2ODMsMyBAQAogCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jZW5kaWYgLyogI2lmZGVmIEJVSUxUSU5fTU1TWVNURU0gKi8KZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvbWNpY2RhLmMgYi9tdWx0aW1lZGlhL21jaWNkYS5jCmluZGV4IGZlYmFiODQuLjVjOTc4MWQgMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvbWNpY2RhLmMKKysrIGIvbXVsdGltZWRpYS9tY2ljZGEuYwpAQCAtNCwxMiArNCw2IEBACiAgKiBDb3B5cmlnaHQgMTk5NCBNYXJ0aW4gQXlvdHRlCiAgKi8KIAotI2lmbmRlZiBXSU5FTElCCi0jZGVmaW5lIEJVSUxUSU5fTU1TWVNURU0KLSNlbmRpZiAKLQotI2lmZGVmIEJVSUxUSU5fTU1TWVNURU0KLQogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CkBAIC0zMSw2ICsyNSw4IEBACiAjaW5jbHVkZSA8c3lzL2NkaW8uaD4KICNlbmRpZgogCitpbnQgTU1TWVNURU1fRGV2SURUb0luZGV4KFVJTlQxNik7CisKICNkZWZpbmUgU09VTkRfREVWICIvZGV2L2RzcCIKICNpZmRlZiBfX0ZyZWVCU0RfXwogI2RlZmluZSBDREFVRElPX0RFViAiL2Rldi9yY2QwYyIKQEAgLTU0LDcgKzUwLDcgQEAKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQogdHlwZWRlZiBzdHJ1Y3QgewogICAgIGludCAgICAgblVzZUNvdW50OyAgICAgICAgICAvKiBJbmNyZW1lbnRlZCBmb3IgZWFjaCBzaGFyZWQgb3BlbiAqLwotICAgIEJPT0wgICAgZlNoYXJlYWJsZTsgICAgICAgICAvKiBUUlVFIGlmIGZpcnN0IG9wZW4gd2FzIHNoYXJlYWJsZSAqLworICAgIEJPT0wxNiAgZlNoYXJlYWJsZTsgICAgICAgICAvKiBUUlVFIGlmIGZpcnN0IG9wZW4gd2FzIHNoYXJlYWJsZSAqLwogICAgIFdPUkQgICAgd05vdGlmeURldmljZUlEOyAgICAvKiBNQ0kgZGV2aWNlIElEIHdpdGggYSBwZW5kaW5nIG5vdGlmaWNhdGlvbiAqLwogICAgIEhBTkRMRTE2IGhDYWxsYmFjazsgICAgICAgICAgLyogQ2FsbGJhY2sgaGFuZGxlIGZvciBwZW5kaW5nIG5vdGlmaWNhdGlvbiAqLwogCU1DSV9PUEVOX1BBUk1TIG9wZW5QYXJtczsKQEAgLTY2LDkgKzYyLDkgQEAKIAlzdHJ1Y3QgY2Rfc3ViX2NoYW5uZWxfaW5mbwlzYzsKICNlbmRpZgogCWludAkJbW9kZTsKLQlVSU5UCW5DdXJUcmFjazsKKwlVSU5UMTYJbkN1clRyYWNrOwogCURXT1JECWR3Q3VyRnJhbWU7Ci0JVUlOVAluVHJhY2tzOworCVVJTlQxNgluVHJhY2tzOwogCURXT1JECWR3VG90YWxMZW47CiAJTFBEV09SRAlscGR3VHJhY2tMZW47CiAJTFBEV09SRAlscGR3VHJhY2tQb3M7CkBAIC04NSwxNiArODEsMTcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJQ0RBVURJT19HZXROdW1iZXJPZlRyYWNrcwkJW2ludGVybmFsXQogKi8KLXN0YXRpYyBVSU5UIENEQVVESU9fR2V0TnVtYmVyT2ZUcmFja3MoVUlOVCB3RGV2SUQpCitzdGF0aWMgVUlOVDE2IENEQVVESU9fR2V0TnVtYmVyT2ZUcmFja3MoVUlOVDE2IHdEZXZJRCkKIHsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQorCWludCBpbmRleCA9IE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpOwogI2lmZGVmIGxpbnV4CiAJc3RydWN0IGNkcm9tX3RvY2hkcgloZHI7CiAjZWxpZiBfX0ZyZWVCU0RfXwogCXN0cnVjdCBpb2NfdG9jX2hlYWRlcgloZHI7CiAjZW5kaWYKLQlpZiAoQ0RBRGV2W3dEZXZJRF0ublRyYWNrcyA9PSAwKSB7Ci0JCWlmIChpb2N0bChDREFEZXZbd0RldklEXS51bml4ZGV2LAorCWlmIChDREFEZXZbaW5kZXhdLm5UcmFja3MgPT0gMCkgeworCQlpZiAoaW9jdGwoQ0RBRGV2W2luZGV4XS51bml4ZGV2LAogI2lmZGVmIGxpbnV4CiAJCQkgIENEUk9NUkVBRFRPQ0hEUgogI2VsaWYgX19GcmVlQlNEX18KQEAgLTEwMiwxNyArOTksMTcgQEAKICNlbmRpZgogCQkJICAsICZoZHIpKSB7CiAgICAgICAgICAgICAJCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsCi0JCQkJIkdldE51bWJlck9mVHJhY2tzKCV1KSAvLyBFcnJvciBvY2N1cmVkICFcbiIsIAorCQkJCSJHZXROdW1iZXJPZlRyYWNrcyglMDRYKSAvLyBFcnJvciBvY2N1cmVkICFcbiIsIAogCQkJCXdEZXZJRCk7CiAJCQlyZXR1cm4gKFdPUkQpLTE7CiAJCQl9CiAjaWZkZWYgbGludXgKLQkJQ0RBRGV2W3dEZXZJRF0ublRyYWNrcyA9IGhkci5jZHRoX3RyazE7CisJCUNEQURldltpbmRleF0ublRyYWNrcyA9IGhkci5jZHRoX3RyazE7CiAjZWxpZiBfX0ZyZWVCU0RfXwotCQlDREFEZXZbd0RldklEXS5uVHJhY2tzID0gaGRyLmVuZGluZ190cmFjayAtIGhkci5zdGFydGluZ190cmFjayArIDE7CisJCUNEQURldltpbmRleF0ublRyYWNrcyA9IGhkci5lbmRpbmdfdHJhY2sgLSBoZHIuc3RhcnRpbmdfdHJhY2sgKyAxOwogI2VuZGlmCiAJCX0KLQlyZXR1cm4gQ0RBRGV2W3dEZXZJRF0ublRyYWNrczsKKwlyZXR1cm4gQ0RBRGV2W2luZGV4XS5uVHJhY2tzOwogI2Vsc2UKIAlyZXR1cm4gKFdPUkQpLTE7CiAjZW5kaWYKQEAgLTEyMiw5ICsxMTksMTAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJQ0RBVURJT19HZXRUcmFja3NJbmZvCQkJW2ludGVybmFsXQogKi8KLXN0YXRpYyBCT09MIENEQVVESU9fR2V0VHJhY2tzSW5mbyhVSU5UIHdEZXZJRCkKK3N0YXRpYyBCT09MMzIgQ0RBVURJT19HZXRUcmFja3NJbmZvKFVJTlQxNiB3RGV2SUQpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKKwlpbnQgaW5kZXggPSBNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKTsKIAlpbnQJCWksIGxlbmd0aDsKIAlpbnQJCXN0YXJ0LCBsYXN0X3N0YXJ0ID0gMDsKIAlpbnQJCXRvdGFsX2xlbmd0aCA9IDA7CkBAIC0xMzQsMzEgKzEzMiwzMSBAQAogCXN0cnVjdCBpb2NfcmVhZF90b2NfZW50cnkJZW50cnk7CiAJc3RydWN0IGNkX3RvY19lbnRyeSAgICAgICAgICAgICB0b2NfYnVmZmVyOwogI2VuZGlmCi0JaWYgKENEQURldlt3RGV2SURdLm5UcmFja3MgPT0gMCkgeworCWlmIChDREFEZXZbaW5kZXhdLm5UcmFja3MgPT0gMCkgewogCQlpZiAoQ0RBVURJT19HZXROdW1iZXJPZlRyYWNrcyh3RGV2SUQpID09IChXT1JEKS0xKSByZXR1cm4gRkFMU0U7CiAJCX0KICAgICAJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwiQ0RBVURJT19HZXRUcmFja3NJbmZvIC8vIG5UcmFja3M9JXVcbiIsIAotCQlDREFEZXZbd0RldklEXS5uVHJhY2tzKTsKLQlpZiAoQ0RBRGV2W3dEZXZJRF0ubHBkd1RyYWNrTGVuICE9IE5VTEwpIAotCQlmcmVlKENEQURldlt3RGV2SURdLmxwZHdUcmFja0xlbik7Ci0JQ0RBRGV2W3dEZXZJRF0ubHBkd1RyYWNrTGVuID0gKExQRFdPUkQpbWFsbG9jKAotCQkoQ0RBRGV2W3dEZXZJRF0ublRyYWNrcyArIDEpICogc2l6ZW9mKERXT1JEKSk7Ci0JaWYgKENEQURldlt3RGV2SURdLmxwZHdUcmFja1BvcyAhPSBOVUxMKSAKLQkJZnJlZShDREFEZXZbd0RldklEXS5scGR3VHJhY2tQb3MpOwotCUNEQURldlt3RGV2SURdLmxwZHdUcmFja1BvcyA9IChMUERXT1JEKW1hbGxvYygKLQkJKENEQURldlt3RGV2SURdLm5UcmFja3MgKyAxKSAqIHNpemVvZihEV09SRCkpOwotCWlmIChDREFEZXZbd0RldklEXS5scGR3VHJhY2tMZW4gPT0gTlVMTCB8fAotCQlDREFEZXZbd0RldklEXS5scGR3VHJhY2tQb3MgPT0gTlVMTCkgeworCQlDREFEZXZbaW5kZXhdLm5UcmFja3MpOworCWlmIChDREFEZXZbaW5kZXhdLmxwZHdUcmFja0xlbiAhPSBOVUxMKSAKKwkJZnJlZShDREFEZXZbaW5kZXhdLmxwZHdUcmFja0xlbik7CisJQ0RBRGV2W2luZGV4XS5scGR3VHJhY2tMZW4gPSAoTFBEV09SRCltYWxsb2MoCisJCShDREFEZXZbaW5kZXhdLm5UcmFja3MgKyAxKSAqIHNpemVvZihEV09SRCkpOworCWlmIChDREFEZXZbaW5kZXhdLmxwZHdUcmFja1BvcyAhPSBOVUxMKSAKKwkJZnJlZShDREFEZXZbaW5kZXhdLmxwZHdUcmFja1Bvcyk7CisJQ0RBRGV2W2luZGV4XS5scGR3VHJhY2tQb3MgPSAoTFBEV09SRCltYWxsb2MoCisJCShDREFEZXZbaW5kZXhdLm5UcmFja3MgKyAxKSAqIHNpemVvZihEV09SRCkpOworCWlmIChDREFEZXZbaW5kZXhdLmxwZHdUcmFja0xlbiA9PSBOVUxMIHx8CisJCUNEQURldltpbmRleF0ubHBkd1RyYWNrUG9zID09IE5VTEwpIHsKICAgICAgICAgCQlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLAogCQkJCSJDREFVRElPX0dldFRyYWNrc0luZm8gLy8gZXJyb3IgYWxsb2NhdGluZyB0cmFjayB0YWJsZSAhXG4iKTsKIAkJcmV0dXJuIEZBTFNFOwogCQl9Ci0JbWVtc2V0KENEQURldlt3RGV2SURdLmxwZHdUcmFja0xlbiwgMCwgCi0JCShDREFEZXZbd0RldklEXS5uVHJhY2tzICsgMSkgKiBzaXplb2YoRFdPUkQpKTsKLQltZW1zZXQoQ0RBRGV2W3dEZXZJRF0ubHBkd1RyYWNrUG9zLCAwLCAKLQkJKENEQURldlt3RGV2SURdLm5UcmFja3MgKyAxKSAqIHNpemVvZihEV09SRCkpOwotCWZvciAoaSA9IDA7IGkgPD0gQ0RBRGV2W3dEZXZJRF0ublRyYWNrczsgaSsrKSB7Ci0JCWlmIChpID09IENEQURldlt3RGV2SURdLm5UcmFja3MpCisJbWVtc2V0KENEQURldltpbmRleF0ubHBkd1RyYWNrTGVuLCAwLCAKKwkJKENEQURldltpbmRleF0ublRyYWNrcyArIDEpICogc2l6ZW9mKERXT1JEKSk7CisJbWVtc2V0KENEQURldltpbmRleF0ubHBkd1RyYWNrUG9zLCAwLCAKKwkJKENEQURldltpbmRleF0ublRyYWNrcyArIDEpICogc2l6ZW9mKERXT1JEKSk7CisJZm9yIChpID0gMDsgaSA8PSBDREFEZXZbaW5kZXhdLm5UcmFja3M7IGkrKykgeworCQlpZiAoaSA9PSBDREFEZXZbaW5kZXhdLm5UcmFja3MpCiAjaWZkZWYgbGludXgKIAkJCWVudHJ5LmNkdGVfdHJhY2sgPSBDRFJPTV9MRUFET1VUOwogI2VsaWYgX19GcmVlQlNEX18KQEAgLTE3OSw3ICsxNzcsNyBAQAogCQllbnRyeS5kYXRhX2xlbiA9IHNpemVvZih0b2NfYnVmZmVyKTsKIAkgICAgICAgIGVudHJ5LmRhdGEgPSAmdG9jX2J1ZmZlcjsKICNlbmRpZgotCQlpZiAoaW9jdGwoQ0RBRGV2W3dEZXZJRF0udW5peGRldiwgCisJCWlmIChpb2N0bChDREFEZXZbaW5kZXhdLnVuaXhkZXYsIAogI2lmZGVmIGxpbnV4CiAJCQkgIENEUk9NUkVBRFRPQ0VOVFJZCiAjZWxpZiBfX0ZyZWVCU0RfXwpAQCAtMjAxLDcgKzE5OSw3IEBACiAjZW5kaWYKIAkJaWYgKGkgPT0gMCkgewogCQkJbGFzdF9zdGFydCA9IHN0YXJ0OwotCQkJQ0RBRGV2W3dEZXZJRF0uZHdGaXJzdE9mZnNldCA9IHN0YXJ0OworCQkJQ0RBRGV2W2luZGV4XS5kd0ZpcnN0T2Zmc2V0ID0gc3RhcnQ7CiAgICAgICAgICAgICAJCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsCiAJCQkJIkNEQVVESU9fR2V0VHJhY2tzSW5mbyAvLyBkd0ZpcnN0T2Zmc2V0PSV1XG4iLCAKIAkJCQlzdGFydCk7CkBAIC0yMTEsMTQgKzIwOSwxNCBAQAogCQkJbGFzdF9zdGFydCA9IHN0YXJ0OwogCQkJc3RhcnQgPSBsYXN0X3N0YXJ0IC0gbGVuZ3RoOwogCQkJdG90YWxfbGVuZ3RoICs9IGxlbmd0aDsKLQkJCUNEQURldlt3RGV2SURdLmxwZHdUcmFja0xlbltpIC0gMV0gPSBsZW5ndGg7Ci0JCQlDREFEZXZbd0RldklEXS5scGR3VHJhY2tQb3NbaSAtIDFdID0gc3RhcnQ7CisJCQlDREFEZXZbaW5kZXhdLmxwZHdUcmFja0xlbltpIC0gMV0gPSBsZW5ndGg7CisJCQlDREFEZXZbaW5kZXhdLmxwZHdUcmFja1Bvc1tpIC0gMV0gPSBzdGFydDsKICAgICAgICAgICAgIAkJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwKIAkJCSJDREFVRElPX0dldFRyYWNrc0luZm8gLy8gdHJhY2sgIyV1IHN0YXJ0PSV1IGxlbj0ldVxuIiwKIAkJCQlpLCBzdGFydCwgbGVuZ3RoKTsKIAkJCX0KIAkJfQotCUNEQURldlt3RGV2SURdLmR3VG90YWxMZW4gPSB0b3RhbF9sZW5ndGg7CisJQ0RBRGV2W2luZGV4XS5kd1RvdGFsTGVuID0gdG90YWxfbGVuZ3RoOwogICAgIAlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX0dldFRyYWNrc0luZm8gLy8gdG90YWxfbGVuPSV1XG4iLCAKIAkJdG90YWxfbGVuZ3RoKTsKIAlmZmx1c2goc3Rkb3V0KTsKQEAgLTIzMiw0NSArMjMwLDQ5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCUNEQVVESU9fbWNpT3BlbgkJCVtpbnRlcm5hbF0KICovCi1zdGF0aWMgRFdPUkQgQ0RBVURJT19tY2lPcGVuKFVJTlQgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9PUEVOX1BBUk1TIGxwUGFybXMpCitzdGF0aWMgRFdPUkQgQ0RBVURJT19tY2lPcGVuKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX09QRU5fUEFSTVMgbHBQYXJtcykKIHsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQorCWludCBpbmRleDsKICAgICAJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwiQ0RBVURJT19tY2lPcGVuKCUwNFgsICUwOGxYLCAlcCk7XG4iLCAKIAkJCQkJd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOworCiAJd0RldklEID0gbHBQYXJtcy0+d0RldmljZUlEOwotCWlmIChDREFEZXZbd0RldklEXS5uVXNlQ291bnQgPiAwKSB7CisJaW5kZXggPSBNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKTsKKworCWlmIChDREFEZXZbaW5kZXhdLm5Vc2VDb3VudCA+IDApIHsKIAkJLyogVGhlIGRyaXZlciBhbHJlYWR5IG9wZW4gb24gdGhpcyBjaGFubmVsICovCiAJCS8qIElmIHRoZSBkcml2ZXIgd2FzIG9wZW5lZCBzaGFyZWFibGUgYmVmb3JlIGFuZCB0aGlzIG9wZW4gc3BlY2lmaWVzICovCiAJCS8qIHNoYXJlYWJsZSB0aGVuIGluY3JlbWVudCB0aGUgdXNlIGNvdW50ICovCi0JCWlmIChDREFEZXZbd0RldklEXS5mU2hhcmVhYmxlICYmIChkd0ZsYWdzICYgTUNJX09QRU5fU0hBUkVBQkxFKSkKLQkJCSsrQ0RBRGV2W3dEZXZJRF0ublVzZUNvdW50OworCQlpZiAoQ0RBRGV2W2luZGV4XS5mU2hhcmVhYmxlICYmIChkd0ZsYWdzICYgTUNJX09QRU5fU0hBUkVBQkxFKSkKKwkJCSsrQ0RBRGV2W2luZGV4XS5uVXNlQ291bnQ7CiAJCWVsc2UKIAkJCXJldHVybiBNQ0lFUlJfTVVTVF9VU0VfU0hBUkVBQkxFOwogCQl9CiAJZWxzZSB7Ci0JCUNEQURldlt3RGV2SURdLm5Vc2VDb3VudCA9IDE7Ci0JCUNEQURldlt3RGV2SURdLmZTaGFyZWFibGUgPSBkd0ZsYWdzICYgTUNJX09QRU5fU0hBUkVBQkxFOworCQlDREFEZXZbaW5kZXhdLm5Vc2VDb3VudCA9IDE7CisJCUNEQURldltpbmRleF0uZlNoYXJlYWJsZSA9IGR3RmxhZ3MgJiBNQ0lfT1BFTl9TSEFSRUFCTEU7CiAJCX0KICAgICBpZiAoZHdGbGFncyAmIE1DSV9PUEVOX0VMRU1FTlQpIHsKIAkJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwiQ0RBVURJT19tY2lPcGVuIC8vIE1DSV9PUEVOX0VMRU1FTlQgIVxuIik7CiAvKgkJcmV0dXJuIE1DSUVSUl9OT19FTEVNRU5UX0FMTE9XRUQ7ICovCiAJCX0KLQltZW1jcHkoJkNEQURldlt3RGV2SURdLm9wZW5QYXJtcywgbHBQYXJtcywgc2l6ZW9mKE1DSV9PUEVOX1BBUk1TKSk7Ci0JQ0RBRGV2W3dEZXZJRF0ud05vdGlmeURldmljZUlEID0gbHBQYXJtcy0+d0RldmljZUlEOwotCUNEQURldlt3RGV2SURdLnVuaXhkZXYgPSBvcGVuIChDREFVRElPX0RFViwgT19SRE9OTFksIDApOwotCWlmIChDREFEZXZbd0RldklEXS51bml4ZGV2ID09IC0xKSB7CisJbWVtY3B5KCZDREFEZXZbaW5kZXhdLm9wZW5QYXJtcywgbHBQYXJtcywgc2l6ZW9mKE1DSV9PUEVOX1BBUk1TKSk7CisJQ0RBRGV2W2luZGV4XS53Tm90aWZ5RGV2aWNlSUQgPSBscFBhcm1zLT53RGV2aWNlSUQ7CisJQ0RBRGV2W2luZGV4XS51bml4ZGV2ID0gb3BlbiAoQ0RBVURJT19ERVYsIE9fUkRPTkxZLCAwKTsKKwlpZiAoQ0RBRGV2W2luZGV4XS51bml4ZGV2ID09IC0xKSB7CiAJCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fbWNpT3BlbiAvLyBjYW4ndCBvcGVuICclcycgIVxuIiwgQ0RBVURJT19ERVYpOwogCQlyZXR1cm4gTUNJRVJSX0hBUkRXQVJFOwogCQl9Ci0JQ0RBRGV2W3dEZXZJRF0ubW9kZSA9IDA7Ci0JQ0RBRGV2W3dEZXZJRF0uZHdUaW1lRm9ybWF0ID0gTUNJX0ZPUk1BVF9UTVNGOwotCUNEQURldlt3RGV2SURdLm5DdXJUcmFjayA9IDA7Ci0JQ0RBRGV2W3dEZXZJRF0ublRyYWNrcyA9IDA7Ci0JQ0RBRGV2W3dEZXZJRF0uZHdUb3RhbExlbiA9IDA7Ci0JQ0RBRGV2W3dEZXZJRF0uZHdGaXJzdE9mZnNldCA9IDA7Ci0JQ0RBRGV2W3dEZXZJRF0ubHBkd1RyYWNrTGVuID0gTlVMTDsKLQlDREFEZXZbd0RldklEXS5scGR3VHJhY2tQb3MgPSBOVUxMOworCUNEQURldltpbmRleF0ubW9kZSA9IDA7CisJQ0RBRGV2W2luZGV4XS5kd1RpbWVGb3JtYXQgPSBNQ0lfRk9STUFUX1RNU0Y7CisJQ0RBRGV2W2luZGV4XS5uQ3VyVHJhY2sgPSAwOworCUNEQURldltpbmRleF0ublRyYWNrcyA9IDA7CisJQ0RBRGV2W2luZGV4XS5kd1RvdGFsTGVuID0gMDsKKwlDREFEZXZbaW5kZXhdLmR3Rmlyc3RPZmZzZXQgPSAwOworCUNEQURldltpbmRleF0ubHBkd1RyYWNrTGVuID0gTlVMTDsKKwlDREFEZXZbaW5kZXhdLmxwZHdUcmFja1BvcyA9IE5VTEw7CiAJaWYgKCFDREFVRElPX0dldFRyYWNrc0luZm8od0RldklEKSkgewogCQlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX21jaU9wZW4gLy8gZXJyb3IgcmVhZGluZyBUcmFja3NJbmZvICFcbiIpOwogLyoJCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7ICovCkBAIC0yODAsNyArMjgyLDcgQEAKIAkJCSJDREFVRElPX21jaU9wZW4gLy8gTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIAogCQkJbHBQYXJtcy0+ZHdDYWxsYmFjayk7CiAJCW1jaURyaXZlck5vdGlmeSgoSFdORDE2KUxPV09SRChscFBhcm1zLT5kd0NhbGxiYWNrKSwgCi0JCQlDREFEZXZbd0RldklEXS53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CisJCQlDREFEZXZbaW5kZXhdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKIAkJfQogIAlyZXR1cm4gMDsKICNlbHNlCkBAIC0yOTEsMTQgKzI5MywxNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlDREFVRElPX21jaUNsb3NlCQlbaW50ZXJuYWxdCiAqLwotc3RhdGljIERXT1JEIENEQVVESU9fbWNpQ2xvc2UoVUlOVCB3RGV2SUQsIERXT1JEIGR3UGFyYW0sIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcykKK3N0YXRpYyBEV09SRCBDREFVRElPX21jaUNsb3NlKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3UGFyYW0sIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcykKIHsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQotICAgIAlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX21jaUNsb3NlKCV1LCAlMDhsWCwgJXApO1xuIiwgCisJaW50IGluZGV4ID0gTU1TWVNURU1fRGV2SURUb0luZGV4KHdEZXZJRCk7CisgICAgCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fbWNpQ2xvc2UoJTA0WCwgJTA4bFgsICVwKTtcbiIsIAogCQl3RGV2SUQsIGR3UGFyYW0sIGxwUGFybXMpOwotCWlmIChDREFEZXZbd0RldklEXS5scGR3VHJhY2tMZW4gIT0gTlVMTCkgZnJlZShDREFEZXZbd0RldklEXS5scGR3VHJhY2tMZW4pOwotCWlmIChDREFEZXZbd0RldklEXS5scGR3VHJhY2tQb3MgIT0gTlVMTCkgZnJlZShDREFEZXZbd0RldklEXS5scGR3VHJhY2tQb3MpOwotCWNsb3NlKENEQURldlt3RGV2SURdLnVuaXhkZXYpOworCWlmIChDREFEZXZbaW5kZXhdLmxwZHdUcmFja0xlbiAhPSBOVUxMKSBmcmVlKENEQURldltpbmRleF0ubHBkd1RyYWNrTGVuKTsKKwlpZiAoQ0RBRGV2W2luZGV4XS5scGR3VHJhY2tQb3MgIT0gTlVMTCkgZnJlZShDREFEZXZbaW5kZXhdLmxwZHdUcmFja1Bvcyk7CisJY2xvc2UoQ0RBRGV2W2luZGV4XS51bml4ZGV2KTsKICNlbmRpZgogICAgICAgICByZXR1cm4gMDsKIH0KQEAgLTMwNiwxMSArMzA5LDExIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCUNEQVVESU9fbWNpR2V0RGV2Q2FwcwlbaW50ZXJuYWxdCiAqLwotc3RhdGljIERXT1JEIENEQVVESU9fbWNpR2V0RGV2Q2FwcyhVSU5UIHdEZXZJRCwgRFdPUkQgZHdGbGFncywgCitzdGF0aWMgRFdPUkQgQ0RBVURJT19tY2lHZXREZXZDYXBzKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIAogCQkJCQkJTFBNQ0lfR0VUREVWQ0FQU19QQVJNUyBscFBhcm1zKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCi0gICAgCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fbWNpR2V0RGV2Q2FwcygldSwgJTA4bFgsICVwKTtcbiIsIAorICAgIAlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX21jaUdldERldkNhcHMoJTA0WCwgJTA4bFgsICVwKTtcbiIsIAogCQl3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfR0VUREVWQ0FQU19JVEVNKSB7CkBAIC0zNjEsMTAgKzM2NCwxMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlDREFVRElPX21jaUluZm8JCQlbaW50ZXJuYWxdCiAqLwotc3RhdGljIERXT1JEIENEQVVESU9fbWNpSW5mbyhVSU5UIHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfSU5GT19QQVJNUyBscFBhcm1zKQorc3RhdGljIERXT1JEIENEQVVESU9fbWNpSW5mbyhVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9JTkZPX1BBUk1TIGxwUGFybXMpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLSAgICAJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwiQ0RBVURJT19tY2lJbmZvKCV1LCAlMDhsWCwgJXApO1xuIiwgCisgICAgCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fbWNpSW5mbyglMDRYLCAlMDhsWCwgJXApO1xuIiwgCiAJCXdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAlscFBhcm1zLT5scHN0clJldHVybiA9IE5VTEw7CkBAIC0zODksMTMgKzM5MiwxNCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlDREFVRElPX0NhbGNGcmFtZQkJCVtpbnRlcm5hbF0KICovCi1zdGF0aWMgRFdPUkQgQ0RBVURJT19DYWxjRnJhbWUoVUlOVCB3RGV2SUQsIERXT1JEIGR3Rm9ybWF0VHlwZSwgRFdPUkQgZHdUaW1lKQorc3RhdGljIERXT1JEIENEQVVESU9fQ2FsY0ZyYW1lKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3Rm9ybWF0VHlwZSwgRFdPUkQgZHdUaW1lKQogewogCURXT1JECWR3RnJhbWUgPSAwOwogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCi0JVUlOVAl3VHJhY2s7CisJaW50IGluZGV4ID0gTU1TWVNURU1fRGV2SURUb0luZGV4KHdEZXZJRCk7CisJVUlOVDE2CXdUcmFjazsKICAgICAKLSAgICAJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwiQ0RBVURJT19DYWxjRnJhbWUoJXUsICUwOGxYLCAlbHUpO1xuIiwgCisgICAgCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fQ2FsY0ZyYW1lKCUwNFgsICUwOGxYLCAlbHUpO1xuIiwgCiAJCXdEZXZJRCwgZHdGb3JtYXRUeXBlLCBkd1RpbWUpOwogICAgIAogCXN3aXRjaCAoZHdGb3JtYXRUeXBlKSB7CkBAIC00MjUsOCArNDI5LDggQEAKIAkJCQkJTUNJX1RNU0ZfU0VDT05EKGR3VGltZSksIE1DSV9UTVNGX0ZSQU1FKGR3VGltZSkpOwogICAgICAgICAgICAgCQlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLAogCQkJCSJDREFVRElPX0NhbGNGcmFtZSAvLyBUTVNGIHRyYWNrcG9zWyV1XT0lbHVcbiIsCi0JCQkJd1RyYWNrLCBDREFEZXZbd0RldklEXS5scGR3VHJhY2tQb3Nbd1RyYWNrIC0gMV0pOwotCQkJZHdGcmFtZSA9IENEQURldlt3RGV2SURdLmxwZHdUcmFja1Bvc1t3VHJhY2sgLSAxXTsKKwkJCQl3VHJhY2ssIENEQURldltpbmRleF0ubHBkd1RyYWNrUG9zW3dUcmFjayAtIDFdKTsKKwkJCWR3RnJhbWUgPSBDREFEZXZbaW5kZXhdLmxwZHdUcmFja1Bvc1t3VHJhY2sgLSAxXTsKIAkJCWR3RnJhbWUgKz0gQ0RGUkFNRVNfUEVSTUlOICogTUNJX1RNU0ZfTUlOVVRFKGR3VGltZSk7CiAJCQlkd0ZyYW1lICs9IENERlJBTUVTX1BFUlNFQyAqIE1DSV9UTVNGX1NFQ09ORChkd1RpbWUpOwogCQkJZHdGcmFtZSArPSBNQ0lfVE1TRl9GUkFNRShkd1RpbWUpOwpAQCAtNDQwLDM3ICs0NDQsMzggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJQ0RBVURJT19HZXRDRFN0YXR1cwkJCQlbaW50ZXJuYWxdCiAqLwotc3RhdGljIEJPT0wgQ0RBVURJT19HZXRDRFN0YXR1cyhVSU5UIHdEZXZJRCkKK3N0YXRpYyBCT09MMzIgQ0RBVURJT19HZXRDRFN0YXR1cyhVSU5UMTYgd0RldklEKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCi0JaW50CQlvbGRtb2RlID0gQ0RBRGV2W3dEZXZJRF0ubW9kZTsKKwlpbnQgaW5kZXggPSBNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKTsKKwlpbnQJCW9sZG1vZGUgPSBDREFEZXZbaW5kZXhdLm1vZGU7CiAjaWZkZWYgX19GcmVlQlNEX18KIAlzdHJ1Y3QgaW9jX3JlYWRfc3ViY2hhbm5lbAlyZWFkX3NjOwogCiAJcmVhZF9zYy5hZGRyZXNzX2Zvcm1hdCA9IENEX01TRl9GT1JNQVQ7CiAJcmVhZF9zYy5kYXRhX2Zvcm1hdCAgICA9IENEX0NVUlJFTlRfUE9TSVRJT047CiAJcmVhZF9zYy50cmFjayAgICAgICAgICA9IDA7Ci0JcmVhZF9zYy5kYXRhX2xlbiAgICAgICA9IHNpemVvZihDREFEZXZbd0RldklEXS5zYyk7Ci0JcmVhZF9zYy5kYXRhCSAgICAgICA9IChzdHJ1Y3QgY2Rfc3ViX2NoYW5uZWxfaW5mbyAqKSZDREFEZXZbd0RldklEXS5zYzsKKwlyZWFkX3NjLmRhdGFfbGVuICAgICAgID0gc2l6ZW9mKENEQURldltpbmRleF0uc2MpOworCXJlYWRfc2MuZGF0YQkgICAgICAgPSAoc3RydWN0IGNkX3N1Yl9jaGFubmVsX2luZm8gKikmQ0RBRGV2W2luZGV4XS5zYzsKICNlbGlmIGxpbnV4Ci0JQ0RBRGV2W3dEZXZJRF0uc2MuY2RzY19mb3JtYXQgPSBDRFJPTV9NU0Y7CisJQ0RBRGV2W2luZGV4XS5zYy5jZHNjX2Zvcm1hdCA9IENEUk9NX01TRjsKICNlbmRpZgotCWlmIChpb2N0bChDREFEZXZbd0RldklEXS51bml4ZGV2LAorCWlmIChpb2N0bChDREFEZXZbaW5kZXhdLnVuaXhkZXYsCiAjaWZkZWYgbGludXgKLQkJICBDRFJPTVNVQkNITkwsICZDREFEZXZbd0RldklEXS5zYworCQkgIENEUk9NU1VCQ0hOTCwgJkNEQURldltpbmRleF0uc2MKICNlbGlmIF9fRnJlZUJTRF9fCiAJCSAgQ0RJT0NSRUFEU1VCQ0hBTk5FTCwgJnJlYWRfc2MKICNlbmRpZgogCQkgICkpIHsKICAgICAgICAgCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fR2V0Q0RTdGF0dXMgLy8gb3BlbmVkIG9yIG5vX21lZGlhICFcbiIpOwotCQlDREFEZXZbd0RldklEXS5tb2RlID0gTUNJX01PREVfTk9UX1JFQURZOworCQlDREFEZXZbaW5kZXhdLm1vZGUgPSBNQ0lfTU9ERV9OT1RfUkVBRFk7CiAJCXJldHVybiBUUlVFOwogCQl9CiAJc3dpdGNoICgKICNpZmRlZiBsaW51eAotCQlDREFEZXZbd0RldklEXS5zYy5jZHNjX2F1ZGlvc3RhdHVzCisJCUNEQURldltpbmRleF0uc2MuY2RzY19hdWRpb3N0YXR1cwogI2VsaWYgX19GcmVlQlNEX18KLQkJQ0RBRGV2W3dEZXZJRF0uc2MuaGVhZGVyLmF1ZGlvX3N0YXR1cworCQlDREFEZXZbaW5kZXhdLnNjLmhlYWRlci5hdWRpb19zdGF0dXMKICNlbmRpZgogCQkpIHsKICNpZmRlZiBsaW51eApAQCAtNDgwLDkgKzQ4NSw5IEBACiAjZW5kaWYKICAgICAgICAgICAgIAkJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwiQ0RBVURJT19HZXRDRFN0YXR1cyAvLyBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IHN0YXR1cywgcmV0dXJuaW5nIE5PVF9SRUFEWS5cbiIpOwogI2lmZGVmIGxpbnV4Ci0JCQlDREFEZXZbd0RldklEXS5tb2RlID0gTUNJX01PREVfTk9UX1JFQURZOworCQkJQ0RBRGV2W2luZGV4XS5tb2RlID0gTUNJX01PREVfTk9UX1JFQURZOwogI2VsaWYgX19GcmVlQlNEX18KLQkJCUNEQURldlt3RGV2SURdLm1vZGUgPSBNQ0lfTU9ERV9TVE9QOworCQkJQ0RBRGV2W2luZGV4XS5tb2RlID0gTUNJX01PREVfU1RPUDsKICNlbmRpZgogCQkJYnJlYWs7CiAjaWZkZWYgbGludXgKQEAgLTQ5MCw3ICs0OTUsNyBAQAogI2VsaWYgX19GcmVlQlNEX18KIAkJY2FzZSBDRF9BU19OT19TVEFUVVM6CiAjZW5kaWYKLQkJCUNEQURldlt3RGV2SURdLm1vZGUgPSBNQ0lfTU9ERV9TVE9QOworCQkJQ0RBRGV2W2luZGV4XS5tb2RlID0gTUNJX01PREVfU1RPUDsKICAgICAgICAgICAgIAkJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwiQ0RBVURJT19HZXRDRFN0YXR1cyAvLyBNQ0lfTU9ERV9TVE9QICFcbiIpOwogCQkJYnJlYWs7CiAjaWZkZWYgbGludXgKQEAgLTQ5OCw3ICs1MDMsNyBAQAogI2VsaWYgX19GcmVlQlNEX18KIAkJY2FzZSBDRF9BU19QTEFZX0lOX1BST0dSRVNTOgogI2VuZGlmCi0JCQlDREFEZXZbd0RldklEXS5tb2RlID0gTUNJX01PREVfUExBWTsKKwkJCUNEQURldltpbmRleF0ubW9kZSA9IE1DSV9NT0RFX1BMQVk7CiAgICAgICAgICAgICAJCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fR2V0Q0RTdGF0dXMgLy8gTUNJX01PREVfUExBWSAhXG4iKTsKIAkJCWJyZWFrOwogI2lmZGVmIGxpbnV4CkBAIC01MDYsNDUgKzUxMSw0NSBAQAogI2VsaWYgX19GcmVlQlNEX18KIAkJY2FzZSBDRF9BU19QTEFZX1BBVVNFRDoKICNlbmRpZgotCQkJQ0RBRGV2W3dEZXZJRF0ubW9kZSA9IE1DSV9NT0RFX1BBVVNFOworCQkJQ0RBRGV2W2luZGV4XS5tb2RlID0gTUNJX01PREVfUEFVU0U7CiAgICAgICAgICAgICAJCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fR2V0Q0RTdGF0dXMgLy8gTUNJX01PREVfUEFVU0UgIVxuIik7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKICAgICAgICAgICAgIAkJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwiQ0RBVURJT19HZXRDRFN0YXR1cyAvLyBzdGF0dXM9JTAyWCAhXG4iLAogI2lmZGVmIGxpbnV4Ci0JCQkJCUNEQURldlt3RGV2SURdLnNjLmNkc2NfYXVkaW9zdGF0dXMKKwkJCQkJQ0RBRGV2W2luZGV4XS5zYy5jZHNjX2F1ZGlvc3RhdHVzCiAjZWxpZiBfX0ZyZWVCU0RfXwotCQkJCQlDREFEZXZbd0RldklEXS5zYy5oZWFkZXIuYXVkaW9fc3RhdHVzCisJCQkJCUNEQURldltpbmRleF0uc2MuaGVhZGVyLmF1ZGlvX3N0YXR1cwogI2VuZGlmCiAJCQkJCSk7CiAJCX0KICNpZmRlZiBsaW51eAotCUNEQURldlt3RGV2SURdLm5DdXJUcmFjayA9IENEQURldlt3RGV2SURdLnNjLmNkc2NfdHJrOwotCUNEQURldlt3RGV2SURdLmR3Q3VyRnJhbWUgPSAKLQkJQ0RGUkFNRVNfUEVSTUlOICogQ0RBRGV2W3dEZXZJRF0uc2MuY2RzY19hYnNhZGRyLm1zZi5taW51dGUgKwotCQlDREZSQU1FU19QRVJTRUMgKiBDREFEZXZbd0RldklEXS5zYy5jZHNjX2Fic2FkZHIubXNmLnNlY29uZCArCi0JCUNEQURldlt3RGV2SURdLnNjLmNkc2NfYWJzYWRkci5tc2YuZnJhbWU7CisJQ0RBRGV2W2luZGV4XS5uQ3VyVHJhY2sgPSBDREFEZXZbaW5kZXhdLnNjLmNkc2NfdHJrOworCUNEQURldltpbmRleF0uZHdDdXJGcmFtZSA9IAorCQlDREZSQU1FU19QRVJNSU4gKiBDREFEZXZbaW5kZXhdLnNjLmNkc2NfYWJzYWRkci5tc2YubWludXRlICsKKwkJQ0RGUkFNRVNfUEVSU0VDICogQ0RBRGV2W2luZGV4XS5zYy5jZHNjX2Fic2FkZHIubXNmLnNlY29uZCArCisJCUNEQURldltpbmRleF0uc2MuY2RzY19hYnNhZGRyLm1zZi5mcmFtZTsKICNlbGlmIF9fRnJlZUJTRF9fCi0JQ0RBRGV2W3dEZXZJRF0ubkN1clRyYWNrID0gQ0RBRGV2W3dEZXZJRF0uc2Mud2hhdC5wb3NpdGlvbi50cmFja19udW1iZXI7Ci0JQ0RBRGV2W3dEZXZJRF0uZHdDdXJGcmFtZSA9IAotCQlDREZSQU1FU19QRVJNSU4gKiBDREFEZXZbd0RldklEXS5zYy53aGF0LnBvc2l0aW9uLmFic2FkZHIubXNmLm1pbnV0ZSArCi0JCUNERlJBTUVTX1BFUlNFQyAqIENEQURldlt3RGV2SURdLnNjLndoYXQucG9zaXRpb24uYWJzYWRkci5tc2Yuc2Vjb25kICsKLQkJQ0RBRGV2W3dEZXZJRF0uc2Mud2hhdC5wb3NpdGlvbi5hYnNhZGRyLm1zZi5mcmFtZTsKKwlDREFEZXZbaW5kZXhdLm5DdXJUcmFjayA9IENEQURldltpbmRleF0uc2Mud2hhdC5wb3NpdGlvbi50cmFja19udW1iZXI7CisJQ0RBRGV2W2luZGV4XS5kd0N1ckZyYW1lID0gCisJCUNERlJBTUVTX1BFUk1JTiAqIENEQURldltpbmRleF0uc2Mud2hhdC5wb3NpdGlvbi5hYnNhZGRyLm1zZi5taW51dGUgKworCQlDREZSQU1FU19QRVJTRUMgKiBDREFEZXZbaW5kZXhdLnNjLndoYXQucG9zaXRpb24uYWJzYWRkci5tc2Yuc2Vjb25kICsKKwkJQ0RBRGV2W2luZGV4XS5zYy53aGF0LnBvc2l0aW9uLmFic2FkZHIubXNmLmZyYW1lOwogI2VuZGlmCiAgICAgCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fR2V0Q0RTdGF0dXMgLy8gJTAydS0lMDJ1OiUwMnU6JTAydSBcbiIsCiAjaWZkZWYgbGludXgKLQkJQ0RBRGV2W3dEZXZJRF0uc2MuY2RzY190cmssCi0JCUNEQURldlt3RGV2SURdLnNjLmNkc2NfYWJzYWRkci5tc2YubWludXRlLAotCQlDREFEZXZbd0RldklEXS5zYy5jZHNjX2Fic2FkZHIubXNmLnNlY29uZCwKLQkJQ0RBRGV2W3dEZXZJRF0uc2MuY2RzY19hYnNhZGRyLm1zZi5mcmFtZQorCQlDREFEZXZbaW5kZXhdLnNjLmNkc2NfdHJrLAorCQlDREFEZXZbaW5kZXhdLnNjLmNkc2NfYWJzYWRkci5tc2YubWludXRlLAorCQlDREFEZXZbaW5kZXhdLnNjLmNkc2NfYWJzYWRkci5tc2Yuc2Vjb25kLAorCQlDREFEZXZbaW5kZXhdLnNjLmNkc2NfYWJzYWRkci5tc2YuZnJhbWUKICNlbGlmIF9fRnJlZUJTRF9fCi0JCUNEQURldlt3RGV2SURdLnNjLndoYXQucG9zaXRpb24udHJhY2tfbnVtYmVyLAotCQlDREFEZXZbd0RldklEXS5zYy53aGF0LnBvc2l0aW9uLmFic2FkZHIubXNmLm1pbnV0ZSwKLQkJQ0RBRGV2W3dEZXZJRF0uc2Mud2hhdC5wb3NpdGlvbi5hYnNhZGRyLm1zZi5zZWNvbmQsCi0JCUNEQURldlt3RGV2SURdLnNjLndoYXQucG9zaXRpb24uYWJzYWRkci5tc2YuZnJhbWUKKwkJQ0RBRGV2W2luZGV4XS5zYy53aGF0LnBvc2l0aW9uLnRyYWNrX251bWJlciwKKwkJQ0RBRGV2W2luZGV4XS5zYy53aGF0LnBvc2l0aW9uLmFic2FkZHIubXNmLm1pbnV0ZSwKKwkJQ0RBRGV2W2luZGV4XS5zYy53aGF0LnBvc2l0aW9uLmFic2FkZHIubXNmLnNlY29uZCwKKwkJQ0RBRGV2W2luZGV4XS5zYy53aGF0LnBvc2l0aW9uLmFic2FkZHIubXNmLmZyYW1lCiAjZW5kaWYKIAkJCSk7Ci0JaWYgKG9sZG1vZGUgIT0gQ0RBRGV2W3dEZXZJRF0ubW9kZSAmJiBvbGRtb2RlID09IE1DSV9NT0RFX09QRU4pIHsKKwlpZiAob2xkbW9kZSAhPSBDREFEZXZbaW5kZXhdLm1vZGUgJiYgb2xkbW9kZSA9PSBNQ0lfTU9ERV9PUEVOKSB7CiAJCWlmICghQ0RBVURJT19HZXRUcmFja3NJbmZvKHdEZXZJRCkpIHsKICAgICAgICAgICAgIGRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fR2V0Q0RTdGF0dXMgLy8gZXJyb3IgdXBkYXRpbmcgVHJhY2tzSW5mbyAhXG4iKTsKIAkJCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CkBAIC01NjAsMTUgKzU2NSwxNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlDREFVRElPX0NhbGNUaW1lCQkJW2ludGVybmFsXQogKi8KLXN0YXRpYyBEV09SRCBDREFVRElPX0NhbGNUaW1lKFVJTlQgd0RldklELCBEV09SRCBkd0Zvcm1hdFR5cGUsIERXT1JEIGR3RnJhbWUpCitzdGF0aWMgRFdPUkQgQ0RBVURJT19DYWxjVGltZShVSU5UMTYgd0RldklELCBEV09SRCBkd0Zvcm1hdFR5cGUsIERXT1JEIGR3RnJhbWUpCiB7CiAJRFdPUkQJZHdUaW1lID0gMDsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQotCVVJTlQJd1RyYWNrOwotCVVJTlQJd01pbnV0ZXM7Ci0JVUlOVAl3U2Vjb25kczsKLQlVSU5UCXdGcmFtZXM7Ci0gICAgCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fQ2FsY1RpbWUoJXUsICUwOGxYLCAlbHUpO1xuIiwgCisJaW50IGluZGV4ID0gTU1TWVNURU1fRGV2SURUb0luZGV4KHdEZXZJRCk7CisJVUlOVDE2CXdUcmFjazsKKwlVSU5UMTYJd01pbnV0ZXM7CisJVUlOVDE2CXdTZWNvbmRzOworCVVJTlQxNgl3RnJhbWVzOworICAgIAlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX0NhbGNUaW1lKCUwNFgsICUwOGxYLCAlbHUpO1xuIiwgCiAJCXdEZXZJRCwgZHdGb3JtYXRUeXBlLCBkd0ZyYW1lKTsKIAogCXN3aXRjaCAoZHdGb3JtYXRUeXBlKSB7CkBAIC01OTEsMTEgKzU5NywxMSBAQAogCQkJLyogdW5rbm93biBmb3JtYXQgISBmb3JjZSBUTVNGICEgLi4uICovCiAJCQlkd0Zvcm1hdFR5cGUgPSBNQ0lfRk9STUFUX1RNU0Y7CiAJCWNhc2UgTUNJX0ZPUk1BVF9UTVNGOgotCQkJZm9yICh3VHJhY2sgPSAwOyB3VHJhY2sgPCBDREFEZXZbd0RldklEXS5uVHJhY2tzOyB3VHJhY2srKykgewotLyoJCQkJZHdUaW1lICs9IENEQURldlt3RGV2SURdLmxwZHdUcmFja0xlblt3VHJhY2sgLSAxXTsKKwkJCWZvciAod1RyYWNrID0gMDsgd1RyYWNrIDwgQ0RBRGV2W2luZGV4XS5uVHJhY2tzOyB3VHJhY2srKykgeworLyoJCQkJZHdUaW1lICs9IENEQURldltpbmRleF0ubHBkd1RyYWNrTGVuW3dUcmFjayAtIDFdOwogCQkJCXByaW50ZigiQWRkaW5nIHRyayMldSBjdXJwb3M9JXUgXG4iLCBkd1RpbWUpOwogCQkJCWlmIChkd1RpbWUgPj0gZHdGcmFtZSkgYnJlYWs7ICovCi0JCQkJaWYgKENEQURldlt3RGV2SURdLmxwZHdUcmFja1Bvc1t3VHJhY2sgLSAxXSA+PSBkd0ZyYW1lKSBicmVhazsKKwkJCQlpZiAoQ0RBRGV2W2luZGV4XS5scGR3VHJhY2tQb3Nbd1RyYWNrIC0gMV0gPj0gZHdGcmFtZSkgYnJlYWs7CiAJCQkJfQogCQkJd01pbnV0ZXMgPSBkd0ZyYW1lIC8gQ0RGUkFNRVNfUEVSTUlOOwogCQkJd1NlY29uZHMgPSAoZHdGcmFtZSAtIENERlJBTUVTX1BFUk1JTiAqIHdNaW51dGVzKSAvIENERlJBTUVTX1BFUlNFQzsKQEAgLTYxNSwyOSArNjIxLDMwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCUNEQVVESU9fbWNpU3RhdHVzCQlbaW50ZXJuYWxdCiAqLwotc3RhdGljIERXT1JEIENEQVVESU9fbWNpU3RhdHVzKFVJTlQgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9TVEFUVVNfUEFSTVMgbHBQYXJtcykKK3N0YXRpYyBEV09SRCBDREFVRElPX21jaVN0YXR1cyhVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9TVEFUVVNfUEFSTVMgbHBQYXJtcykKIHsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQotICAgIAlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX21jaVN0YXR1cygldSwgJTA4bFgsICVwKTtcbiIsIAorCWludCBpbmRleCA9IE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpOworICAgIAlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX21jaVN0YXR1cyglMDRYLCAlMDhsWCwgJXApO1xuIiwgCiAJCXdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKLQlpZiAoQ0RBRGV2W3dEZXZJRF0udW5peGRldiA9PSAwKSByZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKKwlpZiAoQ0RBRGV2W2luZGV4XS51bml4ZGV2ID09IDApIHJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCWlmIChkd0ZsYWdzICYgTUNJX05PVElGWSkgewogICAgICAgICAJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwKIAkJCSJDREFVRElPX21jaVN0YXR1cyAvLyBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgCiAJCQlscFBhcm1zLT5kd0NhbGxiYWNrKTsKIAkJbWNpRHJpdmVyTm90aWZ5KChIV05EMTYpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKLQkJCUNEQURldlt3RGV2SURdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKKwkJCUNEQURldltpbmRleF0ud05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOwogCQl9CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfU1RBVFVTX0lURU0pIHsKIAkJc3dpdGNoKGxwUGFybXMtPmR3SXRlbSkgewogCQkJY2FzZSBNQ0lfU1RBVFVTX0NVUlJFTlRfVFJBQ0s6CiAJCQkJaWYgKCFDREFVRElPX0dldENEU3RhdHVzKHdEZXZJRCkpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7Ci0JCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSBDREFEZXZbd0RldklEXS5uQ3VyVHJhY2s7CisJCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSBDREFEZXZbaW5kZXhdLm5DdXJUcmFjazsKICAgICAgICAgICAgICAgICAJCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fbWNpU3RhdHVzIC8vIENVUlJFTlRfVFJBQ0s9JWx1IVxuIiwgbHBQYXJtcy0+ZHdSZXR1cm4pOwogCQkJIAlyZXR1cm4gMDsKIAkJCWNhc2UgTUNJX1NUQVRVU19MRU5HVEg6Ci0JCQkJaWYgKENEQURldlt3RGV2SURdLm5UcmFja3MgPT0gMCkgeworCQkJCWlmIChDREFEZXZbaW5kZXhdLm5UcmFja3MgPT0gMCkgewogCQkJCQlpZiAoIUNEQVVESU9fR2V0VHJhY2tzSW5mbyh3RGV2SUQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAJCQlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX21jaVN0YXR1cyAvLyBlcnJvciByZWFkaW5nIFRyYWNrc0luZm8gIVxuIik7CiAJCQkJCQlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwpAQCAtNjQ2LDI0ICs2NTMsMjQgQEAKIAkJCQlpZiAoZHdGbGFncyAmIE1DSV9UUkFDSykgewogCQkJCQlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX21jaVN0YXR1cyAvLyBNQ0lfVFJBQ0sgIyVsdSBMRU5HVEg9Pz8/ICFcbiIsCiAJCQkJCQkJbHBQYXJtcy0+ZHdUcmFjayk7Ci0JCQkJCWlmIChscFBhcm1zLT5kd1RyYWNrID4gQ0RBRGV2W3dEZXZJRF0ublRyYWNrcykKKwkJCQkJaWYgKGxwUGFybXMtPmR3VHJhY2sgPiBDREFEZXZbaW5kZXhdLm5UcmFja3MpCiAJCQkJCQlyZXR1cm4gTUNJRVJSX09VVE9GUkFOR0U7Ci0JCQkJCWxwUGFybXMtPmR3UmV0dXJuID0gQ0RBRGV2W3dEZXZJRF0ubHBkd1RyYWNrTGVuW2xwUGFybXMtPmR3VHJhY2tdOworCQkJCQlscFBhcm1zLT5kd1JldHVybiA9IENEQURldltpbmRleF0ubHBkd1RyYWNrTGVuW2xwUGFybXMtPmR3VHJhY2tdOwogCQkJCQl9CiAJCQkJZWxzZQotCQkJCQlscFBhcm1zLT5kd1JldHVybiA9IENEQURldlt3RGV2SURdLmR3VG90YWxMZW47CisJCQkJCWxwUGFybXMtPmR3UmV0dXJuID0gQ0RBRGV2W2luZGV4XS5kd1RvdGFsTGVuOwogCQkJCWxwUGFybXMtPmR3UmV0dXJuID0gQ0RBVURJT19DYWxjVGltZSh3RGV2SUQsIAotCQkJCQlDREFEZXZbd0RldklEXS5kd1RpbWVGb3JtYXQsIGxwUGFybXMtPmR3UmV0dXJuKTsKKwkJCQkJQ0RBRGV2W2luZGV4XS5kd1RpbWVGb3JtYXQsIGxwUGFybXMtPmR3UmV0dXJuKTsKICAgICAgICAgICAgICAgICAJCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fbWNpU3RhdHVzIC8vIExFTkdUSD0lbHUgIVxuIiwgbHBQYXJtcy0+ZHdSZXR1cm4pOwogCQkJIAlyZXR1cm4gMDsKIAkJCWNhc2UgTUNJX1NUQVRVU19NT0RFOgogCQkJCWlmICghQ0RBVURJT19HZXRDRFN0YXR1cyh3RGV2SUQpKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwotCQkJCWxwUGFybXMtPmR3UmV0dXJuID0gQ0RBRGV2W3dEZXZJRF0ubW9kZTsKKwkJCQlscFBhcm1zLT5kd1JldHVybiA9IENEQURldltpbmRleF0ubW9kZTsKICAgICAgICAgICAgICAgICAJCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fbWNpU3RhdHVzIC8vIE1DSV9TVEFUVVNfTU9ERT0lMDhsWCAhXG4iLAogCQkJCQkJCQkJCQkJbHBQYXJtcy0+ZHdSZXR1cm4pOwogCQkJIAlyZXR1cm4gMDsKIAkJCWNhc2UgTUNJX1NUQVRVU19NRURJQV9QUkVTRU5UOgotCQkJCWxwUGFybXMtPmR3UmV0dXJuID0gKENEQURldlt3RGV2SURdLm5UcmFja3MgPiAwKSA/IFRSVUUgOiBGQUxTRTsKKwkJCQlscFBhcm1zLT5kd1JldHVybiA9IChDREFEZXZbaW5kZXhdLm5UcmFja3MgPiAwKSA/IFRSVUUgOiBGQUxTRTsKIAkJCQlpZiAobHBQYXJtcy0+ZHdSZXR1cm4gPT0gRkFMU0UpCiAgICAgICAgICAgICAgICAgICAgIAkJCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fbWNpU3RhdHVzIC8vIE1FRElBX05PVF9QUkVTRU5UICFcbiIpOwogCQkJCWVsc2UKQEAgLTY3NywxOSArNjg0LDE5IEBACiAJCQkgCXJldHVybiAwOwogCQkJY2FzZSBNQ0lfU1RBVFVTX1BPU0lUSU9OOgogCQkJCWlmICghQ0RBVURJT19HZXRDRFN0YXR1cyh3RGV2SUQpKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwotCQkJCWxwUGFybXMtPmR3UmV0dXJuID0gQ0RBRGV2W3dEZXZJRF0uZHdDdXJGcmFtZTsKKwkJCQlscFBhcm1zLT5kd1JldHVybiA9IENEQURldltpbmRleF0uZHdDdXJGcmFtZTsKIAkJCQlpZiAoZHdGbGFncyAmIE1DSV9TVEFUVVNfU1RBUlQpIHsKLQkJCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSBDREFEZXZbd0RldklEXS5kd0ZpcnN0T2Zmc2V0OworCQkJCQlscFBhcm1zLT5kd1JldHVybiA9IENEQURldltpbmRleF0uZHdGaXJzdE9mZnNldDsKICAgICAgICAgICAgICAgICAgICAgCQkJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwiQ0RBVURJT19tY2lTdGF0dXMgLy8gZ2V0IE1DSV9TVEFUVVNfU1RBUlQgIVxuIik7CiAJCQkJCX0KIAkJCQlpZiAoZHdGbGFncyAmIE1DSV9UUkFDSykgewotCQkJCQlpZiAobHBQYXJtcy0+ZHdUcmFjayA+IENEQURldlt3RGV2SURdLm5UcmFja3MpCisJCQkJCWlmIChscFBhcm1zLT5kd1RyYWNrID4gQ0RBRGV2W2luZGV4XS5uVHJhY2tzKQogCQkJCQkJcmV0dXJuIE1DSUVSUl9PVVRPRlJBTkdFOwotCQkJCQlscFBhcm1zLT5kd1JldHVybiA9IENEQURldlt3RGV2SURdLmxwZHdUcmFja1Bvc1tscFBhcm1zLT5kd1RyYWNrIC0gMV07CisJCQkJCWxwUGFybXMtPmR3UmV0dXJuID0gQ0RBRGV2W2luZGV4XS5scGR3VHJhY2tQb3NbbHBQYXJtcy0+ZHdUcmFjayAtIDFdOwogICAgICAgICAgICAgICAgICAgICAJCQlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX21jaVN0YXR1cyAvLyBnZXQgTUNJX1RSQUNLICMlbHUgIVxuIiwgbHBQYXJtcy0+ZHdUcmFjayk7CiAJCQkJCX0KIAkJCQlscFBhcm1zLT5kd1JldHVybiA9IENEQVVESU9fQ2FsY1RpbWUod0RldklELAotCQkJCQlDREFEZXZbd0RldklEXS5kd1RpbWVGb3JtYXQsIGxwUGFybXMtPmR3UmV0dXJuKTsKKwkJCQkJQ0RBRGV2W2luZGV4XS5kd1RpbWVGb3JtYXQsIGxwUGFybXMtPmR3UmV0dXJuKTsKICAgICAgICAgICAgICAgICAJCQlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX21jaVN0YXR1cyAvLyBNQ0lfU1RBVFVTX1BPU0lUSU9OPSUwOGxYICFcbiIsCiAJCQkJCQkJCQkJCQkJCWxwUGFybXMtPmR3UmV0dXJuKTsKIAkJCSAJcmV0dXJuIDA7CkBAIC02OTksNyArNzA2LDcgQEAKIAkJCSAJcmV0dXJuIDA7CiAJCQljYXNlIE1DSV9TVEFUVVNfVElNRV9GT1JNQVQ6CiAgICAgICAgICAgICAgICAgCQlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX21jaVN0YXR1cyAvLyBNQ0lfU1RBVFVTX1RJTUVfRk9STUFUICFcbiIpOwotCQkJCWxwUGFybXMtPmR3UmV0dXJuID0gQ0RBRGV2W3dEZXZJRF0uZHdUaW1lRm9ybWF0OworCQkJCWxwUGFybXMtPmR3UmV0dXJuID0gQ0RBRGV2W2luZGV4XS5kd1RpbWVGb3JtYXQ7CiAJCQkgCXJldHVybiAwOwogCQkJZGVmYXVsdDoKICAgICAgICAgICAgICAgICAJCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fbWNpU3RhdHVzIC8vIHVua25vd24gY29tbWFuZCAlMDhsWCAhXG4iLCBscFBhcm1zLT5kd0l0ZW0pOwpAQCAtNzE3LDM2ICs3MjQsMzcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJQ0RBVURJT19tY2lQbGF5CQkJW2ludGVybmFsXQogKi8KLXN0YXRpYyBEV09SRCBDREFVRElPX21jaVBsYXkoVUlOVCB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX1BMQVlfUEFSTVMgbHBQYXJtcykKK3N0YXRpYyBEV09SRCBDREFVRElPX21jaVBsYXkoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfUExBWV9QQVJNUyBscFBhcm1zKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCisJaW50IGluZGV4ID0gTU1TWVNURU1fRGV2SURUb0luZGV4KHdEZXZJRCk7CiAJaW50IAlzdGFydCwgZW5kOwogI2lmZGVmIGxpbnV4CiAJc3RydWN0IAljZHJvbV9tc2YJbXNmOwogI2VsaWYgX19GcmVlQlNEX18KIAlzdHJ1Y3QJaW9jX3BsYXlfbXNmCW1zZjsKICNlbmRpZgotICAgIAlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX21jaVBsYXkoJXUsICUwOGxYLCAlcCk7XG4iLCAKKyAgICAJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwiQ0RBVURJT19tY2lQbGF5KCUwNFgsICUwOGxYLCAlcCk7XG4iLCAKIAkJd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwotCWlmIChDREFEZXZbd0RldklEXS51bml4ZGV2ID09IDApIHJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwotCXN0YXJ0ID0gMDsgCQllbmQgPSBDREFEZXZbd0RldklEXS5kd1RvdGFsTGVuOwotCUNEQURldlt3RGV2SURdLm5DdXJUcmFjayA9IDE7CisJaWYgKENEQURldltpbmRleF0udW5peGRldiA9PSAwKSByZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKKwlzdGFydCA9IDA7IAkJZW5kID0gQ0RBRGV2W2luZGV4XS5kd1RvdGFsTGVuOworCUNEQURldltpbmRleF0ubkN1clRyYWNrID0gMTsKIAlpZiAoZHdGbGFncyAmIE1DSV9GUk9NKSB7CiAJCXN0YXJ0ID0gQ0RBVURJT19DYWxjRnJhbWUod0RldklELCAKLQkJCUNEQURldlt3RGV2SURdLmR3VGltZUZvcm1hdCwgbHBQYXJtcy0+ZHdGcm9tKTsgCisJCQlDREFEZXZbaW5kZXhdLmR3VGltZUZvcm1hdCwgbHBQYXJtcy0+ZHdGcm9tKTsgCiAgICAgICAgIGRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fbWNpUGxheSAvLyBNQ0lfRlJPTT0lMDhsWCAtPiAldSBcbiIsCiAJCQkJbHBQYXJtcy0+ZHdGcm9tLCBzdGFydCk7CiAJCX0KIAlpZiAoZHdGbGFncyAmIE1DSV9UTykgewogCQllbmQgPSBDREFVRElPX0NhbGNGcmFtZSh3RGV2SUQsIAotCQkJQ0RBRGV2W3dEZXZJRF0uZHdUaW1lRm9ybWF0LCBscFBhcm1zLT5kd1RvKTsKKwkJCUNEQURldltpbmRleF0uZHdUaW1lRm9ybWF0LCBscFBhcm1zLT5kd1RvKTsKICAgICAgICAgCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsCiAJCQkiQ0RBVURJT19tY2lQbGF5IC8vIE1DSV9UTz0lMDhsWCAtPiAldSBcbiIsCiAJCQlscFBhcm1zLT5kd1RvLCBlbmQpOwogCQl9Ci0Jc3RhcnQgKz0gQ0RBRGV2W3dEZXZJRF0uZHdGaXJzdE9mZnNldDsJCi0JZW5kICs9IENEQURldlt3RGV2SURdLmR3Rmlyc3RPZmZzZXQ7CisJc3RhcnQgKz0gQ0RBRGV2W2luZGV4XS5kd0ZpcnN0T2Zmc2V0OwkKKwllbmQgKz0gQ0RBRGV2W2luZGV4XS5kd0ZpcnN0T2Zmc2V0OwogI2lmZGVmIGxpbnV4CiAJbXNmLmNkbXNmX21pbjAgPSBzdGFydCAvIENERlJBTUVTX1BFUk1JTjsKIAltc2YuY2Rtc2Zfc2VjMCA9IChzdGFydCAlIENERlJBTUVTX1BFUk1JTikgLyBDREZSQU1FU19QRVJTRUM7CkBAIC03NjIsNyArNzcwLDcgQEAKICAgICAgICAgbXNmLmVuZF9zICAgICAgID0gKGVuZCAlIENERlJBTUVTX1BFUk1JTikgLyBDREZSQU1FU19QRVJTRUM7CiAgICAgICAgIG1zZi5lbmRfZiAgICAgICA9IGVuZCAlIENERlJBTUVTX1BFUlNFQzsKICNlbmRpZgotCWlmIChpb2N0bChDREFEZXZbd0RldklEXS51bml4ZGV2LAorCWlmIChpb2N0bChDREFEZXZbaW5kZXhdLnVuaXhkZXYsCiAjaWZkZWYgbGludXgKIAkJICBDRFJPTVNUQVJUCiAjZWxpZiBfX0ZyZWVCU0RfXwpAQCAtNzcyLDcgKzc4MCw3IEBACiAgICAgICAgIAlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX21jaVBsYXkgLy8gbW90b3IgZG9lc24ndCBzdGFydCAhXG4iKTsKIAkJcmV0dXJuIE1DSUVSUl9IQVJEV0FSRTsKIAkJfQotCWlmIChpb2N0bChDREFEZXZbd0RldklEXS51bml4ZGV2LCAKKwlpZiAoaW9jdGwoQ0RBRGV2W2luZGV4XS51bml4ZGV2LCAKICNpZmRlZiBsaW51eAogCQkgIENEUk9NUExBWU1TRgogI2VsaWYgX19GcmVlQlNEX18KQEAgLTc5MSwxNCArNzk5LDE0IEBACiAJCW1zZi5lbmRfbSwgICBtc2YuZW5kX3MsICAgbXNmLmVuZF9mCiAjZW5kaWYKIAkJCSk7Ci0JQ0RBRGV2W3dEZXZJRF0ubW9kZSA9IE1DSV9NT0RFX1BMQVk7CisJQ0RBRGV2W2luZGV4XS5tb2RlID0gTUNJX01PREVfUExBWTsKIAlpZiAoZHdGbGFncyAmIE1DSV9OT1RJRlkpIHsKICAgICAgICAgCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsCiAJCQkiQ0RBVURJT19tY2lQbGF5IC8vIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCAKIAkJCWxwUGFybXMtPmR3Q2FsbGJhY2spOwogLyoKIAkJbWNpRHJpdmVyTm90aWZ5KChIV05EMTYpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKLQkJCUNEQURldlt3RGV2SURdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKKwkJCUNEQURldltpbmRleF0ud05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOwogKi8KIAkJfQogCXJldHVybiAwOwpAQCAtODEwLDI2ICs4MTgsMjcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJQ0RBVURJT19tY2lTdG9wCQkJW2ludGVybmFsXQogKi8KLXN0YXRpYyBEV09SRCBDREFVRElPX21jaVN0b3AoVUlOVCB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcykKK3N0YXRpYyBEV09SRCBDREFVRElPX21jaVN0b3AoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfR0VORVJJQ19QQVJNUyBscFBhcm1zKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCi0gICAgCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fbWNpU3RvcCgldSwgJTA4bFgsICVwKTtcbiIsIAorCWludCBpbmRleCA9IE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpOworICAgIAlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX21jaVN0b3AoJTA0WCwgJTA4bFgsICVwKTtcbiIsIAogCQl3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7Ci0JaWYgKGlvY3RsKENEQURldlt3RGV2SURdLnVuaXhkZXYsCisJaWYgKGlvY3RsKENEQURldltpbmRleF0udW5peGRldiwKICNpZmRlZiBsaW51eAogCQkgIENEUk9NU1RPUAogI2VsaWYgX19GcmVlQlNEX18KIAkJICBDRElPQ1NUT1AKICNlbmRpZgogCQkgICkpIHJldHVybiBNQ0lFUlJfSEFSRFdBUkU7Ci0JQ0RBRGV2W3dEZXZJRF0ubW9kZSA9IE1DSV9NT0RFX1NUT1A7CisJQ0RBRGV2W2luZGV4XS5tb2RlID0gTUNJX01PREVfU1RPUDsKIAlpZiAoZHdGbGFncyAmIE1DSV9OT1RJRlkpIHsKICAgICAgICAgCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsCiAJCQkiQ0RBVURJT19tY2lTdG9wIC8vIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCAKIAkJCWxwUGFybXMtPmR3Q2FsbGJhY2spOwogCQltY2lEcml2ZXJOb3RpZnkoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAotCQkJQ0RBRGV2W3dEZXZJRF0ud05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOworCQkJQ0RBRGV2W2luZGV4XS53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CiAJCX0KICAJcmV0dXJuIDA7CiAjZWxzZQpAQCAtODQwLDI2ICs4NDksMjcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJQ0RBVURJT19tY2lQYXVzZQkJW2ludGVybmFsXQogKi8KLXN0YXRpYyBEV09SRCBDREFVRElPX21jaVBhdXNlKFVJTlQgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9HRU5FUklDX1BBUk1TIGxwUGFybXMpCitzdGF0aWMgRFdPUkQgQ0RBVURJT19tY2lQYXVzZShVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9HRU5FUklDX1BBUk1TIGxwUGFybXMpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLSAgICAJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwiQ0RBVURJT19tY2lQYXVzZSgldSwgJTA4bFgsICVwKTtcbiIsIAorCWludCBpbmRleCA9IE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpOworICAgIAlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX21jaVBhdXNlKCUwNFgsICUwOGxYLCAlcCk7XG4iLCAKIAkJd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwotCWlmIChpb2N0bChDREFEZXZbd0RldklEXS51bml4ZGV2LAorCWlmIChpb2N0bChDREFEZXZbaW5kZXhdLnVuaXhkZXYsCiAjaWZkZWYgbGludXgKIAkJICBDRFJPTVBBVVNFCiAjZWxpZiBfX0ZyZWVCU0RfXwogCQkgIENESU9DUEFVU0UKICNlbmRpZgogCQkgICkpIHJldHVybiBNQ0lFUlJfSEFSRFdBUkU7Ci0JQ0RBRGV2W3dEZXZJRF0ubW9kZSA9IE1DSV9NT0RFX1BBVVNFOworCUNEQURldltpbmRleF0ubW9kZSA9IE1DSV9NT0RFX1BBVVNFOwogCWlmIChkd0ZsYWdzICYgTUNJX05PVElGWSkgewogICAgICAgICBkcHJpbnRmX2NkYXVkaW8oc3RkZGViLAogCQkiQ0RBVURJT19tY2lQYXVzZSAvLyBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgCiAJCWxwUGFybXMtPmR3Q2FsbGJhY2spOwogCQltY2lEcml2ZXJOb3RpZnkoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAotCQkJQ0RBRGV2W3dEZXZJRF0ud05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOworCQkJQ0RBRGV2W2luZGV4XS53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CiAJCX0KIAlyZXR1cm4gMDsKICNlbHNlCkBAIC04NzAsMjYgKzg4MCwyNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlDREFVRElPX21jaVJlc3VtZQkJW2ludGVybmFsXQogKi8KLXN0YXRpYyBEV09SRCBDREFVRElPX21jaVJlc3VtZShVSU5UIHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfR0VORVJJQ19QQVJNUyBscFBhcm1zKQorc3RhdGljIERXT1JEIENEQVVESU9fbWNpUmVzdW1lKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcykKIHsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQotICAgIAlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX21jaVJlc3VtZSgldSwgJTA4bFgsICVwKTtcbiIsIAorCWludCBpbmRleCA9IE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpOworICAgIAlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX21jaVJlc3VtZSglMDRYLCAlMDhsWCwgJXApO1xuIiwgCiAJCXdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKLQlpZiAoaW9jdGwoQ0RBRGV2W3dEZXZJRF0udW5peGRldiwgCisJaWYgKGlvY3RsKENEQURldltpbmRleF0udW5peGRldiwgCiAjaWZkZWYgbGludXgKIAkJICBDRFJPTVJFU1VNRQogI2VsaWYgX19GcmVlQlNEX18KIAkJICBDRElPQ1JFU1VNRQogI2VuZGlmCiAJCSAgKSkgcmV0dXJuIE1DSUVSUl9IQVJEV0FSRTsKLQlDREFEZXZbd0RldklEXS5tb2RlID0gTUNJX01PREVfU1RPUDsKKwlDREFEZXZbaW5kZXhdLm1vZGUgPSBNQ0lfTU9ERV9TVE9QOwogCWlmIChkd0ZsYWdzICYgTUNJX05PVElGWSkgewogICAgICAgICAJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwKIAkJCSJDREFVRElPX21jaVJlc3VtZSAvLyBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgCiAJCQlscFBhcm1zLT5kd0NhbGxiYWNrKTsKIAkJbWNpRHJpdmVyTm90aWZ5KChIV05EMTYpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKLQkJCUNEQURldlt3RGV2SURdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKKwkJCUNEQURldltpbmRleF0ud05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOwogCQl9CiAJcmV0dXJuIDA7CiAjZWxzZQpAQCAtOTAwLDE1ICs5MTEsMTYgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJQ0RBVURJT19tY2lTZWVrCQkJW2ludGVybmFsXQogKi8KLXN0YXRpYyBEV09SRCBDREFVRElPX21jaVNlZWsoVUlOVCB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX1NFRUtfUEFSTVMgbHBQYXJtcykKK3N0YXRpYyBEV09SRCBDREFVRElPX21jaVNlZWsoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfU0VFS19QQVJNUyBscFBhcm1zKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCisJaW50IGluZGV4ID0gTU1TWVNURU1fRGV2SURUb0luZGV4KHdEZXZJRCk7CiAJRFdPUkQJZHdSZXQ7CiAJTUNJX1BMQVlfUEFSTVMgUGxheVBhcm1zOwotICAgIAlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX21jaVNlZWsoJXUsICUwOGxYLCAlcCk7XG4iLCAKKyAgICAJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwiQ0RBVURJT19tY2lTZWVrKCUwNFgsICUwOGxYLCAlcCk7XG4iLCAKIAkJd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwotCWlmIChpb2N0bChDREFEZXZbd0RldklEXS51bml4ZGV2LAorCWlmIChpb2N0bChDREFEZXZbaW5kZXhdLnVuaXhkZXYsCiAjaWZkZWYgbGludXgKIAkJICBDRFJPTVJFU1VNRQogI2VsaWYgX19GcmVlQlNEX18KQEAgLTkxOCwxMyArOTMwLDEzIEBACiAJCXBlcnJvcigiaW9jdGwgQ0RST01SRVNVTUUiKTsKIAkJcmV0dXJuIE1DSUVSUl9IQVJEV0FSRTsKIAl9Ci0JQ0RBRGV2W3dEZXZJRF0ubW9kZSA9IE1DSV9NT0RFX1NFRUs7CisJQ0RBRGV2W2luZGV4XS5tb2RlID0gTUNJX01PREVfU0VFSzsKIAlzd2l0Y2goZHdGbGFncykgewogCQljYXNlIE1DSV9TRUVLX1RPX1NUQVJUOgogCQkJUGxheVBhcm1zLmR3RnJvbSA9IDA7CiAJCQlicmVhazsKIAkJY2FzZSBNQ0lfU0VFS19UT19FTkQ6Ci0JCQlQbGF5UGFybXMuZHdGcm9tID0gQ0RBRGV2W3dEZXZJRF0uZHdUb3RhbExlbjsKKwkJCVBsYXlQYXJtcy5kd0Zyb20gPSBDREFEZXZbaW5kZXhdLmR3VG90YWxMZW47CiAJCQlicmVhazsKIAkJY2FzZSBNQ0lfVE86CiAJCQlQbGF5UGFybXMuZHdGcm9tID0gbHBQYXJtcy0+ZHdUbzsKQEAgLTkzOCw3ICs5NTAsNyBAQAogCQkJIkNEQVVESU9fbWNpU2VlayAvLyBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgCiAJCQlscFBhcm1zLT5kd0NhbGxiYWNrKTsKIAkJbWNpRHJpdmVyTm90aWZ5KChIV05EMTYpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKLQkJCUNEQURldlt3RGV2SURdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKKwkJCUNEQURldltpbmRleF0ud05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOwogCQl9CiAJcmV0dXJuIGR3UmV0OwogI2Vsc2UKQEAgLTk1MCwxMCArOTYyLDExIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCUNEQVVESU9fbWNpU2V0CQkJW2ludGVybmFsXQogKi8KLXN0YXRpYyBEV09SRCBDREFVRElPX21jaVNldChVSU5UIHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfU0VUX1BBUk1TIGxwUGFybXMpCitzdGF0aWMgRFdPUkQgQ0RBVURJT19tY2lTZXQoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfU0VUX1BBUk1TIGxwUGFybXMpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLSAgICAJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwiQ0RBVURJT19tY2lTZXQoJXUsICUwOGxYLCAlcCk7XG4iLCAKKwlpbnQgaW5kZXggPSBNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKTsKKyAgICAJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwiQ0RBVURJT19tY2lTZXQoJTA0WCwgJTA4bFgsICVwKTtcbiIsIAogCQl3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAvKgpAQCAtOTc2LDMyICs5ODksMzIgQEAKICAgICAgICAgICAgICAgICAJCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fbWNpU2V0IC8vIGJhZCB0aW1lIGZvcm1hdCAhXG4iKTsKIAkJCQlyZXR1cm4gTUNJRVJSX0JBRF9USU1FX0ZPUk1BVDsKIAkJCX0KLQkJQ0RBRGV2W3dEZXZJRF0uZHdUaW1lRm9ybWF0ID0gbHBQYXJtcy0+ZHdUaW1lRm9ybWF0OworCQlDREFEZXZbaW5kZXhdLmR3VGltZUZvcm1hdCA9IGxwUGFybXMtPmR3VGltZUZvcm1hdDsKIAkJfQogCWlmIChkd0ZsYWdzICYgTUNJX1NFVF9ET09SX09QRU4pIHsKICAgICAgICAgCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsCiAJCQkiQ0RBVURJT19tY2lTZXQgLy8gTUNJX1NFVF9ET09SX09QRU4gIVxuIik7CiAjaWZkZWYgX19GcmVlQlNEX18KLQkJaWYgKGlvY3RsKENEQURldlt3RGV2SURdLnVuaXhkZXYsIENESU9DQUxMT1cpKSByZXR1cm4gTUNJRVJSX0hBUkRXQVJFOwotCQlpZiAoaW9jdGwoQ0RBRGV2W3dEZXZJRF0udW5peGRldiwgQ0RJT0NFSkVDVCkpIHJldHVybiBNQ0lFUlJfSEFSRFdBUkU7Ci0JCWlmIChpb2N0bChDREFEZXZbd0RldklEXS51bml4ZGV2LCBDRElPQ1BSRVZFTlQpKSByZXR1cm4gTUNJRVJSX0hBUkRXQVJFOworCQlpZiAoaW9jdGwoQ0RBRGV2W2luZGV4XS51bml4ZGV2LCBDRElPQ0FMTE9XKSkgcmV0dXJuIE1DSUVSUl9IQVJEV0FSRTsKKwkJaWYgKGlvY3RsKENEQURldltpbmRleF0udW5peGRldiwgQ0RJT0NFSkVDVCkpIHJldHVybiBNQ0lFUlJfSEFSRFdBUkU7CisJCWlmIChpb2N0bChDREFEZXZbaW5kZXhdLnVuaXhkZXYsIENESU9DUFJFVkVOVCkpIHJldHVybiBNQ0lFUlJfSEFSRFdBUkU7CiAjZWxpZiBsaW51eAotCQlpZiAoaW9jdGwoQ0RBRGV2W3dEZXZJRF0udW5peGRldiwgQ0RST01FSkVDVCkpIHJldHVybiBNQ0lFUlJfSEFSRFdBUkU7CisJCWlmIChpb2N0bChDREFEZXZbaW5kZXhdLnVuaXhkZXYsIENEUk9NRUpFQ1QpKSByZXR1cm4gTUNJRVJSX0hBUkRXQVJFOwogI2VuZGlmCi0JCUNEQURldlt3RGV2SURdLm5UcmFja3MgPSAwOworCQlDREFEZXZbaW5kZXhdLm5UcmFja3MgPSAwOwogCQl9CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfU0VUX0RPT1JfQ0xPU0VEKSB7CiAgICAgICAgIAlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLAogCQkJIkNEQVVESU9fbWNpU2V0IC8vIE1DSV9TRVRfRE9PUl9DTE9TRUQgIVxuIik7CiAjaWZkZWYgX19GcmVlQlNEX18KLSAgICAgICAgICAgICAgICBpZiAoaW9jdGwoQ0RBRGV2W3dEZXZJRF0udW5peGRldiwgQ0RJT0NBTExPVykpIHJldHVybiBNQ0lFUlJfSEFSRFdBUkU7Ci0gICAgICAgICAgICAgICAgaWYgKGlvY3RsKENEQURldlt3RGV2SURdLnVuaXhkZXYsIENESU9DQ0xPU0UpKSByZXR1cm4gTUNJRVJSX0hBUkRXQVJFOwotICAgICAgICAgICAgICAgIGlmIChpb2N0bChDREFEZXZbd0RldklEXS51bml4ZGV2LCBDRElPQ1BSRVZFTlQpKSByZXR1cm4gTUNJRVJSX0hBUkRXQVJFOworICAgICAgICAgICAgICAgIGlmIChpb2N0bChDREFEZXZbaW5kZXhdLnVuaXhkZXYsIENESU9DQUxMT1cpKSByZXR1cm4gTUNJRVJSX0hBUkRXQVJFOworICAgICAgICAgICAgICAgIGlmIChpb2N0bChDREFEZXZbaW5kZXhdLnVuaXhkZXYsIENESU9DQ0xPU0UpKSByZXR1cm4gTUNJRVJSX0hBUkRXQVJFOworICAgICAgICAgICAgICAgIGlmIChpb2N0bChDREFEZXZbaW5kZXhdLnVuaXhkZXYsIENESU9DUFJFVkVOVCkpIHJldHVybiBNQ0lFUlJfSEFSRFdBUkU7CiAjZWxpZiBsaW51eAotCQlpZiAoaW9jdGwoQ0RBRGV2W3dEZXZJRF0udW5peGRldiwgQ0RST01FSkVDVCkpIHJldHVybiBNQ0lFUlJfSEFSRFdBUkU7CisJCWlmIChpb2N0bChDREFEZXZbaW5kZXhdLnVuaXhkZXYsIENEUk9NRUpFQ1QpKSByZXR1cm4gTUNJRVJSX0hBUkRXQVJFOwogCQkJICAvKiBYWFggc2hvdWxkIGl0IGJlICIsMSIgPz8/ICovCiAjZW5kaWYKLQkJQ0RBRGV2W3dEZXZJRF0ublRyYWNrcyA9IDA7CisJCUNEQURldltpbmRleF0ublRyYWNrcyA9IDA7CiAJCX0KIAlpZiAoZHdGbGFncyAmIE1DSV9TRVRfVklERU8pIHJldHVybiBNQ0lFUlJfVU5TVVBQT1JURURfRlVOQ1RJT047CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfU0VUX09OKSByZXR1cm4gTUNJRVJSX1VOU1VQUE9SVEVEX0ZVTkNUSU9OOwpAQCAtMTAxMSw3ICsxMDI0LDcgQEAKIAkJCSJDREFVRElPX21jaVNldCAvLyBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgCiAJCQlscFBhcm1zLT5kd0NhbGxiYWNrKTsKIAkJbWNpRHJpdmVyTm90aWZ5KChIV05EMTYpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKLQkJCUNEQURldlt3RGV2SURdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKKwkJCUNEQURldltpbmRleF0ud05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOwogCQl9CiAJcmV0dXJuIDA7CiAjZWxzZQpAQCAtMTExNCw1ICsxMTI3LDMgQEAKIAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2VuZGlmIC8qICNpZmRlZiBCVUlMVElOX01NU1lTVEVNICovCmRpZmYgLS1naXQgYS9tdWx0aW1lZGlhL21jaXN0cmluZy5jIGIvbXVsdGltZWRpYS9tY2lzdHJpbmcuYwppbmRleCA5MWFmMDhkLi5mNjE2NzljIDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL21jaXN0cmluZy5jCisrKyBiL211bHRpbWVkaWEvbWNpc3RyaW5nLmMKQEAgLTYsOCArNiw2IEBACiAvKiBGSVhNRTogc3BlY2lhbCBjb21tYW5kcyBvZiBkZXZpY2UgZHJpdmVycyBzaG91bGQgYmUgaGFuZGxlZCBieSB0aG9zZSBkcml2ZXJzCiAgKi8KIAotI2lmbmRlZiBXSU5FTElCCi0KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgpAQCAtMzIsNiArMzAsMTMgQEAKICAqLwogZXh0ZXJuIE1DSV9PUEVOX1BBUk1TCQltY2lPcGVuRHJ2W01BWE1DSURSSVZFUlNdOwogCisjZGVmaW5lIEdldERydih3RGV2SUQpICgmbWNpRHJ2W01NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpXSkKKyNkZWZpbmUgR2V0T3BlbkRydih3RGV2SUQpICgmbWNpT3BlbkRydltNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKV0pCitleHRlcm4gaW50IE1NU1lTVEVNX0RldklEVG9JbmRleChVSU5UMTYgd0RldklEKTsKK2V4dGVybiBVSU5UMTYgTU1TWVNURU1fRmlyc3REZXZJRCh2b2lkKTsKK2V4dGVybiBVSU5UMTYgTU1TWVNURU1fTmV4dERldklEKFVJTlQxNiB3RGV2SUQpOworZXh0ZXJuIEJPT0wzMiBNTVNZU1RFTV9EZXZJRFZhbGlkKFVJTlQxNiB3RGV2SUQpOworCiBMT05HIERydkRlZkRyaXZlclByb2MoRFdPUkQgZHdEZXZJRCwgSERSVlIxNiBoRHJpdiwgV09SRCB3TXNnLCAKIAkJICAgICAgRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yKTsKIApAQCAtNTEsOCArNTYsOCBAQAogCiAvKiBzdGFuZGFyZCBmdW5jdGlvbnBhcmFtZXRlcnMgZm9yIGFsbCBmdW5jdGlvbnMgKi8KICNkZWZpbmUgX01DSVNUUl9QUk9UT18gXAotCVdPUkQgd0RldklELFdPUkQgdURldlR5cCxMUFNUUiBscHN0clJldHVyblN0cmluZyxVSU5UIHVSZXR1cm5MZW5ndGgsXAotCUxQQ1NUUiBkZXYsTFBTVFIgKmtleXdvcmRzLFVJTlQgbnJvZmtleXdvcmRzLERXT1JEIGR3RmxhZ3MKKwlXT1JEIHdEZXZJRCxXT1JEIHVEZXZUeXAsTFBTVFIgbHBzdHJSZXR1cm5TdHJpbmcsVUlOVDE2IHVSZXR1cm5MZW5ndGgsXAorCUxQQ1NUUiBkZXYsTFBTVFIgKmtleXdvcmRzLFVJTlQxNiBucm9ma2V5d29yZHMsRFdPUkQgZHdGbGFncwogCiAvKiBjb3B5IHN0cmluZyB0byByZXR1cm4gcG9pbnRlciBpbmNsdWRpbmcgbmVjZXNzYXJ5IGNoZWNrcyAKICAqIGZvciB1c2UgaW4gbWNpU2VuZFN0cmluZygpCkBAIC02OSwxNiArNzQsMTYgQEAKICNkZWZpbmUgX01DSV9DQUxMX0RSSVZFUihjbWQscGFyYW1zKSBcCiAJc3dpdGNoKHVEZXZUeXApIHtcCiAJY2FzZSBNQ0lfREVWVFlQRV9DRF9BVURJTzpcCi0JCXJlcz1DREFVRElPX0RyaXZlclByb2MobWNpRHJ2W3dEZXZJRF0ud0RldmljZUlELDAsY21kLGR3RmxhZ3MsIChEV09SRCkocGFyYW1zKSk7XAorCQlyZXM9Q0RBVURJT19Ecml2ZXJQcm9jKEdldERydih3RGV2SUQpLT53RGV2aWNlSUQsMCxjbWQsZHdGbGFncywgKERXT1JEKShwYXJhbXMpKTtcCiAJCWJyZWFrO1wKIAljYXNlIE1DSV9ERVZUWVBFX1dBVkVGT1JNX0FVRElPOlwKLQkJcmVzPVdBVkVfRHJpdmVyUHJvYyhtY2lEcnZbd0RldklEXS53RGV2aWNlSUQsMCxjbWQsZHdGbGFncywoRFdPUkQpKHBhcmFtcykpO1wKKwkJcmVzPVdBVkVfRHJpdmVyUHJvYyhHZXREcnYod0RldklEKS0+d0RldmljZUlELDAsY21kLGR3RmxhZ3MsKERXT1JEKShwYXJhbXMpKTtcCiAJCWJyZWFrO1wKIAljYXNlIE1DSV9ERVZUWVBFX1NFUVVFTkNFUjpcCi0JCXJlcz1NSURJX0RyaXZlclByb2MobWNpRHJ2W3dEZXZJRF0ud0RldmljZUlELDAsY21kLGR3RmxhZ3MsKERXT1JEKShwYXJhbXMpKTtcCisJCXJlcz1NSURJX0RyaXZlclByb2MoR2V0RHJ2KHdEZXZJRCktPndEZXZpY2VJRCwwLGNtZCxkd0ZsYWdzLChEV09SRCkocGFyYW1zKSk7XAogCQlicmVhaztcCiAJY2FzZSBNQ0lfREVWVFlQRV9BTklNQVRJT046XAotCQlyZXM9QU5JTV9Ecml2ZXJQcm9jKG1jaURydlt3RGV2SURdLndEZXZpY2VJRCwwLGNtZCxkd0ZsYWdzLChEV09SRCkocGFyYW1zKSk7XAorCQlyZXM9QU5JTV9Ecml2ZXJQcm9jKEdldERydih3RGV2SUQpLT53RGV2aWNlSUQsMCxjbWQsZHdGbGFncywoRFdPUkQpKHBhcmFtcykpO1wKIAkJYnJlYWs7XAogCWNhc2UgTUNJX0RFVlRZUEVfRElHSVRBTF9WSURFTzpcCiAJCWRwcmludGZfbWNpKHN0ZGRlYiwiX01DSV9DQUxMX0RSSVZFUiAvL05vIERJR0lUQUxfVklERU8geWV0ICFcbiIpO1wKQEAgLTkxLDcgKzk2LDcgQEAKIAl9CiAvKiBwcmludCBhIERXT1JEIGluIHRoZSBzcGVjaWZpZWQgdGltZWZvcm1hdCAqLwogc3RhdGljIHZvaWQKLV9NQ0lTVFJfcHJpbnR0ZihjaGFyICpidWYsVUlOVCB1RGV2VHlwZSxEV09SRCB0aW1lZixEV09SRCB2YWwpIHsKK19NQ0lTVFJfcHJpbnR0ZihjaGFyICpidWYsVUlOVDE2IHVEZXZUeXBlLERXT1JEIHRpbWVmLERXT1JEIHZhbCkgewogCSpidWY9J1wwJzsKIAlzd2l0Y2ggKHRpbWVmKSB7CiAJY2FzZSBNQ0lfRk9STUFUX01JTExJU0VDT05EUzoKQEAgLTMyMiwxNyArMzI3LDE4IEBACiAJCVNFR1BUUl9GUkVFKHBVKTsKIAkJcmV0dXJuIE1DSUVSUl9JTlZBTElEX0RFVklDRV9OQU1FOwogCX0KLQl3RGV2SUQ9MDsKLQl3aGlsZShtY2lEcnZbd0RldklEXS53VHlwZSkgewotCQlpZiAoKyt3RGV2SUQ+PU1BWE1DSURSSVZFUlMpIHsKKwl3RGV2SUQ9TU1TWVNURU1fRmlyc3REZXZJRCgpOworCXdoaWxlKEdldERydih3RGV2SUQpLT53VHlwZSkgeworCQl3RGV2SUQgPSBNTVNZU1RFTV9OZXh0RGV2SUQod0RldklEKTsKKwkJaWYgKCFNTVNZU1RFTV9EZXZJRFZhbGlkKHdEZXZJRCkpIHsKIAkJCWRwcmludGZfbWNpKHN0ZGRlYiwgX19GSUxFX18iOk1DSVNUUl9PcGVuOk1BWE1DSURSSVZFUlMgcmVhY2hlZCFcbiIpOwogCQkJU0VHUFRSX0ZSRUUoUFRSX1NFR19UT19MSU4ocFUtPm9wZW5QYXJhbXMubHBzdHJFbGVtZW50TmFtZSkpOwogCQkJU0VHUFRSX0ZSRUUocFUpOwogCQkJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAkJfQogCX0KLQltY2lEcnZbd0RldklEXS53VHlwZQkJPSB1RGV2VHlwOwotCW1jaURydlt3RGV2SURdLndEZXZpY2VJRAk9IHdEZXZJRDsKKwlHZXREcnYod0RldklEKS0+d1R5cGUJCT0gdURldlR5cDsKKwlHZXREcnYod0RldklEKS0+d0RldmljZUlECT0gd0RldklEOwogCXBVLT5vcGVuUGFyYW1zLmR3Q2FsbGJhY2sJPSAwOwogCXBVLT5vcGVuUGFyYW1zLndEZXZpY2VJRAk9IHdEZXZJRDsKIAlwVS0+b3ZseW9wZW5QYXJhbXMuZHdTdHlsZQk9IDA7IApAQCAtMzUxLDcgKzM1Nyw3IEBACiAJCX0KIAkJaWYgKCFzdHJjbXAoa2V5d29yZHNbaV0sImVsZW1lbnQiKSAmJiAoaSsxPG5yb2ZrZXl3b3JkcykpIHsKIAkJCWR3RmxhZ3MgfD0gTUNJX09QRU5fRUxFTUVOVDsKLQkJCXBVLT5vcGVuUGFyYW1zLmxwc3RyRWxlbWVudE5hbWU9U0VHUFRSX0dFVChTRUdQVFJfU1RSRFVQKGtleXdvcmRzW2ldKSk7CisJCQlwVS0+b3BlblBhcmFtcy5scHN0ckVsZW1lbnROYW1lPVNFR1BUUl9HRVQoU0VHUFRSX1NUUkRVUChrZXl3b3Jkc1tpKzFdKSk7CiAJCQlpKz0yOwogCQkJY29udGludWU7CiAJCX0KQEAgLTQyMSw3ICs0MjcsNyBAQAogCX0KIAlfTUNJX0NBTExfRFJJVkVSKCBNQ0lfT1BFTiwgU0VHUFRSX0dFVChwVSkgKTsKIAlpZiAocmVzPT0wKQotCQltZW1jcHkoJm1jaU9wZW5EcnZbd0RldklEXSwmcFUtPm9wZW5QYXJhbXMsc2l6ZW9mKE1DSV9PUEVOX1BBUk1TKSk7CisJCW1lbWNweShHZXRPcGVuRHJ2KHdEZXZJRCksJnBVLT5vcGVuUGFyYW1zLHNpemVvZihNQ0lfT1BFTl9QQVJNUykpOwogCWVsc2UgewogCQlTRUdQVFJfRlJFRShQVFJfU0VHX1RPX0xJTihwVS0+b3BlblBhcmFtcy5scHN0ckVsZW1lbnROYW1lKSk7CiAJCVNFR1BUUl9GUkVFKFBUUl9TRUdfVE9fTElOKHBVLT5vcGVuUGFyYW1zLmxwc3RyRGV2aWNlVHlwZSkpOwpAQCAtMjA5NSw3ICsyMTAxLDcgQEAKICAqIGl0IGlzIHVzZWQuIChpbWFnaW5lICJjbG9zZSBhbGwiKS4gTm90IGltcGxlbWVudGVkIHlldC4KICAqLwogRFdPUkQgbWNpU2VuZFN0cmluZyAoTFBDU1RSIGxwc3RyQ29tbWFuZCwgTFBTVFIgbHBzdHJSZXR1cm5TdHJpbmcsIAotCVVJTlQgdVJldHVybkxlbmd0aCwgSFdORDE2IGh3bmRDYWxsYmFjaykKKwlVSU5UMTYgdVJldHVybkxlbmd0aCwgSFdORDE2IGh3bmRDYWxsYmFjaykKIHsKIAljaGFyCSpjbWQsKmRldiwqYXJncywqKmtleXdvcmRzOwogCVdPUkQJdURldlR5cD0wLHdEZXZJRD0wOwpAQCAtMjE1NCwyMiArMjE2MCwyMyBAQAogCiAgCS8qIGRldGVybWluZSB3RGV2SUQgYW5kIHVEZXZUeXAgZm9yIGFsbCBjb21tYW5kcyBleGNlcHQgIm9wZW4iICovCiAgCWlmIChTVFJDTVAoY21kLCJvcGVuIikhPTApIHsKLQkJd0RldklEPTA7CisJCXdEZXZJRCA9IE1NU1lTVEVNX0ZpcnN0RGV2SUQoKTsKIAkJd2hpbGUgKDEpIHsKIAkJCVNFR1BUUglkbmFtZTsKIAotCQkJZG5hbWU9KFNFR1BUUiltY2lPcGVuRHJ2W3dEZXZJRF0ubHBzdHJBbGlhczsKKwkJCWRuYW1lPShTRUdQVFIpR2V0T3BlbkRydih3RGV2SUQpLT5scHN0ckFsaWFzOwogCQkJaWYgKGRuYW1lPT1OVUxMKSAKLQkJCQlkbmFtZT0oU0VHUFRSKW1jaU9wZW5EcnZbd0RldklEXS5scHN0ckRldmljZVR5cGU7CisJCQkJZG5hbWU9KFNFR1BUUilHZXRPcGVuRHJ2KHdEZXZJRCktPmxwc3RyRGV2aWNlVHlwZTsKIAkJCWlmICgoZG5hbWUhPU5VTEwpJiYoIVNUUkNNUChQVFJfU0VHX1RPX0xJTihkbmFtZSksZGV2KSkpCiAJCQkJYnJlYWs7Ci0JCQlpZiAoKyt3RGV2SUQgPj0gTUFYTUNJRFJJVkVSUykgeworCQkJd0RldklEID0gTU1TWVNURU1fTmV4dERldklEKHdEZXZJRCk7CisJCQlpZiAoIU1NU1lTVEVNX0RldklEVmFsaWQod0RldklEKSkgewogCQkJCWRwcmludGZfbWNpKHN0ZGRlYiwgX19GSUxFX18iOm1jaVNlbmRTdHJpbmc6TUFYTUNJRFJJVkVSUyByZWFjaGVkIVxuIik7CiAJCQkJZnJlZShrZXl3b3Jkcyk7ZnJlZShjbWQpOwogCQkJCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJCQl9CiAJCX0KLQkJdURldlR5cD1tY2lEcnZbd0RldklEXS53VHlwZTsKKwkJdURldlR5cD1HZXREcnYod0RldklEKS0+d1R5cGU7CiAJfQogCiAgCWZvciAoaT0wO01DSVNUUl9jbWR0YWJsZVtpXS5jbWQhPU5VTEw7aSsrKSB7CkBAIC0yMTkyLDQgKzIxOTksMyBAQAogCWZyZWUoa2V5d29yZHMpO2ZyZWUoY21kKTsKIAlyZXR1cm4gTUNJRVJSX01JU1NJTkdfQ09NTUFORF9TVFJJTkc7CiB9Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvbWlkaS5jIGIvbXVsdGltZWRpYS9taWRpLmMKaW5kZXggNWQwOGQ3Yi4uN2E1MmY4NyAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS9taWRpLmMKKysrIGIvbXVsdGltZWRpYS9taWRpLmMKQEAgLTQsMTIgKzQsNiBAQAogICogQ29weXJpZ2h0IDE5OTQgTWFydGluIEF5b3R0ZQogICovCiAKLSNpZm5kZWYgV0lORUxJQgotI2RlZmluZSBCVUlMVElOX01NU1lTVEVNCi0jZW5kaWYgCi0KLSNpZmRlZiBCVUlMVElOX01NU1lTVEVNCi0KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgpAQCAtMzAsNiArMjQsOCBAQAogI2luY2x1ZGUgPG1hY2hpbmUvc291bmRjYXJkLmg+CiAjZW5kaWYKIAoraW50IE1NU1lTVEVNX0RldklEVG9JbmRleChVSU5UMTYpOworCiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKICNkZWZpbmUgTUlESV9ERVYgIi9kZXYvc2VxdWVuY2VyIgogCkBAIC02NSw3ICs2MSw3IEBACiAKIHR5cGVkZWYgc3RydWN0IHsKIAlpbnQgICAgIG5Vc2VDb3VudDsgICAgICAgICAgLyogSW5jcmVtZW50ZWQgZm9yIGVhY2ggc2hhcmVkIG9wZW4gKi8KLQlCT09MICAgIGZTaGFyZWFibGU7ICAgICAgICAgLyogVFJVRSBpZiBmaXJzdCBvcGVuIHdhcyBzaGFyZWFibGUgKi8KKwlCT09MMTYgIGZTaGFyZWFibGU7ICAgICAgICAgLyogVFJVRSBpZiBmaXJzdCBvcGVuIHdhcyBzaGFyZWFibGUgKi8KIAlXT1JEICAgIHdOb3RpZnlEZXZpY2VJRDsgICAgLyogTUNJIGRldmljZSBJRCB3aXRoIGEgcGVuZGluZyBub3RpZmljYXRpb24gKi8KIAlIQU5ETEUxNiBoQ2FsbGJhY2s7ICAgICAgICAgLyogQ2FsbGJhY2sgaGFuZGxlIGZvciBwZW5kaW5nIG5vdGlmaWNhdGlvbiAqLwogCUhNTUlPMTYJaEZpbGU7CQkJCS8qIG1taW8gZmlsZSBoYW5kbGUgb3BlbiBhcyBFbGVtZW50CQkqLwpAQCAtODgsMTQgKzg0LDE1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfTm90aWZ5Q2xpZW50CQkJW2ludGVybmFsXQogKi8KLXN0YXRpYyBEV09SRCBNSURJX05vdGlmeUNsaWVudChVSU5UIHdEZXZJRCwgV09SRCB3TXNnLCAKK3N0YXRpYyBEV09SRCBNSURJX05vdGlmeUNsaWVudChVSU5UMTYgd0RldklELCBXT1JEIHdNc2csIAogCQkJCURXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMikKIHsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQotCWlmIChNaWRpSW5EZXZbd0RldklEXS53RmxhZ3MgIT0gRENCX05VTEwgJiYgIURyaXZlckNhbGxiYWNrKAotCQlNaWRpSW5EZXZbd0RldklEXS5taWRpRGVzYy5kd0NhbGxiYWNrLCBNaWRpSW5EZXZbd0RldklEXS53RmxhZ3MsIAotCQlNaWRpSW5EZXZbd0RldklEXS5taWRpRGVzYy5oTWlkaSwgd01zZywgCi0JCU1pZGlJbkRldlt3RGV2SURdLm1pZGlEZXNjLmR3SW5zdGFuY2UsIGR3UGFyYW0xLCBkd1BhcmFtMikpIHsKKwlpbnQgaW5kZXggPSBNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKTsKKwlpZiAoTWlkaUluRGV2W2luZGV4XS53RmxhZ3MgIT0gRENCX05VTEwgJiYgIURyaXZlckNhbGxiYWNrKAorCQlNaWRpSW5EZXZbaW5kZXhdLm1pZGlEZXNjLmR3Q2FsbGJhY2ssIE1pZGlJbkRldltpbmRleF0ud0ZsYWdzLCAKKwkJTWlkaUluRGV2W2luZGV4XS5taWRpRGVzYy5oTWlkaSwgd01zZywgCisJCU1pZGlJbkRldltpbmRleF0ubWlkaURlc2MuZHdJbnN0YW5jZSwgZHdQYXJhbTEsIGR3UGFyYW0yKSkgewogCQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9Ob3RpZnlDbGllbnQgLy8gY2FuJ3Qgbm90aWZ5IGNsaWVudCAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PRVJST1I7CiAJCX0KQEAgLTEwOSwxNiArMTA2LDE3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfUmVhZEJ5dGUJCQlbaW50ZXJuYWxdCQogKi8KLXN0YXRpYyBEV09SRCBNSURJX1JlYWRCeXRlKFVJTlQgd0RldklELCBCWVRFICpscGJ5dCkKK3N0YXRpYyBEV09SRCBNSURJX1JlYWRCeXRlKFVJTlQxNiB3RGV2SUQsIEJZVEUgKmxwYnl0KQogeworCWludCBpbmRleCA9IE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpOwogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCiAJaWYgKGxwYnl0ICE9IE5VTEwpIHsKLQkJaWYgKG1taW9SZWFkKE1DSU1pZGlEZXZbd0RldklEXS5oRmlsZSwgKEhQU1RSKWxwYnl0LAorCQlpZiAobW1pb1JlYWQoTUNJTWlkaURldltpbmRleF0uaEZpbGUsIChIUFNUUilscGJ5dCwKIAkJCShsb25nKSBzaXplb2YoQllURSkpID09IChsb25nKSBzaXplb2YoQllURSkpIHsKIAkJCXJldHVybiAwOwogCQkJfQogCQl9Ci0JZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfUmVhZEJ5dGUgLy8gZXJyb3IgcmVhZGluZyB3RGV2SUQ9JWQgXG4iLCB3RGV2SUQpOworCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX1JlYWRCeXRlIC8vIGVycm9yIHJlYWRpbmcgd0RldklEPSUwNFhcbiIsIHdEZXZJRCk7CiAJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAogI2Vsc2UKQEAgLTEzMCw3ICsxMjgsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX1JlYWRXb3JkCQkJW2ludGVybmFsXQkKICovCi1zdGF0aWMgRFdPUkQgTUlESV9SZWFkV29yZChVSU5UIHdEZXZJRCwgTFBXT1JEIGxwdykKK3N0YXRpYyBEV09SRCBNSURJX1JlYWRXb3JkKFVJTlQxNiB3RGV2SUQsIExQV09SRCBscHcpCiB7CiAJQllURQloaWJ5dGUsIGxvYnl0ZTsKIAlpZiAobHB3ICE9IE5VTEwpIHsKQEAgLTE0MSw3ICsxMzksNyBAQAogCQkJCX0KIAkJCX0KIAkJfQotCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX1JlYWRXb3JkIC8vIGVycm9yIHJlYWRpbmcgd0RldklEPSVkIFxuIiwgd0RldklEKTsKKwlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9SZWFkV29yZCAvLyBlcnJvciByZWFkaW5nIHdEZXZJRD0lMDRYXG4iLCB3RGV2SUQpOwogCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiB9CiAKQEAgLTE0OSw3ICsxNDcsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX1JlYWRMb25nCQkJW2ludGVybmFsXQkKICovCi1zdGF0aWMgRFdPUkQgTUlESV9SZWFkTG9uZyhVSU5UIHdEZXZJRCwgTFBEV09SRCBscGR3KQorc3RhdGljIERXT1JEIE1JRElfUmVhZExvbmcoVUlOVDE2IHdEZXZJRCwgTFBEV09SRCBscGR3KQogewogCVdPUkQJaGl3b3JkLCBsb3dvcmQ7CiAJaWYgKGxwZHcgIT0gTlVMTCkgewpAQCAtMTYwLDcgKzE1OCw3IEBACiAJCQkJfQogCQkJfQogCQl9Ci0JZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfUmVhZExvbmcgLy8gZXJyb3IgcmVhZGluZyB3RGV2SUQ9JWQgXG4iLCB3RGV2SUQpOworCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX1JlYWRMb25nIC8vIGVycm9yIHJlYWRpbmcgd0RldklEPSUwNFhcbiIsIHdEZXZJRCk7CiAJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIH0KIApAQCAtMTY4LDE5ICsxNjYsMTkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9SZWFkVmFyeUxlbgkJW2ludGVybmFsXQkKICovCi1zdGF0aWMgRFdPUkQgTUlESV9SZWFkVmFyeUxlbihVSU5UIHdEZXZJRCwgTFBEV09SRCBscGR3KQorc3RhdGljIERXT1JEIE1JRElfUmVhZFZhcnlMZW4oVUlOVDE2IHdEZXZJRCwgTFBEV09SRCBscGR3KQogewogCUJZVEUJYnl0ZTsKIAlEV09SRAl2YWx1ZTsKIAlpZiAobHBkdyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCWlmIChNSURJX1JlYWRCeXRlKHdEZXZJRCwgJmJ5dGUpICE9IDApIHsKLQkJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfUmVhZFZhcnlMZW4gLy8gZXJyb3IgcmVhZGluZyB3RGV2SUQ9JWQgXG4iLCB3RGV2SUQpOworCQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9SZWFkVmFyeUxlbiAvLyBlcnJvciByZWFkaW5nIHdEZXZJRD0lMDRYXG4iLCB3RGV2SUQpOwogCQlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCQl9CiAJdmFsdWUgPSAoRFdPUkQpKGJ5dGUgJiAweDdGKTsKIAl3aGlsZSAoYnl0ZSAmIDB4ODApIHsKIAkJaWYgKE1JRElfUmVhZEJ5dGUod0RldklELCAmYnl0ZSkgIT0gMCkgewotCQkJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfUmVhZFZhcnlMZW4gLy8gZXJyb3IgcmVhZGluZyB3RGV2SUQ9JWQgXG4iLCB3RGV2SUQpOworCQkJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfUmVhZFZhcnlMZW4gLy8gZXJyb3IgcmVhZGluZyB3RGV2SUQ9JTA0WFxuIiwgd0RldklEKTsKIAkJCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJCQl9CiAJCXZhbHVlID0gKHZhbHVlIDw8IDcpICsgKGJ5dGUgJiAweDdGKTsKQEAgLTE5NiwzNiArMTk0LDM3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfUmVhZE1UaGQJCQlbaW50ZXJuYWxdCQogKi8KLXN0YXRpYyBEV09SRCBNSURJX1JlYWRNVGhkKFVJTlQgd0RldklELCBEV09SRCBkd09mZnNldCkKK3N0YXRpYyBEV09SRCBNSURJX1JlYWRNVGhkKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3T2Zmc2V0KQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCisJaW50IGluZGV4ID0gTU1TWVNURU1fRGV2SURUb0luZGV4KHdEZXZJRCk7CiAJRFdPUkQJdG9iZXJlYWQ7CiAJRk9VUkNDCWZvdXJjYzsKIAlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9SZWFkTVRoZCglMDRYLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGR3T2Zmc2V0KTsKLQlpZiAobW1pb1NlZWsoTUNJTWlkaURldlt3RGV2SURdLmhGaWxlLCBkd09mZnNldCwgU0VFS19TRVQpICE9IGR3T2Zmc2V0KSB7CisJaWYgKG1taW9TZWVrKE1DSU1pZGlEZXZbaW5kZXhdLmhGaWxlLCBkd09mZnNldCwgU0VFS19TRVQpICE9IGR3T2Zmc2V0KSB7CiAJCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX1JlYWRNVGhkIC8vIGNhbid0IHNlZWsgYXQgJTA4bFggYmVnaW4gb2YgJ01UaGQnIFxuIiwgZHdPZmZzZXQpOwogCQlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCQl9Ci0JaWYgKG1taW9SZWFkKE1DSU1pZGlEZXZbd0RldklEXS5oRmlsZSwgKEhQU1RSKSZmb3VyY2MsCisJaWYgKG1taW9SZWFkKE1DSU1pZGlEZXZbaW5kZXhdLmhGaWxlLCAoSFBTVFIpJmZvdXJjYywKIAkJKGxvbmcpIHNpemVvZihGT1VSQ0MpKSAhPSAobG9uZykgc2l6ZW9mKEZPVVJDQykpIHsKIAkJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAkJfQogCWlmIChNSURJX1JlYWRMb25nKHdEZXZJRCwgJnRvYmVyZWFkKSAhPSAwKSB7CiAJCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJCX0KLQlpZiAoTUlESV9SZWFkV29yZCh3RGV2SUQsICZNQ0lNaWRpRGV2W3dEZXZJRF0ud0Zvcm1hdCkgIT0gMCkgeworCWlmIChNSURJX1JlYWRXb3JkKHdEZXZJRCwgJk1DSU1pZGlEZXZbaW5kZXhdLndGb3JtYXQpICE9IDApIHsKIAkJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAkJfQotCWlmIChNSURJX1JlYWRXb3JkKHdEZXZJRCwgJk1DSU1pZGlEZXZbd0RldklEXS5uVHJhY2tzKSAhPSAwKSB7CisJaWYgKE1JRElfUmVhZFdvcmQod0RldklELCAmTUNJTWlkaURldltpbmRleF0ublRyYWNrcykgIT0gMCkgewogCQlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCQl9Ci0JaWYgKE1JRElfUmVhZFdvcmQod0RldklELCAmTUNJTWlkaURldlt3RGV2SURdLm5UZW1wbykgIT0gMCkgeworCWlmIChNSURJX1JlYWRXb3JkKHdEZXZJRCwgJk1DSU1pZGlEZXZbaW5kZXhdLm5UZW1wbykgIT0gMCkgewogCQlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCQl9CiAJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfUmVhZE1UaGQgLy8gdG9iZXJlYWQ9JTA4bFgsIHdGb3JtYXQ9JTA0WCBuVHJhY2tzPSUwNFggblRlbXBvPSUwNFhcbiIsCi0JCXRvYmVyZWFkLCBNQ0lNaWRpRGV2W3dEZXZJRF0ud0Zvcm1hdCwKLQkJTUNJTWlkaURldlt3RGV2SURdLm5UcmFja3MsCi0JCU1DSU1pZGlEZXZbd0RldklEXS5uVGVtcG8pOworCQl0b2JlcmVhZCwgTUNJTWlkaURldltpbmRleF0ud0Zvcm1hdCwKKwkJTUNJTWlkaURldltpbmRleF0ublRyYWNrcywKKwkJTUNJTWlkaURldltpbmRleF0ublRlbXBvKTsKIAl0b2JlcmVhZCAtPSAzICogc2l6ZW9mKFdPUkQpOwogLyoKIAkJbnRya3MgPSByZWFkMTZiaXQgKCk7CkBAIC0yMzksMTUgKzIzOCwxNiBAQAogfQogCiAKLXN0YXRpYyBEV09SRCBNSURJX1JlYWRNVHJrKFVJTlQgd0RldklELCBEV09SRCBkd09mZnNldCkKK3N0YXRpYyBEV09SRCBNSURJX1JlYWRNVHJrKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3T2Zmc2V0KQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCisJaW50IGluZGV4ID0gTU1TWVNURU1fRGV2SURUb0luZGV4KHdEZXZJRCk7CiAJRFdPUkQJdG9iZXJlYWQ7CiAJRk9VUkNDCWZvdXJjYzsKLQlpZiAobW1pb1NlZWsoTUNJTWlkaURldlt3RGV2SURdLmhGaWxlLCBkd09mZnNldCwgU0VFS19TRVQpICE9IGR3T2Zmc2V0KSB7CisJaWYgKG1taW9TZWVrKE1DSU1pZGlEZXZbaW5kZXhdLmhGaWxlLCBkd09mZnNldCwgU0VFS19TRVQpICE9IGR3T2Zmc2V0KSB7CiAJCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX1JlYWRNVHJrIC8vIGNhbid0IHNlZWsgYXQgJTA4bFggYmVnaW4gb2YgJ01UaGQnIFxuIiwgZHdPZmZzZXQpOwogCQl9Ci0JaWYgKG1taW9SZWFkKE1DSU1pZGlEZXZbd0RldklEXS5oRmlsZSwgKEhQU1RSKSZmb3VyY2MsCisJaWYgKG1taW9SZWFkKE1DSU1pZGlEZXZbaW5kZXhdLmhGaWxlLCAoSFBTVFIpJmZvdXJjYywKIAkJKGxvbmcpIHNpemVvZihGT1VSQ0MpKSAhPSAobG9uZykgc2l6ZW9mKEZPVVJDQykpIHsKIAkJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAkJfQpAQCAtMjU2LDcgKzI1Niw3IEBACiAJCX0KIAlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9SZWFkTVRyayAvLyB0b2JlcmVhZD0lMDhsWFxuIiwgdG9iZXJlYWQpOwogCXRvYmVyZWFkIC09IDMgKiBzaXplb2YoV09SRCk7Ci0JTUNJTWlkaURldlt3RGV2SURdLmR3VG90YWxMZW4gPSB0b2JlcmVhZDsKKwlNQ0lNaWRpRGV2W2luZGV4XS5kd1RvdGFsTGVuID0gdG9iZXJlYWQ7CiAJcmV0dXJuIDA7CiAjZWxzZQogICAgICAgICAgcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CkBAIC0yNjcsOSArMjY3LDEwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpT3BlbgkJCVtpbnRlcm5hbF0JCiAqLwotc3RhdGljIERXT1JEIE1JRElfbWNpT3BlbihVSU5UIHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfT1BFTl9QQVJNUyBscFBhcm1zKQorc3RhdGljIERXT1JEIE1JRElfbWNpT3BlbihVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9PUEVOX1BBUk1TIGxwUGFybXMpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKKwlpbnQgaW5kZXg7CiAJTUlESU9QRU5ERVNDIAlNaWRpRGVzYzsKIAlEV09SRAkJZHdSZXQ7CiAJRFdPUkQJCWR3T2Zmc2V0OwpAQCAtMjc4LDQ5ICsyNzksNTMgQEAKIAogCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaU9wZW4oJTA4bFgsICVwKVxuIiwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKLQlpZiAoTUNJTWlkaURldlt3RGV2SURdLm5Vc2VDb3VudCA+IDApIHsKKworCXdEZXZJRCA9IGxwUGFybXMtPndEZXZpY2VJRDsKKwlpbmRleCA9IE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpOworCisJaWYgKE1DSU1pZGlEZXZbaW5kZXhdLm5Vc2VDb3VudCA+IDApIHsKIAkJLyogVGhlIGRyaXZlciBhbHJlYWR5IG9wZW4gb24gdGhpcyBjaGFubmVsICovCiAJCS8qIElmIHRoZSBkcml2ZXIgd2FzIG9wZW5lZCBzaGFyZWFibGUgYmVmb3JlIGFuZCB0aGlzIG9wZW4gc3BlY2lmaWVzICovCiAJCS8qIHNoYXJlYWJsZSB0aGVuIGluY3JlbWVudCB0aGUgdXNlIGNvdW50ICovCi0JCWlmIChNQ0lNaWRpRGV2W3dEZXZJRF0uZlNoYXJlYWJsZSAmJiAoZHdGbGFncyAmIE1DSV9PUEVOX1NIQVJFQUJMRSkpCi0JCQkrK01DSU1pZGlEZXZbd0RldklEXS5uVXNlQ291bnQ7CisJCWlmIChNQ0lNaWRpRGV2W2luZGV4XS5mU2hhcmVhYmxlICYmIChkd0ZsYWdzICYgTUNJX09QRU5fU0hBUkVBQkxFKSkKKwkJCSsrTUNJTWlkaURldltpbmRleF0ublVzZUNvdW50OwogCQllbHNlCiAJCQlyZXR1cm4gTUNJRVJSX01VU1RfVVNFX1NIQVJFQUJMRTsKIAkJfQogCWVsc2UgewotCQlNQ0lNaWRpRGV2W3dEZXZJRF0ublVzZUNvdW50ID0gMTsKLQkJTUNJTWlkaURldlt3RGV2SURdLmZTaGFyZWFibGUgPSBkd0ZsYWdzICYgTUNJX09QRU5fU0hBUkVBQkxFOworCQlNQ0lNaWRpRGV2W2luZGV4XS5uVXNlQ291bnQgPSAxOworCQlNQ0lNaWRpRGV2W2luZGV4XS5mU2hhcmVhYmxlID0gZHdGbGFncyAmIE1DSV9PUEVOX1NIQVJFQUJMRTsKIAkJfQogCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaU9wZW4gLy8gd0RldklEPSUwNFhcbiIsIHdEZXZJRCk7CiAJbHBQYXJtcy0+d0RldmljZUlEID0gd0RldklEOwogCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaU9wZW4gLy8gbHBQYXJtcy0+d0RldklEPSUwNFhcbiIsIGxwUGFybXMtPndEZXZpY2VJRCk7CiAJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpT3BlbiAvLyBiZWZvcmUgT1BFTl9FTEVNRU5UXG4iKTsKLSAgICBpZiAoZHdGbGFncyAmIE1DSV9PUEVOX0VMRU1FTlQpIHsKKwlpZiAoZHdGbGFncyAmIE1DSV9PUEVOX0VMRU1FTlQpIHsKIAkJbHBzdHJFbGVtZW50TmFtZSA9IChMUFNUUilQVFJfU0VHX1RPX0xJTihscFBhcm1zLT5scHN0ckVsZW1lbnROYW1lKTsKIAkJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpT3BlbiAvLyBNQ0lfT1BFTl9FTEVNRU5UICclcycgIVxuIiwgbHBzdHJFbGVtZW50TmFtZSk7CiAJCWlmIChzdHJsZW4obHBzdHJFbGVtZW50TmFtZSkgPiAwKSB7CiAJCQlzdHJjcHkoc3RyLCBscHN0ckVsZW1lbnROYW1lKTsKIAkJCUNoYXJVcHBlcjMyQShzdHIpOwotCQkJTUNJTWlkaURldlt3RGV2SURdLmhGaWxlID0gbW1pb09wZW4oc3RyLCBOVUxMLCAKKwkJCU1DSU1pZGlEZXZbaW5kZXhdLmhGaWxlID0gbW1pb09wZW4oc3RyLCBOVUxMLCAKIAkJCQlNTUlPX0FMTE9DQlVGIHwgTU1JT19SRUFEV1JJVEUgfCBNTUlPX0VYQ0xVU0lWRSk7Ci0JCQlpZiAoTUNJTWlkaURldlt3RGV2SURdLmhGaWxlID09IDApIHsKKwkJCWlmIChNQ0lNaWRpRGV2W2luZGV4XS5oRmlsZSA9PSAwKSB7CiAJCQkJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpT3BlbiAvLyBjYW4ndCBmaW5kIGZpbGU9JyVzJyAhXG4iLCBzdHIpOwogCQkJCXJldHVybiBNQ0lFUlJfRklMRV9OT1RfRk9VTkQ7CiAJCQkJfQogCQkJfQogCQllbHNlIAotCQkJTUNJTWlkaURldlt3RGV2SURdLmhGaWxlID0gMDsKKwkJCU1DSU1pZGlEZXZbaW5kZXhdLmhGaWxlID0gMDsKIAkJfQotCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaU9wZW4gLy8gaEZpbGU9JXVcbiIsIE1DSU1pZGlEZXZbd0RldklEXS5oRmlsZSk7Ci0JbWVtY3B5KCZNQ0lNaWRpRGV2W3dEZXZJRF0ub3BlblBhcm1zLCBscFBhcm1zLCBzaXplb2YoTUNJX09QRU5fUEFSTVMpKTsKLQlNQ0lNaWRpRGV2W3dEZXZJRF0ud05vdGlmeURldmljZUlEID0gbHBQYXJtcy0+d0RldmljZUlEOwotCU1DSU1pZGlEZXZbd0RldklEXS5kd1N0YXR1cyA9IE1DSV9NT0RFX1NUT1A7Ci0JTUNJTWlkaURldlt3RGV2SURdLmR3QmVnaW5EYXRhID0gMDsKLQlNQ0lNaWRpRGV2W3dEZXZJRF0uZHdUb3RhbExlbiA9IDA7CisJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpT3BlbiAvLyBoRmlsZT0ldVxuIiwgTUNJTWlkaURldltpbmRleF0uaEZpbGUpOworCW1lbWNweSgmTUNJTWlkaURldltpbmRleF0ub3BlblBhcm1zLCBscFBhcm1zLCBzaXplb2YoTUNJX09QRU5fUEFSTVMpKTsKKwlNQ0lNaWRpRGV2W2luZGV4XS53Tm90aWZ5RGV2aWNlSUQgPSBscFBhcm1zLT53RGV2aWNlSUQ7CisJTUNJTWlkaURldltpbmRleF0uZHdTdGF0dXMgPSBNQ0lfTU9ERV9TVE9QOworCU1DSU1pZGlEZXZbaW5kZXhdLmR3QmVnaW5EYXRhID0gMDsKKwlNQ0lNaWRpRGV2W2luZGV4XS5kd1RvdGFsTGVuID0gMDsKIAlNaWRpRGVzYy5oTWlkaSA9IDA7Ci0JaWYgKE1DSU1pZGlEZXZbd0RldklEXS5oRmlsZSAhPSAwKSB7CisJaWYgKE1DSU1pZGlEZXZbaW5kZXhdLmhGaWxlICE9IDApIHsKIAkJTU1DS0lORk8JY2tNYWluUklGRjsKLQkJaWYgKG1taW9EZXNjZW5kKE1DSU1pZGlEZXZbd0RldklEXS5oRmlsZSwgJmNrTWFpblJJRkYsIE5VTEwsIDApICE9IDApIHsKKwkJaWYgKG1taW9EZXNjZW5kKE1DSU1pZGlEZXZbaW5kZXhdLmhGaWxlLCAmY2tNYWluUklGRiwgTlVMTCwgMCkgIT0gMCkgewogCQkJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAkJCX0KIAkJZHByaW50Zl9taWRpKHN0ZGRlYiwiTUlESV9tY2lPcGVuIC8vIFBhcmVudENodW5rIGNraWQ9JS40cyBmY2NUeXBlPSUuNHMgY2tzaXplPSUwOGxYIFxuIiwKQEAgLTMzOSwxOSArMzQ0LDE5IEBACiAJCQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lPcGVuIC8vIGNhbid0IHJlYWQgJ01UaGQnIGhlYWRlciBcbiIpOwogCQkJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAkJCX0KLQkJZHdPZmZzZXQgPSBtbWlvU2VlayhNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUsIDAsIFNFRUtfQ1VSKTsKKwkJZHdPZmZzZXQgPSBtbWlvU2VlayhNQ0lNaWRpRGV2W2luZGV4XS5oRmlsZSwgMCwgU0VFS19DVVIpOwogCQlpZiAoTUlESV9SZWFkTVRyayh3RGV2SUQsIGR3T2Zmc2V0KSAhPSAwKSB7CiAJCQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lPcGVuIC8vIGNhbid0IHJlYWQgJ01UcmsnIGhlYWRlciBcbiIpOwogCQkJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAkJCX0KLQkJZHdPZmZzZXQgPSBtbWlvU2VlayhNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUsIDAsIFNFRUtfQ1VSKTsKLQkJTUNJTWlkaURldlt3RGV2SURdLmR3QmVnaW5EYXRhID0gZHdPZmZzZXQ7CisJCWR3T2Zmc2V0ID0gbW1pb1NlZWsoTUNJTWlkaURldltpbmRleF0uaEZpbGUsIDAsIFNFRUtfQ1VSKTsKKwkJTUNJTWlkaURldltpbmRleF0uZHdCZWdpbkRhdGEgPSBkd09mZnNldDsKIAkJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpT3BlbiAvLyBDaHVuayBGb3VuZCBja2lkPSUuNHMgZmNjVHlwZT0lLjRzIGNrc2l6ZT0lMDhsWCBcbiIsCiAJCQkJKExQU1RSKSZja01haW5SSUZGLmNraWQsIChMUFNUUikmY2tNYWluUklGRi5mY2NUeXBlLAogCQkJCWNrTWFpblJJRkYuY2tzaXplKTsKIAkJfQotCWR3UmV0ID0gbW9kTWVzc2FnZSgwLCBNT0RNX09QRU4sIDAsIChEV09SRCkmTWlkaURlc2MsIENBTExCQUNLX05VTEwpOwotCWR3UmV0ID0gbWlkTWVzc2FnZSgwLCBNSURNX09QRU4sIDAsIChEV09SRCkmTWlkaURlc2MsIENBTExCQUNLX05VTEwpOworCWR3UmV0ID0gbW9kTWVzc2FnZSh3RGV2SUQsIE1PRE1fT1BFTiwgMCwgKERXT1JEKSZNaWRpRGVzYywgQ0FMTEJBQ0tfTlVMTCk7CisJZHdSZXQgPSBtaWRNZXNzYWdlKHdEZXZJRCwgTUlETV9PUEVOLCAwLCAoRFdPUkQpJk1pZGlEZXNjLCBDQUxMQkFDS19OVUxMKTsKIAlyZXR1cm4gMDsKICNlbHNlCiAJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CkBAIC0zNjIsMTQgKzM2NywxNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaVN0b3AJCQlbaW50ZXJuYWxdCiAqLwotc3RhdGljIERXT1JEIE1JRElfbWNpU3RvcChVSU5UIHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfR0VORVJJQ19QQVJNUyBscFBhcm1zKQorc3RhdGljIERXT1JEIE1JRElfbWNpU3RvcChVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9HRU5FUklDX1BBUk1TIGxwUGFybXMpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lTdG9wKCV1LCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKKwlpbnQgaW5kZXggPSBNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKTsKKwlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lTdG9wKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7Ci0JTUNJTWlkaURldlt3RGV2SURdLmR3U3RhdHVzID0gTUNJX01PREVfU1RPUDsKLQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lTdG9wIC8vIE1DSU1pZGlEZXZbd0RldklEXS5kd1N0YXR1cz0lcCAlZFxuIiwKLQkJCSZNQ0lNaWRpRGV2W3dEZXZJRF0uZHdTdGF0dXMsIE1DSU1pZGlEZXZbd0RldklEXS5kd1N0YXR1cyk7CisJTUNJTWlkaURldltpbmRleF0uZHdTdGF0dXMgPSBNQ0lfTU9ERV9TVE9QOworCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaVN0b3AgLy8gTUNJTWlkaURldltpbmRleF0uZHdTdGF0dXM9JXAgJWRcbiIsCisJCQkmTUNJTWlkaURldltpbmRleF0uZHdTdGF0dXMsIE1DSU1pZGlEZXZbaW5kZXhdLmR3U3RhdHVzKTsKIAlyZXR1cm4gMDsKICNlbHNlCiAJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKQEAgLTM4MCwyNSArMzg2LDI2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpQ2xvc2UJCVtpbnRlcm5hbF0KICovCi1zdGF0aWMgRFdPUkQgTUlESV9tY2lDbG9zZShVSU5UIHdEZXZJRCwgRFdPUkQgZHdQYXJhbSwgTFBNQ0lfR0VORVJJQ19QQVJNUyBscFBhcm1zKQorc3RhdGljIERXT1JEIE1JRElfbWNpQ2xvc2UoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdQYXJhbSwgTFBNQ0lfR0VORVJJQ19QQVJNUyBscFBhcm1zKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCisJaW50IGluZGV4ID0gTU1TWVNURU1fRGV2SURUb0luZGV4KHdEZXZJRCk7CiAJRFdPUkQJCWR3UmV0OwotCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaUNsb3NlKCV1LCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd1BhcmFtLCBscFBhcm1zKTsKLQlpZiAoTUNJTWlkaURldlt3RGV2SURdLmR3U3RhdHVzICE9IE1DSV9NT0RFX1NUT1ApIHsKKwlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lDbG9zZSglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd1BhcmFtLCBscFBhcm1zKTsKKwlpZiAoTUNJTWlkaURldltpbmRleF0uZHdTdGF0dXMgIT0gTUNJX01PREVfU1RPUCkgewogCQlNSURJX21jaVN0b3Aod0RldklELCBNQ0lfV0FJVCwgbHBQYXJtcyk7CiAJCX0KLQlNQ0lNaWRpRGV2W3dEZXZJRF0uZHdTdGF0dXMgPSBNQ0lfTU9ERV9TVE9QOwotCU1DSU1pZGlEZXZbd0RldklEXS5uVXNlQ291bnQtLTsKLQlpZiAoTUNJTWlkaURldlt3RGV2SURdLm5Vc2VDb3VudCA9PSAwKSB7Ci0JCWlmIChNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUgIT0gMCkgewotCQkJbW1pb0Nsb3NlKE1DSU1pZGlEZXZbd0RldklEXS5oRmlsZSwgMCk7Ci0JCQlNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUgPSAwOworCU1DSU1pZGlEZXZbaW5kZXhdLmR3U3RhdHVzID0gTUNJX01PREVfU1RPUDsKKwlNQ0lNaWRpRGV2W2luZGV4XS5uVXNlQ291bnQtLTsKKwlpZiAoTUNJTWlkaURldltpbmRleF0ublVzZUNvdW50ID09IDApIHsKKwkJaWYgKE1DSU1pZGlEZXZbaW5kZXhdLmhGaWxlICE9IDApIHsKKwkJCW1taW9DbG9zZShNQ0lNaWRpRGV2W2luZGV4XS5oRmlsZSwgMCk7CisJCQlNQ0lNaWRpRGV2W2luZGV4XS5oRmlsZSA9IDA7CiAJCQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lDbG9zZSAvLyBoRmlsZSBjbG9zZWQgIVxuIik7CiAJCQl9Ci0JCWR3UmV0ID0gbW9kTWVzc2FnZSgwLCBNT0RNX0NMT1NFLCAwLCAwTCwgMEwpOworCQlkd1JldCA9IG1vZE1lc3NhZ2Uod0RldklELCBNT0RNX0NMT1NFLCAwLCAwTCwgMEwpOwogCQlpZiAoZHdSZXQgIT0gTU1TWVNFUlJfTk9FUlJPUikgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKLQkJZHdSZXQgPSBtaWRNZXNzYWdlKDAsIE1JRE1fQ0xPU0UsIDAsIDBMLCAwTCk7CisJCWR3UmV0ID0gbWlkTWVzc2FnZSh3RGV2SUQsIE1JRE1fQ0xPU0UsIDAsIDBMLCAwTCk7CiAJCWlmIChkd1JldCAhPSBNTVNZU0VSUl9OT0VSUk9SKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCQl9CiAJcmV0dXJuIDA7CkBAIC00MTEsMTkgKzQxOCwyMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaVBsYXkJCVtpbnRlcm5hbF0KICovCi1zdGF0aWMgRFdPUkQgTUlESV9tY2lQbGF5KFVJTlQgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9QTEFZX1BBUk1TIGxwUGFybXMpCitzdGF0aWMgRFdPUkQgTUlESV9tY2lQbGF5KFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX1BMQVlfUEFSTVMgbHBQYXJtcykKIHsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQorCWludCBpbmRleCA9IE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpOwogCWludAkJCWNvdW50OwogCWludAkJCXN0YXJ0LCBlbmQ7CiAJTFBNSURJSERSCWxwTWlkaUhkcjsKIAlEV09SRAkJZHdEYXRhOwogCUxQV09SRAkJcHRyOwogCURXT1JECQlkd1JldDsKLQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lQbGF5KCV1LCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKLQlpZiAoTUNJTWlkaURldlt3RGV2SURdLmhGaWxlID09IDApIHsKLQkJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpUGxheSAvLyBjYW4ndCBmaW5kIGZpbGU9JyVzJyAhXG4iLCAKLQkJCQlNQ0lNaWRpRGV2W3dEZXZJRF0ub3BlblBhcm1zLmxwc3RyRWxlbWVudE5hbWUpOworCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaVBsYXkoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CisJaWYgKE1DSU1pZGlEZXZbaW5kZXhdLmhGaWxlID09IDApIHsKKwkJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpUGxheSAvLyBjYW4ndCBmaW5kIGZpbGU9JyUwOGx4JyAhXG4iLCAKKwkJCQlNQ0lNaWRpRGV2W2luZGV4XS5vcGVuUGFybXMubHBzdHJFbGVtZW50TmFtZSk7CiAJCXJldHVybiBNQ0lFUlJfRklMRV9OT1RfRk9VTkQ7CiAJCX0KIAlzdGFydCA9IDE7IAkJZW5kID0gOTk5OTk7CkBAIC00NTEsNDIgKzQ1OSw0MiBAQAogCQkJfQogCQl9CiAjZW5kaWYKLQlscE1pZGlIZHIgPSAmTUNJTWlkaURldlt3RGV2SURdLk1pZGlIZHI7CisJbHBNaWRpSGRyID0gJk1DSU1pZGlEZXZbaW5kZXhdLk1pZGlIZHI7CiAJbHBNaWRpSGRyLT5scERhdGEgPSAoTFBTVFIpIG1hbGxvYygxMjAwKTsKIAlpZiAobHBNaWRpSGRyLT5scERhdGEgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAlscE1pZGlIZHItPmR3QnVmZmVyTGVuZ3RoID0gMTAyNDsKIAlscE1pZGlIZHItPmR3VXNlciA9IDBMOwogCWxwTWlkaUhkci0+ZHdGbGFncyA9IDBMOwotCWR3UmV0ID0gbW9kTWVzc2FnZSgwLCBNT0RNX1BSRVBBUkUsIDAsIChEV09SRClscE1pZGlIZHIsIHNpemVvZihNSURJSERSKSk7CisJZHdSZXQgPSBtb2RNZXNzYWdlKHdEZXZJRCwgTU9ETV9QUkVQQVJFLCAwLCAoRFdPUkQpbHBNaWRpSGRyLCBzaXplb2YoTUlESUhEUikpOwogLyoJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpUGxheSAvLyBhZnRlciBNT0RNX1BSRVBBUkUgXG4iKTsgKi8KLQlNQ0lNaWRpRGV2W3dEZXZJRF0uZHdTdGF0dXMgPSBNQ0lfTU9ERV9QTEFZOwotCXdoaWxlKE1DSU1pZGlEZXZbd0RldklEXS5kd1N0YXR1cyAhPSBNQ0lfTU9ERV9TVE9QKSB7Ci0JCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaVBsYXkgLy8gTUNJTWlkaURldlt3RGV2SURdLmR3U3RhdHVzPSVwICVkXG4iLAotCQkJJk1DSU1pZGlEZXZbd0RldklEXS5kd1N0YXR1cywgTUNJTWlkaURldlt3RGV2SURdLmR3U3RhdHVzKTsKKwlNQ0lNaWRpRGV2W2luZGV4XS5kd1N0YXR1cyA9IE1DSV9NT0RFX1BMQVk7CisJd2hpbGUoTUNJTWlkaURldltpbmRleF0uZHdTdGF0dXMgIT0gTUNJX01PREVfU1RPUCkgeworCQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lQbGF5IC8vIE1DSU1pZGlEZXZbaW5kZXhdLmR3U3RhdHVzPSVwICVkXG4iLAorCQkJJk1DSU1pZGlEZXZbaW5kZXhdLmR3U3RhdHVzLCBNQ0lNaWRpRGV2W2luZGV4XS5kd1N0YXR1cyk7CiAJCXB0ciA9IChMUFdPUkQpbHBNaWRpSGRyLT5scERhdGE7CiAJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IGxwTWlkaUhkci0+ZHdCdWZmZXJMZW5ndGg7IGNvdW50KyspIHsKIAkJCWlmIChNSURJX1JlYWRWYXJ5TGVuKHdEZXZJRCwgJmR3RGF0YSkgIT0gMCkgYnJlYWs7CiAJCQkqcHRyID0gTE9XT1JEKGR3RGF0YSk7CiAJCQl9CiAvKgotCQljb3VudCA9IG1taW9SZWFkKE1DSU1pZGlEZXZbd0RldklEXS5oRmlsZSwgbHBNaWRpSGRyLT5scERhdGEsIGxwTWlkaUhkci0+ZHdCdWZmZXJMZW5ndGgpOworCQljb3VudCA9IG1taW9SZWFkKE1DSU1pZGlEZXZbaW5kZXhdLmhGaWxlLCBscE1pZGlIZHItPmxwRGF0YSwgbHBNaWRpSGRyLT5kd0J1ZmZlckxlbmd0aCk7CiAqLwogCQlpZiAoY291bnQgPCAxKSBicmVhazsKIAkJbHBNaWRpSGRyLT5kd0J5dGVzUmVjb3JkZWQgPSBjb3VudDsKIAkJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpUGxheSAvLyBiZWZvcmUgTU9ETV9MT05HREFUQSBscE1pZGlIZHI9JXAgZHdCeXRlc1JlY29yZGVkPSVsdVxuIiwKIAkJCQkJbHBNaWRpSGRyLCBscE1pZGlIZHItPmR3Qnl0ZXNSZWNvcmRlZCk7Ci0JCWR3UmV0ID0gbW9kTWVzc2FnZSgwLCBNT0RNX0xPTkdEQVRBLCAwLCAoRFdPUkQpbHBNaWRpSGRyLCBzaXplb2YoTUlESUhEUikpOworCQlkd1JldCA9IG1vZE1lc3NhZ2Uod0RldklELCBNT0RNX0xPTkdEQVRBLCAwLCAoRFdPUkQpbHBNaWRpSGRyLCBzaXplb2YoTUlESUhEUikpOwogCQl9Ci0JZHdSZXQgPSBtb2RNZXNzYWdlKDAsIE1PRE1fVU5QUkVQQVJFLCAwLCAoRFdPUkQpbHBNaWRpSGRyLCBzaXplb2YoTUlESUhEUikpOworCWR3UmV0ID0gbW9kTWVzc2FnZSh3RGV2SUQsIE1PRE1fVU5QUkVQQVJFLCAwLCAoRFdPUkQpbHBNaWRpSGRyLCBzaXplb2YoTUlESUhEUikpOwogCWlmIChscE1pZGlIZHItPmxwRGF0YSAhPSBOVUxMKSB7CiAJCWZyZWUobHBNaWRpSGRyLT5scERhdGEpOwogCQlscE1pZGlIZHItPmxwRGF0YSA9IE5VTEw7CiAJCX0KLQlNQ0lNaWRpRGV2W3dEZXZJRF0uZHdTdGF0dXMgPSBNQ0lfTU9ERV9TVE9QOworCU1DSU1pZGlEZXZbaW5kZXhdLmR3U3RhdHVzID0gTUNJX01PREVfU1RPUDsKIAlpZiAoZHdGbGFncyAmIE1DSV9OT1RJRlkpIHsKIAkJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpUGxheSAvLyBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdDYWxsYmFjayk7CiAJCW1jaURyaXZlck5vdGlmeSgoSFdORDE2KUxPV09SRChscFBhcm1zLT5kd0NhbGxiYWNrKSwgCi0JCQlNQ0lNaWRpRGV2W3dEZXZJRF0ud05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOworCQkJTUNJTWlkaURldltpbmRleF0ud05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOwogI2lmIDAKIAkJZXhpdCgxKTsKICNlbmRpZgpAQCAtNTAxLDE3ICs1MDksMTggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lSZWNvcmQJCQlbaW50ZXJuYWxdCiAqLwotc3RhdGljIERXT1JEIE1JRElfbWNpUmVjb3JkKFVJTlQgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9SRUNPUkRfUEFSTVMgbHBQYXJtcykKK3N0YXRpYyBEV09SRCBNSURJX21jaVJlY29yZChVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9SRUNPUkRfUEFSTVMgbHBQYXJtcykKIHsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQorCWludCBpbmRleCA9IE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpOwogCWludAkJCXN0YXJ0LCBlbmQ7CiAJTFBNSURJSERSCWxwTWlkaUhkcjsKIAlEV09SRAkJZHdSZXQ7CiAKLQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lSZWNvcmQoJXUsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwotCWlmIChNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUgPT0gMCkgewotCQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lSZWNvcmQgLy8gY2FuJ3QgZmluZCBmaWxlPSclcycgIVxuIiwgCi0JCQkJTUNJTWlkaURldlt3RGV2SURdLm9wZW5QYXJtcy5scHN0ckVsZW1lbnROYW1lKTsKKwlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lSZWNvcmQoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CisJaWYgKE1DSU1pZGlEZXZbaW5kZXhdLmhGaWxlID09IDApIHsKKwkJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpUmVjb3JkIC8vIGNhbid0IGZpbmQgZmlsZT0nJTA4bHgnICFcbiIsIAorCQkJCU1DSU1pZGlEZXZbaW5kZXhdLm9wZW5QYXJtcy5scHN0ckVsZW1lbnROYW1lKTsKIAkJcmV0dXJuIE1DSUVSUl9GSUxFX05PVF9GT1VORDsKIAkJfQogCXN0YXJ0ID0gMTsgCQllbmQgPSA5OTk5OTsKQEAgLTUyMywzNSArNTMyLDM1IEBACiAJCWVuZCA9IGxwUGFybXMtPmR3VG87CiAJCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaVJlY29yZCAvLyBNQ0lfVE89JWQgXG4iLCBlbmQpOwogCQl9Ci0JbHBNaWRpSGRyID0gJk1DSU1pZGlEZXZbd0RldklEXS5NaWRpSGRyOworCWxwTWlkaUhkciA9ICZNQ0lNaWRpRGV2W2luZGV4XS5NaWRpSGRyOwogCWxwTWlkaUhkci0+bHBEYXRhID0gKExQU1RSKSB4bWFsbG9jKDEyMDApOwogCWxwTWlkaUhkci0+ZHdCdWZmZXJMZW5ndGggPSAxMDI0OwogCWxwTWlkaUhkci0+ZHdVc2VyID0gMEw7CiAJbHBNaWRpSGRyLT5kd0ZsYWdzID0gMEw7Ci0JZHdSZXQgPSBtaWRNZXNzYWdlKDAsIE1JRE1fUFJFUEFSRSwgMCwgKERXT1JEKWxwTWlkaUhkciwgc2l6ZW9mKE1JRElIRFIpKTsKKwlkd1JldCA9IG1pZE1lc3NhZ2Uod0RldklELCBNSURNX1BSRVBBUkUsIDAsIChEV09SRClscE1pZGlIZHIsIHNpemVvZihNSURJSERSKSk7CiAJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpUmVjb3JkIC8vIGFmdGVyIE1JRE1fUFJFUEFSRSBcbiIpOwotCU1DSU1pZGlEZXZbd0RldklEXS5kd1N0YXR1cyA9IE1DSV9NT0RFX1JFQ09SRDsKLQl3aGlsZShNQ0lNaWRpRGV2W3dEZXZJRF0uZHdTdGF0dXMgIT0gTUNJX01PREVfU1RPUCkgewotCQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lSZWNvcmQgLy8gTUNJTWlkaURldlt3RGV2SURdLmR3U3RhdHVzPSVwICVkXG4iLAotCQkJJk1DSU1pZGlEZXZbd0RldklEXS5kd1N0YXR1cywgTUNJTWlkaURldlt3RGV2SURdLmR3U3RhdHVzKTsKKwlNQ0lNaWRpRGV2W2luZGV4XS5kd1N0YXR1cyA9IE1DSV9NT0RFX1JFQ09SRDsKKwl3aGlsZShNQ0lNaWRpRGV2W2luZGV4XS5kd1N0YXR1cyAhPSBNQ0lfTU9ERV9TVE9QKSB7CisJCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaVJlY29yZCAvLyBNQ0lNaWRpRGV2W2luZGV4XS5kd1N0YXR1cz0lcCAlZFxuIiwKKwkJCSZNQ0lNaWRpRGV2W2luZGV4XS5kd1N0YXR1cywgTUNJTWlkaURldltpbmRleF0uZHdTdGF0dXMpOwogCQlscE1pZGlIZHItPmR3Qnl0ZXNSZWNvcmRlZCA9IDA7Ci0JCWR3UmV0ID0gbWlkTWVzc2FnZSgwLCBNSURNX1NUQVJULCAwLCAwTCwgMEwpOworCQlkd1JldCA9IG1pZE1lc3NhZ2Uod0RldklELCBNSURNX1NUQVJULCAwLCAwTCwgMEwpOwogCQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lSZWNvcmQgLy8gYWZ0ZXIgTUlETV9TVEFSVCBscE1pZGlIZHI9JXAgZHdCeXRlc1JlY29yZGVkPSVsdVxuIiwKIAkJCQkJbHBNaWRpSGRyLCBscE1pZGlIZHItPmR3Qnl0ZXNSZWNvcmRlZCk7CiAJCWlmIChscE1pZGlIZHItPmR3Qnl0ZXNSZWNvcmRlZCA9PSAwKSBicmVhazsKIAkJfQogCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaVJlY29yZCAvLyBiZWZvcmUgTUlETV9VTlBSRVBBUkUgXG4iKTsKLQlkd1JldCA9IG1pZE1lc3NhZ2UoMCwgTUlETV9VTlBSRVBBUkUsIDAsIChEV09SRClscE1pZGlIZHIsIHNpemVvZihNSURJSERSKSk7CisJZHdSZXQgPSBtaWRNZXNzYWdlKHdEZXZJRCwgTUlETV9VTlBSRVBBUkUsIDAsIChEV09SRClscE1pZGlIZHIsIHNpemVvZihNSURJSERSKSk7CiAJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpUmVjb3JkIC8vIGFmdGVyIE1JRE1fVU5QUkVQQVJFIFxuIik7CiAJaWYgKGxwTWlkaUhkci0+bHBEYXRhICE9IE5VTEwpIHsKIAkJZnJlZShscE1pZGlIZHItPmxwRGF0YSk7CiAJCWxwTWlkaUhkci0+bHBEYXRhID0gTlVMTDsKIAkJfQotCU1DSU1pZGlEZXZbd0RldklEXS5kd1N0YXR1cyA9IE1DSV9NT0RFX1NUT1A7CisJTUNJTWlkaURldltpbmRleF0uZHdTdGF0dXMgPSBNQ0lfTU9ERV9TVE9QOwogCWlmIChkd0ZsYWdzICYgTUNJX05PVElGWSkgewogCQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lSZWNvcmQgLy8gTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIGxwUGFybXMtPmR3Q2FsbGJhY2spOwogCQltY2lEcml2ZXJOb3RpZnkoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAotCQkJTUNJTWlkaURldlt3RGV2SURdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKKwkJCU1DSU1pZGlEZXZbaW5kZXhdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKIAkJfQogCXJldHVybiAwOwogI2Vsc2UKQEAgLTU2MywxMCArNTcyLDEwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpUGF1c2UJCQlbaW50ZXJuYWxdCiAqLwotc3RhdGljIERXT1JEIE1JRElfbWNpUGF1c2UoVUlOVCB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcykKK3N0YXRpYyBEV09SRCBNSURJX21jaVBhdXNlKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcykKIHsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQotCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaVBhdXNlKCV1LCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKKwlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lQYXVzZSglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCXJldHVybiAwOwogI2Vsc2UKQEAgLTU3OCwxMCArNTg3LDEwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpUmVzdW1lCQkJW2ludGVybmFsXQogKi8KLXN0YXRpYyBEV09SRCBNSURJX21jaVJlc3VtZShVSU5UIHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfR0VORVJJQ19QQVJNUyBscFBhcm1zKQorc3RhdGljIERXT1JEIE1JRElfbWNpUmVzdW1lKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcykKIHsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQotCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaVJlc3VtZSgldSwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CisJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpUmVzdW1lKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJcmV0dXJuIDA7CiAjZWxzZQpAQCAtNTkzLDEwICs2MDIsMTAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lTZXQJCQlbaW50ZXJuYWxdCiAqLwotc3RhdGljIERXT1JEIE1JRElfbWNpU2V0KFVJTlQgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9TRVRfUEFSTVMgbHBQYXJtcykKK3N0YXRpYyBEV09SRCBNSURJX21jaVNldChVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9TRVRfUEFSTVMgbHBQYXJtcykKIHsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQotCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaVNldCgldSwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CisJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpU2V0KCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpU2V0IC8vIGR3VGltZUZvcm1hdD0lMDhsWFxuIiwgbHBQYXJtcy0+ZHdUaW1lRm9ybWF0KTsKIAlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lTZXQgLy8gZHdBdWRpbz0lMDhsWFxuIiwgbHBQYXJtcy0+ZHdBdWRpbyk7CkBAIC02NTksMTAgKzY2OCwxMSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaVN0YXR1cwkJW2ludGVybmFsXQogKi8KLXN0YXRpYyBEV09SRCBNSURJX21jaVN0YXR1cyhVSU5UIHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfU1RBVFVTX1BBUk1TIGxwUGFybXMpCitzdGF0aWMgRFdPUkQgTUlESV9tY2lTdGF0dXMoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfU1RBVFVTX1BBUk1TIGxwUGFybXMpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lTdGF0dXMoJXUsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOworCWludCBpbmRleCA9IE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpOworCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaVN0YXR1cyglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCWlmIChkd0ZsYWdzICYgTUNJX1NUQVRVU19JVEVNKSB7CiAJCXN3aXRjaChscFBhcm1zLT5kd0l0ZW0pIHsKQEAgLTczNiw3ICs3NDYsNyBAQAogCWlmIChkd0ZsYWdzICYgTUNJX05PVElGWSkgewogCQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lTdGF0dXMgLy8gTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIGxwUGFybXMtPmR3Q2FsbGJhY2spOwogCQltY2lEcml2ZXJOb3RpZnkoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAotCQkJTUNJTWlkaURldlt3RGV2SURdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKKwkJCU1DSU1pZGlEZXZbaW5kZXhdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKIAkJfQogIAlyZXR1cm4gMDsKICNlbHNlCkBAIC03NDcsMTEgKzc1NywxMSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaUdldERldkNhcHMJCVtpbnRlcm5hbF0KICovCi1zdGF0aWMgRFdPUkQgTUlESV9tY2lHZXREZXZDYXBzKFVJTlQgd0RldklELCBEV09SRCBkd0ZsYWdzLCAKK3N0YXRpYyBEV09SRCBNSURJX21jaUdldERldkNhcHMoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgCiAJCQkJCUxQTUNJX0dFVERFVkNBUFNfUEFSTVMgbHBQYXJtcykKIHsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQotCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaUdldERldkNhcHMoJXUsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOworCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaUdldERldkNhcHMoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAlpZiAoZHdGbGFncyAmIE1DSV9HRVRERVZDQVBTX0lURU0pIHsKIAkJc3dpdGNoKGxwUGFybXMtPmR3SXRlbSkgewpAQCAtNzk1LDEwICs4MDUsMTAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lJbmZvCQkJW2ludGVybmFsXQogKi8KLXN0YXRpYyBEV09SRCBNSURJX21jaUluZm8oVUlOVCB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0lORk9fUEFSTVMgbHBQYXJtcykKK3N0YXRpYyBEV09SRCBNSURJX21jaUluZm8oVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfSU5GT19QQVJNUyBscFBhcm1zKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCi0JZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpSW5mbygldSwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CisJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpSW5mbyglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCWxwUGFybXMtPmxwc3RyUmV0dXJuID0gTlVMTDsKIAlzd2l0Y2goZHdGbGFncykgewpAQCAtODMwLDcgKzg0MCw3IEBACiAqLwogc3RhdGljIERXT1JEIG1pZEdldERldkNhcHMoV09SRCB3RGV2SUQsIExQTUlESUlOQ0FQUyBscENhcHMsIERXT1JEIGR3U2l6ZSkKIHsKLQlkcHJpbnRmX21pZGkoc3RkZGViLCAibWlkR2V0RGV2Q2FwcygldSwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBDYXBzLCBkd1NpemUpOworCWRwcmludGZfbWlkaShzdGRkZWIsICJtaWRHZXREZXZDYXBzKCUwNFgsICVwLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGxwQ2FwcywgZHdTaXplKTsKIAlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIH0KIApAQCAtODQwLDI1ICs4NTAsMjYgQEAKIHN0YXRpYyBEV09SRCBtaWRPcGVuKFdPUkQgd0RldklELCBMUE1JRElPUEVOREVTQyBscERlc2MsIERXT1JEIGR3RmxhZ3MpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKKwlpbnQgaW5kZXggPSBNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKTsKIAlpbnQJCW1pZGk7CiAJZHByaW50Zl9taWRpKHN0ZGRlYiwKLQkJIm1pZE9wZW4oJXUsICVwLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGxwRGVzYywgZHdGbGFncyk7CisJCSJtaWRPcGVuKCUwNFgsICVwLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGxwRGVzYywgZHdGbGFncyk7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSB7CiAJCWRwcmludGZfbWlkaShzdGRkZWIsIkxpbnV4ICdtaWRPcGVuJyAvLyBJbnZhbGlkIFBhcmFtZXRlciAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07CiAJCX0KLQlpZiAod0RldklEID49IE1BWF9NSURJSU5EUlYpIHsKKwlpZiAoaW5kZXggPj0gTUFYX01JRElJTkRSVikgewogCQlkcHJpbnRmX21pZGkoc3RkZGViLCJMaW51eCAnbWlkT3BlbicgLy8gTUFYX01JRElJTkRSViByZWFjaGVkICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfQUxMT0NBVEVEOwogCQl9Ci0JTWlkaUluRGV2W3dEZXZJRF0udW5peGRldiA9IDA7CisJTWlkaUluRGV2W2luZGV4XS51bml4ZGV2ID0gMDsKIAltaWRpID0gb3BlbiAoTUlESV9ERVYsIE9fUkRPTkxZLCAwKTsKIAlpZiAobWlkaSA9PSAtMSkgewogCQlkcHJpbnRmX21pZGkoc3RkZGViLCJMaW51eCAnbWlkT3BlbicgLy8gY2FuJ3Qgb3BlbiAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJCX0KLQlNaWRpSW5EZXZbd0RldklEXS53RmxhZ3MgPSBISVdPUkQoZHdGbGFncyAmIENBTExCQUNLX1RZUEVNQVNLKTsKLQlzd2l0Y2goTWlkaUluRGV2W3dEZXZJRF0ud0ZsYWdzKSB7CisJTWlkaUluRGV2W2luZGV4XS53RmxhZ3MgPSBISVdPUkQoZHdGbGFncyAmIENBTExCQUNLX1RZUEVNQVNLKTsKKwlzd2l0Y2goTWlkaUluRGV2W2luZGV4XS53RmxhZ3MpIHsKIAkJY2FzZSBEQ0JfTlVMTDoKIAkJCWRwcmludGZfbWlkaShzdGRkZWIsIkxpbnV4ICdtaWRPcGVuJyAvLyBDQUxMQkFDS19OVUxMICFcbiIpOwogCQkJYnJlYWs7CkBAIC04NzUsMTAgKzg4NiwxMCBAQAogCQkJCSAgICJMaW51eCAnbWlkT3BlbicgLy8gQ0FMTEJBQ0tfRlVOQ1RJT04gIVxuIik7CiAJCQlicmVhazsKIAkJfQotCU1pZGlJbkRldlt3RGV2SURdLmxwUXVldWVIZHIgPSBOVUxMOwotCU1pZGlJbkRldlt3RGV2SURdLnVuaXhkZXYgPSBtaWRpOwotCU1pZGlJbkRldlt3RGV2SURdLmR3VG90YWxQbGF5ZWQgPSAwOwotCU1pZGlJbkRldlt3RGV2SURdLmJ1ZnNpemUgPSAweDNGRkY7CisJTWlkaUluRGV2W2luZGV4XS5scFF1ZXVlSGRyID0gTlVMTDsKKwlNaWRpSW5EZXZbaW5kZXhdLnVuaXhkZXYgPSBtaWRpOworCU1pZGlJbkRldltpbmRleF0uZHdUb3RhbFBsYXllZCA9IDA7CisJTWlkaUluRGV2W2luZGV4XS5idWZzaXplID0gMHgzRkZGOwogCWlmIChNSURJX05vdGlmeUNsaWVudCh3RGV2SUQsIE1JTV9PUEVOLCAwTCwgMEwpICE9IE1NU1lTRVJSX05PRVJST1IpIHsKIAkJZHByaW50Zl9taWRpKHN0ZGRlYiwiTGludXggJ21pZE9wZW4nIC8vIGNhbid0IG5vdGlmeSBjbGllbnQgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOwpAQCAtODk1LDE0ICs5MDYsMTUgQEAKIHN0YXRpYyBEV09SRCBtaWRDbG9zZShXT1JEIHdEZXZJRCkKIHsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQotCWRwcmludGZfbWlkaShzdGRkZWIsICJtaWRDbG9zZSgldSk7XG4iLCB3RGV2SUQpOwotCWlmIChNaWRpSW5EZXZbd0RldklEXS51bml4ZGV2ID09IDApIHsKKwlpbnQgaW5kZXggPSBNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKTsKKwlkcHJpbnRmX21pZGkoc3RkZGViLCAibWlkQ2xvc2UoJTA0WCk7XG4iLCB3RGV2SUQpOworCWlmIChNaWRpSW5EZXZbaW5kZXhdLnVuaXhkZXYgPT0gMCkgewogCQlkcHJpbnRmX21pZGkoc3RkZGViLCJMaW51eCAnbWlkQ2xvc2UnIC8vIGNhbid0IGNsb3NlICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAkJfQotCWNsb3NlKE1pZGlJbkRldlt3RGV2SURdLnVuaXhkZXYpOwotCU1pZGlJbkRldlt3RGV2SURdLnVuaXhkZXYgPSAwOwotCU1pZGlJbkRldlt3RGV2SURdLmJ1ZnNpemUgPSAwOworCWNsb3NlKE1pZGlJbkRldltpbmRleF0udW5peGRldik7CisJTWlkaUluRGV2W2luZGV4XS51bml4ZGV2ID0gMDsKKwlNaWRpSW5EZXZbaW5kZXhdLmJ1ZnNpemUgPSAwOwogCWlmIChNSURJX05vdGlmeUNsaWVudCh3RGV2SUQsIE1JTV9DTE9TRSwgMEwsIDBMKSAhPSBNTVNZU0VSUl9OT0VSUk9SKSB7CiAJCWRwcmludGZfbWlkaShzdGRkZWIsIkxpbnV4ICdtaWRDbG9zZScgLy8gY2FuJ3Qgbm90aWZ5IGNsaWVudCAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07CkBAIC05MTgsNyArOTMwLDcgQEAKICovCiBzdGF0aWMgRFdPUkQgbWlkQWRkQnVmZmVyKFdPUkQgd0RldklELCBMUE1JRElIRFIgbHBNaWRpSGRyLCBEV09SRCBkd1NpemUpCiB7Ci0JZHByaW50Zl9taWRpKHN0ZGRlYiwgIm1pZEFkZEJ1ZmZlcigldSwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBNaWRpSGRyLCBkd1NpemUpOworCWRwcmludGZfbWlkaShzdGRkZWIsICJtaWRBZGRCdWZmZXIoJTA0WCwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBNaWRpSGRyLCBkd1NpemUpOwogCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogfQogCkBAIC05MjcsNyArOTM5LDcgQEAKICovCiBzdGF0aWMgRFdPUkQgbWlkUHJlcGFyZShXT1JEIHdEZXZJRCwgTFBNSURJSERSIGxwTWlkaUhkciwgRFdPUkQgZHdTaXplKQogewotCWRwcmludGZfbWlkaShzdGRkZWIsICJtaWRQcmVwYXJlKCV1LCAlcCwgJTA4bFgpO1xuIiwgd0RldklELCBscE1pZGlIZHIsIGR3U2l6ZSk7CisJZHByaW50Zl9taWRpKHN0ZGRlYiwgIm1pZFByZXBhcmUoJTA0WCwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBNaWRpSGRyLCBkd1NpemUpOwogCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogfQogCkBAIC05MzYsNyArOTQ4LDcgQEAKICovCiBzdGF0aWMgRFdPUkQgbWlkVW5wcmVwYXJlKFdPUkQgd0RldklELCBMUE1JRElIRFIgbHBNaWRpSGRyLCBEV09SRCBkd1NpemUpCiB7Ci0JZHByaW50Zl9taWRpKHN0ZGRlYiwgIm1pZFVucHJlcGFyZSgldSwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBNaWRpSGRyLCBkd1NpemUpOworCWRwcmludGZfbWlkaShzdGRkZWIsICJtaWRVbnByZXBhcmUoJTA0WCwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBNaWRpSGRyLCBkd1NpemUpOwogCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogfQogCkBAIC05NDUsNyArOTU3LDcgQEAKICovCiBzdGF0aWMgRFdPUkQgbWlkUmVzZXQoV09SRCB3RGV2SUQpCiB7Ci0JZHByaW50Zl9taWRpKHN0ZGRlYiwgIm1pZFJlc2V0KCV1KTtcbiIsIHdEZXZJRCk7CisJZHByaW50Zl9taWRpKHN0ZGRlYiwgIm1pZFJlc2V0KCUwNFgpO1xuIiwgd0RldklEKTsKIAlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIH0KIApAQCAtOTU1LDcgKzk2Nyw3IEBACiAqLwogc3RhdGljIERXT1JEIG1pZFN0YXJ0KFdPUkQgd0RldklEKQogewotCWRwcmludGZfbWlkaShzdGRkZWIsICJtaWRTdGFydCgldSk7XG4iLCB3RGV2SUQpOworCWRwcmludGZfbWlkaShzdGRkZWIsICJtaWRTdGFydCglMDRYKTtcbiIsIHdEZXZJRCk7CiAJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiB9CiAKQEAgLTk2NSw3ICs5NzcsNyBAQAogKi8KIHN0YXRpYyBEV09SRCBtaWRTdG9wKFdPUkQgd0RldklEKQogewotCWRwcmludGZfbWlkaShzdGRkZWIsICJtaWRTdG9wKCV1KTtcbiIsIHdEZXZJRCk7CisJZHByaW50Zl9taWRpKHN0ZGRlYiwgIm1pZFN0b3AoJTA0WCk7XG4iLCB3RGV2SUQpOwogCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogfQogCkBAIC05NzYsNyArOTg4LDcgQEAKIERXT1JEIG1pZE1lc3NhZ2UoV09SRCB3RGV2SUQsIFdPUkQgd01zZywgRFdPUkQgZHdVc2VyLCAKIAkJCQkJRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yKQogewotCWRwcmludGZfbWlkaShzdGRkZWIsICJtaWRNZXNzYWdlKCV1LCAlMDRYLCAlMDhsWCwgJTA4bFgsICUwOGxYKTtcbiIsIAorCWRwcmludGZfbWlkaShzdGRkZWIsICJtaWRNZXNzYWdlKCUwNFgsICUwNFgsICUwOGxYLCAlMDhsWCwgJTA4bFgpO1xuIiwgCiAJCQl3RGV2SUQsIHdNc2csIGR3VXNlciwgZHdQYXJhbTEsIGR3UGFyYW0yKTsKIAlzd2l0Y2god01zZykgewogCQljYXNlIE1JRE1fT1BFTjoKQEAgLTEwMTMsNyArMTAyNSw3IEBACiAqLwogc3RhdGljIERXT1JEIG1vZEdldERldkNhcHMoV09SRCB3RGV2SUQsIExQTUlESU9VVENBUFMgbHBDYXBzLCBEV09SRCBkd1NpemUpCiB7Ci0JZHByaW50Zl9taWRpKHN0ZGRlYiwgIm1vZEdldERldkNhcHMoJXUsICVwLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGxwQ2FwcywgZHdTaXplKTsKKwlkcHJpbnRmX21pZGkoc3RkZGViLCAibW9kR2V0RGV2Q2FwcyglMDRYLCAlcCwgJTA4bFgpO1xuIiwgd0RldklELCBscENhcHMsIGR3U2l6ZSk7CiAJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiB9CiAKQEAgLTEwMjQsMjUgKzEwMzYsMjYgQEAKIHN0YXRpYyBEV09SRCBtb2RPcGVuKFdPUkQgd0RldklELCBMUE1JRElPUEVOREVTQyBscERlc2MsIERXT1JEIGR3RmxhZ3MpCiB7CQkJCQkJCQkgCiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKKwlpbnQgaW5kZXggPSBNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKTsKIAlpbnQJCW1pZGk7CiAJZHByaW50Zl9taWRpKHN0ZGRlYiwKLQkJIm1vZE9wZW4oJXUsICVwLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGxwRGVzYywgZHdGbGFncyk7CisJCSJtb2RPcGVuKCUwNFgsICVwLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGxwRGVzYywgZHdGbGFncyk7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSB7CiAJCWRwcmludGZfbWlkaShzdGRkZWIsIkxpbnV4ICdtb2RPcGVuJyAvLyBJbnZhbGlkIFBhcmFtZXRlciAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07CiAJCX0KLQlpZiAod0RldklEID49IE1BWF9NSURJT1VURFJWKSB7CisJaWYgKGluZGV4ID49IE1BWF9NSURJT1VURFJWKSB7CiAJCWRwcmludGZfbWlkaShzdGRkZWIsIkxpbnV4ICdtb2RPcGVuJyAvLyBNQVhfTUlESU9VVERSViByZWFjaGVkICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfQUxMT0NBVEVEOwogCQl9Ci0JTWlkaU91dERldlt3RGV2SURdLnVuaXhkZXYgPSAwOworCU1pZGlPdXREZXZbaW5kZXhdLnVuaXhkZXYgPSAwOwogCW1pZGkgPSBvcGVuIChNSURJX0RFViwgT19XUk9OTFksIDApOwogCWlmIChtaWRpID09IC0xKSB7CiAJCWRwcmludGZfbWlkaShzdGRkZWIsIkxpbnV4ICdtb2RPcGVuJyAvLyBjYW4ndCBvcGVuICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAkJfQotCU1pZGlPdXREZXZbd0RldklEXS53RmxhZ3MgPSBISVdPUkQoZHdGbGFncyAmIENBTExCQUNLX1RZUEVNQVNLKTsKLQlzd2l0Y2goTWlkaU91dERldlt3RGV2SURdLndGbGFncykgeworCU1pZGlPdXREZXZbaW5kZXhdLndGbGFncyA9IEhJV09SRChkd0ZsYWdzICYgQ0FMTEJBQ0tfVFlQRU1BU0spOworCXN3aXRjaChNaWRpT3V0RGV2W2luZGV4XS53RmxhZ3MpIHsKIAkJY2FzZSBEQ0JfTlVMTDoKIAkJCWRwcmludGZfbWlkaShzdGRkZWIsIkxpbnV4ICdtb2RPcGVuJyAvLyBDQUxMQkFDS19OVUxMICFcbiIpOwogCQkJYnJlYWs7CkBAIC0xMDU5LDEwICsxMDcyLDEwIEBACiAJCQkJIkxpbnV4ICdtb2RPcGVuJyAvLyBDQUxMQkFDS19GVU5DVElPTiAhXG4iKTsKIAkJCWJyZWFrOwogCQl9Ci0JTWlkaU91dERldlt3RGV2SURdLmxwUXVldWVIZHIgPSBOVUxMOwotCU1pZGlPdXREZXZbd0RldklEXS51bml4ZGV2ID0gbWlkaTsKLQlNaWRpT3V0RGV2W3dEZXZJRF0uZHdUb3RhbFBsYXllZCA9IDA7Ci0JTWlkaU91dERldlt3RGV2SURdLmJ1ZnNpemUgPSAweDNGRkY7CisJTWlkaU91dERldltpbmRleF0ubHBRdWV1ZUhkciA9IE5VTEw7CisJTWlkaU91dERldltpbmRleF0udW5peGRldiA9IG1pZGk7CisJTWlkaU91dERldltpbmRleF0uZHdUb3RhbFBsYXllZCA9IDA7CisJTWlkaU91dERldltpbmRleF0uYnVmc2l6ZSA9IDB4M0ZGRjsKIAlpZiAoTUlESV9Ob3RpZnlDbGllbnQod0RldklELCBNT01fT1BFTiwgMEwsIDBMKSAhPSBNTVNZU0VSUl9OT0VSUk9SKSB7CiAJCWRwcmludGZfbWlkaShzdGRkZWIsIkxpbnV4ICdtb2RPcGVuJyAvLyBjYW4ndCBub3RpZnkgY2xpZW50ICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKQEAgLTEwODIsMTQgKzEwOTUsMTUgQEAKIHN0YXRpYyBEV09SRCBtb2RDbG9zZShXT1JEIHdEZXZJRCkKIHsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQotCWRwcmludGZfbWlkaShzdGRkZWIsICJtb2RDbG9zZSgldSk7XG4iLCB3RGV2SUQpOwotCWlmIChNaWRpT3V0RGV2W3dEZXZJRF0udW5peGRldiA9PSAwKSB7CisJaW50IGluZGV4ID0gTU1TWVNURU1fRGV2SURUb0luZGV4KHdEZXZJRCk7CisJZHByaW50Zl9taWRpKHN0ZGRlYiwgIm1vZENsb3NlKCUwNFgpO1xuIiwgd0RldklEKTsKKwlpZiAoTWlkaU91dERldltpbmRleF0udW5peGRldiA9PSAwKSB7CiAJCWRwcmludGZfbWlkaShzdGRkZWIsIkxpbnV4ICdtb2RDbG9zZScgLy8gY2FuJ3QgY2xvc2UgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCQl9Ci0JY2xvc2UoTWlkaU91dERldlt3RGV2SURdLnVuaXhkZXYpOwotCU1pZGlPdXREZXZbd0RldklEXS51bml4ZGV2ID0gMDsKLQlNaWRpT3V0RGV2W3dEZXZJRF0uYnVmc2l6ZSA9IDA7CisJY2xvc2UoTWlkaU91dERldltpbmRleF0udW5peGRldik7CisJTWlkaU91dERldltpbmRleF0udW5peGRldiA9IDA7CisJTWlkaU91dERldltpbmRleF0uYnVmc2l6ZSA9IDA7CiAJaWYgKE1JRElfTm90aWZ5Q2xpZW50KHdEZXZJRCwgTU9NX0NMT1NFLCAwTCwgMEwpICE9IE1NU1lTRVJSX05PRVJST1IpIHsKIAkJZHByaW50Zl9taWRpKHN0ZGRlYiwiTGludXggJ21vZENsb3NlJyAvLyBjYW4ndCBub3RpZnkgY2xpZW50ICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKQEAgLTExMDYsMTUgKzExMjAsMTYgQEAKIHN0YXRpYyBEV09SRCBtb2REYXRhKFdPUkQgd0RldklELCBEV09SRCBkd1BhcmFtKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCisJaW50IGluZGV4ID0gTU1TWVNURU1fRGV2SURUb0luZGV4KHdEZXZJRCk7CiAJV09SRAlldmVudDsKIAlkcHJpbnRmX21pZGkoc3RkZGViLAkKLQkJIm1vZERhdGEoJXUsICUwOGxYKTtcbiIsIHdEZXZJRCwgZHdQYXJhbSk7Ci0JaWYgKE1pZGlPdXREZXZbd0RldklEXS51bml4ZGV2ID09IDApIHsKKwkJIm1vZERhdGEoJTA0WCwgJTA4bFgpO1xuIiwgd0RldklELCBkd1BhcmFtKTsKKwlpZiAoTWlkaU91dERldltpbmRleF0udW5peGRldiA9PSAwKSB7CiAgICAgICAgIGRwcmludGZfbWlkaShzdGRkZWIsIkxpbnV4ICdtb2REYXRhJyAvLyBjYW4ndCBwbGF5ICFcbiIpOwogCQlyZXR1cm4gTUlESUVSUl9OT0RFVklDRTsKIAkJfQogCWV2ZW50ID0gTE9XT1JEKGR3UGFyYW0pOwotCWlmICh3cml0ZSAoTWlkaU91dERldlt3RGV2SURdLnVuaXhkZXYsIAorCWlmICh3cml0ZSAoTWlkaU91dERldltpbmRleF0udW5peGRldiwgCiAJCSZldmVudCwgc2l6ZW9mKFdPUkQpKSAhPSBzaXplb2YoV09SRCkpIHsKIAkJZHByaW50Zl9taWRpKHN0ZGRlYiwKIAkJCSJtb2REYXRhKCkgLy8gZXJyb3Igd3JpdHRpbmcgdW5peGRldiAhXG4iKTsKQEAgLTExMzEsMTIgKzExNDYsMTIgQEAKIHN0YXRpYyBEV09SRCBtb2RMb25nRGF0YShXT1JEIHdEZXZJRCwgTFBNSURJSERSIGxwTWlkaUhkciwgRFdPUkQgZHdTaXplKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCisJaW50IGluZGV4ID0gTU1TWVNURU1fRGV2SURUb0luZGV4KHdEZXZJRCk7CiAJaW50CQljb3VudDsKIAlMUFdPUkQJcHRyOwogCWRwcmludGZfbWlkaShzdGRkZWIsCQotCQkibW9kTG9uZ0RhdGEoJXUsICVwLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGxwTWlkaUhkciwgZHdTaXplKTsKLQlkcHJpbnRmX21pZGkoc3RkZGViLCAibW9kTG9uZ0RhdGEoJXUsICVwLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGxwTWlkaUhkciwgZHdTaXplKTsKLQlpZiAoTWlkaU91dERldlt3RGV2SURdLnVuaXhkZXYgPT0gMCkgeworCQkibW9kTG9uZ0RhdGEoJTA0WCwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBNaWRpSGRyLCBkd1NpemUpOworCWlmIChNaWRpT3V0RGV2W2luZGV4XS51bml4ZGV2ID09IDApIHsKICAgICAgICAgZHByaW50Zl9taWRpKHN0ZGRlYiwiTGludXggJ21vZExvbmdEYXRhJyAvLyBjYW4ndCBwbGF5ICFcbiIpOwogCQlyZXR1cm4gTUlESUVSUl9OT0RFVklDRTsKIAkJfQpAQCAtMTE0OCwxOSArMTE2MywxOSBAQAogCWRwcmludGZfbWlkaShzdGRkZWIsCiAJCSJtb2RMb25nRGF0YSgpIC8vIGR3Qnl0ZXNSZWNvcmRlZCAlbHUgIVxuIiwgbHBNaWRpSGRyLT5kd0J5dGVzUmVjb3JkZWQpOwogLyoKLQljb3VudCA9IHdyaXRlIChNaWRpT3V0RGV2W3dEZXZJRF0udW5peGRldiwgCisJY291bnQgPSB3cml0ZSAoTWlkaU91dERldltpbmRleF0udW5peGRldiwgCiAJCWxwTWlkaUhkci0+bHBEYXRhLCBscE1pZGlIZHItPmR3Qnl0ZXNSZWNvcmRlZCk7CiAqLwogCXB0ciA9IChMUFdPUkQpbHBNaWRpSGRyLT5scERhdGE7CiAJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgbHBNaWRpSGRyLT5kd0J5dGVzUmVjb3JkZWQ7IGNvdW50KyspIHsKLQkJaWYgKHdyaXRlIChNaWRpT3V0RGV2W3dEZXZJRF0udW5peGRldiwgcHRyLCAKKwkJaWYgKHdyaXRlIChNaWRpT3V0RGV2W2luZGV4XS51bml4ZGV2LCBwdHIsIAogCQkJc2l6ZW9mKFdPUkQpKSAhPSBzaXplb2YoV09SRCkpIGJyZWFrOwogCQlwdHIrKzsKIAkJfQogCWlmIChjb3VudCAhPSBscE1pZGlIZHItPmR3Qnl0ZXNSZWNvcmRlZCkgewogCQlkcHJpbnRmX21pZGkoc3RkZGViLAogCQkJIm1vZExvbmdEYXRhKCkgLy8gZXJyb3Igd3JpdHRpbmcgdW5peGRldiAjJWQgISAoJWQgIT0gJWxkKVxuIiwKLQkJCU1pZGlPdXREZXZbd0RldklEXS51bml4ZGV2LCBjb3VudCwgbHBNaWRpSGRyLT5kd0J5dGVzUmVjb3JkZWQpOworCQkJTWlkaU91dERldltpbmRleF0udW5peGRldiwgY291bnQsIGxwTWlkaUhkci0+ZHdCeXRlc1JlY29yZGVkKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJCX0KIAlscE1pZGlIZHItPmR3RmxhZ3MgJj0gfk1IRFJfSU5RVUVVRTsKQEAgLTExODEsMTggKzExOTYsMTkgQEAKIHN0YXRpYyBEV09SRCBtb2RQcmVwYXJlKFdPUkQgd0RldklELCBMUE1JRElIRFIgbHBNaWRpSGRyLCBEV09SRCBkd1NpemUpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKKwlpbnQgaW5kZXggPSBNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKTsKIAlkcHJpbnRmX21pZGkoc3RkZGViLAotCQkgICJtb2RQcmVwYXJlKCV1LCAlcCwgJTA4bFgpO1xuIiwgd0RldklELCBscE1pZGlIZHIsIGR3U2l6ZSk7Ci0JaWYgKE1pZGlPdXREZXZbd0RldklEXS51bml4ZGV2ID09IDApIHsKKwkJICAibW9kUHJlcGFyZSglMDRYLCAlcCwgJTA4bFgpO1xuIiwgd0RldklELCBscE1pZGlIZHIsIGR3U2l6ZSk7CisJaWYgKE1pZGlPdXREZXZbaW5kZXhdLnVuaXhkZXYgPT0gMCkgewogCQlkcHJpbnRmX21pZGkoc3RkZGViLCJMaW51eCAnbW9kUHJlcGFyZScgLy8gY2FuJ3QgcHJlcGFyZSAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJCX0KLQlpZiAoTWlkaU91dERldlt3RGV2SURdLmxwUXVldWVIZHIgIT0gTlVMTCkgeworCWlmIChNaWRpT3V0RGV2W2luZGV4XS5scFF1ZXVlSGRyICE9IE5VTEwpIHsKIAkJZHByaW50Zl9taWRpKHN0ZGRlYiwiTGludXggJ21vZFByZXBhcmUnIC8vIGFscmVhZHkgcHJlcGFyZSAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJCX0KLQlNaWRpT3V0RGV2W3dEZXZJRF0uZHdUb3RhbFBsYXllZCA9IDA7Ci0JTWlkaU91dERldlt3RGV2SURdLmxwUXVldWVIZHIgPSBscE1pZGlIZHI7CisJTWlkaU91dERldltpbmRleF0uZHdUb3RhbFBsYXllZCA9IDA7CisJTWlkaU91dERldltpbmRleF0ubHBRdWV1ZUhkciA9IGxwTWlkaUhkcjsKIAlpZiAobHBNaWRpSGRyLT5kd0ZsYWdzICYgTUhEUl9JTlFVRVVFKSByZXR1cm4gTUlESUVSUl9TVElMTFBMQVlJTkc7CiAJbHBNaWRpSGRyLT5kd0ZsYWdzIHw9IE1IRFJfUFJFUEFSRUQ7CiAJbHBNaWRpSGRyLT5kd0ZsYWdzICY9IH5NSERSX0RPTkU7CkBAIC0xMjA4LDkgKzEyMjQsMTAgQEAKIHN0YXRpYyBEV09SRCBtb2RVbnByZXBhcmUoV09SRCB3RGV2SUQsIExQTUlESUhEUiBscE1pZGlIZHIsIERXT1JEIGR3U2l6ZSkKIHsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQorCWludCBpbmRleCA9IE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpOwogCWRwcmludGZfbWlkaShzdGRkZWIsCi0JCSJtb2RVbnByZXBhcmUoJXUsICVwLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGxwTWlkaUhkciwgZHdTaXplKTsKLQlpZiAoTWlkaU91dERldlt3RGV2SURdLnVuaXhkZXYgPT0gMCkgeworCQkibW9kVW5wcmVwYXJlKCUwNFgsICVwLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGxwTWlkaUhkciwgZHdTaXplKTsKKwlpZiAoTWlkaU91dERldltpbmRleF0udW5peGRldiA9PSAwKSB7CiAJCWRwcmludGZfbWlkaShzdGRkZWIsIkxpbnV4ICdtb2RVbnByZXBhcmUnIC8vIGNhbid0IHVucHJlcGFyZSAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJCX0KQEAgLTEyMjUsNyArMTI0Miw3IEBACiAqLwogc3RhdGljIERXT1JEIG1vZFJlc2V0KFdPUkQgd0RldklEKQogewotCWRwcmludGZfbWlkaShzdGRkZWIsICJtb2RSZXNldCgldSk7XG4iLCB3RGV2SUQpOworCWRwcmludGZfbWlkaShzdGRkZWIsICJtb2RSZXNldCglMDRYKTtcbiIsIHdEZXZJRCk7CiAJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiB9CiAKQEAgLTEyMzYsNyArMTI1Myw3IEBACiBEV09SRCBtb2RNZXNzYWdlKFdPUkQgd0RldklELCBXT1JEIHdNc2csIERXT1JEIGR3VXNlciwgCiAJCQkJCURXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMikKIHsKLQlkcHJpbnRmX21pZGkoc3RkZGViLCAibW9kTWVzc2FnZSgldSwgJTA0WCwgJTA4bFgsICUwOGxYLCAlMDhsWCk7XG4iLCAKKwlkcHJpbnRmX21pZGkoc3RkZGViLCAibW9kTWVzc2FnZSglMDRYLCAlMDRYLCAlMDhsWCwgJTA4bFgsICUwOGxYKTtcbiIsIAogCQkJd0RldklELCB3TXNnLCBkd1VzZXIsIGR3UGFyYW0xLCBkd1BhcmFtMik7CiAJc3dpdGNoKHdNc2cpIHsKIAkJY2FzZSBNT0RNX09QRU46CkBAIC0xMzMwLDUgKzEzNDcsMyBAQAogCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jZW5kaWYgLyogI2lmZGVmIEJVSUxUSU5fTU1TWVNURU0gKi8KZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvbW1hdXguYyBiL211bHRpbWVkaWEvbW1hdXguYwppbmRleCBlMzI1ZmQxLi40NzBjNzhkIDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL21tYXV4LmMKKysrIGIvbXVsdGltZWRpYS9tbWF1eC5jCkBAIC00LDEyICs0LDYgQEAKICAqIENvcHlyaWdodCAxOTk0IE1hcnRpbiBBeW90dGUKICAqLwogCi0jaWZuZGVmIFdJTkVMSUIKLSNkZWZpbmUgQlVJTFRJTl9NTVNZU1RFTQotI2VuZGlmIAotCi0jaWZkZWYgQlVJTFRJTl9NTVNZU1RFTQotCiAjZGVmaW5lIEVNVUxBVEVfU0IxNgogCiAjaW5jbHVkZSA8c3RkaW8uaD4KQEAgLTI2LDYgKzIwLDggQEAKICNpbmNsdWRlIDxsaW51eC9zb3VuZGNhcmQuaD4KICNlbmRpZgogCitpbnQgTU1TWVNURU1fRGV2SURUb0luZGV4KFVJTlQxNik7CisKICNkZWZpbmUgU09VTkRfREVWICIvZGV2L2RzcCIKICNkZWZpbmUgTUlYRVJfREVWICIvZGV2L21peGVyIgogCkBAIC00OSw3ICs0NSw3IEBACiAjaWZkZWYgbGludXgKIAlpbnQgCW1peGVyOwogCWludAkJdm9sdW1lOwotCXByaW50ZigiQVVYX0dldERldkNhcHMoJXUsICVwLCAlbHUpO1xuIiwgd0RldklELCBscENhcHMsIGR3U2l6ZSk7CisJcHJpbnRmKCJBVVhfR2V0RGV2Q2FwcyglMDRYLCAlcCwgJWx1KTtcbiIsIHdEZXZJRCwgbHBDYXBzLCBkd1NpemUpOwogCWlmIChscENhcHMgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJaWYgKChtaXhlciA9IG9wZW4oTUlYRVJfREVWLCBPX1JEV1IpKSA8IDApIHsKIAkJcHJpbnRmKCJBVVhfR2V0RGV2Q2FwcyAvLyBtaXhlciBkZXZpY2Ugbm90IGF2YWlsYWJsZSAhXG4iKTsKQEAgLTY1LDcgKzYxLDcgQEAKIAlscENhcHMtPndNaWQgPSAweDAwMDI7CiAJbHBDYXBzLT52RHJpdmVyVmVyc2lvbiA9IDB4MDIwMDsKIAlscENhcHMtPmR3U3VwcG9ydCA9IEFVWENBUFNfVk9MVU1FIHwgQVVYQ0FQU19MUlZPTFVNRTsKLQlzd2l0Y2ggKHdEZXZJRCkgeworCXN3aXRjaCAoTU1TWVNURU1fRGV2SURUb0luZGV4KHdEZXZJRCkpIHsKIAkJY2FzZSAwOgogCQkJbHBDYXBzLT53UGlkID0gMHgwMTk2OwogCQkJc3RyY3B5KGxwQ2Fwcy0+c3pQbmFtZSwgIlNCMTYgQXV4OiBXYXZlIik7CkBAIC0xMjEsMTMgKzExNywxMyBAQAogCWludCAJbWl4ZXI7CiAJaW50CQl2b2x1bWUsIGxlZnQsIHJpZ2h0OwogCWludAkJY21kOwotCXByaW50ZigiQVVYX0dldFZvbHVtZSgldSwgJXApO1xuIiwgd0RldklELCBscGR3Vm9sKTsKKwlwcmludGYoIkFVWF9HZXRWb2x1bWUoJTA0WCwgJXApO1xuIiwgd0RldklELCBscGR3Vm9sKTsKIAlpZiAobHBkd1ZvbCA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAlpZiAoKG1peGVyID0gb3BlbihNSVhFUl9ERVYsIE9fUkRXUikpIDwgMCkgewogCQlwcmludGYoIkxpbnV4ICdBVVhfR2V0Vm9sdW1lJyAvLyBtaXhlciBkZXZpY2Ugbm90IGF2YWlsYWJsZSAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJCX0KLQlzd2l0Y2god0RldklEKSB7CisJc3dpdGNoKE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpKSB7CiAJCWNhc2UgMDoKIAkJCXByaW50ZigiTGludXggJ0FVWF9HZXRWb2x1bWUnIC8vIFNPVU5EX01JWEVSX1JFQURfUENNICFcbiIpOwogCQkJY21kID0gU09VTkRfTUlYRVJfUkVBRF9QQ007CkBAIC0xNTMsMTAgKzE0OSwxMCBAQAogCQkJY21kID0gU09VTkRfTUlYRVJfUkVBRF9WT0xVTUU7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCWZwcmludGYoc3RkZXJyLCAiTGludXggJ0FVWF9HZXRWb2x1bWUnIC8vIGludmFsaWQgZGV2aWNlIGlkPSVkICFcbiIsIHdEZXZJRCk7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkxpbnV4ICdBVVhfR2V0Vm9sdW1lJyAvLyBpbnZhbGlkIGRldmljZSBpZD0lMDRYICFcbiIsIHdEZXZJRCk7CiAJCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAkJfQotICAgIGlmIChpb2N0bChtaXhlciwgY21kLCAmdm9sdW1lKSA9PSAtMSkgeworCWlmIChpb2N0bChtaXhlciwgY21kLCAmdm9sdW1lKSA9PSAtMSkgewogCQlwcmludGYoIkxpbnV4ICdBVVhfR2V0Vm9sdW1lJyAvLyB1bmFibGUgcmVhZCBtaXhlciAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJCX0KQEAgLTE4MCwxNCArMTc2LDE0IEBACiAJaW50IAltaXhlcjsKIAlpbnQJCXZvbHVtZTsKIAlpbnQJCWNtZDsKLQlwcmludGYoIkFVWF9TZXRWb2x1bWUoJXUgKCUwNFgpLCAlMDhsWCk7XG4iLCB3RGV2SUQsIHdEZXZJRCwgZHdQYXJhbSk7CisJcHJpbnRmKCJBVVhfU2V0Vm9sdW1lKCUwNFgsICUwOGxYKTtcbiIsIHdEZXZJRCwgZHdQYXJhbSk7CiAJdm9sdW1lID0gKExPV09SRChkd1BhcmFtKSA+PiA5ICYgMHg3RikgKyAKIAkJKChISVdPUkQoZHdQYXJhbSkgPj4gOSAgJiAweDdGKSA8PCA4KTsKIAlpZiAoKG1peGVyID0gb3BlbihNSVhFUl9ERVYsIE9fUkRXUikpIDwgMCkgewogCQlwcmludGYoIkxpbnV4ICdBVVhfU2V0Vm9sdW1lJyAvLyBtaXhlciBkZXZpY2Ugbm90IGF2YWlsYWJsZSAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJCX0KLQlzd2l0Y2god0RldklEKSB7CisJc3dpdGNoKE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpKSB7CiAJCWNhc2UgMDoKIAkJCXByaW50ZigiTGludXggJ0FVWF9TZXRWb2x1bWUnIC8vIFNPVU5EX01JWEVSX1dSSVRFX1BDTSAhXG4iKTsKIAkJCWNtZCA9IFNPVU5EX01JWEVSX1dSSVRFX1BDTTsKQEAgLTIxMyw3ICsyMDksNyBAQAogCQkJY21kID0gU09VTkRfTUlYRVJfV1JJVEVfVk9MVU1FOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIkxpbnV4ICdBVVhfU2V0Vm9sdW1lJyAvLyBpbnZhbGlkIGRldmljZSBpZD0lZCAhXG4iLCB3RGV2SUQpOworCQkJZnByaW50ZihzdGRlcnIsICJMaW51eCAnQVVYX1NldFZvbHVtZScgLy8gaW52YWxpZCBkZXZpY2UgaWQ9JTA0WCAhXG4iLCB3RGV2SUQpOwogCQkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJCX0KICAgICBpZiAoaW9jdGwobWl4ZXIsIGNtZCwgJnZvbHVtZSkgPT0gLTEpIHsKQEAgLTIzNCw3ICsyMzAsNyBAQAogRFdPUkQgYXV4TWVzc2FnZShXT1JEIHdEZXZJRCwgV09SRCB3TXNnLCBEV09SRCBkd1VzZXIsIAogCQkJCQlEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIpCiB7Ci0JcHJpbnRmKCJhdXhNZXNzYWdlKCV1LCAlMDRYLCAlMDhsWCwgJTA4bFgsICUwOGxYKTtcbiIsIAorCXByaW50ZigiYXV4TWVzc2FnZSglMDRYLCAlMDRYLCAlMDhsWCwgJTA4bFgsICUwOGxYKTtcbiIsIAogCQkJd0RldklELCB3TXNnLCBkd1VzZXIsIGR3UGFyYW0xLCBkd1BhcmFtMik7CiAJc3dpdGNoKHdNc2cpIHsKIAkJY2FzZSBBVVhETV9HRVRERVZDQVBTOgpAQCAtMjUyLDYgKzI0OCwzIEBACiAJCX0KIAlyZXR1cm4gTU1TWVNFUlJfTk9UU1VQUE9SVEVEOwogfQotCi0KLSNlbmRpZiAvKiAjaWZkZWYgQlVJTFRJTl9NTVNZU1RFTSAqLwpkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9tbXN5c3RlbS5jIGIvbXVsdGltZWRpYS9tbXN5c3RlbS5jCmluZGV4IDEyMzM3YTYuLjBjMjMyYTUgMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvbW1zeXN0ZW0uYworKysgYi9tdWx0aW1lZGlhL21tc3lzdGVtLmMKQEAgLTcsOCArNyw2IEBACiAgKiAgICAgICAgYW5kIGxvbmcgdGVybSBwb2ludGVycyB0byAxNiBiaXQgc3BhY2UgaW4gaGVyZQogICovCiAKLSNpZm5kZWYgV0lORUxJQgotCiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KQEAgLTE2LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKKyNpbmNsdWRlICJoZWFwLmgiCiAjaW5jbHVkZSAibGR0LmgiCiAjaW5jbHVkZSAidXNlci5oIgogI2luY2x1ZGUgImRyaXZlci5oIgpAQCAtMzUsOCArMzQsOCBAQAogICovCiBNQ0lfT1BFTl9QQVJNUwkJbWNpT3BlbkRydltNQVhNQ0lEUklWRVJTXTsKIAotVUlOVCBtaWRpR2V0RXJyb3JUZXh0KFVJTlQgdUVycm9yLCBMUFNUUiBscFRleHQsIFVJTlQgdVNpemUpOwotVUlOVCB3YXZlR2V0RXJyb3JUZXh0KFVJTlQgdUVycm9yLCBMUFNUUiBscFRleHQsIFVJTlQgdVNpemUpOworVUlOVDE2IG1pZGlHZXRFcnJvclRleHQoVUlOVDE2IHVFcnJvciwgTFBTVFIgbHBUZXh0LCBVSU5UMTYgdVNpemUpOworVUlOVDE2IHdhdmVHZXRFcnJvclRleHQoVUlOVDE2IHVFcnJvciwgTFBTVFIgbHBUZXh0LCBVSU5UMTYgdVNpemUpOwogTE9ORyBEcnZEZWZEcml2ZXJQcm9jKERXT1JEIGR3RGV2SUQsIEhEUlZSMTYgaERyaXYsIFdPUkQgd01zZywgCiAJCSAgICAgIERXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMik7CiAKQEAgLTQ5LDYgKzQ4LDUwIEBACiBMT05HIEFOSU1fRHJpdmVyUHJvYyhEV09SRCBkd0RldklELCBIRFJWUjE2IGhEcml2LCBXT1JEIHdNc2csIAogCQkgICAgIERXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMik7CiAKKworI2RlZmluZSBHZXREcnYod0RldklEKSAoJm1jaURydltNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKV0pCisjZGVmaW5lIEdldE9wZW5EcnYod0RldklEKSAoJm1jaU9wZW5EcnZbTU1TWVNURU1fRGV2SURUb0luZGV4KHdEZXZJRCldKQorCisvKiBUaGUgd0RldklEJ3MgcmV0dXJuZWQgYnkgd2luZSB3ZXJlIG9yaWdpbmFsbHkgaW4gdGhlIHJhbmdlIAorICogMCAtIChNQVhNQ0lEUklWRVJTIC0gMSkgYW5kIHVzZWQgZGlyZWN0bHkgYXMgYXJyYXkgaW5kaWNlcy4KKyAqIFVuZm9ydHVuYXRlbHksIG1zLXdpbmRvd3MgdXNlcyB3RGV2SUQgb2YgemVybyB0byBpbmRpY2F0ZQorICogZXJyb3JzLiAgTm93LCBtdWx0aW1lZGlhIGRyaXZlcnMgbXVzdCBwYXNzIHRoZSB3RGV2SUQgdGhyb3VnaAorICogTU1TWVNURU1fRGV2SURUb0luZGV4IHRvIGdldCBhbiBpbmRleCBpbiB0aGF0IHJhbmdlLiAgQW4KKyAqIGFyaWJ0cmFyeSB2YWx1ZSwgTU1TWVNURU1fTUFHSUMgaXMgYWRkZWQgdG8gdGhlIHdEZXZJRCBzZWVuCisgKiBieSB0aGUgd2luZG93cyBwcm9ncmFtcy4KKyAqLworCisjZGVmaW5lIE1NU1lTVEVNX01BR0lDIDB4MEYwMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogCQkJCU1NU1lTVEVNX0RldklEVG9JbmRleAlbaW50ZXJuYWxdCisqLworaW50IE1NU1lTVEVNX0RldklEVG9JbmRleChVSU5UMTYgd0RldklEKSB7CisJcmV0dXJuIHdEZXZJRCAtIE1NU1lTVEVNX01BR0lDOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogCQkJCU1NU1lTVEVNX0ZpcnN0RGV2SWQJW2ludGVybmFsXQorKi8KK1VJTlQxNiBNTVNZU1RFTV9GaXJzdERldklEKHZvaWQpCit7CisJcmV0dXJuIE1NU1lTVEVNX01BR0lDOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogCQkJCU1NU1lTVEVNX05leHREZXZJZAlbaW50ZXJuYWxdCisqLworVUlOVDE2IE1NU1lTVEVNX05leHREZXZJRChVSU5UMTYgd0RldklEKSB7CisJcmV0dXJuIHdEZXZJRCArIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAJCQkJTU1TWVNURU1fRGV2SWRWYWxpZAlbaW50ZXJuYWxdCisqLworQk9PTDMyIE1NU1lTVEVNX0RldklEVmFsaWQoVUlOVDE2IHdEZXZJRCkgeworCXJldHVybiB3RGV2SUQgPj0gMHgwRjAwICYmIHdEZXZJRCA8ICgweDBGMDAgKyBNQVhNQ0lEUklWRVJTKTsKK30KKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNTVNZU1RFTV9XRVAJCVtNTVNZU1RFTS4xXQogKi8KQEAgLTYzLDcgKzEwNiw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCXNuZFBsYXlTb3VuZAkJW01NU1lTVEVNLjJdCiAqLwotQk9PTCBzbmRQbGF5U291bmQoTFBDU1RSIGxwc3pTb3VuZE5hbWUsIFVJTlQgdUZsYWdzKQorQk9PTDE2IHNuZFBsYXlTb3VuZChMUENTVFIgbHBzelNvdW5kTmFtZSwgVUlOVDE2IHVGbGFncykKIHsKIAlITU1JTzE2CQkJaG1taW87CiAJTU1DS0lORk8JCW1tY2tJbmZvOwpAQCAtODksNiArMTMyLDEyIEBACiAJCX0KIAlobW1pbyA9IG1taW9PcGVuKChMUFNUUilscHN6U291bmROYW1lLCBOVUxMLCAKIAkJTU1JT19BTExPQ0JVRiB8IE1NSU9fUkVBRCB8IE1NSU9fREVOWVdSSVRFKTsKKworCWlmICh1RmxhZ3MgJiBTTkRfTUVNT1JZKSB7CisJCWRwcmludGZfbW1zeXMoc3RkZGViLCAic25kUGxheVNvdW5kIC8vIFNORF9NRU1PUlkgZmxhZyBub3QgaW1wbGVtZW50ZWQhXG4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwogCWlmIChobW1pbyA9PSAwKSB7CiAJCWRwcmludGZfbW1zeXMoc3RkZGViLCAic25kUGxheVNvdW5kIC8vIHNlYXJjaGluZyBpbiBTeXN0ZW1Tb3VuZCBMaXN0ICFcbiIpOwogCQlHZXRQcm9maWxlU3RyaW5nMzJBKCJTb3VuZHMiLCAoTFBTVFIpbHBzelNvdW5kTmFtZSwgIiIsIHN0ciwgc2l6ZW9mKHN0cikpOwpAQCAtMjAxLDcgKzI1MCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCURyaXZlckNhbGxiYWNrCVtNTVNZU1RFTS4zMV0KICovCi1CT09MIERyaXZlckNhbGxiYWNrKERXT1JEIGR3Q2FsbEJhY2ssIFVJTlQgdUZsYWdzLCBIQU5ETEUxNiBoRGV2LCAKK0JPT0wxNiBEcml2ZXJDYWxsYmFjayhEV09SRCBkd0NhbGxCYWNrLCBVSU5UMTYgdUZsYWdzLCBIQU5ETEUxNiBoRGV2LCAKIAkJV09SRCB3TXNnLCBEV09SRCBkd1VzZXIsIERXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMikKIHsKIAlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIkRyaXZlckNhbGxiYWNrKCUwOGxYLCAlMDRYLCAlMDRYLCAlMDRYLCAlMDhsWCwgJTA4bFgsICUwOGxYKTsgIVxuIiwKQEAgLTIyNiw5ICsyNzUsOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlhdXhHZXROdW1EZXZzCQlbTU1TWVNURU0uMzUwXQogKi8KLVVJTlQgYXV4R2V0TnVtRGV2cygpCitVSU5UMTYgYXV4R2V0TnVtRGV2cygpCiB7Ci0JVUlOVAljb3VudCA9IDA7CisJVUlOVDE2CWNvdW50ID0gMDsKIAlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgImF1eEdldE51bURldnMgIVxuIik7CiAJY291bnQgKz0gYXV4TWVzc2FnZSgwLCBBVVhETV9HRVROVU1ERVZTLCAwTCwgMEwsIDBMKTsKIAlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgImF1eEdldE51bURldnMgcmV0dXJuICV1IFxuIiwgY291bnQpOwpAQCAtMjM4LDcgKzI4Nyw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCWF1eEdldERldkNhcHMJCVtNTVNZU1RFTS4zNTFdCiAqLwotVUlOVCBhdXhHZXREZXZDYXBzKFVJTlQgdURldmljZUlELCBBVVhDQVBTICogbHBDYXBzLCBVSU5UIHVTaXplKQorVUlOVDE2IGF1eEdldERldkNhcHMoVUlOVDE2IHVEZXZpY2VJRCwgQVVYQ0FQUyAqIGxwQ2FwcywgVUlOVDE2IHVTaXplKQogewogCWRwcmludGZfbW1zeXMoc3RkZGViLCAiYXV4R2V0RGV2Q2FwcyglMDRYLCAlcCwgJWQpICFcbiIsIAogCQkJCQl1RGV2aWNlSUQsIGxwQ2FwcywgdVNpemUpOwpAQCAtMjQ5LDcgKzI5OCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCWF1eEdldFZvbHVtZQkJW01NU1lTVEVNLjM1Ml0KICovCi1VSU5UIGF1eEdldFZvbHVtZShVSU5UIHVEZXZpY2VJRCwgRFdPUkQgKiBscGR3Vm9sdW1lKQorVUlOVDE2IGF1eEdldFZvbHVtZShVSU5UMTYgdURldmljZUlELCBEV09SRCAqIGxwZHdWb2x1bWUpCiB7CiAJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJhdXhHZXRWb2x1bWUoJTA0WCwgJXApICFcbiIsIHVEZXZpY2VJRCwgbHBkd1ZvbHVtZSk7CiAJcmV0dXJuIGF1eE1lc3NhZ2UodURldmljZUlELCBBVVhETV9HRVRWT0xVTUUsIDBMLCAoRFdPUkQpbHBkd1ZvbHVtZSwgMEwpOwpAQCAtMjU4LDcgKzMwNyw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCWF1eFNldFZvbHVtZQkJW01NU1lTVEVNLjM1M10KICovCi1VSU5UIGF1eFNldFZvbHVtZShVSU5UIHVEZXZpY2VJRCwgRFdPUkQgZHdWb2x1bWUpCitVSU5UMTYgYXV4U2V0Vm9sdW1lKFVJTlQxNiB1RGV2aWNlSUQsIERXT1JEIGR3Vm9sdW1lKQogewogCWRwcmludGZfbW1zeXMoc3RkZGViLCAiYXV4U2V0Vm9sdW1lKCUwNFgsICUwOGxYKSAhXG4iLCB1RGV2aWNlSUQsIGR3Vm9sdW1lKTsKIAlyZXR1cm4gYXV4TWVzc2FnZSh1RGV2aWNlSUQsIEFVWERNX1NFVFZPTFVNRSwgMEwsIGR3Vm9sdW1lLCAwTCk7CkBAIC0yNjcsNyArMzE2LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJYXV4T3V0TWVzc2FnZQkJW01NU1lTVEVNLjM1NF0KICovCi1EV09SRCBhdXhPdXRNZXNzYWdlKFVJTlQgdURldmljZUlELCBVSU5UIHVNZXNzYWdlLCBEV09SRCBkdzEsIERXT1JEIGR3MikKK0RXT1JEIGF1eE91dE1lc3NhZ2UoVUlOVDE2IHVEZXZpY2VJRCwgVUlOVDE2IHVNZXNzYWdlLCBEV09SRCBkdzEsIERXT1JEIGR3MikKIHsKIAlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgImF1eE91dE1lc3NhZ2UoJTA0WCwgJTA0WCwgJTA4bFgsICUwOGxYKVxuIiwgCiAJCQkJdURldmljZUlELCB1TWVzc2FnZSwgZHcxLCBkdzIpOwpAQCAtMjc3LDcgKzMyNiw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1jaUdldEVycm9yU3RyaW5nCQlbTU1TWVNURU0uNzA2XQogKi8KLUJPT0wgbWNpR2V0RXJyb3JTdHJpbmcgKERXT1JEIHdFcnJvciwgTFBTVFIgbHBzdHJCdWZmZXIsIFVJTlQgdUxlbmd0aCkKK0JPT0wxNiBtY2lHZXRFcnJvclN0cmluZyAoRFdPUkQgd0Vycm9yLCBMUFNUUiBscHN0ckJ1ZmZlciwgVUlOVDE2IHVMZW5ndGgpCiB7CiAJTFBTVFIJbXNncHRyOwogCWRwcmludGZfbW1zeXMoc3RkZGViLCAibWNpR2V0RXJyb3JTdHJpbmcoJTA4bFgsICVwLCAlZCk7XG4iLCB3RXJyb3IsIGxwc3RyQnVmZmVyLCB1TGVuZ3RoKTsKQEAgLTUzNywxMyArNTg2LDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1jaURyaXZlck5vdGlmeQkJCVtNTVNZU1RFTS43MTFdCiAqLwotQk9PTCBtY2lEcml2ZXJOb3RpZnkoSFdORDE2IGhXbmRDYWxsQmFjaywgVUlOVCB3RGV2SUQsIFVJTlQgd1N0YXR1cykKK0JPT0wxNiBtY2lEcml2ZXJOb3RpZnkoSFdORDE2IGhXbmRDYWxsQmFjaywgVUlOVDE2IHdEZXZJRCwgVUlOVDE2IHdTdGF0dXMpCiB7CiAJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJtY2lEcml2ZXJOb3RpZnkoJTA0WCwgJXUsICUwNFgpXG4iLCBoV25kQ2FsbEJhY2ssIHdEZXZJRCwgd1N0YXR1cyk7Ci0JaWYgKCFJc1dpbmRvdyhoV25kQ2FsbEJhY2spKSByZXR1cm4gRkFMU0U7CisJaWYgKCFJc1dpbmRvdzMyKGhXbmRDYWxsQmFjaykpIHJldHVybiBGQUxTRTsKIAlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIm1jaURyaXZlck5vdGlmeSAvLyBiZWZvcmUgUG9zdE1lc3NhZ2VcbiIpOwotCVBvc3RNZXNzYWdlKGhXbmRDYWxsQmFjaywgTU1fTUNJTk9USUZZLCB3U3RhdHVzLCAKLQkJCU1BS0VMT05HKG1jaURydlt3RGV2SURdLndEZXZpY2VJRCwgMCkpOworCVBvc3RNZXNzYWdlMTYoIGhXbmRDYWxsQmFjaywgTU1fTUNJTk9USUZZLCB3U3RhdHVzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgTUFLRUxPTkcoR2V0RHJ2KHdEZXZJRCktPndEZXZpY2VJRCwgMCkpOwogCXJldHVybiBUUlVFOwogfQogCkBAIC01NTEsMzEgKzYwMCwyNSBAQAogKiAJCQkJbWNpT3BlbgkJCQkJW2ludGVybmFsXQogKi8KIAotI2RlZmluZQlfTUNJX1NUUkRVUF9UT19TRUcoZGVzdCxzb3VyY2UpIHtcCi0JSExPQ0FMMTYgeDtcCi0JeD1VU0VSX0hFQVBfQUxMT0Moc3RybGVuKHNvdXJjZSkrMSk7XAotCWRlc3Q9KExQU1RSKU1BS0VMT05HKHgsVVNFUl9IZWFwU2VsKTtcCi0Jc3RyY3B5KFBUUl9TRUdfVE9fTElOKGRlc3QpLHNvdXJjZSk7XAotfQotCiBEV09SRCBtY2lPcGVuKERXT1JEIGR3UGFyYW0sIExQTUNJX09QRU5fUEFSTVMgbHAxNlBhcm1zKQogewogCWNoYXIJc3RyWzEyOF07CiAJTFBNQ0lfT1BFTl9QQVJNUyBscFBhcm1zOwotCVVJTlQJdURldlR5cCA9IDA7Ci0JVUlOVAl3RGV2SUQgPSAwOworCVVJTlQxNgl1RGV2VHlwID0gMDsKKwlVSU5UMTYJd0RldklEID0gTU1TWVNURU1fRmlyc3REZXZJRCgpOwogCiAJbHBQYXJtcyA9IFBUUl9TRUdfVE9fTElOKGxwMTZQYXJtcyk7CiAJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJtY2lPcGVuKCUwOGxYLCAlcCAoJXApKVxuIiwgZHdQYXJhbSwgbHAxNlBhcm1zLCBscFBhcm1zKTsKIAlpZiAobHAxNlBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7Ci0Jd2hpbGUobWNpRHJ2W3dEZXZJRF0ud1R5cGUgIT0gMCkgewotCQlpZiAoKyt3RGV2SUQgPj0gTUFYTUNJRFJJVkVSUykgeworCXdoaWxlKEdldERydih3RGV2SUQpLT53VHlwZSAhPSAwKSB7CisJCXdEZXZJRCA9IE1NU1lTVEVNX05leHREZXZJRCh3RGV2SUQpOworCQlpZiAoIU1NU1lTVEVNX0RldklEVmFsaWQod0RldklEKSkgewogCQkJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJNQ0lfT1BFTiAvLyBNQVhNQ0lEUklWRVJTIHJlYWNoZWQgIVxuIik7CiAJCQlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCQl9CiAJfQotCWRwcmludGZfbW1zeXMoc3RkZGViLCAibWNpT3BlbiAvLyB3RGV2SUQ9JWQgXG4iLCB3RGV2SUQpOwotCW1lbWNweSgmbWNpT3BlbkRydlt3RGV2SURdLGxwUGFybXMsc2l6ZW9mKCpscFBhcm1zKSk7CisJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJtY2lPcGVuIC8vIHdEZXZJRD0lMDRYIFxuIiwgd0RldklEKTsKKwltZW1jcHkoR2V0T3BlbkRydih3RGV2SUQpLGxwUGFybXMsc2l6ZW9mKCpscFBhcm1zKSk7CiAKIAlpZiAoZHdQYXJhbSAmIE1DSV9PUEVOX0VMRU1FTlQpIHsKIAkJY2hhcgkqcywqdDsKQEAgLTYxNiwyNSArNjU5LDIxIEBACiAJaWYgKGR3UGFyYW0gJiBNQ0lfT1BFTl9BTElBUykgewogCQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIk1DSV9PUEVOIC8vIEFsaWFzPSclcycgIVxuIiwKIAkJCShjaGFyKilQVFJfU0VHX1RPX0xJTihscFBhcm1zLT5scHN0ckFsaWFzKSk7Ci0JCV9NQ0lfU1RSRFVQX1RPX1NFRygKLQkJCW1jaU9wZW5EcnZbd0RldklEXS5scHN0ckFsaWFzLAotCQkJKGNoYXIqKVBUUl9TRUdfVE9fTElOKGxwUGFybXMtPmxwc3RyQWxpYXMpCi0JCSk7CisgICAgICAgICAgICAgICAgR2V0T3BlbkRydih3RGV2SUQpLT5scHN0ckFsaWFzID0gU0VHUFRSX0dFVCgKKyAgICAgICAgICAgICAgICAgICAgU0VHUFRSX1NUUkRVUCgoY2hhciopUFRSX1NFR19UT19MSU4obHBQYXJtcy0+bHBzdHJBbGlhcykpKTsKIAkJLyogbXBsYXllciBkb2VzIGFsbG9jYXRlIGFsaWFzIHRvIENEQVVESU8gKi8KIAl9CiAJaWYgKGR3UGFyYW0gJiBNQ0lfT1BFTl9UWVBFKSB7CiAJCWlmIChkd1BhcmFtICYgTUNJX09QRU5fVFlQRV9JRCkgewotCQkJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJNQ0lfT1BFTiAvLyBEZXY9JXAgIVxuIiwgbHBQYXJtcy0+bHBzdHJEZXZpY2VUeXBlKTsKKwkJCWRwcmludGZfbW1zeXMoc3RkZGViLCAiTUNJX09QRU4gLy8gRGV2PSUwOGx4ICFcbiIsIGxwUGFybXMtPmxwc3RyRGV2aWNlVHlwZSk7CiAJCQl1RGV2VHlwID0gTE9XT1JEKChEV09SRClscFBhcm1zLT5scHN0ckRldmljZVR5cGUpOwotCQkJbWNpT3BlbkRydlt3RGV2SURdLmxwc3RyRGV2aWNlVHlwZT1scFBhcm1zLT5scHN0ckRldmljZVR5cGU7CisgCQkJR2V0T3BlbkRydih3RGV2SUQpLT5scHN0ckRldmljZVR5cGU9bHBQYXJtcy0+bHBzdHJEZXZpY2VUeXBlOwogCQl9IGVsc2UgewogCQkJaWYgKGxwUGFybXMtPmxwc3RyRGV2aWNlVHlwZSA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCQkJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJNQ0lfT1BFTiAvLyBEZXY9JyVzJyAhXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKVBUUl9TRUdfVE9fTElOKGxwUGFybXMtPmxwc3RyRGV2aWNlVHlwZSkpOwotCQkJX01DSV9TVFJEVVBfVE9fU0VHKAotCQkJCW1jaU9wZW5EcnZbd0RldklEXS5scHN0ckRldmljZVR5cGUsCi0JCQkJKGNoYXIqKVBUUl9TRUdfVE9fTElOKGxwUGFybXMtPmxwc3RyRGV2aWNlVHlwZSkKLQkJCSk7CisgICAgICAgICAgICAgICAgICAgICAgICBHZXRPcGVuRHJ2KHdEZXZJRCktPmxwc3RyRGV2aWNlVHlwZSA9IFNFR1BUUl9HRVQoCisgICAgICAgICAgICAgIFNFR1BUUl9TVFJEVVAoKGNoYXIqKVBUUl9TRUdfVE9fTElOKGxwUGFybXMtPmxwc3RyRGV2aWNlVHlwZSkpKTsKIAkJCXN0cmNweShzdHIsIFBUUl9TRUdfVE9fTElOKGxwUGFybXMtPmxwc3RyRGV2aWNlVHlwZSkpOwogCQkJQ2hhclVwcGVyMzJBKHN0cik7CiAJCQlpZiAoc3RyY21wKHN0ciwgIkNEQVVESU8iKSA9PSAwKSB7CkBAIC02NTQsMzUgKzY5MywzMiBAQAogCQkJfQogCQl9CiAJfQotCW1jaURydlt3RGV2SURdLndUeXBlID0gdURldlR5cDsKLQltY2lEcnZbd0RldklEXS53RGV2aWNlSUQgPSB3RGV2SUQ7CisJR2V0RHJ2KHdEZXZJRCktPndUeXBlID0gdURldlR5cDsKKwlHZXREcnYod0RldklEKS0+d0RldmljZUlEID0gd0RldklEOwogCWxwUGFybXMtPndEZXZpY2VJRCA9IHdEZXZJRDsKIAlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIk1DSV9PUEVOIC8vIG1jaWRldj0lZCwgdURldlR5cD0lMDRYIHdEZXZpY2VJRD0lMDRYICFcbiIsIAogCQkJCXdEZXZJRCwgdURldlR5cCwgbHBQYXJtcy0+d0RldmljZUlEKTsKLQlzd2l0Y2godURldlR5cCkgewotCQljYXNlIE1DSV9ERVZUWVBFX0NEX0FVRElPOgotI2lmZGVmIFdJTkVMSUIKLQkJCVdJTkVMSUJfVU5JTVAgKCJDREFVRElPX0RyaXZlclByb2MiKTsKLSNlbHNlCi0JCQlyZXR1cm4gQ0RBVURJT19Ecml2ZXJQcm9jKDAsIDAsIE1DSV9PUEVOX0RSSVZFUiwKLQkJCQkJCQlkd1BhcmFtLCAoRFdPUkQpbHAxNlBhcm1zKTsKLSNlbmRpZgotCQljYXNlIE1DSV9ERVZUWVBFX1dBVkVGT1JNX0FVRElPOgotCQkJcmV0dXJuIFdBVkVfRHJpdmVyUHJvYygwLCAwLCBNQ0lfT1BFTl9EUklWRVIsIAotCQkJCQkJCQlkd1BhcmFtLCAoRFdPUkQpbHAxNlBhcm1zKTsKLQkJY2FzZSBNQ0lfREVWVFlQRV9TRVFVRU5DRVI6Ci0JCQlyZXR1cm4gTUlESV9Ecml2ZXJQcm9jKDAsIDAsIE1DSV9PUEVOX0RSSVZFUiwgCi0JCQkJCQkJCWR3UGFyYW0sIChEV09SRClscDE2UGFybXMpOwotCQljYXNlIE1DSV9ERVZUWVBFX0FOSU1BVElPTjoKLQkJCXJldHVybiBBTklNX0RyaXZlclByb2MoMCwgMCwgTUNJX09QRU5fRFJJVkVSLCAKLQkJCQkJCQkJZHdQYXJhbSwgKERXT1JEKWxwMTZQYXJtcyk7Ci0JCWNhc2UgTUNJX0RFVlRZUEVfRElHSVRBTF9WSURFTzoKLQkJCWRwcmludGZfbW1zeXMoc3RkZGViLCAiTUNJX09QRU4gLy8gTm8gRElHSVRBTF9WSURFTyB5ZXQgIVxuIik7Ci0JCQlyZXR1cm4gTUNJRVJSX0RFVklDRV9OT1RfSU5TVEFMTEVEOwotCQlkZWZhdWx0OgotCQkJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJNQ0lfT1BFTiAvLyBJbnZhbGlkIERldmljZSBOYW1lICclcCcgIVxuIiwgbHBQYXJtcy0+bHBzdHJEZXZpY2VUeXBlKTsKLQkJCXJldHVybiBNQ0lFUlJfSU5WQUxJRF9ERVZJQ0VfTkFNRTsKLQkJfQorCXN3aXRjaCh1RGV2VHlwKQorICAgICAgICB7CisgICAgICAgIGNhc2UgTUNJX0RFVlRZUEVfQ0RfQVVESU86CisgICAgICAgICAgICByZXR1cm4gQ0RBVURJT19Ecml2ZXJQcm9jKCAwLCAwLCBNQ0lfT1BFTl9EUklWRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1BhcmFtLCAoRFdPUkQpbHAxNlBhcm1zKTsKKyAgICAgICAgY2FzZSBNQ0lfREVWVFlQRV9XQVZFRk9STV9BVURJTzoKKyAgICAgICAgICAgIHJldHVybiBXQVZFX0RyaXZlclByb2MoIDAsIDAsIE1DSV9PUEVOX0RSSVZFUiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1BhcmFtLCAoRFdPUkQpbHAxNlBhcm1zKTsKKyAgICAgICAgY2FzZSBNQ0lfREVWVFlQRV9TRVFVRU5DRVI6CisgICAgICAgICAgICByZXR1cm4gTUlESV9Ecml2ZXJQcm9jKCAwLCAwLCBNQ0lfT1BFTl9EUklWRVIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdQYXJhbSwgKERXT1JEKWxwMTZQYXJtcyk7CisgICAgICAgIGNhc2UgTUNJX0RFVlRZUEVfQU5JTUFUSU9OOgorICAgICAgICAgICAgcmV0dXJuIEFOSU1fRHJpdmVyUHJvYyggMCwgMCwgTUNJX09QRU5fRFJJVkVSLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3UGFyYW0sIChEV09SRClscDE2UGFybXMpOworICAgICAgICBjYXNlIE1DSV9ERVZUWVBFX0RJR0lUQUxfVklERU86CisgICAgICAgICAgICBkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIk1DSV9PUEVOIC8vIE5vIERJR0lUQUxfVklERU8geWV0ICFcbiIpOworICAgICAgICAgICAgcmV0dXJuIE1DSUVSUl9ERVZJQ0VfTk9UX0lOU1RBTExFRDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGRwcmludGZfbW1zeXMoc3RkZGViLCAiTUNJX09QRU4gLy8gSW52YWxpZCBEZXZpY2UgTmFtZSAnJTA4bHgnICFcbiIsIGxwUGFybXMtPmxwc3RyRGV2aWNlVHlwZSk7CisgICAgICAgICAgICByZXR1cm4gTUNJRVJSX0lOVkFMSURfREVWSUNFX05BTUU7CisgICAgICAgIH0KIAlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogfQogCkBAIC02OTAsMzMgKzcyNiwzNCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltY2lDbG9zZQkJCQlbaW50ZXJuYWxdCiAqLwotRFdPUkQgbWNpQ2xvc2UoVUlOVCB3RGV2SUQsIERXT1JEIGR3UGFyYW0sIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcykKK0RXT1JEIG1jaUNsb3NlKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3UGFyYW0sIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcykKIHsKIAlEV09SRAlkd1JldCA9IE1DSUVSUl9JTlRFUk5BTDsKIAlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIm1jaUNsb3NlKCV1LCAlMDhsWCwgJXApXG4iLCB3RGV2SUQsIGR3UGFyYW0sIGxwUGFybXMpOwotCXN3aXRjaChtY2lEcnZbd0RldklEXS53VHlwZSkgeworCXN3aXRjaChHZXREcnYod0RldklEKS0+d1R5cGUpIHsKIAkJY2FzZSBNQ0lfREVWVFlQRV9DRF9BVURJTzoKLSNpZm5kZWYgV0lORUxJQgotCQkJZHdSZXQgPSBDREFVRElPX0RyaXZlclByb2MobWNpRHJ2W3dEZXZJRF0ud0RldmljZUlELCAwLCAKLQkJCQkJCU1DSV9DTE9TRSwgZHdQYXJhbSwgKERXT1JEKWxwUGFybXMpOwotI2VuZGlmCisJCQlkd1JldCA9IENEQVVESU9fRHJpdmVyUHJvYyhHZXREcnYod0RldklEKS0+d0RldmljZUlELDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNJX0NMT1NFLCBkd1BhcmFtLCAoRFdPUkQpbHBQYXJtcyk7CiAJCQlicmVhazsKIAkJY2FzZSBNQ0lfREVWVFlQRV9XQVZFRk9STV9BVURJTzoKLQkJCWR3UmV0ID0gV0FWRV9Ecml2ZXJQcm9jKG1jaURydlt3RGV2SURdLndEZXZpY2VJRCwgMCwgCi0JCQkJCQlNQ0lfQ0xPU0UsIGR3UGFyYW0sIChEV09SRClscFBhcm1zKTsKKwkJCWR3UmV0ID0gV0FWRV9Ecml2ZXJQcm9jKEdldERydih3RGV2SUQpLT53RGV2aWNlSUQsIDAsIAorCQkJCQkJTUNJX0NMT1NFLCBkd1BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERXT1JEKWxwUGFybXMpOwogCQkJYnJlYWs7CiAJCWNhc2UgTUNJX0RFVlRZUEVfU0VRVUVOQ0VSOgotCQkJZHdSZXQgPSBNSURJX0RyaXZlclByb2MobWNpRHJ2W3dEZXZJRF0ud0RldmljZUlELCAwLCAKLQkJCQkJCU1DSV9DTE9TRSwgZHdQYXJhbSwgKERXT1JEKWxwUGFybXMpOworCQkJZHdSZXQgPSBNSURJX0RyaXZlclByb2MoR2V0RHJ2KHdEZXZJRCktPndEZXZpY2VJRCwgMCwgCisJCQkJCQlNQ0lfQ0xPU0UsIGR3UGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRFdPUkQpbHBQYXJtcyk7CiAJCQlicmVhazsKIAkJY2FzZSBNQ0lfREVWVFlQRV9BTklNQVRJT046Ci0JCQlkd1JldCA9IEFOSU1fRHJpdmVyUHJvYyhtY2lEcnZbd0RldklEXS53RGV2aWNlSUQsIDAsIAotCQkJCQkJTUNJX0NMT1NFLCBkd1BhcmFtLCAoRFdPUkQpbHBQYXJtcyk7CisJCQlkd1JldCA9IEFOSU1fRHJpdmVyUHJvYyhHZXREcnYod0RldklEKS0+d0RldmljZUlELCAwLCAKKwkJCQkJCU1DSV9DTE9TRSwgZHdQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEV09SRClscFBhcm1zKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJtY2lDbG9zZSgpIC8vIHVua25vd24gZGV2aWNlIHR5cGU9JTA0WCAhXG4iLCBtY2lEcnZbd0RldklEXS53VHlwZSk7CisJCQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIm1jaUNsb3NlKCkgLy8gdW5rbm93biBkZXZpY2UgdHlwZT0lMDRYICFcbiIsIEdldERydih3RGV2SUQpLT53VHlwZSk7CiAJCX0KLQltY2lEcnZbd0RldklEXS53VHlwZSA9IDA7CisJR2V0RHJ2KHdEZXZJRCktPndUeXBlID0gMDsKIAlyZXR1cm4gZHdSZXQ7CiB9CiAKQEAgLTc3Miw3ICs4MDksNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltY2lTb3VuZAkJCQlbaW50ZXJuYWxdCiAqLwotRFdPUkQgbWNpU291bmQoVUlOVCB3RGV2SUQsIERXT1JEIGR3UGFyYW0sIExQTUNJX1NPVU5EX1BBUk1TIGxwUGFybXMpCitEV09SRCBtY2lTb3VuZChVSU5UMTYgd0RldklELCBEV09SRCBkd1BhcmFtLCBMUE1DSV9TT1VORF9QQVJNUyBscFBhcm1zKQogewogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJaWYgKGR3UGFyYW0gJiBNQ0lfU09VTkRfTkFNRSkKQEAgLTc4MSw2MiArODE4LDEyNyBAQAogfQogCiAKK3N0YXRpYyBjb25zdCBjaGFyICpfbWNpQ29tbWFuZFRvU3RyaW5nKFVJTlQxNiB3TXNnKQoreworCXN0YXRpYyBjaGFyIGJ1ZmZlclsxMDBdOworCisjZGVmaW5lIENBU0UocykgY2FzZSAocyk6IHJldHVybiAjcworCisJc3dpdGNoICh3TXNnKSB7CisJCUNBU0UoTUNJX09QRU4pOworCQlDQVNFKE1DSV9DTE9TRSk7CisJCUNBU0UoTUNJX0VTQ0FQRSk7CisJCUNBU0UoTUNJX1BMQVkpOworCQlDQVNFKE1DSV9TRUVLKTsKKwkJQ0FTRShNQ0lfU1RPUCk7CisJCUNBU0UoTUNJX1BBVVNFKTsKKwkJQ0FTRShNQ0lfSU5GTyk7CisJCUNBU0UoTUNJX0dFVERFVkNBUFMpOworCQlDQVNFKE1DSV9TUElOKTsKKwkJQ0FTRShNQ0lfU0VUKTsKKwkJQ0FTRShNQ0lfU1RFUCk7CisJCUNBU0UoTUNJX1JFQ09SRCk7CisJCUNBU0UoTUNJX1NZU0lORk8pOworCQlDQVNFKE1DSV9CUkVBSyk7CisJCUNBU0UoTUNJX1NBVkUpOworCQlDQVNFKE1DSV9TVEFUVVMpOworCQlDQVNFKE1DSV9DVUUpOworCQlDQVNFKE1DSV9SRUFMSVpFKTsKKwkJQ0FTRShNQ0lfV0lORE9XKTsKKwkJQ0FTRShNQ0lfUFVUKTsKKwkJQ0FTRShNQ0lfV0hFUkUpOworCQlDQVNFKE1DSV9GUkVFWkUpOworCQlDQVNFKE1DSV9VTkZSRUVaRSk7CisJCUNBU0UoTUNJX0xPQUQpOworCQlDQVNFKE1DSV9DVVQpOworCQlDQVNFKE1DSV9DT1BZKTsKKwkJQ0FTRShNQ0lfUEFTVEUpOworCQlDQVNFKE1DSV9VUERBVEUpOworCQlDQVNFKE1DSV9SRVNVTUUpOworCQlDQVNFKE1DSV9ERUxFVEUpOworCQlkZWZhdWx0OgorCQkJc3ByaW50ZihidWZmZXIsICIlMDRYIiwgd01zZyk7CisJCQlyZXR1cm4gYnVmZmVyOworCisJfQorfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1jaVNlbmRDb21tYW5kCQkJW01NU1lTVEVNLjcwMV0KICovCi1EV09SRCBtY2lTZW5kQ29tbWFuZChVSU5UIHdEZXZJRCwgVUlOVCB3TXNnLCBEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIpCitEV09SRCBtY2lTZW5kQ29tbWFuZChVSU5UMTYgd0RldklELCBVSU5UMTYgd01zZywgRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yKQogewotCUhEUlZSMTYJaERydiA9IDA7Ci0JZHByaW50Zl9tY2koc3RkZGViLCAibWNpU2VuZENvbW1hbmQoJTA0WCwgJTA0WCwgJTA4bFgsICUwOGxYKVxuIiwgCi0JCQkJCXdEZXZJRCwgd01zZywgZHdQYXJhbTEsIGR3UGFyYW0yKTsKLQlzd2l0Y2god01zZykgewotCQljYXNlIE1DSV9PUEVOOgotCQkJcmV0dXJuIG1jaU9wZW4oZHdQYXJhbTEsIChMUE1DSV9PUEVOX1BBUk1TKWR3UGFyYW0yKTsKLQkJY2FzZSBNQ0lfQ0xPU0U6Ci0JCQlyZXR1cm4gbWNpQ2xvc2Uod0RldklELCBkd1BhcmFtMSwgKExQTUNJX0dFTkVSSUNfUEFSTVMpUFRSX1NFR19UT19MSU4oZHdQYXJhbTIpKTsKLQkJY2FzZSBNQ0lfU1lTSU5GTzoKLQkJCXJldHVybiBtY2lTeXNJbmZvKGR3UGFyYW0xLCAoTFBNQ0lfU1lTSU5GT19QQVJNUylQVFJfU0VHX1RPX0xJTihkd1BhcmFtMikpOwotCQlkZWZhdWx0OgotCQkJc3dpdGNoKG1jaURydlt3RGV2SURdLndUeXBlKSB7Ci0JCQkJY2FzZSBNQ0lfREVWVFlQRV9DRF9BVURJTzoKLSNpZm5kZWYgV0lORUxJQgotCQkJCQlyZXR1cm4gQ0RBVURJT19Ecml2ZXJQcm9jKG1jaURydlt3RGV2SURdLndEZXZpY2VJRCwgaERydiwgCi0JCQkJCQkJCQkJCXdNc2csIGR3UGFyYW0xLCBkd1BhcmFtMik7Ci0jZW5kaWYKLQkJCQkJCi0JCQkJY2FzZSBNQ0lfREVWVFlQRV9XQVZFRk9STV9BVURJTzoKLQkJCQkJcmV0dXJuIFdBVkVfRHJpdmVyUHJvYyhtY2lEcnZbd0RldklEXS53RGV2aWNlSUQsIGhEcnYsIAotCQkJCQkJCQkJCQl3TXNnLCBkd1BhcmFtMSwgZHdQYXJhbTIpOwotCQkJCWNhc2UgTUNJX0RFVlRZUEVfU0VRVUVOQ0VSOgotCQkJCQlyZXR1cm4gTUlESV9Ecml2ZXJQcm9jKG1jaURydlt3RGV2SURdLndEZXZpY2VJRCwgaERydiwgCi0JCQkJCQkJCQkJCXdNc2csIGR3UGFyYW0xLCBkd1BhcmFtMik7Ci0JCQkJY2FzZSBNQ0lfREVWVFlQRV9BTklNQVRJT046Ci0JCQkJCXJldHVybiBBTklNX0RyaXZlclByb2MobWNpRHJ2W3dEZXZJRF0ud0RldmljZUlELCBoRHJ2LCAKLQkJCQkJCQkJCQkJd01zZywgZHdQYXJhbTEsIGR3UGFyYW0yKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlkcHJpbnRmX21jaShzdGRkZWIsICJtY2lTZW5kQ29tbWFuZCgpIC8vIHVua25vd24gZGV2aWNlIHR5cGU9JTA0WCAhXG4iLCAKLQkJCQkJCQkJCQkJbWNpRHJ2W3dEZXZJRF0ud1R5cGUpOwotCQkJCX0KLQkJfQotCXJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOworICAgIEhEUlZSMTYgaERydiA9IDA7CisgICAgZHByaW50Zl9tY2koc3RkZGViLCAibWNpU2VuZENvbW1hbmQoJTA0WCwgJXMsICUwOGxYLCAlMDhsWClcbiIsIAorICAgICAgICAgICAgICAgIHdEZXZJRCwgX21jaUNvbW1hbmRUb1N0cmluZyh3TXNnKSwgZHdQYXJhbTEsIGR3UGFyYW0yKTsKKyAgICBzd2l0Y2god01zZykKKyAgICB7CisgICAgY2FzZSBNQ0lfT1BFTjoKKyAgICAgICAgcmV0dXJuIG1jaU9wZW4oZHdQYXJhbTEsIChMUE1DSV9PUEVOX1BBUk1TKWR3UGFyYW0yKTsKKyAgICBjYXNlIE1DSV9DTE9TRToKKyAgICAgICAgcmV0dXJuIG1jaUNsb3NlKCB3RGV2SUQsIGR3UGFyYW0xLAorICAgICAgICAgICAgICAgICAgICAgICAgIChMUE1DSV9HRU5FUklDX1BBUk1TKVBUUl9TRUdfVE9fTElOKGR3UGFyYW0yKSk7CisgICAgY2FzZSBNQ0lfU1lTSU5GTzoKKyAgICAgICAgcmV0dXJuIG1jaVN5c0luZm8oIGR3UGFyYW0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQTUNJX1NZU0lORk9fUEFSTVMpUFRSX1NFR19UT19MSU4oZHdQYXJhbTIpKTsKKyAgICBkZWZhdWx0OgorICAgICAgICBzd2l0Y2goR2V0RHJ2KHdEZXZJRCktPndUeXBlKQorICAgICAgICB7CisgICAgICAgIGNhc2UgTUNJX0RFVlRZUEVfQ0RfQVVESU86CisgICAgICAgICAgICByZXR1cm4gQ0RBVURJT19Ecml2ZXJQcm9jKEdldERydih3RGV2SUQpLT53RGV2aWNlSUQsIGhEcnYsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3TXNnLCBkd1BhcmFtMSwgZHdQYXJhbTIpOworICAgICAgICBjYXNlIE1DSV9ERVZUWVBFX1dBVkVGT1JNX0FVRElPOgorICAgICAgICAgICAgcmV0dXJuIFdBVkVfRHJpdmVyUHJvYyhHZXREcnYod0RldklEKS0+d0RldmljZUlELCBoRHJ2LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd01zZywgZHdQYXJhbTEsIGR3UGFyYW0yKTsKKyAgICAgICAgY2FzZSBNQ0lfREVWVFlQRV9TRVFVRU5DRVI6CisgICAgICAgICAgICByZXR1cm4gTUlESV9Ecml2ZXJQcm9jKEdldERydih3RGV2SUQpLT53RGV2aWNlSUQsIGhEcnYsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3TXNnLCBkd1BhcmFtMSwgZHdQYXJhbTIpOworICAgICAgICBjYXNlIE1DSV9ERVZUWVBFX0FOSU1BVElPTjoKKyAgICAgICAgICAgIHJldHVybiBBTklNX0RyaXZlclByb2MoR2V0RHJ2KHdEZXZJRCktPndEZXZpY2VJRCwgaERydiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdNc2csIGR3UGFyYW0xLCBkd1BhcmFtMik7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBkcHJpbnRmX21jaShzdGRkZWIsCisgICAgICAgICAgICAgICAgICAgICAgICAibWNpU2VuZENvbW1hbmQoKSAvLyB1bmtub3duIGRldmljZSB0eXBlPSUwNFggIVxuIiwgCisgICAgICAgICAgICAgICAgICAgICAgICBHZXREcnYod0RldklEKS0+d1R5cGUpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1jaUdldERldmljZUlECSAgICAgICAJW01NU1lTVEVNLjcwM10KICovCi1VSU5UIG1jaUdldERldmljZUlEIChMUENTVFIgbHBzdHJOYW1lKQorVUlOVDE2IG1jaUdldERldmljZUlEIChMUENTVFIgbHBzdHJOYW1lKQogewotICAgIGRwcmludGZfbWNpKHN0ZGRlYiwgIm1jaUdldERldmljZUlEKCVzKVxuIiwgbHBzdHJOYW1lKTsKKyAgICBVSU5UMTYgd0RldklEOworCisgICAgZHByaW50Zl9tY2koc3RkZGViLCAibWNpR2V0RGV2aWNlSUQoXCIlc1wiKVxuIiwgbHBzdHJOYW1lKTsKICAgICBpZiAobHBzdHJOYW1lICYmICFsc3RyY21waTMyQShscHN0ck5hbWUsICJBTEwiKSkKICAgICAgICAgcmV0dXJuIE1DSV9BTExfREVWSUNFX0lEOworCisgICAgaWYgKCFscHN0ck5hbWUpCisJcmV0dXJuIDA7CisKKyAgICB3RGV2SUQgPSBNTVNZU1RFTV9GaXJzdERldklEKCk7CisgICAgd2hpbGUoR2V0RHJ2KHdEZXZJRCktPndUeXBlKSB7CisJaWYgKEdldE9wZW5EcnYod0RldklEKS0+bHBzdHJEZXZpY2VUeXBlICYmIAorICAgICAgICAgICAgc3RyY21wKFBUUl9TRUdfVE9fTElOKEdldE9wZW5EcnYod0RldklEKS0+bHBzdHJEZXZpY2VUeXBlKSwgbHBzdHJOYW1lKSA9PSAwKQorCSAgICByZXR1cm4gd0RldklEOworCisJaWYgKEdldE9wZW5EcnYod0RldklEKS0+bHBzdHJBbGlhcyAmJiAKKyAgICAgICAgICAgIHN0cmNtcChQVFJfU0VHX1RPX0xJTihHZXRPcGVuRHJ2KHdEZXZJRCktPmxwc3RyQWxpYXMpLCBscHN0ck5hbWUpID09IDApCisJICAgIHJldHVybiB3RGV2SUQ7CisKKwl3RGV2SUQgPSBNTVNZU1RFTV9OZXh0RGV2SUQod0RldklEKTsKKyAgICB9CisKICAgICByZXR1cm4gMDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltY2lTZXRZaWVsZFByb2MJCVtNTVNZU1RFTS43MTRdCiAqLwotQk9PTCBtY2lTZXRZaWVsZFByb2MgKFVJTlQgdURldmljZUlELCAKK0JPT0wxNiBtY2lTZXRZaWVsZFByb2MgKFVJTlQxNiB1RGV2aWNlSUQsIAogCQlZSUVMRFBST0MgZnBZaWVsZFByb2MsIERXT1JEIGR3WWllbGREYXRhKQogewogICAgIHJldHVybiBGQUxTRTsKQEAgLTg0NSw3ICs5NDcsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltY2lHZXREZXZpY2VJREZyb21FbGVtZW50SUQJW01NU1lTVEVNLjcxNV0KICovCi1VSU5UIG1jaUdldERldmljZUlERnJvbUVsZW1lbnRJRChEV09SRCBkd0VsZW1lbnRJRCwgTFBDU1RSIGxwc3RyVHlwZSkKK1VJTlQxNiBtY2lHZXREZXZpY2VJREZyb21FbGVtZW50SUQoRFdPUkQgZHdFbGVtZW50SUQsIExQQ1NUUiBscHN0clR5cGUpCiB7CiAgICAgcmV0dXJuIDA7CiB9CkBAIC04NTMsNyArOTU1LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbWNpR2V0WWllbGRQcm9jCQlbTU1TWVNURU0uNzE2XQogKi8KLVlJRUxEUFJPQyBtY2lHZXRZaWVsZFByb2MoVUlOVCB1RGV2aWNlSUQsIERXT1JEICogbHBkd1lpZWxkRGF0YSkKK1lJRUxEUFJPQyBtY2lHZXRZaWVsZFByb2MoVUlOVDE2IHVEZXZpY2VJRCwgRFdPUkQgKiBscGR3WWllbGREYXRhKQogewogICAgIHJldHVybiBOVUxMOwogfQpAQCAtODYxLDcgKzk2Myw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1jaUdldENyZWF0b3JUYXNrCVtNTVNZU1RFTS43MTddCiAqLwotSFRBU0sxNiBtY2lHZXRDcmVhdG9yVGFzayhVSU5UIHVEZXZpY2VJRCkKK0hUQVNLMTYgbWNpR2V0Q3JlYXRvclRhc2soVUlOVDE2IHVEZXZpY2VJRCkKIHsKICAgICByZXR1cm4gMDsKIH0KQEAgLTg2OSw5ICs5NzEsOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltaWRpT3V0R2V0TnVtRGV2cwlbTU1TWVNURU0uMjAxXQogKi8KLVVJTlQgbWlkaU91dEdldE51bURldnModm9pZCkKK1VJTlQxNiBtaWRpT3V0R2V0TnVtRGV2cyh2b2lkKQogewotCVVJTlQJY291bnQgPSAwOworCVVJTlQxNgljb3VudCA9IDA7CiAJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJtaWRpT3V0R2V0TnVtRGV2c1xuIik7CiAJY291bnQgKz0gbW9kTWVzc2FnZSgwLCBNT0RNX0dFVE5VTURFVlMsIDBMLCAwTCwgMEwpOwogCWRwcmludGZfbW1zeXMoc3RkZGViLCAibWlkaU91dEdldE51bURldnMgcmV0dXJuICV1IFxuIiwgY291bnQpOwpAQCAtODgxLDcgKzk4Myw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1pZGlPdXRHZXREZXZDYXBzCVtNTVNZU1RFTS4yMDJdCiAqLwotVUlOVCBtaWRpT3V0R2V0RGV2Q2FwcyhVSU5UIHVEZXZpY2VJRCwgTUlESU9VVENBUFMgKiBscENhcHMsIFVJTlQgdVNpemUpCitVSU5UMTYgbWlkaU91dEdldERldkNhcHMoVUlOVDE2IHVEZXZpY2VJRCwgTUlESU9VVENBUFMgKiBscENhcHMsIFVJTlQxNiB1U2l6ZSkKIHsKIAlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIm1pZGlPdXRHZXREZXZDYXBzXG4iKTsKIAlyZXR1cm4gMDsKQEAgLTg5MCw3ICs5OTIsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltaWRpT3V0R2V0RXJyb3JUZXh0IAlbTU1TWVNURU0uMjAzXQogKi8KLVVJTlQgbWlkaU91dEdldEVycm9yVGV4dChVSU5UIHVFcnJvciwgTFBTVFIgbHBUZXh0LCBVSU5UIHVTaXplKQorVUlOVDE2IG1pZGlPdXRHZXRFcnJvclRleHQoVUlOVDE2IHVFcnJvciwgTFBTVFIgbHBUZXh0LCBVSU5UMTYgdVNpemUpCiB7CiAJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJtaWRpT3V0R2V0RXJyb3JUZXh0XG4iKTsKIAlyZXR1cm4gbWlkaUdldEVycm9yVGV4dCh1RXJyb3IsIGxwVGV4dCwgdVNpemUpOwpAQCAtOTAwLDcgKzEwMDIsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltaWRpR2V0RXJyb3JUZXh0ICAgICAgIAlbaW50ZXJuYWxdCiAqLwotVUlOVCBtaWRpR2V0RXJyb3JUZXh0KFVJTlQgdUVycm9yLCBMUFNUUiBscFRleHQsIFVJTlQgdVNpemUpCitVSU5UMTYgbWlkaUdldEVycm9yVGV4dChVSU5UMTYgdUVycm9yLCBMUFNUUiBscFRleHQsIFVJTlQxNiB1U2l6ZSkKIHsKIAlMUFNUUgltc2dwdHI7CiAJaWYgKChscFRleHQgPT0gTlVMTCkgfHwgKHVTaXplIDwgMSkpIHJldHVybihGQUxTRSk7CkBAIC05NDUsMTggKzEwNDcsMTggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbWlkaU91dE9wZW4gICAgCQlbTU1TWVNURU0uMjA0XQogKi8KLVVJTlQgbWlkaU91dE9wZW4oSE1JRElPVVQxNiAqIGxwaE1pZGlPdXQsIFVJTlQgdURldmljZUlELAorVUlOVDE2IG1pZGlPdXRPcGVuKEhNSURJT1VUMTYgKiBscGhNaWRpT3V0LCBVSU5UMTYgdURldmljZUlELAogCQkgRFdPUkQgZHdDYWxsYmFjaywgRFdPUkQgZHdJbnN0YW5jZSwgRFdPUkQgZHdGbGFncykKIHsKIAlITUlESTE2CWhNaWRpT3V0OwogCUxQTUlESU9QRU5ERVNDCWxwRGVzYzsKIAlMUE1JRElPUEVOREVTQwlscDE2RGVzYzsKIAlEV09SRAlkd1JldCA9IDA7Ci0JQk9PTAliTWFwcGVyRmxnID0gRkFMU0U7CisJQk9PTDMyCWJNYXBwZXJGbGcgPSBGQUxTRTsKIAlpZiAobHBoTWlkaU91dCAhPSBOVUxMKSAqbHBoTWlkaU91dCA9IDA7CiAJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJtaWRpT3V0T3BlbiglcCwgJWQsICUwOGxYLCAlMDhsWCwgJTA4bFgpO1xuIiwgCiAJCWxwaE1pZGlPdXQsIHVEZXZpY2VJRCwgZHdDYWxsYmFjaywgZHdJbnN0YW5jZSwgZHdGbGFncyk7Ci0JaWYgKHVEZXZpY2VJRCA9PSAoVUlOVClNSURJX01BUFBFUikgeworCWlmICh1RGV2aWNlSUQgPT0gKFVJTlQxNilNSURJX01BUFBFUikgewogCQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIm1pZGlPdXRPcGVuCS8vIE1JRElfTUFQUEVSIG1vZGUgcmVxdWVzdGVkICFcbiIpOwogCQliTWFwcGVyRmxnID0gVFJVRTsKIAkJdURldmljZUlEID0gMDsKQEAgLTk4Myw3ICsxMDg1LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbWlkaU91dENsb3NlCQlbTU1TWVNURU0uMjA1XQogKi8KLVVJTlQgbWlkaU91dENsb3NlKEhNSURJT1VUMTYgaE1pZGlPdXQpCitVSU5UMTYgbWlkaU91dENsb3NlKEhNSURJT1VUMTYgaE1pZGlPdXQpCiB7CiAJTFBNSURJT1BFTkRFU0MJbHBEZXNjOwogCWRwcmludGZfbW1zeXMoc3RkZGViLCAibWlkaU91dENsb3NlKCUwNFgpXG4iLCBoTWlkaU91dCk7CkBAIC05OTUsOCArMTA5Nyw4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1pZGlPdXRQcmVwYXJlSGVhZGVyCVtNTVNZU1RFTS4yMDZdCiAqLwotVUlOVCBtaWRpT3V0UHJlcGFyZUhlYWRlcihITUlESU9VVDE2IGhNaWRpT3V0LAotICAgIE1JRElIRFIgKiBscE1pZGlPdXRIZHIsIFVJTlQgdVNpemUpCitVSU5UMTYgbWlkaU91dFByZXBhcmVIZWFkZXIoSE1JRElPVVQxNiBoTWlkaU91dCwKKyAgICBNSURJSERSICogbHBNaWRpT3V0SGRyLCBVSU5UMTYgdVNpemUpCiB7CiAJTFBNSURJT1BFTkRFU0MJbHBEZXNjOwogCWRwcmludGZfbW1zeXMoc3RkZGViLCAibWlkaU91dFByZXBhcmVIZWFkZXIoJTA0WCwgJXAsICVkKVxuIiwgCkBAIC0xMDEwLDggKzExMTIsOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltaWRpT3V0VW5wcmVwYXJlSGVhZGVyCVtNTVNZU1RFTS4yMDddCiAqLwotVUlOVCBtaWRpT3V0VW5wcmVwYXJlSGVhZGVyKEhNSURJT1VUMTYgaE1pZGlPdXQsCi0gICAgTUlESUhEUiAqIGxwTWlkaU91dEhkciwgVUlOVCB1U2l6ZSkKK1VJTlQxNiBtaWRpT3V0VW5wcmVwYXJlSGVhZGVyKEhNSURJT1VUMTYgaE1pZGlPdXQsCisgICAgTUlESUhEUiAqIGxwTWlkaU91dEhkciwgVUlOVDE2IHVTaXplKQogewogCUxQTUlESU9QRU5ERVNDCWxwRGVzYzsKIAlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIm1pZGlPdXRVbnByZXBhcmVIZWFkZXIoJTA0WCwgJXAsICVkKVxuIiwgCkBAIC0xMDI1LDcgKzExMjcsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltaWRpT3V0U2hvcnRNc2cJCVtNTVNZU1RFTS4yMDhdCiAqLwotVUlOVCBtaWRpT3V0U2hvcnRNc2coSE1JRElPVVQxNiBoTWlkaU91dCwgRFdPUkQgZHdNc2cpCitVSU5UMTYgbWlkaU91dFNob3J0TXNnKEhNSURJT1VUMTYgaE1pZGlPdXQsIERXT1JEIGR3TXNnKQogewogCUxQTUlESU9QRU5ERVNDCWxwRGVzYzsKIAlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIm1pZGlPdXRTaG9ydE1zZyglMDRYLCAlMDhsWClcbiIsIGhNaWRpT3V0LCBkd01zZyk7CkBAIC0xMDM3LDggKzExMzksOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltaWRpT3V0TG9uZ01zZwkJW01NU1lTVEVNLjIwOV0KICovCi1VSU5UIG1pZGlPdXRMb25nTXNnKEhNSURJT1VUMTYgaE1pZGlPdXQsCi0gICAgTUlESUhEUiAqIGxwTWlkaU91dEhkciwgVUlOVCB1U2l6ZSkKK1VJTlQxNiBtaWRpT3V0TG9uZ01zZyhITUlESU9VVDE2IGhNaWRpT3V0LAorICAgIE1JRElIRFIgKiBscE1pZGlPdXRIZHIsIFVJTlQxNiB1U2l6ZSkKIHsKIAlMUE1JRElPUEVOREVTQwlscERlc2M7CiAJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJtaWRpT3V0TG9uZ01zZyglMDRYLCAlcCwgJWQpXG4iLCAKQEAgLTEwNTIsNyArMTE1NCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1pZGlPdXRSZXNldAkJW01NU1lTVEVNLjIxMF0KICovCi1VSU5UIG1pZGlPdXRSZXNldChITUlESU9VVDE2IGhNaWRpT3V0KQorVUlOVDE2IG1pZGlPdXRSZXNldChITUlESU9VVDE2IGhNaWRpT3V0KQogewogCUxQTUlESU9QRU5ERVNDCWxwRGVzYzsKIAlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIm1pZGlPdXRSZXNldCglMDRYKVxuIiwgaE1pZGlPdXQpOwpAQCAtMTA2NCw3ICsxMTY2LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbWlkaU91dEdldFZvbHVtZQlbTU1TWVNURU0uMjExXQogKi8KLVVJTlQgbWlkaU91dEdldFZvbHVtZShVSU5UIHVEZXZpY2VJRCwgRFdPUkQgKiBscGR3Vm9sdW1lKQorVUlOVDE2IG1pZGlPdXRHZXRWb2x1bWUoVUlOVDE2IHVEZXZpY2VJRCwgRFdPUkQgKiBscGR3Vm9sdW1lKQogewogCWRwcmludGZfbW1zeXMoc3RkZGViLCAibWlkaU91dEdldFZvbHVtZSglMDRYLCAlcCk7XG4iLCB1RGV2aWNlSUQsIGxwZHdWb2x1bWUpOwogCXJldHVybiBtb2RNZXNzYWdlKHVEZXZpY2VJRCwgTU9ETV9HRVRWT0xVTUUsIDBMLCAoRFdPUkQpbHBkd1ZvbHVtZSwgMEwpOwpAQCAtMTA3NCw3ICsxMTc2LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbWlkaU91dFNldFZvbHVtZQlbTU1TWVNURU0uMjEyXQogKi8KLVVJTlQgbWlkaU91dFNldFZvbHVtZShVSU5UIHVEZXZpY2VJRCwgRFdPUkQgZHdWb2x1bWUpCitVSU5UMTYgbWlkaU91dFNldFZvbHVtZShVSU5UMTYgdURldmljZUlELCBEV09SRCBkd1ZvbHVtZSkKIHsKIAlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIm1pZGlPdXRTZXRWb2x1bWUoJTA0WCwgJTA4bFgpO1xuIiwgdURldmljZUlELCBkd1ZvbHVtZSk7CiAJcmV0dXJuIG1vZE1lc3NhZ2UodURldmljZUlELCBNT0RNX1NFVFZPTFVNRSwgMEwsIGR3Vm9sdW1lLCAwTCk7CkBAIC0xMDg0LDggKzExODYsOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltaWRpT3V0Q2FjaGVQYXRjaGVzCQlbTU1TWVNURU0uMjEzXQogKi8KLVVJTlQgbWlkaU91dENhY2hlUGF0Y2hlcyhITUlESU9VVDE2IGhNaWRpT3V0LAotICAgIFVJTlQgdUJhbmssIFdPUkQgKiBscHdQYXRjaEFycmF5LCBVSU5UIHVGbGFncykKK1VJTlQxNiBtaWRpT3V0Q2FjaGVQYXRjaGVzKEhNSURJT1VUMTYgaE1pZGlPdXQsCisgICAgVUlOVDE2IHVCYW5rLCBXT1JEICogbHB3UGF0Y2hBcnJheSwgVUlOVDE2IHVGbGFncykKIHsKICAgICAgICAgLyogbm90IHJlYWxseSBuZWNlc3NhcnkgdG8gc3VwcG9ydCB0aGlzICovCiAJZnByaW50ZihzdGRuaW1wLCAibWlkaU91dENhY2hlUGF0Y2hlczogbm90IHN1cHBvcnRlZCB5ZXRcbiIpOwpAQCAtMTA5NSw4ICsxMTk3LDggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbWlkaU91dENhY2hlRHJ1bVBhdGNoZXMJW01NU1lTVEVNLjIxNF0KICovCi1VSU5UIG1pZGlPdXRDYWNoZURydW1QYXRjaGVzKEhNSURJT1VUMTYgaE1pZGlPdXQsCi0gICAgVUlOVCB1UGF0Y2gsIFdPUkQgKiBscHdLZXlBcnJheSwgVUlOVCB1RmxhZ3MpCitVSU5UMTYgbWlkaU91dENhY2hlRHJ1bVBhdGNoZXMoSE1JRElPVVQxNiBoTWlkaU91dCwKKyAgICBVSU5UMTYgdVBhdGNoLCBXT1JEICogbHB3S2V5QXJyYXksIFVJTlQxNiB1RmxhZ3MpCiB7CiAJZnByaW50ZihzdGRuaW1wLCAibWlkaU91dENhY2hlRHJ1bVBhdGNoZXNpOiBub3Qgc3VwcG9ydGVkIHlldFxuIik7CiAJcmV0dXJuIE1NU1lTRVJSX05PVFNVUFBPUlRFRDsKQEAgLTExMDUsNyArMTIwNyw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1pZGlPdXRHZXRJRAkJW01NU1lTVEVNLjIxNV0KICovCi1VSU5UIG1pZGlPdXRHZXRJRChITUlESU9VVDE2IGhNaWRpT3V0LCBVSU5UICogbHB1RGV2aWNlSUQpCitVSU5UMTYgbWlkaU91dEdldElEKEhNSURJT1VUMTYgaE1pZGlPdXQsIFVJTlQxNiAqIGxwdURldmljZUlEKQogewogCWRwcmludGZfbW1zeXMoc3RkZGViLCAibWlkaU91dEdldElEXG4iKTsKIAlyZXR1cm4gMDsKQEAgLTExMTQsNyArMTIxNiw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1pZGlPdXRNZXNzYWdlCQlbTU1TWVNURU0uMjE2XQogKi8KLURXT1JEIG1pZGlPdXRNZXNzYWdlKEhNSURJT1VUMTYgaE1pZGlPdXQsIFVJTlQgdU1lc3NhZ2UsIAorRFdPUkQgbWlkaU91dE1lc3NhZ2UoSE1JRElPVVQxNiBoTWlkaU91dCwgVUlOVDE2IHVNZXNzYWdlLCAKIAkJCQkJCURXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMikKIHsKIAlMUE1JRElPUEVOREVTQwlscERlc2M7CkBAIC0xMTI5LDkgKzEyMzEsOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltaWRpSW5HZXROdW1EZXZzCVtNTVNZU1RFTS4zMDFdCiAqLwotVUlOVCBtaWRpSW5HZXROdW1EZXZzKHZvaWQpCitVSU5UMTYgbWlkaUluR2V0TnVtRGV2cyh2b2lkKQogewotCVVJTlQJY291bnQgPSAwOworCVVJTlQxNgljb3VudCA9IDA7CiAJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJtaWRpSW5HZXROdW1EZXZzXG4iKTsKIAljb3VudCArPSBtaWRNZXNzYWdlKDAsIE1JRE1fR0VUTlVNREVWUywgMEwsIDBMLCAwTCk7CiAJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJtaWRpSW5HZXROdW1EZXZzIHJldHVybiAldSBcbiIsIGNvdW50KTsKQEAgLTExNDEsOCArMTI0Myw4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1pZGlJbkdldERldkNhcHMJW01NU1lTVEVNLjMwMl0KICovCi1VSU5UIG1pZGlJbkdldERldkNhcHMoVUlOVCB1RGV2aWNlSUQsCi0gICAgTFBNSURJSU5DQVBTIGxwQ2FwcywgVUlOVCB1U2l6ZSkKK1VJTlQxNiBtaWRpSW5HZXREZXZDYXBzKFVJTlQxNiB1RGV2aWNlSUQsCisgICAgTFBNSURJSU5DQVBTIGxwQ2FwcywgVUlOVDE2IHVTaXplKQogewogCWRwcmludGZfbW1zeXMoc3RkZGViLCAibWlkaUluR2V0RGV2Q2Fwc1xuIik7CiAJcmV0dXJuIDA7CkBAIC0xMTUxLDcgKzEyNTMsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltaWRpSW5HZXRFcnJvclRleHQgCQlbTU1TWVNURU0uMzAzXQogKi8KLVVJTlQgbWlkaUluR2V0RXJyb3JUZXh0KFVJTlQgdUVycm9yLCBMUFNUUiBscFRleHQsIFVJTlQgdVNpemUpCitVSU5UMTYgbWlkaUluR2V0RXJyb3JUZXh0KFVJTlQxNiB1RXJyb3IsIExQU1RSIGxwVGV4dCwgVUlOVDE2IHVTaXplKQogewogCWRwcmludGZfbW1zeXMoc3RkZGViLCAibWlkaUluR2V0RXJyb3JUZXh0XG4iKTsKIAlyZXR1cm4gKG1pZGlHZXRFcnJvclRleHQodUVycm9yLCBscFRleHQsIHVTaXplKSk7CkBAIC0xMTYwLDE4ICsxMjYyLDE4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1pZGlJbk9wZW4JCVtNTVNZU1RFTS4zMDRdCiAqLwotVUlOVCBtaWRpSW5PcGVuKEhNSURJSU4xNiAqIGxwaE1pZGlJbiwgVUlOVCB1RGV2aWNlSUQsCitVSU5UMTYgbWlkaUluT3BlbihITUlESUlOMTYgKiBscGhNaWRpSW4sIFVJTlQxNiB1RGV2aWNlSUQsCiAgICAgRFdPUkQgZHdDYWxsYmFjaywgRFdPUkQgZHdJbnN0YW5jZSwgRFdPUkQgZHdGbGFncykKIHsKIAlITUlESTE2CWhNaWRpSW47CiAJTFBNSURJT1BFTkRFU0MJbHBEZXNjOwogCUxQTUlESU9QRU5ERVNDCWxwMTZEZXNjOwogCURXT1JECWR3UmV0ID0gMDsKLQlCT09MCWJNYXBwZXJGbGcgPSBGQUxTRTsKKwlCT09MMzIJYk1hcHBlckZsZyA9IEZBTFNFOwogCWlmIChscGhNaWRpSW4gIT0gTlVMTCkgKmxwaE1pZGlJbiA9IDA7CiAJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJtaWRpSW5PcGVuKCVwLCAlZCwgJTA4bFgsICUwOGxYLCAlMDhsWCk7XG4iLCAKIAkJbHBoTWlkaUluLCB1RGV2aWNlSUQsIGR3Q2FsbGJhY2ssIGR3SW5zdGFuY2UsIGR3RmxhZ3MpOwotCWlmICh1RGV2aWNlSUQgPT0gKFVJTlQpTUlESV9NQVBQRVIpIHsKKwlpZiAodURldmljZUlEID09IChVSU5UMTYpTUlESV9NQVBQRVIpIHsKIAkJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJtaWRpSW5PcGVuCS8vIE1JRElfTUFQUEVSIG1vZGUgcmVxdWVzdGVkICFcbiIpOwogCQliTWFwcGVyRmxnID0gVFJVRTsKIAkJdURldmljZUlEID0gMDsKQEAgLTExOTgsNyArMTMwMCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1pZGlJbkNsb3NlCQlbTU1TWVNURU0uMzA1XQogKi8KLVVJTlQgbWlkaUluQ2xvc2UoSE1JRElJTjE2IGhNaWRpSW4pCitVSU5UMTYgbWlkaUluQ2xvc2UoSE1JRElJTjE2IGhNaWRpSW4pCiB7CiAJTFBNSURJT1BFTkRFU0MJbHBEZXNjOwogCWRwcmludGZfbW1zeXMoc3RkZGViLCAibWlkaUluQ2xvc2UoJTA0WClcbiIsIGhNaWRpSW4pOwpAQCAtMTIxMCw4ICsxMzEyLDggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbWlkaUluUHJlcGFyZUhlYWRlcglbTU1TWVNURU0uMzA2XQogKi8KLVVJTlQgbWlkaUluUHJlcGFyZUhlYWRlcihITUlESUlOMTYgaE1pZGlJbiwKLSAgICBNSURJSERSICogbHBNaWRpSW5IZHIsIFVJTlQgdVNpemUpCitVSU5UMTYgbWlkaUluUHJlcGFyZUhlYWRlcihITUlESUlOMTYgaE1pZGlJbiwKKyAgICBNSURJSERSICogbHBNaWRpSW5IZHIsIFVJTlQxNiB1U2l6ZSkKIHsKIAlMUE1JRElPUEVOREVTQwlscERlc2M7CiAJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJtaWRpSW5QcmVwYXJlSGVhZGVyKCUwNFgsICVwLCAlZClcbiIsIApAQCAtMTIyNSw4ICsxMzI3LDggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbWlkaUluVW5wcmVwYXJlSGVhZGVyCVtNTVNZU1RFTS4zMDddCiAqLwotVUlOVCBtaWRpSW5VbnByZXBhcmVIZWFkZXIoSE1JRElJTjE2IGhNaWRpSW4sCi0gICAgTUlESUhEUiAqIGxwTWlkaUluSGRyLCBVSU5UIHVTaXplKQorVUlOVDE2IG1pZGlJblVucHJlcGFyZUhlYWRlcihITUlESUlOMTYgaE1pZGlJbiwKKyAgICBNSURJSERSICogbHBNaWRpSW5IZHIsIFVJTlQxNiB1U2l6ZSkKIHsKIAlMUE1JRElPUEVOREVTQwlscERlc2M7CiAJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJtaWRpSW5VbnByZXBhcmVIZWFkZXIoJTA0WCwgJXAsICVkKVxuIiwgCkBAIC0xMjQwLDggKzEzNDIsOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltaWRpSW5BZGRCdWZmZXIJCVtNTVNZU1RFTS4zMDhdCiAqLwotVUlOVCBtaWRpSW5BZGRCdWZmZXIoSE1JRElJTjE2IGhNaWRpSW4sCi0gICAgTUlESUhEUiAqIGxwTWlkaUluSGRyLCBVSU5UIHVTaXplKQorVUlOVDE2IG1pZGlJbkFkZEJ1ZmZlcihITUlESUlOMTYgaE1pZGlJbiwKKyAgICBNSURJSERSICogbHBNaWRpSW5IZHIsIFVJTlQxNiB1U2l6ZSkKIHsKIAlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIm1pZGlJbkFkZEJ1ZmZlclxuIik7CiAJcmV0dXJuIDA7CkBAIC0xMjUwLDcgKzEzNTIsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltaWRpSW5TdGFydAkJCVtNTVNZU1RFTS4zMDldCiAqLwotVUlOVCBtaWRpSW5TdGFydChITUlESUlOMTYgaE1pZGlJbikKK1VJTlQxNiBtaWRpSW5TdGFydChITUlESUlOMTYgaE1pZGlJbikKIHsKIAlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIm1pZGlJblN0YXJ0XG4iKTsKIAlyZXR1cm4gMDsKQEAgLTEyNTksNyArMTM2MSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1pZGlJblN0b3AJCQlbTU1TWVNURU0uMzEwXQogKi8KLVVJTlQgbWlkaUluU3RvcChITUlESUlOMTYgaE1pZGlJbikKK1VJTlQxNiBtaWRpSW5TdG9wKEhNSURJSU4xNiBoTWlkaUluKQogewogCWRwcmludGZfbW1zeXMoc3RkZGViLCAibWlkaUluU3RvcFxuIik7CiAJcmV0dXJuIDA7CkBAIC0xMjY4LDcgKzEzNzAsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltaWRpSW5SZXNldAkJCVtNTVNZU1RFTS4zMTFdCiAqLwotVUlOVCBtaWRpSW5SZXNldChITUlESUlOMTYgaE1pZGlJbikKK1VJTlQxNiBtaWRpSW5SZXNldChITUlESUlOMTYgaE1pZGlJbikKIHsKIAlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIm1pZGlJblJlc2V0XG4iKTsKIAlyZXR1cm4gMDsKQEAgLTEyNzcsNyArMTM3OSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1pZGlJbkdldElECQkJW01NU1lTVEVNLjMxMl0KICovCi1VSU5UIG1pZGlJbkdldElEKEhNSURJSU4xNiBoTWlkaUluLCBVSU5UICogbHB1RGV2aWNlSUQpCitVSU5UMTYgbWlkaUluR2V0SUQoSE1JRElJTjE2IGhNaWRpSW4sIFVJTlQxNiAqIGxwdURldmljZUlEKQogewogCWRwcmludGZfbW1zeXMoc3RkZGViLCAibWlkaUluR2V0SURcbiIpOwogCXJldHVybiAwOwpAQCAtMTI4Niw3ICsxMzg4LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbWlkaUluTWVzc2FnZQkJW01NU1lTVEVNLjMxM10KICovCi1EV09SRCBtaWRpSW5NZXNzYWdlKEhNSURJSU4xNiBoTWlkaUluLCBVSU5UIHVNZXNzYWdlLCAKK0RXT1JEIG1pZGlJbk1lc3NhZ2UoSE1JRElJTjE2IGhNaWRpSW4sIFVJTlQxNiB1TWVzc2FnZSwgCiAJCQkJCQkJRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yKQogewogCUxQTUlESU9QRU5ERVNDCWxwRGVzYzsKQEAgLTEzMDEsOSArMTQwMyw5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCXdhdmVPdXRHZXROdW1EZXZzCQlbTU1TWVNURU0uNDAxXQogKi8KLVVJTlQgd2F2ZU91dEdldE51bURldnMoKQorVUlOVDE2IHdhdmVPdXRHZXROdW1EZXZzKCkKIHsKLQlVSU5UCWNvdW50ID0gMDsKKwlVSU5UMTYJY291bnQgPSAwOwogCWRwcmludGZfbW1zeXMoc3RkZGViLCAid2F2ZU91dEdldE51bURldnNcbiIpOwogCWNvdW50ICs9IHdvZE1lc3NhZ2UoMCwgV09ETV9HRVROVU1ERVZTLCAwTCwgMEwsIDBMKTsKIAlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIndhdmVPdXRHZXROdW1EZXZzIHJldHVybiAldSBcbiIsIGNvdW50KTsKQEAgLTEzMTMsNyArMTQxNSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCXdhdmVPdXRHZXREZXZDYXBzCQlbTU1TWVNURU0uNDAyXQogKi8KLVVJTlQgd2F2ZU91dEdldERldkNhcHMoVUlOVCB1RGV2aWNlSUQsIFdBVkVPVVRDQVBTICogbHBDYXBzLCBVSU5UIHVTaXplKQorVUlOVDE2IHdhdmVPdXRHZXREZXZDYXBzKFVJTlQxNiB1RGV2aWNlSUQsIFdBVkVPVVRDQVBTICogbHBDYXBzLCBVSU5UMTYgdVNpemUpCiB7CiAJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJ3YXZlT3V0R2V0RGV2Q2Fwc1xuIik7CiAJcmV0dXJuIHdvZE1lc3NhZ2UodURldmljZUlELCBXT0RNX0dFVERFVkNBUFMsIDBMLCAoRFdPUkQpbHBDYXBzLCB1U2l6ZSk7CkBAIC0xMzIyLDcgKzE0MjQsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQl3YXZlT3V0R2V0RXJyb3JUZXh0IAlbTU1TWVNURU0uNDAzXQogKi8KLVVJTlQgd2F2ZU91dEdldEVycm9yVGV4dChVSU5UIHVFcnJvciwgTFBTVFIgbHBUZXh0LCBVSU5UIHVTaXplKQorVUlOVDE2IHdhdmVPdXRHZXRFcnJvclRleHQoVUlOVDE2IHVFcnJvciwgTFBTVFIgbHBUZXh0LCBVSU5UMTYgdVNpemUpCiB7CiAgICBkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIndhdmVPdXRHZXRFcnJvclRleHRcbiIpOwogICAgcmV0dXJuKHdhdmVHZXRFcnJvclRleHQodUVycm9yLCBscFRleHQsIHVTaXplKSk7CkBAIC0xMzMyLDcgKzE0MzQsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQl3YXZlR2V0RXJyb3JUZXh0IAkJW2ludGVybmFsXQogKi8KLVVJTlQgd2F2ZUdldEVycm9yVGV4dChVSU5UIHVFcnJvciwgTFBTVFIgbHBUZXh0LCBVSU5UIHVTaXplKQorVUlOVDE2IHdhdmVHZXRFcnJvclRleHQoVUlOVDE2IHVFcnJvciwgTFBTVFIgbHBUZXh0LCBVSU5UMTYgdVNpemUpCiB7CiAJTFBTVFIJbXNncHRyOwogCWRwcmludGZfbW1zeXMoc3RkZGViLCAid2F2ZUdldEVycm9yVGV4dCglMDRYLCAlcCwgJWQpO1xuIiwgdUVycm9yLCBscFRleHQsIHVTaXplKTsKQEAgLTEzOTgsMjAgKzE1MDAsMjAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJd2F2ZU91dE9wZW4JCQlbTU1TWVNURU0uNDA0XQogKi8KLVVJTlQgd2F2ZU91dE9wZW4oSFdBVkVPVVQxNiAqIGxwaFdhdmVPdXQsIFVJTlQgdURldmljZUlELAorVUlOVDE2IHdhdmVPdXRPcGVuKEhXQVZFT1VUMTYgKiBscGhXYXZlT3V0LCBVSU5UMTYgdURldmljZUlELAogICAgIGNvbnN0IExQV0FWRUZPUk1BVCBscEZvcm1hdCwgRFdPUkQgZHdDYWxsYmFjaywgRFdPUkQgZHdJbnN0YW5jZSwgRFdPUkQgZHdGbGFncykKIHsKIAlIV0FWRU9VVDE2IGhXYXZlT3V0OwogCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsKIAlMUFdBVkVPUEVOREVTQwlscDE2RGVzYzsKIAlEV09SRAlkd1JldCA9IDA7Ci0JQk9PTAliTWFwcGVyRmxnID0gRkFMU0U7CisJQk9PTDMyCWJNYXBwZXJGbGcgPSBGQUxTRTsKIAlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIndhdmVPdXRPcGVuKCVwLCAlZCwgJXAsICUwOGxYLCAlMDhsWCwgJTA4bFgpO1xuIiwgCiAJCWxwaFdhdmVPdXQsIHVEZXZpY2VJRCwgbHBGb3JtYXQsIGR3Q2FsbGJhY2ssIGR3SW5zdGFuY2UsIGR3RmxhZ3MpOwogCWlmIChkd0ZsYWdzICYgV0FWRV9GT1JNQVRfUVVFUlkpIHsKIAkJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJ3YXZlT3V0T3BlbgkvLyBXQVZFX0ZPUk1BVF9RVUVSWSByZXF1ZXN0ZWQgIVxuIik7CiAJCX0KLQlpZiAodURldmljZUlEID09IChVSU5UKVdBVkVfTUFQUEVSKSB7CisJaWYgKHVEZXZpY2VJRCA9PSAoVUlOVDE2KVdBVkVfTUFQUEVSKSB7CiAJCWRwcmludGZfbW1zeXMoc3RkZGViLCAid2F2ZU91dE9wZW4JLy8gV0FWRV9NQVBQRVIgbW9kZSByZXF1ZXN0ZWQgIVxuIik7CiAJCWJNYXBwZXJGbGcgPSBUUlVFOwogCQl1RGV2aWNlSUQgPSAwOwpAQCAtMTQ0NCw3ICsxNTQ2LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJd2F2ZU91dENsb3NlCQlbTU1TWVNURU0uNDA1XQogKi8KLVVJTlQgd2F2ZU91dENsb3NlKEhXQVZFT1VUMTYgaFdhdmVPdXQpCitVSU5UMTYgd2F2ZU91dENsb3NlKEhXQVZFT1VUMTYgaFdhdmVPdXQpCiB7CiAJTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwogCWRwcmludGZfbW1zeXMoc3RkZGViLCAid2F2ZU91dENsb3NlKCUwNFgpXG4iLCBoV2F2ZU91dCk7CkBAIC0xNDU2LDggKzE1NTgsOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQl3YXZlT3V0UHJlcGFyZUhlYWRlcglbTU1TWVNURU0uNDA2XQogKi8KLVVJTlQgd2F2ZU91dFByZXBhcmVIZWFkZXIoSFdBVkVPVVQxNiBoV2F2ZU91dCwKLSAgICAgV0FWRUhEUiAqIGxwV2F2ZU91dEhkciwgVUlOVCB1U2l6ZSkKK1VJTlQxNiB3YXZlT3V0UHJlcGFyZUhlYWRlcihIV0FWRU9VVDE2IGhXYXZlT3V0LAorICAgICBXQVZFSERSICogbHBXYXZlT3V0SGRyLCBVSU5UMTYgdVNpemUpCiB7CiAJTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwogCWRwcmludGZfbW1zeXMoc3RkZGViLCAid2F2ZU91dFByZXBhcmVIZWFkZXIoJTA0WCwgJXAsICV1KTtcbiIsIApAQCAtMTQ3MSw4ICsxNTczLDggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJd2F2ZU91dFVucHJlcGFyZUhlYWRlcglbTU1TWVNURU0uNDA3XQogKi8KLVVJTlQgd2F2ZU91dFVucHJlcGFyZUhlYWRlcihIV0FWRU9VVDE2IGhXYXZlT3V0LAotICAgIFdBVkVIRFIgKiBscFdhdmVPdXRIZHIsIFVJTlQgdVNpemUpCitVSU5UMTYgd2F2ZU91dFVucHJlcGFyZUhlYWRlcihIV0FWRU9VVDE2IGhXYXZlT3V0LAorICAgIFdBVkVIRFIgKiBscFdhdmVPdXRIZHIsIFVJTlQxNiB1U2l6ZSkKIHsKIAlMUFdBVkVPUEVOREVTQwlscERlc2M7CiAJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJ3YXZlT3V0VW5wcmVwYXJlSGVhZGVyKCUwNFgsICVwLCAldSk7XG4iLCAKQEAgLTE0ODYsNyArMTU4OCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCXdhdmVPdXRXcml0ZQkJW01NU1lTVEVNLjQwOF0KICovCi1VSU5UIHdhdmVPdXRXcml0ZShIV0FWRU9VVDE2IGhXYXZlT3V0LCBXQVZFSERSICogbHBXYXZlT3V0SGRyLCAgVUlOVCB1U2l6ZSkKK1VJTlQxNiB3YXZlT3V0V3JpdGUoSFdBVkVPVVQxNiBoV2F2ZU91dCwgV0FWRUhEUiAqIGxwV2F2ZU91dEhkciwgIFVJTlQxNiB1U2l6ZSkKIHsKIAlMUFdBVkVPUEVOREVTQwlscERlc2M7CiAJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJ3YXZlT3V0V3JpdGUoJTA0WCwgJXAsICV1KTtcbiIsIGhXYXZlT3V0LCBscFdhdmVPdXRIZHIsIHVTaXplKTsKQEAgLTE0OTksNyArMTYwMSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCXdhdmVPdXRQYXVzZQkJW01NU1lTVEVNLjQwOV0KICovCi1VSU5UIHdhdmVPdXRQYXVzZShIV0FWRU9VVDE2IGhXYXZlT3V0KQorVUlOVDE2IHdhdmVPdXRQYXVzZShIV0FWRU9VVDE2IGhXYXZlT3V0KQogewogCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsKIAlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIndhdmVPdXRQYXVzZSglMDRYKVxuIiwgaFdhdmVPdXQpOwpAQCAtMTUxMSw3ICsxNjEzLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJd2F2ZU91dFJlc3RhcnQJCVtNTVNZU1RFTS40MTBdCiAqLwotVUlOVCB3YXZlT3V0UmVzdGFydChIV0FWRU9VVDE2IGhXYXZlT3V0KQorVUlOVDE2IHdhdmVPdXRSZXN0YXJ0KEhXQVZFT1VUMTYgaFdhdmVPdXQpCiB7CiAJTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwogCWRwcmludGZfbW1zeXMoc3RkZGViLCAid2F2ZU91dFJlc3RhcnQoJTA0WClcbiIsIGhXYXZlT3V0KTsKQEAgLTE1MjMsNyArMTYyNSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCXdhdmVPdXRSZXNldAkJW01NU1lTVEVNLjQxMV0KICovCi1VSU5UIHdhdmVPdXRSZXNldChIV0FWRU9VVDE2IGhXYXZlT3V0KQorVUlOVDE2IHdhdmVPdXRSZXNldChIV0FWRU9VVDE2IGhXYXZlT3V0KQogewogCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsKIAlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIndhdmVPdXRSZXNldCglMDRYKVxuIiwgaFdhdmVPdXQpOwpAQCAtMTUzNSw3ICsxNjM3LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJd2F2ZU91dEdldFBvc2l0aW9uCVtNTVNZU1RFTS40MTJdCiAqLwotVUlOVCB3YXZlT3V0R2V0UG9zaXRpb24oSFdBVkVPVVQxNiBoV2F2ZU91dCwgTU1USU1FICogbHBUaW1lLCBVSU5UIHVTaXplKQorVUlOVDE2IHdhdmVPdXRHZXRQb3NpdGlvbihIV0FWRU9VVDE2IGhXYXZlT3V0LCBNTVRJTUUgKiBscFRpbWUsIFVJTlQxNiB1U2l6ZSkKIHsKIAlMUFdBVkVPUEVOREVTQwlscERlc2M7CiAJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJ3YXZlT3V0R2V0UG9zaXRpb24oJTA0WCwgJXAsICV1KTtcbiIsIGhXYXZlT3V0LCBscFRpbWUsIHVTaXplKTsKQEAgLTE1NDgsNyArMTY1MCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCXdhdmVPdXRHZXRQaXRjaAkJW01NU1lTVEVNLjQxM10KICovCi1VSU5UIHdhdmVPdXRHZXRQaXRjaChIV0FWRU9VVDE2IGhXYXZlT3V0LCBEV09SRCAqIGxwZHdQaXRjaCkKK1VJTlQxNiB3YXZlT3V0R2V0UGl0Y2goSFdBVkVPVVQxNiBoV2F2ZU91dCwgRFdPUkQgKiBscGR3UGl0Y2gpCiB7CiAJTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwogCWRwcmludGZfbW1zeXMoc3RkZGViLCAid2F2ZU91dEdldFBpdGNoKCUwNFgsICVwKTtcbiIsIGhXYXZlT3V0LCBscGR3UGl0Y2gpOwpAQCAtMTU2MSw3ICsxNjYzLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJd2F2ZU91dFNldFBpdGNoCQlbTU1TWVNURU0uNDE0XQogKi8KLVVJTlQgd2F2ZU91dFNldFBpdGNoKEhXQVZFT1VUMTYgaFdhdmVPdXQsIERXT1JEIGR3UGl0Y2gpCitVSU5UMTYgd2F2ZU91dFNldFBpdGNoKEhXQVZFT1VUMTYgaFdhdmVPdXQsIERXT1JEIGR3UGl0Y2gpCiB7CiAJTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwogCWRwcmludGZfbW1zeXMoc3RkZGViLCAid2F2ZU91dFNldFBpdGNoKCUwNFgsICUwOGxYKTtcbiIsIGhXYXZlT3V0LCBkd1BpdGNoKTsKQEAgLTE1NzMsNyArMTY3NSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCXdhdmVPdXRHZXRWb2x1bWUJW01NU1lTVEVNLjQxNV0KICovCi1VSU5UIHdhdmVPdXRHZXRWb2x1bWUoVUlOVCB1RGV2aWNlSUQsIERXT1JEICogbHBkd1ZvbHVtZSkKK1VJTlQxNiB3YXZlT3V0R2V0Vm9sdW1lKFVJTlQxNiB1RGV2aWNlSUQsIERXT1JEICogbHBkd1ZvbHVtZSkKIHsKIAlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIndhdmVPdXRHZXRWb2x1bWUoJTA0WCwgJXApO1xuIiwgdURldmljZUlELCBscGR3Vm9sdW1lKTsKIAlyZXR1cm4gd29kTWVzc2FnZSh1RGV2aWNlSUQsIFdPRE1fR0VUVk9MVU1FLCAwTCwgKERXT1JEKWxwZHdWb2x1bWUsIDBMKTsKQEAgLTE1ODIsNyArMTY4NCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCXdhdmVPdXRTZXRWb2x1bWUJW01NU1lTVEVNLjQxNl0KICovCi1VSU5UIHdhdmVPdXRTZXRWb2x1bWUoVUlOVCB1RGV2aWNlSUQsIERXT1JEIGR3Vm9sdW1lKQorVUlOVDE2IHdhdmVPdXRTZXRWb2x1bWUoVUlOVDE2IHVEZXZpY2VJRCwgRFdPUkQgZHdWb2x1bWUpCiB7CiAJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJ3YXZlT3V0U2V0Vm9sdW1lKCUwNFgsICUwOGxYKTtcbiIsIHVEZXZpY2VJRCwgZHdWb2x1bWUpOwogCXJldHVybiB3b2RNZXNzYWdlKHVEZXZpY2VJRCwgV09ETV9TRVRWT0xVTUUsIDBMLCBkd1ZvbHVtZSwgMEwpOwpAQCAtMTU5MSw3ICsxNjkzLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJd2F2ZU91dEdldFBsYXliYWNrUmF0ZQlbTU1TWVNURU0uNDE3XQogKi8KLVVJTlQgd2F2ZU91dEdldFBsYXliYWNrUmF0ZShIV0FWRU9VVDE2IGhXYXZlT3V0LCBEV09SRCAqIGxwZHdSYXRlKQorVUlOVDE2IHdhdmVPdXRHZXRQbGF5YmFja1JhdGUoSFdBVkVPVVQxNiBoV2F2ZU91dCwgRFdPUkQgKiBscGR3UmF0ZSkKIHsKIAlMUFdBVkVPUEVOREVTQwlscERlc2M7CiAJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJ3YXZlT3V0R2V0UGxheWJhY2tSYXRlKCUwNFgsICVwKTtcbiIsIGhXYXZlT3V0LCBscGR3UmF0ZSk7CkBAIC0xNjA0LDcgKzE3MDYsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQl3YXZlT3V0U2V0UGxheWJhY2tSYXRlCVtNTVNZU1RFTS40MThdCiAqLwotVUlOVCB3YXZlT3V0U2V0UGxheWJhY2tSYXRlKEhXQVZFT1VUMTYgaFdhdmVPdXQsIERXT1JEIGR3UmF0ZSkKK1VJTlQxNiB3YXZlT3V0U2V0UGxheWJhY2tSYXRlKEhXQVZFT1VUMTYgaFdhdmVPdXQsIERXT1JEIGR3UmF0ZSkKIHsKIAlMUFdBVkVPUEVOREVTQwlscERlc2M7CiAJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJ3YXZlT3V0U2V0UGxheWJhY2tSYXRlKCUwNFgsICUwOGxYKTtcbiIsIGhXYXZlT3V0LCBkd1JhdGUpOwpAQCAtMTYxNyw3ICsxNzE5LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJd2F2ZU91dEJyZWFrTG9vcCAJW01NU1lTVEVNLjQxOV0KICovCi1VSU5UIHdhdmVPdXRCcmVha0xvb3AoSFdBVkVPVVQxNiBoV2F2ZU91dCkKK1VJTlQxNiB3YXZlT3V0QnJlYWtMb29wKEhXQVZFT1VUMTYgaFdhdmVPdXQpCiB7CiAJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJ3YXZlT3V0QnJlYWtMb29wKCUwNFgpXG4iLCBoV2F2ZU91dCk7CiAJcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwpAQCAtMTYyNiw3ICsxNzI4LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJd2F2ZU91dEdldElECSAJW01NU1lTVEVNLjQyMF0KICovCi1VSU5UIHdhdmVPdXRHZXRJRChIV0FWRU9VVDE2IGhXYXZlT3V0LCBVSU5UICogbHB1RGV2aWNlSUQpCitVSU5UMTYgd2F2ZU91dEdldElEKEhXQVZFT1VUMTYgaFdhdmVPdXQsIFVJTlQxNiAqIGxwdURldmljZUlEKQogewogCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsKIAlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIndhdmVPdXRHZXRJRCglMDRYLCAlcCk7XG4iLCBoV2F2ZU91dCwgbHB1RGV2aWNlSUQpOwpAQCAtMTY0Miw3ICsxNzQ0LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJd2F2ZU91dE1lc3NhZ2UgCQlbTU1TWVNURU0uNDIxXQogKi8KLURXT1JEIHdhdmVPdXRNZXNzYWdlKEhXQVZFT1VUMTYgaFdhdmVPdXQsIFVJTlQgdU1lc3NhZ2UsIAorRFdPUkQgd2F2ZU91dE1lc3NhZ2UoSFdBVkVPVVQxNiBoV2F2ZU91dCwgVUlOVDE2IHVNZXNzYWdlLCAKIAkJCQkJCQlEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIpCiB7CiAJTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwpAQCAtMTY1Niw5ICsxNzU4LDkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJd2F2ZUluR2V0TnVtRGV2cyAJCVtNTVNZU1RFTS41MDFdCiAqLwotVUlOVCB3YXZlSW5HZXROdW1EZXZzKCkKK1VJTlQxNiB3YXZlSW5HZXROdW1EZXZzKCkKIHsKLQlVSU5UCWNvdW50ID0gMDsKKwlVSU5UMTYJY291bnQgPSAwOwogCWRwcmludGZfbW1zeXMoc3RkZGViLCAid2F2ZUluR2V0TnVtRGV2c1xuIik7CiAJY291bnQgKz0gd2lkTWVzc2FnZSgwLCBXSURNX0dFVE5VTURFVlMsIDBMLCAwTCwgMEwpOwogCWRwcmludGZfbW1zeXMoc3RkZGViLCAid2F2ZUluR2V0TnVtRGV2cyByZXR1cm4gJXUgXG4iLCBjb3VudCk7CkBAIC0xNjY5LDcgKzE3NzEsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQl3YXZlSW5HZXREZXZDYXBzIAkJW01NU1lTVEVNLjUwMl0KICovCi1VSU5UIHdhdmVJbkdldERldkNhcHMoVUlOVCB1RGV2aWNlSUQsIFdBVkVJTkNBUFMgKiBscENhcHMsIFVJTlQgdVNpemUpCitVSU5UMTYgd2F2ZUluR2V0RGV2Q2FwcyhVSU5UMTYgdURldmljZUlELCBXQVZFSU5DQVBTICogbHBDYXBzLCBVSU5UMTYgdVNpemUpCiB7CiAJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJ3YXZlSW5HZXREZXZDYXBzXG4iKTsKIAlyZXR1cm4gd2lkTWVzc2FnZSh1RGV2aWNlSUQsIFdJRE1fR0VUREVWQ0FQUywgMEwsIChEV09SRClscENhcHMsIHVTaXplKTsKQEAgLTE2NzksNyArMTc4MSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCXdhdmVJbkdldEVycm9yVGV4dCAJW01NU1lTVEVNLjUwM10KICovCi1VSU5UIHdhdmVJbkdldEVycm9yVGV4dChVSU5UIHVFcnJvciwgTFBTVFIgbHBUZXh0LCBVSU5UIHVTaXplKQorVUlOVDE2IHdhdmVJbkdldEVycm9yVGV4dChVSU5UMTYgdUVycm9yLCBMUFNUUiBscFRleHQsIFVJTlQxNiB1U2l6ZSkKIHsKICAgIGRwcmludGZfbW1zeXMoc3RkZGViLCAid2F2ZUluR2V0RXJyb3JUZXh0XG4iKTsKICAgIHJldHVybih3YXZlR2V0RXJyb3JUZXh0KHVFcnJvciwgbHBUZXh0LCB1U2l6ZSkpOwpAQCAtMTY4OSwyMCArMTc5MSwyMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQl3YXZlSW5PcGVuCQkJW01NU1lTVEVNLjUwNF0KICovCi1VSU5UIHdhdmVJbk9wZW4oSFdBVkVJTjE2ICogbHBoV2F2ZUluLCBVSU5UIHVEZXZpY2VJRCwKK1VJTlQxNiB3YXZlSW5PcGVuKEhXQVZFSU4xNiAqIGxwaFdhdmVJbiwgVUlOVDE2IHVEZXZpY2VJRCwKICAgICBjb25zdCBMUFdBVkVGT1JNQVQgbHBGb3JtYXQsIERXT1JEIGR3Q2FsbGJhY2ssIERXT1JEIGR3SW5zdGFuY2UsIERXT1JEIGR3RmxhZ3MpCiB7CiAJSFdBVkVJTjE2IGhXYXZlSW47CiAJTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwogCUxQV0FWRU9QRU5ERVNDCWxwMTZEZXNjOwogCURXT1JECWR3UmV0ID0gMDsKLQlCT09MCWJNYXBwZXJGbGcgPSBGQUxTRTsKKwlCT09MMzIJYk1hcHBlckZsZyA9IEZBTFNFOwogCWRwcmludGZfbW1zeXMoc3RkZGViLCAid2F2ZUluT3BlbiglcCwgJWQsICVwLCAlMDhsWCwgJTA4bFgsICUwOGxYKTtcbiIsIAogCQlscGhXYXZlSW4sIHVEZXZpY2VJRCwgbHBGb3JtYXQsIGR3Q2FsbGJhY2ssIGR3SW5zdGFuY2UsIGR3RmxhZ3MpOwogCWlmIChkd0ZsYWdzICYgV0FWRV9GT1JNQVRfUVVFUlkpIHsKIAkJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJ3YXZlSW5PcGVuIC8vIFdBVkVfRk9STUFUX1FVRVJZIHJlcXVlc3RlZCAhXG4iKTsKIAkJfQotCWlmICh1RGV2aWNlSUQgPT0gKFVJTlQpV0FWRV9NQVBQRVIpIHsKKwlpZiAodURldmljZUlEID09IChVSU5UMTYpV0FWRV9NQVBQRVIpIHsKIAkJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJ3YXZlSW5PcGVuCS8vIFdBVkVfTUFQUEVSIG1vZGUgcmVxdWVzdGVkICFcbiIpOwogCQliTWFwcGVyRmxnID0gVFJVRTsKIAkJdURldmljZUlEID0gMDsKQEAgLTE3MzYsNyArMTgzOCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCXdhdmVJbkNsb3NlCQkJW01NU1lTVEVNLjUwNV0KICovCi1VSU5UIHdhdmVJbkNsb3NlKEhXQVZFSU4xNiBoV2F2ZUluKQorVUlOVDE2IHdhdmVJbkNsb3NlKEhXQVZFSU4xNiBoV2F2ZUluKQogewogCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsKIAlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIndhdmVJbkNsb3NlKCUwNFgpXG4iLCBoV2F2ZUluKTsKQEAgLTE3NDksOCArMTg1MSw4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCXdhdmVJblByZXBhcmVIZWFkZXIJCVtNTVNZU1RFTS41MDZdCiAqLwotVUlOVCB3YXZlSW5QcmVwYXJlSGVhZGVyKEhXQVZFSU4xNiBoV2F2ZUluLAotICAgIFdBVkVIRFIgKiBscFdhdmVJbkhkciwgVUlOVCB1U2l6ZSkKK1VJTlQxNiB3YXZlSW5QcmVwYXJlSGVhZGVyKEhXQVZFSU4xNiBoV2F2ZUluLAorICAgIFdBVkVIRFIgKiBscFdhdmVJbkhkciwgVUlOVDE2IHVTaXplKQogewogCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsKIAlMUFdBVkVIRFIgCQlscDMyV2F2ZUluSGRyOwpAQCAtMTc3Miw4ICsxODc0LDggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJd2F2ZUluVW5wcmVwYXJlSGVhZGVyCVtNTVNZU1RFTS41MDddCiAqLwotVUlOVCB3YXZlSW5VbnByZXBhcmVIZWFkZXIoSFdBVkVJTjE2IGhXYXZlSW4sCi0gICAgV0FWRUhEUiAqIGxwV2F2ZUluSGRyLCBVSU5UIHVTaXplKQorVUlOVDE2IHdhdmVJblVucHJlcGFyZUhlYWRlcihIV0FWRUlOMTYgaFdhdmVJbiwKKyAgICBXQVZFSERSICogbHBXYXZlSW5IZHIsIFVJTlQxNiB1U2l6ZSkKIHsKIAlMUFdBVkVPUEVOREVTQwlscERlc2M7CiAJTFBXQVZFSERSIAkJbHAzMldhdmVJbkhkcjsKQEAgLTE3OTQsOCArMTg5Niw4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCXdhdmVJbkFkZEJ1ZmZlcgkJW01NU1lTVEVNLjUwOF0KICovCi1VSU5UIHdhdmVJbkFkZEJ1ZmZlcihIV0FWRUlOMTYgaFdhdmVJbiwKLSAgICBXQVZFSERSICogbHBXYXZlSW5IZHIsIFVJTlQgdVNpemUpCitVSU5UMTYgd2F2ZUluQWRkQnVmZmVyKEhXQVZFSU4xNiBoV2F2ZUluLAorICAgIFdBVkVIRFIgKiBscFdhdmVJbkhkciwgVUlOVDE2IHVTaXplKQogewogCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsKIAlMUFdBVkVIRFIgCQlscDMyV2F2ZUluSGRyOwpAQCAtMTgxNiw3ICsxOTE4LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJd2F2ZUluU3RhcnQJCQlbTU1TWVNURU0uNTA5XQogKi8KLVVJTlQgd2F2ZUluU3RhcnQoSFdBVkVJTjE2IGhXYXZlSW4pCitVSU5UMTYgd2F2ZUluU3RhcnQoSFdBVkVJTjE2IGhXYXZlSW4pCiB7CiAJTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwogCWRwcmludGZfbW1zeXMoc3RkZGViLCAid2F2ZUluU3RhcnQoJTA0WClcbiIsIGhXYXZlSW4pOwpAQCAtMTgyOSw3ICsxOTMxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJd2F2ZUluU3RvcAkJCVtNTVNZU1RFTS41MTBdCiAqLwotVUlOVCB3YXZlSW5TdG9wKEhXQVZFSU4xNiBoV2F2ZUluKQorVUlOVDE2IHdhdmVJblN0b3AoSFdBVkVJTjE2IGhXYXZlSW4pCiB7CiAJTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwogCWRwcmludGZfbW1zeXMoc3RkZGViLCAid2F2ZUluU3RvcCglMDRYKVxuIiwgaFdhdmVJbik7CkBAIC0xODQyLDcgKzE5NDQsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQl3YXZlSW5SZXNldAkJCVtNTVNZU1RFTS41MTFdCiAqLwotVUlOVCB3YXZlSW5SZXNldChIV0FWRUlOMTYgaFdhdmVJbikKK1VJTlQxNiB3YXZlSW5SZXNldChIV0FWRUlOMTYgaFdhdmVJbikKIHsKIAlMUFdBVkVPUEVOREVTQwlscERlc2M7CiAJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJ3YXZlSW5SZXNldCglMDRYKVxuIiwgaFdhdmVJbik7CkBAIC0xODU1LDcgKzE5NTcsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQl3YXZlSW5HZXRQb3NpdGlvbglbTU1TWVNURU0uNTEyXQogKi8KLVVJTlQgd2F2ZUluR2V0UG9zaXRpb24oSFdBVkVJTjE2IGhXYXZlSW4sIE1NVElNRSAqIGxwVGltZSwgVUlOVCB1U2l6ZSkKK1VJTlQxNiB3YXZlSW5HZXRQb3NpdGlvbihIV0FWRUlOMTYgaFdhdmVJbiwgTU1USU1FICogbHBUaW1lLCBVSU5UMTYgdVNpemUpCiB7CiAJTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwogCWRwcmludGZfbW1zeXMoc3RkZGViLCAid2F2ZUluR2V0UG9zaXRpb24oJTA0WCwgJXAsICV1KTtcbiIsIGhXYXZlSW4sIGxwVGltZSwgdVNpemUpOwpAQCAtMTg2OSw3ICsxOTcxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJd2F2ZUluR2V0SUQJCQlbTU1TWVNURU0uNTEzXQogKi8KLVVJTlQgd2F2ZUluR2V0SUQoSFdBVkVJTjE2IGhXYXZlSW4sIFVJTlQgKiBscHVEZXZpY2VJRCkKK1VJTlQxNiB3YXZlSW5HZXRJRChIV0FWRUlOMTYgaFdhdmVJbiwgVUlOVDE2ICogbHB1RGV2aWNlSUQpCiB7CiAJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJ3YXZlSW5HZXRJRFxuIik7CiAJaWYgKGxwdURldmljZUlEID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOwpAQCAtMTg4MCw3ICsxOTgyLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJd2F2ZUluTWVzc2FnZSAJCVtNTVNZU1RFTS41MTRdCiAqLwotRFdPUkQgd2F2ZUluTWVzc2FnZShIV0FWRUlOMTYgaFdhdmVJbiwgVUlOVCB1TWVzc2FnZSwKK0RXT1JEIHdhdmVJbk1lc3NhZ2UoSFdBVkVJTjE2IGhXYXZlSW4sIFVJTlQxNiB1TWVzc2FnZSwKIAkJICAgIERXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMikKIHsKIAlMUFdBVkVPUEVOREVTQwlscERlc2M7CkBAIC0xOTE5LDcgKzIwMjEsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltbWlvQ2xvc2UgICAgICAJCVtNTVNZU1RFTS4xMjExXQogKi8KLVVJTlQgbW1pb0Nsb3NlKEhNTUlPMTYgaG1taW8sIFVJTlQgdUZsYWdzKQorVUlOVDE2IG1taW9DbG9zZShITU1JTzE2IGhtbWlvLCBVSU5UMTYgdUZsYWdzKQogewogCUxQTU1JT0lORk8JbHBtbWluZm87CiAJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJtbWlvQ2xvc2UoJTA0WCwgJTA0WCk7XG4iLCBobW1pbywgdUZsYWdzKTsKQEAgLTE5ODcsNyArMjA4OSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9HZXRJbmZvCSAgICAgICAJW01NU1lTVEVNLjEyMTVdCiAqLwotVUlOVCBtbWlvR2V0SW5mbyhITU1JTzE2IGhtbWlvLCBNTUlPSU5GTyAqIGxwbW1pb2luZm8sIFVJTlQgdUZsYWdzKQorVUlOVDE2IG1taW9HZXRJbmZvKEhNTUlPMTYgaG1taW8sIE1NSU9JTkZPICogbHBtbWlvaW5mbywgVUlOVDE2IHVGbGFncykKIHsKIAlMUE1NSU9JTkZPCWxwbW1pbmZvOwogCWRwcmludGZfbW1zeXMoc3RkZGViLCAibW1pb0dldEluZm9cbiIpOwpAQCAtMjAwMSw3ICsyMTAzLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbW1pb1NldEluZm8gICAgCQlbTU1TWVNURU0uMTIxNl0KICovCi1VSU5UIG1taW9TZXRJbmZvKEhNTUlPMTYgaG1taW8sIGNvbnN0IE1NSU9JTkZPICogbHBtbWlvaW5mbywgVUlOVCB1RmxhZ3MpCitVSU5UMTYgbW1pb1NldEluZm8oSE1NSU8xNiBobW1pbywgY29uc3QgTU1JT0lORk8gKiBscG1taW9pbmZvLCBVSU5UMTYgdUZsYWdzKQogewogCUxQTU1JT0lORk8JbHBtbWluZm87CiAJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJtbWlvU2V0SW5mb1xuIik7CkBAIC0yMDE0LDggKzIxMTYsOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltbWlvU2V0QnVmZmVyCQlbTU1TWVNURU0uMTIxN10KICovCi1VSU5UIG1taW9TZXRCdWZmZXIoSE1NSU8xNiBobW1pbywgTFBTVFIgcGNoQnVmZmVyLCAKLQkJCQkJCUxPTkcgY2NoQnVmZmVyLCBVSU5UIHVGbGFncykKK1VJTlQxNiBtbWlvU2V0QnVmZmVyKEhNTUlPMTYgaG1taW8sIExQU1RSIHBjaEJ1ZmZlciwgCisJCQkJCQlMT05HIGNjaEJ1ZmZlciwgVUlOVDE2IHVGbGFncykKIHsKIAlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIm1taW9TZXRCdWZmZXIgLy8gZW1wdHkgc3R1YiBcbiIpOwogCXJldHVybiAwOwpAQCAtMjAyNCw3ICsyMTI2LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbW1pb0ZsdXNoICAgICAgCQlbTU1TWVNURU0uMTIxOF0KICovCi1VSU5UIG1taW9GbHVzaChITU1JTzE2IGhtbWlvLCBVSU5UIHVGbGFncykKK1VJTlQxNiBtbWlvRmx1c2goSE1NSU8xNiBobW1pbywgVUlOVDE2IHVGbGFncykKIHsKIAlMUE1NSU9JTkZPCWxwbW1pbmZvOwogCWRwcmludGZfbW1zeXMoc3RkZGViLCAibW1pb0ZsdXNoKCUwNFgsICUwNFgpXG4iLCBobW1pbywgdUZsYWdzKTsKQEAgLTIwMzcsNyArMjEzOSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9BZHZhbmNlICAgIAkJW01NU1lTVEVNLjEyMTldCiAqLwotVUlOVCBtbWlvQWR2YW5jZShITU1JTzE2IGhtbWlvLCBNTUlPSU5GTyAqIGxwbW1pb2luZm8sIFVJTlQgdUZsYWdzKQorVUlOVDE2IG1taW9BZHZhbmNlKEhNTUlPMTYgaG1taW8sIE1NSU9JTkZPICogbHBtbWlvaW5mbywgVUlOVDE2IHVGbGFncykKIHsKIAlpbnQJCWNvdW50ID0gMDsKIAlMUE1NSU9JTkZPCWxwbW1pbmZvOwpAQCAtMjA2MSw3ICsyMTYzLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbW1pb1N0cmluZ1RvRk9VUkNDCVtNTVNZU1RFTS4xMjIwXQogKi8KLUZPVVJDQyBtbWlvU3RyaW5nVG9GT1VSQ0MoTFBDU1RSIHN6LCBVSU5UIHVGbGFncykKK0ZPVVJDQyBtbWlvU3RyaW5nVG9GT1VSQ0MoTFBDU1RSIHN6LCBVSU5UMTYgdUZsYWdzKQogewogCWRwcmludGZfbW1zeXMoc3RkZGViLCAibW1pb1N0cmluZ1RvRk9VUkNDIC8vIGVtcHR5IHN0dWIgXG4iKTsKIAlyZXR1cm4gMDsKQEAgLTIwODAsNyArMjE4Miw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9TZW5kTWVzc2FnZQkJW01NU1lTVEVNLjEyMjJdCiAqLwotTFJFU1VMVCBtbWlvU2VuZE1lc3NhZ2UoSE1NSU8xNiBobW1pbywgVUlOVCB1TWVzc2FnZSwKK0xSRVNVTFQgbW1pb1NlbmRNZXNzYWdlKEhNTUlPMTYgaG1taW8sIFVJTlQxNiB1TWVzc2FnZSwKIAkJCQkJICAgIExQQVJBTSBsUGFyYW0xLCBMUEFSQU0gbFBhcmFtMikKIHsKIAlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIm1taW9TZW5kTWVzc2FnZSAvLyBlbXB0eSBzdHViIFxuIik7CkBAIC0yMDkwLDggKzIxOTIsOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltbWlvRGVzY2VuZAkgICAgICAgCVtNTVNZU1RFTS4xMjIzXQogKi8KLVVJTlQgbW1pb0Rlc2NlbmQoSE1NSU8xNiBobW1pbywgTU1DS0lORk8gKiBscGNrLAotCQkgICAgY29uc3QgTU1DS0lORk8gKiBscGNrUGFyZW50LCBVSU5UIHVGbGFncykKK1VJTlQxNiBtbWlvRGVzY2VuZChITU1JTzE2IGhtbWlvLCBNTUNLSU5GTyAqIGxwY2ssCisJCSAgICBjb25zdCBNTUNLSU5GTyAqIGxwY2tQYXJlbnQsIFVJTlQxNiB1RmxhZ3MpCiB7CiAJRFdPUkQJZHdmY2MsIGR3T2xkUG9zOwogCUxQTU1JT0lORk8JbHBtbWluZm87CkBAIC0yMTUxLDcgKzIyNTMsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltbWlvQXNjZW5kICAgICAJCVtNTVNZU1RFTS4xMjI0XQogKi8KLVVJTlQgbW1pb0FzY2VuZChITU1JTzE2IGhtbWlvLCBNTUNLSU5GTyAqIGxwY2ssIFVJTlQgdUZsYWdzKQorVUlOVDE2IG1taW9Bc2NlbmQoSE1NSU8xNiBobW1pbywgTU1DS0lORk8gKiBscGNrLCBVSU5UMTYgdUZsYWdzKQogewogCWRwcmludGZfbW1zeXMoc3RkZGViLCAibW1pb0FzY2VuZCAvLyBlbXB0eSBzdHViICFcbiIpOwogCXJldHVybiAwOwpAQCAtMjE2MCw3ICsyMjYyLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbW1pb0NyZWF0ZUNodW5rCQlbTU1TWVNURU0uMTIyNV0KICovCi1VSU5UIG1taW9DcmVhdGVDaHVuayhITU1JTzE2IGhtbWlvLCBNTUNLSU5GTyAqIGxwY2ssIFVJTlQgdUZsYWdzKQorVUlOVDE2IG1taW9DcmVhdGVDaHVuayhITU1JTzE2IGhtbWlvLCBNTUNLSU5GTyAqIGxwY2ssIFVJTlQxNiB1RmxhZ3MpCiB7CiAJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJtbWlvQ3JlYXRlQ2h1bmsgLy8gZW1wdHkgc3R1YiBcbiIpOwogCXJldHVybiAwOwpAQCAtMjE3MCw3ICsyMjcyLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbW1pb1JlbmFtZSAgICAgCQlbTU1TWVNURU0uMTIyNl0KICovCi1VSU5UIG1taW9SZW5hbWUoTFBDU1RSIHN6RmlsZU5hbWUsIExQQ1NUUiBzek5ld0ZpbGVOYW1lLAorVUlOVDE2IG1taW9SZW5hbWUoTFBDU1RSIHN6RmlsZU5hbWUsIExQQ1NUUiBzek5ld0ZpbGVOYW1lLAogICAgICBNTUlPSU5GTyAqIGxwbW1pb2luZm8sIERXT1JEIGR3UmVuYW1lRmxhZ3MpCiB7CiAJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJtbWlvUmVuYW1lKCclcycsICclcycsICVwLCAlMDhsWCk7IC8vIGVtcHR5IHN0dWIgXG4iLApAQCAtMjIwNCwxMiArMjMwNiwxMCBAQAogKi8KIExSRVNVTFQgRHJ2U2VuZE1lc3NhZ2UoSERSVlIxNiBoRHJpdmVyLCBXT1JEIG1zZywgTFBBUkFNIGxQYXJhbTEsIExQQVJBTSBsUGFyYW0yKQogewotCURXT1JEIAlkd0RldklEID0gMDsKKwlEV09SRCAJZHdEcml2ZXJJRCA9IDA7CiAJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJEcnZTZW5kTWVzc2FnZSglMDRYLCAlMDRYLCAlMDhsWCwgJTA4bFgpO1xuIiwKIAkJCQkJaERyaXZlciwgbXNnLCBsUGFyYW0xLCBsUGFyYW0yKTsKLSNpZm5kZWYgV0lORUxJQgotCXJldHVybiBDREFVRElPX0RyaXZlclByb2MoZHdEZXZJRCwgaERyaXZlciwgbXNnLCBsUGFyYW0xLCBsUGFyYW0yKTsKLSNlbmRpZgorCXJldHVybiBDREFVRElPX0RyaXZlclByb2MoZHdEcml2ZXJJRCwgaERyaXZlciwgbXNnLCBsUGFyYW0xLCBsUGFyYW0yKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yMjI1LDEyICsyMzI1LDggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJRHJ2RGVmRHJpdmVyUHJvYwlbTU1TWVNURU0uMTEwNF0KICovCi1MUkVTVUxUIERydkRlZkRyaXZlclByb2MoRFdPUkQgZHdEZXZJRCwgSERSVlIxNiBoRHJpdiwgV09SRCB3TXNnLCAKK0xSRVNVTFQgRHJ2RGVmRHJpdmVyUHJvYyhEV09SRCBkd0RyaXZlcklELCBIRFJWUjE2IGhEcml2LCBXT1JEIHdNc2csIAogCQkJCQkJRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yKQogewotCXJldHVybiBEZWZEcml2ZXJQcm9jKGR3RGV2SUQsIGhEcml2LCB3TXNnLCBkd1BhcmFtMSwgZHdQYXJhbTIpOworCXJldHVybiBEZWZEcml2ZXJQcm9jKGR3RHJpdmVySUQsIGhEcml2LCB3TXNnLCBkd1BhcmFtMSwgZHdQYXJhbTIpOwogfQotCi0KLSNlbmRpZiAvKiAjaWZkZWYgV0lORUxJQiAqLwotCmRpZmYgLS1naXQgYS9tdWx0aW1lZGlhL3RpbWUuYyBiL211bHRpbWVkaWEvdGltZS5jCmluZGV4IGE2YjQ3OTUuLjU2ZTRlNDUgMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvdGltZS5jCisrKyBiL211bHRpbWVkaWEvdGltZS5jCkBAIC00LDggKzQsNiBAQAogICogQ29weXJpZ2h0IDE5OTMgTWFydGluIEF5b3R0ZQogICovCiAKLSNpZm5kZWYgV0lORUxJQgotCiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KQEAgLTIwLDcgKzE4LDcgQEAKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKLXN0YXRpYyBCT09MIG1tVGltZVN0YXJ0ZWQgPSBGQUxTRTsKK3N0YXRpYyBCT09MMzIgbW1UaW1lU3RhcnRlZCA9IEZBTFNFOwogc3RhdGljIE1NVElNRSBtbVN5c1RpbWVNUzsKIHN0YXRpYyBNTVRJTUUgbW1TeXNUaW1lU01QVEU7CiAKQEAgLTIyMSw1ICsyMTksMyBAQAogCVN0YXJ0TU1UaW1lKCk7CiAgICAgcmV0dXJuIDA7CiB9Ci0KLSNlbmRpZiAvKiBXSU5FTElCICovCmRpZmYgLS1naXQgYS9vYmplY3RzL2JpdG1hcC5jIGIvb2JqZWN0cy9iaXRtYXAuYwppbmRleCAxZDgxYjE2Li43NzE0N2Y3IDEwMDY0NAotLS0gYS9vYmplY3RzL2JpdG1hcC5jCisrKyBiL29iamVjdHMvYml0bWFwLmMKQEAgLTUyLDEzICs1MiwyMyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENyZWF0ZUJpdG1hcCAgICAoR0RJLjQ4KSAoR0RJMzIuMjUpCisgKiAgICAgICAgICAgQ3JlYXRlQml0bWFwMTYgICAgKEdESS40OCkKICAqLwotSEJJVE1BUDE2IENyZWF0ZUJpdG1hcCggSU5UMzIgd2lkdGgsIElOVDMyIGhlaWdodCwgVUlOVDMyIHBsYW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiBicHAsIExQQ1ZPSUQgYml0cyApCitIQklUTUFQMTYgQ3JlYXRlQml0bWFwMTYoIElOVDE2IHdpZHRoLCBJTlQxNiBoZWlnaHQsIFVJTlQxNiBwbGFuZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiBicHAsIExQQ1ZPSUQgYml0cyApCit7CisgICAgcmV0dXJuIENyZWF0ZUJpdG1hcDMyKCB3aWR0aCwgaGVpZ2h0LCBwbGFuZXMsIGJwcCwgYml0cyApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENyZWF0ZUJpdG1hcDMyICAgIChHREkzMi4yNSkKKyAqLworSEJJVE1BUDMyIENyZWF0ZUJpdG1hcDMyKCBJTlQzMiB3aWR0aCwgSU5UMzIgaGVpZ2h0LCBVSU5UMzIgcGxhbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMzIgYnBwLCBMUENWT0lEIGJpdHMgKQogewogICAgIEJJVE1BUE9CSiAqIGJtcE9ialB0cjsKLSAgICBIQklUTUFQMTYgaGJpdG1hcDsKKyAgICBIQklUTUFQMzIgaGJpdG1hcDsKIAogICAgIHBsYW5lcyA9IChCWVRFKXBsYW5lczsKICAgICBicHAgICAgPSAoQllURSlicHA7CkBAIC05NSwyOCArMTA1LDMzIEBACiAJaGJpdG1hcCA9IDA7CiAgICAgfQogICAgIGVsc2UgaWYgKGJpdHMpICAvKiBTZXQgYml0bWFwIGJpdHMgKi8KLQlTZXRCaXRtYXBCaXRzKCBoYml0bWFwLCBoZWlnaHQgKiBibXBPYmpQdHItPmJpdG1hcC5ibVdpZHRoQnl0ZXMsIGJpdHMpOworCVNldEJpdG1hcEJpdHMzMiggaGJpdG1hcCwgaGVpZ2h0ICogYm1wT2JqUHRyLT5iaXRtYXAuYm1XaWR0aEJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHMgKTsKICAgICByZXR1cm4gaGJpdG1hcDsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDcmVhdGVDb21wYXRpYmxlQml0bWFwICAgIChHREkuNTEpIChHREkzMi4zMCkKKyAqICAgICAgICAgICBDcmVhdGVDb21wYXRpYmxlQml0bWFwMTYgICAgKEdESS41MSkKICAqLwotSEJJVE1BUDE2IENyZWF0ZUNvbXBhdGlibGVCaXRtYXAoIEhEQzMyIGhkYywgSU5UMzIgd2lkdGgsIElOVDMyIGhlaWdodCApCitIQklUTUFQMTYgQ3JlYXRlQ29tcGF0aWJsZUJpdG1hcDE2KCBIREMxNiBoZGMsIElOVDE2IHdpZHRoLCBJTlQxNiBoZWlnaHQgKQogewotICAgIEhCSVRNQVAxNiBoYm1wUmV0ID0gMDsKKyAgICByZXR1cm4gQ3JlYXRlQ29tcGF0aWJsZUJpdG1hcDMyKCBoZGMsIHdpZHRoLCBoZWlnaHQgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDcmVhdGVDb21wYXRpYmxlQml0bWFwMzIgICAgKEdESTMyLjMwKQorICovCitIQklUTUFQMzIgQ3JlYXRlQ29tcGF0aWJsZUJpdG1hcDMyKCBIREMzMiBoZGMsIElOVDMyIHdpZHRoLCBJTlQzMiBoZWlnaHQgKQoreworICAgIEhCSVRNQVAzMiBoYm1wUmV0ID0gMDsKICAgICBEQyAqZGM7CiAKICAgICBkcHJpbnRmX2dkaSggc3RkZGViLCAiQ3JlYXRlQ29tcGF0aWJsZUJpdG1hcCglMDR4LCVkLCVkKSA9IFxuIiwgCiAgICAgICAgICAgICAgICAgIGhkYywgd2lkdGgsIGhlaWdodCApOwotICAgIGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKTsKLSAgICBpZiAoIWRjKSAKLSAgICB7Ci0JZGMgPSAoREMgKilHRElfR2V0T2JqUHRyKGhkYywgTUVUQUZJTEVfRENfTUFHSUMpOwotCWlmICghZGMpIHJldHVybiAwOwotICAgIH0KLSAgICBoYm1wUmV0ID0gQ3JlYXRlQml0bWFwKCB3aWR0aCwgaGVpZ2h0LCAxLCBkYy0+dy5iaXRzUGVyUGl4ZWwsIE5VTEwgKTsKKyAgICBpZiAoIShkYyA9IERDX0dldERDUHRyKCBoZGMgKSkpIHJldHVybiAwOworICAgIGhibXBSZXQgPSBDcmVhdGVCaXRtYXAzMiggd2lkdGgsIGhlaWdodCwgMSwgZGMtPncuYml0c1BlclBpeGVsLCBOVUxMICk7CiAgICAgZHByaW50Zl9nZGkoc3RkZGViLCJcdFx0JTA0eFxuIiwgaGJtcFJldCk7CiAgICAgcmV0dXJuIGhibXBSZXQ7CiB9CkBAIC0xMjcsOCArMTQyLDggQEAKICAqLwogSEJJVE1BUDE2IENyZWF0ZUJpdG1hcEluZGlyZWN0MTYoIGNvbnN0IEJJVE1BUDE2ICogYm1wICkKIHsKLSAgICByZXR1cm4gQ3JlYXRlQml0bWFwKCBibXAtPmJtV2lkdGgsIGJtcC0+Ym1IZWlnaHQsIGJtcC0+Ym1QbGFuZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm1wLT5ibUJpdHNQaXhlbCwgUFRSX1NFR19UT19MSU4oIGJtcC0+Ym1CaXRzICkgKTsKKyAgICByZXR1cm4gQ3JlYXRlQml0bWFwMTYoIGJtcC0+Ym1XaWR0aCwgYm1wLT5ibUhlaWdodCwgYm1wLT5ibVBsYW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcC0+Ym1CaXRzUGl4ZWwsIFBUUl9TRUdfVE9fTElOKCBibXAtPmJtQml0cyApICk7CiB9CiAKIApAQCAtMTM3LDE1ICsxNTIsMjQgQEAKICAqLwogSEJJVE1BUDMyIENyZWF0ZUJpdG1hcEluZGlyZWN0MzIoIGNvbnN0IEJJVE1BUDMyICogYm1wICkKIHsKLSAgICByZXR1cm4gQ3JlYXRlQml0bWFwKCBibXAtPmJtV2lkdGgsIGJtcC0+Ym1IZWlnaHQsIGJtcC0+Ym1QbGFuZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm1wLT5ibUJpdHNQaXhlbCwgYm1wLT5ibUJpdHMgKTsKKyAgICByZXR1cm4gQ3JlYXRlQml0bWFwMzIoIGJtcC0+Ym1XaWR0aCwgYm1wLT5ibUhlaWdodCwgYm1wLT5ibVBsYW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcC0+Ym1CaXRzUGl4ZWwsIGJtcC0+Ym1CaXRzICk7CiB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0Qml0bWFwQml0cyAgICAoR0RJLjc0KSAoR0RJMzIuMTQzKQorICogICAgICAgICAgIEdldEJpdG1hcEJpdHMxNiAgICAoR0RJLjc0KQogICovCi1MT05HIEdldEJpdG1hcEJpdHMoIEhCSVRNQVAzMiBoYml0bWFwLCBMT05HIGNvdW50LCBMUFZPSUQgYnVmZmVyICkKK0xPTkcgR2V0Qml0bWFwQml0czE2KCBIQklUTUFQMTYgaGJpdG1hcCwgTE9ORyBjb3VudCwgTFBWT0lEIGJ1ZmZlciApCit7CisgICAgcmV0dXJuIEdldEJpdG1hcEJpdHMzMiggaGJpdG1hcCwgY291bnQsIGJ1ZmZlciApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldEJpdG1hcEJpdHMzMiAgICAoR0RJMzIuMTQzKQorICovCitMT05HIEdldEJpdG1hcEJpdHMzMiggSEJJVE1BUDMyIGhiaXRtYXAsIExPTkcgY291bnQsIExQVk9JRCBidWZmZXIgKQogewogICAgIEJJVE1BUE9CSiAqIGJtcDsKICAgICBMT05HIGhlaWdodDsKQEAgLTE3OCw5ICsyMDIsMTggQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBTZXRCaXRtYXBCaXRzICAgIChHREkuMTA2KSAoR0RJMzIuMzAzKQorICogICAgICAgICAgIFNldEJpdG1hcEJpdHMxNiAgICAoR0RJLjEwNikKICAqLwotTE9ORyBTZXRCaXRtYXBCaXRzKCBIQklUTUFQMzIgaGJpdG1hcCwgTE9ORyBjb3VudCwgTFBDVk9JRCBidWZmZXIgKQorTE9ORyBTZXRCaXRtYXBCaXRzMTYoIEhCSVRNQVAxNiBoYml0bWFwLCBMT05HIGNvdW50LCBMUENWT0lEIGJ1ZmZlciApCit7CisgICAgcmV0dXJuIFNldEJpdG1hcEJpdHMzMiggaGJpdG1hcCwgY291bnQsIGJ1ZmZlciApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFNldEJpdG1hcEJpdHMzMiAgICAoR0RJMzIuMzAzKQorICovCitMT05HIFNldEJpdG1hcEJpdHMzMiggSEJJVE1BUDMyIGhiaXRtYXAsIExPTkcgY291bnQsIExQQ1ZPSUQgYnVmZmVyICkKIHsKICAgICBCSVRNQVBPQkogKiBibXA7CiAgICAgTE9ORyBoZWlnaHQ7CkBAIC00MTYsMTQgKzQ0OSwyMCBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENyZWF0ZURpc2NhcmRhYmxlQml0bWFwICAgIChHREkuMTU2KSAoR0RJMzIuMzgpCisgKiAgICAgICAgICAgQ3JlYXRlRGlzY2FyZGFibGVCaXRtYXAxNiAgICAoR0RJLjE1NikKICAqLwotSEJJVE1BUDE2IENyZWF0ZURpc2NhcmRhYmxlQml0bWFwKCBIREMzMiBoZGMsIElOVDMyIHdpZHRoLCBJTlQzMiBoZWlnaHQgKQorSEJJVE1BUDE2IENyZWF0ZURpc2NhcmRhYmxlQml0bWFwMTYoIEhEQzE2IGhkYywgSU5UMTYgd2lkdGgsIElOVDE2IGhlaWdodCApCiB7Ci0gICAgZHByaW50Zl9iaXRtYXAoc3RkZGViLCJDcmVhdGVEaXNjYXJkYWJsZUJpdG1hcCglMDR4LCAlZCwgJWQpOyAiCi0JICAgIi8vIGNhbGwgQ3JlYXRlQ29tcGF0aWJsZUJpdG1hcCgpIGZvciBub3chXG4iLAotCSAgIGhkYywgd2lkdGgsIGhlaWdodCk7Ci0gICAgcmV0dXJuIENyZWF0ZUNvbXBhdGlibGVCaXRtYXAoaGRjLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICByZXR1cm4gQ3JlYXRlQ29tcGF0aWJsZUJpdG1hcDE2KCBoZGMsIHdpZHRoLCBoZWlnaHQgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDcmVhdGVEaXNjYXJkYWJsZUJpdG1hcDMyICAgIChHREkzMi4zOCkKKyAqLworSEJJVE1BUDMyIENyZWF0ZURpc2NhcmRhYmxlQml0bWFwMzIoIEhEQzMyIGhkYywgSU5UMzIgd2lkdGgsIElOVDMyIGhlaWdodCApCit7CisgICAgcmV0dXJuIENyZWF0ZUNvbXBhdGlibGVCaXRtYXAzMiggaGRjLCB3aWR0aCwgaGVpZ2h0ICk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvb2JqZWN0cy9icnVzaC5jIGIvb2JqZWN0cy9icnVzaC5jCmluZGV4IGViOGJjYTIuLjRhMDYwMDUgMTAwNjQ0Ci0tLSBhL29iamVjdHMvYnJ1c2guYworKysgYi9vYmplY3RzL2JydXNoLmMKQEAgLTQsNyArNCw2IEBACiAgKiBDb3B5cmlnaHQgMTk5MywgMTk5NCAgQWxleGFuZHJlIEp1bGxpYXJkCiAgKi8KIAotI2RlZmluZSBOT19UUkFOU0lUSU9OX1RZUEVTICAvKiBUaGlzIGZpbGUgaXMgV2luMzItY2xlYW4gKi8KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlICJicnVzaC5oIgogI2luY2x1ZGUgImJpdG1hcC5oIgpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9jbGlwcGluZy5jIGIvb2JqZWN0cy9jbGlwcGluZy5jCmluZGV4IDdjYTMwYTkuLmU4MDFjYjAgMTAwNjQ0Ci0tLSBhL29iamVjdHMvY2xpcHBpbmcuYworKysgYi9vYmplY3RzL2NsaXBwaW5nLmMKQEAgLTQsNyArNCw2IEBACiAgKiBDb3B5cmlnaHQgMTk5MyBBbGV4YW5kcmUgSnVsbGlhcmQKICAqLwogCi0jZGVmaW5lIE5PX1RSQU5TSVRJT05fVFlQRVMgIC8qIFRoaXMgZmlsZSBpcyBXaW4zMi1jbGVhbiAqLwogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSAiZGMuaCIKICNpbmNsdWRlICJtZXRhZmlsZS5oIgpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9jb2xvci5jIGIvb2JqZWN0cy9jb2xvci5jCmluZGV4IDVkMWFiZDkuLjViOGM3NjEgMTAwNjQ0Ci0tLSBhL29iamVjdHMvY29sb3IuYworKysgYi9vYmplY3RzL2NvbG9yLmMKQEAgLTI2Miw3ICsyNjIsNyBAQAogICoKICAqIEFsbG9jYXRlIGNvbG9yY2VsbHMgYW5kIGluaXRpYWxpemUgbWFwcGluZyB0YWJsZXMuCiAgKi8KLXN0YXRpYyBCT09MIENPTE9SX0J1aWxkUHJpdmF0ZU1hcChDU1BBQ0UqIGNzKQorc3RhdGljIEJPT0wzMiBDT0xPUl9CdWlsZFByaXZhdGVNYXAoQ1NQQUNFKiBjcykKIHsKICAgICAvKiBQcml2YXRlIGNvbG9ybWFwIC0gaWRlbnRpdHkgbWFwcGluZyAqLwogCkBAIC0zMTMsNyArMzEzLDcgQEAKICAgICByZXR1cm4gRkFMU0U7CiB9CiAKLXN0YXRpYyBCT09MIENPTE9SX0J1aWxkU2hhcmVkTWFwKENTUEFDRSogY3MpCitzdGF0aWMgQk9PTDMyIENPTE9SX0J1aWxkU2hhcmVkTWFwKENTUEFDRSogY3MpCiB7CiAgICBYQ29sb3IJCWNvbG9yOwogICAgdW5zaWduZWQgbG9uZyAgICAgICAgc3lzUGl4ZWxbTkJfUkVTRVJWRURfQ09MT1JTXTsKQEAgLTczOCw3ICs3MzgsMTEgQEAKIAogIGZvciggaSA9IDA7IGkgPCBzaXplICYmIGRpZmYgOyBpKysgKQogICAgIHsKLSAgICAgIGlmKCBpID09IE5CX1JFU0VSVkVEX0NPTE9SUy8yICkgaSA9IHNpemUgLSBOQl9SRVNFUlZFRF9DT0xPUlMvMjsKKyAgICAgIGlmKCBpID09IE5CX1JFU0VSVkVEX0NPTE9SUy8yICkKKyAgICAgIHsKKyAgICAgIAlpbnQgbmV3aSA9IHNpemUgLSBOQl9SRVNFUlZFRF9DT0xPUlMvMjsKKwlpZiAobmV3aT5pKSBpPW5ld2k7CisgICAgICB9CiAKICAgICAgIHIgPSBDT0xPUl9zeXNQYWxbaV0ucGVSZWQgLSBHZXRSVmFsdWUoY29sKTsKICAgICAgIGcgPSBDT0xPUl9zeXNQYWxbaV0ucGVHcmVlbiAtIEdldEdWYWx1ZShjb2wpOwpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9jdXJzb3JpY29uLmMgYi9vYmplY3RzL2N1cnNvcmljb24uYwppbmRleCA2MmI0ODIzLi5iZGI5ZjBkIDEwMDY0NAotLS0gYS9vYmplY3RzL2N1cnNvcmljb24uYworKysgYi9vYmplY3RzL2N1cnNvcmljb24uYwpAQCAtMjIsNyArMjIsNiBAQAogICogdGhlIGJpdHMgZGlyZWN0bHkgOi0oCiAgKi8KIAotI2RlZmluZSBOT19UUkFOU0lUSU9OX1RZUEVTICAvKiBUaGlzIGZpbGUgaXMgV2luMzItY2xlYW4gKi8KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlICJ3aW5kb3dzLmgiCkBAIC0zNjcsOCArMzY2LDggQEAKIAogICAgIC8qIFRyYW5zZmVyIHRoZSBiaXRtYXAgYml0cyB0byB0aGUgQ1VSU09SSUNPTklORk8gc3RydWN0dXJlICovCiAKLSAgICBHZXRCaXRtYXBCaXRzKCBoQW5kQml0cywgc2l6ZUFuZCwgKGNoYXIgKikoaW5mbyArIDEpICk7Ci0gICAgR2V0Qml0bWFwQml0cyggaFhvckJpdHMsIHNpemVYb3IsIChjaGFyICopKGluZm8gKyAxKSArIHNpemVBbmQgKTsKKyAgICBHZXRCaXRtYXBCaXRzMzIoIGhBbmRCaXRzLCBzaXplQW5kLCAoY2hhciAqKShpbmZvICsgMSkgKTsKKyAgICBHZXRCaXRtYXBCaXRzMzIoIGhYb3JCaXRzLCBzaXplWG9yLCAoY2hhciAqKShpbmZvICsgMSkgKyBzaXplQW5kICk7CiAgICAgRGVsZXRlT2JqZWN0MzIoIGhYb3JCaXRzICk7CiAgICAgRGVsZXRlT2JqZWN0MzIoIGhBbmRCaXRzICk7CiAgICAgR2xvYmFsVW5sb2NrMTYoIGhhbmRsZSApOwpAQCAtNzM5LDEyICs3MzgsMTMgQEAKIAogICAgIGlmICghKHB0ciA9IChDVVJTT1JJQ09OSU5GTyAqKUdsb2JhbExvY2sxNiggaEljb24gKSkpIHJldHVybiBGQUxTRTsKICAgICBpZiAoIShoTWVtREMgPSBDcmVhdGVDb21wYXRpYmxlREMzMiggaGRjICkpKSByZXR1cm4gRkFMU0U7Ci0gICAgaEFuZEJpdHMgPSBDcmVhdGVCaXRtYXAoIHB0ci0+bldpZHRoLCBwdHItPm5IZWlnaHQsIDEsIDEsIChjaGFyICopKHB0cisxKSk7Ci0gICAgaFhvckJpdHMgPSBDcmVhdGVCaXRtYXAoIHB0ci0+bldpZHRoLCBwdHItPm5IZWlnaHQsIHB0ci0+YlBsYW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyLT5iQml0c1BlclBpeGVsLCAoY2hhciAqKShwdHIgKyAxKQorICAgIGhBbmRCaXRzID0gQ3JlYXRlQml0bWFwMzIoIHB0ci0+bldpZHRoLCBwdHItPm5IZWlnaHQsIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikocHRyKzEpICk7CisgICAgaFhvckJpdHMgPSBDcmVhdGVCaXRtYXAzMiggcHRyLT5uV2lkdGgsIHB0ci0+bkhlaWdodCwgcHRyLT5iUGxhbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ci0+YkJpdHNQZXJQaXhlbCwgKGNoYXIgKikocHRyICsgMSkKICAgICAgICAgICAgICAgICAgICAgICAgICArIHB0ci0+bkhlaWdodCAqIEJJVE1BUF9XSURUSF9CWVRFUyhwdHItPm5XaWR0aCwxKSApOwotICAgIG9sZEZnID0gU2V0VGV4dENvbG9yKCBoZGMsIFJHQigwLDAsMCkgKTsKLSAgICBvbGRCZyA9IFNldEJrQ29sb3IoIGhkYywgUkdCKDI1NSwyNTUsMjU1KSApOworICAgIG9sZEZnID0gU2V0VGV4dENvbG9yMzIoIGhkYywgUkdCKDAsMCwwKSApOworICAgIG9sZEJnID0gU2V0QmtDb2xvcjMyKCBoZGMsIFJHQigyNTUsMjU1LDI1NSkgKTsKIAogICAgIGlmIChoWG9yQml0cyAmJiBoQW5kQml0cykKICAgICB7CkBAIC03NTgsOCArNzU4LDggQEAKICAgICBpZiAoaFhvckJpdHMpIERlbGV0ZU9iamVjdDMyKCBoWG9yQml0cyApOwogICAgIGlmIChoQW5kQml0cykgRGVsZXRlT2JqZWN0MzIoIGhBbmRCaXRzICk7CiAgICAgR2xvYmFsVW5sb2NrMTYoIGhJY29uICk7Ci0gICAgU2V0VGV4dENvbG9yKCBoZGMsIG9sZEZnICk7Ci0gICAgU2V0QmtDb2xvciggaGRjLCBvbGRCZyApOworICAgIFNldFRleHRDb2xvcjMyKCBoZGMsIG9sZEZnICk7CisgICAgU2V0QmtDb2xvcjMyKCBoZGMsIG9sZEJnICk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKZGlmZiAtLWdpdCBhL29iamVjdHMvZGMuYyBiL29iamVjdHMvZGMuYwppbmRleCA4ODk1MThmLi42ZDMxY2Q4IDEwMDY0NAotLS0gYS9vYmplY3RzL2RjLmMKKysrIGIvb2JqZWN0cy9kYy5jCkBAIC01LDExICs1LDkgQEAKICAqCiAgKi8KIAotI2RlZmluZSBOT19UUkFOU0lUSU9OX1RZUEVTICAvKiBUaGlzIGZpbGUgaXMgV2luMzItY2xlYW4gKi8KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlICJnZGkuaCIKLSNpbmNsdWRlICJiaXRtYXAuaCIKICNpbmNsdWRlICJoZWFwLmgiCiAjaW5jbHVkZSAibWV0YWZpbGUuaCIKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgpAQCAtMTg1LDggKzE4Myw4IEBACiB2b2lkIERDX0luaXREQyggREMqIGRjICkKIHsKICAgICBSZWFsaXplRGVmYXVsdFBhbGV0dGUoIGRjLT5oU2VsZiApOwotICAgIFNldFRleHRDb2xvciggZGMtPmhTZWxmLCBkYy0+dy50ZXh0Q29sb3IgKTsKLSAgICBTZXRCa0NvbG9yKCBkYy0+aFNlbGYsIGRjLT53LmJhY2tncm91bmRDb2xvciApOworICAgIFNldFRleHRDb2xvcjMyKCBkYy0+aFNlbGYsIGRjLT53LnRleHRDb2xvciApOworICAgIFNldEJrQ29sb3IzMiggZGMtPmhTZWxmLCBkYy0+dy5iYWNrZ3JvdW5kQ29sb3IgKTsKICAgICBTZWxlY3RPYmplY3QzMiggZGMtPmhTZWxmLCBkYy0+dy5oUGVuICk7CiAgICAgU2VsZWN0T2JqZWN0MzIoIGRjLT5oU2VsZiwgZGMtPncuaEJydXNoICk7CiAgICAgU2VsZWN0T2JqZWN0MzIoIGRjLT5oU2VsZiwgZGMtPncuaEZvbnQgKTsKQEAgLTY5MCw3ICs2ODgsNyBAQAogICAgICAgICAgICAgICAgaGRjLCBkYy0+aFNlbGYgKTsKIAogICAgICAgLyogQ3JlYXRlIGRlZmF1bHQgYml0bWFwICovCi0gICAgaWYgKCEoaGJpdG1hcCA9IENyZWF0ZUJpdG1hcCggMSwgMSwgMSwgMSwgTlVMTCApKSkKKyAgICBpZiAoIShoYml0bWFwID0gQ3JlYXRlQml0bWFwMzIoIDEsIDEsIDEsIDEsIE5VTEwgKSkpCiAgICAgewogCUdESV9IRUFQX0ZSRUUoIGRjLT5oU2VsZiApOwogCXJldHVybiAwOwpAQCAtODE2LDkgKzgxNCwxOCBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFNldEJrQ29sb3IgICAgKEdESS4xKSAoR0RJMzIuMzA1KQorICogICAgICAgICAgIFNldEJrQ29sb3IxNiAgICAoR0RJLjEpCiAgKi8KLUNPTE9SUkVGIFNldEJrQ29sb3IoIEhEQzMyIGhkYywgQ09MT1JSRUYgY29sb3IgKQorQ09MT1JSRUYgU2V0QmtDb2xvcjE2KCBIREMxNiBoZGMsIENPTE9SUkVGIGNvbG9yICkKK3sKKyAgICByZXR1cm4gU2V0QmtDb2xvcjMyKCBoZGMsIGNvbG9yICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgU2V0QmtDb2xvcjMyICAgIChHREkzMi4zMDUpCisgKi8KK0NPTE9SUkVGIFNldEJrQ29sb3IzMiggSERDMzIgaGRjLCBDT0xPUlJFRiBjb2xvciApCiB7CiAgICAgQ09MT1JSRUYgb2xkQ29sb3I7CiAgICAgREMgKiBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICk7CkBAIC04MzgsOSArODQ1LDE4IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgU2V0VGV4dENvbG9yICAgIChHREkuOSkgKEdESTMyLjMzOCkKKyAqICAgICAgICAgICBTZXRUZXh0Q29sb3IxNiAgICAoR0RJLjkpCiAgKi8KLUNPTE9SUkVGIFNldFRleHRDb2xvciggSERDMzIgaGRjLCBDT0xPUlJFRiBjb2xvciApCitDT0xPUlJFRiBTZXRUZXh0Q29sb3IxNiggSERDMTYgaGRjLCBDT0xPUlJFRiBjb2xvciApCit7CisgICAgcmV0dXJuIFNldFRleHRDb2xvcjMyKCBoZGMsIGNvbG9yICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgU2V0VGV4dENvbG9yMzIgICAgKEdESTMyLjMzOCkKKyAqLworQ09MT1JSRUYgU2V0VGV4dENvbG9yMzIoIEhEQzMyIGhkYywgQ09MT1JSRUYgY29sb3IgKQogewogICAgIENPTE9SUkVGIG9sZENvbG9yOwogICAgIERDICogZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOwpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9kY3ZhbHVlcy5jIGIvb2JqZWN0cy9kY3ZhbHVlcy5jCmluZGV4IGI5MGI0ODQuLjllYTgyMjEgMTAwNjQ0Ci0tLSBhL29iamVjdHMvZGN2YWx1ZXMuYworKysgYi9vYmplY3RzL2RjdmFsdWVzLmMKQEAgLTUsNyArNSw2IEBACiAgKgogICovCiAKLSNkZWZpbmUgTk9fVFJBTlNJVElPTl9UWVBFUyAgLyogVGhpcyBmaWxlIGlzIFdpbjMyLWNsZWFuICovCiAjaW5jbHVkZSAiZ2RpLmgiCiAjaW5jbHVkZSAibWV0YWZpbGUuaCIKIApkaWZmIC0tZ2l0IGEvb2JqZWN0cy9kaWIuYyBiL29iamVjdHMvZGliLmMKaW5kZXggZDQ5YjA5MS4uMjlhYmEzNCAxMDA2NDQKLS0tIGEvb2JqZWN0cy9kaWIuYworKysgYi9vYmplY3RzL2RpYi5jCkBAIC00LDcgKzQsNiBAQAogICogQ29weXJpZ2h0IDE5OTMsMTk5NCAgQWxleGFuZHJlIEp1bGxpYXJkCiAgKi8KIAotI2RlZmluZSBOT19UUkFOU0lUSU9OX1RZUEVTICAvKiBUaGlzIGZpbGUgaXMgV2luMzItY2xlYW4gKi8KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPFgxMS9YbGliLmg+CkBAIC05MDcsOCArOTA2LDggQEAKIAogICAgIC8qIE5vdyBjcmVhdGUgdGhlIGJpdG1hcCAqLwogCi0gICAgaGFuZGxlID0gZkNvbG9yID8gQ3JlYXRlQ29tcGF0aWJsZUJpdG1hcCggaGRjLCB3aWR0aCwgaGVpZ2h0ICkgOgotICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZUJpdG1hcCggd2lkdGgsIGhlaWdodCwgMSwgMSwgTlVMTCApOworICAgIGhhbmRsZSA9IGZDb2xvciA/IENyZWF0ZUNvbXBhdGlibGVCaXRtYXAzMiggaGRjLCB3aWR0aCwgaGVpZ2h0ICkgOgorICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZUJpdG1hcDMyKCB3aWR0aCwgaGVpZ2h0LCAxLCAxLCBOVUxMICk7CiAgICAgaWYgKCFoYW5kbGUpIHJldHVybiAwOwogCiAgICAgaWYgKGluaXQgPT0gQ0JNX0lOSVQpCmRpZmYgLS1naXQgYS9vYmplY3RzL2ZvbnQuYyBiL29iamVjdHMvZm9udC5jCmluZGV4IGVkZjAyNjYuLjc5MTIzNjIgMTAwNjQ0Ci0tLSBhL29iamVjdHMvZm9udC5jCisrKyBiL29iamVjdHMvZm9udC5jCkBAIC0yMDIsMzAgKzIwMiw4MSBAQAogICAgIG1ldHJpY3MtPnRtQXZlQ2hhcldpZHRoID0gYXZlcmFnZTsKIH0KIAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXRHbHlwaE91dExpbmUgICAgKEdESS4zMDkpCisgKiAgICAgICAgICAgR2V0R2x5cGhPdXRsaW5lMTYgICAgKEdESS4zMDkpCiAgKi8KLURXT1JEIEdldEdseXBoT3V0TGluZSggSERDMTYgaGRjLCBVSU5UIHVDaGFyLCBVSU5UIGZ1Rm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICBMUEdMWVBITUVUUklDUyBscGdtLCBEV09SRCBjYkJ1ZmZlciwgTFBTVFIgbHBCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIExQTUFUMiBscG1hdDIpIAorRFdPUkQgR2V0R2x5cGhPdXRsaW5lMTYoIEhEQzE2IGhkYywgVUlOVDE2IHVDaGFyLCBVSU5UMTYgZnVGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgTFBHTFlQSE1FVFJJQ1MxNiBscGdtLCBEV09SRCBjYkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgbHBCdWZmZXIsIGNvbnN0IE1BVDIgKmxwbWF0MiApCiB7Ci0gICAgZnByaW50Ziggc3RkbmltcCwiR2V0R2x5cGhPdXRMaW5lKCUwNHgsICclYycsICUwNHgsICVwLCAlbGQsICVwLCAlcCkgLy8gLSBlbXB0eSBzdHViIVxuIiwKKyAgICBmcHJpbnRmKCBzdGRuaW1wLCJHZXRHbHlwaE91dExpbmUxNiglMDR4LCAnJWMnLCAlMDR4LCAlcCwgJWxkLCAlcCwgJXApIC8vIC0gZW1wdHkgc3R1YiFcbiIsCiAgICAgICAgICAgICAgaGRjLCB1Q2hhciwgZnVGb3JtYXQsIGxwZ20sIGNiQnVmZmVyLCBscEJ1ZmZlciwgbHBtYXQyICk7CiAgICAgcmV0dXJuIChEV09SRCktMTsgLyogZmFpbHVyZSAqLwogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENyZWF0ZVNjYWxhYmxlRm9udFJlc291cmNlICAgIChHREkuMzEwKQorICogICAgICAgICAgIEdldEdseXBoT3V0bGluZTMyQSAgICAoR0RJMzIuMTg2KQogICovCi1CT09MIENyZWF0ZVNjYWxhYmxlRm9udFJlc291cmNlKCBVSU5UIGZIaWRkZW4sTFBTVFIgbHBzelJlc291cmNlRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQU1RSIGxwc3pGb250RmlsZSwgTFBTVFIgbHBzekN1cnJlbnRQYXRoICkKK0RXT1JEIEdldEdseXBoT3V0bGluZTMyQSggSERDMzIgaGRjLCBVSU5UMzIgdUNoYXIsIFVJTlQzMiBmdUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBMUEdMWVBITUVUUklDUzMyIGxwZ20sIERXT1JEIGNiQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBscEJ1ZmZlciwgY29uc3QgTUFUMiAqbHBtYXQyICkKK3sKKyAgICBmcHJpbnRmKCBzdGRuaW1wLCJHZXRHbHlwaE91dExpbmUzMkEoJTA0eCwgJyVjJywgJTA0eCwgJXAsICVsZCwgJXAsICVwKSAvLyAtIGVtcHR5IHN0dWIhXG4iLAorICAgICAgICAgICAgIGhkYywgdUNoYXIsIGZ1Rm9ybWF0LCBscGdtLCBjYkJ1ZmZlciwgbHBCdWZmZXIsIGxwbWF0MiApOworICAgIHJldHVybiAoRFdPUkQpLTE7IC8qIGZhaWx1cmUgKi8KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHZXRHbHlwaE91dGxpbmUzMlcgICAgKEdESTMyLjE4NykKKyAqLworRFdPUkQgR2V0R2x5cGhPdXRsaW5lMzJXKCBIREMzMiBoZGMsIFVJTlQzMiB1Q2hhciwgVUlOVDMyIGZ1Rm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgIExQR0xZUEhNRVRSSUNTMzIgbHBnbSwgRFdPUkQgY2JCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEIGxwQnVmZmVyLCBjb25zdCBNQVQyICpscG1hdDIgKQoreworICAgIGZwcmludGYoIHN0ZG5pbXAsIkdldEdseXBoT3V0TGluZTMyVyglMDR4LCAnJWMnLCAlMDR4LCAlcCwgJWxkLCAlcCwgJXApIC8vIC0gZW1wdHkgc3R1YiFcbiIsCisgICAgICAgICAgICAgaGRjLCB1Q2hhciwgZnVGb3JtYXQsIGxwZ20sIGNiQnVmZmVyLCBscEJ1ZmZlciwgbHBtYXQyICk7CisgICAgcmV0dXJuIChEV09SRCktMTsgLyogZmFpbHVyZSAqLworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENyZWF0ZVNjYWxhYmxlRm9udFJlc291cmNlMTYgICAoR0RJLjMxMCkKKyAqLworQk9PTDE2IENyZWF0ZVNjYWxhYmxlRm9udFJlc291cmNlMTYoIFVJTlQxNiBmSGlkZGVuLCBMUENTVFIgbHBzelJlc291cmNlRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgZm9udEZpbGUsIExQQ1NUUiBwYXRoICkKK3sKKyAgICByZXR1cm4gQ3JlYXRlU2NhbGFibGVGb250UmVzb3VyY2UzMkEoIGZIaWRkZW4sIGxwc3pSZXNvdXJjZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250RmlsZSwgcGF0aCApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDcmVhdGVTY2FsYWJsZUZvbnRSZXNvdXJjZTMyQSAgIChHREkzMi42MikKKyAqLworQk9PTDMyIENyZWF0ZVNjYWxhYmxlRm9udFJlc291cmNlMzJBKCBEV09SRCBmSGlkZGVuLCBMUENTVFIgbHBzelJlc291cmNlRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIGxwc3pGb250RmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIGxwc3pDdXJyZW50UGF0aCApCiB7CiAgICAgLyogZkhpZGRlbj0xIC0gb25seSB2aXNpYmxlIGZvciB0aGUgY2FsbGluZyBhcHAsIHJlYWQtb25seSwgbm90CiAgICAgICogZW51bWJlcmVkIHdpdGggRW51bUZvbnRzL0VudW1Gb250RmFtaWxpZXMKICAgICAgKiBscHN6Q3VycmVudFBhdGggY2FuIGJlIE5VTEwKICAgICAgKi8KLSAgICBmcHJpbnRmKHN0ZG5pbXAsIkNyZWF0ZVNjYWxhYmxlRm9udFJlc291cmNlKCVkLCVzLCVzLCVzKSAvLyBlbXB0eSBzdHViIVxuIiwKKyAgICBmcHJpbnRmKHN0ZG5pbXAsIkNyZWF0ZVNjYWxhYmxlRm9udFJlc291cmNlKCVsZCwlcywlcywlcykgLy8gZW1wdHkgc3R1YlxuIiwKKyAgICAgICAgICAgIGZIaWRkZW4sIGxwc3pSZXNvdXJjZUZpbGUsIGxwc3pGb250RmlsZSwgbHBzekN1cnJlbnRQYXRoICk7CisgICAgcmV0dXJuIEZBTFNFOyAvKiBjcmVhdGUgZmFpbGVkICovCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ3JlYXRlU2NhbGFibGVGb250UmVzb3VyY2UzMlcgICAoR0RJMzIuNjMpCisgKi8KK0JPT0wzMiBDcmVhdGVTY2FsYWJsZUZvbnRSZXNvdXJjZTMyVyggRFdPUkQgZkhpZGRlbiwgTFBDV1NUUiBscHN6UmVzb3VyY2VGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENXU1RSIGxwc3pGb250RmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDV1NUUiBscHN6Q3VycmVudFBhdGggKQoreworICAgIGZwcmludGYoc3RkbmltcCwiQ3JlYXRlU2NhbGFibGVGb250UmVzb3VyY2UzMlcoJWxkLCVwLCVwLCVwKSAvLyBlbXB0eSBzdHViXG4iLAogICAgICAgICAgICAgZkhpZGRlbiwgbHBzelJlc291cmNlRmlsZSwgbHBzekZvbnRGaWxlLCBscHN6Q3VycmVudFBhdGggKTsKICAgICByZXR1cm4gRkFMU0U7IC8qIGNyZWF0ZSBmYWlsZWQgKi8KIH0KQEAgLTg5MCw5ICs5NDEsMTggQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBBZGRGb250UmVzb3VyY2UgICAgKEdESS4xMTkpCisgKiAgICAgICAgICAgQWRkRm9udFJlc291cmNlMTYgICAgKEdESS4xMTkpCiAgKi8KLUlOVCBBZGRGb250UmVzb3VyY2UoIExQQ1NUUiBzdHIgKQorSU5UMTYgQWRkRm9udFJlc291cmNlMTYoIExQQ1NUUiBzdHIgKQoreworICAgIHJldHVybiBBZGRGb250UmVzb3VyY2UzMkEoIHN0ciApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEFkZEZvbnRSZXNvdXJjZTMyQSAgICAoR0RJMzIuMikKKyAqLworSU5UMzIgQWRkRm9udFJlc291cmNlMzJBKCBMUENTVFIgc3RyICkKIHsKICAgICBpZiAoSElXT1JEKHN0cikpCiAgICAgICAgIGZwcmludGYoIHN0ZG5pbXAsICJTVFVCOiBBZGRGb250UmVzb3VyY2UoJyVzJylcbiIsIHN0ciApOwpAQCAtOTAzLDkgKzk2MywyOCBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFJlbW92ZUZvbnRSZXNvdXJjZSAgICAoR0RJLjEzNikKKyAqICAgICAgICAgICBBZGRGb250UmVzb3VyY2UzMlcgICAgKEdESTMyLjQpCiAgKi8KLUJPT0wgUmVtb3ZlRm9udFJlc291cmNlKCBMUFNUUiBzdHIgKQorSU5UMzIgQWRkRm9udFJlc291cmNlMzJXKCBMUENXU1RSIHN0ciApCit7CisgICAgZnByaW50Ziggc3RkbmltcCwgIlNUVUI6IEFkZEZvbnRSZXNvdXJjZTMyVyglcClcbiIsIHN0ciApOworICAgIHJldHVybiAxOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFJlbW92ZUZvbnRSZXNvdXJjZTE2ICAgIChHREkuMTM2KQorICovCitCT09MMTYgUmVtb3ZlRm9udFJlc291cmNlMTYoIExQQ1NUUiBzdHIgKQoreworICAgIHJldHVybiBSZW1vdmVGb250UmVzb3VyY2UzMkEoIHN0ciApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFJlbW92ZUZvbnRSZXNvdXJjZTMyQSAgICAoR0RJMzIuMjg0KQorICovCitCT09MMzIgUmVtb3ZlRm9udFJlc291cmNlMzJBKCBMUENTVFIgc3RyICkKIHsKICAgICBpZiAoSElXT1JEKHN0cikpCiAgICAgICAgIGZwcmludGYoIHN0ZG5pbXAsICJTVFVCOiBSZW1vdmVGb250UmVzb3VyY2UoJyVzJylcbiIsIHN0ciApOwpAQCAtOTE0LDYgKzk5MywxNyBAQAogICAgIHJldHVybiBUUlVFOwogfQogCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFJlbW92ZUZvbnRSZXNvdXJjZTMyVyAgICAoR0RJMzIuMjg2KQorICovCitCT09MMzIgUmVtb3ZlRm9udFJlc291cmNlMzJXKCBMUENXU1RSIHN0ciApCit7CisgICAgZnByaW50Ziggc3RkbmltcCwgIlNUVUI6IFJlbW92ZUZvbnRSZXNvdXJjZTMyVyglcClcbiIsIHN0ciApOworICAgIHJldHVybiBUUlVFOworfQorCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJCQlGT05UX1BhcnNlRm9udFBhcm1zCQlbaW50ZXJuYWxdCiAgKi8KQEAgLTEzNTAsMTAgKzE0NDAsMTggQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCQkJR2V0UmFzdGVyaXplckNhcHMJW0dESS4zMTNdCisgKiAgICAgICAgICAgICBHZXRSYXN0ZXJpemVyQ2FwczE2ICAgKEdESS4zMTMpCiAgKi8KK0JPT0wxNiBHZXRSYXN0ZXJpemVyQ2FwczE2KCBMUFJBU1RFUklaRVJfU1RBVFVTIGxwcnMsIFVJTlQxNiBjYk51bUJ5dGVzICkKK3sKKyAgICByZXR1cm4gR2V0UmFzdGVyaXplckNhcHMzMiggbHBycywgY2JOdW1CeXRlcyApOworfQogCi1CT09MIEdldFJhc3Rlcml6ZXJDYXBzKExQUkFTVEVSSVpFUl9TVEFUVVMgbHBycywgVUlOVCBjYk51bUJ5dGVzKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgR2V0UmFzdGVyaXplckNhcHMzMiAgIChHREkzMi4yMTYpCisgKi8KK0JPT0wzMiBHZXRSYXN0ZXJpemVyQ2FwczMyKCBMUFJBU1RFUklaRVJfU1RBVFVTIGxwcnMsIFVJTlQzMiBjYk51bUJ5dGVzICkKIHsKICAgLyogVGhpcyBpcyBub3QgbXVjaCBtb3JlIHRoYW4gYSBkdW1teSAqLwogICBSQVNURVJJWkVSX1NUQVRVUyByczsKQEAgLTEzNjEsMjIgKzE0NTksNDkgQEAKICAgcnMublNpemUgPSBzaXplb2YocnMpOwogICBycy53RmxhZ3MgPSAwOwogICBycy5uTGFuZ3VhZ2VJRCA9IDA7Ci0gIHJldHVybiBUcnVlOworICByZXR1cm4gVFJVRTsKIH0KIAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgR2V0S2VybmluZ1BhaXJzICAgICAgW0dESS4zMzJdCisgKiAgICAgICAgICAgICBHZXRLZXJuaW5nUGFpcnMxNiAgIChHREkuMzMyKQogICovCi1pbnQgR2V0S2VybmluZ1BhaXJzKEhEQzE2IGhEQyxpbnQgY1BhaXJzLExQS0VSTklOR1BBSVIxNiBscEtlcm5pbmdQYWlycykKK0lOVDE2IEdldEtlcm5pbmdQYWlyczE2KCBIREMxNiBoREMsIElOVDE2IGNQYWlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICBMUEtFUk5JTkdQQUlSMTYgbHBLZXJuaW5nUGFpcnMgKQogewogICAgIC8qIFRoaXMgaGFzIHRvIGJlIGRlYWx0IHdpdGggd2hlbiBwcm9wZXIgZm9udCBoYW5kbGluZyBpcyBpbiBwbGFjZSAKICAgICAgKgogICAgICAqIEF0IHRoaXMgdGltZSBrZXJuaW5nIGlzIGlnbm9yZWQgKHNldCB0byAwKQogICAgICAqLwotCiAgICAgaW50IGk7Ci0gICAgZnByaW50ZihzdGRuaW1wLCJHZXRLZXJuaW5nUGFpcnM6IGFsbW9zdCBlbXB0eSBzdHViIVxuIik7CisgICAgZnByaW50ZihzdGRuaW1wLCJHZXRLZXJuaW5nUGFpcnMxNjogYWxtb3N0IGVtcHR5IHN0dWIhXG4iKTsKICAgICBmb3IgKGkgPSAwOyBpIDwgY1BhaXJzOyBpKyspIGxwS2VybmluZ1BhaXJzW2ldLmlLZXJuQW1vdW50ID0gMDsKICAgICByZXR1cm4gMDsKIH0KIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgR2V0S2VybmluZ1BhaXJzMzJBICAgKEdESTMyLjE5MikKKyAqLworRFdPUkQgR2V0S2VybmluZ1BhaXJzMzJBKCBIREMzMiBoREMsIERXT1JEIGNQYWlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFBLRVJOSU5HUEFJUjMyIGxwS2VybmluZ1BhaXJzICkKK3sKKyAgICAvKiBUaGlzIGhhcyB0byBiZSBkZWFsdCB3aXRoIHdoZW4gcHJvcGVyIGZvbnQgaGFuZGxpbmcgaXMgaW4gcGxhY2UgCisgICAgICoKKyAgICAgKiBBdCB0aGlzIHRpbWUga2VybmluZyBpcyBpZ25vcmVkIChzZXQgdG8gMCkKKyAgICAgKi8KKyAgICBpbnQgaTsKKyAgICBmcHJpbnRmKHN0ZG5pbXAsIkdldEtlcm5pbmdQYWlyczMyOiBhbG1vc3QgZW1wdHkgc3R1YiFcbiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBjUGFpcnM7IGkrKykgbHBLZXJuaW5nUGFpcnNbaV0uaUtlcm5BbW91bnQgPSAwOworICAgIHJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICBHZXRLZXJuaW5nUGFpcnMzMlcgICAoR0RJMzIuMTkzKQorICovCitEV09SRCBHZXRLZXJuaW5nUGFpcnMzMlcoIEhEQzMyIGhEQywgRFdPUkQgY1BhaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMUEtFUk5JTkdQQUlSMzIgbHBLZXJuaW5nUGFpcnMgKQoreworICAgIHJldHVybiBHZXRLZXJuaW5nUGFpcnMzMkEoIGhEQywgY1BhaXJzLCBscEtlcm5pbmdQYWlycyApOworfQpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9nZGlvYmouYyBiL29iamVjdHMvZ2Rpb2JqLmMKaW5kZXggZDhlY2NhYS4uNDQyMmVkOCAxMDA2NDQKLS0tIGEvb2JqZWN0cy9nZGlvYmouYworKysgYi9vYmplY3RzL2dkaW9iai5jCkBAIC00LDcgKzQsNiBAQAogICogQ29weXJpZ2h0IDE5OTMgQWxleGFuZHJlIEp1bGxpYXJkCiAgKi8KIAotI2RlZmluZSBOT19UUkFOU0lUSU9OX1RZUEVTICAvKiBUaGlzIGZpbGUgaXMgV2luMzItY2xlYW4gKi8KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgImNvbG9yLmgiCmRpZmYgLS1naXQgYS9vYmplY3RzL2xpbmVkZGEuYyBiL29iamVjdHMvbGluZWRkYS5jCmluZGV4IGJlOTY5M2YuLmQwY2Y4NzEgMTAwNjQ0Ci0tLSBhL29iamVjdHMvbGluZWRkYS5jCisrKyBiL29iamVjdHMvbGluZWRkYS5jCkBAIC00LDcgKzQsNiBAQAogICogQ29weXJpZ2h0IDE5OTMgQm9iIEFtc3RhZHQKICAqLwogCi0jZGVmaW5lIE5PX1RSQU5TSVRJT05fVFlQRVMgIC8qIFRoaXMgZmlsZSBpcyBXaW4zMi1jbGVhbiAqLwogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKIApkaWZmIC0tZ2l0IGEvb2JqZWN0cy9tZXRhZmlsZS5jIGIvb2JqZWN0cy9tZXRhZmlsZS5jCmluZGV4IGQ1ZGNmMTIuLjY0NzAxZTkgMTAwNjQ0Ci0tLSBhL29iamVjdHMvbWV0YWZpbGUuYworKysgYi9vYmplY3RzL21ldGFmaWxlLmMKQEAgLTIxNyw3ICsyMTcsNyBAQAogCiBCT09MMTYgSXNWYWxpZE1ldGFGaWxlKEhNRVRBRklMRTE2IGhtZikKIHsKLSAgICBCT09MIHJlc3U9RkFMU0U7CisgICAgQk9PTDE2IHJlc3U9RkFMU0U7CiAgICAgTUVUQUhFQURFUiAqbWggPSAoTUVUQUhFQURFUiAqKUdsb2JhbExvY2sxNihobWYpOwogICAgIGlmIChtaCkgewogICAgICAgaWYgKG1oLT5tdFR5cGUgPT0gMSB8fCBtaC0+bXRUeXBlID09IDApIApAQCAtMjc2LDcgKzI3Niw3IEBACiAJZHByaW50Zl9tZXRhZmlsZShzdGRkZWIsIm9mZnNldCA9ICUwNHggc2l6ZSA9ICUwOGx4IGZ1bmN0aW9uID0gJTA0eFxuIiwKIAkJCSBvZmZzZXQsbXItPnJkU2l6ZSxtci0+cmRGdW5jdGlvbik7CiAJb2Zmc2V0ICs9IG1yLT5yZFNpemUgKiAyOwotCVBsYXlNZXRhRmlsZVJlY29yZChoZGMsIGh0LCBtciwgbWgtPm10Tm9PYmplY3RzKTsKKwlQbGF5TWV0YUZpbGVSZWNvcmQxNiggaGRjLCBodCwgbXIsIG1oLT5tdE5vT2JqZWN0cyApOwogICAgIH0KIAogICAgIFNlbGVjdE9iamVjdDMyKGhkYywgaEJydXNoKTsKQEAgLTI5NiwxMSArMjk2LDExIEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICBFbnVtTWV0YWZpbGUgICAgICAgICBHREkuMTc1ICAgIAorICogICAgICAgICAgICBFbnVtTWV0YUZpbGUxNiAgIChHREkuMTc1KQogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOaWVscyBkZSBjYXJwZW50aWVyLCBhcHJpbCAxOTk2CiAgKi8KLQotQk9PTCBFbnVtTWV0YUZpbGUoSERDMTYgaGRjLCBITUVUQUZJTEUxNiBobWYsIE1GRU5VTVBST0MxNiBscEVudW1GdW5jLExQQVJBTSBscERhdGEpCitCT09MMTYgRW51bU1ldGFGaWxlMTYoIEhEQzE2IGhkYywgSE1FVEFGSUxFMTYgaG1mLCBNRkVOVU1QUk9DMTYgbHBFbnVtRnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgTFBBUkFNIGxwRGF0YSApCiB7CiAgICAgTUVUQUhFQURFUiAqbWggPSAoTUVUQUhFQURFUiAqKUdsb2JhbExvY2sxNihobWYpOwogICAgIE1FVEFSRUNPUkQgKm1yOwpAQCAtMzQxLDExICszNDEsMTAgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgIFBsYXlNZXRhRmlsZVJlY29yZCAgICAgIEdESS4xNzYKKyAqICAgICAgICAgICAgIFBsYXlNZXRhRmlsZVJlY29yZDE2ICAgKEdESS4xNzYpCiAgKi8KLQotdm9pZCBQbGF5TWV0YUZpbGVSZWNvcmQoSERDMTYgaGRjLCBIQU5ETEVUQUJMRTE2ICpodCwgTUVUQVJFQ09SRCAqbXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBXT1JEIG5IYW5kbGVzKQordm9pZCBQbGF5TWV0YUZpbGVSZWNvcmQxNiggSERDMTYgaGRjLCBIQU5ETEVUQUJMRTE2ICpodCwgTUVUQVJFQ09SRCAqbXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMTYgbkhhbmRsZXMgKQogewogICAgIHNob3J0IHMxOwogICAgIEhBTkRMRTE2IGhuZGw7CkBAIC0zNjYsNyArMzY1LDcgQEAKICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBNRVRBX1NFVEJLQ09MT1I6Ci0JU2V0QmtDb2xvcihoZGMsIE1BS0VMT05HKCoobXItPnJkUGFyYW0pLCAqKG1yLT5yZFBhcmFtICsgMSkpKTsKKwlTZXRCa0NvbG9yMTYoaGRjLCBNQUtFTE9ORygqKG1yLT5yZFBhcmFtKSwgKihtci0+cmRQYXJhbSArIDEpKSk7CiAJYnJlYWs7CiAKICAgICBjYXNlIE1FVEFfU0VUQktNT0RFOgpAQCAtMzkzLDcgKzM5Miw3IEBACiAJU2V0U3RyZXRjaEJsdE1vZGUxNihoZGMsICoobXItPnJkUGFyYW0pKTsKIAlicmVhazsKICAgICBjYXNlIE1FVEFfU0VUVEVYVENPTE9SOgotCVNldFRleHRDb2xvcihoZGMsIE1BS0VMT05HKCoobXItPnJkUGFyYW0pLCAqKG1yLT5yZFBhcmFtICsgMSkpKTsKKwlTZXRUZXh0Q29sb3IxNihoZGMsIE1BS0VMT05HKCoobXItPnJkUGFyYW0pLCAqKG1yLT5yZFBhcmFtICsgMSkpKTsKIAlicmVhazsKIAogICAgIGNhc2UgTUVUQV9TRVRXSU5ET1dPUkc6CkBAIC01NDMsNyArNTQyLDcgQEAKIAljYXNlIEJTX1BBVFRFUk46CiAJICAgIGluZm9oZHIgPSAoQklUTUFQSU5GT0hFQURFUiAqKShtci0+cmRQYXJhbSArIDIpOwogCSAgICBNRl9BZGRIYW5kbGUoaHQsIG5IYW5kbGVzLAotCQkJIENyZWF0ZVBhdHRlcm5CcnVzaDMyKENyZWF0ZUJpdG1hcChpbmZvaGRyLT5iaVdpZHRoLCAKKwkJCSBDcmVhdGVQYXR0ZXJuQnJ1c2gzMihDcmVhdGVCaXRtYXAzMihpbmZvaGRyLT5iaVdpZHRoLCAKIAkJCQkgICAgICBpbmZvaGRyLT5iaUhlaWdodCwgCiAJCQkJICAgICAgaW5mb2hkci0+YmlQbGFuZXMsIAogCQkJCSAgICAgIGluZm9oZHItPmJpQml0Q291bnQsCkBAIC02NjAsMTEgKzY1OSwxMSBAQAogICAgIGNhc2UgTUVUQV9TVFJFVENIQkxUOgogICAgICAgewogICAgICAgIEhEQzE2IGhkY1NyYz1DcmVhdGVDb21wYXRpYmxlREMxNihoZGMpOwotICAgICAgIEhCSVRNQVAxNiBoYml0bWFwPUNyZWF0ZUJpdG1hcChtci0+cmRQYXJhbVsxMF0sIC8qV2lkdGggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXItPnJkUGFyYW1bMTFdLCAvKkhlaWdodCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1yLT5yZFBhcmFtWzEzXSwgLypQbGFuZXMqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtci0+cmRQYXJhbVsxNF0sIC8qQml0c1BpeGVsKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQU1RSKSZtci0+cmRQYXJhbVsxNV0pOyAgLypiaXRzKi8KKyAgICAgICBIQklUTUFQMzIgaGJpdG1hcD1DcmVhdGVCaXRtYXAzMihtci0+cmRQYXJhbVsxMF0sIC8qV2lkdGggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtci0+cmRQYXJhbVsxMV0sIC8qSGVpZ2h0Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtci0+cmRQYXJhbVsxM10sIC8qUGxhbmVzKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtci0+cmRQYXJhbVsxNF0sIC8qQml0c1BpeGVsKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBTVFIpJm1yLT5yZFBhcmFtWzE1XSk7ICAvKmJpdHMqLwogICAgICAgIFNlbGVjdE9iamVjdDMyKGhkY1NyYyxoYml0bWFwKTsKICAgICAgICBTdHJldGNoQmx0MTYoaGRjLG1yLT5yZFBhcmFtWzldLG1yLT5yZFBhcmFtWzhdLAogICAgICAgICAgICAgICAgICAgICBtci0+cmRQYXJhbVs3XSxtci0+cmRQYXJhbVs2XSwKQEAgLTY3OCw5ICs2NzcsMTEgQEAKICAgICBjYXNlIE1FVEFfQklUQkxUOiAgICAgICAgICAgIC8qIDwtLSBub3QgeWV0IGRlYnVnZ2VkICovCiAgICAgICB7CiAgICAgICAgSERDMTYgaGRjU3JjPUNyZWF0ZUNvbXBhdGlibGVEQzE2KGhkYyk7Ci0gICAgICAgSEJJVE1BUDE2IGhiaXRtYXA9Q3JlYXRlQml0bWFwKG1yLT5yZFBhcmFtWzddLypXaWR0aCAqLyxtci0+cmRQYXJhbVs4XS8qSGVpZ2h0Ki8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXItPnJkUGFyYW1bMTBdLypQbGFuZXMqLyxtci0+cmRQYXJhbVsxMV0vKkJpdHNQaXhlbCovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUFNUUikmbXItPnJkUGFyYW1bMTJdLypiaXRzKi8pOworICAgICAgIEhCSVRNQVAzMiBoYml0bWFwPUNyZWF0ZUJpdG1hcDMyKG1yLT5yZFBhcmFtWzddLypXaWR0aCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtci0+cmRQYXJhbVs4XS8qSGVpZ2h0Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXItPnJkUGFyYW1bMTBdLypQbGFuZXMqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtci0+cmRQYXJhbVsxMV0vKkJpdHNQaXhlbCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUFNUUikmbXItPnJkUGFyYW1bMTJdLypiaXRzKi8pOwogICAgICAgIFNlbGVjdE9iamVjdDMyKGhkY1NyYyxoYml0bWFwKTsKICAgICAgICBCaXRCbHQzMihoZGMsKElOVDE2KW1yLT5yZFBhcmFtWzZdLChJTlQxNiltci0+cmRQYXJhbVs1XSwKICAgICAgICAgICAgICAgICAoSU5UMTYpbXItPnJkUGFyYW1bNF0sKElOVDE2KW1yLT5yZFBhcmFtWzNdLApAQCAtMTE2Miw3ICsxMTYzLDggQEAKICAgICAqKG1yLT5yZFBhcmFtICsxMCkgPSBCTS5ibVBsYW5lczsKICAgICAqKG1yLT5yZFBhcmFtICsxMSkgPSBCTS5ibUJpdHNQaXhlbDsKICAgICBkcHJpbnRmX21ldGFmaWxlKHN0ZGRlYiwiTUZfU3RyZXRjaEJsdC0+bGVuID0gJWxkICByb3A9JWx4ICBcbiIsbGVuLHJvcCk7Ci0gICAgaWYgKEdldEJpdG1hcEJpdHMoZGNTcmMtPncuaEJpdG1hcCxCTS5ibVdpZHRoQnl0ZXMgKiBCTS5ibUhlaWdodCxtci0+cmRQYXJhbSArMTIpKQorICAgIGlmIChHZXRCaXRtYXBCaXRzMzIoZGNTcmMtPncuaEJpdG1hcCxCTS5ibVdpZHRoQnl0ZXMgKiBCTS5ibUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1yLT5yZFBhcmFtICsxMikpCiAgICAgewogICAgICAgbXItPnJkU2l6ZSA9IGxlbiAvIHNpemVvZihJTlQxNik7CiAgICAgICAqKG1yLT5yZFBhcmFtKSA9IEhJV09SRChyb3ApOwpAQCAtMTIyNyw3ICsxMjI5LDcgQEAKIAogICAgIGRwcmludGZfbWV0YWZpbGUoc3RkZGViLCJNRl9TdHJldGNoQmx0VmlhRElCLT5sZW4gPSAlbGQgIHJvcD0lbHggIFBpeFlQTT0lbGQgQ2Fwcz0lZFxuIiwKICAgICAgICAgICAgICAgIGxlbixyb3AsbHBCTUktPmJpWVBlbHNQZXJNZXRlcixHZXREZXZpY2VDYXBzKGhkY1NyYyxMT0dQSVhFTFNZKSk7Ci0gICAgaWYgKEdldERJQml0cyhoZGNTcmMsZGNTcmMtPncuaEJpdG1hcCwwLChVSU5UKWxwQk1JLT5iaUhlaWdodCwKKyAgICBpZiAoR2V0RElCaXRzKGhkY1NyYyxkY1NyYy0+dy5oQml0bWFwLDAsKFVJTlQzMilscEJNSS0+YmlIZWlnaHQsCiAgICAgICAgICAgICAgICAgICAoTFBTVFIpbHBCTUkgKyBESUJfQml0bWFwSW5mb1NpemUoIChCSVRNQVBJTkZPICopbHBCTUksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJQl9SR0JfQ09MT1JTICksCiAgICAgICAgICAgICAgICAgICAoTFBCSVRNQVBJTkZPKWxwQk1JLCBESUJfUkdCX0NPTE9SUykpCkBAIC0xMjQzLDcgKzEyNDUsOCBAQAogICAgICoobXItPnJkUGFyYW0gKzEzKSA9IEJNLmJtUGxhbmVzOwogICAgICoobXItPnJkUGFyYW0gKzE0KSA9IEJNLmJtQml0c1BpeGVsOwogICAgIGRwcmludGZfbWV0YWZpbGUoc3RkZGViLCJNRl9TdHJldGNoQmx0LT5sZW4gPSAlbGQgIHJvcD0lbHggIFxuIixsZW4scm9wKTsKLSAgICBpZiAoR2V0Qml0bWFwQml0cyhkY1NyYy0+dy5oQml0bWFwLEJNLmJtV2lkdGhCeXRlcyAqIEJNLmJtSGVpZ2h0LG1yLT5yZFBhcmFtICsxNSkpCisgICAgaWYgKEdldEJpdG1hcEJpdHMzMiggZGNTcmMtPncuaEJpdG1hcCwgQk0uYm1XaWR0aEJ5dGVzICogQk0uYm1IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgbXItPnJkUGFyYW0gKzE1KSkKICNlbmRpZiAgICAKICAgICB7CiAgICAgICBtci0+cmRTaXplID0gbGVuIC8gc2l6ZW9mKElOVDE2KTsKZGlmZiAtLWdpdCBhL29iamVjdHMvb2VtYml0bWFwLmMgYi9vYmplY3RzL29lbWJpdG1hcC5jCmluZGV4IDIyNGY2NTguLjZmYjhhYWIgMTAwNjQ0Ci0tLSBhL29iamVjdHMvb2VtYml0bWFwLmMKKysrIGIvb2JqZWN0cy9vZW1iaXRtYXAuYwpAQCAtNSw3ICs1LDYgQEAKICAqCiAgKi8KIAotI2RlZmluZSBOT19UUkFOU0lUSU9OX1RZUEVTICAvKiBUaGlzIGZpbGUgaXMgV2luMzItY2xlYW4gKi8KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxYMTEvWGxpYi5oPgpAQCAtNDgyLDkgKzQ4MSw5IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoaEFuZEJpdHMpIEdldEJpdG1hcEJpdHMoIGhBbmRCaXRzLCBzaXplQW5kLCAoY2hhciAqKShwSW5mbyArIDEpICk7CisgICAgaWYgKGhBbmRCaXRzKSBHZXRCaXRtYXBCaXRzMzIoIGhBbmRCaXRzLCBzaXplQW5kLCAoY2hhciAqKShwSW5mbyArIDEpICk7CiAgICAgZWxzZSBtZW1zZXQoIChjaGFyICopKHBJbmZvICsgMSksIDB4ZmYsIHNpemVBbmQgKTsKLSAgICBHZXRCaXRtYXBCaXRzKCBoWG9yQml0cywgc2l6ZVhvciwgKGNoYXIgKikocEluZm8gKyAxKSArIHNpemVBbmQgKTsKKyAgICBHZXRCaXRtYXBCaXRzMzIoIGhYb3JCaXRzLCBzaXplWG9yLCAoY2hhciAqKShwSW5mbyArIDEpICsgc2l6ZUFuZCApOwogCiAgICAgRGVsZXRlT2JqZWN0MzIoIGhYb3JCaXRzICk7CiAgICAgRGVsZXRlT2JqZWN0MzIoIGhBbmRCaXRzICk7CmRpZmYgLS1naXQgYS9vYmplY3RzL3BhbGV0dGUuYyBiL29iamVjdHMvcGFsZXR0ZS5jCmluZGV4IDVjMzhkMjMuLjlmYWNhNWYgMTAwNjQ0Ci0tLSBhL29iamVjdHMvcGFsZXR0ZS5jCisrKyBiL29iamVjdHMvcGFsZXR0ZS5jCkBAIC02LDcgKzYsNiBAQAogICoKICAqLwogCi0jZGVmaW5lIE5PX1RSQU5TSVRJT05fVFlQRVMgIC8qIFRoaXMgZmlsZSBpcyBXaW4zMi1jbGVhbiAqLwogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPFgxMS9YbGliLmg+CkBAIC01NzIsMTAgKzU3MSw5IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCSAgICBVcGRhdGVDb2xvcnMJKEdESS4zNjYpCi0gKgorICogICAgICAgICAgICBVcGRhdGVDb2xvcnMxNiAgIChHREkuMzY2KQogICovCi1pbnQgVXBkYXRlQ29sb3JzKCBIREMxNiBoREMgKQorSU5UMTYgVXBkYXRlQ29sb3JzMTYoIEhEQzE2IGhEQyApCiB7CiAgICAgSFdORDMyIGhXbmQgPSBXaW5kb3dGcm9tREMzMiggaERDICk7CiAKQEAgLTU4NywzICs1ODUsMTIgQEAKICAgICByZXR1cm4gMHg2NjY7CiB9CiAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgVXBkYXRlQ29sb3JzMzIgICAoR0RJMzIuMzU5KQorICovCitCT09MMzIgVXBkYXRlQ29sb3JzMzIoIEhEQzMyIGhEQyApCit7CisgICAgVXBkYXRlQ29sb3JzMTYoIGhEQyApOworICAgIHJldHVybiBUUlVFOworfQpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9wZW4uYyBiL29iamVjdHMvcGVuLmMKaW5kZXggMmNjYTU3Ni4uZjMzYjc5MSAxMDA2NDQKLS0tIGEvb2JqZWN0cy9wZW4uYworKysgYi9vYmplY3RzL3Blbi5jCkBAIC00LDcgKzQsNiBAQAogICogQ29weXJpZ2h0IDE5OTMgQWxleGFuZHJlIEp1bGxpYXJkCiAgKi8KIAotI2RlZmluZSBOT19UUkFOU0lUSU9OX1RZUEVTICAvKiBUaGlzIGZpbGUgaXMgV2luMzItY2xlYW4gKi8KICNpbmNsdWRlICJwZW4uaCIKICNpbmNsdWRlICJtZXRhZmlsZS5oIgogI2luY2x1ZGUgImNvbG9yLmgiCmRpZmYgLS1naXQgYS9vYmplY3RzL3JlZ2lvbi5jIGIvb2JqZWN0cy9yZWdpb24uYwppbmRleCAxOGU4MDhkLi4zNTc1MTMyIDEwMDY0NAotLS0gYS9vYmplY3RzL3JlZ2lvbi5jCisrKyBiL29iamVjdHMvcmVnaW9uLmMKQEAgLTQsNyArNCw2IEBACiAgKiBDb3B5cmlnaHQgMTk5MywgMTk5NCwgMTk5NSBBbGV4YW5kcmUgSnVsbGlhcmQKICAqLwogCi0jZGVmaW5lIE5PX1RSQU5TSVRJT05fVFlQRVMgIC8qIFRoaXMgZmlsZSBpcyBXaW4zMi1jbGVhbiAqLwogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSAicmVnaW9uLmgiCkBAIC0xMzcsOSArMTM2LDIwIEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgU2V0UmVjdFJnbiAgICAoR0RJLjE3MikgKEdESTMyLjMzMikKKyAqICAgICAgICAgICBTZXRSZWN0UmduMTYgICAgKEdESS4xNzIpCiAgKi8KLVZPSUQgU2V0UmVjdFJnbiggSFJHTjMyIGhyZ24sIElOVDMyIGxlZnQsIElOVDMyIHRvcCwgSU5UMzIgcmlnaHQsIElOVDMyIGJvdHRvbSkKK1ZPSUQgU2V0UmVjdFJnbjE2KCBIUkdOMTYgaHJnbiwgSU5UMTYgbGVmdCwgSU5UMTYgdG9wLAorICAgICAgICAgICAgICAgICAgIElOVDE2IHJpZ2h0LCBJTlQxNiBib3R0b20gKQoreworICAgIFNldFJlY3RSZ24zMiggaHJnbiwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgU2V0UmVjdFJnbjMyICAgIChHREkzMi4zMzIpCisgKi8KK1ZPSUQgU2V0UmVjdFJnbjMyKCBIUkdOMzIgaHJnbiwgSU5UMzIgbGVmdCwgSU5UMzIgdG9wLAorICAgICAgICAgICAgICAgICAgIElOVDMyIHJpZ2h0LCBJTlQzMiBib3R0b20gKQogewogICAgIFJHTk9CSiAqIG9iajsKIApkaWZmIC0tZ2l0IGEvb2JqZWN0cy90ZXh0LmMgYi9vYmplY3RzL3RleHQuYwppbmRleCAxZmNmNjIyLi5jZTc1NzJiIDEwMDY0NAotLS0gYS9vYmplY3RzL3RleHQuYworKysgYi9vYmplY3RzL3RleHQuYwpAQCAtNDAxLDEwICs0MDEsOSBAQAogCiAgICAgaWYgKCFjY2gpIGNjaCA9IGxzdHJsZW4xNiggKExQQ1NUUilQVFJfU0VHX1RPX0xJTihsUGFyYW0pICk7CiAgICAgaWYgKGdzcHJjKSByZXR1cm4gZ3NwcmMoIGhkYywgbFBhcmFtLCBjY2ggKTsKLSAgICBjdXJyZW50X2NvbG9yID0gR2V0VGV4dENvbG9yMzIoIGhkYyApOwotICAgIFNldFRleHRDb2xvciggaGRjLCBHZXRTeXNDb2xvcjMyKENPTE9SX0dSQVlURVhUKSApOworICAgIGN1cnJlbnRfY29sb3IgPSBTZXRUZXh0Q29sb3IzMiggaGRjLCBHZXRTeXNDb2xvcjMyKENPTE9SX0dSQVlURVhUKSApOwogICAgIHJldCA9IFRleHRPdXQxNiggaGRjLCB4LCB5LCAoTFBDU1RSKVBUUl9TRUdfVE9fTElOKGxQYXJhbSksIGNjaCApOwotICAgIFNldFRleHRDb2xvciggaGRjLCBjdXJyZW50X2NvbG9yICk7CisgICAgU2V0VGV4dENvbG9yMzIoIGhkYywgY3VycmVudF9jb2xvciApOwogICAgIHJldHVybiByZXQ7CiB9CiAKQEAgLTQyMSwxMCArNDIwLDkgQEAKIAogICAgIGlmICghY2NoKSBjY2ggPSBsc3RybGVuMzJBKCAoTFBDU1RSKWxQYXJhbSApOwogICAgIGlmIChnc3ByYykgcmV0dXJuIGdzcHJjKCBoZGMsIGxQYXJhbSwgY2NoICk7Ci0gICAgY3VycmVudF9jb2xvciA9IEdldFRleHRDb2xvcjMyKCBoZGMgKTsKLSAgICBTZXRUZXh0Q29sb3IoIGhkYywgR2V0U3lzQ29sb3IzMihDT0xPUl9HUkFZVEVYVCkgKTsKKyAgICBjdXJyZW50X2NvbG9yID0gU2V0VGV4dENvbG9yMzIoIGhkYywgR2V0U3lzQ29sb3IzMihDT0xPUl9HUkFZVEVYVCkgKTsKICAgICByZXQgPSBUZXh0T3V0MzJBKCBoZGMsIHgsIHksIChMUENTVFIpbFBhcmFtLCBjY2ggKTsKLSAgICBTZXRUZXh0Q29sb3IoIGhkYywgY3VycmVudF9jb2xvciApOworICAgIFNldFRleHRDb2xvcjMyKCBoZGMsIGN1cnJlbnRfY29sb3IgKTsKICAgICByZXR1cm4gcmV0OwogfQogCkBAIC00NDEsMTAgKzQzOSw5IEBACiAKICAgICBpZiAoIWNjaCkgY2NoID0gbHN0cmxlbjMyVyggKExQQ1dTVFIpbFBhcmFtICk7CiAgICAgaWYgKGdzcHJjKSByZXR1cm4gZ3NwcmMoIGhkYywgbFBhcmFtLCBjY2ggKTsKLSAgICBjdXJyZW50X2NvbG9yID0gR2V0VGV4dENvbG9yMzIoIGhkYyApOwotICAgIFNldFRleHRDb2xvciggaGRjLCBHZXRTeXNDb2xvcjMyKENPTE9SX0dSQVlURVhUKSApOworICAgIGN1cnJlbnRfY29sb3IgPSBTZXRUZXh0Q29sb3IzMiggaGRjLCBHZXRTeXNDb2xvcjMyKENPTE9SX0dSQVlURVhUKSApOwogICAgIHJldCA9IFRleHRPdXQzMlcoIGhkYywgeCwgeSwgKExQQ1dTVFIpbFBhcmFtLCBjY2ggKTsKLSAgICBTZXRUZXh0Q29sb3IoIGhkYywgY3VycmVudF9jb2xvciApOworICAgIFNldFRleHRDb2xvcjMyKCBoZGMsIGN1cnJlbnRfY29sb3IgKTsKICAgICByZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9yYy9NYWtlZmlsZS5pbiBiL3JjL01ha2VmaWxlLmluCmluZGV4IDM2ZjA0ZTIuLjU1YzZiOWUgMTAwNjQ0Ci0tLSBhL3JjL01ha2VmaWxlLmluCisrKyBiL3JjL01ha2VmaWxlLmluCkBAIC0xLDQgKzEsNCBAQAotREVGUyAgICAgID0gLURfX1dJTkVfXyAtRE5PX1RSQU5TSVRJT05fVFlQRVMKK0RFRlMgICAgICA9IC1EX19XSU5FX18KIFRPUFNSQ0RJUiA9IEB0b3Bfc3JjZGlyQAogVE9QT0JKRElSID0gLi4KIFNSQ0RJUiAgICA9IEBzcmNkaXJACmRpZmYgLS1naXQgYS9yYy9wYXJzZXIubCBiL3JjL3BhcnNlci5sCmluZGV4IGJmY2E1Y2UuLjZiOThjOGQgMTAwNjQ0Ci0tLSBhL3JjL3BhcnNlci5sCisrKyBiL3JjL3BhcnNlci5sCkBAIC0zNCw3ICszNCw3IEBACiBESVNDQVJEQUJMRQlyZXR1cm4gRElTQ0FSREFCTEU7CiBFRElUVEVYVAlyZXR1cm4gRURJVFRFWFQ7CiBFTkQJCXJldHVybiB0RU5EOwotRklYRUQJCXJldHVybiBGSVhFRDsKK0ZJWEVECQlyZXR1cm4gdEZJWEVEOwogRk9OVAkJcmV0dXJuIEZPTlQ7CiBHUkFZRUQJCXJldHVybiBHUkFZRUQ7CiBHUk9VUEJPWAlyZXR1cm4gR1JPVVBCT1g7CmRpZmYgLS1naXQgYS9yYy9wYXJzZXIueSBiL3JjL3BhcnNlci55CmluZGV4IDUzZjZiZjUuLmJiZjM4ZmEgMTAwNjQ0Ci0tLSBhL3JjL3BhcnNlci55CisrKyBiL3JjL3BhcnNlci55CkBAIC0yMyw3ICsyMyw3IEBACiAldG9rZW4gPHN0cj4gdFNUUklORyBTSU5HTEVfUVVPVEVEIElERU5UCiAldG9rZW4gQUNDRUxFUkFUT1JTIEFMVCBBU0NJSSB0QkVHSU4gdEJJVE1BUCBDQVBUSU9OIENIRUNLQk9YIENIRUNLRUQgCiAldG9rZW4gQ0xBU1MgQ09NQk9CT1ggQ09OVFJPTCBDVEVYVCBDVVJTT1IgREVGUFVTSEJVVFRPTiBESUFMT0cgCi0ldG9rZW4gRElTQ0FSREFCTEUgRURJVFRFWFQgdEVORCBGSVhFRCBGT05UIEdSQVlFRCBHUk9VUEJPWCBIRUxQIElDT04gCisldG9rZW4gRElTQ0FSREFCTEUgRURJVFRFWFQgdEVORCB0RklYRUQgRk9OVCBHUkFZRUQgR1JPVVBCT1ggSEVMUCBJQ09OIAogJXRva2VuIElERU5UIElOQUNUSVZFIExJU1RCT1ggTFRFWFQgTUVOVSBNRU5VQkFSQlJFQUsgTUVOVUJSRUFLIE1FTlVJVEVNIAogJXRva2VuIE1PVkVBQkxFIExPQURPTkNBTEwgTk9JTlZFUlQgTk9UIE5PVF9TVVBQT1JURUQgUE9QVVAgUFJFTE9BRCAKICV0b2tlbiBQVVJFIFBVU0hCVVRUT04gUkFESU9CVVRUT04gUkNEQVRBIFJURVhUIFNDUk9MTEJBUiBTSElGVCBTRVBBUkFUT1IgCkBAIC05Myw3ICs5Myw3IEBACiAKIC8qIGxvYWQgYW5kIG1lbW9yeSBvcHRpb25zIGFyZSBpZ25vcmVkICovCiBsb2FkX2FuZF9tZW1vcHRpb246CXwgbGFtbyBsb2FkX2FuZF9tZW1vcHRpb24KLWxhbW86CVBSRUxPQUQgfCBMT0FET05DQUxMIHwgRklYRUQgfCBNT1ZFQUJMRSB8IERJU0NBUkRBQkxFIHwgUFVSRQorbGFtbzoJUFJFTE9BRCB8IExPQURPTkNBTEwgfCB0RklYRUQgfCBNT1ZFQUJMRSB8IERJU0NBUkRBQkxFIHwgUFVSRQogCiBjdXJzb3I6CQlDVVJTT1IgbG9hZF9hbmRfbWVtb3B0aW9uIHRTVFJJTkcgeyQkPW1ha2VfY3Vyc29yKGxvYWRfZmlsZSgkMykpO30KIAkJfENVUlNPUiBsb2FkX2FuZF9tZW1vcHRpb24gcmF3X2RhdGEgeyQkPW1ha2VfY3Vyc29yKCQzKTt9CmRpZmYgLS1naXQgYS9yZXNvdXJjZXMvTWFrZWZpbGUuaW4gYi9yZXNvdXJjZXMvTWFrZWZpbGUuaW4KaW5kZXggZTU0YTc1Zi4uMDlkMGQ4NSAxMDA2NDQKLS0tIGEvcmVzb3VyY2VzL01ha2VmaWxlLmluCisrKyBiL3Jlc291cmNlcy9NYWtlZmlsZS5pbgpAQCAtMSw0ICsxLDQgQEAKLURFRlMgICAgICA9IC1EX19XSU5FX18gLUROT19UUkFOU0lUSU9OX1RZUEVTCitERUZTICAgICAgPSAtRF9fV0lORV9fCiBUT1BTUkNESVIgPSBAdG9wX3NyY2RpckAKIFRPUE9CSkRJUiA9IC4uCiBTUkNESVIgICAgPSBAc3JjZGlyQApAQCAtMTgsNyArMTgsOCBAQAogCXN5c3Jlc19IdS5jIFwKIAlzeXNyZXNfSXQuYyBcCiAJc3lzcmVzX0tvLmMgXAotCXN5c3Jlc19Oby5jCisJc3lzcmVzX05vLmMgXAorCXN5c3Jlc19QbC5jCiAKIENfU1JDUyA9IHN5c3Jlcy5jCiBHRU5fQ19TUkNTID0gJChTWVNSRVNfU1JDUykKZGlmZiAtLWdpdCBhL3Jlc291cmNlcy9zeXNyZXMuYyBiL3Jlc291cmNlcy9zeXNyZXMuYwppbmRleCAwYmMzNTE0Li4wM2I0MWUzIDEwMDY0NAotLS0gYS9yZXNvdXJjZXMvc3lzcmVzLmMKKysrIGIvcmVzb3VyY2VzL3N5c3Jlcy5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSAic3lzcmVzX0l0LmgiCiAjaW5jbHVkZSAic3lzcmVzX0tvLmgiCiAjaW5jbHVkZSAic3lzcmVzX0h1LmgiCisjaW5jbHVkZSAic3lzcmVzX1BsLmgiCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVzb3VyY2UgKiBjb25zdCAqIFNZU1JFU19SZXNvdXJjZXNbXSA9CiB7CkBAIC0zNSw3ICszNiw4IEBACiAgICAgc3lzcmVzX0VvX1RhYmxlLCAgLyogTEFOR19FbyAqLwogICAgIHN5c3Jlc19JdF9UYWJsZSwgIC8qIExBTkdfSXQgKi8KICAgICBzeXNyZXNfS29fVGFibGUsICAvKiBMQU5HX0tvICovCi0gICAgc3lzcmVzX0h1X1RhYmxlICAgLyogTEFOR19IdSAqLworICAgIHN5c3Jlc19IdV9UYWJsZSwgIC8qIExBTkdfSHUgKi8KKyAgICBzeXNyZXNfUGxfVGFibGUgICAvKiBMQU5HX1BsICovCiB9OwogCiAKZGlmZiAtLWdpdCBhL3Jlc291cmNlcy9zeXNyZXNfUGwucmMgYi9yZXNvdXJjZXMvc3lzcmVzX1BsLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZjNkZmYKLS0tIC9kZXYvbnVsbAorKysgYi9yZXNvdXJjZXMvc3lzcmVzX1BsLnJjCkBAIC0wLDAgKzEsMjQxIEBACitTWVNNRU5VIE1FTlUgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRQoreworCU1FTlVJVEVNICImUHJ6eXdy8+YiLCA2MTcyOAorCU1FTlVJVEVNICJQcnplJnN18SIsIDYxNDU2CisJTUVOVUlURU0gIiZSb3ptaWFyIiwgNjE0NDAKKwlNRU5VSVRFTSAiRG8gJmlrb255IiwgNjE0NzIKKwlNRU5VSVRFTSAiUGWzbnkgJmVrcmFuIiwgNjE0ODgKKwlNRU5VSVRFTSBTRVBBUkFUT1IKKwlNRU5VSVRFTSAiJlphbWtuaWpcdEFsdC1GNCIsIDYxNTM2CisJTUVOVUlURU0gU0VQQVJBVE9SCisJTUVOVUlURU0gIlByemWzuSZjeiBuYS4uLlx0Q3RybC1Fc2MiLCA2MTc0NAorCU1FTlVJVEVNIFNFUEFSQVRPUgorCU1FTlVJVEVNICImTyBwcm9ncmFtaWUgV0lORS4uLiIsIDYxNzYxCit9CisKK0VESVRNRU5VIE1FTlUgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRQoreworCVBPUFVQICIiCisJQkVHSU4KKwkJTUVOVUlURU0gIiZDb2ZuaWoiLCBFTV9VTkRPMzIKKwkJTUVOVUlURU0gU0VQQVJBVE9SCisJCU1FTlVJVEVNICJXJnl0bmlqIiwgV01fQ1VUCisJCU1FTlVJVEVNICImS29waXVqIiwgV01fQ09QWQorCQlNRU5VSVRFTSAiJldrbGVqIiwgV01fUEFTVEUKKwkJTUVOVUlURU0gIiZVc3VceGYxIiwgV01fQ0xFQVIKKwkJTUVOVUlURU0gU0VQQVJBVE9SCisJCU1FTlVJVEVNICImWmF6bmFjeiB3c3p5c3RrbyIsIEVNX1NFVFNFTDMyCisJRU5ECit9CisKK01TR0JPWCBESUFMT0cgMTAwLCA4MCwgMjE2LCAxNjgKK1NUWUxFIERTX1NZU01PREFMIHwgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfVklTSUJMRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCitCRUdJTgorCUlDT04gIiIsIDEwODgsIDgsIDIwLCAxNiwgMTYsIFdTX0NISUxEIHwgV1NfVklTSUJMRQorCUxURVhUICIiLCAxMDAsIDMyLCA0LCAxNzYsIDQ4LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19HUk9VUAorCVBVU0hCVVRUT04gIk9rIiwgMSwgMTYsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKKwlQVVNIQlVUVE9OICJBbnVsdWoiLCAyLCA2NCwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAorCVBVU0hCVVRUT04gIiZaYW5pZWNoYWoiLCAzLCAxMTIsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKKwlQVVNIQlVUVE9OICImUG9u83cgcHLzYuoiLCA0LCAxNjAsIDU2LCA1MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKKwlQVVNIQlVUVE9OICImSWdub3J1aiIsIDUsIDIxNSwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAorCVBVU0hCVVRUT04gIiZUYWsiLCA2LCAyNjMsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKKwlQVVNIQlVUVE9OICImTmllIiwgNywgMzExLCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCitFTkQKK1NIRUxMX0FCT1VUX01TR0JPWCBESUFMT0cgNTAsIDQ0LCAyMjMsIDI3MAorU1RZTEUgRFNfTE9DQUxFRElUIHwgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfVklTSUJMRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCitDQVBUSU9OICJPICVzIgorRk9OVCAxMCwgIlN5c3RlbSIKK3sKKwlERUZQVVNIQlVUVE9OICJPSyIsIDEsIDkxLCAyNTAsIDQwLCAxNAorCUNPTlRST0wgIiIsIC0xLCAiU1RBVElDIiwgU1NfQkxBQ0tGUkFNRSB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0RJU0FCTEVELCA0LCAzNSwgMjE1LCAyMTAKKwlDT05UUk9MICJUZXh0IiwgMTAwLCAiU1RBVElDIiwgU1NfTk9QUkVGSVggfCBXU19HUk9VUCwgMTEsIDQwLCAyMDAsIDIwMAorCUlDT04gIiIsIDEwODgsIDE5NSwgMTAsIDE4LCAyMAorfQorLy9MVEVYVCAiV3lzd2lldGwgcGxpa2kgJnR5cHU6IiwgMTA4OSwgNiwgMTA0LCA5MCwgOQorT1BFTl9GSUxFIERJQUxPRyAzNiwgMjQsIDI3OSwgMTM0CitTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQorQ0FQVElPTiAiT3R383J6IgorRk9OVCA4LCAiSGVsdiIKK0JFR0lOCisJTFRFWFQgIiZOYXp3YSBwbGlrdToiLCAxMDkwLCA2LCA2LCA3NiwgOSwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfR1JPVVAKKwlFRElUVEVYVCAxMTUyLCA2LCAxNiwgOTAsIDEyLCBFU19BVVRPSFNDUk9MTCB8IEVTX09FTUNPTlZFUlQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCisJTElTVEJPWCAxMTIwLCA2LCAzMiwgOTAsIDY4LCBMQlNfU1RBTkRBUkQgfCBMQlNfT1dORVJEUkFXRklYRUQgfCBMQlNfSEFTU1RSSU5HUyB8IExCU19ESVNBQkxFTk9TQ1JPTEwgfCBXU19UQUJTVE9QCisJTFRFWFQgIiZLYXRhbG9naToiLCAtMSwgMTEwLCA2LCA5MiwgOSwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfR1JPVVAKKwlDT05UUk9MICIiLCAxMDg4LCAiU1RBVElDIiwgU1NfTk9QUkVGSVggfCBXU19HUk9VUCwgMTEwLCAxOCwgOTIsIDkKKwlMSVNUQk9YIDExMjEsIDExMCwgMzIsIDkyLCA2OCwgTEJTX1NUQU5EQVJEIHwgTEJTX09XTkVSRFJBV0ZJWEVEIHwgTEJTX0hBU1NUUklOR1MgfCBMQlNfRElTQUJMRU5PU0NST0xMIHwgV1NfVEFCU1RPUAorCUxURVhUICJXeZx3aWV0bCBwbGlraSAmdHlwdToiLCAxMDg5LCA2LCAxMDQsIDkwLCA5LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19HUk9VUAorCUNPTlRST0wgIiIsIDExMzYsICJDT01CT0JPWCIsIENCU19EUk9QRE9XTkxJU1QgfCBDQlNfQVVUT0hTQ1JPTEwgfCBXU19CT1JERVIgfCBXU19WU0NST0xMIHwgV1NfVEFCU1RPUCwgNiwgMTE0LCA5MCwgMzYKKwlMVEVYVCAiJlN0YWNqZSBkeXNr83c6IiwgMTA5MSwgMTEwLCAxMDQsIDkyLCA5LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19HUk9VUAorCUNPTlRST0wgIiIsIDExMzcsICJDT01CT0JPWCIsIENCU19EUk9QRE9XTkxJU1QgfCBDQlNfT1dORVJEUkFXRklYRUQgfCBDQlNfQVVUT0hTQ1JPTEwgfCBDQlNfU09SVCB8IENCU19IQVNTVFJJTkdTIHwgV1NfQk9SREVSIHwgV1NfVlNDUk9MTCB8IFdTX1RBQlNUT1AsIDExMCwgMTE0LCA5MiwgNjgKKwlDT05UUk9MICJPdHfzcnoiLCAxLCAiQlVUVE9OIiwgQlNfREVGUFVTSEJVVFRPTiB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUCwgMjEyLCA2LCA1NiwgMTQKKwlDT05UUk9MICJBbnVsdWoiLCAyLCAiQlVUVE9OIiwgQlNfUFVTSEJVVFRPTiB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUCwgMjEyLCAyNCwgNTYsIDE0CisJQ09OVFJPTCAiJlBvbW9jIiwgMTAzOCwgIkJVVFRPTiIsIEJTX1BVU0hCVVRUT04gfCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AsIDIxMiwgNDYsIDU2LCAxNAorCUNPTlRST0wgIlR5bGtvIGRvIG9kY3p5dHUiLCAxMDQwLCAiQlVUVE9OIiwgQlNfQVVUT0NIRUNLQk9YIHwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QLCAyMDgsIDY4LCA2OSwgMTIKK0VORAorLy9QUklOVCBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAzNiwgMjQsIDI2NCwgMTM0CitTQVZFX0ZJTEUgRElBTE9HIDM2LCAyNCwgMjc4LCAxMzQKK1NUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCitDQVBUSU9OICJaYXBpc3ogamFrbyIKK0ZPTlQgOCwgIkhlbHYiCitCRUdJTgorCUxURVhUICImTmF6d2EgcGxpa3U6IiwgMTA5MCwgNiwgNiwgNzYsIDksIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0dST1VQCisJRURJVFRFWFQgMTE1MiwgNiwgMTYsIDkwLCAxMiwgRVNfQVVUT0hTQ1JPTEwgfCBFU19PRU1DT05WRVJUIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUAorCUxJU1RCT1ggMTEyMCwgNiwgMzIsIDkwLCA2OCwgTEJTX1NUQU5EQVJEIHwgTEJTX09XTkVSRFJBV0ZJWEVEIHwgTEJTX0hBU1NUUklOR1MgfCBMQlNfRElTQUJMRU5PU0NST0xMIHwgV1NfVEFCU1RPUAorCUxURVhUICImS2F0YWxvZ2k6IiwgLTEsIDExMCwgNiwgOTIsIDksIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0dST1VQCisJQ09OVFJPTCAiIiwgMTA4OCwgIlNUQVRJQyIsIFNTX05PUFJFRklYIHwgV1NfR1JPVVAsIDExMCwgMTgsIDkyLCA5CisJTElTVEJPWCAxMTIxLCAxMTAsIDMyLCA5MiwgNjgsIExCU19TVEFOREFSRCB8IExCU19PV05FUkRSQVdGSVhFRCB8IExCU19IQVNTVFJJTkdTIHwgTEJTX0RJU0FCTEVOT1NDUk9MTCB8IFdTX1RBQlNUT1AKKwlMVEVYVCAiUG9rYXp1aiBwbGlraSAmdHlwdToiLCAxMDg5LCA2LCAxMDQsIDkwLCA5LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19HUk9VUAorCUNPTlRST0wgIiIsIDExMzYsICJDT01CT0JPWCIsIENCU19EUk9QRE9XTkxJU1QgfCBDQlNfQVVUT0hTQ1JPTEwgfCBXU19CT1JERVIgfCBXU19WU0NST0xMIHwgV1NfVEFCU1RPUCwgNiwgMTE0LCA5MCwgMzYNCisJTFRFWFQgIiZTdGFjamUgZHlza/N3OiIsIDEwOTEsIDExMCwgMTA0LCA5MiwgOSwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfR1JPVVAKKwlDT05UUk9MICIiLCAxMTM3LCAiQ09NQk9CT1giLCBDQlNfRFJPUERPV05MSVNUIHwgQ0JTX09XTkVSRFJBV0ZJWEVEIHwgQ0JTX0FVVE9IU0NST0xMIHwgQ0JTX1NPUlQgfCBDQlNfSEFTU1RSSU5HUyB8IFdTX0JPUkRFUiB8IFdTX1ZTQ1JPTEwgfCBXU19UQUJTVE9QLCAxMTAsIDExNCwgOTIsIDY4CisJQ09OVFJPTCAiT2siLCAxLCAiQlVUVE9OIiwgQlNfREVGUFVTSEJVVFRPTiB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUCwgMjEzLCA2LCA1NiwgMTQKKwlDT05UUk9MICJBbnVsdWoiLCAyLCAiQlVUVE9OIiwgQlNfUFVTSEJVVFRPTiB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUCwgMjEzLCAyNCwgNTYsIDE0CisJQ09OVFJPTCAiJlBvbW9jIiwgMTAzOCwgIkJVVFRPTiIsIEJTX1BVU0hCVVRUT04gfCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AsIDIxMywgNDUsIDU2LCAxNAorCUNPTlRST0wgIiZUeWxrbyBkbyBvZGN6eXR1IiwgMTA0MCwgIkJVVFRPTiIsIEJTX0FVVE9DSEVDS0JPWCB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUCwgMjA4LCA2OCwgNjgsIDEyCitFTkQKKy8vIERFRlBVU0hCVVRUT04gIk9rIiwgMSwgMjA2LCA2LCA1NiwgMTQsIEJTX0RFRlBVU0hCVVRUT04gfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKK1BSSU5UIERJQUxPRyAzNiwgMjQsIDI2NCwgMTM0CitTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQorQ0FQVElPTiAiRHJ1a3VqIgorRk9OVCA4LCAiSGVsdiIKK0JFR0lOCisJTFRFWFQgIiZEcnVrYXJrYToiLCAxMDg4LCA2LCA2LCA0MCwgOSwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfR1JPVVAKKwlMVEVYVCAiIiwgMTA4OSwgNjAsIDYsIDE1MCwgOQorCUdST1VQQk9YICJEcnVrdWoiLCAxMDcyLCA2LCAzMCwgMTYwLCA2NSwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAorCVJBRElPQlVUVE9OICImV3N6eXN0a28iLCAxMDU2LCAxNiwgNDUsIDYwLCAxMiwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAorCVJBRElPQlVUVE9OICJXJnli83IiLCAxMDU3LCAxNiwgNjAsIDYwLCAxMiwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAorCVJBRElPQlVUVE9OICImU3Ryb255IiwgMTA1OCwgMTYsIDc1LCA2MCwgMTIsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKKwlDT05UUk9MICJEcnVrdWoiLCAxLCAiQlVUVE9OIiwgQlNfREVGUFVTSEJVVFRPTiB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUCwgMjA2LCA2LCA1NiwgMTQKKwlDT05UUk9MICJBbnVsdWoiLCAyLCAiQlVUVE9OIiwgQlNfUFVTSEJVVFRPTiB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUCwgMjA2LCAyNCwgNTYsIDE0CisJQ09OVFJPTCAiJlVzdGF3aWVuaWEiLCAxMDI0LCAiQlVUVE9OIiwgQlNfUFVTSEJVVFRPTiB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUCwgMjA2LCA0NiwgNTYsIDE0CisJTFRFWFQgIiZPZDoiLCAxMDkwLCA2MCwgNzgsIDMwLCA5LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19HUk9VUAorCUxURVhUICImRG86IiwgMTA5MSwgMTIwLCA3OCwgMzAsIDksIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0dST1VQCisJTFRFWFQgIkpha2+c5iAmd3lkcnVrdToiLCAxMDkyLCA2LCAxMDAsIDc2LCA5LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19HUk9VUAorCUNPTlRST0wgIiIsIDExMzYsICJDT01CT0JPWCIsIENCU19EUk9QRE9XTkxJU1QgfCBDQlNfT1dORVJEUkFXRklYRUQgfCBDQlNfQVVUT0hTQ1JPTEwgfCBDQlNfU09SVCB8IENCU19IQVNTVFJJTkdTIHwgV1NfQk9SREVSIHwgV1NfVlNDUk9MTCB8IFdTX1RBQlNUT1AsIDcxLCA5OCwgOTIsIDY4CisJQ09OVFJPTCAiRHJ1a3VqIGRvIFBsaSZrdSIsIDEwNDAsICJCVVRUT04iLCBCU19BVVRPQ0hFQ0tCT1ggfCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AsIDE0LCAxMTUsIDk1LCAxMgorCUNPTlRST0wgIlNvcnR1aiBrb3BpZSIsIDEwNDEsICJCVVRUT04iLCBCU19BVVRPQ0hFQ0tCT1ggfCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AsIDE4MiwgMTAyLCA1OSwgMTIKK0VORAorLy8gICAgUFVTSEJVVFRPTiAgICAgICJBbnVsdWoiLElEQ0FOQ0VMLDIxOCwyMyw0MCwxNCxXU19HUk9VUAorUFJJTlRfU0VUVVAgRElBTE9HIDM2LCAyNCwgMjY0LCAxMzQKK1NUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCitDQVBUSU9OICJQcmludCBTZXR1cCIKK0ZPTlQgOCwgIkhlbHYiCitCRUdJTgorCUdST1VQQk9YICJEcnVrYXJrYSIsIDEwNzIsIDYsIDEwLCAxODAsIDY1LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCisJUkFESU9CVVRUT04gIiZEcnVrYXJrYSBkb215nGxuYSIsIDEwNTYsIDE2LCAyMCwgODAsIDEyLCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCisJTFRFWFQgIltub25lXSIsIDEwODgsIDM1LCAzNSwgMTIwLCA5CisJUkFESU9CVVRUT04gIiZJbm5hIGRydWthcmthIiwgMTA1NywgMTYsIDUwLCA4MCwgMTIsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKKwlDT05UUk9MICIiLCAxMTM2LCAiQ09NQk9CT1giLCBDQlNfRFJPUERPV05MSVNUIHwgQ0JTX09XTkVSRFJBV0ZJWEVEIHwgQ0JTX0FVVE9IU0NST0xMIHwgQ0JTX1NPUlQgfCBDQlNfSEFTU1RSSU5HUyB8IFdTX0JPUkRFUiB8IFdTX1ZTQ1JPTEwgfCBXU19UQUJTVE9QLCAzNSwgNjUsIDE0OSwgNjgKKwlDT05UUk9MICJPayIsIDEsICJCVVRUT04iLCBCU19ERUZQVVNIQlVUVE9OIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QLCAyMDYsIDYsIDU2LCAxNAorCUNPTlRST0wgIkFudWx1aiIsIDIsICJCVVRUT04iLCBCU19QVVNIQlVUVE9OIHwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QLCAyMDYsIDI0LCA1NiwgMTQKKwlDT05UUk9MICImT3BjamUiLCAxMDI0LCAiQlVUVE9OIiwgQlNfUFVTSEJVVFRPTiB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUCwgMjA2LCA0NiwgNTYsIDE0CisJR1JPVVBCT1ggIk9yaWVudGFjamEiLCAxMDczLCA2LCA4NSwgMTAwLCA1MCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAorCVJBRElPQlVUVE9OICJXIHAmaW9uaWUiLCAxMDU4LCA1MCwgMTAwLCA0MCwgMTIsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKKwlSQURJT0JVVFRPTiAiVyBwbyZ6aW9taWUiLCAxMDU5LCA1MCwgMTE1LCA0MCwgMTIsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKKwlJQ09OICJMQU5EU0NBUCIsIDEwOTcsIDEwLCA5NSwgMzIsIDMyCisJSUNPTiAiUE9SVFJBSVQiLCAxMDk4LCAxMCwgOTUsIDMyLCAzMgorCUdST1VQQk9YICJQYXBpZXIiLCAxMDc0LCAxMjAsIDg1LCAxODAsIDUwLCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCisJTFRFWFQgIiZXaWVsa2+c5iIsIDEwODksIDEzMCwgOTUsIDMwLCA5LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19HUk9VUAorCUxURVhUICImj3LzZLNvIiwgMTA5MCwgMTMwLCAxMTAsIDMwLCA5LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19HUk9VUAorCUNPTlRST0wgIiIsIDExMzcsICJDT01CT0JPWCIsIENCU19EUk9QRE9XTkxJU1QgfCBDQlNfT1dORVJEUkFXRklYRUQgfCBDQlNfQVVUT0hTQ1JPTEwgfCBDQlNfU09SVCB8IENCU19IQVNTVFJJTkdTIHwgV1NfQk9SREVSIHwgV1NfVlNDUk9MTCB8IFdTX1RBQlNUT1AsIDE1NSwgOTUsIDkyLCA2OAorCUNPTlRST0wgIiIsIDExMzgsICJDT01CT0JPWCIsIENCU19EUk9QRE9XTkxJU1QgfCBDQlNfT1dORVJEUkFXRklYRUQgfCBDQlNfQVVUT0hTQ1JPTEwgfCBDQlNfU09SVCB8IENCU19IQVNTVFJJTkdTIHwgV1NfQk9SREVSIHwgV1NfVlNDUk9MTCB8IFdTX1RBQlNUT1AsIDE1NSwgMTEwLCA5MiwgNjgKK0VORAorLy8gQ09OVFJPTCAiIiAsNzEwLCJTVEFUSUMiLFdTX0JPUkRFUnxTU19TSU1QTEV8V1NfVEFCU1RPUHxXU19HUk9VUCwgMTUyLDQsMTE4LDExNgorQ0hPT1NFX0ZPTlQgRElBTE9HIDEzLCA1NCwgMjY0LCAxNDcKK1NUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCitDQVBUSU9OICJGb250IgorRk9OVCA4LCAiSGVsdiIKK0JFR0lOCisJTFRFWFQgIiZDemNpb25rYToiLCAxMDg4LCA2LDMsNDAsOSwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfR1JPVVAKKwlDT05UUk9MICIiLCAxMTM2LCAiQ09NQk9CT1giLCBDQlNfT1dORVJEUkFXRklYRUQgfCBDQlNfSEFTU1RSSU5HUyB8IENCU19ESVNBQkxFTk9TQ1JPTEwgfAorQ0JTX0FVVE9IU0NST0xMIHwgQ0JTX1NPUlQgfCBXU19WU0NST0xMIHwgV1NfVEFCU1RPUCB8IENCU19TSU1QTEUsIDYsMTMsOTQsNTQNCisJTFRFWFQgIlN0JnlsOiIsIDEwODksIDEwOCwzLDQ0LDksIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0dST1VQCisJQ09OVFJPTCAiIiwgMTEzNywgIkNPTUJPQk9YIiwgQ0JTX09XTkVSRFJBV0ZJWEVEIHwgQ0JTX0hBU1NUUklOR1MgfCBDQlNfRElTQUJMRU5PU0NST0xMIHwKK1dTX1ZTQ1JPTEwgfCBXU19UQUJTVE9QIHwgQ0JTX1NJTVBMRSwgMTA4LDEzLDY0LDU0CisJTFRFWFQgIiZSb3ptaWFyOiIsIDEwOTAsIDE3OSwzLDMwLDksIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0dST1VQCisJQ09OVFJPTCAiIiwgMTEzOCwgIkNPTUJPQk9YIiwgQ0JTX09XTkVSRFJBV0ZJWEVEIHwgQ0JTX0hBU1NUUklOR1MgfCBDQlNfRElTQUJMRU5PU0NST0xMIHwKK1dTX1ZTQ1JPTEwgfCBXU19UQUJTVE9QIHwgQ0JTX1NJTVBMRSB8IENCU19TT1JULCAxNzksMTMsMzIsNTQKKwlDT05UUk9MICJPSyIsIElET0ssICJCVVRUT04iLCBXU19HUk9VUCwgMjE4LDYsNDAsMTQKKwlDT05UUk9MICJBbnVsdWoiLCBJRENBTkNFTCwgIkJVVFRPTiIsIEJTX1BVU0hCVVRUT04gfCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AsIDIxOCwyMyw0MCwxNAorCUNPTlRST0wgIiZaYXN0b3N1aiIsIDEwMjYsICJCVVRUT04iLCBXU19HUk9VUCwgMjE4LDQwLDQwLDE0DQorCUNPTlRST0wgIiZQb21vYyIsIDEwMzgsICJCVVRUT04iLCBCU19QVVNIQlVUVE9OIHwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QLCAyMTgsNTcsNDAsMTQKKwlDT05UUk9MICJFZmVrdHkgc3BlY2lhbG5lIiwgMTA3MiwgIkJVVFRPTiIsIEJTX0dST1VQQk9YIHwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QLCA2LDcyLDg0LDM0CisJQ09OVFJPTCAiUHJ6JmVrcmWcbG9uYSIsIDEwNDAsICJCVVRUT04iLCBCU19BVVRPQ0hFQ0tCT1ggfCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QLCAxMCwgODIsIDU4LCAxMAorCUNPTlRST0wgIlAmb2RrcmWcbG9uYSIsIDEwNDEsICJCVVRUT04iLCBCU19BVVRPQ0hFQ0tCT1ggfCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QLCAxMCw5NCw1MCwxMAorCUxURVhUICImS29sb3I6IiwgMTA5MSwgNiwxMTAsMzAsOSwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfR1JPVVANCisJQ09OVFJPTCAiIiwgMTEzOSwgIkNPTUJPQk9YIiwgQ0JTX0RST1BET1dOTElTVCB8IENCU19PV05FUkRSQVdGSVhFRCB8IENCU19IQVNTVFJJTkdTIHwKK0NCU19BVVRPSFNDUk9MTCB8IFdTX0JPUkRFUiB8IFdTX1ZTQ1JPTEwgfCBXU19UQUJTVE9QLCA2LDEyMCw4NCwxMDAKKwlDT05UUk9MICJQcnp5a7NhZCIsIDEwNzMsICJCVVRUT04iLCBCU19HUk9VUEJPWCB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUCwgOTgsNzIsMTYwLDQ5CisJQ09OVFJPTCAiQWFCYll5WnpceEIzIiwgMTA5MywgIlNUQVRJQyIsIFNTX05PUFJFRklYIHwgV1NfVklTSUJMRSwgMTA0LDgxLDE0OSwzNworRU5ECisvLyBQVVNIQlVUVE9OICImUmVwbGFjZSIsIDEwMjQsIDE3NCwgMjEsIDUwLCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisvLyBQVVNIQlVUVE9OICJSZXBsYWNlICZBbGwiLCAxMDI1LCAxNzQsIDM4LCA1MCwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorLy8gUFVTSEJVVFRPTiAiQ2FuY2VsIiwgMiwgMTc0LCA1NSwgNTAsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKy8vIFBVU0hCVVRUT04gIiZIZWxwIiwgMTAzOCwgMTc0LCA3NSwgNTAsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKy8vfQorRklORF9URVhUIERJQUxPRyAzNCwgMjQsIDI1MSwgNjIKK1NUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCitDQVBUSU9OICJabmFqZJ8iCitGT05UIDgsICJIZWx2IgorQkVHSU4KKwlMVEVYVCAiJlpuYWpknzoiLCAtMSwgNCwgOCwgNDIsIDgsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0dST1VQCisJRURJVFRFWFQgMTE1MiwgNDYsIDcsIDEzNCwgMTIsIEVTX0FVVE9IU0NST0xMIHwgV1NfQk9SREVSIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisJQ09OVFJPTCAiVXd6Z2zqZG5paiB0eWxrbyBjYbNlIHd5cmF6eSIsIDEwNDAsICJCVVRUT04iLCBCU19BVVRPQ0hFQ0tCT1ggfCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AsIDQsIDI2LCAxMDcsIDEyCisJQ09OVFJPTCAiJlV3emds6mRuaWFqIHdpZWxrb5zmIGxpdGVyIiwgMTA0MSwgIkJVVFRPTiIsIEJTX0FVVE9DSEVDS0JPWCB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AsIDQsIDQyLCAxMDcsIDEyCisJR1JPVVBCT1ggIktpZXJ1bmVrIiwgMTA3MiwgMTEzLCAyNiwgNjgsIDI4CisJQ09OVFJPTCAiVyAmZ1x4RjNyXHhFQSIsIDEwNTYsICJCVVRUT04iLCBCU19BVVRPUkFESU9CVVRUT04gfCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AsIDExNywgMzgsIDIwLCAxMgorCUNPTlRST0wgIlcgJmRceEYzbCIsIDEwNTcsICJCVVRUT04iLCBCU19BVVRPUkFESU9CVVRUT04gfCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QLCAxNDQsIDM4LCAzMCwgMTIKKwlDT05UUk9MICImWm5hamSfIG5hc3TqcG55IiwgMSwgIkJVVFRPTiIsIEJTX0RFRlBVU0hCVVRUT04gfCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AsIDE4NywgNSwgNjEsIDE0CisJQ09OVFJPTCAiQW51bHVqIiwgMiwgIkJVVFRPTiIsIEJTX1BVU0hCVVRUT04gfCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AsIDE4NywgMjMsIDYxLCAxNAorCUNPTlRST0wgIiZQb21vYyIsIDEwMzgsICJCVVRUT04iLCBCU19QVVNIQlVUVE9OIHwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QLCAxODcsIDQ1LCA2MSwgMTQKK0VORAorUkVQTEFDRV9URVhUIERJQUxPRyAzNiwgMjQsIDI0NSwgOTQKK1NUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCitDQVBUSU9OICJaYW1pZfEiCitGT05UIDgsICJIZWx2IgorQkVHSU4KKwlMVEVYVCAiJlpuYWpknzoiLCAtMSwgNCwgOSwgNDgsIDgsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0dST1VQCisJRURJVFRFWFQgMTE1MiwgNTQsIDcsIDExNCwgMTIsIEVTX0FVVE9IU0NST0xMIHwgV1NfQk9SREVSIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisJTFRFWFQgIlphbmll8SAmbmE6IiwgLTEsIDQsIDI2LCA0OCwgOCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfR1JPVVAKKwlFRElUVEVYVCAxMTUzLCA1NCwgMjQsIDExNCwgMTIsIEVTX0FVVE9IU0NST0xMIHwgV1NfQk9SREVSIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisJQ09OVFJPTCAiVXd6Z2zqZG5paiAmdHlsa28gY2GzZSB3eXJhenkiLCAxMDQwLCAiQlVUVE9OIiwgQlNfQVVUT0NIRUNLQk9YIHwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QLCA1LCA0NiwgMTA0LCAxMgorCUNPTlRST0wgIiZVd3pnbOpkbmlqIHdpZWxrb5zmIGxpdGVyIiwgMTA0MSwgIkJVVFRPTiIsIEJTX0FVVE9DSEVDS0JPWCB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AsIDUsIDYyLCA5NiwgMTIKKwlDT05UUk9MICJabmFqZJ8gbmFzdOpwbnkiLCAxLCAiQlVUVE9OIiwgQlNfREVGUFVTSEJVVFRPTiB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUCwgMTc0LCA0LCA2NywgMTQKKwlDT05UUk9MICImWmFtaWXxIiwgMTAyNCwgIkJVVFRPTiIsIEJTX1BVU0hCVVRUT04gfCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AsIDE3NCwgMjEsIDY4LCAxNAorCUNPTlRST0wgIlphbWll8SAmd3N6eXN0a2llIiwgMTAyNSwgIkJVVFRPTiIsIEJTX1BVU0hCVVRUT04gfCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AsIDE3NCwgMzgsIDY4LCAxNAorCUNPTlRST0wgIkFudWx1aiIsIDIsICJCVVRUT04iLCBCU19QVVNIQlVUVE9OIHwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QLCAxNzQsIDU2LCA2OCwgMTQKKwlDT05UUk9MICImUG9tb2MiLCAxMDM4LCAiQlVUVE9OIiwgQlNfUFVTSEJVVFRPTiB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUCwgMTc0LCA3NSwgNjgsIDE0CitFTkQKKyAgIAorQ0hPT1NFX0NPTE9SIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDM2LCAyNCwgMzAwLCAyMDAKK1NUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCitDQVBUSU9OICJDb2xvciIKK0ZPTlQgOCwgIkhlbHYiCit7CisgTFRFWFQgIiZQb2RzdGF3b3dlIGtvbG9yeToiLCAgIDEwODgsIDQsICAgIDQsICAxNDAsIDEwCisgTFRFWFQgIkRvd29sbmUgJmtvbG9yeToiLCAgMTA4OSwgNCwgICAxMDYsIDE0MCwgMTAKKyBMVEVYVCAiS29sb3IgfCAgU29sJmlkIiwgIDEwOTAsIDE1MCwgMTUxLCAgNDgsIDEwCisgTFRFWFQgICAiJkN6ZXJ3b255OiIsIDcyNiAvKjEwOTQqLywyNDksMTI2LDI0LDEwCisgRURJVFRFWFQgNzA2LCAyNzUsMTI0LDE4LDEyLCBXU19CT1JERVIgfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBMVEVYVCAgICImWmllbG9ueToiLDcyNy8qMTA5NSovLDI0OSwxNDAsMjQsMTAKKyBFRElUVEVYVCA3MDcsIDI3NSwxMzgsMTgsMTIsIFdTX0JPUkRFUiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIExURVhUICAgIiZOaWViaWVza2k6Iiw3MjggLyoxMDk2Ki8sMjQ5LDE1NCwyNCwxMAorIEVESVRURVhUIDcwOCwgMjc1LDE1MiwxOCwxMiwgV1NfQk9SREVSIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgTFRFWFQgICImSHVlOiIgLDcyMyAvKjEwOTEqLywyMDIsMTI2LDIyLDEwCisgRURJVFRFWFQgNzAzLCAyMjYsMTI0LDE4LDEyLCBXU19CT1JERVIgfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBMVEVYVCAgIiZTYXQ6IiAsNzI0IC8qMTA5MiovLDIwMiwxNDAsMjIsMTAKKyBFRElUVEVYVCA3MDQsIDIyNiwxMzgsMTgsMTIsIFdTX0JPUkRFUiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIExURVhUICAiJkx1bToiICw3MjUgLyoxMDkzKi8sMjAyLDE1NCwyMiwxMAorIEVESVRURVhUIDcwNSwgMjI2LDE1MiwxOCwxMiwgV1NfQk9SREVSIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgQ09OVFJPTCAiIiAsNzIwLCJTVEFUSUMiLFNTX1NJTVBMRXxXU19UQUJTVE9QfFdTX0dST1VQLDQsMTQsMTQwLDg2CisgQ09OVFJPTCAiIiAsNzIxLCJTVEFUSUMiLFNTX1NJTVBMRXxXU19UQUJTVE9QfFdTX0dST1VQLDQsMTE2LDE0MCwyOAorIENPTlRST0wgIiIgLDcxMCwiU1RBVElDIixXU19CT1JERVJ8U1NfU0lNUExFfFdTX1RBQlNUT1B8V1NfR1JPVVAsIDE1Miw0LDExOCwxMTYKKyBDT05UUk9MICIiICw3MDIsIlNUQVRJQyIsU1NfU0lNUExFfFdTX1RBQlNUT1B8V1NfR1JPVVAsIDI3OCw0LDgsMTE2CisgQ09OVFJPTCAiIiAsNzA5LCJTVEFUSUMiLFNTX1NJTVBMRXxXU19UQUJTVE9QfFdTX0dST1VQLCAxNTIsMTI0LDQwLDI2CisgREVGUFVTSEJVVFRPTiAiT2siLCAgMSwgIDQsIDE2NiwgNDQsIDE0LCBCU19ERUZQVVNIQlVUVE9OIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAiQW51bHVqIiwgMiwgNTIsIDE2NiwgNDQsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICJQb21vYyIsIDEwMzgsMTAwLDE2NiwgNDQsIDE0CisgUFVTSEJVVFRPTiAiJkRvZGFqIGRvIGRvd29sbnljaCIsICAgIDcxMi8qMTAyNCovLCAxNTIsIDE2NiwgMTQyLCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAiWiZkZWZpbml1aiBLb2xvciA+PiIsIDcxOS8qMTAyNSovLCAgIDQsIDE1MCwgMTQyLCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAgIiZpIiw3MTMsMzAwLDIwMCw0LDE0ICAgLyoganVzdCBhIGR1bW15OiAgJ2knIGlzICBsaWtlICAmaSAgaW4gInNvbCZpZCIgICovCit9CmRpZmYgLS1naXQgYS9zY2hlZHVsZXIvcHJvY2Vzcy5jIGIvc2NoZWR1bGVyL3Byb2Nlc3MuYwppbmRleCBjNDc0ZDU0Li5hYjcyY2FmIDEwMDY0NAotLS0gYS9zY2hlZHVsZXIvcHJvY2Vzcy5jCisrKyBiL3NjaGVkdWxlci9wcm9jZXNzLmMKQEAgLTE2NiwxMyArMTY2LDE1IEBACiAgICAgSzMyT0JKICpwdHIgPSBOVUxMOwogICAgIGlmICghcEN1cnJlbnRQcm9jZXNzKSByZXR1cm4gUFJPQ0VTU19HZXRCb290T2JqUHRyKCBoYW5kbGUsIHR5cGUgKTsKICAgICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJnBDdXJyZW50UHJvY2Vzcy0+Y3JpdF9zZWN0aW9uICk7CisKICAgICBpZiAoKGhhbmRsZSA+IDApICYmIChoYW5kbGUgPD0gcEN1cnJlbnRQcm9jZXNzLT5oYW5kbGVfdGFibGUtPmNvdW50KSkKLSAgICB7CiAgICAgICAgIHB0ciA9IHBDdXJyZW50UHJvY2Vzcy0+aGFuZGxlX3RhYmxlLT5lbnRyaWVzW2hhbmRsZSAtIDFdLnB0cjsKLSAgICAgICAgaWYgKHB0ciAmJiAoKHR5cGUgPT0gSzMyT0JKX1VOS05PV04pIHx8IChwdHItPnR5cGUgPT0gdHlwZSkpKQotICAgICAgICAgICAgSzMyT0JKX0luY0NvdW50KCBwdHIgKTsKLSAgICAgICAgZWxzZSBwdHIgPSBOVUxMOwotICAgIH0KKyAgICBlbHNlIGlmIChoYW5kbGUgPT0gMHg3ZmZmZmZmZikgcHRyID0gJnBDdXJyZW50UHJvY2Vzcy0+aGVhZGVyOworCisgICAgaWYgKHB0ciAmJiAoKHR5cGUgPT0gSzMyT0JKX1VOS05PV04pIHx8IChwdHItPnR5cGUgPT0gdHlwZSkpKQorICAgICAgICBLMzJPQkpfSW5jQ291bnQoIHB0ciApOworICAgIGVsc2UgcHRyID0gTlVMTDsKKwogICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmcEN1cnJlbnRQcm9jZXNzLT5jcml0X3NlY3Rpb24gKTsKICAgICBpZiAoIXB0cikgU2V0TGFzdEVycm9yKCBFUlJPUl9JTlZBTElEX0hBTkRMRSApOwogICAgIHJldHVybiBwdHI7CkBAIC01NDAsNiArNTQyLDcgQEAKICAgICByZXR1cm4gcmV0OwogfQogCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEV4cGFuZEVudmlyb25tZW50VmFyaWFibGVzQSAgIChLRVJORUwzMi4xMDMpCiAgKi8KZGlmZiAtLWdpdCBhL3NjaGVkdWxlci90aHJlYWQuYyBiL3NjaGVkdWxlci90aHJlYWQuYwppbmRleCAwYjQ4ZWZlLi4xNmY2MDJjIDEwMDY0NAotLS0gYS9zY2hlZHVsZXIvdGhyZWFkLmMKKysrIGIvc2NoZWR1bGVyL3RocmVhZC5jCkBAIC00MCw2ICs0MCw3IEBACiBUSERCICpUSFJFQURfQ3JlYXRlKCBQREIzMiAqcGRiLCBEV09SRCBzdGFja19zaXplLAogICAgICAgICAgICAgICAgICAgICAgTFBUSFJFQURfU1RBUlRfUk9VVElORSBzdGFydF9hZGRyICkKIHsKKyAgICBEV09SRCBvbGRfcHJvdDsKICAgICBUSERCICp0aGRiID0gSGVhcEFsbG9jKCBTeXN0ZW1IZWFwLCBIRUFQX1pFUk9fTUVNT1JZLCBzaXplb2YoVEhEQikgKTsKICAgICBpZiAoIXRoZGIpIHJldHVybiBOVUxMOwogICAgIHRoZGItPmhlYWRlci50eXBlICAgICA9IEszMk9CSl9USFJFQUQ7CkBAIC01OSw4ICs2MCw5IEBACiAgICAgdGhkYi0+c3RhY2tfYmFzZSA9IFZpcnR1YWxBbGxvYyggTlVMTCwgc3RhY2tfc2l6ZSwgTUVNX0NPTU1JVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFX0VYRUNVVEVfUkVBRFdSSVRFICk7CiAgICAgaWYgKCF0aGRiLT5zdGFja19iYXNlKSBnb3RvIGVycm9yOwotICAgIC8qIFVuLWNvbW1pdCB0aGUgZmlyc3QgcGFnZSAoRklYTUU6IHNob3VsZCB1c2UgUEFHRV9HVUFSRCBpbnN0ZWFkKSAqLwotICAgIFZpcnR1YWxGcmVlKCB0aGRiLT5zdGFja19iYXNlLCAxLCBNRU1fREVDT01NSVQgKTsKKyAgICAvKiBTZXQgYSBndWFyZCBwYWdlIGF0IHRoZSBib3R0b20gb2YgdGhlIHN0YWNrICovCisgICAgVmlydHVhbFByb3RlY3QoIHRoZGItPnN0YWNrX2Jhc2UsIDEsIFBBR0VfRVhFQ1VURV9SRUFEV1JJVEUgfCBQQUdFX0dVQVJELAorICAgICAgICAgICAgICAgICAgICAmb2xkX3Byb3QgKTsKICAgICB0aGRiLT50ZWIuc3RhY2tfdG9wICAgPSAoY2hhciAqKXRoZGItPnN0YWNrX2Jhc2UgKyBzdGFja19zaXplOwogICAgIHRoZGItPnRlYi5zdGFja19sb3cgICA9IHRoZGItPnRlYi5zdGFja190b3A7CiAgICAgdGhkYi0+ZXhpdF9zdGFjayAgICAgID0gdGhkYi0+dGViLnN0YWNrX3RvcDsKZGlmZiAtLWdpdCBhL3Rvb2xzL01ha2VmaWxlLmluIGIvdG9vbHMvTWFrZWZpbGUuaW4KaW5kZXggMDExNmM5MC4uMTZmN2ExZSAxMDA2NDQKLS0tIGEvdG9vbHMvTWFrZWZpbGUuaW4KKysrIGIvdG9vbHMvTWFrZWZpbGUuaW4KQEAgLTEsNCArMSw0IEBACi1ERUZTICAgICAgPSAtRF9fV0lORV9fIC1ETk9fVFJBTlNJVElPTl9UWVBFUworREVGUyAgICAgID0gLURfX1dJTkVfXwogVE9QU1JDRElSID0gQHRvcF9zcmNkaXJACiBUT1BPQkpESVIgPSAuLgogU1JDRElSICAgID0gQHNyY2RpckAKZGlmZiAtLWdpdCBhL3Rvb2xzL2J1aWxkLmMgYi90b29scy9idWlsZC5jCmluZGV4IGU4OGUyNGUuLjZkOTAwOGMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2J1aWxkLmMKKysrIGIvdG9vbHMvYnVpbGQuYwpAQCAtNSw4ICs1LDYgQEAKICAqIENvcHlyaWdodCAxOTk3IEVyaWMgWW91bmdkYWxlCiAgKi8KIAotI2lmbmRlZiBXSU5FTElCCi0KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgpAQCAtMTUsNyArMTMsNiBAQAogCiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgIndpbm50LmgiCi0jaW5jbHVkZSAid2luZXJyb3IuaCIgIC8qIGZvciBFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCAqLwogI2luY2x1ZGUgIm1vZHVsZS5oIgogI2luY2x1ZGUgIm5lZXhlLmgiCiAjaW5jbHVkZSAic2VsZWN0b3JzLmgiCkBAIC0xMDE2LDE1ICsxMDEzLDEyIEBACiAgICAgICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiLyogJXMuJWQgKCVzKSAqL1xuIiwgRExMTmFtZSwgaSwgb2RwLT5uYW1lKTsKICNpZmRlZiBVU0VfU1RBQlMKIAkgICAgZnByaW50Ziggb3V0ZmlsZSwgIi5zdGFicyBcIiVzXyVkOkYxXCIsMzYsMCwlZCwlc18lZFxuIiwgCi0JCSAgICAgRExMTmFtZSwgaSwKLQkJICAgICBvZHAtPmxpbmVubywgRExMTmFtZSwgaSk7CisJCSAgICAgRExMTmFtZSwgaSwgb2RwLT5saW5lbm8sIERMTE5hbWUsIGkpOwogI2VuZGlmCi0KICAgICAgICAgICAgIGZwcmludGYoIG91dGZpbGUsICIlc18lZDpcbiIsIERMTE5hbWUsIGkgKTsKICNpZmRlZiBVU0VfU1RBQlMKIAkgICAgZnByaW50Ziggb3V0ZmlsZSwgIi5zdGFibiA2OCwwLCVkLDBcbiIsIG9kcC0+bGluZW5vKTsKICNlbmRpZgotCiAgICAgICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNobCAlJWVicFxuIiApOwogICAgICAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaGwgJCIgUFJFRklYICIlc1xuIixvZHAtPnUuZnVuYy5saW5rX25hbWUpOwogICAgICAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0Y2FsbCAiIFBSRUZJWCAiQ2FsbEZyb20zMl8lc18lZFxuIiwKQEAgLTEwMzYsMTcgKzEwMzAsMjUgQEAKIAogICAgICAgICBjYXNlIFRZUEVfUkVUVVJOOgogICAgICAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIi8qICVzLiVkICglcykgKi9cbiIsIERMTE5hbWUsIGksIG9kcC0+bmFtZSk7CisjaWZkZWYgVVNFX1NUQUJTCisJICAgIGZwcmludGYoIG91dGZpbGUsICIuc3RhYnMgXCIlc18lZDpGMVwiLDM2LDAsJWQsJXNfJWRcbiIsIAorCQkgICAgIERMTE5hbWUsIGksIG9kcC0+bGluZW5vLCBETExOYW1lLCBpKTsKKyNlbmRpZgogICAgICAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIiVzXyVkOlxuIiwgRExMTmFtZSwgaSApOwotICAgICAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAkJWQsJSVlYXhcbiIsRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOwotICAgICAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAlJWVheCwiIFBSRUZJWCAiV0lOMzJfTGFzdEVycm9yXG4iICk7CisjaWZkZWYgVVNFX1NUQUJTCisJICAgIGZwcmludGYoIG91dGZpbGUsICIuc3RhYm4gNjgsMCwlZCwwXG4iLCBvZHAtPmxpbmVubyk7CisjZW5kaWYKICAgICAgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdmwgJCVkLCUlZWF4XG4iLCBvZHAtPnUucmV0LnJldF92YWx1ZSApOwogICAgICAgICAgICAgaWYgKG9kcC0+dS5yZXQuYXJnX3NpemUpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cmV0ICQlZFxuIiwgb2RwLT51LnJldC5hcmdfc2l6ZSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdHJldFxuIiApOwogICAgICAgICAgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdG5vcFxuIiApOwogICAgICAgICAgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdG5vcFxuIiApOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBmcHJpbnRmKCBvdXRmaWxlLCAiXHRyZXRcbiIgKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgVFlQRV9CWVRFOgpAQCAtMTgwNyw5ICsxODA5LDcgQEAKICAqIFByb3RvdHlwZXMgZm9yIHRoZSBDYWxsVG8xNiBmdW5jdGlvbnM6CiAgKiAgIGV4dGVybiBXT1JEIENhbGxUbzE2X3dvcmRfeHh4KCBGQVJQUk9DMTYgZnVuYywgYXJncy4uLiApOwogICogICBleHRlcm4gTE9ORyBDYWxsVG8xNl9sb25nX3h4eCggRkFSUFJPQzE2IGZ1bmMsIGFyZ3MuLi4gKTsKLSAqICAgZXh0ZXJuIHZvaWQgQ2FsbFRvMTZfcmVnc18oIEZBUlBST0MxNiBmdW5jLCBXT1JEIGRzLCBXT1JEIGVzLCBXT1JEIGJwLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV09SRCBheCwgV09SRCBieCwgV09SRCBjeCwgV09SRCBkeCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdPUkQgc2ksIFdPUkQgZGkgKTsKKyAqICAgZXh0ZXJuIHZvaWQgQ2FsbFRvMTZfcmVnc18oIGNvbnN0IENPTlRFWFQgKmNvbnRleHQgKTsKICAqLwogc3RhdGljIHZvaWQgQnVpbGRDYWxsVG8xNkZ1bmMoIEZJTEUgKm91dGZpbGUsIGNoYXIgKnByb2ZpbGUgKQogewpAQCAtMTg2Niw3ICsxODY2LDcgQEAKICAgICB7CiAgICAgICAgIC8qIFB1c2ggdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGFyZ3VtZW50ICovCiAgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdGxlYWwgMTIoJSVlYngpLCUlZWF4XG4iICk7Ci0gICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdHB1c2hsICQlZFxuIiwgcmVnX2Z1bmMgPyA4IDogc3RybGVuKGFyZ3MpICk7CisgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdHB1c2hsICQlZFxuIiwgcmVnX2Z1bmMgPyAtMSA6IHN0cmxlbihhcmdzKSApOwogICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNobCAlJWVheFxuIiApOwogICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRjYWxsICIgUFJFRklYICJSRUxBWV9EZWJ1Z0NhbGxUbzE2XG4iICk7CiAgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdHBvcGwgJSVlYXhcbiIgKTsKQEAgLTE4ODYsMTQgKzE4ODYsMTUgQEAKICAgICBpZiAocmVnX2Z1bmMpCiAgICAgewogICAgICAgICAvKiBHZXQgdGhlIHJlZ2lzdGVycy4gZWJ4IGlzIGhhbmRsZWQgbGF0ZXIgb24uICovCi0gICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdHB1c2h3IDIwKCUlZWJ4KVxuIiApOwotICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwb3B3ICUlZXNcbiIgKTsKLSAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAyNCglJWVieCksJSVlYnBcbiIgKTsKLSAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAyOCglJWVieCksJSVlYXhcbiIgKTsKLSAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAzNiglJWVieCksJSVlY3hcbiIgKTsKLSAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCA0MCglJWVieCksJSVlZHhcbiIgKTsKLSAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCA0NCglJWVieCksJSVlc2lcbiIgKTsKLSAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCA0OCglJWVieCksJSVlZGlcbiIgKTsKKyAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAxMiglJWVieCksJSVlYnhcbiIgKTsKKyAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAlZCglJWVieCksJSVlYXhcbiIsIENPTlRFWFRPRkZTRVQoU2VnRXMpICk7CisgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdncgJSVheCwlJWVzXG4iICk7CisgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdmwgJWQoJSVlYngpLCUlZWJwXG4iLCBDT05URVhUT0ZGU0VUKEVicCkgKTsKKyAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAlZCglJWVieCksJSVlYXhcbiIsIENPTlRFWFRPRkZTRVQoRWF4KSApOworICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICVkKCUlZWJ4KSwlJWVjeFxuIiwgQ09OVEVYVE9GRlNFVChFY3gpICk7CisgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdmwgJWQoJSVlYngpLCUlZWR4XG4iLCBDT05URVhUT0ZGU0VUKEVkeCkgKTsKKyAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAlZCglJWVieCksJSVlc2lcbiIsIENPTlRFWFRPRkZTRVQoRXNpKSApOworICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICVkKCUlZWJ4KSwlJWVkaVxuIiwgQ09OVEVYVE9GRlNFVChFZGkpICk7CiAgICAgfQogICAgIGVsc2UgIC8qIG5vdCBhIHJlZ2lzdGVyIGZ1bmN0aW9uICovCiAgICAgewpAQCAtMTkyMywyMSArMTkyNCwyNiBAQAogICAgIGZwcmludGYoIG91dGZpbGUsICJcdHB1c2hsICIgUFJFRklYICJDQUxMVE8xNl9SZXRBZGRyXyVzXG4iLAogICAgICAgICAgICAgIHNob3J0X3JldCA/ICJ3b3JkIiA6ICJsb25nIiApOwogCi0gICAgLyogUHVzaCB0aGUgY2FsbGVkIHJvdXRpbmUgYWRkcmVzcyAqLwotCi0gICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaGwgMTIoJSVlYngpXG4iICk7Ci0KLSAgICAvKiBHZXQgdGhlIDE2LWJpdCBkcyAqLwotCiAgICAgaWYgKHJlZ19mdW5jKQogICAgIHsKLSAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaHcgMTYoJSVlYngpXG4iICk7CisgICAgICAgIC8qIFB1c2ggdGhlIGNhbGxlZCByb3V0aW5lIGFkZHJlc3MgKi8KKworICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNodyAlZCglJWVieClcbiIsIENPTlRFWFRPRkZTRVQoU2VnQ3MpICk7CisgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdHB1c2h3ICVkKCUlZWJ4KVxuIiwgQ09OVEVYVE9GRlNFVChFaXApICk7CisKKyAgICAgICAgLyogR2V0IHRoZSAxNi1iaXQgZHMgKi8KKworICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNodyAlZCglJWVieClcbiIsIENPTlRFWFRPRkZTRVQoU2VnRHMpICk7CiAgICAgICAgIC8qIEdldCBlYnggZnJvbSB0aGUgMzItYml0IHN0YWNrICovCi0gICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdmwgMzIoJSVlYngpLCUlZWJ4XG4iICk7CisgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdmwgJWQoJSVlYngpLCUlZWJ4XG4iLCBDT05URVhUT0ZGU0VUKEVieCkgKTsKICAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cG9wdyAlJWRzXG4iICk7CiAgICAgfQogICAgIGVsc2UKICAgICB7CisgICAgICAgIC8qIFB1c2ggdGhlIGNhbGxlZCByb3V0aW5lIGFkZHJlc3MgKi8KKworICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNobCAxMiglJWVieClcbiIgKTsKKwogICAgICAgICAvKiBHZXQgcHJldmlvdXMgZHMgZnJvbSB0aGUgMTYtYml0IHN0YWNrIGFuZCAqLwogICAgICAgICAvKiBzZXQgYXggZXF1YWwgdG8gZHMgZm9yIHdpbmRvdyBwcm9jZWR1cmVzLiAqLwogICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3Z3IC0xMCglJWVicCksJSVheFxuIiApOwpAQCAtMjU5Myw1ICsyNTk5LDMgQEAKICAgICB9CiAgICAgcmV0dXJuIDA7CiB9Ci0KLSNlbmRpZiAgLyogV0lORUxJQiAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFrZV9vczIuc2ggYi90b29scy9tYWtlX29zMi5zaAppbmRleCA3NTY0YzVlLi4xMDUxOTcwIDEwMDY0NAotLS0gYS90b29scy9tYWtlX29zMi5zaAorKysgYi90b29scy9tYWtlX29zMi5zaApAQCAtMiw5ICsyLDEwIEBACiAjIEdDQ0xPQUQgbm90IG5lZWRlZCwgYnV0IHJlY29tbWVuZGVkLi4uCiAjR0NDTE9BRD01CiBDQz1nY2MKK0NGTEFHUz0iLU8yIC1abXRkIC1EX19TVF9NVF9FUlJOT19fIgogWUFDQz0iYmlzb24gLXkiCiBMRVg9ImZsZXggLW9sZXgueXkuYyIKIFJBTkxJQj0iYXIgLXMiCiBQUk9HRVhUPSIuZXhlIgotZXhwb3J0IENDIFlBQ0MgTEVYIFJBTkxJQiBQUk9HRVhUCitleHBvcnQgQ0MgQ0ZMQUdTIFlBQ0MgTEVYIFJBTkxJQiBQUk9HRVhUCiAuL2NvbmZpZ3VyZSAtLXgtaW5jbHVkZXM9JFgxMVJPT1QvWEZyZWU4Ni9pbmNsdWRlIC14LWxpYnJhcmllcz0kWDExUk9PVC9YRnJlZTg2L2xpYgpkaWZmIC0tZ2l0IGEvdG9vbHMvd2luZWNvbmYgYi90b29scy93aW5lY29uZgppbmRleCA5NjEwMzY2Li42M2IyZDRhIDEwMDc1NQotLS0gYS90b29scy93aW5lY29uZgorKysgYi90b29scy93aW5lY29uZgpAQCAtMSw0ICsxLDQgQEAKLSMhL3Vzci9iaW4vcGVybAorIyEvdXNyL2Jpbi9wZXJsIC13CiAKICMgVGhpcyBwcm9ncmFtIGdlbmVyYXRlcyB3aW5lLmNvbmYgZmlsZXMgb24gU1RET1VULgogIyAoQykgMTk5NiBTdGVwaGVuIFNpbW1vbnMKQEAgLTc0LDExICs3NCwxMyBAQAogCW5leHQgaWYgL15ccypcIy87CiAJbmV4dCBpZiAvXlxzKiQvOwogCSgkZGV2aWNlLCAkbW50cG9pbnQsICR0eXBlLCBAcmVzdCkgPSBzcGxpdCgnICcsICRfKTsKLQlpZiAoJHR5cGUgZXEgIm1zZG9zIikgewotCSAgICBwdXNoKEBGYXREcml2ZXMsIFskZGV2aWNlLCAkbW50cG9pbnRdKTsKLQl9Ci0JZWxzaWYgKCR0eXBlIGVxICJpc285NjYwIikgewotCSAgICBwdXNoKEBDZHJvbURyaXZlcywgWyRkZXZpY2UsICRtbnRwb2ludF0pOworCWlmICgkZGV2aWNlICF+IG0iXi9kZXYvZmQiKSB7CisJICAgIGlmICgkdHlwZSBlcSAibXNkb3MiIHx8ICR0eXBlIGVxICJ2ZmF0IikgeworCQlwdXNoKEBGYXREcml2ZXMsIFskZGV2aWNlLCAkbW50cG9pbnRdKTsKKwkgICAgfQorCSAgICBlbHNpZiAoJHR5cGUgZXEgImlzbzk2NjAiKSB7CisJCXB1c2goQENkcm9tRHJpdmVzLCBbJGRldmljZSwgJG1udHBvaW50XSk7CisJICAgIH0KIAl9CiAgICAgfQogICAgIGlmICghQEZhdERyaXZlcykgewpAQCAtMjUxLDcgKzI1Myw3IEBACiAgICAgfQogICAgIGVsc2UgewogCSMgVGVzdGVkIDEuNAotCXdhcm4gIldBUk5JTkc6IEM6XEFVVE9FWEVDLkJBVCB3YXMgbm90IGZvdW5kLlxuIjsKKwl3YXJuICJXQVJOSU5HOiBDOlxcQVVUT0VYRUMuQkFUIHdhcyBub3QgZm91bmQuXG4iOwogICAgIH0KIAogICAgIGlmICgkRE9TZW52eyJwYXRoIn0pIHsKZGlmZiAtLWdpdCBhL3dpbjMyL01ha2VmaWxlLmluIGIvd2luMzIvTWFrZWZpbGUuaW4KaW5kZXggZGJkYWUyYS4uMGE3ODkxYSAxMDA2NDQKLS0tIGEvd2luMzIvTWFrZWZpbGUuaW4KKysrIGIvd2luMzIvTWFrZWZpbGUuaW4KQEAgLTE2LDcgKzE2LDYgQEAKIAlmaWxlLmMgXAogCWluaXQuYyBcCiAJazMyb2JqLmMgXAotCW1lbW9yeS5jIFwKIAluZXdmbnMuYyBcCiAJcHJvY2Vzcy5jIFwKIAlzZWN1cml0eS5jIFwKZGlmZiAtLWdpdCBhL3dpbjMyL2FkdmFwaS5jIGIvd2luMzIvYWR2YXBpLmMKaW5kZXggMzFhOTJkMi4uMmZlNTRmMiAxMDA2NDQKLS0tIGEvd2luMzIvYWR2YXBpLmMKKysrIGIvd2luMzIvYWR2YXBpLmMKQEAgLTgsNyArOCw3IEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgIndpbmVycm9yLmgiCi0jaW5jbHVkZSAiYWR2YXBpMzIuaCIKKyNpbmNsdWRlICJzaGVsbC5oIgogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIApkaWZmIC0tZ2l0IGEvd2luMzIvY29kZV9wYWdlLmMgYi93aW4zMi9jb2RlX3BhZ2UuYwppbmRleCA2MDY3M2RiLi45NTE4NzRjIDEwMDY0NAotLS0gYS93aW4zMi9jb2RlX3BhZ2UuYworKysgYi93aW4zMi9jb2RlX3BhZ2UuYwpAQCAtNjksMTQgKzY5LDE0IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyICAgICAgICAgICAgICAgIChLRVJORUwzMi4zOTIpCiAgKi8KLWludCBNdWx0aUJ5dGVUb1dpZGVDaGFyKFVJTlQgcGFnZSwgRFdPUkQgZmxhZ3MsIGNoYXIgKnNyYywgaW50IHNyY2xlbiwKK2ludCBNdWx0aUJ5dGVUb1dpZGVDaGFyKFVJTlQzMiBwYWdlLCBEV09SRCBmbGFncywgY2hhciAqc3JjLCBpbnQgc3JjbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgV0NIQVIgKmRzdCwgaW50IGRzdGxlbikKIHsKICAgICByZXR1cm4gKHNyY2xlbj09LTEpID8gc3RybGVuKHNyYykgKiAyOiBzcmNsZW4qMjsgCiB9CiAKLWludCBXaWRlQ2hhclRvTXVsdGlCeXRlKFVJTlQgcGFnZSwgRFdPUkQgZmxhZ3MsIFdDSEFSICpzcmMsIGludCBzcmNsZW4sCi0JCQkJCQljaGFyICpkc3QsIGludCBkc3RsZW4sIGNoYXIqIGRlZmNoYXIsIEJPT0wgKnVzZWQpCitpbnQgV2lkZUNoYXJUb011bHRpQnl0ZShVSU5UMzIgcGFnZSwgRFdPUkQgZmxhZ3MsIFdDSEFSICpzcmMsIGludCBzcmNsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpkc3QsIGludCBkc3RsZW4sIGNoYXIqIGRlZmNoYXIsIEJPT0wzMiAqdXNlZCkKIHsKIAlpbnQgY291bnQgPSAwOwogCWludCBkb250X2NvcHk9IChkc3RsZW49PTApOwpkaWZmIC0tZ2l0IGEvd2luMzIvY29uc29sZS5jIGIvd2luMzIvY29uc29sZS5jCmluZGV4IDU1OGI0MzMuLjYzZTVmYTQgMTAwNjQ0Ci0tLSBhL3dpbjMyL2NvbnNvbGUuYworKysgYi93aW4zMi9jb25zb2xlLmMKQEAgLTI2LDcgKzI2LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFNldENvbnNvbGVDdHJsSGFuZGxlciAgICAgICAgICAgICAgIChLRVJORUwzMi40NTkpCiAgKi8KLUJPT0wgU2V0Q29uc29sZUN0cmxIYW5kbGVyKEhBTkRMRVJfUk9VVElORSAqIGZ1bmMsICBCT09MIGEpCitCT09MMzIgU2V0Q29uc29sZUN0cmxIYW5kbGVyKEhBTkRMRVJfUk9VVElORSAqIGZ1bmMsICBCT09MMzIgYSkKIHsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3dpbjMyL2N1cnNvcmljb24zMi5jIGIvd2luMzIvY3Vyc29yaWNvbjMyLmMKaW5kZXggNDBhMzI1MS4uMGEyMmEzOCAxMDA2NDQKLS0tIGEvd2luMzIvY3Vyc29yaWNvbjMyLmMKKysrIGIvd2luMzIvY3Vyc29yaWNvbjMyLmMKQEAgLTM5LDE1ICszOSwxNiBAQAogI2luY2x1ZGUgInhtYWxsb2MuaCIKIAogLyogVGhpcyBkaWN0aW9uYXJ5IGNvdWxkIG1pZ2h0IGV2ZW50dWFsbHkgYmVjb21lIGEgbWFjcm8gZm9yIGJldHRlciByZXVzZSAqLwotc3RydWN0IE1BUF9EV09SRF9EV09SRHsKLQlEV09SRCBrZXk7Ci0JRFdPUkQgdmFsdWU7CitzdHJ1Y3QgTUFQX0RXT1JEX0RXT1JECit7CisgICAgRFdPUkQga2V5OworICAgIEhBTkRMRTMyIHZhbHVlOwogfTsKIAogc3RydWN0IE1BUF9EV09SRF9EV09SRCAqQ1VSU09SSUNPTl9tYXA7CiBpbnQgQ1VSU09SSUNPTl9jb3VudDsKIAotQk9PTCBDVVJTT1JJQ09OX2xvb2t1cChEV09SRCBrZXksRFdPUkQgKnZhbHVlKQorQk9PTDMyIENVUlNPUklDT05fbG9va3VwKERXT1JEIGtleSxIQU5ETEUzMiAqdmFsdWUpCiB7CiAJaW50IGk7CiAJZm9yKGk9MDtpPENVUlNPUklDT05fY291bnQ7aSsrKQpAQCAtMjMzLDkgKzIzNCw5IEBACiAgKiBMb2FkIHRoZSBpY29uL2N1cnNvciBkaXJlY3RvcnkgZm9yIGEgZ2l2ZW4gcmVzb3VyY2UgbmFtZSBhbmQgZmluZCB0aGUKICAqIGJlc3QgbWF0Y2hpbmcgZW50cnkuCiAgKi8KLXN0YXRpYyBCT09MIENVUlNPUklDT04zMl9Mb2FkRGlyRW50cnkoSElOU1RBTkNFMzIgaEluc3RhbmNlLCBMUENXU1RSIG5hbWUsCitzdGF0aWMgQk9PTDMyIENVUlNPUklDT04zMl9Mb2FkRGlyRW50cnkoSElOU1RBTkNFMzIgaEluc3RhbmNlLCBMUENXU1RSIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBjb2xvcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MIGZDdXJzb3IsIENVUlNPUklDT05ESVJFTlRSWTMyICpkaXJFbnRyeSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wzMiBmQ3Vyc29yLCBDVVJTT1JJQ09ORElSRU5UUlkzMiAqZGlyRW50cnkpCiB7CiAgICAgSEFORExFMzIgaFJzcmM7CiAgICAgSEFORExFMzIgaE1lbTsKQEAgLTM5MSw4ICszOTIsOCBAQAogCiAgICAgLyogVHJhbnNmZXIgdGhlIGJpdG1hcCBiaXRzIHRvIHRoZSBDVVJTT1JJQ09OSU5GTyBzdHJ1Y3R1cmUgKi8KIAotICAgIEdldEJpdG1hcEJpdHMoIGhBbmRCaXRzLCBzaXplQW5kLCAoY2hhciAqKShpbmZvICsgMSkgKTsKLSAgICBHZXRCaXRtYXBCaXRzKCBoWG9yQml0cywgc2l6ZVhvciwgKGNoYXIgKikoaW5mbyArIDEpICsgc2l6ZUFuZCApOworICAgIEdldEJpdG1hcEJpdHMzMiggaEFuZEJpdHMsIHNpemVBbmQsIChjaGFyICopKGluZm8gKyAxKSApOworICAgIEdldEJpdG1hcEJpdHMzMiggaFhvckJpdHMsIHNpemVYb3IsIChjaGFyICopKGluZm8gKyAxKSArIHNpemVBbmQgKTsKICAgICBEZWxldGVPYmplY3QzMiggaFhvckJpdHMgKTsKICAgICBEZWxldGVPYmplY3QzMiggaEFuZEJpdHMgKTsKICAgICBHbG9iYWxVbmxvY2sxNiggaFJlcyApOwpAQCAtNDA2LDcgKzQwNyw3IEBACiAgKi8KIHN0YXRpYyBIR0xPQkFMMzIgQ1VSU09SSUNPTjMyX0xvYWQoIEhJTlNUQU5DRTMyIGhJbnN0YW5jZSwgTFBDV1NUUiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgY29sb3JzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCBmQ3Vyc29yICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wzMiBmQ3Vyc29yICkKIHsKICAgICBIQU5ETEUzMiBoYW5kbGU7CiAgICAgSEFORExFMzIgaFJldDsKZGlmZiAtLWdpdCBhL3dpbjMyL2Vycm9yLmMgYi93aW4zMi9lcnJvci5jCmluZGV4IGIzMmVjYTQuLjYyYzU1YmYgMTAwNjQ0Ci0tLSBhL3dpbjMyL2Vycm9yLmMKKysrIGIvd2luMzIvZXJyb3IuYwpAQCAtMTksNyArMTksNyBAQAogICogV2luZG93cyA5NS4gOi0pCiAgKi8KIHR5cGVkZWYgc3RydWN0IHsKLSAgICBpbnQgICAgICAgICBlcnJubzsKKyAgICBpbnQgICAgICAgICBlcnI7CiAgICAgRFdPUkQgICAgICAgd2luMzJlcnI7CiB9IEVSUk5PX1hMQVRfVEFCTEU7CiAKQEAgLTk3LDkgKzk3LDkgQEAKICAgICBEV09SRCByYyA9IEVSUk9SX1VOS05PV047CiAgICAgaW50IGkgPSAwOwogCi0gICAgd2hpbGUoZXJybm9feGxhdF90YWJsZVtpXS5lcnJubyAhPSAtMSkKKyAgICB3aGlsZShlcnJub194bGF0X3RhYmxlW2ldLmVyciAhPSAtMSkKICAgICB7Ci0gICAgICAgIGlmKGVycm5vX3hsYXRfdGFibGVbaV0uZXJybm8gPT0gZXJybm9fbnVtKQorICAgICAgICBpZihlcnJub194bGF0X3RhYmxlW2ldLmVyciA9PSBlcnJub19udW0pCiAgICAgICAgIHsKICAgICAgICAgICAgIHJjID0gZXJybm9feGxhdF90YWJsZVtpXS53aW4zMmVycjsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTE1LDExICsxMTUsMTEgQEAKICAgICBpbnQgcmMgPSAwOyAvKiBubyBlcnJvciAqLwogICAgIGludCBpID0gMDsKIAotICAgIHdoaWxlKGVycm5vX3hsYXRfdGFibGVbaV0uZXJybm8gIT0gLTEpCisgICAgd2hpbGUoZXJybm9feGxhdF90YWJsZVtpXS5lcnIgIT0gLTEpCiAgICAgewogICAgICAgICBpZihlcnJub194bGF0X3RhYmxlW2ldLndpbjMyZXJyID09IGxhc3RlcnJvciApCiAgICAgICAgIHsKLSAgICAgICAgICAgIHJjID0gZXJybm9feGxhdF90YWJsZVtpXS5lcnJubzsKKyAgICAgICAgICAgIHJjID0gZXJybm9feGxhdF90YWJsZVtpXS5lcnI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBpKys7CmRpZmYgLS1naXQgYS93aW4zMi9maWxlLmMgYi93aW4zMi9maWxlLmMKaW5kZXggYzA1OTUzMS4uOThiNGZmZSAxMDA2NDQKLS0tIGEvd2luMzIvZmlsZS5jCisrKyBiL3dpbjMyL2ZpbGUuYwpAQCAtMjgsMTA2ICsyOCw2IEBACiAKIHN0YXRpYyBpbnQgVHJhbnNsYXRlQ3JlYXRpb25GbGFncyhEV09SRCBjcmVhdGVfZmxhZ3MpOwogc3RhdGljIGludCBUcmFuc2xhdGVBY2Nlc3NGbGFncyhEV09SRCBhY2Nlc3NfZmxhZ3MpOwotaW50IFRyYW5zbGF0ZVByb3RlY3Rpb25GbGFncyhEV09SRCk7Ci0jaWZuZGVmIE1BUF9BTk9OCi0jZGVmaW5lIE1BUF9BTk9OIDAKLSNlbmRpZgotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgSEZJTEUzMgkJaGZpbGU7Ci0gICAgaW50CQkJcHJvdDsKLSAgICB1bnNpZ25lZCBsb25nCXNpemU7Ci19IEZJTEVNQVBfT0JKRUNUOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBPcGVuRmlsZU1hcHBpbmdBICAgICAgICAgICAgIChLRVJORUwzMi4zOTcpCi0gKiBGSVhNRTogc3R1YgotICoKLSAqLwotSEFORExFMzIgT3BlbkZpbGVNYXBwaW5nKERXT1JEIGFjY2VzcywgQk9PTCBpbmhlcml0LGNvbnN0IGNoYXIgKmZuYW1lKQotewotCXJldHVybiAwOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENyZWF0ZUZpbGVNYXBwaW5nMzJBICAgKEtFUk5FTDMyLjQ2KQotICovCi1IQU5ETEUzMiBDcmVhdGVGaWxlTWFwcGluZzMyQShIQU5ETEUzMiBoLExQU0VDVVJJVFlfQVRUUklCVVRFUyBhdHMsCi0gIERXT1JEIHBvdCwgIERXT1JEIHNoLCAgRFdPUkQgaGxvdywgIExQQ1NUUiBscE5hbWUgKQotewotICAgIEZJTEVNQVBfT0JKRUNUICpmaWxlbWFwX29iajsKLQotICAgIGRwcmludGZfd2luMzIoc3RkZGViLCJDcmVhdGVGaWxlTWFwcGluZzMyQSglMDh4LCVwLCVsZCwlbGQsJWxkLCVzKVxuIiwKLSAgICAJaCxhdHMscG90LHNoLGhsb3csbHBOYW1lCi0gICAgKTsKLSAgICBpZiAoc2gpIHsKLSAgICAgICAgU2V0TGFzdEVycm9yKEVycm5vVG9MYXN0RXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFMzI7Ci0gICAgfQotICAgIGZpbGVtYXBfb2JqPShGSUxFTUFQX09CSkVDVCAqKUhlYXBBbGxvYyggU3lzdGVtSGVhcCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihGSUxFTUFQX09CSkVDVCkgKTsKLSAgICBpZihmaWxlbWFwX29iaiA9PSBOVUxMKSB7Ci0gICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9VTktOT1dOKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChoPT1JTlZBTElEX0hBTkRMRV9WQUxVRTMyKQotICAgIAloPV9sY3JlYXQzMihscE5hbWUsMSk7LypGSVhNRSovCi0KLSAgICBmaWxlbWFwX29iai0+aGZpbGUgPSBoOwotICAgIGZpbGVtYXBfb2JqLT5wcm90ID0gVHJhbnNsYXRlUHJvdGVjdGlvbkZsYWdzKHBvdCk7Ci0gICAgZmlsZW1hcF9vYmotPnNpemUgPSBobG93OwotICAgIHJldHVybiAoSEFORExFMzIpZmlsZW1hcF9vYmo7OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDcmVhdGVGaWxlTWFwcGluZzMyVyAgIChLRVJORUwzMi40NykKLSAqCi0gKi8KLUhBTkRMRTMyIENyZWF0ZUZpbGVNYXBwaW5nMzJXKEhBTkRMRTMyIGgsTFBTRUNVUklUWV9BVFRSSUJVVEVTIGF0cywKLSAgRFdPUkQgcG90LCAgRFdPUkQgc2gsICBEV09SRCBobG93LCAgTFBDV1NUUiBscE5hbWUpCi17Ci0gICAgTFBTVFIgYW5hbWUgPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIGxwTmFtZSApOwotICAgIEhBTkRMRTMyIHJlcyA9IENyZWF0ZUZpbGVNYXBwaW5nMzJBKGgsYXRzLHBvdCxzaCxobG93LGFuYW1lKTsKLSAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgYW5hbWUgKTsKLSAgICByZXR1cm4gcmVzOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIE1hcFZpZXdPZkZpbGUgICAgICAgICAgICAgICAgICAoS0VSTkVMMzIuMzg1KQotICovCi1MUFZPSUQgTWFwVmlld09mRmlsZShIQU5ETEUzMiBoYW5kbGUsIERXT1JEIGFjY2VzcywgRFdPUkQgb2ZmaGksCi0gICAgICAgICAgICAgICAgICAgICAgRFdPUkQgb2ZmbG8sIERXT1JEIHNpemUpCi17Ci0gICAgcmV0dXJuIE1hcFZpZXdPZkZpbGVFeChoYW5kbGUsYWNjZXNzLG9mZmhpLG9mZmxvLHNpemUsMCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIE1hcFZpZXdPZkZpbGVFeCAgICAgICAgICAgICAgICAgIChLRVJORUwzMi4zODYpCi0gKgotICovCi1MUFZPSUQgTWFwVmlld09mRmlsZUV4KEhBTkRMRTMyIGhhbmRsZSwgRFdPUkQgYWNjZXNzLCBEV09SRCBvZmZoaSwKLSAgICAgICAgICAgICAgICAgICAgICBEV09SRCBvZmZsbywgRFdPUkQgc2l6ZSwgRFdPUkQgc3QpCi17Ci0gICAgRklMRU1BUF9PQkpFQ1QgKmZtYXAgPSAoRklMRU1BUF9PQkpFQ1QqKWhhbmRsZTsKLQotICAgIGlmICghc2l6ZSkgc2l6ZSA9IGZtYXAtPnNpemU7Ci0gICAgaWYgKCFzaXplKSBzaXplID0gMTsKLSAgICByZXR1cm4gbW1hcCAoKGNhZGRyX3Qpc3QsIHNpemUsIGZtYXAtPnByb3QsIAotICAgICAgICAgICAgICAgICBNQVBfQU5PTnxNQVBfUFJJVkFURSwgCi0JCSBGSUxFX0dldFVuaXhIYW5kbGUoZm1hcC0+aGZpbGUpLAotCQkgb2ZmbG8pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBVbm1hcFZpZXdPZkZpbGUgICAgICAgICAgICAgICAgICAoS0VSTkVMMzIuMzg1KQotICovCi1CT09MMzIgVW5tYXBWaWV3T2ZGaWxlKExQVk9JRCBhZGRyZXNzKSB7Ci0gICAgbXVubWFwKGFkZHJlc3MsLypobW0qLzEpOyAvKiBGSVhNRTogc2l6ZT8gKi8KLSAgICByZXR1cm4gVFJVRTsKLX0KLQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgIFdyaXRlRmlsZSAgICAgICAgICAgICAgIChLRVJORUwzMi41NzgpCkBAIC0zMDksNyArMjA5LDcgQEAKICAgICAgICAgYnVmLnN0X21vZGUgJj0gfjAyMjI7IC8qIG9jdGFsISwgY2xlYXIgd3JpdGUgcGVybWlzc2lvbiBiaXRzICovCiAgICAgICAgIGF0dHJpYnV0ZXMgJj0gfkZJTEVfQVRUUklCVVRFX1JFQURPTkxZOwogICAgIH0KLSAgICBhdHRyaWJ1dGVzICY9IH4oRklMRV9BVFRSSUJVVEVfSElEREVOfEZJTEVfQVRUUklCVVRFX1NZU1RFTSk7CisgICAgYXR0cmlidXRlcyAmPSB+KEZJTEVfQVRUUklCVVRFX0FSQ0hJVkV8RklMRV9BVFRSSUJVVEVfSElEREVOfEZJTEVfQVRUUklCVVRFX1NZU1RFTSk7CiAgICAgaWYgKGF0dHJpYnV0ZXMpCiAgICAgICAgIGZwcmludGYoc3RkbmltcCwiU2V0RmlsZUF0dHJpYnV0ZXNBKCVzKTolbHggYXR0cmlidXRlKHMpIG5vdCBpbXBsZW1lbnRlZC5cbiIsbHBGaWxlTmFtZSxhdHRyaWJ1dGVzKTsKICAgICBpZiAoLTE9PWNobW9kKGZ1bGxfbmFtZS5sb25nX25hbWUsYnVmLnN0X21vZGUpKQpkaWZmIC0tZ2l0IGEvd2luMzIvaW5pdC5jIGIvd2luMzIvaW5pdC5jCmluZGV4IDE4ZTE0ZWYuLjYzNzJhNDEgMTAwNjQ0Ci0tLSBhL3dpbjMyL2luaXQuYworKysgYi93aW4zMi9pbml0LmMKQEAgLTE4LDEwICsxOCw2IEBACiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJ4bWFsbG9jLmgiCiAgIAotLyogVGhlIGdsb2JhbCBlcnJvciB2YWx1ZQotICovCi1pbnQgV0lOMzJfTGFzdEVycm9yOwotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgICBHZXRNb2R1bGVIYW5kbGUgICAgICAgICAoS0VSTkVMMzIuMjM3KQogICovCkBAIC0zNiw3ICszMiw3IEBACiAJVERCICpwVGFzayA9IChUREIgKilHbG9iYWxMb2NrMTYoIEdldEN1cnJlbnRUYXNrKCkgKTsKIAloTW9kdWxlID0gcFRhc2stPmhJbnN0YW5jZTsKICAgICB9IGVsc2UKLQloTW9kdWxlID0gR2V0TW9kdWxlSGFuZGxlKG1vZHVsZSk7CisJaE1vZHVsZSA9IEdldE1vZHVsZUhhbmRsZTE2KG1vZHVsZSk7CiAgICAgZHByaW50Zl93aW4zMihzdGRkZWIsICJHZXRNb2R1bGVIYW5kbGVBOiByZXR1cm5pbmcgJWRcbiIsIGhNb2R1bGUgKTsKICAgICByZXR1cm4gaE1vZHVsZTsKIH0KZGlmZiAtLWdpdCBhL3dpbjMyL2szMm9iai5jIGIvd2luMzIvazMyb2JqLmMKaW5kZXggOTM5MTljMy4uYmNiMDU2NSAxMDA2NDQKLS0tIGEvd2luMzIvazMyb2JqLmMKKysrIGIvd2luMzIvazMyb2JqLmMKQEAgLTUsNiArNSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgIndpbmVycm9yLmgiCiAjaW5jbHVkZSAiaGFuZGxlMzIuaCIKICNpbmNsdWRlICJoZWFwLmgiCiAjaW5jbHVkZSAiZmlsZS5oIgpAQCAtMTMsMjggKzE0LDQwIEBACiAKIHR5cGVkZWYgdm9pZCAoKmRlc3Ryb3lfb2JqZWN0KShLMzJPQkogKik7CiAKK2V4dGVybiB2b2lkIFZJUlRVQUxfRGVzdHJveU1hcHBpbmcoIEszMk9CSiAqb2JqICk7CisKIHN0YXRpYyBjb25zdCBkZXN0cm95X29iamVjdCBLMzJPQkpfRGVzdHJveVtLMzJPQkpfTkJPQkpFQ1RTXSA9CiB7CiAgICAgTlVMTCwKLSAgICBOVUxMLCAgICAgICAgICAgICAgLyogSzMyT0JKX1NFTUFQSE9SRSAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAvKiBLMzJPQkpfRVZFTlQgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgLyogSzMyT0JKX01VVEVYICovCi0gICAgTlVMTCwgICAgICAgICAgICAgIC8qIEszMk9CSl9DUklUSUNBTF9TRUNUSU9OICovCi0gICAgUFJPQ0VTU19EZXN0cm95LCAgIC8qIEszMk9CSl9QUk9DRVNTICovCi0gICAgVEhSRUFEX0Rlc3Ryb3ksICAgIC8qIEszMk9CSl9USFJFQUQgKi8KLSAgICBGSUxFX0Rlc3Ryb3ksICAgICAgLyogSzMyT0JKX0ZJTEUgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgLyogSzMyT0JKX0NIQU5HRSAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAvKiBLMzJPQkpfQ09OU09MRSAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAvKiBLMzJPQkpfU0NSRUVOX0JVRkZFUiAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAvKiBLMzJPQkpfTUVNX01BUFBFRF9GSUxFICovCi0gICAgTlVMTCwgICAgICAgICAgICAgIC8qIEszMk9CSl9TRVJJQUwgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgLyogSzMyT0JKX0RFVklDRV9JT0NUTCAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAvKiBLMzJPQkpfUElQRSAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAvKiBLMzJPQkpfTUFJTFNMT1QgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgLyogSzMyT0JKX1RPT0xIRUxQX1NOQVBTSE9UICovCi0gICAgTlVMTCAgICAgICAgICAgICAgIC8qIEszMk9CSl9TT0NLRVQgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIEszMk9CSl9TRU1BUEhPUkUgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIEszMk9CSl9FVkVOVCAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogSzMyT0JKX01VVEVYICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBLMzJPQkpfQ1JJVElDQUxfU0VDVElPTiAqLworICAgIFBST0NFU1NfRGVzdHJveSwgICAgICAgICAgLyogSzMyT0JKX1BST0NFU1MgKi8KKyAgICBUSFJFQURfRGVzdHJveSwgICAgICAgICAgIC8qIEszMk9CSl9USFJFQUQgKi8KKyAgICBGSUxFX0Rlc3Ryb3ksICAgICAgICAgICAgIC8qIEszMk9CSl9GSUxFICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBLMzJPQkpfQ0hBTkdFICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBLMzJPQkpfQ09OU09MRSAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogSzMyT0JKX1NDUkVFTl9CVUZGRVIgKi8KKyAgICBWSVJUVUFMX0Rlc3Ryb3lNYXBwaW5nLCAgIC8qIEszMk9CSl9NRU1fTUFQUEVEX0ZJTEUgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIEszMk9CSl9TRVJJQUwgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIEszMk9CSl9ERVZJQ0VfSU9DVEwgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIEszMk9CSl9QSVBFICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBLMzJPQkpfTUFJTFNMT1QgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIEszMk9CSl9UT09MSEVMUF9TTkFQU0hPVCAqLworICAgIE5VTEwgICAgICAgICAgICAgICAgICAgICAgLyogSzMyT0JKX1NPQ0tFVCAqLwogfTsKIAordHlwZWRlZiBzdHJ1Y3QgX05FCit7CisgICAgc3RydWN0IF9ORSAqbmV4dDsKKyAgICBLMzJPQkogICAgICpvYmo7CisgICAgVUlOVDMyICAgICAgbGVuOworICAgIGNoYXIgICAgICAgIG5hbWVbMV07Cit9IE5BTUVfRU5UUlk7CisKK3N0YXRpYyBOQU1FX0VOVFJZICpLMzJPQkpfRmlyc3RFbnRyeSA9IE5VTEw7CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgSzMyT0JKX0luY0NvdW50CkBAIC01MiwxMSArNjUsODggQEAKICAqLwogdm9pZCBLMzJPQkpfRGVjQ291bnQoIEszMk9CSiAqcHRyICkKIHsKKyAgICBOQU1FX0VOVFJZICoqcHB0cjsKKwogICAgIC8qIEZJWE1FOiBub3QgYXRvbWljICovCiAgICAgYXNzZXJ0KCBwdHItPnR5cGUgJiYgKCh1bnNpZ25lZClwdHItPnR5cGUgPCBLMzJPQkpfTkJPQkpFQ1RTKSApOwogICAgIGFzc2VydCggcHRyLT5yZWZjb3VudCApOwogICAgIGlmICgtLXB0ci0+cmVmY291bnQpIHJldHVybjsKKworICAgIC8qIENoZWNrIGlmIHRoZSBvYmplY3QgaGFzIGEgbmFtZSBlbnRyeSBhbmQgZnJlZSBpdCAqLworCisgICAgcHB0ciA9ICZLMzJPQkpfRmlyc3RFbnRyeTsKKyAgICB3aGlsZSAoKnBwdHIgJiYgKCgqcHB0ciktPm9iaiAhPSBwdHIpKSBwcHRyID0gJigqcHB0ciktPm5leHQ7CisgICAgaWYgKCpwcHRyKQorICAgIHsKKyAgICAgICAgTkFNRV9FTlRSWSAqZW50cnkgPSAqcHB0cjsKKyAgICAgICAgKnBwdHIgPSBlbnRyeS0+bmV4dDsKKyAgICAgICAgSGVhcEZyZWUoIFN5c3RlbUhlYXAsIDAsIGVudHJ5ICk7CisgICAgfQorCiAgICAgLyogRnJlZSB0aGUgb2JqZWN0ICovCisKICAgICBpZiAoSzMyT0JKX0Rlc3Ryb3lbcHRyLT50eXBlXSkgSzMyT0JKX0Rlc3Ryb3lbcHRyLT50eXBlXSggcHRyICk7CiB9CiAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgSzMyT0JKX0FkZE5hbWUKKyAqCisgKiBBZGQgYSBuYW1lIGVudHJ5IGZvciBhbiBvYmplY3QuIFdlIGRvbid0IGNoZWNrIGZvciBkdXBsaWNhdGVzIGhlcmUuCisgKiBGSVhNRTogc2hvdWxkIHVzZSBzb21lIHNvcnQgb2YgaGFzaGluZy4KKyAqLworQk9PTDMyIEszMk9CSl9BZGROYW1lKCBLMzJPQkogKm9iaiwgTFBDU1RSIG5hbWUgKQoreworICAgIE5BTUVfRU5UUlkgKmVudHJ5ID0gSzMyT0JKX0ZpcnN0RW50cnk7CisgICAgVUlOVDMyIGxlbiA9IHN0cmxlbiggbmFtZSApOworCisgICAgaWYgKCEoZW50cnkgPSBIZWFwQWxsb2MoIFN5c3RlbUhlYXAsIDAsIHNpemVvZihlbnRyeSkgKyBsZW4gKSkpCisgICAgeworICAgICAgICBTZXRMYXN0RXJyb3IoIEVSUk9SX09VVE9GTUVNT1JZICk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgZW50cnktPm5leHQgPSBLMzJPQkpfRmlyc3RFbnRyeTsKKyAgICBlbnRyeS0+b2JqID0gb2JqOworICAgIGxzdHJjcHkzMkEoIGVudHJ5LT5uYW1lLCBuYW1lICk7CisgICAgSzMyT0JKX0ZpcnN0RW50cnkgPSBlbnRyeTsKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBLMzJPQkpfRmluZE5hbWUKKyAqCisgKiBGaW5kIHRoZSBvYmplY3QgcmVmZXJlbmNlZCBieSBhIGdpdmVuIG5hbWUuCisgKiBUaGUgcmVmZXJlbmNlIGNvdW50IGlzIG5vdCBpbmNyZW1lbnRlZC4KKyAqLworSzMyT0JKICpLMzJPQkpfRmluZE5hbWUoIExQQ1NUUiBuYW1lICkKK3sKKyAgICBOQU1FX0VOVFJZICplbnRyeSA9IEszMk9CSl9GaXJzdEVudHJ5OworICAgIFVJTlQzMiBsZW47CisKKyAgICBpZiAoIW5hbWUpIHJldHVybiBOVUxMOyAgLyogQW5vbnltb3VzIG9iamVjdCAqLworICAgIGxlbiA9IHN0cmxlbiggbmFtZSApOworICAgIHdoaWxlIChlbnRyeSkKKyAgICB7CisgICAgICAgIGlmICgobGVuID09IGVudHJ5LT5sZW4pICYmICFsc3RyY21wMzJBKCBuYW1lLCBlbnRyeS0+bmFtZSkpCisgICAgICAgICAgICByZXR1cm4gZW50cnktPm9iajsKKyAgICAgICAgZW50cnkgPSBlbnRyeS0+bmV4dDsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgSzMyT0JKX0ZpbmROYW1lVHlwZQorICoKKyAqIEZpbmQgYW4gb2JqZWN0IGJ5IG5hbWUgYW5kIGNoZWNrIGl0cyB0eXBlLgorICogVGhlIHJlZmVyZW5jZSBjb3VudCBpcyBub3QgaW5jcmVtZW50ZWQuCisgKi8KK0szMk9CSiAqSzMyT0JKX0ZpbmROYW1lVHlwZSggTFBDU1RSIG5hbWUsIEszMk9CSl9UWVBFIHR5cGUgKQoreworICAgIEszMk9CSiAqb2JqID0gSzMyT0JKX0ZpbmROYW1lKCBuYW1lICk7CisgICAgaWYgKCFvYmopIHJldHVybiBOVUxMOworICAgIGlmIChvYmotPnR5cGUgPT0gdHlwZSkgcmV0dXJuIG9iajsKKyAgICBTZXRMYXN0RXJyb3IoIEVSUk9SX0RVUF9OQU1FICk7CisgICAgcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS93aW4zMi9tZW1vcnkuYyBiL3dpbjMyL21lbW9yeS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2IxYWU1Li4wMDAwMDAwCi0tLSBhL3dpbjMyL21lbW9yeS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzU4ICswLDAgQEAKLS8qCi0gKiBXaW4zMiBrZXJuZWwgZnVuY3Rpb25zCi0gKgotICogQ29weXJpZ2h0IDE5OTUgTWFydGluIHZvbiBMb2V3aXMgYW5kIENhbWVyb24gSGVpZGUKLSAqLwotCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlICJ3aW5kb3dzLmgiCi0jaW5jbHVkZSAid2luZXJyb3IuaCIKLSNpbmNsdWRlICJ3aW5iYXNlLmgiCi0jaW5jbHVkZSAiaGVhcC5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCi0jaW5jbHVkZSAiZGVidWcuaCIKLQotI2lmbmRlZiBQUk9UX05PTkUgIC8qIEZyZWVCU0QgZG9lc24ndCBkZWZpbmUgUFJPVF9OT05FICovCi0jZGVmaW5lIFBST1RfTk9ORSAwCi0jZW5kaWYKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGNhZGRyX3QJcHRyOwotICAgIGxvbmcJc2l6ZTsKLX0gdmlydHVhbF9tZW1fdDsKLQotdHlwZWRlZiBzdHJ1Y3QgX1ZSQU5HRV9PQkpFQ1QKLXsKLQlEV09SRAkJCQlzdGFydDsKLQlEV09SRAkJCQlzaXplOwotCXN0cnVjdCBfVlJBTkdFX09CSkVDVCAqbmV4dDsKLX0gVlJBTkdFX09CSkVDVDsKLQotdmlydHVhbF9tZW1fdCAqbWVtID0gMDsKLWludCBtZW1fY291bnQgPSAwOwotaW50IG1lbV91c2VkID0gMDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgIFZSQU5HRQotICogQSBWUkFOR0UgZGVub3RlcyBhIGNvbnRpZ3VvdXMgcGFydCBvZiB0aGUgYWRkcmVzcyBzcGFjZS4gSXQgaXMgdXNlZAotICogZm9yIGhvdXNlIGtlZXBpbmcsIGFuZCB3aWxsIGJlIG9idGFpbmVkIGJ5IGhpZ2hlci1sZXZlbCBtZW1vcnkgYWxsb2NhdGlvbgotICogZnVuY3Rpb25zIChWaXJ0dWFsQWxsb2MsIE1hcFZpZXdPZkZpbGUpCi0gKiBUaGVyZSBjYW4gYmUgYXQgbW9zdCBvbmUgVlJBTkdFIG9iamVjdCBjb3ZlcmluZyBhbnkgYWRkcmVzcyBhdCBhbnkgdGltZS4KLSAqIEN1cnJlbnRseSwgYWxsIFZSQU5HRSBvYmplY3RzIGFyZSBzdG9yZWQgaW4gYSBzb3J0ZWQgbGlzdC4gV2luZSBkb2VzIG5vdAotICogYXR0ZW1wdCB0byBnaXZlIGEgY29tcGxldGUgbGlzdCBvZiBpbi11c2UgYWRkcmVzcyByYW5nZXMsIG9ubHkgdGhvc2UKLSAqIGFsbG9jYXRlZCB2aWEgV2luMzIuCi0gKiBBbiBleGNlcHRpb24gaXMgSXNWcmFuZ2VGcmVlLCB3aGljaCBzaG91bGQgdGVzdCB0aGUgT1Mgc3BlY2lmaWMgCi0gKiBtYXBwaW5ncywgdG9vLiBBcyBhIGRlZmF1bHQsIGFuIHJhbmdlIG5vdCBrbm93biB0byBiZSBhbGxvY2F0ZWQgaXMgCi0gKiBjb25zaWRlcmVkIGZyZWUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotVlJBTkdFX09CSkVDVCAqTUVNT1JZX3Jhbmdlcz0wOwotCi1WUkFOR0VfT0JKRUNUICpNRU1PUllfRmluZFZyYW5nZShEV09SRCBzdGFydCkKLXsKLQlWUkFOR0VfT0JKRUNUICpyYW5nZTsKLQlmb3IocmFuZ2U9TUVNT1JZX3JhbmdlcztyYW5nZSAmJiByYW5nZS0+c3RhcnQ8c3RhcnQ7cmFuZ2U9cmFuZ2UtPm5leHQpCi0JewotCQlpZihyYW5nZS0+c3RhcnQ8c3RhcnQgJiYgc3RhcnQ8cmFuZ2UtPnN0YXJ0K3JhbmdlLT5zaXplKQotCQkJcmV0dXJuIHJhbmdlOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBNRU1PUllfSXNWcmFuZ2VGcmVlKERXT1JEIHN0YXJ0LERXT1JEIHNpemUpCi17Ci0JRFdPUkQgZW5kOwotCVZSQU5HRV9PQkpFQ1QgKnJhbmdlOwotCWlmKCFzaXplKQotCQlyZXR1cm4gMTsKLQkvKiBGaXJzdCwgY2hlY2sgb3VyIGxpc3RzKi8KLQllbmQ9c3RhcnQrc2l6ZTsKLQlmb3IocmFuZ2U9TUVNT1JZX3JhbmdlcztyYW5nZSAmJiByYW5nZS0+c3RhcnQ8c3RhcnQ7cmFuZ2U9cmFuZ2UtPm5leHQpCi0JewotCQlpZigocmFuZ2UtPnN0YXJ0PHN0YXJ0ICYmIHN0YXJ0PHJhbmdlLT5zdGFydCtyYW5nZS0+c2l6ZSkgfHwKLQkJCShyYW5nZS0+c3RhcnQ8ZW5kICYmIGVuZDxyYW5nZS0+c3RhcnQrcmFuZ2UtPnNpemUpKQotCQlyZXR1cm4gMDsKLQl9Ci0JLyogTm93LCBjaGVjayB0aGUgbWFwcyB0aGF0IGFyZSBub3QgdW5kZXIgb3VyIGNvbnRyb2wgKi8KLSNpZmRlZiBsaW51eAotCXsKLQlGSUxFICpmPWZvcGVuKCIvcHJvYy9zZWxmL21hcHMiLCJyIik7Ci0JY2hhciBsaW5lWzgwXTsKLQlpbnQgZm91bmQ9MDsKLQl3aGlsZSgxKQotCXsKLQkJY2hhciAqaXQ7Ci0JCWludCBsb3dlcix1cHBlcjsKLQkJaWYoIWZnZXRzKGxpbmUsc2l6ZW9mKGxpbmUpLGYpKQotCQkJYnJlYWs7Ci0JCWl0PWxpbmU7Ci0JCWxvd2VyPXN0cnRvdWwoaXQsJml0LDE2KTsKLQkJaWYoKml0KyshPSctJykKLQkJCWZwcmludGYoc3RkZXJyLCJGb3JtYXQgb2YgL3Byb2Mvc2VsZi9tYXBzIGNoYW5nZWRcbiIpOwotCQl1cHBlcj1zdHJ0b3VsKGl0LCZpdCwxNik7Ci0JCWlmKChsb3dlcjxzdGFydCAmJiBzdGFydDx1cHBlcikgfHwgKGxvd2VyPHN0YXJ0K3NpemUgJiYgc3RhcnQrc2l6ZTx1cHBlcikpCi0JCXsKLQkJCWZvdW5kPTE7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlmY2xvc2UoZik7Ci0JcmV0dXJuICFmb3VuZDsKLQl9Ci0jZWxzZQotCXsKLQlzdGF0aWMgaW50IHdhcm5lZD0wOwotCWlmKCF3YXJuZWQpCi0JewotCQlmcHJpbnRmKHN0ZG5pbXAsICJEb24ndCBrbm93IGhvdyB0byBwZXJmb3JtIE1FTU9SWV9Jc1ZyYW5nZUZyZWUgb24gIgotCQkJInRoaXMgc3lzdGVtLlxuIFBsZWFzZSBmaXhcbiIpOwotCQl3YXJuZWQ9MDsKLQl9Ci0JcmV0dXJuIDE7Ci0JfQotI2VuZGlmCi19Ci0KLS8qIEZJWE1FOiBtaWdodCBuZWVkIHRvIGNvbnNvbGlkYXRlIHJhbmdlcyAqLwotdm9pZCBNRU1PUllfSW5zZXJ0VnJhbmdlKFZSQU5HRV9PQkpFQ1QgKnIpCi17Ci0JVlJBTkdFX09CSkVDVCAqaXQsKmxhc3Q7Ci0JaWYoIU1FTU9SWV9yYW5nZXMgfHwgci0+c3RhcnQ8TUVNT1JZX3Jhbmdlcy0+c3RhcnQpCi0JewotCQlyLT5uZXh0PU1FTU9SWV9yYW5nZXM7Ci0JCU1FTU9SWV9yYW5nZXM9cjsKLQl9Ci0JZm9yKGl0PU1FTU9SWV9yYW5nZXMsbGFzdD0wO2l0ICYmIGl0LT5zdGFydDxyLT5zdGFydDtpdD1pdC0+bmV4dCkKLQkJbGFzdD1pdDsKLQlyLT5uZXh0PWxhc3QtPm5leHQ7Ci0JbGFzdC0+bmV4dD1yOwotfQotCQotCi1WUkFOR0VfT0JKRUNUICpNRU1PUllfQWxsb2NWcmFuZ2UoaW50IHN0YXJ0LGludCBzaXplKQotewotCVZSQU5HRV9PQkpFQ1QgKnJldD1IZWFwQWxsb2MoIFN5c3RlbUhlYXAsIDAsIHNpemVvZihWUkFOR0VfT0JKRUNUKSk7Ci0JTUVNT1JZX0luc2VydFZyYW5nZShyZXQpOwotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQgTUVNT1JZX1JlbGVhc2VWcmFuZ2UoVlJBTkdFX09CSkVDVCAqcikKLXsKLQlWUkFOR0VfT0JKRUNUICppdDsKLQlpZihNRU1PUllfcmFuZ2VzPT1yKQotCXsKLQkJTUVNT1JZX3Jhbmdlcz1yLT5uZXh0OwotCQlIZWFwRnJlZSggU3lzdGVtSGVhcCwgMCwgciApOwotCQlyZXR1cm47Ci0JfQotCWZvcihpdD1NRU1PUllfcmFuZ2VzO2l0O2l0PWl0LT5uZXh0KQotCQlpZihpdC0+bmV4dD09cilicmVhazsKLQlpZighaXQpCi0JewotCQlmcHJpbnRmKHN0ZGVyciwiVlJBTkdFIG5vdCBmb3VuZFxuIik7Ci0JCXJldHVybjsKLQl9Ci0JaXQtPm5leHQ9ci0+bmV4dDsKLQlIZWFwRnJlZSggU3lzdGVtSGVhcCwgMCwgciApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBWaXJ0dWFsQWxsb2MgICAgICAgICAgICAgKEtFUk5FTDMyLjU0OCkKLSAqLwotaW50IFRyYW5zbGF0ZVByb3RlY3Rpb25GbGFncyhEV09SRCk7Ci1MUFZPSUQgVmlydHVhbEFsbG9jKExQVk9JRCBscHZBZGRyZXNzLCBEV09SRCBjYlNpemUsCi0gICAgICAgICAgICAgICAgICAgRFdPUkQgZmR3QWxsb2NhdGlvblR5cGUsIERXT1JEIGZkd1Byb3RlY3QpCi17Ci0gICAgY2FkZHJfdAlwdHI7Ci0gICAgaW50CWk7Ci0gICAgdmlydHVhbF9tZW1fdCAqdG1wX21lbTsKLSAgICBpbnQJcHJvdDsKLSAgICBzdGF0aWMgaW50IGZkemVybyA9IC0xOwotCi0gICAgaWYgKGZkemVybyA9PSAtMSkKLSAgICB7Ci0gICAgICAgIGlmICgoZmR6ZXJvID0gb3BlbiggIi9kZXYvemVybyIsIE9fUkRPTkxZICkpID09IC0xKQotICAgICAgICB7Ci0gICAgICAgICAgICBwZXJyb3IoICIvZGV2L3plcm86IG9wZW4iICk7Ci0gICAgICAgICAgICByZXR1cm4gKExQVk9JRClOVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZHByaW50Zl93aW4zMihzdGRkZWIsICJWaXJ0dWFsQWxsb2M6IHNpemUgPSAlbGQsIGFkZHJlc3M9JXBcbiIsIGNiU2l6ZSwgbHB2QWRkcmVzcyk7Ci0gICAgaWYgKGZkd0FsbG9jYXRpb25UeXBlICYgTUVNX1JFU0VSVkUgfHwgIWxwdkFkZHJlc3MpIHsKLSAgICAgICAgcHRyID0gbW1hcCgodm9pZCAqKSgoKCh1bnNpZ25lZCBsb25nKWxwdkFkZHJlc3MtMSkgJiAweEZGRkYwMDAwTCkgCi0JICAgICAgICAgICAgICAgICsgMHgwMDAxMDAwMEwpLAotCQkgICBjYlNpemUsIFBST1RfTk9ORSwgTUFQX1BSSVZBVEUsIGZkemVybywgMCApOwotCWlmIChwdHIgPT0gKGNhZGRyX3QpIC0xKSB7Ci0JICAgIGRwcmludGZfd2luMzIoc3RkZGViLCAiVmlydHVhbEFsbG9jOiByZXR1cm5pbmcgTlVMTCIpOwotCSAgICByZXR1cm4gKExQVk9JRCkgTlVMTDsKLQl9Ci0gICAgICAgIGlmIChscHZBZGRyZXNzICYmICgodW5zaWduZWQgbG9uZylwdHIgJiAweEZGRkYwMDAwTCkpIHsKLQkgICAgbXVubWFwKHB0ciwgY2JTaXplKTsKLQkgICAgY2JTaXplICs9IDY1NTM1OwotCSAgICBwdHIgPSAgbW1hcChscHZBZGRyZXNzLCBjYlNpemUsIAotCSAgICAgICAgICAgICAgICBQUk9UX05PTkUsIE1BUF9QUklWQVRFLCBmZHplcm8sIDAgKTsKLQkgICAgaWYgKHB0ciA9PSAoY2FkZHJfdCkgLTEpIHsKLQkJZHByaW50Zl93aW4zMihzdGRkZWIsICJWaXJ0dWFsQWxsb2M6IHJldHVybmluZyBOVUxMIik7Ci0JCXJldHVybiAoTFBWT0lEKSBOVUxMOwotCSAgICB9Ci0JICAgIHB0ciA9ICh2b2lkICopKCgoKHVuc2lnbmVkIGxvbmcpcHRyLTEpICYgMHhGRkZGMDAwMEwpKzB4MDAwMTAwMDBMKTsKLQl9Ci0JLyogcmVtZW1iZXIgdGhlIHNpemUgZm9yIFZpcnR1YWxGcmVlIHNpbmNlIGl0J3MgZ29pbmcgdG8gYmUgaGFuZGVkCi0JICAgYSB6ZXJvIGxlbiAqLwotCWlmIChwdHIpIHsKLQkgICAgaWYgKG1lbV9jb3VudCA9PSBtZW1fdXNlZCkgewotCSAgICAgICAgdG1wX21lbSA9IHJlYWxsb2MobWVtLChtZW1fY291bnQrMTApKnNpemVvZih2aXJ0dWFsX21lbV90KSk7Ci0JCWlmICghdG1wX21lbSkgcmV0dXJuIDA7Ci0JCW1lbSA9IHRtcF9tZW07Ci0JCW1lbXNldChtZW0rbWVtX2NvdW50LCAwLCAxMCpzaXplb2YodmlydHVhbF9tZW1fdCkpOwotCQltZW1fY291bnQgKz0gMTA7Ci0JICAgIH0KLQkgICAgZm9yIChpPTA7IGk8bWVtX2NvdW50OyBpKyspIHsKLQkgICAgICAgIGlmICghKG1lbStpKS0+cHRyKSB7Ci0JCSAgICAobWVtK2kpLT5wdHIgPSBwdHI7Ci0JCSAgICAobWVtK2kpLT5zaXplID0gY2JTaXplOwotCQkgICAgbWVtX3VzZWQrKzsKLQkJICAgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcHRyID0gbHB2QWRkcmVzczsKLSAgICB9Ci0gICAgaWYgKGZkd0FsbG9jYXRpb25UeXBlICYgTUVNX0NPTU1JVCkgewotICAgICAgICBwcm90ID0gVHJhbnNsYXRlUHJvdGVjdGlvbkZsYWdzKGZkd1Byb3RlY3QgJiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oUEFHRV9HVUFSRCB8IFBBR0VfTk9DQUNIRSkpOwotCW1wcm90ZWN0KHB0ciwgY2JTaXplLCBwcm90KTsKLSAgICB9Ci0jaWYgMAotLyoga2x1ZGdlIGZvciBnbnUtd2luMzIgKi8KLSAgICBpZiAoZmR3QWxsb2NhdGlvblR5cGUgJiBNRU1fUkVTRVJWRSkgcmV0dXJuIHNicmsoMCk7Ci0gICAgcHRyID0gbWFsbG9jKGNiU2l6ZSArIDY1NTM2KTsKLSAgICBpZihwdHIpCi0gICAgewotICAgICAgICAvKiBSb3VuZCBpdCB1cCB0byB0aGUgbmV4dCA2NEsgYm91bmRhcnkgYW5kIHplcm8gaXQuCi0gICAgICAgICAqLwotICAgICAgICBwdHIgPSAodm9pZCAqKSgoKHVuc2lnbmVkIGxvbmcpcHRyICYgMHhGRkZGMDAwMEwpICsgMHgwMDAxMDAwMEwpOwotICAgICAgICBtZW1zZXQocHRyLCAwLCBjYlNpemUpOwotICAgIH0KLSNlbmRpZgotICAgIGRwcmludGZfd2luMzIoc3RkZGViLCAiVmlydHVhbEFsbG9jOiBnb3QgcG9pbnRlciAlcFxuIiwgcHRyKTsKLSAgICByZXR1cm4gcHRyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBWaXJ0dWFsRnJlZSAgICAgICAgICAgICAgIChLRVJORUwzMi41NTApCi0gKi8KLUJPT0wzMiBWaXJ0dWFsRnJlZShMUFZPSUQgbHB2QWRkcmVzcywgRFdPUkQgY2JTaXplLCBEV09SRCBmZHdGcmVlVHlwZSkKLXsKLSAgICBpbnQgaTsKLQotICAgIGlmIChmZHdGcmVlVHlwZSAmIE1FTV9SRUxFQVNFKSB7Ci0gICAgICAgIGZvciAoaT0wOyBpPG1lbV9jb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoKG1lbStpKS0+cHRyID09IGxwdkFkZHJlc3MpIHsKLSAgICAJICAgICAgICAgbXVubWFwKGxwdkFkZHJlc3MsIChtZW0raSktPnNpemUpOwotICAgIAkgICAgICAgICAobWVtK2kpLT5wdHIgPSAwOwotICAgIAkgICAgICAgICBtZW1fdXNlZC0tOwotICAgIAkgICAgICAgICBicmVhazsKLQkgICAgfQotICAgIAl9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbXByb3RlY3QobHB2QWRkcmVzcywgY2JTaXplLCBQUk9UX05PTkUpOwotICAgIH0KLSNpZiAwCi0gICAgaWYobHB2QWRkcmVzcykKLSAgICAgICAgZnJlZShscHZBZGRyZXNzKTsKLSNlbmRpZgotICAgIHJldHVybiAxOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBWaXJ0dWFsUXVlcnkgICAgICAgICAgICAgICAoS0VSTkVMMzIuNTU0KQotICovCi1CT09MMzIgVmlydHVhbFF1ZXJ5KExQQ1ZPSUQgYWRkcmVzcyxMUE1FTU9SWV9CQVNJQ19JTkZPUk1BVElPTiBidWYsRFdPUkQgbGVuKSAKLXsKLQkvKiBGSVhNRTogZmlsbCBvdXQgc3RydWN0dXJlICAuLi4gKi8KLQlyZXR1cm4gVFJVRTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgVmlydHVhbFByb3RlY3QgICAgICAgICAgICAgICAoS0VSTkVMMzIuNTUyKQotICovCi1CT09MMzIgVmlydHVhbFByb3RlY3QoTFBWT0lEIGxwQWRkcmVzcyxEV09SRCBkd1NpemUsRFdPUkQgZmxOZXdQcm90ZWN0LExQRFdPUkQgbHBmbE9sZFByb3RlY3QpIHsKLQkvKiBGSVhNRTogZG8gcHJvdGVjdGlvbiAuLi4gc2VlIG1wcm90ZWN0KCkuICovCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotaW50IFRyYW5zbGF0ZVByb3RlY3Rpb25GbGFncyhEV09SRCBwcm90ZWN0aW9uX2ZsYWdzKQotewotICAgIGludCBwcm90OwotCi0gICAgICAgIHN3aXRjaChwcm90ZWN0aW9uX2ZsYWdzKSB7Ci0JICAgIGNhc2UgUEFHRV9SRUFET05MWToKLQkgICAgICAgIHByb3Q9UFJPVF9SRUFEOwotCQlicmVhazsKLQkgICAgY2FzZSBQQUdFX1JFQURXUklURToKLQkgICAgICAgIHByb3Q9UFJPVF9SRUFEfFBST1RfV1JJVEU7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFBBR0VfV1JJVEVDT1BZOgotCSAgICAgICAgcHJvdD1QUk9UX1dSSVRFOwotCQlicmVhazsKLQkgICAgY2FzZSBQQUdFX0VYRUNVVEU6Ci0JICAgICAgICBwcm90PVBST1RfRVhFQzsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgUEFHRV9FWEVDVVRFX1JFQUQ6Ci0JICAgICAgICBwcm90PVBST1RfRVhFQ3xQUk9UX1JFQUQ7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFBBR0VfRVhFQ1VURV9SRUFEV1JJVEU6Ci0JICAgICAgICBwcm90PVBST1RfRVhFQ3xQUk9UX1JFQUR8UFJPVF9XUklURTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgUEFHRV9FWEVDVVRFX1dSSVRFQ09QWToKLQkgICAgICAgIHByb3Q9UFJPVF9FWEVDfFBST1RfV1JJVEU7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFBBR0VfTk9BQ0NFU1M6Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgICBwcm90PVBST1RfTk9ORTsKLQkJYnJlYWs7Ci0JfQotICAgcmV0dXJuIHByb3Q7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgSXNCYWRSZWFkUHRyCi0gKi8KLUJPT0wgV0lOMzJfSXNCYWRSZWFkUHRyKHZvaWQqIHB0ciwgdW5zaWduZWQgaW50IGJ5dGVzKQotewotCWRwcmludGZfZ2xvYmFsKHN0ZGRlYiwiSXNCYWRSZWFkUHRyKCV4LCV4KVxuIiwoaW50KXB0cixieXRlcyk7Ci0JLyogRklYTUU6IFNob3VsZCBtYWtlIGNoZWNrIGJhc2VkIG9uIGFjdHVhbCBtYXBwaW5ncywgaGVyZSAqLwotCXJldHVybiBGQUxTRTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgSXNCYWRXcml0ZVB0cgotICovCi1CT09MIFdJTjMyX0lzQmFkV3JpdGVQdHIodm9pZCogcHRyLCB1bnNpZ25lZCBpbnQgYnl0ZXMpCi17Ci0JZHByaW50Zl9nbG9iYWwoc3RkZGViLCJJc0JhZFdyaXRlUHRyKCV4LCV4KVxuIiwoaW50KXB0cixieXRlcyk7Ci0JLyogRklYTUU6IFNob3VsZCBtYWtlIGNoZWNrIGJhc2VkIG9uIGFjdHVhbCBtYXBwaW5ncywgaGVyZSAqLwotCXJldHVybiBGQUxTRTsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgIElzQmFkV3JpdGVQdHIKLSAqLwotQk9PTCBXSU4zMl9Jc0JhZENvZGVQdHIodm9pZCogcHRyLCB1bnNpZ25lZCBpbnQgYnl0ZXMpCi17Ci0JZHByaW50Zl9nbG9iYWwoc3RkZGViLCJJc0JhZENvZGVQdHIoJXgsJXgpXG4iLChpbnQpcHRyLGJ5dGVzKTsKLQkvKiBGSVhNRTogU2hvdWxkIG1ha2UgY2hlY2sgYmFzZWQgb24gYWN0dWFsIG1hcHBpbmdzLCBoZXJlICovCi0JcmV0dXJuIEZBTFNFOwotfQpkaWZmIC0tZ2l0IGEvd2luMzIvcHJvY2Vzcy5jIGIvd2luMzIvcHJvY2Vzcy5jCmluZGV4IGU0MDNjZGUuLjU4ZjhkYzMgMTAwNjQ0Ci0tLSBhL3dpbjMyL3Byb2Nlc3MuYworKysgYi93aW4zMi9wcm9jZXNzLmMKQEAgLTE4LDcgKzE4LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIENyZWF0ZU11dGV4QSAgICAoS0VSTkVMMzIuNTIpCiAgKi8KLUhBTkRMRTMyIENyZWF0ZU11dGV4QSAoU0VDVVJJVFlfQVRUUklCVVRFUyAqc2EsIEJPT0wgb24sIGNvbnN0IGNoYXIgKmEpCitIQU5ETEUzMiBDcmVhdGVNdXRleEEgKFNFQ1VSSVRZX0FUVFJJQlVURVMgKnNhLCBCT09MMzIgb24sIGNvbnN0IGNoYXIgKmEpCiB7CiAJcmV0dXJuIDA7CiB9CkBAIC0yNiw3ICsyNiw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBSZWxlYXNlTXV0ZXggICAgKEtFUk5FTDMyLjQzNSkKICAqLwotQk9PTCBSZWxlYXNlTXV0ZXggKEhBTkRMRTMyIGgpCitCT09MMzIgUmVsZWFzZU11dGV4IChIQU5ETEUzMiBoKQogewogCXJldHVybiAwOwogfQpAQCAtMzQsNyArMzQsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQ3JlYXRlRXZlbnRBICAgIChLRVJORUwzMi40MykKICAqLwotSEFORExFMzIgQ3JlYXRlRXZlbnRBIChTRUNVUklUWV9BVFRSSUJVVEVTICpzYSwgQk9PTCBhdSwgQk9PTCBvbiwgY29uc3QgY2hhcgorSEFORExFMzIgQ3JlYXRlRXZlbnRBIChTRUNVUklUWV9BVFRSSUJVVEVTICpzYSwgQk9PTDMyIGF1LCBCT09MMzIgb24sIGNvbnN0IGNoYXIKICpuYW1lKQogewogCXJldHVybiAwOwpAQCAtNDIsMTQgKzQyLDE0IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBTZXRFdmVudCAgICAoS0VSTkVMMzIuNDg3KQogICovCi1CT09MIFNldEV2ZW50IChIQU5ETEUzMiBoKQorQk9PTDMyIFNldEV2ZW50IChIQU5ETEUzMiBoKQogewogCXJldHVybiAwOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgUmVzZXRFdmVudCAgICAoS0VSTkVMMzIuNDM5KQogICovCi1CT09MIFJlc2V0RXZlbnQgKEhBTkRMRTMyIGgpCitCT09MMzIgUmVzZXRFdmVudCAoSEFORExFMzIgaCkKIHsKIAlyZXR1cm4gMDsKIH0KQEAgLTYzLDcgKzYzLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIER1cGxpY2F0ZUhhbmRsZSAgICAoS0VSTkVMMzIuNzgpCiAgKi8KLUJPT0wgRHVwbGljYXRlSGFuZGxlKEhBTkRMRTMyIGEsIEhBTkRMRTMyIGIsIEhBTkRMRTMyIGMsIEhBTkRMRTMyICogZCwgRFdPUkQgZSwgQk9PTCBmLCBEV09SRCBnKQorQk9PTDMyIER1cGxpY2F0ZUhhbmRsZShIQU5ETEUzMiBhLCBIQU5ETEUzMiBiLCBIQU5ETEUzMiBjLCBIQU5ETEUzMiAqIGQsIERXT1JEIGUsIEJPT0wzMiBmLCBEV09SRCBnKQogewogCSpkID0gYjsKIAlyZXR1cm4gMTsKQEAgLTc5LDEzICs3OSwxMyBAQAogewogCUhJTlNUQU5DRTMyIGhhbmRsZTsKIAlkcHJpbnRmX21vZHVsZSggc3RkZGViLCAiTG9hZExpYnJhcnk6ICglMDh4KSAlc1xuIiwgKGludClsaWJuYW1lLCBsaWJuYW1lKTsKLQloYW5kbGUgPSBMb2FkTW9kdWxlKCBsaWJuYW1lLCAoTFBWT0lEKS0xICk7CisJaGFuZGxlID0gTG9hZE1vZHVsZTE2KCBsaWJuYW1lLCAoTFBWT0lEKS0xICk7CiAJaWYgKGhhbmRsZSA9PSAoSElOU1RBTkNFMzIpIC0xKQogCXsKIAkJY2hhciBidWZmZXJbMjU2XTsKIAkJc3RyY3B5KCBidWZmZXIsIGxpYm5hbWUgKTsKIAkJc3RyY2F0KCBidWZmZXIsICIuZGxsIiApOwotCQloYW5kbGUgPSBMb2FkTW9kdWxlKCBidWZmZXIsIChMUFZPSUQpLTEgKTsKKwkJaGFuZGxlID0gTG9hZE1vZHVsZTE2KCBidWZmZXIsIChMUFZPSUQpLTEgKTsKIAl9CiAJLyogT2J0YWluIG1vZHVsZSBoYW5kbGUgYW5kIGNhbGwgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gKi8KICNpZm5kZWYgV0lORUxJQgpAQCAtMTA4LDcgKzEwOCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBGcmVlTGlicmFyeQogICovCi1CT09MIEZyZWVMaWJyYXJ5MzIoSElOU1RBTkNFMzIgaExpYk1vZHVsZSkKK0JPT0wzMiBGcmVlTGlicmFyeTMyKEhJTlNUQU5DRTMyIGhMaWJNb2R1bGUpCiB7CiAJZnByaW50ZihzdGRlcnIsIkZyZWVMaWJyYXJ5OiBlbXB0eSBzdHViXG4iKTsKIAlyZXR1cm4gVFJVRTsKQEAgLTExNyw3ICsxMTcsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgIEdldFByb2Nlc3NBZmZpbml0eU1hc2sKICAqLwotQk9PTCBHZXRQcm9jZXNzQWZmaW5pdHlNYXNrKEhBTkRMRTMyIGhQcm9jZXNzLCBMUERXT1JEIGxwUHJvY2Vzc0FmZmluaXR5TWFzaywKK0JPT0wzMiBHZXRQcm9jZXNzQWZmaW5pdHlNYXNrKEhBTkRMRTMyIGhQcm9jZXNzLCBMUERXT1JEIGxwUHJvY2Vzc0FmZmluaXR5TWFzaywKICAgTFBEV09SRCBscFN5c3RlbUFmZmluaXR5TWFzaykKIHsKIAlkcHJpbnRmX3Rhc2soc3RkZGViLCJHZXRQcm9jZXNzQWZmaW5pdHlNYXNrKCV4LCVseCwlbHgpXG4iLApAQCAtMTM1LDcgKzEzNSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFNldFRocmVhZEFmZmluaXR5TWFzawogICovCi1CT09MIFNldFRocmVhZEFmZmluaXR5TWFzayhIQU5ETEUzMiBoVGhyZWFkLCBEV09SRCBkd1RocmVhZEFmZmluaXR5TWFzaykKK0JPT0wzMiBTZXRUaHJlYWRBZmZpbml0eU1hc2soSEFORExFMzIgaFRocmVhZCwgRFdPUkQgZHdUaHJlYWRBZmZpbml0eU1hc2spCiB7CiAJZHByaW50Zl90YXNrKHN0ZGRlYiwiU2V0VGhyZWFkQWZmaW5pdHlNYXNrKCV4LCVseClcbiIsaFRocmVhZCwKIAkJZHdUaHJlYWRBZmZpbml0eU1hc2spOwpkaWZmIC0tZ2l0IGEvd2luMzIvdGhyZWFkLmMgYi93aW4zMi90aHJlYWQuYwppbmRleCA2YzA1NTlmLi4yYWNmODU2IDEwMDY0NAotLS0gYS93aW4zMi90aHJlYWQuYworKysgYi93aW4zMi90aHJlYWQuYwpAQCAtMiwxMSArMiwxNCBAQAogICogV2luMzIga2VybmVsIGZ1bmN0aW9ucwogICoKICAqIENvcHlyaWdodCAxOTk1IE1hcnRpbiB2b24gTG9ld2lzCisgKiBDb3B5cmlnaHQgMTk5NyBPbm5vIEhvdmVycwogICovCiAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9pcGMuaD4KKyNpbmNsdWRlIDxzeXMvc2VtLmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgIndpbmJhc2UuaCIKICNpbmNsdWRlICJ3aW5lcnJvci5oIgpAQCAtMTQsOTYgKzE3LDI0NiBAQAogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAieG1hbGxvYy5oIgogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgQ3JpdGljYWwgU2VjdGlvbnMgYXJlIGN1cnJlbnRseSBpZ25vcmVkCisKKy8qCisgKiBGSVhNRTogCisgKiBUaGUgYyBmdW5jdGlvbnMgZG8gbm90IHByb3RlY3QgZnJvbSBub24taW50ZXJsb2NrZWQgYWNjZXNzZXMKKyAqIFRoaXMgaXMgbm8gcHJvYmxlbSBhcyBsb25nIGFzIHdlIGRvIG5vdCBoYXZlIG11bHRpcGxlIFdpbjMyIHRocmVhZHMgCisgKiBvciBwcm9jZXNzZXMuIAorICogVGhlIGFzc2VtYmx5IG1hY3JvJ3MgZG8gcHJvdGVjdCBmcm9tIG5vbi1pbnRlcmxvY2tlZCBhY2Nlc3MsCisgKiBidXQgdGhleSB3aWxsIG9ubHkgd29yayBmb3IgaTM4NiBzeXN0ZW1zIHdpdGggR0NDLiAgCiAgKi8KLXZvaWQgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbihDUklUSUNBTF9TRUNUSU9OICpscENyaXQpCi17Ci0JbWVtc2V0KGxwQ3JpdCwwLHNpemVvZihDUklUSUNBTF9TRUNUSU9OKSk7Ci19CisgCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICAgICAgICBJbnRlcmxvY2tlZEluY3JlbWVudAkJCVtLRVJORUwzMl0JKgorKgkJCQkJCQkJCSoKKyogSW50ZXJsb2NrZWRJbmNyZW1lbnQgYWRkcyAxIHRvIGEgbG9uZyB2YXJpYWJsZSBhbmQgcmV0dXJucwkJKgorKiAgLSAgYSBuZWdhdGl2ZSBudW1iZXIgaWYgdGhlIHJlc3VsdCA8IDAJCQkJKgorKiAgLSAgemVybyBpZiB0aGUgcmVzdWx0ID09IDAJCQkJCQkqCisqICAtICBhIHBvc2l0aXZlIG51bWJlciBpZiB0aGUgcmVzdWx0ID4gMAkJCQkqCisqCQkJCQkJCQkJKgorKiBUaGUgcmV0dXJuZWQgbnVtYmVyIG5lZWQgbm90IGJlIGVxdWFsIHRvIHRoZSByZXN1bHQhISEhCQkqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgRW50ZXJDcml0aWNhbFNlY3Rpb24oQ1JJVElDQUxfU0VDVElPTiogbHBDcml0KQotewotICAgIGlmIChscENyaXQtPkxvY2tDb3VudCkKLSAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiRXJyb3I6IHJlLWVudGVyaW5nIGNyaXRpY2FsIHNlY3Rpb24gJTA4bHhcbiIsCi0gICAgICAgICAgICAgICAgIChEV09SRClscENyaXQgKTsKLSAgICBscENyaXQtPkxvY2tDb3VudCsrOwotfQotCi12b2lkIExlYXZlQ3JpdGljYWxTZWN0aW9uKENSSVRJQ0FMX1NFQ1RJT04qIGxwQ3JpdCkKLXsKLSAgICBpZiAoIWxwQ3JpdC0+TG9ja0NvdW50KQotICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJFcnJvcjogbGVhdmluZyBjcml0aWNhbCBzZWN0aW9uICUwOGx4IGFnYWluXG4iLAotICAgICAgICAgICAgICAgICAoRFdPUkQpbHBDcml0ICk7Ci0gICAgbHBDcml0LT5Mb2NrQ291bnQtLTsKLX0KLQotdm9pZCBEZWxldGVDcml0aWNhbFNlY3Rpb24oQ1JJVElDQUxfU0VDVElPTiogbHBDcml0KQotewotCXJldHVybjsKLX0KLQotdm9pZCBSZWluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oQ1JJVElDQUxfU0VDVElPTiAqbHBDcml0KSB7Ci0JLyogaG1tICovCi19Ci0KLXZvaWQgTWFrZUNyaXRpY2FsU2VjdGlvbkdsb2JhbChDUklUSUNBTF9TRUNUSU9OICpscENyaXQpIHsKLQkvKiBobW0gKi8KLX0KLQotCi0vKiBGSVhNRTogVGhpcyBpcyByZXF1aXJlZCB0byB3b3JrIGNyb3NzLWFkZHJlcyBzcGFjZSBhcyB3ZWxsICovCi1zdGF0aWMgQ1JJVElDQUxfU0VDVElPTiBpbnRlcmxvY2tlZDsKLXN0YXRpYyBpbnQgaW50ZXJsb2NrZWRfaW5pdDsKLQotc3RhdGljIHZvaWQgZ2V0X2ludGVybG9ja2VkKCkKLXsKLQlpZighaW50ZXJsb2NrZWRfaW5pdCkKLQkJSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbigmaW50ZXJsb2NrZWQpOwotCWludGVybG9ja2VkX2luaXQ9MTsKLQlFbnRlckNyaXRpY2FsU2VjdGlvbigmaW50ZXJsb2NrZWQpOwotfQotCi1zdGF0aWMgdm9pZCByZWxlYXNlX2ludGVybG9ja2VkKCkKLXsKLQlMZWF2ZUNyaXRpY2FsU2VjdGlvbigmaW50ZXJsb2NrZWQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBJbnRlcmxvY2tlZEluY3JlbWVudAotICovCiBMT05HIEludGVybG9ja2VkSW5jcmVtZW50KExQTE9ORyBscEFkZGVuZCkKIHsKLQlpbnQgcmV0OwotCWdldF9pbnRlcmxvY2tlZCgpOworI2lmIGRlZmluZWQoX19pMzg2X18pJiZkZWZpbmVkKF9fR05VQ19fKQorCWxvbmcgcmV0OworCV9fYXNtX18KKwkoCSAgCSAKKwkgICAiXHRsb2NrXG4iCS8qIGZvciBTTVAgc3lzdGVtcyAqLworCSAgICJcdGluY2wJKCUxKVxuIgorCSAgICJcdGplCTJmXG4iCisJICAgIlx0amwJMWZcbiIKKwkgICAiXHRpbmNsCSUwXG4iCisJICAgIlx0am1wCTJmXG4iCisJICAgIjE6XHRkZWMJJTBcbiIgICAgCSAgCisJICAgIjI6XG4iCisJICAgOiI9ciIgKHJldCk6InIiIChscEFkZGVuZCksICIwIiAoMCk6ICJtZW1vcnkiCisJKTsKKwlyZXR1cm4gcmV0OworI2Vsc2UgICAgICAKKwlMT05HIHJldDsKKwkvKiBTdG9wQWxsVGhyZWFkc0FuZFByb2Nlc3NlcygpICovCisJCiAJKCpscEFkZGVuZCkrKzsKIAlyZXQ9KmxwQWRkZW5kOwotCXJlbGVhc2VfaW50ZXJsb2NrZWQoKTsKKworCS8qIFJlc3VtZUFsbFRocmVhZHNBbmRQcm9jZXNzZXMoKSAqLwogCXJldHVybiByZXQ7CisjZW5kaWYJIAogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBJbnRlcmxvY2tlZERlY3JlbWVudAotICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICAgICAgICBJbnRlcmxvY2tlZERlY3JlbWVudAkJCVtLRVJORUwzMl0JKgorKgkJCQkJCQkJCSoKKyogSW50ZXJsb2NrZWRJbmNyZW1lbnQgYWRkcyAxIHRvIGEgbG9uZyB2YXJpYWJsZSBhbmQgcmV0dXJucwkJKgorKiAgLSAgYSBuZWdhdGl2ZSBudW1iZXIgaWYgdGhlIHJlc3VsdCA8IDAJCQkJKgorKiAgLSAgemVybyBpZiB0aGUgcmVzdWx0ID09IDAJCQkJCQkqCisqICAtICBhIHBvc2l0aXZlIG51bWJlciBpZiB0aGUgcmVzdWx0ID4gMAkJCQkqCisqCQkJCQkJCQkJKgorKiBUaGUgcmV0dXJuZWQgbnVtYmVyIG5lZWQgbm90IGJlIGVxdWFsIHRvIHRoZSByZXN1bHQhISEhCQkqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIExPTkcgSW50ZXJsb2NrZWREZWNyZW1lbnQoTFBMT05HIGxwQWRkZW5kKQogewotCWludCByZXQ7Ci0JZ2V0X2ludGVybG9ja2VkKCk7CisjaWYgZGVmaW5lZChfX2kzODZfXykmJmRlZmluZWQoX19HTlVDX18pCQorCUxPTkcgcmV0OworCV9fYXNtX18KKwkoCSAgCSAKKwkgICAiXHRsb2NrXG4iCS8qIGZvciBTTVAgc3lzdGVtcyAqLworCSAgICJcdGRlY2wJKCUxKVxuIgorCSAgICJcdGplCTJmXG4iCisJICAgIlx0amwJMWZcbiIKKwkgICAiXHRpbmNsCSUwXG4iCisJICAgIlx0am1wCTJmXG4iCisJICAgIjE6XHRkZWMJJTBcbiIgICAgCSAgCisJICAgIjI6XG4iCisJICAgOiI9ciIgKHJldCk6InIiIChscEFkZGVuZCksICIwIiAoMCk6ICJtZW1vcnkiICAgICAgICAgIAorCSk7CisJcmV0dXJuIHJldDsKKyNlbHNlCQorCUxPTkcgcmV0OworCS8qIFN0b3BBbGxUaHJlYWRzQW5kUHJvY2Vzc2VzKCkgKi8KKwogCSgqbHBBZGRlbmQpLS07CiAJcmV0PSpscEFkZGVuZDsKLQlyZWxlYXNlX2ludGVybG9ja2VkKCk7CisKKwkvKiBSZXN1bWVBbGxUaHJlYWRzQW5kUHJvY2Vzc2VzKCkgKi8KIAlyZXR1cm4gcmV0OworI2VuZGlmCQogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBJbnRlcmxvY2tlZEV4Y2hhbmdlCi0gKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICAgICAgICAgIEludGVybG9ja2VkRXhjaGFuZ2UJCQkJW0tFUk5FTDMyXQkqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIExPTkcgSW50ZXJsb2NrZWRFeGNoYW5nZShMUExPTkcgdGFyZ2V0LCBMT05HIHZhbHVlKQogewotCWludCByZXQ7Ci0JZ2V0X2ludGVybG9ja2VkKCk7CisjaWYgZGVmaW5lZChfX2kzODZfXykmJmRlZmluZWQoX19HTlVDX18pCQorCUxPTkcgcmV0OworCV9fYXNtX18KKwkoCSAgCSAKKworICAgICAgICAgICAiXHRsb2NrXG4iCS8qIGZvciBTTVAgc3lzdGVtcyAqLworCSAgICJcdHhjaGdsCSUwLCglMSlcbiIJICAgCSAgCisJICAgOiI9ciIgKHJldCk6InIiICh0YXJnZXQpLCAiMCIgKHZhbHVlKToibWVtb3J5IgorCSk7CisJcmV0dXJuIHJldDsKKyNlbHNlCisJTE9ORyByZXQ7CisJLyogU3RvcEFsbFRocmVhZHNBbmRQcm9jZXNzZXMoKSAqLwkKKwogCXJldD0qdGFyZ2V0OwogCSp0YXJnZXQ9dmFsdWU7Ci0JcmVsZWFzZV9pbnRlcmxvY2tlZCgpOworCisJLyogUmVzdW1lQWxsVGhyZWFkc0FuZFByb2Nlc3NlcygpICovCiAJcmV0dXJuIHJldDsKKyNlbmRpZgkKIH0KKworLyogQUFBUkdISCBzb21lIENyaXRpY2FsU2VjdGlvbiBmdW5jdGlvbnMgZ2V0IGNhbGxlZCBiZWZvcmUgd2UgCisgKiBoYXZlIGEgdGhyZWFkaWQKKyAqLworIAorI2RlZmluZSBHZXRDdXJyZW50VGhyZWFkSWQoKQkoLTEpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICAgICAgICAgIEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24JCQlbS0VSTkVMMzJdCSoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKENSSVRJQ0FMX1NFQ1RJT04gKnBjcml0aWNhbCkKK3sKKyAgIHBjcml0aWNhbC0+TG9ja0NvdW50PS0xOworICAgcGNyaXRpY2FsLT5SZWN1cnNpb25Db3VudD0wOworICAgcGNyaXRpY2FsLT5Mb2NrU2VtYXBob3JlPShIQU5ETEUzMikgc2VtZ2V0KElQQ19QUklWQVRFLDEsSVBDX0NSRUFUKTsKKyAgIHBjcml0aWNhbC0+T3duaW5nVGhyZWFkPShIQU5ETEUzMikgLTE7CisgICBwY3JpdGljYWwtPlJlc2VydmVkPTA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICAgICAgICAgIERlbGV0ZUNyaXRpY2FsU2VjdGlvbgkJCVtLRVJORUwzMl0JKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIERlbGV0ZUNyaXRpY2FsU2VjdGlvbihDUklUSUNBTF9TRUNUSU9OICpwY3JpdGljYWwpCit7CisgICBzZW1jdGwoKGludCkgcGNyaXRpY2FsLT5Mb2NrU2VtYXBob3JlLDAsSVBDX1JNSUQsTlVMTCk7CisgICBwY3JpdGljYWwtPlJlc2VydmVkPS0xOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICAgICAgICBFbnRlckNyaXRpY2FsU2VjdGlvbgkJCVtLRVJORUwzMl0JKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEVudGVyQ3JpdGljYWxTZWN0aW9uIChDUklUSUNBTF9TRUNUSU9OICpwY3JpdGljYWwpCit7CisgICBpZiggSW50ZXJsb2NrZWRJbmNyZW1lbnQoJihwY3JpdGljYWwtPkxvY2tDb3VudCkpKQorICAgeyAgIAorICAgICAgaWYoIHBjcml0aWNhbC0+T3duaW5nVGhyZWFkIT0gKEhBTkRMRTMyKSBHZXRDdXJyZW50VGhyZWFkSWQoKSApCisgICAgICB7ICAgICAgICAgICAgICAgICAKKyAgICAgICAgIHN0cnVjdCBzZW1idWYgc29wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICBzb3Auc2VtX251bT0wOworICAgICAgICAgc29wLnNlbV9vcD0wOworICAgICAgICAgc29wLnNlbV9mbGc9MDsgICAgICAgICAgICAKKyAgICAgICAgIHNlbW9wKChpbnQpIHBjcml0aWNhbC0+TG9ja1NlbWFwaG9yZSwmc29wLDApOworICAgICAgICAgICAgCisgICAgICAgICBwY3JpdGljYWwtPk93bmluZ1RocmVhZCA9IChIQU5ETEUzMikgR2V0Q3VycmVudFRocmVhZElkKCk7ICAgICAgICAgICAgICAgIAorICAgICAgfQorICAgfQorICAgZWxzZQorICAgeyAgICAgIAorICAgICAgcGNyaXRpY2FsLT5Pd25pbmdUaHJlYWQgPShIQU5ETEUzMikgR2V0Q3VycmVudFRocmVhZElkKCk7CisgICB9CisgICBwY3JpdGljYWwtPlJlY3Vyc2lvbkNvdW50Kys7ICAgICAgICAgICAgIAorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICAgICAgICBUcnlFbnRlckNyaXRpY2FsU2VjdGlvbgkJCVtLRVJORUwzMl0JKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitCT09MMzIgVHJ5RW50ZXJDcml0aWNhbFNlY3Rpb24gKENSSVRJQ0FMX1NFQ1RJT04gKnBjcml0aWNhbCkKK3sKKyAgIGlmKCBJbnRlcmxvY2tlZEluY3JlbWVudCgmKHBjcml0aWNhbC0+TG9ja0NvdW50KSkpCisgICB7CisgICAgICBpZiggcGNyaXRpY2FsLT5Pd25pbmdUaHJlYWQhPSAoSEFORExFMzIpIEdldEN1cnJlbnRUaHJlYWRJZCgpICkKKyAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgIH0KKyAgIGVsc2UKKyAgIHsgICAgICAKKyAgICAgIHBjcml0aWNhbC0+T3duaW5nVGhyZWFkID0oSEFORExFMzIpIEdldEN1cnJlbnRUaHJlYWRJZCgpOworICAgfQorICAgcGNyaXRpY2FsLT5SZWN1cnNpb25Db3VudCsrOyAgICAgICAgICAgICAKKyAgIAorICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICAgICAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uCQkJW0tFUk5FTDMyXQkqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTGVhdmVDcml0aWNhbFNlY3Rpb24gKENSSVRJQ0FMX1NFQ1RJT04gKnBjcml0aWNhbCkKK3sKKyAgIC8qIGRvIHdlIGFjdHVhbGx5IG93biB0aGlzIGNyaXRpY2FsIHNlY3Rpb24gPz8/ICovCisgICBpZiggcGNyaXRpY2FsLT5Pd25pbmdUaHJlYWQhPSAoSEFORExFMzIpIEdldEN1cnJlbnRUaHJlYWRJZCgpKQorICAgICAgcmV0dXJuOworICAgICAgIAorICAgcGNyaXRpY2FsLT5SZWN1cnNpb25Db3VudC0tOworICAgaWYoIHBjcml0aWNhbC0+UmVjdXJzaW9uQ291bnQ9PTApCisgICB7CisgICAgICBwY3JpdGljYWwtPk93bmluZ1RocmVhZD0oSEFORExFMzIpLTE7CisgICAgICBpZihJbnRlcmxvY2tlZERlY3JlbWVudCgmKHBjcml0aWNhbC0+TG9ja0NvdW50KSk+PTApCisgICAgICB7ICAgICAgICAgCisgICAgICAgICBzdHJ1Y3Qgc2VtYnVmIHNvcDsKKyAgICAgICAgIAorICAgICAgICAgc29wLnNlbV9udW09MDsKKyAgICAgICAgIHNvcC5zZW1fb3A9MTsKKyAgICAgICAgIHNvcC5zZW1fZmxnPTA7CisgICAgICAgICBzZW1vcCgoaW50KSBwY3JpdGljYWwtPkxvY2tTZW1hcGhvcmUsJnNvcCwwKTsKKyAgICAgIH0KKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgICBJbnRlcmxvY2tlZERlY3JlbWVudCgmKHBjcml0aWNhbC0+TG9ja0NvdW50KSk7CisgICB9ICAKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgICAgICAgICAgUmVpbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uCQkJW0tFUk5FTDMyXQkqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgUmVpbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKENSSVRJQ0FMX1NFQ1RJT04gKmxwQ3JpdCkKK3sKKyAgIC8qIGhtbSA/Pz8/Pz8gKi8JCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICAgICAgICAgIE1ha2VDcml0aWNhbFNlY3Rpb25HbG9iYWwJCQlbS0VSTkVMMzJdCSoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBNYWtlQ3JpdGljYWxTZWN0aW9uR2xvYmFsKENSSVRJQ0FMX1NFQ1RJT04gKmxwQ3JpdCkKK3sKKyAgIC8qIG5vdGhpbmcgKFN5c1YgU2VtYXBob3JlcyBhcmUgYWxyZWFkeSBnbG9iYWwpICovCisgICByZXR1cm47CQorfQorCmRpZmYgLS1naXQgYS93aW4zMi91c2VyMzIuYyBiL3dpbjMyL3VzZXIzMi5jCmluZGV4IGI3ZGZmOWMuLjVhMTE5MmEgMTAwNjQ0Ci0tLSBhL3dpbjMyL3VzZXIzMi5jCisrKyBiL3dpbjMyL3VzZXIzMi5jCkBAIC0yMCwxNyArMjAsMzMgQEAKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgIEdldE1lc3NhZ2VBICAgICAgICAgIChVU0VSMzIuMjY5KQorICogICAgICAgICAgR2V0TWVzc2FnZTMyQSAgIChVU0VSMzIuMjY5KQogICovCi1CT09MIFVTRVIzMl9HZXRNZXNzYWdlQShNU0czMiogbHBtc2csSFdORDMyIGh3bmQsRFdPUkQgbWluLERXT1JEIG1heCkKK0JPT0wzMiBHZXRNZXNzYWdlMzJBKE1TRzMyKiBscG1zZyxIV05EMzIgaHduZCxVSU5UMzIgbWluLFVJTlQzMiBtYXgpCiB7Ci0JQk9PTCByZXQ7Ci0JTVNHMTYgKm1zZyA9IFNFR1BUUl9ORVcoTVNHMTYpOwotICAgICAgICBpZiAoIW1zZykgcmV0dXJuIDA7Ci0gICAgICAgIHJldD1HZXRNZXNzYWdlKFNFR1BUUl9HRVQobXNnKSwoSFdORDE2KWh3bmQsbWluLG1heCk7Ci0JU1RSVUNUMzJfTVNHMTZ0bzMyKG1zZyxscG1zZyk7Ci0gICAgICAgIFNFR1BUUl9GUkVFKG1zZyk7Ci0JcmV0dXJuIHJldDsKKyAgICBCT09MMzIgcmV0OworICAgIE1TRzE2ICptc2cgPSBTRUdQVFJfTkVXKE1TRzE2KTsKKyAgICBpZiAoIW1zZykgcmV0dXJuIDA7CisgICAgcmV0PUdldE1lc3NhZ2UxNihTRUdQVFJfR0VUKG1zZyksKEhXTkQxNilod25kLG1pbixtYXgpOworICAgIC8qIEZJWE1FICovCisgICAgU1RSVUNUMzJfTVNHMTZ0bzMyKG1zZyxscG1zZyk7CisgICAgU0VHUFRSX0ZSRUUobXNnKTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgIEdldE1lc3NhZ2UzMlcgICAoVVNFUjMyLjI3MykKKyAqLworQk9PTDMyIEdldE1lc3NhZ2UzMlcoTVNHMzIqIGxwbXNnLEhXTkQzMiBod25kLFVJTlQzMiBtaW4sVUlOVDMyIG1heCkKK3sKKyAgICBCT09MMzIgcmV0OworICAgIE1TRzE2ICptc2cgPSBTRUdQVFJfTkVXKE1TRzE2KTsKKyAgICBpZiAoIW1zZykgcmV0dXJuIDA7CisgICAgcmV0PUdldE1lc3NhZ2UxNihTRUdQVFJfR0VUKG1zZyksKEhXTkQxNilod25kLG1pbixtYXgpOworICAgIC8qIEZJWE1FICovCisgICAgU1RSVUNUMzJfTVNHMTZ0bzMyKG1zZyxscG1zZyk7CisgICAgU0VHUFRSX0ZSRUUobXNnKTsKKyAgICByZXR1cm4gcmV0OwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTQwLDcgKzU2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIG1pbixVSU5UMzIgbWF4LFVJTlQzMiB3UmVtb3ZlTXNnKQogewogCU1TRzE2IG1zZzsKLQlCT09MIHJldDsKKwlCT09MMzIgcmV0OwogCXJldD1QZWVrTWVzc2FnZTE2KCZtc2csaHduZCxtaW4sbWF4LHdSZW1vdmVNc2cpOwogICAgICAgICAvKiBGSVhNRTogc2hvdWxkIHRyYW5zbGF0ZSB0aGUgbWVzc2FnZSB0byBXaW4zMiAqLwogCVNUUlVDVDMyX01TRzE2dG8zMigmbXNnLGxwbXNnKTsKZGlmZiAtLWdpdCBhL3dpbmRvd3MvY2FyZXQuYyBiL3dpbmRvd3MvY2FyZXQuYwppbmRleCAwZmRjNmVmLi4wMGRlN2ZmIDEwMDY0NAotLS0gYS93aW5kb3dzL2NhcmV0LmMKKysrIGIvd2luZG93cy9jYXJldC5jCkBAIC0xMjMsMTYgKzEyMywyNSBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENyZWF0ZUNhcmV0ICAgKFVTRVIuMTYzKSAoVVNFUjMyLjY1KQorICogICAgICAgICAgIENyZWF0ZUNhcmV0MTYgICAoVVNFUi4xNjMpCiAgKi8KLUJPT0wxNiBDcmVhdGVDYXJldCggSFdORDMyIGh3bmQsIEhCSVRNQVAzMiBiaXRtYXAsIElOVDMyIHdpZHRoLCBJTlQzMiBoZWlnaHQgKQordm9pZCBDcmVhdGVDYXJldDE2KCBIV05EMTYgaHduZCwgSEJJVE1BUDE2IGJpdG1hcCwgSU5UMTYgd2lkdGgsIElOVDE2IGhlaWdodCApCit7CisgICAgQ3JlYXRlQ2FyZXQzMiggaHduZCwgYml0bWFwLCB3aWR0aCwgaGVpZ2h0ICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENyZWF0ZUNhcmV0MzIgICAoVVNFUjMyLjY1KQorICovCitCT09MMzIgQ3JlYXRlQ2FyZXQzMiggSFdORDMyIGh3bmQsIEhCSVRNQVAzMiBiaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgSU5UMzIgd2lkdGgsIElOVDMyIGhlaWdodCApCiB7CiAgICAgZHByaW50Zl9jYXJldChzdGRkZWIsIkNyZWF0ZUNhcmV0OiBod25kPSUwNHhcbiIsIGh3bmQpOwogCiAgICAgaWYgKCFod25kKSByZXR1cm4gRkFMU0U7CiAKICAgICAvKiBpZiBjdXJzb3IgYWxyZWFkeSBleGlzdHMsIGRlc3Ryb3kgaXQgKi8KLSAgICBpZiAoQ2FyZXQuaHduZCkgRGVzdHJveUNhcmV0KCk7CisgICAgaWYgKENhcmV0Lmh3bmQpIERlc3Ryb3lDYXJldDMyKCk7CiAKICAgICBpZiAoYml0bWFwICYmIChiaXRtYXAgIT0gMSkpCiAgICAgewpAQCAtMTY0LDkgKzE3MywxOCBAQAogICAgCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIERlc3Ryb3lDYXJldCAgIChVU0VSLjE2NCkgKFVTRVIzMi4xMzApCisgKiAgICAgICAgICAgRGVzdHJveUNhcmV0MTYgICAoVVNFUi4xNjQpCiAgKi8KLUJPT0wxNiBEZXN0cm95Q2FyZXQodm9pZCkKK3ZvaWQgRGVzdHJveUNhcmV0MTYodm9pZCkKK3sKKyAgICBEZXN0cm95Q2FyZXQzMigpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIERlc3Ryb3lDYXJldDMyICAgKFVTRVIzMi4xMzApCisgKi8KK0JPT0wzMiBEZXN0cm95Q2FyZXQzMih2b2lkKQogewogICAgIGlmICghQ2FyZXQuaHduZCkgcmV0dXJuIEZBTFNFOwogCkBAIC0xODIsOSArMjAwLDE4IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgU2V0Q2FyZXRQb3MgICAoVVNFUi4xNjUpIChVU0VSMzIuNDY1KQorICogICAgICAgICAgIFNldENhcmV0UG9zMTYgICAoVVNFUi4xNjUpCiAgKi8KLUJPT0wxNiBTZXRDYXJldFBvcyggSU5UMzIgeCwgSU5UMzIgeSkKK3ZvaWQgU2V0Q2FyZXRQb3MxNiggSU5UMTYgeCwgSU5UMTYgeSApCit7CisgICAgU2V0Q2FyZXRQb3MzMiggeCwgeSApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFNldENhcmV0UG9zMzIgICAoVVNFUjMyLjQ2NSkKKyAqLworQk9PTDMyIFNldENhcmV0UG9zMzIoIElOVDMyIHgsIElOVDMyIHkpCiB7CiAgICAgaWYgKCFDYXJldC5od25kKSByZXR1cm4gRkFMU0U7CiAgICAgaWYgKCh4ID09IENhcmV0LngpICYmICh5ID09IENhcmV0LnkpKSByZXR1cm4gVFJVRTsKQEAgLTIwNyw5ICsyMzQsOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgSGlkZUNhcmV0MTYgICAoVVNFUi4xNjYpCiAgKi8KLUJPT0wxNiBIaWRlQ2FyZXQxNiggSFdORDE2IGh3bmQgKQordm9pZCBIaWRlQ2FyZXQxNiggSFdORDE2IGh3bmQgKQogewotICAgIHJldHVybiBIaWRlQ2FyZXQzMiggaHduZCApOworICAgIEhpZGVDYXJldDMyKCBod25kICk7CiB9CiAKIApAQCAtMjM0LDkgKzI2MSw5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBTaG93Q2FyZXQxNiAgIChVU0VSLjE2NykKICAqLwotQk9PTDE2IFNob3dDYXJldDE2KCBIV05EMTYgaHduZCApCit2b2lkIFNob3dDYXJldDE2KCBIV05EMTYgaHduZCApCiB7Ci0gICAgcmV0dXJuIFNob3dDYXJldDMyKCBod25kICk7CisgICAgU2hvd0NhcmV0MzIoIGh3bmQgKTsKIH0KIAogCkBAIC0yNjUsOSArMjkyLDE3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgU2V0Q2FyZXRCbGlua1RpbWUgICAoVVNFUi4xNjgpIChVU0VSMzIuNDY0KQorICogICAgICAgICAgIFNldENhcmV0QmxpbmtUaW1lMTYgICAoVVNFUi4xNjgpCiAgKi8KLUJPT0wxNiBTZXRDYXJldEJsaW5rVGltZSggVUlOVDMyIG1zZWNzICkKK3ZvaWQgU2V0Q2FyZXRCbGlua1RpbWUxNiggVUlOVDE2IG1zZWNzICkKK3sKKyAgICBTZXRDYXJldEJsaW5rVGltZTMyKCBtc2VjcyApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBTZXRDYXJldEJsaW5rVGltZTMyICAgKFVTRVIzMi40NjQpCisgKi8KK0JPT0wzMiBTZXRDYXJldEJsaW5rVGltZTMyKCBVSU5UMzIgbXNlY3MgKQogewogICAgIGlmICghQ2FyZXQuaHduZCkgcmV0dXJuIEZBTFNFOwogCmRpZmYgLS1naXQgYS93aW5kb3dzL2NsYXNzLmMgYi93aW5kb3dzL2NsYXNzLmMKaW5kZXggZDA0ZTcwNy4uZmEwZDQ3MCAxMDA2NDQKLS0tIGEvd2luZG93cy9jbGFzcy5jCisrKyBiL3dpbmRvd3MvY2xhc3MuYwpAQCAtMiw2ICsyLDEwIEBACiAgKiBXaW5kb3cgY2xhc3NlcyBmdW5jdGlvbnMKICAqCiAgKiBDb3B5cmlnaHQgMTk5MywgMTk5NiBBbGV4YW5kcmUgSnVsbGlhcmQKKyAqCisgKiBGSVhNRTogSW4gd2luMzIgYWxsIGNsYXNzZXMgYXJlIGxvY2FsLiBUaGV5IGFyZSByZWdpc3RlcmVkIGF0IAorICoJICBwcm9ncmFtIHN0YXJ0LiBQcm9jZXNzZXMgQ0FOTk9UIHNoYXJlIGNsYXNzZXMuIChTb3VyY2U6IHNvbWUKKyAqCSAgd2luMzEtPk5UIG1pZ3JhdGlvbiBib29rKQogICovCiAKICNpbmNsdWRlIDxzdGRsaWIuaD4KQEAgLTE1Niw3ICsxNjAsNyBAQAogICoKICAqIEZyZWUgYSBjbGFzcyBzdHJ1Y3R1cmUuCiAgKi8KLXN0YXRpYyBCT09MIENMQVNTX0ZyZWVDbGFzcyggQ0xBU1MgKmNsYXNzUHRyICkKK3N0YXRpYyBCT09MMzIgQ0xBU1NfRnJlZUNsYXNzKCBDTEFTUyAqY2xhc3NQdHIgKQogewogICAgIENMQVNTICoqcHBDbGFzczsKIApAQCAtNTU2LDkgKzU2MCwxOCBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEdldENsYXNzV29yZCAgICAoVVNFUi4xMjkpIChVU0VSMzIuMjE4KQorICogICAgICAgICAgIEdldENsYXNzV29yZDE2ICAgIChVU0VSLjEyOSkKICAqLwotV09SRCBHZXRDbGFzc1dvcmQoIEhXTkQzMiBod25kLCBJTlQzMiBvZmZzZXQgKQorV09SRCBHZXRDbGFzc1dvcmQxNiggSFdORDE2IGh3bmQsIElOVDE2IG9mZnNldCApCit7CisgICAgcmV0dXJuIEdldENsYXNzV29yZDMyKCBod25kLCBvZmZzZXQgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHZXRDbGFzc1dvcmQzMiAgICAoVVNFUjMyLjIxOCkKKyAqLworV09SRCBHZXRDbGFzc1dvcmQzMiggSFdORDMyIGh3bmQsIElOVDMyIG9mZnNldCApCiB7CiAgICAgV05EICogd25kUHRyOwogICAgIApAQCAtNjM1LDcgKzY0OCw3IEBACiAgICAgICAgIGNhc2UgR0NMX0hDVVJTT1I6CiAgICAgICAgIGNhc2UgR0NMX0hJQ09OOgogICAgICAgICBjYXNlIEdDTF9ISUNPTlNNOgotICAgICAgICAgICAgcmV0dXJuIEdldENsYXNzV29yZCggaHduZCwgb2Zmc2V0ICk7CisgICAgICAgICAgICByZXR1cm4gR2V0Q2xhc3NXb3JkMzIoIGh3bmQsIG9mZnNldCApOwogICAgIH0KICAgICBmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IGludmFsaWQgb2Zmc2V0ICVkIGZvciBHZXRDbGFzc0xvbmcoKVxuIiwgb2Zmc2V0KTsKICAgICByZXR1cm4gMDsKQEAgLTY2NCw5ICs2NzcsMTggQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBTZXRDbGFzc1dvcmQgICAgKFVTRVIuMTMwKSAoVVNFUjMyLjQ2OCkKKyAqICAgICAgICAgICBTZXRDbGFzc1dvcmQxNiAgICAoVVNFUi4xMzApCiAgKi8KLVdPUkQgU2V0Q2xhc3NXb3JkKCBIV05EMzIgaHduZCwgSU5UMzIgb2Zmc2V0LCBXT1JEIG5ld3ZhbCApCitXT1JEIFNldENsYXNzV29yZDE2KCBIV05EMTYgaHduZCwgSU5UMTYgb2Zmc2V0LCBXT1JEIG5ld3ZhbCApCit7CisgICAgcmV0dXJuIFNldENsYXNzV29yZDMyKCBod25kLCBvZmZzZXQsIG5ld3ZhbCApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFNldENsYXNzV29yZDMyICAgIChVU0VSMzIuNDY4KQorICovCitXT1JEIFNldENsYXNzV29yZDMyKCBIV05EMzIgaHduZCwgSU5UMzIgb2Zmc2V0LCBXT1JEIG5ld3ZhbCApCiB7CiAgICAgV05EICogd25kUHRyOwogICAgIFdPUkQgcmV0dmFsID0gMDsKQEAgLTc2Nyw3ICs3ODksNyBAQAogICAgICAgICBjYXNlIEdDTF9IQ1VSU09SOgogICAgICAgICBjYXNlIEdDTF9ISUNPTjoKICAgICAgICAgY2FzZSBHQ0xfSElDT05TTToKLSAgICAgICAgICAgIHJldHVybiBTZXRDbGFzc1dvcmQoIGh3bmQsIG9mZnNldCwgKFdPUkQpbmV3dmFsICk7CisgICAgICAgICAgICByZXR1cm4gU2V0Q2xhc3NXb3JkMzIoIGh3bmQsIG9mZnNldCwgKFdPUkQpbmV3dmFsICk7CiAgICAgICAgIGNhc2UgR0NMX1NUWUxFOiAgICAgIHB0ciA9ICZ3bmRQdHItPmNsYXNzLT5zdHlsZTsgYnJlYWs7CiAgICAgICAgIGNhc2UgR0NMX0NCV05ERVhUUkE6IHB0ciA9ICZ3bmRQdHItPmNsYXNzLT5jYlduZEV4dHJhOyBicmVhazsKICAgICAgICAgY2FzZSBHQ0xfQ0JDTFNFWFRSQTogcHRyID0gJnduZFB0ci0+Y2xhc3MtPmNiQ2xzRXh0cmE7IGJyZWFrOwpAQCAtODgxLDcgKzkwMyw5IEBACiAgICAgaEluc3RhbmNlID0gR2V0RXhlUHRyKCBoSW5zdGFuY2UgKTsgIC8qIEZJWE1FOiBub3QgbmVlZGVkIGluIFdpbjMyICovCiAgICAgaWYgKCEoYXRvbSA9IEdsb2JhbEZpbmRBdG9tMzJBKCBuYW1lICkpIHx8CiAgICAgICAgICEoY2xhc3NQdHIgPSBDTEFTU19GaW5kQ2xhc3NCeUF0b20oIGF0b20sIGhJbnN0YW5jZSApKSB8fAotICAgICAgICAoaEluc3RhbmNlICE9IGNsYXNzUHRyLT5oSW5zdGFuY2UpKSByZXR1cm4gRkFMU0U7CisJKGNsYXNzUHRyLT5oSW5zdGFuY2UgJiYgKGhJbnN0YW5jZSAhPSBjbGFzc1B0ci0+aEluc3RhbmNlKSkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKwogICAgIHdjLT5zdHlsZSAgICAgICAgID0gY2xhc3NQdHItPnN0eWxlOwogICAgIHdjLT5scGZuV25kUHJvYyAgID0gKFdORFBST0MzMilXSU5QUk9DX0dldFByb2MoIGNsYXNzUHRyLT53aW5wcm9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTl9QUk9DXzMyQSApOwpAQCAtOTA4LDcgKzkzMiw5IEBACiAgICAgaEluc3RhbmNlID0gR2V0RXhlUHRyKCBoSW5zdGFuY2UgKTsgIC8qIEZJWE1FOiBub3QgbmVlZGVkIGluIFdpbjMyICovCiAgICAgaWYgKCEoYXRvbSA9IEdsb2JhbEZpbmRBdG9tMzJXKCBuYW1lICkpIHx8CiAgICAgICAgICEoY2xhc3NQdHIgPSBDTEFTU19GaW5kQ2xhc3NCeUF0b20oIGF0b20sIGhJbnN0YW5jZSApKSB8fAotICAgICAgICAoaEluc3RhbmNlICE9IGNsYXNzUHRyLT5oSW5zdGFuY2UpKSByZXR1cm4gRkFMU0U7CisJKGNsYXNzUHRyLT5oSW5zdGFuY2UgJiYgKGhJbnN0YW5jZSAhPSBjbGFzc1B0ci0+aEluc3RhbmNlKSkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKwogICAgIHdjLT5zdHlsZSAgICAgICAgID0gY2xhc3NQdHItPnN0eWxlOwogICAgIHdjLT5scGZuV25kUHJvYyAgID0gKFdORFBST0MzMilXSU5QUk9DX0dldFByb2MoIGNsYXNzUHRyLT53aW5wcm9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTl9QUk9DXzMyVyApOwpkaWZmIC0tZ2l0IGEvd2luZG93cy9kY2UuYyBiL3dpbmRvd3MvZGNlLmMKaW5kZXggMDhjMDllMS4uY2M5MmU1YyAxMDA2NDQKLS0tIGEvd2luZG93cy9kY2UuYworKysgYi93aW5kb3dzL2RjZS5jCkBAIC0xODgsNyArMTg4LDcgQEAKICAqIHdpbmRvdyBhcmVhIGNsaXBwZWQgYnkgdGhlIGNsaWVudCBhcmVhIG9mIGFsbCBhbmNlc3RvcnMuCiAgKiBSZXR1cm4gRkFMU0UgaWYgdGhlIHZpc2libGUgcmVnaW9uIGlzIGVtcHR5LgogICovCi1zdGF0aWMgQk9PTCBEQ0VfR2V0VmlzUmVjdCggV05EICp3bmRQdHIsIEJPT0wgY2xpZW50QXJlYSwgUkVDVDE2ICpscHJlY3QgKQorc3RhdGljIEJPT0wzMiBEQ0VfR2V0VmlzUmVjdCggV05EICp3bmRQdHIsIEJPT0wzMiBjbGllbnRBcmVhLCBSRUNUMTYgKmxwcmVjdCApCiB7CiAgICAgaW50IHhvZmZzZXQsIHlvZmZzZXQ7CiAKQEAgLTI1MCwxMCArMjUwLDEwIEBACiAgICAgZm9yICg7IHBXbmRTdGFydCAhPSBwV25kRW5kOyBwV25kU3RhcnQgPSBwV25kU3RhcnQtPm5leHQpCiAgICAgewogICAgICAgICBpZiAoIShwV25kU3RhcnQtPmR3U3R5bGUgJiBXU19WSVNJQkxFKSkgY29udGludWU7Ci0gICAgICAgIFNldFJlY3RSZ24oIGhyZ25OZXcsIHBXbmRTdGFydC0+cmVjdFdpbmRvdy5sZWZ0ICsgeG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgcFduZFN0YXJ0LT5yZWN0V2luZG93LnRvcCArIHlvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIHBXbmRTdGFydC0+cmVjdFdpbmRvdy5yaWdodCArIHhvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIHBXbmRTdGFydC0+cmVjdFdpbmRvdy5ib3R0b20gKyB5b2Zmc2V0ICk7CisgICAgICAgIFNldFJlY3RSZ24zMiggaHJnbk5ldywgcFduZFN0YXJ0LT5yZWN0V2luZG93LmxlZnQgKyB4b2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgIHBXbmRTdGFydC0+cmVjdFdpbmRvdy50b3AgKyB5b2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgIHBXbmRTdGFydC0+cmVjdFdpbmRvdy5yaWdodCArIHhvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgcFduZFN0YXJ0LT5yZWN0V2luZG93LmJvdHRvbSArIHlvZmZzZXQgKTsKICAgICAgICAgaWYgKCFDb21iaW5lUmduMzIoIGhyZ24sIGhyZ24sIGhyZ25OZXcsIFJHTl9ESUZGICkpIGJyZWFrOwogICAgIH0KICAgICBEZWxldGVPYmplY3QzMiggaHJnbk5ldyApOwpAQCAtNDM2LDcgKzQzNiw3IEBACiAgICAgREMgKiAJZGM7CiAgICAgV05EICogCXduZFB0cjsKICAgICBEV09SRCAJZGN4X2ZsYWdzID0gMDsKLSAgICBCT09MCW5lZWRfdXBkYXRlID0gVFJVRTsKKyAgICBCT09MMzIJbmVlZF91cGRhdGUgPSBUUlVFOwogCiAgICAgZHByaW50Zl9kYyhzdGRkZWIsIkdldERDRXg6IGh3bmQgJTA0eCwgaHJnbkNsaXAgJTA0eCwgZmxhZ3MgJTA4eFxuIiwgaHduZCwgaHJnbkNsaXAsICh1bnNpZ25lZClmbGFncyk7CiAgICAgCkBAIC03MDUsNyArNzA1LDcgQEAKIAogICAgICAgICAgICAgICAgICAgICBpZiggKCFkY2UtPmhDbGlwUmduICYmIGRjZS0+RENYZmxhZ3MgJiBEQ1hfSU5URVJTRUNUUkdOKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgIChkY2UtPmhDbGlwUmduID09IDEgJiYgZGNlLT5EQ1hmbGFncyAmIERDWF9FWENMVURFUkdOKSApICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgU2V0UmVjdFJnbihoVmlzUmduLDAsMCwwLDApOworICAgICAgICAgICAgICAgICAgICAgICAgIFNldFJlY3RSZ24zMihoVmlzUmduLDAsMCwwLDApOwogICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tYmluZVJnbjMyKGhWaXNSZ24sIGhWaXNSZ24sIGRjZS0+aENsaXBSZ24sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGNlLT5EQ1hmbGFncyAmIERDWF9FWENMVURFUkdOKT8gUkdOX0RJRkY6UkdOX0FORCk7CmRpZmYgLS1naXQgYS93aW5kb3dzL2RlZmRsZy5jIGIvd2luZG93cy9kZWZkbGcuYwppbmRleCBkNWQyZjMzLi42MThlM2RmIDEwMDY0NAotLS0gYS93aW5kb3dzL2RlZmRsZy5jCisrKyBiL3dpbmRvd3MvZGVmZGxnLmMKQEAgLTUyLDcgKzUyLDcgQEAKIHN0YXRpYyBCT09MMzIgREVGRExHX1Jlc3RvcmVGb2N1cyggSFdORDMyIGh3bmQsIERJQUxPR0lORk8gKmluZm9QdHIgKQogewogICAgIGlmICghaW5mb1B0ci0+aHduZEZvY3VzIHx8IElzSWNvbmljMzIoaHduZCkpIHJldHVybiBGQUxTRTsKLSAgICBpZiAoIUlzV2luZG93KCBpbmZvUHRyLT5od25kRm9jdXMgKSkgcmV0dXJuIEZBTFNFOworICAgIGlmICghSXNXaW5kb3czMiggaW5mb1B0ci0+aHduZEZvY3VzICkpIHJldHVybiBGQUxTRTsKICAgICBERUZETEdfU2V0Rm9jdXMoIGh3bmQsIGluZm9QdHItPmh3bmRGb2N1cyApOwogICAgIGluZm9QdHItPmh3bmRGb2N1cyA9IDA7CiAgICAgcmV0dXJuIFRSVUU7CkBAIC0yMzgsNyArMjM4LDcgQEAKIAogICAgIC8qIENoZWNrIGlmIHdpbmRvdyB3YXMgZGVzdHJveWVkIGJ5IGRpYWxvZyBwcm9jZWR1cmUgKi8KIAotICAgIGlmKCAhcmVzdWx0ICYmIElzV2luZG93KGh3bmQpKQorICAgIGlmICghcmVzdWx0ICYmIElzV2luZG93MzIoaHduZCkpCiAgICAgewogICAgICAgICAvKiBjYWxsYmFjayBkaWRuJ3QgcHJvY2VzcyB0aGlzIG1lc3NhZ2UgKi8KIApAQCAtMjg5LDcgKzI4OSw3IEBACiAKICAgICAvKiBDaGVjayBpZiB3aW5kb3cgd2FzIGRlc3Ryb3llZCBieSBkaWFsb2cgcHJvY2VkdXJlICovCiAKLSAgICBpZiggIXJlc3VsdCAmJiBJc1dpbmRvdyhod25kKSkKKyAgICBpZiAoIXJlc3VsdCAmJiBJc1dpbmRvdzMyKGh3bmQpKQogICAgIHsKICAgICAgICAgLyogY2FsbGJhY2sgZGlkbid0IHByb2Nlc3MgdGhpcyBtZXNzYWdlICovCiAKQEAgLTM0MCw3ICszNDAsNyBAQAogCiAgICAgLyogQ2hlY2sgaWYgd2luZG93IHdhcyBkZXN0cm95ZWQgYnkgZGlhbG9nIHByb2NlZHVyZSAqLwogCi0gICAgaWYoICFyZXN1bHQgJiYgSXNXaW5kb3coaHduZCkpCisgICAgaWYgKCFyZXN1bHQgJiYgSXNXaW5kb3czMihod25kKSkKICAgICB7CiAgICAgICAgIC8qIGNhbGxiYWNrIGRpZG4ndCBwcm9jZXNzIHRoaXMgbWVzc2FnZSAqLwogCmRpZmYgLS1naXQgYS93aW5kb3dzL2RlZnduZC5jIGIvd2luZG93cy9kZWZ3bmQuYwppbmRleCA1NTgxYmY3Li5mZWMxN2JlIDEwMDY0NAotLS0gYS93aW5kb3dzL2RlZnduZC5jCisrKyBiL3dpbmRvd3MvZGVmd25kLmMKQEAgLTIxNSwxMyArMjE1LDEzIEBACiAgICAgY2FzZSBXTV9DVExDT0xPUkJUTjoKICAgICBjYXNlIFdNX0NUTENPTE9SRExHOgogICAgIGNhc2UgV01fQ1RMQ09MT1JTVEFUSUM6Ci0gICAgICAgIFNldEJrQ29sb3IoIChIREMzMil3UGFyYW0sIEdldFN5c0NvbG9yMzIoQ09MT1JfV0lORE9XKSApOwotICAgICAgICBTZXRUZXh0Q29sb3IoIChIREMzMil3UGFyYW0sIEdldFN5c0NvbG9yMzIoQ09MT1JfV0lORE9XVEVYVCkgKTsKKyAgICAgICAgU2V0QmtDb2xvcjMyKCAoSERDMzIpd1BhcmFtLCBHZXRTeXNDb2xvcjMyKENPTE9SX1dJTkRPVykgKTsKKyAgICAgICAgU2V0VGV4dENvbG9yMzIoIChIREMzMil3UGFyYW0sIEdldFN5c0NvbG9yMzIoQ09MT1JfV0lORE9XVEVYVCkgKTsKICAgICAgICAgcmV0dXJuIChMUkVTVUxUKXN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hXaW5kb3c7CiAKICAgICBjYXNlIFdNX0NUTENPTE9SU0NST0xMQkFSOgotICAgICAgICBTZXRCa0NvbG9yKCAoSERDMzIpd1BhcmFtLCBSR0IoMjU1LCAyNTUsIDI1NSkgKTsKLSAgICAgICAgU2V0VGV4dENvbG9yKCAoSERDMzIpd1BhcmFtLCBSR0IoMCwgMCwgMCkgKTsKKyAgICAgICAgU2V0QmtDb2xvcjMyKCAoSERDMzIpd1BhcmFtLCBSR0IoMjU1LCAyNTUsIDI1NSkgKTsKKyAgICAgICAgU2V0VGV4dENvbG9yMzIoIChIREMzMil3UGFyYW0sIFJHQigwLCAwLCAwKSApOwogICAgICAgICBVbnJlYWxpemVPYmplY3QzMiggc3lzQ29sb3JPYmplY3RzLmhicnVzaFNjcm9sbGJhciApOwogICAgICAgICByZXR1cm4gKExSRVNVTFQpc3lzQ29sb3JPYmplY3RzLmhicnVzaFNjcm9sbGJhcjsKIApAQCAtMjI5LDE1ICsyMjksMTUgQEAKIAl7CiAJICAgIGlmIChISVdPUkQobFBhcmFtKSA9PSBDVExDT0xPUl9TQ1JPTExCQVIpCiAJICAgIHsKLQkJU2V0QmtDb2xvciggKEhEQzMyKXdQYXJhbSwgUkdCKDI1NSwgMjU1LCAyNTUpICk7Ci0JCVNldFRleHRDb2xvciggKEhEQzMyKXdQYXJhbSwgUkdCKDAsIDAsIDApICk7CisJCVNldEJrQ29sb3IzMiggKEhEQzMyKXdQYXJhbSwgUkdCKDI1NSwgMjU1LCAyNTUpICk7CisJCVNldFRleHRDb2xvcjMyKCAoSERDMzIpd1BhcmFtLCBSR0IoMCwgMCwgMCkgKTsKIAkJVW5yZWFsaXplT2JqZWN0MzIoIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hTY3JvbGxiYXIgKTsKIAkJcmV0dXJuIChMUkVTVUxUKXN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hTY3JvbGxiYXI7CiAJICAgIH0KIAkgICAgZWxzZQogCSAgICB7Ci0JCVNldEJrQ29sb3IoIChIREMzMil3UGFyYW0sIEdldFN5c0NvbG9yMzIoQ09MT1JfV0lORE9XKSApOwotCQlTZXRUZXh0Q29sb3IoIChIREMzMil3UGFyYW0sIEdldFN5c0NvbG9yMzIoQ09MT1JfV0lORE9XVEVYVCkgKTsKKwkJU2V0QmtDb2xvcjMyKCAoSERDMzIpd1BhcmFtLCBHZXRTeXNDb2xvcjMyKENPTE9SX1dJTkRPVykgKTsKKwkJU2V0VGV4dENvbG9yMzIoKEhEQzMyKXdQYXJhbSwgR2V0U3lzQ29sb3IzMihDT0xPUl9XSU5ET1dURVhUKSk7CiAJCXJldHVybiAoTFJFU1VMVClzeXNDb2xvck9iamVjdHMuaGJydXNoV2luZG93OwogCSAgICB9CiAJfQpAQCAtMjk1LDggKzI5NSw4IEBACiAJaU1lbnVTeXNLZXkgPSAwOwogCWlmICh3UGFyYW0gPT0gVktfUkVUVVJOICYmICh3bmRQdHItPmR3U3R5bGUgJiBXU19NSU5JTUlaRSkpCiAgICAgICAgIHsKLQkgICAgUG9zdE1lc3NhZ2UoIHduZFB0ci0+aHduZFNlbGYsIFdNX1NZU0NPTU1BTkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKFdQQVJBTTE2KVNDX1JFU1RPUkUsIDBMICk7IAorCSAgICBQb3N0TWVzc2FnZTE2KCB3bmRQdHItPmh3bmRTZWxmLCBXTV9TWVNDT01NQU5ELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdQQVJBTTE2KVNDX1JFU1RPUkUsIDBMICk7IAogCSAgICBicmVhazsKICAgICAgICAgfSAKIAlpZiAoKEhJV09SRChsUGFyYW0pICYgS0VZREFUQV9BTFQpICYmIHdQYXJhbSkKZGlmZiAtLWdpdCBhL3dpbmRvd3MvZGlhbG9nLmMgYi93aW5kb3dzL2RpYWxvZy5jCmluZGV4IDE3ZDE2ODAuLjM2NmRkOGEgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZGlhbG9nLmMKKysrIGIvd2luZG93cy9kaWFsb2cuYwpAQCAtMjk2LDcgKzI5Niw3IEBACiAgICAgICAgICAgICAgICAgU2VuZE1lc3NhZ2UzMkEoIGh3bmREZWZCdXR0b24sIEJNX1NFVFNUWUxFMzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJTX1BVU0hCVVRUT04sRkFMU0UgKTsKICAgICAgICAgICAgIGh3bmREZWZCdXR0b24gPSBod25kQ3RybDsKLSAgICAgICAgICAgIGRsZ0luZm8tPmlkUmVzdWx0ID0gR2V0V2luZG93V29yZCggaHduZEN0cmwsIEdXV19JRCApOworICAgICAgICAgICAgZGxnSW5mby0+aWRSZXN1bHQgPSBHZXRXaW5kb3dXb3JkMzIoIGh3bmRDdHJsLCBHV1dfSUQgKTsKICAgICAgICAgfQogICAgIH0gICAgCiAgICAgZHByaW50Zl9kaWFsb2coc3RkZGViLCAiIEVORFxuIiApOwpAQCAtMTU2Niw3ICsxNTY2LDcgQEAKICAgICBIV05EMzIgaHduZDsKIAogI2RlZmluZSBTRU5ETVNHKG1zZyx3cGFyYW0sbHBhcmFtKSBcCi0gICAgKChhdHRyaWIgJiBERExfUE9TVE1TR1MpID8gUG9zdE1lc3NhZ2UoIGh3bmQsIG1zZywgd3BhcmFtLCBscGFyYW0gKSBcCisgICAgKChhdHRyaWIgJiBERExfUE9TVE1TR1MpID8gUG9zdE1lc3NhZ2UzMkEoIGh3bmQsIG1zZywgd3BhcmFtLCBscGFyYW0gKSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogU2VuZE1lc3NhZ2UzMkEoIGh3bmQsIG1zZywgd3BhcmFtLCBscGFyYW0gKSkKIAogICAgIGRwcmludGZfZGlhbG9nKCBzdGRkZWIsICJEbGdEaXJMaXN0OiAlMDR4ICclcycgJWQgJWQgJTA0eFxuIiwKZGlmZiAtLWdpdCBhL3dpbmRvd3MvZXZlbnQuYyBiL3dpbmRvd3MvZXZlbnQuYwppbmRleCA0ODAwYWVkLi44NmMzMTI5IDEwMDY0NAotLS0gYS93aW5kb3dzL2V2ZW50LmMKKysrIGIvd2luZG93cy9ldmVudC5jCkBAIC02NzAsNyArNjcwLDcgQEAKIAkgICAgQk9PTDMyIGNvdWxkT3BlbiA9IE9wZW5DbGlwYm9hcmQzMiggcFduZC0+aHduZFNlbGYgKTsKIAkgICAgY2hhciogbHBzdHIgPSAwOwogCi0JICAgIGhUZXh0ID0gR2V0Q2xpcGJvYXJkRGF0YShDRl9URVhUKTsKKwkgICAgaFRleHQgPSBHZXRDbGlwYm9hcmREYXRhMTYoQ0ZfVEVYVCk7CiAJICAgIHRleHQgPSBHbG9iYWxMb2NrMTYoaFRleHQpOwogCSAgICBzaXplID0gR2xvYmFsU2l6ZTE2KGhUZXh0KTsKIApAQCAtODQyLDcgKzg0Miw4IEBACiAJCSAgICAgIHAgKz0gc3RybGVuKHApICsgMTsKIAkJICAgIH0KIAkJICAgICpwX2Ryb3AgPSAnXDAnOwotCQkgICAgUG9zdE1lc3NhZ2UoIHBXbmQtPmh3bmRTZWxmLCBXTV9EUk9QRklMRVMsIChXUEFSQU0xNiloRHJvcCwgMEwgKTsKKwkJICAgIFBvc3RNZXNzYWdlMTYoIHBXbmQtPmh3bmRTZWxmLCBXTV9EUk9QRklMRVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXUEFSQU0xNiloRHJvcCwgMEwgKTsKIAkJICB9CiAJICAgICAgICB9CiAJICAgICAgfQpAQCAtOTgzLDcgKzk4NCw3IEBACiAgKi8KIEZBUlBST0MxNiBHZXRNb3VzZUV2ZW50UHJvYyh2b2lkKQogewotICAgIEhNT0RVTEUxNiBobW9kdWxlID0gR2V0TW9kdWxlSGFuZGxlKCJVU0VSIik7CisgICAgSE1PRFVMRTE2IGhtb2R1bGUgPSBHZXRNb2R1bGVIYW5kbGUxNigiVVNFUiIpOwogICAgIHJldHVybiBNT0RVTEVfR2V0RW50cnlQb2ludCggaG1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1PRFVMRV9HZXRPcmRpbmFsKCBobW9kdWxlLCAiTW91c2VfRXZlbnQiICkgKTsKIH0KZGlmZiAtLWdpdCBhL3dpbmRvd3MvZm9jdXMuYyBiL3dpbmRvd3MvZm9jdXMuYwppbmRleCAwNjQ2N2E2Li4zYzI4YzhlIDEwMDY0NAotLS0gYS93aW5kb3dzL2ZvY3VzLmMKKysrIGIvd2luZG93cy9mb2N1cy5jCkBAIC03LDcgKzcsNiBAQAogICoKICAqLwogCi0jZGVmaW5lIE5PX1RSQU5TSVRJT05fVFlQRVMgIC8qIFRoaXMgZmlsZSBpcyBXaW4zMi1jbGVhbiAqLwogI2luY2x1ZGUgIndpbi5oIgogI2luY2x1ZGUgIndpbnBvcy5oIgogI2luY2x1ZGUgImhvb2suaCIKQEAgLTEyMCw3ICsxMTksNyBAQAogCXsKIAkgICAgaWYgKCFXSU5QT1NfU2V0QWN0aXZlV2luZG93KGh3bmRUb3AsIDAsIDApKSByZXR1cm4gMDsKIAotCSAgICBpZiAoIUlzV2luZG93KCBod25kICkpIHJldHVybiAwOyAgLyogQWJvcnQgaWYgd2luZG93IGRlc3Ryb3llZCAqLworCSAgICBpZiAoIUlzV2luZG93MzIoIGh3bmQgKSkgcmV0dXJuIDA7ICAvKiBBYm9ydCBpZiB3aW5kb3cgZGVzdHJveWVkICovCiAJfQogICAgIH0KICAgICBlbHNlIGlmKCBIT09LX0NhbGxIb29rczE2KCBXSF9DQlQsIEhDQlRfU0VURk9DVVMsIDAsIChMUEFSQU0paHduZEZvY3VzICkgKQpkaWZmIC0tZ2l0IGEvd2luZG93cy9ncmFwaGljcy5jIGIvd2luZG93cy9ncmFwaGljcy5jCmluZGV4IDhkZDFkNjUuLjYxNjlmYTcgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZ3JhcGhpY3MuYworKysgYi93aW5kb3dzL2dyYXBoaWNzLmMKQEAgLTQsNyArNCw2IEBACiAgKiBDb3B5cmlnaHQgMTk5MywgMTk5NCBBbGV4YW5kcmUgSnVsbGlhcmQKICAqLwogCi0jZGVmaW5lIE5PX1RSQU5TSVRJT05fVFlQRVMgIC8qIFRoaXMgZmlsZSBpcyBXaW4zMi1jbGVhbiAqLwogI2luY2x1ZGUgPG1hdGguaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxYMTEvWGxpYi5oPgpkaWZmIC0tZ2l0IGEvd2luZG93cy9ob29rLmMgYi93aW5kb3dzL2hvb2suYwppbmRleCA1OWZmZDIwLi5lMDFkM2I3IDEwMDY0NAotLS0gYS93aW5kb3dzL2hvb2suYworKysgYi93aW5kb3dzL2hvb2suYwpAQCAtMTQsNyArMTQsNiBAQAogICogaGFuZGxlIGluIHRoZSBsb3cgMTYgYml0cyBhbmQgb2YgYSBIT09LX01BR0lDIHZhbHVlIGluIHRoZSBoaWdoIDE2IGJpdHMuCiAgKi8KIAotI2RlZmluZSBOT19UUkFOU0lUSU9OX1RZUEVTICAvKiBUaGlzIGZpbGUgaXMgV2luMzItY2xlYW4gKi8KICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAiaG9vay5oIgogI2luY2x1ZGUgInF1ZXVlLmgiCkBAIC0xNzUsOCArMTc0LDggQEAKICAgICAgICAgICAgICAgICAqcGxQYXJhbSA9IChMUEFSQU0pbHByZWN0MzI7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0JICAgIGJyZWFrOwogCSAgfSAKKwkgIGJyZWFrOwogCiAJY2FzZSBXSF9NT1VTRToKICAgICAgICAgewpkaWZmIC0tZ2l0IGEvd2luZG93cy9rZXlib2FyZC5jIGIvd2luZG93cy9rZXlib2FyZC5jCmluZGV4IDhlZDllZWIuLmQxYzBjOTggMTAwNjQ0Ci0tLSBhL3dpbmRvd3Mva2V5Ym9hcmQuYworKysgYi93aW5kb3dzL2tleWJvYXJkLmMKQEAgLTYsNyArNiw3IEBACiAgKiBDb3B5cmlnaHQgMTk5NyBEYXZpZCBGYXVyZQogICoKICAqLwotI2RlZmluZSBOT19UUkFOU0lUSU9OX1RZUEVTCisKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgpAQCAtNzMxLDcgKzczMSw3IEBACiAgKi8KIC8qIFZrS2V5U2NhbiB0cmFuc2xhdGVzIGFuIEFOU0kgY2hhcmFjdGVyIHRvIGEgdmlydHVhbC1rZXkgYW5kIHNoaWZ0IGNvZGUKICAqIGZvciB0aGUgY3VycmVudCBrZXlib2FyZC4KLSAqIEZJWE1FIGhpZ2gtb3JkZXIgYnl0ZSBzaG91bGQgeWllbGQgOgorICogaGlnaC1vcmRlciBieXRlIHlpZWxkcyA6CiAgKgkwCVVuc2hpZnRlZAogICoJMQlTaGlmdAogICoJMglDdHJsCkBAIC03MzksMjEgKzczOSw1MyBAQAogICoJNglDdHJsLUFsdAogICoJNwlDdHJsLUFsdC1TaGlmdAogICoJSS5lLiA6CVNoaWZ0ID0gMSwgQ3RybCA9IDIsIEFsdCA9IDQuCisgKiBGSVhNRSA6IHdvcmtzIG9rIGV4Y2VwdCBmb3IgZGVhZCBjaGFycyA6CisgKiBWa0tleVNjYW4gJ14nKDB4NWUsIDk0KSAuLi4gZ290IGtleWNvZGUgMDAgLi4uIHJldHVybmluZyAwMAorICogVmtLZXlTY2FuICdgJygweDYwLCA5NikgLi4uIGdvdCBrZXljb2RlIDAwIC4uLiByZXR1cm5pbmcgMDAKICAqLwogCiBXT1JEIFZrS2V5U2NhbjMyQShDSEFSIGNDaGFyKQogewogCUtleUNvZGUga2V5Y29kZTsKLSAgICAJZHByaW50Zl9rZXlib2FyZChzdGRkZWIsIlZrS2V5U2NhbiAnJWMnKCVkKSAiLGNDaGFyLGNDaGFyKTsKLQkKLS8qIGxldCdzIGRvIHRoaXMgOiBjaGFyID0ga2V5c3ltIChmb3IgQU5TSSBjaGFycykgLT4ga2V5YyBbICsgc2hpZnQgLi4uICg/PyBob3cgPz8pXQota2V5YyAtPiAoa2V5YzJ2a2V5KSB2a2V5ICovCisJS2V5U3ltIGtleXN5bTsgICAgCQorCWludCBpLGluZGV4OworCWludCBoaWdoYnl0ZT0wOwogCi0Ja2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZGlzcGxheSwgY0NoYXIgJiAweEZGKTsKKwkvKiBjaGFyLT5rZXlzeW0gKHNhbWUgZm9yIEFOU0kgY2hhcnMpICovCisJa2V5c3ltPSh1bnNpZ25lZCBjaGFyKSBjQ2hhcjsvKiAoISkgY0NoYXIgaXMgc2lnbmVkICovCisJaWYgKGtleXN5bTw9MjcpIGtleXN5bSs9MHhGRjAwOy8qc3BlY2lhbCBjaGFycyA6IHJldHVybiwgYmFja3NwYWNlLi4uKi8KIAkKLQlkcHJpbnRmX2tleWJvYXJkKHN0ZGRlYiwiIC4uLiBnb3Qga2V5Y29kZSAweCV4IC4uLiByZXR1cm5pbmcgMHgleFxuIiwKLQkJCSBrZXljb2RlLGtleWMydmtleVtrZXljb2RlXSk7Ci0JcmV0dXJuIGtleWMydmtleVtrZXljb2RlXTsKKwlrZXljb2RlID0gWEtleXN5bVRvS2V5Y29kZShkaXNwbGF5LCBrZXlzeW0pOyAgLyoga2V5c3ltIC0+IGtleWNvZGUgKi8KKwlpZiAoIWtleWNvZGUpCisJeyAvKiBJdCBkaWRuJ3Qgd29yayAuLi4gbGV0J3MgdHJ5IHdpdGggZGVhZGNoYXIgY29kZS4gKi8KKwkgIGtleWNvZGUgPSBYS2V5c3ltVG9LZXljb2RlKGRpc3BsYXksIGtleXN5bSB8IDB4RkUwMCk7CisJfQorCisJZHByaW50Zl9rZXlib2FyZChzdGRkZWIsIlZrS2V5U2NhbiAnJWMnKCUjbHgsICVsdSkgOiBnb3Qga2V5Y29kZSAlIy4yeCAiLAorCSAgICBjQ2hhcixrZXlzeW0sa2V5c3ltLGtleWNvZGUpOworCQorCWlmIChrZXljb2RlKQorCSAgeworCSAgICBmb3IgKGluZGV4PS0xLCBpPTA7IChpPDgpICYmIChpbmRleDwwKTsgaSsrKSAvKiBmaW5kIHNoaWZ0IHN0YXRlICovCisJICAgICAgaWYgKFhLZXljb2RlVG9LZXlzeW0oZGlzcGxheSxrZXljb2RlLGkpPT1rZXlzeW0pIGluZGV4PWk7CisJICAgIHN3aXRjaCAoaW5kZXgpIHsKKwkgICAgY2FzZSAtMSA6CisJICAgICAgZnByaW50ZihzdGRlcnIsIktleXN5bSAlbHggbm90IGZvdW5kIHdoaWxlIHBhcnNpbmcgdGhlIGtleWNvZGUgdGFibGVcbiIsa2V5c3ltKTsgYnJlYWs7CisJICAgIGNhc2UgMCA6IGJyZWFrOworCSAgICBjYXNlIDEgOiBoaWdoYnl0ZSA9IDB4MDEwMDsgYnJlYWs7CisJICAgIGNhc2UgMiA6IGhpZ2hieXRlID0gMFgwNjAwOyBicmVhazsKKwkgICAgZGVmYXVsdCA6IGZwcmludGYoc3RkZXJyLCJpbmRleCAlZCBmb3VuZCBieSBYS2V5Y29kZVRvS2V5c3ltLiBwbGVhc2UgcmVwb3J0ISBcbiIsaW5kZXgpOworCSAgICB9CisJICAgIC8qCisJICAgICAgaW5kZXggOiAwICAgICBhZGRzIDB4MDAwMAorCSAgICAgIGluZGV4IDogMSAgICAgYWRkcyAweDAxMDAgKHNoaWZ0KQorCSAgICAgIGluZGV4IDogPyAgICAgYWRkcyAweDAyMDAgKGN0cmwpCisJICAgICAgaW5kZXggOiAyICAgICBhZGRzIDB4MDYwMCAoY3RybCthbHQpCisJICAgICAgaW5kZXggOiA/ICAgICBhZGRzIDB4MDcwMCAoY3RybCthbHQrc2hpdCAodXNlZD8pKQorCSAgICAgKi8KKwkgIH0KKwlkcHJpbnRmX2tleWJvYXJkKHN0ZGRlYiwiIC4uLiByZXR1cm5pbmcgJSMuMnhcbiIsIGtleWMydmtleVtrZXljb2RlXStoaWdoYnl0ZSk7CisJcmV0dXJuIGtleWMydmtleVtrZXljb2RlXStoaWdoYnl0ZTsgICAvKiBrZXljb2RlIC0+IChrZXljMnZrZXkpIHZrZXkgKi8KIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtOTYyLDcgKzk5NCw3IEBACiAJICB7CiAJICAgIGlmICgoZS5rZXljb2RlKSAmJiAoKHZpcnRLZXk8MHgxMCkgfHwgKHZpcnRLZXk+MHgxMikpKSAKIAkJLyogaXQncyBub3JtYWwgdG8gaGF2ZSAyIHNoaWZ0LCBjb250cm9sLCBhbmQgYWx0ICEgKi8KLQkJZHByaW50Zl9rZXlib2FyZChzdGRkZWIsIlRvQXNjaWkgOiBUaGUga2V5Y29kZXMgJVggYW5kICVYIGFyZSBtYXRjaGluZyB0aGUgc2FtZSB2a2V5ICVYXG4iLAorCQlkcHJpbnRmX2tleWJvYXJkKHN0ZGRlYiwiVG9Bc2NpaSA6IFRoZSBrZXljb2RlcyAlZCBhbmQgJWQgYXJlIG1hdGNoaW5nIHRoZSBzYW1lIHZrZXkgJSNYXG4iLAogCQkJCSBlLmtleWNvZGUsa2V5Yyx2aXJ0S2V5KTsKIAkgICAgZS5rZXljb2RlID0ga2V5YzsKIAkgIH0KQEAgLTEwMDIsMjYgKzEwMzQsNjIgQEAKIAkoKGNoYXIqKWxwQ2hhcilbMV0gPSAnXDAnOwogCXN3aXRjaCAoa2V5c3ltKQogCSAgICB7CisJLyogc3ltYm9saWMgQVNDSUkgaXMgdGhlIHNhbWUgYXMgZGVmaW5lZCBpbiByZmMxMzQ1ICovCiAJICAgIGNhc2UgWEtfZGVhZF90aWxkZSA6CiAJICAgIGNhc2UgMHgxMDAwRkU3RSA6IC8qIFhmcmVlJ3MgWEtfRHRpbGRlICovCi0JCWRlYWRfY2hhciA9ICd+JzsKKwkJZGVhZF9jaGFyID0gJ34nOwkvKiAnPyAqLwogCQlicmVhazsKIAkgICAgY2FzZSBYS19kZWFkX2FjdXRlIDoKIAkgICAgY2FzZSAweDEwMDBGRTI3IDogLyogWGZyZWUncyBYS19EYWN1dGVfYWNjZW50ICovCi0JCWRlYWRfY2hhciA9IDB4YjQ7CisJCWRlYWRfY2hhciA9IDB4YjQ7CS8qICcnICovCiAJCWJyZWFrOwogCSAgICBjYXNlIFhLX2RlYWRfY2lyY3VtZmxleCA6CiAJICAgIGNhc2UgMHgxMDAwRkU1RSA6IC8qIFhmcmVlJ3MgWEtfRGNpcmN1bWZsZXhfYWNjZW50ICovCi0JCWRlYWRfY2hhciA9ICdeJzsKKwkJZGVhZF9jaGFyID0gJ14nOwkvKiAnPiAqLwogCQlicmVhazsKIAkgICAgY2FzZSBYS19kZWFkX2dyYXZlIDoKIAkgICAgY2FzZSAweDEwMDBGRTYwIDogLyogWGZyZWUncyBYS19EZ3JhdmVfYWNjZW50ICovCi0JCWRlYWRfY2hhciA9ICdgJzsKKwkJZGVhZF9jaGFyID0gJ2AnOwkvKiAnISAqLwogCQlicmVhazsKIAkgICAgY2FzZSBYS19kZWFkX2RpYWVyZXNpcyA6CiAJICAgIGNhc2UgMHgxMDAwRkUyMiA6IC8qIFhmcmVlJ3MgWEtfRGRpYWVyZXNpcyAqLwotCQlkZWFkX2NoYXIgPSAweGE4OworCQlkZWFkX2NoYXIgPSAweGE4OwkvKiAnOiAqLwogCQlicmVhazsKKwkgICAgY2FzZSBYS19kZWFkX2NlZGlsbGEgOgorCSAgICAgICAgZGVhZF9jaGFyID0gMHhiODsJLyogJywgKi8KKwkgICAgICAgIGJyZWFrOworCSAgICBjYXNlIFhLX2RlYWRfbWFjcm9uIDoKKwkgICAgICAgIGRlYWRfY2hhciA9ICctJzsJLyogJ20gaXNuJ3QgZGVmaW5lZCBvbiBpc28tODg1OS14ICovCisJICAgICAgICBicmVhazsKKwkgICAgY2FzZSBYS19kZWFkX2JyZXZlIDoKKwkgICAgICAgIGRlYWRfY2hhciA9IDB4YTI7CS8qICcoICovCisJICAgICAgICBicmVhazsKKwkgICAgY2FzZSBYS19kZWFkX2Fib3ZlZG90IDoKKwkgICAgICAgIGRlYWRfY2hhciA9IDB4ZmY7CS8qICcuICovCisJICAgICAgICBicmVhazsKKwkgICAgY2FzZSBYS19kZWFkX2Fib3ZlcmluZyA6CisJICAgICAgICBkZWFkX2NoYXIgPSAnMCc7CS8qICcwIGlzbid0IGRlZmluZWQgb24gaXNvLTg4NTkteCAqLworCSAgICAgICAgYnJlYWs7CisJICAgIGNhc2UgWEtfZGVhZF9kb3VibGVhY3V0ZSA6CisJICAgICAgICBkZWFkX2NoYXIgPSAweGJkOwkvKiAnIiAqLworCSAgICAgICAgYnJlYWs7CisJICAgIGNhc2UgWEtfZGVhZF9jYXJvbiA6CisJICAgICAgICBkZWFkX2NoYXIgPSAweGI3OwkvKiAnPCAqLworCSAgICAgICAgYnJlYWs7CisJICAgIGNhc2UgWEtfZGVhZF9vZ29uZWsgOgorCSAgICAgICAgZGVhZF9jaGFyID0gMHhiMjsJLyogJzsgKi8KKwkgICAgICAgIGJyZWFrOworLyogRklYTUU6IEkgZG9uJ3Qga25vdyB0aGlzIHRocmVlLgorCSAgICBjYXNlIFhLX2RlYWRfaW90YSA6CisJICAgICAgICBkZWFkX2NoYXIgPSAnaSc7CSAKKwkgICAgICAgIGJyZWFrOworCSAgICBjYXNlIFhLX2RlYWRfdm9pY2VkX3NvdW5kIDoKKwkgICAgICAgIGRlYWRfY2hhciA9ICd2JzsKKwkgICAgICAgIGJyZWFrOworCSAgICBjYXNlIFhLX2RlYWRfc2VtaXZvaWNlZF9zb3VuZCA6CisJICAgICAgICBkZWFkX2NoYXIgPSAncyc7CisJICAgICAgICBicmVhazsKKyovCiAJICAgIH0KIAlpZiAoZGVhZF9jaGFyKQogCSAgICB7CmRpZmYgLS1naXQgYS93aW5kb3dzL21kaS5jIGIvd2luZG93cy9tZGkuYwppbmRleCAzOTVhNGVhLi5kOGJiNWEzIDEwMDY0NAotLS0gYS93aW5kb3dzL21kaS5jCisrKyBiL3dpbmRvd3MvbWRpLmMKQEAgLTYwLDcgKzYwLDcgQEAKICBpZiggIWNpLT5zYk5lZWRVcGRhdGUgKQogICAgewogICAgICAgY2ktPnNiTmVlZFVwZGF0ZSA9IFRSVUU7Ci0gICAgICBQb3N0TWVzc2FnZSggaHduZCwgV01fTURJQ0FMQ0NISUxEU0NST0xMLCAwLCAwKTsKKyAgICAgIFBvc3RNZXNzYWdlMTYoIGh3bmQsIFdNX01ESUNBTENDSElMRFNDUk9MTCwgMCwgMCk7CiAgICB9CiAgY2ktPnNiUmVjYWxjID0gcmVjYWxjOwogfQpAQCAtNjksNyArNjksNyBAQAogICoJCQlNRElfTWVudUFwcGVuZEl0ZW0KICAqLwogI2lmZGVmIFNVUEVSRkxVT1VTX0ZVTkNUSU9OUwotc3RhdGljIEJPT0wgTURJX01lbnVBcHBlbmRJdGVtKFdORCAqY2xpZW50V25kLCBIV05EMTYgaFduZENoaWxkKQorc3RhdGljIEJPT0wzMiBNRElfTWVudUFwcGVuZEl0ZW0oV05EICpjbGllbnRXbmQsIEhXTkQxNiBoV25kQ2hpbGQpCiB7CiAgY2hhciBidWZmZXJbMTI4XTsKICBNRElDTElFTlRJTkZPICAqY2xpZW50SW5mbyA9IChNRElDTElFTlRJTkZPKiljbGllbnRXbmQtPndFeHRyYTsKQEAgLTg4LDE0ICs4OCwxNCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQkJTURJX01lbnVNb2RpZnlJdGVtCiAgKi8KLXN0YXRpYyBCT09MIE1ESV9NZW51TW9kaWZ5SXRlbShXTkQqIGNsaWVudFduZCwgSFdORDE2IGhXbmRDaGlsZCApCitzdGF0aWMgQk9PTDMyIE1ESV9NZW51TW9kaWZ5SXRlbShXTkQqIGNsaWVudFduZCwgSFdORDE2IGhXbmRDaGlsZCApCiB7CiAgY2hhciAgICAgICAgICAgIGJ1ZmZlclsxMjhdOwogIE1ESUNMSUVOVElORk8gICpjbGllbnRJbmZvID0gKE1ESUNMSUVOVElORk8qKWNsaWVudFduZC0+d0V4dHJhOwogIFdORCAgICAgICAgICAgICp3bmRQdHIgICAgID0gV0lOX0ZpbmRXbmRQdHIoaFduZENoaWxkKTsKLSBVSU5UCQkgbiAgICAgICAgICA9IHNwcmludGYoYnVmZmVyLCAiJWQgIiwKKyBVSU5UMzIJCSBuICAgICAgICAgID0gc3ByaW50ZihidWZmZXIsICIlZCAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd25kUHRyLT53SURtZW51IC0gY2xpZW50SW5mby0+aWRGaXJzdENoaWxkICsgMSk7Ci0gQk9PTAkJIGJSZXQJICAgID0gMDsKKyBCT09MMzIJCSBiUmV0CSAgICA9IDA7CiAKICBpZiggIWNsaWVudEluZm8tPmhXaW5kb3dNZW51ICkgcmV0dXJuIDA7CiAKQEAgLTExMSwxMiArMTExLDEyIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQlNRElfTWVudURlbGV0ZUl0ZW0KICAqLwotc3RhdGljIEJPT0wgTURJX01lbnVEZWxldGVJdGVtKFdORCogY2xpZW50V25kLCBIV05EMTYgaFduZENoaWxkICkKK3N0YXRpYyBCT09MMzIgTURJX01lbnVEZWxldGVJdGVtKFdORCogY2xpZW50V25kLCBIV05EMTYgaFduZENoaWxkICkKIHsKICBjaGFyICAgIAkgYnVmZmVyWzEyOF07CiAgTURJQ0xJRU5USU5GTyAgKmNsaWVudEluZm8gPSAoTURJQ0xJRU5USU5GTyopY2xpZW50V25kLT53RXh0cmE7CiAgV05EICAgIAkqd25kUHRyICAgICA9IFdJTl9GaW5kV25kUHRyKGhXbmRDaGlsZCk7Ci0gVUlOVAkJIGluZGV4ICAgICAgPSAwLGlkLG47CisgVUlOVDMyCQkgaW5kZXggICAgICA9IDAsaWQsbjsKIAogIGlmKCAhY2xpZW50SW5mby0+bkFjdGl2ZUNoaWxkcmVuIHx8CiAgICAgICFjbGllbnRJbmZvLT5oV2luZG93TWVudSApIHJldHVybiAwOwpAQCAtMTk0LDEyICsxOTQsMTMgQEAKICAqCiAgKiAgSXQgc2VlbXMgdGhhdCBkZWZhdWx0IGhlaWdodCBpcyAyLzMgb2YgY2xpZW50IHJlY3QKICAqLwotc3RhdGljIHZvaWQgTURJX0NhbGNEZWZhdWx0Q2hpbGRQb3MoV05EKiB3LCBXT1JEIG4sIExQUE9JTlQxNiBscFBvcywgSU5UIGRlbHRhKQorc3RhdGljIHZvaWQgTURJX0NhbGNEZWZhdWx0Q2hpbGRQb3MoIFdORCogdywgV09SRCBuLCBMUFBPSU5UMTYgbHBQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIgZGVsdGEpCiB7CiAgUkVDVDE2IHJlY3QgPSB3LT5yZWN0Q2xpZW50OwotIElOVCAgc3BhY2luZyA9IEdldFN5c3RlbU1ldHJpY3MzMihTTV9DWUNBUFRJT04pICsKLSAgICAgICAgICAgICAgICBHZXRTeXN0ZW1NZXRyaWNzMzIoU01fQ1lGUkFNRSkgLSAxOyAKLSBJTlQgIG5zdGFnZ2VyOworIElOVDMyICBzcGFjaW5nID0gR2V0U3lzdGVtTWV0cmljczMyKFNNX0NZQ0FQVElPTikgKworICAgICAgICAgICAgICAgICAgR2V0U3lzdGVtTWV0cmljczMyKFNNX0NZRlJBTUUpIC0gMTsgCisgSU5UMzIgIG5zdGFnZ2VyOwogCiAgaWYoIHJlY3QuYm90dG9tIC0gcmVjdC50b3AgLSBkZWx0YSA+PSBzcGFjaW5nICkgCiAgICAgIHJlY3QuYm90dG9tIC09IGRlbHRhOwpAQCAtMjQ0LDkgKzI0NSw5IEBACiAKIAkgICAgaWYoIGNpLT5uQWN0aXZlQ2hpbGRyZW4gKQogCSAgICAgIHsKLQkgICAgICAgIElOVCAgaiA9IGkgLSBjaS0+bkFjdGl2ZUNoaWxkcmVuICsgMTsKKwkgICAgICAgIElOVDMyIGogPSBpIC0gY2ktPm5BY3RpdmVDaGlsZHJlbiArIDE7CiAJCWNoYXIgYnVmZmVyWzEwMF07Ci0JCVVJTlQgaWQsc3RhdGU7CisJCVVJTlQzMiBpZCxzdGF0ZTsKIAogCQlmb3IoIDsgaSA+PSBqIDsgaS0tICkKIAkJICAgewpAQCAtMzgzLDggKzM4NCw4IEBACiAgICAgewogCWNpLT5uQWN0aXZlQ2hpbGRyZW4tLTsKIAlEZWxldGVNZW51MzIoY2ktPmhXaW5kb3dNZW51LHdJRG1lbnUsTUZfQllDT01NQU5EKTsKLQlpZiggSXNXaW5kb3coaHduZE1heCkgKQotCSAgICBTaG93V2luZG93MTYoaHduZE1heCwgU1dfU0hPV01BWElNSVpFRCk7CisJaWYoIElzV2luZG93MzIoaHduZE1heCkgKQorCSAgICBTaG93V2luZG93MzIoaHduZE1heCwgU1dfU0hPV01BWElNSVpFRCk7CiAgICAgfQogCQogICAgIHJldHVybiBod25kOwpAQCAtNDQzLDcgKzQ0NCw3IEBACiAKICAgICBpZiAoIGh3bmRUbyAhPSBod25kUHJldiApCiAJewotCSAgQk9PTCBiT3B0aW1pemUgPSAwOworCSAgQk9PTDMyIGJPcHRpbWl6ZSA9IDA7CiAKIAkgIGlmKCBjaS0+aHduZENoaWxkTWF4aW1pemVkICkKIAkgICAgewpAQCAtNTIwLDcgKzUyMSw3IEBACiAgICAgSFdORDE2ICAgICAgICAgICAgICAgICBwcmV2QWN0aXZlV25kID0gY2xpZW50SW5mby0+aHduZEFjdGl2ZUNoaWxkOwogICAgIFdORCAgICAgICAgICAgICAgICAgKnduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBoV25kQ2hpbGQgKTsKICAgICBXTkQJCQkqd25kUHJldiA9IFdJTl9GaW5kV25kUHRyKCBwcmV2QWN0aXZlV25kICk7Ci0gICAgQk9PTAkJIGlzQWN0aXZlRnJhbWVXbmQgPSAwOwkgCisgICAgQk9PTDMyCQkgaXNBY3RpdmVGcmFtZVduZCA9IDA7CSAKIAogICAgIGlmKCBoV25kQ2hpbGQgPT0gcHJldkFjdGl2ZVduZCApIHJldHVybiAwTDsKIApAQCAtNjcwLDcgKzY3MSw3IEBACiAgSEJJVE1BUDE2CWhiQ29weSxoYl9zcmMsaGJfZGVzdDsKIAogIGhiX3NyYyA9IFNlbGVjdE9iamVjdDMyKGhEQ1NyYyxoYkNsb3NlKTsKLSBoYkNvcHkgPSBDcmVhdGVDb21wYXRpYmxlQml0bWFwKGhEQ1NyYyxTWVNNRVRSSUNTX0NYU0laRSwgU1lTTUVUUklDU19DWVNJWkUpOworIGhiQ29weSA9IENyZWF0ZUNvbXBhdGlibGVCaXRtYXAzMihoRENTcmMsU1lTTUVUUklDU19DWFNJWkUsU1lTTUVUUklDU19DWVNJWkUpOwogIGhiX2Rlc3QgPSBTZWxlY3RPYmplY3QzMihoRENEZXN0LGhiQ29weSk7CiAKICBCaXRCbHQzMihoRENEZXN0LCAwLCAwLCBTWVNNRVRSSUNTX0NYU0laRSwgU1lTTUVUUklDU19DWVNJWkUsCkBAIC05NzUsNyArOTc2LDcgQEAKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBoYW5kbGVyIGZvciBhbGwgTURJIHJlcXVlc3RzLgogICovCi1MUkVTVUxUIE1ESUNsaWVudFduZFByb2MoSFdORDE2IGh3bmQsIFVJTlQgbWVzc2FnZSwgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQorTFJFU1VMVCBNRElDbGllbnRXbmRQcm9jKEhXTkQxNiBod25kLCBVSU5UMTYgbWVzc2FnZSwgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewogICAgIExQQ1JFQVRFU1RSVUNUMTYgICAgIGNzOwogICAgIExQQ0xJRU5UQ1JFQVRFU1RSVUNUMTYgY2NzOwpAQCAtOTgzLDcgKzk4NCw3IEBACiAgICAgUkVDVDE2CQkgcmVjdDsKICAgICBXTkQgICAgICAgICAgICAgICAgICp3IAkgID0gV0lOX0ZpbmRXbmRQdHIoaHduZCk7CiAgICAgV05ECQkJKmZyYW1lV25kID0gdy0+cGFyZW50OwotICAgIElOVAkJCW5JdGVtczsKKyAgICBJTlQzMiBuSXRlbXM7CiAgICAgCiAgICAgY2kgPSAoTURJQ0xJRU5USU5GTyAqKSB3LT53RXh0cmE7CiAgICAgCkBAIC0xNDYwLDggKzE0NjEsOCBAQAogICAgICAgY2FzZSBXTV9NRU5VQ0hBUjoKIAogCS8qIE1ESSBjaGlsZHJlbiBkb24ndCBoYXZlIG1lbnUgYmFycyAqLwotCVBvc3RNZXNzYWdlKCBjbGllbnRXbmQtPnBhcmVudC0+aHduZFNlbGYsIFdNX1NZU0NPTU1BTkQsIAotICAgICAgICAgICAgICAgICAgICAgKFdQQVJBTTE2KVNDX0tFWU1FTlUsIChMUEFSQU0pd1BhcmFtKTsKKwlQb3N0TWVzc2FnZTE2KCBjbGllbnRXbmQtPnBhcmVudC0+aHduZFNlbGYsIFdNX1NZU0NPTU1BTkQsIAorICAgICAgICAgICAgICAgICAgICAgICAoV1BBUkFNMTYpU0NfS0VZTUVOVSwgKExQQVJBTSl3UGFyYW0pOwogCXJldHVybiAweDAwMDEwMDAwTDsKIAogICAgICAgY2FzZSBXTV9ORVhUTUVOVToKQEAgLTE1MTQsOCArMTUxNSw4IEBACiAgICAgICBjYXNlIFdNX01FTlVDSEFSOgogCiAJLyogTURJIGNoaWxkcmVuIGRvbid0IGhhdmUgbWVudSBiYXJzICovCi0JUG9zdE1lc3NhZ2UoIGNsaWVudFduZC0+cGFyZW50LT5od25kU2VsZiwgV01fU1lTQ09NTUFORCwgCi0gICAgICAgICAgICAgICAgICAgICAoV1BBUkFNMTYpU0NfS0VZTUVOVSwgKExQQVJBTSlMT1dPUkQod1BhcmFtKSApOworCVBvc3RNZXNzYWdlMTYoIGNsaWVudFduZC0+cGFyZW50LT5od25kU2VsZiwgV01fU1lTQ09NTUFORCwgCisgICAgICAgICAgICAgICAgICAgICAgIChXUEFSQU0xNilTQ19LRVlNRU5VLCAoTFBBUkFNKUxPV09SRCh3UGFyYW0pICk7CiAJcmV0dXJuIDB4MDAwMTAwMDBMOwogCiAgICAgICBjYXNlIFdNX0NMT1NFOgpAQCAtMTY0MSw4ICsxNjQyLDggQEAKIHZvaWQgQ2FsY0NoaWxkU2Nyb2xsKCBIV05EMTYgaHduZCwgV09SRCBzY3JvbGwgKQogewogICAgIFJFQ1QxNiBjaGlsZFJlY3QsIGNsaWVudFJlY3Q7Ci0gICAgSU5UICB2bWluLCB2bWF4LCBobWluLCBobWF4LCB2cG9zLCBocG9zOwotICAgIEJPT0wgbm9zY3JvbGwgPSBGQUxTRTsKKyAgICBJTlQzMiAgdm1pbiwgdm1heCwgaG1pbiwgaG1heCwgdnBvcywgaHBvczsKKyAgICBCT09MMzIgbm9zY3JvbGwgPSBGQUxTRTsKICAgICBXTkQgKnBXbmQsICpXbmQ7CiAKICAgICBpZiAoIShXbmQgPSBwV25kID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKSkpIHJldHVybjsKZGlmZiAtLWdpdCBhL3dpbmRvd3MvbWVzc2FnZS5jIGIvd2luZG93cy9tZXNzYWdlLmMKaW5kZXggZGZjZThiMC4uYWNlNTIwMCAxMDA2NDQKLS0tIGEvd2luZG93cy9tZXNzYWdlLmMKKysrIGIvd2luZG93cy9tZXNzYWdlLmMKQEAgLTQwNCw3ICs0MDQsOCBAQAogICoKICAqIFBlZWsgZm9yIGEgaGFyZHdhcmUgbWVzc2FnZSBtYXRjaGluZyB0aGUgaHduZCBhbmQgbWVzc2FnZSBmaWx0ZXJzLgogICovCi1zdGF0aWMgQk9PTDMyIE1TR19QZWVrSGFyZHdhcmVNc2coIE1TRzE2ICptc2csIEhXTkQxNiBod25kLCBEV09SRCBmaWx0ZXIsIEJPT0wzMiByZW1vdmUgKQorc3RhdGljIEJPT0wzMiBNU0dfUGVla0hhcmR3YXJlTXNnKCBNU0cxNiAqbXNnLCBIV05EMTYgaHduZCwgRFdPUkQgZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MMzIgcmVtb3ZlICkKIHsKICAgICBEV09SRCBzdGF0dXMgPSBTWVNRX01TR19BQ0NFUFQ7CiAgICAgTUVTU0FHRVFVRVVFICpzeXNNc2dRdWV1ZSA9IFFVRVVFX0dldFN5c1F1ZXVlKCk7CkBAIC01NDMsNyArNTQ0LDcgQEAKICAqCiAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhbiBpbnRlci10YXNrIFNlbmRNZXNzYWdlLgogICovCi1zdGF0aWMgTFJFU1VMVCBNU0dfU2VuZE1lc3NhZ2UoIEhRVUVVRTE2IGhEZXN0UXVldWUsIEhXTkQxNiBod25kLCBVSU5UIG1zZywKK3N0YXRpYyBMUkVTVUxUIE1TR19TZW5kTWVzc2FnZSggSFFVRVVFMTYgaERlc3RRdWV1ZSwgSFdORDE2IGh3bmQsIFVJTlQxNiBtc2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSApCiB7CiAgICAgSU5UMzIJICBwcmV2U01STCA9IGRlYnVnU01STDsKQEAgLTU1Myw3ICs1NTQsNyBAQAogICAgIGlmICghKHF1ZXVlID0gKE1FU1NBR0VRVUVVRSopR2xvYmFsTG9jazE2KCBHZXRUYXNrUXVldWUoMCkgKSkpIHJldHVybiAwOwogICAgIGlmICghKGRlc3RRID0gKE1FU1NBR0VRVUVVRSopR2xvYmFsTG9jazE2KCBoRGVzdFF1ZXVlICkpKSByZXR1cm4gMDsKIAotICAgIGlmIChJc1Rhc2tMb2NrZWQoKSB8fCAhSXNXaW5kb3coaHduZCkpIHJldHVybiAwOworICAgIGlmIChJc1Rhc2tMb2NrZWQoKSB8fCAhSXNXaW5kb3czMihod25kKSkgcmV0dXJuIDA7CiAKICAgICBkZWJ1Z1NNUkwrPTQ7CiAgICAgZHByaW50Zl9zZW5kbXNnKHN0ZGRlYiwiJSpzU006ICVzIFslMDR4XSAoJTA0eCAtPiAlMDR4KVxuIiwgCkBAIC02MTcsOSArNjE4LDkgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBSZXBseU1lc3NhZ2UgICAoVVNFUi4xMTUpCisgKiAgICAgICAgICAgUmVwbHlNZXNzYWdlMTYgICAoVVNFUi4xMTUpCiAgKi8KLXZvaWQgUmVwbHlNZXNzYWdlKCBMUkVTVUxUIHJlc3VsdCApCit2b2lkIFJlcGx5TWVzc2FnZTE2KCBMUkVTVUxUIHJlc3VsdCApCiB7CiAgICAgTUVTU0FHRVFVRVVFICpzZW5kZXJROwogICAgIE1FU1NBR0VRVUVVRSAqcXVldWU7CkBAIC02NTksOCArNjYwLDggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIE1TR19QZWVrTWVzc2FnZQogICovCi1zdGF0aWMgQk9PTCBNU0dfUGVla01lc3NhZ2UoIExQTVNHMTYgbXNnLCBIV05EMTYgaHduZCwgV09SRCBmaXJzdCwgV09SRCBsYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXT1JEIGZsYWdzLCBCT09MIHBlZWsgKQorc3RhdGljIEJPT0wzMiBNU0dfUGVla01lc3NhZ2UoIExQTVNHMTYgbXNnLCBIV05EMTYgaHduZCwgV09SRCBmaXJzdCwgV09SRCBsYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdPUkQgZmxhZ3MsIEJPT0wzMiBwZWVrICkKIHsKICAgICBpbnQgcG9zLCBtYXNrOwogICAgIE1FU1NBR0VRVUVVRSAqbXNnUXVldWU7CkBAIC04NDMsNyArODQ0LDcgQEAKIAkgICAgaWYgKCFNU0dfUGVla01lc3NhZ2UoIG1zZywgMCwgMCwgMCwgZmxhZ3MsIFRSVUUgKSkKIAkgICAgewogCQkgIC8qIE5vIG1lc3NhZ2UgcHJlc2VudCAtPiBzZW5kIEVOVEVSSURMRSBhbmQgd2FpdCAqLwotICAgICAgICAgICAgICAgIGlmIChJc1dpbmRvdyhod25kT3duZXIpKQorICAgICAgICAgICAgICAgIGlmIChJc1dpbmRvdzMyKGh3bmRPd25lcikpCiAgICAgICAgICAgICAgICAgICAgIFNlbmRNZXNzYWdlMTYoIGh3bmRPd25lciwgV01fRU5URVJJRExFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlLCAoTFBBUkFNKWh3bmQgKTsKIAkJTVNHX1BlZWtNZXNzYWdlKCBtc2csIDAsIDAsIDAsIGZsYWdzLCBGQUxTRSApOwpAQCAtODkzLDkgKzg5NCw5IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0TWVzc2FnZSAgIChVU0VSLjEwOCkKKyAqICAgICAgICAgICBHZXRNZXNzYWdlMTYgICAoVVNFUi4xMDgpCiAgKi8KLUJPT0wgR2V0TWVzc2FnZSggU0VHUFRSIG1zZywgSFdORDE2IGh3bmQsIFVJTlQgZmlyc3QsIFVJTlQgbGFzdCApIAorQk9PTDE2IEdldE1lc3NhZ2UxNiggU0VHUFRSIG1zZywgSFdORDE2IGh3bmQsIFVJTlQxNiBmaXJzdCwgVUlOVDE2IGxhc3QgKSAKIHsKICAgICBNU0cxNiAqbHBtc2cgPSAoTVNHMTYgKilQVFJfU0VHX1RPX0xJTihtc2cpOwogICAgIE1TR19QZWVrTWVzc2FnZSggbHBtc2csCkBAIC05MDksOSArOTEwLDEwIEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgUG9zdE1lc3NhZ2UgICAoVVNFUi4xMTApCisgKiAgICAgICAgICAgUG9zdE1lc3NhZ2UxNiAgIChVU0VSLjExMCkKICAqLwotQk9PTCBQb3N0TWVzc2FnZSggSFdORDE2IGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICkKK0JPT0wxNiBQb3N0TWVzc2FnZTE2KCBIV05EMTYgaHduZCwgVUlOVDE2IG1lc3NhZ2UsIFdQQVJBTTE2IHdQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICBMUEFSQU0gbFBhcmFtICkKIHsKICAgICBNU0cxNiAJbXNnOwogICAgIFdORCAJKnduZFB0cjsKQEAgLTkzOCw3ICs5NDAsNyBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGRwcmludGZfbXNnKHN0ZGRlYiwiQlJPQURDQVNUIE1lc3NhZ2UgdG8gaFduZD0lMDR4IG09JTA0WCB3PSUwNFggbD0lMDhsWCAhXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHduZFB0ci0+aHduZFNlbGYsIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICAgICAgICAgICAgICBQb3N0TWVzc2FnZSggd25kUHRyLT5od25kU2VsZiwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0gKTsKKyAgICAgICAgICAgICAgICBQb3N0TWVzc2FnZTE2KCB3bmRQdHItPmh3bmRTZWxmLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSApOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGRwcmludGZfbXNnKHN0ZGRlYiwiUG9zdE1lc3NhZ2UgLy8gRW5kIG9mIEhXTkRfQlJPQURDQVNUICFcbiIpOwpAQCAtOTUxLDYgKzk1MywyOSBAQAogICAgIHJldHVybiBRVUVVRV9BZGRNc2coIHduZFB0ci0+aG1lbVRhc2tRLCAmbXNnLCAwICk7CiB9CiAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgUG9zdE1lc3NhZ2UzMkEgICAoVVNFUjMyLjQxOCkKKyAqLworQk9PTDMyIFBvc3RNZXNzYWdlMzJBKCBIV05EMzIgaHduZCwgVUlOVDMyIG1lc3NhZ2UsIFdQQVJBTTMyIHdQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgTFBBUkFNIGxQYXJhbSApCit7CisgICAgLyogRklYTUUgKi8KKyAgICByZXR1cm4gUG9zdE1lc3NhZ2UxNiggaHduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0gKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBQb3N0TWVzc2FnZTMyVyAgIChVU0VSMzIuNDE5KQorICovCitCT09MMzIgUG9zdE1lc3NhZ2UzMlcoIEhXTkQzMiBod25kLCBVSU5UMzIgbWVzc2FnZSwgV1BBUkFNMzIgd1BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICBMUEFSQU0gbFBhcmFtICkKK3sKKyAgICAvKiBGSVhNRSAqLworICAgIHJldHVybiBQb3N0TWVzc2FnZTE2KCBod25kLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSApOworfQorCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFBvc3RBcHBNZXNzYWdlMTYgICAoVVNFUi4xMTYpCiAgKi8KQEAgLTk5Myw3ICsxMDE4LDcgQEAKICAgICAgICAgZm9yIChwcFduZCA9IGxpc3Q7ICpwcFduZDsgcHBXbmQrKykKICAgICAgICAgewogICAgICAgICAgICAgd25kUHRyID0gKnBwV25kOwotICAgICAgICAgICAgaWYgKCFJc1dpbmRvdyh3bmRQdHItPmh3bmRTZWxmKSkgY29udGludWU7CisgICAgICAgICAgICBpZiAoIUlzV2luZG93MzIod25kUHRyLT5od25kU2VsZikpIGNvbnRpbnVlOwogICAgICAgICAgICAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX1BPUFVQIHx8IHduZFB0ci0+ZHdTdHlsZSAmIFdTX0NBUFRJT04pCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgZHByaW50Zl9tc2coc3RkZGViLCJCUk9BRENBU1QgTWVzc2FnZSB0byBoV25kPSUwNHggbT0lMDRYIHc9JTA0bFggbD0lMDhsWCAhXG4iLApAQCAtMTA3OSw3ICsxMTA0LDcgQEAKICAgICAgICAgZm9yIChwcFduZCA9IGxpc3Q7ICpwcFduZDsgcHBXbmQrKykKICAgICAgICAgewogICAgICAgICAgICAgd25kUHRyID0gKnBwV25kOwotICAgICAgICAgICAgaWYgKCFJc1dpbmRvdyh3bmRQdHItPmh3bmRTZWxmKSkgY29udGludWU7CisgICAgICAgICAgICBpZiAoIUlzV2luZG93MzIod25kUHRyLT5od25kU2VsZikpIGNvbnRpbnVlOwogICAgICAgICAgICAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX1BPUFVQIHx8IHduZFB0ci0+ZHdTdHlsZSAmIFdTX0NBUFRJT04pCiAgICAgICAgICAgICAgICAgU2VuZE1lc3NhZ2UzMkEoIHduZFB0ci0+aHduZFNlbGYsIG1zZywgd1BhcmFtLCBsUGFyYW0gKTsKICAgICAgICAgfQpAQCAtMTEyOCw3ICsxMTUzLDcgQEAKICAgICAgICAgZm9yIChwcFduZCA9IGxpc3Q7ICpwcFduZDsgcHBXbmQrKykKICAgICAgICAgewogICAgICAgICAgICAgd25kUHRyID0gKnBwV25kOwotICAgICAgICAgICAgaWYgKCFJc1dpbmRvdyh3bmRQdHItPmh3bmRTZWxmKSkgY29udGludWU7CisgICAgICAgICAgICBpZiAoIUlzV2luZG93MzIod25kUHRyLT5od25kU2VsZikpIGNvbnRpbnVlOwogICAgICAgICAgICAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX1BPUFVQIHx8IHduZFB0ci0+ZHdTdHlsZSAmIFdTX0NBUFRJT04pCiAgICAgICAgICAgICAgICAgU2VuZE1lc3NhZ2UzMlcoIHduZFB0ci0+aHduZFNlbGYsIG1zZywgd1BhcmFtLCBsUGFyYW0gKTsKICAgICAgICAgfQpAQCAtMTE3OCw2ICsxMjAzLDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBhY2NlbnRfY2hhciBhY2NlbnRfY2hhcnNbXSA9CiB7CisvKiBBIGdvb2QgaWRlYSBzaG91bGQgYmUgdG8gcmVhZCAvdXNyL1gxMS9saWIvWDExL2xvY2FsZS9pc284ODU5LXgvQ29tcG9zZSAqLwogICAgIHsnYCcsICdBJywgJ1wzMDAnfSwgIHsnYCcsICdhJywgJ1wzNDAnfSwKICAgICB7J1wnJywgJ0EnLCAnXDMwMSd9LCB7J1wnJywgJ2EnLCAnXDM0MSd9LAogICAgIHsnXicsICdBJywgJ1wzMDInfSwgIHsnXicsICdhJywgJ1wzNDInfSwKQEAgLTEyMTIsNiArMTIzOCw3NyBAQAogICAgIHsnVCcsICdIJywgJ1wzMzYnfSwgIHsndCcsICdoJywgJ1wzNzYnfSwKICAgICB7J3MnLCAncycsICdcMzM3J30sICB7JyInLCAneScsICdcMzc3J30sCiAgICAgeydzJywgJ3onLCAnXDMzNyd9LCAgeydpJywgJ2onLCAnXDM3Nyd9LAorCS8qIGlzby04ODU5LTIgdXNlcyB0aGlzICovCisgICAgeyc8JywgJ0wnLCAnXDI0NSd9LCAgeyc8JywgJ2wnLCAnXDI2NSd9LAkvKiBjYXJvbiAqLworICAgIHsnPCcsICdTJywgJ1wyNTEnfSwgIHsnPCcsICdzJywgJ1wyNzEnfSwKKyAgICB7JzwnLCAnVCcsICdcMjUzJ30sICB7JzwnLCAndCcsICdcMjczJ30sCisgICAgeyc8JywgJ1onLCAnXDI1Nid9LCAgeyc8JywgJ3onLCAnXDI3Nid9LAorICAgIHsnPCcsICdDJywgJ1wzMTAnfSwgIHsnPCcsICdjJywgJ1wzNTAnfSwKKyAgICB7JzwnLCAnRScsICdcMzE0J30sICB7JzwnLCAnZScsICdcMzU0J30sCisgICAgeyc8JywgJ0QnLCAnXDMxNyd9LCAgeyc8JywgJ2QnLCAnXDM1Nyd9LAorICAgIHsnPCcsICdOJywgJ1wzMjInfSwgIHsnPCcsICduJywgJ1wzNjInfSwKKyAgICB7JzwnLCAnUicsICdcMzMwJ30sICB7JzwnLCAncicsICdcMzcwJ30sCisgICAgeyc7JywgJ0EnLCAnXDI0MSd9LCAgeyc7JywgJ2EnLCAnXDI2MSd9LAkvKiBvZ29uZWsgKi8KKyAgICB7JzsnLCAnRScsICdcMzEyJ30sICB7JzsnLCAnZScsICdcMzMyJ30sCisgICAgeydcJycsICdaJywgJ1wyNTQnfSwgeydcJycsICd6JywgJ1wyNzQnfSwJLyogYWN1dGUgKi8KKyAgICB7J1wnJywgJ1InLCAnXDMwMCd9LCB7J1wnJywgJ3InLCAnXDM0MCd9LAorICAgIHsnXCcnLCAnTCcsICdcMzA1J30sIHsnXCcnLCAnbCcsICdcMzQ1J30sCisgICAgeydcJycsICdDJywgJ1wzMDYnfSwgeydcJycsICdjJywgJ1wzNDYnfSwKKyAgICB7J1wnJywgJ04nLCAnXDMyMSd9LCB7J1wnJywgJ24nLCAnXDM2MSd9LAorLyogIGNvbGxpc2lvbiB3aGl0aCBTLCBmcm9tIGlzby04ODU5LTkgISEhICovCisgICAgeycsJywgJ1MnLCAnXDI1Mid9LCAgeycsJywgJ3MnLCAnXDI3Mid9LAkvKiBjZWRpbGxhICovCisgICAgeycsJywgJ1QnLCAnXDMzNid9LCAgeycsJywgJ3QnLCAnXDM3Nid9LAorICAgIHsnLicsICdaJywgJ1wyNTcnfSwgIHsnLicsICd6JywgJ1wyNzcnfSwJLyogZG90IGFib3ZlICovCisgICAgeycvJywgJ0wnLCAnXDI0Myd9LCAgeycvJywgJ2wnLCAnXDI2Myd9LAkvKiBzbGFzaCAqLworICAgIHsnLycsICdEJywgJ1wzMjAnfSwgIHsnLycsICdkJywgJ1wzNjAnfSwKKyAgICB7JygnLCAnQScsICdcMzAzJ30sICB7JygnLCAnYScsICdcMzQzJ30sCS8qIGJyZXZlICovCisgICAgeydcMjc1JywgJ08nLCAnXDMyNSd9LCB7J1wyNzUnLCAnbycsICdcMzY1J30sCS8qIGRvdWJsZSBhY3V0ZSAqLworICAgIHsnXDI3NScsICdVJywgJ1wzMzQnfSwgeydcMjc1JywgJ3UnLCAnXDM3NCd9LAorICAgIHsnMCcsICdVJywgJ1wzMzInfSwgIHsnMCcsICd1JywgJ1wzNzInfSwJLyogcmluZyBhYm92ZSAqLworCS8qIGlzby04ODU5LTMgdXNlcyB0aGlzICovCisgICAgeycvJywgJ0gnLCAnXDI0MSd9LCAgeycvJywgJ2gnLCAnXDI2MSd9LAkvKiBzbGFzaCAqLworICAgIHsnPicsICdIJywgJ1wyNDYnfSwgIHsnPicsICdoJywgJ1wyNjYnfSwJLyogY2lyY3VtZmxleCAqLworICAgIHsnPicsICdKJywgJ1wyNTQnfSwgIHsnPicsICdqJywgJ1wyNzQnfSwKKyAgICB7Jz4nLCAnQycsICdcMzA2J30sICB7Jz4nLCAnYycsICdcMzQ2J30sCisgICAgeyc+JywgJ0cnLCAnXDMzMCd9LCAgeyc+JywgJ2cnLCAnXDM3MCd9LAorICAgIHsnPicsICdTJywgJ1wzMzYnfSwgIHsnPicsICdzJywgJ1wzNzYnfSwKKy8qICBjb2xsaXNpb24gd2hpdGggRyggZnJvbSBpc28tODg1OS05ICEhISAgICovCisgICAgeycoJywgJ0cnLCAnXDI1Myd9LCAgeycoJywgJ2cnLCAnXDI3Myd9LAkvKiBicmV2ZSAqLworICAgIHsnKCcsICdVJywgJ1wzMzUnfSwgIHsnKCcsICd1JywgJ1wzNzUnfSwKKy8qICBjb2xsaXNpb24gd2hpdGggSS4gZnJvbSBpc28tODg1OS0zICEhISAgICovCisgICAgeycuJywgJ0knLCAnXDI1MSd9LCAgeycuJywgJ2knLCAnXDI3MSd9LAkvKiBkb3QgYWJvdmUgKi8KKyAgICB7Jy4nLCAnQycsICdcMzA1J30sICB7Jy4nLCAnYycsICdcMzQ1J30sCisgICAgeycuJywgJ0cnLCAnXDMyNSd9LCAgeycuJywgJ2cnLCAnXDM2NSd9LAorCS8qIGlzby04ODU5LTQgdXNlcyB0aGlzICovCisgICAgeycsJywgJ1InLCAnXDI0Myd9LCAgeycsJywgJ3InLCAnXDI2Myd9LAkvKiBjZWRpbGxhICovCisgICAgeycsJywgJ0wnLCAnXDI0Nid9LCAgeycsJywgJ2wnLCAnXDI2Nid9LAorICAgIHsnLCcsICdHJywgJ1wyNTMnfSwgIHsnLCcsICdnJywgJ1wyNzMnfSwKKyAgICB7JywnLCAnTicsICdcMzIxJ30sICB7JywnLCAnbicsICdcMzYxJ30sCisgICAgeycsJywgJ0snLCAnXDMyMyd9LCAgeycsJywgJ2snLCAnXDM2Myd9LAorICAgIHsnficsICdJJywgJ1wyNDUnfSwgIHsnficsICdpJywgJ1wyNjUnfSwJLyogdGlsZGUgKi8KKyAgICB7Jy0nLCAnRScsICdcMjUyJ30sICB7Jy0nLCAnZScsICdcMjcyJ30sCS8qIG1hY3JvbiAqLworICAgIHsnLScsICdBJywgJ1wzMDAnfSwgIHsnLScsICdhJywgJ1wzNDAnfSwKKyAgICB7Jy0nLCAnSScsICdcMzE3J30sICB7Jy0nLCAnaScsICdcMzU3J30sCisgICAgeyctJywgJ08nLCAnXDMyMid9LCAgeyctJywgJ28nLCAnXDM2Mid9LAorICAgIHsnLScsICdVJywgJ1wzMzYnfSwgIHsnLScsICd1JywgJ1wzNzYnfSwKKyAgICB7Jy8nLCAnVCcsICdcMjU0J30sICB7Jy8nLCAndCcsICdcMjc0J30sCS8qIHNsYXNoICovCisgICAgeycuJywgJ0UnLCAnXDMxNCd9LCAgeycuJywgJ2UnLCAnXDM0NCd9LAkvKiBkb3QgYWJvdmUgKi8KKyAgICB7JzsnLCAnSScsICdcMzA3J30sICB7JzsnLCAnaScsICdcMzQ3J30sCS8qIG9nb25layAqLworICAgIHsnOycsICdVJywgJ1wzMzEnfSwgIHsnOycsICd1JywgJ1wzNzEnfSwKKwkvKiBpc28tODg1OS05IHVzZXMgdGhpcyAqLworCS8qIGlzby04ODU5LTkgaGFzIHJlYWxseSBiYWQgY2hvb3NlbiBHKCBTLCBhbmQgSS4gYXMgdGhleSBjb2xsaWRlCisJICogd2hpdGggdGhlIHNhbWUgbGV0dGVycyBvbiBvdGhlciBpc28tODg1OS14ICh0aGF0IGlzIHRoZXkgYXJlIG9uCisJICogZGlmZmVyZW50IHBsYWNlcyA6LSggKSwgaWYgeW91IHVzZSB0dXJraXNoIHVuY29tbWVudCB0aGVzZSBhbmQKKwkgKiBjb21tZW50IG91dCB0aGUgbGluZXMgaW4gaXNvLTg4NTktMiBhbmQgaXNvLTg4NTktMyBzZWN0aW9ucworCSAqIEZJWE1FOiBzaG91bGQgYmUgZHluYW1pYyBhY2NvcmRpbmcgdG8gY2hvc2VuIGxhbmd1YWdlCisJICoJICBpZi93aGVuIFdpbmUgaGFzIHR1cmtpc2ggc3VwcG9ydC4gIAorCSAqLyAKKy8qICBjb2xsaXNpb24gd2hpdGggRyggZnJvbSBpc28tODg1OS0zICEhISAgICovCisvKiAgeycoJywgJ0cnLCAnXDMyMCd9LCAgeycoJywgJ2cnLCAnXDM2MCd9LCAqLwkvKiBicmV2ZSAqLworLyogIGNvbGxpc2lvbiB3aGl0aCBTLCBmcm9tIGlzby04ODU5LTIgISEhICovCisvKiAgeycsJywgJ1MnLCAnXDMzNid9LCAgeycsJywgJ3MnLCAnXDM3Nid9LCAqLwkvKiBjZWRpbGxhICovCisvKiAgY29sbGlzaW9uIHdoaXRoIEkuIGZyb20gaXNvLTg4NTktMyAhISEgICAqLworLyogIHsnLicsICdJJywgJ1wzMzUnfSwgIHsnLicsICdpJywgJ1wzNzUnfSwgKi8JLyogZG90IGFib3ZlICovCiB9OwogCiAKQEAgLTEyNTYsOCArMTM1MywxMyBAQAogICAgICAgICAgICAgaW50IGk7CiAKICAgICAgICAgICAgIGlmICh3cFswXSA9PSAnICcpIHdwWzBdID0gIGRlYWRfY2hhcjsKLSAgICAgICAgICAgIGlmIChkZWFkX2NoYXIgPT0gMHhhOCkgZGVhZF9jaGFyID0gJyInOworICAgICAgICAgICAgaWYgKGRlYWRfY2hhciA9PSAweGEyKSBkZWFkX2NoYXIgPSAnKCc7CisgICAgICAgICAgICBlbHNlIGlmIChkZWFkX2NoYXIgPT0gMHhhOCkgZGVhZF9jaGFyID0gJyInOworCSAgICBlbHNlIGlmIChkZWFkX2NoYXIgPT0gMHhiMikgZGVhZF9jaGFyID0gJzsnOwogICAgICAgICAgICAgZWxzZSBpZiAoZGVhZF9jaGFyID09IDB4YjQpIGRlYWRfY2hhciA9ICdcJyc7CisgICAgICAgICAgICBlbHNlIGlmIChkZWFkX2NoYXIgPT0gMHhiNykgZGVhZF9jaGFyID0gJzwnOworICAgICAgICAgICAgZWxzZSBpZiAoZGVhZF9jaGFyID09IDB4YjgpIGRlYWRfY2hhciA9ICcsJzsKKyAgICAgICAgICAgIGVsc2UgaWYgKGRlYWRfY2hhciA9PSAweGZmKSBkZWFkX2NoYXIgPSAnLic7CiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGFjY2VudF9jaGFycykvc2l6ZW9mKGFjY2VudF9jaGFyc1swXSk7IGkrKykKICAgICAgICAgICAgICAgICBpZiAoKGFjY2VudF9jaGFyc1tpXS5hY19hY2NlbnQgPT0gZGVhZF9jaGFyKSAmJgogICAgICAgICAgICAgICAgICAgICAoYWNjZW50X2NoYXJzW2ldLmFjX2NoYXIgPT0gd3BbMF0pKQpAQCAtMTI2OCw3ICsxMzcwLDcgQEAKICAgICAgICAgICAgIGRlYWRfY2hhciA9IDA7CiAgICAgICAgIH0KICAgICAgICAgZHByaW50Zl9rZXkoc3RkZGViLCAiMSAtPiBQb3N0TWVzc2FnZSglcylcbiIsIFNQWV9HZXRNc2dOYW1lKG1lc3NhZ2UpKTsKLSAgICAgICAgUG9zdE1lc3NhZ2UoIGh3bmQsIG1lc3NhZ2UsIHdwWzBdLCBsUGFyYW0gKTsKKyAgICAgICAgUG9zdE1lc3NhZ2UxNiggaHduZCwgbWVzc2FnZSwgd3BbMF0sIGxQYXJhbSApOwogICAgICAgICByZXR1cm4gVFJVRTsKIAogICAgIGNhc2UgLTEgOgpAQCAtMTI3Niw3ICsxMzc4LDcgQEAKICAgICAgICAgZGVhZF9jaGFyID0gd3BbMF07CiAgICAgICAgIGRwcmludGZfa2V5KCBzdGRkZWIsICItMSAtPiBQb3N0TWVzc2FnZSglcylcbiIsCiAgICAgICAgICAgICAgICAgICAgICBTUFlfR2V0TXNnTmFtZShtZXNzYWdlKSk7Ci0gICAgICAgIFBvc3RNZXNzYWdlKCBod25kLCBtZXNzYWdlLCB3cFswXSwgbFBhcmFtICk7CisgICAgICAgIFBvc3RNZXNzYWdlMTYoIGh3bmQsIG1lc3NhZ2UsIHdwWzBdLCBsUGFyYW0gKTsKICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIHJldHVybiBGQUxTRTsKZGlmZiAtLWdpdCBhL3dpbmRvd3MvbXNnYm94LmMgYi93aW5kb3dzL21zZ2JveC5jCmluZGV4IGQ4YTA5NzguLjI3YTk3OTMgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvbXNnYm94LmMKKysrIGIvd2luZG93cy9tc2dib3guYwpAQCAtNCw3ICs0LDYgQEAKICAqIENvcHlyaWdodCAxOTk1IEJlcm5kIFNjaG1pZHQKICAqLwogCi0jZGVmaW5lIE5PX1RSQU5TSVRJT05fVFlQRVMgIC8qIFRoaXMgZmlsZSBpcyBXaW4zMi1jbGVhbiAqLwogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgImRsZ3MuaCIKZGlmZiAtLWdpdCBhL3dpbmRvd3Mvbm9uY2xpZW50LmMgYi93aW5kb3dzL25vbmNsaWVudC5jCmluZGV4IGQ0MDAxYTEuLmQwNGQ3ZGYgMTAwNjQ0Ci0tLSBhL3dpbmRvd3Mvbm9uY2xpZW50LmMKKysrIGIvd2luZG93cy9ub25jbGllbnQuYwpAQCAtNjQsNyArNjQsOCBAQAogICogQ29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGUgd2luZG93IHJlY3RhbmdsZSBmcm9tIHRoZSBzaXplIG9mIHRoZQogICogY2xpZW50IHJlY3RhbmdsZS4KICAqLwotc3RhdGljIHZvaWQgTkNfQWRqdXN0UmVjdChMUFJFQ1QxNiByZWN0LCBEV09SRCBzdHlsZSwgQk9PTCBtZW51LCBEV09SRCBleFN0eWxlKQorc3RhdGljIHZvaWQgTkNfQWRqdXN0UmVjdCggTFBSRUNUMTYgcmVjdCwgRFdPUkQgc3R5bGUsIEJPT0wzMiBtZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZXhTdHlsZSApCiB7CiAgICAgaWYoc3R5bGUgJiBXU19JQ09OSUMpIHJldHVybjsKICAgICAvKiBEZWNpZGUgaWYgdGhlIHdpbmRvdyB3aWxsIGJlIG1hbmFnZWQgKHNlZSBDcmVhdGVXaW5kb3dFeCkgKi8KQEAgLTQ1Nyw3ICs0NTgsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTkNfRHJhd01heEJ1dHRvbgogICovCi1zdGF0aWMgdm9pZCBOQ19EcmF3TWF4QnV0dG9uKCBIV05EMzIgaHduZCwgSERDMTYgaGRjLCBCT09MIGRvd24gKQorc3RhdGljIHZvaWQgTkNfRHJhd01heEJ1dHRvbiggSFdORDMyIGh3bmQsIEhEQzE2IGhkYywgQk9PTDMyIGRvd24gKQogewogICAgIFJFQ1QzMiByZWN0OwogICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKQEAgLTQ3Nyw3ICs0NzgsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTkNfRHJhd01pbkJ1dHRvbgogICovCi1zdGF0aWMgdm9pZCBOQ19EcmF3TWluQnV0dG9uKCBIV05EMzIgaHduZCwgSERDMTYgaGRjLCBCT09MIGRvd24gKQorc3RhdGljIHZvaWQgTkNfRHJhd01pbkJ1dHRvbiggSFdORDMyIGh3bmQsIEhEQzE2IGhkYywgQk9PTDMyIGRvd24gKQogewogICAgIFJFQ1QzMiByZWN0OwogICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKQEAgLTQ5OSw3ICs1MDAsOCBAQAogICogRHJhdyBhIHdpbmRvdyBmcmFtZSBpbnNpZGUgdGhlIGdpdmVuIHJlY3RhbmdsZSwgYW5kIHVwZGF0ZSB0aGUgcmVjdGFuZ2xlLgogICogVGhlIGNvcnJlY3QgcGVuIGZvciB0aGUgZnJhbWUgbXVzdCBiZSBzZWxlY3RlZCBpbiB0aGUgREMuCiAgKi8KLXN0YXRpYyB2b2lkIE5DX0RyYXdGcmFtZSggSERDMTYgaGRjLCBSRUNUMTYgKnJlY3QsIEJPT0wgZGxnRnJhbWUsIEJPT0wgYWN0aXZlICkKK3N0YXRpYyB2b2lkIE5DX0RyYXdGcmFtZSggSERDMTYgaGRjLCBSRUNUMTYgKnJlY3QsIEJPT0wzMiBkbGdGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTDMyIGFjdGl2ZSApCiB7CiAgICAgc2hvcnQgd2lkdGgsIGhlaWdodCwgdG1wOwogCkBAIC01NzUsNyArNTc3LDcgQEAKICAqCiAgKiBEcmF3IHRoZSBmcmFtZSB1c2VkIHdoZW4gbW92aW5nIG9yIHJlc2l6aW5nIHdpbmRvdy4KICAqLwotc3RhdGljIHZvaWQgTkNfRHJhd01vdmluZ0ZyYW1lKCBIREMxNiBoZGMsIFJFQ1QxNiAqcmVjdCwgQk9PTCB0aGlja2ZyYW1lICkKK3N0YXRpYyB2b2lkIE5DX0RyYXdNb3ZpbmdGcmFtZSggSERDMTYgaGRjLCBSRUNUMTYgKnJlY3QsIEJPT0wzMiB0aGlja2ZyYW1lICkKIHsKICAgICBpZiAodGhpY2tmcmFtZSkgRmFzdFdpbmRvd0ZyYW1lKCBoZGMsIHJlY3QsIFNZU01FVFJJQ1NfQ1hGUkFNRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTWVNNRVRSSUNTX0NZRlJBTUUsIFBBVElOVkVSVCApOwpAQCAtNTkwLDcgKzU5Miw3IEBACiAgKiBUaGUgY29ycmVjdCBwZW4gZm9yIHRoZSB3aW5kb3cgZnJhbWUgbXVzdCBiZSBzZWxlY3RlZCBpbiB0aGUgREMuCiAgKi8KIHN0YXRpYyB2b2lkIE5DX0RyYXdDYXB0aW9uKCBIREMxNiBoZGMsIFJFQ1QxNiAqcmVjdCwgSFdORDMyIGh3bmQsCi0JCQkgICAgRFdPUkQgc3R5bGUsIEJPT0wgYWN0aXZlICkKKwkJCSAgICBEV09SRCBzdHlsZSwgQk9PTDMyIGFjdGl2ZSApCiB7CiAgICAgUkVDVDE2IHIgPSAqcmVjdDsKICAgICBXTkQgKiB3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOwpAQCAtNjQ3LDggKzY0OSw4IEBACiAKICAgICBpZiAoR2V0V2luZG93VGV4dDMyQSggaHduZCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSApKQogICAgIHsKLQlpZiAoYWN0aXZlKSBTZXRUZXh0Q29sb3IoIGhkYywgR2V0U3lzQ29sb3IzMiggQ09MT1JfQ0FQVElPTlRFWFQgKSApOwotCWVsc2UgU2V0VGV4dENvbG9yKCBoZGMsIEdldFN5c0NvbG9yMzIoIENPTE9SX0lOQUNUSVZFQ0FQVElPTlRFWFQgKSApOworCWlmIChhY3RpdmUpIFNldFRleHRDb2xvcjMyKCBoZGMsIEdldFN5c0NvbG9yMzIoIENPTE9SX0NBUFRJT05URVhUICkgKTsKKwllbHNlIFNldFRleHRDb2xvcjMyKCBoZGMsIEdldFN5c0NvbG9yMzIoIENPTE9SX0lOQUNUSVZFQ0FQVElPTlRFWFQgKSApOwogCVNldEJrTW9kZTMyKCBoZGMsIFRSQU5TUEFSRU5UICk7CiAJRHJhd1RleHQxNiggaGRjLCBidWZmZXIsIC0xLCAmciwKICAgICAgICAgICAgICAgICAgICAgRFRfU0lOR0xFTElORSB8IERUX0NFTlRFUiB8IERUX1ZDRU5URVIgfCBEVF9OT1BSRUZJWCApOwpAQCAtMTIzMCw3ICsxMjMyLDcgQEAKIHsKICAgICBNU0cxNiBtc2c7CiAgICAgSERDMzIgaGRjID0gR2V0V2luZG93REMzMiggaHduZCApOwotICAgIEJPT0wgcHJlc3NlZCA9IFRSVUU7CisgICAgQk9PTDMyIHByZXNzZWQgPSBUUlVFOwogCiAgICAgU2V0Q2FwdHVyZTMyKCBod25kICk7CiAgICAgaWYgKHdQYXJhbSA9PSBIVE1JTkJVVFRPTikgTkNfRHJhd01pbkJ1dHRvbiggaHduZCwgaGRjLCBUUlVFICk7CkBAIC0xMjM4LDcgKzEyNDAsNyBAQAogCiAgICAgZG8KICAgICB7Ci0JQk9PTCBvbGRzdGF0ZSA9IHByZXNzZWQ7CisJQk9PTDMyIG9sZHN0YXRlID0gcHJlc3NlZDsKICAgICAgICAgTVNHX0ludGVybmFsR2V0TWVzc2FnZSggJm1zZywgMCwgMCwgMCwgUE1fUkVNT1ZFLCBGQUxTRSApOwogCiAJcHJlc3NlZCA9IChOQ19IYW5kbGVOQ0hpdFRlc3QoIGh3bmQsIG1zZy5wdCApID09IHdQYXJhbSk7CkBAIC0xMjk0LDcgKzEyOTYsNyBAQAogCiAgICAgZG8KICAgICB7Ci0gICAgICAgIEdldE1lc3NhZ2UoIFNFR1BUUl9HRVQobXNnKSwgMCwgMCwgMCApOworICAgICAgICBHZXRNZXNzYWdlMTYoIFNFR1BUUl9HRVQobXNnKSwgMCwgMCwgMCApOwogCXN3aXRjaChtc2ctPm1lc3NhZ2UpCiAJewogCWNhc2UgV01fTEJVVFRPTlVQOgpAQCAtMTMxMSw3ICsxMzEzLDcgQEAKICAgICAgICAgICAgIERpc3BhdGNoTWVzc2FnZTE2KCBtc2cgKTsKICAgICAgICAgICAgIGJyZWFrOwogCX0KLSAgICAgICAgaWYgKCFJc1dpbmRvdyggaHduZCApKQorICAgICAgICBpZiAoIUlzV2luZG93MzIoIGh3bmQgKSkKICAgICAgICAgewogICAgICAgICAgICAgUmVsZWFzZUNhcHR1cmUoKTsKICAgICAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvd2luZG93cy9wYWludGluZy5jIGIvd2luZG93cy9wYWludGluZy5jCmluZGV4IDJjNWU0ZjkuLjc4ZjYwNjIgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvcGFpbnRpbmcuYworKysgYi93aW5kb3dzL3BhaW50aW5nLmMKQEAgLTIzLDcgKzIzLDcgQEAKICAqICAgICAgICAgICBXSU5fVXBkYXRlTkNBcmVhCiAgKgogICovCi12b2lkIFdJTl9VcGRhdGVOQ0FyZWEoV05EKiB3bmQsIEJPT0wgYlVwZGF0ZSkKK3ZvaWQgV0lOX1VwZGF0ZU5DQXJlYShXTkQqIHduZCwgQk9PTDMyIGJVcGRhdGUpCiB7CiAgICAgUE9JTlQxNiBwdCA9IHswLCAwfTsgCiAgICAgSFJHTjMyIGhDbGlwID0gMTsKQEAgLTQxMywxMyArNDEzLDEzIEBACiAgICAgICAgICAgIGZvciAocHBXbmQgPSBsaXN0OyAqcHBXbmQ7IHBwV25kKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHduZFB0ciA9ICpwcFduZDsKLSAgICAgICAgICAgICAgIGlmICghSXNXaW5kb3cod25kUHRyLT5od25kU2VsZikpIGNvbnRpbnVlOworICAgICAgICAgICAgICAgaWYgKCFJc1dpbmRvdzMyKHduZFB0ci0+aHduZFNlbGYpKSBjb250aW51ZTsKICAgICAgICAgICAgICAgIGlmICh3bmRQdHItPmR3U3R5bGUgJiBXU19WSVNJQkxFKQogCSAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgU2V0UmVjdFJnbiggaHJnbiwgd25kUHRyLT5yZWN0V2luZG93LmxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd25kUHRyLT5yZWN0V2luZG93LnRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3bmRQdHItPnJlY3RXaW5kb3cucmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd25kUHRyLT5yZWN0V2luZG93LmJvdHRvbSApOworICAgICAgICAgICAgICAgICAgIFNldFJlY3RSZ24zMiggaHJnbiwgd25kUHRyLT5yZWN0V2luZG93LmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3bmRQdHItPnJlY3RXaW5kb3cudG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd25kUHRyLT5yZWN0V2luZG93LnJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd25kUHRyLT5yZWN0V2luZG93LmJvdHRvbSApOwogICAgICAgICAgICAgICAgICAgIGlmICghQ29tYmluZVJnbjMyKCBocmduLCBocmduLCBocmduVXBkYXRlLCBSR05fQU5EICkpCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIE9mZnNldFJnbjMyKCBocmduLCAtd25kUHRyLT5yZWN0Q2xpZW50LmxlZnQsCkBAIC00MzgsNyArNDM4LDcgQEAKICAgICAgICAgICAgZm9yIChwcFduZCA9IGxpc3Q7ICpwcFduZDsgcHBXbmQrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgd25kUHRyID0gKnBwV25kOwotICAgICAgICAgICAgICAgaWYgKElzV2luZG93KCB3bmRQdHItPmh3bmRTZWxmICkpCisgICAgICAgICAgICAgICBpZiAoSXNXaW5kb3czMiggd25kUHRyLT5od25kU2VsZiApKQogICAgICAgICAgICAgICAgICAgIFBBSU5UX1JlZHJhd1dpbmRvdyggd25kUHRyLT5od25kU2VsZiwgTlVMTCwgMCwgZmxhZ3MsIDAgKTsKIAkgICB9CiAJICAgSGVhcEZyZWUoIFN5c3RlbUhlYXAsIDAsIGxpc3QgKTsKQEAgLTQ4Miw5ICs0ODIsMTggQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBVcGRhdGVXaW5kb3cgICAoVVNFUi4xMjQpIChVU0VSMzIuNTY2KQorICogICAgICAgICAgIFVwZGF0ZVdpbmRvdzE2ICAgKFVTRVIuMTI0KQogICovCi12b2lkIFVwZGF0ZVdpbmRvdyggSFdORDMyIGh3bmQgKQordm9pZCBVcGRhdGVXaW5kb3cxNiggSFdORDE2IGh3bmQgKQoreworICAgIFJlZHJhd1dpbmRvdzMyKCBod25kLCBOVUxMLCAwLCBSRFdfVVBEQVRFTk9XIHwgUkRXX05PQ0hJTERSRU4gKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBVcGRhdGVXaW5kb3czMiAgIChVU0VSMzIuNTY2KQorICovCit2b2lkIFVwZGF0ZVdpbmRvdzMyKCBIV05EMzIgaHduZCApCiB7CiAgICAgUmVkcmF3V2luZG93MzIoIGh3bmQsIE5VTEwsIDAsIFJEV19VUERBVEVOT1cgfCBSRFdfTk9DSElMRFJFTiApOwogfQpAQCAtNTkwLDcgKzU5OSw3IEBACiAJaWYgKHduZFB0ci0+aHJnblVwZGF0ZSA+IDEpCiAJewogCSAgICBIUkdOMzIgaHJnbiA9IENyZWF0ZVJlY3RSZ24zMiggMCwgMCwgMCwgMCApOwotCSAgICBpZiAoR2V0VXBkYXRlUmduKCBod25kLCBocmduLCBlcmFzZSApID09IEVSUk9SKSByZXR1cm4gRkFMU0U7CisJICAgIGlmIChHZXRVcGRhdGVSZ24zMiggaHduZCwgaHJnbiwgZXJhc2UgKSA9PSBFUlJPUikgcmV0dXJuIEZBTFNFOwogCSAgICBHZXRSZ25Cb3gzMiggaHJnbiwgcmVjdCApOwogCSAgICBEZWxldGVPYmplY3QzMiggaHJnbiApOwogCX0KQEAgLTYwMSw5ICs2MTAsMTggQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXRVcGRhdGVSZ24gICAoVVNFUi4yMzcpIChVU0VSMzIuMjk3KQorICogICAgICAgICAgIEdldFVwZGF0ZVJnbjE2ICAgKFVTRVIuMjM3KQogICovCi1JTlQxNiBHZXRVcGRhdGVSZ24oIEhXTkQzMiBod25kLCBIUkdOMzIgaHJnbiwgQk9PTDMyIGVyYXNlICkKK0lOVDE2IEdldFVwZGF0ZVJnbjE2KCBIV05EMTYgaHduZCwgSFJHTjE2IGhyZ24sIEJPT0wxNiBlcmFzZSApCit7CisgICAgcmV0dXJuIEdldFVwZGF0ZVJnbjMyKCBod25kLCBocmduLCBlcmFzZSApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldFVwZGF0ZVJnbjMyICAgKFVTRVIzMi4yOTcpCisgKi8KK0lOVDMyIEdldFVwZGF0ZVJnbjMyKCBIV05EMzIgaHduZCwgSFJHTjMyIGhyZ24sIEJPT0wzMiBlcmFzZSApCiB7CiAgICAgSU5UMzIgcmV0dmFsOwogICAgIFdORCAqIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7CkBAIC02MTEsNyArNjI5LDcgQEAKIAogICAgIGlmICh3bmRQdHItPmhyZ25VcGRhdGUgPD0gMSkKICAgICB7Ci0gICAgICAgIFNldFJlY3RSZ24oIGhyZ24sIDAsIDAsIDAsIDAgKTsKKyAgICAgICAgU2V0UmVjdFJnbjMyKCBocmduLCAwLCAwLCAwLCAwICk7CiAgICAgICAgIHJldHVybiBOVUxMUkVHSU9OOwogICAgIH0KICAgICByZXR2YWwgPSBDb21iaW5lUmduMzIoIGhyZ24sIHduZFB0ci0+aHJnblVwZGF0ZSwgMCwgUkdOX0NPUFkgKTsKQEAgLTYyMSwxOCArNjM5LDI3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgRXhjbHVkZVVwZGF0ZVJnbiAgIChVU0VSLjIzOCkgKFVTRVIzMi4xOTQpCisgKiAgICAgICAgICAgRXhjbHVkZVVwZGF0ZVJnbjE2ICAgKFVTRVIuMjM4KQogICovCi1JTlQxNiBFeGNsdWRlVXBkYXRlUmduKCBIREMzMiBoZGMsIEhXTkQzMiBod25kICkKK0lOVDE2IEV4Y2x1ZGVVcGRhdGVSZ24xNiggSERDMTYgaGRjLCBIV05EMTYgaHduZCApCiB7Ci0gICAgUkVDVDE2IHJlY3Q7CisgICAgcmV0dXJuIEV4Y2x1ZGVVcGRhdGVSZ24zMiggaGRjLCBod25kICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgRXhjbHVkZVVwZGF0ZVJnbjMyICAgKFVTRVIzMi4xOTQpCisgKi8KK0lOVDMyIEV4Y2x1ZGVVcGRhdGVSZ24zMiggSERDMzIgaGRjLCBIV05EMzIgaHduZCApCit7CisgICAgUkVDVDMyIHJlY3Q7CiAgICAgV05EICogd25kUHRyOwogCiAgICAgaWYgKCEod25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKSkpIHJldHVybiBFUlJPUjsKIAogICAgIGlmICh3bmRQdHItPmhyZ25VcGRhdGUpCiAgICAgewotCUlOVDE2ICByZXQ7CisJSU5UMzIgcmV0OwogCUhSR04zMiBocmduID0gQ3JlYXRlUmVjdFJnbjMyKHduZFB0ci0+cmVjdFdpbmRvdy5sZWZ0IC0gd25kUHRyLT5yZWN0Q2xpZW50LmxlZnQsCiAJCQkJICAgICAgd25kUHRyLT5yZWN0V2luZG93LnRvcCAtIHduZFB0ci0+cmVjdENsaWVudC50b3AsCiAJCQkJICAgICAgd25kUHRyLT5yZWN0Q2xpZW50LnJpZ2h0IC0gd25kUHRyLT5yZWN0Q2xpZW50LmxlZnQsCkBAIC02NDYsNyArNjczLDcgQEAKIAlEZWxldGVPYmplY3QzMiggaHJnbiApOwogCXJldHVybiByZXQ7CiAgICAgfSAKLSAgICByZXR1cm4gR2V0Q2xpcEJveDE2KGhkYywgJnJlY3QpOworICAgIHJldHVybiBHZXRDbGlwQm94MzIoIGhkYywgJnJlY3QgKTsKIH0KIAogCmRpZmYgLS1naXQgYS93aW5kb3dzL3Byb3BlcnR5LmMgYi93aW5kb3dzL3Byb3BlcnR5LmMKaW5kZXggMDc2MjU1OC4uYWI2ZGFmNCAxMDA2NDQKLS0tIGEvd2luZG93cy9wcm9wZXJ0eS5jCisrKyBiL3dpbmRvd3MvcHJvcGVydHkuYwpAQCAtNCw3ICs0LDYgQEAKICAqIENvcHlyaWdodCAxOTk1LCAxOTk2IEFsZXhhbmRyZSBKdWxsaWFyZAogICovCiAKLSNkZWZpbmUgTk9fVFJBTlNJVElPTl9UWVBFUyAgLyogVGhpcyBmaWxlIGlzIFdpbjMyLWNsZWFuICovCiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSAid2luLmgiCiAjaW5jbHVkZSAiaGVhcC5oIgpkaWZmIC0tZ2l0IGEvd2luZG93cy9xdWV1ZS5jIGIvd2luZG93cy9xdWV1ZS5jCmluZGV4IGRjOTlhZWQuLmE3NDk0NWMgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvcXVldWUuYworKysgYi93aW5kb3dzL3F1ZXVlLmMKQEAgLTMyOCw3ICszMjgsNyBAQAogICAgIGRwcmludGZfbXNnKHN0ZGRlYiwgIlx0cmNtOiBjYWxsaW5nIHduZHByb2MgLSAlMDR4ICUwNHggJTA0eCAlMDh4XG4iLAogICAgICAgICAgICAgc2VuZGVyUS0+aFduZCwgc2VuZGVyUS0+bXNnLCBzZW5kZXJRLT53UGFyYW0sICh1bnNpZ25lZClzZW5kZXJRLT5sUGFyYW0gKTsKIAotICAgIGlmIChJc1dpbmRvdyggc2VuZGVyUS0+aFduZCApKQorICAgIGlmIChJc1dpbmRvdzMyKCBzZW5kZXJRLT5oV25kICkpCiAgICAgewogICAgICAgICBEV09SRCBleHRyYUluZm8gPSBxdWV1ZS0+R2V0TWVzc2FnZUV4dHJhSW5mb1ZhbDsKICAgICAgICAgcXVldWUtPkdldE1lc3NhZ2VFeHRyYUluZm9WYWwgPSBzZW5kZXJRLT5HZXRNZXNzYWdlRXh0cmFJbmZvVmFsOwpAQCAtMzQyLDcgKzM0Miw3IEBACiAgICAgZWxzZSBkcHJpbnRmX21zZyhzdGRkZWIsIlx0cmNtOiBiYWQgaFduZFxuIik7CiAKICAgICAvKiBSZXR1cm4gdGhlIHJlc3VsdCB0byB0aGUgc2VuZGVyIHRhc2sgKi8KLSAgICBSZXBseU1lc3NhZ2UoIHJlc3VsdCApOworICAgIFJlcGx5TWVzc2FnZTE2KCByZXN1bHQgKTsKIAogICAgIHF1ZXVlLT5JblNlbmRNZXNzYWdlSGFuZGxlID0gcHJldlNlbmRlcjsKICAgICBxdWV1ZS0+c21SZXN1bHRDdXJyZW50ICAgICA9IHByZXZDdHJsUHRyOwpAQCAtNDg4LDcgKzQ4OCw3IEBACiAgKgogICogV2FrZSBhIHF1ZXVlIHVwb24gcmVjZXB0aW9uIG9mIGEgaGFyZHdhcmUgZXZlbnQuCiAgKi8KLXN0YXRpYyB2b2lkIFFVRVVFX1dha2VTb21lb25lKCBVSU5UIG1lc3NhZ2UgKQorc3RhdGljIHZvaWQgUVVFVUVfV2FrZVNvbWVvbmUoIFVJTlQzMiBtZXNzYWdlICkKIHsKICAgICBXTkQqCSAgd25kUHRyID0gTlVMTDsKICAgICBXT1JEICAgICAgICAgIHdha2VCaXQ7CkBAIC03NjMsOSArNzYzLDkgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXRRdWV1ZVN0YXR1cyAgIChVU0VSLjMzNCkKKyAqICAgICAgICAgICBHZXRRdWV1ZVN0YXR1czE2ICAgKFVTRVIuMzM0KQogICovCi1EV09SRCBHZXRRdWV1ZVN0YXR1cyggVUlOVCBmbGFncyApCitEV09SRCBHZXRRdWV1ZVN0YXR1czE2KCBVSU5UMTYgZmxhZ3MgKQogewogICAgIE1FU1NBR0VRVUVVRSAqcXVldWU7CiAgICAgRFdPUkQgcmV0OwpkaWZmIC0tZ2l0IGEvd2luZG93cy9zY3JvbGwuYyBiL3dpbmRvd3Mvc2Nyb2xsLmMKaW5kZXggNjgyYjQzOC4uODUzNzFiZiAxMDA2NDQKLS0tIGEvd2luZG93cy9zY3JvbGwuYworKysgYi93aW5kb3dzL3Njcm9sbC5jCkBAIC03LDcgKzcsNiBAQAogICoKICAqLwogCi0jZGVmaW5lIE5PX1RSQU5TSVRJT05fVFlQRVMgIC8qIFRoaXMgZmlsZSBpcyBXaW4zMi1jbGVhbiAqLwogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJjbGFzcy5oIgpAQCAtMTEzLDcgKzExMiw3IEBACiAJUE9JTlQzMglwdDsKIAlHZXRDYXJldFBvczMyKCZwdCk7CiAJcHQueCArPSBkeDsgcHQueSArPSBkeTsKLQlTZXRDYXJldFBvcyhwdC54LCBwdC55KTsKKwlTZXRDYXJldFBvczMyKHB0LngsIHB0LnkpOwogCVNob3dDYXJldDMyKGhDYXJldFduZCk7CiAgICAgfQogICAgIHJldHVybiBUUlVFOwpAQCAtMjA0LDggKzIwMyw4IEBACiAgICAgICAgIC8qIGNoYW5nZSBkZXZpY2UgY2xpcHBpbmcgcmVnaW9uIGRpcmVjdGx5ICovCiAKICAgICAgICAgQ29tYmluZVJnbjMyKCBocmduU2Nyb2xsQ2xpcCwgaHJnbkNsaXAsIDAsIFJHTl9DT1BZICk7Ci0gICAgICAgIFNldFJlY3RSZ24oIGhyZ25DbGlwLCByRENsaXAubGVmdCwgckRDbGlwLnRvcCwKLQkJCSAgICAgIHJEQ2xpcC5yaWdodCwgckRDbGlwLmJvdHRvbSApOworICAgICAgICBTZXRSZWN0UmduMzIoIGhyZ25DbGlwLCByRENsaXAubGVmdCwgckRDbGlwLnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICByRENsaXAucmlnaHQsIHJEQ2xpcC5ib3R0b20gKTsKIAogCUNMSVBQSU5HX1VwZGF0ZUdDUmVnaW9uKCBkYyApOwogICAgICAgfQpAQCAtMjQ2LDggKzI0NSw4IEBACiAgICAgewogCUNvbWJpbmVSZ24zMiggaHJnbkNsaXAsIGhyZ25TY3JvbGxDbGlwLCAwLCBSR05fQ09QWSApOwogCUNMSVBQSU5HX1VwZGF0ZUdDUmVnaW9uKCBkYyApOwotCVNldFJlY3RSZ24oIGhyZ25TY3JvbGxDbGlwLCByRENsaXAubGVmdCwgckRDbGlwLnRvcCwgCi0JCQkJICAgIHJEQ2xpcC5yaWdodCwgckRDbGlwLmJvdHRvbSApOworCVNldFJlY3RSZ24zMiggaHJnblNjcm9sbENsaXAsIHJEQ2xpcC5sZWZ0LCByRENsaXAudG9wLCAKKyAgICAgICAgICAgICAgICAgICAgICByRENsaXAucmlnaHQsIHJEQ2xpcC5ib3R0b20gKTsKICAgICB9CiAgICAgZWxzZQogICAgICAgICBTZWxlY3RDbGlwUmduMzIoIGhkYywgMCApOwpAQCAtMjczLDcgKzI3Miw3IEBACiAgICAgICAgICAgaWYgKGR4ID4gMCkgcmVjdC5yaWdodCA9IHJlY3QubGVmdCArIGR4OwogICAgICAgICAgIGVsc2UgaWYgKGR4IDwgMCkgcmVjdC5sZWZ0ID0gcmVjdC5yaWdodCArIGR4OwogICAgICAgICAgIGVsc2UgU2V0UmVjdEVtcHR5MzIoICZyZWN0ICk7Ci0gICAgICAgICAgU2V0UmVjdFJnbiggaHJnbiwgcmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20gKTsKKyAgICAgICAgICBTZXRSZWN0UmduMzIoIGhyZ24sIHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tICk7CiAKICAgICAgICAgICByZWN0ID0gckRDbGlwOwkJCQkvKiBob3Jpem9udGFsIGJhbmQgKi8KICAgICAgICAgICBpZiAoZHkgPiAwKSByZWN0LmJvdHRvbSA9IHJlY3QudG9wICsgZHk7CkBAIC00NDksNyArNDQ4LDcgQEAKIAogCWlmKCBiQ2FyZXQgKQogCXsKLQkgICAgU2V0Q2FyZXRQb3MoIHJjLmxlZnQgKyBkeCwgcmMudG9wICsgZHkgKTsKKwkgICAgU2V0Q2FyZXRQb3MzMiggcmMubGVmdCArIGR4LCByYy50b3AgKyBkeSApOwogCSAgICBTaG93Q2FyZXQzMigwKTsKIAl9CiAKZGlmZiAtLWdpdCBhL3dpbmRvd3Mvc3lzbWV0cmljcy5jIGIvd2luZG93cy9zeXNtZXRyaWNzLmMKaW5kZXggOGJiZmI1ZS4uZDYzNzUzZCAxMDA2NDQKLS0tIGEvd2luZG93cy9zeXNtZXRyaWNzLmMKKysrIGIvd2luZG93cy9zeXNtZXRyaWNzLmMKQEAgLTMsMTAgKzMsOSBAQAogICoKICAqIENvcHlyaWdodCAxOTk0IEFsZXhhbmRyZSBKdWxsaWFyZAogICoKLXN0YXRpYyBjaGFyIENvcHlyaWdodFtdID0gIkNvcHlyaWdodCAgQWxleGFuZHJlIEp1bGxpYXJkLCAxOTk0IjsKLSovCisgKi8KIAotI2luY2x1ZGUgPFgxMS9YbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlICJnZGkuaCIKICNpbmNsdWRlICJzeXNtZXRyaWNzLmgiCiAKQEAgLTYyLDcgKzYxLDQ4IEBACiAgICAgc3lzTWV0cmljc1tTTV9NRU5VRFJPUEFMSUdOTUVOVF0gPSBHZXRQcm9maWxlSW50MzJBKCAid2luZG93cyIsIk1lbnVEcm9wQWxpZ25tZW50IiwgMCApOwogICAgIHN5c01ldHJpY3NbU01fUEVOV0lORE9XU10gPSAwOwogICAgIHN5c01ldHJpY3NbU01fREJDU0VOQUJMRURdID0gMDsKKyAgICAvKiBXaW4zMiBhZGRpdGlvbnMgKi8KKyAgICBzeXNNZXRyaWNzW1NNX0NNT1VTRUJVVFRPTlNdID0gMzsgLyogRklYTUU6IHF1ZXJ5IFggb24gdGhhdCBvbmUgKi8KKyAgICBzeXNNZXRyaWNzW1NNX1NFQ1VSRV0gPSAwOworICAgIHN5c01ldHJpY3NbU01fQ1hFREdFXSA9IFNZU01FVFJJQ1NfQ1hCT1JERVI7CisgICAgc3lzTWV0cmljc1tTTV9DWUVER0VdID0gU1lTTUVUUklDU19DWUJPUkRFUjsKKyAgICBzeXNNZXRyaWNzW1NNX0NYTUlOU1BBQ0lOR10gPSBTWVNNRVRSSUNTX0NZQk9SREVSOworCisvKgorU01fQ1hFREdFICAgICAgICAgICAgICAgNDUKK1NNX0NZRURHRSAgICAgICAgICAgICAgIDQ2CitTTV9DWE1JTlNQQUNJTkcgICAgICAgICA0NworU01fQ1lNSU5TUEFDSU5HICAgICAgICAgNDgKK1NNX0NYU01JQ09OICAgICAgICAgICAgIDQ5CitTTV9DWVNNSUNPTiAgICAgICAgICAgICA1MAorU01fQ1lTTUNBUFRJT04gICAgICAgICAgNTEKK1NNX0NYU01TSVpFICAgICAgICAgICAgIDUyCitTTV9DWVNNU0laRSAgICAgICAgICAgICA1MworU01fQ1hNRU5VU0laRSAgICAgICAgICAgNTQKK1NNX0NZTUVOVVNJWkUgICAgICAgICAgIDU1CitTTV9BUlJBTkdFICAgICAgICAgICAgICA1NgorU01fQ1hNSU5JTUlaRUQgICAgICAgICAgNTcKK1NNX0NZTUlOSU1JWkVEICAgICAgICAgIDU4CitTTV9DWE1BWFRSQUNLICAgICAgICAgICA1OQorU01fQ1lNQVhUUkFDSyAgICAgICAgICAgNjAKK1NNX0NYTUFYSU1JWkVEICAgICAgICAgIDYxCitTTV9DWU1BWElNSVpFRCAgICAgICAgICA2MgorICovCisgICAgc3lzTWV0cmljc1tTTV9ORVRXT1JLXSA9IDE7CisgICAgc3lzTWV0cmljc1tTTV9DTEVBTkJPT1RdID0gMDsgLyogMCAtIG9rLCAxIC0gZmFpbHNhZmUsIDIgLSBmYWlsc2FmZSAmIG5ldCAqLworIC8qCitTTV9DWERSQUcgICAgICAgICAgICAgICA2OAorU01fQ1lEUkFHICAgICAgICAgICAgICAgNjkKKyAgKi8KKyAgICBzeXNNZXRyaWNzW1NNX1NIT1dTT1VORFNdID0gMTsKKyAvKgorU01fQ1hNRU5VQ0hFQ0sgICAgICAgICAgNzEKK1NNX0NZTUVOVUNIRUNLICAgICAgICAgIDcyCisgICovCisgICAgc3lzTWV0cmljc1tTTV9TTE9XTUFDSElORV0gPSAwOyAvKiBGSVhNRTogcGVyaGFwcyBkZWNpZGUgb24gdHlwZSBvZiBwcm9jICovCisgICAgc3lzTWV0cmljc1tTTV9NSURFQVNURU5BQkxFRF0gPSAwOyAvKiBGSVhNRTogMSBpZiBlbmFibGVkICovCiAgICAgc3lzTWV0cmljc1tTTV9DTUVUUklDU10gPSBTTV9DTUVUUklDUzsKKwogfQogCiAKZGlmZiAtLWdpdCBhL3dpbmRvd3MvdGltZXIuYyBiL3dpbmRvd3MvdGltZXIuYwppbmRleCA0ZjRlZjY3Li45M2Y4NTYzIDEwMDY0NAotLS0gYS93aW5kb3dzL3RpbWVyLmMKKysrIGIvd2luZG93cy90aW1lci5jCkBAIC00LDcgKzQsNiBAQAogICogQ29weXJpZ2h0IDE5OTMgQWxleGFuZHJlIEp1bGxpYXJkCiAgKi8KIAotI2RlZmluZSBOT19UUkFOU0lUSU9OX1RZUEVTICAvKiBUaGlzIGZpbGUgaXMgV2luMzItY2xlYW4gKi8KICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAicXVldWUuaCIKICNpbmNsdWRlICJ3aW5wcm9jLmgiCmRpZmYgLS1naXQgYS93aW5kb3dzL3dpbi5jIGIvd2luZG93cy93aW4uYwppbmRleCBkYTQ0MDczLi5kMjczYjJiIDEwMDY0NAotLS0gYS93aW5kb3dzL3dpbi5jCisrKyBiL3dpbmRvd3Mvd2luLmMKQEAgLTI3Nyw3ICsyNzcsNyBAQAogewogICAgIExQUE9JTlQxNiBscHB0ID0gKExQUE9JTlQxNikmbFZhbHVlOwogICAgIFdORCAgICAgKnduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7Ci0gICAgQk9PTCAgICAgYk1vdXNlID0gKChldmVudCA8PSBXTV9NT1VTRUxBU1QpICYmIChldmVudCA+PSBXTV9NT1VTRUZJUlNUKSk7CisgICAgQk9PTDMyIGJNb3VzZSA9ICgoZXZlbnQgPD0gV01fTU9VU0VMQVNUKSAmJiAoZXZlbnQgPj0gV01fTU9VU0VGSVJTVCkpOwogCiAgICAgLyogaWYgbFZhbHVlIGNvbnRhaW5zIGN1cnNvciBjb29yZGluYXRlcyB0aGV5IGhhdmUgdG8gYmUKICAgICAgKiBtYXBwZWQgdG8gdGhlIGNsaWVudCBhcmVhIG9mIHBhcmVudCB3aW5kb3cgKi8KQEAgLTQ4Myw3ICs0ODMsNyBAQAogICAgIGlmIChjcy0+aHduZFBhcmVudCkKICAgICB7CiAJLyogTWFrZSBzdXJlIHBhcmVudCBpcyB2YWxpZCAqLwotICAgICAgICBpZiAoIUlzV2luZG93KCBjcy0+aHduZFBhcmVudCApKQorICAgICAgICBpZiAoIUlzV2luZG93MzIoIGNzLT5od25kUGFyZW50ICkpCiAgICAgICAgIHsKICAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIkNyZWF0ZVdpbmRvd0V4OiBiYWQgcGFyZW50ICUwNHhcbiIsIGNzLT5od25kUGFyZW50ICk7CiAJICAgIHJldHVybiAwOwpAQCAtNzE1LDcgKzcxNSw3IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKGNzLT5oTWVudSkgU2V0TWVudTMyKCBod25kLCBjcy0+aE1lbnUgKTsKICAgICB9Ci0gICAgZWxzZSB3bmRQdHItPndJRG1lbnUgPSAoVUlOVCljcy0+aE1lbnU7CisgICAgZWxzZSB3bmRQdHItPndJRG1lbnUgPSAoVUlOVDMyKWNzLT5oTWVudTsKIAogICAgIC8qIFNlbmQgdGhlIFdNX0NSRUFURSBtZXNzYWdlIAogICAgICAqIFBlcmhhcHMgd2Ugc2hvdWxkbid0IGFsbG93IHdpZHRoL2hlaWdodCBjaGFuZ2VzIGFzIHdlbGwuIApAQCAtNzQ2LDcgKzc0Niw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIFdJTl9TZW5kUGFyZW50Tm90aWZ5KCBod25kLCBXTV9DUkVBVEUsIHduZFB0ci0+d0lEbWVudSwgKExQQVJBTSlod25kICk7Ci0gICAgICAgICAgICBpZiAoIUlzV2luZG93KGh3bmQpKSByZXR1cm4gMDsKKyAgICAgICAgICAgIGlmICghSXNXaW5kb3czMihod25kKSkgcmV0dXJuIDA7CiAKICAgICAgICAgICAgIC8qIFNob3cgdGhlIHdpbmRvdywgbWF4aW1pemluZyBvciBtaW5pbWl6aW5nIGlmIG5lZWRlZCAqLwogCkBAIC05NDgsMTIgKzk0OCwxMiBAQAogCiAgIFdJTl9DaGVja0ZvY3VzKHBXbmQpOwogCi0gIGlmKCBDQVJFVF9HZXRId25kKCkgPT0gcFduZC0+aHduZFNlbGYgKSBEZXN0cm95Q2FyZXQoKTsKKyAgaWYoIENBUkVUX0dldEh3bmQoKSA9PSBwV25kLT5od25kU2VsZiApIERlc3Ryb3lDYXJldDMyKCk7CiAgIGlmKCAhcFduZC0+d2luZG93ICkgQ0xJUEJPQVJEX0Rpc093biggcFduZCApOyAKICAgCiAgIFNlbmRNZXNzYWdlMzJBKCBwV25kLT5od25kU2VsZiwgV01fREVTVFJPWSwgMCwgMCk7CiAKLSAgaWYoICFJc1dpbmRvdyhwV25kLT5od25kU2VsZikgKQorICBpZiggIUlzV2luZG93MzIocFduZC0+aHduZFNlbGYpICkKICAgewogICAgIGRwcmludGZfd2luKHN0ZGRlYiwiXHRkZXN0cm95ZWQgaXRzZWxmIHdoaWxlIGluIFdNX0RFU1RST1khXG4iKTsKICAgICByZXR1cm47CkBAIC0xMDAzLDcgKzEwMDMsNyBAQAogCiAgICAgaWYoICFRVUVVRV9Jc0Rvb21lZFF1ZXVlKHduZFB0ci0+aG1lbVRhc2tRKSApCiAJIFdJTl9TZW5kUGFyZW50Tm90aWZ5KCBod25kLCBXTV9ERVNUUk9ZLCB3bmRQdHItPndJRG1lbnUsIChMUEFSQU0paHduZCApOwotICAgIGlmKCAhSXNXaW5kb3coaHduZCkgKSByZXR1cm4gVFJVRTsKKyAgICBpZiAoIUlzV2luZG93MzIoaHduZCkpIHJldHVybiBUUlVFOwogCiAgICAgaWYoIHduZFB0ci0+d2luZG93ICkgQ0xJUEJPQVJEX0Rpc093biggd25kUHRyICk7IC8qIGJlZm9yZSB3aW5kb3cgaXMgdW5tYXBwZWQgKi8KIApAQCAtMTAxNCw3ICsxMDE0LDcgQEAKICAgICAgICAgU2V0V2luZG93UG9zMzIoIGh3bmQsIDAsIDAsIDAsIDAsIDAsIFNXUF9ISURFV0lORE9XIHwKIAkJICAgICAgICBTV1BfTk9BQ1RJVkFURXxTV1BfTk9aT1JERVJ8U1dQX05PTU9WRXxTV1BfTk9TSVpFfAogCQkgICAgICAgICgoUVVFVUVfSXNEb29tZWRRdWV1ZSh3bmRQdHItPmhtZW1UYXNrUSkpP1NXUF9ERUZFUkVSQVNFOjApICk7Ci0JaWYoICFJc1dpbmRvdyhod25kKSApIHJldHVybiBUUlVFOworCWlmICghSXNXaW5kb3czMihod25kKSkgcmV0dXJuIFRSVUU7CiAgICAgfQogCiAgICAgICAvKiBSZWN1cnNpdmVseSBkZXN0cm95IG93bmVkIHdpbmRvd3MgKi8KQEAgLTEwNDgsNyArMTA0OCw3IEBACiAgICAgICAvKiBTZW5kIGRlc3Ryb3kgbWVzc2FnZXMgKi8KIAogICAgIFdJTl9TZW5kRGVzdHJveU1zZyggd25kUHRyICk7Ci0gICAgaWYoICFJc1dpbmRvdyhod25kKSApIHJldHVybiBUUlVFOworICAgIGlmICghSXNXaW5kb3czMihod25kKSkgcmV0dXJuIFRSVUU7CiAKICAgICAgIC8qIFVubGluayBub3cgc28gd2Ugd29uJ3QgYm90aGVyIHdpdGggdGhlIGNoaWxkcmVuIGxhdGVyIG9uICovCiAKQEAgLTEzNTcsOSArMTM1NywxOCBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkgICAgIEdldFdpbmRvd1dvcmQgICAgKFVTRVIuMTMzKSAoVVNFUjMyLjMxMykKKyAqCSAgICAgR2V0V2luZG93V29yZDE2ICAgIChVU0VSLjEzMykKICAqLwotV09SRCBHZXRXaW5kb3dXb3JkKCBIV05EMzIgaHduZCwgSU5UMzIgb2Zmc2V0ICkKK1dPUkQgR2V0V2luZG93V29yZDE2KCBIV05EMTYgaHduZCwgSU5UMTYgb2Zmc2V0ICkKK3sKKyAgICByZXR1cm4gR2V0V2luZG93V29yZDMyKCBod25kLCBvZmZzZXQgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJICAgICBHZXRXaW5kb3dXb3JkMzIgICAgKFVTRVIzMi4zMTMpCisgKi8KK1dPUkQgR2V0V2luZG93V29yZDMyKCBIV05EMzIgaHduZCwgSU5UMzIgb2Zmc2V0ICkKIHsKICAgICBXTkQgKiB3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOwogICAgIGlmICghd25kUHRyKSByZXR1cm4gMDsKQEAgLTEzOTYsOSArMTQwNSwxOCBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkgICAgIFNldFdpbmRvd1dvcmQgICAgKFVTRVIuMTM0KSAoVVNFUjMyLjUyMykKKyAqCSAgICAgU2V0V2luZG93V29yZDE2ICAgIChVU0VSLjEzNCkKICAqLwotV09SRCBTZXRXaW5kb3dXb3JkKCBIV05EMzIgaHduZCwgSU5UMzIgb2Zmc2V0LCBXT1JEIG5ld3ZhbCApCitXT1JEIFNldFdpbmRvd1dvcmQxNiggSFdORDE2IGh3bmQsIElOVDE2IG9mZnNldCwgV09SRCBuZXd2YWwgKQoreworICAgIHJldHVybiBTZXRXaW5kb3dXb3JkMzIoIGh3bmQsIG9mZnNldCwgbmV3dmFsICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCSAgICAgU2V0V2luZG93V29yZDMyICAgIChVU0VSMzIuNTIzKQorICovCitXT1JEIFNldFdpbmRvd1dvcmQzMiggSFdORDMyIGh3bmQsIElOVDMyIG9mZnNldCwgV09SRCBuZXd2YWwgKQogewogICAgIFdPUkQgKnB0ciwgcmV0dmFsOwogICAgIFdORCAqIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7CkBAIC0xNDk5LDcgKzE1MTcsNyBAQAogICAgIHsKICAgICAgICAgY2FzZSBHV0xfSUQ6CiAgICAgICAgIGNhc2UgR1dMX0hJTlNUQU5DRToKLSAgICAgICAgICAgIHJldHVybiBTZXRXaW5kb3dXb3JkKCBod25kLCBvZmZzZXQsIChXT1JEKW5ld3ZhbCApOworICAgICAgICAgICAgcmV0dXJuIFNldFdpbmRvd1dvcmQzMiggaHduZCwgb2Zmc2V0LCAoV09SRCluZXd2YWwgKTsKIAljYXNlIEdXTF9XTkRQUk9DOgogICAgICAgICAgICAgcmV0dmFsID0gKExPTkcpV0lOUFJPQ19HZXRQcm9jKCB3bmRQdHItPndpbnByb2MsIHR5cGUgKTsKICAgICAgICAgICAgIFdJTlBST0NfU2V0UHJvYyggJnduZFB0ci0+d2lucHJvYywgKFdORFBST0MxNiluZXd2YWwsIHR5cGUgKTsKQEAgLTE2NjAsMTAgKzE2NzgsMjAgQEAKICAgICByZXR1cm4gU2VuZE1lc3NhZ2UzMlcoIGh3bmQsIFdNX0dFVFRFWFRMRU5HVEgsIDAsIDAgKTsKIH0KIAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICBJc1dpbmRvdyAgIChVU0VSLjQ3KSAoVVNFUjMyLjM0NykKKyAqICAgICAgICAgSXNXaW5kb3cxNiAgIChVU0VSLjQ3KQogICovCi1CT09MMTYgSXNXaW5kb3coIEhXTkQzMiBod25kICkKK0JPT0wxNiBJc1dpbmRvdzE2KCBIV05EMTYgaHduZCApCit7CisgICAgcmV0dXJuIElzV2luZG93MzIoIGh3bmQgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICBJc1dpbmRvdzMyICAgKFVTRVIzMi4zNDcpCisgKi8KK0JPT0wzMiBJc1dpbmRvdzMyKCBIV05EMzIgaHduZCApCiB7CiAgICAgV05EICogd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKICAgICByZXR1cm4gKCh3bmRQdHIgIT0gTlVMTCkgJiYgKHduZFB0ci0+ZHdNYWdpYyA9PSBXTkRfTUFHSUMpKTsKQEAgLTE3MzAsNyArMTc1OCw3IEBACiAgICAgaWYgKGh3bmROZXdQYXJlbnQpIHduZFB0ci0+cGFyZW50ID0gcFduZFBhcmVudDsKICAgICBXSU5fTGlua1dpbmRvdyhod25kQ2hpbGQsIEhXTkRfQk9UVE9NKTsKICAgICAKLSAgICBpZiAoSXNXaW5kb3dWaXNpYmxlMzIoaHduZENoaWxkKSkgVXBkYXRlV2luZG93KGh3bmRDaGlsZCk7CisgICAgaWYgKElzV2luZG93VmlzaWJsZTMyKGh3bmRDaGlsZCkpIFVwZGF0ZVdpbmRvdzMyKGh3bmRDaGlsZCk7CiAgICAgCiAgICAgcmV0dXJuIG9sZFBhcmVudDsKIH0KQEAgLTE5ODEsNyArMjAwOSw3IEBACiAgICAgZm9yIChwcFduZCA9IGxpc3Q7ICpwcFduZDsgcHBXbmQrKykKICAgICB7CiAgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSB3aW5kb3cgc3RpbGwgZXhpc3RzICovCi0gICAgICAgIGlmICghSXNXaW5kb3coKCpwcFduZCktPmh3bmRTZWxmKSkgY29udGludWU7CisgICAgICAgIGlmICghSXNXaW5kb3czMigoKnBwV25kKS0+aHduZFNlbGYpKSBjb250aW51ZTsKICAgICAgICAgaWYgKCFscEVudW1GdW5jKCAoKnBwV25kKS0+aHduZFNlbGYsIGxQYXJhbSApKSBicmVhazsKICAgICB9CiAgICAgSGVhcEZyZWUoIFN5c3RlbUhlYXAsIDAsIGxpc3QgKTsKQEAgLTIwMTYsNyArMjA0NCw3IEBACiAgICAgZm9yIChwcFduZCA9IGxpc3Q7ICpwcFduZDsgcHBXbmQrKykKICAgICB7CiAgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSB3aW5kb3cgc3RpbGwgZXhpc3RzICovCi0gICAgICAgIGlmICghSXNXaW5kb3coKCpwcFduZCktPmh3bmRTZWxmKSkgY29udGludWU7CisgICAgICAgIGlmICghSXNXaW5kb3czMigoKnBwV25kKS0+aHduZFNlbGYpKSBjb250aW51ZTsKICAgICAgICAgaWYgKCgqcHBXbmQpLT5obWVtVGFza1EgIT0gaFF1ZXVlKSBjb250aW51ZTsgIC8qIENoZWNrIHRoZSBxdWV1ZSAqLwogICAgICAgICBpZiAoIWZ1bmMoICgqcHBXbmQpLT5od25kU2VsZiwgbFBhcmFtICkpIGJyZWFrOwogICAgIH0KQEAgLTIwNTAsNyArMjA3OCw3IEBACiAgICAgd2hpbGUgKCpwcFduZCkKICAgICB7CiAgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSB3aW5kb3cgc3RpbGwgZXhpc3RzICovCi0gICAgICAgIGlmICghSXNXaW5kb3coKCpwcFduZCktPmh3bmRTZWxmKSkgY29udGludWU7CisgICAgICAgIGlmICghSXNXaW5kb3czMigoKnBwV25kKS0+aHduZFNlbGYpKSBjb250aW51ZTsKICAgICAgICAgLyogQnVpbGQgY2hpbGRyZW4gbGlzdCBmaXJzdCAqLwogICAgICAgICBpZiAoIShjaGlsZExpc3QgPSBXSU5fQnVpbGRXaW5BcnJheSggKnBwV25kICkpKSByZXR1cm4gRkFMU0U7CiAgICAgICAgIGlmICghZnVuYyggKCpwcFduZCktPmh3bmRTZWxmLCBsUGFyYW0gKSkgcmV0dXJuIEZBTFNFOwpAQCAtMjMwNiwxMSArMjMzNCwxMCBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERyYWdPYmplY3QgKCBVU0VSLjQ2NCApCi0gKgorICogICAgICAgICAgICAgRHJhZ09iamVjdDE2ICAgKFVTRVIuNDY0KQogICovCi1EV09SRCBEcmFnT2JqZWN0KEhXTkQxNiBod25kU2NvcGUsIEhXTkQxNiBoV25kLCBXT1JEIHdPYmosIEhBTkRMRTE2IGhPZlN0cnVjdCwKLSAgICAgICAgICAgICAgICBXT1JEIHN6TGlzdCAsIEhDVVJTT1IxNiBoQ3Vyc29yKQorRFdPUkQgRHJhZ09iamVjdDE2KCBIV05EMTYgaHduZFNjb3BlLCBIV05EMTYgaFduZCwgVUlOVDE2IHdPYmosCisgICAgICAgICAgICAgICAgICAgIEhBTkRMRTE2IGhPZlN0cnVjdCwgV09SRCBzekxpc3QsIEhDVVJTT1IxNiBoQ3Vyc29yICkKIHsKICBNU0cxNgkgCW1zZzsKICBMUERSQUdJTkZPCWxwRHJhZ0luZm87CmRpZmYgLS1naXQgYS93aW5kb3dzL3dpbnBvcy5jIGIvd2luZG93cy93aW5wb3MuYwppbmRleCBkODAyOTgxLi44NzZlNjViIDEwMDY0NAotLS0gYS93aW5kb3dzL3dpbnBvcy5jCisrKyBiL3dpbmRvd3Mvd2lucG9zLmMKQEAgLTUsNyArNSw2IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgMTk5NSwxOTk2IEFsZXggS29yb2JrYQogICovCiAKLSNkZWZpbmUgTk9fVFJBTlNJVElPTl9UWVBFUwogI2luY2x1ZGUgPFgxMS9YbGliLmg+CiAjaW5jbHVkZSA8WDExL1h1dGlsLmg+CiAjaW5jbHVkZSA8WDExL1hhdG9tLmg+CkBAIC03NzgsNyArNzc3LDcgQEAKICAgICBpZiAoc2hvd0ZsYWcgIT0gd2FzVmlzaWJsZSkKICAgICB7CiAgICAgICAgIFNlbmRNZXNzYWdlMTYoIGh3bmQsIFdNX1NIT1dXSU5ET1csIHNob3dGbGFnLCAwICk7Ci0gICAgICAgIGlmICghSXNXaW5kb3coIGh3bmQgKSkgcmV0dXJuIHdhc1Zpc2libGU7CisgICAgICAgIGlmICghSXNXaW5kb3czMiggaHduZCApKSByZXR1cm4gd2FzVmlzaWJsZTsKICAgICB9CiAKICAgICBpZiAoKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0NISUxEKSAmJgpAQCAtNzk1LDcgKzc5NCw3IEBACiAgICAgICAgIGlmICh3bmRQdHItPmR3U3R5bGUgJiBXU19DSElMRCkKICAgICAgICAgICAgIHN3cGZsYWdzIHw9IFNXUF9OT0FDVElWQVRFIHwgU1dQX05PWk9SREVSOwogICAgICAgICBTZXRXaW5kb3dQb3MzMiggaHduZCwgSFdORF9UT1AsIHgsIHksIGN4LCBjeSwgc3dwZmxhZ3MgKTsKLSAgICAgICAgaWYgKCFJc1dpbmRvdyggaHduZCApKSByZXR1cm4gd2FzVmlzaWJsZTsKKyAgICAgICAgaWYgKCFJc1dpbmRvdzMyKCBod25kICkpIHJldHVybiB3YXNWaXNpYmxlOwogICAgIH0KIAogICAgIGlmICh3bmRQdHItPmZsYWdzICYgV0lOX05FRURfU0laRSkKQEAgLTEwMjYsNyArMTAyNSw3IEBACiAgICAgfQogCiAgICAgLyogc2V0IHByZXYgYWN0aXZlIHduZCB0byBjdXJyZW50IGFjdGl2ZSB3bmQgYW5kIHNlbmQgbm90aWZpY2F0aW9uICovCi0gICAgaWYgKChod25kUHJldkFjdGl2ZSA9IGh3bmRBY3RpdmUpICYmIElzV2luZG93KGh3bmRQcmV2QWN0aXZlKSkKKyAgICBpZiAoKGh3bmRQcmV2QWN0aXZlID0gaHduZEFjdGl2ZSkgJiYgSXNXaW5kb3czMihod25kUHJldkFjdGl2ZSkpCiAgICAgewogICAgICAgICBpZiAoIVNlbmRNZXNzYWdlMTYoIGh3bmRQcmV2QWN0aXZlLCBXTV9OQ0FDVElWQVRFLCBGQUxTRSwgMCApKQogICAgICAgICB7CkBAIC0xMDc2LDcgKzEwNzUsNyBAQAogCWlmKCB3bmRUZW1wICE9IHduZFB0ciApCiAJICAgIFNldFdpbmRvd1BvczMyKGhXbmQsIEhXTkRfVE9QLCAwLDAsMCwwLCAKIAkJCSAgIFNXUF9OT1NJWkUgfCBTV1BfTk9NT1ZFIHwgU1dQX05PQUNUSVZBVEUgKTsKLSAgICAgICAgaWYoICFJc1dpbmRvdyhoV25kKSApIHJldHVybiAwOworICAgICAgICBpZiAoIUlzV2luZG93MzIoaFduZCkpIHJldHVybiAwOwogICAgIH0KIAogICAgIGhOZXdBY3RpdmVRdWV1ZSA9IHduZFB0ciA/IHduZFB0ci0+aG1lbVRhc2tRIDogMDsKQEAgLTEwOTAsNyArMTA4OSw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGZvciAocHBXbmQgPSBsaXN0OyAqcHBXbmQ7IHBwV25kKyspCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFJc1dpbmRvdyggKCpwcFduZCktPmh3bmRTZWxmICkpIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmICghSXNXaW5kb3czMiggKCpwcFduZCktPmh3bmRTZWxmICkpIGNvbnRpbnVlOwogCiAgICAgICAgICAgICAgICAgaWYgKCgqcHBXbmQpLT5obWVtVGFza1EgPT0gaE9sZEFjdGl2ZVF1ZXVlKQogICAgICAgICAgICAgICAgICAgIFNlbmRNZXNzYWdlMTYoICgqcHBXbmQpLT5od25kU2VsZiwgV01fQUNUSVZBVEVBUFAsCkBAIC0xMTA2LDcgKzExMDUsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBmb3IgKHBwV25kID0gbGlzdDsgKnBwV25kOyBwcFduZCsrKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghSXNXaW5kb3coICgqcHBXbmQpLT5od25kU2VsZiApKSBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAoIUlzV2luZG93MzIoICgqcHBXbmQpLT5od25kU2VsZiApKSBjb250aW51ZTsKIAogICAgICAgICAgICAgICAgIGlmICgoKnBwV25kKS0+aG1lbVRhc2tRID09IGhOZXdBY3RpdmVRdWV1ZSkKICAgICAgICAgICAgICAgICAgICBTZW5kTWVzc2FnZTE2KCAoKnBwV25kKS0+aHduZFNlbGYsIFdNX0FDVElWQVRFQVBQLApAQCAtMTExNCw3ICsxMTEzLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEhlYXBGcmVlKCBTeXN0ZW1IZWFwLCAwLCBsaXN0ICk7CiAgICAgICAgIH0KLQlpZiAoIUlzV2luZG93KGhXbmQpKSByZXR1cm4gMDsKKwlpZiAoIUlzV2luZG93MzIoaFduZCkpIHJldHVybiAwOwogICAgIH0KIAogICAgIGlmIChoV25kKQpAQCAtMTEzNiw3ICsxMTM1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICBNQUtFTFBBUkFNKCAoSFdORDE2KWh3bmRQcmV2QWN0aXZlLCB3SWNvbml6ZWQpICk7CiAjZW5kaWYKIAotICAgICAgICBpZiggIUlzV2luZG93KGhXbmQpICkgcmV0dXJuIDA7CisgICAgICAgIGlmKCAhSXNXaW5kb3czMihoV25kKSApIHJldHVybiAwOwogICAgIH0KIAogICAgIC8qIGNoYW5nZSBmb2N1cyBpZiBwb3NzaWJsZSAqLwpAQCAtMTUxOSw3ICsxNTE4LDggQEAKICAgICAgICAgIHdpZHRoID0gbHBPbGRDbGllbnRSZWN0LT5yaWdodCAtIHhmcm9tOyBoZWlnaHQgPSBscE9sZENsaWVudFJlY3QtPmJvdHRvbSAtIHlmcm9tOwogCSB1cGRhdGVSZ24gPSBDcmVhdGVSZWN0UmduMzIoIDAsIDAsIHdpZHRoLCBoZWlnaHQgKTsKIAkgQ29tYmluZVJnbjMyKCBuZXdWaXNSZ24sIG5ld1Zpc1JnbiwgdXBkYXRlUmduLCBSR05fQU5EICk7Ci0JIFNldFJlY3RSZ24oIHVwZGF0ZVJnbiwgMCwgMCwgV25kLT5yZWN0Q2xpZW50LnJpZ2h0IC0geHRvLCBXbmQtPnJlY3RDbGllbnQuYm90dG9tIC0geXRvICk7CisJIFNldFJlY3RSZ24zMiggdXBkYXRlUmduLCAwLCAwLCBXbmQtPnJlY3RDbGllbnQucmlnaHQgLSB4dG8sCisgICAgICAgICAgICAgICAgICAgICAgIFduZC0+cmVjdENsaWVudC5ib3R0b20gLSB5dG8gKTsKICAgICAgICB9CiAgICAgIGVsc2UKICAgICAgICB7CkBAIC0xOTk3LDEzICsxOTk3LDEzIEBACiAgICAgICAgICAgICAvKiBSZXZlcnQgZm9jdXMgdG8gcGFyZW50ICovCiAgICAgICAgICAgICBTZXRGb2N1czMyKCBHZXRQYXJlbnQzMih3aW5wb3MtPmh3bmQpICk7CiAgICAgICAgIH0KLQlpZiAoaHduZCA9PSBDQVJFVF9HZXRId25kKCkpIERlc3Ryb3lDYXJldCgpOworCWlmIChod25kID09IENBUkVUX0dldEh3bmQoKSkgRGVzdHJveUNhcmV0MzIoKTsKIAogCWlmICh3aW5wb3MtPmh3bmQgPT0gaHduZEFjdGl2ZSkKIAl7CiAJICAgICAgLyogQWN0aXZhdGUgcHJldmlvdXNseSBhY3RpdmUgd2luZG93IGlmIHBvc3NpYmxlICovCiAJICAgIEhXTkQzMiBuZXdBY3RpdmUgPSBod25kUHJldkFjdGl2ZTsKLQkgICAgaWYgKCFJc1dpbmRvdyhuZXdBY3RpdmUpIHx8IChuZXdBY3RpdmUgPT0gd2lucG9zLT5od25kKSkKKwkgICAgaWYgKCFJc1dpbmRvdzMyKG5ld0FjdGl2ZSkgfHwgKG5ld0FjdGl2ZSA9PSB3aW5wb3MtPmh3bmQpKQogCSAgICB7CiAJCW5ld0FjdGl2ZSA9IEdldFRvcFdpbmRvdzMyKCBHZXREZXNrdG9wV2luZG93MzIoKSApOwogCQlpZiAobmV3QWN0aXZlID09IHdpbnBvcy0+aHduZCkKZGlmZiAtLWdpdCBhL3dpbmRvd3Mvd2lucHJvYy5jIGIvd2luZG93cy93aW5wcm9jLmMKaW5kZXggZTg5NDZlZS4uZDdhMTk2YSAxMDA2NDQKLS0tIGEvd2luZG93cy93aW5wcm9jLmMKKysrIGIvd2luZG93cy93aW5wcm9jLmMKQEAgLTIzNSw2ICsyMzUsNyBAQAogICovCiBXTkRQUk9DMTYgV0lOUFJPQ19HZXRQcm9jKCBIV0lORE9XUFJPQyBwcm9jLCBXSU5ET1dQUk9DVFlQRSB0eXBlICkKIHsKKyAgICBpZiAoIXByb2MpIHJldHVybiBOVUxMOwogICAgIGlmICh0eXBlID09IFdJTl9QUk9DXzE2KSAgLyogV2Ugd2FudCBhIDE2OjE2IGFkZHJlc3MgKi8KICAgICB7CiAgICAgICAgIGlmICgoKFdJTkRPV1BST0MgKilwcm9jKS0+dHlwZSA9PSBXSU5fUFJPQ18xNikKZGlmZiAtLWdpdCBhL3dpbmUubWFuIGIvd2luZS5tYW4KaW5kZXggNjQ0NWEzMS4uZmEyMGZkNCAxMDA2NDQKLS0tIGEvd2luZS5tYW4KKysrIGIvd2luZS5tYW4KQEAgLTEwOSw3ICsxMDksNyBAQAogLkkgLWxhbmd1YWdlIHh4CiBTZXQgdGhlIGxhbmd1YWdlIHRvCiAuSSB4eAotKG9uZSBvZiBFbiwgRXMsIERlLCBObywgRnIsIEZpLCBEYSwgQ3osIEVvLCBJdCwgS28sIEh1KQorKG9uZSBvZiBFbiwgRXMsIERlLCBObywgRnIsIEZpLCBEYSwgQ3osIEVvLCBJdCwgS28sIEh1LCBQbCkKIC5UUAogLkkgLW1hbmFnZWQKIENyZWF0ZSBlYWNoIHRvcC1sZXZlbCB3aW5kb3cgYXMgYSBwcm9wZXJseSBtYW5hZ2VkIFggd2luZG93Cg==