ZGlmZiAtLWdpdCBhL2hscnN5bmMvaGxyc3luYy5weSBiL2hscnN5bmMvaGxyc3luYy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNGE0OTU1Ci0tLSAvZGV2L251bGwKKysrIGIvaGxyc3luYy9obHJzeW5jLnB5CkBAIC0wLDAgKzEsMTI1IEBACisjIS91c3IvYmluL3B5dGhvbjIuNQorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHdpdGhfc3RhdGVtZW50CisKK2Zyb20gcHlzcWxpdGUyIGltcG9ydCBkYmFwaTIgYXMgc3FsaXRlMworaW1wb3J0IHN5cworCitobHIgPSBzcWxpdGUzLmNvbm5lY3Qoc3lzLmFyZ3ZbMV0pCit3ZWIgPSBzcWxpdGUzLmNvbm5lY3Qoc3lzLmFyZ3ZbMl0pCisKKyMgc3dpdGNoIHRvIGF1dG9jb21taXQKK2hsci5pc29sYXRpb25fbGV2ZWwgPSBOb25lCit3ZWIuaXNvbGF0aW9uX2xldmVsID0gTm9uZQorCitobHIucm93X2ZhY3RvcnkgPSBzcWxpdGUzLlJvdword2ViLnJvd19mYWN0b3J5ID0gc3FsaXRlMy5Sb3cKKword2l0aCBobHI6CisJaGxyX3N1YnNjcnMgPSBobHIuZXhlY3V0ZSgiIiIKKwkJU0VMRUNUICogRlJPTSBTdWJzY3JpYmVyCisJIiIiKS5mZXRjaGFsbCgpCisJaGxyX3Rva2VucyA9IGhsci5leGVjdXRlKCIiIgorCQlTRUxFQ1QgKiBGUk9NIEF1dGhUb2tlbgorCSIiIikuZmV0Y2hhbGwoKQorCit3aXRoIHdlYjoKKwl3ZWJfdG9rZW5zID0gd2ViLmV4ZWN1dGUoIiIiCisJCVNFTEVDVCAqIEZST00gcmVnX3Rva2VucworCSIiIikuZmV0Y2hhbGwoKQorCXdlYl9zbXMgPSB3ZWIuZXhlY3V0ZSgiIiIKKwkJU0VMRUNUICogRlJPTSBzbXNfcXVldWUKKwkiIiIpLmZldGNoYWxsKCkKKworIyBpbmRleCBieSBzdWJzY3IgaWQKK2hscl9zdWJzY3JzX2J5X2lkID0ge30KK2hscl9zdWJzY3JzX2J5X2V4dCA9IHt9CitobHJfdG9rZW5zX2J5X3N1YnNjcl9pZCA9IHt9Citmb3IgeCBpbiBobHJfc3Vic2NyczoKKwlobHJfc3Vic2Nyc19ieV9pZFt4WydpZCddXSA9IHgKKwlobHJfc3Vic2Nyc19ieV9leHRbeFsnZXh0ZW5zaW9uJ11dID0geAorZGVsIGhscl9zdWJzY3JzCitmb3IgeCBpbiBobHJfdG9rZW5zOgorCWhscl90b2tlbnNfYnlfc3Vic2NyX2lkW3hbJ3N1YnNjcmliZXJfaWQnXV0gPSB4CitkZWwgaGxyX3Rva2VucworCit3ZWJfdG9rZW5zX2J5X3N1YnNjcl9pZCA9IHt9Citmb3IgeCBpbiB3ZWJfdG9rZW5zOgorCXdlYl90b2tlbnNfYnlfc3Vic2NyX2lkW3hbJ3N1YnNjcmliZXJfaWQnXV0gPSB4CitkZWwgd2ViX3Rva2VucworCisjIHJlbW92ZSBsZWZ0b3ZlciB3ZWJfdG9rZW5zIGFuZCBjb3JyZWN0IGluY29uc2lzdGVudCBmaWVsZHMKK3dpdGggd2ViOgorCWZvciB4IGluIHdlYl90b2tlbnNfYnlfc3Vic2NyX2lkLnZhbHVlcygpOgorCQlzdWJzY3IgPSBobHJfc3Vic2Nyc19ieV9pZC5nZXQoeFsnc3Vic2NyaWJlcl9pZCddLCBOb25lKQorCQlpZiBzdWJzY3IgaXMgTm9uZToKKwkJCXdlYi5leGVjdXRlKCIiIgorCQkJCSAgICAgIERFTEVURSBGUk9NIHJlZ190b2tlbnMgV0hFUkUgc3Vic2NyaWJlcl9pZCA9ID8KKwkJCQkgICAiIiIsICh4WydzdWJzY3JpYmVyX2lkJ10sKSkKKwkJCWRlbCB3ZWJfdG9rZW5zX2J5X3N1YnNjcl9pZFt4WydzdWJzY3JpYmVyX2lkJ11dCisJCQljb250aW51ZQorCQlpZiBzdHIoeFsnaW1zaSddKSAhPSBzdHIoc3Vic2NyWydpbXNpJ10pIG9yIFwKKwkJICAgeFsnZXh0ZW5zaW9uJ10gIT0gc3Vic2NyWydleHRlbnNpb24nXSBvciBcCisJCSAgIHhbJ3Rtc2knXSAhPSBzdWJzY3JbJ3Rtc2knXSBvciBcCisJCSAgIHhbJ2xhYyddICE9IHN1YnNjclsnbGFjJ106CisJCQl3ZWIuZXhlY3V0ZSgiIiIKKwkJCQkgICAgICBVUERBVEUgcmVnX3Rva2VucworCQkJCSAgICAgIFNFVCBpbXNpID0gPywgZXh0ZW5zaW9uID0gPywgdG1zaSA9ID8sIGxhYyA9ID8KKwkJCQkgICAgICBXSEVSRSBzdWJzY3JpYmVyX2lkID0gPworCQkJCSAgICIiIiwgKHN0cihzdWJzY3JbJ2ltc2knXSksIHN1YnNjclsnZXh0ZW5zaW9uJ10sCisJCQkJICAgc3Vic2NyWyd0bXNpJ10sIHN1YnNjclsnbGFjJ10sIHhbJ3N1YnNjcmliZXJfaWQnXSkpCisKKyMgYWRkIG1pc3Npbmcgd2ViX3Rva2Vucword2l0aCB3ZWI6CisJZm9yIHggaW4gaGxyX3Rva2Vuc19ieV9zdWJzY3JfaWQudmFsdWVzKCk6CisJCXN1YnNjciA9IGhscl9zdWJzY3JzX2J5X2lkLmdldCh4WydzdWJzY3JpYmVyX2lkJ10sIE5vbmUpCisJCWlmIHN1YnNjciBpcyBOb25lOgorCQkJaGxyLmV4ZWN1dGUoIiIiCisJCQkJICAgICAgREVMRVRFIEZST00gQXV0aFRva2VuIFdIRVJFIHN1YnNjcmliZXJfaWQgPSA/CisJCQkJICAgIiIiLCAoeFsnc3Vic2NyaWJlcl9pZCddLCkpCisJCQlkZWwgaGxyX3Rva2Vuc19ieV9zdWJzY3JfaWRbeFsnc3Vic2NyaWJlcl9pZCddXQorCQkJY29udGludWUKKwkJd2VidG9rZW4gPSB3ZWJfdG9rZW5zX2J5X3N1YnNjcl9pZC5nZXQoeFsnc3Vic2NyaWJlcl9pZCddLCBOb25lKQorCQlpZiB3ZWJ0b2tlbiBpcyBOb25lOgorCQkJd2ViLmV4ZWN1dGUoIiIiCisJCQkJICAgICAgSU5TRVJUIElOVE8gcmVnX3Rva2VucworCQkJCSAgICAgIChzdWJzY3JpYmVyX2lkLCBleHRlbnNpb24sIHJlZ19jb21wbGV0ZWQsIG5hbWUsIGVtYWlsLCBsYWMsIGltc2ksIHRva2VuLCB0bXNpKQorCQkJCSAgICAgIFZBTFVFUworCQkJCSAgICAgICg/LCA/LCAwLCA/LCAnJywgPywgPywgPywgPykKKwkJCQkgICAiIiIsICh4WydzdWJzY3JpYmVyX2lkJ10sIHN1YnNjclsnZXh0ZW5zaW9uJ10sIHN1YnNjclsnbmFtZSddLAorCQkJCSAgIHN1YnNjclsnbGFjJ10sIHN0cihzdWJzY3JbJ2ltc2knXSksIHhbJ3Rva2VuJ10sIHN1YnNjclsndG1zaSddKSkKKworIyBhdXRob3JpemUgc3Vic2NyaWJlcnMKK3dpdGggaGxyOgorCWZvciB4IGluIHdlYl90b2tlbnNfYnlfc3Vic2NyX2lkLnZhbHVlcygpOgorCQlzdWJzY3IgPSBobHJfc3Vic2Nyc19ieV9pZC5nZXQoeFsnc3Vic2NyaWJlcl9pZCddLCBOb25lKQorCQlpZiB4WydyZWdfY29tcGxldGVkJ10gYW5kIG5vdCBzdWJzY3JbJ2F1dGhvcml6ZWQnXToKKwkJCWhsci5leGVjdXRlKCIiIgorCQkJCSAgICAgIFVQREFURSBTdWJzY3JpYmVyCisJCQkJICAgICAgU0VUIGF1dGhvcml6ZWQgPSAxCisJCQkJICAgICAgV0hFUkUgaWQgPSA/CisJCQkJICAgIiIiLCAoeFsnc3Vic2NyaWJlcl9pZCddLCkpCisKKyMgU3luYyBTTVMgZnJvbSB3ZWIgdG8gaGxyCit3aXRoIGhscjoKKwlmb3Igc21zIGluIHdlYl9zbXM6CisJCXN1YnNjciA9IGhscl9zdWJzY3JzX2J5X2V4dC5nZXQoc21zWydyZWNlaXZlcl9leHQnXSkKKwkJaWYgc3Vic2NyIGlzIE5vbmU6CisJCQlwcmludCAnJXMgbm90IGZvdW5kJyAlIHNtc1sncmVjZWl2ZXJfZXh0J10KKwkJCWNvbnRpbnVlCisJCWhsci5leGVjdXRlKCIiIgorCQkJCSAgICAgIElOU0VSVCBJTlRPIFNNUworCQkJCSAgICAgIChjcmVhdGVkLCBzZW5kZXJfaWQsIHJlY2VpdmVyX2lkLCByZXBseV9wYXRoX3JlcSwgc3RhdHVzX3JlcF9yZXEsIHByb3RvY29sX2lkLCBkYXRhX2NvZGluZ19zY2hlbWUsIHVkX2hkcl9pbmQsIHRleHQpCisJCQkJICAgICAgVkFMVUVTCisJCQkJICAgICAgKD8sIDEsID8sIDAsIDAsIDAsIDAsIDAsID8pCisJCQkJICAgIiIiLCAoc21zWydjcmVhdGVkJ10sIHN1YnNjclsnaWQnXSwgc21zWyd0ZXh0J10pKQord2l0aCB3ZWI6CisJZm9yIHNtcyBpbiB3ZWJfc21zOgorCQl3ZWIuZXhlY3V0ZSgiIiIKKwkJCQkgICAgICBERUxFVEUgRlJPTSBzbXNfcXVldWUgV0hFUkUgaWQgPSA/CisJCQkJICAgIiIiLCAoc21zWydpZCddLCkpCisKKworaGxyLmNsb3NlKCkKK3dlYi5jbG9zZSgpCisKZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi9saWJvc21vY29yZS8uZ2l0aWdub3JlCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSAuZ2l0aWdub3JlCnJlbmFtZSB0byBsaWJvc21vY29yZS8uZ2l0aWdub3JlCmRpZmYgLS1naXQgYS9DT1BZSU5HIGIvbGlib3Ntb2NvcmUvQ09QWUlORwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gQ09QWUlORwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvQ09QWUlORwpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUuYW0gYi9saWJvc21vY29yZS9NYWtlZmlsZS5hbQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gTWFrZWZpbGUuYW0KcmVuYW1lIHRvIGxpYm9zbW9jb3JlL01ha2VmaWxlLmFtCmRpZmYgLS1naXQgYS9jb25maWd1cmUuaW4gYi9saWJvc21vY29yZS9jb25maWd1cmUuaW4Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvbmZpZ3VyZS5pbgpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvY29uZmlndXJlLmluCmRpZmYgLS1naXQgYS9naXQtdmVyc2lvbi1nZW4gYi9saWJvc21vY29yZS9naXQtdmVyc2lvbi1nZW4Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGdpdC12ZXJzaW9uLWdlbgpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvZ2l0LXZlcnNpb24tZ2VuCmRpZmYgLS1naXQgYS9pbmNsdWRlL01ha2VmaWxlLmFtIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9NYWtlZmlsZS5hbQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9NYWtlZmlsZS5hbQpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9NYWtlZmlsZS5hbQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS9NYWtlZmlsZS5hbSBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvTWFrZWZpbGUuYW0Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvTWFrZWZpbGUuYW0KcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvTWFrZWZpbGUuYW0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvYml0dmVjLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2JpdHZlYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL2JpdHZlYy5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2JpdHZlYy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL2NvbXAxMjguaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvY29tcDEyOC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL2NvbXAxMjguaApyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9jb21wMTI4LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtNDguaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtNDguaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9nc200OC5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2dzbTQ4LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtNDhfaWUuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtNDhfaWUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9nc200OF9pZS5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2dzbTQ4X2llLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtX3V0aWxzLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2dzbV91dGlscy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL2dzbV91dGlscy5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2dzbV91dGlscy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL2dzbXRhcC5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9nc210YXAuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9nc210YXAuaApyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9nc210YXAuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS9saW51eGxpc3QuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvbGludXhsaXN0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvbGludXhsaXN0LmgKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvbGludXhsaXN0LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvbW5jYy5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9tbmNjLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvbW5jYy5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL21uY2MuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS9tc2diLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL21zZ2IuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9tc2diLmgKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvbXNnYi5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL01ha2VmaWxlLmFtIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9NYWtlZmlsZS5hbQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9NYWtlZmlsZS5hbQpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9NYWtlZmlsZS5hbQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDRfMDguaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzA4LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzA4LmgKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzA4LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzExLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wNF8xMS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wNF8xMS5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wNF8xMS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wNF84MC5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDRfODAuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDRfODAuaApyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDRfODAuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDhfNTguaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA4XzU4LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA4XzU4LmgKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA4XzU4LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzEyXzIxLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8xMl8yMS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8xMl8yMS5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8xMl8yMS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL3JzbC5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9yc2wuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9yc2wuaApyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9yc2wuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS9yeGxldl9zdGF0LmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3J4bGV2X3N0YXQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9yeGxldl9zdGF0LmgKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcnhsZXZfc3RhdC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL3NlbGVjdC5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9zZWxlY3QuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9zZWxlY3QuaApyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9zZWxlY3QuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS9zaWduYWwuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvc2lnbmFsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvc2lnbmFsLmgKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvc2lnbmFsLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvc3RhdGlzdGljcy5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9zdGF0aXN0aWNzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvc3RhdGlzdGljcy5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3N0YXRpc3RpY3MuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS90YWxsb2MuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvdGFsbG9jLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvdGFsbG9jLmgKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvdGFsbG9jLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvdGltZXIuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvdGltZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS90aW1lci5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3RpbWVyLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvdGx2LmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Rsdi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL3Rsdi5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Rsdi5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL3V0aWxzLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3V0aWxzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvdXRpbHMuaApyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS91dGlscy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL3dyaXRlX3F1ZXVlLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3dyaXRlX3F1ZXVlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvd3JpdGVfcXVldWUuaApyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS93cml0ZV9xdWV1ZS5oCmRpZmYgLS1naXQgYS9saWJvc21vY29yZS5wYy5pbiBiL2xpYm9zbW9jb3JlL2xpYm9zbW9jb3JlLnBjLmluCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWJvc21vY29yZS5wYy5pbgpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvbGlib3Ntb2NvcmUucGMuaW4KZGlmZiAtLWdpdCBhL200L0RVTU1ZIGIvbGlib3Ntb2NvcmUvbTQvRFVNTVkKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG00L0RVTU1ZCnJlbmFtZSB0byBsaWJvc21vY29yZS9tNC9EVU1NWQpkaWZmIC0tZ2l0IGEvc3JjL01ha2VmaWxlLmFtIGIvbGlib3Ntb2NvcmUvc3JjL01ha2VmaWxlLmFtCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvTWFrZWZpbGUuYW0KcmVuYW1lIHRvIGxpYm9zbW9jb3JlL3NyYy9NYWtlZmlsZS5hbQpkaWZmIC0tZ2l0IGEvc3JjL2JpdHZlYy5jIGIvbGlib3Ntb2NvcmUvc3JjL2JpdHZlYy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvYml0dmVjLmMKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL3NyYy9iaXR2ZWMuYwpkaWZmIC0tZ2l0IGEvc3JjL2NvbXAxMjguYyBiL2xpYm9zbW9jb3JlL3NyYy9jb21wMTI4LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9jb21wMTI4LmMKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL3NyYy9jb21wMTI4LmMKZGlmZiAtLWdpdCBhL3NyYy9nc200OC5jIGIvbGlib3Ntb2NvcmUvc3JjL2dzbTQ4LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9nc200OC5jCnJlbmFtZSB0byBsaWJvc21vY29yZS9zcmMvZ3NtNDguYwpkaWZmIC0tZ2l0IGEvc3JjL2dzbTQ4X2llLmMgYi9saWJvc21vY29yZS9zcmMvZ3NtNDhfaWUuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL2dzbTQ4X2llLmMKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL3NyYy9nc200OF9pZS5jCmRpZmYgLS1naXQgYS9zcmMvZ3NtX3V0aWxzLmMgYi9saWJvc21vY29yZS9zcmMvZ3NtX3V0aWxzLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9nc21fdXRpbHMuYwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvc3JjL2dzbV91dGlscy5jCmRpZmYgLS1naXQgYS9zcmMvbXNnYi5jIGIvbGlib3Ntb2NvcmUvc3JjL21zZ2IuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL21zZ2IuYwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvc3JjL21zZ2IuYwpkaWZmIC0tZ2l0IGEvc3JjL3JzbC5jIGIvbGlib3Ntb2NvcmUvc3JjL3JzbC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvcnNsLmMKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL3NyYy9yc2wuYwpkaWZmIC0tZ2l0IGEvc3JjL3J4bGV2X3N0YXQuYyBiL2xpYm9zbW9jb3JlL3NyYy9yeGxldl9zdGF0LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9yeGxldl9zdGF0LmMKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL3NyYy9yeGxldl9zdGF0LmMKZGlmZiAtLWdpdCBhL3NyYy9zZWxlY3QuYyBiL2xpYm9zbW9jb3JlL3NyYy9zZWxlY3QuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3NlbGVjdC5jCnJlbmFtZSB0byBsaWJvc21vY29yZS9zcmMvc2VsZWN0LmMKZGlmZiAtLWdpdCBhL3NyYy9zaWduYWwuYyBiL2xpYm9zbW9jb3JlL3NyYy9zaWduYWwuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3NpZ25hbC5jCnJlbmFtZSB0byBsaWJvc21vY29yZS9zcmMvc2lnbmFsLmMKZGlmZiAtLWdpdCBhL3NyYy9zdGF0aXN0aWNzLmMgYi9saWJvc21vY29yZS9zcmMvc3RhdGlzdGljcy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvc3RhdGlzdGljcy5jCnJlbmFtZSB0byBsaWJvc21vY29yZS9zcmMvc3RhdGlzdGljcy5jCmRpZmYgLS1naXQgYS9zcmMvdGFsbG9jLmMgYi9saWJvc21vY29yZS9zcmMvdGFsbG9jLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90YWxsb2MuYwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvc3JjL3RhbGxvYy5jCmRpZmYgLS1naXQgYS9zcmMvdGltZXIuYyBiL2xpYm9zbW9jb3JlL3NyYy90aW1lci5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGltZXIuYwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvc3JjL3RpbWVyLmMKZGlmZiAtLWdpdCBhL3NyYy90bHZfcGFyc2VyLmMgYi9saWJvc21vY29yZS9zcmMvdGx2X3BhcnNlci5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGx2X3BhcnNlci5jCnJlbmFtZSB0byBsaWJvc21vY29yZS9zcmMvdGx2X3BhcnNlci5jCmRpZmYgLS1naXQgYS9zcmMvdXRpbHMuYyBiL2xpYm9zbW9jb3JlL3NyYy91dGlscy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdXRpbHMuYwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvc3JjL3V0aWxzLmMKZGlmZiAtLWdpdCBhL3NyYy93cml0ZV9xdWV1ZS5jIGIvbGlib3Ntb2NvcmUvc3JjL3dyaXRlX3F1ZXVlLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy93cml0ZV9xdWV1ZS5jCnJlbmFtZSB0byBsaWJvc21vY29yZS9zcmMvd3JpdGVfcXVldWUuYwpkaWZmIC0tZ2l0IGEvdGVzdHMvTWFrZWZpbGUuYW0gYi9saWJvc21vY29yZS90ZXN0cy9NYWtlZmlsZS5hbQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvTWFrZWZpbGUuYW0KcmVuYW1lIHRvIGxpYm9zbW9jb3JlL3Rlc3RzL01ha2VmaWxlLmFtCmRpZmYgLS1naXQgYS90ZXN0cy9zbXMvTWFrZWZpbGUuYW0gYi9saWJvc21vY29yZS90ZXN0cy9zbXMvTWFrZWZpbGUuYW0Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL3Ntcy9NYWtlZmlsZS5hbQpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvdGVzdHMvc21zL01ha2VmaWxlLmFtCmRpZmYgLS1naXQgYS90ZXN0cy9zbXMvc21zX3Rlc3QuYyBiL2xpYm9zbW9jb3JlL3Rlc3RzL3Ntcy9zbXNfdGVzdC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9zbXMvc21zX3Rlc3QuYwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvdGVzdHMvc21zL3Ntc190ZXN0LmMKZGlmZiAtLWdpdCBhL3Rlc3RzL3RpbWVyL01ha2VmaWxlLmFtIGIvbGlib3Ntb2NvcmUvdGVzdHMvdGltZXIvTWFrZWZpbGUuYW0Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL3RpbWVyL01ha2VmaWxlLmFtCnJlbmFtZSB0byBsaWJvc21vY29yZS90ZXN0cy90aW1lci9NYWtlZmlsZS5hbQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGltZXIvdGltZXJfdGVzdC5jIGIvbGlib3Ntb2NvcmUvdGVzdHMvdGltZXIvdGltZXJfdGVzdC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy90aW1lci90aW1lcl90ZXN0LmMKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL3Rlc3RzL3RpbWVyL3RpbWVyX3Rlc3QuYwpkaWZmIC0tZ2l0IGEvbGludXgta2VybmVsL2xpbnV4LTIuNi4yNy40LW1pc2RuLWFiaXMuZGlmZiBiL2xpbnV4LWtlcm5lbC9saW51eC0yLjYuMjcuNC1taXNkbi1hYmlzLmRpZmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY5MWVkYQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LWtlcm5lbC9saW51eC0yLjYuMjcuNC1taXNkbi1hYmlzLmRpZmYKQEAgLTAsMCArMSwxNDQgQEAKK2RpZmYgLU5ydSAtLWV4Y2x1ZGUtZnJvbSAvc3VuYmVhbS9ob21lL2xhZm9yZ2Uvc2NyaXB0cy9kb250ZGlmZiBsaW51eC0yLjYuMjcuNC1jbGVhbi9kcml2ZXJzL2lzZG4vbUlTRE4vbGF5ZXIyLmMgbGludXgtMi42LjI3LjQvZHJpdmVycy9pc2RuL21JU0ROL2xheWVyMi5jCistLS0gbGludXgtMi42LjI3LjQtY2xlYW4vZHJpdmVycy9pc2RuL21JU0ROL2xheWVyMi5jCTIwMDgtMTAtMjYgMDA6MDU6MDcuMDAwMDAwMDAwICswMjAwCisrKysgbGludXgtMi42LjI3LjQvZHJpdmVycy9pc2RuL21JU0ROL2xheWVyMi5jCTIwMDgtMTItMjMgMTY6MTY6MjkuMDAwMDAwMDAwICswMTAwCitAQCAtOTQsOCArOTQsMTAgQEAKKyAJc3RydWN0IGxheWVyMiAqbDIgPSBmaS0+dXNlcmRhdGE7CisgCXZhX2xpc3QgdmE7CisgCisrI2lmIDAKKyAJaWYgKCEoKmRlYnVnICYgREVCVUdfTDJfRlNNKSkKKyAJCXJldHVybjsKKysjZW5kaWYKKyAJdmFfc3RhcnQodmEsIGZtdCk7CisgCXByaW50ayhLRVJOX0RFQlVHICJsMiAodGVpICVkKTogIiwgbDItPnRlaSk7CisgCXZwcmludGsoZm10LCB2YSk7CitAQCAtODgyLDYgKzg4NCw4IEBACisgCWwyLT52YSA9IDA7CisgCWwyLT52ciA9IDA7CisgCWwyLT5zb3cgPSAwOworKwlsMi0+c2FwaSA9IHNrYi0+ZGF0YVswXSA+PiAyOworKwlzZXRfY2hhbm5lbF9hZGRyZXNzKCZsMi0+Y2gsIGwyLT5zYXBpLCBsMi0+dGVpKTsKKyAJY2xlYXJfZXhjZXB0aW9uKGwyKTsKKyAJc2VuZF91ZnJhbWUobDIsIE5VTEwsIFVBIHwgZ2V0X1BvbGxGbGFnKGwyLCBza2IpLCBSU1ApOworIAltSVNETl9Gc21DaGFuZ2VTdGF0ZShmaSwgU1RfTDJfNyk7CitAQCAtODk4LDYgKzkwMiw3IEBACisgCXN0cnVjdCBsYXllcjIgKmwyID0gZmktPnVzZXJkYXRhOworIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gYXJnOworIAorKwlwcmludGsoS0VSTl9ERUJVRyAibDJfc2VuZF9VQSgpXG4iKTsKKyAJc2VuZF91ZnJhbWUobDIsIHNrYiwgVUEgfCBnZXRfUG9sbEZsYWcobDIsIHNrYiksIFJTUCk7CisgfQorIAorQEAgLTkzMSw2ICs5MzYsOCBAQAorIAlsMi0+dmEgPSAwOworIAlsMi0+dnIgPSAwOworIAlsMi0+c293ID0gMDsKKysJbDItPnNhcGkgPSBza2ItPmRhdGFbMF0gPj4gMjsKKysJc2V0X2NoYW5uZWxfYWRkcmVzcygmbDItPmNoLCBsMi0+c2FwaSwgbDItPnRlaSk7CisgCW1JU0ROX0ZzbUNoYW5nZVN0YXRlKGZpLCBTVF9MMl83KTsKKyAJc3RvcF90MjAwKGwyLCAzKTsKKyAJbUlTRE5fRnNtUmVzdGFydFRpbWVyKCZsMi0+dDIwMywgbDItPlQyMDMsIEVWX0wyX1QyMDMsIE5VTEwsIDMpOworQEAgLTk4Miw2ICs5ODksOCBAQAorIAl9IGVsc2UgaWYgKGwyLT52cyAhPSBsMi0+dmEpIHsKKyAJCXNrYl9xdWV1ZV9wdXJnZSgmbDItPmlfcXVldWUpOworIAkJcHIgPSBETF9FU1RBQkxJU0hfSU5EOworKwkJLy9sMi0+c2FwaSA9IHNrYi0+ZGF0YVswXSA+PiAyOworKwkJLy9zZXRfY2hhbm5lbF9hZGRyZXNzKCZsMi0+Y2gsIGwyLT5zYXBpLCBsMi0+dGVpKTsKKyAJfQorIAlzdG9wX3QyMDAobDIsIDUpOworIAlsMi0+dnIgPSAwOworQEAgLTE4NDEsMTEgKzE4NTAsMTQgQEAKKyAJdV9pbnQJbDsKKyAJaW50CWMgPSAwOworIAorKwlwcmludGsoS0VSTl9ERUJVRyAicGhfZGF0YV9pbmRpY2F0aW9uIDB4JXggMHgleCAweCV4XG4iLCBkYXRhcFswXSwgZGF0YXBbMV0sIGRhdGFwWzJdKTsKKysKKyAJbCA9IGwyYWRkcnNpemUobDIpOworIAlpZiAoc2tiLT5sZW4gPD0gbCkgeworIAkJbUlTRE5fRnNtRXZlbnQoJmwyLT5sMm0sIEVWX0wyX0ZSQU1FX0VSUk9SLCAodm9pZCAqKSAnTicpOworIAkJcmV0dXJuIHJldDsKKyAJfQorKyNpZiAwCisgCWlmICh0ZXN0X2JpdChGTEdfTEFQRCwgJmwyLT5mbGFnKSkgeyAvKiBNYXliZSBub3QgbmVlZGVkICovCisgCQlwc2FwaSA9ICpkYXRhcCsrOworIAkJcHRlaSA9ICpkYXRhcCsrOworQEAgLTE4NzUsNiArMTg4Nyw3IEBACisgCQkJcmV0dXJuIDA7CisgCQl9CisgCX0gZWxzZQorKyNlbmRpZgorIAkJZGF0YXAgKz0gbDsKKyAJaWYgKCEoKmRhdGFwICYgMSkpIHsJLyogSS1GcmFtZSAqLworIAkJYyA9IGlmcmFtZV9lcnJvcihsMiwgc2tiKTsKK0BAIC0xODkwLDYgKzE5MDMsNyBAQAorIAkJCXJldCA9IG1JU0ROX0ZzbUV2ZW50KCZsMi0+bDJtLCBFVl9MMl9VSSwgc2tiKTsKKyAJfSBlbHNlIGlmIChJc1NBQk1FKGRhdGFwLCBsMikpIHsKKyAJCWMgPSB1bm51bV9lcnJvcihsMiwgc2tiLCBDTUQpOworKwkJcHJpbnRrKEtFUk5fREVCVUcgIklzU0FCTUUoKSByZXR1cm5lZCB0cnVlLCB1bm51bV9lcnJvcj0lZFxuIiwgYyk7CisgCQlpZiAoIWMpCisgCQkJcmV0ID0gbUlTRE5fRnNtRXZlbnQoJmwyLT5sMm0sIEVWX0wyX1NBQk1FLCBza2IpOworIAl9IGVsc2UgaWYgKElzVUEoZGF0YXApKSB7CitAQCAtMjA4Nyw3ICsyMTAxLDcgQEAKKyAJCXRlc3RfYW5kX3NldF9iaXQoRkxHX0xBUEQsICZsMi0+ZmxhZyk7CisgCQl0ZXN0X2FuZF9zZXRfYml0KEZMR19MQVBEX05FVCwgJmwyLT5mbGFnKTsKKyAJCXRlc3RfYW5kX3NldF9iaXQoRkxHX01PRDEyOCwgJmwyLT5mbGFnKTsKKy0JCWwyLT5zYXBpID0gMDsKKysJCWwyLT5zYXBpID0gNjI7CisgCQlsMi0+bWF4bGVuID0gTUFYX0RGUkFNRV9MRU47CisgCQlpZiAodGVzdF9iaXQoT1BUSU9OX0wyX1BNWCwgJm9wdGlvbnMpKQorIAkJCWwyLT53aW5kb3cgPSA3OworZGlmZiAtTnJ1IC0tZXhjbHVkZS1mcm9tIC9zdW5iZWFtL2hvbWUvbGFmb3JnZS9zY3JpcHRzL2RvbnRkaWZmIGxpbnV4LTIuNi4yNy40LWNsZWFuL2RyaXZlcnMvaXNkbi9tSVNETi90ZWkuYyBsaW51eC0yLjYuMjcuNC9kcml2ZXJzL2lzZG4vbUlTRE4vdGVpLmMKKy0tLSBsaW51eC0yLjYuMjcuNC1jbGVhbi9kcml2ZXJzL2lzZG4vbUlTRE4vdGVpLmMJMjAwOC0xMC0yNiAwMDowNTowNy4wMDAwMDAwMDAgKzAyMDAKKysrKyBsaW51eC0yLjYuMjcuNC9kcml2ZXJzL2lzZG4vbUlTRE4vdGVpLmMJMjAwOC0xMi0yMyAxNjozMjo1OS4wMDAwMDAwMDAgKzAxMDAKK0BAIC04MzAsMTggKzgzMCwyOSBAQAorIAlpbnQJCXRlaSwgcmk7CisgCXN0cnVjdCBsYXllcjIJKmwyOworIAorKwlwcmludGsoS0VSTl9ERUJVRyAibmV3IHRlaSByZXF1ZXN0OiB0ZWk9JWRcbiIsIGRwWzNdID4+IDEpOworKworIAlyaSA9IGRwWzBdIDw8IDg7CisgCXJpICs9IGRwWzFdOworLQlpZiAoIW1nci0+dXApCistCQlnb3RvIGRlbmllZDsKKy0JdGVpID0gZ2V0X2ZyZWVfdGVpKG1ncik7CistCWlmICh0ZWkgPCAwKSB7CistCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczpObyBmcmVlIHRlaVxuIiwgX19mdW5jX18pOworKwlpZiAoIW1nci0+dXApIHsKKysJCXByaW50ayhLRVJOX0RFQlVHICJtZ3ItPnVwID09IE5VTExcbiIpOworIAkJZ290byBkZW5pZWQ7CisgCX0KKysJaWYgKGRwWzNdICE9IDB4ZmYpIHsKKysJCS8qIFRoaXMgaXMgYSBURUkgcmVxdWVzdCBhY2NvcmRpbmcgdG8gM0dQUCBUUyAwOC41NiA2LjEuMTEuMiAqLworKwkJdGVpID0gZHBbM10gPj4gMTsKKysJfSBlbHNlIHsKKysJCXRlaSA9IGdldF9mcmVlX3RlaShtZ3IpOworKwkJaWYgKHRlaSA8IDApIHsKKysJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczpObyBmcmVlIHRlaVxuIiwgX19mdW5jX18pOworKwkJCWdvdG8gZGVuaWVkOworKwkJfQorKwl9CisgCWwyID0gY3JlYXRlX25ld190ZWkobWdyLCB0ZWkpOworLQlpZiAoIWwyKQorKwlpZiAoIWwyKSB7CisrCQlwcmludGsoS0VSTl9ERUJVRyAiY3JlYXRlX25ld190ZWkgPT0gTlVMTFxuIik7CisgCQlnb3RvIGRlbmllZDsKKysJfQorIAllbHNlCisgCQltSVNETl9Gc21FdmVudCgmbDItPnRtLT50ZWlfbSwgRVZfQVNTSUdOX1JFUSwgZHApOworIAlyZXR1cm47CitAQCAtMTE1OSwxMiArMTE3MCwxNCBAQAorIAkJcmV0dXJuIC1FTk9UQ09OTjsKKyAJaWYgKHNrYi0+bGVuICE9IDMpCisgCQlyZXR1cm4gLUVOT1RDT05OOworKyNpZiAwCisgCWlmIChza2ItPmRhdGFbMF0gIT0gMCkKKyAJCS8qIG9ubHkgU0FQSSAwIGNvbW1hbmQgKi8KKyAJCXJldHVybiAtRU5PVENPTk47CisrI2VuZGlmCisgCWlmICghKHNrYi0+ZGF0YVsxXSAmIDEpKSAvKiBpbnZhbGlkIEVBMSAqLworIAkJcmV0dXJuIC1FSU5WQUw7CistCXRlaSA9IHNrYi0+ZGF0YVsxXSA+PiAwOworKwl0ZWkgPSBza2ItPmRhdGFbMV0gPj4gMTsKKyAJaWYgKHRlaSA+IDYzKSAvKiBub3QgYSBmaXhlZCB0ZWkgKi8KKyAJCXJldHVybiAtRU5PVENPTk47CisgCWlmICgoc2tiLT5kYXRhWzJdICYgfjB4MTApICE9IFNBQk1FKQpkaWZmIC0tZ2l0IGEvbGludXgta2VybmVsL2xpbnV4LTIuNi4zMC1oZmNtdWx0aS1tdWx0aWJ0cy5wYXRjaCBiL2xpbnV4LWtlcm5lbC9saW51eC0yLjYuMzAtaGZjbXVsdGktbXVsdGlidHMucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI5NGQzNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LWtlcm5lbC9saW51eC0yLjYuMzAtaGZjbXVsdGktbXVsdGlidHMucGF0Y2gKQEAgLTAsMCArMSw0ODYgQEAKK1RoaXMgZXhwZXJpbWVudGFsIHBhdGNoIHNwbGl0cyBvbmUgRTEgY2FyZCBpbnRvIHRocmVlIHZpcnR1YWwgY2FyZHMsCisKK1RTIDEsMiwzLDQsNSBpcyBjYXJkIDAKK1RTIDYsNyw4LDksMTAgaXMgY2FyZCAxCitUUyAxMSwxMiwxMywxNCBpcyBjYXJkIDIKKworVGhpcyBhbGxvd3MgeW91IHRvIHJ1biBvbmUgTDIgVEVJIGhhbmRsZXIgb24gZWFjaCBvZiB0aGUgdmlydHVhbCBjYXJkcywKK3doaWNoIGlzIHJlcXVpcmVkIGlmIHlvdSB3YW50IHRvIHJ1biBtdWx0aXBsZSBCVFMgb24gYSBzaW5nbGUgRTEgbGluay4KKworVGhhbmtzIHRvIEFuZHJlYXMgRXZlcnNiZXJnIGZvciB0aGlzIHBhdGNoLgorCitkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2hmY19tdWx0aS5oIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2hmY19tdWx0aS5oCitpbmRleCAwYzc3Mzg2Li4wMmRkNGExIDEwMDY0NAorLS0tIGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2hmY19tdWx0aS5oCisrKysgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vaGZjX211bHRpLmgKK0BAIC0yMDksMTQgKzIwOSwxNyBAQCBzdHJ1Y3QgaGZjX211bHRpIHsKKyAJdV9sb25nCQlsZWRzdGF0ZTsgLyogc2F2ZSBsYXN0IHN0YXRlIG9mIGxlZHMgKi8KKyAJaW50CQlvcHRpY2Fsc3VwcG9ydDsgLyogaGFzIHRoZSBlMSBib2FyZCAqLworIAkJCQkJLyogYW4gb3B0aWNhbCBJbnRlcmZhY2UgKi8KKy0JaW50CQlkc2xvdDsJLyogY2hhbm5lbCAjIG9mIGQtY2hhbm5lbCAoRTEpIGRlZmF1bHQgMTYgKi8KKysKKysJdV9pbnQJCWJtYXNrWzMyXTsgLyogYml0bWFzayBvZiBiY2hhbm5lbHMgZm9yIHBvcnQgKi8KKysJdV9jaGFyCQlkbnVtWzMyXTsgLyogYXJyYXkgb2YgdXNlZCBkY2hhbm5lbCBudW1iZXJzIGZvciBwb3J0ICovCisrCXVfY2hhcgkJY3JlYXRlZFszMl07IC8qIHdoYXQgcG9ydCBpcyBjcmVhdGVkICovCisrCXVfaW50CQlhY3Rpdml0eVszMl07IAkvKiBpZiB0aGVyZSBpcyBhbnkgYWN0aW9uIG9uIHRoaXMgKi8KKysJCQkJCS8qIHBvcnQgKHdpbGwgYmUgY2xlYXJlZCBhZnRlciAqLworKwkJCQkJLyogc2hvd2luZyBsZWQtc3RhdGVzKSAqLworIAorIAl1X2xvbmcJCXdkY291bnQ7IAkvKiBldmVyeSA1MDAgbXMgd2UgbmVlZCB0byAqLworIAkJCQkJLyogc2VuZCB0aGUgd2F0Y2hkb2cgYSBzaWduYWwgKi8KKyAJdV9jaGFyCQl3ZGJ5dGU7IC8qIHdhdGNoZG9nIHRvZ2dsZSBieXRlICovCistCXVfaW50CQlhY3Rpdml0eVs4XTsgCS8qIGlmIHRoZXJlIGlzIGFueSBhY3Rpb24gb24gdGhpcyAqLworLQkJCQkJLyogcG9ydCAod2lsbCBiZSBjbGVhcmVkIGFmdGVyICovCistCQkJCQkvKiBzaG93aW5nIGxlZC1zdGF0ZXMpICovCisgCWludAkJZTFfc3RhdGU7IC8qIGtlZXAgdHJhY2sgb2YgbGFzdCBzdGF0ZSAqLworIAlpbnQJCWUxX2dldGNsb2NrOyAvKiBpZiBzeW5jIGlzIHJldHJpZXZlZCBmcm9tIGludGVyZmFjZSAqLworIAlpbnQJCXN5bmNyb25pemVkOyAvKiBrZWVwIHRyYWNrIG9mIGV4aXN0aW5nIHN5bmMgaW50ZXJmYWNlICovCitAQCAtMjMzLDcgKzIzNiw2IEBAIHN0cnVjdCBoZmNfbXVsdGkgeworIAkgKiB0aGUgYmNoLT5jaGFubmVsIGlzIGVxdXZhbGVudCB0byB0aGUgaGZjLWNoYW5uZWwKKyAJICovCisgCXN0cnVjdCBoZmNfY2hhbgljaGFuWzMyXTsKKy0JdV9jaGFyCQljcmVhdGVkWzhdOyAvKiB3aGF0IHBvcnQgaXMgY3JlYXRlZCAqLworIAlzaWduZWQgY2hhcglzbG90X293bmVyWzI1Nl07IC8qIG93bmVyIGNoYW5uZWwgb2Ygc2xvdCAqLworIH07CisgCitkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2hmY211bHRpLmMgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vaGZjbXVsdGkuYworaW5kZXggZTFkYWIzMC4uNGZlMmQyNyAxMDA2NDQKKy0tLSBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNtdWx0aS5jCisrKysgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vaGZjbXVsdGkuYworQEAgLTE2MTksOCArMTYxOSw4IEBAIGhmY211bHRpX2xlZHMoc3RydWN0IGhmY19tdWx0aSAqaGMpCisgCQkgKiBsZWZ0IHJlZDogICAgICAgZnJhbWUgc3luYywgYnV0IG5vIEwxCisgCQkgKiByaWdodCBncmVlbjogICAgTDIgYWN0aXZlCisgCQkgKi8KKy0JCWlmIChoYy0+Y2hhbltoYy0+ZHNsb3RdLnN5bmMgIT0gMikgeyAvKiBubyBmcmFtZSBzeW5jICovCistCQkJaWYgKGhjLT5jaGFuW2hjLT5kc2xvdF0uZGNoLT5kZXYuRC5wcm90b2NvbAorKwkJaWYgKGhjLT5jaGFuW2hjLT5kbnVtWzBdXS5zeW5jICE9IDIpIHsgLyogbm8gZnJhbWUgc3luYyAqLworKwkJCWlmIChoYy0+Y2hhbltoYy0+ZG51bVswXV0uZGNoLT5kZXYuRC5wcm90b2NvbAorIAkJCQkhPSBJU0ROX1BfTlRfRTEpIHsKKyAJCQkJbGVkWzBdID0gMTsKKyAJCQkJbGVkWzFdID0gMTsKK0BAIC0yNDI4LDU1ICsyNDI4LDU2IEBAIGhhbmRsZV90aW1lcl9pcnEoc3RydWN0IGhmY19tdWx0aSAqaGMpCisgCQkJfQorIAkJfQorIAlpZiAoaGMtPmN0eXBlID09IEhGQ19UWVBFX0UxICYmIGhjLT5jcmVhdGVkWzBdKSB7CistCQlkY2ggPSBoYy0+Y2hhbltoYy0+ZHNsb3RdLmRjaDsKKy0JCWlmICh0ZXN0X2JpdChIRkNfQ0ZHX1JFUE9SVF9MT1MsICZoYy0+Y2hhbltoYy0+ZHNsb3RdLmNmZykpIHsKKysjd2FybmluZyB0b2RvOiBwdXQgaW50ZXJmYWNlIHBhcmFtZXRlcnMgdG8gaGMKKysJCWRjaCA9IGhjLT5jaGFuW2hjLT5kbnVtWzBdXS5kY2g7CisrCQlpZiAodGVzdF9iaXQoSEZDX0NGR19SRVBPUlRfTE9TLCAmaGMtPmNoYW5baGMtPmRudW1bMF1dLmNmZykpIHsKKyAJCQkvKiBMT1MgKi8KKyAJCQl0ZW1wID0gSEZDX2luYl9ub2RlYnVnKGhjLCBSX1NZTkNfU1RBKSAmIFZfU0lHX0xPUzsKKy0JCQlpZiAoIXRlbXAgJiYgaGMtPmNoYW5baGMtPmRzbG90XS5sb3MpCisrCQkJaWYgKCF0ZW1wICYmIGhjLT5jaGFuW2hjLT5kbnVtWzBdXS5sb3MpCisgCQkJCXNpZ25hbF9zdGF0ZV91cChkY2gsIEwxX1NJR05BTF9MT1NfT04sCisgCQkJCSAgICAiTE9TIGRldGVjdGVkIik7CistCQkJaWYgKHRlbXAgJiYgIWhjLT5jaGFuW2hjLT5kc2xvdF0ubG9zKQorKwkJCWlmICh0ZW1wICYmICFoYy0+Y2hhbltoYy0+ZG51bVswXV0ubG9zKQorIAkJCQlzaWduYWxfc3RhdGVfdXAoZGNoLCBMMV9TSUdOQUxfTE9TX09GRiwKKyAJCQkJICAgICJMT1MgZ29uZSIpOworLQkJCWhjLT5jaGFuW2hjLT5kc2xvdF0ubG9zID0gdGVtcDsKKysJCQloYy0+Y2hhbltoYy0+ZG51bVswXV0ubG9zID0gdGVtcDsKKyAJCX0KKy0JCWlmICh0ZXN0X2JpdChIRkNfQ0ZHX1JFUE9SVF9BSVMsICZoYy0+Y2hhbltoYy0+ZHNsb3RdLmNmZykpIHsKKysJCWlmICh0ZXN0X2JpdChIRkNfQ0ZHX1JFUE9SVF9BSVMsICZoYy0+Y2hhbltoYy0+ZG51bVswXV0uY2ZnKSkgeworIAkJCS8qIEFJUyAqLworIAkJCXRlbXAgPSBIRkNfaW5iX25vZGVidWcoaGMsIFJfU1lOQ19TVEEpICYgVl9BSVM7CistCQkJaWYgKCF0ZW1wICYmIGhjLT5jaGFuW2hjLT5kc2xvdF0uYWlzKQorKwkJCWlmICghdGVtcCAmJiBoYy0+Y2hhbltoYy0+ZG51bVswXV0uYWlzKQorIAkJCQlzaWduYWxfc3RhdGVfdXAoZGNoLCBMMV9TSUdOQUxfQUlTX09OLAorIAkJCQkgICAgIkFJUyBkZXRlY3RlZCIpOworLQkJCWlmICh0ZW1wICYmICFoYy0+Y2hhbltoYy0+ZHNsb3RdLmFpcykKKysJCQlpZiAodGVtcCAmJiAhaGMtPmNoYW5baGMtPmRudW1bMF1dLmFpcykKKyAJCQkJc2lnbmFsX3N0YXRlX3VwKGRjaCwgTDFfU0lHTkFMX0FJU19PRkYsCisgCQkJCSAgICAiQUlTIGdvbmUiKTsKKy0JCQloYy0+Y2hhbltoYy0+ZHNsb3RdLmFpcyA9IHRlbXA7CisrCQkJaGMtPmNoYW5baGMtPmRudW1bMF1dLmFpcyA9IHRlbXA7CisgCQl9CistCQlpZiAodGVzdF9iaXQoSEZDX0NGR19SRVBPUlRfU0xJUCwgJmhjLT5jaGFuW2hjLT5kc2xvdF0uY2ZnKSkgeworKwkJaWYgKHRlc3RfYml0KEhGQ19DRkdfUkVQT1JUX1NMSVAsICZoYy0+Y2hhbltoYy0+ZG51bVswXV0uY2ZnKSkgeworIAkJCS8qIFNMSVAgKi8KKyAJCQl0ZW1wID0gSEZDX2luYl9ub2RlYnVnKGhjLCBSX1NMSVApICYgVl9GT1NMSVBfUlg7CistCQkJaWYgKCF0ZW1wICYmIGhjLT5jaGFuW2hjLT5kc2xvdF0uc2xpcF9yeCkKKysJCQlpZiAoIXRlbXAgJiYgaGMtPmNoYW5baGMtPmRudW1bMF1dLnNsaXBfcngpCisgCQkJCXNpZ25hbF9zdGF0ZV91cChkY2gsIEwxX1NJR05BTF9TTElQX1JYLAorIAkJCQkgICAgIiBiaXQgU0xJUCBkZXRlY3RlZCBSWCIpOworLQkJCWhjLT5jaGFuW2hjLT5kc2xvdF0uc2xpcF9yeCA9IHRlbXA7CisrCQkJaGMtPmNoYW5baGMtPmRudW1bMF1dLnNsaXBfcnggPSB0ZW1wOworIAkJCXRlbXAgPSBIRkNfaW5iX25vZGVidWcoaGMsIFJfU0xJUCkgJiBWX0ZPU0xJUF9UWDsKKy0JCQlpZiAoIXRlbXAgJiYgaGMtPmNoYW5baGMtPmRzbG90XS5zbGlwX3R4KQorKwkJCWlmICghdGVtcCAmJiBoYy0+Y2hhbltoYy0+ZG51bVswXV0uc2xpcF90eCkKKyAJCQkJc2lnbmFsX3N0YXRlX3VwKGRjaCwgTDFfU0lHTkFMX1NMSVBfVFgsCisgCQkJCSAgICAiIGJpdCBTTElQIGRldGVjdGVkIFRYIik7CistCQkJaGMtPmNoYW5baGMtPmRzbG90XS5zbGlwX3R4ID0gdGVtcDsKKysJCQloYy0+Y2hhbltoYy0+ZG51bVswXV0uc2xpcF90eCA9IHRlbXA7CisgCQl9CistCQlpZiAodGVzdF9iaXQoSEZDX0NGR19SRVBPUlRfUkRJLCAmaGMtPmNoYW5baGMtPmRzbG90XS5jZmcpKSB7CisrCQlpZiAodGVzdF9iaXQoSEZDX0NGR19SRVBPUlRfUkRJLCAmaGMtPmNoYW5baGMtPmRudW1bMF1dLmNmZykpIHsKKyAJCQkvKiBSREkgKi8KKyAJCQl0ZW1wID0gSEZDX2luYl9ub2RlYnVnKGhjLCBSX1JYX1NMMF8wKSAmIFZfQTsKKy0JCQlpZiAoIXRlbXAgJiYgaGMtPmNoYW5baGMtPmRzbG90XS5yZGkpCisrCQkJaWYgKCF0ZW1wICYmIGhjLT5jaGFuW2hjLT5kbnVtWzBdXS5yZGkpCisgCQkJCXNpZ25hbF9zdGF0ZV91cChkY2gsIEwxX1NJR05BTF9SRElfT04sCisgCQkJCSAgICAiUkRJIGRldGVjdGVkIik7CistCQkJaWYgKHRlbXAgJiYgIWhjLT5jaGFuW2hjLT5kc2xvdF0ucmRpKQorKwkJCWlmICh0ZW1wICYmICFoYy0+Y2hhbltoYy0+ZG51bVswXV0ucmRpKQorIAkJCQlzaWduYWxfc3RhdGVfdXAoZGNoLCBMMV9TSUdOQUxfUkRJX09GRiwKKyAJCQkJICAgICJSREkgZ29uZSIpOworLQkJCWhjLT5jaGFuW2hjLT5kc2xvdF0ucmRpID0gdGVtcDsKKysJCQloYy0+Y2hhbltoYy0+ZG51bVswXV0ucmRpID0gdGVtcDsKKyAJCX0KKyAJCXRlbXAgPSBIRkNfaW5iX25vZGVidWcoaGMsIFJfSkFUVF9ESVIpOworLQkJc3dpdGNoIChoYy0+Y2hhbltoYy0+ZHNsb3RdLnN5bmMpIHsKKysJCXN3aXRjaCAoaGMtPmNoYW5baGMtPmRudW1bMF1dLnN5bmMpIHsKKyAJCWNhc2UgMDoKKyAJCQlpZiAoKHRlbXAgJiAweDYwKSA9PSAweDYwKSB7CisgCQkJCWlmIChkZWJ1ZyAmIERFQlVHX0hGQ01VTFRJX1NZTkMpCitAQCAtMjQ4NSwxMCArMjQ4NiwxMCBAQCBoYW5kbGVfdGltZXJfaXJxKHN0cnVjdCBoZmNfbXVsdGkgKmhjKQorIAkJCQkJICAgICJpbiBjbG9jayBzeW5jXG4iLAorIAkJCQkJICAgIF9fZnVuY19fLCBoYy0+aWQpOworIAkJCQlIRkNfb3V0YihoYywgUl9SWF9PRkYsCistCQkJCSAgICBoYy0+Y2hhbltoYy0+ZHNsb3RdLmppdHRlciB8IFZfUlhfSU5JVCk7CisrCQkJCSAgICBoYy0+Y2hhbltoYy0+ZG51bVswXV0uaml0dGVyIHwgVl9SWF9JTklUKTsKKyAJCQkJSEZDX291dGIoaGMsIFJfVFhfT0ZGLAorLQkJCQkgICAgaGMtPmNoYW5baGMtPmRzbG90XS5qaXR0ZXIgfCBWX1JYX0lOSVQpOworLQkJCQloYy0+Y2hhbltoYy0+ZHNsb3RdLnN5bmMgPSAxOworKwkJCQkgICAgaGMtPmNoYW5baGMtPmRudW1bMF1dLmppdHRlciB8IFZfUlhfSU5JVCk7CisrCQkJCWhjLT5jaGFuW2hjLT5kbnVtWzBdXS5zeW5jID0gMTsKKyAJCQkJZ290byBjaGVja19mcmFtZXN5bmM7CisgCQkJfQorIAkJCWJyZWFrOworQEAgLTI0OTksNyArMjUwMCw3IEBAIGhhbmRsZV90aW1lcl9pcnEoc3RydWN0IGhmY19tdWx0aSAqaGMpCisgCQkJCQkgICAgIiVzOiAoaWQ9JWQpIEUxICIKKyAJCQkJCSAgICAibG9zdCBjbG9jayBzeW5jXG4iLAorIAkJCQkJICAgIF9fZnVuY19fLCBoYy0+aWQpOworLQkJCQloYy0+Y2hhbltoYy0+ZHNsb3RdLnN5bmMgPSAwOworKwkJCQloYy0+Y2hhbltoYy0+ZG51bVswXV0uc3luYyA9IDA7CisgCQkJCWJyZWFrOworIAkJCX0KKyBjaGVja19mcmFtZXN5bmM6CitAQCAtMjUxMCw3ICsyNTExLDcgQEAgY2hlY2tfZnJhbWVzeW5jOgorIAkJCQkJICAgICIlczogKGlkPSVkKSBFMSAiCisgCQkJCQkgICAgIm5vdyBpbiBmcmFtZSBzeW5jXG4iLAorIAkJCQkJICAgIF9fZnVuY19fLCBoYy0+aWQpOworLQkJCQloYy0+Y2hhbltoYy0+ZHNsb3RdLnN5bmMgPSAyOworKwkJCQloYy0+Y2hhbltoYy0+ZG51bVswXV0uc3luYyA9IDI7CisgCQkJfQorIAkJCWJyZWFrOworIAkJY2FzZSAyOgorQEAgLTI1MjAsNyArMjUyMSw3IEBAIGNoZWNrX2ZyYW1lc3luYzoKKyAJCQkJCSAgICAiJXM6IChpZD0lZCkgRTEgbG9zdCAiCisgCQkJCQkgICAgImNsb2NrICYgZnJhbWUgc3luY1xuIiwKKyAJCQkJCSAgICBfX2Z1bmNfXywgaGMtPmlkKTsKKy0JCQkJaGMtPmNoYW5baGMtPmRzbG90XS5zeW5jID0gMDsKKysJCQkJaGMtPmNoYW5baGMtPmRudW1bMF1dLnN5bmMgPSAwOworIAkJCQlicmVhazsKKyAJCQl9CisgCQkJdGVtcCA9IEhGQ19pbmJfbm9kZWJ1ZyhoYywgUl9TWU5DX1NUQSk7CitAQCAtMjUzMCw3ICsyNTMxLDcgQEAgY2hlY2tfZnJhbWVzeW5jOgorIAkJCQkJICAgICIlczogKGlkPSVkKSBFMSAiCisgCQkJCQkgICAgImxvc3QgZnJhbWUgc3luY1xuIiwKKyAJCQkJCSAgICBfX2Z1bmNfXywgaGMtPmlkKTsKKy0JCQkJaGMtPmNoYW5baGMtPmRzbG90XS5zeW5jID0gMTsKKysJCQkJaGMtPmNoYW5baGMtPmRudW1bMF1dLnN5bmMgPSAxOworIAkJCX0KKyAJCQlicmVhazsKKyAJCX0KK0BAIC0yNzQ2LDcgKzI3NDcsOCBAQCBoZmNtdWx0aV9pbnRlcnJ1cHQoaW50IGludG5vLCB2b2lkICpkZXZfaWQpCisgCQlpZiAocl9pcnFfbWlzYyAmIFZfU1RBX0lSUSkgeworIAkJCWlmIChoYy0+Y3R5cGUgPT0gSEZDX1RZUEVfRTEpIHsKKyAJCQkJLyogc3RhdGUgbWFjaGluZSAqLworLQkJCQlkY2ggPSBoYy0+Y2hhbltoYy0+ZHNsb3RdLmRjaDsKKysjd2FybmluZyB0b2RvCisrCQkJCWRjaCA9IGhjLT5jaGFuW2hjLT5kbnVtWzBdXS5kY2g7CisgCQkJCWUxX3N5bmNzdGEgPSBIRkNfaW5iX25vZGVidWcoaGMsIFJfU1lOQ19TVEEpOworIAkJCQlpZiAodGVzdF9iaXQoSEZDX0NISVBfUExYU0QsICZoYy0+Y2hpcCkKKyAJCQkJICYmIGhjLT5lMV9nZXRjbG9jaykgeworQEAgLTI3NjgsNyArMjc3MCwxNSBAQCBoZmNtdWx0aV9pbnRlcnJ1cHQoaW50IGludG5vLCB2b2lkICpkZXZfaWQpCisgCQkJCX0KKyAJCQkJZGNoLT5zdGF0ZSA9IEhGQ19pbmJfbm9kZWJ1ZyhoYywgUl9FMV9SRF9TVEEpCisgCQkJCQkmIDB4NzsKKysjd2FybmluZyB0b2RvIGhhY2shISEgYnJvYWRjYXN0IHN0YXRlIGNoYW5nZSEhIQorKwkJCQlkY2ggPSBoYy0+Y2hhbltoYy0+ZG51bVswXV0uZGNoOworIAkJCQlzY2hlZHVsZV9ldmVudChkY2gsIEZMR19QSENIQU5HRSk7CisrCQkJCWRjaCA9IGhjLT5jaGFuW2hjLT5kbnVtWzFdXS5kY2g7CisrCQkJCWRjaC0+c3RhdGUgPSBIRkNfaW5iX25vZGVidWcoaGMsIFJfRTFfUkRfU1RBKQorKwkJCQkJJiAweDc7CisrCQkJCXNjaGVkdWxlX2V2ZW50KGRjaCwgRkxHX1BIQ0hBTkdFKTsKKysKKysKKyAJCQkJaWYgKGRlYnVnICYgREVCVUdfSEZDTVVMVElfU1RBVEUpCisgCQkJCQlwcmludGsoS0VSTl9ERUJVRworIAkJCQkJICAgICIlczogRTEgKGlkPSVkKSBuZXdzdGF0ZSAleFxuIiwKK0BAIC0zODUxLDMxICszODYxLDM1IEBAIGhmY211bHRpX2luaXRtb2RlKHN0cnVjdCBkY2hhbm5lbCAqZGNoKQorIAlpZiAoZGVidWcgJiBERUJVR19IRkNNVUxUSV9JTklUKQorIAkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBlbnRlcmVkXG4iLCBfX2Z1bmNfXyk7CisgCisrCWkgPSBkY2gtPnNsb3Q7CisrCXB0ID0gaGMtPmNoYW5baV0ucG9ydDsKKyAJaWYgKGhjLT5jdHlwZSA9PSBIRkNfVFlQRV9FMSkgeworLQkJaGMtPmNoYW5baGMtPmRzbG90XS5zbG90X3R4ID0gLTE7CistCQloYy0+Y2hhbltoYy0+ZHNsb3RdLnNsb3RfcnggPSAtMTsKKy0JCWhjLT5jaGFuW2hjLT5kc2xvdF0uY29uZiA9IC0xOworLQkJaWYgKGhjLT5kc2xvdCkgeworLQkJCW1vZGVfaGZjbXVsdGkoaGMsIGhjLT5kc2xvdCwgZGNoLT5kZXYuRC5wcm90b2NvbCwKKysJCS8qIEUxICovCisrI3dhcm5pbmcgdG9kbzogZG9uJyd0IGRvIGl0IGlmIGRudW0gPT0gMAorKwkJaGMtPmNoYW5baGMtPmRudW1bcHRdXS5zbG90X3R4ID0gLTE7CisrCQloYy0+Y2hhbltoYy0+ZG51bVtwdF1dLnNsb3RfcnggPSAtMTsKKysJCWhjLT5jaGFuW2hjLT5kbnVtW3B0XV0uY29uZiA9IC0xOworKwkJaWYgKGhjLT5kbnVtW3B0XSkgeworKwkJCW1vZGVfaGZjbXVsdGkoaGMsIGRjaC0+c2xvdCwgZGNoLT5kZXYuRC5wcm90b2NvbCwKKyAJCQkJLTEsIDAsIC0xLCAwKTsKKyAJCQlkY2gtPnRpbWVyLmZ1bmN0aW9uID0gKHZvaWQgKikgaGZjbXVsdGlfZGJ1c3lfdGltZXI7CisgCQkJZGNoLT50aW1lci5kYXRhID0gKGxvbmcpIGRjaDsKKyAJCQlpbml0X3RpbWVyKCZkY2gtPnRpbWVyKTsKKyAJCX0KKyAJCWZvciAoaSA9IDE7IGkgPD0gMzE7IGkrKykgeworLQkJCWlmIChpID09IGhjLT5kc2xvdCkKKysJCQlpZiAoISgoMSA8PCBpKSAmIGhjLT5ibWFza1twdF0pKSAvKiBza2lwIHVudXNlZCBjaGFubmVsICovCisgCQkJCWNvbnRpbnVlOworIAkJCWhjLT5jaGFuW2ldLnNsb3RfdHggPSAtMTsKKyAJCQloYy0+Y2hhbltpXS5zbG90X3J4ID0gLTE7CisgCQkJaGMtPmNoYW5baV0uY29uZiA9IC0xOworIAkJCW1vZGVfaGZjbXVsdGkoaGMsIGksIElTRE5fUF9OT05FLCAtMSwgMCwgLTEsIDApOworIAkJfQorLQkJLyogRTEgKi8KKy0JCWlmICh0ZXN0X2JpdChIRkNfQ0ZHX1JFUE9SVF9MT1MsICZoYy0+Y2hhbltoYy0+ZHNsb3RdLmNmZykpIHsKKysjd2FybmluZyB0b2RvIChnbG9iYWwpCisrCQlpZiAodGVzdF9iaXQoSEZDX0NGR19SRVBPUlRfTE9TLCAmaGMtPmNoYW5baGMtPmRudW1bcHRdXS5jZmcpKSB7CisgCQkJSEZDX291dGIoaGMsIFJfTE9TMCwgMjU1KTsgLyogMiBtcyAqLworIAkJCUhGQ19vdXRiKGhjLCBSX0xPUzEsIDI1NSk7IC8qIDUxMiBtcyAqLworIAkJfQorLQkJaWYgKHRlc3RfYml0KEhGQ19DRkdfT1BUSUNBTCwgJmhjLT5jaGFuW2hjLT5kc2xvdF0uY2ZnKSkgeworKwkJaWYgKHRlc3RfYml0KEhGQ19DRkdfT1BUSUNBTCwgJmhjLT5jaGFuW2hjLT5kbnVtW3B0XV0uY2ZnKSkgeworIAkJCUhGQ19vdXRiKGhjLCBSX1JYMCwgMCk7CisgCQkJaGMtPmh3LnJfdHgwID0gMCB8IFZfT1VUX0VOOworIAkJfSBlbHNlIHsKK0BAIC0zODg4LDEyICszOTAyLDEyIEBAIGhmY211bHRpX2luaXRtb2RlKHN0cnVjdCBkY2hhbm5lbCAqZGNoKQorIAkJSEZDX291dGIoaGMsIFJfVFhfRlIwLCAweDAwKTsKKyAJCUhGQ19vdXRiKGhjLCBSX1RYX0ZSMSwgMHhmOCk7CisgCistCQlpZiAodGVzdF9iaXQoSEZDX0NGR19DUkM0LCAmaGMtPmNoYW5baGMtPmRzbG90XS5jZmcpKQorKwkJaWYgKHRlc3RfYml0KEhGQ19DRkdfQ1JDNCwgJmhjLT5jaGFuW2hjLT5kbnVtW3B0XV0uY2ZnKSkKKyAJCQlIRkNfb3V0YihoYywgUl9UWF9GUjIsIFZfVFhfTUYgfCBWX1RYX0UgfCBWX05FR19FKTsKKyAKKyAJCUhGQ19vdXRiKGhjLCBSX1JYX0ZSMCwgVl9BVVRPX1JFU1lOQyB8IFZfQVVUT19SRUNPIHwgMCk7CisgCistCQlpZiAodGVzdF9iaXQoSEZDX0NGR19DUkM0LCAmaGMtPmNoYW5baGMtPmRzbG90XS5jZmcpKQorKwkJaWYgKHRlc3RfYml0KEhGQ19DRkdfQ1JDNCwgJmhjLT5jaGFuW2hjLT5kbnVtW3B0XV0uY2ZnKSkKKyAJCQlIRkNfb3V0YihoYywgUl9SWF9GUjEsIFZfUlhfTUYgfCBWX1JYX01GX1NZTkMpOworIAorIAkJaWYgKGRjaC0+ZGV2LkQucHJvdG9jb2wgPT0gSVNETl9QX05UX0UxKSB7CitAQCAtMzk1Nyw3ICszOTcxLDcgQEAgaGZjbXVsdGlfaW5pdG1vZGUoc3RydWN0IGRjaGFubmVsICpkY2gpCisgCQkJcGx4c2RfY2hlY2tzeW5jKGhjLCAwKTsKKyAJCX0KKyAJfSBlbHNlIHsKKy0JCWkgPSBkY2gtPnNsb3Q7CisrCQkvKiBTVCAqLworIAkJaGMtPmNoYW5baV0uc2xvdF90eCA9IC0xOworIAkJaGMtPmNoYW5baV0uc2xvdF9yeCA9IC0xOworIAkJaGMtPmNoYW5baV0uY29uZiA9IC0xOworQEAgLTM5NzMsOCArMzk4Nyw2IEBAIGhmY211bHRpX2luaXRtb2RlKHN0cnVjdCBkY2hhbm5lbCAqZGNoKQorIAkJaGMtPmNoYW5baSAtIDFdLnNsb3RfcnggPSAtMTsKKyAJCWhjLT5jaGFuW2kgLSAxXS5jb25mID0gLTE7CisgCQltb2RlX2hmY211bHRpKGhjLCBpIC0gMSwgSVNETl9QX05PTkUsIC0xLCAwLCAtMSwgMCk7CistCQkvKiBTVCAqLworLQkJcHQgPSBoYy0+Y2hhbltpXS5wb3J0OworIAkJLyogc2VsZWN0IGludGVyZmFjZSAqLworIAkJSEZDX291dGIoaGMsIFJfU1RfU0VMLCBwdCk7CisgCQkvKiB1bmRvY3VtZW50ZWQ6IGRlbGF5IGFmdGVyIFJfU1RfU0VMICovCitAQCAtNDU1Nyw2ICs0NTY5LDggQEAgcmVsZWFzZV9wb3J0KHN0cnVjdCBoZmNfbXVsdGkgKmhjLCBzdHJ1Y3QgZGNoYW5uZWwgKmRjaCkKKyAJCX0KKyAJCS8qIGZyZWUgY2hhbm5lbHMgKi8KKyAJCWZvciAoaSA9IDA7IGkgPD0gMzE7IGkrKykgeworKwkJCWlmICghKCgxIDw8IGkpICYgaGMtPmJtYXNrW3B0XSkpIC8qIHNraXAgdW51c2VkIGNoYW5uZWwgKi8KKysJCQkJY29udGludWU7CisgCQkJaWYgKGhjLT5jaGFuW2ldLmJjaCkgeworIAkJCQlpZiAoZGVidWcgJiBERUJVR19IRkNNVUxUSV9JTklUKQorIAkJCQkJcHJpbnRrKEtFUk5fREVCVUcKK0BAIC00NjgwLDEyICs0Njk0LDEzIEBAIHJlbGVhc2VfY2FyZChzdHJ1Y3QgaGZjX211bHRpICpoYykKKyB9CisgCisgc3RhdGljIGludAorLWluaXRfZTFfcG9ydChzdHJ1Y3QgaGZjX211bHRpICpoYywgc3RydWN0IGhtX21hcCAqbSkKKytpbml0X2UxX3BvcnQoc3RydWN0IGhmY19tdWx0aSAqaGMsIHN0cnVjdCBobV9tYXAgKm0sIGludCBwdCkKKyB7CisgCXN0cnVjdCBkY2hhbm5lbAkqZGNoOworIAlzdHJ1Y3QgYmNoYW5uZWwJKmJjaDsKKyAJaW50CQljaCwgcmV0ID0gMDsKKyAJY2hhcgkJbmFtZVtNSVNETl9NQVhfSURMRU5dOworKwlpbnQJCWJjb3VudCA9IDA7CisgCisgCWRjaCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkY2hhbm5lbCksIEdGUF9LRVJORUwpOworIAlpZiAoIWRjaCkKK0BAIC00Njk4LDEzICs0NzEzLDEyIEBAIGluaXRfZTFfcG9ydChzdHJ1Y3QgaGZjX211bHRpICpoYywgc3RydWN0IGhtX21hcCAqbSkKKyAJICAgICgxIDw8IChJU0ROX1BfQl9IRExDICYgSVNETl9QX0JfTUFTSykpOworIAlkY2gtPmRldi5ELnNlbmQgPSBoYW5kbGVfZG1zZzsKKyAJZGNoLT5kZXYuRC5jdHJsID0gaGZjbV9kY3RybDsKKy0JZGNoLT5kZXYubnJiY2hhbiA9IChoYy0+ZHNsb3QpID8gMzAgOiAzMTsKKy0JZGNoLT5zbG90ID0gaGMtPmRzbG90OworLQloYy0+Y2hhbltoYy0+ZHNsb3RdLmRjaCA9IGRjaDsKKy0JaGMtPmNoYW5baGMtPmRzbG90XS5wb3J0ID0gMDsKKy0JaGMtPmNoYW5baGMtPmRzbG90XS5udF90aW1lciA9IC0xOworKwlkY2gtPnNsb3QgPSBoYy0+ZG51bVtwdF07CisrCWhjLT5jaGFuW2hjLT5kbnVtW3B0XV0uZGNoID0gZGNoOworKwloYy0+Y2hhbltoYy0+ZG51bVtwdF1dLnBvcnQgPSBwdDsKKysJaGMtPmNoYW5baGMtPmRudW1bcHRdXS5udF90aW1lciA9IC0xOworIAlmb3IgKGNoID0gMTsgY2ggPD0gMzE7IGNoKyspIHsKKy0JCWlmIChjaCA9PSBoYy0+ZHNsb3QpIC8qIHNraXAgZGNoYW5uZWwgKi8KKysJCWlmICghKCgxIDw8IGNoKSAmIGhjLT5ibWFza1twdF0pKSAvKiBza2lwIHVudXNlZCBjaGFubmVsICovCisgCQkJY29udGludWU7CisgCQliY2ggPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYmNoYW5uZWwpLCBHRlBfS0VSTkVMKTsKKyAJCWlmICghYmNoKSB7CitAQCAtNDczMyw3ICs0NzQ3LDEwIEBAIGluaXRfZTFfcG9ydChzdHJ1Y3QgaGZjX211bHRpICpoYywgc3RydWN0IGhtX21hcCAqbSkKKyAJCWhjLT5jaGFuW2NoXS5iY2ggPSBiY2g7CisgCQloYy0+Y2hhbltjaF0ucG9ydCA9IDA7CisgCQlzZXRfY2hhbm5lbG1hcChiY2gtPm5yLCBkY2gtPmRldi5jaGFubmVsbWFwKTsKKysJCWJjb3VudCsrOworIAl9CisrCWRjaC0+ZGV2Lm5yYmNoYW4gPSBiY291bnQ7CisrI3dhcm5pbmcgdG9kbzogbXVzdCBiZSBzZXQgZ2xvYmFsbHksIGFuZCBtdXN0IGJlIGEgc2VwZXJhdGUgZnVuY3Rpb24KKyAJLyogc2V0IG9wdGljYWwgbGluZSB0eXBlICovCisgCWlmIChwb3J0W1BvcnRfY250XSAmIDB4MDAxKSB7CisgCQlpZiAoIW0tPm9wdGljYWxzdXBwb3J0KSAgeworQEAgLTQ3NDksNyArNDc2Niw3IEBAIGluaXRfZTFfcG9ydChzdHJ1Y3QgaGZjX211bHRpICpoYywgc3RydWN0IGhtX21hcCAqbSkKKyAJCQkJICAgIF9fZnVuY19fLAorIAkJCQkgICAgSEZDX2NudCArIDEsIDEpOworIAkJCXRlc3RfYW5kX3NldF9iaXQoSEZDX0NGR19PUFRJQ0FMLAorLQkJCSAgICAmaGMtPmNoYW5baGMtPmRzbG90XS5jZmcpOworKwkJCSAgICAmaGMtPmNoYW5baGMtPmRudW1bcHRdXS5jZmcpOworIAkJfQorIAl9CisgCS8qIHNldCBMT1MgcmVwb3J0ICovCitAQCAtNDc1OSw3ICs0Nzc2LDcgQEAgaW5pdF9lMV9wb3J0KHN0cnVjdCBoZmNfbXVsdGkgKmhjLCBzdHJ1Y3QgaG1fbWFwICptKQorIAkJCSAgICAiTE9TIHJlcG9ydDogY2FyZCglZCkgcG9ydCglZClcbiIsCisgCQkJICAgIF9fZnVuY19fLCBIRkNfY250ICsgMSwgMSk7CisgCQl0ZXN0X2FuZF9zZXRfYml0KEhGQ19DRkdfUkVQT1JUX0xPUywKKy0JCSAgICAmaGMtPmNoYW5baGMtPmRzbG90XS5jZmcpOworKwkJICAgICZoYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmNmZyk7CisgCX0KKyAJLyogc2V0IEFJUyByZXBvcnQgKi8KKyAJaWYgKHBvcnRbUG9ydF9jbnRdICYgMHgwMDgpIHsKK0BAIC00NzY4LDcgKzQ3ODUsNyBAQCBpbml0X2UxX3BvcnQoc3RydWN0IGhmY19tdWx0aSAqaGMsIHN0cnVjdCBobV9tYXAgKm0pCisgCQkJICAgICJBSVMgcmVwb3J0OiBjYXJkKCVkKSBwb3J0KCVkKVxuIiwKKyAJCQkgICAgX19mdW5jX18sIEhGQ19jbnQgKyAxLCAxKTsKKyAJCXRlc3RfYW5kX3NldF9iaXQoSEZDX0NGR19SRVBPUlRfQUlTLAorLQkJICAgICZoYy0+Y2hhbltoYy0+ZHNsb3RdLmNmZyk7CisrCQkgICAgJmhjLT5jaGFuW2hjLT5kbnVtW3B0XV0uY2ZnKTsKKyAJfQorIAkvKiBzZXQgU0xJUCByZXBvcnQgKi8KKyAJaWYgKHBvcnRbUG9ydF9jbnRdICYgMHgwMTApIHsKK0BAIC00Nzc4LDcgKzQ3OTUsNyBAQCBpbml0X2UxX3BvcnQoc3RydWN0IGhmY19tdWx0aSAqaGMsIHN0cnVjdCBobV9tYXAgKm0pCisgCQkJICAgICJjYXJkKCVkKSBwb3J0KCVkKVxuIiwKKyAJCQkgICAgX19mdW5jX18sIEhGQ19jbnQgKyAxLCAxKTsKKyAJCXRlc3RfYW5kX3NldF9iaXQoSEZDX0NGR19SRVBPUlRfU0xJUCwKKy0JCSAgICAmaGMtPmNoYW5baGMtPmRzbG90XS5jZmcpOworKwkJICAgICZoYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmNmZyk7CisgCX0KKyAJLyogc2V0IFJESSByZXBvcnQgKi8KKyAJaWYgKHBvcnRbUG9ydF9jbnRdICYgMHgwMjApIHsKK0BAIC00Nzg4LDcgKzQ4MDUsNyBAQCBpbml0X2UxX3BvcnQoc3RydWN0IGhmY19tdWx0aSAqaGMsIHN0cnVjdCBobV9tYXAgKm0pCisgCQkJICAgICJjYXJkKCVkKSBwb3J0KCVkKVxuIiwKKyAJCQkgICAgX19mdW5jX18sIEhGQ19jbnQgKyAxLCAxKTsKKyAJCXRlc3RfYW5kX3NldF9iaXQoSEZDX0NGR19SRVBPUlRfUkRJLAorLQkJICAgICZoYy0+Y2hhbltoYy0+ZHNsb3RdLmNmZyk7CisrCQkgICAgJmhjLT5jaGFuW2hjLT5kbnVtW3B0XV0uY2ZnKTsKKyAJfQorIAkvKiBzZXQgQ1JDLTQgTW9kZSAqLworIAlpZiAoIShwb3J0W1BvcnRfY250XSAmIDB4MTAwKSkgeworQEAgLTQ3OTcsNyArNDgxNCw3IEBAIGluaXRfZTFfcG9ydChzdHJ1Y3QgaGZjX211bHRpICpoYywgc3RydWN0IGhtX21hcCAqbSkKKyAJCQkJIiBjYXJkKCVkKSBwb3J0KCVkKVxuIiwKKyAJCQkJX19mdW5jX18sIEhGQ19jbnQgKyAxLCAxKTsKKyAJCXRlc3RfYW5kX3NldF9iaXQoSEZDX0NGR19DUkM0LAorLQkJICAgICZoYy0+Y2hhbltoYy0+ZHNsb3RdLmNmZyk7CisrCQkgICAgJmhjLT5jaGFuW2hjLT5kbnVtW3B0XV0uY2ZnKTsKKyAJfSBlbHNlIHsKKyAJCWlmIChkZWJ1ZyAmIERFQlVHX0hGQ01VTFRJX0lOSVQpCisgCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBQT1JUIHR1cm4gb2ZmIENSQzQiCitAQCAtNDgyOSwyMCArNDg0NiwyMyBAQCBpbml0X2UxX3BvcnQoc3RydWN0IGhmY19tdWx0aSAqaGMsIHN0cnVjdCBobV9tYXAgKm0pCisgCX0KKyAJLyogc2V0IGVsYXN0aWMgaml0dGVyIGJ1ZmZlciAqLworIAlpZiAocG9ydFtQb3J0X2NudF0gJiAweDMwMDApIHsKKy0JCWhjLT5jaGFuW2hjLT5kc2xvdF0uaml0dGVyID0gKHBvcnRbUG9ydF9jbnRdPj4xMikgJiAweDM7CisrCQloYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmppdHRlciA9IChwb3J0W1BvcnRfY250XT4+MTIpICYgMHgzOworIAkJaWYgKGRlYnVnICYgREVCVUdfSEZDTVVMVElfSU5JVCkKKyAJCQlwcmludGsoS0VSTl9ERUJVRworIAkJCSAgICAiJXM6IFBPUlQgc2V0IGVsYXN0aWMgIgorIAkJCSAgICAiYnVmZmVyIHRvICVkOiBjYXJkKCVkKSBwb3J0KCVkKVxuIiwKKy0JCQkgICAgX19mdW5jX18sIGhjLT5jaGFuW2hjLT5kc2xvdF0uaml0dGVyLAorKwkJCSAgICBfX2Z1bmNfXywgaGMtPmNoYW5baGMtPmRudW1bcHRdXS5qaXR0ZXIsCisgCQkJICAgIEhGQ19jbnQgKyAxLCAxKTsKKyAJfSBlbHNlCistCQloYy0+Y2hhbltoYy0+ZHNsb3RdLmppdHRlciA9IDI7IC8qIGRlZmF1bHQgKi8KKy0Jc25wcmludGYobmFtZSwgTUlTRE5fTUFYX0lETEVOIC0gMSwgImhmYy1lMS4lZCIsIEhGQ19jbnQgKyAxKTsKKysJCWhjLT5jaGFuW2hjLT5kbnVtW3B0XV0uaml0dGVyID0gMjsgLyogZGVmYXVsdCAqLworKwlpZiAoaGMtPnBvcnRzID4gMSkKKysJCXNucHJpbnRmKG5hbWUsIE1JU0ROX01BWF9JRExFTiAtIDEsICJoZmMtZTEuJWQtJWQiLCBIRkNfY250ICsgMSwgcHQrMSk7CisrCWVsc2UKKysJCXNucHJpbnRmKG5hbWUsIE1JU0ROX01BWF9JRExFTiAtIDEsICJoZmMtZTEuJWQiLCBIRkNfY250ICsgMSk7CisgCXJldCA9IG1JU0ROX3JlZ2lzdGVyX2RldmljZSgmZGNoLT5kZXYsICZoYy0+cGNpX2Rldi0+ZGV2LCBuYW1lKTsKKyAJaWYgKHJldCkKKyAJCWdvdG8gZnJlZV9jaGFuOworLQloYy0+Y3JlYXRlZFswXSA9IDE7CisrCWhjLT5jcmVhdGVkW3B0XSA9IDE7CisgCXJldHVybiByZXQ7CisgZnJlZV9jaGFuOgorIAlyZWxlYXNlX3BvcnQoaGMsIGRjaCk7CitAQCAtNTAwOSwxOCArNTAyOSwzMCBAQCBoZmNtdWx0aV9pbml0KHN0cnVjdCBobV9tYXAgKm0sIHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorIAloYy0+aWQgPSBIRkNfY250OworIAloYy0+cGNtID0gcGNtW0hGQ19jbnRdOworIAloYy0+aW9fbW9kZSA9IGlvbW9kZVtIRkNfY250XTsKKysjd2FybmluZyB0b2RvOiByZXdvcmsgbW9kdWxlIHBhcmFtZXRlcnMgZm9yIGN1c3RvbWl6aW5nIGUxIGZyYWdtZW50cy4uLi4geWVhLCBsZXQnJ3MgY2FsbCBpdDogZnJhZ21lbnRzCisgCWlmIChkc2xvdFtIRkNfY250XSA8IDAgJiYgaGMtPmN0eXBlID09IEhGQ19UWVBFX0UxKSB7CistCQloYy0+ZHNsb3QgPSAwOworKwkJaGMtPmRudW1bMF0gPSAwOworIAkJcHJpbnRrKEtFUk5fSU5GTyAiSEZDLUUxIGNhcmQgaGFzIGRpc2FibGVkIEQtY2hhbm5lbCwgYnV0ICIKKyAJCQkiMzEgQi1jaGFubmVsc1xuIik7CisgCX0KKyAJaWYgKGRzbG90W0hGQ19jbnRdID4gMCAmJiBkc2xvdFtIRkNfY250XSA8IDMyCisgCSAgICAmJiBoYy0+Y3R5cGUgPT0gSEZDX1RZUEVfRTEpIHsKKy0JCWhjLT5kc2xvdCA9IGRzbG90W0hGQ19jbnRdOworKwkJaGMtPmRudW1bMF0gPSBkc2xvdFtIRkNfY250XTsKKyAJCXByaW50ayhLRVJOX0lORk8gIkhGQy1FMSBjYXJkIGhhcyBhbHRlcm5hdGluZyBELWNoYW5uZWwgb24gIgorIAkJCSJ0aW1lIHNsb3QgJWRcbiIsIGRzbG90W0hGQ19jbnRdKTsKKyAJfSBlbHNlCistCQloYy0+ZHNsb3QgPSAxNjsKKysJCWhjLT5kbnVtWzBdID0gMTY7CisrCisrI3dhcm5pbmcgdG9kbyBIQUNLISEhIGp1c3QgYSBzbWFsbCBtYXAgb2YgdHdvICJmcmFnbWVudHMiCisrCWlmIChoYy0+Y3R5cGUgPT0gSEZDX1RZUEVfRTEpIHsKKysJCWhjLT5kbnVtWzBdID0gMTsKKysJCWhjLT5ibWFza1swXSA9IDB4MDAwMDAwM2M7CisrCQloYy0+ZG51bVsxXSA9IDY7CisrCQloYy0+Ym1hc2tbMV0gPSAweDAwMDAwNzgwOworKwkJaGMtPmRudW1bMl0gPSAxMTsKKysJCWhjLT5ibWFza1syXSA9IDB4MDAwMDc4MDA7CisrCQloYy0+cG9ydHMgPSAzOworKwl9CisgCisgCS8qIHNldCBjaGlwIHNwZWNpZmljIGZlYXR1cmVzICovCisgCWhjLT5tYXN0ZXJjbGsgPSAtMTsKK0BAIC01MTAzLDcgKzUxMzUsNyBAQCBoZmNtdWx0aV9pbml0KHN0cnVjdCBobV9tYXAgKm0sIHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorIAkJCWdvdG8gZnJlZV9jYXJkOworIAkJfQorIAkJaWYgKGhjLT5jdHlwZSA9PSBIRkNfVFlQRV9FMSkKKy0JCQlyZXRfZXJyID0gaW5pdF9lMV9wb3J0KGhjLCBtKTsKKysJCQlyZXRfZXJyID0gaW5pdF9lMV9wb3J0KGhjLCBtLCBwdCk7CisgCQllbHNlCisgCQkJcmV0X2VyciA9IGluaXRfbXVsdGlfcG9ydChoYywgcHQpOworIAkJaWYgKGRlYnVnICYgREVCVUdfSEZDTVVMVElfSU5JVCkKK0BAIC01MTE1LDEwICs1MTQ3LDE0IEBAIGhmY211bHRpX2luaXQoc3RydWN0IGhtX21hcCAqbSwgc3RydWN0IHBjaV9kZXYgKnBkZXYsCisgCQlpZiAocmV0X2VycikgeworIAkJCXdoaWxlIChwdCkgeyAvKiByZWxlYXNlIGFscmVhZHkgcmVnaXN0ZXJlZCBwb3J0cyAqLworIAkJCQlwdC0tOworLQkJCQlyZWxlYXNlX3BvcnQoaGMsIGhjLT5jaGFuWyhwdCA8PCAyKSArIDJdLmRjaCk7CisrCQkJCWlmIChoYy0+Y3R5cGUgPT0gSEZDX1RZUEVfRTEpCisrCQkJCQlyZWxlYXNlX3BvcnQoaGMsIGhjLT5jaGFuW2hjLT5kbnVtW3B0XV0uZGNoKTsKKysJCQkJZWxzZQorKwkJCQkJcmVsZWFzZV9wb3J0KGhjLCBoYy0+Y2hhblsocHQgPDwgMikgKyAyXS5kY2gpOworIAkJCX0KKyAJCQlnb3RvIGZyZWVfY2FyZDsKKyAJCX0KKysjd2FybmluZyB0b2RvOiBjb3VudCBpdCByaWdodCwgYWRkIGFkZGl0aW9uYWwgImZyYWdtZW50IiBjb3VudGVyLi4uCisgCQlQb3J0X2NudCsrOworIAl9CisgCmRpZmYgLS1naXQgYS9vcGVuYnNjLy5naXRpZ25vcmUgYi9vcGVuYnNjLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk2ODExNAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDQ4IEBACisqLm8KKyouYQorLmRlcHMKK01ha2VmaWxlCitNYWtlZmlsZS5pbgorYnNjY29uZmlnLmgKK2JzY2NvbmZpZy5oLmluCitvcGVuYnNjLnBjCitic2NfaGFjaworYnNjX21zY19pcAorYnNjX21nY3AKKyouKn4KKyouc3c/CisKKyNjb25maWd1cmUKK2FjbG9jYWwubTQKK2F1dG9tNHRlLmNhY2hlLworY29uZmlnLmxvZworY29uZmlnLnN0YXR1cworY29uZmlndXJlCitkZXBjb21wCitpbnN0YWxsLXNoCittaXNzaW5nCitzdGFtcC1oMQorCisjIGdpdC12ZXJzaW9uLWdlbiBtYWdpYworLnRhcmJhbGwtdmVyc2lvbgorLnZlcnNpb24KKworCisjIGFwcHMgYW5kIGFwcCBkYXRhCitobHIuc3FsaXRlMworYnMxMV9jb25maWcKK2lwYWNjZXNzLWNvbmZpZworaXBhY2Nlc3MtZmluZAoraXBhY2Nlc3MtZmlybXdhcmUKK2lwYWNjZXNzLXByb3h5Citpc2Ruc3luYworCisjdGVzdHMKK3Rlc3RzL2NoYW5uZWwvY2hhbm5lbF90ZXN0Cit0ZXN0cy9kYi9kYl90ZXN0Cit0ZXN0cy9kZWJ1Zy9kZWJ1Z190ZXN0Cit0ZXN0cy9nc20wNDA4L2dzbTA0MDhfdGVzdAordGVzdHMvc2NjcC9zY2NwX3Rlc3QKK3Rlc3RzL3Ntcy9zbXNfdGVzdAordGVzdHMvdGltZXIvdGltZXJfdGVzdAorCmRpZmYgLS1naXQgYS9vcGVuYnNjL0FVVEhPUlMgYi9vcGVuYnNjL0FVVEhPUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFmNjBlNAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvQVVUSE9SUwpAQCAtMCwwICsxLDcgQEAKK0hhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CitIb2xnZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorSmFuIEx1ZWJiZSA8amx1ZWJiZUBkZWJpYW4ub3JnPgorU3RlZmFuIFNjaG1pZHQgPHN0ZWZhbkBkYXRlbmZyZWloYWZlbi5vcmc+CitEYW5pZWwgV2lsbG1hbm4gPGRhbmllbEB0b3RhbHVlYmVyd2FjaHVuZy5kZT4KK0FuZHJlYXMgRXZlcnNiZXJnIDxBbmRyZWFzLkV2ZXJzYmVyZ0B2ZXJzYXRlbC5kZT4KK1N5bHZhaW4gTXVuYXV0IDwyNDZ0bnRAZ21haWwuY29tPgpkaWZmIC0tZ2l0IGEvQ09QWUlORyBiL29wZW5ic2MvQ09QWUlORwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIENPUFlJTkcKY29weSB0byBvcGVuYnNjL0NPUFlJTkcKZGlmZiAtLWdpdCBhL29wZW5ic2MvTWFrZWZpbGUuYW0gYi9vcGVuYnNjL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZTExY2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTMgQEAKK0FVVE9NQUtFX09QVElPTlMgPSBmb3JlaWduIGRpc3QtYnppcDIgMS42CisKK0lOQ0xVREVTID0gJChhbGxfaW5jbHVkZXMpIC1JJCh0b3Bfc3JjZGlyKS9pbmNsdWRlCitTVUJESVJTID0gaW5jbHVkZSBzcmMgdGVzdHMKKworcGtnY29uZmlnZGlyID0gJChsaWJkaXIpL3BrZ2NvbmZpZworcGtnY29uZmlnX0RBVEEgPSBvcGVuYnNjLnBjIGxpYnNjY3AucGMKKworQlVJTFRfU09VUkNFUyA9ICQodG9wX3NyY2RpcikvLnZlcnNpb24KKyQodG9wX3NyY2RpcikvLnZlcnNpb246CisJZWNobyAkKFZFUlNJT04pID4gJEAtdCAmJiBtdiAkQC10ICRACitkaXN0LWhvb2s6CisJZWNobyAkKFZFUlNJT04pID4gJChkaXN0ZGlyKS8udGFyYmFsbC12ZXJzaW9uCmRpZmYgLS1naXQgYS9vcGVuYnNjL1JFQURNRSBiL29wZW5ic2MvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxODA3YmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL1JFQURNRQpAQCAtMCwwICsxLDMwIEBACitBYm91dCBPcGVuQlNDCis9PT09PT09PT09PT09CisKK09wZW5CU0MgaXMgYSBtaW5pbWFsaXN0aWMgaW1wbGVtZW50YXRpb24gb2YgdGhlIEdTTSBOZXR3b3JrLCB3aXRoCitwYXJ0aWN1bGFyIGVtcGhhc2lzIG9uIHRoZSBmdW5jdGlvbmFsaXR5IHR5cGljYWxseSBwcm92aWRlZCBieSB0aGUgQlNDLAorTVNDLCBITFIsIFZMUiBhbmQgU01TQy4KKworSXRzIGN1cnJlbnRseSBzdXBwb3J0ZWQgaW50ZXJmYWNlcyB0b3dhcmRzIHRoZSBCVFMgYXJlOgorCisgKiBDbGFzc2ljIEEtYmlzIG92ZXIgRTEgdXNpbmcgYSBtSVNETiBiYXNlZCBFMSBpbnRlcmZhY2UuIEluIG90aGVyCisgICB3b3JkcywgeW91IGNhbiBjb25uZWN0IGV4aXN0aW5nIEdTTSBCYXNlIFRyYW5zY2VpdmVyIFN0YXRpb24gKEJUUykKKyAgIHRocm91Z2ggRTEgdG8gT3BlbkJTQy4gIFNvIGZhciwgd2UgaGF2ZSBvbmx5IHRlc3RlZCB0aGUgU2llbWVucyBCUy0xMQorICAgVGVzdCByZXBvcnRzIHdpdGggb3RoZXIgQlRTIGFyZSBtdWNoIGFwcHJlY2lhdGVkIQorCisgKiBBLWJpcyBvdmVyIElQIGFzIHVzZWQgYnkgdGhlIGlwLmFjY2VzcyBuYW5vQlRTIHByb2R1Y3QgZmFtaWx5CisKK1RoaXMgcHJvamVjdCBpcyBzdGlsbCBpbiBpdHMgZWFybHkgZGF5cywgYW5kIHRoZXJlIGFyZSBsb3RzIG9mIGFyZWFzIHdoZXJlIGl0Citkb2Vzbid0IGJlaGF2ZSBhcyBwZXIgR1NNIHNwZWMuCisKKwlIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorCisKK2xpYm9zbW9jb3JlCis9PT09PT09PT09PQorCitQbGVhc2Ugbm90ZSB0aGF0IGFzIG9mIE1hcmNoIDIwMTAsIE9wZW5CU0MgaGFzIGEgZGVwZW5kZW5jeSB0byBhIGxpYnJhcnkKK2NhbGxlZCAibGlib3Ntb2NvcmUiLiAgWW91IGNhbiBvYnRhaW4gdGhhdCBsaWJyYXJ5IGZyb20KKworCWdpdDovL2dpdC5vc21vY29tLm9yZy9saWJvc21vY29yZS5naXQKKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9jb25maWd1cmUuaW4gYi9vcGVuYnNjL2NvbmZpZ3VyZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2ZiMGVkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9jb25maWd1cmUuaW4KQEAgLTAsMCArMSw1NyBAQAorZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQKK0FDX0lOSVQoW29wZW5ic2NdLAorCW00X2VzeXNjbWQoWy4vZ2l0LXZlcnNpb24tZ2VuIC50YXJiYWxsLXZlcnNpb25dKSwKKwlbb3BlbmJzYy1kZXZlbEBsaXN0cy5vcGVuYnNjLm9yZ10pCisKK0FNX0lOSVRfQVVUT01BS0UoW2Rpc3QtYnppcDJdKQorCitkbmwga2VybmVsIHN0eWxlIGNvbXBpbGUgbWVzc2FnZXMKK200X2lmZGVmKFtBTV9TSUxFTlRfUlVMRVNdLCBbQU1fU0lMRU5UX1JVTEVTKFt5ZXNdKV0pCisKK2RubCBjaGVja3MgZm9yIHByb2dyYW1zCitBQ19QUk9HX01BS0VfU0VUCitBQ19QUk9HX0NDCitBQ19QUk9HX0lOU1RBTEwKK0FDX1BST0dfUkFOTElCCisKK2RubCBjaGVja3MgZm9yIGxpYnJhcmllcworQUNfU0VBUkNIX0xJQlMoY3J5cHQsIGNyeXB0LAorICAgIFtMSUJDUllQVD0iLWxjcnlwdCI7IEFDX0RFRklORShbVlRZX0NSWVBUX1BXXSwgW10sIFtVc2UgY3J5cHQgZnVuY3Rpb25hbGl0eSBvZiB2dHkuXSldKQorCitQS0dfQ0hFQ0tfTU9EVUxFUyhMSUJPU01PQ09SRSwgbGlib3Ntb2NvcmUgPj0gMC4xLjEpCisKK2RubCBjaGVja3MgZm9yIGhlYWRlciBmaWxlcworQUNfSEVBREVSX1NUREMKKworZG5sIENoZWNrcyBmb3IgdHlwZWRlZnMsIHN0cnVjdHVyZXMgYW5kIGNvbXBpbGVyIGNoYXJhY3RlcmlzdGljcworCisjIFRoZSBmb2xsb3dpbmcgdGVzdCBpcyB0YWtlbiBmcm9tIFdlYktpdCdzIHdlYmtpdC5tNAorc2F2ZWRfQ0ZMQUdTPSIkQ0ZMQUdTIgorQ0ZMQUdTPSIkQ0ZMQUdTIC1mdmlzaWJpbGl0eT1oaWRkZW4gIgorQUNfTVNHX0NIRUNLSU5HKFtpZiAke0NDfSBzdXBwb3J0cyAtZnZpc2liaWxpdHk9aGlkZGVuXSkKK0FDX0NPTVBJTEVfSUZFTFNFKFtjaGFyIGZvbztdLAorICAgICAgWyBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorICAgICAgICBTWU1CT0xfVklTSUJJTElUWT0iLWZ2aXNpYmlsaXR5PWhpZGRlbiJdLAorICAgICAgICBBQ19NU0dfUkVTVUxUKFtub10pKQorQ0ZMQUdTPSIkc2F2ZWRfQ0ZMQUdTIgorQUNfU1VCU1QoU1lNQk9MX1ZJU0lCSUxJVFkpCisKKworZG5sIEdlbmVyYXRlIHRoZSBvdXRwdXQKK0FNX0NPTkZJR19IRUFERVIoYnNjY29uZmlnLmgpCisKK0FDX09VVFBVVCgKKyAgICBvcGVuYnNjLnBjCisgICAgbGlic2NjcC5wYworICAgIGluY2x1ZGUvb3BlbmJzYy9NYWtlZmlsZQorICAgIGluY2x1ZGUvdnR5L01ha2VmaWxlCisgICAgaW5jbHVkZS9zY2NwL01ha2VmaWxlCisgICAgaW5jbHVkZS9NYWtlZmlsZQorICAgIHNyYy9NYWtlZmlsZQorICAgIHRlc3RzL01ha2VmaWxlCisgICAgdGVzdHMvZGVidWcvTWFrZWZpbGUKKyAgICB0ZXN0cy9nc20wNDA4L01ha2VmaWxlCisgICAgdGVzdHMvZGIvTWFrZWZpbGUKKyAgICB0ZXN0cy9jaGFubmVsL01ha2VmaWxlCisgICAgdGVzdHMvc2NjcC9NYWtlZmlsZQorICAgIE1ha2VmaWxlKQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9jb250cmliL2J0LnB5IGIvb3BlbmJzYy9jb250cmliL2J0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFiMTExZWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2NvbnRyaWIvYnQucHkKQEAgLTAsMCArMSwzMyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKK2ltcG9ydCBvcworCitmID0gb3BlbigidW5iYWxhbmNlZCIpCitsaW5lcyA9IFtdCitmb3IgbGluZSBpbiBmOgorICAgIGxpbmVzLmFwcGVuZChsaW5lKQorCitmaWxlbmFtZXMgPSB7fQorCitvdXRwdXQgPSBbXQorZm9yIGxpbmUgaW4gbGluZXM6CisgICAgaWYgIlsweCIgaW4gbGluZToKKyAgICAgICAgc3RhcnQgPSBsaW5lLmZpbmQoIlsiKQorICAgICAgICBlbmQgPSBsaW5lLmZpbmQoIl0iKQorICAgICAgICBhZGRyID0gbGluZVtzdGFydCsxOmVuZF0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmlsZSA9IGZpbGVuYW1lc1thZGRyXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICByID0gb3MucG9wZW4oImFkZHIybGluZSAtZnMgLWUgLi9ic2NfaGFjayAlcyIgJSBhZGRyKQorICAgICAgICAgICAgYWxsID0gci5yZWFkKCkucmVwbGFjZSgiXG4iLCAiLCIpCisgICAgICAgICAgICBmaWxlID0gYWxsCisgICAgICAgICAgICBmaWxlbmFtZXNbYWRkcl0gPSBmaWxlCisKKyAgICAgICAgbGluZSA9IGxpbmUucmVwbGFjZShhZGRyLCBmaWxlKQorICAgIG91dHB1dC5hcHBlbmQobGluZSkKKworZyA9IG9wZW4oInVuYmFsYW5jZWQuMiIsICJ3IikKK2cud3JpdGUoIiIuam9pbihvdXRwdXQpKQorCisKKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9jb250cmliL2NvbnZlcnRfdG9fZW51bS5weSBiL29wZW5ic2MvY29udHJpYi9jb252ZXJ0X3RvX2VudW0ucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmNkNmYyYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvY29udHJpYi9jb252ZXJ0X3RvX2VudW0ucHkKQEAgLTAsMCArMSwzNyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyMKKyMgQ29udmVydCBFVFNJIGRvY3VtZW50cyB0byBhbiBlbnVtCisjCisKK2ltcG9ydCByZSwgc3lzCisKK2RlZiBjb252ZXJ0KHN0cmluZyk6CisgICAgc3RyaW5nID0gc3RyaW5nLnN0cmlwKCkucmVwbGFjZSgiICIsICIiKS5yanVzdCg4LCAiMCIpCisgICAgdmFyID0gMAorICAgIG9mZnNldCA9IDcKKyAgICBmb3IgY2hhciBpbiBzdHJpbmc6CisgICAgICAgIGFzc2VydCBvZmZzZXQgPj0gMAorICAgICAgICB2YXIgPSB2YXIgfCAoaW50KGNoYXIpIDw8IG9mZnNldCkKKyAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0IC0gMQorCisgICAgcmV0dXJuIHZhcgorCitkZWYgc3RyaW5nKG5hbWUpOgorICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoIiAiLCAiXyIpCisgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgnIicsICIiKQorICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoJy8nLCAnXycpCisgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgnKCcsICdfJykKKyAgICBuYW1lID0gbmFtZS5yZXBsYWNlKCcpJywgJ18nKQorICAgIHJldHVybiAiJXNfJXMiICUgKHN5cy5hcmd2WzJdLCBuYW1lLnVwcGVyKCkpCisKK2ZpbGUgPSBvcGVuKHN5cy5hcmd2WzFdKQorCisKK2ZvciBsaW5lIGluIGZpbGU6CisgICAgbSA9IHJlLm1hdGNoKHIiWyBcdF0qKD9QPHZhbHVlPlswMSBdKylbIF0rKD9QPG5hbWU+W2EtekEtWiAvMC05KCldKykiLCBsaW5lWzotMV0pCisKKyAgICBpZiBtOgorICAgICAgICBwcmludCAiXHQlc1x0XHQ9ICVkLCIgJSAoc3RyaW5nKG0uZ3JvdXBkaWN0KClbIm5hbWUiXSksIGNvbnZlcnQobS5ncm91cGRpY3QoKVsidmFsdWUiXSkpCisgICAgZWxzZToKKyAgICAgICAgcHJpbnQgbGluZVs6LTFdCmRpZmYgLS1naXQgYS9vcGVuYnNjL2NvbnRyaWIvbWdjcF9zZXJ2ZXIucHkgYi9vcGVuYnNjL2NvbnRyaWIvbWdjcF9zZXJ2ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2YzZWYzOAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvY29udHJpYi9tZ2NwX3NlcnZlci5weQpAQCAtMCwwICsxLDU0IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgU2ltcGxlIHNlcnZlciBmb3IgbWdjcC4uLiBzZW5kIGF1ZGl0LCByZWNlaXZlIHJlc3BvbnNlLi4KKworaW1wb3J0IHNvY2tldCwgdGltZQorCitNR0NQX0dBVEVXQVlfUE9SVCA9IDI0MjcKK01HQ1BfQ0FMTEFHRU5UX1BPUlQgPSAyNzI3CisKK3JzaXBfcmVzcCA9ICIiIjIwMCAzMjEzMjEzMzJcclxuIiIiCithdWRpdF9wYWNrZXQgPSAiIiJBVUVQICVkIDEzQG1ndyBNR0NQIDEuMFxyXG4iIiIKK2NyY3hfcGFja2V0ID0gIiIiQ1JDWCAlZCAxNEBtZ3cgTUdDUCAxLjBcclxuQzogNGE4NGFkNWQyNWZcclxuTDogcDoyMCwgYTpHU00tRUZSLCBudDpJTlxyXG5NOiByZWN2b25seVxyXG4iIiIKK2RsY3hfcGFja2V0ID0gIiIiRExDWCAlZCAxNEBtZ3cgTUdDUCAxLjBcclxuQzogNGE4NGFkNWQyNWZcclxuSTogJWRcclxuIiIiCittZGN4X3BhY2tldCA9ICIiIk1EQ1ggJWQgMTRAbWd3IE1HQ1AgMS4wXHJcbkM6IDRhODRhZDVkMjVmXHJcbkk6ICVkXHJcbkw6IHA6MjAsIGE6R1NNLUVGUiwgbnQ6SU5cclxuTTogcmVjdm9ubHlcclxuXHJcbnY9MFxyXG5vPS0gMjU4Njk2NDc3IDAgSU4gSVA0IDE3Mi4xNi4xLjEwN1xyXG5zPS1cclxuYz1JTiBJUDQgMTcyLjE2LjEuMTA3XHJcbnQ9MCAwXHJcbm09YXVkaW8gNDQwMCBSVFAvQVZQIDEyN1xyXG5hPXJ0cG1hcDoxMjcgR1NNLUVGUi84MDAwLzFcclxuYT1wdGltZToyMFxyXG5hPXJlY3Zvbmx5XHJcbm09aW1hZ2UgNDQwMiB1ZHB0bCB0MzhcclxuYT1UMzhGYXhWZXJzaW9uOjBcclxuYT1UMzhNYXhCaXRSYXRlOjE0NDAwXHJcbiIiIgorCitkZWYgaGV4ZHVtcChzcmMsIGxlbmd0aD04KToKKyAgICAiIiJSZWNpcGUgaXMgZnJvbSBodHRwOi8vY29kZS5hY3RpdmVzdGF0ZS5jb20vcmVjaXBlcy8xNDI4MTIvIiIiCisgICAgcmVzdWx0ID0gW10KKyAgICBkaWdpdHMgPSA0IGlmIGlzaW5zdGFuY2Uoc3JjLCB1bmljb2RlKSBlbHNlIDIKKyAgICBmb3IgaSBpbiB4cmFuZ2UoMCwgbGVuKHNyYyksIGxlbmd0aCk6CisgICAgICAgcyA9IHNyY1tpOmkrbGVuZ3RoXQorICAgICAgIGhleGEgPSBiJyAnLmpvaW4oWyIlMCpYIiAlIChkaWdpdHMsIG9yZCh4KSkgIGZvciB4IGluIHNdKQorICAgICAgIHRleHQgPSBiJycuam9pbihbeCBpZiAweDIwIDw9IG9yZCh4KSA8IDB4N0YgZWxzZSBiJy4nICBmb3IgeCBpbiBzXSkKKyAgICAgICByZXN1bHQuYXBwZW5kKCBiIiUwNFggICAlLSpzICAgJXMiICUgKGksIGxlbmd0aCooZGlnaXRzICsgMSksIGhleGEsIHRleHQpICkKKyAgICByZXR1cm4gYidcbicuam9pbihyZXN1bHQpCisKK3NlcnZlcl9zb2NrZXQgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19ER1JBTSkKK3NlcnZlcl9zb2NrZXQuYmluZCgoIjEyNy4wLjAuMSIsIE1HQ1BfQ0FMTEFHRU5UX1BPUlQpKQorc2VydmVyX3NvY2tldC5zZXRibG9ja2luZygwKQorCisKK2RlZiBzZW5kX3JlY2VpdmUocGFja2V0KToKKyAgICBzZXJ2ZXJfc29ja2V0LnNlbmR0byhwYWNrZXQsICgiMTI3LjAuMC4xIiwgTUdDUF9HQVRFV0FZX1BPUlQpKQorICAgIHRyeToKKyAgICAgICAgZGF0YSwgYWRkciA9IHNlcnZlcl9zb2NrZXQucmVjdmZyb20oNDA5NikKKyAgICAgICAgcHJpbnQgaGV4ZHVtcChkYXRhKSwgYWRkcgorICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CisgICAgICAgIHBhc3MKKworZGVmIGdlbmVyYXRlX3RpZCgpOgorICAgIGltcG9ydCByYW5kb20KKyAgICByZXR1cm4gcmFuZG9tLnJhbmRpbnQoMCwgNjUxMjMpCisKKworCitpID0gMQord2hpbGUgVHJ1ZToKKyAgICBzZW5kX3JlY2VpdmUocnNpcF9yZXNwKQorICAgIHNlbmRfcmVjZWl2ZShhdWRpdF9wYWNrZXQpCisgICAgc2VuZF9yZWNlaXZlKGNyY3hfcGFja2V0ICUgZ2VuZXJhdGVfdGlkKCkgKQorICAgIHNlbmRfcmVjZWl2ZShtZGN4X3BhY2tldCAlIChnZW5lcmF0ZV90aWQoKSwgaSkpCisgICAgc2VuZF9yZWNlaXZlKGRsY3hfcGFja2V0ICUgKGdlbmVyYXRlX3RpZCgpLCBpKSkKKyAgICBpID0gaSArIDEKKworICAgIHRpbWUuc2xlZXAoMykKZGlmZiAtLWdpdCBhL29wZW5ic2MvZG9jL0JTMTEtT01MLnR4dCBiL29wZW5ic2MvZG9jL0JTMTEtT01MLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWMzMjk5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9kb2MvQlMxMS1PTUwudHh0CkBAIC0wLDAgKzEsMzEgQEAKK1RoZSBTaWVtZW5zIEJTLTExIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBHU00gMTIuMjEgT01MIG9wZXJhdGlvbnM6CisKKworQ1JFQVRFIE9CSkVDVAorCithYmlzX29tX2ZvbV9oZHIub2JqX2NsYXNzIGNhbiBiZSAKK0EzOgorQTU6IEFMQ08sIEJCU0lHLCBDQ0xLLCBHUFNVLCBMSSwgUEEKK0E4OiBFbnZhQlRTRQorQTk6IEJQT1JUCisKK3RoZSBhYmlzX29tX29ial9pbnN0LnRyeF9uciBmaWVsZCBpbmRpY2F0ZXMgdGhlIGluZGV4IG9mIG9iamVjdCwgd2hlcmVhcyB0aGUKK2FiaXNfb21fZm9tX2hkci5idHNfbnIgaW5kaWNhdGVzIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCisKK2VudW0gYWJpc19iczExX29ianR5cGUgeworCUJTMTFfT0JKX0FMQ08JCT0gMHgwMSwKKwlCUzExX09CSl9CQlNJRwkJPSAweDAyLAkvKiBvYmpfY2xhc3M6IDAsMSAqLworCUJTMTFfT0JKX1RSWDEJCT0gMHgwMywJLyogb25seSBERUFDVElWQVRFIFRSWDEgKi8KKwlCUzExX09CSl9DQ0xLCQk9IDB4MDQsCisJQlMxMV9PQkpfR1BTVQkJPSAweDA2LAorCUJTMTFfT0JKX0xJCQk9IDB4MDcsCisJQlMxMV9PQkpfUEEJCT0gMHgwOSwJLyogb2JqX2NsYXNzOiAwLCAxKi8KK307CisKK0luIGNhc2Ugb2YgQ1JFQVRFIEVOVkFCVFNFLCB0aGUgYWJpc19vbV9vYmpfaW5zdC50cnhfbnIgaW5kaWNhdGVzIHRoZSBFbnZhQlRTRXgKK251bWJlci4KKworSW4gY2FzZSBvZiBBOSAoQ1JFQUVURSBCUE9SVCksIHRoZSBhYmlzX29tX29ial9pbnN0LmJ0c19uciBpbmRpY2F0ZXMgd2hpY2ggQlBPUlQKK3NoYWxsIGJlIHVzZWQuCisKKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9kb2MvY2FsbC1yb3V0aW5nLnR4dCBiL29wZW5ic2MvZG9jL2NhbGwtcm91dGluZy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQwMmY5ZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvZG9jL2NhbGwtcm91dGluZy50eHQKQEAgLTAsMCArMSwyNSBAQAorQ2FsbCByb3V0aW5nIGluIE9wZW5CU0MKKworRmxvdyBvZiBldmVudHM6CisKKyAjIE1PIGNhbGwgaW5pdGlhdGVkIGJ5IE1TLCBDSEFOTkVMIFJRRCwgSU1NRURJQVRFIEFTU0lHTgorICMgTVMgc2VuZHMgQ0MgU0VUVVAgbWVzc2FnZSwgd2UgYXNzdW1lIGFscmVhZHkgb24gVENIL0ggRkFDQ0gKKyAjIE9wZW5CU0MgZG9lcyBhIHN1YnNjcmliZXIgbG9va3VwIGJhc2VkIG9uIHRoZSB0YXJnZXQgZXh0ZW5zaW9uCisgICogSWYgYSBzdWJzY3JpYmVyIGlzIGZvdW5kOgorICAgIyBzZW5kIENBTEwgUFJPQ0VFRElORyBtZXNzYWdlIHRvIE1PCisgICAjIHBhZ2UgdGhlIE1UIHN1YnNjcmliZXIgYW5kIGFzayBpdEkgdG8gYXNrIGZvciBUQ0gvSAorICAgIyBvbmNlIHBhZ2luZyBjb21wbGV0ZXMsIHdlIGhhdmUgdGhlIFRDSC9IIGZvciB0aGUgTVQgZW5kCisgICAjIHNlbmQgU0VUVVAgdG8gTVQKKyAgICMgcmVjZWl2ZSBDQUxMIENPTkZJUk1FRCBmcm9tIE1UCisgICAjIHNldC11cCB0aGUgVFJBVSBtdXggbWFwcGluZyBiZXR3ZWVuIHRoZSBFMSBzdWJzbG90cyBmb3IgYm90aCBUQ0gvSAorICAgIyByZWNlaXZlIEFMRVJUSU5HIGZyb20gTVQsIHJvdXRlIEFMRVJUSU5HIHRvIE1PCisgICAjIHJlY2VpdmUgQ09OTkVDVCBmcm9tIE1ULCBjb25maXJtIHRvIE1UIHdpdGggQ09OTkVDVF9BQ0sKKyAgICMgc2VuZCBhIENPTk5FQ1QgbWVzc2FnZSB0byBNTywgcmVjZWl2ZSBDT05ORUNUX0FDSyBmcm9tIE1PCisgKiBJZiBzdWJzY3JpYmVyIGlzIG5vdCBmb3VuZDoKKyAgIyBzZW5kIFJFTEVBU0UgQ09NUExFVEUgd2l0aCBhcHJvcHJpYXRlIGNhdXNlIHRvIE1PICgxOiB1bmFsbG9hY2F0ZWQgMzogbm8gcm91dGUpCisgIAorCisKK1Rob3VnaHRzIGFib3V0IFJSL01NOgorCisqIHdlIGFsbG9jYXRlIFJSL01NIGVudGl0aWVzIG9uIGRlbWFuZCwgd2hlbiB3ZSBuZWVkIHRoZW0KZGlmZiAtLWdpdCBhL29wZW5ic2MvZG9jL2NoYW5uZWxfcmVsZWFzZS50eHQgYi9vcGVuYnNjL2RvYy9jaGFubmVsX3JlbGVhc2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhY2YwOWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2RvYy9jaGFubmVsX3JlbGVhc2UudHh0CkBAIC0wLDAgKzEsNzQgQEAKKworR1NNIDA0LjA4IDcuMS43IC8gOS4xLjcJCVJSIENIQU5ORUwgUkVMRVNFCisKK1JTTCAwOC41OCAzLjQgLyA/CQlSTEwgTGluayBSZWxlYXNlIFJlcXVlc3QKKworUlNMIDA4LjU4IDQuNiAvIDguNC41CQlERUFDVGl2YXRlIFNBQ0NICisJKiBEZWFjdGl2YXRlIFNBQ0NIIGFjY29yZGluZyB0byBDaGFubmVsIFJlbGVhc2UgUHJvYyAwNC4wOAorCSogdG8gYmUgc2VudCBhZnRlciBSUiBDSEFOTkVMIFJFTEVBU0UgaXMgc2VudCB0byBNUworCitSU0wgMDguNTggNC43IC8gOC40LjE0CQlSRiBDSEFObmVsIFJFTGVhc2UKKwkqIHRlbGxzIHRoZSBCVFMgdG8gcmVsZWFzZSBhIHJhZGlvIGNoYW5uZWwKKwkqICJ3aGVuIGFuIGFjdGl2YXRlZCByYWRpbyBjaGFubmVsIGlzIG5vIGxvbmdlciBuZWVkZWQiCisJKiBCVFMgcmVzcG9uZHMgd2l0aCBSRiBDSEFObmVsIFJFTGVhc2UgQUNLbm93bGVkZ2UKKworCitHU00gMDQuMDggMy40LjEzOiBSUiBjb25uZWN0aW9uIHJlbGVhc2UgcHJvY2VkdXJlCisKKyogbmV0d29yayBzZW5kcyBSUiBDSEFOTkVMIFJFTEVBU0UgdG8gTVMgb24gdGhlIERDQ0gKKyAgKiBzdGFydCBUMzEwOQorICAqIGRlYWN0aXZhdGUgU0FDQ0gKKyogTVMgZGlzY29ubmVjdHMgbWFpbiBzaWduYWxsaW5nIGxpbmsgKGJ5IHNlbmRpbmcgRElTQykKKyAgKiBhbGwgb3RoZXIgZGF0YSBsaW5rcyBhcmUgZGlzY29ubmVjdGVkIGJ5IGxvY2FsIGVuZCBsaW5rIHJlbGVhc2UKKyogbmV0d29yayByZWNlaXZlcyBESVNDIChCVFMgc2VuZHMgUkxMIFJFTCBJTkQgdG8gQlNDKQorICAqIHN0b3AgVDMxMDkKKyAgKiBzdGFydCBUMzExMSAKKyogd2hlbiBUMzExMSB0aW1lcyBvdXQsIHRoZSBuZXR3b3JrIGNhbiByZXVzZSB0aGUgY2hhbm5scworKiBpZiBUMzEwOSB0aW1lcyBvdXQsIHRoZSBuZXR3b3JrIGRlYWN0aXZhdGVzIHRoZSBjaGFubmVscyAKKyAgYW5kIGNhbiByZXVzZSB0aGVtCisgICogdGhpcyBwcm9iYWJseSBtZWFucyBzaW1wbHkgUkYgQ0hBTm5lbCBSRUxlYXNlCisKKworPT0gSW1wbGVtZW50YXRpb24gaW4gT3BlbkJTQyA9PQorCitjaGFuX2FsbG9jLmM6bGNoYW5fYXV0b19yZWxlYXNlKCkKKwkqIGNoZWNrcyBpZiB1c2UgY291bnQgc3RpbGwgPiAwIChhYm9ydCkKKwkqIGNhbGxzIGdzbTQ4X3NlbmRfcnJfcmVsZWFzZSgpCisJCSogd2hpY2ggY2FsbHMgcnNsX2RlYWN0X3NhY2NoKCkKKwkqIGNhbGxzIHJzbF9yZWxlYXNlX3JlcXVlc3QoKQorCQkqIHdoaWNoIHNlbmRzIFJMTCBMaW5rIFJlbGVhc2UgcmVxdWVzdAorCQorUlggb2YgUkVMZWFzZSBJTkRpY2F0aW9uOgorCSogY2FsbCByc2xfcmZfY2hhbl9yZWxlYXNlKCkgKHNlbmQgUkZfQ0hBTl9SRUwpCisKK1JYIG9mIFJFTGVhc2UgQ09ORmltZW06CisJKiBjYWxsIHJzbF9yZl9jaGFuX3JlbGVhc2UoKSAoc2VuZCBSRl9DSEFOX1JFTCkKKworKiBSWCBvZiBSRl9DSEFOX1JFTF9BQ0sKKwkqIGNhbGwgbGNoYW5fZnJlZSgpCisJCSogc3Vic2NyX3B1dCgpCisJCSogZGVsZXRlIHJlbGVhc2VfdGltZXIKKworCis9PT0gSW50ZWdyYXRpb24gd2l0aCBTTVMgPT09CisKKyogUlggb2YgQ1BfRVJST1Igb3IgdW5pbXBsZW1lbnRlZCBNVAorCSogdHJpZ2dlciB0cmFuc19mcmVlKCkgd2hpY2ggd2lsbCBsY2hhbl9hdXRvX3JlbGVhc2UoKQorCisqIENQIFRDMSogZXhwaXJlZCB3aGlsZSB3YWl0aW5nIGZvciBDUC1BQ0sKKwkqIHRyaWdnZXIgdHJhbnNfZnJlZSgpIHdoaWNoIHdpbGwgbGNoYW5fYXV0b19yZWxlYXNlKCkKKworKiBSWCBvZiBSUF9FUlJPUgorCSogdHJpZ2dlciB0cmFuc19mcmVlKCkgd2hpY2ggd2lsbCBsY2hhbl9hdXRvX3JlbGVhc2UoKQorCQorKiBUWCBvZiBDUC1BQ0sgaW4gTVQgREVMSVZFUgorCSogdHJpZ2dlciB0cmFuc19mcmVlKCkgd2hpY2ggd2lsbCBsY2hhbl9hdXRvX3JlbGVhc2UoKQorCisqIFJYIG9mIENQLUFDSyBpbiBNTyBTVUJNSVQKKwkqIHRyaWdnZXIgdHJhbnNfZnJlZSgpIHdoaWNoIHdpbGwgbGNoYW5fYXV0b19yZWxlYXNlKCkKKwkKKyogUlggb2YgUlAtQUNLIGluIE1UIERFTElWRVIgKGFuZCBubyBtb3JlIG1lc3NhZ2VzKQorCSogdHJpZ2dlciByc2xfcmVsZWFzZV9yZXF1ZXN0KCkgZm9yIFNBUEkzCisKKyogUlggb2YgUlAtU01NQSBpbiBNVCBERUxJVkVSIChhbmQgbm8gbW9yZSBtZXNzYWdlcykKKwkqIHRyaWdnZXIgcnNsX3JlbGVhc2VfcmVxdWVzdCgpIGZvciBTQVBJMwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9kb2MvZTEtZGF0YS1tb2RlbC50eHQgYi9vcGVuYnNjL2RvYy9lMS1kYXRhLW1vZGVsLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTk0ZmU0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9kb2MvZTEtZGF0YS1tb2RlbC50eHQKQEAgLTAsMCArMSwxNzIgQEAKK0UxIHJlbGF0ZWQgZGF0YSBtb2RlbAorCitUaGlzIGRhdGEgbW9kZWwgZGVzY3JpYmVzIHRoZSBwaHlzaWNhbCByZWxhdGlvbnNoaXAgb2YgdGhlIGluZGl2aWR1YWwKK3BhcnRzIGluIHRoZSBuZXR3b3JrLCBpdCBpcyBub3QgdGhlIGxvZ2ljYWwvcHJvdG9jb2wgc2lkZSBvZiB0aGUgR1NNCituZXR3b3JrLgorCitBIEJUUyBpcyBjb25uZWN0ZWQgdG8gdGhlIEJTQyBieSBzb21lIHBoeXNpY2FsIGxpbmsuICBJdCBjb3VsZCBiZSBhbiBhY3R1YWwKK0UxIGxpbmssIGJ1dCBpdCBjb3VsZCBhbHNvIGJlIGFiaXMtb3Zlci1JUCB3aXRoIGEgbWl4dHVyZSBvZiBUQ1AgYW5kIFJUUC9VRFAuCisKK1RvIGZ1cnRoZXIgY29tcGxpY2F0ZSB0aGUgZmFjdCwgbXVsdGlwbGUgQlRTIGNhbiBzaGFyZSBvbmUgc3VjaCBweXNpY2FsCitsaW5rLiAgT24gYSBzaW5nbGUgRTEgbGluZSwgd2UgY2FuIGVhc2lseSBhY2NvbW9kYXRlIHVwIHRvIHRocmVlIEJUUyB3aXRoCit0d28gVFJYIGVhY2guCisKK1RodXMsIGl0IGlzIGJlc3QgZm9yIE9wZW5CU0MgdG8gaGF2ZSBzb21lIGtpbmQgb2YgYWJzdHJhY3Rpb24gbGF5ZXIuICBUaGUgQlNDJ3MKK3ZpZXcgb2YgYSBCVFMgY29ubmVjdGVkIHRvIGl0LiAgV2UgY2FsbCB0aGlzICdidHNfbGluaycuICBBIGJ0c19saW5rIGNhbiBiZQorKiBhbGwgdGhlIFRDUCBhbmQgVURQIHN0cmVhbXMgb2YgYSBBYmlzLW92ZXItSVAgQlRTCisqIGEgc2V0IG9mIEUxIHRpbWVzbG90cyBmb3IgT01MLCBSU0wgYW5kIFRSQVUgY29ubmVjdGlvbnMgb24gYSBFMSBsaW5rCisqIGEgc2VyaWFsIGxpbmUgZXhjbHVzaXZlbHkgdXNlZCBmb3IgT01MIG1lc3NhZ2VzIChULUxpbmspCisKK0EgYnRzX2xpbmsgY2FuIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgT3BlbkJTQyBjb3JlIGF0IHJ1bnRpbWUuCisKK3N0cnVjdCB0cnhfbGluayB7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7Cit9OworCitzdHJ1Y3QgYnRzX2xpbmsgeworCXN0cnVjdCBnc21fYnRzICpidHM7CisJc3RydWN0IHRyeF9saW5rIHRyeF9saW5rc1tOVU1fVFJYXTsKK307CisKK0ludGVyZmFjZSBmcm9tIHN0YWNrIHRvIGlucHV0IGNvcmU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitpbnQgYWJpc19yc2xfc2VuZG1zZyhzdHJ1Y3QgbXNnYiAqbXNnKTsKKwlzZW5kIGEgbWVzc2FnZSB0aHJvdWdoIGEgUlNMIGxpbmsgdG8gdGhlIFRSWCBzcGVjaWZpZWQgYnkgdGhlIGNhbGxlciBpbgorCW1zZy0+dHJ4LgorCitpbnQgYWJpc19yc2xfcmN2bXNnKHN0cnVjdCBtc2diICptc2cpOworCXJlY2VpdmUgYSBtZXNzYWdlIGZyb20gYSBSU0wgbGluayBmcm9tIHRoZSBUUlggc3BlY2lmaWVkIGJ5IHRoZQorCWNhbGxlciBpbiBtc2ctPnRyeC4KKworaW50IGFiaXNfbm1fc2VuZG1zZyhzdHJ1Y3QgbXNnYiAqbXNnKTsKKwlzZW5kIGEgbWVzc2FnZSB0aHJvdWdoIGEgT01MIGxpbmsgdG8gdGhlIEJUUyBzcGVjaWZpZWQgYnkgdGhlIGNhbGxlciBpbgorCW1zZy0+dHJ4LT5idHMuICBUaGUgY2FsbGVyIGNhbiBqdXN0IHVzZSBidHMtPmMwIHRvIGdldCB0aGUgZmlyc3QgVFJYCisJaW4gYSBCVFMuIChPTUwgbWVzc2FnZXMgYXJlIG5vdCByZWFsbHkgc2VudCB0byBhIFRSWCBidXQgdG8gdGhlIEJUUykKKworaW50IGFiaXNfbm1fcmN2bXNnKHN0cnVjdCBtc2diICptc2cpOworCXJlY2VpdmUgYSBtZXNzYWdlIGZyb20gYSBPTUwgbGluayBmcm9tIHRoZSBCVFMgc3BlY2lmaWVkIGJ5IHRoZSBjYWxsZXIKKwlpbiBtc2ctPnRyeC0+YnRzLiAgVGhlIGNhbGxlciBjYW4ganVzdCB1c2UgYnRzLT5jMCB0byBnZXQgdGhlIGZpcnN0CisJVFJYIGluIGEgQlRTLgorCitpbnQgYWJpc19saW5rX2V2ZW50KGludCBldmVudCwgdm9pZCAqZGF0YSk7CisJc2lnbmFsIHNvbWUgZXZlbnQgKHN1Y2ggYXMgbGF5ZXIgMSBjb25uZWN0L2Rpc2Nvbm5lY3QpIGZyb20gdGhlCisJaW5wdXQgY29yZSB0byB0aGUgc3RhY2suCisKK2ludCBzdWJjaF9kZW11eF9pbihteCwgY29uc3QgdV9pbnQ4X3QgKmRhdGEsIGludCBsZW4pOworCXJlY2VpdmUgJ2xlbicgYnl0ZXMgZnJvbSBhIGdpdmVuIEUxIHRpbWVzbG90IChUUkFVIGZyYW1lcykKKworaW50IHN1YmNoYW5fbXV4X291dChteCwgdV9pbnQ4X3QgKmRhdGEsIGludCBsZW4pOworCW9idGFpbiAnbGVuJyBieXRlcyBvZiBvdXRwdXQgZGF0YSB0byBiZSBzZW50IG9uIEUxIHRpbWVzbG90CisKK0ludHJmYWNlIGJ5IElucHV0IENvcmUgZm9yIElucHV0IFBsdWdpbnMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworaW50IGJ0c2xpbmtfcmVnaXN0ZXJfcGx1Z2luKCk7CisKKworQ29uZmlndXJhdGlvbiBmb3IgdGhlIEUxIGlucHV0IG1vZHVsZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitCVFMKKwlCVFMgbnVtYmVyCisJbnVtYmVyIG9mIFRSWAorCU9NTCBsaW5rCisJCUUxIGxpbmUgbnVtYmVyCisJCXRpbWVzbG90IG51bWJlcgorCQlbc3Vic2xvdCBudW1iZXJdCisJCVNBUEkKKwkJVEVJCisJZm9yIGVhY2ggVFJYCisJCVJTTCBsaW5rCisJCQlFMSBsaW5lIG51bWJlcgorCQkJdGltZXNsb3QgbnVtYmVyCisJCQlbc3Vic2xvdCBudW1iZXJdCisJCQlTQVBJCisJCQlURUkKKwkJZm9yIGVhY2ggVFMKKwkJCUUxIGxpbmUgbnVtYmVyCisJCQl0aW1lc2xvdCBudW1iZXIKKwkJCXN1YnNsb3QgbnVtYmVyCisKKworRTEgaW5wdXQgbW9kdWxlIGRhdGEgbW9kZWwKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCitlbnVtIGUxaW5wX3NpZ25fdHlwZSB7CisJRTFJTlBfU0lHTl9OT05FLAorCUUxSU5QX1NJR05fT01MLAorCUUxSU5QX1NJR05fUlNMLAorfTsKKworc3RydWN0IGUxaW5wX3NpZ25fbGluayB7CisJLyogbGlzdCBvZiBzaWduYWxsaW5nIGxpbmtzICovCisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKworCWVudW0gZTFpbnBfc2lnbl90eXBlIHR5cGU7CisKKwkvKiB0cnggZm9yIG1zZy0+dHJ4IG9mIHJlY2VpdmVkIG1zZ3MgKi8JCisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisKKwkvKiBtc2diIHF1ZXVlIG9mIHRvLWJlLXRyYW5zbWl0dGVkIG1zZ3MgKi8KKwlzdHJ1Y3QgbGxpc3RfaGVhZCB0eF9saXN0OworCisJLyogU0FQSSBhbmQgVEVJIG9uIHRoZSBFMSBUUyAqLworCXVfaW50OF90IHNhcGk7CisJdV9pbnQ4X3QgdGVpOworfQorCitlbnVtIGUxaW5wX3RzX3R5cGUgeworCUUxSU5QX1RTX1RZUEVfTk9ORSwKKwlFMUlOUF9UU19UWVBFX1NJR04sCisJRTFJTlBfVFNfVFlQRV9UUkFVLAorfTsKKworLyogQSB0aW1lc2xvdCBpbiB0aGUgRTEgaW50ZXJmYWNlICovCitzdHJ1Y3QgZTFpbnBfdHMgeworCWVudW0gZTFpbnBfdHNfdHlwZSB0eXBlOworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCBsbGlzdF9oZWFkIHNpZ25fbGlua3M7CisJCX0gc2lnbjsKKwkJc3RydWN0IHsKKwkJCS8qIHN1YmNoYW5uZWwgZGVtdXhlciBmb3IgZnJhbWVzIGZyb20gRTEgKi8KKwkJCXN0cnVjdCBzdWJjaF9kZW11eCBkZW11eDsKKwkJCS8qIHN1YmNoYW5uZWwgbXV4ZXIgZm9yIGZyYW1lcyB0byBFMSAqLworCQkJc3RydWN0IHN1YmNoX211eCBtdXg7CisJCX0gdHJhdTsKKwl9OworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCS8qIG1JU0ROIGRyaXZlciBoYXMgb25lIGZkIGZvciBlYWNoIHRzICovCisJCQlzdHJ1Y3QgYnNjX2ZkOworCQl9IG1pc2RuOworCX0gZHJpdmVyOworfTsKKworc3RydWN0IGUxaW5wX2xpbmUgeworCXVuc2lnbmVkIGludCBudW07CisJY2hhciAqbmFtZTsKKworCXN0cnVjdCBlMWlucF90cyB0c1tOUl9FMV9UU107CisKKwljaGFyICplMWlucF9kcml2ZXI7CisJdm9pZCAqZHJpdmVyX2RhdGE7Cit9OworCisvKiBDYWxsIGZyb20gdGhlIFN0YWNrOiBjb25maWd1cmF0aW9uIG9mIHRoaXMgVFMgaGFzIGNoYW5nZWQgKi8KK2ludCBlMWlucF91cGRhdGVfdHMoc3RydWN0IGUxaW5wX3RzICp0cyk7CisKKy8qIFJlY2VpdmUgYSBwYWNrZXQgZnJvbSB0aGUgRTEgZHJpdmVyICovCitpbnQgZTFpbnBfcnhfdHMoc3RydWN0IGUxaW5wX3RzICp0cywgc3RydWN0IG1zZ2IgKm1zZywKKwkJdV9pbnQ4X3QgdGVpLCB1X2ludDhfdCBzYXBpKTsKKworLyogU2VuZCBhIHBhY2tldCwgY2FsbGJhY2sgZnVuY3Rpb24gaW4gdGhlIGRyaXZlciAqLworaW50IGUxZHJpdmVyX3R4X3RzKHN0cnVjdCBlMWlucF90cyAqdHMsIHN0cnVjdCBtc2diICptc2cpCisKKworc3RydWN0IGUxaW5wX2RyaXZlciB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgKCp3YW50X3dyaXRlKShzdHJ1Y3QgZTFpbnBfdHMgKnRzKTsKK307CmRpZmYgLS1naXQgYS9vcGVuYnNjL2RvYy9nc20taG9wcGluZy50eHQgYi9vcGVuYnNjL2RvYy9nc20taG9wcGluZy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkxMDkzOQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvZG9jL2dzbS1ob3BwaW5nLnR4dApAQCAtMCwwICsxLDU0IEBACithY2NvcmRpbmcgdG8gR1NNIDA1LjAyOgorCitnZW5lcmFsIHBhcmFtZXRlcnMgZnJvbSBDQ0NIOgorKiBDQSBjZWxsIGFsbG9jYXRpb24gb2YgQVJGQ04ncyAoU3lzdGVtIEluZm9ybWF0aW9uIC8gQkNDSCkKKyogRk46IFRETUEgZnJhbWUgbnVtYmVyICh0MSx0Mix0MycpIGluIFNDSAorCitzcGVjaWZpYyBwYXJhbWV0ZXJzIGZyb20gY2hhbm5lbCBhc3NpZ25tZW50OgorKiBNQTogbW9iaWxlIGFsbG9jYXRpb24sIGRlZmluZXMgc2V0IG9mIEFSRkNOJ3MsIHVwIHRvIDY0CisqIE1BSU86IGluZGV4CisqIEhTTjogaG9wcGluZyBzZXF1ZW5jZSBnZW5lcmF0b3IgbnVtYmVyICgwLi42NCkKKworCitob3BwaW5nIHNlcXVlbmNlIGdlbmVyYXRpb24gKDYuMi4zKToKKwordV9pbnQ4X3Qgcm50YWJsZVsxMTRdID0geworCSA0OCwgIDk4LCAgNjMsICAgMSwgIDM2LCAgOTUsICA3OCwgMTAyLCAgOTQsICA3MywKKwkgIDAsICA2NCwgIDI1LCAgODEsICA3NiwgIDU5LCAxMjQsICAyMywgMTA0LCAxMDAsCisJMTAxLCAgNDcsIDExOCwgIDg1LCAgMTgsICA1NiwgIDk2LCAgODYsICA1NCwgICAyLAorCSA4MCwgIDM0LCAxMjcsICAxMywgICA2LCAgODksICA1NywgMTAzLCAgMTIsICA3NCwKKwkgNTUsIDExMSwgIDc1LCAgMzgsIDEwOSwgIDcxLCAxMTIsICAyOSwgIDExLCAgODgsCisJIDg3LCAgMTksICAgMywgIDY4LCAxMTAsICAyNiwgIDMzLCAgMzEsICAgOCwgIDQ1LAorCSA4MiwgIDU4LCAgNDAsIDEwNywgIDMyLCAgIDUsIDEwNiwgIDkyLCAgNjIsICA2NywKKwkgNzcsIDEwOCwgMTIyLCAgMzcsICA2MCwgIDY2LCAxMjEsICA0MiwgIDUxLCAxMjYsCisJMTE3LCAxMTQsICAgNCwgIDkwLCAgNDMsICA1MiwgIDUzLCAxMTMsIDEyMCwgIDcyLAorCSAxNiwgIDQ5LCAgIDcsICA3OSwgMTE5LCAgNjEsICAyMiwgIDg0LCAgIDksICA5NywKKwkxMjUsICA5OSwgIDE3LCAxMjMKK307CisKKy8qIG1haT0wIHJlcHJlc2VudHMgbG93ZXN0IEFSRkNOIGluIHRoZSBNQSAqLworCisKK3VfaW50OF90IGhvcHBpbmdfbWFpKHVfaW50OF90IGhzbiwgdV9pbnQzMl90IGZuLCB1X2ludDhfdCBtYWlvLAorCQkgICAgIHVfaW50OF90IHQxLCB1X2ludDhfdCB0MiwgdV9pbnQ4X3QgdDNfKQoreworCXVfaW50OF90IG1haTsKKworCWlmIChoc24gPT0gMCkgLyogY3ljbGljIGhvcHBpbmcgKi8KKwkJbWFpID0gKGZuICsgbWFpbykgJSBuOworCWVsc2UgeworCQl1X2ludDMyX3QgbSwgbV8sIHRfLCBzOworCisJCW0gPSB0MiArIHJudGFibGVbKGhzbiB4b3IgKHQxICUgNjQpKSArIHQzXTsKKwkJbV8gPSBtICUgKDJeTkJJTik7CisJCXRfID0gdDMgJSAoMl5OQklOKTsKKwkJaWYgKG1fIDwgbiB0aGVuKQorCQkJcyA9IG1fOworCQllbHNlCisJCQlzID0gKG1fICsgdF8pICUgbjsKKwkJbWFpID0gKHMgKyBtYWlvKSAlIG47CisJfQorCisJcmV0dXJuIG1haTsKK30KKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9kb2MvaGFuZG92ZXIudHh0IGIvb3BlbmJzYy9kb2MvaGFuZG92ZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMTllODcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2RvYy9oYW5kb3Zlci50eHQKQEAgLTAsMCArMSw4OSBAQAorSWRlYXMgYWJvdXQgYSBoYW5kb3ZlciBhbGdvcml0aG0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBpcyBtb3N0bHkgYmFzZWQgb24gdGhlIHJlc3VsdHMgcHJlc2VudGVkIGluIENoYXB0ZXIgOCBvZiAiUGVyZm9ybWFuY2UKK0VuaGFuY2VtZW50cyBpbiBhIEZyZXF1ZW5jeSBIb3BwaW5nIEdTTSBOZXR3b3JrIiBieSBUaG9tYXMgVG9mdGVnYWFyZCBOaWVsc2VuCithbmQgSm9lcm9lbiBXaWdhcmQuIAorCisKKz09PSBSZWFzb25zIGZvciBwZXJmb3JtaW5nIGhhbmRvdmVyID09PQorCitTZWN0aW9uIDIuMS4xOiBIYW5kb3ZlciB1c2VkIGluIHRoZWlyIENBUEFDSVRZIHNpbXVsYXRpb246CisKKzEpIEludGVyZmVyZW5jZSBIYW5kb3ZlcgorCitBdmVyYWdlIFJYTEVWIGlzIHNhdGlzZmFjdG9yeSBoaWdoLCBidXQgYXZlcmFnZSBSWFFVQUwgdG9vIGxvdyBpbmRpY2F0ZXMKK2ludGVyZmVyZW5jZSB0byB0aGUgY2hhbm5lbC4gIEhhbmRvdmVyIHNob3VsZCBiZSBtYWRlLgorCisyKSBCYWQgUXVhbGl0eQorCitBdmVyYWdlZCBSWFFVQUwgaXMgbG93ZXIgdGhhbiBhIHRocmVzaG9sZAorCiszKSBMb3cgTGV2ZWwgLyBTaWduYWwgU3RyZW5ndGgKKworQXZlcmFnZSBSWExFViBpcyBsb3dlciB0aGFuIGEgdGhyZXNob2xkCisKKzQpIERpc3RhbmNlIEhhbmRvdmVyCisKK01TIGlzIHRvbyBmYXIgYXdheSBmcm9tIGEgY2VsbCAobWVhc3VyZWQgYnkgVEEpCisKKzUpIFBvd2VyIGJ1ZGdldCAvIEJldHRlciBDZWxsCisKK1JYIExldmVsIG9mIG5laWdoYm9yIGNlbGwgaXMgYXQgbGVhc3QgIkhPIE1hcmdpbiBkQiIgZEIgYmV0dGVyIHRoYW4gdGhlCitjdXJyZW50IHNlcnZpbmcgY2VsbC4KKworPT09IElkZWFsIHBhcmFtZXRlcnMgZm9yIEhPIGFsZ29yaXRobSA9PT0KKworQ2hhcHRlciA4LCBTZWN0aW9uIDIuMiwgVGFibGUgMjQ6CisKK1dpbmRvdyBSWExFViBhdmVyYWdpbmc6CQkxMCBTQUNDSCBmcmFtZXMgKG5vIHdlaWdodGluZykKK1dpbmRvdyBSWFFVQUwgYXZlcmFnaW5nOgkxIFNBQ0NIIGZyYW1lIChubyBhdmVyYWdpbmcpCitMZXZlbCBUaHJlYXNob2xkOgkJMSBvZiB0aGUgbGFzdCAxIEFWLVJYTEVWIHZhbHVlcyA8IC0xMTBkQm0KK1F1YWxpdHkgVGhyZXNob2xkOgkJMyBvZiB0aGUgbGFzdCA0IEFWLVJYUVVBTCB2YWx1ZXMgPj0gNQorSW50ZXJmZXJlbmNlIFRocmVzaG9sZDoJCTEgb2YgdGhlIGxhc3QgQVYtUlhMRVYgPiAtODUgZEJtICYKKwkJCQkzIG9mIHRoZSBsYXN0IDQgQVYtUlhRVUFMIHZhbHVlcyA+PSA1CitQb3dlciBCdWRnZXQ6CQkJTGV2ZWwgb2YgbmVpZ2hib3IgY2VsbCA+IDMgZEIgYmV0dGVyCitQb3dlciBCdWRnZXQgSW50ZXJ2YWw6CQlFdmVyeSA2IFNBQ0NIIGZyYW1lcyAoNiBzZWNvbmRzID8hPykKK0Rpc3RhbmNlIEhhbmRvdmVyOgkJRGlzYWJsZWQKK0V2YWx1YXRpb24gcnVsZSAxOgkJUlhMRVYgb2YgdGhlIGNhbmRpZGF0ZSBjZWxsIGEgdGxlYXN0IC0xMDQgZEJtCitFdmFsdWF0aW9uIHJ1bGUgMjoJCUxldmVsIG9mIGNhbmRpZGF0ZSBjZWxsID4gM2RCIGJldHRlciBvd24gY2VsbAorVGltZXIgU3VjY2Vzc2Z1bCBITzoJCTUgU0FDQ0ggZnJhbWVzCitUaW1lciBVbnN1Y2Nlc3NmdWwgSE86CQkxIFNBQ0NIIGZyYW1lCisKK0luIGEgbm9uLWZyZXF1ZW5jeSBob3BwaW5nIGNhc2UsIFJYUVVBTCB0aHJlc2hvbGQgY2FuIGJlIGRlY3JlYXNlZCB0bworUlhMRVYgPj0gNAorCitXaGVuIGZyZXF1ZW5jeSBob3BwaW5nIGlzIGVuYWJsZWQsIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBwYXJhbWV0ZXJzCitzaG91bGQgYmUgaW50cm9kdWNlZDoKKworKiBObyBpbnRyYS1jZWxsIGhhbmRvdmVyCisqIFVzZSBhIEhPIE1hcmdpbiBvZiAyZEIKKworPT09IEhhbmRvdmVyIENoYW5uZWwgUmVzZXJ2YXRpb24gPT09CisKK0luIGxvYWRlZCBuZXR3b3JrLCBlYWNoIGNlbGwgc2hvdWxkIHJlc2VydmUgc29tZSBjaGFubmVscyBmb3IgaGFuZG92ZXJzLAorcmF0aGVyIHRoYW4gdXNpbmcgYWxsIG9mIHRoZW0gZm9yIG5ldyBjYWxsIGVzdGFibGlzaG1lbnQuICBUaGlzIHJlZHVjZXMgdGhlCituZWVkIHRvIGRyb3AgY2FsbHMgZHVlIHRvIGZhaWxpbmcgaGFuZG92ZXJzLCBhdCB0aGUgZXhwZW5zZSBvZiBmYWlsaW5nIG5ldyBjYWxsCithdHRlbXB0cy4KKworPT09IER5bmFtaWMgSE8gTWFyZ2luID09PQorCitUaGUgaGFuZG92ZXIgbWFyZ2luIChoeXN0ZXJlc2lzKSBzaG91bGQgZGVwZW5kIG9uIHRoZSBSWFFVQUwuIE9wdGltYWwgcmVzdWx0cword2VyZSBhY2hpZXZlZCB3aXRoIHRoZSBmb2xsb3dpbmcgc2V0dGluZ3M6CisqIFJYUVVBTCA8PSA0OiA5IGRCCisqIFJYUVVBTCA9PSA1OiA2IGRCCisqIFJYUVVBTCA+PSA2OiAxIGRCCisKKworCis9PSBBY3R1YWwgSGFuZG92ZXIgb24gYSBwcm90b2NvbCBsZXZlbCA9PQorCitBZnRlciB0aGUgQlNDIGhhcyBkZWNpZGVkIGEgaGFuZG92ZXIgc2hhbGwgYmUgZG9uZSwgaXQgaGFzIHRvCisKKyMgYWxsb2NhdGUgYSBjaGFubmVsIGF0IHRoZSBuZXcgQlRTCisjIGFsbG9jYXRlIGEgaGFuZG92ZXIgcmVmZXJlbmNlCisjIGFjdGl2YXRlIHRoZSBjaGFubmVsIG9uIHRoZSBCVFMgc2lkZSB1c2luZyBSU0wgQ0hBTk5FTCBBQ1RJVkFUSU9OLAorICBpbmRpY2F0aW5nIHRoZSBITyByZWZlcmVuY2UKKyMgQlRTIHJlc3BvbmRzIHdpdGggQ0hBTiBBQ1QgQUNLLCBpbmNsdWRpbmcgR1NNIGZyYW1lIG51bWJlcgorIyBCU0Mgc2VuZHMgMDQuMDggSE8gQ01EIHRvIE1TIHVzaW5nIG9sZCBCVFMKKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9kb2Mvb21sLWludGVyZmFjZS50eHQgYi9vcGVuYnNjL2RvYy9vbWwtaW50ZXJmYWNlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGRjZmVhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9kb2Mvb21sLWludGVyZmFjZS50eHQKQEAgLTAsMCArMSwyMSBAQAorb21sIGludGVyZmFjZSBkZXNpZ24gbm90ZXMKKworcHJvYmxlbXM6CisKKyogdGhlcmUgaXMgbm8gd2F5IGhvdyB0byB0YWcgYSBjb21tYW5kIHNlbnQgdG8gdGhlIEJUUywgd2l0aCB0aGUgcmVzcG9uc2UKKyAgaGF2aW5nIHRoZSBzYW1lIHRhZyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgY29tbWFuZAorKiB0aGVyZWZvcmUsIHdlIGNhbiBoYXZlIGUuZy4gYm90aCB0aGUgQlNDIGFuZCB0aGUgT01MIGludGVyZmFjZSBzZW5kIGEKKyAgU0VUIEFUVFJJQlVURSBtZXNzYWdlLCB3aGVyZSB0aGUgcmVzcG9uc2VzIHdvdWxkIGVuZCB1cCBhdCB0aGUgd3JvbmcKKyAgcXVlcnkuCisKK3RoZSBvbmx5IHBvc3NpYmxlIHNvbHV0aW9ucyBpIGNhbiBpbWFnaW5lOgorKiBoYXZlIHNvbWUga2luZCBvZiBleGNsdXNpdmUgbG9ja2luZywgd2hlcmUgdGhlIE9NTCBpbnRlcmZhY2UgZ2V0cyBibG9ja2VkCisgIGZyb20gdGhlIEJTQyBhbmQgaXMgZXhjbHVzaXZlbHkgYXNzaWduZWQgdG8gdGhlIE9NTCBjb25zb2xlIHVudGlsIGFsbCBjb21tYW5kcworICBvZiB0aGUgT01MIGNvbnNvbGUgaGF2ZSB0ZXJtaW5hdGVkLiAgVGhpcyBjYW4gZWl0aGVyIGJlIGRvbmUgZXhwbGljaXRseQorICBkeW5hbWljYWxseSBvciBvbiBkZW1hbmQKKworKiB1c2UgdGhlIE9NTCBpbnRlcmZhY2Ugc3luY2hyb25vdXNseSwgaS5lLiBhbHdheXMgd2FpdCBmb3IgdGhlIHJlc3BvbnNlIGZyb20KKyAgdGhlIEJUUyBiZWZvcmUKKworKiB1bmlsYXRlcmFsIC8gdW5zb2xpY2l0ZWQgbWVzc2FnZXMgbmVlZCB0byBiZSBicm9hZGNhc3RlZCB0byBib3RoIHRoZSBCU0MgYW5kCisgIHRoZSBPTUwgY29uc29sZQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9naXQtdmVyc2lvbi1nZW4gYi9vcGVuYnNjL2dpdC12ZXJzaW9uLWdlbgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mMmFkNGE3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9naXQtdmVyc2lvbi1nZW4KQEAgLTAsMCArMSwxNTEgQEAKKyMhL2Jpbi9zaAorIyBQcmludCBhIHZlcnNpb24gc3RyaW5nLgorc2NyaXB0dmVyc2lvbj0yMDEwLTAxLTI4LjAxCisKKyMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisjIFRoaXMgc2NyaXB0IGlzIGRlcml2ZWQgZnJvbSBHSVQtVkVSU0lPTi1HRU4gZnJvbSBHSVQ6IGh0dHA6Ly9naXQub3IuY3ovLgorIyBJdCBtYXkgYmUgcnVuIHR3byB3YXlzOgorIyAtIGZyb20gYSBnaXQgcmVwb3NpdG9yeSBpbiB3aGljaCB0aGUgImdpdCBkZXNjcmliZSIgY29tbWFuZCBiZWxvdworIyAgIHByb2R1Y2VzIHVzZWZ1bCBvdXRwdXQgKHRodXMgcmVxdWlyaW5nIGF0IGxlYXN0IG9uZSBzaWduZWQgdGFnKQorIyAtIGZyb20gYSBub24tZ2l0LXJlcG8gZGlyZWN0b3J5IGNvbnRhaW5pbmcgYSAudGFyYmFsbC12ZXJzaW9uIGZpbGUsIHdoaWNoCisjICAgcHJlc3VtZXMgdGhpcyBzY3JpcHQgaXMgaW52b2tlZCBsaWtlICIuL2dpdC12ZXJzaW9uLWdlbiAudGFyYmFsbC12ZXJzaW9uIi4KKworIyBJbiBvcmRlciB0byB1c2UgaW50cmEtdmVyc2lvbiBzdHJpbmdzIGluIHlvdXIgcHJvamVjdCwgeW91IHdpbGwgbmVlZCB0d28KKyMgc2VwYXJhdGUgZ2VuZXJhdGVkIHZlcnNpb24gc3RyaW5nIGZpbGVzOgorIworIyAudGFyYmFsbC12ZXJzaW9uIC0gcHJlc2VudCBvbmx5IGluIGEgZGlzdHJpYnV0aW9uIHRhcmJhbGwsIGFuZCBub3QgaW4KKyMgICBhIGNoZWNrZWQtb3V0IHJlcG9zaXRvcnkuICBDcmVhdGVkIHdpdGggY29udGVudHMgdGhhdCB3ZXJlIGxlYXJuZWQgYXQKKyMgICB0aGUgbGFzdCB0aW1lIGF1dG9jb25mIHdhcyBydW4sIGFuZCB1c2VkIGJ5IGdpdC12ZXJzaW9uLWdlbi4gIE11c3Qgbm90CisjICAgYmUgcHJlc2VudCBpbiBlaXRoZXIgJChzcmNkaXIpIG9yICQoYnVpbGRkaXIpIGZvciBnaXQtdmVyc2lvbi1nZW4gdG8KKyMgICBnaXZlIGFjY3VyYXRlIGFuc3dlcnMgZHVyaW5nIG5vcm1hbCBkZXZlbG9wbWVudCB3aXRoIGEgY2hlY2tlZCBvdXQgdHJlZSwKKyMgICBidXQgbXVzdCBiZSBwcmVzZW50IGluIGEgdGFyYmFsbCB3aGVuIHRoZXJlIGlzIG5vIHZlcnNpb24gY29udHJvbCBzeXN0ZW0uCisjICAgVGhlcmVmb3JlLCBpdCBjYW5ub3QgYmUgdXNlZCBpbiBhbnkgZGVwZW5kZW5jaWVzLiAgR05VbWFrZWZpbGUgaGFzCisjICAgaG9va3MgdG8gZm9yY2UgYSByZWNvbmZpZ3VyZSBhdCBkaXN0cmlidXRpb24gdGltZSB0byBnZXQgdGhlIHZhbHVlCisjICAgY29ycmVjdCwgd2l0aG91dCBwZW5hbGl6aW5nIG5vcm1hbCBkZXZlbG9wbWVudCB3aXRoIGV4dHJhIHJlY29uZmlndXJlcy4KKyMKKyMgLnZlcnNpb24gLSBwcmVzZW50IGluIGEgY2hlY2tlZC1vdXQgcmVwb3NpdG9yeSBhbmQgaW4gYSBkaXN0cmlidXRpb24KKyMgICB0YXJiYWxsLiAgVXNhYmxlIGluIGRlcGVuZGVuY2llcywgcGFydGljdWxhcmx5IGZvciBmaWxlcyB0aGF0IGRvbid0CisjICAgd2FudCB0byBkZXBlbmQgb24gY29uZmlnLmggYnV0IGRvIHdhbnQgdG8gdHJhY2sgdmVyc2lvbiBjaGFuZ2VzLgorIyAgIERlbGV0ZSB0aGlzIGZpbGUgcHJpb3IgdG8gYW55IGF1dG9jb25mIHJ1biB3aGVyZSB5b3Ugd2FudCB0byByZWJ1aWxkCisjICAgZmlsZXMgdG8gcGljayB1cCBhIHZlcnNpb24gc3RyaW5nIGNoYW5nZTsgYW5kIGxlYXZlIGl0IHN0YWxlIHRvCisjICAgbWluaW1pemUgcmVidWlsZCB0aW1lIGFmdGVyIHVucmVsYXRlZCBjaGFuZ2VzIHRvIGNvbmZpZ3VyZSBzb3VyY2VzLgorIworIyBJdCBpcyBwcm9iYWJseSB3aXNlIHRvIGFkZCB0aGVzZSB0d28gZmlsZXMgdG8gLmdpdGlnbm9yZSwgc28gdGhhdCB5b3UKKyMgZG9uJ3QgYWNjaWRlbnRhbGx5IGNvbW1pdCBlaXRoZXIgZ2VuZXJhdGVkIGZpbGUuCisjCisjIFVzZSB0aGUgZm9sbG93aW5nIGxpbmUgaW4geW91ciBjb25maWd1cmUuYWMsIHNvIHRoYXQgJChWRVJTSU9OKSB3aWxsCisjIGF1dG9tYXRpY2FsbHkgYmUgdXAtdG8tZGF0ZSBlYWNoIHRpbWUgY29uZmlndXJlIGlzIHJ1biAoYW5kIG5vdGUgdGhhdAorIyBzaW5jZSBjb25maWd1cmUuYWMgbm8gbG9uZ2VyIGluY2x1ZGVzIGEgdmVyc2lvbiBzdHJpbmcsIE1ha2VmaWxlIHJ1bGVzCisjIHNob3VsZCBub3QgZGVwZW5kIG9uIGNvbmZpZ3VyZS5hYyBmb3IgdmVyc2lvbiB1cGRhdGVzKS4KKyMKKyMgQUNfSU5JVChbR05VIHByb2plY3RdLAorIyAgICAgICAgIG00X2VzeXNjbWQoW2J1aWxkLWF1eC9naXQtdmVyc2lvbi1nZW4gLnRhcmJhbGwtdmVyc2lvbl0pLAorIyAgICAgICAgIFtidWctcHJvamVjdEBleGFtcGxlXSkKKyMKKyMgVGhlbiB1c2UgdGhlIGZvbGxvd2luZyBsaW5lcyBpbiB5b3VyIE1ha2VmaWxlLmFtLCBzbyB0aGF0IC52ZXJzaW9uCisjIHdpbGwgYmUgcHJlc2VudCBmb3IgZGVwZW5kZW5jaWVzLCBhbmQgc28gdGhhdCAudGFyYmFsbC12ZXJzaW9uIHdpbGwKKyMgZXhpc3QgaW4gZGlzdHJpYnV0aW9uIHRhcmJhbGxzLgorIworIyBCVUlMVF9TT1VSQ0VTID0gJCh0b3Bfc3JjZGlyKS8udmVyc2lvbgorIyAkKHRvcF9zcmNkaXIpLy52ZXJzaW9uOgorIwllY2hvICQoVkVSU0lPTikgPiAkQC10ICYmIG12ICRALXQgJEAKKyMgZGlzdC1ob29rOgorIwllY2hvICQoVkVSU0lPTikgPiAkKGRpc3RkaXIpLy50YXJiYWxsLXZlcnNpb24KKworY2FzZSAkIyBpbgorICAgIDEpIDs7CisgICAgKikgZWNobyAxPiYyICJVc2FnZTogJDAgXCRzcmNkaXIvLnRhcmJhbGwtdmVyc2lvbiI7IGV4aXQgMTs7Citlc2FjCisKK3RhcmJhbGxfdmVyc2lvbl9maWxlPSQxCitubD0nCisnCisKKyMgRmlyc3Qgc2VlIGlmIHRoZXJlIGlzIGEgdGFyYmFsbC1vbmx5IHZlcnNpb24gZmlsZS4KKyMgdGhlbiB0cnkgImdpdCBkZXNjcmliZSIsIHRoZW4gZGVmYXVsdC4KK2lmIHRlc3QgLWYgJHRhcmJhbGxfdmVyc2lvbl9maWxlCit0aGVuCisgICAgdj1gY2F0ICR0YXJiYWxsX3ZlcnNpb25fZmlsZWAgfHwgZXhpdCAxCisgICAgY2FzZSAkdiBpbgorCSokbmwqKSB2PSA7OyAjIHJlamVjdCBtdWx0aS1saW5lIG91dHB1dAorCVswLTldKikgOzsKKwkqKSB2PSA7OworICAgIGVzYWMKKyAgICB0ZXN0IC16ICIkdiIgXAorCSYmIGVjaG8gIiQwOiBXQVJOSU5HOiAkdGFyYmFsbF92ZXJzaW9uX2ZpbGUgc2VlbXMgdG8gYmUgZGFtYWdlZCIgMT4mMgorZmkKKworaWYgdGVzdCAtbiAiJHYiCit0aGVuCisgICAgOiAjIHVzZSAkdgorZWxpZiB0ZXN0IC1kIC4vLi4vLmdpdCBcCisgICAgJiYgdj1gZ2l0IGRlc2NyaWJlIC0tYWJicmV2PTQgLS1tYXRjaD0ndionIEhFQUQgMj4vZGV2L251bGwgXAorCSAgfHwgZ2l0IGRlc2NyaWJlIC0tYWJicmV2PTQgSEVBRCAyPi9kZXYvbnVsbGAgXAorICAgICYmIGNhc2UgJHYgaW4KKwkgWzAtOV0qKSA7OworCSB2WzAtOV0qKSA7OworCSAqKSAoZXhpdCAxKSA7OworICAgICAgIGVzYWMKK3RoZW4KKyAgICAjIElzIHRoaXMgYSBuZXcgZ2l0IHRoYXQgbGlzdHMgbnVtYmVyIG9mIGNvbW1pdHMgc2luY2UgdGhlIGxhc3QKKyAgICAjIHRhZyBvciB0aGUgcHJldmlvdXMgb2xkZXIgdmVyc2lvbiB0aGF0IGRpZCBub3Q/CisgICAgIyAgIE5ld2VyOiB2Ni4xMC03Ny1nMGY4ZmFlYgorICAgICMgICBPbGRlcjogdjYuMTAtZzBmOGZhZWIKKyAgICBjYXNlICR2IGluCisJKi0qLSopIDogZ2l0IGRlc2NyaWJlIGlzIG9rYXkgdGhyZWUgcGFydCBmbGF2b3IgOzsKKwkqLSopCisJICAgIDogZ2l0IGRlc2NyaWJlIGlzIG9sZGVyIHR3byBwYXJ0IGZsYXZvcgorCSAgICAjIFJlY3JlYXRlIHRoZSBudW1iZXIgb2YgY29tbWl0cyBhbmQgcmV3cml0ZSBzdWNoIHRoYXQgdGhlCisJICAgICMgcmVzdWx0IGlzIHRoZSBzYW1lIGFzIGlmIHdlIHdlcmUgdXNpbmcgdGhlIG5ld2VyIHZlcnNpb24KKwkgICAgIyBvZiBnaXQgZGVzY3JpYmUuCisJICAgIHZ0YWc9YGVjaG8gIiR2IiB8IHNlZCAncy8tLiovLydgCisJICAgIG51bWNvbW1pdHM9YGdpdCByZXYtbGlzdCAiJHZ0YWciLi5IRUFEIHwgd2MgLWxgCisJICAgIHY9YGVjaG8gIiR2IiB8IHNlZCAicy9cKC4qXCktXCguKlwpL1wxLSRudW1jb21taXRzLVwyLyJgOworCSAgICA7OworICAgIGVzYWMKKworICAgICMgQ2hhbmdlIHRoZSBmaXJzdCAnLScgdG8gYSAnLicsIHNvIHZlcnNpb24tY29tcGFyaW5nIHRvb2xzIHdvcmsgcHJvcGVybHkuCisgICAgIyBSZW1vdmUgdGhlICJnIiBpbiBnaXQgZGVzY3JpYmUncyBvdXRwdXQgc3RyaW5nLCB0byBzYXZlIGEgYnl0ZS4KKyAgICB2PWBlY2hvICIkdiIgfCBzZWQgJ3MvLS8uLztzL1woLipcKS1nL1wxLS8nYDsKK2Vsc2UKKyAgICB2PVVOS05PV04KK2ZpCisKK3Y9YGVjaG8gIiR2IiB8c2VkICdzL152Ly8nYAorCisjIERvbid0IGRlY2xhcmUgYSB2ZXJzaW9uICJkaXJ0eSIgbWVyZWx5IGJlY2F1c2UgYSB0aW1lIHN0YW1wIGhhcyBjaGFuZ2VkLgorZ2l0IHN0YXR1cyA+IC9kZXYvbnVsbCAyPiYxCisKK2RpcnR5PWBzaCAtYyAnZ2l0IGRpZmYtaW5kZXggLS1uYW1lLW9ubHkgSEVBRCcgMj4vZGV2L251bGxgIHx8IGRpcnR5PQorY2FzZSAiJGRpcnR5IiBpbgorICAgICcnKSA7OworICAgICopICMgQXBwZW5kIHRoZSBzdWZmaXggb25seSBpZiB0aGVyZSBpc24ndCBvbmUgYWxyZWFkeS4KKwljYXNlICR2IGluCisJICAqLWRpcnR5KSA7OworCSAgKikgdj0iJHYtZGlydHkiIDs7CisJZXNhYyA7OworZXNhYworCisjIE9taXQgdGhlIHRyYWlsaW5nIG5ld2xpbmUsIHNvIHRoYXQgbTRfZXN5c2NtZCBjYW4gdXNlIHRoZSByZXN1bHQgZGlyZWN0bHkuCitlY2hvICIkdiIgfCB0ciAtZCAnXDAxMicKKworIyBMb2NhbCB2YXJpYWJsZXM6CisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKKyMgdGltZS1zdGFtcC1lbmQ6ICIkIgorIyBFbmQ6CmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvTWFrZWZpbGUuYW0gYi9vcGVuYnNjL2luY2x1ZGUvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZiMmEzMwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDMgQEAKK1NVQkRJUlMgPSBvcGVuYnNjIHZ0eSBzY2NwCisKK25vaW5zdF9IRUFERVJTID0gbUlTRE5pZi5oIGNvbXBhdF9hZl9pc2RuLmgKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9jb21wYXRfYWZfaXNkbi5oIGIvb3BlbmJzYy9pbmNsdWRlL2NvbXBhdF9hZl9pc2RuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZjYmZiMwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9jb21wYXRfYWZfaXNkbi5oCkBAIC0wLDAgKzEsMzkgQEAKKyNpZmRlZiBNSVNETl9PTERfQUZfQ09NUEFUSUJJTElUWQorI3VuZGVmIEFGX0lTRE4KKyN1bmRlZiBQRl9JU0ROCisKK2V4dGVybglpbnQJQUZfSVNETjsKKyNkZWZpbmUgUEZfSVNETglBRl9JU0ROCisKK2ludAlBRl9JU0ROOworCisjZW5kaWYKKworZXh0ZXJuIHZvaWQgaW5pdF9hZl9pc2RuKHZvaWQpOworCisjaWZkZWYgQUZfQ09NUEFUSUJJTElUWV9GVU5DCisjaWZkZWYgTUlTRE5fT0xEX0FGX0NPTVBBVElCSUxJVFkKK3ZvaWQgaW5pdF9hZl9pc2RuKHZvaWQpCit7CisJaW50CXM7CisKKwkvKiB0ZXN0IGZvciBuZXcgdmFsdWUgKi8KKwlBRl9JU0ROID0gMzQ7CisJcyA9IHNvY2tldChBRl9JU0ROLCBTT0NLX1JBVywgSVNETl9QX0JBU0UpOworCWlmIChzID49IDApIHsKKwkJY2xvc2Uocyk7CisJCXJldHVybjsKKwl9CisJQUZfSVNETiA9IDI3OworCXMgPSBzb2NrZXQoQUZfSVNETiwgU09DS19SQVcsIElTRE5fUF9CQVNFKTsKKwlpZiAocyA+PSAwKSB7CisJCWNsb3NlKHMpOworCQlyZXR1cm47CisJfQorfQorI2Vsc2UKK3ZvaWQgaW5pdF9hZl9pc2RuKHZvaWQpCit7Cit9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL21JU0ROaWYuaCBiL29wZW5ic2MvaW5jbHVkZS9tSVNETmlmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUwNjVkMgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9tSVNETmlmLmgKQEAgLTAsMCArMSwzODcgQEAKKy8qCisgKgorICogQXV0aG9yCUthcnN0ZW4gS2VpbCA8a2tlaWxAbm92ZWxsLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgMjAwOCAgYnkgS2Fyc3RlbiBLZWlsIDxra2VpbEBub3ZlbGwuY29tPgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMRVNTRVIgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICogdmVyc2lvbiAyLjEgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExFU1NFUiBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpZm5kZWYgbUlTRE5JRl9ICisjZGVmaW5lIG1JU0ROSUZfSAorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaWZkZWYgbGludXgKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjZWxzZQorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9lcnJuby5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNlbmRpZgorCisvKgorICogQUJJIFZlcnNpb24gMzIgYml0CisgKgorICogPDggYml0PiBNYWpvciB2ZXJzaW9uCisgKgkJLSBjaGFuZ2VkIGlmIGFueSBpbnRlcmZhY2UgYmVjb21lIGJhY2t3YXJkcyBpbmNvbXBhdGlibGUKKyAqCisgKiA8OCBiaXQ+IE1pbm9yIHZlcnNpb24KKyAqICAgICAgICAgICAgICAtIGNoYW5nZWQgaWYgYW55IGludGVyZmFjZSBpcyBleHRlbmRlZCBidXQgYmFja3dhcmRzIGNvbXBhdGlibGUKKyAqCisgKiA8MTYgYml0PiBSZWxlYXNlIG51bWJlcgorICogICAgICAgICAgICAgIC0gc2hvdWxkIGJlIGluY3JlbWVudGVkIG9uIGV2ZXJ5IGNoZWNraW4KKyAqLworI2RlZmluZQlNSVNETl9NQUpPUl9WRVJTSU9OCTEKKyNkZWZpbmUJTUlTRE5fTUlOT1JfVkVSU0lPTgkxCisjZGVmaW5lIE1JU0ROX1JFTEVBU0UJCTIwCisKKy8qIHByaW1pdGl2ZXMgZm9yIGluZm9ybWF0aW9uIGV4Y2hhbmdlCisgKiBnZW5lcmVsbCBmb3JtYXQKKyAqIDwxNiAgYml0ICAwID4KKyAqIDw4ICBiaXQgY29tbWFuZD4KKyAqICAgIEJJVCA4ID0gMSBMQVlFUiBwcml2YXRlCisgKiAgICBCSVQgNyA9IDEgYW5zd2VyCisgKiAgICBCSVQgNiA9IDEgREFUQQorICogPDggIGJpdCB0YXJnZXQgbGF5ZXIgbWFzaz4KKyAqCisgKiBMYXllciA9IDAwIGlzIHJlc2VydmVkIGZvciBnZW5lcmFsIGNvbW1hbmRzCisgICBMYXllciA9IDAxICBMMiAtPiBIVworICAgTGF5ZXIgPSAwMiAgSFcgLT4gTDIKKyAgIExheWVyID0gMDQgIEwzIC0+IEwyCisgICBMYXllciA9IDA4ICBMMiAtPiBMMworICogTGF5ZXIgPSBGRiBpcyByZXNlcnZlZCBmb3IgYnJvYWRjYXN0IGNvbW1hbmRzCisgKi8KKworI2RlZmluZSBNSVNETl9DTURNQVNLCQkweGZmMDAKKyNkZWZpbmUgTUlTRE5fTEFZRVJNQVNLCQkweDAwZmYKKworLyogZ2VuZXJlbGwgY29tbWFuZHMgKi8KKyNkZWZpbmUgT1BFTl9DSEFOTkVMCQkweDAxMDAKKyNkZWZpbmUgQ0xPU0VfQ0hBTk5FTAkJMHgwMjAwCisjZGVmaW5lIENPTlRST0xfQ0hBTk5FTAkJMHgwMzAwCisjZGVmaW5lIENIRUNLX0RBVEEJCTB4MDQwMAorCisvKiBsYXllciAyIC0+IGxheWVyIDEgKi8KKyNkZWZpbmUgUEhfQUNUSVZBVEVfUkVRCQkweDAxMDEKKyNkZWZpbmUgUEhfREVBQ1RJVkFURV9SRVEJMHgwMjAxCisjZGVmaW5lIFBIX0RBVEFfUkVRCQkweDIwMDEKKyNkZWZpbmUgTVBIX0FDVElWQVRFX1JFUQkweDA1MDEKKyNkZWZpbmUgTVBIX0RFQUNUSVZBVEVfUkVRCTB4MDYwMQorI2RlZmluZSBNUEhfSU5GT1JNQVRJT05fUkVRCTB4MDcwMQorI2RlZmluZSBQSF9DT05UUk9MX1JFUQkJMHgwODAxCisKKy8qIGxheWVyIDEgLT4gbGF5ZXIgMiAqLworI2RlZmluZSBQSF9BQ1RJVkFURV9JTkQJCTB4MDEwMgorI2RlZmluZSBQSF9BQ1RJVkFURV9DTkYJCTB4NDEwMgorI2RlZmluZSBQSF9ERUFDVElWQVRFX0lORAkweDAyMDIKKyNkZWZpbmUgUEhfREVBQ1RJVkFURV9DTkYJMHg0MjAyCisjZGVmaW5lIFBIX0RBVEFfSU5ECQkweDIwMDIKKyNkZWZpbmUgUEhfREFUQV9FX0lORAkJMHgzMDAyCisjZGVmaW5lIE1QSF9BQ1RJVkFURV9JTkQJMHgwNTAyCisjZGVmaW5lIE1QSF9ERUFDVElWQVRFX0lORAkweDA2MDIKKyNkZWZpbmUgTVBIX0lORk9STUFUSU9OX0lORAkweDA3MDIKKyNkZWZpbmUgUEhfREFUQV9DTkYJCTB4NjAwMgorI2RlZmluZSBQSF9DT05UUk9MX0lORAkJMHgwODAyCisjZGVmaW5lIFBIX0NPTlRST0xfQ05GCQkweDQ4MDIKKworLyogbGF5ZXIgMyAtPiBsYXllciAyICovCisjZGVmaW5lIERMX0VTVEFCTElTSF9SRVEJMHgxMDA0CisjZGVmaW5lIERMX1JFTEVBU0VfUkVRCQkweDExMDQKKyNkZWZpbmUgRExfREFUQV9SRVEJCTB4MzAwNAorI2RlZmluZSBETF9VTklUREFUQV9SRVEJCTB4MzEwNAorI2RlZmluZSBETF9JTkZPUk1BVElPTl9SRVEJMHgwMDA0CisKKy8qIGxheWVyIDIgLT4gbGF5ZXIgMyAqLworI2RlZmluZSBETF9FU1RBQkxJU0hfSU5ECTB4MTAwOAorI2RlZmluZSBETF9FU1RBQkxJU0hfQ05GCTB4NTAwOAorI2RlZmluZSBETF9SRUxFQVNFX0lORAkJMHgxMTA4CisjZGVmaW5lIERMX1JFTEVBU0VfQ05GCQkweDUxMDgKKyNkZWZpbmUgRExfREFUQV9JTkQJCTB4MzAwOAorI2RlZmluZSBETF9VTklUREFUQV9JTkQJCTB4MzEwOAorI2RlZmluZSBETF9JTkZPUk1BVElPTl9JTkQJMHgwMDA4CisKKy8qIGludGVybiBsYXllciAyIG1hbmFnbWVudCAqLworI2RlZmluZSBNRExfQVNTSUdOX1JFUQkJMHgxODA0CisjZGVmaW5lIE1ETF9BU1NJR05fSU5ECQkweDE5MDQKKyNkZWZpbmUgTURMX1JFTU9WRV9SRVEJCTB4MUEwNAorI2RlZmluZSBNRExfUkVNT1ZFX0lORAkJMHgxQjA0CisjZGVmaW5lIE1ETF9TVEFUVVNfVVBfSU5ECTB4MUMwNAorI2RlZmluZSBNRExfU1RBVFVTX0RPV05fSU5ECTB4MUQwNAorI2RlZmluZSBNRExfU1RBVFVTX1VJX0lORAkweDFFMDQKKyNkZWZpbmUgTURMX0VSUk9SX0lORAkJMHgxRjA0CisjZGVmaW5lIE1ETF9FUlJPUl9SU1AJCTB4NUYwNAorCisvKiBETF9JTkZPUk1BVElPTl9JTkQgdHlwZXMgKi8KKyNkZWZpbmUgRExfSU5GT19MMl9DT05ORUNUCTB4MDAwMQorI2RlZmluZSBETF9JTkZPX0wyX1JFTU9WRUQJMHgwMDAyCisKKy8qIFBIX0NPTlRST0wgdHlwZXMgKi8KKy8qIFRPVUNIIFRPTkUgSVMgMHgyMFhYICBYWCAiMCIuLi4iOSIsICJBIiwiQiIsIkMiLCJEIiwiKiIsIiMiICovCisjZGVmaW5lIERUTUZfVE9ORV9WQUwJCTB4MjAwMAorI2RlZmluZSBEVE1GX1RPTkVfTUFTSwkJMHgwMDdGCisjZGVmaW5lIERUTUZfVE9ORV9TVEFSVAkJMHgyMTAwCisjZGVmaW5lIERUTUZfVE9ORV9TVE9QCQkweDIyMDAKKyNkZWZpbmUgRFRNRl9IRkNfQ09FRgkJMHg0MDAwCisjZGVmaW5lIERTUF9DT05GX0pPSU4JCTB4MjQwMworI2RlZmluZSBEU1BfQ09ORl9TUExJVAkJMHgyNDA0CisjZGVmaW5lIERTUF9SRUNFSVZFX09GRgkJMHgyNDA1CisjZGVmaW5lIERTUF9SRUNFSVZFX09OCQkweDI0MDYKKyNkZWZpbmUgRFNQX0VDSE9fT04JCTB4MjQwNworI2RlZmluZSBEU1BfRUNIT19PRkYJCTB4MjQwOAorI2RlZmluZSBEU1BfTUlYX09OCQkweDI0MDkKKyNkZWZpbmUgRFNQX01JWF9PRkYJCTB4MjQwYQorI2RlZmluZSBEU1BfREVMQVkJCTB4MjQwYgorI2RlZmluZSBEU1BfSklUVEVSCQkweDI0MGMKKyNkZWZpbmUgRFNQX1RYREFUQV9PTgkJMHgyNDBkCisjZGVmaW5lIERTUF9UWERBVEFfT0ZGCQkweDI0MGUKKyNkZWZpbmUgRFNQX1RYX0RFSklUVEVSCQkweDI0MGYKKyNkZWZpbmUgRFNQX1RYX0RFSl9PRkYJCTB4MjQxMAorI2RlZmluZSBEU1BfVE9ORV9QQVRUX09OCTB4MjQxMQorI2RlZmluZSBEU1BfVE9ORV9QQVRUX09GRgkweDI0MTIKKyNkZWZpbmUgRFNQX1ZPTF9DSEFOR0VfVFgJMHgyNDEzCisjZGVmaW5lIERTUF9WT0xfQ0hBTkdFX1JYCTB4MjQxNAorI2RlZmluZSBEU1BfQkZfRU5BQkxFX0tFWQkweDI0MTUKKyNkZWZpbmUgRFNQX0JGX0RJU0FCTEUJCTB4MjQxNgorI2RlZmluZSBEU1BfQkZfQUNDRVBUCQkweDI0MTYKKyNkZWZpbmUgRFNQX0JGX1JFSkVDVAkJMHgyNDE3CisjZGVmaW5lIERTUF9QSVBFTElORV9DRkcJMHgyNDE4CisjZGVmaW5lIEhGQ19WT0xfQ0hBTkdFX1RYCTB4MjYwMQorI2RlZmluZSBIRkNfVk9MX0NIQU5HRV9SWAkweDI2MDIKKyNkZWZpbmUgSEZDX1NQTF9MT09QX09OCQkweDI2MDMKKyNkZWZpbmUgSEZDX1NQTF9MT09QX09GRgkweDI2MDQKKworLyogRFNQX1RPTkVfUEFUVF9PTiBwYXJhbWV0ZXIgKi8KKyNkZWZpbmUgVE9ORV9PRkYJCQkweDAwMDAKKyNkZWZpbmUgVE9ORV9HRVJNQU5fRElBTFRPTkUJCTB4MDAwMQorI2RlZmluZSBUT05FX0dFUk1BTl9PTERESUFMVE9ORQkJMHgwMDAyCisjZGVmaW5lIFRPTkVfQU1FUklDQU5fRElBTFRPTkUJCTB4MDAwMworI2RlZmluZSBUT05FX0dFUk1BTl9ESUFMUEJYCQkweDAwMDQKKyNkZWZpbmUgVE9ORV9HRVJNQU5fT0xERElBTFBCWAkJMHgwMDA1CisjZGVmaW5lIFRPTkVfQU1FUklDQU5fRElBTFBCWAkJMHgwMDA2CisjZGVmaW5lIFRPTkVfR0VSTUFOX1JJTkdJTkcJCTB4MDAwNworI2RlZmluZSBUT05FX0dFUk1BTl9PTERSSU5HSU5HCQkweDAwMDgKKyNkZWZpbmUgVE9ORV9BTUVSSUNBTl9SSU5HUEJYCQkweDAwMGIKKyNkZWZpbmUgVE9ORV9HRVJNQU5fUklOR1BCWAkJMHgwMDBjCisjZGVmaW5lIFRPTkVfR0VSTUFOX09MRFJJTkdQQlgJCTB4MDAwZAorI2RlZmluZSBUT05FX0FNRVJJQ0FOX1JJTkdJTkcJCTB4MDAwZQorI2RlZmluZSBUT05FX0dFUk1BTl9CVVNZCQkweDAwMGYKKyNkZWZpbmUgVE9ORV9HRVJNQU5fT0xEQlVTWQkJMHgwMDEwCisjZGVmaW5lIFRPTkVfQU1FUklDQU5fQlVTWQkJMHgwMDExCisjZGVmaW5lIFRPTkVfR0VSTUFOX0hBTkdVUAkJMHgwMDEyCisjZGVmaW5lIFRPTkVfR0VSTUFOX09MREhBTkdVUAkJMHgwMDEzCisjZGVmaW5lIFRPTkVfQU1FUklDQU5fSEFOR1VQCQkweDAwMTQKKyNkZWZpbmUgVE9ORV9TUEVDSUFMX0lORk8JCTB4MDAxNQorI2RlZmluZSBUT05FX0dFUk1BTl9HQVNTRU5CRVNFVFpUCTB4MDAxNgorI2RlZmluZSBUT05FX0dFUk1BTl9BVUZTQ0hBTFRUT04JMHgwMDE2CisKKy8qIE1QSF9JTkZPUk1BVElPTl9JTkQgKi8KKyNkZWZpbmUgTDFfU0lHTkFMX0xPU19PRkYJMHgwMDEwCisjZGVmaW5lIEwxX1NJR05BTF9MT1NfT04JMHgwMDExCisjZGVmaW5lIEwxX1NJR05BTF9BSVNfT0ZGCTB4MDAxMgorI2RlZmluZSBMMV9TSUdOQUxfQUlTX09OCTB4MDAxMworI2RlZmluZSBMMV9TSUdOQUxfUkRJX09GRgkweDAwMTQKKyNkZWZpbmUgTDFfU0lHTkFMX1JESV9PTgkweDAwMTUKKyNkZWZpbmUgTDFfU0lHTkFMX1NMSVBfUlgJMHgwMDIwCisjZGVmaW5lIEwxX1NJR05BTF9TTElQX1RYCTB4MDAyMQorCisvKgorICogcHJvdG9jb2wgaWRzCisgKiBEIGNoYW5uZWwgMS0zMQorICogQiBjaGFubmVsIDMzIC0gNjMKKyAqLworCisjZGVmaW5lIElTRE5fUF9OT05FCQkwCisjZGVmaW5lIElTRE5fUF9CQVNFCQkwCisjZGVmaW5lIElTRE5fUF9URV9TMAkJMHgwMQorI2RlZmluZSBJU0ROX1BfTlRfUzAgIAkJMHgwMgorI2RlZmluZSBJU0ROX1BfVEVfRTEJCTB4MDMKKyNkZWZpbmUgSVNETl9QX05UX0UxICAJCTB4MDQKKyNkZWZpbmUgSVNETl9QX1RFX1VQMAkJMHgwNQorI2RlZmluZSBJU0ROX1BfTlRfVVAwCQkweDA2CisKKyNkZWZpbmUgSVNfSVNETl9QX1RFKHApICgocCA9PSBJU0ROX1BfVEVfUzApIHx8IChwID09IElTRE5fUF9URV9FMSkgfHwgXAorCQkJCShwID09IElTRE5fUF9URV9VUDApIHx8IChwID09IElTRE5fUF9MQVBEX1RFKSkKKyNkZWZpbmUgSVNfSVNETl9QX05UKHApICgocCA9PSBJU0ROX1BfTlRfUzApIHx8IChwID09IElTRE5fUF9OVF9FMSkgfHwgXAorCQkJCShwID09IElTRE5fUF9OVF9VUDApIHx8IChwID09IElTRE5fUF9MQVBEX05UKSkKKyNkZWZpbmUgSVNfSVNETl9QX1MwKHApICgocCA9PSBJU0ROX1BfVEVfUzApIHx8IChwID09IElTRE5fUF9OVF9TMCkpCisjZGVmaW5lIElTX0lTRE5fUF9FMShwKSAoKHAgPT0gSVNETl9QX1RFX0UxKSB8fCAocCA9PSBJU0ROX1BfTlRfRTEpKQorI2RlZmluZSBJU19JU0ROX1BfVVAwKHApICgocCA9PSBJU0ROX1BfVEVfVVAwKSB8fCAocCA9PSBJU0ROX1BfTlRfVVAwKSkKKworCisjZGVmaW5lIElTRE5fUF9MQVBEX1RFCQkweDEwCisjZGVmaW5lCUlTRE5fUF9MQVBEX05UCQkweDExCisKKyNkZWZpbmUgSVNETl9QX0JfTUFTSwkJMHgxZgorI2RlZmluZSBJU0ROX1BfQl9TVEFSVAkJMHgyMAorCisjZGVmaW5lIElTRE5fUF9CX1JBVwkJMHgyMQorI2RlZmluZSBJU0ROX1BfQl9IRExDCQkweDIyCisjZGVmaW5lIElTRE5fUF9CX1g3NVNMUAkJMHgyMworI2RlZmluZSBJU0ROX1BfQl9MMkRUTUYJCTB4MjQKKyNkZWZpbmUgSVNETl9QX0JfTDJEU1AJCTB4MjUKKyNkZWZpbmUgSVNETl9QX0JfTDJEU1BIRExDCTB4MjYKKworI2RlZmluZSBPUFRJT05fTDJfUE1YCQkxCisjZGVmaW5lIE9QVElPTl9MMl9QVFAJCTIKKyNkZWZpbmUgT1BUSU9OX0wyX0ZJWEVEVEVJCTMKKyNkZWZpbmUgT1BUSU9OX0wyX0NMRUFOVVAJNAorCisvKiBzaG91bGQgYmUgaW4gc3luYyB3aXRoIGxpbnV4L2tvYmplY3QuaDpLT0JKX05BTUVfTEVOICovCisjZGVmaW5lIE1JU0ROX01BWF9JRExFTgkJMjAKKworc3RydWN0IG1JU0ROaGVhZCB7CisJdW5zaWduZWQgaW50CXByaW07CisJdW5zaWduZWQgaW50CWlkOworfSAgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyNkZWZpbmUgTUlTRE5fSEVBREVSX0xFTglzaXplb2Yoc3RydWN0IG1JU0ROaGVhZCkKKyNkZWZpbmUgTUFYX0RBVEFfU0laRQkJMjA0OAorI2RlZmluZSBNQVhfREFUQV9NRU0JCShNQVhfREFUQV9TSVpFICsgTUlTRE5fSEVBREVSX0xFTikKKyNkZWZpbmUgTUFYX0RGUkFNRV9MRU4JCTI2MAorCisjZGVmaW5lIE1JU0ROX0lEX0FERFJfTUFTSwkweEZGRkYKKyNkZWZpbmUgTUlTRE5fSURfVEVJX01BU0sJMHhGRjAwCisjZGVmaW5lIE1JU0ROX0lEX1NBUElfTUFTSwkweDAwRkYKKyNkZWZpbmUgTUlTRE5fSURfVEVJX0FOWQkweDdGMDAKKworI2RlZmluZSBNSVNETl9JRF9BTlkJCTB4RkZGRgorI2RlZmluZSBNSVNETl9JRF9OT05FCQkweEZGRkUKKworI2RlZmluZSBHUk9VUF9URUkJCTEyNworI2RlZmluZSBURUlfU0FQSQkJNjMKKyNkZWZpbmUgQ1RSTF9TQVBJCQkwCisKKyNkZWZpbmUgTUlTRE5fTUFYX0NIQU5ORUwJMTI3CisjZGVmaW5lIE1JU0ROX0NITUFQX1NJWkUJKChNSVNETl9NQVhfQ0hBTk5FTCArIDEpID4+IDMpCisKKyNkZWZpbmUgU09MX01JU0ROCTAKKworc3RydWN0IHNvY2thZGRyX21JU0ROIHsKKwlzYV9mYW1pbHlfdCAgICBmYW1pbHk7CisJdW5zaWduZWQgY2hhcglkZXY7CisJdW5zaWduZWQgY2hhcgljaGFubmVsOworCXVuc2lnbmVkIGNoYXIJc2FwaTsKKwl1bnNpZ25lZCBjaGFyCXRlaTsKK307CisKK3N0cnVjdCBtSVNETnZlcnNpb24geworCXVuc2lnbmVkIGNoYXIJbWFqb3I7CisJdW5zaWduZWQgY2hhcgltaW5vcjsKKwl1bnNpZ25lZCBzaG9ydAlyZWxlYXNlOworfTsKKworI2RlZmluZSBNQVhfREVWSUNFX0lEIDYzCisKK3N0cnVjdCBtSVNETl9kZXZpbmZvIHsKKwl1X2ludAkJCWlkOworCXVfaW50CQkJRHByb3RvY29sczsKKwl1X2ludAkJCUJwcm90b2NvbHM7CisJdV9pbnQJCQlwcm90b2NvbDsKKwl1X2NoYXIJCQljaGFubmVsbWFwW01JU0ROX0NITUFQX1NJWkVdOworCXVfaW50CQkJbnJiY2hhbjsKKwljaGFyCQkJbmFtZVtNSVNETl9NQVhfSURMRU5dOworfTsKKworc3RydWN0IG1JU0ROX2RldnJlbmFtZSB7CisJdV9pbnQJCQlpZDsKKwljaGFyCQkJbmFtZVtNSVNETl9NQVhfSURMRU5dOworfTsKKworc3RydWN0IHBoX2luZm9fY2ggeworCWludDMyX3QgCQlwcm90b2NvbDsKKwlpbnQ2NF90CQkJRmxhZ3M7Cit9OworCitzdHJ1Y3QgcGhfaW5mb19kY2ggeworCXN0cnVjdCBwaF9pbmZvX2NoCWNoOworCWludDE2X3QJCQlzdGF0ZTsKKwlpbnQxNl90CQkJbnVtX2JjaDsKK307CisKK3N0cnVjdCBwaF9pbmZvIHsKKwlzdHJ1Y3QgcGhfaW5mb19kY2gJZGNoOworCXN0cnVjdCBwaF9pbmZvX2NoIAliY2hbXTsKK307CisKKy8qIHRpbWVyIGRldmljZSBpb2N0bCAqLworI2RlZmluZSBJTUFERFRJTUVSCV9JT1IoJ0knLCA2NCwgaW50KQorI2RlZmluZSBJTURFTFRJTUVSCV9JT1IoJ0knLCA2NSwgaW50KQorLyogc29ja2V0IGlvY3RscyAqLworI2RlZmluZQlJTUdFVFZFUlNJT04JX0lPUignSScsIDY2LCBpbnQpCisjZGVmaW5lCUlNR0VUQ09VTlQJX0lPUignSScsIDY3LCBpbnQpCisjZGVmaW5lIElNR0VUREVWSU5GTwlfSU9SKCdJJywgNjgsIGludCkKKyNkZWZpbmUgSU1DVFJMUkVRCV9JT1IoJ0knLCA2OSwgaW50KQorI2RlZmluZSBJTUNMRUFSX0wyCV9JT1IoJ0knLCA3MCwgaW50KQorI2RlZmluZSBJTVNFVERFVk5BTUUJX0lPUignSScsIDcxLCBzdHJ1Y3QgbUlTRE5fZGV2cmVuYW1lKQorCitzdGF0aWMgaW5saW5lIGludAordGVzdF9jaGFubmVsbWFwKHVfaW50IG5yLCB1X2NoYXIgKm1hcCkKK3sKKwlpZiAobnIgPD0gTUlTRE5fTUFYX0NIQU5ORUwpCisJCXJldHVybiBtYXBbbnIgPj4gM10gJiAoMSA8PCAobnIgJiA3KSk7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitzZXRfY2hhbm5lbG1hcCh1X2ludCBuciwgdV9jaGFyICptYXApCit7CisJbWFwW25yID4+IDNdIHw9ICgxIDw8IChuciAmIDcpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitjbGVhcl9jaGFubmVsbWFwKHVfaW50IG5yLCB1X2NoYXIgKm1hcCkKK3sKKwltYXBbbnIgPj4gM10gJj0gfigxIDw8IChuciAmIDcpKTsKK30KKworLyogQ09OVFJPTF9DSEFOTkVMIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgTUlTRE5fQ1RSTF9HRVRPUAkJMHgwMDAwCisjZGVmaW5lIE1JU0ROX0NUUkxfTE9PUAkJCTB4MDAwMQorI2RlZmluZSBNSVNETl9DVFJMX0NPTk5FQ1QJCTB4MDAwMgorI2RlZmluZSBNSVNETl9DVFJMX0RJU0NPTk5FQ1QJCTB4MDAwNAorI2RlZmluZSBNSVNETl9DVFJMX1BDTUNPTk5FQ1QJCTB4MDAxMAorI2RlZmluZSBNSVNETl9DVFJMX1BDTURJU0NPTk5FQ1QJMHgwMDIwCisjZGVmaW5lIE1JU0ROX0NUUkxfU0VUUEVFUgkJMHgwMDQwCisjZGVmaW5lIE1JU0ROX0NUUkxfVU5TRVRQRUVSCQkweDAwODAKKyNkZWZpbmUgTUlTRE5fQ1RSTF9SWF9PRkYJCTB4MDEwMAorI2RlZmluZSBNSVNETl9DVFJMX0ZJTExfRU1QVFkJCTB4MDIwMAorI2RlZmluZSBNSVNETl9DVFJMX0dFVFBFRVIJCTB4MDQwMAorI2RlZmluZSBNSVNETl9DVFJMX0hXX0ZFQVRVUkVTX09QCTB4MjAwMAorI2RlZmluZSBNSVNETl9DVFJMX0hXX0ZFQVRVUkVTCQkweDIwMDEKKyNkZWZpbmUgTUlTRE5fQ1RSTF9IRkNfT1AJCTB4NDAwMAorI2RlZmluZSBNSVNETl9DVFJMX0hGQ19QQ01fQ09OTgkJMHg0MDAxCisjZGVmaW5lIE1JU0ROX0NUUkxfSEZDX1BDTV9ESVNDCQkweDQwMDIKKyNkZWZpbmUgTUlTRE5fQ1RSTF9IRkNfQ09ORl9KT0lOCTB4NDAwMworI2RlZmluZSBNSVNETl9DVFJMX0hGQ19DT05GX1NQTElUCTB4NDAwNAorI2RlZmluZSBNSVNETl9DVFJMX0hGQ19SRUNFSVZFX09GRgkweDQwMDUKKyNkZWZpbmUgTUlTRE5fQ1RSTF9IRkNfUkVDRUlWRV9PTgkweDQwMDYKKyNkZWZpbmUgTUlTRE5fQ1RSTF9IRkNfRUNIT0NBTl9PTiAJMHg0MDA3CisjZGVmaW5lIE1JU0ROX0NUUkxfSEZDX0VDSE9DQU5fT0ZGIAkweDQwMDgKKworCisvKiBzb2NrZXQgb3B0aW9ucyAqLworI2RlZmluZSBNSVNETl9USU1FX1NUQU1QCQkweDAwMDEKKworc3RydWN0IG1JU0ROX2N0cmxfcmVxIHsKKwlpbnQJCW9wOworCWludAkJY2hhbm5lbDsKKwlpbnQJCXAxOworCWludAkJcDI7Cit9OworCisvKiBtdXhlciBvcHRpb25zICovCisjZGVmaW5lIE1JU0ROX09QVF9BTEwJCTEKKyNkZWZpbmUgTUlTRE5fT1BUX1RFSU1HUgkyCisKKyNlbmRpZiAvKiBtSVNETklGX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL01ha2VmaWxlLmFtIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgzOTk3YQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTEgQEAKK25vaW5zdF9IRUFERVJTID0gYWJpc19ubS5oIGFiaXNfcnNsLmggZGIuaCBnc21fMDRfMDguaCBnc21fZGF0YS5oIFwKKwkJIGdzbV9zdWJzY3JpYmVyLmggZ3NtXzA0XzExLmggZGVidWcuaCBzaWduYWwuaCBcCisJCSBtaXNkbi5oIGNoYW5fYWxsb2MuaCB0ZWxuZXRfaW50ZXJmYWNlLmggcGFnaW5nLmggXAorCQkgc3ViY2hhbl9kZW11eC5oIHRyYXVfZnJhbWUuaCBlMV9pbnB1dC5oIHRyYXVfbXV4LmggXAorCQkgaXBhY2Nlc3MuaCByczIzMi5oIG9wZW5ic2NkZWZpbmVzLmggcnRwX3Byb3h5LmggXAorCQkgYnNjX3JsbC5oIG1uY2MuaCB0cmFuc2FjdGlvbi5oIHVzc2QuaCBnc21fMDRfODAuaCBcCisJCSBzaWxlbnRfY2FsbC5oIG1nY3AuaCBtZWFzX3JlcC5oIHJlc3Rfb2N0ZXRzLmggXAorCQkgc3lzdGVtX2luZm9ybWF0aW9uLmggaGFuZG92ZXIuaCBtZ2NwX2ludGVybmFsLmgKKworb3BlbmJzY19IRUFERVJTID0gZ3NtXzA0XzA4LmggbWVhc19yZXAuaAorb3BlbmJzY2RpciA9ICQoaW5jbHVkZWRpcikvb3BlbmJzYwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvYWJpc19ubS5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvYWJpc19ubS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MzA3ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9hYmlzX25tLmgKQEAgLTAsMCArMSwxNzIgQEAKKy8qIEdTTSBOZXR3b3JrIE1hbmFnZW1lbnQgbWVzc2FnZXMgb24gdGhlIEEtYmlzIGludGVyZmFjZSAKKyAqIDNHUFAgVFMgMTIuMjEgdmVyc2lvbiA4LjAuMCBSZWxlYXNlIDE5OTkgLyBFVFNJIFRTIDEwMCA2MjMgVjguMC4wICovCisKKy8qIChDKSAyMDA4LTIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9OTV9ICisjZGVmaW5lIF9OTV9ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90bHYuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9wcm90b2NvbC9nc21fMTJfMjEuaD4KKworc3RydWN0IGNlbGxfZ2xvYmFsX2lkIHsKKwl1X2ludDE2X3QgbWNjOworCXVfaW50MTZfdCBtbmM7CisJdV9pbnQxNl90IGxhYzsKKwl1X2ludDE2X3QgY2k7Cit9OworCisvKiBUaGUgQkNDSCBpbmZvIGZyb20gYW4gaXAuYWNjZXNzIHRlc3QsIGluIGhvc3QgYnl0ZSBvcmRlcgorICogYW5kIGFscmVhZHkgcGFyc2VkLi4uICovCitzdHJ1Y3QgaXBhY19iY2NoX2luZm8geworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisKKwl1X2ludDE2X3QgaW5mb190eXBlOworCXVfaW50OF90IGZyZXFfcXVhbDsKKwl1X2ludDE2X3QgYXJmY247CisJdV9pbnQ4X3QgcnhfbGV2OworCXVfaW50OF90IHJ4X3F1YWw7CisJaW50MTZfdCBmcmVxX2VycjsKKwl1X2ludDE2X3QgZnJhbWVfb2Zmc2V0OworCXVfaW50MzJfdCBmcmFtZV9ucl9vZmZzZXQ7CisJdV9pbnQ4X3QgYnNpYzsKKwlzdHJ1Y3QgY2VsbF9nbG9iYWxfaWQgY2dpOworCXVfaW50OF90IGJhX2xpc3Rfc2kyWzE2XTsKKwl1X2ludDhfdCBiYV9saXN0X3NpMmJpc1sxNl07CisJdV9pbnQ4X3QgYmFfbGlzdF9zaTJ0ZXJbMTZdOworCXVfaW50OF90IGNhX2xpc3Rfc2kxWzE2XTsKK307CisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgdGx2X2RlZmluaXRpb24gbm1fYXR0X3RsdmRlZjsKKworLyogUFVCTElDICovCisKK3N0cnVjdCBtc2diOworCitzdHJ1Y3QgYWJpc19ubV9jZmcgeworCS8qIGNhbGxiYWNrIGZvciB1bmlkaXJlY3Rpb25hbCByZXBvcnRzICovCisJaW50ICgqcmVwb3J0X2NiKShzdHJ1Y3QgbXNnYiAqLAorCQkJIHN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKik7CisJLyogY2FsbGJhY2sgZm9yIHNvZnR3YXJlIGFjdGl2YXRlIHJlcXVlc3RzIGZyb20gQlRTICovCisJaW50ICgqc3dfYWN0X3JlcSkoc3RydWN0IG1zZ2IgKik7Cit9OworCitleHRlcm4gaW50IGFiaXNfbm1fcmN2bXNnKHN0cnVjdCBtc2diICptc2cpOworCitpbnQgYWJpc19ubV90bHZfcGFyc2Uoc3RydWN0IHRsdl9wYXJzZWQgKnRwLCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBjb25zdCB1X2ludDhfdCAqYnVmLCBpbnQgbGVuKTsKK2ludCBhYmlzX25tX3J4KHN0cnVjdCBtc2diICptc2cpOworaW50IGFiaXNfbm1fb3BzdGFydChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBvYmpfY2xhc3MsIHVfaW50OF90IGkwLCB1X2ludDhfdCBpMSwgdV9pbnQ4X3QgaTIpOworaW50IGFiaXNfbm1fY2hnX2FkbV9zdGF0ZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBvYmpfY2xhc3MsIHVfaW50OF90IGkwLAorCQkJICB1X2ludDhfdCBpMSwgdV9pbnQ4X3QgaTIsIGVudW0gYWJpc19ubV9hZG1fc3RhdGUgYWRtX3N0YXRlKTsKK2ludCBhYmlzX25tX2VzdGFibGlzaF90ZWkoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgdHJ4X25yLAorCQkJICB1X2ludDhfdCBlMV9wb3J0LCB1X2ludDhfdCBlMV90aW1lc2xvdCwgdV9pbnQ4X3QgZTFfc3Vic2xvdCwKKwkJCSAgdV9pbnQ4X3QgdGVpKTsKK2ludCBhYmlzX25tX2Nvbm5fdGVycl9zaWduKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LAorCQkJICAgdV9pbnQ4X3QgZTFfcG9ydCwgdV9pbnQ4X3QgZTFfdGltZXNsb3QsIHVfaW50OF90IGUxX3N1YnNsb3QpOworaW50IGFiaXNfbm1fY29ubl90ZXJyX3RyYWYoc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cywKKwkJCSAgIHVfaW50OF90IGUxX3BvcnQsIHVfaW50OF90IGUxX3RpbWVzbG90LAorCQkJICAgdV9pbnQ4X3QgZTFfc3Vic2xvdCk7CitpbnQgYWJpc19ubV9zZXRfYnRzX2F0dHIoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgKmF0dHIsIGludCBhdHRyX2xlbik7CitpbnQgYWJpc19ubV9zZXRfcmFkaW9fYXR0cihzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgdV9pbnQ4X3QgKmF0dHIsIGludCBhdHRyX2xlbik7CitpbnQgYWJpc19ubV9zZXRfY2hhbm5lbF9hdHRyKHN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMsIHVfaW50OF90IGNoYW5fY29tYik7CitpbnQgYWJpc19ubV9zd19hY3RfcmVxX2FjayhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBvYmpfY2xhc3MsIHVfaW50OF90IGkxLAorCQkJdV9pbnQ4X3QgaTIsIHVfaW50OF90IGkzLCBpbnQgbmFjaywgdV9pbnQ4X3QgKmF0dHIsIGludCBhdHRfbGVuKTsKK2ludCBhYmlzX25tX3Jhd19tc2coc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IGxlbiwgdV9pbnQ4X3QgKm1zZyk7CitpbnQgYWJpc19ubV9ldmVudF9yZXBvcnRzKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBvbik7CitpbnQgYWJpc19ubV9yZXNldF9yZXNvdXJjZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK2ludCBhYmlzX25tX3NvZnR3YXJlX2xvYWQoc3RydWN0IGdzbV9idHMgKmJ0cywgY29uc3QgY2hhciAqZm5hbWUsCisJCQkgIHVfaW50OF90IHdpbl9zaXplLCBpbnQgZm9yY2VkLAorCQkJICBnc21fY2JmbiAqY2Jmbiwgdm9pZCAqY2JfZGF0YSk7CitpbnQgYWJpc19ubV9zb2Z0d2FyZV9sb2FkX3N0YXR1cyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK2ludCBhYmlzX25tX3NvZnR3YXJlX2FjdGl2YXRlKHN0cnVjdCBnc21fYnRzICpidHMsIGNvbnN0IGNoYXIgKmZuYW1lLAorCQkJICAgICAgZ3NtX2NiZm4gKmNiZm4sIHZvaWQgKmNiX2RhdGEpOworCitpbnQgYWJpc19ubV9jb25uX21kcm9wX2xpbmsoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgZTFfcG9ydDAsIHVfaW50OF90IHRzMCwKKwkJCSAgICB1X2ludDhfdCBlMV9wb3J0MSwgdV9pbnQ4X3QgdHMxKTsKKworaW50IGFiaXNfbm1fcGVyZm9ybV90ZXN0KHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IG9ial9jbGFzcywKKwkJCSB1X2ludDhfdCBidHNfbnIsIHVfaW50OF90IHRyeF9uciwgdV9pbnQ4X3QgdHNfbnIsCisJCQkgdV9pbnQ4X3QgdGVzdF9uciwgdV9pbnQ4X3QgYXV0b25fcmVwb3J0LAorCQkJIHVfaW50OF90ICpwaHlzX2NvbmZpZywgdV9pbnQxNl90IHBoeXNfY29uZmlnX2xlbik7CisKK2ludCBhYmlzX25tX2NoY29tYjRwY2hhbihlbnVtIGdzbV9waHlzX2NoYW5fY29uZmlnIHBjaGFuKTsKKworLyogU2llbWVucyAvIEJTLTExIHNwZWNpZmljICovCitpbnQgYWJpc19ubV9iczExX3Jlc2V0X3Jlc291cmNlKHN0cnVjdCBnc21fYnRzICpidHMpOworaW50IGFiaXNfbm1fYnMxMV9kYl90cmFuc21pc3Npb24oc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IGJlZ2luKTsKK2ludCBhYmlzX25tX2JzMTFfY3JlYXRlX29iamVjdChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBlbnVtIGFiaXNfYnMxMV9vYmp0eXBlIHR5cGUsCisJCQkgIHVfaW50OF90IGlkeCwgdV9pbnQ4X3QgYXR0cl9sZW4sIGNvbnN0IHVfaW50OF90ICphdHRyKTsKK2ludCBhYmlzX25tX2JzMTFfY3JlYXRlX2VudmFCVFNFKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGlkeCk7CitpbnQgYWJpc19ubV9iczExX2NyZWF0ZV9icG9ydChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBpZHgpOworaW50IGFiaXNfbm1fYnMxMV9kZWxldGVfb2JqZWN0KHN0cnVjdCBnc21fYnRzICpidHMsCisJCQkJZW51bSBhYmlzX2JzMTFfb2JqdHlwZSB0eXBlLCB1X2ludDhfdCBpZHgpOworaW50IGFiaXNfbm1fYnMxMV9kZWxldGVfYnBvcnQoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgaWR4KTsKK2ludCBhYmlzX25tX2JzMTFfY29ubl9vbWxfdGVpKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGUxX3BvcnQsCisJCQkgIHVfaW50OF90IGUxX3RpbWVzbG90LCB1X2ludDhfdCBlMV9zdWJzbG90LCB1X2ludDhfdCB0ZWkpOworaW50IGFiaXNfbm1fYnMxMV9nZXRfb21sX3RlaV90cyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK2ludCBhYmlzX25tX2JzMTFfZ2V0X3Nlcm5vKHN0cnVjdCBnc21fYnRzICpidHMpOworaW50IGFiaXNfbm1fYnMxMV9zZXRfdHJ4X3Bvd2VyKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCB1X2ludDhfdCBsZXZlbCk7CitpbnQgYWJpc19ubV9iczExX2dldF90cnhfcG93ZXIoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpOworaW50IGFiaXNfbm1fYnMxMV9sb2dvbihzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBsZXZlbCwgY29uc3QgY2hhciAqbmFtZSwgaW50IG9uKTsKK2ludCBhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgb24pOworaW50IGFiaXNfbm1fYnMxMV9pbmZpZWxkX2xvZ29uKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBvbik7CitpbnQgYWJpc19ubV9iczExX3NldF90cngxX3B3KHN0cnVjdCBnc21fYnRzICpidHMsIGNvbnN0IGNoYXIgKnBhc3N3b3JkKTsKK2ludCBhYmlzX25tX2JzMTFfc2V0X3BsbF9sb2NrZWQoc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IGxvY2tlZCk7CitpbnQgYWJpc19ubV9iczExX2dldF9wbGxfbW9kZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK2ludCBhYmlzX25tX2JzMTFfc2V0X3BsbChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgdmFsdWUpOworaW50IGFiaXNfbm1fYnMxMV9nZXRfY2NsayhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK2ludCBhYmlzX25tX2JzMTFfZ2V0X3N0YXRlKHN0cnVjdCBnc21fYnRzICpidHMpOworaW50IGFiaXNfbm1fYnMxMV9sb2FkX3N3bChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBjb25zdCBjaGFyICpmbmFtZSwKKwkJCSAgdV9pbnQ4X3Qgd2luX3NpemUsIGludCBmb3JjZWQsIGdzbV9jYmZuICpjYmZuKTsKK2ludCBhYmlzX25tX2JzMTFfc2V0X2V4dF90aW1lKHN0cnVjdCBnc21fYnRzICpidHMpOworaW50IGFiaXNfbm1fYnMxMV9zZXRfYnBvcnRfbGluZV9jZmcoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgYnBvcnQsIGVudW0gYWJpc19iczExX2xpbmVfY2ZnIGxpbmVfY2ZnKTsKK2ludCBhYmlzX25tX2JzMTFfYnNjX2Rpc2Nvbm5lY3Qoc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IHJlY29ubmVjdCk7CitpbnQgYWJpc19ubV9iczExX3Jlc3RhcnQoc3RydWN0IGdzbV9idHMgKmJ0cyk7CisKKy8qIGlwLmFjY2VzcyBuYW5vQlRTIHNwZWNpZmljIGNvbW1hbmRzICovCitpbnQgYWJpc19ubV9pcGFjY2Vzc19tc2coc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgbXNnX3R5cGUsCisJCQkgdV9pbnQ4X3Qgb2JqX2NsYXNzLCB1X2ludDhfdCBidHNfbnIsCisJCQkgdV9pbnQ4X3QgdHJ4X25yLCB1X2ludDhfdCB0c19uciwKKwkJCSB1X2ludDhfdCAqYXR0ciwgaW50IGF0dHJfbGVuKTsKK2ludCBhYmlzX25tX2lwYWNjZXNzX3NldF9udmF0dHIoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIHVfaW50OF90ICphdHRyLAorCQkJCWludCBhdHRyX2xlbik7CitpbnQgYWJpc19ubV9pcGFjY2Vzc19yZXN0YXJ0KHN0cnVjdCBnc21fYnRzICpidHMpOworaW50IGFiaXNfbm1faXBhY2Nlc3Nfc2V0X2F0dHIoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3Qgb2JqX2NsYXNzLAorCQkJCXVfaW50OF90IGJ0c19uciwgdV9pbnQ4X3QgdHJ4X25yLCB1X2ludDhfdCB0c19uciwKKwkJCQl1X2ludDhfdCAqYXR0ciwgdV9pbnQ4X3QgYXR0cl9sZW4pOworaW50IGFiaXNfbm1faXBhY2Nlc3NfcnNsX2Nvbm5lY3Qoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIAorCQkJCSB1X2ludDMyX3QgaXAsIHVfaW50MTZfdCBwb3J0LCB1X2ludDhfdCBzdHJlYW0pOwordm9pZCBhYmlzX25tX2lwYWNjZXNzX2NnaSh1X2ludDhfdCAqYnVmLCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK2ludCBpcGFjX3BhcnNlX2JjY2hfaW5mbyhzdHJ1Y3QgaXBhY19iY2NoX2luZm8gKmJpbmYsIHVfaW50OF90ICpidWYpOworY29uc3QgY2hhciAqaXBhY2NfdGVzdHJlc19uYW1lKHVfaW50OF90IHJlcyk7CisKKy8qIEZ1bmN0aW9ucyBjYWxsaW5nIGludG8gb3RoZXIgY29kZSBwYXJ0cyAqLworZW51bSBubV9ldnQgeworCUVWVF9TVEFURUNIR19PUEVSLAorCUVWVF9TVEFURUNIR19BRE0sCit9OworaW50IG5tX3N0YXRlX2V2ZW50KGVudW0gbm1fZXZ0IGV2dCwgdV9pbnQ4X3Qgb2JqX2NsYXNzLCB2b2lkICpvYmosCisJCSAgIHN0cnVjdCBnc21fbm1fc3RhdGUgKm9sZF9zdGF0ZSwgc3RydWN0IGdzbV9ubV9zdGF0ZSAqbmV3X3N0YXRlKTsgCisKK2NvbnN0IGNoYXIgKm5tX29wc3RhdGVfbmFtZSh1X2ludDhfdCBvcyk7Citjb25zdCBjaGFyICpubV9hdmFpbF9uYW1lKHVfaW50OF90IGF2YWlsKTsKK2ludCBubV9pc19ydW5uaW5nKHN0cnVjdCBnc21fbm1fc3RhdGUgKnMpOworI2VuZGlmIC8qIF9OTV9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9hYmlzX3JzbC5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvYWJpc19yc2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjgwMTg0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvYWJpc19yc2wuaApAQCAtMCwwICsxLDg3IEBACisvKiBHU00gUmFkaW8gU2lnbmFsbGluZyBMaW5rIG1lc3NhZ2VzIG9uIHRoZSBBLWJpcyBpbnRlcmZhY2UgCisgKiAzR1BQIFRTIDA4LjU4IHZlcnNpb24gOC42LjAgUmVsZWFzZSAxOTk5IC8gRVRTSSBUUyAxMDAgNTk2IFY4LjYuMCAqLworCisvKiAoQykgMjAwOCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpZm5kZWYgX1JTTF9ICisjZGVmaW5lIF9SU0xfSAorCisjaW5jbHVkZSA8b3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA4XzU4Lmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisKK2ludCByc2xfYmNjaF9pbmZvKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCB1X2ludDhfdCB0eXBlLAorCQkgIGNvbnN0IHVfaW50OF90ICpkYXRhLCBpbnQgbGVuKTsKK2ludCByc2xfc2FjY2hfZmlsbGluZyhzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgdV9pbnQ4X3QgdHlwZSwgCisJCSAgICAgIGNvbnN0IHVfaW50OF90ICpkYXRhLCBpbnQgbGVuKTsKK2ludCByc2xfY2hhbl9hY3RpdmF0ZShzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgdV9pbnQ4X3QgY2hhbl9uciwKKwkJICAgICAgdV9pbnQ4X3QgYWN0X3R5cGUsCisJCSAgICAgIHN0cnVjdCByc2xfaWVfY2hhbl9tb2RlICpjaGFuX21vZGUsCisJCSAgICAgIHN0cnVjdCByc2xfaWVfY2hhbl9pZGVudCAqY2hhbl9pZGVudCwKKwkJICAgICAgdV9pbnQ4X3QgYnNfcG93ZXIsIHVfaW50OF90IG1zX3Bvd2VyLAorCQkgICAgICB1X2ludDhfdCB0YSk7CitpbnQgcnNsX2NoYW5fYWN0aXZhdGVfbGNoYW4oc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGFjdF90eXBlLCAKKwkJCSAgICB1X2ludDhfdCB0YSwgdV9pbnQ4X3QgaG9fcmVmKTsKK2ludCByc2xfY2hhbl9tb2RlX21vZGlmeV9yZXEoc3RydWN0IGdzbV9sY2hhbiAqdHMpOworaW50IHJzbF9lbmNyeXB0aW9uX2NtZChzdHJ1Y3QgbXNnYiAqbXNnKTsKK2ludCByc2xfcGFnaW5nX2NtZChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBwYWdpbmdfZ3JvdXAsIHVfaW50OF90IGxlbiwKKwkJICAgdV9pbnQ4X3QgKm1zX2lkZW50LCB1X2ludDhfdCBjaGFuX25lZWRlZCk7CitpbnQgcnNsX3BhZ2luZ19jbWRfc3Vic2NyKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGNoYW5fbmVlZGVkLAorCQkJIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKTsKK2ludCByc2xfaW1tX2Fzc2lnbl9jbWQoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgbGVuLCB1X2ludDhfdCAqdmFsKTsKKworaW50IHJzbF9kYXRhX3JlcXVlc3Qoc3RydWN0IG1zZ2IgKm1zZywgdV9pbnQ4X3QgbGlua19pZCk7CitpbnQgcnNsX2VzdGFibGlzaF9yZXF1ZXN0KHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBsaW5rX2lkKTsKK2ludCByc2xfcmVsYXNlX3JlcXVlc3Qoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGxpbmtfaWQpOworCisvKiBTaWVtZW5zIHZlbmRvci1zcGVjaWZpYyBSU0wgZXh0ZW5zaW9ucyAqLworaW50IHJzbF9zaWVtZW5zX21ycGNpKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCBzdHJ1Y3QgcnNsX21ycGNpICptcnBjaSk7CisKKy8qIGlwLmFjY2VzcyBzcGVjZmljIFJTTCBleHRlbnNpb25zICovCitpbnQgcnNsX2lwYWNjX2NyY3goc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pOworaW50IHJzbF9pcGFjY19tZGN4KHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDMyX3QgaXAsCisJCSAgIHVfaW50MTZfdCBwb3J0LCB1X2ludDhfdCBydHBfcGF5bG9hZDIpOworaW50IHJzbF9pcGFjY19tZGN4X3RvX3J0cHNvY2soc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pOworaW50IHJzbF9pcGFjY19wZGNoX2FjdGl2YXRlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKTsKKworaW50IGFiaXNfcnNsX3Jjdm1zZyhzdHJ1Y3QgbXNnYiAqbXNnKTsKKwordW5zaWduZWQgaW50IGdldF9wYWdpbmdfZ3JvdXAodV9pbnQ2NF90IGltc2ksIHVuc2lnbmVkIGludCBic19jY19jaGFucywKKwkJCSAgICAgIGludCBuX3BhZ19ibG9ja3MpOwordW5zaWduZWQgaW50IG5fcGFnX2Jsb2NrcyhpbnQgYnNfY2NjaF9zZGNjaF9jb21iLCB1bnNpZ25lZCBpbnQgYnNfYWdfYmxrc19yZXMpOwordV9pbnQ2NF90IHN0cl90b19pbXNpKGNvbnN0IGNoYXIgKmltc2lfc3RyKTsKK3VfaW50OF90IGxjaGFuMmNoYW5fbnIoY29uc3Qgc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pOworaW50IHJzbF9yZWxlYXNlX3JlcXVlc3Qoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGxpbmtfaWQpOworCisvKiB0byBiZSBwcm92aWRlZCBieSBleHRlcm5hbCBjb2RlICovCitpbnQgYWJpc19yc2xfc2VuZG1zZyhzdHJ1Y3QgbXNnYiAqbXNnKTsKK2ludCByc2xfZGVhY3Rfc2FjY2goc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pOworaW50IHJzbF9jaGFuX3JlbGVhc2Uoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pOworCisvKiBCQ0NIIHJlbGF0ZWQgY29kZSAqLworaW50IHJzbF9jY2NoX2NvbmZfdG9fYnNfY2NfY2hhbnMoaW50IGNjY2hfY29uZik7CitpbnQgcnNsX2NjY2hfY29uZl90b19ic19jY2NoX3NkY2NoX2NvbWIoaW50IGNjY2hfY29uZik7CitpbnQgcnNsX251bWJlcl9vZl9wYWdpbmdfc3ViY2hhbm5lbHMoc3RydWN0IGdzbV9idHMgKmJ0cyk7CisKK2ludCByc2xfY2hhbl9ic19wb3dlcl9jdHJsKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1bnNpZ25lZCBpbnQgZnBjLCBpbnQgZGIpOworaW50IHJzbF9jaGFuX21zX3Bvd2VyX2N0cmwoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVuc2lnbmVkIGludCBmcGMsIGludCBkYm0pOworCisjZW5kaWYgLyogUlNMX01UX0ggKi8KKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvYnNjX3JsbC5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvYnNjX3JsbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyODk4ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9ic2NfcmxsLmgKQEAgLTAsMCArMSwxOSBAQAorI2lmbmRlZiBfQlNDX1JMTF9ICisjZGVmaW5lIF9CU0NfUkxMX0gKKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKworZW51bSBic2Nfcmxscl9pbmQgeworCUJTQ19STExSX0lORF9FU1RfQ09ORiwKKwlCU0NfUkxMUl9JTkRfUkVMX0lORCwKKwlCU0NfUkxMUl9JTkRfRVJSX0lORCwKKwlCU0NfUkxMUl9JTkRfVElNRU9VVCwKK307CisKK2ludCBybGxfZXN0YWJsaXNoKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBsaW5rX2lkLAorCQkgIHZvaWQgKCpjYikoc3RydWN0IGdzbV9sY2hhbiAqLCB1X2ludDhfdCwgdm9pZCAqLAorCQkJICAgICBlbnVtIGJzY19ybGxyX2luZCksCisJCSAgdm9pZCAqZGF0YSk7Cit2b2lkIHJsbF9pbmRpY2F0aW9uKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBsaW5rX2lkLCB1X2ludDhfdCB0eXBlKTsKKworI2VuZGlmIC8qIF9CU0NfUkxMX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2NoYW5fYWxsb2MuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2NoYW5fYWxsb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTY0ZTllCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvY2hhbl9hbGxvYy5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qIE1hbmFnZW1lbnQgZnVuY3Rpb25zIHRvIGFsbG9jYXRlL3JlbGVhc2Ugc3RydWN0IGdzbV9sY2hhbiAqLworLyogKEMpIDIwMDggYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworI2lmbmRlZiBfQ0hBTl9BTExPQ19ICisjZGVmaW5lIF9DSEFOX0FMTE9DX0gKKworI2luY2x1ZGUgImdzbV9zdWJzY3JpYmVyLmgiCisKKy8qIFNwZWNpYWwgYWxsb2NhdG9yIGZvciBDMCBvZiBCVFMgKi8KK3N0cnVjdCBnc21fYnRzX3RyeF90cyAqdHNfYzBfYWxsb2Moc3RydWN0IGdzbV9idHMgKmJ0cywKKwkJCQkgICBlbnVtIGdzbV9waHlzX2NoYW5fY29uZmlnIHBjaGFuKTsKKworLyogUmVndWxhciBwaHlzaWNhbCBjaGFubmVsIGFsbG9jYXRvciAqLworc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0c19hbGxvYyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLAorCQkJCWVudW0gZ3NtX3BoeXNfY2hhbl9jb25maWcgcGNoYW4pOworCisvKiBSZWd1bGFyIHBoeXNpY2FsIGNoYW5uZWwgKFRTKSAqLwordm9pZCB0c19mcmVlKHN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMpOworCisvKiBGaW5kIGFuIGFsbG9jYXRlZCBjaGFubmVsICovCitzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbl9maW5kKHN0cnVjdCBnc21fYnRzICpidHMsIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKTsKKworLyogRmluZCBhbiBhbGxvY2F0ZWQgY2hhbm5lbCBmb3IgYSBzcGVjaWZpZWQgc3Vic2NyaWJlciAqLworc3RydWN0IGdzbV9sY2hhbiAqbGNoYW5fZm9yX3N1YnNjcihzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcik7CisKKy8qIEFsbG9jYXRlIGEgbG9naWNhbCBjaGFubmVsIChTRENDSCwgVENILCAuLi4pICovCitzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbl9hbGxvYyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBlbnVtIGdzbV9jaGFuX3QgdHlwZSk7CisKKy8qIEZyZWUgYSBsb2dpY2FsIGNoYW5uZWwgKFNEQ0NILCBUQ0gsIC4uLikgKi8KK3ZvaWQgbGNoYW5fZnJlZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbik7CisKKy8qIENvbnNpZGVyIHJlbGVhc2luZyB0aGUgY2hhbm5lbCAqLworaW50IGxjaGFuX2F1dG9fcmVsZWFzZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbik7CisKK3N0cnVjdCBsb2FkX2NvdW50ZXIgeworCXVuc2lnbmVkIGludCB0b3RhbDsKKwl1bnNpZ25lZCBpbnQgdXNlZDsKK307CisKK3N0cnVjdCBwY2hhbl9sb2FkIHsKKwlzdHJ1Y3QgbG9hZF9jb3VudGVyIHBjaGFuW0dTTV9QQ0hBTl9VTktOT1dOXTsKK307CisKK3ZvaWQgYnRzX2NoYW5fbG9hZChzdHJ1Y3QgcGNoYW5fbG9hZCAqY2wsIGNvbnN0IHN0cnVjdCBnc21fYnRzICpidHMpOwordm9pZCBuZXR3b3JrX2NoYW5fbG9hZChzdHJ1Y3QgcGNoYW5fbG9hZCAqcGwsIHN0cnVjdCBnc21fbmV0d29yayAqbmV0KTsKKworaW50IHRyeF9pc191c2FibGUoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpOworCisjZW5kaWYgLyogX0NIQU5fQUxMT0NfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZGIuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2RiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY2NjRkYgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2RiLmgKQEAgLTAsMCArMSw3MSBAQAorLyogKEMpIDIwMDggYnkgSmFuIEx1ZWJiZSA8amx1ZWJiZUBkZWJpYW4ub3JnPgorICogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpZm5kZWYgX0RCX0gKKyNkZWZpbmUgX0RCX0gKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorCisvKiBvbmUgdGltZSBpbml0aWFsaXNhdGlvbiAqLworaW50IGRiX2luaXQoY29uc3QgY2hhciAqbmFtZSk7CitpbnQgZGJfcHJlcGFyZSgpOworaW50IGRiX2ZpbmkoKTsKKworLyogc3Vic2NyaWJlciBtYW5hZ2VtZW50ICovCitzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIqIGRiX2NyZWF0ZV9zdWJzY3JpYmVyKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LAorCQkJCQkgICAgY2hhciAqaW1zaSk7CitzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIqIGRiX2dldF9zdWJzY3JpYmVyKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LAorCQkJCQkgZW51bSBnc21fc3Vic2NyaWJlcl9maWVsZCBmaWVsZCwKKwkJCQkJIGNvbnN0IGNoYXIgKnN1YnNjcik7CitpbnQgZGJfc3luY19zdWJzY3JpYmVyKHN0cnVjdCBnc21fc3Vic2NyaWJlciogc3Vic2NyaWJlcik7CitpbnQgZGJfc3Vic2NyaWJlcl9hbGxvY190bXNpKHN0cnVjdCBnc21fc3Vic2NyaWJlciogc3Vic2NyaWJlcik7CitpbnQgZGJfc3Vic2NyaWJlcl9hbGxvY19leHRlbihzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIqIHN1YnNjcmliZXIpOworaW50IGRiX3N1YnNjcmliZXJfYWxsb2NfdG9rZW4oc3RydWN0IGdzbV9zdWJzY3JpYmVyKiBzdWJzY3JpYmVyLCB1X2ludDMyX3QqIHRva2VuKTsKK2ludCBkYl9zdWJzY3JpYmVyX2Fzc29jX2ltZWkoc3RydWN0IGdzbV9zdWJzY3JpYmVyKiBzdWJzY3JpYmVyLCBjaGFyICppbWVpKTsKK2ludCBkYl9zeW5jX2VxdWlwbWVudChzdHJ1Y3QgZ3NtX2VxdWlwbWVudCAqZXF1aXApOworCisvKiBhdXRoIGluZm8gKi8KK2ludCBnZXRfYXV0aGluZm9fYnlfc3Vic2NyKHN0cnVjdCBnc21fYXV0aF9pbmZvICphaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKTsKK2ludCBzZXRfYXV0aGluZm9fZm9yX3N1YnNjcihzdHJ1Y3QgZ3NtX2F1dGhfaW5mbyAqYWluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpOworaW50IGdldF9hdXRodHVwbGVfYnlfc3Vic2NyKHN0cnVjdCBnc21fYXV0aF90dXBsZSAqYXR1cGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKTsKK2ludCBzZXRfYXV0aHR1cGxlX2Zvcl9zdWJzY3Ioc3RydWN0IGdzbV9hdXRoX3R1cGxlICphdHVwbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKTsKKworLyogU01TIHN0b3JlLWFuZC1mb3J3YXJkICovCitpbnQgZGJfc21zX3N0b3JlKHN0cnVjdCBnc21fc21zICpzbXMpOworc3RydWN0IGdzbV9zbXMgKmRiX3Ntc19nZXRfdW5zZW50KHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCBpbnQgbWluX2lkKTsKK3N0cnVjdCBnc21fc21zICpkYl9zbXNfZ2V0X3Vuc2VudF9ieV9zdWJzY3Ioc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIGludCBtaW5fc3Vic2NyX2lkKTsKK3N0cnVjdCBnc21fc21zICpkYl9zbXNfZ2V0X3Vuc2VudF9mb3Jfc3Vic2NyKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKTsKK2ludCBkYl9zbXNfbWFya19zZW50KHN0cnVjdCBnc21fc21zICpzbXMpOworCisvKiBBUERVIGJsb2Igc3RvcmFnZSAqLworaW50IGRiX2FwZHVfYmxvYl9zdG9yZShzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciwgCisJCQl1X2ludDhfdCBhcGR1X2lkX2ZsYWdzLCB1X2ludDhfdCBsZW4sCisJCQl1X2ludDhfdCAqYXBkdSk7CisKKy8qIFN0YXRpc3RpY3MgY291bnRlciBzdG9yYWdlICovCitpbnQgZGJfc3RvcmVfY291bnRlcihzdHJ1Y3QgY291bnRlciAqY3RyKTsKKworI2VuZGlmIC8qIF9EQl9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9kZWJ1Zy5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjY3YzYxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZGVidWcuaApAQCAtMCwwICsxLDEzMSBAQAorI2lmbmRlZiBfREVCVUdfSAorI2RlZmluZSBfREVCVUdfSAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKworI2RlZmluZSBERUJVRworCisvKiBEZWJ1ZyBBcmVhcyBvZiB0aGUgY29kZSAqLworZW51bSB7CisJRFJMTCwKKwlEQ0MsCisJRE1NLAorCURSUiwKKwlEUlNMLAorCUROTSwKKwlETU5DQywKKwlEU01TLAorCURQQUcsCisJRE1FQVMsCisJRE1JLAorCURNSUIsCisJRE1VWCwKKwlESU5QLAorCURTQ0NQLAorCURNU0MsCisJRE1HQ1AsCisJREhPLAorCUREQiwKKwlEUkVGLAorCURlYnVnX0xhc3RFbnRyeSwKK307CisKKyNpZmRlZiBERUJVRworI2RlZmluZSBERUJVR1Aoc3MsIGZtdCwgYXJncy4uLikgZGVidWdwKHNzLCBfX0ZJTEVfXywgX19MSU5FX18sIDAsIGZtdCwgIyMgYXJncykKKyNkZWZpbmUgREVCVUdQQyhzcywgZm10LCBhcmdzLi4uKSBkZWJ1Z3Aoc3MsIF9fRklMRV9fLCBfX0xJTkVfXywgMSwgZm10LCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgREVCVUdQKHhzcywgZm10LCBhcmdzLi4uKQorI2RlZmluZSBERUJVR1BDKHNzLCBmbXQsIGFyZ3MuLi4pCisjZW5kaWYKKworCisjZGVmaW5lIHN0YXRpY19hc3NlcnQoZXhwLCBuYW1lKSB0eXBlZGVmIGludCBkdW1teSMjbmFtZSBbKGV4cCkgPyAxIDogLTFdOworCitjaGFyICpoZXhkdW1wKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbik7Cit2b2lkIGRlYnVncCh1bnNpZ25lZCBpbnQgc3Vic3lzLCBjaGFyICpmaWxlLCBpbnQgbGluZSwgaW50IGNvbnQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDUsIDYpKSk7CisKKy8qIG5ldyBsb2dnaW5nIGludGVyZmFjZSAqLworI2RlZmluZSBMT0dQKHNzLCBsZXZlbCwgZm10LCBhcmdzLi4uKSBkZWJ1Z3AyKHNzLCBsZXZlbCwgX19GSUxFX18sIF9fTElORV9fLCAwLCBmbXQsICMjYXJncykKKyNkZWZpbmUgTE9HUEMoc3MsIGxldmVsLCBmbXQsIGFyZ3MuLi4pIGRlYnVncDIoc3MsIGxldmVsLCBfX0ZJTEVfXywgX19MSU5FX18sIDEsIGZtdCwgIyNhcmdzKQorCisvKiBkaWZmZXJlbnQgbGV2ZWxzICovCisjZGVmaW5lIExPR0xfREVCVUcJMQkvKiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgTE9HTF9JTkZPCTMKKyNkZWZpbmUgTE9HTF9OT1RJQ0UJNQkvKiBhYm5vcm1hbC91bmV4cGVjdGVkIGNvbmRpdGlvbiAqLworI2RlZmluZSBMT0dMX0VSUk9SCTcJLyogZXJyb3IgY29uZGl0aW9uLCByZXF1aXJlcyB1c2VyIGFjdGlvbiAqLworI2RlZmluZSBMT0dMX0ZBVEFMCTgJLyogZmF0YWwsIHByb2dyYW0gYWJvcnRlZCAqLworCisvKiBjb250ZXh0ICovCisjZGVmaW5lIEJTQ19DVFhfTENIQU4JMAorI2RlZmluZSBCU0NfQ1RYX1NVQlNDUgkxCisjZGVmaW5lIEJTQ19DVFhfQlRTCTIKKyNkZWZpbmUgQlNDX0NUWF9TQ0NQCTMKKworLyogdGFyZ2V0ICovCisKK2VudW0geworCURFQlVHX0ZJTFRFUl9JTVNJID0gMSA8PCAwLAorCURFQlVHX0ZJTFRFUl9BTEwgPSAxIDw8IDEsCit9OworCitzdHJ1Y3QgZGVidWdfY2F0ZWdvcnkgeworCWludCBlbmFibGVkOworCWludCBsb2dsZXZlbDsKK307CisKK3N0cnVjdCBkZWJ1Z190YXJnZXQgeworCWludCBmaWx0ZXJfbWFwOworCWNoYXIgKmltc2lfZmlsdGVyOworCisKKwlzdHJ1Y3QgZGVidWdfY2F0ZWdvcnkgY2F0ZWdvcmllc1tEZWJ1Z19MYXN0RW50cnldOworCWludCB1c2VfY29sb3I7CisJaW50IHByaW50X3RpbWVzdGFtcDsKKwlpbnQgbG9nbGV2ZWw7CisKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlGSUxFICpvdXQ7CisJCX0gdGd0X3N0ZG91dDsKKworCQlzdHJ1Y3QgeworCQkJaW50IHByaW9yaXR5OworCQl9IHRndF9zeXNsb2c7CisKKwkJc3RydWN0IHsKKwkJCXZvaWQgKnZ0eTsKKwkJfSB0Z3RfdnR5OworCX07CisKKyAgICAgICAgdm9pZCAoKm91dHB1dCkgKHN0cnVjdCBkZWJ1Z190YXJnZXQgKnRhcmdldCwgY29uc3QgY2hhciAqc3RyaW5nKTsKKworICAgICAgICBzdHJ1Y3QgbGxpc3RfaGVhZCBlbnRyeTsKK307CisKKy8qIHVzZSB0aGUgYWJvdmUgbWFjcm9zICovCit2b2lkIGRlYnVncDIodW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IGxldmVsLCBjaGFyICpmaWxlLCBpbnQgbGluZSwgaW50IGNvbnQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDYsIDcpKSk7Cit2b2lkIGRlYnVnX2luaXQodm9pZCk7CisKKy8qIGNvbnRleHQgbWFuYWdlbWVudCAqLwordm9pZCBkZWJ1Z19yZXNldF9jb250ZXh0KHZvaWQpOwordm9pZCBkZWJ1Z19zZXRfY29udGV4dChpbnQgY3R4LCB2b2lkICp2YWx1ZSk7CisKKy8qIGZpbHRlciBvbiB0aGUgdGFyZ2V0cyAqLwordm9pZCBkZWJ1Z19zZXRfaW1zaV9maWx0ZXIoc3RydWN0IGRlYnVnX3RhcmdldCAqdGFyZ2V0LCBjb25zdCBjaGFyICppbXNpKTsKK3ZvaWQgZGVidWdfc2V0X2FsbF9maWx0ZXIoc3RydWN0IGRlYnVnX3RhcmdldCAqdGFyZ2V0LCBpbnQpOwordm9pZCBkZWJ1Z19zZXRfdXNlX2NvbG9yKHN0cnVjdCBkZWJ1Z190YXJnZXQgKnRhcmdldCwgaW50KTsKK3ZvaWQgZGVidWdfc2V0X3ByaW50X3RpbWVzdGFtcChzdHJ1Y3QgZGVidWdfdGFyZ2V0ICp0YXJnZXQsIGludCk7Cit2b2lkIGRlYnVnX3NldF9sb2dfbGV2ZWwoc3RydWN0IGRlYnVnX3RhcmdldCAqdGFyZ2V0LCBpbnQgbG9nX2xldmVsKTsKK3ZvaWQgZGVidWdfcGFyc2VfY2F0ZWdvcnlfbWFzayhzdHJ1Y3QgZGVidWdfdGFyZ2V0ICp0YXJnZXQsIGNvbnN0IGNoYXIqIG1hc2spOworaW50IGRlYnVnX3BhcnNlX2xldmVsKGNvbnN0IGNoYXIgKmx2bCk7CitpbnQgZGVidWdfcGFyc2VfY2F0ZWdvcnkoY29uc3QgY2hhciAqY2F0ZWdvcnkpOwordm9pZCBkZWJ1Z19zZXRfY2F0ZWdvcnlfZmlsdGVyKHN0cnVjdCBkZWJ1Z190YXJnZXQgKnRhcmdldCwgaW50IGNhdGVnb3J5LCBpbnQgZW5hYmxlLCBpbnQgbGV2ZWwpOworCisKKy8qIG1hbmFnZW1lbnQgb2YgdGhlIHRhcmdldHMgKi8KK3N0cnVjdCBkZWJ1Z190YXJnZXQgKmRlYnVnX3RhcmdldF9jcmVhdGUodm9pZCk7CitzdHJ1Y3QgZGVidWdfdGFyZ2V0ICpkZWJ1Z190YXJnZXRfY3JlYXRlX3N0ZGVycih2b2lkKTsKK3ZvaWQgZGVidWdfYWRkX3RhcmdldChzdHJ1Y3QgZGVidWdfdGFyZ2V0ICp0YXJnZXQpOwordm9pZCBkZWJ1Z19kZWxfdGFyZ2V0KHN0cnVjdCBkZWJ1Z190YXJnZXQgKnRhcmdldCk7CisjZW5kaWYgLyogX0RFQlVHX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2UxX2lucHV0LmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9lMV9pbnB1dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhM2Q5ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9lMV9pbnB1dC5oCkBAIC0wLDAgKzEsMTY4IEBACisjaWZuZGVmIF9FMV9JTlBVVF9ICisjZGVmaW5lIF9FMV9JTlBVVF9ICisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc3ViY2hhbl9kZW11eC5oPgorCisjZGVmaW5lIE5VTV9FMV9UUyAgIDMyCisKK2VudW0gZTFpbnBfc2lnbl90eXBlIHsKKwlFMUlOUF9TSUdOX05PTkUsCisJRTFJTlBfU0lHTl9PTUwsCisJRTFJTlBfU0lHTl9SU0wsCit9OworY29uc3QgY2hhciAqZTFpbnBfc2lnbnR5cGVfbmFtZShlbnVtIGUxaW5wX3NpZ25fdHlwZSB0cCk7CisKK3N0cnVjdCBlMWlucF90czsKKworc3RydWN0IGUxaW5wX3NpZ25fbGluayB7CisJLyogbGlzdCBvZiBzaWduYWxsaW5nIGxpbmtzICovCisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKworCS8qIHRvIHdoaWNoIHRpbWVzbG90IGRvIHdlIGJlbG9uZz8gKi8KKwlzdHJ1Y3QgZTFpbnBfdHMgKnRzOworCisJZW51bSBlMWlucF9zaWduX3R5cGUgdHlwZTsKKworCS8qIHRyeCBmb3IgbXNnLT50cnggb2YgcmVjZWl2ZWQgbXNncyAqLwkKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKworCS8qIG1zZ2IgcXVldWUgb2YgdG8tYmUtdHJhbnNtaXR0ZWQgbXNncyAqLworCXN0cnVjdCBsbGlzdF9oZWFkIHR4X2xpc3Q7CisKKwkvKiBTQVBJIGFuZCBURUkgb24gdGhlIEUxIFRTICovCisJdV9pbnQ4X3Qgc2FwaTsKKwl1X2ludDhfdCB0ZWk7CisKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1X2ludDhfdCBjaGFubmVsOworCQl9IG1pc2RuOworCX0gZHJpdmVyOworfTsKKworZW51bSBlMWlucF90c190eXBlIHsKKwlFMUlOUF9UU19UWVBFX05PTkUsCisJRTFJTlBfVFNfVFlQRV9TSUdOLAorCUUxSU5QX1RTX1RZUEVfVFJBVSwKK307Citjb25zdCBjaGFyICplMWlucF90c3R5cGVfbmFtZShlbnVtIGUxaW5wX3RzX3R5cGUgdHApOworCisvKiBBIHRpbWVzbG90IGluIHRoZSBFMSBpbnRlcmZhY2UgKi8KK3N0cnVjdCBlMWlucF90cyB7CisJZW51bSBlMWlucF90c190eXBlIHR5cGU7CisJaW50IG51bTsKKworCS8qIHRvIHdoaWNoIGxpbmUgZG8gd2UgYmVsb25nID8gKi8KKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZTsKKworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCS8qIGxpc3Qgb2YgYWxsIHNpZ25hbGxpbmcgbGlua3Mgb24gdGhpcyBUUyAqLworCQkJc3RydWN0IGxsaXN0X2hlYWQgc2lnbl9saW5rczsKKwkJCS8qIHRpbWVyIHdoZW4gdG8gZGVxdWV1ZSBuZXh0IGZyYW1lICovCisJCQlzdHJ1Y3QgdGltZXJfbGlzdCB0eF90aW1lcjsKKwkJfSBzaWduOworCQlzdHJ1Y3QgeworCQkJLyogc3ViY2hhbm5lbCBkZW11eGVyIGZvciBmcmFtZXMgZnJvbSBFMSAqLworCQkJc3RydWN0IHN1YmNoX2RlbXV4IGRlbXV4OworCQkJLyogc3ViY2hhbm5lbCBtdXhlciBmb3IgZnJhbWVzIHRvIEUxICovCisJCQlzdHJ1Y3Qgc3ViY2hfbXV4IG11eDsKKwkJfSB0cmF1OworCX07CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJLyogbUlTRE4gZHJpdmVyIGhhcyBvbmUgZmQgZm9yIGVhY2ggdHMgKi8KKwkJCXN0cnVjdCBic2NfZmQgZmQ7CisJCX0gbWlzZG47CisJCXN0cnVjdCB7CisJCQkvKiBpcC5hY2Nlc3MgZHJpdmVyIGhhcyBvbmUgZmQgZm9yIGVhY2ggdHMgKi8KKwkJCXN0cnVjdCBic2NfZmQgZmQ7CisJCX0gaXBhY2Nlc3M7CisKKwl9IGRyaXZlcjsKK307CisKK3N0cnVjdCBlMWlucF9kcml2ZXIgeworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgKCp3YW50X3dyaXRlKShzdHJ1Y3QgZTFpbnBfdHMgKnRzKTsKK307CQorCitzdHJ1Y3QgZTFpbnBfbGluZSB7CisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKwl1bnNpZ25lZCBpbnQgbnVtOworCWNvbnN0IGNoYXIgKm5hbWU7CisKKwkvKiBhcnJheSBvZiB0aW1lc3Rsb3RzICovCisJc3RydWN0IGUxaW5wX3RzIHRzW05VTV9FMV9UU107CisKKwlzdHJ1Y3QgZTFpbnBfZHJpdmVyICpkcml2ZXI7CisJdm9pZCAqZHJpdmVyX2RhdGE7Cit9OworCisvKiByZWdpc3RlciBhIGRyaXZlciB3aXRoIHRoZSBFMSBjb3JlICovCitpbnQgZTFpbnBfZHJpdmVyX3JlZ2lzdGVyKHN0cnVjdCBlMWlucF9kcml2ZXIgKmRydik7CisKKy8qIHJlZ2lzdGVyIGEgbGluZSB3aXRoIHRoZSBFMSBjb3JlICovCitpbnQgZTFpbnBfbGluZV9yZWdpc3RlcihzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSk7CisKKy8qIGVuc3VyZSBhIGNlcnRhaW4gbGluZSBleGlzdHMsIHJldHVybiBwb2ludGVyIHRvIGl0ICovCitzdHJ1Y3QgZTFpbnBfbGluZSAqZTFpbnBfbGluZV9nZXRfY3JlYXRlKHVfaW50OF90IGUxX25yKTsKKworLyogZmluZCBhIHNpZ25fbGluayBmb3IgZ2l2ZW4gVEVJIGFuZCBTQVBJIGluIGEgVFMgKi8KK3N0cnVjdCBlMWlucF9zaWduX2xpbmsgKgorZTFpbnBfbG9va3VwX3NpZ25fbGluayhzdHJ1Y3QgZTFpbnBfdHMgKnRzLCB1X2ludDhfdCB0ZWksCisJCQl1X2ludDhfdCBzYXBpKTsKKworLyogY3JlYXRlIGEgbmV3IHNpZ25hbGxpbmcgbGluayBpbiBhIEUxIHRpbWVzbG90ICovCitzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICoKK2UxaW5wX3NpZ25fbGlua19jcmVhdGUoc3RydWN0IGUxaW5wX3RzICp0cywgZW51bSBlMWlucF9zaWduX3R5cGUgdHlwZSwKKwkJCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCB1X2ludDhfdCB0ZWksCisJCQl1X2ludDhfdCBzYXBpKTsKKworLyogY29uZmlndXJlIGFuZCBpbml0aWFsaXplIG9uZSBlMWlucF90cyAqLworaW50IGUxaW5wX3RzX2NvbmZpZyhzdHJ1Y3QgZTFpbnBfdHMgKnRzLCBzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSwKKwkJICAgIGVudW0gZTFpbnBfdHNfdHlwZSB0eXBlKTsKKworLyogQ2FsbCBmcm9tIHRoZSBTdGFjazogY29uZmlndXJhdGlvbiBvZiB0aGlzIFRTIGhhcyBjaGFuZ2VkICovCitpbnQgZTFpbnBfdXBkYXRlX3RzKHN0cnVjdCBlMWlucF90cyAqdHMpOworCisvKiBSZWNlaXZlIGEgcGFja2V0IGZyb20gdGhlIEUxIGRyaXZlciAqLworaW50IGUxaW5wX3J4X3RzKHN0cnVjdCBlMWlucF90cyAqdHMsIHN0cnVjdCBtc2diICptc2csCisJCXVfaW50OF90IHRlaSwgdV9pbnQ4X3Qgc2FwaSk7CisKKy8qIGNhbGxlZCBieSBkcml2ZXIgaWYgaXQgd2FudHMgdG8gdHJhbnNtaXQgb24gYSBnaXZlbiBUUyAqLworc3RydWN0IG1zZ2IgKmUxaW5wX3R4X3RzKHN0cnVjdCBlMWlucF90cyAqZTFpX3RzLAorCQkJIHN0cnVjdCBlMWlucF9zaWduX2xpbmsgKipzaWduX2xpbmspOworCisvKiBjYWxsZWQgYnkgZHJpdmVyIGluIGNhc2Ugc29tZSBraW5kIG9mIGxpbmsgc3RhdGUgZXZlbnQgKi8KK2ludCBlMWlucF9ldmVudChzdHJ1Y3QgZTFpbnBfdHMgKnRzLCBpbnQgZXZ0LCB1X2ludDhfdCB0ZWksIHVfaW50OF90IHNhcGkpOworCisvKiBXcml0ZSBMQVBEIGZyYW1lcyB0byB0aGUgZmQuICovCit2b2lkIGUxX3NldF9wY2FwX2ZkKGludCBmZCk7CisKKy8qIGNhbGxlZCBieSBUUkFVIG11eGVyIHRvIG9idGFpbiB0aGUgZGVzdGluYXRpb24gbXV4IGVudGl0eSAqLworc3RydWN0IHN1YmNoX211eCAqZTFpbnBfZ2V0X211eCh1X2ludDhfdCBlMV9uciwgdV9pbnQ4X3QgdHNfbnIpOworCit2b2lkIGUxaW5wX3NpZ25fbGlua19kZXN0cm95KHN0cnVjdCBlMWlucF9zaWduX2xpbmsgKmxpbmspOworaW50IGUxaW5wX2xpbmVfdXBkYXRlKHN0cnVjdCBlMWlucF9saW5lICpsaW5lKTsKKworLyogZTFfY29uZmlnLmMgKi8KK2ludCBlMV9yZWNvbmZpZ190cyhzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzKTsKK2ludCBlMV9yZWNvbmZpZ190cngoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpOworaW50IGUxX3JlY29uZmlnX2J0cyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKKworaW50IGlhX2NvbmZpZ19jb25uZWN0KHN0cnVjdCBnc21fYnRzICpidHMsIHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luKTsKK2ludCBpcGFjY2Vzc19zZXR1cChzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbW5ldCk7CisKK2V4dGVybiBzdHJ1Y3QgbGxpc3RfaGVhZCBlMWlucF9kcml2ZXJfbGlzdDsKK2V4dGVybiBzdHJ1Y3QgbGxpc3RfaGVhZCBlMWlucF9saW5lX2xpc3Q7CisKKyNlbmRpZiAvKiBfRTFfSU5QVVRfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtXzA0XzA4LmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9nc21fMDRfMDguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDAxOGNkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtXzA0XzA4LmgKQEAgLTAsMCArMSw1NiBAQAorI2lmbmRlZiBfR1NNXzA0XzA4X0gKKyNkZWZpbmUgX0dTTV8wNF8wOF9ICisKKyNpbmNsdWRlIDxvcGVuYnNjL21lYXNfcmVwLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9wcm90b2NvbC9nc21fMDRfMDguaD4KKyNpbmNsdWRlIDxvc21vY29yZS9nc200OC5oPgorCitzdHJ1Y3QgbXNnYjsKK3N0cnVjdCBnc21fYnRzOworc3RydWN0IGdzbV9zdWJzY3JpYmVyOworc3RydWN0IGdzbV9uZXR3b3JrOworc3RydWN0IGdzbV90cmFuczsKKworLyogY29uZmlnIG9wdGlvbnMgY29udHJvbGxpbmcgdGhlIGJlaGF2aW91ciBvZiB0aGUgbG93ZXIgbGV2ZXMgKi8KK3ZvaWQgZ3NtMDQwOF9hbGxvd19ldmVyeW9uZShpbnQgYWxsb3cpOworCitpbnQgZ3NtMDQwOF9yY3Ztc2coc3RydWN0IG1zZ2IgKm1zZywgdV9pbnQ4X3QgbGlua19pZCk7CitlbnVtIGdzbV9jaGFuX3QgZ2V0X2N0eXBlX2J5X2NocmVxKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IHJhLCBpbnQgbmVjaSk7CitlbnVtIGdzbV9jaHJlcV9yZWFzb25fdCBnZXRfcmVhc29uX2J5X2NocmVxKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IHJhLCBpbnQgbmVjaSk7CisKK2ludCBnc200OF90eF9tbV9pbmZvKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKTsKK2ludCBnc200OF90eF9tbV9hdXRoX3JlcShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgKnJhbmQsIGludCBrZXlfc2VxKTsKK2ludCBnc200OF90eF9tbV9hdXRoX3JlaihzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbik7CitzdHJ1Y3QgbXNnYiAqZ3NtNDhfbXNnYl9hbGxvYyh2b2lkKTsKK2ludCBnc200OF9zZW5kbXNnKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zKTsKK2ludCBnc200OF9taV90b19zdHJpbmcoY2hhciAqc3RyaW5nLCBjb25zdCBpbnQgc3RyX2xlbiwgY29uc3QgdV9pbnQ4X3QgKm1pLCBjb25zdCBpbnQgbWlfbGVuKTsKKworaW50IGdzbTQ4X3NlbmRfcnJfcmVsZWFzZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbik7CitpbnQgZ3NtNDhfc2VuZF9ycl9jaXBoX21vZGUoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIGludCB3YW50X2ltZWlzdik7CitpbnQgZ3NtNDhfc2VuZF9ycl9hcHBfaW5mbyhzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgYXBkdV9pZCwKKwkJCSAgIHVfaW50OF90IGFwZHVfbGVuLCBjb25zdCB1X2ludDhfdCAqYXBkdSk7CitpbnQgZ3NtNDhfc2VuZF9ycl9hc3NfY21kKHN0cnVjdCBnc21fbGNoYW4gKmRlc3RfbGNoYW4sIHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBwb3dlcl9jbGFzcyk7CitpbnQgZ3NtNDhfc2VuZF9ob19jbWQoc3RydWN0IGdzbV9sY2hhbiAqb2xkX2xjaGFuLCBzdHJ1Y3QgZ3NtX2xjaGFuICpuZXdfbGNoYW4sCisJCSAgICAgIHVfaW50OF90IHBvd2VyX2NvbW1hbmQsIHVfaW50OF90IGhvX3JlZik7CisKK2ludCBic2NfdXBxdWV1ZShzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCk7CisKK2ludCBtbmNjX3NlbmQoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIGludCBtc2dfdHlwZSwgdm9pZCAqYXJnKTsKKworLyogY29udmVydCBhIEFTQ0lJIHBob25lIG51bWJlciB0byBjYWxsLWNvbnRyb2wgQkNEICovCitpbnQgZW5jb2RlX2JjZF9udW1iZXIodV9pbnQ4X3QgKmJjZF9sdiwgdV9pbnQ4X3QgbWF4X2xlbiwKKwkJICAgICAgaW50IGhfbGVuLCBjb25zdCBjaGFyICppbnB1dCk7CitpbnQgZGVjb2RlX2JjZF9udW1iZXIoY2hhciAqb3V0cHV0LCBpbnQgb3V0cHV0X2xlbiwgY29uc3QgdV9pbnQ4X3QgKmJjZF9sdiwKKwkJICAgICAgaW50IGhfbGVuKTsKKworaW50IHNlbmRfc2llbWVuc19tcnBjaShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgKmNsYXNzbWFyazJfbHYpOworaW50IGdzbTQ4X3BhZ2luZ19leHRyYWN0X21pKHN0cnVjdCBtc2diICptc2csIGNoYXIgKm1pX3N0cmluZywgdV9pbnQ4X3QgKm1pX3R5cGUpOworaW50IGdzbTQ4X2hhbmRsZV9wYWdpbmdfcmVzcChzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcik7CisKK2ludCBnc200OF9sY2hhbl9tb2RpZnkoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGxjaGFuX21vZGUpOworaW50IGdzbTQ4X3J4X3JyX21vZGlmX2FjayhzdHJ1Y3QgbXNnYiAqbXNnKTsKK2ludCBnc200OF9wYXJzZV9tZWFzX3JlcChzdHJ1Y3QgZ3NtX21lYXNfcmVwICpyZXAsIHN0cnVjdCBtc2diICptc2cpOworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtXzA0XzExLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9nc21fMDRfMTEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmFkZDM2Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtXzA0XzExLmgKQEAgLTAsMCArMSwzNiBAQAorI2lmbmRlZiBfR1NNXzA0XzExX0gKKyNkZWZpbmUgX0dTTV8wNF8xMV9ICisKKyNpbmNsdWRlIDxvc21vY29yZS9wcm90b2NvbC9nc21fMDRfMTEuaD4KKworLyogU01TIGRlbGl2ZXIgUERVICovCitzdHJ1Y3Qgc21zX2RlbGl2ZXIgeworCXVfaW50OF90IG10aToyOwkJLyogbWVzc2FnZSB0eXBlIGluZGljYXRvciAqLworCXVfaW50OF90IG1tczoxOwkJLyogbW9yZSBtZXNzYWdlcyB0byBzZW5kICovCisJdV9pbnQ4X3QgcnA6MTsJCS8qIHJlcGx5IHBhdGggKi8KKwl1X2ludDhfdCB1ZGhpOjE7CS8qIHVzZXIgZGF0YSBoZWFkZXIgaW5kaWNhdG9yICovCisJdV9pbnQ4X3Qgc3JpOjE7CQkvKiBzdGF0dXMgcmVwb3J0IGluZGljYXRpb24gKi8KKwl1X2ludDhfdCAqb3JpZ19hZGRyOwkvKiBvcmlnaW5hdGluZyBhZGRyZXNzICovCisJdV9pbnQ4X3QgcGlkOwkJLyogcHJvdG9jb2wgaWRlbnRpZmllciAqLworCXVfaW50OF90IGRjczsJCS8qIGRhdGEgY29kaW5nIHNjaGVtZSAqLworCQkJCS8qIHNlcnZpY2UgY2VudHJlIHRpbWUgc3RhbXAgKi8KKwl1X2ludDhfdCB1ZF9sZW47CS8qIHVzZXIgZGF0YSBsZW5ndGggKi8KKwl1X2ludDhfdCAqdXNlcl9kYXRhOwkvKiB1c2VyIGRhdGEgKi8KKworCXVfaW50OF90IG1zZ19yZWY7CS8qIG1lc3NhZ2UgcmVmZXJlbmNlICovCisJdV9pbnQ4X3QgKnNtc2M7Cit9OworCitzdHJ1Y3QgbXNnYjsKKworaW50IGdzbTA0MTFfcmN2X3NtcyhzdHJ1Y3QgbXNnYiAqbXNnLCB1X2ludDhfdCBsaW5rX2lkKTsKKworaW50IGdzbTQxMV9zZW5kX3Ntc19sY2hhbihzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgc3RydWN0IGdzbV9zbXMgKnNtcyk7CisKK3N0cnVjdCBnc21fc21zICpzbXNfYWxsb2Modm9pZCk7Cit2b2lkIHNtc19mcmVlKHN0cnVjdCBnc21fc21zICpzbXMpOworCit2b2lkIF9nc200MTFfc21zX3RyYW5zX2ZyZWUoc3RydWN0IGdzbV90cmFucyAqdHJhbnMpOworaW50IGdzbTQxMV9zZW5kX3Ntc19zdWJzY3Ioc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsCisJCQkgICBzdHJ1Y3QgZ3NtX3NtcyAqc21zKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtXzA0XzgwLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9nc21fMDRfODAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWFiMWM2Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtXzA0XzgwLmgKQEAgLTAsMCArMSwyMiBAQAorI2lmbmRlZiBfR1NNXzA0XzgwX0gKKyNkZWZpbmUgX0dTTV8wNF84MF9ICisKKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzgwLmg+CisKKyNkZWZpbmUgTUFYX0xFTl9VU1NEX1NUUklORwkzMQorCitzdHJ1Y3QgdXNzZF9yZXF1ZXN0IHsKKwkJCWNoYXIgdGV4dFtNQVhfTEVOX1VTU0RfU1RSSU5HICsgMV07CisJCQl1X2ludDhfdCB0cmFuc2FjdGlvbl9pZDsKKwkJCXVfaW50OF90IGludm9rZV9pZDsKK307CisKK2ludCBnc20wNDgwX2RlY29kZV91c3NkX3JlcXVlc3QoY29uc3Qgc3RydWN0IG1zZ2IgKm1zZywgCisJCQkJc3RydWN0IHVzc2RfcmVxdWVzdCAqcmVxdWVzdCk7IAoraW50IGdzbTA0ODBfc2VuZF91c3NkX3Jlc3BvbnNlKGNvbnN0IHN0cnVjdCBtc2diICppbl9tc2csIGNvbnN0IGNoYXIqIHJlc3BvbnNlX3RleHQsIAorCQkJCQkJY29uc3Qgc3RydWN0IHVzc2RfcmVxdWVzdCAqcmVxKTsKK2ludCBnc20wNDgwX3NlbmRfdXNzZF9yZWplY3QoY29uc3Qgc3RydWN0IG1zZ2IgKm1zZywgCisJCQkJY29uc3Qgc3RydWN0IHVzc2RfcmVxdWVzdCAqcmVxdWVzdCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtX2RhdGEuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV9kYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhlN2YxNgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV9kYXRhLmgKQEAgLTAsMCArMSw3MDYgQEAKKyNpZm5kZWYgX0dTTV9EQVRBX0gKKyNkZWZpbmUgX0dTTV9EQVRBX0gKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCitlbnVtIGdzbV9waHlzX2NoYW5fY29uZmlnIHsKKwlHU01fUENIQU5fTk9ORSwKKwlHU01fUENIQU5fQ0NDSCwKKwlHU01fUENIQU5fQ0NDSF9TRENDSDQsCisJR1NNX1BDSEFOX1RDSF9GLAorCUdTTV9QQ0hBTl9UQ0hfSCwKKwlHU01fUENIQU5fU0RDQ0g4X1NBQ0NIOEMsCisJR1NNX1BDSEFOX1BEQ0gsCQkvKiBHUFJTIFBEQ0ggKi8KKwlHU01fUENIQU5fVENIX0ZfUERDSCwJLyogVENIL0YgaWYgdXNlZCwgUERDSCBvdGhlcndpc2UgKi8KKwlHU01fUENIQU5fVU5LTk9XTiwKK307CisKK2VudW0gZ3NtX2NoYW5fdCB7CisJR1NNX0xDSEFOX05PTkUsCisJR1NNX0xDSEFOX1NEQ0NILAorCUdTTV9MQ0hBTl9UQ0hfRiwKKwlHU01fTENIQU5fVENIX0gsCisJR1NNX0xDSEFOX1VOS05PV04sCit9OworCisvKiBSUkxQIG1vZGUgb2Ygb3BlcmF0aW9uICovCitlbnVtIHJybHBfbW9kZSB7CisJUlJMUF9NT0RFX05PTkUsCisJUlJMUF9NT0RFX01TX0JBU0VELAorCVJSTFBfTU9ERV9NU19QUkVGLAorCVJSTFBfTU9ERV9BU1NfUFJFRiwKK307CisKKy8qIENoYW5uZWwgUmVxdWVzdCByZWFzb24gKi8KK2VudW0gZ3NtX2NocmVxX3JlYXNvbl90IHsKKwlHU01fQ0hSRVFfUkVBU09OX0VNRVJHLAorCUdTTV9DSFJFUV9SRUFTT05fUEFHLAorCUdTTV9DSFJFUV9SRUFTT05fQ0FMTCwKKwlHU01fQ0hSRVFfUkVBU09OX0xPQ0FUSU9OX1VQRCwKKwlHU01fQ0hSRVFfUkVBU09OX09USEVSLAorfTsKKworI2luY2x1ZGUgPG9zbW9jb3JlL3RpbWVyLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMDguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfcnNsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9tbmNjLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGx2Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvYml0dmVjLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvc3RhdGlzdGljcy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2dzbV91dGlscy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3V0aWxzLmg+CisKKyNkZWZpbmUgVFJYX05SX1RTCTgKKyNkZWZpbmUgVFNfTUFYX0xDSEFOCTgKKworI2RlZmluZSBIQVJEQ09ERURfQVJGQ04gMTIzCisjZGVmaW5lIEhBUkRDT0RFRF9UU0MJNworI2RlZmluZSBIQVJEQ09ERURfQlNJQwkweDNmCS8qIE5DQyA9IDcgLyBCQ0MgPSA3ICovCisKKy8qIGZvciBtdWx0aS1kcm9wIGNvbmZpZyAqLworI2RlZmluZSBIQVJEQ09ERURfQlRTMF9UUwkxCisjZGVmaW5lIEhBUkRDT0RFRF9CVFMxX1RTCTYKKyNkZWZpbmUgSEFSRENPREVEX0JUUzJfVFMJMTEKKworZW51bSBnc21faG9va3MgeworCUdTTV9IT09LX05NX1NXTE9BRCwKKwlHU01fSE9PS19SUl9QQUdJTkcsCit9OworCitlbnVtIGdzbV9wYWdpbmdfZXZlbnQgeworCUdTTV9QQUdJTkdfU1VDQ0VFREVELAorCUdTTV9QQUdJTkdfRVhQSVJFRCwKKwlHU01fUEFHSU5HX09PTSwKK307CisKK3N0cnVjdCBtc2diOwordHlwZWRlZiBpbnQgZ3NtX2NiZm4odW5zaWduZWQgaW50IGhvb2tudW0sCisJCSAgICAgdW5zaWduZWQgaW50IGV2ZW50LAorCQkgICAgIHN0cnVjdCBtc2diICptc2csCisJCSAgICAgdm9pZCAqZGF0YSwgdm9pZCAqcGFyYW0pOworCisvKgorICogVXNlIHRoZSBjaGFubmVsLiBBcyBzaWRlIGVmZmVjdCB0aGUgbGNoYW5uZWwgcmVjeWNsZSB0aW1lcgorICogd2lsbCBiZSBzdGFydGVkLgorICovCisjZGVmaW5lIExDSEFOX1JFTEVBU0VfVElNRU9VVCAyMCwgMAorI2RlZmluZSB1c2VfbGNoYW4obGNoYW4pIFwKKwlkbyB7CWxjaGFuLT51c2VfY291bnQrKzsgXAorCQlERUJVR1AoRFJFRiwgImxjaGFuIChidHM9JWQsdHJ4PSVkLHRzPSVkLGNoPSVkKSBpbmNyZWFzZXMgdXNhZ2UgdG86ICVkXG4iLCBcCisJCQlsY2hhbi0+dHMtPnRyeC0+YnRzLT5uciwgbGNoYW4tPnRzLT50cngtPm5yLCBsY2hhbi0+dHMtPm5yLCBcCisJCQlsY2hhbi0+bnIsIGxjaGFuLT51c2VfY291bnQpOyBcCisJCWJzY19zY2hlZHVsZV90aW1lcigmbGNoYW4tPnJlbGVhc2VfdGltZXIsIExDSEFOX1JFTEVBU0VfVElNRU9VVCk7IH0gd2hpbGUoMCk7CisKKyNkZWZpbmUgcHV0X2xjaGFuKGxjaGFuKSBcCisJZG8geyBsY2hhbi0+dXNlX2NvdW50LS07IFwKKwkJREVCVUdQKERSRUYsICJsY2hhbiAoYnRzPSVkLHRyeD0lZCx0cz0lZCxjaD0lZCkgZGVjcmVhc2VzIHVzYWdlIHRvOiAlZFxuIiwgXAorCQkJbGNoYW4tPnRzLT50cngtPmJ0cy0+bnIsIGxjaGFuLT50cy0+dHJ4LT5uciwgbGNoYW4tPnRzLT5uciwgXAorCQkJbGNoYW4tPm5yLCBsY2hhbi0+dXNlX2NvdW50KTsgXAorCX0gd2hpbGUoMCk7CisKKworLyogY29tbXVuaWNhdGlvbnMgbGluayB3aXRoIGEgQlRTICovCitzdHJ1Y3QgZ3NtX2J0c19saW5rIHsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworfTsKKworLyogUmVhbCBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbiBjb250YWluaW5nIEtpICovCitlbnVtIGdzbV9hdXRoX2FsZ28geworCUFVVEhfQUxHT19OT05FLAorCUFVVEhfQUxHT19YT1IsCisJQVVUSF9BTEdPX0NPTVAxMjh2MSwKK307CisKK3N0cnVjdCBnc21fYXV0aF9pbmZvIHsKKwllbnVtIGdzbV9hdXRoX2FsZ28gYXV0aF9hbGdvOworCXVuc2lnbmVkIGludCBhM2E4X2tpX2xlbjsKKwl1X2ludDhfdCBhM2E4X2tpWzE2XTsKK307CisKK3N0cnVjdCBnc21fYXV0aF90dXBsZSB7CisJaW50IHVzZV9jb3VudDsKKwlpbnQga2V5X3NlcTsKKwl1X2ludDhfdCByYW5kWzE2XTsKKwl1X2ludDhfdCBzcmVzWzRdOworCXVfaW50OF90IGtjWzhdOworfTsKKworCitzdHJ1Y3QgZ3NtX2xjaGFuOworc3RydWN0IGdzbV9zdWJzY3JpYmVyOworc3RydWN0IGdzbV9tbmNjOworc3RydWN0IHJ0cF9zb2NrZXQ7CisKKy8qIE5ldHdvcmsgTWFuYWdlbWVudCBTdGF0ZSAqLworc3RydWN0IGdzbV9ubV9zdGF0ZSB7CisJdV9pbnQ4X3Qgb3BlcmF0aW9uYWw7CisJdV9pbnQ4X3QgYWRtaW5pc3RyYXRpdmU7CisJdV9pbnQ4X3QgYXZhaWxhYmlsaXR5OworfTsKKworLyoKKyAqIExPQ0FUSU9OIFVQREFUSU5HIFJFUVVFU1Qgc3RhdGUKKyAqCisgKiBPdXIgY3VycmVudCBvcGVyYXRpb24gaXM6CisgKgktIEdldCBpbWVpL3Rtc2kKKyAqCS0gQWNjZXB0L1JlamVjdCBhY2NvcmRpbmcgdG8gZ2xvYmFsIHBvbGljeQorICovCitzdHJ1Y3QgZ3NtX2xvY191cGRhdGluZ19vcGVyYXRpb24geworICAgICAgICBzdHJ1Y3QgdGltZXJfbGlzdCB1cGRhdGluZ190aW1lcjsKKwl1bnNpZ25lZCBpbnQgd2FpdGluZ19mb3JfaW1zaSA6IDE7CisJdW5zaWduZWQgaW50IHdhaXRpbmdfZm9yX2ltZWkgOiAxOworfTsKKworLyogTWF4aW11bSBudW1iZXIgb2YgbmVpZ2hib3IgY2VsbHMgd2hvc2UgYXZlcmFnZSB3ZSB0cmFjayAqLworI2RlZmluZSBNQVhfTkVJR0hfTUVBUwkJMTAKKy8qIE1heGltdW0gc2l6ZSBvZiB0aGUgYXZlcmFnaW5nIHdpbmRvdyBmb3IgbmVpZ2hib3IgY2VsbHMgKi8KKyNkZWZpbmUgTUFYX1dJTl9ORUlHSF9BVkcJMTAKKworLyogcHJvY2Vzc2VkIG5laWdoYm9yIG1lYXN1cmVtZW50cyBmb3Igb25lIGNlbGwgKi8KK3N0cnVjdCBuZWlnaF9tZWFzX3Byb2MgeworCXVfaW50MTZfdCBhcmZjbjsKKwl1X2ludDhfdCBic2ljOworCXVfaW50OF90IHJ4bGV2W01BWF9XSU5fTkVJR0hfQVZHXTsKKwl1bnNpZ25lZCBpbnQgcnhsZXZfY250OworCXVfaW50OF90IGxhc3Rfc2Vlbl9ucjsKK307CisKKyNkZWZpbmUgTUFYX0E1X0tFWV9MRU4JKDEyOC84KQorI2RlZmluZSBSU0xfRU5DX0FMR19BNSh4KQkoeCsxKQorCisvKiBpcyB0aGUgZGF0YSBsaW5rIGVzdGFibGlzaGVkPyB3aG8gZXN0YWJsaXNoZWQgaXQ/ICovCisjZGVmaW5lIExDSEFOX1NBUElfVU5VU0VECTAKKyNkZWZpbmUgTENIQU5fU0FQSV9NUwkJMQorI2RlZmluZSBMQ0hBTl9TQVBJX05FVAkJMgorCisvKiBzdGF0ZSBvZiBhIGxvZ2ljYWwgY2hhbm5lbCAqLworZW51bSBnc21fbGNoYW5fc3RhdGUgeworCUxDSEFOX1NfTk9ORSwJCS8qIGNoYW5uZWwgaXMgbm90IGFjdGl2ZSAqLworCUxDSEFOX1NfQUNUX1JFUSwJLyogY2hhbm5lbCBhY3RpdmF0aW4gcmVxdWVzdGVkICovCisJTENIQU5fU19BQ1RJVkUsCQkvKiBjaGFubmVsIGlzIGFjdGl2ZSBhbmQgb3BlcmF0aW9uYWwgKi8KKwlMQ0hBTl9TX1JFTF9SRVEsCS8qIGNoYW5uZWwgcmVsZWFzZSBoYXMgYmVlbiByZXF1ZXN0ZWQgKi8KKwlMQ0hBTl9TX0lOQUNUSVZFLAkvKiBjaGFubmVsIGlzIHNldCBpbmFjdGl2ZSAqLworfTsKKworc3RydWN0IGdzbV9sY2hhbiB7CisJLyogVGhlIFRTIHRoYXQgd2UncmUgcGFydCBvZiAqLworCXN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHM7CisJLyogVGhlIGxvZ2ljYWwgc3Vic2xvdCBudW1iZXIgaW4gdGhlIFRTICovCisJdV9pbnQ4X3QgbnI7CisJLyogVGhlIGxvZ2ljYWwgY2hhbm5lbCB0eXBlICovCisJZW51bSBnc21fY2hhbl90IHR5cGU7CisJLyogUlNMIGNoYW5uZWwgbW9kZSAqLworCWVudW0gcnNsX2Ntb2Rfc3BkIHJzbF9jbW9kZTsKKwkvKiBJZiBUQ0gsIHRyYWZmaWMgY2hhbm5lbCBtb2RlICovCisJZW51bSBnc200OF9jaGFuX21vZGUgdGNoX21vZGU7CisJLyogU3RhdGUgKi8KKwllbnVtIGdzbV9sY2hhbl9zdGF0ZSBzdGF0ZTsKKwkvKiBQb3dlciBsZXZlbHMgZm9yIE1TIGFuZCBCVFMgKi8KKwl1X2ludDhfdCBic19wb3dlcjsKKwl1X2ludDhfdCBtc19wb3dlcjsKKwkvKiBFbmNyeXB0aW9uIGluZm9ybWF0aW9uICovCisJc3RydWN0IHsKKwkJdV9pbnQ4X3QgYWxnX2lkOworCQl1X2ludDhfdCBrZXlfbGVuOworCQl1X2ludDhfdCBrZXlbTUFYX0E1X0tFWV9MRU5dOworCX0gZW5jcjsKKwkvKiBBcmUgd2UgcGFydCBvZiBhIHNwZWNpYWwgInNpbGVudCIgY2FsbCAqLworCWludCBzaWxlbnRfY2FsbDsKKworCS8qIEFNUiBiaXRzICovCisJc3RydWN0IGdzbTQ4X211bHRpX3JhdGVfY29uZiBtcl9jb25mOworCQorCS8qIFRvIHdob20gd2UgYXJlIGFsbG9jYXRlZCBhdCB0aGUgbW9tZW50ICovCisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisKKwkvKiBUaW1lciBzdGFydGVkIHRvIHJlbGVhc2UgdGhlIGNoYW5uZWwgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCByZWxlYXNlX3RpbWVyOworCisJc3RydWN0IHRpbWVyX2xpc3QgVDMxMDE7CisKKwkvKiBFc3RhYmxpc2hlZCBkYXRhIGxpbmsgbGF5ZXIgc2VydmljZXMgKi8KKwl1X2ludDhfdCBzYXBpc1s4XTsKKworCS8qCisJICogT3BlcmF0aW9ucyB0aGF0IGhhdmUgYSBzdGF0ZSBhbmQgbWlnaHQgYmUgcGVuZGluZworCSAqLworCXN0cnVjdCBnc21fbG9jX3VwZGF0aW5nX29wZXJhdGlvbiAqbG9jX29wZXJhdGlvbjsKKworCS8qIHVzZSBjb3VudC4gaG93IG1hbnkgdXNlcnMgdXNlIHRoaXMgY2hhbm5lbCAqLworCXVuc2lnbmVkIGludCB1c2VfY291bnQ7CisKKwkvKiBjYWNoZSBvZiBsYXN0IG1lYXN1cmVtZW50IHJlcG9ydHMgb24gdGhpcyBsY2hhbiAqLworCXN0cnVjdCBnc21fbWVhc19yZXAgbWVhc19yZXBbNl07CisJaW50IG1lYXNfcmVwX2lkeDsKKworCS8qIHRhYmxlIG9mIG5laWdoYm9yIGNlbGwgbWVhc3VyZW1lbnRzICovCisJc3RydWN0IG5laWdoX21lYXNfcHJvYyBuZWlnaF9tZWFzW01BWF9ORUlHSF9NRUFTXTsKKworCXN0cnVjdCB7CisJCXVfaW50MzJfdCBib3VuZF9pcDsKKwkJdV9pbnQzMl90IGNvbm5lY3RfaXA7CisJCXVfaW50MTZfdCBib3VuZF9wb3J0OworCQl1X2ludDE2X3QgY29ubmVjdF9wb3J0OworCQl1X2ludDE2X3QgY29ubl9pZDsKKwkJdV9pbnQ4X3QgcnRwX3BheWxvYWQyOworCQl1X2ludDhfdCBzcGVlY2hfbW9kZTsKKwkJc3RydWN0IHJ0cF9zb2NrZXQgKnJ0cF9zb2NrZXQ7CisJfSBhYmlzX2lwOworfTsKKworc3RydWN0IGdzbV9lMV9zdWJzbG90IHsKKwkvKiBOdW1iZXIgb2YgRTEgbGluayAqLworCXVfaW50OF90CWUxX25yOworCS8qIE51bWJlciBvZiBFMSBUUyBpbnNpZGUgRTEgbGluayAqLworCXVfaW50OF90CWUxX3RzOworCS8qIFN1Yi1zbG90IHdpdGhpbiB0aGUgRTEgVFMsIDB4ZmYgaWYgZnVsbCBUUyAqLworCXVfaW50OF90CWUxX3RzX3NzOworfTsKKworI2RlZmluZSBCVFNfVFJYX0ZfQUNUSVZBVEVECTB4MDAwMQorLyogT25lIFRpbWVzbG90IGluIGEgVFJYICovCitzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgeworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCS8qIG51bWJlciBvZiB0aGlzIHRpbWVzbG90IGF0IHRoZSBUUlggKi8KKwl1X2ludDhfdCBucjsKKworCWVudW0gZ3NtX3BoeXNfY2hhbl9jb25maWcgcGNoYW47CisKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJc3RydWN0IGdzbV9ubV9zdGF0ZSBubV9zdGF0ZTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCBubV9hdHRyOworCXVfaW50OF90IG5tX2NoYW5fY29tYjsKKworCS8qIFRvIHdoaWNoIEUxIHN1YnNsb3QgYXJlIHdlIGNvbm5lY3RlZCAqLworCXN0cnVjdCBnc21fZTFfc3Vic2xvdCBlMV9saW5rOworCisJc3RydWN0IGdzbV9sY2hhbiBsY2hhbltUU19NQVhfTENIQU5dOworfTsKKworLyogT25lIFRSWCBpbiBhIEJUUyAqLworc3RydWN0IGdzbV9idHNfdHJ4IHsKKwkvKiBsaXN0IGhlYWRlciBpbiBidHMtPnRyeF9saXN0ICovCisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKworCXN0cnVjdCBnc21fYnRzICpidHM7CisJLyogbnVtYmVyIG9mIHRoaXMgVFJYIGluIHRoZSBCVFMgKi8KKwl1X2ludDhfdCBucjsKKwkvKiBob3cgZG8gd2UgdGFsayBSU0wgd2l0aCB0aGlzIFRSWD8gKi8KKwlzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgcnNsX2UxX2xpbms7CisJdV9pbnQ4X3QgcnNsX3RlaTsKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpyc2xfbGluazsKKworCXN0cnVjdCBnc21fbm1fc3RhdGUgbm1fc3RhdGU7CisJc3RydWN0IHRsdl9wYXJzZWQgbm1fYXR0cjsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgZ3NtX25tX3N0YXRlIG5tX3N0YXRlOworCX0gYmJfdHJhbnNjOworCisJdV9pbnQxNl90IGFyZmNuOworCWludCBub21pbmFsX3Bvd2VyOwkJLyogaW4gZEJtICovCisJdW5zaWduZWQgaW50IG1heF9wb3dlcl9yZWQ7CS8qIGluIGFjdHVhbCBkQiAqLworCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJc3RydWN0IHsKKwkJCQlzdHJ1Y3QgZ3NtX25tX3N0YXRlIG5tX3N0YXRlOworCQkJfSBiYnNpZzsKKwkJCXN0cnVjdCB7CisJCQkJc3RydWN0IGdzbV9ubV9zdGF0ZSBubV9zdGF0ZTsKKwkJCX0gcGE7CisJCX0gYnMxMTsKKwl9OworCXN0cnVjdCBnc21fYnRzX3RyeF90cyB0c1tUUlhfTlJfVFNdOworfTsKKworZW51bSBnc21fYnRzX3R5cGUgeworCUdTTV9CVFNfVFlQRV9VTktOT1dOLAorCUdTTV9CVFNfVFlQRV9CUzExLAorCUdTTV9CVFNfVFlQRV9OQU5PQlRTLAorfTsKKworc3RydWN0IGdzbV9idHNfbW9kZWwgeworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisKKwllbnVtIGdzbV9idHNfdHlwZSB0eXBlOworCWNvbnN0IGNoYXIgKm5hbWU7CisKKwlzdHJ1Y3QgdGx2X2RlZmluaXRpb24gbm1fYXR0X3RsdmRlZjsKK307CisKKy8qKgorICogQSBwZW5kaW5nIHBhZ2luZyByZXF1ZXN0IAorICovCitzdHJ1Y3QgZ3NtX3BhZ2luZ19yZXF1ZXN0IHsKKwkvKiBsaXN0X2hlYWQgZm9yIGxpc3Qgb2YgYWxsIHBhZ2luZyByZXF1ZXN0cyAqLworCXN0cnVjdCBsbGlzdF9oZWFkIGVudHJ5OworCS8qIHRoZSBzdWJzY3JpYmVyIHdoaWNoIHdlJ3JlIHBhZ2luZy4gTGF0ZXIgZ3NtX3BhZ2luZ19yZXF1ZXN0CisJICogc2hvdWxkIHByb2JhYmx5IGJlY29tZSBhIHBhcnQgb2YgdGhlIGdzbV9zdWJzY3JpYmVyIHN0cnVjdD8gKi8KKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKKwkvKiBiYWNrLXBvaW50ZXIgdG8gdGhlIEJUUyBvbiB3aGljaCB3ZSBhcmUgcGFnaW5nICovCisJc3RydWN0IGdzbV9idHMgKmJ0czsKKwkvKiB3aGF0IGtpbmQgb2YgY2hhbm5lbCB0eXBlIGRvIHdlIGFzayB0aGUgTVMgdG8gZXN0YWJsaXNoICovCisJaW50IGNoYW5fdHlwZTsKKworCS8qIFRpbWVyIDMxMTM6IGhvdyBsb25nIGRvIHdlIHRyeSB0byBwYWdlPyAqLworCXN0cnVjdCB0aW1lcl9saXN0IFQzMTEzOworCisJLyogY2FsbGJhY2sgdG8gYmUgY2FsbGVkIGluIGNhc2UgcGFnaW5nIGNvbXBsZXRlcyAqLworCWdzbV9jYmZuICpjYmZuOworCXZvaWQgKmNiZm5fcGFyYW07Cit9OworCisvKgorICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgcGFnaW5nIHN0YXR1cyBvZiBvbmUgQlRTLiBJdAorICogaW5jbHVkZXMgYSBudW1iZXIgb2YgcGVuZGluZyByZXF1ZXN0cywgYSBiYWNrIHBvaW50ZXIKKyAqIHRvIHRoZSBnc21fYnRzLCBhIHRpbWVyIGFuZCBzb21lIG1vcmUgc3RhdGUuCisgKi8KK3N0cnVjdCBnc21fYnRzX3BhZ2luZ19zdGF0ZSB7CisJLyogcGVuZGluZyByZXF1ZXN0cyAqLworCXN0cnVjdCBsbGlzdF9oZWFkIHBlbmRpbmdfcmVxdWVzdHM7CisJc3RydWN0IGdzbV9wYWdpbmdfcmVxdWVzdCAqbGFzdF9yZXF1ZXN0OworCXN0cnVjdCBnc21fYnRzICpidHM7CisKKwlzdHJ1Y3QgdGltZXJfbGlzdCB3b3JrX3RpbWVyOworCisJLyogbG9hZCAqLworCXVfaW50MTZfdCBhdmFpbGFibGVfc2xvdHM7Cit9OworCitzdHJ1Y3QgZ3NtX2VudmFidHNlIHsKKwlzdHJ1Y3QgZ3NtX25tX3N0YXRlIG5tX3N0YXRlOworfTsKKworc3RydWN0IGdzbV9idHNfZ3Byc19uc3ZjIHsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCWludCBpZDsKKwl1X2ludDE2X3QgbnN2Y2k7CisJdV9pbnQxNl90IGxvY2FsX3BvcnQ7CisJdV9pbnQxNl90IHJlbW90ZV9wb3J0OworCXVfaW50MzJfdCByZW1vdGVfaXA7CisJc3RydWN0IGdzbV9ubV9zdGF0ZSBubV9zdGF0ZTsKK307CisKKy8qIE9uZSBCVFMgKi8KK3N0cnVjdCBnc21fYnRzIHsKKwkvKiBsaXN0IGhlYWRlciBpbiBuZXQtPmJ0c19saXN0ICovCisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0d29yazsKKwkvKiBudW1iZXIgb2YgdGhzIEJUUyBpbiBuZXR3b3JrICovCisJdV9pbnQ4X3QgbnI7CisJLyogQ2VsbCBJZGVudGl0eSAqLworCXVfaW50MTZfdCBjZWxsX2lkZW50aXR5OworCS8qIGxvY2F0aW9uIGFyZWEgY29kZSBvZiB0aGlzIEJUUyAqLworCXVfaW50MTZfdCBsb2NhdGlvbl9hcmVhX2NvZGU7CisJLyogVHJhaW5pbmcgU2VxdWVuY2UgQ29kZSAqLworCXVfaW50OF90IHRzYzsKKwkvKiBCYXNlIFN0YXRpb24gSWRlbnRpZmljYXRpb24gQ29kZSAoQlNJQykgKi8KKwl1X2ludDhfdCBic2ljOworCS8qIHR5cGUgb2YgQlRTICovCisJZW51bSBnc21fYnRzX3R5cGUgdHlwZTsKKwlzdHJ1Y3QgZ3NtX2J0c19tb2RlbCAqbW9kZWw7CisJZW51bSBnc21fYmFuZCBiYW5kOworCS8qIHNob3VsZCB0aGUgY2hhbm5lbCBhbGxvY2F0b3IgYWxsb2NhdGUgY2hhbm5lbHMgZnJvbSBoaWdoIFRSWCB0byBUUlgwLAorCSAqIHJhdGhlciB0aGFuIHN0YXJ0aW5nIGZyb20gVFJYMCBhbmQgZ28gdXB3YXJkcz8gKi8KKwlpbnQgY2hhbl9hbGxvY19yZXZlcnNlOworCS8qIG1heGltdW0gVHggcG93ZXIgdGhhdCB0aGUgTVMgaXMgcGVybWl0dGVkIHRvIHVzZSBpbiB0aGlzIGNlbGwgKi8KKwlpbnQgbXNfbWF4X3Bvd2VyOworCisJLyogaG93IGRvIHdlIHRhbGsgT01MIHdpdGggdGhpcyBUUlg/ICovCisJc3RydWN0IGdzbV9lMV9zdWJzbG90IG9tbF9lMV9saW5rOworCXVfaW50OF90IG9tbF90ZWk7CisJc3RydWN0IGUxaW5wX3NpZ25fbGluayAqb21sX2xpbms7CisKKwkvKiBBYmlzIG5ldHdvcmsgbWFuYWdlbWVudCBPJk0gaGFuZGxlICovCisJc3RydWN0IGFiaXNfbm1faCAqbm1oOworCXN0cnVjdCBnc21fbm1fc3RhdGUgbm1fc3RhdGU7CisJc3RydWN0IHRsdl9wYXJzZWQgbm1fYXR0cjsKKworCS8qIG51bWJlciBvZiB0aGlzIEJUUyBvbiBnaXZlbiBFMSBsaW5rICovCisJdV9pbnQ4X3QgYnRzX25yOworCisJLyogcGFnaW5nIHN0YXRlIGFuZCBjb250cm9sICovCisJc3RydWN0IGdzbV9idHNfcGFnaW5nX3N0YXRlIHBhZ2luZzsKKworCS8qIENDQ0ggaXMgb24gQzAgKi8KKwlzdHJ1Y3QgZ3NtX2J0c190cnggKmMwOworCisJc3RydWN0IHsKKwkJc3RydWN0IGdzbV9ubV9zdGF0ZSBubV9zdGF0ZTsKKwl9IHNpdGVfbWdyOworCisJLyogcGFyYW1ldGVycyBmcm9tIHdoaWNoIHdlIGJ1aWxkIFNZU1RFTSBJTkZPUk1BVElPTiAqLworCXN0cnVjdCB7CisJCXN0cnVjdCBnc200OF9yYWNoX2NvbnRyb2wgcmFjaF9jb250cm9sOworCQl1X2ludDhfdCBuY2NfcGVybWl0dGVkOworCQlzdHJ1Y3QgZ3NtNDhfY2VsbF9zZWxfcGFyIGNlbGxfc2VsX3BhcjsKKwkJc3RydWN0IGdzbTQ4X2NlbGxfb3B0aW9ucyBjZWxsX29wdGlvbnM7CisJCXN0cnVjdCBnc200OF9jb250cm9sX2NoYW5uZWxfZGVzY3IgY2hhbl9kZXNjOworCQlzdHJ1Y3QgYml0dmVjIG5laWdoX2xpc3Q7CisJCXN0cnVjdCBiaXR2ZWMgY2VsbF9hbGxvYzsKKwkJc3RydWN0IHsKKwkJCS8qIGJpdG1hc2sgbGFyZ2UgZW5vdWdoIGZvciBhbGwgcG9zc2libGUgQVJGQ04ncyAqLworCQkJdV9pbnQ4X3QgbmVpZ2hfbGlzdFsxMDI0LzhdOworCQkJdV9pbnQ4X3QgY2VsbF9hbGxvY1sxMDI0LzhdOworCQl9IGRhdGE7CisJfSBzaV9jb21tb247CisKKwkvKiBpcC5hY2Nlc3NzIFVuaXQgSUQncyBoYXZlIFNpdGUvQlRTL1RSWCBsYXlvdXQgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1X2ludDE2X3Qgc2l0ZV9pZDsKKwkJCXVfaW50MTZfdCBidHNfaWQ7CisJCQl1X2ludDMyX3QgZmxhZ3M7CisJCX0gaXBfYWNjZXNzOworCQlzdHJ1Y3QgeworCQkJc3RydWN0IHsKKwkJCQlzdHJ1Y3QgZ3NtX25tX3N0YXRlIG5tX3N0YXRlOworCQkJfSBjY2xrOworCQkJc3RydWN0IHsKKwkJCQlzdHJ1Y3QgZ3NtX25tX3N0YXRlIG5tX3N0YXRlOworCQkJfSByYWNrOworCQkJc3RydWN0IGdzbV9lbnZhYnRzZSBlbnZhYnRzZVs0XTsKKwkJfSBiczExOworCX07CisKKwkvKiBOb3QgZW50aXJlbHkgc3VyZSBob3cgaXAuYWNjZXNzIHNwZWNpZmljIHRoaXMgaXMgKi8KKwlzdHJ1Y3QgeworCQlpbnQgZW5hYmxlZDsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCBnc21fbm1fc3RhdGUgbm1fc3RhdGU7CisJCQl1X2ludDE2X3QgbnNlaTsKKwkJfSBuc2U7CisJCXN0cnVjdCB7CisJCQlzdHJ1Y3QgZ3NtX25tX3N0YXRlIG5tX3N0YXRlOworCQkJdV9pbnQxNl90IGJ2Y2k7CisJCX0gY2VsbDsKKwkJc3RydWN0IGdzbV9idHNfZ3Byc19uc3ZjIG5zdmNbMl07CisJCXVfaW50OF90IHJhYzsKKwl9IGdwcnM7CisJCisJLyogdHJhbnNjZWl2ZXJzICovCisJaW50IG51bV90cng7CisJc3RydWN0IGxsaXN0X2hlYWQgdHJ4X2xpc3Q7Cit9OworCisvKiBTb21lIHN0YXRpc3RpY3Mgb2Ygb3VyIG5ldHdvcmsgKi8KK3N0cnVjdCBnc21uZXRfc3RhdHMgeworCXN0cnVjdCB7CisJCXN0cnVjdCBjb3VudGVyICp0b3RhbDsKKwkJc3RydWN0IGNvdW50ZXIgKm5vX2NoYW5uZWw7CisJfSBjaHJlcTsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgY291bnRlciAqYXR0ZW1wdGVkOworCQlzdHJ1Y3QgY291bnRlciAqbm9fY2hhbm5lbDsJLyogbm8gY2hhbm5lbCBhdmFpbGFibGUgKi8KKwkJc3RydWN0IGNvdW50ZXIgKnRpbWVvdXQ7CQkvKiBUMzEwMyB0aW1lb3V0ICovCisJCXN0cnVjdCBjb3VudGVyICpjb21wbGV0ZWQ7CS8qIEhPIENPTVBMIHJlY2VpdmVkICovCisJCXN0cnVjdCBjb3VudGVyICpmYWlsZWQ7CQkvKiBITyBGQUlMIHJlY2VpdmVkICovCisJfSBoYW5kb3ZlcjsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgY291bnRlciAqYXR0YWNoOworCQlzdHJ1Y3QgY291bnRlciAqbm9ybWFsOworCQlzdHJ1Y3QgY291bnRlciAqcGVyaW9kaWM7CisJCXN0cnVjdCBjb3VudGVyICpkZXRhY2g7CisJfSBsb2NfdXBkX3R5cGU7CisJc3RydWN0IHsKKwkJc3RydWN0IGNvdW50ZXIgKnJlamVjdDsKKwkJc3RydWN0IGNvdW50ZXIgKmFjY2VwdDsKKwl9IGxvY191cGRfcmVzcDsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgY291bnRlciAqYXR0ZW1wdGVkOworCQlzdHJ1Y3QgY291bnRlciAqZGV0YWNoZWQ7CisJCXN0cnVjdCBjb3VudGVyICpjb21wbGV0ZWQ7CisJCXN0cnVjdCBjb3VudGVyICpleHBpcmVkOworCX0gcGFnaW5nOworCXN0cnVjdCB7CisJCXN0cnVjdCBjb3VudGVyICpzdWJtaXR0ZWQ7IC8qIE1PIFNNUyBzdWJtaXNzaW9ucyAqLworCQlzdHJ1Y3QgY291bnRlciAqbm9fcmVjZWl2ZXI7CisJCXN0cnVjdCBjb3VudGVyICpkZWxpdmVyZWQ7IC8qIE1UIFNNUyBkZWxpdmVyaWVzICovCisJCXN0cnVjdCBjb3VudGVyICpycF9lcnJfbWVtOworCQlzdHJ1Y3QgY291bnRlciAqcnBfZXJyX290aGVyOworCX0gc21zOworCXN0cnVjdCB7CisJCXN0cnVjdCBjb3VudGVyICpkaWFsbGVkOwkvKiB0b3RhbCBudW1iZXIgb2YgZGlhbGxlZCBjYWxscyAqLworCQlzdHJ1Y3QgY291bnRlciAqYWxlcnRlZDsJLyogd2UgYWxlcnRlZCB0aGUgb3RoZXIgZW5kICovCisJCXN0cnVjdCBjb3VudGVyICpjb25uZWN0ZWQ7LyogaG93IG1hbnkgY2FsbHMgd2VyZSBhY2NlcHRlZCAqLworCX0gY2FsbDsKK307CisKK2VudW0gZ3NtX2F1dGhfcG9saWN5IHsKKwlHU01fQVVUSF9QT0xJQ1lfQ0xPU0VELCAvKiBvbmx5IHN1YnNjcmliZXJzIGF1dGhvcml6ZWQgaW4gREIgKi8KKwlHU01fQVVUSF9QT0xJQ1lfQUNDRVBUX0FMTCwgLyogYWNjZXB0IGV2ZXJ5b25lLCBldmVuIGlmIG5vdCBhdXRob3JpemVkIGluIERCICovCisJR1NNX0FVVEhfUE9MSUNZX1RPS0VOLCAvKiBhY2NlcHQgZmlyc3QsIHNlbmQgdG9rZW4gcGVyIHNtcywgdGhlbiByZXZva2UgYXV0aG9yaXphdGlvbiAqLworfTsKKworI2RlZmluZSBHU01fVDMxMDFfREVGQVVMVCAxMAorI2RlZmluZSBHU01fVDMxMTNfREVGQVVMVCA2MAorCitzdHJ1Y3QgZ3NtX25ldHdvcmsgeworCS8qIGdsb2JhbCBwYXJhbWV0ZXJzICovCisJdV9pbnQxNl90IGNvdW50cnlfY29kZTsKKwl1X2ludDE2X3QgbmV0d29ya19jb2RlOworCWNoYXIgKm5hbWVfbG9uZzsKKwljaGFyICpuYW1lX3Nob3J0OworCWVudW0gZ3NtX2F1dGhfcG9saWN5IGF1dGhfcG9saWN5OworCWVudW0gZ3NtNDhfcmVqZWN0X3ZhbHVlIHJlamVjdF9jYXVzZTsKKwlpbnQgYTVfZW5jcnlwdGlvbjsKKwlpbnQgbmVjaTsKKwlpbnQgc2VuZF9tbV9pbmZvOworCXN0cnVjdCB7CisJCWludCBhY3RpdmU7CisJCS8qIFdpbmRvdyBSWExFViBhdmVyYWdpbmcgKi8KKwkJdW5zaWduZWQgaW50IHdpbl9yeGxldl9hdmc7CS8qIG51bWJlciBvZiBTQUNDSCBmcmFtZXMgKi8KKwkJLyogV2luZG93IFJYUVVBTCBhdmVyYWdpbmcgKi8KKwkJdW5zaWduZWQgaW50IHdpbl9yeHF1YWxfYXZnOwkvKiBudW1iZXIgb2YgU0FDQ0ggZnJhbWVzICovCisJCS8qIFdpbmRvdyBSWExFViBuZWlnaGJvdXJpbmcgY2VsbHMgYXZlcmFnaW5nICovCisJCXVuc2lnbmVkIGludCB3aW5fcnhsZXZfYXZnX25laWdoOyAvKiBudW1iZXIgb2YgU0FDQ0ggZnJhbWVzICovCisKKwkJLyogaG93IG9mdGVuIHNob3VsZCB3ZSBjaGVjayBmb3IgcG93ZXIgYnVkZ2V0IEhPICovCisJCXVuc2lnbmVkIGludCBwd3JfaW50ZXJ2YWw7CS8qIFNBQ0NIIGZyYW1lcyAqLworCQkvKiBob3cgbXVjaCBiZXR0ZXIgZG9lcyBhIG5laWdoYm9yIGNlbGwgaGF2ZSB0byBiZSA/ICovCisJCXVuc2lnbmVkIGludCBwd3JfaHlzdGVyZXNpczsJLyogZEJtICovCisJCS8qIG1heGltdW0gZGlzdGFjbmUgYmVmb3JlIHdlIHRyeSBhIGhhbmRvdmVyICovCisJCXVuc2lnbmVkIGludCBtYXhfZGlzdGFuY2U7CS8qIFRBIHZhbHVlcyAqLworCX0gaGFuZG92ZXI7CisKKwlzdHJ1Y3QgZ3NtbmV0X3N0YXRzIHN0YXRzOworCisJLyogbGF5ZXIgNCAqLworCWludCAoKm1uY2NfcmVjdikgKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCBpbnQgbXNnX3R5cGUsIHZvaWQgKmFyZyk7CisJc3RydWN0IGxsaXN0X2hlYWQgdXBxdWV1ZTsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCB0cmFuc19saXN0OworCisJdW5zaWduZWQgaW50IG51bV9idHM7CisJc3RydWN0IGxsaXN0X2hlYWQgYnRzX2xpc3Q7CisKKwkvKiB0aW1lciB2YWx1ZXMgKi8KKwlpbnQgVDMxMDE7CisJaW50IFQzMTAzOworCWludCBUMzEwNTsKKwlpbnQgVDMxMDc7CisJaW50IFQzMTA5OworCWludCBUMzExMTsKKwlpbnQgVDMxMTM7CisJaW50IFQzMTE1OworCWludCBUMzExNzsKKwlpbnQgVDMxMTk7CisJaW50IFQzMTQxOworCisJLyogUmFkaW8gUmVzb3VyY2UgTG9jYXRpb24gUHJvdG9jb2wgKFRTIDA0LjMxKSAqLworCXN0cnVjdCB7CisJCWVudW0gcnJscF9tb2RlIG1vZGU7CisJfSBycmxwOworfTsKKworI2RlZmluZSBTTVNfSERSX1NJWkUJMTI4CisjZGVmaW5lIFNNU19URVhUX1NJWkUJMjU2CitzdHJ1Y3QgZ3NtX3NtcyB7CisJdW5zaWduZWQgbG9uZyBsb25nIGlkOworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc2VuZGVyOworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqcmVjZWl2ZXI7CisKKwl1bnNpZ25lZCBsb25nIHZhbGlkaXR5X21pbnV0ZXM7CisJdV9pbnQ4X3QgcmVwbHlfcGF0aF9yZXE7CisJdV9pbnQ4X3Qgc3RhdHVzX3JlcF9yZXE7CisJdV9pbnQ4X3QgdWRfaGRyX2luZDsKKwl1X2ludDhfdCBwcm90b2NvbF9pZDsKKwl1X2ludDhfdCBkYXRhX2NvZGluZ19zY2hlbWU7CisJdV9pbnQ4X3QgbXNnX3JlZjsKKwljaGFyIGRlc3RfYWRkclsyMCsxXTsJLyogREEgTFYgaXMgMTIgYnl0ZXMgbWF4LCBpLmUuIDEwIGJ5dGVzCisJCQkJICogQkNEID09IDIwIGJ5dGVzIHN0cmluZyAqLworCXVfaW50OF90IHVzZXJfZGF0YV9sZW47CisJdV9pbnQ4X3QgdXNlcl9kYXRhW1NNU19URVhUX1NJWkVdOworCisJY2hhciB0ZXh0W1NNU19URVhUX1NJWkVdOworfTsKKworCitzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbV9uZXR3b3JrX2luaXQodV9pbnQxNl90IGNvdW50cnlfY29kZSwgdV9pbnQxNl90IG5ldHdvcmtfY29kZSwKKwkJCQkgICAgIGludCAoKm1uY2NfcmVjdikoc3RydWN0IGdzbV9uZXR3b3JrICosIGludCwgdm9pZCAqKSk7CitzdHJ1Y3QgZ3NtX2J0cyAqZ3NtX2J0c19hbGxvYyhzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgZW51bSBnc21fYnRzX3R5cGUgdHlwZSwKKwkJCSAgICAgIHVfaW50OF90IHRzYywgdV9pbnQ4X3QgYnNpYyk7CitzdHJ1Y3QgZ3NtX2J0c190cnggKmdzbV9idHNfdHJ4X2FsbG9jKHN0cnVjdCBnc21fYnRzICpidHMpOworaW50IGdzbV9zZXRfYnRzX3R5cGUoc3RydWN0IGdzbV9idHMgKmJ0cywgZW51bSBnc21fYnRzX3R5cGUgdHlwZSk7CisKK3N0cnVjdCBnc21fYnRzICpnc21fYnRzX251bShzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgaW50IG51bSk7CisKKy8qIEdldCByZWZlcmVuY2UgdG8gYSBuZWlnaGJvciBjZWxsIG9uIGEgZ2l2ZW4gQkNDSCBBUkZDTiAqLworc3RydWN0IGdzbV9idHMgKmdzbV9idHNfbmVpZ2hib3IoY29uc3Qgc3RydWN0IGdzbV9idHMgKmJ0cywKKwkJCQkgdV9pbnQxNl90IGFyZmNuLCB1X2ludDhfdCBic2ljKTsKKworc3RydWN0IGdzbV9idHNfdHJ4ICpnc21fYnRzX3RyeF9udW0oc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IG51bSk7CisKK2NvbnN0IGNoYXIgKmdzbV9wY2hhbl9uYW1lKGVudW0gZ3NtX3BoeXNfY2hhbl9jb25maWcgYyk7CitlbnVtIGdzbV9waHlzX2NoYW5fY29uZmlnIGdzbV9wY2hhbl9wYXJzZShjb25zdCBjaGFyICpuYW1lKTsKK2NvbnN0IGNoYXIgKmdzbV9sY2hhbnRfbmFtZShlbnVtIGdzbV9jaGFuX3QgYyk7Citjb25zdCBjaGFyICpnc21fY2hyZXFfbmFtZShlbnVtIGdzbV9jaHJlcV9yZWFzb25fdCBjKTsKK2NoYXIgKmdzbV90cnhfbmFtZShzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCk7CitjaGFyICpnc21fdHNfbmFtZShzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzKTsKK2NoYXIgKmdzbV9sY2hhbl9uYW1lKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKTsKK2NvbnN0IGNoYXIgKmdzbV9sY2hhbnNfbmFtZShlbnVtIGdzbV9sY2hhbl9zdGF0ZSBzKTsKKworZW51bSBnc21fZTFfZXZlbnQgeworCUVWVF9FMV9OT05FLAorCUVWVF9FMV9URUlfVVAsCisJRVZUX0UxX1RFSV9ETiwKK307CisKK3ZvaWQgc2V0X3RzX2UxbGluayhzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzLCB1X2ludDhfdCBlMV9uciwKKwkJICAgdV9pbnQ4X3QgZTFfdHMsIHVfaW50OF90IGUxX3RzX3NzKTsKK2VudW0gZ3NtX2J0c190eXBlIHBhcnNlX2J0c3R5cGUoY29uc3QgY2hhciAqYXJnKTsKK2NvbnN0IGNoYXIgKmJ0c3R5cGUyc3RyKGVudW0gZ3NtX2J0c190eXBlIHR5cGUpOworc3RydWN0IGdzbV9idHNfdHJ4ICpnc21fYnRzX3RyeF9ieV9ucihzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgbnIpOworc3RydWN0IGdzbV9idHMgKmdzbV9idHNfYnlfbGFjKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCB1bnNpZ25lZCBpbnQgbGFjLAorCQkJCXN0cnVjdCBnc21fYnRzICpzdGFydF9idHMpOworCitleHRlcm4gdm9pZCAqdGFsbF9ic2NfY3R4OworZXh0ZXJuIGludCBpcGFjY19ydHBfZGlyZWN0OworCitzdGF0aWMgaW5saW5lIGludCBpc19pcGFjY2Vzc19idHMoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlzd2l0Y2ggKGJ0cy0+dHlwZSkgeworCWNhc2UgR1NNX0JUU19UWVBFX05BTk9CVFM6CisJCXJldHVybiAxOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfc2llbWVuc19idHMoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlzd2l0Y2ggKGJ0cy0+dHlwZSkgeworCWNhc2UgR1NNX0JUU19UWVBFX0JTMTE6CisJCXJldHVybiAxOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCisKK2VudW0gZ3NtX2F1dGhfcG9saWN5IGdzbV9hdXRoX3BvbGljeV9wYXJzZShjb25zdCBjaGFyICphcmcpOworY29uc3QgY2hhciAqZ3NtX2F1dGhfcG9saWN5X25hbWUoZW51bSBnc21fYXV0aF9wb2xpY3kgcG9saWN5KTsKKworZW51bSBycmxwX21vZGUgcnJscF9tb2RlX3BhcnNlKGNvbnN0IGNoYXIgKmFyZyk7Citjb25zdCBjaGFyICpycmxwX21vZGVfbmFtZShlbnVtIHJybHBfbW9kZSBtb2RlKTsKKwordm9pZCBnc21fdHJ4X2xvY2tfcmYoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIGludCBsb2NrZWQpOworCisvKiBBIHBhcnNlZCBHUFJTIHJvdXRpbmcgYXJlYSAqLworc3RydWN0IGdwcnNfcmFfaWQgeworCXVfaW50MTZfdAltbmM7CisJdV9pbnQxNl90CW1jYzsKKwl1X2ludDE2X3QJbGFjOworCXVfaW50OF90CXJhYzsKK307CisKK2ludCBnc200OF9yYV9pZF9ieV9idHModV9pbnQ4X3QgKmJ1Ziwgc3RydWN0IGdzbV9idHMgKmJ0cyk7Cit2b2lkIGdwcnNfcmFfaWRfYnlfYnRzKHN0cnVjdCBncHJzX3JhX2lkICpyYWlkLCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK3N0cnVjdCBnc21fbWVhc19yZXAgKmxjaGFuX25leHRfbWVhc19yZXAoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pOworCitpbnQgZ3NtX2J0c19tb2RlbF9yZWdpc3RlcihzdHJ1Y3QgZ3NtX2J0c19tb2RlbCAqbW9kZWwpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV9zdWJzY3JpYmVyLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9nc21fc3Vic2NyaWJlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NTM5OTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9nc21fc3Vic2NyaWJlci5oCkBAIC0wLDAgKzEsOTUgQEAKKyNpZm5kZWYgX0dTTV9TVUJTQ1JfSAorI2RlZmluZSBfR1NNX1NVQlNDUl9ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlICJnc21fZGF0YS5oIgorI2luY2x1ZGUgPG9zbW9jb3JlL2xpbnV4bGlzdC5oPgorCisjZGVmaW5lIEdTTV9JTUVJX0xFTkdUSCAxNworI2RlZmluZSBHU01fSU1TSV9MRU5HVEggMTcKKyNkZWZpbmUgR1NNX05BTUVfTEVOR1RIIDEyOAorCisjZGVmaW5lIEdTTV9FWFRFTlNJT05fTEVOR1RIIDE1IC8qIE1TSVNETiBjYW4gb25seSBiZSAxNSBkaWdpdHMgbGVuZ3RoICovCisjZGVmaW5lIEdTTV9NSU5fRVhURU4gMjAwMDAKKyNkZWZpbmUgR1NNX01BWF9FWFRFTiA0OTk5OQorCisvKiByZXNlcnZlZCBhY2NvcmRpbmcgdG8gR1NNIDAzLjAzIMKnIDIuNCAqLworI2RlZmluZSBHU01fUkVTRVJWRURfVE1TSSAgIDB4RkZGRkZGRkYKKworCisjZGVmaW5lIEdTTV9TVUJTQ1JJQkVSX0ZJUlNUX0NPTlRBQ1QJMHgwMDAwMDAwMQorI2RlZmluZSB0bXNpX2Zyb21fc3RyaW5nKHN0cikgc3RydG91bChzdHIsIE5VTEwsIDEwKQorCitzdHJ1Y3QgZ3NtX2VxdWlwbWVudCB7CisJbG9uZyBsb25nIHVuc2lnbmVkIGludCBpZDsKKwljaGFyIGltZWlbR1NNX0lNRUlfTEVOR1RIXTsKKwljaGFyIG5hbWVbR1NNX05BTUVfTEVOR1RIXTsKKworCXN0cnVjdCBnc200OF9jbGFzc21hcmsxIGNsYXNzbWFyazE7CisJdV9pbnQ4X3QgY2xhc3NtYXJrMl9sZW47CisJdV9pbnQ4X3QgY2xhc3NtYXJrMlszXTsKKwl1X2ludDhfdCBjbGFzc21hcmszX2xlbjsKKwl1X2ludDhfdCBjbGFzc21hcmszWzE0XTsKK307CisKK3N0cnVjdCBnc21fc3Vic2NyaWJlciB7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQ7CisJbG9uZyBsb25nIHVuc2lnbmVkIGludCBpZDsKKwljaGFyIGltc2lbR1NNX0lNU0lfTEVOR1RIXTsKKwl1X2ludDMyX3QgdG1zaTsKKwl1X2ludDE2X3QgbGFjOworCWNoYXIgbmFtZVtHU01fTkFNRV9MRU5HVEhdOworCWNoYXIgZXh0ZW5zaW9uW0dTTV9FWFRFTlNJT05fTEVOR1RIXTsKKwlpbnQgYXV0aG9yaXplZDsKKworCS8qIFRlbXBvcmFyeSBmaWVsZCB3aGljaCBpcyBub3Qgc3RvcmVkIGluIHRoZSBEQi9ITFIgKi8KKwl1X2ludDMyX3QgZmxhZ3M7CisKKwkvKiBFdmVyeSB1c2VyIGNhbiBvbmx5IGhhdmUgb25lIGVxdWlwbWVudCBpbiB1c2UgYXQgYW55IGdpdmVuCisJICogcG9pbnQgaW4gdGltZSAqLworCXN0cnVjdCBnc21fZXF1aXBtZW50IGVxdWlwbWVudDsKKworCS8qIGZvciBpbnRlcm5hbCBtYW5hZ2VtZW50ICovCisJaW50IHVzZV9jb3VudDsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBlbnRyeTsKKworCS8qIHBlbmRpbmcgcmVxdWVzdHMgKi8KKwlpbnQgaW5fY2FsbGJhY2s7CisJc3RydWN0IGxsaXN0X2hlYWQgcmVxdWVzdHM7Cit9OworCitlbnVtIGdzbV9zdWJzY3JpYmVyX2ZpZWxkIHsKKwlHU01fU1VCU0NSSUJFUl9JTVNJLAorCUdTTV9TVUJTQ1JJQkVSX1RNU0ksCisJR1NNX1NVQlNDUklCRVJfRVhURU5TSU9OLAorCUdTTV9TVUJTQ1JJQkVSX0lELAorfTsKKworZW51bSBnc21fc3Vic2NyaWJlcl91cGRhdGVfcmVhc29uIHsKKwlHU01fU1VCU0NSSUJFUl9VUERBVEVfQVRUQUNIRUQsCisJR1NNX1NVQlNDUklCRVJfVVBEQVRFX0RFVEFDSEVELAorCUdTTV9TVUJTQ1JJQkVSX1VQREFURV9FUVVJUE1FTlQsCit9OworCitzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcl9nZXQoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpOworc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JfcHV0KHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKTsKK3N0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyX2dldF9ieV90bXNpKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LAorCQkJCQkgIHVfaW50MzJfdCB0bXNpKTsKK3N0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyX2dldF9ieV9pbXNpKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LAorCQkJCQkgIGNvbnN0IGNoYXIgKmltc2kpOworc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JfZ2V0X2J5X2V4dGVuc2lvbihzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwKKwkJCQkJICAgICAgIGNvbnN0IGNoYXIgKmV4dCk7CitzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcl9nZXRfYnlfaWQoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsCisJCQkJCXVuc2lnbmVkIGxvbmcgbG9uZyBpZCk7CitpbnQgc3Vic2NyX3VwZGF0ZShzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnMsIHN0cnVjdCBnc21fYnRzICpidHMsIGludCByZWFzb24pOwordm9pZCBzdWJzY3JfcHV0X2NoYW5uZWwoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pOwordm9pZCBzdWJzY3JfZ2V0X2NoYW5uZWwoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSwgZ3NtX2NiZm4gKmNiZm4sIHZvaWQgKnBhcmFtKTsKKworY2hhciAqc3Vic2NyX25hbWUoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpOworCisvKiBpbnRlcm5hbCAqLworc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JfYWxsb2Modm9pZCk7CitleHRlcm4gc3RydWN0IGxsaXN0X2hlYWQgYWN0aXZlX3N1YnNjcmliZXJzOworCisjZW5kaWYgLyogX0dTTV9TVUJTQ1JfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvaGFuZG92ZXIuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2hhbmRvdmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFiMWIwNgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2hhbmRvdmVyLmgKQEAgLTAsMCArMSw4IEBACisjaWZuZGVmIF9IQU5ET1ZFUl9ICisjZGVmaW5lIF9IQU5ET1ZFUl9ICisvKiBIYW5kIG92ZXIgdGhlIHNwZWNpZmllZCBsb2dpY2FsIGNoYW5uZWwgdG8gdGhlIHNwZWNpZmllZCBuZXcgQlRTLgorICogVGhpcyBpcyB0aGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgdGhlIGFjdHVhbCBoYW5kb3ZlciBhbGdvcml0aG0sCisgKiBhZnRlciBpdCBoYXMgZGVjaWRlZCBpdCB3YW50cyB0byBpbml0aWF0ZSBITyB0byBhIHNwZWNpZmljIEJUUyAqLworaW50IGJzY19oYW5kb3Zlcl9zdGFydChzdHJ1Y3QgZ3NtX2xjaGFuICpvbGRfbGNoYW4sIHN0cnVjdCBnc21fYnRzICpidHMpOworCisjZW5kaWYgLyogX0hBTkRPVkVSX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2lwYWNjZXNzLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9pcGFjY2Vzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MjQ4YWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9pcGFjY2Vzcy5oCkBAIC0wLDAgKzEsMTA3IEBACisjaWZuZGVmIF9JUEFDQ0VTU19ICisjZGVmaW5lIF9JUEFDQ0VTU19ICisKKyNpbmNsdWRlICJlMV9pbnB1dC5oIgorI2luY2x1ZGUgPG9zbW9jb3JlL2xpbnV4bGlzdC5oPgorCisjZGVmaW5lIElQQV9UQ1BfUE9SVF9PTUwJMzAwMgorI2RlZmluZSBJUEFfVENQX1BPUlRfUlNMCTMwMDMKKworc3RydWN0IGlwYWNjZXNzX2hlYWQgeworCXVfaW50MTZfdCBsZW47CS8qIG5ldHdvcmsgYnl0ZSBvcmRlciAqLworCXVfaW50OF90IHByb3RvOworCXVfaW50OF90IGRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworZW51bSBpcGFjY2Vzc19wcm90byB7CisJSVBBQ19QUk9UT19SU0wJCT0gMHgwMCwKKwlJUEFDX1BST1RPX0lQQUNDRVNTCT0gMHhmZSwKKwlJUEFDX1BST1RPX1NDQ1AJCT0gMHhmZCwKKwlJUEFDX1BST1RPX09NTAkJPSAweGZmLAorfTsKKworZW51bSBpcGFjY2Vzc19tc2d0eXBlIHsKKwlJUEFDX01TR1RfUElORwkJPSAweDAwLAorCUlQQUNfTVNHVF9QT05HCQk9IDB4MDEsCisJSVBBQ19NU0dUX0lEX0dFVAk9IDB4MDQsCisJSVBBQ19NU0dUX0lEX1JFU1AJPSAweDA1LAorCUlQQUNfTVNHVF9JRF9BQ0sJPSAweDA2LAorfTsKKworZW51bSBpcGFjY2Vzc19pZF90YWdzIHsKKwlJUEFDX0lEVEFHX1NFUk5SCQk9IDB4MDAsCisJSVBBQ19JRFRBR19VTklUTkFNRQkJPSAweDAxLAorCUlQQUNfSURUQUdfTE9DQVRJT04xCQk9IDB4MDIsCisJSVBBQ19JRFRBR19MT0NBVElPTjIJCT0gMHgwMywKKwlJUEFDX0lEVEFHX0VRVUlQVkVSUwkJPSAweDA0LAorCUlQQUNfSURUQUdfU1dWRVJTSU9OCQk9IDB4MDUsCisJSVBBQ19JRFRBR19JUEFERFIJCT0gMHgwNiwKKwlJUEFDX0lEVEFHX01BQ0FERFIJCT0gMHgwNywKKwlJUEFDX0lEVEFHX1VOSVQJCQk9IDB4MDgsCit9OworCitpbnQgaXBhY2Nlc3NfY29ubmVjdChzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSwgc3RydWN0IHNvY2thZGRyX2luICpzYSk7CisKKy8qCisgKiBtZXRob2RzIGZvciBwYXJzaW5nIGFuZCBzZW5kaW5nIGEgbWVzc2FnZQorICovCitpbnQgaXBhY2Nlc3NfcmN2bXNnX2Jhc2Uoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGJzY19mZCAqYmZkKTsKK3N0cnVjdCBtc2diICppcGFjY2Vzc19yZWFkX21zZyhzdHJ1Y3QgYnNjX2ZkICpiZmQsIGludCAqZXJyb3IpOwordm9pZCBpcGFjY2Vzc19wcmVwZW5kX2hlYWRlcihzdHJ1Y3QgbXNnYiAqbXNnLCBpbnQgcHJvdG8pOworaW50IGlwYWNjZXNzX3NlbmRfaWRfYWNrKGludCBmZCk7CitpbnQgaXBhY2Nlc3Nfc2VuZF9pZF9yZXEoaW50IGZkKTsKKworaW50IGlwYWNjZXNzX2lkdGFnX3BhcnNlKHN0cnVjdCB0bHZfcGFyc2VkICpkZWMsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbik7CisKKworLyoKKyAqIEZpcm13YXJlIHNwZWNpZmljIGhlYWRlcgorICovCitzdHJ1Y3Qgc2RwX2Zpcm13YXJlIHsKKwljaGFyIG1hZ2ljWzRdOworCWNoYXIgbW9yZV9tYWdpY1syXTsKKwl1X2ludDE2X3QgbW9yZV9tb3JlX21hZ2ljOworCXVfaW50MzJfdCBoZWFkZXJfbGVuZ3RoOworCXVfaW50MzJfdCBmaWxlX2xlbmd0aDsKKwljaGFyIHN3X3BhcnRbMjBdOworCWNoYXIgdGV4dDFbNjRdOworCWNoYXIgdGltZVsxMl07CisJY2hhciBkYXRlWzE0XTsKKwljaGFyIHRleHQyWzEwXTsKKwljaGFyIHZlcnNpb25bMjBdOworCXVfaW50MTZfdCB0YWJsZV9vZmZzZXQ7CisJLyogc3R1ZmYgaSBkb24ndCBrbm93ICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3Qgc2RwX2hlYWRlcl9lbnRyeSB7CisJdV9pbnQxNl90IHNvbWV0aGluZzE7CisJY2hhciB0ZXh0MVs2NF07CisJY2hhciB0aW1lWzEyXTsKKwljaGFyIGRhdGVbMTRdOworCWNoYXIgdGV4dDJbMTBdOworCWNoYXIgdmVyc2lvblsyMF07CisJdV9pbnQzMl90IGxlbmd0aDsKKwl1X2ludDMyX3QgYWRkcjE7CisJdV9pbnQzMl90IGFkZHIyOworCXVfaW50MzJfdCBzdGFydDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBzZHBfaGVhZGVyX2l0ZW0geworCXN0cnVjdCBzZHBfaGVhZGVyX2VudHJ5IGhlYWRlcl9lbnRyeTsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBlbnRyeTsKKwlvZmZfdCBhYnNvbHV0ZV9vZmZzZXQ7Cit9OworCitzdHJ1Y3Qgc2RwX2hlYWRlciB7CisJc3RydWN0IHNkcF9maXJtd2FyZSBmaXJtd2FyZV9pbmZvOworCisJLyogZm9yIG1vcmVfbWFnaWMgYSBsaXN0IG9mIHNkcF9oZWFkZXJfZW50cnlfbGlzdCAqLworCXN0cnVjdCBsbGlzdF9oZWFkIGhlYWRlcl9saXN0OworCisJLyogdGhlIGVudHJ5IG9mIHRoZSBzZHBfaGVhZGVyICovCisJc3RydWN0IGxsaXN0X2hlYWQgZW50cnk7Cit9OworCitpbnQgaXBhY2Nlc3NfYW5hbHl6ZV9maWxlKGludCBmZCwgY29uc3QgdW5zaWduZWQgaW50IHN0X3NpemUsIGNvbnN0IHVuc2lnbmVkIGJhc2Vfb2Zmc2V0LCBzdHJ1Y3QgbGxpc3RfaGVhZCAqbGlzdCk7CisKKyNlbmRpZiAvKiBfSVBBQ0NFU1NfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvbWVhc19yZXAuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL21lYXNfcmVwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MyYzhkMQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL21lYXNfcmVwLmgKQEAgLTAsMCArMSw4NSBAQAorI2lmbmRlZiBfTUVBU19SRVBfSAorI2RlZmluZSBfTUVBU19SRVBfSAorCisjZGVmaW5lIE1SQ19GX1BST0NFU1NFRAkweDAwMDEKKworLyogZXh0cmFjdGVkIGZyb20gYSBMMyBtZWFzdXJlbWVudCByZXBvcnQgSUUgKi8KK3N0cnVjdCBnc21fbWVhc19yZXBfY2VsbCB7CisJdV9pbnQ4X3QgcnhsZXY7CisJdV9pbnQ4X3QgYnNpYzsKKwl1X2ludDhfdCBuZWlnaF9pZHg7CisJdV9pbnQxNl90IGFyZmNuOworCXVuc2lnbmVkIGludCBmbGFnczsKK307CisKKy8qIFJYIExldmVsIGFuZCBSWCBRdWFsaXR5ICovCitzdHJ1Y3QgZ3NtX3J4X2xldl9xdWFsIHsKKwl1X2ludDhfdCByeF9sZXY7CisJdV9pbnQ4X3QgcnhfcXVhbDsKK307CisKKy8qIHVuaWRpcmVjdGlvbmFsIG1lYXN1bXJlbWVudCByZXBvcnQgKi8KK3N0cnVjdCBnc21fbWVhc19yZXBfdW5pZGlyIHsKKwlzdHJ1Y3QgZ3NtX3J4X2xldl9xdWFsIGZ1bGw7CisJc3RydWN0IGdzbV9yeF9sZXZfcXVhbCBzdWI7Cit9OworCisjZGVmaW5lIE1FQVNfUkVQX0ZfVUxfRFRYCTB4MDEKKyNkZWZpbmUgTUVBU19SRVBfRl9ETF9WQUxJRAkweDAyCisjZGVmaW5lIE1FQVNfUkVQX0ZfQkExCQkweDA0CisjZGVmaW5lIE1FQVNfUkVQX0ZfRExfRFRYCTB4MDgKKyNkZWZpbmUgTUVBU19SRVBfRl9NU19UTwkweDEwCisjZGVmaW5lIE1FQVNfUkVQX0ZfTVNfTDEJMHgyMAorI2RlZmluZSBNRUFTX1JFUF9GX0ZQQwkJMHg0MAorCisvKiBwYXJzZWQgdXBsaW5rIGFuZCBkb3dubGluayBtZWFzdXJlbWVudCByZXN1bHQgKi8KK3N0cnVjdCBnc21fbWVhc19yZXAgeworCS8qIGJhY2stcG9pbnRlciB0byB0aGUgbG9naWNhbCBjaGFubmVsICovCisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW47CisKKwkvKiBudW1iZXIgb2YgdGhlIG1lYXN1cmVtZW50IHJlcG9ydCAqLworCXVfaW50OF90IG5yOworCS8qIGZsYWdzLCBzZWUgTUVBU19SRVBfRl8qICovCisJdW5zaWduZWQgaW50IGZsYWdzOworCisJLyogdXBsaW5rIGFuZCBkb3dubGluayByeGxldiwgcnhxdWFsOyBmdWxsIGFuZCBzdWIgKi8KKwlzdHJ1Y3QgZ3NtX21lYXNfcmVwX3VuaWRpciB1bDsKKwlzdHJ1Y3QgZ3NtX21lYXNfcmVwX3VuaWRpciBkbDsKKworCXVfaW50OF90IGJzX3Bvd2VyOworCXVfaW50OF90IG1zX3RpbWluZ19vZmZzZXQ7CisJc3RydWN0IHsKKwkJaW50OF90IHB3cjsJLyogTVMgcG93ZXIgaW4gZEJtICovCisJCXVfaW50OF90IHRhOwkvKiBNUyB0aW1pbmcgYWR2YW5jZSAqLworCX0gbXNfbDE7CisKKwkvKiBuZWlnaGJvciBtZWFzdXJlbWVudCByZXBvcnRzIGZvciB1cCB0byA2IGNlbGxzICovCisJaW50IG51bV9jZWxsOworCXN0cnVjdCBnc21fbWVhc19yZXBfY2VsbCBjZWxsWzZdOworfTsKKworZW51bSBtZWFzX3JlcF9maWVsZCB7CisJTUVBU19SRVBfRExfUlhMRVZfRlVMTCwKKwlNRUFTX1JFUF9ETF9SWExFVl9TVUIsCisJTUVBU19SRVBfRExfUlhRVUFMX0ZVTEwsCisJTUVBU19SRVBfRExfUlhRVUFMX1NVQiwKKwlNRUFTX1JFUF9VTF9SWExFVl9GVUxMLAorCU1FQVNfUkVQX1VMX1JYTEVWX1NVQiwKKwlNRUFTX1JFUF9VTF9SWFFVQUxfRlVMTCwKKwlNRUFTX1JFUF9VTF9SWFFVQUxfU1VCLAorfTsKKworLyogb2J0YWluIGFuIGF2ZXJhZ2Ugb3ZlciB0aGUgbGFzdCAnbnVtJyBmaWVsZHMgaW4gdGhlIG1lYXMgcmVwcyAqLworaW50IGdldF9tZWFzX3JlcF9hdmcoY29uc3Qgc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sCisJCSAgICAgZW51bSBtZWFzX3JlcF9maWVsZCBmaWVsZCwgdW5zaWduZWQgaW50IG51bSk7CisKKy8qIENoZWNrIGlmIE4gb3V0IG9mIE0gbGFzdCB2YWx1ZXMgZm9yIEZJRUxEIGFyZSA+PSBiZCAqLworaW50IG1lYXNfcmVwX25fb3V0X29mX21fYmUoY29uc3Qgc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sCisJCQllbnVtIG1lYXNfcmVwX2ZpZWxkIGZpZWxkLAorCQkJdW5zaWduZWQgaW50IG4sIHVuc2lnbmVkIGludCBtLCBpbnQgYmUpOworCit1bnNpZ25lZCBpbnQgY2FsY19pbml0aWFsX2lkeCh1bnNpZ25lZCBpbnQgYXJyYXlfc2l6ZSwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBtZWFzX3JlcF9pZHgsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgbnVtX3ZhbHVlcyk7CisKKyNlbmRpZiAvKiBfTUVBU19SRVBfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvbWdjcC5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvbWdjcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZTgwMGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9tZ2NwLmgKQEAgLTAsMCArMSwxMjIgQEAKKy8qIEEgTWVkaWEgR2F0ZXdheSBDb250cm9sIFByb3RvY29sIE1lZGlhIEdhdGV3YXk6IFJGQyAzNDM1ICovCisKKy8qCisgKiAoQykgMjAwOS0yMDEwIGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIChDKSAyMDA5LTIwMTAgYnkgT24tV2F2ZXMKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaWZuZGVmIE9QRU5CU0NfTUdDUF9ICisjZGVmaW5lIE9QRU5CU0NfTUdDUF9ICisKKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2RlZmluZSBSVFBfUE9SVF9ERUZBVUxUIDQwMDAKKworLyoqCisgKiBDYWxjdWxhdGUgdGhlIFJUUCBhdWRpbyBwb3J0IGZvciB0aGUgZ2l2ZW4gbXVsdGlwbGV4CisgKiBhbmQgdGhlIGRpcmVjdGlvbi4gVGhpcyBhbGxvd3MgYSBzZW1pIHN0YXRpYyBlbmRwb2ludAorICogdG8gcG9ydCBjYWxjdWxhdGlvbiByZW1vdmluZyB0aGUgbmVlZCBmb3IgdGhlIEJTQworICogYW5kIHRoZSBNZWRpYUdhdGV3YXkgdG8gY29tbXVuaWNhdGUuCisgKgorICogUG9ydCB1c2FnZSBleHBsYWluZWQ6CisgKiAgICAgICBiYXNlICsgKG11bHRpcGxleCAqIDIpICsgMCA9PSBsb2NhbCBwb3J0IHRvIHdhaXQgZm9yIG5ldHdvcmsgcGFja2V0cworICogICAgICAgYmFzZSArIChtdWx0aXBsZXggKiAyKSArIDEgPT0gbG9jYWwgcG9ydCBmb3IgcnRjcAorICoKKyAqIFRoZSBhYm92ZSBwb3J0IHdpbGwgcmVjZWl2ZSBwYWNrZXRzIGZyb20gdGhlIEJUUyB0aGF0IG5lZWQKKyAqIHRvIGJlIHBhdGNoZWQgYW5kIGZvcndhcmRlZCB0byB0aGUgbmV0d29yay4KKyAqIFRoZSBhYm92ZSBwb3J0IHdpbGwgcmVjZWl2ZSBwYWNrZXRzIGZyb20gdGhlIG5ldHdvcmsgdGhhdAorICogbmVlZCB0byBiZSBwYXRjaGVkIGFuZCBmb3J3YXJkZWQgdG8gdGhlIEJUUy4KKyAqCisgKiBXZSBhc3N1bWUgdG8gaGF2ZSBhIHN0YXRpYyBCVFMgSVAgYWRkcmVzcyBzbyB3ZSBjYW4gZGlmZmVyZW50aWF0ZQorICogbmV0d29yayBhbmQgQlRTLgorICoKKyAqLworc3RhdGljIGlubGluZSBpbnQgcnRwX2NhbGN1bGF0ZV9wb3J0KGludCBtdWx0aXBsZXgsIGludCBiYXNlKQoreworCXJldHVybiBiYXNlICsgKG11bHRpcGxleCAqIDIpOworfQorCisKKy8qCisgKiBIYW5kbGluZyBvZiBNR0NQIEVuZHBvaW50cyBhbmQgdGhlIE1HQ1AgQ29uZmlnCisgKi8KK3N0cnVjdCBtZ2NwX2VuZHBvaW50Oworc3RydWN0IG1nY3BfY29uZmlnOworCisjZGVmaW5lIE1HQ1BfRU5EUF9DUkNYIDEKKyNkZWZpbmUgTUdDUF9FTkRQX0RMQ1ggMgorI2RlZmluZSBNR0NQX0VORFBfTURDWCAzCisKKy8qCisgKiB3aGF0IHRvIGRvIHdpdGggdGhlIG1zZz8KKyAqCS0gY29udGludWUgYXMgdXN1YWw/CisgKgktIHJlamVjdCBhbmQgc2VuZCBhIGZhaWx1cmUgY29kZT8KKyAqCS0gZGVmZXI/IGRvIG5vdCBzZW5kIGFueXRoaW5nCisgKi8KKyNkZWZpbmUgTUdDUF9QT0xJQ1lfQ09OVAk0CisjZGVmaW5lIE1HQ1BfUE9MSUNZX1JFSkVDVAk1CisjZGVmaW5lIE1HQ1BfUE9MSUNZX0RFRkVSCTYKKwordHlwZWRlZiBpbnQgKCptZ2NwX2NoYW5nZSkoc3RydWN0IG1nY3BfY29uZmlnICpjZmcsIGludCBlbmRwb2ludCwgaW50IHN0YXRlLCBpbnQgbG9jYWxfcnRwKTsKK3R5cGVkZWYgaW50ICgqbWdjcF9wb2xpY3kpKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnLCBpbnQgZW5kcG9pbnQsIGludCBzdGF0ZSwgY29uc3QgY2hhciAqdHJhbnNhY3Rpb19pZCk7CisKK3N0cnVjdCBtZ2NwX2NvbmZpZyB7CisJaW50IHNvdXJjZV9wb3J0OworCWNoYXIgKmxvY2FsX2lwOworCWNoYXIgKnNvdXJjZV9hZGRyOworCXVuc2lnbmVkIGludCBudW1iZXJfZW5kcG9pbnRzOworCWNoYXIgKmJ0c19pcDsKKworCXN0cnVjdCBpbl9hZGRyIGJ0c19pbjsKKwljaGFyICphdWRpb19uYW1lOworCWludCBhdWRpb19wYXlsb2FkOworCWludCBhdWRpb19sb29wOworCWludCBlYXJseV9iaW5kOworCWludCBydHBfYmFzZV9wb3J0OworCisJY2hhciAqZm9yd2FyZF9pcDsKKwlpbnQgZm9yd2FyZF9wb3J0OworCisJbWdjcF9jaGFuZ2UgY2hhbmdlX2NiOworCW1nY3BfcG9saWN5IHBvbGljeV9jYjsKKwl2b2lkICpkYXRhOworCisJc3RydWN0IG1nY3BfZW5kcG9pbnQgKmVuZHBvaW50czsKKwl1bnNpZ25lZCBpbnQgbGFzdF9jYWxsX2lkOworfTsKKworLyogY29uZmlnIG1hbmFnZW1lbnQgKi8KK3N0cnVjdCBtZ2NwX2NvbmZpZyAqbWdjcF9jb25maWdfYWxsb2Modm9pZCk7CitpbnQgbWdjcF9wYXJzZV9jb25maWcoY29uc3QgY2hhciAqY29uZmlnX2ZpbGUsIHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnKTsKK2ludCBtZ2NwX3Z0eV9pbml0KHZvaWQpOworaW50IG1nY3BfZW5kcG9pbnRzX2FsbG9jYXRlKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnKTsKK2ludCBtZ2NwX2JpbmRfcnRwX3BvcnQoc3RydWN0IG1nY3BfZW5kcG9pbnQgKmVuZHAsIGludCBydHBfcG9ydCk7Cit2b2lkIG1nY3BfZnJlZV9lbmRwKHN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwKTsKKworLyoKKyAqIGZvcm1hdCBoZWxwZXIgZnVuY3Rpb25zCisgKi8KK3N0cnVjdCBtc2diICptZ2NwX2hhbmRsZV9tZXNzYWdlKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnLCBzdHJ1Y3QgbXNnYiAqbXNnKTsKK3N0cnVjdCBtc2diICptZ2NwX2NyZWF0ZV9yc2lwKHZvaWQpOworc3RydWN0IG1zZ2IgKm1nY3BfY3JlYXRlX3Jlc3BvbnNlX3dpdGhfZGF0YShpbnQgY29kZSwgY29uc3QgY2hhciAqbXNnLCBjb25zdCBjaGFyICp0cmFucywgY29uc3QgY2hhciAqZGF0YSk7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9tZ2NwX2ludGVybmFsLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9tZ2NwX2ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBkMGNhNgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL21nY3BfaW50ZXJuYWwuaApAQCAtMCwwICsxLDY0IEBACisvKiBNR0NQIFByaXZhdGUgRGF0YSAqLworCisvKgorICogKEMpIDIwMDktMjAxMCBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiAoQykgMjAwOS0yMDEwIGJ5IE9uLVdhdmVzCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBPUEVOQlNDX01HQ1BfREFUQV9ICisjZGVmaW5lIE9QRU5CU0NfTUdDUF9EQVRBX0gKKworI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorCisjZGVmaW5lIENJX1VOVVNFRCAwCisKK3N0cnVjdCBtZ2NwX2VuZHBvaW50IHsKKwlpbnQgY2k7CisJY2hhciAqY2FsbGlkOworCWNoYXIgKmxvY2FsX29wdGlvbnM7CisJaW50IGNvbm5fbW9kZTsKKworCWludCBidHNfcGF5bG9hZF90eXBlOworCWludCBuZXRfcGF5bG9hZF90eXBlOworCisJLyogdGhlIGxvY2FsIHJ0cCBwb3J0IHdlIGFyZSBiaW5kaW5nIHRvICovCisJaW50IHJ0cF9wb3J0OworCisJLyoKKwkgKiBSVFAgbWFuZ2xpbmc6CisJICogIC0gd2UgZ2V0IFJUUCBhbmQgUlRDUCB0byB1cyBhbmQgbmVlZCB0byBmb3J3YXJkIHRvIHRoZSBCVFMKKwkgKiAgLSB3ZSBnZXQgUlRQIGFuZCBSVENQIGZyb20gdGhlIEJUUyBhbmQgZm9yd2FyZCB0byB0aGUgbmV0d29yaworCSAqLworCXN0cnVjdCBic2NfZmQgbG9jYWxfcnRwOworCXN0cnVjdCBic2NfZmQgbG9jYWxfcnRjcDsKKworCXN0cnVjdCBpbl9hZGRyIHJlbW90ZTsKKwlzdHJ1Y3QgaW5fYWRkciBidHM7CisKKwkvKiBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgKi8KKwlpbnQgbmV0X3J0cCwgbmV0X3J0Y3A7CisJaW50IGJ0c19ydHAsIGJ0c19ydGNwOworCisJLyogYmFja3BvaW50ZXIgKi8KKwlzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZzsKK307CisKKyNkZWZpbmUgRU5EUE9JTlRfTlVNQkVSKGVuZHApIGFicyhlbmRwIC0gZW5kcC0+Y2ZnLT5lbmRwb2ludHMpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvbWlzZG4uaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL21pc2RuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMzOGRlNwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL21pc2RuLmgKQEAgLTAsMCArMSwyOSBAQAorLyogKEMpIDIwMDggYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaWZuZGVmIE1JU0ROX0gKKyNkZWZpbmUgTUlTRE5fSAorCisjaW5jbHVkZSAiZTFfaW5wdXQuaCIKKworaW50IG1pX3NldHVwKGludCBjYXJkbnIsICBzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSwgaW50IHJlbGVhc2VfbDIpOworaW50IF9hYmlzX25tX3NlbmRtc2coc3RydWN0IG1zZ2IgKm1zZyk7CitpbnQgbWlfZTFfbGluZV91cGRhdGUoc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL21uY2MuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL21uY2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjgzMzlhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvbW5jYy5oCkBAIC0wLDAgKzEsMTU5IEBACisvKiBHU00gTW9iaWxlIFJhZGlvIEludGVyZmFjZSBMYXllciAzIG1lc3NhZ2VzIG9uIHRoZSBBLWJpcyBpbnRlcmZhY2UgCisgKiAzR1BQIFRTIDA0LjA4IHZlcnNpb24gNy4yMS4wIFJlbGVhc2UgMTk5OCAvIEVUU0kgVFMgMTAwIDk0MCBWNy4yMS4wICovCisKKy8qIChDKSAyMDA4LTIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDA4LCAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBfTU5DQ19ICisjZGVmaW5lIF9NTkNDX0gKKworI2luY2x1ZGUgPG9zbW9jb3JlL2xpbnV4bGlzdC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL21uY2MuaD4KKworLyogT25lIGVuZCBvZiBhIGNhbGwgKi8KK3N0cnVjdCBnc21fY2FsbCB7CisJc3RydWN0IGxsaXN0X2hlYWQgZW50cnk7CisKKwkvKiBuZXR3b3JrIGhhbmRsZSAqLworCXZvaWQgKm5ldDsKKworCS8qIHRoZSAnbG9jYWwnIHRyYW5zYWN0aW9uICovCisJdV9pbnQzMl90IGNhbGxyZWY7CisJLyogdGhlICdyZW1vdGUnIHRyYW5zYWN0aW9uICovCisJdV9pbnQzMl90IHJlbW90ZV9yZWY7Cit9OworCisjZGVmaW5lIE1OQ0NfU0VUVVBfUkVRCQkweDAxMDEKKyNkZWZpbmUgTU5DQ19TRVRVUF9JTkQJCTB4MDEwMgorI2RlZmluZSBNTkNDX1NFVFVQX1JTUAkJMHgwMTAzCisjZGVmaW5lIE1OQ0NfU0VUVVBfQ05GCQkweDAxMDQKKyNkZWZpbmUgTU5DQ19TRVRVUF9DT01QTF9SRVEJMHgwMTA1CisjZGVmaW5lIE1OQ0NfU0VUVVBfQ09NUExfSU5ECTB4MDEwNgorLyogTU5DQ19SRUpfKiBpcyBwZXJmb21lZCB2aWEgTU5DQ19SRUxfKiAqLworI2RlZmluZSBNTkNDX0NBTExfQ09ORl9JTkQJMHgwMTA3CisjZGVmaW5lIE1OQ0NfQ0FMTF9QUk9DX1JFUQkweDAxMDgKKyNkZWZpbmUgTU5DQ19QUk9HUkVTU19SRVEJMHgwMTA5CisjZGVmaW5lIE1OQ0NfQUxFUlRfUkVRCQkweDAxMGEKKyNkZWZpbmUgTU5DQ19BTEVSVF9JTkQJCTB4MDEwYgorI2RlZmluZSBNTkNDX05PVElGWV9SRVEJCTB4MDEwYworI2RlZmluZSBNTkNDX05PVElGWV9JTkQJCTB4MDEwZAorI2RlZmluZSBNTkNDX0RJU0NfUkVRCQkweDAxMGUKKyNkZWZpbmUgTU5DQ19ESVNDX0lORAkJMHgwMTBmCisjZGVmaW5lIE1OQ0NfUkVMX1JFUQkJMHgwMTEwCisjZGVmaW5lIE1OQ0NfUkVMX0lORAkJMHgwMTExCisjZGVmaW5lIE1OQ0NfUkVMX0NORgkJMHgwMTEyCisjZGVmaW5lIE1OQ0NfRkFDSUxJVFlfUkVRCTB4MDExMworI2RlZmluZSBNTkNDX0ZBQ0lMSVRZX0lORAkweDAxMTQKKyNkZWZpbmUgTU5DQ19TVEFSVF9EVE1GX0lORAkweDAxMTUKKyNkZWZpbmUgTU5DQ19TVEFSVF9EVE1GX1JTUAkweDAxMTYKKyNkZWZpbmUgTU5DQ19TVEFSVF9EVE1GX1JFSgkweDAxMTcKKyNkZWZpbmUgTU5DQ19TVE9QX0RUTUZfSU5ECTB4MDExOAorI2RlZmluZSBNTkNDX1NUT1BfRFRNRl9SU1AJMHgwMTE5CisjZGVmaW5lIE1OQ0NfTU9ESUZZX1JFUQkJMHgwMTFhCisjZGVmaW5lIE1OQ0NfTU9ESUZZX0lORAkJMHgwMTFiCisjZGVmaW5lIE1OQ0NfTU9ESUZZX1JTUAkJMHgwMTFjCisjZGVmaW5lIE1OQ0NfTU9ESUZZX0NORgkJMHgwMTFkCisjZGVmaW5lIE1OQ0NfTU9ESUZZX1JFSgkJMHgwMTFlCisjZGVmaW5lIE1OQ0NfSE9MRF9JTkQJCTB4MDExZgorI2RlZmluZSBNTkNDX0hPTERfQ05GCQkweDAxMjAKKyNkZWZpbmUgTU5DQ19IT0xEX1JFSgkJMHgwMTIxCisjZGVmaW5lIE1OQ0NfUkVUUklFVkVfSU5ECTB4MDEyMgorI2RlZmluZSBNTkNDX1JFVFJJRVZFX0NORgkweDAxMjMKKyNkZWZpbmUgTU5DQ19SRVRSSUVWRV9SRUoJMHgwMTI0CisjZGVmaW5lIE1OQ0NfVVNFUklORk9fUkVRCTB4MDEyNQorI2RlZmluZSBNTkNDX1VTRVJJTkZPX0lORAkweDAxMjYKKyNkZWZpbmUgTU5DQ19SRUpfUkVRCQkweDAxMjcKKyNkZWZpbmUgTU5DQ19SRUpfSU5ECQkweDAxMjgKKworI2RlZmluZSBNTkNDX0JSSURHRQkJMHgwMjAwCisjZGVmaW5lIE1OQ0NfRlJBTUVfUkVDVgkJMHgwMjAxCisjZGVmaW5lIE1OQ0NfRlJBTUVfRFJPUAkJMHgwMjAyCisjZGVmaW5lIE1OQ0NfTENIQU5fTU9ESUZZCTB4MDIwMworCisjZGVmaW5lIEdTTV9UQ0hGX0ZSQU1FCQkweDAzMDAKKyNkZWZpbmUgR1NNX1RDSEZfRlJBTUVfRUZSCTB4MDMwMQorCisjZGVmaW5lIEdTTV9NQVhfRkFDSUxJVFkJMTI4CisjZGVmaW5lIEdTTV9NQVhfU1NWRVJTSU9OCTEyOAorI2RlZmluZSBHU01fTUFYX1VTRVJVU0VSCTEyOAorCisjZGVmaW5lCU1OQ0NfRl9CRUFSRVJfQ0FQCTB4MDAwMQorI2RlZmluZSBNTkNDX0ZfQ0FMTEVECQkweDAwMDIKKyNkZWZpbmUgTU5DQ19GX0NBTExJTkcJCTB4MDAwNAorI2RlZmluZSBNTkNDX0ZfUkVESVJFQ1RJTkcJMHgwMDA4CisjZGVmaW5lIE1OQ0NfRl9DT05ORUNURUQJMHgwMDEwCisjZGVmaW5lIE1OQ0NfRl9DQVVTRQkJMHgwMDIwCisjZGVmaW5lIE1OQ0NfRl9VU0VSVVNFUgkJMHgwMDQwCisjZGVmaW5lIE1OQ0NfRl9QUk9HUkVTUwkJMHgwMDgwCisjZGVmaW5lIE1OQ0NfRl9FTUVSR0VOQ1kJMHgwMTAwCisjZGVmaW5lIE1OQ0NfRl9GQUNJTElUWQkJMHgwMjAwCisjZGVmaW5lIE1OQ0NfRl9TU1ZFUlNJT04JMHgwNDAwCisjZGVmaW5lIE1OQ0NfRl9DQ0NBUAkJMHgwODAwCisjZGVmaW5lIE1OQ0NfRl9LRVlQQUQJCTB4MTAwMAorI2RlZmluZSBNTkNDX0ZfU0lHTkFMCQkweDIwMDAKKworc3RydWN0IGdzbV9tbmNjIHsKKwkvKiBjb250ZXh0IGJhc2VkIGluZm9ybWF0aW9uICovCisJdV9pbnQzMl90CW1zZ190eXBlOworCXVfaW50MzJfdAljYWxscmVmOworCisJLyogd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50ICovCisJdV9pbnQzMl90CWZpZWxkczsKKworCS8qIGRhdGEgZGVyaXZlZCBpbmZvcm1hdGlvbnMgKE1OQ0NfRl8gYmFzZWQpICovCisJc3RydWN0IGdzbV9tbmNjX2JlYXJlcl9jYXAJYmVhcmVyX2NhcDsKKwlzdHJ1Y3QgZ3NtX21uY2NfbnVtYmVyCQljYWxsZWQ7CisJc3RydWN0IGdzbV9tbmNjX251bWJlcgkJY2FsbGluZzsKKwlzdHJ1Y3QgZ3NtX21uY2NfbnVtYmVyCQlyZWRpcmVjdGluZzsKKwlzdHJ1Y3QgZ3NtX21uY2NfbnVtYmVyCQljb25uZWN0ZWQ7CisJc3RydWN0IGdzbV9tbmNjX2NhdXNlCQljYXVzZTsKKwlzdHJ1Y3QgZ3NtX21uY2NfcHJvZ3Jlc3MJcHJvZ3Jlc3M7CisJc3RydWN0IGdzbV9tbmNjX3VzZXJ1c2VyCXVzZXJ1c2VyOworCXN0cnVjdCBnc21fbW5jY19mYWNpbGl0eQlmYWNpbGl0eTsKKwlzdHJ1Y3QgZ3NtX21uY2NfY2NjYXAJCWNjY2FwOworCXN0cnVjdCBnc21fbW5jY19zc3ZlcnNpb24Jc3N2ZXJzaW9uOworCXN0cnVjdAl7CisJCWludAkJc3VwOworCQlpbnQJCWludjsKKwl9IGNsaXI7CisJaW50CQlzaWduYWw7CisKKwkvKiBkYXRhIGRlcml2ZWQgaW5mb3JtYXRpb24sIG5vdCBNTkNDX0YgYmFzZWQgKi8KKwlpbnQJCWtleXBhZDsKKwlpbnQJCW1vcmU7CisJaW50CQlub3RpZnk7IC8qIDAuLjEyNyAqLworCWludAkJZW1lcmdlbmN5OworCWNoYXIJCWltc2lbMTZdOworCisJdW5zaWduZWQgY2hhcglsY2hhbl9tb2RlOworfTsKKworc3RydWN0IGdzbV9kYXRhX2ZyYW1lIHsKKwl1X2ludDMyX3QJbXNnX3R5cGU7CisJdV9pbnQzMl90CWNhbGxyZWY7CisJdW5zaWduZWQgY2hhcglkYXRhWzBdOworfTsKKworY2hhciAqZ2V0X21uY2NfbmFtZShpbnQgdmFsdWUpOworaW50IG1uY2NfcmVjdihzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgaW50IG1zZ190eXBlLCB2b2lkICphcmcpOwordm9pZCBtbmNjX3NldF9jYXVzZShzdHJ1Y3QgZ3NtX21uY2MgKmRhdGEsIGludCBsb2MsIGludCB2YWwpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL29wZW5ic2NkZWZpbmVzLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9vcGVuYnNjZGVmaW5lcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MmU1OTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9vcGVuYnNjZGVmaW5lcy5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qIAorICogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaWZuZGVmIE9QRU5CU0NERUZJTkVTX0gKKyNkZWZpbmUgT1BFTkJTQ0RFRklORVNfSAorCisjaWZkZWYgQlVJTERJTkdfT05fV0lORE9XUworICAgICNpZmRlZiBCVUlMRElOR19PUEVOQlNDCisgICAgICAgICNkZWZpbmUgQlNDX0FQSSBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyAgICAjZWxzZQorICAgICAgICAjZGVmaW5lIEJTQ19BUEkgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisgICAgI2VuZGlmCisjZWxzZQorICAgICNkZWZpbmUgQlNDX0FQSSBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvcGFnaW5nLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9wYWdpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2JkY2E5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvcGFnaW5nLmgKQEAgLTAsMCArMSw0NiBAQAorLyogUGFnaW5nIGhlbHBlciBhbmQgbWFuYWdlci4uLi4gKi8KKy8qIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaWZuZGVmIFBBR0lOR19ICisjZGVmaW5lIFBBR0lOR19ICisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL2xpbnV4bGlzdC5oPgorI2luY2x1ZGUgImdzbV9kYXRhLmgiCisjaW5jbHVkZSAiZ3NtX3N1YnNjcmliZXIuaCIKKyNpbmNsdWRlIDxvc21vY29yZS90aW1lci5oPgorCisvKiBjYWxsIG9uY2UgZm9yIGV2ZXJ5IGdzbV9idHMuLi4gKi8KK3ZvaWQgcGFnaW5nX2luaXQoc3RydWN0IGdzbV9idHMgKmJ0cyk7CisKKy8qIHNjaGVkdWxlIHBhZ2luZyByZXF1ZXN0ICovCitpbnQgcGFnaW5nX3JlcXVlc3Qoc3RydWN0IGdzbV9uZXR3b3JrICpuZXR3b3JrLCBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciwKKwkJICAgaW50IHR5cGUsIGdzbV9jYmZuICpjYmZuLCB2b2lkICpkYXRhKTsKKworLyogc3RvcCBwYWdpbmcgcmVxdWVzdHMgKi8KK3ZvaWQgcGFnaW5nX3JlcXVlc3Rfc3RvcChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciwKKwkJCSBzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbik7CisKKy8qIHVwZGF0ZSBwYWdpbmcgbG9hZCAqLwordm9pZCBwYWdpbmdfdXBkYXRlX2J1ZmZlcl9zcGFjZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDE2X3QpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3Jlc3Rfb2N0ZXRzLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9yZXN0X29jdGV0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNzJjMGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9yZXN0X29jdGV0cy5oCkBAIC0wLDAgKzEsMTIyIEBACisjaWZuZGVmIF9SRVNUX09DVEVUU19ICisjZGVmaW5lIF9SRVNUX09DVEVUU19ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8wOC5oPgorCisvKiBnZW5lcmF0ZSBTSTEgcmVzdCBvY3RldHMgKi8KK2ludCByZXN0X29jdGV0c19zaTEodV9pbnQ4X3QgKmRhdGEsIHVfaW50OF90ICpuY2hfcG9zKTsKKworc3RydWN0IGdzbTQ4X3NpX3NlbGVjdGlvbl9wYXJhbXMgeworCXVfaW50MTZfdCBwZW5hbHR5X3RpbWU6NSwKKwkJICB0ZW1wX29mZnM6MywKKwkJICBjZWxsX3Jlc2VsX29mZjo2LAorCQkgIGNicToxLAorCQkgIHByZXNlbnQ6MTsKK307CisKK3N0cnVjdCBnc200OF9zaV9wb3dlcl9vZmZzZXQgeworCXVfaW50OF90IHBvd2VyX29mZnNldDoyLAorCQkgcHJlc2VudDoxOworfTsKKworc3RydWN0IGdzbTQ4X3NpM19ncHJzX2luZCB7CisJdV9pbnQ4X3Qgc2kxM19wb3NpdGlvbjoxLAorCQkgcmFfY29sb3VyOjMsCisJCSBwcmVzZW50OjE7Cit9OworCitzdHJ1Y3QgZ3NtNDhfbHNhX3BhcmFtcyB7CisJdV9pbnQzMl90IHByaW9fdGhyOjMsCisJCSBsc2Ffb2Zmc2V0OjMsCisJCSBtY2M6MTIsCisJCSBtbmM6MTI7CisJdW5zaWduZWQgaW50IHByZXNlbnQ7Cit9OworCitzdHJ1Y3QgZ3NtNDhfc2lfcm9faW5mbyB7CisJc3RydWN0IGdzbTQ4X3NpX3NlbGVjdGlvbl9wYXJhbXMgc2VsZWN0aW9uX3BhcmFtczsKKwlzdHJ1Y3QgZ3NtNDhfc2lfcG93ZXJfb2Zmc2V0IHBvd2VyX29mZnNldDsKKwl1X2ludDhfdCBzaTJ0ZXJfaW5kaWNhdG9yOworCXVfaW50OF90IGVhcmx5X2NtX2N0cmw7CisJc3RydWN0IHsKKwkJdV9pbnQ4X3Qgd2hlcmU6MywKKwkJCSBwcmVzZW50OjE7CisJfSBzY2hlZHVsaW5nOworCXN0cnVjdCBnc200OF9zaTNfZ3Byc19pbmQgZ3Byc19pbmQ7CisKKwkvKiBTSSA0IHNwZWNpZmljICovCisJc3RydWN0IGdzbTQ4X2xzYV9wYXJhbXMgbHNhX3BhcmFtczsKKwl1X2ludDE2X3QgY2VsbF9pZDsKKwl1X2ludDhfdCBicmVha19pbmQ7CS8qIGRvIHdlIGhhdmUgU0k3ICsgU0k4ID8gKi8KK307CisKKworLyogR2VuZXJhdGUgU0kzIFJlc3QgT2N0ZXN0cyAoQ2hhcHRlciAxMC41LjIuMzQgLyBUYWJsZSAxMC40LjcyKSAqLworaW50IHJlc3Rfb2N0ZXRzX3NpMyh1X2ludDhfdCAqZGF0YSwgY29uc3Qgc3RydWN0IGdzbTQ4X3NpX3JvX2luZm8gKnNpMyk7CisKKy8qIEdlbmVyYXRlIFNJNCBSZXN0IE9jdGV0cyAoQ2hhcHRlciAxMC41LjIuMzUpICovCitpbnQgcmVzdF9vY3RldHNfc2k0KHVfaW50OF90ICpkYXRhLCBjb25zdCBzdHJ1Y3QgZ3NtNDhfc2lfcm9faW5mbyAqc2k0KTsKKworZW51bSBwYmNjaF9jYXJyaWVyX3R5cGUgeworCVBCQ0NIX0JDQ0gsCisJUEJDQ0hfQVJGQ04sCisJUEJDQ0hfTUFJTworfTsKKworLyogVFMgMDMuNjAgQ2hhcHRlciA2LjMuMy4xOiBOZXR3b3JrIE1vZGUgb2YgT3BlcmF0aW9uICovCitlbnVtIGdwcnNfbm1vIHsKKwlHUFJTX05NT19JCT0gMCwJLyogQ1MgcGFnaW4gb24gR1BSUyBwYWdpbmcgb3IgdHJhZmZpYyBjaGFubmVsICovCisJR1BSU19OTU9fSUkJPSAxLAkvKiBhbGwgcGFnaW5nIG9uIENDQ0ggKi8KKwlHUFJTX05NT19JSUkJPSAyLAkvKiBubyBwYWdpbmcgY29vcmRpbmF0aW9uICovCit9OworCitzdHJ1Y3QgZ3Byc19jZWxsX29wdGlvbnMgeworCWVudW0gZ3Byc19ubW8gbm1vOworCS8qIFQzMTY4OiB3YWl0IGZvciBwYWNrZXQgdXBsaW5rIGFzc2lnbm1lbnQgbWVzc2FnZSAqLworCXVfaW50MzJfdCB0MzE2ODsJLyogaW4gbWlsbGlzZWNvbmRzICovCisJLyogVDMxOTI6IHdhaXQgZm9yIHJlbGVhc2Ugb2YgdGhlIFRCRiBhZnRlciByZWNlcHRpb24gb2YgdGhlIGZpbmFsIGJsb2NrICovCisJdV9pbnQzMl90IHQzMTkyOwkvKiBpbiBtaWxsaXNlY29uZHMgKi8KKwl1X2ludDMyX3QgZHJ4X3RpbWVyX21heDsvKiBpbiBzZWNvbmRzICovCisJdV9pbnQzMl90IGJzX2N2X21heDsKK307CisKKy8qIFRTIDA0LjYwIFRhYmxlIDEyLjkuMiAqLworc3RydWN0IGdwcnNfcG93ZXJfY3RybF9wYXJzIHsKKwl1X2ludDhfdCBhbHBoYTsKKwl1X2ludDhfdCB0X2F2Z193OworCXVfaW50OF90IHRfYXZnX3Q7CisJdV9pbnQ4X3QgcGNfbWVhc19jaGFuOworCXVfaW50OF90IG5fYXZnX2k7Cit9OworCitzdHJ1Y3QgZ3NtNDhfc2kxM19pbmZvIHsKKwlzdHJ1Y3QgZ3Byc19jZWxsX29wdGlvbnMgY2VsbF9vcHRzOworCXN0cnVjdCBncHJzX3Bvd2VyX2N0cmxfcGFycyBwd3JfY3RybF9wYXJzOworCXVfaW50OF90IGJjY2hfY2hhbmdlX21hcms7CisJdV9pbnQ4X3Qgc2lfY2hhbmdlX2ZpZWxkOworCXVfaW50OF90IHBiY2NoX3ByZXNlbnQ7CisKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1X2ludDhfdCByYWM7CisJCQl1X2ludDhfdCBzcGdjX2NjY2hfc3VwOworCQkJdV9pbnQ4X3QgbmV0X2N0cmxfb3JkOworCQkJdV9pbnQ4X3QgcHJpb19hY2NfdGhyOworCQl9IG5vX3BiY2NoOworCQlzdHJ1Y3QgeworCQkJdV9pbnQ4X3QgcHNpMV9yZXBfcGVyOworCQkJdV9pbnQ4X3QgcGI7CisJCQl1X2ludDhfdCB0c2M7CisJCQl1X2ludDhfdCB0bjsKKwkJCWVudW0gcGJjY2hfY2Fycmllcl90eXBlIGNhcnJpZXJfdHlwZTsKKwkJCXVfaW50MTZfdCBhcmZjbjsKKwkJCXVfaW50OF90IG1haW87CisJCX0gcGJjY2g7CisJfTsKK307CisKKy8qIEdlbmVyYXRlIFNJMTMgUmVzdCBPY3Rlc3RzIChDaGFwdGVyIDEwLjUuMi4zN2IpICovCitpbnQgcmVzdF9vY3RldHNfc2kxMyh1X2ludDhfdCAqZGF0YSwgY29uc3Qgc3RydWN0IGdzbTQ4X3NpMTNfaW5mbyAqc2kxMyk7CisKKyNlbmRpZiAvKiBfUkVTVF9PQ1RFVFNfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvcnMyMzIuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3JzMjMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjExODdjYQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3JzMjMyLmgKQEAgLTAsMCArMSw5IEBACisjaWZuZGVmIF9SUzIzMl9ICisjZGVmaW5lIF9SUzIzMl9ICisKK2ludCByczIzMl9zZXR1cChjb25zdCBjaGFyICpzZXJpYWxfcG9ydCwgdW5zaWduZWQgaW50IGRlbGF5X21zLAorCQlzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKKworaW50IGhhbmRsZV9zZXJpYWxfbXNnKHN0cnVjdCBtc2diICptc2cpOworCisjZW5kaWYgLyogX1JTMjMyX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3J0cF9wcm94eS5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvcnRwX3Byb3h5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgyNzExYQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3J0cF9wcm94eS5oCkBAIC0wLDAgKzEsODUgQEAKKyNpZm5kZWYgX1JUUF9QUk9YWV9ICisjZGVmaW5lIF9SVFBfUFJPWFlfSAorCisvKiBSVFAgcHJveHkgaGFuZGxpbmcgZm9yIGlwLmFjY2VzcyBuYW5vQlRTICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbGludXhsaXN0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisKK2VudW0gcnRwX3J4X2FjdGlvbiB7CisJUlRQX05PTkUsCisJUlRQX1BST1hZLAorCVJUUF9SRUNWX1VQU1RSRUFNLAorfTsKKworZW51bSBydHBfdHhfYWN0aW9uIHsKKwlSVFBfU0VORF9OT05FLAorCVJUUF9TRU5EX0RPV05TVFJFQU0sCit9OworCitzdHJ1Y3QgcnRwX3N1Yl9zb2NrZXQgeworCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW5fbG9jYWw7CisJc3RydWN0IHNvY2thZGRyX2luIHNpbl9yZW1vdGU7CisKKwlzdHJ1Y3QgYnNjX2ZkIGJmZDsKKwkvKiBsaW5rZWQgbGlzdCBvZiB0by1iZS10cmFuc21pdHRlZCBtc2diJ3MgKi8KKwlzdHJ1Y3QgbGxpc3RfaGVhZCB0eF9xdWV1ZTsKK307CisKK3N0cnVjdCBydHBfc29ja2V0IHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCisJc3RydWN0IHJ0cF9zdWJfc29ja2V0IHJ0cDsKKwlzdHJ1Y3QgcnRwX3N1Yl9zb2NrZXQgcnRjcDsKKworCS8qIHdoYXQgc2hvdWxkIHdlIGRvIG9uIHJlY2VpdmU/ICovCisJZW51bSBydHBfcnhfYWN0aW9uIHJ4X2FjdGlvbjsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlzdHJ1Y3QgcnRwX3NvY2tldCAqb3RoZXJfc29jazsKKwkJfSBwcm94eTsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCBnc21fbmV0d29yayAqbmV0OworCQkJdV9pbnQzMl90IGNhbGxyZWY7CisJCX0gcmVjZWl2ZTsKKwl9OworCWVudW0gcnRwX3R4X2FjdGlvbiB0eF9hY3Rpb247CisJc3RydWN0IHsKKwkJdV9pbnQxNl90IHNlcXVlbmNlOworCQl1X2ludDMyX3QgdGltZXN0YW1wOworCQl1X2ludDMyX3Qgc3NyYzsKKwkJc3RydWN0IHRpbWV2YWwgbGFzdF90djsKKwl9IHRyYW5zbWl0OworfTsKKworc3RydWN0IHJ0cF9zb2NrZXQgKnJ0cF9zb2NrZXRfY3JlYXRlKHZvaWQpOworaW50IHJ0cF9zb2NrZXRfYmluZChzdHJ1Y3QgcnRwX3NvY2tldCAqcnMsIHVfaW50MzJfdCBpcCk7CitpbnQgcnRwX3NvY2tldF9jb25uZWN0KHN0cnVjdCBydHBfc29ja2V0ICpycywgdV9pbnQzMl90IGlwLCB1X2ludDE2X3QgcG9ydCk7CitpbnQgcnRwX3NvY2tldF9wcm94eShzdHJ1Y3QgcnRwX3NvY2tldCAqdGhpcywgc3RydWN0IHJ0cF9zb2NrZXQgKm90aGVyKTsKK2ludCBydHBfc29ja2V0X3Vwc3RyZWFtKHN0cnVjdCBydHBfc29ja2V0ICp0aGlzLCBzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgdV9pbnQzMl90IGNhbGxyZWYpOworaW50IHJ0cF9zb2NrZXRfZnJlZShzdHJ1Y3QgcnRwX3NvY2tldCAqcnMpOworaW50IHJ0cF9zZW5kX2ZyYW1lKHN0cnVjdCBydHBfc29ja2V0ICpycywgc3RydWN0IGdzbV9kYXRhX2ZyYW1lICpmcmFtZSk7CisKKyNlbmRpZiAvKiBfUlRQX1BST1hZX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3NpZ25hbC5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvc2lnbmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMyMjg2OQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3NpZ25hbC5oCkBAIC0wLDAgKzEsMTMzIEBACisvKiBHZW5lcmljIHNpZ25hbGxpbmcvbm90aWZpY2F0aW9uIGluZnJhc3RydWN0dXJlICovCisvKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpZm5kZWYgT1BFTkJTQ19TSUdOQUxfSAorI2RlZmluZSBPUEVOQlNDX1NJR05BTF9ICisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL3NpZ25hbC5oPgorCisvKgorICogU2lnbmFsbGluZyBzdWJzeXN0ZW1zCisgKi8KK2VudW0gc2lnbmFsX3N1YnN5c3RlbXMgeworCVNTX1BBR0lORywKKwlTU19TTVMsCisJU1NfQUJJU0lQLAorCVNTX05NLAorCVNTX0xDSEFOLAorCVNTX1NVQlNDUiwKKwlTU19TQ0FMTCwKKwlTU19HTE9CQUwsCit9OworCisvKiBTU19QQUdJTkcgc2lnbmFscyAqLworZW51bSBzaWduYWxfcGFnaW5nIHsKKwlTX1BBR0lOR19TVUNDRUVERUQsCisJU19QQUdJTkdfRVhQSVJFRCwKK307CisKKy8qIFNTX1NNUyBzaWduYWxzICovCitlbnVtIHNpZ25hbF9zbXMgeworCVNfU01TX1NVQk1JVFRFRCwJLyogQSBTTVMgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHN1Ym1pdHRlZCB0byB1cyAqLworCVNfU01TX0RFTElWRVJFRCwJLyogQSBTTVMgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGRlbGl2ZXJlZCB0byBhIE1TICovCisJU19TTVNfU01NQSwJCS8qIEEgTVMgdGVsbHMgdXMgaXQgaGFzIG1vcmUgc3BhY2UgYXZhaWxhYmxlICovCisJU19TTVNfTUVNX0VYQ0VFREVELAkvKiBBIE1TIHRlbGxzIHVzIGl0IGhhcyBubyBtb3JlIHNwYWNlIGF2YWlsYWJsZSAqLworfTsKKworLyogU1NfQUJJU0lQIHNpZ25hbHMgKi8KK2VudW0gc2lnbmFsX2FiaXNpcCB7CisJU19BQklTSVBfQ1JDWF9BQ0ssCisJU19BQklTSVBfTURDWF9BQ0ssCisJU19BQklTSVBfRExDWF9JTkQsCit9OworCisvKiBTU19OTSBzaWduYWxzICovCitlbnVtIHNpZ25hbF9ubSB7CisJU19OTV9TV19BQ1RJVl9SRVAsCS8qIEdTTSAxMi4yMSBzb2Z0d2FyZSBhY3RpdmF0ZWQgcmVwb3J0ICovCisJU19OTV9GQUlMX1JFUCwJCS8qIEdTTSAxMi4yMSBmYWlsdXJlIGV2ZW50IHJlcG9ydCAqLworCVNfTk1fTkFDSywJCS8qIEdTTSAxMi4yMSB2YXJpb3VzIE5NX01UXypfTkFDSyBoYXBwZW5lZCAqLworCVNfTk1fSVBBQ0NfTkFDSywJLyogR1NNIDEyLjIxIG5hbm9CVFMgZXh0ZW5zaW9ucyBOTV9NVF9JUEFDQ18qXypfTkFDSyBoYXBwZW5lZCAqLworCVNfTk1fSVBBQ0NfQUNLLAkJLyogR1NNIDEyLjIxIG5hbm9CVFMgZXh0ZW5zaW9ucyBOTV9NVF9JUEFDQ18qXypfQUNLIGhhcHBlbmVkICovCisJU19OTV9JUEFDQ19SRVNUQVJUX0FDSywgLyogbmFub0JUUyBoYXMgc2VuZCBhIHJlc3RhcnQgYWNrICovCisJU19OTV9JUEFDQ19SRVNUQVJUX05BQ0ssLyogbmFub0JUUyBoYXMgc2VuZCBhIHJlc3RhcnQgYWNrICovCisJU19OTV9URVNUX1JFUCwJCS8qIEdTTSAxMi4yMSBUZXN0IFJlcG9ydCAqLworfTsKKworLyogU1NfTENIQU4gc2lnbmFscyAqLworZW51bSBzaWduYWxfbGNoYW4geworCS8qCisJICogVGhlIGxjaGFuIGdvdCBmcmVlZCB3aXRoIGFuIHVzZV9jb3VudCAhPSAwIGFuZCBlcnJvcgorCSAqIHJlY292ZXJ5IG5lZWRzIHRvIGJlIGNhcnJpZWQgb3V0IGZyb20gd2l0aGluIHRoZQorCSAqIHNpZ25hbCBoYW5kbGVyLgorCSAqLworCVNfTENIQU5fVU5FWFBFQ1RFRF9SRUxFQVNFLAorCVNfTENIQU5fQUNUSVZBVEVfQUNLLAkJLyogMDguNTggQ2hhbm5lbCBBY3RpdmF0ZSBBQ0sgKi8KKwlTX0xDSEFOX0FDVElWQVRFX05BQ0ssCQkvKiAwOC41OCBDaGFubmVsIEFjdGl2YXRlIE5BQ0sgKi8KKwlTX0xDSEFOX0hBTkRPVkVSX0NPTVBMLAkJLyogMDQuMDggSGFuZG92ZXIgQ29tcGxldGVkICovCisJU19MQ0hBTl9IQU5ET1ZFUl9GQUlMLAkJLyogMDQuMDggSGFuZG92ZXIgRmFpbGVkICovCisJU19MQ0hBTl9IQU5ET1ZFUl9ERVRFQ1QsCS8qIDA4LjU4IEhhbmRvdmVyIERldGVjdCAqLworCVNfTENIQU5fTUVBU19SRVAsCQkvKiAwOC41OCBNZWFzdXJlbWVudCBSZXBvcnQgKi8KK307CisKKy8qIFNTX1NVQlNDUiBzaWduYWxzICovCitlbnVtIHNpZ25hbF9zdWJzY3IgeworCVNfU1VCU0NSX0FUVEFDSEVELAorCVNfU1VCU0NSX0RFVEFDSEVELAorCVNfU1VCU0NSX0lERU5USVRZLAkJLyogd2UndmUgcmVjZWl2ZWQgc29tZSBpZGVudGl0eSBpbmZvcm1hdGlvbiAqLworfTsKKworLyogU1NfU0NBTEwgc2lnbmFscyAqLworZW51bSBzaWduYWxfc2NhbGwgeworCVNfU0NBTExfU1VDQ0VTUywKKwlTX1NDQUxMX0VYUElSRUQsCisJU19TQ0FMTF9ERVRBQ0hFRCwKK307CisKK2VudW0gc2lnbmFsX2dsb2JhbCB7CisJU19HTE9CQUxfU0hVVERPV04sCit9OworCitzdHJ1Y3QgcGFnaW5nX3NpZ25hbF9kYXRhIHsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCisJLyogTlVMTCBpbiBjYXNlIHRoZSBwYWdpbmcgZGlkbid0IHdvcmsgKi8KKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKK307CisKK3N0cnVjdCBzY2FsbF9zaWduYWxfZGF0YSB7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW47CisJdm9pZCAqZGF0YTsKK307CisKK3N0cnVjdCBpcGFjY19hY2tfc2lnbmFsX2RhdGEgeworCXN0cnVjdCBnc21fYnRzICpidHM7CisJdV9pbnQ4X3QgbXNnX3R5cGU7CQorfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9zaWxlbnRfY2FsbC5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvc2lsZW50X2NhbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWZjNTE4Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvc2lsZW50X2NhbGwuaApAQCAtMCwwICsxLDEwIEBACisjaWZuZGVmIF9TSUxFTlRfQ0FMTF9ICisjZGVmaW5lIF9TSUxFTlRfQ0FMTF9ICisKK2V4dGVybiBpbnQgZ3NtX3NpbGVudF9jYWxsX3N0YXJ0KHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwgaW50IHR5cGUpOworZXh0ZXJuIGludCBnc21fc2lsZW50X2NhbGxfc3RvcChzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcik7CitleHRlcm4gaW50IHNpbGVudF9jYWxsX3J4KHN0cnVjdCBtc2diICptc2cpOworZXh0ZXJuIGludCBzaWxlbnRfY2FsbF9yZXJvdXRlKHN0cnVjdCBtc2diICptc2cpOworCisjZW5kaWYgLyogX1NJTEVOVF9DQUxMX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3N1YmNoYW5fZGVtdXguaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3N1YmNoYW5fZGVtdXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmZhMDIzCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvc3ViY2hhbl9kZW11eC5oCkBAIC0wLDAgKzEsMTAyIEBACisjaWZuZGVmIF9TVUJDSF9ERU1VWF9ICisjZGVmaW5lIF9TVUJDSF9ERU1VWF9ICisvKiBBIEUxIHN1Yi1jaGFubmVsIChkZSltdWx0aXBsZXhlciB3aXRoIFRSQVUgZnJhbWUgc3luYyAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKworI2RlZmluZSBOUl9TVUJDSAk0CisjZGVmaW5lIFRSQVVfRlJBTUVfU0laRQk0MAorI2RlZmluZSBUUkFVX0ZSQU1FX0JJVFMJKFRSQVVfRlJBTUVfU0laRSo4KQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBERU1VTFRJUExFWEVSICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBkZW11eF9zdWJjaCB7CisJdV9pbnQ4X3Qgb3V0X2JpdGJ1ZltUUkFVX0ZSQU1FX0JJVFNdOworCXVfaW50MTZfdCBvdXRfaWR4OyAvKiBuZXh0IGJpdCB0byBiZSB3cml0dGVuIGluIG91dF9iaXRidWYgKi8KKwkvKiBudW1iZXIgb2YgY29uc2VjdXRpdmUgemVyb3MgdGhhdCB3ZSBoYXZlIHJlY2VpdmVkIChmb3Igc3luYykgKi8KKwl1bnNpZ25lZCBpbnQgY29uc2VjdXRpdmVfemVyb3M7CisJLyogYXJlIHdlIGluIFRSQVUgZnJhbWUgc3luYyBvciBub3Q/ICovCisJdW5zaWduZWQgaW50IGluX3N5bmM7Cit9OworCitzdHJ1Y3Qgc3ViY2hfZGVtdXggeworCS8qIGJpdG1hc2sgb2YgY3VycmVudGx5IGFjdGl2ZSBzdWJjaGFubmVscyAqLworCXVfaW50OF90IGNoYW5fYWN0aXY7CisJLyogb25lIGRlbXV4X3N1YmNoIHN0cnVjdCBmb3IgZXZlcnkgc3ViY2hhbm5lbCAqLworCXN0cnVjdCBkZW11eF9zdWJjaCBzdWJjaFtOUl9TVUJDSF07CisJLyogY2FsbGJhY2sgdG8gYmUgY2FsbGVkIG9uY2Ugd2UgaGF2ZSByZWNlaXZlZCBhIGNvbXBsZXRlCisJICogZnJhbWUgb24gYSBnaXZlbiBzdWJjaGFubmVsICovCisJaW50ICgqb3V0X2NiKShzdHJ1Y3Qgc3ViY2hfZGVtdXggKmRteCwgaW50IGNoLCB1X2ludDhfdCAqZGF0YSwgaW50IGxlbiwKKwkJICAgICAgdm9pZCAqKTsKKwkvKiB1c2VyLXByb3ZpZGVkIGRhdGEsIHRyYW5zcGFyZW50bHkgcGFzc2VkIHRvIG91dF9jYigpICovCisJdm9pZCAqZGF0YTsKK307CisKKy8qIGluaXRpYWxpemUgb25lIGRlbXVsdGlwbGV4ZXIgaW5zdGFuY2UgKi8KK2ludCBzdWJjaF9kZW11eF9pbml0KHN0cnVjdCBzdWJjaF9kZW11eCAqZG14KTsKKworLyogZmVlZCAnbGVuJyBudW1iZXIgb2YgbXV4ZWQgYnl0ZXMgaW50byB0aGUgZGVtdWx0aXBsZXhlciAqLworaW50IHN1YmNoX2RlbXV4X2luKHN0cnVjdCBzdWJjaF9kZW11eCAqZG14LCB1X2ludDhfdCAqZGF0YSwgaW50IGxlbik7CisKKy8qIGFjdGl2YXRlIGRlY29kaW5nL3Byb2Nlc3NpbmcgZm9yIG9uZSBzdWJjaGFubmVsICovCitpbnQgc3ViY2hfZGVtdXhfYWN0aXZhdGUoc3RydWN0IHN1YmNoX2RlbXV4ICpkbXgsIGludCBzdWJjaCk7CisKKy8qIGRlYWN0aXZhdGUgZGVjb2RpbmcvcHJvY2Vzc2luZyBmb3Igb25lIHN1YmNoYW5uZWwgKi8KK2ludCBzdWJjaF9kZW11eF9kZWFjdGl2YXRlKHN0cnVjdCBzdWJjaF9kZW11eCAqZG14LCBpbnQgc3ViY2gpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBNVUxUSVBMRVhFUiAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBvbmUgZWxlbWVudCBpbiB0aGUgdHhfcXVldWUgb2YgYSBtdXhlciBzdWItY2hhbm5lbCAqLworc3RydWN0IHN1YmNoX3R4cV9lbnRyeSB7CisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKworCXVuc2lnbmVkIGludCBiaXRfbGVuOwkvKiB0b3RhbCBudW1iZXIgb2YgYml0cyBpbiAnYml0cycgKi8KKwl1bnNpZ25lZCBpbnQgbmV4dF9iaXQ7CS8qIG5leHQgYml0IHRvIGJlIHRyYW5zbWl0dGVkICovCisKKwl1X2ludDhfdCBiaXRzWzBdOwkvKiBvbmUgYml0IHBlciBieXRlICovCit9OworCitzdHJ1Y3QgbXV4X3N1YmNoIHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCB0eF9xdWV1ZTsKK307CisKKy8qIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgb25lIGluc3RhbmNlIG9mIHRoZSBzdWJjaGFubmVsIG11eGVyICovCitzdHJ1Y3Qgc3ViY2hfbXV4IHsKKwlzdHJ1Y3QgbXV4X3N1YmNoIHN1YmNoW05SX1NVQkNIXTsKK307CisKKy8qIGluaXRpYWxpemUgYSBzdWJjaGFubmVsIG11eGVyIGluc3RhbmNlICovCitpbnQgc3ViY2hhbl9tdXhfaW5pdChzdHJ1Y3Qgc3ViY2hfbXV4ICpteCk7CisKKy8qIHJlcXVlc3QgdGhlIG91dHB1dCBvZiAnbGVuJyBtdWx0aXBsZXhlZCBieXRlcyAqLworaW50IHN1YmNoYW5fbXV4X291dChzdHJ1Y3Qgc3ViY2hfbXV4ICpteCwgdV9pbnQ4X3QgKmRhdGEsIGludCBsZW4pOworCisvKiBlbnF1ZXVlIHNvbWUgZGF0YSBpbnRvIG9uZSBzdWItY2hhbm5lbCBvZiB0aGUgbXV4ZXIgKi8KK2ludCBzdWJjaGFuX211eF9lbnF1ZXVlKHN0cnVjdCBzdWJjaF9tdXggKm14LCBpbnQgc19uciwgY29uc3QgdV9pbnQ4X3QgKmRhdGEsCisJCQlpbnQgbGVuKTsKKworI2VuZGlmIC8qIF9TVUJDSF9ERU1VWF9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9zeXN0ZW1faW5mb3JtYXRpb24uaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3N5c3RlbV9pbmZvcm1hdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MmE5YWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9zeXN0ZW1faW5mb3JtYXRpb24uaApAQCAtMCwwICsxLDYgQEAKKyNpZm5kZWYgX1NZU1RFTV9JTkZPX0gKKyNkZWZpbmUgX1NZU1RFTV9JTkZPX0gKKworaW50IGdzbV9nZW5lcmF0ZV9zaSh1X2ludDhfdCAqb3V0cHV0LCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgdHlwZSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvdGVsbmV0X2ludGVyZmFjZS5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvdGVsbmV0X2ludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwZTc5NGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy90ZWxuZXRfaW50ZXJmYWNlLmgKQEAgLTAsMCArMSw0MyBAQAorLyogbWluaW1hbGlzdGljIHRlbG5ldC9uZXR3b3JrIGludGVyZmFjZSBpdCBtaWdodCB0dXJuIGludG8gYSB3aXJlIGludGVyZmFjZSAqLworLyogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpZm5kZWYgVEVMTkVUX0lOVEVSRkFDRV9ICisjZGVmaW5lIFRFTE5FVF9JTlRFUkZBQ0VfSAorCisjaW5jbHVkZSAiZ3NtX2RhdGEuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorCisjaW5jbHVkZSA8dnR5L3Z0eS5oPgorCitzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24geworCXN0cnVjdCBsbGlzdF9oZWFkIGVudHJ5OworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0d29yazsKKwlzdHJ1Y3QgYnNjX2ZkIGZkOworCXN0cnVjdCB2dHkgKnZ0eTsKKwlzdHJ1Y3QgZGVidWdfdGFyZ2V0ICpkYmc7Cit9OworCisKK3ZvaWQgdGVsbmV0X2luaXQoc3RydWN0IGdzbV9uZXR3b3JrICpuZXR3b3JrLCBpbnQgcG9ydCk7CisKK2ludCBic2NfdnR5X2luaXQoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3RyYW5zYWN0aW9uLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy90cmFuc2FjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYzNjYzUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy90cmFuc2FjdGlvbi5oCkBAIC0wLDAgKzEsNzYgQEAKKyNpZm5kZWYgX1RSQU5TQUNUX0gKKyNkZWZpbmUgX1RSQU5TQUNUX0gKKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9zdWJzY3JpYmVyLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbGludXhsaXN0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMTEuaD4KKworLyogT25lIHRyYW5zYWN0aW9uICovCitzdHJ1Y3QgZ3NtX3RyYW5zIHsKKwkvKiBFbnRyeSBpbiBsaXN0IG9mIGFsbCB0cmFuc2FjdGlvbnMgKi8KKwlzdHJ1Y3QgbGxpc3RfaGVhZCBlbnRyeTsKKworCS8qIFRoZSBwcm90b2NvbCB3aXRoaW4gd2hpY2ggd2UgbGl2ZSAqLworCXVfaW50OF90IHByb3RvY29sOworCisJLyogVGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gSUQgKi8KKwl1X2ludDhfdCB0cmFuc2FjdGlvbl9pZDsKKwkKKwkvKiBUbyB3aG9tIHdlIGJlbG9uZywgdW5pcXVlIGlkZW50aWZpZXIgb2YgcmVtb3RlIE1NIGVudGl0eSAqLworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyOworCisJLyogVGhlIExDSEFOIHRoYXQgd2UncmUgY3VycmVudGx5IHVzaW5nIHRvIHRyYW5zbWl0IG1lc3NhZ2VzICovCisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW47CisKKwkvKiByZWZlcmVuY2UgZnJvbSBNTkNDIG9yIG90aGVyIGFwcGxpY2F0aW9uICovCisJdV9pbnQzMl90IGNhbGxyZWY7CisKKwkvKiBpZiB0cmFmZmljIGNoYW5uZWwgcmVjZWl2ZSB3YXMgcmVxdWVzdGVkICovCisJaW50IHRjaF9yZWN2OworCisJdW5pb24geworCQlzdHJ1Y3QgeworCisJCQkvKiBjdXJyZW50IGNhbGwgc3RhdGUgKi8KKwkJCWludCBzdGF0ZTsKKworCQkJLyogY3VycmVudCB0aW1lciBhbmQgbWVzc2FnZSBxdWV1ZSAqLworCQkJaW50IFRjdXJyZW50OwkJLyogY3VycmVudCBDQyB0aW1lciAqLworCQkJaW50IFQzMDhfc2Vjb25kOwkvKiB1c2VkIHRvIHNlbmQgcmVsZWFzZSBhZ2FpbiAqLworCQkJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisJCQlzdHJ1Y3QgZ3NtX21uY2MgbXNnOwkvKiBzdG9yZXMgc2V0dXAvZGlzY29ubmVjdC9yZWxlYXNlIG1lc3NhZ2UgKi8KKwkJfSBjYzsKKwkJc3RydWN0IHsKKwkJCXVfaW50OF90IGxpbmtfaWQ7CS8qIFJTTCBMaW5rIElEIHRvIGJlIHVzZWQgZm9yIHRoaXMgdHJhbnMgKi8KKwkJCWludCBpc19tdDsJLyogaXMgdGhpcyBhIE1PICgwKSBvciBNVCAoMSkgdHJhbnNmZXIgKi8KKwkJCWVudW0gZ3NtNDExX2NwX3N0YXRlIGNwX3N0YXRlOworCQkJc3RydWN0IHRpbWVyX2xpc3QgY3BfdGltZXI7CisKKwkJCWVudW0gZ3NtNDExX3JwX3N0YXRlIHJwX3N0YXRlOworCisJCQlzdHJ1Y3QgZ3NtX3NtcyAqc21zOworCQl9IHNtczsKKwl9OworfTsKKworCisKK3N0cnVjdCBnc21fdHJhbnMgKnRyYW5zX2ZpbmRfYnlfaWQoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsCisJCQkJICAgdV9pbnQ4X3QgcHJvdG8sIHVfaW50OF90IHRyYW5zX2lkKTsKK3N0cnVjdCBnc21fdHJhbnMgKnRyYW5zX2ZpbmRfYnlfY2FsbHJlZihzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwKKwkJCQkJdV9pbnQzMl90IGNhbGxyZWYpOworCitzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuc19hbGxvYyhzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciwKKwkJCSAgICAgIHVfaW50OF90IHByb3RvY29sLCB1X2ludDhfdCB0cmFuc19pZCwKKwkJCSAgICAgIHVfaW50MzJfdCBjYWxscmVmKTsKK3ZvaWQgdHJhbnNfZnJlZShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucyk7CisKK2ludCB0cmFuc19hc3NpZ25fdHJhbnNfaWQoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsCisJCQkgIHVfaW50OF90IHByb3RvY29sLCB1X2ludDhfdCB0aV9mbGFnKTsKKworLyogdXBkYXRlIGFsbCB0cmFuc2FjdGlvbnMgdG8gdXNlIGEgZGlmZmVyZW50IExDSEFOLCBlLmcuCisgKiBhZnRlciBoYW5kb3ZlciBoYXMgc3VjY2VlZGVkICovCitpbnQgdHJhbnNfbGNoYW5fY2hhbmdlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuX29sZCwKKwkJICAgICAgIHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuX25ldyk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3RyYXVfZnJhbWUuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3RyYXVfZnJhbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTIzZDRhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvdHJhdV9mcmFtZS5oCkBAIC0wLDAgKzEsNjUgQEAKKyNpZm5kZWYgX1RSQVVfRlJBTUVfSAorI2RlZmluZSBfVFJBVV9GUkFNRV9ICisvKiBUUkFVIGZyYW1lIGhhbmRsaW5nIGFjY29yZGluZyB0byBHU00gVFMgMDguNjAgKi8KKworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKy8qIDIxIGZvciBGUi9FRlIsIDI1IGZvciBBTVIsIDE1IGZvciBPTSwgMTUgZm9yIGRhdGEsIDEzIGZvciBFLWRhdGEsIDIxIGlkbGUgKi8KKyNkZWZpbmUgTUFYX0NfQklUUwkyNQorLyogMjYwIGZvciBGUi9FRlIsIDI1NiBmb3IgQU1SLCAyNjQgZm9yIE9NLCAyODggZm9yIEUtZGF0YSAqLworI2RlZmluZSBNQVhfRF9CSVRTCTI4OAorLyogZm9yIGFsbCBzcGVlY2ggZnJhbWVzICovCisjZGVmaW5lIE1BWF9UX0JJVFMJNAorLyogZm9yIE9NICovCisjZGVmaW5lIE1BWF9TX0JJVFMJNgorLyogZm9yIEUtZGF0YSAqLworI2RlZmluZSBNQVhfTV9CSVRTCTIKKworc3RydWN0IGRlY29kZWRfdHJhdV9mcmFtZSB7CisJdV9pbnQ4X3QgY19iaXRzW01BWF9DX0JJVFNdOworCXVfaW50OF90IGRfYml0c1tNQVhfRF9CSVRTXTsKKwl1X2ludDhfdCB0X2JpdHNbTUFYX1RfQklUU107CisJdV9pbnQ4X3Qgc19iaXRzW01BWF9TX0JJVFNdOworCXVfaW50OF90IG1fYml0c1tNQVhfTV9CSVRTXTsKK307CisKKyNkZWZpbmUgVFJBVV9GVF9GUl9VUAkJMHgwMgkvKiAwIDAgMCAxIDAgLSAzLjUuMS4xLjEgKi8KKyNkZWZpbmUgVFJBVV9GVF9GUl9ET1dOCQkweDFjCS8qIDEgMSAxIDAgMCAtIDMuNS4xLjEuMSAqLworI2RlZmluZSBUUkFVX0ZUX0VGUgkJMHgxYQkvKiAxIDEgMCAxIDAgLSAzLjUuMS4xLjEgKi8KKyNkZWZpbmUgVFJBVV9GVF9BTVIJCTB4MDYJLyogMCAwIDEgMSAwIC0gMy41LjEuMiAqLworI2RlZmluZSBUUkFVX0ZUX09NX1VQCQkweDA3CS8qIDAgMCAxIDAgMSAtIDMuNS4yICovCisjZGVmaW5lIFRSQVVfRlRfT01fRE9XTgkJMHgxYgkvKiAxIDEgMCAxIDEgLSAzLjUuMiAqLworI2RlZmluZSBUUkFVX0ZUX0RBVEFfVVAJCTB4MDgJLyogMCAxIDAgMCAwIC0gMy41LjMgKi8KKyNkZWZpbmUgVFJBVV9GVF9EQVRBX0RPV04JMHgxNgkvKiAxIDAgMSAxIDAgLSAzLjUuMyAqLworI2RlZmluZSBUUkFVX0ZUX0QxNDVfU1lOQwkweDE0CS8qIDEgMCAxIDAgMCAtIDMuNS4zICovCisjZGVmaW5lIFRSQVVfRlRfRURBVEEJCTB4MWYJLyogMSAxIDEgMSAxIC0gMy41LjQgKi8KKyNkZWZpbmUgVFJBVV9GVF9JRExFX1VQCQkweDEwCS8qIDEgMCAwIDAgMCAtIDMuNS41ICovCisjZGVmaW5lIFRSQVVfRlRfSURMRV9ET1dOCTB4MGUJLyogMCAxIDEgMSAwIC0gMy41LjUgKi8KKworCitpbnQgZGVjb2RlX3RyYXVfZnJhbWUoc3RydWN0IGRlY29kZWRfdHJhdV9mcmFtZSAqZnIsIGNvbnN0IHVfaW50OF90ICp0cmF1X2JpdHMpOworaW50IGVuY29kZV90cmF1X2ZyYW1lKHVfaW50OF90ICp0cmF1X2JpdHMsIGNvbnN0IHN0cnVjdCBkZWNvZGVkX3RyYXVfZnJhbWUgKmZyKTsKK2ludCB0cmF1X2ZyYW1lX3VwMmRvd24oc3RydWN0IGRlY29kZWRfdHJhdV9mcmFtZSAqZnIpOwordV9pbnQ4X3QgKnRyYXVfaWRsZV9mcmFtZSh2b2lkKTsKKworCisjZW5kaWYgLyogX1RSQVVfRlJBTUVfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvdHJhdV9tdXguaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3RyYXVfbXV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRlYjcwOAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3RyYXVfbXV4LmgKQEAgLTAsMCArMSw0OSBAQAorLyogU2ltcGxlIFRSQVUgZnJhbWUgcmVmbGVjdG9yIHRvIHJvdXRlIHZvaWNlIGNhbGxzICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworLyogVGhlICJUUkFVIG11eCBtYXAiIGRlZmluZXMgd2hpY2ggcGFydGljdWxhciAxNmtiaXQgc3ViLXNsb3QgKGluIHdoaWNoIEUxCisgKiB0aW1lc2xvdCBvbiB3aGljaCBFMSBpbnRlcmZhY2UpIHNob3VsZCBiZSBkaXJlY3RseSBtdXhlZCB0byB3aGljaCBvdGhlciAKKyAqIHN1Yi1zbG90LiAgRW50cmllcyBpbiB0aGUgbXV4IG1hcCBhcmUgYWx3YXlzIGJpLWRpcmVjdGlvbmFsLiAKKyAqCisgKiBUaGUgaWRlYSBvZiBhbGwgdGhpcyBpcyB0byBkaXJlY3RseSBzd2l0Y2ggdm9pY2UgY2hhbm5lbHMgaW4gdGhlIEJTQworICogZnJvbSBvbmUgcGhvbmUgdG8gYW5vdGhlci4gIFdlIGRvIHRoaXMgcmlnaHQgbm93IHNpbmNlIHdlIGRvbid0IHN1cHBvcnQKKyAqIGFueSBleHRlcm5hbCBpbnRlcmZhY2UgZm9yIHZvaWNlIGNoYW5uZWxzLCBhbmQgaW4gdGhlIGZ1dHVyZSBhcyBhbgorICogb3B0aW1pemF0aW9uIHRvIHJvdXRpbmcgdGhlbSBleHRlcm5hbGx5LgorICovCisKKy8qIG1hcCBhIFRSQVUgbXV4IG1hcCBlbnRyeSAqLworaW50IHRyYXVfbXV4X21hcChjb25zdCBzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKnNyYywKKwkJIGNvbnN0IHN0cnVjdCBnc21fZTFfc3Vic2xvdCAqZHN0KTsKK2ludCB0cmF1X211eF9tYXBfbGNoYW4oY29uc3Qgc3RydWN0IGdzbV9sY2hhbiAqc3JjLAkKKwkJCWNvbnN0IHN0cnVjdCBnc21fbGNoYW4gKmRzdCk7CisKKy8qIHVubWFwIGEgVFJBVSBtdXggbWFwIGVudHJ5ICovCitpbnQgdHJhdV9tdXhfdW5tYXAoY29uc3Qgc3RydWN0IGdzbV9lMV9zdWJzbG90ICpzcywgdV9pbnQzMl90IGNhbGxyZWYpOworCisvKiB3ZSBnZXQgY2FsbGVkIGJ5IHN1YmNoYW5fZGVtdXggKi8KK2ludCB0cmF1X211eF9pbnB1dChzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKnNyY19lMV9zcywKKwkJICAgY29uc3QgdV9pbnQ4X3QgKnRyYXVfYml0cywgaW50IG51bV9iaXRzKTsKKworLyogYWRkIGEgdHJhdSByZWNlaXZlciAqLworaW50IHRyYXVfcmVjdl9sY2hhbihzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQzMl90IGNhbGxyZWYpOworCisvKiBzZW5kIHRyYXUgZnJvbSBhcHBsaWNhdGlvbiAqLworaW50IHRyYXVfc2VuZF9mcmFtZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgc3RydWN0IGdzbV9kYXRhX2ZyYW1lICpmcmFtZSk7CmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy91c3NkLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy91c3NkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNlYTMxYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3Vzc2QuaApAQCAtMCwwICsxLDEwIEBACisjaWZuZGVmIF9VU1NEX0gKKyNkZWZpbmUgX1VTU0RfSAorCisvKiBIYW5kbGVyIGZ1bmN0aW9uIGZvciBtb2JpbGUtb3JpZ2luYXRlZCBVU1NEIG1lc3NhZ2VzICovCisKKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisKK2ludCBoYW5kbGVfcmN2X3Vzc2Qoc3RydWN0IG1zZ2IgKm1zZyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL3NjY3AvTWFrZWZpbGUuYW0gYi9vcGVuYnNjL2luY2x1ZGUvc2NjcC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzhhNTE3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL3NjY3AvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyIEBACitzY2NwX0hFQURFUlMgPSBzY2NwX3R5cGVzLmggc2NjcC5oCitzY2NwZGlyID0gJChpbmNsdWRlZGlyKS9zY2NwCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvc2NjcC9zY2NwLmggYi9vcGVuYnNjL2luY2x1ZGUvc2NjcC9zY2NwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQzNDc5YQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9zY2NwL3NjY3AuaApAQCAtMCwwICsxLDE2NyBAQAorLyoKKyAqIFNDQ1AgbWFuYWdlbWVudCBjb2RlCisgKgorICogKEMpIDIwMDksIDIwMTAgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaWZuZGVmIFNDQ1BfSAorI2RlZmluZSBTQ0NQX0gKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAic2NjcF90eXBlcy5oIgorCitzdHJ1Y3QgbXNnYjsKK3N0cnVjdCBzY2NwX3N5c3RlbTsKKworZW51bSB7CisJU0NDUF9DT05ORUNUSU9OX1NUQVRFX05PTkUsCisJU0NDUF9DT05ORUNUSU9OX1NUQVRFX1JFUVVFU1QsCisJU0NDUF9DT05ORUNUSU9OX1NUQVRFX0NPTkZJUk0sCisJU0NDUF9DT05ORUNUSU9OX1NUQVRFX0VTVEFCTElTSEVELAorCVNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRUxFQVNFLAorCVNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRUxFQVNFX0NPTVBMRVRFLAorCVNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRUZVU0VELAorCVNDQ1BfQ09OTkVDVElPTl9TVEFURV9TRVRVUF9FUlJPUiwKK307CisKK3N0cnVjdCBzb2NrYWRkcl9zY2NwIHsKKwlzYV9mYW1pbHlfdAlzY2NwX2ZhbWlseTsJCS8qIEFGX1NDQ1AgaW4gdGhlIGZ1dHVyZT8/PyAqLworCXVfaW50OF90CXNjY3Bfc3NuOwkJLyogc3Vic3N5c3RlbSBudW1iZXIgZm9yIHJvdXRpbmcgKi8KKworCS8qIFRPRE8gZmlsbCBpbiBhZGRyZXNzIGluZGljYXRvci4uLiBpZiB0aGF0IGlzIGV2ZXIgbmVlZGVkICovCisKKwkvKiBub3Qgc3VyZSBhYm91dCB0aGVzZSAqLworCS8qIHVfaW50OF90ICAgIHNjY3BfY2xhc3M7ICovCit9OworCisvKgorICogcGFyc2VkIHN0cnVjdHVyZSBvZiBhbiBhZGRyZXNzCisgKi8KK3N0cnVjdCBzY2NwX2FkZHJlc3MgeworCXN0cnVjdCBzY2NwX2NhbGxlZF9wYXJ0eV9hZGRyZXNzICAgIGFkZHJlc3M7CisJdV9pbnQ4X3QJCQkgICAgc3NuOworCXVfaW50OF90CQkJICAgIHBvaVsyXTsKK307CisKK3N0cnVjdCBzY2NwX29wdGlvbmFsX2RhdGEgeworCXVfaW50OF90CQkJICAgIGRhdGFfbGVuOworCXVfaW50OF90CQkJICAgIGRhdGFfc3RhcnQ7Cit9OworCitzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uIHsKKwkvKiBwdWJsaWMgKi8KKwl2b2lkICpkYXRhX2N0eDsKKwl2b2lkICgqZGF0YV9jYikoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubiwgc3RydWN0IG1zZ2IgKm1zZywgdW5zaWduZWQgaW50IGxlbik7CisKKwl2b2lkICpzdGF0ZV9jdHg7CisJdm9pZCAoKnN0YXRlX2NiKShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICosIGludCBvbGRfc3RhdGUpOworCisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSBzb3VyY2VfbG9jYWxfcmVmZXJlbmNlOworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UgZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlOworCisJaW50IGNvbm5lY3Rpb25fc3RhdGU7CisKKwkvKiBwcml2YXRlICovCisJLyogbGlzdCBvZiBhY3RpdmUgY29ubmVjdGlvbnMgKi8KKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBzY2NwX3N5c3RlbSAqc3lzdGVtOworCWludCBpbmNvbWluZzsKK307CisKKy8qKgorICogc3lzdGVtIGZ1bmN0aW9uYWxpdHkgdG8gaW1wbGVtZW50IG9uIHRvcCBvZiBhbnkgb3RoZXIgdHJhbnNwb3J0IGxheWVyOgorICogICBjYWxsIHNjY3Bfc3lzdGVtX2luY29taW5nIGZvciBpbmNvbWluZyBkYXRhIChmcm9tIHRoZSBuZXR3b3JrKQorICogICBzY2NwIHdpbGwgY2FsbCBvdXRnb2luZyB3aGVuZXZlciBvdXRnb2luZyBkYXRhIGV4aXN0cworICovCitpbnQgc2NjcF9zeXN0ZW1faW5pdChpbnQgKCpvdXRnb2luZykoc3RydWN0IG1zZ2IgKmRhdGEsIHZvaWQgKmN0eCksIHZvaWQgKmNvbnRleHQpOworaW50IHNjY3Bfc3lzdGVtX2luY29taW5nKHN0cnVjdCBtc2diICpkYXRhKTsKKworLyoqCisgKiBTZW5kIGRhdGEgb24gYW4gZXhpc3RpbmcgY29ubmVjdGlvbgorICovCitpbnQgc2NjcF9jb25uZWN0aW9uX3dyaXRlKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHN0cnVjdCBtc2diICpkYXRhKTsKK2ludCBzY2NwX2Nvbm5lY3Rpb25fc2VuZF9pdChzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK2ludCBzY2NwX2Nvbm5lY3Rpb25fY2xvc2Uoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgaW50IGNhdXNlKTsKK2ludCBzY2NwX2Nvbm5lY3Rpb25fZnJlZShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uKTsKKworLyoqCisgKiBDcmVhdGUgYSBuZXcgc29ja2V0LiBTZXQgeW91ciBjYWxsYmFja3MgYW5kIHRoZW4gY2FsbCBiaW5kIHRvIG9wZW4KKyAqIHRoZSBjb25uZWN0aW9uLgorICovCitzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpzY2NwX2Nvbm5lY3Rpb25fc29ja2V0KHZvaWQpOworCisvKioKKyAqIE9wZW4gdGhlIGNvbm5lY3Rpb24gYW5kIHNlbmQgYWRkaXRpb25hbCBkYXRhCisgKi8KK2ludCBzY2NwX2Nvbm5lY3Rpb25fY29ubmVjdChzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uLAorCQkJICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9zY2NwICpzY2NwX2NhbGxlZCwKKwkJCSAgICBzdHJ1Y3QgbXNnYiAqZGF0YSk7CisKKy8qKgorICogbW9zdGx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9ubHkuIFNldCB0aGUgYWNjZXB0IGNhbGxiYWNrLgorICogVE9ETzogYWRkIHRydWUgcm91dGluZyBpbmZvcm1hdGlvbi4uLiBpbiBhbmFsb2d5IHRvIHNvY2tldCwgYmluZCwgYWNjZXB0CisgKi8KK2ludCBzY2NwX2Nvbm5lY3Rpb25fc2V0X2luY29taW5nKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9zY2NwICpzb2NrLAorCQkJCSBpbnQgKCphY2NlcHRfY2IpKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHZvaWQgKmRhdGEpLAorCQkJCSB2b2lkICp1c2VyX2RhdGEpOworCisvKioKKyAqIFNlbmQgZGF0YSBpbiB0ZXJtcyBvZiB1bml0IGRhdGEuIEEgZml4ZWQgYWRkcmVzcyBpbmRpY2F0b3Igd2lsbCBiZSB1c2VkLgorICovCitpbnQgc2NjcF93cml0ZShzdHJ1Y3QgbXNnYiAqZGF0YSwKKwkgICAgICAgY29uc3Qgc3RydWN0IHNvY2thZGRyX3NjY3AgKnNvY2tfc2VuZGVyLAorCSAgICAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc2NjcCAqc29ja190YXJnZXQsIGludCBjbGFzcyk7CitpbnQgc2NjcF9zZXRfcmVhZChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc2NjcCAqc29jaywKKwkJICBpbnQgKCpyZWFkX2NiKShzdHJ1Y3QgbXNnYiAqbXNnYiwgdW5zaWduZWQgaW50LCB2b2lkICp1c2VyX2RhdGEpLAorCQkgIHZvaWQgKnVzZXJfZGF0YSk7CisKKy8qIGdlbmVyaWMgc29jayBhZGRyZXNzZXMgKi8KK2V4dGVybiBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc2NjcCBzY2NwX3Nzbl9ic3NhcDsKKworLyogaGVscGVycyAqLwordV9pbnQzMl90IHNjY3Bfc3JjX3JlZl90b19pbnQoc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSAqcmVmKTsKK3N0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2Ugc2NjcF9zcmNfcmVmX2Zyb21faW50KHVfaW50MzJfdCk7CisKKy8qKgorICogQmVsb3cgdGhpcyBhcmUgaGVscGVyIGZ1bmN0aW9ucyBhbmQgc3RydWN0cyBmb3IgcGFyc2luZyBTQ0NQIG1lc3NhZ2VzCisgKi8KK3N0cnVjdCBzY2NwX3BhcnNlX3Jlc3VsdCB7CisJc3RydWN0IHNjY3BfYWRkcmVzcyBjYWxsZWQ7CisJc3RydWN0IHNjY3BfYWRkcmVzcyBjYWxsaW5nOworCisJLyogcG9pbnQgdG8gdGhlIG1zZyBwYWNrZXQgKi8KKwlzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlICpzb3VyY2VfbG9jYWxfcmVmZXJlbmNlOworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UgKmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZTsKKworCS8qIGRhdGEgcG9pbnRlciAqLworCWludCBkYXRhX2xlbjsKK307CisKKy8qCisgKiBoZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgbmF0IGNvZGUKKyAqLworaW50IHNjY3BfZGV0ZXJtaW5lX21zZ190eXBlKHN0cnVjdCBtc2diICptc2cpOworaW50IHNjY3BfcGFyc2VfaGVhZGVyKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBzY2NwX3BhcnNlX3Jlc3VsdCAqcmVzdWx0KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvc2NjcC9zY2NwX3R5cGVzLmggYi9vcGVuYnNjL2luY2x1ZGUvc2NjcC9zY2NwX3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJmZGE5NgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9zY2NwL3NjY3BfdHlwZXMuaApAQCAtMCwwICsxLDQxNCBAQAorLyoKKyAqIElUVSBRLjcxMyBkZWZpbmVkIHR5cGVzIGZvciBTQ0NQCisgKgorICogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaWZuZGVmIFNDQ1BfVFlQRVNfSAorI2RlZmluZSBTQ0NQX1RZUEVTX0gKKworI2luY2x1ZGUgPGVuZGlhbi5oPgorCisvKiBUYWJsZSAxL1EuNzEzIC0gU0NDUCBtZXNzYWdlIHR5cGVzICovCitlbnVtIHNjY3BfbWVzc2FnZV90eXBlcyB7CisJU0NDUF9NU0dfVFlQRV9DUgk9IDEsCisJU0NDUF9NU0dfVFlQRV9DQwk9IDIsCisJU0NDUF9NU0dfVFlQRV9DUkVGCT0gMywKKwlTQ0NQX01TR19UWVBFX1JMU0QJPSA0LAorCVNDQ1BfTVNHX1RZUEVfUkxDCT0gNSwKKwlTQ0NQX01TR19UWVBFX0RUMQk9IDYsCisJU0NDUF9NU0dfVFlQRV9EVDIJPSA3LAorCVNDQ1BfTVNHX1RZUEVfQUsJPSA4LAorCVNDQ1BfTVNHX1RZUEVfVURUCT0gOSwKKwlTQ0NQX01TR19UWVBFX1VEVFMJPSAxMCwKKwlTQ0NQX01TR19UWVBFX0VECT0gMTEsCisJU0NDUF9NU0dfVFlQRV9FQQk9IDEyLAorCVNDQ1BfTVNHX1RZUEVfUlNSCT0gMTMsCisJU0NDUF9NU0dfVFlQRV9SU0MJPSAxNCwKKwlTQ0NQX01TR19UWVBFX0VSUgk9IDE1LAorCVNDQ1BfTVNHX1RZUEVfSVQJPSAxNiwKKwlTQ0NQX01TR19UWVBFX1hVRFQJPSAxNywKKwlTQ0NQX01TR19UWVBFX1hVRFRTCT0gMTgsCisJU0NDUF9NU0dfVFlQRV9MVURUCT0gMTksCisJU0NDUF9NU0dfVFlQRV9MVURUUwk9IDIwCit9OworCisvKiBUYWJsZSAyL1EuNzEzIC0gU0NDUCBwYXJhbWV0ZXIgbmFtZSBjb2RlcyAqLworZW51bSBzY2NwX3BhcmFtZXRlcl9uYW1lX2NvZGVzIHsKKwlTQ0NQX1BOQ19FTkRfT0ZfT1BUSU9OQUwJCT0gMCwKKwlTQ0NQX1BOQ19ERVNUSU5BVElPTl9MT0NBTF9SRUZFUkVOQ0UJPSAxLAorCVNDQ1BfUE5DX1NPVVJDRV9MT0NBTF9SRUZFUkVOQ0UJCT0gMiwKKwlTQ0NQX1BOQ19DQUxMRURfUEFSVFlfQUREUkVTUwkJPSAzLAorCVNDQ1BfUE5DX0NBTExJTkdfUEFSVFlfQUREUkVTUwkJPSA0LAorCVNDQ1BfUE5DX1BST1RPQ09MX0NMQVNTCQkJPSA1LAorCVNDQ1BfUE5DX1NFR01FTlRJTkcJCQk9IDYsCisJU0NDUF9QTkNfUkVDRUlWRV9TRVFfTlVNQkVSCQk9IDcsCisJU0NDUF9QTkNfU0VRVUVOQ0lORwkJCT0gOCwKKwlTQ0NQX1BOQ19DUkVESVQJCQkJPSA5LAorCVNDQ1BfUE5DX1JFTEVBU0VfQ0FVU0UJCQk9IDEwLAorCVNDQ1BfUE5DX1JFVFVSTl9DQVVTRQkJCT0gMTEsCisJU0NDUF9QTkNfUkVTRVRfQ0FVU0UJCQk9IDEyLAorCVNDQ1BfUE5DX0VSUk9SX0NBVVNFCQkJPSAxMywKKwlTQ0NQX1BOQ19SRUZVU0FMX0NBVVNFCQkJPSAxNCwKKwlTQ0NQX1BOQ19EQVRBCQkJCT0gMTUsCisJU0NDUF9QTkNfU0VHTUVOVEFUSU9OCQkJPSAxNiwKKwlTQ0NQX1BOQ19IT1BfQ09VTlRFUgkJCT0gMTcsCisJU0NDUF9QTkNfSU1QT1JUQU5DRQkJCT0gMTgsCisJU0NDUF9QTkNfTE9OR19EQVRBCQkJPSAxOSwKK307CisKKy8qIEZpZ3VyZSAzL1EuNzEzIENhbGxlZC9jYWxsaW5nIHBhcnR5IGFkZHJlc3MgKi8KK2VudW0geworCVNDQ1BfVElUTEVfSU5EX05PTkUJCQk9IDAsCisJU0NDUF9USVRMRV9JTkRfTkFUVVJFX09OTFkJCT0gMSwKKwlTQ0NQX1RJVExFX0lORF9UUkFOU0xBVElPTl9PTkxZCQk9IDIsCisJU0NDUF9USVRMRV9JTkRfVFJBTlNfTlVNX0VOQwkJPSAzLAorCVNDQ1BfVElUTEVfSU5EX1RSQU5TX05VTV9FTkNfTkFUVVJFCT0gNCwKK307CisKK2VudW0geworCVNDQ1BfQ0FMTF9ST1VURV9PTl9TU04JCQk9IDEsCisJU0NDUF9DQUxMX1JPVVRFX09OX0dUCQkJPSAwLAorfTsKKworc3RydWN0IHNjY3BfY2FsbGVkX3BhcnR5X2FkZHJlc3MgeworI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKwl1X2ludDhfdAlwb2ludF9jb2RlX2luZGljYXRvciA6IDEsCisJCQlzc25faW5kaWNhdG9yCSAgICAgOiAxLAorCQkJZ2xvYmFsX3RpdGxlX2luZGljYXRvciA6IDQsCisJCQlyb3V0aW5nX2luZGljYXRvciAgICA6IDEsCisJCQlyZXNlcnZlZAkgICAgIDogMTsKKyNlbGlmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKwl1X2ludDhfdAlyZXNlcnZlZAkgICAgIDogMSwKKwkJCXJvdXRpbmdfaW5kaWNhdG9yICAgIDogMSwKKwkJCWdsb2JhbF90aXRsZV9pbmRpY2F0b3IgOiA0LAorCQkJc3NuX2luZGljYXRvcgkgICAgIDogMSwKKwkJCXBvaW50X2NvZGVfaW5kaWNhdG9yIDogMTsKKyNlbmRpZgorCXVfaW50OF90CWRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBpbmRpY2F0b3IgaW5kaWNhdGVzIHByZXNlbmNlIGluIHRoZSBhYm92ZSBvcmRlciAqLworCisvKiBGaWd1cmUgNi9RLjcxMyAqLworc3RydWN0IHNjY3Bfc2lnbmFsbGluZ19wb2ludF9jb2RlIHsKKwl1X2ludDhfdAlsc2I7CisjaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorCXVfaW50OF90CW1zYiA6IDYsCisJCQlyZXNlcnZlZCA6IDI7CisjZWxpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisJdV9pbnQ4X3QJcmVzZXJ2ZWQgOiAyLAorCQkJbXNiIDogNjsKKyNlbmRpZgorfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogU1NOID09IHN1YnN5c3RlbSBudW1iZXIgKi8KK2VudW0gc2NjcF9zdWJzeXN0ZW1fbnVtYmVyIHsKKwlTQ0NQX1NTTl9OT1RfS05PV05fT1JfVVNFRAkgICAgPSAwLAorCVNDQ1BfU1NOX01BTkFHRU1FTlQJCSAgICA9IDEsCisJU0NDUF9TU05fUkVTRVJWRURfSVRVCQkgICAgPSAyLAorCVNDQ1BfU1NOX0lTRE5fVVNFUl9QQVJUCQkgICAgPSAzLAorCVNDQ1BfU1NOX09NQVAJCQkgICAgPSA0LCAvKiBvcGVyYXRpb24sIG1haW50IGFuZCBhZG1pbmlzdHJhdGlvbiBwYXJ0ICovCisJU0NDUF9TU05fTUFQCQkJICAgID0gNSwgLyogbW9iaWxlIGFwcGxpY2F0aW9uIHBhcnQgKi8KKwlTQ0NQX1NTTl9ITFIJCQkgICAgPSA2LAorCVNDQ1BfU1NOX1ZMUgkJCSAgICA9IDcsCisJU0NDUF9TU05fTVNDCQkJICAgID0gOCwKKwlTQ0NQX1NTTl9FSUMJCQkgICAgPSA5LCAvKiBlcXVpcGVudCBpZGVudGlmaWVyIGNlbnRyZSAqLworCVNDQ1BfU1NOX0FVQwkJCSAgICA9IDEwLCAvKiBhdXRoZW50aWNhdGlvbiBjZW50cmUgKi8KKwlTQ0NQX1NTTl9JU0ROX1NVUFBMX1NFUlZJQ0VTCSAgICA9IDExLAorCVNDQ1BfU1NOX1JFU0VSVkVEX0lOVEwJCSAgICA9IDEyLAorCVNDQ1BfU1NOX0lTRE5fRURHRV9UT19FREdFCSAgICA9IDEzLAorCVNDQ1BfU1NOX1RDX1RFU1RfUkVTUE9OREVSCSAgICA9IDE0LAorCisJLyogRnJvbSBHU00gMDMuMDMgOC4yICovCisJU0NDUF9TU05fQlNTQVAJCQkgICAgPSAyNTQsCisJU0NDUF9TU05fQlNTT00JCQkgICAgPSAyNTMsCit9OworCisvKiBRLjcxMywgMy40LjIuMyAqLworZW51bSB7CisJU0NDUF9OQUlfVU5LTk9XTgkJICAgID0gMCwKKwlTQ0NQX05BSV9TVUJTQ1JJQkVSX05VTUJFUgkgICAgPSAxLAorCVNDQ1BfTkFJX1JFU0VSVkVEX05BVElPTkFMCSAgICA9IDIsCisJU0NDUF9OQUlfTkFUSU9OQUxfU0lHTklGSUNBTlQJICAgID0gMywKKwlTQ0NQX05BSV9JTlRFUk5BVElPTkFMCQkgICAgPSA0LAorfTsKKworc3RydWN0IHNjY3BfZ2xvYmFsX3RpdGxlIHsKKyNpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisJdV9pbnQ4X3QJbmF0dXJlX29mX2FkZHJfaW5kIDogNywKKwkJCW9kZF9ldmVuIDogMTsKKyNlbGlmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKwl1X2ludDhfdAlvZGRfZXZlbiA6IDEsCisJCQluYXR1cmVfb2ZfYWRkcl9pbmQgOiA3OworI2VuZGlmCisJdV9pbnQ4X3QJZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIFEuNzEzLCAzLjMgKi8KK3N0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UgeworCXVfaW50OF90ICAgIG9jdGV0MTsKKwl1X2ludDhfdCAgICBvY3RldDI7CisJdV9pbnQ4X3QgICAgb2N0ZXQzOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogUS43MTQsIDMuNiAqLworZW51bSBzY2NwX3Byb3RvY29sX2NsYXNzIHsKKwlTQ0NQX1BST1RPQ09MX0NMQVNTXzAJCSAgICA9IDAsCisJU0NDUF9QUk9UT0NPTF9DTEFTU18xCQkgICAgPSAxLAorCVNDQ1BfUFJPVE9DT0xfQ0xBU1NfMgkJICAgID0gMiwKKwlTQ0NQX1BST1RPQ09MX0NMQVNTXzMJCSAgICA9IDMsCit9OworCisvKiBiaXRzIDUtOCB3aGVuIGNsYXNzMCwgY2xhc3MxIGlzIHVzZWQgKi8KK2VudW0gc2NjcF9wcm90b2NvbF9vcHRpb25zIHsKKwlTQ0NQX1BST1RPQ09MX05PX1NQRUNJQUwJICAgID0gMCwKKwlTQ0NQX1BST1RPQ09MX1JFVFVSTl9NRVNTQUdFCSAgICA9IDgsCit9OworCitlbnVtIHNjY3BfcmVsZWFzZV9jYXVzZSB7CisJU0NDUF9SRUxFQVNFX0NBVVNFX0VORF9VU0VSX09SSUdJTkFURUQJICAgID0gMCwKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfRU5EX1VTRVJfQ09OR0VTVElPTgkgICAgPSAxLAorCVNDQ1BfUkVMRUFTRV9DQVVTRV9FTkRfVVNFUl9GQUlMVVJFCSAgICA9IDIsCisJU0NDUF9SRUxFQVNFX0NBVVNFX1NDQ1BfVVNFUl9PUklHSU5BVEVECSAgICA9IDMsCisJU0NDUF9SRUxFQVNFX0NBVVNFX1JFTU9URV9QUk9DRURVUkVfRVJST1IgICA9IDQsCisJU0NDUF9SRUxFQVNFX0NBVVNFX0lOQ09OU0lTVEVOVF9DT05OX0RBVEEgICA9IDUsCisJU0NDUF9SRUxFQVNFX0NBVVNFX0FDQ0VTU19GQUlMVVJFCSAgICA9IDYsCisJU0NDUF9SRUxFQVNFX0NBVVNFX0FDQ0VTU19DT05HRVNUSU9OCSAgICA9IDcsCisJU0NDUF9SRUxFQVNFX0NBVVNFX1NVQlNZU1RFTV9GQUlMVVJFCSAgICA9IDgsCisJU0NDUF9SRUxFQVNFX0NBVVNFX1NVQlNZU1RFTV9DT05HRVNUSU9OCSAgICA9IDksCisJU0NDUF9SRUxFQVNFX0NBVVNFX01UUF9GQUlMVVJFCQkgICAgPSAxMCwKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfTkVUV09SS19DT05HRVNUSU9OCSAgICA9IDExLAorCVNDQ1BfUkVMRUFTRV9DQVVTRV9FWFBJUkFUSU9OX1JFU0VUCSAgICA9IDEyLAorCVNDQ1BfUkVMRUFTRV9DQVVTRV9FWFBJUkFUSU9OX0lOQUNUSVZFCSAgICA9IDEzLAorCVNDQ1BfUkVMRUFTRV9DQVVTRV9SRVNFUlZFRAkJICAgID0gMTQsCisJU0NDUF9SRUxFQVNFX0NBVVNFX1VOUVVBTElGSUVECQkgICAgPSAxNSwKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfU0NDUF9GQUlMVVJFCQkgICAgPSAxNiwKK307CisKK2VudW0gc2NjcF9yZXR1cm5fY2F1c2UgeworCVNDQ1BfUkVUVVJOX0NBVVNFX05PX1RSQU5TTEFUSU9OX05BVFVSRQkgICAgPSAwLAorCVNDQ1BfUkVUVVJOX0NBVVNFX05PX1RSQU5TTEFUSU9OCSAgICA9IDEsCisJU0NDUF9SRVRVUk5fQ0FVU0VfU1VCU1lTVEVNX0NPTkdFU1RJT04JICAgID0gMiwKKwlTQ0NQX1JFVFVSTl9DQVVTRV9TVUJTWVNURU1fRkFJTFVSRQkgICAgPSAzLAorCVNDQ1BfUkVUVVJOX0NBVVNFX1VORVFVSVBQRURfVVNFUgkgICAgPSA0LAorCVNDQ1BfUkVUVVJOX0NBVVNFX01UUF9GQUlMVVJFCQkgICAgPSA1LAorCVNDQ1BfUkVUVVJOX0NBVVNFX05FVFdPUktfQ09OR0VTVElPTgkgICAgPSA2LAorCVNDQ1BfUkVUVVJOX0NBVVNFX1VOUVVBTElGSUVECQkgICAgPSA3LAorCVNDQ1BfUkVUVVJOX0NBVVNFX0VSUk9SX0lOX01TR19UUkFOU1BPUlQgICAgPSA4LAorCVNDQ1BfUkVUVVJOX0NBVVNFX0VSUk9SX0lOX0xPQ0FMX1BST0NFU1NJTkcgPSA5LAorCVNDQ1BfUkVUVVJOX0NBVVNFX0RFU1RfQ0FOTk9UX1BFUkZPUk1fUkVBU1NFTUJMWSA9IDEwLAorCVNDQ1BfUkVUVVJOX0NBVVNFX1NDQ1BfRkFJTFVSRQkJICAgID0gMTEsCisJU0NDUF9SRVRVUk5fQ0FVU0VfSE9QX0NPVU5URVJfVklPTEFUSU9OCSAgICA9IDEyLAorCVNDQ1BfUkVUVVJOX0NBVVNFX1NFR01FTlRBVElPTl9OT1RfU1VQUE9SVEVEPSAxMywKKwlTQ0NQX1JFVFVSTl9DQVVTRV9TRUdNRU5UQVRJT05fRkFPTFVSRQkgICAgPSAxNAorfTsKKworZW51bSBzY2NwX3Jlc2V0X2NhdXNlIHsKKwlTQ0NQX1JFU0VUX0NBVVNFX0VORF9VU0VSX09SSUdJTkFURUQJICAgID0gMCwKKwlTQ0NQX1JFU0VUX0NBVVNFX1NDQ1BfVVNFUl9PUklHSU5BVEVECSAgICA9IDEsCisJU0NDUF9SRVNFVF9DQVVTRV9NU0dfT1VUX09GX09SREVSX1BTCSAgICA9IDIsCisJU0NDUF9SRVNFVF9DQVVTRV9NU0dfT1VUX09GX09SREVSX1BSCSAgICA9IDMsCisJU0NDUF9SRVNFVF9DQVVTRV9SUENfT1VUX09GX1dJTkRPVwkgICAgPSA0LAorCVNDQ1BfUkVTRVRfQ0FVU0VfUlBDX0lOQ09SUkVDVF9QUwkgICAgPSA1LAorCVNDQ1BfUkVTRVRfQ0FVU0VfUlBDX0dFTkVSQUwJCSAgICA9IDYsCisJU0NDUF9SRVNFVF9DQVVTRV9SRU1PVEVfRU5EX1VTRVJfT1BFUkFUSU9OQUw9IDcsCisJU0NDUF9SRVNFVF9DQVVTRV9ORVRXT1JLX09QRVJBVElPTkFMCSAgICA9IDgsCisJU0NDUF9SRVNFVF9DQVVTRV9BQ0NFU1NfT1BFUkFUSU9OQUwJICAgID0gOSwKKwlTQ0NQX1JFU0VUX0NBVVNFX05FVFdPUktfQ09OR0VTVElPTgkgICAgPSAxMCwKKwlTQ0NQX1JFU0VUX0NBVVNFX1JFU0VSVkVECQkgICAgPSAxMSwKK307CisKK2VudW0gc2NjcF9lcnJvcl9jYXVzZSB7CisJU0NDUF9FUlJPUl9MUk5fTUlTTUFUQ0hfVU5BU1NJR05FRAkgICAgPSAwLCAvKiBsb2NhbCByZWZlcmVuY2UgbnVtYmVyICovCisJU0NDUF9FUlJPUl9MUk5fTUlTTUFUQ0hfSU5DT05TSVNURU5UCSAgICA9IDEsCisJU0NDUF9FUlJPUl9QT0lOVF9DT0RFX01JU01BVENICQkgICAgPSAyLAorCVNDQ1BfRVJST1JfU0VSVklDRV9DTEFTU19NSVNNQVRDSAkgICAgPSAzLAorCVNDQ1BfRVJST1JfVU5RVUFMSUZJRUQJCQkgICAgPSA0LAorfTsKKworZW51bSBzY2NwX3JlZnVzYWxfY2F1c2UgeworCVNDQ1BfUkVGVVNBTF9FTkRfVVNFUl9PUklHSU5BVEVECSAgICA9IDAsCisJU0NDUF9SRUZVU0FMX0VORF9VU0VSX0NPTkdFU1RJT04JICAgID0gMSwKKwlTQ0NQX1JFRlVTQUxfRU5EX1VTRVJfRkFJTFVSRQkJICAgID0gMiwKKwlTQ0NQX1JFRlVTQUxfU0NDUF9VU0VSX09SSUdJTkFURUQJICAgID0gMywKKwlTQ0NQX1JFRlVTQUxfREVTVElOQVRJT05fQUREUkVTU19VS05PV04JICAgID0gNCwKKwlTQ0NQX1JFRlVTQUxfREVTVElOQVRJT05fSU5BQ0NFU1NJQkxFCSAgICA9IDUsCisJU0NDUF9SRUZVU0FMX05FVF9RT1NfTk9OX1RSQU5TSUVOVAkgICAgPSA2LAorCVNDQ1BfUkVGVVNBTF9ORVRfUU9TX1RSQU5TSUVOVAkJICAgID0gNywKKwlTQ0NQX1JFRlVTQUxfQUNDRVNTX0ZBSUxVUkUJCSAgICA9IDgsCisJU0NDUF9SRUZVU0FMX0FDQ0VTU19DT05HRVNUSU9OCQkgICAgPSA5LAorCVNDQ1BfUkVGVVNBTF9TVUJTWVNURU1fRkFJTFVSRQkJICAgID0gMTAsCisJU0NDUF9SRUZVU0FMX1NVQlNZVEVNX0NPTkdFU1RJT04JICAgID0gMTEsCisJU0NDUF9SRUZVU0FMX0VYUElSQVRJT04JCQkgICAgPSAxMiwKKwlTQ0NQX1JFRlVTQUxfSU5DT01QQVRJQkxFX1VTRVJfREFUQQkgICAgPSAxMywKKwlTQ0NQX1JFRlVTQUxfUkVTRVJWRUQJCQkgICAgPSAxNCwKKwlTQ0NQX1JFRlVTQUxfVU5RVUFMSUZJRUQJCSAgICA9IDE1LAorCVNDQ1BfUkVGVVNBTF9IT1BfQ09VTlRFUl9WSU9MQVRJT04JICAgID0gMTYsCisJU0NDUF9SRUZVU0FMX1NDQ1BfRkFJTFVSRQkJICAgID0gMTcsCisJU0NDUF9SRUZVU0FMX1VORVFVSVBQRURfVVNFUgkJICAgID0gMTgsCit9OworCisvKgorICogbWVzc2FnZXMuLi4gYXMgb2YgUS43MTMgQ2hhcHRlciA0CisgKi8KK3N0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVxdWVzdCB7CisJLyogbWFuZGFudG9yeSAqLworCXVfaW50OF90CQkJdHlwZTsKKwlzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlCXNvdXJjZV9sb2NhbF9yZWZlcmVuY2U7CisJdV9pbnQ4X3QJCQlwcm90b19jbGFzczsKKworCisJLyogdmFyaWFibGUgKi8KKwl1X2ludDhfdAkJCXZhcmlhYmxlX2NhbGxlZDsKKyNpZiBWQVJJQUJMRQorCWNhbGxlZF9wYXJ0eV9hZGRyZXNzCisjZW5kaWYKKworCS8qIG9wdGlvbmFsICovCisJdV9pbnQ4X3QJCQlvcHRpb25hbF9zdGFydDsKKworI2lmIE9QVElPTkFMCisJY3JlZGl0IDMKKwljYWxsaW5ncGFydHkgdmFyIDQtbgorCWRhdGEgICAgICAgICAgICAzLTEzMAorCWhvcF9jb3VudGVyICAgICAzCisJaW1wb3J0YW5jZSAgICAgIDMKKwllbmRfb2Zfb3B0aW9uYWwgMQorI2VuZGlmCisKKwl1X2ludDhfdAkJCWRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX2NvbmZpcm0geworCS8qIG1hbmRhbnRvcnkgKi8KKwl1X2ludDhfdAkJCXR5cGU7CisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZQlkZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2U7CisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZQlzb3VyY2VfbG9jYWxfcmVmZXJlbmNlOworCXVfaW50OF90CQkJcHJvdG9fY2xhc3M7CisKKwkvKiBvcHRpb25hbCAqLworCXVfaW50OF90CQkJb3B0aW9uYWxfc3RhcnQ7CisKKwkvKiBvcHRpb25hbCAqLworI2lmIE9QVElPTkFMCisJY3JlZGl0IDMKKwljYWxsZWQgcGFydHkgNAorCWRhdGEgICAgICAgICAgICAzLTEzMAorCWltcG9ydGFuY2UgICAgICAzCisJZW5kX29mX29wdGlvbmFsIDEKKyNlbmRpZgorCisJdV9pbnQ4X3QJCQlkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWZ1c2VkIHsKKwkvKiBtYW5kYW50b3J5ICovCisJdV9pbnQ4X3QJCQl0eXBlOworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UJZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlOworCXVfaW50OF90CQkJY2F1c2U7CisKKwkvKiBvcHRpb25hbCAqLworCXVfaW50OF90CQkJb3B0aW9uYWxfc3RhcnQ7CisKKwkvKiBvcHRpb25hbCAqLworI2lmIE9QVElPTkFMCisJY2FsbGVkIHBhcnR5IDQKKwlkYXRhICAgICAgICAgICAgMy0xMzAKKwlpbXBvcnRhbmNlICAgICAgMworCWVuZF9vZl9vcHRpb25hbCAxCisjZW5kaWYKKworCXVfaW50OF90CQkJZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVsZWFzZWQgeworCS8qIG1hbmRhbnRvcnkgKi8KKwl1X2ludDhfdAkJCXR5cGU7CisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZQlkZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2U7CisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZQlzb3VyY2VfbG9jYWxfcmVmZXJlbmNlOworCXVfaW50OF90CQkJcmVsZWFzZV9jYXVzZTsKKworCisJLyogb3B0aW9uYWwgKi8KKwl1X2ludDhfdAkJCW9wdGlvbmFsX3N0YXJ0OworCisjaWYgT1BUSU9OQUwKKwlkYXRhICAgICAgICAgICAgMy0xMzAKKwlpbXBvcnRhbmNlICAgICAgMworCWVuZF9vZl9vcHRpb25hbCAxCisjZW5kaWYKKwl1X2ludDhfdAkJCWRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlbGVhc2VfY29tcGxldGUgeworCXVfaW50OF90CQkJdHlwZTsKKwlzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlCWRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZTsKKwlzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlCXNvdXJjZV9sb2NhbF9yZWZlcmVuY2U7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3Qgc2NjcF9kYXRhX2Zvcm0xIHsKKwkvKiBtYW5kYW50b3J5ICovCisJdV9pbnQ4X3QJCQl0eXBlOworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UJZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlOworCXVfaW50OF90CQkJc2VnbWVudGluZzsKKworCS8qIHZhcmlhYmxlICovCisJdV9pbnQ4X3QJCQl2YXJpYWJsZV9zdGFydDsKKworI2lmIFZBUklBQkxFCisJZGF0YSAyLTI1NjsKKyNlbmRpZgorCisJdV9pbnQ4X3QJCQlkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworCitzdHJ1Y3Qgc2NjcF9kYXRhX3VuaXRkYXRhIHsKKwkvKiBtYW5kYW50b3J5ICovCisJdV9pbnQ4X3QJCQl0eXBlOworCXVfaW50OF90CQkJcHJvdG9fY2xhc3M7CisKKworCS8qIHZhcmlhYmxlICovCisJdV9pbnQ4X3QJCQl2YXJpYWJsZV9jYWxsZWQ7CisJdV9pbnQ4X3QJCQl2YXJpYWJsZV9jYWxsaW5nOworCXVfaW50OF90CQkJdmFyaWFibGVfZGF0YTsKKworI2lmIFZBUklBQkxFCisJY2FsbGVkIHBhcnR5IGFkZHJlc3MKKwljYWxsaW5nIHBhcnR5IGFkZHJlc3MKKyNlbmRpZgorCisJdV9pbnQ4X3QJCQlkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHNjY3BfZGF0YV9pdCB7CisJLyogbWFuZGFudG9yeSAqLworCXVfaW50OF90CQkJdHlwZTsKKwlzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlCWRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZTsKKwlzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlCXNvdXJjZV9sb2NhbF9yZWZlcmVuY2U7CisJdV9pbnQ4X3QJCQlwcm90b19jbGFzczsKKworCXVfaW50OF90CQkJc2VxdWVuY2luZ1syXTsKKwl1X2ludDhfdAkJCWNyZWRpdDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL3Z0eS9NYWtlZmlsZS5hbSBiL29wZW5ic2MvaW5jbHVkZS92dHkvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY3NDc2NgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS92dHkvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSBAQAorbm9pbnN0X0hFQURFUlMgPSBidWZmZXIuaCBjb21tYW5kLmggIHZlY3Rvci5oIHZ0eS5oCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvdnR5L2J1ZmZlci5oIGIvb3BlbmJzYy9pbmNsdWRlL3Z0eS9idWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTUxOTQwCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL3Z0eS9idWZmZXIuaApAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIEJ1ZmZlcmluZyB0byBvdXRwdXQgYW5kIGlucHV0LgorICogQ29weXJpZ2h0IChDKSAxOTk4IEt1bmloaXJvIElzaGlndXJvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIFplYnJhLgorICoKKyAqIEdOVSBaZWJyYSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogR05VIFplYnJhIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBHTlUgWmVicmE7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfWkVCUkFfQlVGRkVSX0gKKyNkZWZpbmUgX1pFQlJBX0JVRkZFUl9ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworLyogQ3JlYXRlIGEgbmV3IGJ1ZmZlci4gIE1lbW9yeSB3aWxsIGJlIGFsbG9jYXRlZCBpbiBjaHVua3Mgb2YgdGhlIGdpdmVuCisgICBzaXplLiAgSWYgdGhlIGFyZ3VtZW50IGlzIDAsIHRoZSBsaWJyYXJ5IHdpbGwgc3VwcGx5IGEgcmVhc29uYWJsZQorICAgZGVmYXVsdCBzaXplIHN1aXRhYmxlIGZvciBidWZmZXJpbmcgc29ja2V0IEkvTy4gKi8KK3N0cnVjdCBidWZmZXIgKmJ1ZmZlcl9uZXcoc2l6ZV90KTsKKworLyogRnJlZSBhbGwgZGF0YSBpbiB0aGUgYnVmZmVyLiAqLwordm9pZCBidWZmZXJfcmVzZXQoc3RydWN0IGJ1ZmZlciAqKTsKKworLyogVGhpcyBmdW5jdGlvbiBmaXJzdCBjYWxscyBidWZmZXJfcmVzZXQgdG8gcmVsZWFzZSBhbGwgYnVmZmVyZWQgZGF0YS4KKyAgIFRoZW4gaXQgZnJlZXMgdGhlIHN0cnVjdCBidWZmZXIgaXRzZWxmLiAqLwordm9pZCBidWZmZXJfZnJlZShzdHJ1Y3QgYnVmZmVyICopOworCisvKiBBZGQgdGhlIGdpdmVuIGRhdGEgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyLiAqLworZXh0ZXJuIHZvaWQgYnVmZmVyX3B1dChzdHJ1Y3QgYnVmZmVyICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKKy8qIEFkZCBhIHNpbmdsZSBjaGFyYWN0ZXIgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyLiAqLworZXh0ZXJuIHZvaWQgYnVmZmVyX3B1dGMoc3RydWN0IGJ1ZmZlciAqLCB1X2NoYXIpOworLyogQWRkIGEgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4gKi8KK2V4dGVybiB2b2lkIGJ1ZmZlcl9wdXRzdHIoc3RydWN0IGJ1ZmZlciAqLCBjb25zdCBjaGFyICopOworCisvKiBDb21iaW5lIGFsbCBhY2N1bXVsYXRlZCAoYW5kIHVuZmx1c2hlZCkgZGF0YSBpbnNpZGUgdGhlIGJ1ZmZlciBpbnRvIGEKKyAgIHNpbmdsZSBOVUwtdGVybWluYXRlZCBzdHJpbmcgYWxsb2NhdGVkIHVzaW5nIFhNQUxMT0MoTVRZUEVfVE1QKS4gIE5vdGUKKyAgIHRoYXQgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBhbHRlciB0aGUgc3RhdGUgb2YgdGhlIGJ1ZmZlciwgc28gdGhlIGRhdGEKKyAgIGlzIHN0aWxsIGluc2lkZSB3YWl0aW5nIHRvIGJlIGZsdXNoZWQuICovCitjaGFyICpidWZmZXJfZ2V0c3RyKHN0cnVjdCBidWZmZXIgKik7CisKKy8qIFJldHVybnMgMSBpZiB0aGVyZSBpcyBubyBwZW5kaW5nIGRhdGEgaW4gdGhlIGJ1ZmZlci4gIE90aGVyd2lzZSByZXR1cm5zIDAuICovCitpbnQgYnVmZmVyX2VtcHR5KHN0cnVjdCBidWZmZXIgKik7CisKK3R5cGVkZWYgZW51bSB7CisJLyogQW4gSS9PIGVycm9yIG9jY3VycmVkLiAgVGhlIGJ1ZmZlciBzaG91bGQgYmUgZGVzdHJveWVkIGFuZCB0aGUKKwkgICBmaWxlIGRlc2NyaXB0b3Igc2hvdWxkIGJlIGNsb3NlZC4gKi8KKwlCVUZGRVJfRVJST1IgPSAtMSwKKworCS8qIFRoZSBkYXRhIHdhcyB3cml0dGVuIHN1Y2Nlc3NmdWxseSwgYW5kIHRoZSBidWZmZXIgaXMgbm93IGVtcHR5CisJICAgKHRoZXJlIGlzIG5vIHBlbmRpbmcgZGF0YSB3YWl0aW5nIHRvIGJlIGZsdXNoZWQpLiAqLworCUJVRkZFUl9FTVBUWSA9IDAsCisKKwkvKiBUaGVyZSBpcyBwZW5kaW5nIGRhdGEgaW4gdGhlIGJ1ZmZlciB3YWl0aW5nIHRvIGJlIGZsdXNoZWQuICBQbGVhc2UKKwkgICB0cnkgZmx1c2hpbmcgdGhlIGJ1ZmZlciB3aGVuIHNlbGVjdCBpbmRpY2F0ZXMgdGhhdCB0aGUgZmlsZSBkZXNjcmlwdG9yCisJICAgaXMgd3JpdGVhYmxlLiAqLworCUJVRkZFUl9QRU5ESU5HID0gMQorfSBidWZmZXJfc3RhdHVzX3Q7CisKKy8qIFRyeSB0byB3cml0ZSB0aGlzIGRhdGEgdG8gdGhlIGZpbGUgZGVzY3JpcHRvci4gIEFueSBkYXRhIHRoYXQgY2Fubm90CisgICBiZSB3cml0dGVuIGltbWVkaWF0ZWx5IGlzIGFkZGVkIHRvIHRoZSBidWZmZXIgcXVldWUuICovCitleHRlcm4gYnVmZmVyX3N0YXR1c190IGJ1ZmZlcl93cml0ZShzdHJ1Y3QgYnVmZmVyICosIGludCBmZCwKKwkJCQkgICAgY29uc3Qgdm9pZCAqLCBzaXplX3QpOworCisvKiBUaGlzIGZ1bmN0aW9uIGF0dGVtcHRzIHRvIGZsdXNoIHNvbWUgKGJ1dCBwZXJoYXBzIG5vdCBhbGwpIG9mCisgICB0aGUgcXVldWVkIGRhdGEgdG8gdGhlIGdpdmVuIGZpbGUgZGVzY3JpcHRvci4gKi8KK2V4dGVybiBidWZmZXJfc3RhdHVzX3QgYnVmZmVyX2ZsdXNoX2F2YWlsYWJsZShzdHJ1Y3QgYnVmZmVyICosIGludCBmZCk7CisKKy8qIFRoZSBmb2xsb3dpbmcgMiBmdW5jdGlvbnMgKGJ1ZmZlcl9mbHVzaF9hbGwgYW5kIGJ1ZmZlcl9mbHVzaF93aW5kb3cpCisgICBhcmUgZm9yIHVzZSBpbiBsaWIvdnR5LmMgb25seS4gIFRoZXkgc2hvdWxkIG5vdCBiZSB1c2VkIGVsc2V3aGVyZS4gKi8KKworLyogQ2FsbCBidWZmZXJfZmx1c2hfYXZhaWxhYmxlIHJlcGVhdGVkbHkgdW50aWwgZWl0aGVyIGFsbCBkYXRhIGhhcyBiZWVuCisgICBmbHVzaGVkLCBvciBhbiBJL08gZXJyb3IgaGFzIGJlZW4gZW5jb3VudGVyZWQsIG9yIHRoZSBvcGVyYXRpb24gd291bGQKKyAgIGJsb2NrLiAqLworZXh0ZXJuIGJ1ZmZlcl9zdGF0dXNfdCBidWZmZXJfZmx1c2hfYWxsKHN0cnVjdCBidWZmZXIgKiwgaW50IGZkKTsKKworLyogQXR0ZW1wdCB0byB3cml0ZSBlbm91Z2ggZGF0YSB0byB0aGUgZ2l2ZW4gZmQgdG8gZmlsbCBhIHdpbmRvdyBvZiB0aGUKKyAgIGdpdmVuIHdpZHRoIGFuZCBoZWlnaHQgKGFuZCByZW1vdmUgdGhlIGRhdGEgd3JpdHRlbiBmcm9tIHRoZSBidWZmZXIpLgorCisgICBJZiAhbm9fbW9yZSwgdGhlbiBhIG1lc3NhZ2Ugc2F5aW5nICIgLS1Nb3JlLS0gIiBpcyBhcHBlbmRlZC4KKyAgIElmIGVyYXNlIGlzIHRydWUsIHRoZW4gZmlyc3Qgb3ZlcndyaXRlIHRoZSBwcmV2aW91cyAiIC0tTW9yZS0tICIgbWVzc2FnZQorICAgd2l0aCBzcGFjZXMuCisKKyAgIEFueSB3cml0ZSBlcnJvciAoaW5jbHVkaW5nIEVBR0FJTiBvciBFSU5UUikgd2lsbCBjYXVzZSB0aGlzIGZ1bmN0aW9uCisgICB0byByZXR1cm4gLTEgKGJlY2F1c2UgdGhlIGxvZ2ljIGZvciBoYW5kbGluZyB0aGUgZXJhc2UgYW5kIG1vcmUgZmVhdHVyZXMKKyAgIGlzIHRvbyBjb21wbGljYXRlZCB0byByZXRyeSB0aGUgd3JpdGUgbGF0ZXIpLgorKi8KK2V4dGVybiBidWZmZXJfc3RhdHVzX3QgYnVmZmVyX2ZsdXNoX3dpbmRvdyhzdHJ1Y3QgYnVmZmVyICosIGludCBmZCwgaW50IHdpZHRoLAorCQkJCQkgICBpbnQgaGVpZ2h0LCBpbnQgZXJhc2UsIGludCBub19tb3JlKTsKKworI2VuZGlmCQkJCS8qIF9aRUJSQV9CVUZGRVJfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL3Z0eS9jb21tYW5kLmggYi9vcGVuYnNjL2luY2x1ZGUvdnR5L2NvbW1hbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2IwNzFmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL3Z0eS9jb21tYW5kLmgKQEAgLTAsMCArMSwzNjEgQEAKKy8qCisgKiBaZWJyYSBjb25maWd1cmF0aW9uIGNvbW1hbmQgaW50ZXJmYWNlIHJvdXRpbmUKKyAqIENvcHlyaWdodCAoQykgMTk5NywgOTggS3VuaWhpcm8gSXNoaWd1cm8KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgWmVicmEuCisgKgorICogR05VIFplYnJhIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBHTlUgWmVicmEgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEdOVSBaZWJyYTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9aRUJSQV9DT01NQU5EX0gKKyNkZWZpbmUgX1pFQlJBX0NPTU1BTkRfSAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlICJ2ZWN0b3IuaCIKKyNpbmNsdWRlICJ2dHkuaCIKKworLyogSG9zdCBjb25maWd1cmF0aW9uIHZhcmlhYmxlICovCitzdHJ1Y3QgaG9zdCB7CisJLyogSG9zdCBuYW1lIG9mIHRoaXMgcm91dGVyLiAqLworCWNoYXIgKm5hbWU7CisKKwkvKiBQYXNzd29yZCBmb3IgdnR5IGludGVyZmFjZS4gKi8KKwljaGFyICpwYXNzd29yZDsKKwljaGFyICpwYXNzd29yZF9lbmNyeXB0OworCisJLyogRW5hYmxlIHBhc3N3b3JkICovCisJY2hhciAqZW5hYmxlOworCWNoYXIgKmVuYWJsZV9lbmNyeXB0OworCisJLyogU3lzdGVtIHdpZGUgdGVybWluYWwgbGluZXMuICovCisJaW50IGxpbmVzOworCisJLyogTG9nIGZpbGVuYW1lLiAqLworCWNoYXIgKmxvZ2ZpbGU7CisKKwkvKiBjb25maWcgZmlsZSBuYW1lIG9mIHRoaXMgaG9zdCAqLworCWNoYXIgKmNvbmZpZzsKKworCS8qIEZsYWdzIGZvciBzZXJ2aWNlcyAqLworCWludCBhZHZhbmNlZDsKKwlpbnQgZW5jcnlwdDsKKworCS8qIEJhbm5lciBjb25maWd1cmF0aW9uLiAqLworCWNvbnN0IGNoYXIgKm1vdGQ7CisJY2hhciAqbW90ZGZpbGU7Cit9OworCisvKiBUaGVyZSBhcmUgc29tZSBjb21tYW5kIGxldmVscyB3aGljaCBjYWxsZWQgZnJvbSBjb21tYW5kIG5vZGUuICovCitlbnVtIG5vZGVfdHlwZSB7CisJQVVUSF9OT0RFLAkJLyogQXV0aGVudGljYXRpb24gbW9kZSBvZiB2dHkgaW50ZXJmYWNlLiAqLworCVZJRVdfTk9ERSwJCS8qIFZpZXcgbm9kZS4gRGVmYXVsdCBtb2RlIG9mIHZ0eSBpbnRlcmZhY2UuICovCisJQVVUSF9FTkFCTEVfTk9ERSwJLyogQXV0aGVudGljYXRpb24gbW9kZSBmb3IgY2hhbmdlIGVuYWJsZS4gKi8KKwlFTkFCTEVfTk9ERSwJCS8qIEVuYWJsZSBub2RlLiAqLworCUNPTkZJR19OT0RFLAkJLyogQ29uZmlnIG5vZGUuIERlZmF1bHQgbW9kZSBvZiBjb25maWcgZmlsZS4gKi8KKwlTRVJWSUNFX05PREUsCQkvKiBTZXJ2aWNlIG5vZGUuICovCisJREVCVUdfTk9ERSwJCS8qIERlYnVnIG5vZGUuICovCisjaWYgMAorCUFBQV9OT0RFLAkJLyogQUFBIG5vZGUuICovCisJS0VZQ0hBSU5fTk9ERSwJCS8qIEtleS1jaGFpbiBub2RlLiAqLworCUtFWUNIQUlOX0tFWV9OT0RFLAkvKiBLZXktY2hhaW4ga2V5IG5vZGUuICovCisJSU5URVJGQUNFX05PREUsCQkvKiBJbnRlcmZhY2UgbW9kZSBub2RlLiAqLworCVpFQlJBX05PREUsCQkvKiB6ZWJyYSBjb25uZWN0aW9uIG5vZGUuICovCisJVEFCTEVfTk9ERSwJCS8qIHJ0bV90YWJsZSBzZWxlY3Rpb24gbm9kZS4gKi8KKwlSSVBfTk9ERSwJCS8qIFJJUCBwcm90b2NvbCBtb2RlIG5vZGUuICovCisJUklQTkdfTk9ERSwJCS8qIFJJUG5nIHByb3RvY29sIG1vZGUgbm9kZS4gKi8KKwlCR1BfTk9ERSwJCS8qIEJHUCBwcm90b2NvbCBtb2RlIHdoaWNoIGluY2x1ZGVzIEJHUDQrICovCisJQkdQX1ZQTlY0X05PREUsCQkvKiBCR1AgTVBMUy1WUE4gUEUgZXhjaGFuZ2UuICovCisJQkdQX0lQVjRfTk9ERSwJCS8qIEJHUCBJUHY0IHVuaWNhc3QgYWRkcmVzcyBmYW1pbHkuICAqLworCUJHUF9JUFY0TV9OT0RFLAkJLyogQkdQIElQdjQgbXVsdGljYXN0IGFkZHJlc3MgZmFtaWx5LiAgKi8KKwlCR1BfSVBWNl9OT0RFLAkJLyogQkdQIElQdjYgYWRkcmVzcyBmYW1pbHkgKi8KKwlPU1BGX05PREUsCQkvKiBPU1BGIHByb3RvY29sIG1vZGUgKi8KKwlPU1BGNl9OT0RFLAkJLyogT1NQRiBwcm90b2NvbCBmb3IgSVB2NiBtb2RlICovCisJSVNJU19OT0RFLAkJLyogSVNJUyBwcm90b2NvbCBtb2RlICovCisJTUFTQ19OT0RFLAkJLyogTUFTQyBmb3IgbXVsdGljYXN0LiAgKi8KKwlJUkRQX05PREUsCQkvKiBJQ01QIFJvdXRlciBEaXNjb3ZlcnkgUHJvdG9jb2wgbW9kZS4gKi8KKwlJUF9OT0RFLAkJLyogU3RhdGljIGlwIHJvdXRlIG5vZGUuICovCisJQUNDRVNTX05PREUsCQkvKiBBY2Nlc3MgbGlzdCBub2RlLiAqLworCVBSRUZJWF9OT0RFLAkJLyogUHJlZml4IGxpc3Qgbm9kZS4gKi8KKwlBQ0NFU1NfSVBWNl9OT0RFLAkvKiBBY2Nlc3MgbGlzdCBub2RlLiAqLworCVBSRUZJWF9JUFY2X05PREUsCS8qIFByZWZpeCBsaXN0IG5vZGUuICovCisJQVNfTElTVF9OT0RFLAkJLyogQVMgbGlzdCBub2RlLiAqLworCUNPTU1VTklUWV9MSVNUX05PREUsCS8qIENvbW11bml0eSBsaXN0IG5vZGUuICovCisJUk1BUF9OT0RFLAkJLyogUm91dGUgbWFwIG5vZGUuICovCisJU01VWF9OT0RFLAkJLyogU05NUCBjb25maWd1cmF0aW9uIG5vZGUuICovCisJRFVNUF9OT0RFLAkJLyogUGFja2V0IGR1bXAgbm9kZS4gKi8KKwlGT1JXQVJESU5HX05PREUsCS8qIElQIGZvcndhcmRpbmcgbm9kZS4gKi8KKyNlbmRpZgorCVZUWV9OT0RFLAkJLyogVnR5IG5vZGUuICovCisKKwlHU01ORVRfTk9ERSwKKwlCVFNfTk9ERSwKKwlUUlhfTk9ERSwKKwlUU19OT0RFLAorCVNVQlNDUl9OT0RFLAorCU1HQ1BfTk9ERSwKK307CisKKy8qIE5vZGUgd2hpY2ggaGFzIHNvbWUgY29tbWFuZHMgYW5kIHByb21wdCBzdHJpbmcgYW5kIGNvbmZpZ3VyYXRpb24KKyAgIGZ1bmN0aW9uIHBvaW50ZXIgLiAqLworc3RydWN0IGNtZF9ub2RlIHsKKwkvKiBOb2RlIGluZGV4LiAqLworCWVudW0gbm9kZV90eXBlIG5vZGU7CisKKwkvKiBQcm9tcHQgY2hhcmFjdGVyIGF0IHZ0eSBpbnRlcmZhY2UuICovCisJY29uc3QgY2hhciAqcHJvbXB0OworCisJLyogSXMgdGhpcyBub2RlJ3MgY29uZmlndXJhdGlvbiBnb2VzIHRvIHZ0eXNoID8gKi8KKwlpbnQgdnR5c2g7CisKKwkvKiBOb2RlJ3MgY29uZmlndXJhdGlvbiB3cml0ZSBmdW5jdGlvbiAqLworCWludCAoKmZ1bmMpIChzdHJ1Y3QgdnR5ICopOworCisJLyogVmVjdG9yIG9mIHRoaXMgbm9kZSdzIGNvbW1hbmQgbGlzdC4gKi8KKwl2ZWN0b3IgY21kX3ZlY3RvcjsKK307CisKK2VudW0geworCUNNRF9BVFRSX0RFUFJFQ0FURUQgPSAxLAorCUNNRF9BVFRSX0hJRERFTiwKK307CisKKy8qIFN0cnVjdHVyZSBvZiBjb21tYW5kIGVsZW1lbnQuICovCitzdHJ1Y3QgY21kX2VsZW1lbnQgeworCWNvbnN0IGNoYXIgKnN0cmluZzsJLyogQ29tbWFuZCBzcGVjaWZpY2F0aW9uIGJ5IHN0cmluZy4gKi8KKwlpbnQgKCpmdW5jKSAoc3RydWN0IGNtZF9lbGVtZW50ICosIHN0cnVjdCB2dHkgKiwgaW50LCBjb25zdCBjaGFyICpbXSk7CisJY29uc3QgY2hhciAqZG9jOwkvKiBEb2N1bWVudGF0aW9uIG9mIHRoaXMgY29tbWFuZC4gKi8KKwlpbnQgZGFlbW9uOwkJLyogRGFlbW9uIHRvIHdoaWNoIHRoaXMgY29tbWFuZCBiZWxvbmcuICovCisJdmVjdG9yIHN0cnZlYzsJCS8qIFBvaW50aW5nIG91dCBlYWNoIGRlc2NyaXB0aW9uIHZlY3Rvci4gKi8KKwl1bnNpZ25lZCBpbnQgY21kc2l6ZTsJLyogQ29tbWFuZCBpbmRleCBjb3VudC4gKi8KKwljaGFyICpjb25maWc7CQkvKiBDb25maWd1cmF0aW9uIHN0cmluZyAqLworCXZlY3RvciBzdWJjb25maWc7CS8qIFN1YiBjb25maWd1cmF0aW9uIHN0cmluZyAqLworCXVfY2hhciBhdHRyOwkJLyogQ29tbWFuZCBhdHRyaWJ1dGVzICovCit9OworCisvKiBDb21tYW5kIGRlc2NyaXB0aW9uIHN0cnVjdHVyZS4gKi8KK3N0cnVjdCBkZXNjIHsKKwljb25zdCBjaGFyICpjbWQ7CS8qIENvbW1hbmQgc3RyaW5nLiAqLworCWNvbnN0IGNoYXIgKnN0cjsJLyogQ29tbWFuZCdzIGRlc2NyaXB0aW9uLiAqLworfTsKKworLyogUmV0dXJuIHZhbHVlIG9mIHRoZSBjb21tYW5kcy4gKi8KKyNkZWZpbmUgQ01EX1NVQ0NFU1MgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ01EX1dBUk5JTkcgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ01EX0VSUl9OT19NQVRDSCAgICAgICAgIDIKKyNkZWZpbmUgQ01EX0VSUl9BTUJJR1VPVVMgICAgICAgIDMKKyNkZWZpbmUgQ01EX0VSUl9JTkNPTVBMRVRFICAgICAgIDQKKyNkZWZpbmUgQ01EX0VSUl9FWEVFRF9BUkdDX01BWCAgIDUKKyNkZWZpbmUgQ01EX0VSUl9OT1RISU5HX1RPRE8gICAgIDYKKyNkZWZpbmUgQ01EX0NPTVBMRVRFX0ZVTExfTUFUQ0ggIDcKKyNkZWZpbmUgQ01EX0NPTVBMRVRFX01BVENIICAgICAgIDgKKyNkZWZpbmUgQ01EX0NPTVBMRVRFX0xJU1RfTUFUQ0ggIDkKKyNkZWZpbmUgQ01EX1NVQ0NFU1NfREFFTU9OICAgICAgMTAKKworLyogQXJnYyBtYXggY291bnRzLiAqLworI2RlZmluZSBDTURfQVJHQ19NQVggICAyNQorCisvKiBUdXJuIG9mZiB0aGVzZSBtYWNyb3Mgd2hlbiB1aXNuZyBjcHAgd2l0aCBleHRyYWN0LnBsICovCisjaWZuZGVmIFZUWVNIX0VYVFJBQ1RfUEwKKworLyogaGVscGVyIGRlZmluZXMgZm9yIGVuZC11c2VyIERFRlVOKiBtYWNyb3MgKi8KKyNkZWZpbmUgREVGVU5fQ01EX0VMRU1FTlQoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgYXR0cnMsIGRudW0pIFwKKyAgc3RydWN0IGNtZF9lbGVtZW50IGNtZG5hbWUgPSBcCisgIHsgXAorICAgIC5zdHJpbmcgPSBjbWRzdHIsIFwKKyAgICAuZnVuYyA9IGZ1bmNuYW1lLCBcCisgICAgLmRvYyA9IGhlbHBzdHIsIFwKKyAgICAuYXR0ciA9IGF0dHJzLCBcCisgICAgLmRhZW1vbiA9IGRudW0sIFwKKyAgfTsKKworI2RlZmluZSBERUZVTl9DTURfRlVOQ19ERUNMKGZ1bmNuYW1lKSBcCisgIHN0YXRpYyBpbnQgZnVuY25hbWUgKHN0cnVjdCBjbWRfZWxlbWVudCAqLCBzdHJ1Y3QgdnR5ICosIGludCwgY29uc3QgY2hhciAqW10pOyBcCisKKyNkZWZpbmUgREVGVU5fQ01EX0ZVTkNfVEVYVChmdW5jbmFtZSkgXAorICBzdGF0aWMgaW50IGZ1bmNuYW1lIFwKKyAgICAoc3RydWN0IGNtZF9lbGVtZW50ICpzZWxmLCBzdHJ1Y3QgdnR5ICp2dHksIGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10pCisKKy8qIERFRlVOIGZvciB2dHkgY29tbWFuZCBpbnRlcmFmY2UuIExpdHRsZSBiaXQgaGFja3kgOy0pLiAqLworI2RlZmluZSBERUZVTihmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCisgIERFRlVOX0NNRF9GVU5DX0RFQ0woZnVuY25hbWUpIFwKKyAgREVGVU5fQ01EX0VMRU1FTlQoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgMCwgMCkgXAorICBERUZVTl9DTURfRlVOQ19URVhUKGZ1bmNuYW1lKQorCisjZGVmaW5lIERFRlVOX0FUVFIoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgYXR0cikgXAorICBERUZVTl9DTURfRlVOQ19ERUNMKGZ1bmNuYW1lKSBcCisgIERFRlVOX0NNRF9FTEVNRU5UKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIGF0dHIsIDApIFwKKyAgREVGVU5fQ01EX0ZVTkNfVEVYVChmdW5jbmFtZSkKKworI2RlZmluZSBERUZVTl9ISURERU4oZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAorICBERUZVTl9BVFRSIChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCBDTURfQVRUUl9ISURERU4pCisKKyNkZWZpbmUgREVGVU5fREVQUkVDQVRFRChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCisgIERFRlVOX0FUVFIgKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIENNRF9BVFRSX0RFUFJFQ0FURUQpIFwKKworLyogREVGVU5fTk9TSCBmb3IgY29tbWFuZHMgdGhhdCB2dHlzaCBzaG91bGQgaWdub3JlICovCisjZGVmaW5lIERFRlVOX05PU0goZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAorICBERUZVTihmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKQorCisvKiBERUZTSCBmb3IgdnR5c2guICovCisjZGVmaW5lIERFRlNIKGRhZW1vbiwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCisgIERFRlVOX0NNRF9FTEVNRU5UKE5VTEwsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgMCwgZGFlbW9uKSBcCisKKy8qIERFRlVOICsgREVGU0ggKi8KKyNkZWZpbmUgREVGVU5TSChkYWVtb24sIGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIpIFwKKyAgREVGVU5fQ01EX0ZVTkNfREVDTChmdW5jbmFtZSkgXAorICBERUZVTl9DTURfRUxFTUVOVChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCAwLCBkYWVtb24pIFwKKyAgREVGVU5fQ01EX0ZVTkNfVEVYVChmdW5jbmFtZSkKKworLyogREVGVU4gKyBERUZTSCB3aXRoIGF0dHJpYnV0ZXMgKi8KKyNkZWZpbmUgREVGVU5TSF9BVFRSKGRhZW1vbiwgZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgYXR0cikgXAorICBERUZVTl9DTURfRlVOQ19ERUNMKGZ1bmNuYW1lKSBcCisgIERFRlVOX0NNRF9FTEVNRU5UKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIGF0dHIsIGRhZW1vbikgXAorICBERUZVTl9DTURfRlVOQ19URVhUKGZ1bmNuYW1lKQorCisjZGVmaW5lIERFRlVOU0hfSElEREVOKGRhZW1vbiwgZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAorICBERUZVTlNIX0FUVFIgKGRhZW1vbiwgZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgQ01EX0FUVFJfSElEREVOKQorCisjZGVmaW5lIERFRlVOU0hfREVQUkVDQVRFRChkYWVtb24sIGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIpIFwKKyAgREVGVU5TSF9BVFRSIChkYWVtb24sIGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIENNRF9BVFRSX0RFUFJFQ0FURUQpCisKKy8qIEFMSUFTIG1hY3JvIHdoaWNoIGRlZmluZSBleGlzdGluZyBjb21tYW5kJ3MgYWxpYXMuICovCisjZGVmaW5lIEFMSUFTKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIpIFwKKyAgREVGVU5fQ01EX0VMRU1FTlQoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgMCwgMCkKKworI2RlZmluZSBBTElBU19BVFRSKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIGF0dHIpIFwKKyAgREVGVU5fQ01EX0VMRU1FTlQoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgYXR0ciwgMCkKKworI2RlZmluZSBBTElBU19ISURERU4oZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAorICBERUZVTl9DTURfRUxFTUVOVChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCBDTURfQVRUUl9ISURERU4sIDApCisKKyNkZWZpbmUgQUxJQVNfREVQUkVDQVRFRChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCisgIERFRlVOX0NNRF9FTEVNRU5UKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIENNRF9BVFRSX0RFUFJFQ0FURUQsIDApCisKKyNkZWZpbmUgQUxJQVNfU0goZGFlbW9uLCBmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCisgIERFRlVOX0NNRF9FTEVNRU5UKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIDAsIGRhZW1vbikKKworI2RlZmluZSBBTElBU19TSF9ISURERU4oZGFlbW9uLCBmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCisgIERFRlVOX0NNRF9FTEVNRU5UKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIENNRF9BVFRSX0hJRERFTiwgZGFlbW9uKQorCisjZGVmaW5lIEFMSUFTX1NIX0RFUFJFQ0FURUQoZGFlbW9uLCBmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCisgIERFRlVOX0NNRF9FTEVNRU5UKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIENNRF9BVFRSX0RFUFJFQ0FURUQsIGRhZW1vbikKKworI2VuZGlmCQkJCS8qIFZUWVNIX0VYVFJBQ1RfUEwgKi8KKworLyogU29tZSBtYWNyb2VzICovCisjZGVmaW5lIENNRF9PUFRJT04oUykgICAoKFNbMF0pID09ICdbJykKKyNkZWZpbmUgQ01EX1ZBUklBQkxFKFMpICgoKFNbMF0pID49ICdBJyAmJiAoU1swXSkgPD0gJ1onKSB8fCAoKFNbMF0pID09ICc8JykpCisjZGVmaW5lIENNRF9WQVJBUkcoUykgICAoKFNbMF0pID09ICcuJykKKyNkZWZpbmUgQ01EX1JBTkdFKFMpCSgoU1swXSA9PSAnPCcpKQorCisjZGVmaW5lIENNRF9JUFY0KFMpCSAgICgoc3RyY21wICgoUyksICJBLkIuQy5EIikgPT0gMCkpCisjZGVmaW5lIENNRF9JUFY0X1BSRUZJWChTKSAoKHN0cmNtcCAoKFMpLCAiQS5CLkMuRC9NIikgPT0gMCkpCisjZGVmaW5lIENNRF9JUFY2KFMpICAgICAgICAoKHN0cmNtcCAoKFMpLCAiWDpYOjpYOlgiKSA9PSAwKSkKKyNkZWZpbmUgQ01EX0lQVjZfUFJFRklYKFMpICgoc3RyY21wICgoUyksICJYOlg6Olg6WC9NIikgPT0gMCkpCisKKy8qIENvbW1vbiBkZXNjcmlwdGlvbnMuICovCisjZGVmaW5lIFNIT1dfU1RSICJTaG93IHJ1bm5pbmcgc3lzdGVtIGluZm9ybWF0aW9uXG4iCisjZGVmaW5lIElQX1NUUiAiSVAgaW5mb3JtYXRpb25cbiIKKyNkZWZpbmUgSVBWNl9TVFIgIklQdjYgaW5mb3JtYXRpb25cbiIKKyNkZWZpbmUgTk9fU1RSICJOZWdhdGUgYSBjb21tYW5kIG9yIHNldCBpdHMgZGVmYXVsdHNcbiIKKyNkZWZpbmUgQ0xFQVJfU1RSICJSZXNldCBmdW5jdGlvbnNcbiIKKyNkZWZpbmUgUklQX1NUUiAiUklQIGluZm9ybWF0aW9uXG4iCisjZGVmaW5lIEJHUF9TVFIgIkJHUCBpbmZvcm1hdGlvblxuIgorI2RlZmluZSBPU1BGX1NUUiAiT1NQRiBpbmZvcm1hdGlvblxuIgorI2RlZmluZSBORUlHSEJPUl9TVFIgIlNwZWNpZnkgbmVpZ2hib3Igcm91dGVyXG4iCisjZGVmaW5lIERFQlVHX1NUUiAiRGVidWdnaW5nIGZ1bmN0aW9ucyAoc2VlIGFsc28gJ3VuZGVidWcnKVxuIgorI2RlZmluZSBVTkRFQlVHX1NUUiAiRGlzYWJsZSBkZWJ1Z2dpbmcgZnVuY3Rpb25zIChzZWUgYWxzbyAnZGVidWcnKVxuIgorI2RlZmluZSBST1VURVJfU1RSICJFbmFibGUgYSByb3V0aW5nIHByb2Nlc3NcbiIKKyNkZWZpbmUgQVNfU1RSICJBUyBudW1iZXJcbiIKKyNkZWZpbmUgTUJHUF9TVFIgIk1CR1AgaW5mb3JtYXRpb25cbiIKKyNkZWZpbmUgTUFUQ0hfU1RSICJNYXRjaCB2YWx1ZXMgZnJvbSByb3V0aW5nIHRhYmxlXG4iCisjZGVmaW5lIFNFVF9TVFIgIlNldCB2YWx1ZXMgaW4gZGVzdGluYXRpb24gcm91dGluZyBwcm90b2NvbFxuIgorI2RlZmluZSBPVVRfU1RSICJGaWx0ZXIgb3V0Z29pbmcgcm91dGluZyB1cGRhdGVzXG4iCisjZGVmaW5lIElOX1NUUiAgIkZpbHRlciBpbmNvbWluZyByb3V0aW5nIHVwZGF0ZXNcbiIKKyNkZWZpbmUgVjROT1RBVElPTl9TVFIgInNwZWNpZnkgYnkgSVB2NCBhZGRyZXNzIG5vdGF0aW9uKGUuZy4gMC4wLjAuMClcbiIKKyNkZWZpbmUgT1NQRjZfTlVNQkVSX1NUUiAiU3BlY2lmeSBieSBudW1iZXJcbiIKKyNkZWZpbmUgSU5URVJGQUNFX1NUUiAiSW50ZXJmYWNlIGluZm9tYXRpb25cbiIKKyNkZWZpbmUgSUZOQU1FX1NUUiAiSW50ZXJmYWNlIG5hbWUoZS5nLiBlcDApXG4iCisjZGVmaW5lIElQNl9TVFIgIklQdjYgSW5mb3JtYXRpb25cbiIKKyNkZWZpbmUgT1NQRjZfU1RSICJPcGVuIFNob3J0ZXN0IFBhdGggRmlyc3QgKE9TUEYpIGZvciBJUHY2XG4iCisjZGVmaW5lIE9TUEY2X1JPVVRFUl9TVFIgIkVuYWJsZSBhIHJvdXRpbmcgcHJvY2Vzc1xuIgorI2RlZmluZSBPU1BGNl9JTlNUQU5DRV9TVFIgIjwxLTY1NTM1PiBJbnN0YW5jZSBJRFxuIgorI2RlZmluZSBTRUNPTkRTX1NUUiAiPDEtNjU1MzU+IFNlY29uZHNcbiIKKyNkZWZpbmUgUk9VVEVfU1RSICJSb3V0aW5nIFRhYmxlXG4iCisjZGVmaW5lIFBSRUZJWF9MSVNUX1NUUiAiQnVpbGQgYSBwcmVmaXggbGlzdFxuIgorI2RlZmluZSBPU1BGNl9EVU1QX1RZUEVfTElTVCBcCisiKG5laWdoYm9yfGludGVyZmFjZXxhcmVhfGxzYXx6ZWJyYXxjb25maWd8ZGJleHxzcGZ8cm91dGV8bHNkYnxyZWRpc3RyaWJ1dGV8aG9va3xhc2JyfHByZWZpeHxhYnIpIgorI2RlZmluZSBJU0lTX1NUUiAiSVMtSVMgaW5mb3JtYXRpb25cbiIKKyNkZWZpbmUgQVJFQV9UQUdfU1RSICJbYXJlYSB0YWddXG4iCisKKyNkZWZpbmUgQ09ORl9CQUNLVVBfRVhUICIuc2F2IgorCisvKiBJUHY0IG9ubHkgbWFjaGluZSBzaG91bGQgbm90IGFjY2VwdCBJUHY2IGFkZHJlc3MgZm9yIHBlZXIncyBJUAorICAgYWRkcmVzcy4gIFNvIHdlIHJlcGxhY2UgVlRZIGNvbW1hbmQgc3RyaW5nIGxpa2UgYmVsb3cuICovCisjaWZkZWYgSEFWRV9JUFY2CisjZGVmaW5lIE5FSUdIQk9SX0NNRCAgICAgICAibmVpZ2hib3IgKEEuQi5DLkR8WDpYOjpYOlgpICIKKyNkZWZpbmUgTk9fTkVJR0hCT1JfQ01EICAgICJubyBuZWlnaGJvciAoQS5CLkMuRHxYOlg6Olg6WCkgIgorI2RlZmluZSBORUlHSEJPUl9BRERSX1NUUiAgIk5laWdoYm9yIGFkZHJlc3NcbklQdjYgYWRkcmVzc1xuIgorI2RlZmluZSBORUlHSEJPUl9DTUQyICAgICAgIm5laWdoYm9yIChBLkIuQy5EfFg6WDo6WDpYfFdPUkQpICIKKyNkZWZpbmUgTk9fTkVJR0hCT1JfQ01EMiAgICJubyBuZWlnaGJvciAoQS5CLkMuRHxYOlg6Olg6WHxXT1JEKSAiCisjZGVmaW5lIE5FSUdIQk9SX0FERFJfU1RSMiAiTmVpZ2hib3IgYWRkcmVzc1xuTmVpZ2hib3IgSVB2NiBhZGRyZXNzXG5OZWlnaGJvciB0YWdcbiIKKyNlbHNlCisjZGVmaW5lIE5FSUdIQk9SX0NNRCAgICAgICAibmVpZ2hib3IgQS5CLkMuRCAiCisjZGVmaW5lIE5PX05FSUdIQk9SX0NNRCAgICAibm8gbmVpZ2hib3IgQS5CLkMuRCAiCisjZGVmaW5lIE5FSUdIQk9SX0FERFJfU1RSICAiTmVpZ2hib3IgYWRkcmVzc1xuIgorI2RlZmluZSBORUlHSEJPUl9DTUQyICAgICAgIm5laWdoYm9yIChBLkIuQy5EfFdPUkQpICIKKyNkZWZpbmUgTk9fTkVJR0hCT1JfQ01EMiAgICJubyBuZWlnaGJvciAoQS5CLkMuRHxXT1JEKSAiCisjZGVmaW5lIE5FSUdIQk9SX0FERFJfU1RSMiAiTmVpZ2hib3IgYWRkcmVzc1xuTmVpZ2hib3IgdGFnXG4iCisjZW5kaWYJCQkJLyogSEFWRV9JUFY2ICovCisKKy8qIFByb3RvdHlwZXMuICovCit2b2lkIGluc3RhbGxfbm9kZShzdHJ1Y3QgY21kX25vZGUgKiwgaW50ICgqKShzdHJ1Y3QgdnR5ICopKTsKK3ZvaWQgaW5zdGFsbF9kZWZhdWx0KGVudW0gbm9kZV90eXBlKTsKK3ZvaWQgaW5zdGFsbF9lbGVtZW50KGVudW0gbm9kZV90eXBlLCBzdHJ1Y3QgY21kX2VsZW1lbnQgKik7Cit2b2lkIHNvcnRfbm9kZSgpOworCisvKiBDb25jYXRlbmF0ZXMgYXJndltzaGlmdF0gdGhyb3VnaCBhcmd2W2FyZ2MtMV0gaW50byBhIHNpbmdsZSBOVUwtdGVybWluYXRlZAorICAgc3RyaW5nIHdpdGggYSBzcGFjZSBiZXR3ZWVuIGVhY2ggZWxlbWVudCAoYWxsb2NhdGVkIHVzaW5nCisgICBYTUFMTE9DKE1UWVBFX1RNUCkpLiAgUmV0dXJucyBOVUxMIGlmIHNoaWZ0ID49IGFyZ2MuICovCitjaGFyICphcmd2X2NvbmNhdChjb25zdCBjaGFyICoqYXJndiwgaW50IGFyZ2MsIGludCBzaGlmdCk7CisKK3ZlY3RvciBjbWRfbWFrZV9zdHJ2ZWMoY29uc3QgY2hhciAqKTsKK3ZvaWQgY21kX2ZyZWVfc3RydmVjKHZlY3Rvcik7Cit2ZWN0b3IgY21kX2Rlc2NyaWJlX2NvbW1hbmQoKTsKK2NoYXIgKipjbWRfY29tcGxldGVfY29tbWFuZCgpOworY29uc3QgY2hhciAqY21kX3Byb21wdChlbnVtIG5vZGVfdHlwZSk7CitpbnQgY29uZmlnX2Zyb21fZmlsZShzdHJ1Y3QgdnR5ICosIEZJTEUgKik7CitlbnVtIG5vZGVfdHlwZSBub2RlX3BhcmVudChlbnVtIG5vZGVfdHlwZSk7CitpbnQgY21kX2V4ZWN1dGVfY29tbWFuZCh2ZWN0b3IsIHN0cnVjdCB2dHkgKiwgc3RydWN0IGNtZF9lbGVtZW50ICoqLCBpbnQpOworaW50IGNtZF9leGVjdXRlX2NvbW1hbmRfc3RyaWN0KHZlY3Rvciwgc3RydWN0IHZ0eSAqLCBzdHJ1Y3QgY21kX2VsZW1lbnQgKiopOwordm9pZCBjb25maWdfcmVwbGFjZV9zdHJpbmcoc3RydWN0IGNtZF9lbGVtZW50ICosIGNoYXIgKiwgLi4uKTsKK3ZvaWQgY21kX2luaXQoaW50KTsKKworLyogRXhwb3J0IHR5cGljYWwgZnVuY3Rpb25zLiAqLworZXh0ZXJuIHN0cnVjdCBjbWRfZWxlbWVudCBjb25maWdfZW5kX2NtZDsKK2V4dGVybiBzdHJ1Y3QgY21kX2VsZW1lbnQgY29uZmlnX2V4aXRfY21kOworZXh0ZXJuIHN0cnVjdCBjbWRfZWxlbWVudCBjb25maWdfcXVpdF9jbWQ7CitleHRlcm4gc3RydWN0IGNtZF9lbGVtZW50IGNvbmZpZ19oZWxwX2NtZDsKK2V4dGVybiBzdHJ1Y3QgY21kX2VsZW1lbnQgY29uZmlnX2xpc3RfY21kOworY2hhciAqaG9zdF9jb25maWdfZmlsZSgpOwordm9pZCBob3N0X2NvbmZpZ19zZXQoY29uc3QgY2hhciAqKTsKKwordm9pZCBwcmludF92ZXJzaW9uKGNvbnN0IGNoYXIgKik7CisKK2V4dGVybiB2b2lkICp0YWxsX3Z0eV9jbWRfY3R4OworCisjZW5kaWYJCQkJLyogX1pFQlJBX0NPTU1BTkRfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL3Z0eS92ZWN0b3IuaCBiL29wZW5ic2MvaW5jbHVkZS92dHkvdmVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJhMTg0ZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS92dHkvdmVjdG9yLmgKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIEdlbmVyaWMgdmVjdG9yIGludGVyZmFjZSBoZWFkZXIuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDk4IEt1bmloaXJvIElzaGlndXJvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIFplYnJhLgorICoKKyAqIEdOVSBaZWJyYSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogR05VIFplYnJhIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBHTlUgWmVicmE7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgKiAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfWkVCUkFfVkVDVE9SX0gKKyNkZWZpbmUgX1pFQlJBX1ZFQ1RPUl9ICisKKy8qIHN0cnVjdCBmb3IgdmVjdG9yICovCitzdHJ1Y3QgX3ZlY3RvciB7CisJdW5zaWduZWQgaW50IGFjdGl2ZTsJLyogbnVtYmVyIG9mIGFjdGl2ZSBzbG90cyAqLworCXVuc2lnbmVkIGludCBhbGxvY2VkOwkvKiBudW1iZXIgb2YgYWxsb2NhdGVkIHNsb3QgKi8KKwl2b2lkICoqaW5kZXg7CQkvKiBpbmRleCB0byBkYXRhICovCit9OwordHlwZWRlZiBzdHJ1Y3QgX3ZlY3RvciAqdmVjdG9yOworCisjZGVmaW5lIFZFQ1RPUl9NSU5fU0laRSAxCisKKy8qIChTb21ldGltZXMpIHVzZWZ1bGwgbWFjcm9zLiAgVGhpcyBtYWNybyBjb252ZXJ0IGluZGV4IGV4cHJlc3Npb24gdG8KKyBhcnJheSBleHByZXNzaW9uLiAqLworLyogUmVmZXJlbmNlIHNsb3QgYXQgZ2l2ZW4gaW5kZXgsIGNhbGxlciBtdXN0IGVuc3VyZSBzbG90IGlzIGFjdGl2ZSAqLworI2RlZmluZSB2ZWN0b3Jfc2xvdChWLEkpICAoKFYpLT5pbmRleFsoSSldKQorLyogTnVtYmVyIG9mIGFjdGl2ZSBzbG90cy4KKyAqIE5vdGUgdGhhdCB0aGlzIGRpZmZlcnMgZnJvbSB2ZWN0b3JfY291bnQoKSBhcyBpdCB0aGUgY291bnQgcmV0dXJuZWQKKyAqIHdpbGwgaW5jbHVkZSBhbnkgZW1wdHkgc2xvdHMKKyAqLworI2RlZmluZSB2ZWN0b3JfYWN0aXZlKFYpICgoViktPmFjdGl2ZSkKKworLyogUHJvdG90eXBlcy4gKi8KK3ZlY3RvciB2ZWN0b3JfaW5pdCh1bnNpZ25lZCBpbnQgc2l6ZSk7Cit2b2lkIHZlY3Rvcl9lbnN1cmUodmVjdG9yIHYsIHVuc2lnbmVkIGludCBudW0pOworaW50IHZlY3Rvcl9lbXB0eV9zbG90KHZlY3RvciB2KTsKK2ludCB2ZWN0b3Jfc2V0KHZlY3RvciB2LCB2b2lkICp2YWwpOworaW50IHZlY3Rvcl9zZXRfaW5kZXgodmVjdG9yIHYsIHVuc2lnbmVkIGludCBpLCB2b2lkICp2YWwpOwordm9pZCB2ZWN0b3JfdW5zZXQodmVjdG9yIHYsIHVuc2lnbmVkIGludCBpKTsKK3Vuc2lnbmVkIGludCB2ZWN0b3JfY291bnQodmVjdG9yIHYpOwordm9pZCB2ZWN0b3Jfb25seV93cmFwcGVyX2ZyZWUodmVjdG9yIHYpOwordm9pZCB2ZWN0b3Jfb25seV9pbmRleF9mcmVlKHZvaWQgKmluZGV4KTsKK3ZvaWQgdmVjdG9yX2ZyZWUodmVjdG9yIHYpOwordmVjdG9yIHZlY3Rvcl9jb3B5KHZlY3RvciB2KTsKKwordm9pZCAqdmVjdG9yX2xvb2t1cCh2ZWN0b3IsIHVuc2lnbmVkIGludCk7Cit2b2lkICp2ZWN0b3JfbG9va3VwX2Vuc3VyZSh2ZWN0b3IsIHVuc2lnbmVkIGludCk7CisKK2V4dGVybiB2b2lkICp0YWxsX3Z0eV92ZWNfY3R4OworCisjZW5kaWYJCQkJLyogX1pFQlJBX1ZFQ1RPUl9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvdnR5L3Z0eS5oIGIvb3BlbmJzYy9pbmNsdWRlL3Z0eS92dHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDQxZmM1Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL3Z0eS92dHkuaApAQCAtMCwwICsxLDE1MSBAQAorI2lmbmRlZiBfVlRZX0gKKyNkZWZpbmUgX1ZUWV9ICisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisvKiBHQ0MgaGF2ZSBwcmludGYgdHlwZSBhdHRyaWJ1dGUgY2hlY2suICAqLworI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIFZUWV9QUklOVEZfQVRUUklCVVRFKGEsYikgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIGEsIGIpKSkKKyNlbHNlCisjZGVmaW5lIFZUWV9QUklOVEZfQVRUUklCVVRFKGEsYikKKyNlbmRpZgkJCQkvKiBfX0dOVUNfXyAqLworCisvKiBEb2VzIHRoZSBJL08gZXJyb3IgaW5kaWNhdGUgdGhhdCB0aGUgb3BlcmF0aW9uIHNob3VsZCBiZSByZXRyaWVkIGxhdGVyPyAqLworI2RlZmluZSBFUlJOT19JT19SRVRSWShFTikgXAorCSgoKEVOKSA9PSBFQUdBSU4pIHx8ICgoRU4pID09IEVXT1VMREJMT0NLKSB8fCAoKEVOKSA9PSBFSU5UUikpCisKKy8qIFZ0eSByZWFkIGJ1ZmZlciBzaXplLiAqLworI2RlZmluZSBWVFlfUkVBRF9CVUZTSVogNTEyCisKKyNkZWZpbmUgVlRZX0JVRlNJWiA1MTIKKyNkZWZpbmUgVlRZX01BWEhJU1QgMjAKKworLyogVnR5IGV2ZW50cyAqLworZW51bSBldmVudCB7CisJVlRZX1NFUlYsCisJVlRZX1JFQUQsCisJVlRZX1dSSVRFLAorCVZUWV9DTE9TRUQsCisJVlRZX1RJTUVPVVRfUkVTRVQsCisjaWZkZWYgVlRZU0gKKwlWVFlTSF9TRVJWLAorCVZUWVNIX1JFQUQsCisJVlRZU0hfV1JJVEUKKyNlbmRpZgkJCQkvKiBWVFlTSCAqLworfTsKKworc3RydWN0IHZ0eSB7CisJRklMRSAqZmlsZTsKKworCS8qIHByaXZhdGUgZGF0YSwgc3BlY2lmaWVkIGJ5IGNyZWF0b3IgKi8KKwl2b2lkICpwcml2OworCisJLyogRmlsZSBkZXNjcmlwdGVyIG9mIHRoaXMgdnR5LiAqLworCWludCBmZDsKKworCS8qIElzIHRoaXMgdnR5IGNvbm5lY3QgdG8gZmlsZSBvciBub3QgKi8KKwllbnVtIHsgVlRZX1RFUk0sIFZUWV9GSUxFLCBWVFlfU0hFTEwsIFZUWV9TSEVMTF9TRVJWIH0gdHlwZTsKKworCS8qIE5vZGUgc3RhdHVzIG9mIHRoaXMgdnR5ICovCisJaW50IG5vZGU7CisKKwkvKiBGYWlsdXJlIGNvdW50ICovCisJaW50IGZhaWw7CisKKwkvKiBPdXRwdXQgYnVmZmVyLiAqLworCXN0cnVjdCBidWZmZXIgKm9idWY7CisKKwkvKiBDb21tYW5kIGlucHV0IGJ1ZmZlciAqLworCWNoYXIgKmJ1ZjsKKworCS8qIENvbW1hbmQgY3Vyc29yIHBvaW50ICovCisJaW50IGNwOworCisJLyogQ29tbWFuZCBsZW5ndGggKi8KKwlpbnQgbGVuZ3RoOworCisJLyogQ29tbWFuZCBtYXggbGVuZ3RoLiAqLworCWludCBtYXg7CisKKwkvKiBIaXN0cnkgb2YgY29tbWFuZCAqLworCWNoYXIgKmhpc3RbVlRZX01BWEhJU1RdOworCisJLyogSGlzdG9yeSBsb29rdXAgY3VycmVudCBwb2ludCAqLworCWludCBocDsKKworCS8qIEhpc3RvcnkgaW5zZXJ0IGVuZCBwb2ludCAqLworCWludCBoaW5kZXg7CisKKwkvKiBGb3IgY3VycmVudCByZWZlcmVuY2luZyBwb2ludCBvZiBpbnRlcmZhY2UsIHJvdXRlLW1hcCwKKwkgICBhY2Nlc3MtbGlzdCBldGMuLi4gKi8KKwl2b2lkICppbmRleDsKKworCS8qIEZvciBtdWx0aXBsZSBsZXZlbCBpbmRleCB0cmVhdG1lbnQgc3VjaCBhcyBrZXkgY2hhaW4gYW5kIGtleS4gKi8KKwl2b2lkICppbmRleF9zdWI7CisKKwkvKiBGb3IgZXNjYXBlIGNoYXJhY3Rlci4gKi8KKwl1bnNpZ25lZCBjaGFyIGVzY2FwZTsKKworCS8qIEN1cnJlbnQgdnR5IHN0YXR1cy4gKi8KKwllbnVtIHsgVlRZX05PUk1BTCwgVlRZX0NMT1NFLCBWVFlfTU9SRSwgVlRZX01PUkVMSU5FIH0gc3RhdHVzOworCisJLyogSUFDIGhhbmRsaW5nOiB3YXMgdGhlIGxhc3QgY2hhcmFjdGVyIHJlY2VpdmVkIHRoZSBJQUMKKwkgKiAoaW50ZXJwcmV0LWFzLWNvbW1hbmQpIGVzY2FwZSBjaGFyYWN0ZXIgKGFuZCB0aGVyZWZvcmUgdGhlIG5leHQKKwkgKiBjaGFyYWN0ZXIgd2lsbCBiZSB0aGUgY29tbWFuZCBjb2RlKT8gIFJlZmVyIHRvIFRlbG5ldCBSRkMgODU0LiAqLworCXVuc2lnbmVkIGNoYXIgaWFjOworCisJLyogSUFDIFNCIChvcHRpb24gc3VibmVnb3RpYXRpb24pIGhhbmRsaW5nICovCisJdW5zaWduZWQgY2hhciBpYWNfc2JfaW5fcHJvZ3Jlc3M7CisJLyogQXQgdGhlIG1vbWVudCwgd2UgY2FyZSBvbmx5IGFib3V0IHRoZSBOQVdTICh3aW5kb3cgc2l6ZSkgbmVnb3RpYXRpb24sCisJICogYW5kIHRoYXQgcmVxdWlyZXMganVzdCBhIDUtY2hhcmFjdGVyIGJ1ZmZlciAoUkZDIDEwNzMpOgorCSAqIDxOQVdTIGNoYXI+IDwxNi1iaXQgd2lkdGg+IDwxNi1iaXQgaGVpZ2h0PiAqLworI2RlZmluZSBURUxORVRfTkFXU19TQl9MRU4gNQorCXVuc2lnbmVkIGNoYXIgc2JfYnVmW1RFTE5FVF9OQVdTX1NCX0xFTl07CisJLyogSG93IG1hbnkgc3VibmVnb3RpYXRpb24gY2hhcmFjdGVycyBoYXZlIHdlIHJlY2VpdmVkPyAgV2UganVzdCBkcm9wCisJICogdGhvc2UgdGhhdCBkbyBub3QgZml0IGluIHRoZSBidWZmZXIuICovCisJc2l6ZV90IHNiX2xlbjsKKworCS8qIFdpbmRvdyB3aWR0aC9oZWlnaHQuICovCisJaW50IHdpZHRoOworCWludCBoZWlnaHQ7CisKKwkvKiBDb25maWd1cmUgbGluZXMuICovCisJaW50IGxpbmVzOworCisJaW50IG1vbml0b3I7CisKKwkvKiBJbiBjb25maWd1cmUgbW9kZS4gKi8KKwlpbnQgY29uZmlnOworfTsKKworLyogU21hbGwgbWFjcm8gdG8gZGV0ZXJtaW5lIG5ld2xpbmUgaXMgbmV3bGluZSBvbmx5IG9yIGxpbmVmZWVkIG5lZWRlZC4gKi8KKyNkZWZpbmUgVlRZX05FV0xJTkUgICgodnR5LT50eXBlID09IFZUWV9URVJNKSA/ICJcclxuIiA6ICJcbiIpCisKK3N0YXRpYyBpbmxpbmUgY2hhciAqdnR5X25ld2xpbmUoc3RydWN0IHZ0eSAqdnR5KQoreworCXJldHVybiBWVFlfTkVXTElORTsKK30KKworLyogUHJvdG90eXBlcy4gKi8KK3ZvaWQgdnR5X2luaXQgKHZvaWQpOworaW50IHZ0eV9yZWFkX2NvbmZpZ19maWxlKGNvbnN0IGNoYXIgKmZpbGVfbmFtZSk7Cit2b2lkIHZ0eV9pbml0X3Z0eXNoICh2b2lkKTsKK3ZvaWQgdnR5X3Jlc2V0ICh2b2lkKTsKK3N0cnVjdCB2dHkgKnZ0eV9uZXcgKHZvaWQpOworc3RydWN0IHZ0eSAqdnR5X2NyZWF0ZSAoaW50IHZ0eV9zb2NrLCB2b2lkICpwcml2KTsKK2ludCB2dHlfb3V0IChzdHJ1Y3QgdnR5ICosIGNvbnN0IGNoYXIgKiwgLi4uKSBWVFlfUFJJTlRGX0FUVFJJQlVURSgyLCAzKTsKK2ludCB2dHlfb3V0X25ld2xpbmUoc3RydWN0IHZ0eSAqKTsKK2ludCB2dHlfcmVhZChzdHJ1Y3QgdnR5ICp2dHkpOworLy92b2lkIHZ0eV90aW1lX3ByaW50IChzdHJ1Y3QgdnR5ICosIGludCk7Cit2b2lkIHZ0eV9jbG9zZSAoc3RydWN0IHZ0eSAqKTsKK2NoYXIgKnZ0eV9nZXRfY3dkICh2b2lkKTsKK3ZvaWQgdnR5X2xvZyAoY29uc3QgY2hhciAqbGV2ZWwsIGNvbnN0IGNoYXIgKnByb3RvLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QpOworaW50IHZ0eV9jb25maWdfbG9jayAoc3RydWN0IHZ0eSAqKTsKK2ludCB2dHlfY29uZmlnX3VubG9jayAoc3RydWN0IHZ0eSAqKTsKK2ludCB2dHlfc2hlbGwgKHN0cnVjdCB2dHkgKik7CitpbnQgdnR5X3NoZWxsX3NlcnYgKHN0cnVjdCB2dHkgKik7Cit2b2lkIHZ0eV9oZWxsbyAoc3RydWN0IHZ0eSAqKTsKKwordm9pZCAqdGFsbF92dHlfY3R4OworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2xpYnNjY3AucGMuaW4gYi9vcGVuYnNjL2xpYnNjY3AucGMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRhOGQ0OQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvbGlic2NjcC5wYy5pbgpAQCAtMCwwICsxLDEwIEBACitwcmVmaXg9QHByZWZpeEAKK2V4ZWNfcHJlZml4PUBleGVjX3ByZWZpeEAKK2xpYmRpcj1AbGliZGlyQAoraW5jbHVkZWRpcj1AaW5jbHVkZWRpckAKKworTmFtZTogT3BlbkJTQyBTQ0NQIExpYgorRGVzY3JpcHRpb246IE9wZW5CU0MgU0NDUCBMaWIKK1ZlcnNpb246IEBWRVJTSU9OQAorTGliczogLUwke2xpYmRpcn0gLWxzY2NwCitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfS8KZGlmZiAtLWdpdCBhL29wZW5ic2Mvb3BlbmJzYy5wYy5pbiBiL29wZW5ic2Mvb3BlbmJzYy5wYy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmEwN2UyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9vcGVuYnNjLnBjLmluCkBAIC0wLDAgKzEsMTEgQEAKK3ByZWZpeD1AcHJlZml4QAorZXhlY19wcmVmaXg9QGV4ZWNfcHJlZml4QAorbGliZGlyPUBsaWJkaXJACitpbmNsdWRlZGlyPUBpbmNsdWRlZGlyQC8KKworTmFtZTogT3BlbkJTQworRGVzY3JpcHRpb246IE9wZW5CU0MgYmFzZSBzdGF0aW9uIGNvbnRyb2xsZXIKK1JlcXVpcmVzOgorVmVyc2lvbjogQFZFUlNJT05ACitMaWJzOiAtTCR7bGliZGlyfSAtbG9wZW5ic2MKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9NYWtlZmlsZS5hbSBiL29wZW5ic2Mvc3JjL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMTg0NzUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQ4IEBACitJTkNMVURFUyA9ICQoYWxsX2luY2x1ZGVzKSAtSSQodG9wX3NyY2RpcikvaW5jbHVkZSAtSSQodG9wX2J1aWxkZGlyKQorQU1fQ0ZMQUdTPS1XYWxsICQoTElCT1NNT0NPUkVfQ0ZMQUdTKQorQU1fTERGTEFHUyA9ICQoTElCT1NNT0NPUkVfTElCUykKKworc2Jpbl9QUk9HUkFNUyA9IGJzY19oYWNrIGJzMTFfY29uZmlnIGlwYWNjZXNzLWZpbmQgaXBhY2Nlc3MtY29uZmlnIFwKKyAgICAgICAgICAgICAgICBpc2Ruc3luYyBic2NfbWdjcCBpcGFjY2Vzcy1wcm94eQorbm9pbnN0X0xJQlJBUklFUyA9IGxpYmJzYy5hIGxpYm1zYy5hIGxpYnZ0eS5hCitub2luc3RfSEVBREVSUyA9IHZ0eS9jYXJkc2hlbGwuaAorCitic2NkaXIgPSAkKGxpYmRpcikKK2JzY19MSUJSQVJJRVMgPSBsaWJzY2NwLmEKKworbGliYnNjX2FfU09VUkNFUyA9IGFiaXNfcnNsLmMgYWJpc19ubS5jIGdzbV9kYXRhLmMgZ3NtXzA0XzA4X3V0aWxzLmMgXAorCQljaGFuX2FsbG9jLmMgZGVidWcuYyBcCisJCWdzbV9zdWJzY3JpYmVyX2Jhc2UuYyBzdWJjaGFuX2RlbXV4LmMgYnNjX3JsbC5jIHRyYW5zYWN0aW9uLmMgXAorCQl0cmF1X2ZyYW1lLmMgdHJhdV9tdXguYyBwYWdpbmcuYyBlMV9jb25maWcuYyBlMV9pbnB1dC5jIFwKKwkJaW5wdXQvbWlzZG4uYyBpbnB1dC9pcGFjY2Vzcy5jIFwKKwkJdGFsbG9jX2N0eC5jIHN5c3RlbV9pbmZvcm1hdGlvbi5jIHJlc3Rfb2N0ZXRzLmMgXAorCQlydHBfcHJveHkuYyBidHNfc2llbWVuc19iczExLmMgYnRzX2lwYWNjZXNzX25hbm9idHMuYyBcCisJCWJ0c191bmtub3duLmMgYnNjX3ZlcnNpb24uYworCitsaWJtc2NfYV9TT1VSQ0VTID0gZ3NtX3N1YnNjcmliZXIuYyBkYi5jIHRlbG5ldF9pbnRlcmZhY2UuYyBcCisJCW1uY2MuYyBnc21fMDRfMDguYyBnc21fMDRfMTEuYyB0cmFuc2FjdGlvbi5jIFwKKwkJdG9rZW5fYXV0aC5jIHJybHAuYyBnc21fMDRfODAuYyB1c3NkLmMgc2lsZW50X2NhbGwuYyBcCisJCWhhbmRvdmVyX2xvZ2ljLmMgaGFuZG92ZXJfZGVjaXNpb24uYyBtZWFzX3JlcC5jCisKK2xpYnZ0eV9hX1NPVVJDRVMgPSB2dHkvYnVmZmVyLmMgdnR5L2NvbW1hbmQuYyB2dHkvdmVjdG9yLmMgdnR5L3Z0eS5jCisKK2xpYnNjY3BfYV9TT1VSQ0VTID0gc2NjcC9zY2NwLmMKKworYnNjX2hhY2tfU09VUkNFUyA9IGJzY19oYWNrLmMgYnNjX2luaXQuYyB2dHlfaW50ZXJmYWNlLmMgdnR5X2ludGVyZmFjZV9sYXllcjMuYworYnNjX2hhY2tfTERBREQgPSBsaWJtc2MuYSBsaWJic2MuYSBsaWJtc2MuYSBsaWJ2dHkuYSAtbGRsIC1sZGJpICQoTElCQ1JZUFQpCisKK2JzMTFfY29uZmlnX1NPVVJDRVMgPSBiczExX2NvbmZpZy5jIGFiaXNfbm0uYyBnc21fZGF0YS5jIGRlYnVnLmMgXAorCQkgICAgICByczIzMi5jIGJ0c19zaWVtZW5zX2JzMTEuYworCitpcGFjY2Vzc19maW5kX1NPVVJDRVMgPSBpcGFjY2Vzcy9pcGFjY2Vzcy1maW5kLmMKKworaXBhY2Nlc3NfY29uZmlnX1NPVVJDRVMgPSBpcGFjY2Vzcy9pcGFjY2Vzcy1jb25maWcuYyBpcGFjY2Vzcy9pcGFjY2Vzcy1maXJtd2FyZS5jCitpcGFjY2Vzc19jb25maWdfTERBREQgPSBsaWJic2MuYSBsaWJtc2MuYSBsaWJic2MuYSBsaWJ2dHkuYSAtbGRsIC1sZGJpICQoTElCQ1JZUFQpCisKK2lzZG5zeW5jX1NPVVJDRVMgPSBpc2Ruc3luYy5jCisKK2JzY19tZ2NwX1NPVVJDRVMgPSBtZ2NwL21nY3BfbWFpbi5jIG1nY3AvbWdjcF9wcm90b2NvbC5jIG1nY3AvbWdjcF9uZXR3b3JrLmMgbWdjcC9tZ2NwX3Z0eS5jIFwKKwkJICAgZGVidWcuYyB0ZWxuZXRfaW50ZXJmYWNlLmMKK2JzY19tZ2NwX0xEQUREID0gbGlidnR5LmEKKworaXBhY2Nlc3NfcHJveHlfU09VUkNFUyA9IGlwYWNjZXNzL2lwYWNjZXNzLXByb3h5LmMgZGVidWcuYwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvYWJpc19ubS5jIGIvb3BlbmJzYy9zcmMvYWJpc19ubS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ODUyYmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9hYmlzX25tLmMKQEAgLTAsMCArMSwyOTY5IEBACisvKiBHU00gTmV0d29yayBNYW5hZ2VtZW50IChPTUwpIG1lc3NhZ2VzIG9uIHRoZSBBLWJpcyBpbnRlcmZhY2UgCisgKiAzR1BQIFRTIDEyLjIxIHZlcnNpb24gOC4wLjAgUmVsZWFzZSAxOTk5IC8gRVRTSSBUUyAxMDAgNjIzIFY4LjAuMCAqLworCisvKiAoQykgMjAwOC0yMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGxpYmdlbi5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGx2Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX25tLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9taXNkbi5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisKKyNkZWZpbmUgT01fQUxMT0NfU0laRQkJMTAyNAorI2RlZmluZSBPTV9IRUFEUk9PTV9TSVpFCTEyOAorI2RlZmluZSBJUEFDQ19TRUdNRU5UX1NJWkUJMjQ1CisKKy8qIHVuaWRpcmVjdGlvbmFsIG1lc3NhZ2VzIGZyb20gQlRTIHRvIEJTQyAqLworc3RhdGljIGNvbnN0IGVudW0gYWJpc19ubV9tc2d0eXBlIHJlcG9ydHNbXSA9IHsKKwlOTV9NVF9TV19BQ1RJVkFURURfUkVQLAorCU5NX01UX1RFU1RfUkVQLAorCU5NX01UX1NUQVRFQ0hHX0VWRU5UX1JFUCwKKwlOTV9NVF9GQUlMVVJFX0VWRU5UX1JFUCwKK307CisKKy8qIG1lc3NhZ2VzIHdpdGhvdXQgQUNLL05BQ0sgKi8KK3N0YXRpYyBjb25zdCBlbnVtIGFiaXNfbm1fbXNndHlwZSBub19hY2tfbmFja1tdID0geworCU5NX01UX01FQVNfUkVTX1JFUSwKKwlOTV9NVF9TVE9QX01FQVMsCisJTk1fTVRfU1RBUlRfTUVBUywKK307CisKKy8qIE1lc3NhZ2VzIHJlbGF0ZWQgdG8gc29mdHdhcmUgbG9hZCAqLworc3RhdGljIGNvbnN0IGVudW0gYWJpc19ubV9tc2d0eXBlIHN3X2xvYWRfbXNnc1tdID0geworCU5NX01UX0xPQURfSU5JVF9BQ0ssCisJTk1fTVRfTE9BRF9JTklUX05BQ0ssCisJTk1fTVRfTE9BRF9TRUdfQUNLLAorCU5NX01UX0xPQURfQUJPUlQsCisJTk1fTVRfTE9BRF9FTkRfQUNLLAorCU5NX01UX0xPQURfRU5EX05BQ0ssCisJLy9OTV9NVF9TV19BQ1RfUkVRLAorCU5NX01UX0FDVElWQVRFX1NXX0FDSywKKwlOTV9NVF9BQ1RJVkFURV9TV19OQUNLLAorCU5NX01UX1NXX0FDVElWQVRFRF9SRVAsCit9OworCitzdGF0aWMgY29uc3QgZW51bSBhYmlzX25tX21zZ3R5cGUgbmFja3NbXSA9IHsKKwlOTV9NVF9MT0FEX0lOSVRfTkFDSywKKwlOTV9NVF9MT0FEX0VORF9OQUNLLAorCU5NX01UX1NXX0FDVF9SRVFfTkFDSywKKwlOTV9NVF9BQ1RJVkFURV9TV19OQUNLLAorCU5NX01UX0VTVEFCTElTSF9URUlfTkFDSywKKwlOTV9NVF9DT05OX1RFUlJfU0lHTl9OQUNLLAorCU5NX01UX0RJU0NfVEVSUl9TSUdOX05BQ0ssCisJTk1fTVRfQ09OTl9URVJSX1RSQUZfTkFDSywKKwlOTV9NVF9ESVNDX1RFUlJfVFJBRl9OQUNLLAorCU5NX01UX0NPTk5fTURST1BfTElOS19OQUNLLAorCU5NX01UX0RJU0NfTURST1BfTElOS19OQUNLLAorCU5NX01UX1NFVF9CVFNfQVRUUl9OQUNLLAorCU5NX01UX1NFVF9SQURJT19BVFRSX05BQ0ssCisJTk1fTVRfU0VUX0NIQU5fQVRUUl9OQUNLLAorCU5NX01UX1BFUkZfVEVTVF9OQUNLLAorCU5NX01UX1NFTkRfVEVTVF9SRVBfTkFDSywKKwlOTV9NVF9TVE9QX1RFU1RfTkFDSywKKwlOTV9NVF9TVE9QX0VWRU5UX1JFUF9OQUNLLAorCU5NX01UX1JFU1RfRVZFTlRfUkVQX05BQ0ssCisJTk1fTVRfQ0hHX0FETV9TVEFURV9OQUNLLAorCU5NX01UX0NIR19BRE1fU1RBVEVfUkVRX05BQ0ssCisJTk1fTVRfUkVQX09VVFNUX0FMQVJNU19OQUNLLAorCU5NX01UX0NIQU5HRU9WRVJfTkFDSywKKwlOTV9NVF9PUFNUQVJUX05BQ0ssCisJTk1fTVRfUkVJTklUX05BQ0ssCisJTk1fTVRfU0VUX1NJVEVfT1VUX05BQ0ssCisJTk1fTVRfQ0hHX0hXX0NPTkZfTkFDSywKKwlOTV9NVF9HRVRfQVRUUl9OQUNLLAorCU5NX01UX1NFVF9BTEFSTV9USFJFU19OQUNLLAorCU5NX01UX0JTMTFfQkVHSU5fREJfVFhfTkFDSywKKwlOTV9NVF9CUzExX0VORF9EQl9UWF9OQUNLLAorCU5NX01UX0JTMTFfQ1JFQVRFX09CSl9OQUNLLAorCU5NX01UX0JTMTFfREVMRVRFX09CSl9OQUNLLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgbmFja19uYW1lc1tdID0geworCXsgTk1fTVRfTE9BRF9JTklUX05BQ0ssCQkiU09GVFdBUkUgTE9BRCBJTklUIiB9LAorCXsgTk1fTVRfTE9BRF9FTkRfTkFDSywJCSJTT0ZUV0FSRSBMT0FEIEVORCIgfSwKKwl7IE5NX01UX1NXX0FDVF9SRVFfTkFDSywJIlNPRlRXQVJFIEFDVElWQVRFIFJFUVVFU1QiIH0sCisJeyBOTV9NVF9BQ1RJVkFURV9TV19OQUNLLAkiQUNUSVZBVEUgU09GVFdBUkUiIH0sCisJeyBOTV9NVF9FU1RBQkxJU0hfVEVJX05BQ0ssCSJFU1RBQkxJU0ggVEVJIiB9LAorCXsgTk1fTVRfQ09OTl9URVJSX1NJR05fTkFDSywJIkNPTk5FQ1QgVEVSUkVTVFJJQUwgU0lHTkFMTElORyIgfSwKKwl7IE5NX01UX0RJU0NfVEVSUl9TSUdOX05BQ0ssCSJESVNDT05ORUNUIFRFUlJFU1RSSUFMIFNJR05BTExJTkciIH0sCisJeyBOTV9NVF9DT05OX1RFUlJfVFJBRl9OQUNLLAkiQ09OTkVDVCBURVJSRVNUUklBTCBUUkFGRklDIiB9LAorCXsgTk1fTVRfRElTQ19URVJSX1RSQUZfTkFDSywJIkRJU0NPTk5FQ1QgVEVSUkVTVFJJQUwgVFJBRkZJQyIgfSwKKwl7IE5NX01UX0NPTk5fTURST1BfTElOS19OQUNLLAkiQ09OTkVDVCBNVUxUSS1EUk9QIExJTksiIH0sCisJeyBOTV9NVF9ESVNDX01EUk9QX0xJTktfTkFDSywJIkRJU0NPTk5FQ1QgTVVMVEktRFJPUCBMSU5LIiB9LAorCXsgTk1fTVRfU0VUX0JUU19BVFRSX05BQ0ssCSJTRVQgQlRTIEFUVFJJQlVURSIgfSwKKwl7IE5NX01UX1NFVF9SQURJT19BVFRSX05BQ0ssCSJTRVQgUkFESU8gQVRUUklCVVRFIiB9LAorCXsgTk1fTVRfU0VUX0NIQU5fQVRUUl9OQUNLLAkiU0VUIENIQU5ORUwgQVRUUklCVVRFIiB9LAorCXsgTk1fTVRfUEVSRl9URVNUX05BQ0ssCQkiUEVSRk9STSBURVNUIiB9LAorCXsgTk1fTVRfU0VORF9URVNUX1JFUF9OQUNLLAkiU0VORCBURVNUIFJFUE9SVCIgfSwKKwl7IE5NX01UX1NUT1BfVEVTVF9OQUNLLAkJIlNUT1AgVEVTVCIgfSwKKwl7IE5NX01UX1NUT1BfRVZFTlRfUkVQX05BQ0ssCSJTVE9QIEVWRU5UIFJFUE9SVCIgfSwKKwl7IE5NX01UX1JFU1RfRVZFTlRfUkVQX05BQ0ssCSJSRVNFVCBFVkVOVCBSRVBPUlQiIH0sCisJeyBOTV9NVF9DSEdfQURNX1NUQVRFX05BQ0ssCSJDSEFOR0UgQURNSU5JU1RSQVRJVkUgU1RBVEUiIH0sCisJeyBOTV9NVF9DSEdfQURNX1NUQVRFX1JFUV9OQUNLLAorCQkJCSJDSEFOR0UgQURNSU5JU1RSQVRJVkUgU1RBVEUgUkVRVUVTVCIgfSwKKwl7IE5NX01UX1JFUF9PVVRTVF9BTEFSTVNfTkFDSywJIlJFUE9SVCBPVVRTVEFORElORyBBTEFSTVMiIH0sCisJeyBOTV9NVF9DSEFOR0VPVkVSX05BQ0ssCSJDSEFOR0VPVkVSIiB9LAorCXsgTk1fTVRfT1BTVEFSVF9OQUNLLAkJIk9QU1RBUlQiIH0sCisJeyBOTV9NVF9SRUlOSVRfTkFDSywJCSJSRUlOSVQiIH0sCisJeyBOTV9NVF9TRVRfU0lURV9PVVRfTkFDSywJIlNFVCBTSVRFIE9VVFBVVCIgfSwKKwl7IE5NX01UX0NIR19IV19DT05GX05BQ0ssCSJDSEFOR0UgSEFSRFdBUkUgQ09ORklHVVJBVElPTiIgfSwKKwl7IE5NX01UX0dFVF9BVFRSX05BQ0ssCQkiR0VUIEFUVFJJQlVURSIgfSwKKwl7IE5NX01UX1NFVF9BTEFSTV9USFJFU19OQUNLLAkiU0VUIEFMQVJNIFRIUkVTSE9MRCIgfSwKKwl7IE5NX01UX0JTMTFfQkVHSU5fREJfVFhfTkFDSywJIkJTMTEgQkVHSU4gREFUQUJBU0UgVFJBTlNNSVNTSU9OIiB9LAorCXsgTk1fTVRfQlMxMV9FTkRfREJfVFhfTkFDSywJIkJTMTEgRU5EIERBVEFCQVNFIFRSQU5TTUlTU0lPTiIgfSwKKwl7IE5NX01UX0JTMTFfQ1JFQVRFX09CSl9OQUNLLAkiQlMxMSBDUkVBVEUgT0JKRUNUIiB9LAorCXsgTk1fTVRfQlMxMV9ERUxFVEVfT0JKX05BQ0ssCSJCUzExIERFTEVURSBPQkpFQ1QiIH0sCisJeyAwLAkJCQlOVUxMIH0KK307CisKKy8qIENoYXB0ZXIgOS40LjM2ICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyBuYWNrX2NhdXNlX25hbWVzW10gPSB7CisJLyogR2VuZXJhbCBOYWNrIENhdXNlcyAqLworCXsgTk1fTkFDS19JTkNPUlJfU1RSVUNULAkiSW5jb3JyZWN0IG1lc3NhZ2Ugc3RydWN0dXJlIiB9LAorCXsgTk1fTkFDS19NU0dUWVBFX0lOVkFMLAkiSW52YWxpZCBtZXNzYWdlIHR5cGUgdmFsdWUiIH0sCisJeyBOTV9OQUNLX09CSkNMQVNTX0lOVkFMLAkiSW52YWxpZCBPYmplY3QgY2xhc3MgdmFsdWUiIH0sCisJeyBOTV9OQUNLX09CSkNMQVNTX05PVFNVUFAsCSJPYmplY3QgY2xhc3Mgbm90IHN1cHBvcnRlZCIgfSwKKwl7IE5NX05BQ0tfQlRTTlJfVU5LTiwJCSJCVFMgbm8uIHVua25vd24iIH0sCisJeyBOTV9OQUNLX1RSWE5SX1VOS04sCQkiQmFzZWJhbmQgVHJhbnNjZWl2ZXIgbm8uIHVua25vd24iIH0sCisJeyBOTV9OQUNLX09CSklOU1RfVU5LTiwJCSJPYmplY3QgSW5zdGFuY2UgdW5rbm93biIgfSwKKwl7IE5NX05BQ0tfQVRUUklEX0lOVkFMLAkJIkludmFsaWQgYXR0cmlidXRlIGlkZW50aWZpZXIgdmFsdWUiIH0sCisJeyBOTV9OQUNLX0FUVFJJRF9OT1RTVVBQLAkiQXR0cmlidXRlIGlkZW50aWZpZXIgbm90IHN1cHBvcnRlZCIgfSwKKwl7IE5NX05BQ0tfUEFSQU1fUkFOR0UsCQkiUGFyYW1ldGVyIHZhbHVlIG91dHNpZGUgcGVybWl0dGVkIHJhbmdlIiB9LAorCXsgTk1fTkFDS19BVFRSTElTVF9JTkNPTlNJU1RFTlQsIkluY29uc2lzdGVuY3kgaW4gYXR0cmlidXRlIGxpc3QiIH0sCisJeyBOTV9OQUNLX1NQRUNfSU1QTF9OT1RTVVBQLAkiU3BlY2lmaWVkIGltcGxlbWVudGF0aW9uIG5vdCBzdXBwb3J0ZWQiIH0sCisJeyBOTV9OQUNLX0NBTlRfUEVSRk9STSwJCSJNZXNzYWdlIGNhbm5vdCBiZSBwZXJmb3JtZWQiIH0sCisJLyogU3BlY2lmaWMgTmFjayBDYXVzZXMgKi8KKwl7IE5NX05BQ0tfUkVTX05PVElNUEwsCQkiUmVzb3VyY2Ugbm90IGltcGxlbWVudGVkIiB9LAorCXsgTk1fTkFDS19SRVNfTk9UQVZBSUwsCQkiUmVzb3VyY2Ugbm90IGF2YWlsYWJsZSIgfSwKKwl7IE5NX05BQ0tfRlJFUV9OT1RBVkFJTCwJIkZyZXF1ZW5jeSBub3QgYXZhaWxhYmxlIiB9LAorCXsgTk1fTkFDS19URVNUX05PVFNVUFAsCQkiVGVzdCBub3Qgc3VwcG9ydGVkIiB9LAorCXsgTk1fTkFDS19DQVBBQ0lUWV9SRVNUUiwJIkNhcGFjaXR5IHJlc3RyaWN0aW9ucyIgfSwKKwl7IE5NX05BQ0tfUEhZU0NGR19OT1RQRVJGT1JNLAkiUGh5c2ljYWwgY29uZmlndXJhdGlvbiBjYW5ub3QgYmUgcGVyZm9ybWVkIiB9LAorCXsgTk1fTkFDS19URVNUX05PVElOSVQsCQkiVGVzdCBub3QgaW5pdGlhdGVkIiB9LAorCXsgTk1fTkFDS19QSFlTQ0ZHX05PVFJFU1RPUkUsCSJQaHlzaWNhbCBjb25maWd1cmF0aW9uIGNhbm5vdCBiZSByZXN0b3JlZCIgfSwKKwl7IE5NX05BQ0tfVEVTVF9OT1NVQ0gsCQkiTm8gc3VjaCB0ZXN0IiB9LAorCXsgTk1fTkFDS19URVNUX05PU1RPUCwJCSJUZXN0IGNhbm5vdCBiZSBzdG9wcGVkIiB9LAorCXsgTk1fTkFDS19NU0dJTkNPTlNJU1RfUEhZU0NGRywJIk1lc3NhZ2UgaW5jb25zaXN0ZW50IHdpdGggcGh5c2ljYWwgY29uZmlndXJhdGlvbiIgfSwKKwl7IE5NX05BQ0tfRklMRV9JTkNPTVBMRVRFLAkiQ29tcGxldGUgZmlsZSBub3RyZWNlaXZlZCIgfSwKKwl7IE5NX05BQ0tfRklMRV9OT1RBVkFJTCwJIkZpbGUgbm90IGF2YWlsYWJsZSBhdCBkZXN0aW5hdGlvbiIgfSwKKwl7IE5NX05BQ0tfRklMRV9OT1RBQ1RJVkFURSwJIkZpbGUgY2Fubm90IGJlIGFjdGl2YXRlIiB9LAorCXsgTk1fTkFDS19SRVFfTk9UX0dSQU5ULAkiUmVxdWVzdCBub3QgZ3JhbnRlZCIgfSwKKwl7IE5NX05BQ0tfV0FJVCwJCQkiV2FpdCIgfSwKKwl7IE5NX05BQ0tfTk9USF9SRVBPUlRfRVhJU1QsCSJOb3RoaW5nIHJlcG9ydGFibGUgZXhpc3RpbmciIH0sCisJeyBOTV9OQUNLX01FQVNfTk9UU1VQUCwJCSJNZWFzdXJlbWVudCBub3Qgc3VwcG9ydGVkIiB9LAorCXsgTk1fTkFDS19NRUFTX05PVFNUQVJULAkiTWVhc3VyZW1lbnQgbm90IHN0YXJ0ZWQiIH0sCisJeyAwLAkJCQlOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpuYWNrX2NhdXNlX25hbWUodV9pbnQ4X3QgY2F1c2UpCit7CisJcmV0dXJuIGdldF92YWx1ZV9zdHJpbmcobmFja19jYXVzZV9uYW1lcywgY2F1c2UpOworfQorCisvKiBDaGFwdGVyIDkuNC4xNjogRXZlbnQgVHlwZSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgZXZlbnRfdHlwZV9uYW1lc1tdID0geworCXsgTk1fRVZUX0NPTU1fRkFJTCwJCSJjb21tdW5pY2F0aW9uIGZhaWx1cmUiIH0sCisJeyBOTV9FVlRfUU9TX0ZBSUwsCQkicXVhbGl0eSBvZiBzZXJ2aWNlIGZhaWx1cmUiIH0sCisJeyBOTV9FVlRfUFJPQ19GQUlMLAkJInByb2Nlc3NpbmcgZmFpbHVyZSIgfSwKKwl7IE5NX0VWVF9FUVVJUF9GQUlMLAkJImVxdWlwbWVudCBmYWlsdXJlIiB9LAorCXsgTk1fRVZUX0VOVl9GQUlMLAkJImVudmlyb25tZW50IGZhaWx1cmUiIH0sCisJeyAwLAkJCQlOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpldmVudF90eXBlX25hbWUodV9pbnQ4X3QgY2F1c2UpCit7CisJcmV0dXJuIGdldF92YWx1ZV9zdHJpbmcoZXZlbnRfdHlwZV9uYW1lcywgY2F1c2UpOworfQorCisvKiBDaGFwdGVyIDkuNC42MzogUGVyY2VpdmVkIFNldmVyaXR5ICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyBzZXZlcml0eV9uYW1lc1tdID0geworCXsgTk1fU0VWRVJfQ0VBU0VELAkJImZhaWx1cmUgY2Vhc2VkIiB9LAorCXsgTk1fU0VWRVJfQ1JJVElDQUwsCQkiY3JpdGljYWwgZmFpbHVyZSIgfSwKKwl7IE5NX1NFVkVSX01BSk9SLAkJIm1ham9yIGZhaWx1cmUiIH0sCisJeyBOTV9TRVZFUl9NSU5PUiwJCSJtaW5vciBmYWlsdXJlIiB9LAorCXsgTk1fU0VWRVJfV0FSTklORywJCSJ3YXJuaW5nIGxldmVsIGZhaWx1cmUiIH0sCisJeyBOTV9TRVZFUl9JTkRFVEVSTUlOQVRFLAkiaW5kZXRlcm1pbmF0ZSBmYWlsdXJlIiB9LAorCXsgMCwJCQkJTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgY2hhciAqc2V2ZXJpdHlfbmFtZSh1X2ludDhfdCBjYXVzZSkKK3sKKwlyZXR1cm4gZ2V0X3ZhbHVlX3N0cmluZyhzZXZlcml0eV9uYW1lcywgY2F1c2UpOworfQorCisvKiBBdHRyaWJ1dGVzIHRoYXQgdGhlIEJTQyBjYW4gc2V0LCBub3Qgb25seSBnZXQsIGFjY29yZGluZyB0byBTZWN0aW9uIDkuNCAqLworc3RhdGljIGNvbnN0IGVudW0gYWJpc19ubV9hdHRyIG5tX2F0dF9zZXR0YWJsZVtdID0geworCU5NX0FUVF9BRERfSU5GTywKKwlOTV9BVFRfQUREX1RFWFQsCisJTk1fQVRUX0RFU1QsCisJTk1fQVRUX0VWRU5UX1RZUEUsCisJTk1fQVRUX0ZJTEVfREFUQSwKKwlOTV9BVFRfR0VUX0FSSSwKKwlOTV9BVFRfSFdfQ09ORl9DSEcsCisJTk1fQVRUX0xJU1RfUkVRX0FUVFIsCisJTk1fQVRUX01EUk9QX0xJTkssCisJTk1fQVRUX01EUk9QX05FWFQsCisJTk1fQVRUX05BQ0tfQ0FVU0VTLAorCU5NX0FUVF9PVVRTVF9BTEFSTSwKKwlOTV9BVFRfUEhZU19DT05GLAorCU5NX0FUVF9QUk9CX0NBVVNFLAorCU5NX0FUVF9SQURfU1VCQywKKwlOTV9BVFRfU09VUkNFLAorCU5NX0FUVF9TUEVDX1BST0IsCisJTk1fQVRUX1NUQVJUX1RJTUUsCisJTk1fQVRUX1RFU1RfRFVSLAorCU5NX0FUVF9URVNUX05PLAorCU5NX0FUVF9URVNUX1JFUE9SVCwKKwlOTV9BVFRfV0lORE9XX1NJWkUsCisJTk1fQVRUX1NFVkVSSVRZLAorCU5NX0FUVF9NRUFTX1JFUywKKwlOTV9BVFRfTUVBU19UWVBFLAorfTsKKworY29uc3Qgc3RydWN0IHRsdl9kZWZpbml0aW9uIG5tX2F0dF90bHZkZWYgPSB7CisJLmRlZiA9IHsKKwkJW05NX0FUVF9BQklTX0NIQU5ORUxdID0JCXsgVExWX1RZUEVfRklYRUQsIDMgfSwKKwkJW05NX0FUVF9BRERfSU5GT10gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX0FERF9URVhUXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtOTV9BVFRfQURNX1NUQVRFXSA9CQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfQVJGQ05fTElTVF09CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtOTV9BVFRfQVVUT05fUkVQT1JUXSA9CQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfQVZBSUxfU1RBVFVTXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtOTV9BVFRfQkNDSF9BUkZDTl0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorCQlbTk1fQVRUX0JTSUNdID0JCQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfQlRTX0FJUl9USU1FUl0gPQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfQ0NDSF9MX0lfUF0gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX0NDQ0hfTF9UXSA9CQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfQ0hBTl9DT01CXSA9CQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfQ09OTl9GQUlMX0NSSVRdID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX0RFU1RdID0JCQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtOTV9BVFRfRVZFTlRfVFlQRV0gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX0ZJTEVfREFUQV0gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX0ZJTEVfSURdID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJW05NX0FUVF9GSUxFX1ZFUlNJT05dID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJW05NX0FUVF9HU01fVElNRV0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorCQlbTk1fQVRUX0hTTl0gPQkJCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9IV19DT05GSUddID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJW05NX0FUVF9IV19ERVNDXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtOTV9BVFRfSU5UQVZFX1BBUkFNXSA9CQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfSU5URVJGX0JPVU5EXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCA2IH0sCisJCVtOTV9BVFRfTElTVF9SRVFfQVRUUl0gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtOTV9BVFRfTUFJT10gPQkJCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9NQU5VRl9TVEFURV0gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX01BTlVGX1RIUkVTSF0gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX01BTlVGX0lEXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtOTV9BVFRfTUFYX1RBXSA9CQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfTURST1BfTElOS10gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorCQlbTk1fQVRUX01EUk9QX05FWFRdID0JCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKwkJW05NX0FUVF9OQUNLX0NBVVNFU10gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX05ZMV0gPQkJCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9PUEVSX1NUQVRFXSA9CQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfT1ZFUkxfUEVSSU9EXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtOTV9BVFRfUEhZU19DT05GXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtOTV9BVFRfUE9XRVJfQ0xBU1NdID0JCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9QT1dFUl9USFJFU0hdID0JCXsgVExWX1RZUEVfRklYRUQsIDMgfSwKKwkJW05NX0FUVF9QUk9CX0NBVVNFXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAzIH0sCisJCVtOTV9BVFRfUkFDSF9CX1RIUkVTSF0gPQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfTERBVkdfU0xPVFNdID0JCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKwkJW05NX0FUVF9SQURfU1VCQ10gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX1JGX01BWFBPV1JfUl0gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX1NJVEVfSU5QVVRTXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtOTV9BVFRfU0lURV9PVVRQVVRTXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtOTV9BVFRfU09VUkNFXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtOTV9BVFRfU1BFQ19QUk9CXSA9CQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfU1RBUlRfVElNRV0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorCQlbTk1fQVRUX1QyMDBdID0JCQl7IFRMVl9UWVBFX0ZJWEVELCA3IH0sCisJCVtOTV9BVFRfVEVJXSA9CQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX1RFU1RfRFVSXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisJCVtOTV9BVFRfVEVTVF9OT10gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX1RFU1RfUkVQT1JUXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtOTV9BVFRfVlNXUl9USFJFU0hdID0JCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKwkJW05NX0FUVF9XSU5ET1dfU0laRV0gPSAJCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9UU0NdID0JCQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfU1dfQ09ORklHXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtOTV9BVFRfU0VWRVJJVFldID0gCQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfR0VUX0FSSV0gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX0hXX0NPTkZfQ0hHXSA9IAkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX09VVFNUX0FMQVJNXSA9CQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfTUVBU19SRVNdID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IGVudW0gYWJpc19ubV9jaGFuX2NvbWIgY2hjb21iNHBjaGFuW10gPSB7CisJW0dTTV9QQ0hBTl9DQ0NIXQk9IE5NX0NIQU5DX21haW5CQ0NILAorCVtHU01fUENIQU5fQ0NDSF9TRENDSDRdCT0gTk1fQ0hBTkNfQkNDSENvbWIsCisJW0dTTV9QQ0hBTl9UQ0hfRl0JPSBOTV9DSEFOQ19UQ0hGdWxsLAorCVtHU01fUENIQU5fVENIX0hdCT0gTk1fQ0hBTkNfVENISGFsZiwKKwlbR1NNX1BDSEFOX1NEQ0NIOF9TQUNDSDhDXSA9IE5NX0NIQU5DX1NEQ0NILAorCVtHU01fUENIQU5fUERDSF0JPSBOTV9DSEFOQ19JUEFDX1BEQ0gsCisJW0dTTV9QQ0hBTl9UQ0hfRl9QRENIXQk9IE5NX0NIQU5DX0lQQUNfVENIRnVsbF9QRENILAorCS8qIEZJWE1FOiBib3VuZHMgY2hlY2sgKi8KK307CisKK2ludCBhYmlzX25tX2NoY29tYjRwY2hhbihlbnVtIGdzbV9waHlzX2NoYW5fY29uZmlnIHBjaGFuKQoreworCWlmIChwY2hhbiA8IEFSUkFZX1NJWkUoY2hjb21iNHBjaGFuKSkKKwkJcmV0dXJuIGNoY29tYjRwY2hhbltwY2hhbl07CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworaW50IGFiaXNfbm1fdGx2X3BhcnNlKHN0cnVjdCB0bHZfcGFyc2VkICp0cCwgc3RydWN0IGdzbV9idHMgKmJ0cywgY29uc3QgdV9pbnQ4X3QgKmJ1ZiwgaW50IGxlbikKK3sKKwlpZiAoIWJ0cy0+bW9kZWwpCisJCXJldHVybiAtRUlPOworCXJldHVybiB0bHZfcGFyc2UodHAsICZidHMtPm1vZGVsLT5ubV9hdHRfdGx2ZGVmLCBidWYsIGxlbiwgMCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgaXNfaW5fYXJyKGVudW0gYWJpc19ubV9tc2d0eXBlIG10LCBjb25zdCBlbnVtIGFiaXNfbm1fbXNndHlwZSAqYXJyLCBpbnQgc2l6ZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJaWYgKGFycltpXSA9PSBtdCkKKwkJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCisjaWYgMAorLyogaXMgdGhpcyBtc2d0eXBlIHRoZSB1c3VhbCBBQ0svTkFDSyB0eXBlID8gKi8KK3N0YXRpYyBpbnQgaXNfYWNrX25hY2soZW51bSBhYmlzX25tX21zZ3R5cGUgbXQpCit7CisJcmV0dXJuICFpc19pbl9hcnIobXQsIG5vX2Fja19uYWNrLCBBUlJBWV9TSVpFKG5vX2Fja19uYWNrKSk7Cit9CisjZW5kaWYKKworLyogaXMgdGhpcyBtc2d0eXBlIGEgcmVwb3J0ID8gKi8KK3N0YXRpYyBpbnQgaXNfcmVwb3J0KGVudW0gYWJpc19ubV9tc2d0eXBlIG10KQoreworCXJldHVybiBpc19pbl9hcnIobXQsIHJlcG9ydHMsIEFSUkFZX1NJWkUocmVwb3J0cykpOworfQorCisjZGVmaW5lIE1UX0FDSyh4KQkoeCsxKQorI2RlZmluZSBNVF9OQUNLKHgpCSh4KzIpCisKK3N0YXRpYyB2b2lkIGZpbGxfb21faGRyKHN0cnVjdCBhYmlzX29tX2hkciAqb2gsIHVfaW50OF90IGxlbikKK3sKKwlvaC0+bWRpc2MgPSBBQklTX09NX01ESVNDX0ZPTTsKKwlvaC0+cGxhY2VtZW50ID0gQUJJU19PTV9QTEFDRU1FTlRfT05MWTsKKwlvaC0+c2VxdWVuY2UgPSAwOworCW9oLT5sZW5ndGggPSBsZW47Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxfb21fZm9tX2hkcihzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oLCB1X2ludDhfdCBsZW4sCisJCQkgICAgdV9pbnQ4X3QgbXNnX3R5cGUsIHVfaW50OF90IG9ial9jbGFzcywKKwkJCSAgICB1X2ludDhfdCBidHNfbnIsIHVfaW50OF90IHRyeF9uciwgdV9pbnQ4X3QgdHNfbnIpCit7CisJc3RydWN0IGFiaXNfb21fZm9tX2hkciAqZm9oID0KKwkJCShzdHJ1Y3QgYWJpc19vbV9mb21faGRyICopIG9oLT5kYXRhOworCisJZmlsbF9vbV9oZHIob2gsIGxlbitzaXplb2YoKmZvaCkpOworCWZvaC0+bXNnX3R5cGUgPSBtc2dfdHlwZTsKKwlmb2gtPm9ial9jbGFzcyA9IG9ial9jbGFzczsKKwlmb2gtPm9ial9pbnN0LmJ0c19uciA9IGJ0c19ucjsKKwlmb2gtPm9ial9pbnN0LnRyeF9uciA9IHRyeF9ucjsKKwlmb2gtPm9ial9pbnN0LnRzX25yID0gdHNfbnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbXNnYiAqbm1fbXNnYl9hbGxvYyh2b2lkKQoreworCXJldHVybiBtc2diX2FsbG9jX2hlYWRyb29tKE9NX0FMTE9DX1NJWkUsIE9NX0hFQURST09NX1NJWkUsCisJCQkJICAgIk9NTCIpOworfQorCisvKiBTZW5kIGEgT01MIE5NIE1lc3NhZ2UgZnJvbSBCU0MgdG8gQlRTICovCitpbnQgYWJpc19ubV9zZW5kbXNnKHN0cnVjdCBnc21fYnRzICpidHMsIHN0cnVjdCBtc2diICptc2cpCit7CisJbXNnLT50cnggPSBidHMtPmMwOworCisJcmV0dXJuIF9hYmlzX25tX3NlbmRtc2cobXNnKTsKK30KKworc3RhdGljIGludCBhYmlzX25tX3Jjdm1zZ19zdyhzdHJ1Y3QgbXNnYiAqbWIpOworCitzdGF0aWMgc3RydWN0IHZhbHVlX3N0cmluZyBvYmpfY2xhc3NfbmFtZXNbXSA9IHsKKwl7IE5NX09DX1NJVEVfTUFOQUdFUiwJIlNJVEUgTUFOQUdFUiIgfSwKKwl7IE5NX09DX0JUUywJCSJCVFMiIH0sCisJeyBOTV9PQ19SQURJT19DQVJSSUVSLAkiUkFESU8gQ0FSUklFUiIgfSwKKwl7IE5NX09DX0JBU0VCX1RSQU5TQywJIkJBU0VCQU5EIFRSQU5TQ0VJVkVSIiB9LAorCXsgTk1fT0NfQ0hBTk5FTCwJIkNIQU5ORUwiIH0sCisJeyBOTV9PQ19CUzExX0FESkMsCSJBREpDIiB9LAorCXsgTk1fT0NfQlMxMV9IQU5ET1ZFUiwJIkhBTkRPVkVSIiB9LAorCXsgTk1fT0NfQlMxMV9QV1JfQ1RSTCwJIlBPV0VSIENPTlRST0wiIH0sCisJeyBOTV9PQ19CUzExX0JUU0UsCSJCVFNFIiB9LAorCXsgTk1fT0NfQlMxMV9SQUNLLAkiUkFDSyIgfSwKKwl7IE5NX09DX0JTMTFfVEVTVCwJIlRFU1QiIH0sCisJeyBOTV9PQ19CUzExX0VOVkFCVFNFLAkiRU5WQUJUU0UiIH0sCisJeyBOTV9PQ19CUzExX0JQT1JULAkiQlBPUlQiIH0sCisJeyBOTV9PQ19HUFJTX05TRSwJIkdQUlMgTlNFIiB9LAorCXsgTk1fT0NfR1BSU19DRUxMLAkiR1BSUyBDRUxMIiB9LAorCXsgTk1fT0NfR1BSU19OU1ZDLAkiR1BSUyBOU1ZDIiB9LAorCXsgTk1fT0NfQlMxMSwJCSJTSUVNRU5TSFciIH0sCisJeyAwLAkJCU5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKm9ial9jbGFzc19uYW1lKHVfaW50OF90IG9jKQoreworCXJldHVybiBnZXRfdmFsdWVfc3RyaW5nKG9ial9jbGFzc19uYW1lcywgb2MpOworfQorCitjb25zdCBjaGFyICpubV9vcHN0YXRlX25hbWUodV9pbnQ4X3Qgb3MpCit7CisJc3dpdGNoIChvcykgeworCWNhc2UgTk1fT1BTVEFURV9ESVNBQkxFRDoKKwkJcmV0dXJuICJEaXNhYmxlZCI7CisJY2FzZSBOTV9PUFNUQVRFX0VOQUJMRUQ6CisJCXJldHVybiAiRW5hYmxlZCI7CisJY2FzZSBOTV9PUFNUQVRFX05VTEw6CisJCXJldHVybiAiTlVMTCI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJSRlUiOworCX0KK30KKworLyogQ2hhcHRlciA5LjQuNyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgYXZhaWxfbmFtZXNbXSA9IHsKKwl7IDAsIAkiSW4gdGVzdCIgfSwKKwl7IDEsCSJGYWlsZWQiIH0sCisJeyAyLAkiUG93ZXIgb2ZmIiB9LAorCXsgMywJIk9mZiBsaW5lIiB9LAorCS8qIE5vdCB1c2VkICovCisJeyA1LAkiRGVwZW5kZW5jeSIgfSwKKwl7IDYsCSJEZWdyYWRlZCIgfSwKKwl7IDcsCSJOb3QgaW5zdGFsbGVkIiB9LAorCXsgMHhmZiwgIk9LIiB9LAorCXsgMCwJTlVMTCB9Cit9OworCitjb25zdCBjaGFyICpubV9hdmFpbF9uYW1lKHVfaW50OF90IGF2YWlsKQoreworCXJldHVybiBnZXRfdmFsdWVfc3RyaW5nKGF2YWlsX25hbWVzLCBhdmFpbCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmFsdWVfc3RyaW5nIHRlc3RfbmFtZXNbXSA9IHsKKwkvKiBGSVhNRTogc3RhbmRhcmQgdGVzdCBuYW1lcyAqLworCXsgTk1fSVBBQ0NfVEVTVE5PX0NIQU5fVVNBR0UsICJDaGFubmVsIFVzYWdlIiB9LAorCXsgTk1fSVBBQ0NfVEVTVE5PX0JDQ0hfQ0hBTl9VU0FHRSwgIkJDQ0ggQ2hhbm5lbCBVc2FnZSIgfSwKKwl7IE5NX0lQQUNDX1RFU1ROT19GUkVRX1NZTkMsICJGcmVxdWVuY3kgU3luY2hyb25pemF0aW9uIiB9LAorCXsgTk1fSVBBQ0NfVEVTVE5PX0JDQ0hfSU5GTywgIkJDQ0ggSW5mbyIgfSwKKwl7IE5NX0lQQUNDX1RFU1ROT19UWF9CRUFDT04sICJUcmFuc21pdCBCZWFjb24iIH0sCisJeyBOTV9JUEFDQ19URVNUTk9fU1lTSU5GT19NT05JVE9SLCAiU3lzdGVtIEluZm8gTW9uaXRvciIgfSwKKwl7IE5NX0lQQUNDX1RFU1ROT19CQ0NDSF9NT05JVE9SLCAiQkNDSCBNb25pdG9yIiB9LAorCXsgMCwgTlVMTCB9Cit9OworCitjb25zdCBjaGFyICpubV9hZG1fbmFtZSh1X2ludDhfdCBhZG0pCit7CisJc3dpdGNoIChhZG0pIHsKKwljYXNlIDE6CisJCXJldHVybiAiTG9ja2VkIjsKKwljYXNlIDI6CisJCXJldHVybiAiVW5sb2NrZWQiOworCWNhc2UgMzoKKwkJcmV0dXJuICJTaHV0ZG93biI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICI8bm90IHVzZWQ+IjsKKwl9Cit9CisKK2ludCBubV9pc19ydW5uaW5nKHN0cnVjdCBnc21fbm1fc3RhdGUgKnMpIHsKKwlyZXR1cm4gKHMtPm9wZXJhdGlvbmFsID09IE5NX09QU1RBVEVfRU5BQkxFRCkgJiYgKAorCQkocy0+YXZhaWxhYmlsaXR5ID09IE5NX0FWU1RBVEVfT0spIHx8CisJCShzLT5hdmFpbGFiaWxpdHkgPT0gMHhmZikKKwkpOworfQorCitzdGF0aWMgdm9pZCBkZWJ1Z3BfZm9oKHN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKmZvaCkKK3sKKwlERUJVR1AoRE5NLCAiT0M9JXMoJTAyeCkgSU5TVD0oJTAyeCwlMDJ4LCUwMngpICIsCisJCW9ial9jbGFzc19uYW1lKGZvaC0+b2JqX2NsYXNzKSwgZm9oLT5vYmpfY2xhc3MsIAorCQlmb2gtPm9ial9pbnN0LmJ0c19uciwgZm9oLT5vYmpfaW5zdC50cnhfbnIsCisJCWZvaC0+b2JqX2luc3QudHNfbnIpOworfQorCisvKiBvYnRhaW4gdGhlIGdzbV9ubV9zdGF0ZSBkYXRhIHN0cnVjdHVyZSBmb3IgYSBnaXZlbiBvYmplY3QgaW5zdGFuY2UgKi8KK3N0YXRpYyBzdHJ1Y3QgZ3NtX25tX3N0YXRlICoKK29iamNsYXNzMm5tc3RhdGUoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3Qgb2JqX2NsYXNzLAorCQkgc3RydWN0IGFiaXNfb21fb2JqX2luc3QgKm9ial9pbnN0KQoreworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCXN0cnVjdCBnc21fbm1fc3RhdGUgKm5tX3N0YXRlID0gTlVMTDsKKworCXN3aXRjaCAob2JqX2NsYXNzKSB7CisJY2FzZSBOTV9PQ19CVFM6CisJCW5tX3N0YXRlID0gJmJ0cy0+bm1fc3RhdGU7CisJCWJyZWFrOworCWNhc2UgTk1fT0NfUkFESU9fQ0FSUklFUjoKKwkJaWYgKG9ial9pbnN0LT50cnhfbnIgPj0gYnRzLT5udW1fdHJ4KSB7CisJCQlERUJVR1BDKEROTSwgIlRSWCAldSBkb2VzIG5vdCBleGlzdCAiLCBvYmpfaW5zdC0+dHJ4X25yKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXRyeCA9IGdzbV9idHNfdHJ4X251bShidHMsIG9ial9pbnN0LT50cnhfbnIpOworCQlubV9zdGF0ZSA9ICZ0cngtPm5tX3N0YXRlOworCQlicmVhazsKKwljYXNlIE5NX09DX0JBU0VCX1RSQU5TQzoKKwkJaWYgKG9ial9pbnN0LT50cnhfbnIgPj0gYnRzLT5udW1fdHJ4KSB7CisJCQlERUJVR1BDKEROTSwgIlRSWCAldSBkb2VzIG5vdCBleGlzdCAiLCBvYmpfaW5zdC0+dHJ4X25yKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXRyeCA9IGdzbV9idHNfdHJ4X251bShidHMsIG9ial9pbnN0LT50cnhfbnIpOworCQlubV9zdGF0ZSA9ICZ0cngtPmJiX3RyYW5zYy5ubV9zdGF0ZTsKKwkJYnJlYWs7CisJY2FzZSBOTV9PQ19DSEFOTkVMOgorCQlpZiAob2JqX2luc3QtPnRyeF9uciA+PSBidHMtPm51bV90cngpIHsKKwkJCURFQlVHUEMoRE5NLCAiVFJYICV1IGRvZXMgbm90IGV4aXN0ICIsIG9ial9pbnN0LT50cnhfbnIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgb2JqX2luc3QtPnRyeF9ucik7CisJCWlmIChvYmpfaW5zdC0+dHNfbnIgPj0gVFJYX05SX1RTKQorCQkJcmV0dXJuIE5VTEw7CisJCW5tX3N0YXRlID0gJnRyeC0+dHNbb2JqX2luc3QtPnRzX25yXS5ubV9zdGF0ZTsKKwkJYnJlYWs7CisJY2FzZSBOTV9PQ19TSVRFX01BTkFHRVI6CisJCW5tX3N0YXRlID0gJmJ0cy0+c2l0ZV9tZ3Iubm1fc3RhdGU7CisJCWJyZWFrOworCWNhc2UgTk1fT0NfQlMxMToKKwkJc3dpdGNoIChvYmpfaW5zdC0+YnRzX25yKSB7CisJCWNhc2UgQlMxMV9PQkpfQ0NMSzoKKwkJCW5tX3N0YXRlID0gJmJ0cy0+YnMxMS5jY2xrLm5tX3N0YXRlOworCQkJYnJlYWs7CisJCWNhc2UgQlMxMV9PQkpfQkJTSUc6CisJCQlpZiAob2JqX2luc3QtPnRzX25yID4gYnRzLT5udW1fdHJ4KQorCQkJCXJldHVybiBOVUxMOworCQkJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgb2JqX2luc3QtPnRyeF9ucik7CisJCQlubV9zdGF0ZSA9ICZ0cngtPmJzMTEuYmJzaWcubm1fc3RhdGU7CisJCQlicmVhazsKKwkJY2FzZSBCUzExX09CSl9QQToKKwkJCWlmIChvYmpfaW5zdC0+dHNfbnIgPiBidHMtPm51bV90cngpCisJCQkJcmV0dXJuIE5VTEw7CisJCQl0cnggPSBnc21fYnRzX3RyeF9udW0oYnRzLCBvYmpfaW5zdC0+dHJ4X25yKTsKKwkJCW5tX3N0YXRlID0gJnRyeC0+YnMxMS5wYS5ubV9zdGF0ZTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIE5VTEw7CisJCX0KKwljYXNlIE5NX09DX0JTMTFfUkFDSzoKKwkJbm1fc3RhdGUgPSAmYnRzLT5iczExLnJhY2subm1fc3RhdGU7CisJCWJyZWFrOworCWNhc2UgTk1fT0NfQlMxMV9FTlZBQlRTRToKKwkJaWYgKG9ial9pbnN0LT50cnhfbnIgPj0gQVJSQVlfU0laRShidHMtPmJzMTEuZW52YWJ0c2UpKQorCQkJcmV0dXJuIE5VTEw7CisJCW5tX3N0YXRlID0gJmJ0cy0+YnMxMS5lbnZhYnRzZVtvYmpfaW5zdC0+dHJ4X25yXS5ubV9zdGF0ZTsKKwkJYnJlYWs7CisJY2FzZSBOTV9PQ19HUFJTX05TRToKKwkJbm1fc3RhdGUgPSAmYnRzLT5ncHJzLm5zZS5ubV9zdGF0ZTsKKwkJYnJlYWs7CisJY2FzZSBOTV9PQ19HUFJTX0NFTEw6CisJCW5tX3N0YXRlID0gJmJ0cy0+Z3Bycy5jZWxsLm5tX3N0YXRlOworCQlicmVhazsKKwljYXNlIE5NX09DX0dQUlNfTlNWQzoKKwkJaWYgKG9ial9pbnN0LT50cnhfbnIgPj0gQVJSQVlfU0laRShidHMtPmdwcnMubnN2YykpCisJCQlyZXR1cm4gTlVMTDsKKwkJbm1fc3RhdGUgPSAmYnRzLT5ncHJzLm5zdmNbb2JqX2luc3QtPnRyeF9ucl0ubm1fc3RhdGU7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gbm1fc3RhdGU7Cit9CisKKy8qIG9idGFpbiB0aGUgaW4tbWVtb3J5IGRhdGEgc3RydWN0dXJlIG9mIGEgZ2l2ZW4gb2JqZWN0IGluc3RhbmNlICovCitzdGF0aWMgdm9pZCAqCitvYmpjbGFzczJvYmooc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3Qgb2JqX2NsYXNzLAorCSAgICAgc3RydWN0IGFiaXNfb21fb2JqX2luc3QgKm9ial9pbnN0KQoreworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCXZvaWQgKm9iaiA9IE5VTEw7CisKKwlzd2l0Y2ggKG9ial9jbGFzcykgeworCWNhc2UgTk1fT0NfQlRTOgorCQlvYmogPSBidHM7CisJCWJyZWFrOworCWNhc2UgTk1fT0NfUkFESU9fQ0FSUklFUjoKKwkJaWYgKG9ial9pbnN0LT50cnhfbnIgPj0gYnRzLT5udW1fdHJ4KSB7CisJCQlERUJVR1BDKEROTSwgIlRSWCAldSBkb2VzIG5vdCBleGlzdCAiLCBvYmpfaW5zdC0+dHJ4X25yKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXRyeCA9IGdzbV9idHNfdHJ4X251bShidHMsIG9ial9pbnN0LT50cnhfbnIpOworCQlvYmogPSB0cng7CisJCWJyZWFrOworCWNhc2UgTk1fT0NfQkFTRUJfVFJBTlNDOgorCQlpZiAob2JqX2luc3QtPnRyeF9uciA+PSBidHMtPm51bV90cngpIHsKKwkJCURFQlVHUEMoRE5NLCAiVFJYICV1IGRvZXMgbm90IGV4aXN0ICIsIG9ial9pbnN0LT50cnhfbnIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgb2JqX2luc3QtPnRyeF9ucik7CisJCW9iaiA9ICZ0cngtPmJiX3RyYW5zYzsKKwkJYnJlYWs7CisJY2FzZSBOTV9PQ19DSEFOTkVMOgorCQlpZiAob2JqX2luc3QtPnRyeF9uciA+PSBidHMtPm51bV90cngpIHsKKwkJCURFQlVHUEMoRE5NLCAiVFJYICV1IGRvZXMgbm90IGV4aXN0ICIsIG9ial9pbnN0LT50cnhfbnIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgb2JqX2luc3QtPnRyeF9ucik7CisJCWlmIChvYmpfaW5zdC0+dHNfbnIgPj0gVFJYX05SX1RTKQorCQkJcmV0dXJuIE5VTEw7CisJCW9iaiA9ICZ0cngtPnRzW29ial9pbnN0LT50c19ucl07CisJCWJyZWFrOworCWNhc2UgTk1fT0NfU0lURV9NQU5BR0VSOgorCQlvYmogPSAmYnRzLT5zaXRlX21ncjsKKwkJYnJlYWs7CisJY2FzZSBOTV9PQ19HUFJTX05TRToKKwkJb2JqID0gJmJ0cy0+Z3Bycy5uc2U7CisJCWJyZWFrOworCWNhc2UgTk1fT0NfR1BSU19DRUxMOgorCQlvYmogPSAmYnRzLT5ncHJzLmNlbGw7CisJCWJyZWFrOworCWNhc2UgTk1fT0NfR1BSU19OU1ZDOgorCQlpZiAob2JqX2luc3QtPnRyeF9uciA+PSBBUlJBWV9TSVpFKGJ0cy0+Z3Bycy5uc3ZjKSkKKwkJCXJldHVybiBOVUxMOworCQlvYmogPSAmYnRzLT5ncHJzLm5zdmNbb2JqX2luc3QtPnRyeF9ucl07CisJCWJyZWFrOworCX0KKwlyZXR1cm4gb2JqOworfQorCisvKiBVcGRhdGUgdGhlIGFkbWluaXN0cmF0aXZlIHN0YXRlIG9mIGEgZ2l2ZW4gb2JqZWN0IGluIG91ciBpbi1tZW1vcnkgZGF0YQorICogc3RydWN0dXJlcyBhbmQgc2VuZCBhbiBldmVudCB0byB0aGUgaGlnaGVyIGxheWVyICovCitzdGF0aWMgaW50IHVwZGF0ZV9hZG1zdGF0ZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBvYmpfY2xhc3MsCisJCQkgICBzdHJ1Y3QgYWJpc19vbV9vYmpfaW5zdCAqb2JqX2luc3QsIHVfaW50OF90IGFkbV9zdGF0ZSkKK3sKKwlzdHJ1Y3QgZ3NtX25tX3N0YXRlICpubV9zdGF0ZSwgbmV3X3N0YXRlOworCXZvaWQgKm9iajsKKwlpbnQgcmM7CisKKwlvYmogPSBvYmpjbGFzczJvYmooYnRzLCBvYmpfY2xhc3MsIG9ial9pbnN0KTsKKwlpZiAoIW9iaikKKwkJcmV0dXJuIC1FSU5WQUw7CisJbm1fc3RhdGUgPSBvYmpjbGFzczJubXN0YXRlKGJ0cywgb2JqX2NsYXNzLCBvYmpfaW5zdCk7CisJaWYgKCFubV9zdGF0ZSkKKwkJcmV0dXJuIC0xOworCisJbmV3X3N0YXRlID0gKm5tX3N0YXRlOworCW5ld19zdGF0ZS5hZG1pbmlzdHJhdGl2ZSA9IGFkbV9zdGF0ZTsKKworCXJjID0gbm1fc3RhdGVfZXZlbnQoRVZUX1NUQVRFQ0hHX0FETSwgb2JqX2NsYXNzLCBvYmosIG5tX3N0YXRlLCAmbmV3X3N0YXRlKTsKKworCW5tX3N0YXRlLT5hZG1pbmlzdHJhdGl2ZSA9IGFkbV9zdGF0ZTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBhYmlzX25tX3J4X3N0YXRlY2hnX3JlcChzdHJ1Y3QgbXNnYiAqbWIpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaCA9IG1zZ2JfbDIobWIpOworCXN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKmZvaCA9IG1zZ2JfbDMobWIpOworCXN0cnVjdCBnc21fYnRzICpidHMgPSBtYi0+dHJ4LT5idHM7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJc3RydWN0IGdzbV9ubV9zdGF0ZSAqbm1fc3RhdGUsIG5ld19zdGF0ZTsKKwlpbnQgcmM7CisKKwlERUJVR1BDKEROTSwgIlNUQVRFIENIRzogIik7CisKKwltZW1zZXQoJm5ld19zdGF0ZSwgMCwgc2l6ZW9mKG5ld19zdGF0ZSkpOworCisJbm1fc3RhdGUgPSBvYmpjbGFzczJubXN0YXRlKGJ0cywgZm9oLT5vYmpfY2xhc3MsICZmb2gtPm9ial9pbnN0KTsKKwlpZiAoIW5tX3N0YXRlKSB7CisJCURFQlVHUEMoRE5NLCAidW5rbm93biBvYmplY3QgY2xhc3NcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwluZXdfc3RhdGUgPSAqbm1fc3RhdGU7CisJCisJYWJpc19ubV90bHZfcGFyc2UoJnRwLCBidHMsIGZvaC0+ZGF0YSwgb2gtPmxlbmd0aC1zaXplb2YoKmZvaCkpOworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfT1BFUl9TVEFURSkpIHsKKwkJbmV3X3N0YXRlLm9wZXJhdGlvbmFsID0gKlRMVlBfVkFMKCZ0cCwgTk1fQVRUX09QRVJfU1RBVEUpOworCQlERUJVR1BDKEROTSwgIk9QX1NUQVRFPSVzICIsIG5tX29wc3RhdGVfbmFtZShuZXdfc3RhdGUub3BlcmF0aW9uYWwpKTsKKwl9CisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9BVkFJTF9TVEFUVVMpKSB7CisJCWlmIChUTFZQX0xFTigmdHAsIE5NX0FUVF9BVkFJTF9TVEFUVVMpID09IDApCisJCQluZXdfc3RhdGUuYXZhaWxhYmlsaXR5ID0gMHhmZjsKKwkJZWxzZQorCQkJbmV3X3N0YXRlLmF2YWlsYWJpbGl0eSA9ICpUTFZQX1ZBTCgmdHAsIE5NX0FUVF9BVkFJTF9TVEFUVVMpOworCQlERUJVR1BDKEROTSwgIkFWQUlMPSVzKCUwMngpICIsIG5tX2F2YWlsX25hbWUobmV3X3N0YXRlLmF2YWlsYWJpbGl0eSksCisJCQluZXdfc3RhdGUuYXZhaWxhYmlsaXR5KTsKKwl9IGVsc2UKKwkJbmV3X3N0YXRlLmF2YWlsYWJpbGl0eSA9IDB4ZmY7CisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9BRE1fU1RBVEUpKSB7CisJCW5ld19zdGF0ZS5hZG1pbmlzdHJhdGl2ZSA9ICpUTFZQX1ZBTCgmdHAsIE5NX0FUVF9BRE1fU1RBVEUpOworCQlERUJVR1BDKEROTSwgIkFETT0lMnMgIiwgbm1fYWRtX25hbWUobmV3X3N0YXRlLmFkbWluaXN0cmF0aXZlKSk7CisJfQorCURFQlVHUEMoRE5NLCAiXG4iKTsKKworCWlmICgobmV3X3N0YXRlLmFkbWluaXN0cmF0aXZlICE9IDAgJiYgbm1fc3RhdGUtPmFkbWluaXN0cmF0aXZlID09IDApIHx8CisJICAgIG5ld19zdGF0ZS5vcGVyYXRpb25hbCAhPSBubV9zdGF0ZS0+b3BlcmF0aW9uYWwgfHwKKwkgICAgbmV3X3N0YXRlLmF2YWlsYWJpbGl0eSAhPSBubV9zdGF0ZS0+YXZhaWxhYmlsaXR5KSB7CisJCS8qIFVwZGF0ZSB0aGUgb3BlcmF0aW9uYWwgc3RhdGUgb2YgYSBnaXZlbiBvYmplY3QgaW4gb3VyIGluLW1lbW9yeSBkYXRhCisgCQkqIHN0cnVjdHVyZXMgYW5kIHNlbmQgYW4gZXZlbnQgdG8gdGhlIGhpZ2hlciBsYXllciAqLworCQl2b2lkICpvYmogPSBvYmpjbGFzczJvYmooYnRzLCBmb2gtPm9ial9jbGFzcywgJmZvaC0+b2JqX2luc3QpOworCQlyYyA9IG5tX3N0YXRlX2V2ZW50KEVWVF9TVEFURUNIR19PUEVSLCBmb2gtPm9ial9jbGFzcywgb2JqLCBubV9zdGF0ZSwgJm5ld19zdGF0ZSk7CisJCW5tX3N0YXRlLT5vcGVyYXRpb25hbCA9IG5ld19zdGF0ZS5vcGVyYXRpb25hbDsKKwkJbm1fc3RhdGUtPmF2YWlsYWJpbGl0eSA9IG5ld19zdGF0ZS5hdmFpbGFiaWxpdHk7CisJCWlmIChubV9zdGF0ZS0+YWRtaW5pc3RyYXRpdmUgPT0gMCkKKwkJCW5tX3N0YXRlLT5hZG1pbmlzdHJhdGl2ZSA9IG5ld19zdGF0ZS5hZG1pbmlzdHJhdGl2ZTsKKwl9CisjaWYgMAorCWlmIChvcF9zdGF0ZSA9PSAxKSB7CisJCS8qIHRyeSB0byBlbmFibGUgb2JqZWN0cyB0aGF0IGFyZSBkaXNhYmxlZCAqLworCQlhYmlzX25tX29wc3RhcnQoYnRzLCBmb2gtPm9ial9jbGFzcywKKwkJCQlmb2gtPm9ial9pbnN0LmJ0c19uciwKKwkJCQlmb2gtPm9ial9pbnN0LnRyeF9uciwKKwkJCQlmb2gtPm9ial9pbnN0LnRzX25yKTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByeF9mYWlsX2V2dF9yZXAoc3RydWN0IG1zZ2IgKm1iKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2ggPSBtc2diX2wyKG1iKTsKKwlzdHJ1Y3QgYWJpc19vbV9mb21faGRyICpmb2ggPSBtc2diX2wzKG1iKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKworCURFQlVHUEMoRE5NLCAiRmFpbHVyZSBFdmVudCBSZXBvcnQgIik7CisJCisJYWJpc19ubV90bHZfcGFyc2UoJnRwLCBtYi0+dHJ4LT5idHMsIGZvaC0+ZGF0YSwgb2gtPmxlbmd0aC1zaXplb2YoKmZvaCkpOworCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9FVkVOVF9UWVBFKSkKKwkJREVCVUdQQyhETk0sICJUeXBlPSVzICIsIGV2ZW50X3R5cGVfbmFtZSgqVExWUF9WQUwoJnRwLCBOTV9BVFRfRVZFTlRfVFlQRSkpKTsKKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX1NFVkVSSVRZKSkKKwkJREVCVUdQQyhETk0sICJTZXZlcml0eT0lcyAiLCBzZXZlcml0eV9uYW1lKCpUTFZQX1ZBTCgmdHAsIE5NX0FUVF9TRVZFUklUWSkpKTsKKworCURFQlVHUEMoRE5NLCAiXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFiaXNfbm1fcmN2bXNnX3JlcG9ydChzdHJ1Y3QgbXNnYiAqbWIpCit7CisJc3RydWN0IGFiaXNfb21fZm9tX2hkciAqZm9oID0gbXNnYl9sMyhtYik7CisJdV9pbnQ4X3QgbXQgPSBmb2gtPm1zZ190eXBlOworCisJZGVidWdwX2ZvaChmb2gpOworCisJLy9ubWgtPmNmZy0+cmVwb3J0X2NiKG1iLCBmb2gpOworCisJc3dpdGNoIChtdCkgeworCWNhc2UgTk1fTVRfU1RBVEVDSEdfRVZFTlRfUkVQOgorCQlyZXR1cm4gYWJpc19ubV9yeF9zdGF0ZWNoZ19yZXAobWIpOworCQlicmVhazsKKwljYXNlIE5NX01UX1NXX0FDVElWQVRFRF9SRVA6CisJCURFQlVHUEMoRE5NLCAiU29mdHdhcmUgQWN0aXZhdGVkIFJlcG9ydFxuIik7CisJCWRpc3BhdGNoX3NpZ25hbChTU19OTSwgU19OTV9TV19BQ1RJVl9SRVAsIG1iKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9GQUlMVVJFX0VWRU5UX1JFUDoKKwkJcnhfZmFpbF9ldnRfcmVwKG1iKTsKKwkJZGlzcGF0Y2hfc2lnbmFsKFNTX05NLCBTX05NX0ZBSUxfUkVQLCBtYik7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfVEVTVF9SRVA6CisJCURFQlVHUEMoRE5NLCAiVGVzdCBSZXBvcnRcbiIpOworCQlkaXNwYXRjaF9zaWduYWwoU1NfTk0sIFNfTk1fVEVTVF9SRVAsIG1iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJREVCVUdQQyhETk0sICJyZXBvcnRpbmcgTk0gTVQgMHglMDJ4XG4iLCBtdCk7CisJCWJyZWFrOworCQkKKwl9OworCisJcmV0dXJuIDA7Cit9CisKKy8qIEFjdGl2YXRlIHRoZSBzcGVjaWZpZWQgc29mdHdhcmUgaW50byB0aGUgQlRTICovCitzdGF0aWMgaW50IGlwYWNjX3N3X2FjdGl2YXRlKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IG9ial9jbGFzcywgdV9pbnQ4X3QgaTAsIHVfaW50OF90IGkxLAorCQkJICAgICB1X2ludDhfdCBpMiwgY29uc3QgdV9pbnQ4X3QgKnN3X2Rlc2MsIHVfaW50OF90IHN3ZGVzY19sZW4pCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXVfaW50OF90IGxlbiA9IHN3ZGVzY19sZW47CisJdV9pbnQ4X3QgKnRyYWlsZXI7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCBsZW4sIE5NX01UX0FDVElWQVRFX1NXLCBvYmpfY2xhc3MsIGkwLCBpMSwgaTIpOworCisJdHJhaWxlciA9IG1zZ2JfcHV0KG1zZywgc3dkZXNjX2xlbik7CisJbWVtY3B5KHRyYWlsZXIsIHN3X2Rlc2MsIHN3ZGVzY19sZW4pOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKK3N0YXRpYyBpbnQgYWJpc19ubV9yeF9zd19hY3RfcmVxKHN0cnVjdCBtc2diICptYikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oID0gbXNnYl9sMihtYik7CisJc3RydWN0IGFiaXNfb21fZm9tX2hkciAqZm9oID0gbXNnYl9sMyhtYik7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJY29uc3QgdV9pbnQ4X3QgKnN3X2NvbmZpZzsKKwlpbnQgc3dfY29uZmlnX2xlbjsKKwlpbnQgZmlsZV9pZF9sZW47CisJaW50IHJldDsKKworCWRlYnVncF9mb2goZm9oKTsKKworCURFQlVHUEMoRE5NLCAiU1cgQWN0aXZhdGUgUmVxdWVzdDogIik7CisKKwlERUJVR1AoRE5NLCAiU29mdHdhcmUgQWN0aXZhdGUgUmVxdWVzdCwgQUNLaW5nIGFuZCBBY3RpdmF0aW5nXG4iKTsKKworCXJldCA9IGFiaXNfbm1fc3dfYWN0X3JlcV9hY2sobWItPnRyeC0+YnRzLCBmb2gtPm9ial9jbGFzcywKKwkJCQkgICAgICBmb2gtPm9ial9pbnN0LmJ0c19uciwKKwkJCQkgICAgICBmb2gtPm9ial9pbnN0LnRyeF9uciwKKwkJCQkgICAgICBmb2gtPm9ial9pbnN0LnRzX25yLCAwLAorCQkJCSAgICAgIGZvaC0+ZGF0YSwgb2gtPmxlbmd0aC1zaXplb2YoKmZvaCkpOworCisJYWJpc19ubV90bHZfcGFyc2UoJnRwLCBtYi0+dHJ4LT5idHMsIGZvaC0+ZGF0YSwgb2gtPmxlbmd0aC1zaXplb2YoKmZvaCkpOworCXN3X2NvbmZpZyA9IFRMVlBfVkFMKCZ0cCwgTk1fQVRUX1NXX0NPTkZJRyk7CisJc3dfY29uZmlnX2xlbiA9IFRMVlBfTEVOKCZ0cCwgTk1fQVRUX1NXX0NPTkZJRyk7CisJaWYgKCFUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfU1dfQ09ORklHKSkgeworCQlERUJVR1AoRE5NLCAiU1cgY29uZmlnIG5vdCBmb3VuZCEgQ2FuJ3QgY29udGludWUuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIHsKKwkJREVCVUdQKEROTSwgIkZvdW5kIFNXIGNvbmZpZzogJXNcbiIsIGhleGR1bXAoc3dfY29uZmlnLCBzd19jb25maWdfbGVuKSk7CisJfQorCisJaWYgKHN3X2NvbmZpZ1swXSAhPSBOTV9BVFRfU1dfREVTQ1IpCisJCURFQlVHUChETk0sICJTV19ERVNDUiBhdHRyaWJ1dGUgaWRlbnRpZmllciBub3QgZm91bmQhXG4iKTsKKwlpZiAoc3dfY29uZmlnWzFdICE9IE5NX0FUVF9GSUxFX0lEKQorCQlERUJVR1AoRE5NLCAiRklMRV9JRCBhdHRyaWJ1dGUgaWRlbnRpZmllciBub3QgZm91bmQhXG4iKTsKKwlmaWxlX2lkX2xlbiA9IHN3X2NvbmZpZ1syXSAqIDI1NiArIHN3X2NvbmZpZ1szXTsKKworCS8qIEFzc3VtZXMgZmlyc3QgU1cgZmlsZSBpbiBsaXN0IGlzIHRoZSBvbmUgdG8gYmUgYWN0aXZhdGVkICovCisJLyogc3dfY29uZmlnICsgNCB0byBza2lwIG92ZXIgMiBhdHRyaWJ1dGUgSUQgYnl0ZXMgYW5kIDE2LWJpdCBsZW5ndGggZmllbGQgKi8KKwlyZXR1cm4gaXBhY2Nfc3dfYWN0aXZhdGUobWItPnRyeC0+YnRzLCBmb2gtPm9ial9jbGFzcywKKwkJCQkgZm9oLT5vYmpfaW5zdC5idHNfbnIsCisJCQkJIGZvaC0+b2JqX2luc3QudHJ4X25yLAorCQkJCSBmb2gtPm9ial9pbnN0LnRzX25yLAorCQkJCSBzd19jb25maWcgKyA0LAorCQkJCSBmaWxlX2lkX2xlbik7Cit9CisKKy8qIFJlY2VpdmUgYSBDSEFOR0VfQURNX1NUQVRFX0FDSywgcGFyc2UgdGhlIFRMViBhbmQgdXBkYXRlIGxvY2FsIHN0YXRlICovCitzdGF0aWMgaW50IGFiaXNfbm1fcnhfY2hnX2FkbV9zdGF0ZV9hY2soc3RydWN0IG1zZ2IgKm1iKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2ggPSBtc2diX2wyKG1iKTsKKwlzdHJ1Y3QgYWJpc19vbV9mb21faGRyICpmb2ggPSBtc2diX2wzKG1iKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwl1X2ludDhfdCBhZG1fc3RhdGU7CisKKwlhYmlzX25tX3Rsdl9wYXJzZSgmdHAsIG1iLT50cngtPmJ0cywgZm9oLT5kYXRhLCBvaC0+bGVuZ3RoLXNpemVvZigqZm9oKSk7CisJaWYgKCFUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfQURNX1NUQVRFKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhZG1fc3RhdGUgPSAqVExWUF9WQUwoJnRwLCBOTV9BVFRfQURNX1NUQVRFKTsKKworCXJldHVybiB1cGRhdGVfYWRtc3RhdGUobWItPnRyeC0+YnRzLCBmb2gtPm9ial9jbGFzcywgJmZvaC0+b2JqX2luc3QsIGFkbV9zdGF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgYWJpc19ubV9yeF9sbXRfZXZlbnQoc3RydWN0IG1zZ2IgKm1iKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2ggPSBtc2diX2wyKG1iKTsKKwlzdHJ1Y3QgYWJpc19vbV9mb21faGRyICpmb2ggPSBtc2diX2wzKG1iKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKworCURFQlVHUChETk0sICJMTVQgRXZlbnQgIik7CisJYWJpc19ubV90bHZfcGFyc2UoJnRwLCBtYi0+dHJ4LT5idHMsIGZvaC0+ZGF0YSwgb2gtPmxlbmd0aC1zaXplb2YoKmZvaCkpOworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfQlMxMV9MTVRfTE9HT05fU0VTU0lPTikgJiYKKwkgICAgVExWUF9MRU4oJnRwLCBOTV9BVFRfQlMxMV9MTVRfTE9HT05fU0VTU0lPTikgPj0gMSkgeworCQl1X2ludDhfdCBvbm9mZiA9ICpUTFZQX1ZBTCgmdHAsIE5NX0FUVF9CUzExX0xNVF9MT0dPTl9TRVNTSU9OKTsKKwkJREVCVUdQQyhETk0sICJMT0clcyAiLCBvbm9mZiA/ICJPTiIgOiAiT0ZGIik7CisJfQorCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfQlMxMV9MTVRfVVNFUl9BQ0NfTEVWKSAmJgorCSAgICBUTFZQX0xFTigmdHAsIE5NX0FUVF9CUzExX0xNVF9VU0VSX0FDQ19MRVYpID49IDEpIHsKKwkJdV9pbnQ4X3QgbGV2ZWwgPSAqVExWUF9WQUwoJnRwLCBOTV9BVFRfQlMxMV9MTVRfVVNFUl9BQ0NfTEVWKTsKKwkJREVCVUdQQyhETk0sICJMZXZlbD0ldSAiLCBsZXZlbCk7CisJfQorCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfQlMxMV9MTVRfVVNFUl9OQU1FKSAmJgorCSAgICBUTFZQX0xFTigmdHAsIE5NX0FUVF9CUzExX0xNVF9VU0VSX05BTUUpID49IDEpIHsKKwkJY2hhciAqbmFtZSA9IChjaGFyICopIFRMVlBfVkFMKCZ0cCwgTk1fQVRUX0JTMTFfTE1UX1VTRVJfTkFNRSk7CisJCURFQlVHUEMoRE5NLCAiVXNlcm5hbWU9JXMgIiwgbmFtZSk7CisJfQorCURFQlVHUEMoRE5NLCAiXG4iKTsKKwkvKiBGSVhNRTogcGFyc2UgTE1UIExPR09OIFRJTUUgKi8KKwlyZXR1cm4gMDsKK30KKworLyogUmVjZWl2ZSBhIE9NTCBOTSBNZXNzYWdlIGZyb20gQlRTICovCitzdGF0aWMgaW50IGFiaXNfbm1fcmN2bXNnX2ZvbShzdHJ1Y3QgbXNnYiAqbWIpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaCA9IG1zZ2JfbDIobWIpOworCXN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKmZvaCA9IG1zZ2JfbDMobWIpOworCXVfaW50OF90IG10ID0gZm9oLT5tc2dfdHlwZTsKKworCS8qIGNoZWNrIGZvciB1bnNvbGljaXRlZCBtZXNzYWdlICovCisJaWYgKGlzX3JlcG9ydChtdCkpCisJCXJldHVybiBhYmlzX25tX3Jjdm1zZ19yZXBvcnQobWIpOworCisJaWYgKGlzX2luX2FycihtdCwgc3dfbG9hZF9tc2dzLCBBUlJBWV9TSVpFKHN3X2xvYWRfbXNncykpKQorCQlyZXR1cm4gYWJpc19ubV9yY3Ztc2dfc3cobWIpOworCisJaWYgKGlzX2luX2FycihtdCwgbmFja3MsIEFSUkFZX1NJWkUobmFja3MpKSkgeworCQlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKworCQlkZWJ1Z3BfZm9oKGZvaCk7CisKKwkJREVCVUdQQyhETk0sICIlcyBOQUNLICIsIGdldF92YWx1ZV9zdHJpbmcobmFja19uYW1lcywgbXQpKTsKKworCQlhYmlzX25tX3Rsdl9wYXJzZSgmdHAsIG1iLT50cngtPmJ0cywgZm9oLT5kYXRhLCBvaC0+bGVuZ3RoLXNpemVvZigqZm9oKSk7CisJCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfTkFDS19DQVVTRVMpKQorCQkJREVCVUdQQyhETk0sICJDQVVTRT0lc1xuIiwgCisJCQkJbmFja19jYXVzZV9uYW1lKCpUTFZQX1ZBTCgmdHAsIE5NX0FUVF9OQUNLX0NBVVNFUykpKTsKKwkJZWxzZQorCQkJREVCVUdQQyhETk0sICJcbiIpOworCisJCWRpc3BhdGNoX3NpZ25hbChTU19OTSwgU19OTV9OQUNLLCAodm9pZCopICZtdCk7CisJCXJldHVybiAwOworCX0KKyNpZiAwCisJLyogY2hlY2sgaWYgbGFzdCBtZXNzYWdlIGlzIHRvIGJlIGFja2VkICovCisJaWYgKGlzX2Fja19uYWNrKG5taC0+bGFzdF9tc2d0eXBlKSkgeworCQlpZiAobXQgPT0gTVRfQUNLKG5taC0+bGFzdF9tc2d0eXBlKSkgeworCQkJREVCVUdQKEROTSwgInJlY2VpdmVkIEFDSyAoMHgleClcbiIsIGZvaC0+bXNnX3R5cGUpOworCQkJLyogd2UgZ290IG91ciBBQ0ssIGNvbnRpbnVlIHNlbmRpbmcgdGhlIG5leHQgbXNnICovCisJCX0gZWxzZSBpZiAobXQgPT0gTVRfTkFDSyhubWgtPmxhc3RfbXNndHlwZSkpIHsKKwkJCS8qIHdlIGdvdCBhIE5BQ0ssIHNpZ25hbCB0aGlzIHRvIHRoZSBjYWxsZXIgKi8KKwkJCURFQlVHUChETk0sICJyZWNlaXZlZCBOQUNLICgweCV4KVxuIiwgZm9oLT5tc2dfdHlwZSk7CisJCQkvKiBGSVhNRTogc29tZWhvdyBzaWduYWwgdGhpcyB0byB0aGUgY2FsbGVyICovCisJCX0gZWxzZSB7CisJCQkvKiByZWFsbHkgc3RyYW5nZSB0aGluZ3MgaGFwcGVuICovCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKyNlbmRpZgorCisJc3dpdGNoIChtdCkgeworCWNhc2UgTk1fTVRfQ0hHX0FETV9TVEFURV9BQ0s6CisJCXJldHVybiBhYmlzX25tX3J4X2NoZ19hZG1fc3RhdGVfYWNrKG1iKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9TV19BQ1RfUkVROgorCQlyZXR1cm4gYWJpc19ubV9yeF9zd19hY3RfcmVxKG1iKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9CUzExX0xNVF9TRVNTSU9OOgorCQlyZXR1cm4gYWJpc19ubV9yeF9sbXRfZXZlbnQobWIpOworCQlicmVhazsKKwljYXNlIE5NX01UX0NPTk5fTURST1BfTElOS19BQ0s6CisJCURFQlVHUChETk0sICJDT05OIE1EUk9QIExJTksgQUNLXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9JUEFDQ19SRVNUQVJUX0FDSzoKKwkJZGlzcGF0Y2hfc2lnbmFsKFNTX05NLCBTX05NX0lQQUNDX1JFU1RBUlRfQUNLLCBOVUxMKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9JUEFDQ19SRVNUQVJUX05BQ0s6CisJCWRpc3BhdGNoX3NpZ25hbChTU19OTSwgU19OTV9JUEFDQ19SRVNUQVJUX05BQ0ssIE5VTEwpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhYmlzX25tX3J4X2lwYWNjKHN0cnVjdCBtc2diICptYik7CisKK3N0YXRpYyBpbnQgYWJpc19ubV9yY3Ztc2dfbWFudWYoc3RydWN0IG1zZ2IgKm1iKQoreworCWludCByYzsKKwlpbnQgYnRzX3R5cGUgPSBtYi0+dHJ4LT5idHMtPnR5cGU7CisKKwlzd2l0Y2ggKGJ0c190eXBlKSB7CisJY2FzZSBHU01fQlRTX1RZUEVfTkFOT0JUUzoKKwkJcmMgPSBhYmlzX25tX3J4X2lwYWNjKG1iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJkb24ndCBrbm93IGhvdyB0byBwYXJzZSBPTUwgZm9yIHRoaXMgIgorCQkgICAgICJCVFMgdHlwZSAoJXUpXG4iLCBidHNfdHlwZSk7CisJCXJjID0gMDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorCisvKiBIaWdoLUxldmVsIEFQSSAqLworLyogRW50cnktcG9pbnQgd2hlcmUgTDIgT01MIGZyb20gQlRTIGVudGVycyB0aGUgTk0gY29kZSAqLworaW50IGFiaXNfbm1fcmN2bXNnKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaCA9IG1zZ2JfbDIobXNnKTsKKwlpbnQgcmMgPSAwOworCisJLyogVmFyaW91cyBjb25zaXN0ZW5jeSBjaGVja3MgKi8KKwlpZiAob2gtPnBsYWNlbWVudCAhPSBBQklTX09NX1BMQUNFTUVOVF9PTkxZKSB7CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiQUJJUyBPTUwgcGxhY2VtZW50IDB4JXggbm90IHN1cHBvcnRlZFxuIiwKKwkJCW9oLT5wbGFjZW1lbnQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKG9oLT5zZXF1ZW5jZSAhPSAwKSB7CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiQUJJUyBPTUwgc2VxdWVuY2UgMHgleCAhPSAweDAwXG4iLAorCQkJb2gtPnNlcXVlbmNlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorI2lmIDAKKwl1bnNpZ25lZCBpbnQgbDJfbGVuID0gbXNnLT50YWlsIC0gKHVfaW50OF90ICopbXNnYl9sMihtc2cpOworCXVuc2lnbmVkIGludCBobGVuID0gc2l6ZW9mKCpvaCkgKyBzaXplb2Yoc3RydWN0IGFiaXNfb21fZm9tX2hkcik7CisJaWYgKG9oLT5sZW5ndGggKyBobGVuID4gbDJfbGVuKSB7CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiQUJJUyBPTUwgdHJ1bmNhdGVkIG1lc3NhZ2UgKCV1ID4gJXUpXG4iLAorCQkJb2gtPmxlbmd0aCArIHNpemVvZigqb2gpLCBsMl9sZW4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKG9oLT5sZW5ndGggKyBobGVuIDwgbDJfbGVuKQorCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIkFCSVMgT01MIG1lc3NhZ2Ugd2l0aCBleHRyYSB0cmFpbGVyPyE/IChvaC0+bGVuPSVkLCBzaXplb2Zfb2g9JWQgbDJfbGVuPSVkXG4iLCBvaC0+bGVuZ3RoLCBzaXplb2YoKm9oKSwgbDJfbGVuKTsKKyNlbmRpZgorCW1zZy0+bDNoID0gKHVuc2lnbmVkIGNoYXIgKilvaCArIHNpemVvZigqb2gpOworCisJc3dpdGNoIChvaC0+bWRpc2MpIHsKKwljYXNlIEFCSVNfT01fTURJU0NfRk9NOgorCQlyYyA9IGFiaXNfbm1fcmN2bXNnX2ZvbShtc2cpOworCQlicmVhazsKKwljYXNlIEFCSVNfT01fTURJU0NfTUFOVUY6CisJCXJjID0gYWJpc19ubV9yY3Ztc2dfbWFudWYobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBBQklTX09NX01ESVNDX01NSToKKwljYXNlIEFCSVNfT01fTURJU0NfVFJBVToKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJ1bmltcGxlbWVudGVkIEFCSVMgT01MIG1lc3NhZ2UgZGlzY3JpbWluYXRvciAweCV4XG4iLAorCQkJb2gtPm1kaXNjKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJ1bmtub3duIEFCSVMgT01MIG1lc3NhZ2UgZGlzY3JpbWluYXRvciAweCV4XG4iLAorCQkJb2gtPm1kaXNjKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXNnYl9mcmVlKG1zZyk7CisJcmV0dXJuIHJjOworfQorCisjaWYgMAorLyogaW5pdGlhbGl6ZWQgYWxsIHJlc291cmNlcyAqLworc3RydWN0IGFiaXNfbm1faCAqYWJpc19ubV9pbml0KHN0cnVjdCBhYmlzX25tX2NmZyAqY2ZnKQoreworCXN0cnVjdCBhYmlzX25tX2ggKm5taDsKKworCW5taCA9IG1hbGxvYyhzaXplb2YoKm5taCkpOworCWlmICghbm1oKQorCQlyZXR1cm4gTlVMTDsKKworCW5taC0+Y2ZnID0gY2ZnOworCisJcmV0dXJuIG5taDsKK30KKworLyogZnJlZSBhbGwgcmVzb3VyY2VzICovCit2b2lkIGFiaXNfbm1fZmluaShzdHJ1Y3QgYWJpc19ubV9oICpubWgpCit7CisJZnJlZShubWgpOworfQorI2VuZGlmCisKKy8qIEhlcmUgd2UgYXJlIHRyeWluZyB0byBkZWZpbmUgYSBoaWdoLWxldmVsIEFQSSB0aGF0IGNhbiBiZSB1c2VkIGJ5CisgKiB0aGUgYWN0dWFsIEJTQyBpbXBsZW1lbnRhdGlvbi4gIEhvd2V2ZXIsIHRoZSBhcmNoaXRlY3R1cmUgaXMgY3VycmVudGx5CisgKiBzdGlsbCB1bmRlciBkZXNpZ24uICBJZGVhbGx5IHRoZSBjYWxscyB0byB0aGlzIEFQSSB3b3VsZCBiZSBzeW5jaHJvbm91cywKKyAqIHdoaWxlIHRoZSB1bmRlcmx5aW5nIHN0YWNrIGJlaGluZCB0aGUgQVBpIHJ1bnMgaW4gYSB0cmFkaXRpb25hbCBzZWxlY3QKKyAqIGJhc2VkIHN0YXRlIG1hY2hpbmUuCisgKi8KKworLyogNi4yIFNvZnR3YXJlIExvYWQ6ICovCitlbnVtIHN3X3N0YXRlIHsKKwlTV19TVEFURV9OT05FLAorCVNXX1NUQVRFX1dBSVRfSU5JVEFDSywKKwlTV19TVEFURV9XQUlUX1NFR0FDSywKKwlTV19TVEFURV9XQUlUX0VOREFDSywKKwlTV19TVEFURV9XQUlUX0FDVEFDSywKKwlTV19TVEFURV9FUlJPUiwKK307CisKK3N0cnVjdCBhYmlzX25tX3N3IHsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCWdzbV9jYmZuICpjYmZuOworCXZvaWQgKmNiX2RhdGE7CisJaW50IGZvcmNlZDsKKworCS8qIHRoaXMgd2lsbCBiZWNvbWUgcGFydCBvZiB0aGUgU1cgTE9BRCBJTklUSUFURSAqLworCXVfaW50OF90IG9ial9jbGFzczsKKwl1X2ludDhfdCBvYmpfaW5zdGFuY2VbM107CisKKwl1X2ludDhfdCBmaWxlX2lkWzI1NV07CisJdV9pbnQ4X3QgZmlsZV9pZF9sZW47CisKKwl1X2ludDhfdCBmaWxlX3ZlcnNpb25bMjU1XTsKKwl1X2ludDhfdCBmaWxlX3ZlcnNpb25fbGVuOworCisJdV9pbnQ4X3Qgd2luZG93X3NpemU7CisJdV9pbnQ4X3Qgc2VnX2luX3dpbmRvdzsKKworCWludCBmZDsKKwlGSUxFICpzdHJlYW07CisJZW51bSBzd19zdGF0ZSBzdGF0ZTsKKwlpbnQgbGFzdF9zZWc7Cit9OworCitzdGF0aWMgc3RydWN0IGFiaXNfbm1fc3cgZ19zdzsKKworc3RhdGljIHZvaWQgc3dfYWRkX2ZpbGVfaWRfYW5kX3ZlcihzdHJ1Y3QgYWJpc19ubV9zdyAqc3csIHN0cnVjdCBtc2diICptc2cpCit7CisJaWYgKHN3LT5idHMtPnR5cGUgPT0gR1NNX0JUU19UWVBFX05BTk9CVFMpIHsKKwkJbXNnYl92X3B1dChtc2csIE5NX0FUVF9TV19ERVNDUik7CisJCW1zZ2JfdGwxNnZfcHV0KG1zZywgTk1fQVRUX0ZJTEVfSUQsIHN3LT5maWxlX2lkX2xlbiwgc3ctPmZpbGVfaWQpOworCQltc2diX3RsMTZ2X3B1dChtc2csIE5NX0FUVF9GSUxFX1ZFUlNJT04sIHN3LT5maWxlX3ZlcnNpb25fbGVuLAorCQkJICAgICAgIHN3LT5maWxlX3ZlcnNpb24pOworCX0gZWxzZSBpZiAoc3ctPmJ0cy0+dHlwZSA9PSBHU01fQlRTX1RZUEVfQlMxMSkgeworCQltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfRklMRV9JRCwgc3ctPmZpbGVfaWRfbGVuLCBzdy0+ZmlsZV9pZCk7CisJCW1zZ2JfdGx2X3B1dChtc2csIE5NX0FUVF9GSUxFX1ZFUlNJT04sIHN3LT5maWxlX3ZlcnNpb25fbGVuLAorCQkJICAgICBzdy0+ZmlsZV92ZXJzaW9uKTsKKwl9IGVsc2UgeworCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIlBsZWFzZSBpbXBsZW1lbnQgdGhpcyBmb3IgdGhlIEJUUy5cbiIpOworCX0KK30KKworLyogNi4yLjEgLyA4LjMuMTogTG9hZCBEYXRhIEluaXRpYXRlICovCitzdGF0aWMgaW50IHN3X2xvYWRfaW5pdChzdHJ1Y3QgYWJpc19ubV9zdyAqc3cpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXVfaW50OF90IGxlbiA9IDMqMiArIHN3LT5maWxlX2lkX2xlbiArIHN3LT5maWxlX3ZlcnNpb25fbGVuOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgbGVuLCBOTV9NVF9MT0FEX0lOSVQsIHN3LT5vYmpfY2xhc3MsCisJCQlzdy0+b2JqX2luc3RhbmNlWzBdLCBzdy0+b2JqX2luc3RhbmNlWzFdLAorCQkJc3ctPm9ial9pbnN0YW5jZVsyXSk7CisKKwlzd19hZGRfZmlsZV9pZF9hbmRfdmVyKHN3LCBtc2cpOworCW1zZ2JfdHZfcHV0KG1zZywgTk1fQVRUX1dJTkRPV19TSVpFLCBzdy0+d2luZG93X3NpemUpOworCQorCXJldHVybiBhYmlzX25tX3NlbmRtc2coc3ctPmJ0cywgbXNnKTsKK30KKworc3RhdGljIGludCBpc19sYXN0X2xpbmUoRklMRSAqc3RyZWFtKQoreworCWNoYXIgbmV4dF9zZWdfYnVmWzI1Nl07CisJbG9uZyBwb3M7CisKKwkvKiBjaGVjayBpZiB3ZSdyZSBzZW5kaW5nIHRoZSBsYXN0IGxpbmUgKi8KKwlwb3MgPSBmdGVsbChzdHJlYW0pOworCWlmICghZmdldHMobmV4dF9zZWdfYnVmLCBzaXplb2YobmV4dF9zZWdfYnVmKS0yLCBzdHJlYW0pKSB7CisJCWZzZWVrKHN0cmVhbSwgcG9zLCBTRUVLX1NFVCk7CisJCXJldHVybiAxOworCX0KKworCWZzZWVrKHN0cmVhbSwgcG9zLCBTRUVLX1NFVCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIDYuMi4yIC8gOC4zLjIgTG9hZCBEYXRhIFNlZ21lbnQgKi8KK3N0YXRpYyBpbnQgc3dfbG9hZF9zZWdtZW50KHN0cnVjdCBhYmlzX25tX3N3ICpzdykKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJY2hhciBzZWdfYnVmWzI1Nl07CisJY2hhciAqbGluZV9idWYgPSBzZWdfYnVmKzI7CisJdW5zaWduZWQgY2hhciAqdGx2OworCXVfaW50OF90IGxlbjsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKworCXN3aXRjaCAoc3ctPmJ0cy0+dHlwZSkgeworCWNhc2UgR1NNX0JUU19UWVBFX0JTMTE6CisJCWlmIChmZ2V0cyhsaW5lX2J1Ziwgc2l6ZW9mKHNlZ19idWYpLTIsIHN3LT5zdHJlYW0pID09IE5VTEwpIHsKKwkJCXBlcnJvcigiZmdldHMgcmVhZGluZyBzZWdtZW50Iik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlzZWdfYnVmWzBdID0gMHgwMDsKKworCQkvKiBjaGVjayBpZiB3ZSdyZSBzZW5kaW5nIHRoZSBsYXN0IGxpbmUgKi8KKwkJc3ctPmxhc3Rfc2VnID0gaXNfbGFzdF9saW5lKHN3LT5zdHJlYW0pOworCQlpZiAoc3ctPmxhc3Rfc2VnKQorCQkJc2VnX2J1ZlsxXSA9IDA7CisJCWVsc2UKKwkJCXNlZ19idWZbMV0gPSAxICsgc3ctPnNlZ19pbl93aW5kb3crKzsKKworCQlsZW4gPSBzdHJsZW4obGluZV9idWYpICsgMjsKKwkJdGx2ID0gbXNnYl9wdXQobXNnLCBUTFZfR1JPU1NfTEVOKGxlbikpOworCQl0bHZfcHV0KHRsdiwgTk1fQVRUX0JTMTFfRklMRV9EQVRBLCBsZW4sICh1X2ludDhfdCAqKXNlZ19idWYpOworCQkvKiBCUzExIHdhbnRzIENSICsgTEYgaW4gZXhjZXNzIG9mIHRoZSBUTFYgbGVuZ3RoICE/ISAqLworCQl0bHZbMV0gLT0gMjsKKworCQkvKiB3ZSBvbmx5IG5vdyBrbm93IHRoZSBleGFjdCBsZW5ndGggZm9yIHRoZSBPTSBoZHIgKi8KKwkJbGVuID0gc3RybGVuKGxpbmVfYnVmKSsyOworCQlicmVhazsKKwljYXNlIEdTTV9CVFNfVFlQRV9OQU5PQlRTOiB7CisJCXN0YXRpY19hc3NlcnQoc2l6ZW9mKHNlZ19idWYpID49IElQQUNDX1NFR01FTlRfU0laRSwgYnVmZmVyX2JpZ19lbm91Z2gpOworCQlsZW4gPSByZWFkKHN3LT5mZCwgJnNlZ19idWYsIElQQUNDX1NFR01FTlRfU0laRSk7CisJCWlmIChsZW4gPCAwKSB7CisJCQlwZXJyb3IoInJlYWQgZmFpbGVkIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmIChsZW4gIT0gSVBBQ0NfU0VHTUVOVF9TSVpFKQorCQkJc3ctPmxhc3Rfc2VnID0gMTsKKworCQkrK3N3LT5zZWdfaW5fd2luZG93OworCQltc2diX3RsMTZ2X3B1dChtc2csIE5NX0FUVF9JUEFDQ19GSUxFX0RBVEEsIGxlbiwgKGNvbnN0IHVfaW50OF90ICopIHNlZ19idWYpOworCQlsZW4gKz0gMzsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAic3dfbG9hZF9zZWdtZW50IG5lZWRzIGltcGxlbWVudGF0aW9uIGZvciB0aGUgQlRTLlxuIik7CisJCS8qIEZJWE1FOiBPdGhlciBCVFMgdHlwZXMgKi8KKwkJcmV0dXJuIC0xOworCX0KKworCWZpbGxfb21fZm9tX2hkcihvaCwgbGVuLCBOTV9NVF9MT0FEX1NFRywgc3ctPm9ial9jbGFzcywKKwkJCXN3LT5vYmpfaW5zdGFuY2VbMF0sIHN3LT5vYmpfaW5zdGFuY2VbMV0sCisJCQlzdy0+b2JqX2luc3RhbmNlWzJdKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coc3ctPmJ0cywgbXNnKTsKK30KKworLyogNi4yLjQgLyA4LjMuNCBMb2FkIERhdGEgRW5kICovCitzdGF0aWMgaW50IHN3X2xvYWRfZW5kKHN0cnVjdCBhYmlzX25tX3N3ICpzdykKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJdV9pbnQ4X3QgbGVuID0gMioyICsgc3ctPmZpbGVfaWRfbGVuICsgc3ctPmZpbGVfdmVyc2lvbl9sZW47CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCBsZW4sIE5NX01UX0xPQURfRU5ELCBzdy0+b2JqX2NsYXNzLAorCQkJc3ctPm9ial9pbnN0YW5jZVswXSwgc3ctPm9ial9pbnN0YW5jZVsxXSwKKwkJCXN3LT5vYmpfaW5zdGFuY2VbMl0pOworCisJc3dfYWRkX2ZpbGVfaWRfYW5kX3ZlcihzdywgbXNnKTsKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKHN3LT5idHMsIG1zZyk7Cit9CisKKy8qIEFjdGl2YXRlIHRoZSBzcGVjaWZpZWQgc29mdHdhcmUgaW50byB0aGUgQlRTICovCitzdGF0aWMgaW50IHN3X2FjdGl2YXRlKHN0cnVjdCBhYmlzX25tX3N3ICpzdykKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJdV9pbnQ4X3QgbGVuID0gMioyICsgc3ctPmZpbGVfaWRfbGVuICsgc3ctPmZpbGVfdmVyc2lvbl9sZW47CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCBsZW4sIE5NX01UX0FDVElWQVRFX1NXLCBzdy0+b2JqX2NsYXNzLAorCQkJc3ctPm9ial9pbnN0YW5jZVswXSwgc3ctPm9ial9pbnN0YW5jZVsxXSwKKwkJCXN3LT5vYmpfaW5zdGFuY2VbMl0pOworCisJLyogRklYTUU6IHRoaXMgaXMgQlMxMSBzcGVjaWZpYyBmb3JtYXQgKi8KKwltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfRklMRV9JRCwgc3ctPmZpbGVfaWRfbGVuLCBzdy0+ZmlsZV9pZCk7CisJbXNnYl90bHZfcHV0KG1zZywgTk1fQVRUX0ZJTEVfVkVSU0lPTiwgc3ctPmZpbGVfdmVyc2lvbl9sZW4sCisJCSAgICAgc3ctPmZpbGVfdmVyc2lvbik7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKHN3LT5idHMsIG1zZyk7Cit9CisKK3N0cnVjdCBzZHBfZmlybXdhcmUgeworCWNoYXIgbWFnaWNbNF07CisJY2hhciBtb3JlX21hZ2ljWzRdOworCXVuc2lnbmVkIGludCBoZWFkZXJfbGVuZ3RoOworCXVuc2lnbmVkIGludCBmaWxlX2xlbmd0aDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdGF0aWMgaW50IHBhcnNlX3NkcF9oZWFkZXIoc3RydWN0IGFiaXNfbm1fc3cgKnN3KQoreworCXN0cnVjdCBzZHBfZmlybXdhcmUgZmlybXdhcmVfaGVhZGVyOworCWludCByYzsKKwlzdHJ1Y3Qgc3RhdCBzdGF0OworCisJcmMgPSByZWFkKHN3LT5mZCwgJmZpcm13YXJlX2hlYWRlciwgc2l6ZW9mKGZpcm13YXJlX2hlYWRlcikpOworCWlmIChyYyAhPSBzaXplb2YoZmlybXdhcmVfaGVhZGVyKSkgeworCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIkNvdWxkIG5vdCByZWFkIFNEUCBmaWxlIGhlYWRlci5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHN0cm5jbXAoZmlybXdhcmVfaGVhZGVyLm1hZ2ljLCAiIFNEUCIsIDQpICE9IDApIHsKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJUaGUgbWFnaWMgbnVtYmVyMSBpcyB3cm9uZy5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGZpcm13YXJlX2hlYWRlci5tb3JlX21hZ2ljWzBdICE9IDB4MTAgfHwKKwkgICAgZmlybXdhcmVfaGVhZGVyLm1vcmVfbWFnaWNbMV0gIT0gMHgwMiB8fAorCSAgICBmaXJtd2FyZV9oZWFkZXIubW9yZV9tYWdpY1syXSAhPSAweDAwIHx8CisJICAgIGZpcm13YXJlX2hlYWRlci5tb3JlX21hZ2ljWzNdICE9IDB4MDApIHsKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJUaGUgbW9yZSBtYWdpYyBudW1iZXIgaXMgd3JvbmcuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCisJaWYgKGZzdGF0KHN3LT5mZCwgJnN0YXQpID09IC0xKSB7CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiQ291bGQgbm90IHN0YXQgdGhlIGZpbGUuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChudG9obChmaXJtd2FyZV9oZWFkZXIuZmlsZV9sZW5ndGgpICE9IHN0YXQuc3Rfc2l6ZSkgeworCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIlRoZSBmaWxlc2l6ZXMgZG8gbm90IG1hdGNoLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBnbyBiYWNrIHRvIHRoZSBzdGFydCBhcyB3ZSBjaGVja2VkIHRoZSB3aG9sZSBmaWxlc2l6ZS4uICovCisJbHNlZWsoc3ctPmZkLCAwbCwgU0VFS19TRVQpOworCUxPR1AoRE5NLCBMT0dMX05PVElDRSwgIlRoZSBpcGFjY2VzcyBTRFAgaGVhZGVyIGlzIG5vdCBmdWxseSB1bmRlcnN0b29kLlxuIgorCQkJICAgICAgICJUaGVyZSBtaWdodCBiZSBjaGVja3N1bXMgaW4gdGhlIGZpbGUgdGhhdCBhcmUgbm90XG4iCisJCQkgICAgICAgInZlcmlmaWVkIGFuZCBpbmNvbXBsZXRlIGZpcm13YXJlIG1pZ2h0IGJlIGZsYXNoZWQuXG4iCisJCQkgICAgICAgIlRoZXJlIGlzIGFic29sdXRlbHkgbm8gV0FSUkFOVFkgdGhhdCBmbGFzaGluZyB3aWxsXG4iCisJCQkgICAgICAgIndvcmsuXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzd19vcGVuX2ZpbGUoc3RydWN0IGFiaXNfbm1fc3cgKnN3LCBjb25zdCBjaGFyICpmbmFtZSkKK3sKKwljaGFyIGZpbGVfaWRbMTIrMV07CisJY2hhciBmaWxlX3ZlcnNpb25bODArMV07CisJaW50IHJjOworCisJc3ctPmZkID0gb3BlbihmbmFtZSwgT19SRE9OTFkpOworCWlmIChzdy0+ZmQgPCAwKQorCQlyZXR1cm4gc3ctPmZkOworCisJc3dpdGNoIChzdy0+YnRzLT50eXBlKSB7CisJY2FzZSBHU01fQlRTX1RZUEVfQlMxMToKKwkJc3ctPnN0cmVhbSA9IGZkb3Blbihzdy0+ZmQsICJyIik7CisJCWlmICghc3ctPnN0cmVhbSkgeworCQkJcGVycm9yKCJmZG9wZW4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQkvKiByZWFkIGZpcnN0IGxpbmUgYW5kIHBhcnNlIGZpbGUgSUQgYW5kIFZFUlNJT04gKi8KKwkJcmMgPSBmc2NhbmYoc3ctPnN0cmVhbSwgIkAoIyklMTJzOiU4MHNcclxuIiwgCisJCQkgICAgZmlsZV9pZCwgZmlsZV92ZXJzaW9uKTsKKwkJaWYgKHJjICE9IDIpIHsKKwkJCXBlcnJvcigicGFyc2luZyBoZWFkZXIgbGluZSBvZiBzb2Z0d2FyZSBmaWxlIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJc3RyY3B5KChjaGFyICopc3ctPmZpbGVfaWQsIGZpbGVfaWQpOworCQlzdy0+ZmlsZV9pZF9sZW4gPSBzdHJsZW4oZmlsZV9pZCk7CisJCXN0cmNweSgoY2hhciAqKXN3LT5maWxlX3ZlcnNpb24sIGZpbGVfdmVyc2lvbik7CisJCXN3LT5maWxlX3ZlcnNpb25fbGVuID0gc3RybGVuKGZpbGVfdmVyc2lvbik7CisJCS8qIHJld2luZCB0byBzdGFydCBvZiBmaWxlICovCisJCXJld2luZChzdy0+c3RyZWFtKTsKKwkJYnJlYWs7CQorCWNhc2UgR1NNX0JUU19UWVBFX05BTk9CVFM6CisJCS8qIFRPRE86IGV4dHJhY3QgdGhhdCBmcm9tIHRoZSBmaWxlbmFtZSBvciBjb250ZW50ICovCisJCXJjID0gcGFyc2Vfc2RwX2hlYWRlcihzdyk7CisJCWlmIChyYyA8IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IHBhcnNlIHRoZSBpcGFjY2VzcyBTRFAgaGVhZGVyXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCXN0cmNweSgoY2hhciAqKXN3LT5maWxlX2lkLCAiaWQiKTsKKwkJc3ctPmZpbGVfaWRfbGVuID0gMzsKKwkJc3RyY3B5KChjaGFyICopc3ctPmZpbGVfdmVyc2lvbiwgInZlcnNpb24iKTsKKwkJc3ctPmZpbGVfdmVyc2lvbl9sZW4gPSA4OworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBXZSBkb24ndCBrbm93IGhvdyB0byB0cmVhdCB0aGVtIHlldCAqLworCQljbG9zZShzdy0+ZmQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwkKK3N0YXRpYyB2b2lkIHN3X2Nsb3NlX2ZpbGUoc3RydWN0IGFiaXNfbm1fc3cgKnN3KQoreworCXN3aXRjaCAoc3ctPmJ0cy0+dHlwZSkgeworCWNhc2UgR1NNX0JUU19UWVBFX0JTMTE6CisJCWZjbG9zZShzdy0+c3RyZWFtKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJY2xvc2Uoc3ctPmZkKTsKKwkJYnJlYWs7CisJfQorfQorCisvKiBGaWxsIHRoZSB3aW5kb3cgKi8KK3N0YXRpYyBpbnQgc3dfZmlsbF93aW5kb3coc3RydWN0IGFiaXNfbm1fc3cgKnN3KQoreworCWludCByYzsKKworCXdoaWxlIChzdy0+c2VnX2luX3dpbmRvdyA8IHN3LT53aW5kb3dfc2l6ZSkgeworCQlyYyA9IHN3X2xvYWRfc2VnbWVudChzdyk7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4gcmM7CisJCWlmIChzdy0+bGFzdF9zZWcpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIGNhbGxiYWNrIGZ1bmN0aW9uIGZyb20gYWJpc19ubV9yY3Ztc2coKSBoYW5kbGVyICovCitzdGF0aWMgaW50IGFiaXNfbm1fcmN2bXNnX3N3KHN0cnVjdCBtc2diICptYikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9mb21faGRyICpmb2ggPSBtc2diX2wzKG1iKTsKKwlpbnQgcmMgPSAtMTsKKwlzdHJ1Y3QgYWJpc19ubV9zdyAqc3cgPSAmZ19zdzsKKwllbnVtIHN3X3N0YXRlIG9sZF9zdGF0ZSA9IHN3LT5zdGF0ZTsKKwkKKwkvL0RFQlVHUChETk0sICJzdGF0ZSAldSwgTk0gTVQgMHglMDJ4XG4iLCBzdy0+c3RhdGUsIGZvaC0+bXNnX3R5cGUpOworCisJc3dpdGNoIChzdy0+c3RhdGUpIHsKKwljYXNlIFNXX1NUQVRFX1dBSVRfSU5JVEFDSzoKKwkJc3dpdGNoIChmb2gtPm1zZ190eXBlKSB7CisJCWNhc2UgTk1fTVRfTE9BRF9JTklUX0FDSzoKKwkJCS8qIGZpbGwgd2luZG93IHdpdGggc2VnbWVudHMgKi8KKwkJCWlmIChzdy0+Y2JmbikKKwkJCQlzdy0+Y2JmbihHU01fSE9PS19OTV9TV0xPQUQsCisJCQkJCSBOTV9NVF9MT0FEX0lOSVRfQUNLLCBtYiwKKwkJCQkJIHN3LT5jYl9kYXRhLCBOVUxMKTsKKwkJCXJjID0gc3dfZmlsbF93aW5kb3coc3cpOworCQkJc3ctPnN0YXRlID0gU1dfU1RBVEVfV0FJVF9TRUdBQ0s7CisJCQlicmVhazsKKwkJY2FzZSBOTV9NVF9MT0FEX0lOSVRfTkFDSzoKKwkJCWlmIChzdy0+Zm9yY2VkKSB7CisJCQkJREVCVUdQKEROTSwgIkZPUkNFRDogSWdub3JpbmcgU29mdHdhcmUgTG9hZCAiCisJCQkJCSJJbml0IE5BQ0tcbiIpOworCQkJCWlmIChzdy0+Y2JmbikKKwkJCQkJc3ctPmNiZm4oR1NNX0hPT0tfTk1fU1dMT0FELAorCQkJCQkJIE5NX01UX0xPQURfSU5JVF9BQ0ssIG1iLAorCQkJCQkJIHN3LT5jYl9kYXRhLCBOVUxMKTsKKwkJCQlyYyA9IHN3X2ZpbGxfd2luZG93KHN3KTsKKwkJCQlzdy0+c3RhdGUgPSBTV19TVEFURV9XQUlUX1NFR0FDSzsKKwkJCX0gZWxzZSB7CisJCQkJREVCVUdQKEROTSwgIlNvZnR3YXJlIExvYWQgSW5pdCBOQUNLXG4iKTsKKwkJCQkvKiBGSVhNRTogY2F1c2UgKi8KKwkJCQlpZiAoc3ctPmNiZm4pCisJCQkJCXN3LT5jYmZuKEdTTV9IT09LX05NX1NXTE9BRCwKKwkJCQkJCSBOTV9NVF9MT0FEX0lOSVRfTkFDSywgbWIsCisJCQkJCQkgc3ctPmNiX2RhdGEsIE5VTEwpOworCQkJCXN3LT5zdGF0ZSA9IFNXX1NUQVRFX0VSUk9SOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTV19TVEFURV9XQUlUX1NFR0FDSzoKKwkJc3dpdGNoIChmb2gtPm1zZ190eXBlKSB7CisJCWNhc2UgTk1fTVRfTE9BRF9TRUdfQUNLOgorCQkJaWYgKHN3LT5jYmZuKQorCQkJCXN3LT5jYmZuKEdTTV9IT09LX05NX1NXTE9BRCwKKwkJCQkJIE5NX01UX0xPQURfU0VHX0FDSywgbWIsCisJCQkJCSBzdy0+Y2JfZGF0YSwgTlVMTCk7CisJCQlzdy0+c2VnX2luX3dpbmRvdyA9IDA7CisJCQlpZiAoIXN3LT5sYXN0X3NlZykgeworCQkJCS8qIGZpbGwgd2luZG93IHdpdGggbW9yZSBzZWdtZW50cyAqLworCQkJCXJjID0gc3dfZmlsbF93aW5kb3coc3cpOworCQkJCXN3LT5zdGF0ZSA9IFNXX1NUQVRFX1dBSVRfU0VHQUNLOworCQkJfSBlbHNlIHsKKwkJCQkvKiBlbmQgdGhlIHRyYW5zZmVyICovCisJCQkJc3ctPnN0YXRlID0gU1dfU1RBVEVfV0FJVF9FTkRBQ0s7CisJCQkJcmMgPSBzd19sb2FkX2VuZChzdyk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBOTV9NVF9MT0FEX0FCT1JUOgorCQkJaWYgKHN3LT5jYmZuKQorCQkJCXN3LT5jYmZuKEdTTV9IT09LX05NX1NXTE9BRCwKKwkJCQkJIE5NX01UX0xPQURfQUJPUlQsIG1iLAorCQkJCQkgc3ctPmNiX2RhdGEsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTV19TVEFURV9XQUlUX0VOREFDSzoKKwkJc3dpdGNoIChmb2gtPm1zZ190eXBlKSB7CisJCWNhc2UgTk1fTVRfTE9BRF9FTkRfQUNLOgorCQkJc3dfY2xvc2VfZmlsZShzdyk7CisJCQlERUJVR1AoRE5NLCAiU29mdHdhcmUgTG9hZCBFbmQgKEJUUyAldSlcbiIsCisJCQkJc3ctPmJ0cy0+bnIpOworCQkJc3ctPnN0YXRlID0gU1dfU1RBVEVfTk9ORTsKKwkJCWlmIChzdy0+Y2JmbikKKwkJCQlzdy0+Y2JmbihHU01fSE9PS19OTV9TV0xPQUQsCisJCQkJCSBOTV9NVF9MT0FEX0VORF9BQ0ssIG1iLAorCQkJCQkgc3ctPmNiX2RhdGEsIE5VTEwpOworCQkJcmMgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgTk1fTVRfTE9BRF9FTkRfTkFDSzoKKwkJCWlmIChzdy0+Zm9yY2VkKSB7CisJCQkJREVCVUdQKEROTSwgIkZPUkNFRDogSWdub3JpbmcgU29mdHdhcmUgTG9hZCIKKwkJCQkJIkVuZCBOQUNLXG4iKTsKKwkJCQlzdy0+c3RhdGUgPSBTV19TVEFURV9OT05FOworCQkJCWlmIChzdy0+Y2JmbikKKwkJCQkJc3ctPmNiZm4oR1NNX0hPT0tfTk1fU1dMT0FELAorCQkJCQkJIE5NX01UX0xPQURfRU5EX0FDSywgbWIsCisJCQkJCQkgc3ctPmNiX2RhdGEsIE5VTEwpOworCQkJfSBlbHNlIHsKKwkJCQlERUJVR1AoRE5NLCAiU29mdHdhcmUgTG9hZCBFbmQgTkFDS1xuIik7CisJCQkJLyogRklYTUU6IGNhdXNlICovCisJCQkJc3ctPnN0YXRlID0gU1dfU1RBVEVfRVJST1I7CisJCQkJaWYgKHN3LT5jYmZuKQorCQkJCQlzdy0+Y2JmbihHU01fSE9PS19OTV9TV0xPQUQsCisJCQkJCQkgTk1fTVRfTE9BRF9FTkRfTkFDSywgbWIsCisJCQkJCQkgc3ctPmNiX2RhdGEsIE5VTEwpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwljYXNlIFNXX1NUQVRFX1dBSVRfQUNUQUNLOgorCQlzd2l0Y2ggKGZvaC0+bXNnX3R5cGUpIHsKKwkJY2FzZSBOTV9NVF9BQ1RJVkFURV9TV19BQ0s6CisJCQkvKiB3ZSdyZSBkb25lICovCisJCQlERUJVR1AoRE5NLCAiQWN0aXZhdGUgU29mdHdhcmUgRE9ORSFcbiIpOworCQkJc3ctPnN0YXRlID0gU1dfU1RBVEVfTk9ORTsKKwkJCXJjID0gMDsKKwkJCWlmIChzdy0+Y2JmbikKKwkJCQlzdy0+Y2JmbihHU01fSE9PS19OTV9TV0xPQUQsCisJCQkJCSBOTV9NVF9BQ1RJVkFURV9TV19BQ0ssIG1iLAorCQkJCQkgc3ctPmNiX2RhdGEsIE5VTEwpOworCQkJYnJlYWs7CisJCWNhc2UgTk1fTVRfQUNUSVZBVEVfU1dfTkFDSzoKKwkJCURFQlVHUChETk0sICJBY3RpdmF0ZSBTb2Z0d2FyZSBOQUNLXG4iKTsKKwkJCS8qIEZJWE1FOiBjYXVzZSAqLworCQkJc3ctPnN0YXRlID0gU1dfU1RBVEVfRVJST1I7CisJCQlpZiAoc3ctPmNiZm4pCisJCQkJc3ctPmNiZm4oR1NNX0hPT0tfTk1fU1dMT0FELAorCQkJCQkgTk1fTVRfQUNUSVZBVEVfU1dfTkFDSywgbWIsCisJCQkJCSBzdy0+Y2JfZGF0YSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCWNhc2UgU1dfU1RBVEVfTk9ORToKKwkJc3dpdGNoIChmb2gtPm1zZ190eXBlKSB7CisJCWNhc2UgTk1fTVRfQUNUSVZBVEVfU1dfQUNLOgorCQkJcmMgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTV19TVEFURV9FUlJPUjoKKwkJYnJlYWs7CisJfQorCisJaWYgKHJjKQorCQlERUJVR1AoRE5NLCAidW5leHBlY3RlZCBOTSBNVCAweCUwMnggaW4gc3RhdGUgJXUgLT4gJXVcbiIsCisJCQlmb2gtPm1zZ190eXBlLCBvbGRfc3RhdGUsIHN3LT5zdGF0ZSk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIExvYWQgdGhlIHNwZWNpZmllZCBzb2Z0d2FyZSBpbnRvIHRoZSBCVFMgKi8KK2ludCBhYmlzX25tX3NvZnR3YXJlX2xvYWQoc3RydWN0IGdzbV9idHMgKmJ0cywgY29uc3QgY2hhciAqZm5hbWUsCisJCQkgIHVfaW50OF90IHdpbl9zaXplLCBpbnQgZm9yY2VkLAorCQkJICBnc21fY2JmbiAqY2Jmbiwgdm9pZCAqY2JfZGF0YSkKK3sKKwlzdHJ1Y3QgYWJpc19ubV9zdyAqc3cgPSAmZ19zdzsKKwlpbnQgcmM7CisKKwlERUJVR1AoRE5NLCAiU29mdHdhcmUgTG9hZCAoQlRTICV1LCBGaWxlIFwiJXNcIilcbiIsCisJCWJ0cy0+bnIsIGZuYW1lKTsKKworCWlmIChzdy0+c3RhdGUgIT0gU1dfU1RBVEVfTk9ORSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXN3LT5idHMgPSBidHM7CisKKwlzd2l0Y2ggKGJ0cy0+dHlwZSkgeworCWNhc2UgR1NNX0JUU19UWVBFX0JTMTE6CisJCXN3LT5vYmpfY2xhc3MgPSBOTV9PQ19TSVRFX01BTkFHRVI7CisJCXN3LT5vYmpfaW5zdGFuY2VbMF0gPSAweGZmOworCQlzdy0+b2JqX2luc3RhbmNlWzFdID0gMHhmZjsKKwkJc3ctPm9ial9pbnN0YW5jZVsyXSA9IDB4ZmY7CisJCWJyZWFrOworCWNhc2UgR1NNX0JUU19UWVBFX05BTk9CVFM6CisJCXN3LT5vYmpfY2xhc3MgPSBOTV9PQ19CQVNFQl9UUkFOU0M7CisJCXN3LT5vYmpfaW5zdGFuY2VbMF0gPSAweDAwOworCQlzdy0+b2JqX2luc3RhbmNlWzFdID0gMHgwMDsKKwkJc3ctPm9ial9pbnN0YW5jZVsyXSA9IDB4ZmY7CisJCWJyZWFrOworCWNhc2UgR1NNX0JUU19UWVBFX1VOS05PV046CisJZGVmYXVsdDoKKwkJTE9HUEMoRE5NLCBMT0dMX0VSUk9SLCAiU29mdHdhcmUgTG9hZCBub3QgcHJvcGVybHkgaW1wbGVtZW50ZWQuXG4iKTsKKwkJcmV0dXJuIC0xOworCQlicmVhazsKKwl9CisJc3ctPndpbmRvd19zaXplID0gd2luX3NpemU7CisJc3ctPnN0YXRlID0gU1dfU1RBVEVfV0FJVF9JTklUQUNLOworCXN3LT5jYmZuID0gY2JmbjsKKwlzdy0+Y2JfZGF0YSA9IGNiX2RhdGE7CisJc3ctPmZvcmNlZCA9IGZvcmNlZDsKKworCXJjID0gc3dfb3Blbl9maWxlKHN3LCBmbmFtZSk7CisJaWYgKHJjIDwgMCkgeworCQlzdy0+c3RhdGUgPSBTV19TVEFURV9OT05FOworCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIHN3X2xvYWRfaW5pdChzdyk7Cit9CisKK2ludCBhYmlzX25tX3NvZnR3YXJlX2xvYWRfc3RhdHVzKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGFiaXNfbm1fc3cgKnN3ID0gJmdfc3c7CisJc3RydWN0IHN0YXQgc3Q7CisJaW50IHJjLCBwZXJjZW50OworCisJcmMgPSBmc3RhdChzdy0+ZmQsICZzdCk7CisJaWYgKHJjIDwgMCkgeworCQlwZXJyb3IoIkVSUk9SIGR1cmluZyBzdGF0Iik7CisJCXJldHVybiByYzsKKwl9CisKKwlpZiAoc3ctPnN0cmVhbSkKKwkJcGVyY2VudCA9IChmdGVsbChzdy0+c3RyZWFtKSAqIDEwMCkgLyBzdC5zdF9zaXplOworCWVsc2UKKwkJcGVyY2VudCA9IChsc2Vlayhzdy0+ZmQsIDAsIFNFRUtfQ1VSKSAqIDEwMCkgLyBzdC5zdF9zaXplOworCXJldHVybiBwZXJjZW50OworfQorCisvKiBBY3RpdmF0ZSB0aGUgc3BlY2lmaWVkIHNvZnR3YXJlIGludG8gdGhlIEJUUyAqLworaW50IGFiaXNfbm1fc29mdHdhcmVfYWN0aXZhdGUoc3RydWN0IGdzbV9idHMgKmJ0cywgY29uc3QgY2hhciAqZm5hbWUsCisJCQkgICAgICBnc21fY2JmbiAqY2Jmbiwgdm9pZCAqY2JfZGF0YSkKK3sKKwlzdHJ1Y3QgYWJpc19ubV9zdyAqc3cgPSAmZ19zdzsKKwlpbnQgcmM7CisKKwlERUJVR1AoRE5NLCAiQWN0aXZhdGluZyBTb2Z0d2FyZSAoQlRTICV1LCBGaWxlIFwiJXNcIilcbiIsCisJCWJ0cy0+bnIsIGZuYW1lKTsKKworCWlmIChzdy0+c3RhdGUgIT0gU1dfU1RBVEVfTk9ORSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXN3LT5idHMgPSBidHM7CisJc3ctPm9ial9jbGFzcyA9IE5NX09DX1NJVEVfTUFOQUdFUjsKKwlzdy0+b2JqX2luc3RhbmNlWzBdID0gMHhmZjsKKwlzdy0+b2JqX2luc3RhbmNlWzFdID0gMHhmZjsKKwlzdy0+b2JqX2luc3RhbmNlWzJdID0gMHhmZjsKKwlzdy0+c3RhdGUgPSBTV19TVEFURV9XQUlUX0FDVEFDSzsKKwlzdy0+Y2JmbiA9IGNiZm47CisJc3ctPmNiX2RhdGEgPSBjYl9kYXRhOworCisJLyogT3BlbiB0aGUgZmlsZSBpbiBvcmRlciB0byBmaWxsIHNvbWUgc3cgc3RydWN0IG1lbWJlcnMgKi8KKwlyYyA9IHN3X29wZW5fZmlsZShzdywgZm5hbWUpOworCWlmIChyYyA8IDApIHsKKwkJc3ctPnN0YXRlID0gU1dfU1RBVEVfTk9ORTsKKwkJcmV0dXJuIHJjOworCX0KKwlzd19jbG9zZV9maWxlKHN3KTsKKworCXJldHVybiBzd19hY3RpdmF0ZShzdyk7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxfbm1fY2hhbm5lbChzdHJ1Y3QgYWJpc19ubV9jaGFubmVsICpjaCwgdV9pbnQ4X3QgYnRzX3BvcnQsCisJCSAgICAgICB1X2ludDhfdCB0c19uciwgdV9pbnQ4X3Qgc3Vic2xvdF9ucikKK3sKKwljaC0+YXR0cmliID0gTk1fQVRUX0FCSVNfQ0hBTk5FTDsKKwljaC0+YnRzX3BvcnQgPSBidHNfcG9ydDsKKwljaC0+dGltZXNsb3QgPSB0c19ucjsKKwljaC0+c3Vic2xvdCA9IHN1YnNsb3RfbnI7CQorfQorCitpbnQgYWJpc19ubV9lc3RhYmxpc2hfdGVpKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IHRyeF9uciwKKwkJCSAgdV9pbnQ4X3QgZTFfcG9ydCwgdV9pbnQ4X3QgZTFfdGltZXNsb3QsIHVfaW50OF90IGUxX3N1YnNsb3QsCisJCQkgIHVfaW50OF90IHRlaSkKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBhYmlzX25tX2NoYW5uZWwgKmNoOworCXVfaW50OF90IGxlbiA9IHNpemVvZigqY2gpICsgMjsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgbGVuLCBOTV9NVF9FU1RBQkxJU0hfVEVJLCBOTV9PQ19SQURJT19DQVJSSUVSLAorCQkJYnRzLT5idHNfbnIsIHRyeF9uciwgMHhmZik7CisJCisJbXNnYl90dl9wdXQobXNnLCBOTV9BVFRfVEVJLCB0ZWkpOworCisJY2ggPSAoc3RydWN0IGFiaXNfbm1fY2hhbm5lbCAqKSBtc2diX3B1dChtc2csIHNpemVvZigqY2gpKTsKKwlmaWxsX25tX2NoYW5uZWwoY2gsIGUxX3BvcnQsIGUxX3RpbWVzbG90LCBlMV9zdWJzbG90KTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCisvKiBjb25uZWN0IHNpZ25hbGxpbmcgb2Ygb25lIChCVFMsVFJYKSB0byBhIHBhcnRpY3VsYXIgdGltZXNsb3Qgb24gdGhlIEUxICovCitpbnQgYWJpc19ubV9jb25uX3RlcnJfc2lnbihzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwKKwkJCSAgIHVfaW50OF90IGUxX3BvcnQsIHVfaW50OF90IGUxX3RpbWVzbG90LCB1X2ludDhfdCBlMV9zdWJzbG90KQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB0cngtPmJ0czsKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBhYmlzX25tX2NoYW5uZWwgKmNoOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCBzaXplb2YoKmNoKSwgTk1fTVRfQ09OTl9URVJSX1NJR04sCisJCQlOTV9PQ19SQURJT19DQVJSSUVSLCBidHMtPmJ0c19uciwgdHJ4LT5uciwgMHhmZik7CisJCisJY2ggPSAoc3RydWN0IGFiaXNfbm1fY2hhbm5lbCAqKSBtc2diX3B1dChtc2csIHNpemVvZigqY2gpKTsKKwlmaWxsX25tX2NoYW5uZWwoY2gsIGUxX3BvcnQsIGUxX3RpbWVzbG90LCBlMV9zdWJzbG90KTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCisjaWYgMAoraW50IGFiaXNfbm1fZGlzY190ZXJyX3NpZ24oc3RydWN0IGFiaXNfbm1faCAqaCwgc3RydWN0IGFiaXNfb21fb2JqX2luc3QgKmluc3QsCisJCQkgICBzdHJ1Y3QgYWJpc19ubV9hYmlzX2NoYW5uZWwgKmNoYW4pCit7Cit9CisjZW5kaWYKKworaW50IGFiaXNfbm1fY29ubl90ZXJyX3RyYWYoc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cywKKwkJCSAgIHVfaW50OF90IGUxX3BvcnQsIHVfaW50OF90IGUxX3RpbWVzbG90LAorCQkJICAgdV9pbnQ4X3QgZTFfc3Vic2xvdCkKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdHMtPnRyeC0+YnRzOworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IGFiaXNfbm1fY2hhbm5lbCAqY2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIHNpemVvZigqY2gpLCBOTV9NVF9DT05OX1RFUlJfVFJBRiwKKwkJCU5NX09DX0NIQU5ORUwsIGJ0cy0+YnRzX25yLCB0cy0+dHJ4LT5uciwgdHMtPm5yKTsKKworCWNoID0gKHN0cnVjdCBhYmlzX25tX2NoYW5uZWwgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmNoKSk7CisJZmlsbF9ubV9jaGFubmVsKGNoLCBlMV9wb3J0LCBlMV90aW1lc2xvdCwgZTFfc3Vic2xvdCk7CisKKwlERUJVR1AoRE5NLCAiQ09OTkVDVCBURVJSIFRSQUYgVW09JXMgRTE9KCV1LCV1LCV1KVxuIiwKKwkJZ3NtX3RzX25hbWUodHMpLAorCQllMV9wb3J0LCBlMV90aW1lc2xvdCwgZTFfc3Vic2xvdCk7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworI2lmIDAKK2ludCBhYmlzX25tX2Rpc2NfdGVycl90cmFmKHN0cnVjdCBhYmlzX25tX2ggKmgsIHN0cnVjdCBhYmlzX29tX29ial9pbnN0ICppbnN0LAorCQkJICAgc3RydWN0IGFiaXNfbm1fYWJpc19jaGFubmVsICpjaGFuLAorCQkJICAgdV9pbnQ4X3Qgc3ViY2hhbikKK3sKK30KKyNlbmRpZgorCisvKiBDaGFwdGVyIDguNi4xICovCitpbnQgYWJpc19ubV9zZXRfYnRzX2F0dHIoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgKmF0dHIsIGludCBhdHRyX2xlbikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJdV9pbnQ4X3QgKmN1cjsKKworCURFQlVHUChETk0sICJTZXQgQlRTIEF0dHIgKGJ0cz0lZClcbiIsIGJ0cy0+bnIpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgYXR0cl9sZW4sIE5NX01UX1NFVF9CVFNfQVRUUiwgTk1fT0NfQlRTLCBidHMtPmJ0c19uciwgMHhmZiwgMHhmZik7CisJY3VyID0gbXNnYl9wdXQobXNnLCBhdHRyX2xlbik7CisJbWVtY3B5KGN1ciwgYXR0ciwgYXR0cl9sZW4pOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKKy8qIENoYXB0ZXIgOC42LjIgKi8KK2ludCBhYmlzX25tX3NldF9yYWRpb19hdHRyKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCB1X2ludDhfdCAqYXR0ciwgaW50IGF0dHJfbGVuKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwl1X2ludDhfdCAqY3VyOworCisJREVCVUdQKEROTSwgIlNldCBUUlggQXR0ciAoYnRzPSVkLHRyeD0lZClcbiIsIHRyeC0+YnRzLT5uciwgdHJ4LT5ucik7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCBhdHRyX2xlbiwgTk1fTVRfU0VUX1JBRElPX0FUVFIsIE5NX09DX1JBRElPX0NBUlJJRVIsCisJCQl0cngtPmJ0cy0+YnRzX25yLCB0cngtPm5yLCAweGZmKTsKKwljdXIgPSBtc2diX3B1dChtc2csIGF0dHJfbGVuKTsKKwltZW1jcHkoY3VyLCBhdHRyLCBhdHRyX2xlbik7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKHRyeC0+YnRzLCBtc2cpOworfQorCitzdGF0aWMgaW50IHZlcmlmeV9jaGFuX2NvbWIoc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cywgdV9pbnQ4X3QgY2hhbl9jb21iKQoreworCWludCBpOworCisJLyogQXMgaXQgdHVybnMgb3V0LCB0aGUgQlMtMTEgaGFzIHNvbWUgdmVyeSBwZWN1bGlhciByZXN0cmljdGlvbnMKKwkgKiBvbiB0aGUgY2hhbm5lbCBjb21iaW5hdGlvbnMgaXQgYWxsb3dzICovCisJc3dpdGNoICh0cy0+dHJ4LT5idHMtPnR5cGUpIHsKKwljYXNlIEdTTV9CVFNfVFlQRV9CUzExOgorCQlzd2l0Y2ggKGNoYW5fY29tYikgeworCQljYXNlIE5NX0NIQU5DX1RDSEhhbGY6CisJCWNhc2UgTk1fQ0hBTkNfVENISGFsZjI6CisJCQkvKiBub3Qgc3VwcG9ydGVkICovCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJY2FzZSBOTV9DSEFOQ19TRENDSDoKKwkJCS8qIG9ubHkgb25lIFNEQ0NILzggcGVyIFRSWCAqLworCQkJZm9yIChpID0gMDsgaSA8IFRSWF9OUl9UUzsgaSsrKSB7CisJCQkJaWYgKGkgPT0gdHMtPm5yKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAodHMtPnRyeC0+dHNbaV0ubm1fY2hhbl9jb21iID09CisJCQkJICAgIE5NX0NIQU5DX1NEQ0NIKQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCS8qIG5vdCBhbGxvd2VkIGZvciBUUzAgb2YgQkNDSC1UUlggKi8KKwkJCWlmICh0cy0+dHJ4ID09IHRzLT50cngtPmJ0cy0+YzAgJiYKKwkJCSAgICB0cy0+bnIgPT0gMCkKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkvKiBub3Qgb24gdGhlIHNhbWUgVFJYIHRoYXQgaGFzIGEgQkNDSCtTRENDSDQKKwkJCSAqIGNvbWJpbmF0aW9uICovCisJCQlpZiAodHMtPnRyeCA9PSB0cy0+dHJ4LT5idHMtPmMwICYmCisJCQkgICAgKHRzLT50cngtPnRzWzBdLm5tX2NoYW5fY29tYiA9PSA1IHx8CisJCQkgICAgIHRzLT50cngtPnRzWzBdLm5tX2NoYW5fY29tYiA9PSA4KSkKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKKwkJY2FzZSBOTV9DSEFOQ19tYWluQkNDSDoKKwkJY2FzZSBOTV9DSEFOQ19CQ0NIQ29tYjoKKwkJCS8qIGFsbG93ZWQgb25seSBmb3IgVFMwIG9mIEMwICovCisJCQlpZiAodHMtPnRyeCAhPSB0cy0+dHJ4LT5idHMtPmMwIHx8CisJCQkgICAgdHMtPm5yICE9IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKKwkJY2FzZSBOTV9DSEFOQ19CQ0NIOgorCQkJLyogYWxsb3dlZCBvbmx5IGZvciBUUyAyLzQvNiBvZiBDMCAqLworCQkJaWYgKHRzLT50cnggIT0gdHMtPnRyeC0+YnRzLT5jMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmICh0cy0+bnIgIT0gMiAmJiB0cy0+bnIgIT0gNCAmJgorCQkJICAgIHRzLT5uciAhPSA2KQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJYnJlYWs7CisJCWNhc2UgODogLyogdGhpcyBpcyBub3QgbGlrZSAwOC41OCwgYnV0IGluIGZhY3QKKwkJCSAqIEZDQ0grU0NIK0JDQ0grQ0NDSCtTRENDSC80K1NBQ0NIL0M0K0NCQ0ggKi8KKwkJCS8qIEZJWE1FOiBvbmx5IG9uZSBDQkNIIGFsbG93ZWQgcGVyIGNlbGwgKi8KKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgR1NNX0JUU19UWVBFX05BTk9CVFM6CisJCXN3aXRjaCAodHMtPm5yKSB7CisJCWNhc2UgMDoKKwkJCWlmICh0cy0+dHJ4LT5uciA9PSAwKSB7CisJCQkJLyogb25seSBvbiBUUlgwICovCisJCQkJc3dpdGNoIChjaGFuX2NvbWIpIHsKKwkJCQljYXNlIE5NX0NIQU5DX0JDQ0g6CisJCQkJY2FzZSBOTV9DSEFOQ19tYWluQkNDSDoKKwkJCQljYXNlIE5NX0NIQU5DX0JDQ0hDb21iOgorCQkJCQlyZXR1cm4gMDsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlzd2l0Y2ggKGNoYW5fY29tYikgeworCQkJCWNhc2UgTk1fQ0hBTkNfVENIRnVsbDoKKwkJCQljYXNlIE5NX0NIQU5DX1RDSEhhbGY6CisJCQkJY2FzZSBOTV9DSEFOQ19JUEFDX1RDSEZ1bGxfVENISGFsZjoKKwkJCQkJcmV0dXJuIDA7CisJCQkJZGVmYXVsdDoKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWlmICh0cy0+dHJ4LT5uciA9PSAwKSB7CisJCQkJc3dpdGNoIChjaGFuX2NvbWIpIHsKKwkJCQljYXNlIE5NX0NIQU5DX1NEQ0NIX0NCQ0g6CisJCQkJCWlmICh0cy0+dHJ4LT50c1swXS5ubV9jaGFuX2NvbWIgPT0KKwkJCQkJICAgIE5NX0NIQU5DX21haW5CQ0NIKQorCQkJCQkJcmV0dXJuIDA7CisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCWNhc2UgTk1fQ0hBTkNfU0RDQ0g6CisJCQkJY2FzZSBOTV9DSEFOQ19UQ0hGdWxsOgorCQkJCWNhc2UgTk1fQ0hBTkNfVENISGFsZjoKKwkJCQljYXNlIE5NX0NIQU5DX0lQQUNfVENIRnVsbF9UQ0hIYWxmOgorCQkJCWNhc2UgTk1fQ0hBTkNfSVBBQ19UQ0hGdWxsX1BEQ0g6CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJc3dpdGNoIChjaGFuX2NvbWIpIHsKKwkJCQljYXNlIE5NX0NIQU5DX1NEQ0NIOgorCQkJCWNhc2UgTk1fQ0hBTkNfVENIRnVsbDoKKwkJCQljYXNlIE5NX0NIQU5DX1RDSEhhbGY6CisJCQkJY2FzZSBOTV9DSEFOQ19JUEFDX1RDSEZ1bGxfVENISGFsZjoKKwkJCQkJcmV0dXJuIDA7CisJCQkJZGVmYXVsdDoKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJY2FzZSAzOgorCQljYXNlIDQ6CisJCWNhc2UgNToKKwkJY2FzZSA2OgorCQljYXNlIDc6CisJCQlzd2l0Y2ggKGNoYW5fY29tYikgeworCQkJY2FzZSBOTV9DSEFOQ19UQ0hGdWxsOgorCQkJY2FzZSBOTV9DSEFOQ19UQ0hIYWxmOgorCQkJY2FzZSBOTV9DSEFOQ19JUEFDX1RDSEZ1bGxfVENISGFsZjoKKwkJCQlyZXR1cm4gMDsKKwkJCWNhc2UgTk1fQ0hBTkNfSVBBQ19QRENIOgorCQkJY2FzZSBOTV9DSEFOQ19JUEFDX1RDSEZ1bGxfUERDSDoKKwkJCQlpZiAodHMtPnRyeC0+bnIgPT0gMCkKKwkJCQkJcmV0dXJuIDA7CisJCQkJZWxzZQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCXJldHVybiAtRUlOVkFMOworCWRlZmF1bHQ6CisJCS8qIHVua25vd24gQlRTIHR5cGUgKi8KKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAwOworfQorCisvKiBDaGFwdGVyIDguNi4zICovCitpbnQgYWJpc19ubV9zZXRfY2hhbm5lbF9hdHRyKHN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMsIHVfaW50OF90IGNoYW5fY29tYikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdHMtPnRyeC0+YnRzOworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJdV9pbnQxNl90IGFyZmNuID0gaHRvbnModHMtPnRyeC0+YXJmY24pOworCXVfaW50OF90IHplcm8gPSAweDAwOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJdV9pbnQ4X3QgbGVuID0gMiArIDI7CisKKwlpZiAoYnRzLT50eXBlID09IEdTTV9CVFNfVFlQRV9CUzExKQorCQlsZW4gKz0gNCArIDIgKyAyICsgMzsKKworCURFQlVHUChETk0sICJTZXQgQ2hhbiBBdHRyICVzXG4iLCBnc21fdHNfbmFtZSh0cykpOworCWlmICh2ZXJpZnlfY2hhbl9jb21iKHRzLCBjaGFuX2NvbWIpIDwgMCkgeworCQltc2diX2ZyZWUobXNnKTsKKwkJREVCVUdQKEROTSwgIkludmFsaWQgQ2hhbm5lbCBDb21iaW5hdGlvbiEhIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwl0cy0+bm1fY2hhbl9jb21iID0gY2hhbl9jb21iOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgbGVuLCBOTV9NVF9TRVRfQ0hBTl9BVFRSLAorCQkJTk1fT0NfQ0hBTk5FTCwgYnRzLT5idHNfbnIsCisJCQl0cy0+dHJ4LT5uciwgdHMtPm5yKTsKKwkvKiBGSVhNRTogZG9uJ3Qgc2VuZCBBUkZDTiBsaXN0LCBob3BwaW5nIHNlcXVlbmNlLCBtQUlPLCAuLi4qLworCWlmIChidHMtPnR5cGUgPT0gR1NNX0JUU19UWVBFX0JTMTEpCisJCW1zZ2JfdGx2MTZfcHV0KG1zZywgTk1fQVRUX0FSRkNOX0xJU1QsIDEsICZhcmZjbik7CisJbXNnYl90dl9wdXQobXNnLCBOTV9BVFRfQ0hBTl9DT01CLCBjaGFuX2NvbWIpOworCWlmIChidHMtPnR5cGUgPT0gR1NNX0JUU19UWVBFX0JTMTEpIHsKKwkJbXNnYl90dl9wdXQobXNnLCBOTV9BVFRfSFNOLCAweDAwKTsKKwkJbXNnYl90dl9wdXQobXNnLCBOTV9BVFRfTUFJTywgMHgwMCk7CisJfQorCW1zZ2JfdHZfcHV0KG1zZywgTk1fQVRUX1RTQywgYnRzLT50c2MpOwkvKiB0cmFpbmluZyBzZXF1ZW5jZSAqLworCWlmIChidHMtPnR5cGUgPT0gR1NNX0JUU19UWVBFX0JTMTEpCisJCW1zZ2JfdGx2X3B1dChtc2csIDB4NTksIDEsICZ6ZXJvKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9zd19hY3RfcmVxX2FjayhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBvYmpfY2xhc3MsIHVfaW50OF90IGkxLAorCQkJdV9pbnQ4X3QgaTIsIHVfaW50OF90IGkzLCBpbnQgbmFjaywgdV9pbnQ4X3QgKmF0dHIsIGludCBhdHRfbGVuKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwl1X2ludDhfdCBtc2d0eXBlID0gTk1fTVRfU1dfQUNUX1JFUV9BQ0s7CisJdV9pbnQ4X3QgbGVuID0gYXR0X2xlbjsKKworCWlmIChuYWNrKSB7CisJCWxlbiArPSAyOworCQltc2d0eXBlID0gTk1fTVRfU1dfQUNUX1JFUV9OQUNLOworCX0KKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIGF0dF9sZW4sIG1zZ3R5cGUsIG9ial9jbGFzcywgaTEsIGkyLCBpMyk7CisKKwlpZiAoYXR0cikgeworCQl1X2ludDhfdCAqcHRyID0gbXNnYl9wdXQobXNnLCBhdHRfbGVuKTsKKwkJbWVtY3B5KHB0ciwgYXR0ciwgYXR0X2xlbik7CisJfQorCWlmIChuYWNrKQorCQltc2diX3R2X3B1dChtc2csIE5NX0FUVF9OQUNLX0NBVVNFUywgTk1fTkFDS19PQkpDTEFTU19OT1RTVVBQKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9yYXdfbXNnKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBsZW4sIHVfaW50OF90ICpyYXdtc2cpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXVfaW50OF90ICpkYXRhOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpvaCkpOworCWZpbGxfb21faGRyKG9oLCBsZW4pOworCWRhdGEgPSBtc2diX3B1dChtc2csIGxlbik7CisJbWVtY3B5KGRhdGEsIHJhd21zZywgbGVuKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCisvKiBTaWVtZW5zIHNwZWNpZmljIGNvbW1hbmRzICovCitzdGF0aWMgaW50IF9fc2ltcGxlX2NtZChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBtc2dfdHlwZSkKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCAwLCBtc2dfdHlwZSwgTk1fT0NfU0lURV9NQU5BR0VSLAorCQkJMHhmZiwgMHhmZiwgMHhmZik7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworLyogQ2hhcHRlciA4LjkuMiAqLworaW50IGFiaXNfbm1fb3BzdGFydChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBvYmpfY2xhc3MsIHVfaW50OF90IGkwLCB1X2ludDhfdCBpMSwgdV9pbnQ4X3QgaTIpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMCwgTk1fTVRfT1BTVEFSVCwgb2JqX2NsYXNzLCBpMCwgaTEsIGkyKTsKKworCWRlYnVncF9mb2goKHN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKikgb2gtPmRhdGEpOworCURFQlVHUEMoRE5NLCAiU2VuZGluZyBPUFNUQVJUXG4iKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCisvKiBDaGFwdGVyIDguOC41ICovCitpbnQgYWJpc19ubV9jaGdfYWRtX3N0YXRlKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IG9ial9jbGFzcywgdV9pbnQ4X3QgaTAsCisJCQkgIHVfaW50OF90IGkxLCB1X2ludDhfdCBpMiwgZW51bSBhYmlzX25tX2FkbV9zdGF0ZSBhZG1fc3RhdGUpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMiwgTk1fTVRfQ0hHX0FETV9TVEFURSwgb2JqX2NsYXNzLCBpMCwgaTEsIGkyKTsKKwltc2diX3R2X3B1dChtc2csIE5NX0FUVF9BRE1fU1RBVEUsIGFkbV9zdGF0ZSk7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworaW50IGFiaXNfbm1fY29ubl9tZHJvcF9saW5rKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGUxX3BvcnQwLCB1X2ludDhfdCB0czAsCisJCQkgICAgdV9pbnQ4X3QgZTFfcG9ydDEsIHVfaW50OF90IHRzMSkKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJdV9pbnQ4X3QgKmF0dHI7CisKKwlERUJVR1AoRE5NLCAiQ09OTkVDVCBNRFJPUCBMSU5LIEUxPSgldSwldSkgLT4gRTE9KCV1LCAldSlcbiIsCisJCWUxX3BvcnQwLCB0czAsIGUxX3BvcnQxLCB0czEpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgNiwgTk1fTVRfQ09OTl9NRFJPUF9MSU5LLAorCQkJTk1fT0NfU0lURV9NQU5BR0VSLCAweDAwLCAweDAwLCAweDAwKTsKKworCWF0dHIgPSBtc2diX3B1dChtc2csIDMpOworCWF0dHJbMF0gPSBOTV9BVFRfTURST1BfTElOSzsKKwlhdHRyWzFdID0gZTFfcG9ydDA7CisJYXR0clsyXSA9IHRzMDsKKworCWF0dHIgPSBtc2diX3B1dChtc2csIDMpOworCWF0dHJbMF0gPSBOTV9BVFRfTURST1BfTkVYVDsKKwlhdHRyWzFdID0gZTFfcG9ydDE7CisJYXR0clsyXSA9IHRzMTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCisvKiBDaGFwdGVyIDguNy4xICovCitpbnQgYWJpc19ubV9wZXJmb3JtX3Rlc3Qoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3Qgb2JqX2NsYXNzLAorCQkJIHVfaW50OF90IGJ0c19uciwgdV9pbnQ4X3QgdHJ4X25yLCB1X2ludDhfdCB0c19uciwKKwkJCSB1X2ludDhfdCB0ZXN0X25yLCB1X2ludDhfdCBhdXRvbl9yZXBvcnQsCisJCQkgdV9pbnQ4X3QgKnBoeXNfY29uZmlnLCB1X2ludDE2X3QgcGh5c19jb25maWdfbGVuKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwlpbnQgbGVuID0gNDsgLyogMiBUViBhdHRyaWJ1dGVzICovCisKKwlERUJVR1AoRE5NLCAiUEVGT1JNIFRFU1RcbiIpOworCQorCWlmIChwaHlzX2NvbmZpZ19sZW4pCisJCWxlbiArPSAzICsgcGh5c19jb25maWdfbGVuOworCQorCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIGxlbiwgTk1fTVRfUEVSRl9URVNULAorCQkJb2JqX2NsYXNzLCBidHNfbnIsIHRyeF9uciwgdHNfbnIpOworCW1zZ2JfdHZfcHV0KG1zZywgTk1fQVRUX1RFU1RfTk8sIHRlc3RfbnIpOworCW1zZ2JfdHZfcHV0KG1zZywgTk1fQVRUX0FVVE9OX1JFUE9SVCwgYXV0b25fcmVwb3J0KTsKKwlpZiAocGh5c19jb25maWdfbGVuKQorCQltc2diX3RsMTZ2X3B1dChtc2csIE5NX0FUVF9QSFlTX0NPTkYsIHBoeXNfY29uZmlnX2xlbiwKKwkJCQlwaHlzX2NvbmZpZyk7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworaW50IGFiaXNfbm1fZXZlbnRfcmVwb3J0cyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgb24pCit7CisJaWYgKG9uID09IDApCisJCXJldHVybiBfX3NpbXBsZV9jbWQoYnRzLCBOTV9NVF9TVE9QX0VWRU5UX1JFUCk7CisJZWxzZQorCQlyZXR1cm4gX19zaW1wbGVfY21kKGJ0cywgTk1fTVRfUkVTVF9FVkVOVF9SRVApOworfQorCisvKiBTaWVtZW5zIChvciBCUy0xMSkgc3BlY2lmaWMgY29tbWFuZHMgKi8KKworaW50IGFiaXNfbm1fYnMxMV9ic2NfZGlzY29ubmVjdChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgcmVjb25uZWN0KQoreworCWlmIChyZWNvbm5lY3QgPT0gMCkKKwkJcmV0dXJuIF9fc2ltcGxlX2NtZChidHMsIE5NX01UX0JTMTFfRElTQ09OTkVDVCk7CisJZWxzZQorCQlyZXR1cm4gX19zaW1wbGVfY21kKGJ0cywgTk1fTVRfQlMxMV9SRUNPTk5FQ1QpOworfQorCitpbnQgYWJpc19ubV9iczExX3Jlc3RhcnQoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlyZXR1cm4gX19zaW1wbGVfY21kKGJ0cywgTk1fTVRfQlMxMV9SRVNUQVJUKTsKK30KKworCitzdHJ1Y3QgYnMxMV9kYXRlX3RpbWUgeworCXVfaW50MTZfdAl5ZWFyOworCXVfaW50OF90CW1vbnRoOworCXVfaW50OF90CWRheTsKKwl1X2ludDhfdAlob3VyOworCXVfaW50OF90CW1pbjsKKwl1X2ludDhfdAlzZWM7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKK3ZvaWQgZ2V0X2JzMTFfZGF0ZV90aW1lKHN0cnVjdCBiczExX2RhdGVfdGltZSAqYWV0KQoreworCXRpbWVfdCB0OworCXN0cnVjdCB0bSAqdG07CisKKwl0ID0gdGltZShOVUxMKTsKKwl0bSA9IGxvY2FsdGltZSgmdCk7CisJYWV0LT5zZWMgPSB0bS0+dG1fc2VjOworCWFldC0+bWluID0gdG0tPnRtX21pbjsKKwlhZXQtPmhvdXIgPSB0bS0+dG1faG91cjsKKwlhZXQtPmRheSA9IHRtLT50bV9tZGF5OworCWFldC0+bW9udGggPSB0bS0+dG1fbW9uOworCWFldC0+eWVhciA9IGh0b25zKDE5MDAgKyB0bS0+dG1feWVhcik7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfcmVzZXRfcmVzb3VyY2Uoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlyZXR1cm4gX19zaW1wbGVfY21kKGJ0cywgTk1fTVRfQlMxMV9SRVNFVF9SRVNPVVJDRSk7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfZGJfdHJhbnNtaXNzaW9uKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBiZWdpbikKK3sKKwlpZiAoYmVnaW4pCisJCXJldHVybiBfX3NpbXBsZV9jbWQoYnRzLCBOTV9NVF9CUzExX0JFR0lOX0RCX1RYKTsKKwllbHNlCisJCXJldHVybiBfX3NpbXBsZV9jbWQoYnRzLCBOTV9NVF9CUzExX0VORF9EQl9UWCk7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfY3JlYXRlX29iamVjdChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLAorCQkJCWVudW0gYWJpc19iczExX29ianR5cGUgdHlwZSwgdV9pbnQ4X3QgaWR4LAorCQkJCXVfaW50OF90IGF0dHJfbGVuLCBjb25zdCB1X2ludDhfdCAqYXR0cikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJdV9pbnQ4X3QgKmN1cjsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIGF0dHJfbGVuLCBOTV9NVF9CUzExX0NSRUFURV9PQkosCisJCQlOTV9PQ19CUzExLCB0eXBlLCAwLCBpZHgpOworCWN1ciA9IG1zZ2JfcHV0KG1zZywgYXR0cl9sZW4pOworCW1lbWNweShjdXIsIGF0dHIsIGF0dHJfbGVuKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9iczExX2RlbGV0ZV9vYmplY3Qoc3RydWN0IGdzbV9idHMgKmJ0cywKKwkJCQllbnVtIGFiaXNfYnMxMV9vYmp0eXBlIHR5cGUsIHVfaW50OF90IGlkeCkKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCAwLCBOTV9NVF9CUzExX0RFTEVURV9PQkosCisJCQlOTV9PQ19CUzExLCB0eXBlLCAwLCBpZHgpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfY3JlYXRlX2VudmFCVFNFKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGlkeCkKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJdV9pbnQ4X3QgemVybyA9IDB4MDA7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCAzLCBOTV9NVF9CUzExX0NSRUFURV9PQkosCisJCQlOTV9PQ19CUzExX0VOVkFCVFNFLCAwLCBpZHgsIDB4ZmYpOworCW1zZ2JfdGx2X3B1dChtc2csIDB4OTksIDEsICZ6ZXJvKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9iczExX2NyZWF0ZV9icG9ydChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBpZHgpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMCwgTk1fTVRfQlMxMV9DUkVBVEVfT0JKLCBOTV9PQ19CUzExX0JQT1JULAorCQkJaWR4LCAweGZmLCAweGZmKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9iczExX2RlbGV0ZV9icG9ydChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBpZHgpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMCwgTk1fTVRfQlMxMV9ERUxFVEVfT0JKLCBOTV9PQ19CUzExX0JQT1JULAorCQkJaWR4LCAweGZmLCAweGZmKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitzdGF0aWMgY29uc3QgdV9pbnQ4X3Qgc21fYXR0cltdID0geyBOTV9BVFRfVEVJLCBOTV9BVFRfQUJJU19DSEFOTkVMIH07CitpbnQgYWJpc19ubV9iczExX2dldF9vbWxfdGVpX3RzKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMitzaXplb2Yoc21fYXR0ciksIE5NX01UX0dFVF9BVFRSLCBOTV9PQ19TSVRFX01BTkFHRVIsCisJCQkweGZmLCAweGZmLCAweGZmKTsKKwltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfTElTVF9SRVFfQVRUUiwgc2l6ZW9mKHNtX2F0dHIpLCBzbV9hdHRyKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCisvKiBsaWtlIGFiaXNfbm1fY29ubl90ZXJyX3RyYWYgKyBzZXRfdGVpICovCitpbnQgYWJpc19ubV9iczExX2Nvbm5fb21sX3RlaShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBlMV9wb3J0LCAKKwkJCSAgdV9pbnQ4X3QgZTFfdGltZXNsb3QsIHVfaW50OF90IGUxX3N1YnNsb3QsCisJCQkgIHVfaW50OF90IHRlaSkKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBhYmlzX25tX2NoYW5uZWwgKmNoOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCBzaXplb2YoKmNoKSsyLCBOTV9NVF9CUzExX1NFVF9BVFRSLAorCQkJTk1fT0NfU0lURV9NQU5BR0VSLCAweGZmLCAweGZmLCAweGZmKTsKKworCWNoID0gKHN0cnVjdCBhYmlzX25tX2NoYW5uZWwgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmNoKSk7CisJZmlsbF9ubV9jaGFubmVsKGNoLCBlMV9wb3J0LCBlMV90aW1lc2xvdCwgZTFfc3Vic2xvdCk7CisJbXNnYl90dl9wdXQobXNnLCBOTV9BVFRfVEVJLCB0ZWkpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfc2V0X3RyeF9wb3dlcihzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgdV9pbnQ4X3QgbGV2ZWwpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMywgTk1fTVRfQlMxMV9TRVRfQVRUUiwKKwkJCU5NX09DX0JTMTEsIEJTMTFfT0JKX1BBLCAweDAwLCB0cngtPm5yKTsKKwltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfQlMxMV9UWFBXUiwgMSwgJmxldmVsKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2codHJ4LT5idHMsIG1zZyk7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfZ2V0X3RyeF9wb3dlcihzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCkKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJdV9pbnQ4X3QgYXR0ciA9IE5NX0FUVF9CUzExX1RYUFdSOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMitzaXplb2YoYXR0ciksIE5NX01UX0dFVF9BVFRSLAorCQkJTk1fT0NfQlMxMSwgQlMxMV9PQkpfUEEsIDB4MDAsIHRyeC0+bnIpOworCW1zZ2JfdGx2X3B1dChtc2csIE5NX0FUVF9MSVNUX1JFUV9BVFRSLCBzaXplb2YoYXR0ciksICZhdHRyKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2codHJ4LT5idHMsIG1zZyk7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfZ2V0X3BsbF9tb2RlKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXVfaW50OF90IGF0dHJbXSA9IHsgTk1fQVRUX0JTMTFfUExMX01PREUgfTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDIrc2l6ZW9mKGF0dHIpLCBOTV9NVF9HRVRfQVRUUiwKKwkJCU5NX09DX0JTMTEsIEJTMTFfT0JKX0xJLCAweDAwLCAweDAwKTsKKwltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfTElTVF9SRVFfQVRUUiwgc2l6ZW9mKGF0dHIpLCBhdHRyKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9iczExX2dldF9jY2xrKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXVfaW50OF90IGF0dHJbXSA9IHsgTk1fQVRUX0JTMTFfQ0NMS19BQ0NVUkFDWSwKKwkJCSAgICBOTV9BVFRfQlMxMV9DQ0xLX1RZUEUgfTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDIrc2l6ZW9mKGF0dHIpLCBOTV9NVF9HRVRfQVRUUiwKKwkJCU5NX09DX0JTMTEsIEJTMTFfT0JKX0NDTEssIDB4MDAsIDB4MDApOworCW1zZ2JfdGx2X3B1dChtc2csIE5NX0FUVF9MSVNUX1JFUV9BVFRSLCBzaXplb2YoYXR0ciksIGF0dHIpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7CisKK30KKworLy9zdGF0aWMgY29uc3QgdV9pbnQ4X3QgYnMxMV9sb2dvbl9jN1tdID0geyAweDA3LCAweGQ5LCAweDAxLCAweDExLCAweDBkLCAweDEwLCAweDIwIH07CisKK2ludCBhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgb24pCit7CisJcmV0dXJuIGFiaXNfbm1fYnMxMV9sb2dvbihidHMsIDB4MDIsICJGQUNUT1JZIiwgb24pOworfQorCitpbnQgYWJpc19ubV9iczExX2luZmllbGRfbG9nb24oc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IG9uKQoreworCXJldHVybiBhYmlzX25tX2JzMTFfbG9nb24oYnRzLCAweDAzLCAiRklFTEQgICIsIG9uKTsKK30KKworaW50IGFiaXNfbm1fYnMxMV9sb2dvbihzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBsZXZlbCwgY29uc3QgY2hhciAqbmFtZSwgaW50IG9uKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgYnMxMV9kYXRlX3RpbWUgYmR0OworCisJZ2V0X2JzMTFfZGF0ZV90aW1lKCZiZHQpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWlmIChvbikgeworCQl1X2ludDhfdCBsZW4gPSAzKjIgKyBzaXplb2YoYmR0KQorCQkJCSsgMSArIHN0cmxlbihuYW1lKTsKKwkJZmlsbF9vbV9mb21faGRyKG9oLCBsZW4sIE5NX01UX0JTMTFfTE1UX0xPR09OLAorCQkJCU5NX09DX0JTMTFfQlRTRSwgMHhmZiwgMHhmZiwgMHhmZik7CisJCW1zZ2JfdGx2X3B1dChtc2csIE5NX0FUVF9CUzExX0xNVF9MT0dJTl9USU1FLAorCQkJICAgICBzaXplb2YoYmR0KSwgKHVfaW50OF90ICopICZiZHQpOworCQltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfQlMxMV9MTVRfVVNFUl9BQ0NfTEVWLAorCQkJICAgICAxLCAmbGV2ZWwpOworCQltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfQlMxMV9MTVRfVVNFUl9OQU1FLAorCQkJICAgICBzdHJsZW4obmFtZSksICh1X2ludDhfdCAqKW5hbWUpOworCX0gZWxzZSB7CisJCWZpbGxfb21fZm9tX2hkcihvaCwgMCwgTk1fTVRfQlMxMV9MTVRfTE9HT0ZGLAorCQkJCU5NX09DX0JTMTFfQlRTRSwgMHhmZiwgMHhmZiwgMHhmZik7CisJfQorCQorCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9iczExX3NldF90cngxX3B3KHN0cnVjdCBnc21fYnRzICpidHMsIGNvbnN0IGNoYXIgKnBhc3N3b3JkKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZzsKKworCWlmIChzdHJsZW4ocGFzc3dvcmQpICE9IDEwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworIAltc2cgPSBubV9tc2diX2FsbG9jKCk7CisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMitzdHJsZW4ocGFzc3dvcmQpLCBOTV9NVF9CUzExX1NFVF9BVFRSLAorCQkJTk1fT0NfQlMxMSwgQlMxMV9PQkpfVFJYMSwgMHgwMCwgMHgwMCk7CisJbXNnYl90bHZfcHV0KG1zZywgTk1fQVRUX0JTMTFfUEFTU1dPUkQsIDEwLCAoY29uc3QgdV9pbnQ4X3QgKilwYXNzd29yZCk7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworLyogY2hhbmdlIHRoZSBCUy0xMSBQTEwgTW9kZSB0byBlaXRoZXIgbG9ja2VkIChFMSBkZXJpdmVkKSBvciBzdGFuZGFsb25lICovCitpbnQgYWJpc19ubV9iczExX3NldF9wbGxfbG9ja2VkKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBsb2NrZWQpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCXVfaW50OF90IHRsdl92YWx1ZTsKKwkKKwltc2cgPSBubV9tc2diX2FsbG9jKCk7CisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMywgTk1fTVRfQlMxMV9TRVRfQVRUUiwgTk1fT0NfQlMxMSwKKwkJCUJTMTFfT0JKX0xJLCAweDAwLCAweDAwKTsKKworCWlmIChsb2NrZWQpCisJCXRsdl92YWx1ZSA9IEJTMTFfTElfUExMX0xPQ0tFRDsKKwllbHNlCisJCXRsdl92YWx1ZSA9IEJTMTFfTElfUExMX1NUQU5EQUxPTkU7CisJCisJbXNnYl90bHZfcHV0KG1zZywgTk1fQVRUX0JTMTFfUExMX01PREUsIDEsICZ0bHZfdmFsdWUpOworCQorCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCisvKiBTZXQgdGhlIGNhbGlicmF0aW9uIHZhbHVlIG9mIHRoZSBQTEwgKHdvcmsgdmFsdWUvc2V0IHZhbHVlKQorICogSXQgZGVwZW5kcyBvbiB0aGUgbG9naW4gd2hpY2ggb25lIGlzIGNoYW5nZWQgKi8KK2ludCBhYmlzX25tX2JzMTFfc2V0X3BsbChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgdmFsdWUpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCXVfaW50OF90IHRsdl92YWx1ZVsyXTsKKworCW1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCAzLCBOTV9NVF9CUzExX1NFVF9BVFRSLCBOTV9PQ19CUzExLAorCQkJQlMxMV9PQkpfVFJYMSwgMHgwMCwgMHgwMCk7CisKKwl0bHZfdmFsdWVbMF0gPSB2YWx1ZT4+ODsKKwl0bHZfdmFsdWVbMV0gPSB2YWx1ZSYweGZmOworCisJbXNnYl90bHZfcHV0KG1zZywgTk1fQVRUX0JTMTFfUExMLCAyLCB0bHZfdmFsdWUpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfZ2V0X3N0YXRlKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJcmV0dXJuIF9fc2ltcGxlX2NtZChidHMsIE5NX01UX0JTMTFfR0VUX1NUQVRFKTsKK30KKworLyogQlMxMSBTV0wgKi8KKwordm9pZCAqdGFsbF9mbGVfY3R4OworCitzdHJ1Y3QgYWJpc19ubV9iczExX3N3IHsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCWNoYXIgc3dsX2ZuYW1lW1BBVEhfTUFYXTsKKwl1X2ludDhfdCB3aW5fc2l6ZTsKKwlpbnQgZm9yY2VkOworCXN0cnVjdCBsbGlzdF9oZWFkIGZpbGVfbGlzdDsKKwlnc21fY2JmbiAqdXNlcl9jYjsJLyogc3BlY2lmaWVkIGJ5IHRoZSB1c2VyICovCit9Oworc3RhdGljIHN0cnVjdCBhYmlzX25tX2JzMTFfc3cgX2dfYnMxMV9zdywgKmdfYnMxMV9zdyA9ICZfZ19iczExX3N3OworCitzdHJ1Y3QgZmlsZV9saXN0X2VudHJ5IHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCWNoYXIgZm5hbWVbUEFUSF9NQVhdOworfTsKKworc3RydWN0IGZpbGVfbGlzdF9lbnRyeSAqZmxfZGVxdWV1ZShzdHJ1Y3QgbGxpc3RfaGVhZCAqcXVldWUpCit7CisJc3RydWN0IGxsaXN0X2hlYWQgKmxoOworCisJaWYgKGxsaXN0X2VtcHR5KHF1ZXVlKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlsaCA9IHF1ZXVlLT5uZXh0OworCWxsaXN0X2RlbChsaCk7CisJCisJcmV0dXJuIGxsaXN0X2VudHJ5KGxoLCBzdHJ1Y3QgZmlsZV9saXN0X2VudHJ5LCBsaXN0KTsKK30KKworc3RhdGljIGludCBiczExX3JlYWRfc3dsX2ZpbGUoc3RydWN0IGFiaXNfbm1fYnMxMV9zdyAqYnMxMV9zdykKK3sKKwljaGFyIGxpbmVidWZbMjU1XTsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCAqbGgsICpsaDI7CisJRklMRSAqc3dsOworCWludCByYyA9IDA7CisKKwlzd2wgPSBmb3BlbihiczExX3N3LT5zd2xfZm5hbWUsICJyIik7CisJaWYgKCFzd2wpCisJCXJldHVybiAtRU5PREVWOworCisJLyogemVybyB0aGUgc3RhbGUgZmlsZSBsaXN0LCBpZiBhbnkgKi8KKwlsbGlzdF9mb3JfZWFjaF9zYWZlKGxoLCBsaDIsICZiczExX3N3LT5maWxlX2xpc3QpIHsKKwkJbGxpc3RfZGVsKGxoKTsKKwkJdGFsbG9jX2ZyZWUobGgpOworCX0KKworCXdoaWxlIChmZ2V0cyhsaW5lYnVmLCBzaXplb2YobGluZWJ1ZiksIHN3bCkpIHsKKwkJY2hhciBmaWxlX2lkWzEyKzFdOworCQljaGFyIGZpbGVfdmVyc2lvbls4MCsxXTsKKwkJc3RydWN0IGZpbGVfbGlzdF9lbnRyeSAqZmxlOworCQlzdGF0aWMgY2hhciBkaXJbUEFUSF9NQVhdOworCisJCWlmIChzdHJsZW4obGluZWJ1ZikgPCA0KQorCQkJY29udGludWU7CisJCisJCXJjID0gc3NjYW5mKGxpbmVidWYrNCwgIiUxMnM6JTgwc1xyXG4iLCBmaWxlX2lkLCBmaWxlX3ZlcnNpb24pOworCQlpZiAocmMgPCAwKSB7CisJCQlwZXJyb3IoIkVSUiBwYXJzaW5nIFNXTCBmaWxlIik7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAocmMgPCAyKQorCQkJY29udGludWU7CisKKwkJZmxlID0gdGFsbG9jX3plcm8odGFsbF9mbGVfY3R4LCBzdHJ1Y3QgZmlsZV9saXN0X2VudHJ5KTsKKwkJaWYgKCFmbGUpIHsKKwkJCXJjID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyogY29uc3RydWN0IG5ldyBmaWxlbmFtZSAqLworCQlzdHJuY3B5KGRpciwgYnMxMV9zdy0+c3dsX2ZuYW1lLCBzaXplb2YoZGlyKSk7CisJCXN0cm5jYXQoZmxlLT5mbmFtZSwgZGlybmFtZShkaXIpLCBzaXplb2YoZmxlLT5mbmFtZSkgLSAxKTsKKwkJc3RyY2F0KGZsZS0+Zm5hbWUsICIvIik7CisJCXN0cm5jYXQoZmxlLT5mbmFtZSwgZmlsZV9pZCwgc2l6ZW9mKGZsZS0+Zm5hbWUpIC0gMSAtc3RybGVuKGZsZS0+Zm5hbWUpKTsKKwkJCisJCWxsaXN0X2FkZF90YWlsKCZmbGUtPmxpc3QsICZiczExX3N3LT5maWxlX2xpc3QpOworCX0KKworb3V0OgorCWZjbG9zZShzd2wpOworCXJldHVybiByYzsKK30KKworLyogYnMxMSBzd2xvYWQgc3BlY2lmaWMgY2FsbGJhY2ssIHBhc3NlZCB0byBhYmlzX25tIGNvcmUgc3dsb2FkICovCitzdGF0aWMgaW50IGJzMTFfc3dsb2FkX2NiZm4odW5zaWduZWQgaW50IGhvb2ssIHVuc2lnbmVkIGludCBldmVudCwKKwkJCSAgICBzdHJ1Y3QgbXNnYiAqbXNnLCB2b2lkICpkYXRhLCB2b2lkICpwYXJhbSkKK3sKKwlzdHJ1Y3QgYWJpc19ubV9iczExX3N3ICpiczExX3N3ID0gZGF0YTsKKwlzdHJ1Y3QgZmlsZV9saXN0X2VudHJ5ICpmbGU7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIE5NX01UX0xPQURfRU5EX0FDSzoKKwkJZmxlID0gZmxfZGVxdWV1ZSgmYnMxMV9zdy0+ZmlsZV9saXN0KTsKKwkJaWYgKGZsZSkgeworCQkJLyogc3RhcnQgZG93bmxvYWQgdGhlIG5leHQgZmlsZSBvZiBvdXIgZmlsZSBsaXN0ICovCisJCQlyYyA9IGFiaXNfbm1fc29mdHdhcmVfbG9hZChiczExX3N3LT5idHMsIGZsZS0+Zm5hbWUsCisJCQkJCQkgICBiczExX3N3LT53aW5fc2l6ZSwKKwkJCQkJCSAgIGJzMTFfc3ctPmZvcmNlZCwKKwkJCQkJCSAgICZiczExX3N3bG9hZF9jYmZuLCBiczExX3N3KTsKKwkJCXRhbGxvY19mcmVlKGZsZSk7CisJCX0gZWxzZSB7CisJCQkvKiBhY3RpdmF0ZSB0aGUgU1dMICovCisJCQlyYyA9IGFiaXNfbm1fc29mdHdhcmVfYWN0aXZhdGUoYnMxMV9zdy0+YnRzLAorCQkJCQkJCWJzMTFfc3ctPnN3bF9mbmFtZSwKKwkJCQkJCQliczExX3N3bG9hZF9jYmZuLAorCQkJCQkJCWJzMTFfc3cpOworCQl9CisJCWJyZWFrOworCWNhc2UgTk1fTVRfTE9BRF9TRUdfQUNLOgorCWNhc2UgTk1fTVRfTE9BRF9FTkRfTkFDSzoKKwljYXNlIE5NX01UX0xPQURfSU5JVF9BQ0s6CisJY2FzZSBOTV9NVF9MT0FEX0lOSVRfTkFDSzoKKwljYXNlIE5NX01UX0FDVElWQVRFX1NXX05BQ0s6CisJY2FzZSBOTV9NVF9BQ1RJVkFURV9TV19BQ0s6CisJZGVmYXVsdDoKKwkJLyogZmFsbHRocm91Z2ggdG8gdGhlIHVzZXIgY2FsbGJhY2sgKi8KKwkJaWYgKGJzMTFfc3ctPnVzZXJfY2IpCisJCQlyYyA9IGJzMTFfc3ctPnVzZXJfY2IoaG9vaywgZXZlbnQsIG1zZywgTlVMTCwgTlVMTCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KKworLyogU2llbWVucyBwcm92aWRlcyBhIFNXTCBmaWxlIHRoYXQgaXMgYSBtZXJlIGxpc3Rpbmcgb2YgYWxsIHRoZSBvdGhlcgorICogZmlsZXMgdGhhdCBhcmUgcGFydCBvZiBhIHNvZnR3YXJlIHJlbGVhc2UuICBXZSBuZWVkIHRvIHVwbG9hZCBmaXJzdAorICogdGhlIGxpc3QgZmlsZSwgYW5kIHRoZW4gZWFjaCBmaWxlIHRoYXQgaXMgbGlzdGVkIGluIHRoZSBsaXN0IGZpbGUgKi8KK2ludCBhYmlzX25tX2JzMTFfbG9hZF9zd2woc3RydWN0IGdzbV9idHMgKmJ0cywgY29uc3QgY2hhciAqZm5hbWUsCisJCQkgIHVfaW50OF90IHdpbl9zaXplLCBpbnQgZm9yY2VkLCBnc21fY2JmbiAqY2JmbikKK3sKKwlzdHJ1Y3QgYWJpc19ubV9iczExX3N3ICpiczExX3N3ID0gZ19iczExX3N3OworCXN0cnVjdCBmaWxlX2xpc3RfZW50cnkgKmZsZTsKKwlpbnQgcmMgPSAwOworCisJSU5JVF9MTElTVF9IRUFEKCZiczExX3N3LT5maWxlX2xpc3QpOworCWJzMTFfc3ctPmJ0cyA9IGJ0czsKKwliczExX3N3LT53aW5fc2l6ZSA9IHdpbl9zaXplOworCWJzMTFfc3ctPnVzZXJfY2IgPSBjYmZuOworCWJzMTFfc3ctPmZvcmNlZCA9IGZvcmNlZDsKKworCXN0cm5jcHkoYnMxMV9zdy0+c3dsX2ZuYW1lLCBmbmFtZSwgc2l6ZW9mKGJzMTFfc3ctPnN3bF9mbmFtZSkpOworCXJjID0gYnMxMV9yZWFkX3N3bF9maWxlKGJzMTFfc3cpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCS8qIGRlcXVldWUgbmV4dCBpdGVtIGluIGZpbGUgbGlzdCAqLworCWZsZSA9IGZsX2RlcXVldWUoJmJzMTFfc3ctPmZpbGVfbGlzdCk7CisJaWYgKCFmbGUpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogc3RhcnQgZG93bmxvYWQgdGhlIG5leHQgZmlsZSBvZiBvdXIgZmlsZSBsaXN0ICovCisJcmMgPSBhYmlzX25tX3NvZnR3YXJlX2xvYWQoYnRzLCBmbGUtPmZuYW1lLCB3aW5fc2l6ZSwgZm9yY2VkLAorCQkJCSAgIGJzMTFfc3dsb2FkX2NiZm4sIGJzMTFfc3cpOworCXRhbGxvY19mcmVlKGZsZSk7CisJcmV0dXJuIHJjOworfQorCisjaWYgMAorc3RhdGljIHVfaW50OF90IHJlcV9hdHRyX2J0c2VbXSA9IHsKKwlOTV9BVFRfQURNX1NUQVRFLCBOTV9BVFRfQlMxMV9MTVRfTE9HT05fU0VTU0lPTiwKKwlOTV9BVFRfQlMxMV9MTVRfTE9HSU5fVElNRSwgTk1fQVRUX0JTMTFfTE1UX1VTRVJfQUNDX0xFViwKKwlOTV9BVFRfQlMxMV9MTVRfVVNFUl9OQU1FLAorCisJMHhhZiwgTk1fQVRUX0JTMTFfUlhfT0ZGU0VULCBOTV9BVFRfQlMxMV9WRU5ET1JfTkFNRSwKKworCU5NX0FUVF9CUzExX1NXX0xPQURfSU5URU5ERUQsIE5NX0FUVF9CUzExX1NXX0xPQURfU0FGRVRZLAorCisJTk1fQVRUX0JTMTFfU1dfTE9BRF9TVE9SRUQgfTsKKworc3RhdGljIHVfaW50OF90IHJlcV9hdHRyX2J0c21bXSA9IHsKKwlOTV9BVFRfQUJJU19DSEFOTkVMLCBOTV9BVFRfVEVJLCBOTV9BVFRfQlMxMV9BQklTX0VYVF9USU1FLAorCU5NX0FUVF9BRE1fU1RBVEUsIE5NX0FUVF9BVkFJTF9TVEFUVVMsIDB4Y2UsIE5NX0FUVF9GSUxFX0lELAorCU5NX0FUVF9GSUxFX1ZFUlNJT04sIE5NX0FUVF9PUEVSX1NUQVRFLCAweGU4LCBOTV9BVFRfQlMxMV9BTExfVEVTVF9DQVRHLAorCU5NX0FUVF9TV19ERVNDUiwgTk1fQVRUX0dFVF9BUkkgfTsKKyNlbmRpZgorCQorc3RhdGljIHVfaW50OF90IHJlcV9hdHRyW10gPSB7IAorCU5NX0FUVF9BRE1fU1RBVEUsIE5NX0FUVF9BVkFJTF9TVEFUVVMsIDB4YTgsIE5NX0FUVF9PUEVSX1NUQVRFLAorCTB4ZDUsIDB4YTEsIE5NX0FUVF9CUzExX0VTTl9GV19DT0RFX05PLCBOTV9BVFRfQlMxMV9FU05fSFdfQ09ERV9OTywKKwkweDQyLCBOTV9BVFRfQlMxMV9FU05fUENCX1NFUklBTCwgTk1fQVRUX0JTMTFfUExMIH07CisKK2ludCBhYmlzX25tX2JzMTFfZ2V0X3Nlcm5vKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCS8qIFNpZW1lbnNIVyBDQ1RSTCBvYmplY3QgKi8KKwlmaWxsX29tX2ZvbV9oZHIob2gsIDIrc2l6ZW9mKHJlcV9hdHRyKSwgTk1fTVRfR0VUX0FUVFIsIE5NX09DX0JTMTEsCisJCQkweDAzLCAweDAwLCAweDAwKTsKKwltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfTElTVF9SRVFfQVRUUiwgc2l6ZW9mKHJlcV9hdHRyKSwgcmVxX2F0dHIpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfc2V0X2V4dF90aW1lKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXN0cnVjdCBiczExX2RhdGVfdGltZSBhZXQ7CisKKwlnZXRfYnMxMV9kYXRlX3RpbWUoJmFldCk7CisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCS8qIFNpZW1lbnNIVyBDQ1RSTCBvYmplY3QgKi8KKwlmaWxsX29tX2ZvbV9oZHIob2gsIDIrc2l6ZW9mKGFldCksIE5NX01UX0JTMTFfU0VUX0FUVFIsIE5NX09DX1NJVEVfTUFOQUdFUiwKKwkJCTB4ZmYsIDB4ZmYsIDB4ZmYpOworCW1zZ2JfdGx2X3B1dChtc2csIE5NX0FUVF9CUzExX0FCSVNfRVhUX1RJTUUsIHNpemVvZihhZXQpLCAodV9pbnQ4X3QgKikgJmFldCk7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworaW50IGFiaXNfbm1fYnMxMV9zZXRfYnBvcnRfbGluZV9jZmcoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgYnBvcnQsIGVudW0gYWJpc19iczExX2xpbmVfY2ZnIGxpbmVfY2ZnKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgYnMxMV9kYXRlX3RpbWUgYWV0OworCisJZ2V0X2JzMTFfZGF0ZV90aW1lKCZhZXQpOworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDIsIE5NX01UX0JTMTFfU0VUX0FUVFIsIE5NX09DX0JTMTFfQlBPUlQsCisJCQlicG9ydCwgMHhmZiwgMHgwMik7CisJbXNnYl90dl9wdXQobXNnLCBOTV9BVFRfQlMxMV9MSU5FX0NGRywgbGluZV9jZmcpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKKy8qIGlwLmFjY2VzcyBuYW5vQlRTIHNwZWNpZmljIGNvbW1hbmRzICovCitzdGF0aWMgY29uc3QgY2hhciBpcGFjY2Vzc19tYWdpY1tdID0gImNvbS5pcGFjY2VzcyI7CisKKworc3RhdGljIGludCBhYmlzX25tX3J4X2lwYWNjKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaCA9IG1zZ2JfbDIobXNnKTsKKwlzdHJ1Y3QgYWJpc19vbV9mb21faGRyICpmb2g7CisJdV9pbnQ4X3QgaWRzdHJsZW4gPSBvaC0+ZGF0YVswXTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwlzdHJ1Y3QgaXBhY2NfYWNrX3NpZ25hbF9kYXRhIHNpZ25hbDsKKworCWlmIChzdHJuY21wKChjaGFyICopJm9oLT5kYXRhWzFdLCBpcGFjY2Vzc19tYWdpYywgaWRzdHJsZW4pKSB7CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiaWQgc3RyaW5nIGlzIG5vdCBjb20uaXBhY2Nlc3MgIT8hXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZm9oID0gKHN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKikgKG9oLT5kYXRhICsgMSArIGlkc3RybGVuKTsKKwlhYmlzX25tX3Rsdl9wYXJzZSgmdHAsIG1zZy0+dHJ4LT5idHMsIGZvaC0+ZGF0YSwgb2gtPmxlbmd0aC1zaXplb2YoKmZvaCkpOworCisJZGVidWdwX2ZvaChmb2gpOworCisJREVCVUdQQyhETk0sICJJUEFDQ0VTUygweCUwMngpOiAiLCBmb2gtPm1zZ190eXBlKTsKKworCXN3aXRjaCAoZm9oLT5tc2dfdHlwZSkgeworCWNhc2UgTk1fTVRfSVBBQ0NfUlNMX0NPTk5FQ1RfQUNLOgorCQlERUJVR1BDKEROTSwgIlJTTCBDT05ORUNUIEFDSyAiKTsKKwkJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9JUEFDQ19EU1RfSVApKQorCQkJREVCVUdQQyhETk0sICJJUD0lcyAiLAorCQkJCWluZXRfbnRvYSgqKChzdHJ1Y3QgaW5fYWRkciAqKSAKKwkJCQkJVExWUF9WQUwoJnRwLCBOTV9BVFRfSVBBQ0NfRFNUX0lQKSkpKTsKKwkJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9JUEFDQ19EU1RfSVBfUE9SVCkpCisJCQlERUJVR1BDKEROTSwgIlBPUlQ9JXUgIiwKKwkJCQludG9ocygqKCh1X2ludDE2X3QgKikgCisJCQkJCVRMVlBfVkFMKCZ0cCwgTk1fQVRUX0lQQUNDX0RTVF9JUF9QT1JUKSkpKTsKKwkJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9JUEFDQ19TVFJFQU1fSUQpKQorCQkJREVCVUdQQyhETk0sICJTVFJFQU09MHglMDJ4ICIsCisJCQkJCSpUTFZQX1ZBTCgmdHAsIE5NX0FUVF9JUEFDQ19TVFJFQU1fSUQpKTsKKwkJREVCVUdQQyhETk0sICJcbiIpOworCQlicmVhazsKKwljYXNlIE5NX01UX0lQQUNDX1JTTF9DT05ORUNUX05BQ0s6CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiUlNMIENPTk5FQ1QgTkFDSyAiKTsKKwkJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9OQUNLX0NBVVNFUykpCisJCQlERUJVR1BDKEROTSwgIiBDQVVTRT0lc1xuIiwgCisJCQkJbmFja19jYXVzZV9uYW1lKCpUTFZQX1ZBTCgmdHAsIE5NX0FUVF9OQUNLX0NBVVNFUykpKTsKKwkJZWxzZQorCQkJREVCVUdQQyhETk0sICJcbiIpOworCQlicmVhazsKKwljYXNlIE5NX01UX0lQQUNDX1NFVF9OVkFUVFJfQUNLOgorCQlERUJVR1BDKEROTSwgIlNFVCBOVkFUVFIgQUNLXG4iKTsKKwkJLyogRklYTUU6IGRlY29kZSBhbmQgc2hvdyB0aGUgYWN0dWFsIGF0dHJpYnV0ZXMgKi8KKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9JUEFDQ19TRVRfTlZBVFRSX05BQ0s6CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiU0VUIE5WQVRUUiBOQUNLICIpOworCQlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX05BQ0tfQ0FVU0VTKSkKKwkJCUxPR1BDKEROTSwgTE9HTF9FUlJPUiwgIiBDQVVTRT0lc1xuIiwgCisJCQkJbmFja19jYXVzZV9uYW1lKCpUTFZQX1ZBTCgmdHAsIE5NX0FUVF9OQUNLX0NBVVNFUykpKTsKKwkJZWxzZQorCQkJTE9HUEMoRE5NLCBMT0dMX0VSUk9SLCAiXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9JUEFDQ19HRVRfTlZBVFRSX0FDSzoKKwkJREVCVUdQQyhETk0sICJHRVQgTlZBVFRSIEFDS1xuIik7CisJCS8qIEZJWE1FOiBkZWNvZGUgYW5kIHNob3cgdGhlIGFjdHVhbCBhdHRyaWJ1dGVzICovCisJCWJyZWFrOworCWNhc2UgTk1fTVRfSVBBQ0NfR0VUX05WQVRUUl9OQUNLOgorCQlMT0dQQyhETk0sIExPR0xfRVJST1IsICJHRVQgTlZBVFRSIE5BQ0sgIik7CisJCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfTkFDS19DQVVTRVMpKQorCQkJTE9HUEMoRE5NLCBMT0dMX0VSUk9SLCAiIENBVVNFPSVzXG4iLCAKKwkJCQluYWNrX2NhdXNlX25hbWUoKlRMVlBfVkFMKCZ0cCwgTk1fQVRUX05BQ0tfQ0FVU0VTKSkpOworCQllbHNlCisJCQlMT0dQQyhETk0sIExPR0xfRVJST1IsICJcbiIpOworCQlicmVhazsKKwljYXNlIE5NX01UX0lQQUNDX1NFVF9BVFRSX0FDSzoKKwkJREVCVUdQQyhETk0sICJTRVQgQVRUUiBBQ0tcbiIpOworCQlicmVhazsKKwljYXNlIE5NX01UX0lQQUNDX1NFVF9BVFRSX05BQ0s6CisJCUxPR1BDKEROTSwgTE9HTF9FUlJPUiwgIlNFVCBBVFRSIE5BQ0sgIik7CisJCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfTkFDS19DQVVTRVMpKQorCQkJTE9HUEMoRE5NLCBMT0dMX0VSUk9SLCAiIENBVVNFPSVzXG4iLCAKKwkJCQluYWNrX2NhdXNlX25hbWUoKlRMVlBfVkFMKCZ0cCwgTk1fQVRUX05BQ0tfQ0FVU0VTKSkpOworCQllbHNlCisJCQlMT0dQQyhETk0sIExPR0xfRVJST1IsICJcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR1BDKEROTSwgInVua25vd25cbiIpOworCQlicmVhazsKKwl9CisKKwkvKiBzaWduYWwgaGFuZGxpbmcgKi8KKwlzd2l0Y2ggIChmb2gtPm1zZ190eXBlKSB7CisJY2FzZSBOTV9NVF9JUEFDQ19SU0xfQ09OTkVDVF9OQUNLOgorCWNhc2UgTk1fTVRfSVBBQ0NfU0VUX05WQVRUUl9OQUNLOgorCWNhc2UgTk1fTVRfSVBBQ0NfR0VUX05WQVRUUl9OQUNLOgorCQlzaWduYWwuYnRzID0gbXNnLT50cngtPmJ0czsKKwkJc2lnbmFsLm1zZ190eXBlID0gZm9oLT5tc2dfdHlwZTsKKwkJZGlzcGF0Y2hfc2lnbmFsKFNTX05NLCBTX05NX0lQQUNDX05BQ0ssICZzaWduYWwpOworCQlicmVhazsKKwljYXNlIE5NX01UX0lQQUNDX1NFVF9OVkFUVFJfQUNLOgorCQlzaWduYWwuYnRzID0gbXNnLT50cngtPmJ0czsKKwkJc2lnbmFsLm1zZ190eXBlID0gZm9oLT5tc2dfdHlwZTsKKwkJZGlzcGF0Y2hfc2lnbmFsKFNTX05NLCBTX05NX0lQQUNDX0FDSywgJnNpZ25hbCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCisvKiBzZW5kIGFuIGlwLWFjY2VzcyBtYW51ZmFjdHVyZXIgc3BlY2lmaWMgbWVzc2FnZSAqLworaW50IGFiaXNfbm1faXBhY2Nlc3NfbXNnKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IG1zZ190eXBlLAorCQkJIHVfaW50OF90IG9ial9jbGFzcywgdV9pbnQ4X3QgYnRzX25yLAorCQkJIHVfaW50OF90IHRyeF9uciwgdV9pbnQ4X3QgdHNfbnIsCisJCQkgdV9pbnQ4X3QgKmF0dHIsIGludCBhdHRyX2xlbikKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IGFiaXNfb21fZm9tX2hkciAqZm9oOworCXVfaW50OF90ICpkYXRhOworCisJLyogY29uc3RydWN0IHRoZSAxMi4yMSBPTSBoZWFkZXIsIG9ic2VydmUgdGhlIGVycm9uZW91cyBsZW5ndGggKi8KKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKm9oKSk7CisJZmlsbF9vbV9oZHIob2gsIHNpemVvZigqZm9oKSArIGF0dHJfbGVuKTsKKwlvaC0+bWRpc2MgPSBBQklTX09NX01ESVNDX01BTlVGOworCisJLyogYWRkIHRoZSBpcC5hY2Nlc3MgbWFnaWMgKi8KKwlkYXRhID0gbXNnYl9wdXQobXNnLCBzaXplb2YoaXBhY2Nlc3NfbWFnaWMpKzEpOworCSpkYXRhKysgPSBzaXplb2YoaXBhY2Nlc3NfbWFnaWMpOworCW1lbWNweShkYXRhLCBpcGFjY2Vzc19tYWdpYywgc2l6ZW9mKGlwYWNjZXNzX21hZ2ljKSk7CisKKwkvKiBmaWxsIHRoZSAxMi4yMSBGT00gaGVhZGVyICovCisJZm9oID0gKHN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmZvaCkpOworCWZvaC0+bXNnX3R5cGUgPSBtc2dfdHlwZTsKKwlmb2gtPm9ial9jbGFzcyA9IG9ial9jbGFzczsKKwlmb2gtPm9ial9pbnN0LmJ0c19uciA9IGJ0c19ucjsKKwlmb2gtPm9ial9pbnN0LnRyeF9uciA9IHRyeF9ucjsKKwlmb2gtPm9ial9pbnN0LnRzX25yID0gdHNfbnI7CisKKwlpZiAoYXR0ciAmJiBhdHRyX2xlbikgeworCQlkYXRhID0gbXNnYl9wdXQobXNnLCBhdHRyX2xlbik7CisJCW1lbWNweShkYXRhLCBhdHRyLCBhdHRyX2xlbik7CisJfQorCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKKy8qIHNldCBzb21lIGF0dHJpYnV0ZXMgaW4gTlZSQU0gKi8KK2ludCBhYmlzX25tX2lwYWNjZXNzX3NldF9udmF0dHIoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIHVfaW50OF90ICphdHRyLAorCQkJCWludCBhdHRyX2xlbikKK3sKKwlyZXR1cm4gYWJpc19ubV9pcGFjY2Vzc19tc2codHJ4LT5idHMsIE5NX01UX0lQQUNDX1NFVF9OVkFUVFIsCisJCQkJICAgIE5NX09DX0JBU0VCX1RSQU5TQywgMCwgdHJ4LT5uciwgMHhmZiwgYXR0ciwKKwkJCQkgICAgYXR0cl9sZW4pOworfQorCitpbnQgYWJpc19ubV9pcGFjY2Vzc19yc2xfY29ubmVjdChzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgCisJCQkJIHVfaW50MzJfdCBpcCwgdV9pbnQxNl90IHBvcnQsIHVfaW50OF90IHN0cmVhbSkKK3sKKwlzdHJ1Y3QgaW5fYWRkciBpYTsKKwl1X2ludDhfdCBhdHRyW10gPSB7IE5NX0FUVF9JUEFDQ19TVFJFQU1fSUQsIDAsCisJCQkgICAgTk1fQVRUX0lQQUNDX0RTVF9JUF9QT1JULCAwLCAwLAorCQkJICAgIE5NX0FUVF9JUEFDQ19EU1RfSVAsIDAsIDAsIDAsIDAgfTsKKworCWludCBhdHRyX2xlbiA9IHNpemVvZihhdHRyKTsKKworCWlhLnNfYWRkciA9IGh0b25sKGlwKTsKKwlhdHRyWzFdID0gc3RyZWFtOworCWF0dHJbM10gPSBwb3J0ID4+IDg7CisJYXR0cls0XSA9IHBvcnQgJiAweGZmOworCSoodV9pbnQzMl90ICopKGF0dHIrNikgPSBpYS5zX2FkZHI7CisKKwkvKiBpZiBpcCA9PSAwLCB3ZSB1c2UgdGhlIGRlZmF1bHQgSVAgKi8KKwlpZiAoaXAgPT0gMCkKKwkJYXR0cl9sZW4gLT0gNTsKKworCURFQlVHUChETk0sICJpcC5hY2Nlc3MgUlNMIENPTk5FQ1QgSVA9JXMgUE9SVD0ldSBTVFJFQU09MHglMDJ4XG4iLAorCQlpbmV0X250b2EoaWEpLCBwb3J0LCBzdHJlYW0pOworCisJcmV0dXJuIGFiaXNfbm1faXBhY2Nlc3NfbXNnKHRyeC0+YnRzLCBOTV9NVF9JUEFDQ19SU0xfQ09OTkVDVCwKKwkJCQkgICAgTk1fT0NfQkFTRUJfVFJBTlNDLCB0cngtPmJ0cy0+YnRzX25yLAorCQkJCSAgICB0cngtPm5yLCAweGZmLCBhdHRyLCBhdHRyX2xlbik7Cit9CisKKy8qIHJlc3RhcnQgLyByZWJvb3QgYW4gaXAuYWNjZXNzIG5hbm9CVFMgKi8KK2ludCBhYmlzX25tX2lwYWNjZXNzX3Jlc3RhcnQoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlyZXR1cm4gX19zaW1wbGVfY21kKGJ0cywgTk1fTVRfSVBBQ0NfUkVTVEFSVCk7Cit9CisKK2ludCBhYmlzX25tX2lwYWNjZXNzX3NldF9hdHRyKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IG9ial9jbGFzcywKKwkJCQl1X2ludDhfdCBidHNfbnIsIHVfaW50OF90IHRyeF9uciwgdV9pbnQ4X3QgdHNfbnIsCisJCQkJdV9pbnQ4X3QgKmF0dHIsIHVfaW50OF90IGF0dHJfbGVuKQoreworCXJldHVybiBhYmlzX25tX2lwYWNjZXNzX21zZyhidHMsIE5NX01UX0lQQUNDX1NFVF9BVFRSLAorCQkJCSAgICBvYmpfY2xhc3MsIGJ0c19uciwgdHJ4X25yLCB0c19uciwKKwkJCQkgICAgIGF0dHIsIGF0dHJfbGVuKTsKK30KKwordm9pZCBhYmlzX25tX2lwYWNjZXNzX2NnaSh1X2ludDhfdCAqYnVmLCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCS8qIHdlIHNpbXBseSByZXVzZSB0aGUgR1NNNDggZnVuY3Rpb24gYW5kIG92ZXJ3cml0ZSB0aGUgUkFDCisJICogd2l0aCB0aGUgQ2VsbCBJRCAqLworCWdzbTQ4X3JhX2lkX2J5X2J0cyhidWYsIGJ0cyk7CisJKigodV9pbnQxNl90ICopKGJ1ZiArIDUpKSA9IGh0b25zKGJ0cy0+Y2VsbF9pZGVudGl0eSk7Cit9CisKK3ZvaWQgZ3NtX3RyeF9sb2NrX3JmKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCBpbnQgbG9ja2VkKQoreworCWludCBuZXdfc3RhdGUgPSBsb2NrZWQgPyBOTV9TVEFURV9MT0NLRUQgOiBOTV9TVEFURV9VTkxPQ0tFRDsKKworCXRyeC0+bm1fc3RhdGUuYWRtaW5pc3RyYXRpdmUgPSBuZXdfc3RhdGU7CisJaWYgKCF0cngtPmJ0cyB8fCAhdHJ4LT5idHMtPm9tbF9saW5rKQorCQlyZXR1cm47CisKKwlhYmlzX25tX2NoZ19hZG1fc3RhdGUodHJ4LT5idHMsIE5NX09DX1JBRElPX0NBUlJJRVIsCisJCQkgICAgICB0cngtPmJ0cy0+YnRzX25yLCB0cngtPm5yLCAweGZmLAorCQkJICAgICAgbmV3X3N0YXRlKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgaXBhY2NfdGVzdHJlc19uYW1lc1tdID0geworCXsgTk1fSVBBQ0NfVEVTVFJFU19TVUNDRVNTLAkiU1VDQ0VTUyIgfSwKKwl7IE5NX0lQQUNDX1RFU1RSRVNfVElNRU9VVCwJIlRJTUVPVVQiIH0sCisJeyBOTV9JUEFDQ19URVNUUkVTX05PX0NIQU5TLAkiTk8gQ0hBTk5FTFMiIH0sCisJeyBOTV9JUEFDQ19URVNUUkVTX1BBUlRJQUwsCSJQQVJUSUFMIiB9LAorCXsgTk1fSVBBQ0NfVEVTVFJFU19TVE9QUEVELAkiU1RPUFBFRCIgfSwKKwl7IDAsCQkJCU5VTEwgfQorfTsKKworY29uc3QgY2hhciAqaXBhY2NfdGVzdHJlc19uYW1lKHVfaW50OF90IHJlcykKK3sKKwlyZXR1cm4gZ2V0X3ZhbHVlX3N0cmluZyhpcGFjY190ZXN0cmVzX25hbWVzLCByZXMpOworfQorCit2b2lkIGlwYWNfcGFyc2VfY2dpKHN0cnVjdCBjZWxsX2dsb2JhbF9pZCAqY2lkLCBjb25zdCB1X2ludDhfdCAqYnVmKQoreworCWNpZC0+bWNjID0gKGJ1ZlswXSAmIDB4ZikgKiAxMDA7CisJY2lkLT5tY2MgKz0gKGJ1ZlswXSA+PiA0KSAqICAxMDsKKwljaWQtPm1jYyArPSAoYnVmWzFdICYgMHhmKSAqICAxOworCisJaWYgKGJ1ZlsxXSA+PiA0ID09IDB4ZikgeworCQljaWQtPm1uYyA9IChidWZbMl0gJiAweGYpICogMTA7CisJCWNpZC0+bW5jICs9IChidWZbMl0gPj4gNCkgKiAgMTsKKwl9IGVsc2UgeworCQljaWQtPm1uYyA9IChidWZbMl0gJiAweGYpICogMTAwOworCQljaWQtPm1uYyArPSAoYnVmWzJdID4+IDQpICogIDEwOworCQljaWQtPm1uYyArPSAoYnVmWzFdID4+IDQpICogICAxOworCX0KKworCWNpZC0+bGFjID0gbnRvaHMoKigodV9pbnQxNl90ICopJmJ1ZlszXSkpOworCWNpZC0+Y2kgPSBudG9ocygqKCh1X2ludDE2X3QgKikmYnVmWzVdKSk7Cit9CisKKy8qIHBhcnNlIEJDQ0ggaW5mb3JtYXRpb24gSUVJIGZyb20gd2lyZSBmb3JtYXQgdG8gc3RydWN0IGlwYWNfYmNjaF9pbmZvICovCitpbnQgaXBhY19wYXJzZV9iY2NoX2luZm8oc3RydWN0IGlwYWNfYmNjaF9pbmZvICpiaW5mLCB1X2ludDhfdCAqYnVmKQoreworCXVfaW50OF90ICpjdXIgPSBidWY7CisJdV9pbnQxNl90IGxlbjsKKworCW1lbXNldChiaW5mLCAwLCBzaXplb2YoYmluZikpOworCisJaWYgKGN1clswXSAhPSBOTV9JUEFDX0VJRV9CQ0NIX0lORk8pCisJCXJldHVybiAtRUlOVkFMOworCWN1cisrOworCisJbGVuID0gbnRvaHMoKih1X2ludDE2X3QgKiljdXIpOworCWN1ciArPSAyOworCisJYmluZi0+aW5mb190eXBlID0gbnRvaHMoKih1X2ludDE2X3QgKiljdXIpOworCWN1ciArPSAyOworCisJaWYgKGJpbmYtPmluZm9fdHlwZSAmIElQQUNfQklORl9GUkVRX0VSUl9RVUFMKQorCQliaW5mLT5mcmVxX3F1YWwgPSAqY3VyID4+IDI7CisKKwliaW5mLT5hcmZjbiA9ICpjdXIrKyAmIDMgPDwgODsKKwliaW5mLT5hcmZjbiB8PSAqY3VyKys7CisKKwlpZiAoYmluZi0+aW5mb190eXBlICYgSVBBQ19CSU5GX1JYTEVWKQorCQliaW5mLT5yeF9sZXYgPSAqY3VyICYgMHgzZjsKKwljdXIrKzsKKworCWlmIChiaW5mLT5pbmZvX3R5cGUgJiBJUEFDX0JJTkZfUlhRVUFMKQorCQliaW5mLT5yeF9xdWFsID0gKmN1ciAmIDB4NzsKKwljdXIrKzsKKworCWlmIChiaW5mLT5pbmZvX3R5cGUgJiBJUEFDX0JJTkZfRlJFUV9FUlJfUVVBTCkKKwkJYmluZi0+ZnJlcV9lcnIgPSBudG9ocygqKHVfaW50MTZfdCAqKWN1cik7CisJY3VyICs9IDI7CisKKwlpZiAoYmluZi0+aW5mb190eXBlICYgSVBBQ19CSU5GX0ZSQU1FX09GRlNFVCkKKwkJYmluZi0+ZnJhbWVfb2Zmc2V0ID0gbnRvaHMoKih1X2ludDE2X3QgKiljdXIpOworCWN1ciArPSAyOworCisJaWYgKGJpbmYtPmluZm9fdHlwZSAmIElQQUNfQklORl9GUkFNRV9OUl9PRkZTRVQpCisJCWJpbmYtPmZyYW1lX25yX29mZnNldCA9IG50b2hsKCoodV9pbnQzMl90ICopY3VyKTsKKwljdXIgKz0gNDsKKworCWlmIChiaW5mLT5pbmZvX3R5cGUgJiBJUEFDX0JJTkZfQlNJQykKKwkJYmluZi0+YnNpYyA9ICpjdXIgJiAweDNmOworCWN1cisrOworCisJaXBhY19wYXJzZV9jZ2koJmJpbmYtPmNnaSwgY3VyKTsKKwljdXIgKz0gNzsKKworCWlmIChiaW5mLT5pbmZvX3R5cGUgJiBJUEFDX0JJTkZfTkVJR0hfQkFfU0kyKSB7CisJCW1lbWNweShiaW5mLT5iYV9saXN0X3NpMiwgY3VyLCBzaXplb2YoYmluZi0+YmFfbGlzdF9zaTIpKTsKKwkJY3VyICs9IHNpemVvZihiaW5mLT5iYV9saXN0X3NpMik7CisJfQorCisJaWYgKGJpbmYtPmluZm9fdHlwZSAmIElQQUNfQklORl9ORUlHSF9CQV9TSTJiaXMpIHsKKwkJbWVtY3B5KGJpbmYtPmJhX2xpc3Rfc2kyYmlzLCBjdXIsCisJCQlzaXplb2YoYmluZi0+YmFfbGlzdF9zaTJiaXMpKTsKKwkJY3VyICs9IHNpemVvZihiaW5mLT5iYV9saXN0X3NpMmJpcyk7CisJfQorCisJaWYgKGJpbmYtPmluZm9fdHlwZSAmIElQQUNfQklORl9ORUlHSF9CQV9TSTJ0ZXIpIHsKKwkJbWVtY3B5KGJpbmYtPmJhX2xpc3Rfc2kydGVyLCBjdXIsCisJCQlzaXplb2YoYmluZi0+YmFfbGlzdF9zaTJ0ZXIpKTsKKwkJY3VyICs9IHNpemVvZihiaW5mLT5iYV9saXN0X3NpMnRlcik7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9hYmlzX3JzbC5jIGIvb3BlbmJzYy9zcmMvYWJpc19yc2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzg0NGFmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvYWJpc19yc2wuYwpAQCAtMCwwICsxLDE2ODggQEAKKy8qIEdTTSBSYWRpbyBTaWduYWxsaW5nIExpbmsgbWVzc2FnZXMgb24gdGhlIEEtYmlzIGludGVyZmFjZSAKKyAqIDNHUFAgVFMgMDguNTggdmVyc2lvbiA4LjYuMCBSZWxlYXNlIDE5OTkgLyBFVFNJIFRTIDEwMCA1OTYgVjguNi4wICovCisKKy8qIChDKSAyMDA4LTIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMDguaD4KKyNpbmNsdWRlIDxvc21vY29yZS9nc21fdXRpbHMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfcnNsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9jaGFuX2FsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ic2NfcmxsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvcGFnaW5nLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL21lYXNfcmVwLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ydHBfcHJveHkuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9yc2wuaD4KKworI2RlZmluZSBSU0xfQUxMT0NfU0laRQkJMTAyNAorI2RlZmluZSBSU0xfQUxMT0NfSEVBRFJPT00JMTI4CisKKyNkZWZpbmUgTUFYKGEsIGIpIChhKSA+PSAoYikgPyAoYSkgOiAoYikKKworc3RhdGljIHVfaW50OF90IG1kaXNjX2J5X21zZ3R5cGUodV9pbnQ4X3QgbXNnX3R5cGUpCit7CisJLyogbWFzayBvZmYgdGhlIHRyYW5zcGFyZW50IGJpdCA/ICovCisJbXNnX3R5cGUgJj0gMHhmZTsKKworCWlmICgobXNnX3R5cGUgJiAweGYwKSA9PSAweDAwKQorCQlyZXR1cm4gQUJJU19SU0xfTURJU0NfUkxMOworCWlmICgobXNnX3R5cGUgJiAweGYwKSA9PSAweDEwKSB7CisJCWlmIChtc2dfdHlwZSA+PSAweDE5ICYmIG1zZ190eXBlIDw9IDB4MjIpCisJCQlyZXR1cm4gQUJJU19SU0xfTURJU0NfVFJYOworCQllbHNlCisJCQlyZXR1cm4gQUJJU19SU0xfTURJU0NfQ09NX0NIQU47CisJfQorCWlmICgobXNnX3R5cGUgJiAweGUwKSA9PSAweDIwKQorCQlyZXR1cm4gQUJJU19SU0xfTURJU0NfREVEX0NIQU47CisJCisJcmV0dXJuIEFCSVNfUlNMX01ESVNDX0xPQzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGluaXRfZGNoYW5faGRyKHN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoLAorCQkJCSAgdV9pbnQ4X3QgbXNnX3R5cGUpCit7CisJZGgtPmMubXNnX2Rpc2NyID0gbWRpc2NfYnlfbXNndHlwZShtc2dfdHlwZSk7CisJZGgtPmMubXNnX3R5cGUgPSBtc2dfdHlwZTsKKwlkaC0+aWVfY2hhbiA9IFJTTF9JRV9DSEFOX05SOworfQorCisvKiBkZXRlcm1pbmUgbG9naWNhbCBjaGFubmVsIGJhc2VkIG9uIFRSWCBhbmQgY2hhbm5lbCBudW1iZXIgSUUgKi8KK3N0cnVjdCBnc21fbGNoYW4gKmxjaGFuX2xvb2t1cChzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgdV9pbnQ4X3QgY2hhbl9ucikKK3sKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKwl1X2ludDhfdCB0c19uciA9IGNoYW5fbnIgJiAweDA3OworCXVfaW50OF90IGNiaXRzID0gY2hhbl9uciA+PiAzOworCXVfaW50OF90IGxjaF9pZHg7CisJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyA9ICZ0cngtPnRzW3RzX25yXTsKKworCWlmIChjYml0cyA9PSAweDAxKSB7CisJCWxjaF9pZHggPSAwOwkvKiBUQ0gvRiAqLwkKKwkJaWYgKHRzLT5wY2hhbiAhPSBHU01fUENIQU5fVENIX0YgJiYKKwkJICAgIHRzLT5wY2hhbiAhPSBHU01fUENIQU5fUERDSCAmJgorCQkgICAgdHMtPnBjaGFuICE9IEdTTV9QQ0hBTl9UQ0hfRl9QRENIKQorCQkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiY2hhbl9ucj0weCUwMnggYnV0IHBjaGFuPSV1XG4iLAorCQkJCWNoYW5fbnIsIHRzLT5wY2hhbik7CisJfSBlbHNlIGlmICgoY2JpdHMgJiAweDFlKSA9PSAweDAyKSB7CisJCWxjaF9pZHggPSBjYml0cyAmIDB4MTsJLyogVENIL0ggKi8KKwkJaWYgKHRzLT5wY2hhbiAhPSBHU01fUENIQU5fVENIX0gpCisJCQlMT0dQKERSU0wsIExPR0xfRVJST1IsICJjaGFuX25yPTB4JTAyeCBidXQgcGNoYW49JXVcbiIsCisJCQkJY2hhbl9uciwgdHMtPnBjaGFuKTsKKwl9IGVsc2UgaWYgKChjYml0cyAmIDB4MWMpID09IDB4MDQpIHsKKwkJbGNoX2lkeCA9IGNiaXRzICYgMHgzOwkvKiBTRENDSC80ICovCisJCWlmICh0cy0+cGNoYW4gIT0gR1NNX1BDSEFOX0NDQ0hfU0RDQ0g0KQorCQkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiY2hhbl9ucj0weCUwMnggYnV0IHBjaGFuPSV1XG4iLAorCQkJCWNoYW5fbnIsIHRzLT5wY2hhbik7CisJfSBlbHNlIGlmICgoY2JpdHMgJiAweDE4KSA9PSAweDA4KSB7CisJCWxjaF9pZHggPSBjYml0cyAmIDB4NzsJLyogU0RDQ0gvOCAqLworCQlpZiAodHMtPnBjaGFuICE9IEdTTV9QQ0hBTl9TRENDSDhfU0FDQ0g4QykKKwkJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgImNoYW5fbnI9MHglMDJ4IGJ1dCBwY2hhbj0ldVxuIiwKKwkJCQljaGFuX25yLCB0cy0+cGNoYW4pOworCX0gZWxzZSBpZiAoY2JpdHMgPT0gMHgxMCB8fCBjYml0cyA9PSAweDExIHx8IGNiaXRzID09IDB4MTIpIHsKKwkJbGNoX2lkeCA9IDA7CisJCWlmICh0cy0+cGNoYW4gIT0gR1NNX1BDSEFOX0NDQ0ggJiYKKwkJICAgIHRzLT5wY2hhbiAhPSBHU01fUENIQU5fQ0NDSF9TRENDSDQpCisJCQlMT0dQKERSU0wsIExPR0xfRVJST1IsICJjaGFuX25yPTB4JTAyeCBidXQgcGNoYW49JXVcbiIsCisJCQkJY2hhbl9uciwgdHMtPnBjaGFuKTsKKwkJLyogRklYTUU6IHdlIHNob3VsZCBub3QgcmV0dXJuIGZpcnN0IHNkY2NoNCAhISEgKi8KKwl9IGVsc2UgeworCQlMT0dQKERSU0wsIExPR0xfRVJST1IsICJ1bmtub3duIGNoYW5fbnI9MHglMDJ4XG4iLCBjaGFuX25yKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbGNoYW4gPSAmdHMtPmxjaGFuW2xjaF9pZHhdOworCWRlYnVnX3NldF9jb250ZXh0KEJTQ19DVFhfTENIQU4sIGxjaGFuKTsKKwlkZWJ1Z19zZXRfY29udGV4dChCU0NfQ1RYX1NVQlNDUiwgbGNoYW4tPnN1YnNjcik7CisKKwlyZXR1cm4gbGNoYW47Cit9CisKKy8qIFNlZSBUYWJsZSAxMC41LjI1IG9mIEdTTTA0LjA4ICovCit1X2ludDhfdCBsY2hhbjJjaGFuX25yKGNvbnN0IHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCXN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMgPSBsY2hhbi0+dHM7CisJdV9pbnQ4X3QgY2JpdHMsIGNoYW5fbnI7CisKKwlzd2l0Y2ggKHRzLT5wY2hhbikgeworCWNhc2UgR1NNX1BDSEFOX1RDSF9GOgorCWNhc2UgR1NNX1BDSEFOX1BEQ0g6CisJY2FzZSBHU01fUENIQU5fVENIX0ZfUERDSDoKKwkJY2JpdHMgPSAweDAxOworCQlicmVhazsKKwljYXNlIEdTTV9QQ0hBTl9UQ0hfSDoKKwkJY2JpdHMgPSAweDAyOworCQljYml0cyArPSBsY2hhbi0+bnI7CisJCWJyZWFrOworCWNhc2UgR1NNX1BDSEFOX0NDQ0hfU0RDQ0g0OgorCQljYml0cyA9IDB4MDQ7CisJCWNiaXRzICs9IGxjaGFuLT5ucjsKKwkJYnJlYWs7CisJY2FzZSBHU01fUENIQU5fU0RDQ0g4X1NBQ0NIOEM6CisJCWNiaXRzID0gMHgwODsKKwkJY2JpdHMgKz0gbGNoYW4tPm5yOworCQlicmVhazsKKwlkZWZhdWx0OgorCWNhc2UgR1NNX1BDSEFOX0NDQ0g6CisJCWNiaXRzID0gMHgxMDsKKwkJYnJlYWs7CisJfQorCisJY2hhbl9uciA9IChjYml0cyA8PCAzKSB8ICh0cy0+bnIgJiAweDcpOworCisJcmV0dXJuIGNoYW5fbnI7Cit9CisKKy8qIEFzIHBlciBUUyAwMy4wMyBTZWN0aW9uIDIuMiwgdGhlIElNU0kgaGFzICdub3QgbW9yZSB0aGFuIDE1IGRpZ2l0cycgKi8KK3VfaW50NjRfdCBzdHJfdG9faW1zaShjb25zdCBjaGFyICppbXNpX3N0cikKK3sKKwl1X2ludDY0X3QgcmV0OworCisJcmV0ID0gc3RydG91bGwoaW1zaV9zdHIsIE5VTEwsIDEwKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIFRhYmxlIDUgQ2xhdXNlIDcgVFMgMDUuMDIgKi8KK3Vuc2lnbmVkIGludCBuX3BhZ19ibG9ja3MoaW50IGJzX2NjY2hfc2RjY2hfY29tYiwgdW5zaWduZWQgaW50IGJzX2FnX2Jsa3NfcmVzKQoreworCWlmICghYnNfY2NjaF9zZGNjaF9jb21iKQorCQlyZXR1cm4gOSAtIGJzX2FnX2Jsa3NfcmVzOworCWVsc2UKKwkJcmV0dXJuIDMgLSBic19hZ19ibGtzX3JlczsKK30KKworLyogQ2hhcHRlciA2LjUuMiBvZiBUUyAwNS4wMiAqLwordW5zaWduZWQgaW50IGdldF9jY2NoX2dyb3VwKHVfaW50NjRfdCBpbXNpLCB1bnNpZ25lZCBpbnQgYnNfY2NfY2hhbnMsCisJCQkgICAgdW5zaWduZWQgaW50IG5fcGFnX2Jsb2NrcykKK3sKKwlyZXR1cm4gKGltc2kgJSAxMDAwKSAlIChic19jY19jaGFucyAqIG5fcGFnX2Jsb2NrcykgLyBuX3BhZ19ibG9ja3M7Cit9CisKKy8qIENoYXB0ZXIgNi41LjIgb2YgVFMgMDUuMDIgKi8KK3Vuc2lnbmVkIGludCBnZXRfcGFnaW5nX2dyb3VwKHVfaW50NjRfdCBpbXNpLCB1bnNpZ25lZCBpbnQgYnNfY2NfY2hhbnMsCisJCQkgICAgICBpbnQgbl9wYWdfYmxvY2tzKQoreworCXJldHVybiAoaW1zaSAlIDEwMDApICUgKGJzX2NjX2NoYW5zICogbl9wYWdfYmxvY2tzKSAlIG5fcGFnX2Jsb2NrczsKK30KKworc3RhdGljIHN0cnVjdCBtc2diICpyc2xfbXNnYl9hbGxvYyh2b2lkKQoreworCXJldHVybiBtc2diX2FsbG9jX2hlYWRyb29tKFJTTF9BTExPQ19TSVpFLCBSU0xfQUxMT0NfSEVBRFJPT00sCisJCQkJICAgIlJTTCIpOworfQorCisjZGVmaW5lIE1BQ0JMT0NLX1NJWkUJMjMKK3N0YXRpYyB2b2lkIHBhZF9tYWNibG9jayh1X2ludDhfdCAqb3V0LCBjb25zdCB1X2ludDhfdCAqaW4sIGludCBsZW4pCit7CisJbWVtY3B5KG91dCwgaW4sIGxlbik7CisKKwlpZiAobGVuIDwgTUFDQkxPQ0tfU0laRSkKKwkJbWVtc2V0KG91dCtsZW4sIDB4MmIsIE1BQ0JMT0NLX1NJWkUtbGVuKTsKK30KKworLyogQ2hhcHRlciA5LjMuNzogRW5jcnlwdGlvbiBJbmZvcm1hdGlvbiAqLworc3RhdGljIGludCBidWlsZF9lbmNyX2luZm8odV9pbnQ4X3QgKm91dCwgc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJKm91dCsrID0gbGNoYW4tPmVuY3IuYWxnX2lkICYgMHhmZjsKKwlpZiAobGNoYW4tPmVuY3Iua2V5X2xlbikKKwkJbWVtY3B5KG91dCwgbGNoYW4tPmVuY3Iua2V5LCBsY2hhbi0+ZW5jci5rZXlfbGVuKTsKKwlyZXR1cm4gbGNoYW4tPmVuY3Iua2V5X2xlbiArIDE7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3JzbF9jYXVzZShpbnQgbHZsLCBjb25zdCB1X2ludDhfdCAqY2F1c2VfdiwgdV9pbnQ4X3QgY2F1c2VfbGVuKQoreworCWludCBpOworCisJTE9HUEMoRFJTTCwgbHZsLCAiQ0FVU0U9MHglMDJ4KCVzKSAiLAorCQljYXVzZV92WzBdLCByc2xfZXJyX25hbWUoY2F1c2VfdlswXSkpOworCWZvciAoaSA9IDE7IGkgPCBjYXVzZV9sZW4tMTsgaSsrKSAKKwkJTE9HUEMoRFJTTCwgbHZsLCAiJTAyeCAiLCBjYXVzZV92W2ldKTsKK30KKworLyogU2VuZCBhIEJDQ0hfSU5GTyBtZXNzYWdlIGFzIHBlciBDaGFwdGVyIDguNS4xICovCitpbnQgcnNsX2JjY2hfaW5mbyhzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgdV9pbnQ4X3QgdHlwZSwKKwkJICBjb25zdCB1X2ludDhfdCAqZGF0YSwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gcnNsX21zZ2JfYWxsb2MoKTsKKworCWRoID0gKHN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YqZGgpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfQkNDSF9JTkZPKTsKKwlkaC0+Y2hhbl9uciA9IFJTTF9DSEFOX0JDQ0g7CisKKwltc2diX3R2X3B1dChtc2csIFJTTF9JRV9TWVNJTkZPX1RZUEUsIHR5cGUpOworCW1zZ2JfdGx2X3B1dChtc2csIFJTTF9JRV9GVUxMX0JDQ0hfSU5GTywgbGVuLCBkYXRhKTsKKworCW1zZy0+dHJ4ID0gdHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworaW50IHJzbF9zYWNjaF9maWxsaW5nKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCB1X2ludDhfdCB0eXBlLCAKKwkJICAgICAgY29uc3QgdV9pbnQ4X3QgKmRhdGEsIGludCBsZW4pCit7CisJc3RydWN0IGFiaXNfcnNsX2NvbW1vbl9oZHIgKmNoOworCXN0cnVjdCBtc2diICptc2cgPSByc2xfbXNnYl9hbGxvYygpOworCisJY2ggPSAoc3RydWN0IGFiaXNfcnNsX2NvbW1vbl9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmNoKSk7CisJY2gtPm1zZ19kaXNjciA9IEFCSVNfUlNMX01ESVNDX1RSWDsKKwljaC0+bXNnX3R5cGUgPSBSU0xfTVRfU0FDQ0hfRklMTDsKKworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX1NZU0lORk9fVFlQRSwgdHlwZSk7CisJbXNnYl90bDE2dl9wdXQobXNnLCBSU0xfSUVfTDNfSU5GTywgbGVuLCBkYXRhKTsKKworCW1zZy0+dHJ4ID0gdHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworaW50IHJzbF9jaGFuX2JzX3Bvd2VyX2N0cmwoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVuc2lnbmVkIGludCBmcGMsIGludCBkYikKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCXVfaW50OF90IGNoYW5fbnIgPSBsY2hhbjJjaGFuX25yKGxjaGFuKTsKKworCWRiID0gYWJzKGRiKTsKKwlpZiAoZGIgPiAzMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltc2cgPSByc2xfbXNnYl9hbGxvYygpOworCisJbGNoYW4tPmJzX3Bvd2VyID0gZGIvMjsKKwlpZiAoZnBjKQorCQlsY2hhbi0+YnNfcG93ZXIgfD0gMHgxMDsKKwkKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpkaCkpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfQlNfUE9XRVJfQ09OVFJPTCk7CisJZGgtPmNoYW5fbnIgPSBjaGFuX25yOworCisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfQlNfUE9XRVIsIGxjaGFuLT5ic19wb3dlcik7CisKKwltc2ctPnRyeCA9IGxjaGFuLT50cy0+dHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworaW50IHJzbF9jaGFuX21zX3Bvd2VyX2N0cmwoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVuc2lnbmVkIGludCBmcGMsIGludCBkYm0pCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGg7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwl1X2ludDhfdCBjaGFuX25yID0gbGNoYW4yY2hhbl9ucihsY2hhbik7CisJaW50IGN0bF9sdmw7CisKKwljdGxfbHZsID0gbXNfcHdyX2N0bF9sdmwobGNoYW4tPnRzLT50cngtPmJ0cy0+YmFuZCwgZGJtKTsKKwlpZiAoY3RsX2x2bCA8IDApCisJCXJldHVybiBjdGxfbHZsOworCisJbXNnID0gcnNsX21zZ2JfYWxsb2MoKTsKKworCWxjaGFuLT5tc19wb3dlciA9IGN0bF9sdmw7CisKKwlpZiAoZnBjKQorCQlsY2hhbi0+bXNfcG93ZXIgfD0gMHgyMDsKKwkKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpkaCkpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfTVNfUE9XRVJfQ09OVFJPTCk7CisJZGgtPmNoYW5fbnIgPSBjaGFuX25yOworCisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfTVNfUE9XRVIsIGxjaGFuLT5tc19wb3dlcik7CisKKwltc2ctPnRyeCA9IGxjaGFuLT50cy0+dHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworc3RhdGljIGludCBjaGFubmVsX21vZGVfZnJvbV9sY2hhbihzdHJ1Y3QgcnNsX2llX2NoYW5fbW9kZSAqY20sCisJCQkJICAgc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJbWVtc2V0KGNtLCAwLCBzaXplb2YoY20pKTsKKworCS8qIEZJWE1FOiB3aGF0IHRvIGRvIHdpdGggZGF0YSBjYWxscyA/ICovCisJY20tPmR0eF9kdHUgPSAweDAwOworCisJLyogc2V0IFRDSCBTcGVlY2gvRGF0YSAqLworCWNtLT5zcGRfaW5kID0gbGNoYW4tPnJzbF9jbW9kZTsKKworCWlmIChsY2hhbi0+cnNsX2Ntb2RlID09IFJTTF9DTU9EX1NQRF9TSUdOICYmCisJICAgIGxjaGFuLT50Y2hfbW9kZSAhPSBHU000OF9DTU9ERV9TSUdOKQorCQlMT0dQKERSU0wsIExPR0xfRVJST1IsICJ1bnN1cHBvcnRlZDogcnNsX21vZGUgPT0gc2lnbmFsbGluZywgIgorCQkJImJ1dCB0Y2hfbW9kZSAhPSBzaWduYWxsaW5nXG4iKTsKKworCXN3aXRjaCAobGNoYW4tPnR5cGUpIHsKKwljYXNlIEdTTV9MQ0hBTl9TRENDSDoKKwkJY20tPmNoYW5fcnQgPSBSU0xfQ01PRF9DUlRfU0RDQ0g7CisJCWJyZWFrOworCWNhc2UgR1NNX0xDSEFOX1RDSF9GOgorCQljbS0+Y2hhbl9ydCA9IFJTTF9DTU9EX0NSVF9UQ0hfQm07CisJCWJyZWFrOworCWNhc2UgR1NNX0xDSEFOX1RDSF9IOgorCQljbS0+Y2hhbl9ydCA9IFJTTF9DTU9EX0NSVF9UQ0hfTG07CisJCWJyZWFrOworCWNhc2UgR1NNX0xDSEFOX05PTkU6CisJY2FzZSBHU01fTENIQU5fVU5LTk9XTjoKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKGxjaGFuLT50Y2hfbW9kZSkgeworCWNhc2UgR1NNNDhfQ01PREVfU0lHTjoKKwkJY20tPmNoYW5fcmF0ZSA9IDA7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfQ01PREVfU1BFRUNIX1YxOgorCQljbS0+Y2hhbl9yYXRlID0gUlNMX0NNT0RfU1BfR1NNMTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9DTU9ERV9TUEVFQ0hfRUZSOgorCQljbS0+Y2hhbl9yYXRlID0gUlNMX0NNT0RfU1BfR1NNMjsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9DTU9ERV9TUEVFQ0hfQU1SOgorCQljbS0+Y2hhbl9yYXRlID0gUlNMX0NNT0RfU1BfR1NNMzsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9DTU9ERV9EQVRBXzE0azU6CisJCWNtLT5jaGFuX3JhdGUgPSBSU0xfQ01PRF9TUF9OVF8xNGs1OworCQlicmVhazsKKwljYXNlIEdTTTQ4X0NNT0RFX0RBVEFfMTJrMDoKKwkJY20tPmNoYW5fcmF0ZSA9IFJTTF9DTU9EX1NQX05UXzEyazA7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfQ01PREVfREFUQV82azA6CisJCWNtLT5jaGFuX3JhdGUgPSBSU0xfQ01PRF9TUF9OVF82azA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisvKiBDaGFwdGVyIDguNC4xICovCisjaWYgMAoraW50IHJzbF9jaGFuX2FjdGl2YXRlKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCB1X2ludDhfdCBjaGFuX25yLAorCQkgICAgICB1X2ludDhfdCBhY3RfdHlwZSwKKwkJICAgICAgc3RydWN0IHJzbF9pZV9jaGFuX21vZGUgKmNoYW5fbW9kZSwKKwkJICAgICAgc3RydWN0IHJzbF9pZV9jaGFuX2lkZW50ICpjaGFuX2lkZW50LAorCQkgICAgICB1X2ludDhfdCBic19wb3dlciwgdV9pbnQ4X3QgbXNfcG93ZXIsCisJCSAgICAgIHVfaW50OF90IHRhKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoOworCXN0cnVjdCBtc2diICptc2cgPSByc2xfbXNnYl9hbGxvYygpOworCisJZGggPSAoc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZGgpKTsKKwlpbml0X2RjaGFuX2hkcihkaCwgUlNMX01UX0NIQU5fQUNUSVYpOworCWRoLT5jaGFuX25yID0gY2hhbl9ucjsKKworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX0FDVF9UWVBFLCBhY3RfdHlwZSk7CisJLyogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBQaGFzZSAxICovCisJbXNnYl90bHZfcHV0KG1zZywgUlNMX0lFX0NIQU5fTU9ERSwgc2l6ZW9mKCpjaGFuX21vZGUpLAorCQkgICAgICh1X2ludDhfdCAqKSBjaGFuX21vZGUpOworCW1zZ2JfdGx2X3B1dChtc2csIFJTTF9JRV9DSEFOX0lERU5ULCA0LAorCQkgICAgICh1X2ludDhfdCAqKSBjaGFuX2lkZW50KTsKKyNpZiAwCisJbXNnYl90bHZfcHV0KG1zZywgUlNMX0lFX0VOQ1JfSU5GTywgMSwKKwkJICAgICAodV9pbnQ4X3QgKikgJmVuY3JfaW5mbyk7CisjZW5kaWYKKwltc2diX3R2X3B1dChtc2csIFJTTF9JRV9CU19QT1dFUiwgYnNfcG93ZXIpOworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX01TX1BPV0VSLCBtc19wb3dlcik7CisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfVElNSU5HX0FEVkFOQ0UsIHRhKTsKKworCW1zZy0+dHJ4ID0gdHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKyNlbmRpZgorCitpbnQgcnNsX2NoYW5fYWN0aXZhdGVfbGNoYW4oc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGFjdF90eXBlLCAKKwkJCSAgICB1X2ludDhfdCB0YSwgdV9pbnQ4X3QgaG9fcmVmKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoOworCXN0cnVjdCBtc2diICptc2c7CisJaW50IHJjOworCisJdV9pbnQ4X3QgY2hhbl9uciA9IGxjaGFuMmNoYW5fbnIobGNoYW4pOworCXVfaW50MTZfdCBhcmZjbiA9IGxjaGFuLT50cy0+dHJ4LT5hcmZjbjsKKwlzdHJ1Y3QgcnNsX2llX2NoYW5fbW9kZSBjbTsKKwlzdHJ1Y3QgcnNsX2llX2NoYW5faWRlbnQgY2k7CisKKwlyYyA9IGNoYW5uZWxfbW9kZV9mcm9tX2xjaGFuKCZjbSwgbGNoYW4pOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCW1lbXNldCgmY2ksIDAsIHNpemVvZihjaSkpOworCWNpLmNoYW5fZGVzYy5pZWkgPSAweDY0OworCWNpLmNoYW5fZGVzYy5jaGFuX25yID0gY2hhbl9ucjsKKwljaS5jaGFuX2Rlc2Mub2N0MyA9IChsY2hhbi0+dHMtPnRyeC0+YnRzLT50c2MgPDwgNSkgfCAoKGFyZmNuICYgMHgzZmYpID4+IDgpOworCWNpLmNoYW5fZGVzYy5vY3Q0ID0gYXJmY24gJiAweGZmOworCisJbXNnID0gcnNsX21zZ2JfYWxsb2MoKTsKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpkaCkpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfQ0hBTl9BQ1RJVik7CisJZGgtPmNoYW5fbnIgPSBjaGFuX25yOworCisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfQUNUX1RZUEUsIGFjdF90eXBlKTsKKwltc2diX3Rsdl9wdXQobXNnLCBSU0xfSUVfQ0hBTl9NT0RFLCBzaXplb2YoY20pLAorCQkgICAgICh1X2ludDhfdCAqKSAmY20pOworCS8qIEZvciBjb21wYXRpYmlsaXR5IHdpdGggUGhhc2UgMSAqLworCW1zZ2JfdGx2X3B1dChtc2csIFJTTF9JRV9DSEFOX0lERU5ULCA0LAorCQkgICAgICh1X2ludDhfdCAqKSAmY2kpOworCisJaWYgKGxjaGFuLT5lbmNyLmFsZ19pZCA+IFJTTF9FTkNfQUxHX0E1KDApKSB7CisJCXVfaW50OF90IGVuY3JfaW5mb1tNQVhfQTVfS0VZX0xFTisyXTsKKwkJcmMgPSBidWlsZF9lbmNyX2luZm8oZW5jcl9pbmZvLCBsY2hhbik7CisJCWlmIChyYyA+IDApCisJCQltc2diX3Rsdl9wdXQobXNnLCBSU0xfSUVfRU5DUl9JTkZPLCByYywgZW5jcl9pbmZvKTsKKwl9CisKKwlzd2l0Y2ggKGFjdF90eXBlKSB7CisJY2FzZSBSU0xfQUNUX0lOVEVSX0FTWU5DOgorCWNhc2UgUlNMX0FDVF9JTlRFUl9TWU5DOgorCQltc2diX3R2X3B1dChtc2csIFJTTF9JRV9IQU5ET19SRUYsIGhvX3JlZik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX0JTX1BPV0VSLCBsY2hhbi0+YnNfcG93ZXIpOworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX01TX1BPV0VSLCBsY2hhbi0+bXNfcG93ZXIpOworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX1RJTUlOR19BRFZBTkNFLCB0YSk7CisKKwlpZiAobGNoYW4tPnRjaF9tb2RlID09IEdTTTQ4X0NNT0RFX1NQRUVDSF9BTVIpCisJCW1zZ2JfdGx2X3B1dChtc2csIFJTTF9JRV9NUl9DT05GSUcsIHNpemVvZihsY2hhbi0+bXJfY29uZiksCisJCQkgICAgICh1X2ludDhfdCAqKSAmbGNoYW4tPm1yX2NvbmYpOworCisJbXNnLT50cnggPSBsY2hhbi0+dHMtPnRyeDsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKKy8qIENoYXB0ZXIgOC40Ljk6IE1vZGlmeSBjaGFubmVsIG1vZGUgb24gQlRTIHNpZGUgKi8KK2ludCByc2xfY2hhbl9tb2RlX21vZGlmeV9yZXEoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGg7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwlpbnQgcmM7CisKKwl1X2ludDhfdCBjaGFuX25yID0gbGNoYW4yY2hhbl9ucihsY2hhbik7CisJc3RydWN0IHJzbF9pZV9jaGFuX21vZGUgY207CisKKwlyYyA9IGNoYW5uZWxfbW9kZV9mcm9tX2xjaGFuKCZjbSwgbGNoYW4pOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCW1zZyA9IHJzbF9tc2diX2FsbG9jKCk7CisJZGggPSAoc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZGgpKTsKKwlpbml0X2RjaGFuX2hkcihkaCwgUlNMX01UX01PREVfTU9ESUZZX1JFUSk7CisJZGgtPmNoYW5fbnIgPSBjaGFuX25yOworCisJbXNnYl90bHZfcHV0KG1zZywgUlNMX0lFX0NIQU5fTU9ERSwgc2l6ZW9mKGNtKSwKKwkJICAgICAodV9pbnQ4X3QgKikgJmNtKTsKKworCWlmIChsY2hhbi0+ZW5jci5hbGdfaWQgPiBSU0xfRU5DX0FMR19BNSgwKSkgeworCQl1X2ludDhfdCBlbmNyX2luZm9bTUFYX0E1X0tFWV9MRU4rMl07CisJCXJjID0gYnVpbGRfZW5jcl9pbmZvKGVuY3JfaW5mbywgbGNoYW4pOworCQlpZiAocmMgPiAwKQorCQkJbXNnYl90bHZfcHV0KG1zZywgUlNMX0lFX0VOQ1JfSU5GTywgcmMsIGVuY3JfaW5mbyk7CisJfQorCisJaWYgKGxjaGFuLT50Y2hfbW9kZSA9PSBHU000OF9DTU9ERV9TUEVFQ0hfQU1SKSB7CisJCW1zZ2JfdGx2X3B1dChtc2csIFJTTF9JRV9NUl9DT05GSUcsIHNpemVvZihsY2hhbi0+bXJfY29uZiksCisJCQkgICAgICh1X2ludDhfdCAqKSAmbGNoYW4tPm1yX2NvbmYpOworCX0KKworCW1zZy0+dHJ4ID0gbGNoYW4tPnRzLT50cng7CisKKwlyZXR1cm4gYWJpc19yc2xfc2VuZG1zZyhtc2cpOworfQorCisvKiBDaGFwdGVyIDguNC42OiBTZW5kIHRoZSBlbmNyeXB0aW9uIGNvbW1hbmQgd2l0aCBnaXZlbiBMMyBpbmZvICovCitpbnQgcnNsX2VuY3J5cHRpb25fY21kKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGg7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBtc2ctPmxjaGFuOworCXVfaW50OF90IGNoYW5fbnIgPSBsY2hhbjJjaGFuX25yKGxjaGFuKTsKKwl1X2ludDhfdCBlbmNyX2luZm9bTUFYX0E1X0tFWV9MRU4rMl07CisJdV9pbnQ4X3QgbDNfbGVuID0gbXNnLT5sZW47CisJaW50IHJjOworCisJLyogRmlyc3QgcHVzaCB0aGUgTDMgSUUgdGFnIGFuZCBsZW5ndGggKi8KKwltc2diX3R2MTZfcHVzaChtc2csIFJTTF9JRV9MM19JTkZPLCBsM19sZW4pOworCisJLyogdGhlbiB0aGUgbGluayBpZGVudGlmaWVyIChTQVBJMCwgbWFpbiBzaWduIGxpbmspICovCisJbXNnYl90dl9wdXNoKG1zZywgUlNMX0lFX0xJTktfSURFTlQsIDApOworCisJLyogdGhlbiBlbmNyeXB0aW9uIGluZm9ybWF0aW9uICovCisJcmMgPSBidWlsZF9lbmNyX2luZm8oZW5jcl9pbmZvLCBsY2hhbik7CisJaWYgKHJjIDw9IDApCisJCXJldHVybiByYzsKKwltc2diX3Rsdl9wdXNoKG1zZywgUlNMX0lFX0VOQ1JfSU5GTywgcmMsIGVuY3JfaW5mbyk7CisKKwkvKiBhbmQgZmluYWxseSB0aGUgRENIQU4gaGVhZGVyICovCisJZGggPSAoc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqKSBtc2diX3B1c2gobXNnLCBzaXplb2YoKmRoKSk7CisJaW5pdF9kY2hhbl9oZHIoZGgsIFJTTF9NVF9FTkNSX0NNRCk7CisJZGgtPmNoYW5fbnIgPSBjaGFuX25yOworCisJbXNnLT50cnggPSBsY2hhbi0+dHMtPnRyeDsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKKy8qIENoYXB0ZXIgOC40LjUgLyA0LjY6IERlYWN0aXZhdGUgdGhlIFNBQ0NIIGFmdGVyIDA0LjA4IFJSIENIQU4gUkVMRUFTRSAqLworaW50IHJzbF9kZWFjdF9zYWNjaChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gcnNsX21zZ2JfYWxsb2MoKTsKKworCWRoID0gKHN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmRoKSk7CisJaW5pdF9kY2hhbl9oZHIoZGgsIFJTTF9NVF9ERUFDVElWQVRFX1NBQ0NIKTsKKwlkaC0+Y2hhbl9uciA9IGxjaGFuMmNoYW5fbnIobGNoYW4pOworCisJbXNnLT5sY2hhbiA9IGxjaGFuOworCW1zZy0+dHJ4ID0gbGNoYW4tPnRzLT50cng7CisKKwlERUJVR1AoRFJTTCwgIiVzIERFQUNUaXZhdGUgU0FDQ0ggQ01EXG4iLCBnc21fbGNoYW5fbmFtZShsY2hhbikpOworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworLyogQ2hhcHRlciA4LjQuMTQgLyA0Ljc6IFRlbGwgQlRTIHRvIHJlbGVhc2UgdGhlIHJhZGlvIGNoYW5uZWwgKi8KK2ludCByc2xfcmZfY2hhbl9yZWxlYXNlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoOworCXN0cnVjdCBtc2diICptc2cgPSByc2xfbXNnYl9hbGxvYygpOworCisJZGggPSAoc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZGgpKTsKKwlpbml0X2RjaGFuX2hkcihkaCwgUlNMX01UX1JGX0NIQU5fUkVMKTsKKwlkaC0+Y2hhbl9uciA9IGxjaGFuMmNoYW5fbnIobGNoYW4pOworCisJbXNnLT5sY2hhbiA9IGxjaGFuOworCW1zZy0+dHJ4ID0gbGNoYW4tPnRzLT50cng7CisKKwlERUJVR1AoRFJTTCwgIiVzIFJGIENoYW5uZWwgUmVsZWFzZSBDTURcbiIsIGdzbV9sY2hhbl9uYW1lKGxjaGFuKSk7CisKKwkvKiBCVFMgd2lsbCByZXNwb25kIGJ5IFJGIENIQU4gUkVMIEFDSyAqLworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKK2ludCByc2xfcGFnaW5nX2NtZChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBwYWdpbmdfZ3JvdXAsIHVfaW50OF90IGxlbiwKKwkJICAgdV9pbnQ4X3QgKm1zX2lkZW50LCB1X2ludDhfdCBjaGFuX25lZWRlZCkKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gcnNsX21zZ2JfYWxsb2MoKTsKKworCWRoID0gKHN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmRoKSk7CisJaW5pdF9kY2hhbl9oZHIoZGgsIFJTTF9NVF9QQUdJTkdfQ01EKTsKKwlkaC0+Y2hhbl9uciA9IFJTTF9DSEFOX1BDSF9BR0NIOworCisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfUEFHSU5HX0dST1VQLCBwYWdpbmdfZ3JvdXApOworCW1zZ2JfdGx2X3B1dChtc2csIFJTTF9JRV9NU19JREVOVElUWSwgbGVuLTIsIG1zX2lkZW50KzIpOworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX0NIQU5fTkVFREVELCBjaGFuX25lZWRlZCk7CisKKwltc2ctPnRyeCA9IGJ0cy0+YzA7CisKKwlyZXR1cm4gYWJpc19yc2xfc2VuZG1zZyhtc2cpOworfQorCitpbnQgcnNsX3BhZ2luZ19jbWRfc3Vic2NyKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGNoYW5fbmVlZCwKKwkJCSAgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCit7CisjaWYgMAorCXVfaW50OF90IG1pWzEyOF07CisJdW5zaWduZWQgaW50IG1pX2xlbjsKKwl1X2ludDhfdCBwYWdpbmdfZ3JvdXA7CisjZW5kaWYKKworCXJldHVybiAtMTsKK30KKworaW50IGltc2lfc3RyMmJjZCh1X2ludDhfdCAqYmNkX291dCwgY29uc3QgY2hhciAqc3RyX2luKQoreworCWludCBpLCBsZW4gPSBzdHJsZW4oc3RyX2luKTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlpbnQgbnVtID0gc3RyX2luW2ldIC0gMHgzMDsKKwkJaWYgKG51bSA8IDAgfHwgbnVtID4gOSkKKwkJCXJldHVybiAtMTsKKwkJaWYgKGkgJSAyID09IDApCisJCQliY2Rfb3V0W2kvMl0gPSBudW07CisJCWVsc2UKKwkJCWJjZF9vdXRbaS8yXSB8PSAobnVtIDw8IDQpOworCX0KKworCXJldHVybiAwOworfQorCisvKiBDaGFwdGVyIDguNS42ICovCitpbnQgcnNsX2ltbV9hc3NpZ25fY21kKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGxlbiwgdV9pbnQ4X3QgKnZhbCkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gcnNsX21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaDsKKwl1X2ludDhfdCBidWZbTUFDQkxPQ0tfU0laRV07CisKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpkaCkpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfSU1NRURJQVRFX0FTU0lHTl9DTUQpOworCWRoLT5jaGFuX25yID0gUlNMX0NIQU5fUENIX0FHQ0g7CisKKwlzd2l0Y2ggKGJ0cy0+dHlwZSkgeworCWNhc2UgR1NNX0JUU19UWVBFX0JTMTE6CisJCW1zZ2JfdGx2X3B1dChtc2csIFJTTF9JRV9JTU1fQVNTX0lORk8sIGxlbiwgdmFsKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogSWYgcGhhc2UgMiwgY29uc3RydWN0IGEgRlVMTF9JTU1fQVNTX0lORk8gKi8KKwkJcGFkX21hY2Jsb2NrKGJ1ZiwgdmFsLCBsZW4pOworCQltc2diX3Rsdl9wdXQobXNnLCBSU0xfSUVfRlVMTF9JTU1fQVNTX0lORk8sIE1BQ0JMT0NLX1NJWkUsIGJ1Zik7CisJCWJyZWFrOworCX0KKworCW1zZy0+dHJ4ID0gYnRzLT5jMDsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKKy8qIFNlbmQgU2llbWVucyBzcGVjaWZpYyBNUyBSRiBQb3dlciBDYXBhYmlsaXR5IEluZGljYXRpb24gKi8KK2ludCByc2xfc2llbWVuc19tcnBjaShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgc3RydWN0IHJzbF9tcnBjaSAqbXJwY2kpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IHJzbF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGg7CisKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpkaCkpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfU0lFTUVOU19NUlBDSSk7CisJZGgtPmMubXNnX2Rpc2NyID0gQUJJU19SU0xfTURJU0NfREVEX0NIQU47CisJZGgtPmNoYW5fbnIgPSBsY2hhbjJjaGFuX25yKGxjaGFuKTsKKwltc2diX3R2X3B1dChtc2csIFJTTF9JRV9TSUVNRU5TX01SUENJLCAqKHVfaW50OF90ICopbXJwY2kpOworCisJREVCVUdQKERSU0wsICIlcyBUWCBTaWVtZW5zIE1SUENJIDB4JTAyeFxuIiwKKwkJZ3NtX2xjaGFuX25hbWUobGNoYW4pLCAqKHVfaW50OF90ICopbXJwY2kpOworCisJbXNnLT50cnggPSBsY2hhbi0+dHMtPnRyeDsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKKworLyogU2VuZCAiREFUQSBSRVFVRVNUIiBtZXNzYWdlIHdpdGggZ2l2ZW4gTDMgSW5mbyBwYXlsb2FkICovCisvKiBDaGFwdGVyIDguMy4xICovCitpbnQgcnNsX2RhdGFfcmVxdWVzdChzdHJ1Y3QgbXNnYiAqbXNnLCB1X2ludDhfdCBsaW5rX2lkKQoreworCWlmIChtc2ctPmxjaGFuID09IE5VTEwpIHsKKwkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiY2Fubm90IHNlbmQgREFUQSBSRVFVRVNUIHRvIHVua25vd24gbGNoYW5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyc2xfcmxsX3B1c2hfbDMobXNnLCBSU0xfTVRfREFUQV9SRVEsIGxjaGFuMmNoYW5fbnIobXNnLT5sY2hhbiksCisJCQlsaW5rX2lkLCAxKTsKKworCW1zZy0+dHJ4ID0gbXNnLT5sY2hhbi0+dHMtPnRyeDsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKKy8qIFNlbmQgIkVTVEFCTElTSCBSRVFVRVNUIiBtZXNzYWdlIHdpdGggZ2l2ZW4gTDMgSW5mbyBwYXlsb2FkICovCisvKiBDaGFwdGVyIDguMy4xICovCitpbnQgcnNsX2VzdGFibGlzaF9yZXF1ZXN0KHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBsaW5rX2lkKQoreworCXN0cnVjdCBtc2diICptc2c7CisKKwltc2cgPSByc2xfcmxsX3NpbXBsZShSU0xfTVRfRVNUX1JFUSwgbGNoYW4yY2hhbl9ucihsY2hhbiksCisJCQkgICAgIGxpbmtfaWQsIDApOworCW1zZy0+dHJ4ID0gbGNoYW4tPnRzLT50cng7CisKKwlyZXR1cm4gYWJpc19yc2xfc2VuZG1zZyhtc2cpOworfQorCisvKiBDaGFwdGVyIDguMy43IFJlcXVlc3QgdGhlIHJlbGVhc2Ugb2YgbXVsdGlmcmFtZSBtb2RlIG9mIFJMTCBjb25uZWN0aW9uLgorICAgVGhpcyBpcyB3aGF0IGhpZ2hlciBsYXllcnMgc2hvdWxkIGNhbGwuICBUaGUgQlRTIHRoZW4gcmVzcG9uZHMgd2l0aAorICAgUkVMRUFTRSBDT05GSVJNLCB3aGljaCB3ZSBpbiB0dXJuIHVzZSB0byB0cmlnZ2VyIFJTTCBDSEFOTkVMIFJFTEVBU0UsCisgICB3aGljaCBpbiB0dXJuIGlzIGFja25vd2xlZGdlZCBieSBSU0wgQ0hBTk5FTCBSRUxFQVNFIEFDSywgd2hpY2ggY2FsbHMKKyAgIGxjaGFuX2ZyZWUoKSAqLworaW50IHJzbF9yZWxlYXNlX3JlcXVlc3Qoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGxpbmtfaWQpCit7CisKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCisJbXNnID0gcnNsX3JsbF9zaW1wbGUoUlNMX01UX1JFTF9SRVEsIGxjaGFuMmNoYW5fbnIobGNoYW4pLAorCQkJICAgICBsaW5rX2lkLCAwKTsKKwltc2diX3R2X3B1dChtc2csIFJTTF9JRV9SRUxFQVNFX01PREUsIDApOwkvKiBub3JtYWwgcmVsZWFzZSAqLworCisJbGNoYW4tPnN0YXRlID0gTENIQU5fU19SRUxfUkVROworCS8qIEZJWE1FOiBzdGFydCBzb21lIHRpbWVyIGluIGNhc2Ugd2UgZG9uJ3QgcmVjZWl2ZSBhIFJFTCBBQ0sgPyAqLworCisJbXNnLT50cnggPSBsY2hhbi0+dHMtPnRyeDsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKKy8qIENoYXB0ZXIgOC40LjI6IENoYW5uZWwgQWN0aXZhdGUgQWNrbm93bGVkZ2UgKi8KK3N0YXRpYyBpbnQgcnNsX3J4X2NoYW5fYWN0X2FjayhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKnJzbGggPSBtc2diX2wyKG1zZyk7CisKKwkvKiBCVFMgaGFzIGNvbmZpcm1lZCBjaGFubmVsIGFjdGl2YXRpb24sIHdlIG5vdyBuZWVkCisJICogdG8gYXNzaWduIHRoZSBhY3RpdmF0ZWQgY2hhbm5lbCB0byB0aGUgTVMgKi8KKwlpZiAocnNsaC0+aWVfY2hhbiAhPSBSU0xfSUVfQ0hBTl9OUikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobXNnLT5sY2hhbi0+c3RhdGUgIT0gTENIQU5fU19BQ1RfUkVRKQorCQlMT0dQKERSU0wsIExPR0xfTk9USUNFLCAiJXMgQ0hBTiBBQ1QgQUNLLCBidXQgc3RhdGUgJXNcbiIsCisJCQlnc21fbGNoYW5fbmFtZShtc2ctPmxjaGFuKSwKKwkJCWdzbV9sY2hhbnNfbmFtZShtc2ctPmxjaGFuLT5zdGF0ZSkpOworCW1zZy0+bGNoYW4tPnN0YXRlID0gTENIQU5fU19BQ1RJVkU7CisKKwlkaXNwYXRjaF9zaWduYWwoU1NfTENIQU4sIFNfTENIQU5fQUNUSVZBVEVfQUNLLCBtc2ctPmxjaGFuKTsKKworCXJldHVybiAwOworfQorCisvKiBDaGFwdGVyIDguNC4zOiBDaGFubmVsIEFjdGl2YXRlIE5BQ0sgKi8KK3N0YXRpYyBpbnQgcnNsX3J4X2NoYW5fYWN0X25hY2soc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaCA9IG1zZ2JfbDIobXNnKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKworCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgIiVzIENIQU5ORUwgQUNUSVZBVEUgTkFDSyIsCisJCWdzbV9sY2hhbl9uYW1lKG1zZy0+bGNoYW4pKTsKKworCS8qIEJUUyBoYXMgcmVqZWN0ZWQgY2hhbm5lbCBhY3RpdmF0aW9uID8hPyAqLworCWlmIChkaC0+aWVfY2hhbiAhPSBSU0xfSUVfQ0hBTl9OUikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyc2xfdGx2X3BhcnNlKCZ0cCwgZGgtPmRhdGEsIG1zZ2JfbDJsZW4obXNnKS1zaXplb2YoKmRoKSk7CisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIFJTTF9JRV9DQVVTRSkpIHsKKwkJY29uc3QgdV9pbnQ4X3QgKmNhdXNlID0gVExWUF9WQUwoJnRwLCBSU0xfSUVfQ0FVU0UpOworCQlwcmludF9yc2xfY2F1c2UoTE9HTF9FUlJPUiwgY2F1c2UsCisJCQkJVExWUF9MRU4oJnRwLCBSU0xfSUVfQ0FVU0UpKTsKKwkJaWYgKCpjYXVzZSAhPSBSU0xfRVJSX1JDSF9BTFJfQUNUVl9BTExPQykKKwkJCW1zZy0+bGNoYW4tPnN0YXRlID0gTENIQU5fU19OT05FOworCX0gZWxzZQorCQltc2ctPmxjaGFuLT5zdGF0ZSA9IExDSEFOX1NfTk9ORTsKKyAKKwlMT0dQQyhEUlNMLCBMT0dMX0VSUk9SLCAiXG4iKTsKKworCWRpc3BhdGNoX3NpZ25hbChTU19MQ0hBTiwgU19MQ0hBTl9BQ1RJVkFURV9OQUNLLCBtc2ctPmxjaGFuKTsKKworCWxjaGFuX2ZyZWUobXNnLT5sY2hhbik7CisJcmV0dXJuIDA7Cit9CisKKy8qIENoYXB0ZXIgOC40LjQ6IENvbm5lY3Rpb24gRmFpbHVyZSBJbmRpY2F0aW9uICovCitzdGF0aWMgaW50IHJzbF9yeF9jb25uX2ZhaWwoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaCA9IG1zZ2JfbDIobXNnKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKworCS8qIEZJWE1FOiBwcmludCB3aGljaCBjaGFubmVsICovCisJTE9HUChEUlNMLCBMT0dMX05PVElDRSwgIiVzIENPTk5FQ1RJT04gRkFJTDogUkVMRUFTSU5HICIsCisJICAgICBnc21fbGNoYW5fbmFtZShtc2ctPmxjaGFuKSk7CisKKwlyc2xfdGx2X3BhcnNlKCZ0cCwgZGgtPmRhdGEsIG1zZ2JfbDJsZW4obXNnKS1zaXplb2YoKmRoKSk7CisKKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgUlNMX0lFX0NBVVNFKSkKKwkJcHJpbnRfcnNsX2NhdXNlKExPR0xfTk9USUNFLCBUTFZQX1ZBTCgmdHAsIFJTTF9JRV9DQVVTRSksCisJCQkJVExWUF9MRU4oJnRwLCBSU0xfSUVfQ0FVU0UpKTsKKworCUxPR1BDKERSU0wsIExPR0xfTk9USUNFLCAiXG4iKTsKKwkvKiBGSVhNRTogb25seSBmcmVlIGl0IGFmdGVyIGNoYW5uZWwgcmVsZWFzZSBBQ0sgKi8KKwlyZXR1cm4gcnNsX3JmX2NoYW5fcmVsZWFzZShtc2ctPmxjaGFuKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfbWVhc19yZXBfdW5pKHN0cnVjdCBnc21fbWVhc19yZXBfdW5pZGlyICptcnUsCisJCQkJY29uc3QgY2hhciAqcHJlZml4KQoreworCURFQlVHUEMoRE1FQVMsICJSWEwtRlVMTC0lcz0lM2RkQm0gUlhMLVNVQi0lcz0lM2RkQm0gIiwKKwkJcHJlZml4LCByeGxldjJkYm0obXJ1LT5mdWxsLnJ4X2xldiksCisJCXByZWZpeCwgcnhsZXYyZGJtKG1ydS0+c3ViLnJ4X2xldikpOworCURFQlVHUEMoRE1FQVMsICJSWFEtRlVMTC0lcz0lZCBSWFEtU1VCLSVzPSVkICIsCisJCXByZWZpeCwgbXJ1LT5mdWxsLnJ4X3F1YWwsIHByZWZpeCwgbXJ1LT5zdWIucnhfcXVhbCk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X21lYXNfcmVwKHN0cnVjdCBnc21fbWVhc19yZXAgKm1yKQoreworCWludCBpOworCisJREVCVUdQKERNRUFTLCAiTUVBU1VSRU1FTlQgUkVTVUxUIE5SPSVkICIsIG1yLT5ucik7CisKKwlpZiAobXItPmZsYWdzICYgTUVBU19SRVBfRl9ETF9EVFgpCisJCURFQlVHUEMoRE1FQVMsICJEVFhkICIpOworCisJcHJpbnRfbWVhc19yZXBfdW5pKCZtci0+dWwsICJ1bCIpOworCURFQlVHUEMoRE1FQVMsICJCU19QT1dFUj0lZCAiLCBtci0+YnNfcG93ZXIpOworCWlmIChtci0+ZmxhZ3MgJiBNRUFTX1JFUF9GX01TX1RPKQorCQlERUJVR1BDKERNRUFTLCAiTVNfVE89JWQgIiwgbXItPm1zX3RpbWluZ19vZmZzZXQpOworCisJaWYgKG1yLT5mbGFncyAmIE1FQVNfUkVQX0ZfTVNfTDEpIHsKKwkJREVCVUdQQyhETUVBUywgIkwxX01TX1BXUj0lM2RkQm0gIiwgbXItPm1zX2wxLnB3cik7CisJCURFQlVHUEMoRE1FQVMsICJMMV9GUEM9JXUgIiwKKwkJCW1yLT5mbGFncyAmIE1FQVNfUkVQX0ZfRlBDID8gMSA6IDApOworCQlERUJVR1BDKERNRUFTLCAiTDFfVEE9JXUgIiwgbXItPm1zX2wxLnRhKTsKKwl9CisKKwlpZiAobXItPmZsYWdzICYgTUVBU19SRVBfRl9VTF9EVFgpCisJCURFQlVHUEMoRE1FQVMsICJEVFh1ICIpOworCWlmIChtci0+ZmxhZ3MgJiBNRUFTX1JFUF9GX0JBMSkKKwkJREVCVUdQQyhETUVBUywgIkJBMSAiKTsKKwlpZiAoIShtci0+ZmxhZ3MgJiBNRUFTX1JFUF9GX0RMX1ZBTElEKSkKKwkJREVCVUdQQyhETUVBUywgIk5PVCBWQUxJRCAiKTsKKwllbHNlCisJCXByaW50X21lYXNfcmVwX3VuaSgmbXItPmRsLCAiZGwiKTsKKworCURFQlVHUEMoRE1FQVMsICJOVU1fTkVJR0g9JXVcbiIsIG1yLT5udW1fY2VsbCk7CisJaWYgKG1yLT5udW1fY2VsbCA9PSA3KQorCQlyZXR1cm47CisJZm9yIChpID0gMDsgaSA8IG1yLT5udW1fY2VsbDsgaSsrKSB7CisJCXN0cnVjdCBnc21fbWVhc19yZXBfY2VsbCAqbXJjID0gJm1yLT5jZWxsW2ldOworCQlERUJVR1AoRE1FQVMsICJJRFg9JXUgQVJGQ049JXUgQlNJQz0ldSA9PiAlZCBkQm1cbiIsCisJCQltcmMtPm5laWdoX2lkeCwgbXJjLT5hcmZjbiwgbXJjLT5ic2ljLCByeGxldjJkYm0obXJjLT5yeGxldikpOworCX0KK30KKworc3RhdGljIGludCByc2xfcnhfbWVhc19yZXMoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaCA9IG1zZ2JfbDIobXNnKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwlzdHJ1Y3QgZ3NtX21lYXNfcmVwICptciA9IGxjaGFuX25leHRfbWVhc19yZXAobXNnLT5sY2hhbik7CisJdV9pbnQ4X3QgbGVuOworCWNvbnN0IHVfaW50OF90ICp2YWw7CisJaW50IHJjOworCisJLyogY2hlY2sgaWYgdGhpcyBjaGFubmVsIGlzIGFjdHVhbGx5IGFjdGl2ZSAqLworCS8qIEZJWE1FOiBtYXliZSB0aGlzIGNoZWNrIHNob3VsZCBiZSB3YXkgbW9yZSBnZW5lcmljL2NlbnRyYWxpemVkICovCisJaWYgKG1zZy0+bGNoYW4tPnN0YXRlICE9IExDSEFOX1NfQUNUSVZFKSB7CisJCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICIlczogTUVBUyBSRVMgZm9yIGluYWN0aXZlIGNoYW5uZWxcbiIsCisJCQlnc21fbGNoYW5fbmFtZShtc2ctPmxjaGFuKSk7CisJCXJldHVybiAwOworCX0KKworCW1lbXNldChtciwgMCwgc2l6ZW9mKCptcikpOworCW1yLT5sY2hhbiA9IG1zZy0+bGNoYW47CisKKwlyc2xfdGx2X3BhcnNlKCZ0cCwgZGgtPmRhdGEsIG1zZ2JfbDJsZW4obXNnKS1zaXplb2YoKmRoKSk7CisKKwlpZiAoIVRMVlBfUFJFU0VOVCgmdHAsIFJTTF9JRV9NRUFTX1JFU19OUikgfHwKKwkgICAgIVRMVlBfUFJFU0VOVCgmdHAsIFJTTF9JRV9VUExJTktfTUVBUykgfHwKKwkgICAgIVRMVlBfUFJFU0VOVCgmdHAsIFJTTF9JRV9CU19QT1dFUikpCisJCXJldHVybiAtRUlPOworCisJLyogTWFuZGF0b3J5IFBhcnRzICovCisJbXItPm5yID0gKlRMVlBfVkFMKCZ0cCwgUlNMX0lFX01FQVNfUkVTX05SKTsKKworCWxlbiA9IFRMVlBfTEVOKCZ0cCwgUlNMX0lFX1VQTElOS19NRUFTKTsKKwl2YWwgPSBUTFZQX1ZBTCgmdHAsIFJTTF9JRV9VUExJTktfTUVBUyk7CisJaWYgKGxlbiA+PSAzKSB7CisJCWlmICh2YWxbMF0gJiAweDQwKQorCQkJbXItPmZsYWdzIHw9IE1FQVNfUkVQX0ZfRExfRFRYOworCQltci0+dWwuZnVsbC5yeF9sZXYgPSB2YWxbMF0gJiAweDNmOworCQltci0+dWwuc3ViLnJ4X2xldiA9IHZhbFsxXSAmIDB4M2Y7CisJCW1yLT51bC5mdWxsLnJ4X3F1YWwgPSB2YWxbMl0+PjMgJiAweDc7CisJCW1yLT51bC5zdWIucnhfcXVhbCA9IHZhbFsyXSAmIDB4NzsKKwl9CisKKwltci0+YnNfcG93ZXIgPSAqVExWUF9WQUwoJnRwLCBSU0xfSUVfQlNfUE9XRVIpOworCisJLyogT3B0aW9uYWwgUGFydHMgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgUlNMX0lFX01TX1RJTUlOR19PRkZTRVQpKQorCQltci0+bXNfdGltaW5nX29mZnNldCA9CisJCQkqVExWUF9WQUwoJnRwLCBSU0xfSUVfTVNfVElNSU5HX09GRlNFVCk7CisKKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgUlNMX0lFX0wxX0lORk8pKSB7CisJCXZhbCA9IFRMVlBfVkFMKCZ0cCwgUlNMX0lFX0wxX0lORk8pOworCQltci0+ZmxhZ3MgfD0gTUVBU19SRVBfRl9NU19MMTsKKwkJbXItPm1zX2wxLnB3ciA9IG1zX3B3cl9kYm0obXNnLT50cngtPmJ0cy0+YmFuZCwgdmFsWzBdID4+IDMpOworCQlpZiAodmFsWzBdICYgMHgwNCkKKwkJCW1yLT5mbGFncyB8PSBNRUFTX1JFUF9GX0ZQQzsKKwkJbXItPm1zX2wxLnRhID0gdmFsWzFdOworCX0KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgUlNMX0lFX0wzX0lORk8pKSB7CisJCW1zZy0+bDNoID0gKHVfaW50OF90ICopIFRMVlBfVkFMKCZ0cCwgUlNMX0lFX0wzX0lORk8pOworCQlyYyA9IGdzbTQ4X3BhcnNlX21lYXNfcmVwKG1yLCBtc2cpOworCQlpZiAocmMgPCAwKQorCQkJcmV0dXJuIHJjOworCX0KKworCXByaW50X21lYXNfcmVwKG1yKTsKKworCWRpc3BhdGNoX3NpZ25hbChTU19MQ0hBTiwgU19MQ0hBTl9NRUFTX1JFUCwgbXIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIENoYXB0ZXIgOC40LjcgKi8KK3N0YXRpYyBpbnQgcnNsX3J4X2hhbmRvX2RldChzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoID0gbXNnYl9sMihtc2cpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCisJREVCVUdQKERSU0wsICIlcyBIQU5ET1ZFUiBERVRFQ1QgIiwgZ3NtX2xjaGFuX25hbWUobXNnLT5sY2hhbikpOworCisJcnNsX3Rsdl9wYXJzZSgmdHAsIGRoLT5kYXRhLCBtc2diX2wybGVuKG1zZyktc2l6ZW9mKCpkaCkpOworCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIFJTTF9JRV9BQ0NFU1NfREVMQVkpKQorCQlERUJVR1BDKERSU0wsICJhY2Nlc3MgZGVsYXkgPSAldVxuIiwKKwkJCSpUTFZQX1ZBTCgmdHAsIFJTTF9JRV9BQ0NFU1NfREVMQVkpKTsKKwllbHNlCisJCURFQlVHUEMoRFJTTCwgIlxuIik7CisKKwlkaXNwYXRjaF9zaWduYWwoU1NfTENIQU4sIFNfTENIQU5fSEFORE9WRVJfREVURUNULCBtc2ctPmxjaGFuKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFiaXNfcnNsX3J4X2RjaGFuKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqcnNsaCA9IG1zZ2JfbDIobXNnKTsKKwlpbnQgcmMgPSAwOworCWNoYXIgKnRzX25hbWU7CisKKwltc2ctPmxjaGFuID0gbGNoYW5fbG9va3VwKG1zZy0+dHJ4LCByc2xoLT5jaGFuX25yKTsKKwl0c19uYW1lID0gZ3NtX2xjaGFuX25hbWUobXNnLT5sY2hhbik7CisKKwlzd2l0Y2ggKHJzbGgtPmMubXNnX3R5cGUpIHsKKwljYXNlIFJTTF9NVF9DSEFOX0FDVElWX0FDSzoKKwkJREVCVUdQKERSU0wsICIlcyBDSEFOTkVMIEFDVElWQVRFIEFDS1xuIiwgdHNfbmFtZSk7CisJCXJjID0gcnNsX3J4X2NoYW5fYWN0X2Fjayhtc2cpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9DSEFOX0FDVElWX05BQ0s6CisJCXJjID0gcnNsX3J4X2NoYW5fYWN0X25hY2sobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfQ09OTl9GQUlMOgorCQlyYyA9IHJzbF9yeF9jb25uX2ZhaWwobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfTUVBU19SRVM6CisJCXJjID0gcnNsX3J4X21lYXNfcmVzKG1zZyk7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX0hBTkRPX0RFVDoKKwkJcmMgPSByc2xfcnhfaGFuZG9fZGV0KG1zZyk7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX1JGX0NIQU5fUkVMX0FDSzoKKwkJREVCVUdQKERSU0wsICIlcyBSRiBDSEFOTkVMIFJFTEVBU0UgQUNLXG4iLCB0c19uYW1lKTsKKwkJaWYgKG1zZy0+bGNoYW4tPnN0YXRlICE9IExDSEFOX1NfUkVMX1JFUSkKKwkJCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICIlcyBDSEFOIFJFTCBBQ0sgYnV0IHN0YXRlICVzXG4iLAorCQkJCWdzbV9sY2hhbl9uYW1lKG1zZy0+bGNoYW4pLAorCQkJCWdzbV9sY2hhbnNfbmFtZShtc2ctPmxjaGFuLT5zdGF0ZSkpOworCQltc2ctPmxjaGFuLT5zdGF0ZSA9IExDSEFOX1NfTk9ORTsKKwkJbGNoYW5fZnJlZShtc2ctPmxjaGFuKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfTU9ERV9NT0RJRllfQUNLOgorCQlERUJVR1AoRFJTTCwgIiVzIENIQU5ORUwgTU9ERSBNT0RJRlkgQUNLXG4iLCB0c19uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfTU9ERV9NT0RJRllfTkFDSzoKKwkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiJXMgQ0hBTk5FTCBNT0RFIE1PRElGWSBOQUNLXG4iLCB0c19uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfSVBBQ19QRENIX0FDVF9BQ0s6CisJCURFQlVHUEMoRFJTTCwgIiVzIElQQUMgUERDSCBBQ1QgQUNLXG4iLCB0c19uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfSVBBQ19QRENIX0FDVF9OQUNLOgorCQlMT0dQKERSU0wsIExPR0xfRVJST1IsICIlcyBJUEFDIFBEQ0ggQUNUIE5BQ0tcbiIsIHRzX25hbWUpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9JUEFDX1BEQ0hfREVBQ1RfQUNLOgorCQlERUJVR1AoRFJTTCwgIiVzIElQQUMgUERDSCBERUFDVCBBQ0tcbiIsIHRzX25hbWUpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9JUEFDX1BEQ0hfREVBQ1RfTkFDSzoKKwkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiJXMgSVBBQyBQRENIIERFQUNUIE5BQ0tcbiIsIHRzX25hbWUpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9QSFlfQ09OVEVYVF9DT05GOgorCWNhc2UgUlNMX01UX1BSRVBST0NfTUVBU19SRVM6CisJY2FzZSBSU0xfTVRfVEFMS0VSX0RFVDoKKwljYXNlIFJTTF9NVF9MSVNURU5FUl9ERVQ6CisJY2FzZSBSU0xfTVRfUkVNT1RFX0NPREVDX0NPTkZfUkVQOgorCWNhc2UgUlNMX01UX01SX0NPREVDX01PRF9BQ0s6CisJY2FzZSBSU0xfTVRfTVJfQ09ERUNfTU9EX05BQ0s6CisJY2FzZSBSU0xfTVRfTVJfQ09ERUNfTU9EX1BFUjoKKwkJTE9HUChEUlNMLCBMT0dMX05PVElDRSwgIiVzIFVuaW1wbGVtZW50ZWQgQWJpcyBSU0wgRENoYW4gIgorCQkJIm1zZyAweCUwMnhcbiIsIHRzX25hbWUsIHJzbGgtPmMubXNnX3R5cGUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERSU0wsIExPR0xfTk9USUNFLCAiJXMgdW5rbm93biBBYmlzIFJTTCBEQ2hhbiBtc2cgMHglMDJ4XG4iLAorCQkJdHNfbmFtZSwgcnNsaC0+Yy5tc2dfdHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCByc2xfcnhfZXJyb3JfcmVwKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX2NvbW1vbl9oZHIgKnJzbGggPSBtc2diX2wyKG1zZyk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisKKwlMT0dQKERSU0wsIExPR0xfRVJST1IsICIlcyBFUlJPUiBSRVBPUlQgIiwgZ3NtX3RyeF9uYW1lKG1zZy0+dHJ4KSk7CisKKwlyc2xfdGx2X3BhcnNlKCZ0cCwgcnNsaC0+ZGF0YSwgbXNnYl9sMmxlbihtc2cpLXNpemVvZigqcnNsaCkpOworCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIFJTTF9JRV9DQVVTRSkpCisJCXByaW50X3JzbF9jYXVzZShMT0dMX0VSUk9SLCBUTFZQX1ZBTCgmdHAsIFJTTF9JRV9DQVVTRSksCisJCQkJVExWUF9MRU4oJnRwLCBSU0xfSUVfQ0FVU0UpKTsKKworCUxPR1BDKERSU0wsIExPR0xfRVJST1IsICJcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWJpc19yc2xfcnhfdHJ4KHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX2NvbW1vbl9oZHIgKnJzbGggPSBtc2diX2wyKG1zZyk7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAocnNsaC0+bXNnX3R5cGUpIHsKKwljYXNlIFJTTF9NVF9FUlJPUl9SRVBPUlQ6CisJCXJjID0gcnNsX3J4X2Vycm9yX3JlcChtc2cpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9SRl9SRVNfSU5EOgorCQkvKiBpbnRlcmZlcmVuY2Ugb24gaWRsZSBjaGFubmVscyBvZiBUUlggKi8KKwkJLy9ERUJVR1AoRFJTTCwgIiVzIFJGIFJlc291cmNlIEluZGljYXRpb25cbiIsIGdzbV90cnhfbmFtZShtc2ctPnRyeCkpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9PVkVSTE9BRDoKKwkJLyogaW5kaWNhdGUgQ0NDSCAvIEFDQ0ggLyBwcm9jZXNzb3Igb3ZlcmxvYWQgKi8gCisJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgIiVzIENDQ0gvQUNDSC9DUFUgT3ZlcmxvYWRcbiIsCisJCSAgICAgZ3NtX3RyeF9uYW1lKG1zZy0+dHJ4KSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICIlcyBVbmtub3duIEFiaXMgUlNMIFRSWCBtZXNzYWdlICIKKwkJCSJ0eXBlIDB4JTAyeFxuIiwgZ3NtX3RyeF9uYW1lKG1zZy0+dHJ4KSwgcnNsaC0+bXNnX3R5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIHJjOworfQorCisvKiBJZiBUMzEwMSBleHBpcmVzLCB3ZSBuZXZlciByZWNlaXZlZCBhIHJlc3BvbnNlIHRvIElNTUVESUFURSBBU1NJR04gKi8KK3N0YXRpYyB2b2lkIHQzMTAxX2V4cGlyZWQodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IGRhdGE7CisKKwlyc2xfcmZfY2hhbl9yZWxlYXNlKGxjaGFuKTsKK30KKworLyogTVMgaGFzIHJlcXVlc3RlZCBhIGNoYW5uZWwgb24gdGhlIFJBQ0ggKi8KK3N0YXRpYyBpbnQgcnNsX3J4X2NoYW5fcnFkKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IG1zZy0+dHJ4LT5idHM7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqcnFkX2hkciA9IG1zZ2JfbDIobXNnKTsKKwlzdHJ1Y3QgZ3NtNDhfcmVxX3JlZiAqcnFkX3JlZjsKKwlzdHJ1Y3QgZ3NtNDhfaW1tX2FzcyBpYTsKKwllbnVtIGdzbV9jaGFuX3QgbGN0eXBlOworCWVudW0gZ3NtX2NocmVxX3JlYXNvbl90IGNocmVxX3JlYXNvbjsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKwl1X2ludDhfdCBycWRfdGE7CisJaW50IHJldDsKKworCXVfaW50MTZfdCBhcmZjbjsKKwl1X2ludDhfdCB0c19udW1iZXIsIHN1YmNoOworCisJLyogcGFyc2UgcmVxdWVzdCByZWZlcmVuY2UgdG8gYmUgdXNlZCBpbiBpbW1lZGlhdGUgYXNzaWduICovCisJaWYgKHJxZF9oZHItPmRhdGFbMF0gIT0gUlNMX0lFX1JFUV9SRUZFUkVOQ0UpCisJCXJldHVybiAtRUlOVkFMOworCisJcnFkX3JlZiA9IChzdHJ1Y3QgZ3NtNDhfcmVxX3JlZiAqKSAmcnFkX2hkci0+ZGF0YVsxXTsKKworCS8qIHBhcnNlIGFjY2VzcyBkZWxheSBhbmQgdXNlIGFzIFRBICovCisJaWYgKHJxZF9oZHItPmRhdGFbc2l6ZW9mKHN0cnVjdCBnc200OF9yZXFfcmVmKSsxXSAhPSBSU0xfSUVfQUNDRVNTX0RFTEFZKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlycWRfdGEgPSBycWRfaGRyLT5kYXRhW3NpemVvZihzdHJ1Y3QgZ3NtNDhfcmVxX3JlZikrMl07CisKKwkvKiBkZXRlcm1pbmUgY2hhbm5lbCB0eXBlIChTRENDSC9UQ0hfRi9UQ0hfSCkgYmFzZWQgb24KKwkgKiByZXF1ZXN0IHJlZmVyZW5jZSBSQSAqLworCWxjdHlwZSA9IGdldF9jdHlwZV9ieV9jaHJlcShidHMsIHJxZF9yZWYtPnJhLCBidHMtPm5ldHdvcmstPm5lY2kpOworCWNocmVxX3JlYXNvbiA9IGdldF9yZWFzb25fYnlfY2hyZXEoYnRzLCBycWRfcmVmLT5yYSwgYnRzLT5uZXR3b3JrLT5uZWNpKTsKKworCWNvdW50ZXJfaW5jKGJ0cy0+bmV0d29yay0+c3RhdHMuY2hyZXEudG90YWwpOworCisJLyogY2hlY2sgYXZhaWxhYmlsaXR5IC8gYWxsb2NhdGUgY2hhbm5lbCAqLworCWxjaGFuID0gbGNoYW5fYWxsb2MoYnRzLCBsY3R5cGUpOworCWlmICghbGNoYW4pIHsKKwkJTE9HUChEUlNMLCBMT0dMX05PVElDRSwgIkJUUyAlZCBDSEFOIFJRRDogbm8gcmVzb3VyY2VzIGZvciAlcyAweCV4XG4iLAorCQkgICAgIG1zZy0+bGNoYW4tPnRzLT50cngtPmJ0cy0+bnIsIGdzbV9sY2hhbnRfbmFtZShsY3R5cGUpLCBycWRfcmVmLT5yYSk7CisJCWNvdW50ZXJfaW5jKGJ0cy0+bmV0d29yay0+c3RhdHMuY2hyZXEubm9fY2hhbm5lbCk7CisJCS8qIEZJWE1FOiBzZW5kIHNvbWUga2luZCBvZiByZWplY3QgPyE/ICovCisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChsY2hhbi0+c3RhdGUgIT0gTENIQU5fU19OT05FKQorCQlMT0dQKERSU0wsIExPR0xfTk9USUNFLCAiJXMgbGNoYW5fYWxsb2MoKSByZXR1cm5lZCBjaGFubmVsICIKKwkJICAgICAiaW4gc3RhdGUgJXNcbiIsIGdzbV9sY2hhbl9uYW1lKGxjaGFuKSwKKwkJICAgICBnc21fbGNoYW5zX25hbWUobGNoYW4tPnN0YXRlKSk7CisJbGNoYW4tPnN0YXRlID0gTENIQU5fU19BQ1RfUkVROworCisJdHNfbnVtYmVyID0gbGNoYW4tPnRzLT5ucjsKKwlhcmZjbiA9IGxjaGFuLT50cy0+dHJ4LT5hcmZjbjsKKwlzdWJjaCA9IGxjaGFuLT5ucjsKKwkKKwlsY2hhbi0+ZW5jci5hbGdfaWQgPSBSU0xfRU5DX0FMR19BNSgwKTsJLyogbm8gZW5jcnlwdGlvbiAqLworCWxjaGFuLT5tc19wb3dlciA9IG1zX3B3cl9jdGxfbHZsKGJ0cy0+YmFuZCwgYnRzLT5tc19tYXhfcG93ZXIpOworCWxjaGFuLT5ic19wb3dlciA9IDA7IC8qIDBkQiByZWR1Y3Rpb24sIG91dHB1dCBwb3dlciA9IFBuICovCisJbGNoYW4tPnJzbF9jbW9kZSA9IFJTTF9DTU9EX1NQRF9TSUdOOworCWxjaGFuLT50Y2hfbW9kZSA9IEdTTTQ4X0NNT0RFX1NJR047CisJcnNsX2NoYW5fYWN0aXZhdGVfbGNoYW4obGNoYW4sIDB4MDAsIHJxZF90YSwgMCk7CisKKwkvKiBjcmVhdGUgSU1NRURJQVRFIEFTU0lHTiAwNC4wOCBtZXNzZ2UgKi8KKwltZW1zZXQoJmlhLCAwLCBzaXplb2YoaWEpKTsKKwlpYS5sMl9wbGVuID0gMHgyZDsKKwlpYS5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX1JSOworCWlhLm1zZ190eXBlID0gR1NNNDhfTVRfUlJfSU1NX0FTUzsKKwlpYS5wYWdlX21vZGUgPSBHU000OF9QTV9TQU1FOworCWlhLmNoYW5fZGVzYy5jaGFuX25yID0gbGNoYW4yY2hhbl9ucihsY2hhbik7CisJaWEuY2hhbl9kZXNjLmgwLmggPSAwOworCWlhLmNoYW5fZGVzYy5oMC5hcmZjbl9oaWdoID0gYXJmY24gPj4gODsKKwlpYS5jaGFuX2Rlc2MuaDAuYXJmY25fbG93ID0gYXJmY24gJiAweGZmOworCWlhLmNoYW5fZGVzYy5oMC50c2MgPSBidHMtPnRzYzsKKwkvKiB1c2UgcmVxdWVzdCByZWZlcmVuY2UgZXh0cmFjdGVkIGZyb20gQ0hBTl9SUUQgKi8KKwltZW1jcHkoJmlhLnJlcV9yZWYsIHJxZF9yZWYsIHNpemVvZihpYS5yZXFfcmVmKSk7CisJaWEudGltaW5nX2FkdmFuY2UgPSBycWRfdGE7CisJaWEubW9iX2FsbG9jX2xlbiA9IDA7CisKKwlERUJVR1AoRFJTTCwgIiVzIEFjdGl2YXRpbmcgQVJGQ04oJXUpIFNTKCV1KSBsY3R5cGUgJXMgIgorCQkicj0lcyByYT0weCUwMnhcbiIsIGdzbV9sY2hhbl9uYW1lKGxjaGFuKSwgYXJmY24sIHN1YmNoLAorCQlnc21fbGNoYW50X25hbWUobGNoYW4tPnR5cGUpLCBnc21fY2hyZXFfbmFtZShjaHJlcV9yZWFzb24pLAorCQlycWRfcmVmLT5yYSk7CisKKwkvKiBTdGFydCB0aW1lciBUMzEwMSB0byB3YWl0IGZvciBHU000OF9NVF9SUl9QQUdfUkVTUCAqLworCWxjaGFuLT5UMzEwMS5jYiA9IHQzMTAxX2V4cGlyZWQ7CisJbGNoYW4tPlQzMTAxLmRhdGEgPSBsY2hhbjsKKwlic2Nfc2NoZWR1bGVfdGltZXIoJmxjaGFuLT5UMzEwMSwgYnRzLT5uZXR3b3JrLT5UMzEwMSwgMCk7CisKKwkvKiBzZW5kIElNTUVESUFURSBBU1NJR04gQ01EIG9uIFJTTCB0byBCVFMgKHRvIHNlbmQgb24gQ0NDSCB0byBNUykgKi8KKwlyZXQgPSByc2xfaW1tX2Fzc2lnbl9jbWQoYnRzLCBzaXplb2YoaWEpLCAodV9pbnQ4X3QgKikgJmlhKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIE1TIGhhcyByZXF1ZXN0ZWQgYSBjaGFubmVsIG9uIHRoZSBSQUNIICovCitzdGF0aWMgaW50IHJzbF9yeF9jY2NoX2xvYWQoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpyc2xoID0gbXNnYl9sMihtc2cpOworCXVfaW50MTZfdCBwZ19idWZfc3BhY2U7CisJdV9pbnQxNl90IHJhY2hfc2xvdF9jb3VudCA9IC0xOworCXVfaW50MTZfdCByYWNoX2J1c3lfY291bnQgPSAtMTsKKwl1X2ludDE2X3QgcmFjaF9hY2Nlc3NfY291bnQgPSAtMTsKKworCXN3aXRjaCAocnNsaC0+ZGF0YVswXSkgeworCWNhc2UgUlNMX0lFX1BBR0lOR19MT0FEOgorCQlwZ19idWZfc3BhY2UgPSByc2xoLT5kYXRhWzFdIDw8IDggfCByc2xoLT5kYXRhWzJdOworCQlwYWdpbmdfdXBkYXRlX2J1ZmZlcl9zcGFjZShtc2ctPnRyeC0+YnRzLCBwZ19idWZfc3BhY2UpOworCQlicmVhazsKKwljYXNlIFJTTF9JRV9SQUNIX0xPQUQ6CisJCWlmIChtc2ctPmRhdGFfbGVuID49IDcpIHsKKwkJCXJhY2hfc2xvdF9jb3VudCA9IHJzbGgtPmRhdGFbMl0gPDwgOCB8IHJzbGgtPmRhdGFbM107CisJCQlyYWNoX2J1c3lfY291bnQgPSByc2xoLT5kYXRhWzRdIDw8IDggfCByc2xoLT5kYXRhWzVdOworCQkJcmFjaF9hY2Nlc3NfY291bnQgPSByc2xoLT5kYXRhWzZdIDw8IDggfCByc2xoLT5kYXRhWzddOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFiaXNfcnNsX3J4X2NjaGFuKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqcnNsaCA9IG1zZ2JfbDIobXNnKTsKKwlpbnQgcmMgPSAwOworCisJbXNnLT5sY2hhbiA9IGxjaGFuX2xvb2t1cChtc2ctPnRyeCwgcnNsaC0+Y2hhbl9ucik7CisKKwlzd2l0Y2ggKHJzbGgtPmMubXNnX3R5cGUpIHsKKwljYXNlIFJTTF9NVF9DSEFOX1JRRDoKKwkJLyogTVMgaGFzIHJlcXVlc3RlZCBhIGNoYW5uZWwgb24gdGhlIFJBQ0ggKi8KKwkJcmMgPSByc2xfcnhfY2hhbl9ycWQobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfQ0NDSF9MT0FEX0lORDoKKwkJLyogY3VycmVudCBsb2FkIG9uIHRoZSBDQ0NIICovCisJCXJjID0gcnNsX3J4X2NjY2hfbG9hZChtc2cpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9ERUxFVEVfSU5EOgorCQkvKiBDQ0NIIG92ZXJsb2FkZWQsIElNTV9BU1NJR04gd2FzIGRyb3BwZWQgKi8KKwljYXNlIFJTTF9NVF9DQkNIX0xPQURfSU5EOgorCQkvKiBjdXJyZW50IGxvYWQgb24gdGhlIENCQ0ggKi8KKwkJTE9HUChEUlNMLCBMT0dMX05PVElDRSwgIlVuaW1wbGVtZW50ZWQgQWJpcyBSU0wgVFJYIG1lc3NhZ2UgIgorCQkJInR5cGUgMHglMDJ4XG4iLCByc2xoLT5jLm1zZ190eXBlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChEUlNMLCBMT0dMX05PVElDRSwgIlVua25vd24gQWJpcyBSU0wgVFJYIG1lc3NhZ2UgdHlwZSAiCisJCQkiMHglMDJ4XG4iLCByc2xoLT5jLm1zZ190eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHJzbF9yeF9ybGxfZXJyX2luZChzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX3JzbF9ybGxfaGRyICpybGxoID0gbXNnYl9sMihtc2cpOworCXVfaW50OF90ICpybG1fY2F1c2UgPSBybGxoLT5kYXRhOworCisJTE9HUChEUkxMLCBMT0dMX0VSUk9SLCAiJXMgRVJST1IgSU5ESUNBVElPTiBjYXVzZT0lc1xuIiwKKwkJZ3NtX2xjaGFuX25hbWUobXNnLT5sY2hhbiksCisJCXJzbF9ybG1fY2F1c2VfbmFtZShybG1fY2F1c2VbMV0pKTsKKworCXJsbF9pbmRpY2F0aW9uKG1zZy0+bGNoYW4sIHJsbGgtPmxpbmtfaWQsIEJTQ19STExSX0lORF9FUlJfSU5EKTsKKworCWlmIChybG1fY2F1c2VbMV0gPT0gUkxMX0NBVVNFX1QyMDBfRVhQSVJFRCkKKwkJcmV0dXJuIHJzbF9yZl9jaGFuX3JlbGVhc2UobXNnLT5sY2hhbik7CisKKwlyZXR1cm4gMDsKK30KKworLyoJRVNUQUJMSVNIIElORElDQVRJT04sIExPQ0FUSU9OIEFSRUEgVVBEQVRFIFJFUVVFU1QgCisJMHgwMiwgMHgwNiwKKwkweDAxLCAweDIwLAorCTB4MDIsIDB4MDAsCisJMHgwYiwgMHgwMCwgMHgwZiwgMHgwNSwgMHgwOCwgLi4uICovCisKK3N0YXRpYyBpbnQgYWJpc19yc2xfcnhfcmxsKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX3JsbF9oZHIgKnJsbGggPSBtc2diX2wyKG1zZyk7CisJaW50IHJjID0gMDsKKwljaGFyICp0c19uYW1lOworCXVfaW50OF90IHNhcGkgPSBybGxoLT5saW5rX2lkICYgNzsKKworCW1zZy0+bGNoYW4gPSBsY2hhbl9sb29rdXAobXNnLT50cngsIHJsbGgtPmNoYW5fbnIpOworCXRzX25hbWUgPSBnc21fbGNoYW5fbmFtZShtc2ctPmxjaGFuKTsKKwlERUJVR1AoRFJMTCwgIiVzIFNBUEk9JXUgIiwgdHNfbmFtZSwgc2FwaSk7CisJCisJc3dpdGNoIChybGxoLT5jLm1zZ190eXBlKSB7CisJY2FzZSBSU0xfTVRfREFUQV9JTkQ6CisJCURFQlVHUEMoRFJMTCwgIkRBVEEgSU5ESUNBVElPTlxuIik7CisJCWlmIChtc2diX2wybGVuKG1zZykgPiAKKwkJICAgIHNpemVvZihzdHJ1Y3QgYWJpc19yc2xfY29tbW9uX2hkcikgKyBzaXplb2YoKnJsbGgpICYmCisJCSAgICBybGxoLT5kYXRhWzBdID09IFJTTF9JRV9MM19JTkZPKSB7CisJCQltc2ctPmwzaCA9ICZybGxoLT5kYXRhWzNdOworCQkJcmV0dXJuIGdzbTA0MDhfcmN2bXNnKG1zZywgcmxsaC0+bGlua19pZCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfRVNUX0lORDoKKwkJREVCVUdQQyhEUkxMLCAiRVNUQUJMSVNIIElORElDQVRJT05cbiIpOworCQkvKiBsY2hhbiBpcyBlc3RhYmxpc2hlZCwgc3RvcCBUMzEwMSAqLworCQltc2ctPmxjaGFuLT5zYXBpc1tybGxoLT5saW5rX2lkICYgMHg3XSA9IExDSEFOX1NBUElfTVM7CisJCWJzY19kZWxfdGltZXIoJm1zZy0+bGNoYW4tPlQzMTAxKTsKKwkJaWYgKG1zZ2JfbDJsZW4obXNnKSA+IAorCQkgICAgc2l6ZW9mKHN0cnVjdCBhYmlzX3JzbF9jb21tb25faGRyKSArIHNpemVvZigqcmxsaCkgJiYKKwkJICAgIHJsbGgtPmRhdGFbMF0gPT0gUlNMX0lFX0wzX0lORk8pIHsKKwkJCW1zZy0+bDNoID0gJnJsbGgtPmRhdGFbM107CisJCQlyZXR1cm4gZ3NtMDQwOF9yY3Ztc2cobXNnLCBybGxoLT5saW5rX2lkKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFJTTF9NVF9FU1RfQ09ORjoKKwkJREVCVUdQQyhEUkxMLCAiRVNUQUJMSVNIIENPTkZJUk1cbiIpOworCQltc2ctPmxjaGFuLT5zYXBpc1tybGxoLT5saW5rX2lkICYgMHg3XSA9IExDSEFOX1NBUElfTkVUOworCQlybGxfaW5kaWNhdGlvbihtc2ctPmxjaGFuLCBybGxoLT5saW5rX2lkLAorCQkJCSAgQlNDX1JMTFJfSU5EX0VTVF9DT05GKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfUkVMX0lORDoKKwkJLyogQlRTIGluZm9ybXMgdXMgb2YgaGF2aW5nIHJlY2VpdmVkICBESVNDIGZyb20gTVMgKi8KKwkJREVCVUdQQyhEUkxMLCAiUkVMRUFTRSBJTkRJQ0FUSU9OXG4iKTsKKwkJbXNnLT5sY2hhbi0+c2FwaXNbcmxsaC0+bGlua19pZCAmIDB4N10gPSBMQ0hBTl9TQVBJX1VOVVNFRDsKKwkJcmxsX2luZGljYXRpb24obXNnLT5sY2hhbiwgcmxsaC0+bGlua19pZCwKKwkJCQkgIEJTQ19STExSX0lORF9SRUxfSU5EKTsKKwkJLyogd2UgY2FuIG5vdyByZWxlYWUgdGhlIGNoYW5uZWwgb24gdGhlIEJUUy9BYmlzIHNpZGUgKi8KKwkJLyogRklYTUU6IG9mZmljaWFsbHkgd2UgbmVlZCB0byBzdGFydCBUMzExMSBhbmQgd2FpdCBmb3IKKwkJICogc29tZSBncmFjZSBwZXJpb2QgKi8KKwkJcnNsX3JmX2NoYW5fcmVsZWFzZShtc2ctPmxjaGFuKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfUkVMX0NPTkY6CisJCS8qIEJUUyBpbmZvcm1zIHVzIG9mIGhhdmluZyByZWNlaXZlZCBVQSBmcm9tIE1TLAorCQkgKiBpbiByZXNwb25zZSB0byBESVNDIHRoYXQgd2UndmUgc2VudCBlYXJsaWVyICovCisJCURFQlVHUEMoRFJMTCwgIlJFTEVBU0UgQ09ORklSTUFUSU9OXG4iKTsKKwkJbXNnLT5sY2hhbi0+c2FwaXNbcmxsaC0+bGlua19pZCAmIDB4N10gPSBMQ0hBTl9TQVBJX1VOVVNFRDsKKwkJLyogd2UgY2FuIG5vdyByZWxlYWUgdGhlIGNoYW5uZWwgb24gdGhlIEJUUy9BYmlzIHNpZGUgKi8KKwkJLyogRklYTUU6IG9mZmljaWFsbHkgd2UgbmVlZCB0byBzdGFydCBUMzExMSBhbmQgd2FpdCBmb3IKKwkJICogc29tZSBncmFjZSBwZXJpb2QgKi8KKwkJcnNsX3JmX2NoYW5fcmVsZWFzZShtc2ctPmxjaGFuKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfRVJST1JfSU5EOgorCQlyYyA9IHJzbF9yeF9ybGxfZXJyX2luZChtc2cpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9VTklUX0RBVEFfSU5EOgorCQlMT0dQKERSTEwsIExPR0xfTk9USUNFLCAidW5pbXBsZW1lbnRlZCBBYmlzIFJMTCBtZXNzYWdlICIKKwkJCSJ0eXBlIDB4JTAyeFxuIiwgcmxsaC0+Yy5tc2dfdHlwZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRFJMTCwgTE9HTF9OT1RJQ0UsICJ1bmtub3duIEFiaXMgUkxMIG1lc3NhZ2UgIgorCQkJInR5cGUgMHglMDJ4XG4iLCBybGxoLT5jLm1zZ190eXBlKTsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdV9pbnQ4X3QgaXBhX3Ntb2Rfc19mb3JfbGNoYW4oc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3dpdGNoIChsY2hhbi0+dGNoX21vZGUpIHsKKwljYXNlIEdTTTQ4X0NNT0RFX1NQRUVDSF9WMToKKwkJc3dpdGNoIChsY2hhbi0+dHlwZSkgeworCQljYXNlIEdTTV9MQ0hBTl9UQ0hfRjoKKwkJCXJldHVybiAweDAwOworCQljYXNlIEdTTV9MQ0hBTl9UQ0hfSDoKKwkJCXJldHVybiAweDAzOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwljYXNlIEdTTTQ4X0NNT0RFX1NQRUVDSF9FRlI6CisJCXN3aXRjaCAobGNoYW4tPnR5cGUpIHsKKwkJY2FzZSBHU01fTENIQU5fVENIX0Y6CisJCQlyZXR1cm4gMHgwMTsKKwkJLyogdGhlcmUncyBubyBoYWxmLXJhdGUgRUZSICovCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCWNhc2UgR1NNNDhfQ01PREVfU1BFRUNIX0FNUjoKKwkJc3dpdGNoIChsY2hhbi0+dHlwZSkgeworCQljYXNlIEdTTV9MQ0hBTl9UQ0hfRjoKKwkJCXJldHVybiAweDAyOworCQljYXNlIEdTTV9MQ0hBTl9UQ0hfSDoKKwkJCXJldHVybiAweDA1OworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiQ2Fubm90IGRldGVybWluZSBpcC5hY2Nlc3Mgc3BlZWNoIG1vZGUgZm9yICIKKwkJInRjaF9tb2RlID09IDB4JTAyeFxuIiwgbGNoYW4tPnRjaF9tb2RlKTsKKwlyZXR1cm4gMDsKK30KKworLyogaXAuYWNjZXNzIHNwZWNpZmljIFJTTCBleHRlbnNpb25zICovCitzdGF0aWMgdm9pZCBpcGFjX3BhcnNlX3J0cChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgc3RydWN0IHRsdl9wYXJzZWQgKnR2KQoreworCXN0cnVjdCBpbl9hZGRyIGlwOworCXVfaW50MTZfdCBwb3J0LCBjb25uX2lkOworCisJaWYgKFRMVlBfUFJFU0VOVCh0diwgUlNMX0lFX0lQQUNfTE9DQUxfSVApKSB7CisJCWlwLnNfYWRkciA9ICooKHVfaW50MzJfdCAqKSBUTFZQX1ZBTCh0diwgUlNMX0lFX0lQQUNfTE9DQUxfSVApKTsKKwkJREVCVUdQQyhEUlNMLCAiTE9DQUxfSVA9JXMgIiwgaW5ldF9udG9hKGlwKSk7CisJCWxjaGFuLT5hYmlzX2lwLmJvdW5kX2lwID0gbnRvaGwoaXAuc19hZGRyKTsKKwl9CisKKwlpZiAoVExWUF9QUkVTRU5UKHR2LCBSU0xfSUVfSVBBQ19MT0NBTF9QT1JUKSkgeworCQlwb3J0ID0gKigodV9pbnQxNl90ICopIFRMVlBfVkFMKHR2LCBSU0xfSUVfSVBBQ19MT0NBTF9QT1JUKSk7CisJCXBvcnQgPSBudG9ocyhwb3J0KTsKKwkJREVCVUdQQyhEUlNMLCAiTE9DQUxfUE9SVD0ldSAiLCBwb3J0KTsKKwkJbGNoYW4tPmFiaXNfaXAuYm91bmRfcG9ydCA9IHBvcnQ7CisJfQorCisJaWYgKFRMVlBfUFJFU0VOVCh0diwgUlNMX0lFX0lQQUNfQ09OTl9JRCkpIHsKKwkJY29ubl9pZCA9ICooKHVfaW50MTZfdCAqKSBUTFZQX1ZBTCh0diwgUlNMX0lFX0lQQUNfQ09OTl9JRCkpOworCQljb25uX2lkID0gbnRvaHMoY29ubl9pZCk7CisJCURFQlVHUEMoRFJTTCwgIkNPTl9JRD0ldSAiLCBjb25uX2lkKTsKKwkJbGNoYW4tPmFiaXNfaXAuY29ubl9pZCA9IGNvbm5faWQ7CisJfQorCisJaWYgKFRMVlBfUFJFU0VOVCh0diwgUlNMX0lFX0lQQUNfUlRQX1BBWUxPQUQyKSkgeworCQlsY2hhbi0+YWJpc19pcC5ydHBfcGF5bG9hZDIgPQorCQkJCSpUTFZQX1ZBTCh0diwgUlNMX0lFX0lQQUNfUlRQX1BBWUxPQUQyKTsKKwkJREVCVUdQQyhEUlNMLCAiUlRQX1BBWUxPQUQyPTB4JTAyeCAiLAorCQkJbGNoYW4tPmFiaXNfaXAucnRwX3BheWxvYWQyKTsKKwl9CisKKwlpZiAoVExWUF9QUkVTRU5UKHR2LCBSU0xfSUVfSVBBQ19TUEVFQ0hfTU9ERSkpIHsKKwkJbGNoYW4tPmFiaXNfaXAuc3BlZWNoX21vZGUgPQorCQkJCSpUTFZQX1ZBTCh0diwgUlNMX0lFX0lQQUNfU1BFRUNIX01PREUpOworCQlERUJVR1BDKERSU0wsICJzcGVlY2hfbW9kZT0weCUwMnggIiwKKwkJCWxjaGFuLT5hYmlzX2lwLnNwZWVjaF9tb2RlKTsKKwl9CisKKwlpZiAoVExWUF9QUkVTRU5UKHR2LCBSU0xfSUVfSVBBQ19SRU1PVEVfSVApKSB7CisJCWlwLnNfYWRkciA9ICooKHVfaW50MzJfdCAqKSBUTFZQX1ZBTCh0diwgUlNMX0lFX0lQQUNfUkVNT1RFX0lQKSk7CisJCURFQlVHUEMoRFJTTCwgIlJFTU9URV9JUD0lcyAiLCBpbmV0X250b2EoaXApKTsKKwkJbGNoYW4tPmFiaXNfaXAuY29ubmVjdF9pcCA9IG50b2hsKGlwLnNfYWRkcik7CisJfQorCisJaWYgKFRMVlBfUFJFU0VOVCh0diwgUlNMX0lFX0lQQUNfUkVNT1RFX1BPUlQpKSB7CisJCXBvcnQgPSAqKCh1X2ludDE2X3QgKikgVExWUF9WQUwodHYsIFJTTF9JRV9JUEFDX1JFTU9URV9QT1JUKSk7CisJCXBvcnQgPSBudG9ocyhwb3J0KTsKKwkJREVCVUdQQyhEUlNMLCAiUkVNT1RFX1BPUlQ9JXUgIiwgcG9ydCk7CisJCWxjaGFuLT5hYmlzX2lwLmNvbm5lY3RfcG9ydCA9IHBvcnQ7CisJfQorfQorCitpbnQgcnNsX2lwYWNjX2NyY3goc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IHJzbF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGg7CisKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpkaCkpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfSVBBQ19DUkNYKTsKKwlkaC0+Yy5tc2dfZGlzY3IgPSBBQklTX1JTTF9NRElTQ19JUEFDQ0VTUzsKKwlkaC0+Y2hhbl9uciA9IGxjaGFuMmNoYW5fbnIobGNoYW4pOworCisJLyogMHgxLSA9PSByZWNlaXZlLW9ubHksIDB4LTEgPT0gRUZSIGNvZGVjICovCisJbGNoYW4tPmFiaXNfaXAuc3BlZWNoX21vZGUgPSAweDEwIHwgaXBhX3Ntb2Rfc19mb3JfbGNoYW4obGNoYW4pOworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX0lQQUNfU1BFRUNIX01PREUsIGxjaGFuLT5hYmlzX2lwLnNwZWVjaF9tb2RlKTsKKworCURFQlVHUChEUlNMLCAiJXMgSVBBQ19CSU5EIHNwZWVjaF9tb2RlPTB4JTAyeFxuIiwKKwkJZ3NtX2xjaGFuX25hbWUobGNoYW4pLCBsY2hhbi0+YWJpc19pcC5zcGVlY2hfbW9kZSk7CisKKwltc2ctPnRyeCA9IGxjaGFuLT50cy0+dHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworaW50IHJzbF9pcGFjY19tZGN4KHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDMyX3QgaXAsIHVfaW50MTZfdCBwb3J0LAorCQkgICB1X2ludDhfdCBydHBfcGF5bG9hZDIpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IHJzbF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGg7CisJdV9pbnQzMl90ICphdHRfaXA7CisJc3RydWN0IGluX2FkZHIgaWE7CisKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpkaCkpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfSVBBQ19NRENYKTsKKwlkaC0+Yy5tc2dfZGlzY3IgPSBBQklTX1JTTF9NRElTQ19JUEFDQ0VTUzsKKwlkaC0+Y2hhbl9uciA9IGxjaGFuMmNoYW5fbnIobGNoYW4pOworCisJLyogd2UgbmVlZCB0byBzdG9yZSB0aGVzZSBub3cgYXMgTURDWF9BQ0sgZG9lcyBub3QgcmV0dXJuIHRoZW0gOiggKi8KKwlsY2hhbi0+YWJpc19pcC5ydHBfcGF5bG9hZDIgPSBydHBfcGF5bG9hZDI7CisJbGNoYW4tPmFiaXNfaXAuY29ubmVjdF9wb3J0ID0gcG9ydDsKKwlsY2hhbi0+YWJpc19pcC5jb25uZWN0X2lwID0gaXA7CisKKwkvKiAweDAtID09IGJvdGggZGlyZWN0aW9ucywgMHgtMSA9PSBFRlIgY29kZWMgKi8KKwlsY2hhbi0+YWJpc19pcC5zcGVlY2hfbW9kZSA9IDB4MDAgfCBpcGFfc21vZF9zX2Zvcl9sY2hhbihsY2hhbik7CisKKwlpYS5zX2FkZHIgPSBodG9ubChpcCk7CisJREVCVUdQKERSU0wsICIlcyBJUEFDX01EQ1ggSVA9JXMgUE9SVD0lZCBSVFBfUEFZTE9BRDI9JWQgQ09OTl9JRD0lZCAiCisJCSJzcGVlY2hfbW9kZT0weCUwMnhcbiIsIGdzbV9sY2hhbl9uYW1lKGxjaGFuKSwgaW5ldF9udG9hKGlhKSwgcG9ydCwKKwkJcnRwX3BheWxvYWQyLCBsY2hhbi0+YWJpc19pcC5jb25uX2lkLCBsY2hhbi0+YWJpc19pcC5zcGVlY2hfbW9kZSk7CisKKwltc2diX3R2MTZfcHV0KG1zZywgUlNMX0lFX0lQQUNfQ09OTl9JRCwgbGNoYW4tPmFiaXNfaXAuY29ubl9pZCk7CisJbXNnYl92X3B1dChtc2csIFJTTF9JRV9JUEFDX1JFTU9URV9JUCk7CisJYXR0X2lwID0gKHVfaW50MzJfdCAqKSBtc2diX3B1dChtc2csIHNpemVvZihpcCkpOworCSphdHRfaXAgPSBpYS5zX2FkZHI7CisJbXNnYl90djE2X3B1dChtc2csIFJTTF9JRV9JUEFDX1JFTU9URV9QT1JULCBwb3J0KTsKKwltc2diX3R2X3B1dChtc2csIFJTTF9JRV9JUEFDX1NQRUVDSF9NT0RFLCBsY2hhbi0+YWJpc19pcC5zcGVlY2hfbW9kZSk7CisJaWYgKHJ0cF9wYXlsb2FkMikKKwkJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfSVBBQ19SVFBfUEFZTE9BRDIsIHJ0cF9wYXlsb2FkMik7CisJCisJbXNnLT50cnggPSBsY2hhbi0+dHMtPnRyeDsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKKy8qIHRlbGwgQlRTIHRvIGNvbm5lY3QgUlRQIHN0cmVhbSB0byBvdXIgbG9jYWwgUlRQIHNvY2tldCAqLworaW50IHJzbF9pcGFjY19tZGN4X3RvX3J0cHNvY2soc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3RydWN0IHJ0cF9zb2NrZXQgKnJzID0gbGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldDsKKwlpbnQgcmM7CisKKwlyYyA9IHJzbF9pcGFjY19tZGN4KGxjaGFuLCBudG9obChycy0+cnRwLnNpbl9sb2NhbC5zaW5fYWRkci5zX2FkZHIpLAorCQkJCW50b2hzKHJzLT5ydHAuc2luX2xvY2FsLnNpbl9wb3J0KSwKKwkJCS8qIEZJWE1FOiB1c2UgUlRQIHBheWxvYWQgb2YgYm91bmQgc29ja2V0LCBub3QgQlRTKi8KKwkJCQlsY2hhbi0+YWJpc19pcC5ydHBfcGF5bG9hZDIpOworCisJcmV0dXJuIHJjOworfQorCitpbnQgcnNsX2lwYWNjX3BkY2hfYWN0aXZhdGUoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IHJzbF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGg7CisKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpkaCkpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfSVBBQ19QRENIX0FDVCk7CisJZGgtPmMubXNnX2Rpc2NyID0gQUJJU19SU0xfTURJU0NfREVEX0NIQU47CisJZGgtPmNoYW5fbnIgPSBsY2hhbjJjaGFuX25yKGxjaGFuKTsKKworCURFQlVHUChEUlNMLCAiJXMgSVBBQ19QRENIX0FDVFxuIiwgZ3NtX2xjaGFuX25hbWUobGNoYW4pKTsKKworCW1zZy0+dHJ4ID0gbGNoYW4tPnRzLT50cng7CisKKwlyZXR1cm4gYWJpc19yc2xfc2VuZG1zZyhtc2cpOworfQorCitzdGF0aWMgaW50IGFiaXNfcnNsX3J4X2lwYWNjX2NyY3hfYWNrKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGggPSBtc2diX2wyKG1zZyk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHY7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBtc2ctPmxjaGFuOworCisJLyogdGhlIEJUUyBoYXMgYWNrbm93bGVkZ2VkIGEgbG9jYWwgYmluZCwgaXQgbm93IHRlbGxzIHVzIHRoZSBJUAorCSogYWRkcmVzcyBhbmQgcG9ydCBudW1iZXIgdG8gd2hpY2ggaXQgaGFzIGJvdW5kIHRoZSBnaXZlbiBsb2dpY2FsCisJKiBjaGFubmVsICovCisKKwlyc2xfdGx2X3BhcnNlKCZ0diwgZGgtPmRhdGEsIG1zZ2JfbDJsZW4obXNnKS1zaXplb2YoKmRoKSk7CisJaWYgKCFUTFZQX1BSRVNFTlQoJnR2LCBSU0xfSUVfSVBBQ19MT0NBTF9QT1JUKSB8fAorCSAgICAhVExWUF9QUkVTRU5UKCZ0diwgUlNMX0lFX0lQQUNfTE9DQUxfSVApIHx8CisJICAgICFUTFZQX1BSRVNFTlQoJnR2LCBSU0xfSUVfSVBBQ19DT05OX0lEKSkgeworCQlMT0dQKERSU0wsIExPR0xfTk9USUNFLCAibWFuZGF0b3J5IElFIG1pc3NpbmciKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaXBhY19wYXJzZV9ydHAobGNoYW4sICZ0dik7CisKKwkvKiBpbiBjYXNlIHdlIGRvbid0IHVzZSBkaXJlY3QgQlRTLXRvLUJUUyBSVFAgKi8KKwlpZiAoIWlwYWNjX3J0cF9kaXJlY3QpIHsKKwkJaW50IHJjOworCQkvKiB0aGUgQlRTIGhhcyBzdWNjZXNzZnVsbHkgYm91bmQgYSBUQ0ggdG8gYSBsb2NhbCBpcC9wb3J0LAorCQkgKiB3aGljaCBtZWFucyB3ZSBjYW4gY29ubmVjdCBvdXIgVURQIHNvY2tldCB0byBpdCAqLworCQlpZiAobGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCkgeworCQkJcnRwX3NvY2tldF9mcmVlKGxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQpOworCQkJbGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCA9IE5VTEw7CisJCX0KKworCQlsY2hhbi0+YWJpc19pcC5ydHBfc29ja2V0ID0gcnRwX3NvY2tldF9jcmVhdGUoKTsKKwkJaWYgKCFsY2hhbi0+YWJpc19pcC5ydHBfc29ja2V0KQorCQkJZ290byBvdXRfZXJyOworCisJCXJjID0gcnRwX3NvY2tldF9jb25uZWN0KGxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQsCisJCQkJICAgbGNoYW4tPmFiaXNfaXAuYm91bmRfaXAsCisJCQkJICAgbGNoYW4tPmFiaXNfaXAuYm91bmRfcG9ydCk7CisJCWlmIChyYyA8IDApCisJCQlnb3RvIG91dF9lcnI7CisJfQorCisJZGlzcGF0Y2hfc2lnbmFsKFNTX0FCSVNJUCwgU19BQklTSVBfQ1JDWF9BQ0ssIG1zZy0+bGNoYW4pOworCisJcmV0dXJuIDA7CitvdXRfZXJyOgorCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgaW50IGFiaXNfcnNsX3J4X2lwYWNjX21kY3hfYWNrKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGggPSBtc2diX2wyKG1zZyk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHY7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBtc2ctPmxjaGFuOworCisJLyogdGhlIEJUUyBoYXMgYWNrbm93bGVkZ2VkIGEgcmVtb3RlIGNvbm5lY3QgcmVxdWVzdCBhbmQKKwkgKiBpdCBub3cgdGVsbHMgdXMgdGhlIElQIGFkZHJlc3MgYW5kIHBvcnQgbnVtYmVyIHRvIHdoaWNoIGl0IGhhcworCSAqIGNvbm5lY3RlZCB0aGUgZ2l2ZW4gbG9naWNhbCBjaGFubmVsICovCisKKwlyc2xfdGx2X3BhcnNlKCZ0diwgZGgtPmRhdGEsIG1zZ2JfbDJsZW4obXNnKS1zaXplb2YoKmRoKSk7CisJaXBhY19wYXJzZV9ydHAobGNoYW4sICZ0dik7CisJZGlzcGF0Y2hfc2lnbmFsKFNTX0FCSVNJUCwgU19BQklTSVBfTURDWF9BQ0ssIG1zZy0+bGNoYW4pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWJpc19yc2xfcnhfaXBhY2NfZGxjeF9pbmQoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaCA9IG1zZ2JfbDIobXNnKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0djsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IG1zZy0+bGNoYW47CisKKwlyc2xfdGx2X3BhcnNlKCZ0diwgZGgtPmRhdGEsIG1zZ2JfbDJsZW4obXNnKS1zaXplb2YoKmRoKSk7CisKKwlpZiAoVExWUF9QUkVTRU5UKCZ0diwgUlNMX0lFX0NBVVNFKSkKKwkJcHJpbnRfcnNsX2NhdXNlKExPR0xfREVCVUcsIFRMVlBfVkFMKCZ0diwgUlNMX0lFX0NBVVNFKSwKKwkJCQlUTFZQX0xFTigmdHYsIFJTTF9JRV9DQVVTRSkpOworCisJLyogdGhlIEJUUyB0ZWxscyB1cyBhIFJUUCBzdHJlYW0gaGFzIGJlZW4gZGlzY29ubmVjdGVkICovCisJaWYgKGxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQpIHsKKwkJcnRwX3NvY2tldF9mcmVlKGxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQpOworCQlsY2hhbi0+YWJpc19pcC5ydHBfc29ja2V0ID0gTlVMTDsKKwl9CisKKwlkaXNwYXRjaF9zaWduYWwoU1NfQUJJU0lQLCBTX0FCSVNJUF9ETENYX0lORCwgbXNnLT5sY2hhbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhYmlzX3JzbF9yeF9pcGFjYyhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX3JzbF9ybGxfaGRyICpybGxoID0gbXNnYl9sMihtc2cpOworCWNoYXIgKnRzX25hbWU7CisJaW50IHJjID0gMDsKKworCW1zZy0+bGNoYW4gPSBsY2hhbl9sb29rdXAobXNnLT50cngsIHJsbGgtPmNoYW5fbnIpOworCXRzX25hbWUgPSBnc21fbGNoYW5fbmFtZShtc2ctPmxjaGFuKTsKKwkKKwlzd2l0Y2ggKHJsbGgtPmMubXNnX3R5cGUpIHsKKwljYXNlIFJTTF9NVF9JUEFDX0NSQ1hfQUNLOgorCQlERUJVR1AoRFJTTCwgIiVzIElQQUNfQ1JDWF9BQ0sgIiwgdHNfbmFtZSk7CisJCXJjID0gYWJpc19yc2xfcnhfaXBhY2NfY3JjeF9hY2sobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfSVBBQ19DUkNYX05BQ0s6CisJCS8qIHNvbWVob3cgdGhlIEJUUyB3YXMgdW5hYmxlIHRvIGJpbmQgdGhlIGxjaGFuIHRvIGl0cyBsb2NhbAorCQkgKiBwb3J0PyE/ICovCisJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgIiVzIElQQUNfQ1JDWF9OQUNLXG4iLCB0c19uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfSVBBQ19NRENYX0FDSzoKKwkJLyogdGhlIEJUUyB0ZWxscyB1cyB0aGF0IGEgY29ubmVjdCBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwgKi8KKwkJREVCVUdQKERSU0wsICIlcyBJUEFDX01EQ1hfQUNLICIsIHRzX25hbWUpOworCQlyYyA9IGFiaXNfcnNsX3J4X2lwYWNjX21kY3hfYWNrKG1zZyk7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX0lQQUNfTURDWF9OQUNLOgorCQkvKiBzb21laG93IHRoZSBCVFMgd2FzIHVuYWJsZSB0byBjb25uZWN0IHRoZSBsY2hhbiB0byBhIHJlbW90ZQorCQkgKiBwb3J0ICovCisJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgIiVzIElQQUNfTURDWF9OQUNLXG4iLCB0c19uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfSVBBQ19ETENYX0lORDoKKwkJREVCVUdQKERSU0wsICIlcyBJUEFDX0RMQ1hfSU5EICIsIHRzX25hbWUpOworCQlyYyA9IGFiaXNfcnNsX3J4X2lwYWNjX2RsY3hfaW5kKG1zZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICJVbmtub3duIGlwLmFjY2VzcyBtc2dfdHlwZSAweCUwMnhcbiIsCisJCQlybGxoLT5jLm1zZ190eXBlKTsKKwkJYnJlYWs7CisJfQorCURFQlVHUEMoRFJTTCwgIlxuIik7CisKKwlyZXR1cm4gcmM7Cit9CisKKworLyogRW50cnktcG9pbnQgd2hlcmUgTDIgUlNMIGZyb20gQlRTIGVudGVycyAqLworaW50IGFiaXNfcnNsX3Jjdm1zZyhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX3JzbF9jb21tb25faGRyICpyc2xoID0gbXNnYl9sMihtc2cpCTsKKwlpbnQgcmMgPSAwOworCisJc3dpdGNoIChyc2xoLT5tc2dfZGlzY3IgJiAweGZlKSB7CisJY2FzZSBBQklTX1JTTF9NRElTQ19STEw6CisJCXJjID0gYWJpc19yc2xfcnhfcmxsKG1zZyk7CisJCWJyZWFrOworCWNhc2UgQUJJU19SU0xfTURJU0NfREVEX0NIQU46CisJCXJjID0gYWJpc19yc2xfcnhfZGNoYW4obXNnKTsKKwkJYnJlYWs7CisJY2FzZSBBQklTX1JTTF9NRElTQ19DT01fQ0hBTjoKKwkJcmMgPSBhYmlzX3JzbF9yeF9jY2hhbihtc2cpOworCQlicmVhazsKKwljYXNlIEFCSVNfUlNMX01ESVNDX1RSWDoKKwkJcmMgPSBhYmlzX3JzbF9yeF90cngobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBBQklTX1JTTF9NRElTQ19MT0M6CisJCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICJ1bmltcGxlbWVudGVkIFJTTCBtc2cgZGlzYyAweCUwMnhcbiIsCisJCQlyc2xoLT5tc2dfZGlzY3IpOworCQlicmVhazsKKwljYXNlIEFCSVNfUlNMX01ESVNDX0lQQUNDRVNTOgorCQlyYyA9IGFiaXNfcnNsX3J4X2lwYWNjKG1zZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICJ1bmtub3duIFJTTCBtZXNzYWdlIGRpc2NyaW1pbmF0b3IgIgorCQkJIjB4JTAyeFxuIiwgcnNsaC0+bXNnX2Rpc2NyKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW1zZ2JfZnJlZShtc2cpOworCXJldHVybiByYzsKK30KKworLyogRnJvbSBUYWJsZSAxMC41LjMzIG9mIEdTTSAwNC4wOCAqLworaW50IHJzbF9udW1iZXJfb2ZfcGFnaW5nX3N1YmNoYW5uZWxzKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJaWYgKGJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYy5jY2NoX2NvbmYgPT0gUlNMX0JDQ0hfQ0NDSF9DT05GXzFfQykgeworCQlyZXR1cm4gTUFYKDEsICgzIC0gYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjLmJzX2FnX2Jsa3NfcmVzKSkKKwkJCSogKGJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYy5ic19wYV9tZnJtcyArIDIpOworCX0gZWxzZSB7CisJCXJldHVybiAoOSAtIGJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYy5ic19hZ19ibGtzX3JlcykKKwkJCSogKGJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYy5ic19wYV9tZnJtcyArIDIpOworCX0KK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2JzMTFfY29uZmlnLmMgYi9vcGVuYnNjL3NyYy9iczExX2NvbmZpZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZjliYTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9iczExX2NvbmZpZy5jCkBAIC0wLDAgKzEsODcyIEBACisvKiBTaWVtZW5zIEJTLTExIG1pY3JvQlRTIGNvbmZpZ3VyYXRpb24gdG9vbCAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYmFzZWQgb24gaWRlYXMgKGJ1dCBub3QgY29kZSkgb2YgQlMxMUNvbmZpZyAKKyAqIChDKSAyMDA5IGJ5IERpZXRlciBTcGFhciA8c3BhYXJAbWlyaWRlci5hdWd1c3RhLmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX25tLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3JzMjMyLmg+CisKKy8qIHN0YXRlIG9mIG91ciBiczExX2NvbmZpZyBhcHBsaWNhdGlvbiAqLworZW51bSBiczExY2ZnX3N0YXRlIHsKKwlTVEFURV9OT05FLAorCVNUQVRFX0xPR09OX1dBSVQsCisJU1RBVEVfTE9HT05fQUNLLAorCVNUQVRFX1NXTE9BRCwKKwlTVEFURV9RVUVSWSwKK307CitzdGF0aWMgZW51bSBiczExY2ZnX3N0YXRlIGJzMTFjZmdfc3RhdGUgPSBTVEFURV9OT05FOworc3RhdGljIGNoYXIgKmNvbW1hbmQsICp2YWx1ZTsKK3N0cnVjdCB0aW1lcl9saXN0IHN0YXR1c190aW1lcjsKKworc3RhdGljIGNvbnN0IHVfaW50OF90IG9ial9saV9hdHRyW10gPSB7IAorCU5NX0FUVF9CUzExX0JJVF9FUlJfVEhFU0gsIDB4MDksIDB4MDAsCisJTk1fQVRUX0JTMTFfTDFfUFJPVF9UWVBFLCAweDAwLCAKKwlOTV9BVFRfQlMxMV9MSU5FX0NGRywgMHgwMCwKK307CitzdGF0aWMgY29uc3QgdV9pbnQ4X3Qgb2JqX2Jic2lnMF9hdHRyW10gPSB7CisJTk1fQVRUX0JTMTFfUlNTSV9PRkZTLCAweDAyLCAweDAwLCAweDAwLAorCU5NX0FUVF9CUzExX0RJVkVSU0lUWSwgMHgwMSwgMHgwMCwKK307CitzdGF0aWMgY29uc3QgdV9pbnQ4X3Qgb2JqX3BhMF9hdHRyW10gPSB7CisJTk1fQVRUX0JTMTFfVFhQV1IsIDB4MDEsIEJTMTFfVFJYX1BPV0VSX0dTTV8zMG1XLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICp0cngxX3Bhc3N3b3JkID0gIjExMTExMTExMTEiOworI2RlZmluZSBURUlfT01MCTI1CisKK3N0YXRpYyBjb25zdCB1X2ludDhfdCB0b29fZmFzdFtdID0geyAweDEyLCAweDgwLCAweDAwLCAweDAwLCAweDAyLCAweDAyIH07CisKK3N0YXRpYyBzdHJ1Y3QgZGVidWdfdGFyZ2V0ICpzdGRlcnJfdGFyZ2V0OworCisvKiBkdW1teSBmdW5jdGlvbiB0byBrZWVwIGdzbV9kYXRhLmMgaGFwcHkgKi8KK3N0cnVjdCBjb3VudGVyICpjb3VudGVyX2FsbG9jKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBoYW5kbGVfc2VyaWFsX21zZyhzdHJ1Y3QgbXNnYiAqcnhfbXNnKTsKKworLyogY3JlYXRlIGFsbCBvYmplY3RzIGZvciBhbiBpbml0aWFsIGNvbmZpZ3VyYXRpb24gKi8KK3N0YXRpYyBpbnQgY3JlYXRlX29iamVjdHMoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlmcHJpbnRmKHN0ZG91dCwgIkNyYXRpbmcgT2JqZWN0cyBmb3IgbWluaW1hbCBjb25maWdcbiIpOworCWFiaXNfbm1fYnMxMV9jcmVhdGVfb2JqZWN0KGJ0cywgQlMxMV9PQkpfTEksIDAsIHNpemVvZihvYmpfbGlfYXR0ciksCisJCQkJICAgb2JqX2xpX2F0dHIpOworCWFiaXNfbm1fYnMxMV9jcmVhdGVfb2JqZWN0KGJ0cywgQlMxMV9PQkpfR1BTVSwgMCwgMCwgTlVMTCk7CisJYWJpc19ubV9iczExX2NyZWF0ZV9vYmplY3QoYnRzLCBCUzExX09CSl9BTENPLCAwLCAwLCBOVUxMKTsKKwlhYmlzX25tX2JzMTFfY3JlYXRlX29iamVjdChidHMsIEJTMTFfT0JKX0NDTEssIDAsIDAsIE5VTEwpOworCWFiaXNfbm1fYnMxMV9jcmVhdGVfb2JqZWN0KGJ0cywgQlMxMV9PQkpfQkJTSUcsIDAsCisJCQkJICAgc2l6ZW9mKG9ial9iYnNpZzBfYXR0ciksIG9ial9iYnNpZzBfYXR0cik7CisJYWJpc19ubV9iczExX2NyZWF0ZV9vYmplY3QoYnRzLCBCUzExX09CSl9QQSwgMCwKKwkJCQkgICBzaXplb2Yob2JqX3BhMF9hdHRyKSwgb2JqX3BhMF9hdHRyKTsKKwlhYmlzX25tX2JzMTFfY3JlYXRlX2VudmFCVFNFKGJ0cywgMCk7CisJYWJpc19ubV9iczExX2NyZWF0ZV9lbnZhQlRTRShidHMsIDEpOworCWFiaXNfbm1fYnMxMV9jcmVhdGVfZW52YUJUU0UoYnRzLCAyKTsKKwlhYmlzX25tX2JzMTFfY3JlYXRlX2VudmFCVFNFKGJ0cywgMyk7CisKKwlhYmlzX25tX2JzMTFfY29ubl9vbWxfdGVpKGJ0cywgMCwgMSwgMHhmZiwgVEVJX09NTCk7CisKKwlhYmlzX25tX2JzMTFfc2V0X3RyeF9wb3dlcihidHMtPmMwLCBCUzExX1RSWF9QT1dFUl9HU01fMzBtVyk7CisJCisJc2xlZXAoMSk7CisKKwlhYmlzX25tX2JzMTFfc2V0X3RyeDFfcHcoYnRzLCB0cngxX3Bhc3N3b3JkKTsKKworCXNsZWVwKDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3JlYXRlX3RyeDEoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwl1X2ludDhfdCBiYnNpZzFfYXR0cltzaXplb2Yob2JqX2Jic2lnMF9hdHRyKSsxMl07CisJdV9pbnQ4X3QgKmN1ciA9IGJic2lnMV9hdHRyOworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgMSk7CisKKwlpZiAoIXRyeCkKKwkJdHJ4ID0gZ3NtX2J0c190cnhfYWxsb2MoYnRzKTsKKworCWZwcmludGYoc3Rkb3V0LCAiQ3JhdGluZyBPYmplY3RzIGZvciBUUlgxXG4iKTsKKworCWFiaXNfbm1fYnMxMV9zZXRfdHJ4MV9wdyhidHMsIHRyeDFfcGFzc3dvcmQpOworCisJc2xlZXAoMSk7CisKKwljdXIgPSB0bHZfcHV0KGN1ciwgTk1fQVRUX0JTMTFfUEFTU1dPUkQsIDEwLAorCQkgICAgICAodV9pbnQ4X3QgKil0cngxX3Bhc3N3b3JkKTsKKwltZW1jcHkoY3VyLCBvYmpfYmJzaWcwX2F0dHIsIHNpemVvZihvYmpfYmJzaWcwX2F0dHIpKTsKKwlhYmlzX25tX2JzMTFfY3JlYXRlX29iamVjdChidHMsIEJTMTFfT0JKX0JCU0lHLCAxLAorCQkJCSAgIHNpemVvZihiYnNpZzFfYXR0ciksIGJic2lnMV9hdHRyKTsKKwlhYmlzX25tX2JzMTFfY3JlYXRlX29iamVjdChidHMsIEJTMTFfT0JKX1BBLCAxLAorCQkJCSAgIHNpemVvZihvYmpfcGEwX2F0dHIpLCBvYmpfcGEwX2F0dHIpOworCWFiaXNfbm1fYnMxMV9zZXRfdHJ4X3Bvd2VyKHRyeCwgQlMxMV9UUlhfUE9XRVJfR1NNXzMwbVcpOworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgY2hhciAqc2VyaWFsX3BvcnQgPSAiL2Rldi90dHlVU0IwIjsKK3N0YXRpYyBjaGFyICpmbmFtZV9zYWZldHkgPSAiQlRTQk1DNzYuU1dJIjsKK3N0YXRpYyBjaGFyICpmbmFtZV9zb2Z0d2FyZSA9ICJIUzAxMTEwNi5TV0wiOworc3RhdGljIGludCBkZWxheV9tcyA9IDA7CitzdGF0aWMgaW50IHdpbl9zaXplID0gODsKK3N0YXRpYyBpbnQgcGFyYW1fZGlzY29ubmVjdCA9IDA7CitzdGF0aWMgaW50IHBhcmFtX3Jlc3RhcnQgPSAwOworc3RhdGljIGludCBwYXJhbV9mb3JjZWQgPSAwOworc3RhdGljIHN0cnVjdCBnc21fYnRzICpnX2J0czsKKworc3RhdGljIGludCBmaWxlX2lzX3JlYWRhYmxlKGNvbnN0IGNoYXIgKmZuYW1lKQoreworCWludCByYzsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCXJjID0gc3RhdChmbmFtZSwgJnN0KTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gMDsKKworCWlmIChTX0lTUkVHKHN0LnN0X21vZGUpICYmIChzdC5zdF9tb2RlICYgU19JUlVTUikpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGVyY2VudDsKK3N0YXRpYyBpbnQgcGVyY2VudF9vbGQ7CisKKy8qIGNhbGxiYWNrIGZ1bmN0aW9uIHBhc3NlZCB0byB0aGUgQUJJUyBPTUwgY29kZSAqLworc3RhdGljIGludCBzd2xvYWRfY2Jmbih1bnNpZ25lZCBpbnQgaG9vaywgdW5zaWduZWQgaW50IGV2ZW50LCBzdHJ1Y3QgbXNnYiAqbXNnLAorCQkgICAgICAgdm9pZCAqZGF0YSwgdm9pZCAqcGFyYW0pCit7CisJaWYgKGhvb2sgIT0gR1NNX0hPT0tfTk1fU1dMT0FEKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIE5NX01UX0xPQURfSU5JVF9BQ0s6CisJCWZwcmludGYoc3Rkb3V0LCAiU29mdHdhcmUgTG9hZCBJbml0aWF0ZSBBQ0tcbiIpOworCQlicmVhazsKKwljYXNlIE5NX01UX0xPQURfSU5JVF9OQUNLOgorCQlmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBTb2Z0d2FyZSBMb2FkIEluaXRpYXRlIE5BQ0tcbiIpOworCQlleGl0KDUpOworCQlicmVhazsKKwljYXNlIE5NX01UX0xPQURfRU5EX0FDSzoKKwkJaWYgKGRhdGEpIHsKKwkJCS8qIHdlIGRpZCBhIHNhZmV0eSBsb2FkIGFuZCBtdXN0IGFjdGl2YXRlIGl0ICovCisJCQlhYmlzX25tX3NvZnR3YXJlX2FjdGl2YXRlKGdfYnRzLCBmbmFtZV9zYWZldHksCisJCQkJCQkgIHN3bG9hZF9jYmZuLCBnX2J0cyk7CisJCQlzbGVlcCg1KTsKKwkJfQorCQlicmVhazsKKwljYXNlIE5NX01UX0xPQURfRU5EX05BQ0s6CisJCWZwcmludGYoc3RkZXJyLCAiRVJST1I6IFNvZnR3YXJlIExvYWQgRW5kIE5BQ0tcbiIpOworCQlleGl0KDMpOworCQlicmVhazsKKwljYXNlIE5NX01UX0FDVElWQVRFX1NXX05BQ0s6CisJCWZwcmludGYoc3RkZXJyLCAiRVJST1I6IEFjdGl2YXRlIFNvZnR3YXJlIE5BQ0tcbiIpOworCQlleGl0KDQpOworCQlicmVhazsKKwljYXNlIE5NX01UX0FDVElWQVRFX1NXX0FDSzoKKwkJYnMxMWNmZ19zdGF0ZSA9IFNUQVRFX05PTkU7CisJCQorCQlicmVhazsKKwljYXNlIE5NX01UX0xPQURfU0VHX0FDSzoKKwkJcGVyY2VudCA9IGFiaXNfbm1fc29mdHdhcmVfbG9hZF9zdGF0dXMoZ19idHMpOworCQlpZiAocGVyY2VudCA+IHBlcmNlbnRfb2xkKQorCQkJcHJpbnRmKCJTb2Z0d2FyZSBEb3dubG9hZCBQcm9ncmVzczogJWQlJVxuIiwgcGVyY2VudCk7CisJCXBlcmNlbnRfb2xkID0gcGVyY2VudDsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqYnMxMV9saW5rX3N0YXRlW10gPSB7CisJWzB4MDBdCT0gIkRvd24iLAorCVsweDAxXQk9ICJVcCIsCisJWzB4MDJdCT0gIlJlc3RvcmluZyIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqbGlua3N0YXRlX25hbWUodV9pbnQ4X3QgbGlua3N0YXRlKQoreworCWlmIChsaW5rc3RhdGUgPiBBUlJBWV9TSVpFKGJzMTFfbGlua19zdGF0ZSkpCisJCXJldHVybiAiVW5rbm93biI7CisKKwlyZXR1cm4gYnMxMV9saW5rX3N0YXRlW2xpbmtzdGF0ZV07Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICptYmNjdV9sb2FkW10gPSB7CisJWzBdCT0gIk5vIExvYWQiLAorCVsxXQk9ICJMb2FkIEJUU0NBQyIsCisJWzJdCT0gIkxvYWQgQlRTRFJYIiwKKwlbM10JPSAiTG9hZCBCVFNCQlgiLAorCVs0XQk9ICJMb2FkIEJUU0FSQyIsCisJWzVdCT0gIkxvYWQiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKm1iY2N1X2xvYWRfbmFtZSh1X2ludDhfdCBsaW5rc3RhdGUpCit7CisJaWYgKGxpbmtzdGF0ZSA+IEFSUkFZX1NJWkUobWJjY3VfbG9hZCkpCisJCXJldHVybiAiVW5rbm93biI7CisKKwlyZXR1cm4gbWJjY3VfbG9hZFtsaW5rc3RhdGVdOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqYnRzX3BoYXNlX25hbWUodV9pbnQ4X3QgcGhhc2UpCit7CisJc3dpdGNoIChwaGFzZSkgeworCWNhc2UgQlMxMV9TVEFURV9XQVJNX1VQOgorCWNhc2UgQlMxMV9TVEFURV9XQVJNX1VQXzI6CisJCXJldHVybiAiV2FybSBVcCI7CisJCWJyZWFrOworCWNhc2UgQlMxMV9TVEFURV9MT0FEX1NNVV9TQUZFVFk6CisJCXJldHVybiAiTG9hZCBTTVUgU2FmZXR5IjsKKwkJYnJlYWs7CisJY2FzZSBCUzExX1NUQVRFX0xPQURfU01VX0lOVEVOREVEOgorCQlyZXR1cm4gIkxvYWQgU01VIEludGVuZGVkIjsKKwkJYnJlYWs7CisJY2FzZSBCUzExX1NUQVRFX0xPQURfTUJDQ1U6CisJCXJldHVybiAiTG9hZCBNQkNDVSI7CisJCWJyZWFrOworCWNhc2UgQlMxMV9TVEFURV9TT0ZUV0FSRV9SUUQ6CisJCXJldHVybiAiU29mdHdhcmUgcmVxdWlyZWQiOworCQlicmVhazsKKwljYXNlIEJTMTFfU1RBVEVfV0FJVF9NSU5fQ0ZHOgorCWNhc2UgQlMxMV9TVEFURV9XQUlUX01JTl9DRkdfMjoKKwkJcmV0dXJuICJXYWl0IG1pbmltYWwgY29uZmlnIjsKKwkJYnJlYWs7CisJY2FzZSBCUzExX1NUQVRFX01BSU5URU5BTkNFOgorCQlyZXR1cm4gIk1haW50ZW5hbmNlIjsKKwkJYnJlYWs7CisJY2FzZSBCUzExX1NUQVRFX05PUk1BTDoKKwkJcmV0dXJuICJOb3JtYWwiOworCQlicmVhazsKKwljYXNlIEJTMTFfU1RBVEVfQUJJU19MT0FEOgorCQlyZXR1cm4gIkFiaXMgbG9hZCI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAiVW5rbm93biI7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnRyeF9wb3dlcl9uYW1lKHVfaW50OF90IHB3cikKK3sKKwlzd2l0Y2ggKHB3cikgeworCWNhc2UgQlMxMV9UUlhfUE9XRVJfR1NNXzJXOgkKKwkJcmV0dXJuICIyVyAoR1NNKSI7CisJY2FzZSBCUzExX1RSWF9QT1dFUl9HU01fMjUwbVc6CisJCXJldHVybiAiMjUwbVcgKEdTTSkiOworCWNhc2UgQlMxMV9UUlhfUE9XRVJfR1NNXzgwbVc6CisJCXJldHVybiAiODBtVyAoR1NNKSI7CisJY2FzZSBCUzExX1RSWF9QT1dFUl9HU01fMzBtVzoKKwkJcmV0dXJuICIzMG1XIChHU00pIjsKKwljYXNlIEJTMTFfVFJYX1BPV0VSX0RDU18zVzoKKwkJcmV0dXJuICIzVyAoRENTKSI7CisJY2FzZSBCUzExX1RSWF9QT1dFUl9EQ1NfMVc2OgorCQlyZXR1cm4gIjEuNlcgKERDUykiOworCWNhc2UgQlMxMV9UUlhfUE9XRVJfRENTXzUwMG1XOgorCQlyZXR1cm4gIjUwMG1XIChEQ1MpIjsKKwljYXNlIEJTMTFfVFJYX1BPV0VSX0RDU18xNjBtVzoKKwkJcmV0dXJuICIxNjBtVyAoRENTKSI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJ1bmtub3duIHZhbHVlIjsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpwbGxfbW9kZV9uYW1lKHVfaW50OF90IG1vZGUpCit7CisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBCUzExX0xJX1BMTF9MT0NLRUQ6CisJCXJldHVybiAiRTEgTG9ja2VkIjsKKwljYXNlIEJTMTFfTElfUExMX1NUQU5EQUxPTkU6CisJCXJldHVybiAiU3RhbmRhbG9uZSI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJ1bmtub3duIjsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpjY2xrX2FjY19uYW1lKHVfaW50OF90IGFjYykKK3sKKwlzd2l0Y2ggKGFjYykgeworCWNhc2UgMDoKKwkJLyogT3V0IG9mIHRoZSBkZW1hbmRlZCArLy0gMC4wNXBwbSAqLworCQlyZXR1cm4gIk1lZGl1bSI7CisJY2FzZSAxOgorCQkvKiBTeW5jaHJvbml6ZWQgd2l0aCBBYmlzLCB3aXRoaW4gZGVtYW5kZWQgdG9sZXJhbmNlICsvLSAwLjA1cHBtICovCisJCXJldHVybiAiSGlnaCI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJ1bmtub3duIjsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpvYmpfbmFtZShzdHJ1Y3QgYWJpc19vbV9mb21faGRyICpmb2gpCit7CisJc3RhdGljIGNoYXIgcmV0YnVmWzI1Nl07CisKKwlyZXRidWZbMF0gPSAwOworCisJc3dpdGNoIChmb2gtPm9ial9jbGFzcykgeworCWNhc2UgTk1fT0NfQlMxMToKKwkJc3RyY2F0KHJldGJ1ZiwgIkJTMTEgIik7CisJCXN3aXRjaCAoZm9oLT5vYmpfaW5zdC5idHNfbnIpIHsKKwkJY2FzZSBCUzExX09CSl9QQToKKwkJCXNwcmludGYocmV0YnVmK3N0cmxlbihyZXRidWYpLCAiUG93ZXIgQW1wbGlmaWVyICVkICIsCisJCQkJZm9oLT5vYmpfaW5zdC50c19ucik7CisJCQlicmVhazsKKwkJY2FzZSBCUzExX09CSl9MSToKKwkJCXNwcmludGYocmV0YnVmK3N0cmxlbihyZXRidWYpLCAiTGluZSBJbnRlcmZhY2UgIik7CisJCQlicmVhazsKKwkJY2FzZSBCUzExX09CSl9DQ0xLOgorCQkJc3ByaW50ZihyZXRidWYrc3RybGVuKHJldGJ1ZiksICJDQ0xLICIpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBOTV9PQ19TSVRFX01BTkFHRVI6CisJCXN0cmNhdChyZXRidWYsICJTSVRFIE1BTkFHRVIgIik7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0YnVmOworfQorCitzdGF0aWMgdm9pZCBwcmludF9zdGF0ZShzdHJ1Y3QgdGx2X3BhcnNlZCAqdHApCit7CisJaWYgKFRMVlBfUFJFU0VOVCh0cCwgTk1fQVRUX0JTMTFfQlRTX1NUQVRFKSkgeworCQl1X2ludDhfdCBwaGFzZSwgbWJjY3U7CisJCWlmIChUTFZQX0xFTih0cCwgTk1fQVRUX0JTMTFfQlRTX1NUQVRFKSA+PSAxKSB7CisJCQlwaGFzZSA9ICpUTFZQX1ZBTCh0cCwgTk1fQVRUX0JTMTFfQlRTX1NUQVRFKTsKKwkJCXByaW50ZigiUEhBU0U6ICV1ICUtMjBzICIsIHBoYXNlICYgMHhmLAorCQkJCWJ0c19waGFzZV9uYW1lKHBoYXNlKSk7CisJCX0KKwkJaWYgKFRMVlBfTEVOKHRwLCBOTV9BVFRfQlMxMV9CVFNfU1RBVEUpID49IDIpIHsKKwkJCW1iY2N1ID0gKihUTFZQX1ZBTCh0cCwgTk1fQVRUX0JTMTFfQlRTX1NUQVRFKSsxKTsKKwkJCXByaW50ZigiTUJDQ1UwOiAlLTExcyBNQkNDVTE6ICUtMTFzICIsCisJCQkJbWJjY3VfbG9hZF9uYW1lKG1iY2N1ICYgMHhmKSwgbWJjY3VfbG9hZF9uYW1lKG1iY2N1ID4+IDQpKTsKKwkJfQorCX0KKwlpZiAoVExWUF9QUkVTRU5UKHRwLCBOTV9BVFRfQlMxMV9FMV9TVEFURSkgJiYKKwkgICAgVExWUF9MRU4odHAsIE5NX0FUVF9CUzExX0UxX1NUQVRFKSA+PSAxKSB7CisJCXVfaW50OF90IGUxX3N0YXRlID0gKlRMVlBfVkFMKHRwLCBOTV9BVFRfQlMxMV9FMV9TVEFURSk7CisJCXByaW50ZigiQWJpcy1saW5rOiAlLTlzICIsIGxpbmtzdGF0ZV9uYW1lKGUxX3N0YXRlICYgMHhmKSk7CisJfQorCXByaW50ZigiXG4iKTsKK30KKworc3RhdGljIGludCBwcmludF9hdHRyKHN0cnVjdCB0bHZfcGFyc2VkICp0cCkKK3sKKwlpZiAoVExWUF9QUkVTRU5UKHRwLCBOTV9BVFRfQlMxMV9FU05fUENCX1NFUklBTCkpIHsKKwkJcHJpbnRmKCJcdEJTLTExIEVTTiBQQ0IgU2VyaWFsIE51bWJlcjogJXNcbiIsCisJCQlUTFZQX1ZBTCh0cCwgTk1fQVRUX0JTMTFfRVNOX1BDQl9TRVJJQUwpKTsKKwl9CisJaWYgKFRMVlBfUFJFU0VOVCh0cCwgTk1fQVRUX0JTMTFfRVNOX0hXX0NPREVfTk8pKSB7CisJCXByaW50ZigiXHRCUy0xMSBFU04gSGFyZHdhcmUgQ29kZSBOdW1iZXI6ICVzXG4iLAorCQkJVExWUF9WQUwodHAsIE5NX0FUVF9CUzExX0VTTl9IV19DT0RFX05PKSs2KTsKKwl9CisJaWYgKFRMVlBfUFJFU0VOVCh0cCwgTk1fQVRUX0JTMTFfRVNOX0ZXX0NPREVfTk8pKSB7CisJCXByaW50ZigiXHRCUy0xMSBFU04gRmlybXdhcmUgQ29kZSBOdW1iZXI6ICVzXG4iLAorCQkJVExWUF9WQUwodHAsIE5NX0FUVF9CUzExX0VTTl9GV19DT0RFX05PKSs2KTsKKwl9CisjaWYgMAorCWlmIChUTFZQX1BSRVNFTlQodHAsIE5NX0FUVF9CUzExX0JPT1RfU1dfVkVSUykpIHsKKwkJcHJpbnRmKCJCUy0xMSBCb290IFNvZnR3YXJlIFZlcnNpb246ICVzXG4iLAorCQkJVExWUF9WQUwodHAsIE5NX0FUVF9CUzExX0JPT1RfU1dfVkVSUykrNik7CisJfQorI2VuZGlmCisJaWYgKFRMVlBfUFJFU0VOVCh0cCwgTk1fQVRUX0FCSVNfQ0hBTk5FTCkgJiYKKwkgICAgVExWUF9MRU4odHAsIE5NX0FUVF9BQklTX0NIQU5ORUwpID49IDMpIHsKKwkJY29uc3QgdV9pbnQ4X3QgKmNoYW4gPSBUTFZQX1ZBTCh0cCwgTk1fQVRUX0FCSVNfQ0hBTk5FTCk7CisJCXByaW50ZigiXHRFMSBDaGFubmVsOiBQb3J0PSV1IFRpbWVzbG90PSV1ICIsCisJCQljaGFuWzBdLCBjaGFuWzFdKTsKKwkJaWYgKGNoYW5bMl0gPT0gMHhmZikKKwkJCXByaW50ZigiKEZ1bGwgU2xvdClcbiIpOworCQllbHNlCisJCQlwcmludGYoIlN1YnNsb3Q9JXVcbiIsIGNoYW5bMl0pOworCX0KKwlpZiAoVExWUF9QUkVTRU5UKHRwLCBOTV9BVFRfVEVJKSkKKwkJcHJpbnRmKCJcdFRFSTogJWRcbiIsICpUTFZQX1ZBTCh0cCwgTk1fQVRUX1RFSSkpOworCWlmIChUTFZQX1BSRVNFTlQodHAsIE5NX0FUVF9CUzExX1RYUFdSKSAmJgorCSAgICBUTFZQX0xFTih0cCwgTk1fQVRUX0JTMTFfVFhQV1IpID49IDEpIHsKKwkJcHJpbnRmKCJcdFRSWCBQb3dlcjogJXNcbiIsCisJCQl0cnhfcG93ZXJfbmFtZSgqVExWUF9WQUwodHAsIE5NX0FUVF9CUzExX1RYUFdSKSkpOworCX0KKwlpZiAoVExWUF9QUkVTRU5UKHRwLCBOTV9BVFRfQlMxMV9QTExfTU9ERSkgJiYKKwkgICAgVExWUF9MRU4odHAsIE5NX0FUVF9CUzExX1BMTF9NT0RFKSA+PSAxKSB7CisJCXByaW50ZigiXHRQTEwgTW9kZTogJXNcbiIsCisJCQlwbGxfbW9kZV9uYW1lKCpUTFZQX1ZBTCh0cCwgTk1fQVRUX0JTMTFfUExMX01PREUpKSk7CisJfQorCWlmIChUTFZQX1BSRVNFTlQodHAsIE5NX0FUVF9CUzExX1BMTCkgJiYKKwkgICAgVExWUF9MRU4odHAsIE5NX0FUVF9CUzExX1BMTCkgPj0gNCkgeworCQljb25zdCB1X2ludDhfdCAqdnAgPSBUTFZQX1ZBTCh0cCwgTk1fQVRUX0JTMTFfUExMKTsKKwkJcHJpbnRmKCJcdFBMTCBTZXQgVmFsdWU9JWQsIFdvcmsgVmFsdWU9JWRcbiIsCisJCQl2cFswXSA8PCA4IHwgdnBbMV0sIHZwWzJdIDw8IDggfCB2cFszXSk7CisJfQorCWlmIChUTFZQX1BSRVNFTlQodHAsIE5NX0FUVF9CUzExX0NDTEtfQUNDVVJBQ1kpICYmCisJICAgIFRMVlBfTEVOKHRwLCBOTV9BVFRfQlMxMV9DQ0xLX0FDQ1VSQUNZKSA+PSAxKSB7CisJCWNvbnN0IHVfaW50OF90ICphY2MgPSBUTFZQX1ZBTCh0cCwgTk1fQVRUX0JTMTFfQ0NMS19BQ0NVUkFDWSk7CisJCXByaW50ZigiXHRDQ0xLIEFjY3VyYWN5OiAlcyAoJWQpXG4iLCBjY2xrX2FjY19uYW1lKCphY2MpLCAqYWNjKTsKKwl9CisJaWYgKFRMVlBfUFJFU0VOVCh0cCwgTk1fQVRUX0JTMTFfQ0NMS19UWVBFKSAmJgorCSAgICBUTFZQX0xFTih0cCwgTk1fQVRUX0JTMTFfQ0NMS19UWVBFKSA+PSAxKSB7CisJCWNvbnN0IHVfaW50OF90ICphY2MgPSBUTFZQX1ZBTCh0cCwgTk1fQVRUX0JTMTFfQ0NMS19UWVBFKTsKKwkJcHJpbnRmKCJcdENDTEsgVHlwZT0lZFxuIiwgKmFjYyk7CisJfQorCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY21kX3F1ZXJ5KHZvaWQpCit7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cnggPSBnX2J0cy0+YzA7CisKKwliczExY2ZnX3N0YXRlID0gU1RBVEVfUVVFUlk7CisJYWJpc19ubV9iczExX2dldF9zZXJubyhnX2J0cyk7CisJYWJpc19ubV9iczExX2dldF9vbWxfdGVpX3RzKGdfYnRzKTsKKwlhYmlzX25tX2JzMTFfZ2V0X3BsbF9tb2RlKGdfYnRzKTsKKwlhYmlzX25tX2JzMTFfZ2V0X2NjbGsoZ19idHMpOworCWFiaXNfbm1fYnMxMV9nZXRfdHJ4X3Bvd2VyKHRyeCk7CisJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGdfYnRzLCAxKTsKKwlpZiAodHJ4KQorCQlhYmlzX25tX2JzMTFfZ2V0X3RyeF9wb3dlcih0cngpOworCXNsZWVwKDEpOworCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAwKTsKKwljb21tYW5kID0gTlVMTDsKK30KKworLyogaGFuZGxlIGEgcmVzcG9uc2UgZnJvbSB0aGUgQlRTIHRvIGEgR0VUIFNUQVRFIGNvbW1hbmQgKi8KK3N0YXRpYyBpbnQgaGFuZGxlX3N0YXRlX3Jlc3AoZW51bSBhYmlzX2JzMTFfcGhhc2Ugc3RhdGUpCit7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIEJTMTFfU1RBVEVfV0FSTV9VUDoKKwljYXNlIEJTMTFfU1RBVEVfTE9BRF9TTVVfU0FGRVRZOgorCWNhc2UgQlMxMV9TVEFURV9MT0FEX1NNVV9JTlRFTkRFRDoKKwljYXNlIEJTMTFfU1RBVEVfTE9BRF9NQkNDVToKKwkJYnJlYWs7CisJY2FzZSBCUzExX1NUQVRFX1NPRlRXQVJFX1JRRDoKKwkJYnMxMWNmZ19zdGF0ZSA9IFNUQVRFX1NXTE9BRDsKKwkJLyogc2VuZCBzYWZldHkgbG9hZC4gVXNlIGdfYnRzIGFzIHByaXZhdGUgJ3BhcmFtJworCQkgKiBhcmd1bWVudCwgc28gb3VyIHN3bG9hZF9jYmZuIGNhbiBkaXN0aW5ndWlzaAorCQkgKiBhIHNhZmV0eSBsb2FkIGZyb20gYSByZWd1bGFyIHNvZnR3YXJlICovCisJCWlmIChmaWxlX2lzX3JlYWRhYmxlKGZuYW1lX3NhZmV0eSkpCisJCQlyYyA9IGFiaXNfbm1fc29mdHdhcmVfbG9hZChnX2J0cywgZm5hbWVfc2FmZXR5LAorCQkJCQkJICAgd2luX3NpemUsIHBhcmFtX2ZvcmNlZCwKKwkJCQkJCSAgIHN3bG9hZF9jYmZuLCBnX2J0cyk7CisJCWVsc2UKKwkJCWZwcmludGYoc3RkZXJyLCAiTm8gdmFsaWQgU2FmZXR5IExvYWQgZmlsZSBcIiVzXCJcbiIsCisJCQkJZm5hbWVfc2FmZXR5KTsKKwkJYnJlYWs7CisJY2FzZSBCUzExX1NUQVRFX1dBSVRfTUlOX0NGRzoKKwljYXNlIEJTMTFfU1RBVEVfV0FJVF9NSU5fQ0ZHXzI6CisJCWJzMTFjZmdfc3RhdGUgPSBTVEFURV9TV0xPQUQ7CisJCXJjID0gY3JlYXRlX29iamVjdHMoZ19idHMpOworCQlicmVhazsKKwljYXNlIEJTMTFfU1RBVEVfTUFJTlRFTkFOQ0U6CisJCWlmIChjb21tYW5kKSB7CisJCQlpZiAoIXN0cmNtcChjb21tYW5kLCAiZGlzY29ubmVjdCIpKQorCQkJCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAwKTsKKwkJCWVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgInJlY29ubmVjdCIpKQorCQkJCXJjID0gYWJpc19ubV9iczExX2JzY19kaXNjb25uZWN0KGdfYnRzLCAxKTsKKwkJCWVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgInNvZnR3YXJlIikKKwkJCSAgICAmJiBiczExY2ZnX3N0YXRlICE9IFNUQVRFX1NXTE9BRCkgeworCQkJCWJzMTFjZmdfc3RhdGUgPSBTVEFURV9TV0xPQUQ7CisJCQkJLyogc2VuZCBzb2Z0d2FyZSAoRklYTUU6IG92ZXIgQS1iaXM/KSAqLworCQkJCWlmIChmaWxlX2lzX3JlYWRhYmxlKGZuYW1lX3NvZnR3YXJlKSkKKwkJCQkJcmMgPSBhYmlzX25tX2JzMTFfbG9hZF9zd2woZ19idHMsIGZuYW1lX3NvZnR3YXJlLAorCQkJCQkJCQkgICB3aW5fc2l6ZSwgcGFyYW1fZm9yY2VkLAorCQkJCQkJCQkgICBzd2xvYWRfY2Jmbik7CisJCQkJZWxzZQorCQkJCQlmcHJpbnRmKHN0ZGVyciwgIk5vIHZhbGlkIFNvZnR3YXJlIGZpbGUgXCIlc1wiXG4iLAorCQkJCQkJZm5hbWVfc29mdHdhcmUpOworCQkJfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJkZWxldGUtdHJ4MSIpKSB7CisJCQkJcHJpbnRmKCJMb2NpbmcgQkJTSUcgYW5kIFBBIG9iamVjdHMgb2YgVFJYMVxuIik7CisJCQkJYWJpc19ubV9jaGdfYWRtX3N0YXRlKGdfYnRzLCBOTV9PQ19CUzExLAorCQkJCQkJICAgICAgQlMxMV9PQkpfQkJTSUcsIDAsIDEsCisJCQkJCQkgICAgICBOTV9TVEFURV9MT0NLRUQpOworCQkJCWFiaXNfbm1fY2hnX2FkbV9zdGF0ZShnX2J0cywgTk1fT0NfQlMxMSwKKwkJCQkJCSAgICAgIEJTMTFfT0JKX1BBLCAwLCAxLAorCQkJCQkJICAgICAgTk1fU1RBVEVfTE9DS0VEKTsKKwkJCQlzbGVlcCgxKTsKKwkJCQlwcmludGYoIkRlbGV0aW5nIEJCU0lHIGFuZCBQQSBvYmplY3RzIG9mIFRSWDFcbiIpOworCQkJCWFiaXNfbm1fYnMxMV9kZWxldGVfb2JqZWN0KGdfYnRzLCBCUzExX09CSl9CQlNJRywgMSk7CisJCQkJYWJpc19ubV9iczExX2RlbGV0ZV9vYmplY3QoZ19idHMsIEJTMTFfT0JKX1BBLCAxKTsKKwkJCQlzbGVlcCgxKTsKKwkJCQlhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihnX2J0cywgMCk7CisJCQkJY29tbWFuZCA9IE5VTEw7CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgImNyZWF0ZS10cngxIikpIHsKKwkJCQljcmVhdGVfdHJ4MShnX2J0cyk7CisJCQkJc2xlZXAoMSk7CisJCQkJYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oZ19idHMsIDApOworCQkJCWNvbW1hbmQgPSBOVUxMOworCQkJfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJwbGwtZTEtbG9ja2VkIikpIHsKKwkJCQlhYmlzX25tX2JzMTFfc2V0X3BsbF9sb2NrZWQoZ19idHMsIDEpOworCQkJCXNsZWVwKDEpOworCQkJCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAwKTsKKwkJCQljb21tYW5kID0gTlVMTDsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChjb21tYW5kLCAicGxsLXN0YW5kYWxvbmUiKSkgeworCQkJCWFiaXNfbm1fYnMxMV9zZXRfcGxsX2xvY2tlZChnX2J0cywgMCk7CisJCQkJc2xlZXAoMSk7CisJCQkJYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oZ19idHMsIDApOworCQkJCWNvbW1hbmQgPSBOVUxMOworCQkJfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJwbGwtc2V0dmFsdWUiKSkgeworCQkJCWFiaXNfbm1fYnMxMV9zZXRfcGxsKGdfYnRzLCBhdG9pKHZhbHVlKSk7CisJCQkJc2xlZXAoMSk7CisJCQkJYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oZ19idHMsIDApOworCQkJCWNvbW1hbmQgPSBOVUxMOworCQkJfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJwbGwtd29ya3ZhbHVlIikpIHsKKwkJCQkvKiBUbyBzZXQgdGhlIHdvcmsgdmFsdWUgd2UgbmVlZCB0byBsb2dpbiBhcyBGSUVMRCAqLworCQkJCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAwKTsKKwkJCQlzbGVlcCgxKTsKKwkJCQlhYmlzX25tX2JzMTFfaW5maWVsZF9sb2dvbihnX2J0cywgMSk7CisJCQkJc2xlZXAoMSk7CisJCQkJYWJpc19ubV9iczExX3NldF9wbGwoZ19idHMsIGF0b2kodmFsdWUpKTsKKwkJCQlzbGVlcCgxKTsKKwkJCQlhYmlzX25tX2JzMTFfaW5maWVsZF9sb2dvbihnX2J0cywgMCk7CisJCQkJY29tbWFuZCA9IE5VTEw7CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgIm9tbC10ZWkiKSkgeworCQkJCWFiaXNfbm1fYnMxMV9jb25uX29tbF90ZWkoZ19idHMsIDAsIDEsIDB4ZmYsIFRFSV9PTUwpOworCQkJCWNvbW1hbmQgPSBOVUxMOworCQkJfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJyZXN0YXJ0IikpIHsKKwkJCQlhYmlzX25tX2JzMTFfcmVzdGFydChnX2J0cyk7CisJCQkJY29tbWFuZCA9IE5VTEw7CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgInF1ZXJ5IikpIHsKKwkJCQljbWRfcXVlcnkoKTsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChjb21tYW5kLCAiY3JlYXRlLWJwb3J0MSIpKSB7CisJCQkJYWJpc19ubV9iczExX2NyZWF0ZV9icG9ydChnX2J0cywgMSk7CisJCQkJc2xlZXAoMSk7CisJCQkJYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oZ19idHMsIDApOworCQkJCWNvbW1hbmQgPSBOVUxMOworCQkJfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJkZWxldGUtYnBvcnQxIikpIHsKKwkJCQlhYmlzX25tX2NoZ19hZG1fc3RhdGUoZ19idHMsIE5NX09DX0JTMTFfQlBPUlQsIDEsIDB4ZmYsIDB4ZmYsIE5NX1NUQVRFX0xPQ0tFRCk7CisJCQkJc2xlZXAoMSk7CisJCQkJYWJpc19ubV9iczExX2RlbGV0ZV9icG9ydChnX2J0cywgMSk7CisJCQkJc2xlZXAoMSk7CisJCQkJYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oZ19idHMsIDApOworCQkJCWNvbW1hbmQgPSBOVUxMOworCQkJfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJicG9ydDAtc3RhciIpKSB7CisJCQkJYWJpc19ubV9iczExX3NldF9icG9ydF9saW5lX2NmZyhnX2J0cywgMCwgQlMxMV9MSU5FX0NGR19TVEFSKTsKKwkJCQlzbGVlcCgxKTsKKwkJCQlhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihnX2J0cywgMCk7CisJCQkJY29tbWFuZCA9IE5VTEw7CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgImJwb3J0MC1tdWx0aWRyb3AiKSkgeworCQkJCWFiaXNfbm1fYnMxMV9zZXRfYnBvcnRfbGluZV9jZmcoZ19idHMsIDAsIEJTMTFfTElORV9DRkdfTVVMVElEUk9QKTsKKwkJCQlzbGVlcCgxKTsKKwkJCQlhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihnX2J0cywgMCk7CisJCQkJY29tbWFuZCA9IE5VTEw7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBCUzExX1NUQVRFX05PUk1BTDoKKwkJaWYgKGNvbW1hbmQpIHsKKwkJCWlmICghc3RyY21wKGNvbW1hbmQsICJyZWNvbm5lY3QiKSkKKwkJCQlhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihnX2J0cywgMCk7CisJCQllbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJkaXNjb25uZWN0IikpCisJCQkJYWJpc19ubV9iczExX2JzY19kaXNjb25uZWN0KGdfYnRzLCAwKTsKKwkJCWVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgInF1ZXJ5IikpIHsKKwkJCQljbWRfcXVlcnkoKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChwYXJhbV9kaXNjb25uZWN0KSB7CisJCQlwYXJhbV9kaXNjb25uZWN0ID0gMDsKKwkJCWFiaXNfbm1fYnMxMV9ic2NfZGlzY29ubmVjdChnX2J0cywgMCk7CisJCQlpZiAocGFyYW1fcmVzdGFydCkgeworCQkJCXBhcmFtX3Jlc3RhcnQgPSAwOworCQkJCWFiaXNfbm1fYnMxMV9yZXN0YXJ0KGdfYnRzKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIHJjOworfQorCisvKiBoYW5kbGUgYSBmdWxseS1yZWNlaXZlZCBtZXNzYWdlL3BhY2tldCBmcm9tIHRoZSBSUzIzMiBwb3J0ICovCitpbnQgaGFuZGxlX3NlcmlhbF9tc2coc3RydWN0IG1zZ2IgKnJ4X21zZykKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKmZvaDsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwlpbnQgcmMgPSAtMTsKKworI2lmIDAKKwlpZiAocnhfbXNnLT5sZW4gPCBMQVBEX0hEUl9MRU4KKwkJCSAgKyBzaXplb2Yoc3RydWN0IGFiaXNfb21fZm9tX2hkcikKKwkJCSAgKyBzaXplb2Yoc3RydWN0IGFiaXNfb21faGRyKSkgeworCQlpZiAoIW1lbWNtcChyeF9tc2ctPmRhdGEgKyAyLCB0b29fZmFzdCwKKwkJCSAgICBzaXplb2YodG9vX2Zhc3QpKSkgeworCQkJZnByaW50ZihzdGRlcnIsICJCUzExIHRlbGxzIHVzIHdlJ3JlIHRvbyAiCisJCQkJImZhc3QsIHRyeSAtLWRlbGF5IGJpZ2dlciB0aGFuICV1XG4iLAorCQkJCWRlbGF5X21zKTsKKwkJCXJldHVybiAtRTJCSUc7CisJCX0gZWxzZQorCQkJZnByaW50ZihzdGRlcnIsICJ1bmtub3duIEJTMTEgbWVzc2FnZVxuIik7CisJfQorI2VuZGlmCisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9sMihyeF9tc2cpOworCWZvaCA9IChzdHJ1Y3QgYWJpc19vbV9mb21faGRyICopIG9oLT5kYXRhOworCXN3aXRjaCAoZm9oLT5tc2dfdHlwZSkgeworCWNhc2UgTk1fTVRfQlMxMV9MTVRfTE9HT05fQUNLOgorCQlwcmludGYoIkxNVCBMT0dPTjogQUNLXG5cbiIpOworCQlpZiAoYnMxMWNmZ19zdGF0ZSA9PSBTVEFURV9OT05FKQorCQkJYnMxMWNmZ19zdGF0ZSA9IFNUQVRFX0xPR09OX0FDSzsKKwkJcmMgPSBhYmlzX25tX2JzMTFfZ2V0X3N0YXRlKGdfYnRzKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9CUzExX0xNVF9MT0dPRkZfQUNLOgorCQlwcmludGYoIkxNVCBMT0dPRkY6IEFDS1xuIik7CisJCWV4aXQoMCk7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfQlMxMV9HRVRfU1RBVEVfQUNLOgorCQlyYyA9IGFiaXNfbm1fdGx2X3BhcnNlKCZ0cCwgZ19idHMsIGZvaC0+ZGF0YSwgb2gtPmxlbmd0aC1zaXplb2YoKmZvaCkpOworCQlwcmludF9zdGF0ZSgmdHApOworCQlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX0JTMTFfQlRTX1NUQVRFKSAmJgorCQkgICAgVExWUF9MRU4oJnRwLCBOTV9BVFRfQlMxMV9CVFNfU1RBVEUpID49IDEpCisJCQlyYyA9IGhhbmRsZV9zdGF0ZV9yZXNwKCpUTFZQX1ZBTCgmdHAsIE5NX0FUVF9CUzExX0JUU19TVEFURSkpOworCQlicmVhazsKKwljYXNlIE5NX01UX0dFVF9BVFRSX1JFU1A6CisJCXByaW50ZigiXG4lc0FUVFJJQlVURVM6XG4iLCBvYmpfbmFtZShmb2gpKTsKKwkJYWJpc19ubV90bHZfcGFyc2UoJnRwLCBnX2J0cywgZm9oLT5kYXRhLCBvaC0+bGVuZ3RoLXNpemVvZigqZm9oKSk7CisJCXJjID0gcHJpbnRfYXR0cigmdHApOworCQkvL2hleGR1bXAoZm9oLT5kYXRhLCBvaC0+bGVuZ3RoLXNpemVvZigqZm9oKSk7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfQlMxMV9TRVRfQVRUUl9BQ0s6CisJCXByaW50ZigiU0VUIEFUVFJJQlVURSBPYmpDbGFzcz0weCUwMnggT2JqSW5zdD0oJWQsJWQsJWQpIEFDS1xuIiwKKwkJCWZvaC0+b2JqX2NsYXNzLCBmb2gtPm9ial9pbnN0LmJ0c19uciwKKwkJCWZvaC0+b2JqX2luc3QudHJ4X25yLCBmb2gtPm9ial9pbnN0LnRzX25yKTsKKwkJcmMgPSAwOworCQlicmVhazsKKwljYXNlIE5NX01UX0JTMTFfU0VUX0FUVFJfTkFDSzoKKwkJcHJpbnRmKCJTRVQgQVRUUklCVVRFIE9iakNsYXNzPTB4JTAyeCBPYmpJbnN0PSglZCwlZCwlZCkgTkFDS1xuIiwKKwkJCWZvaC0+b2JqX2NsYXNzLCBmb2gtPm9ial9pbnN0LmJ0c19uciwKKwkJCWZvaC0+b2JqX2luc3QudHJ4X25yLCBmb2gtPm9ial9pbnN0LnRzX25yKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmMgPSBhYmlzX25tX3Jjdm1zZyhyeF9tc2cpOworCX0KKwlpZiAocmMgPCAwKSB7CisJCXBlcnJvcigiRVJST1IgaW4gbWFpbiBsb29wIik7CisJCS8vYnJlYWs7CisJfQorCWlmIChyYyA9PSAxKQorCQlyZXR1cm4gcmM7CisKKwlzd2l0Y2ggKGJzMTFjZmdfc3RhdGUpIHsKKwljYXNlIFNUQVRFX05PTkU6CisJCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAxKTsKKwkJYnJlYWs7CisJY2FzZSBTVEFURV9MT0dPTl9BQ0s6CisJCWJzY19zY2hlZHVsZV90aW1lcigmc3RhdHVzX3RpbWVyLCA1LCAwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorCitpbnQgbm1fc3RhdGVfZXZlbnQoZW51bSBubV9ldnQgZXZ0LCB1X2ludDhfdCBvYmpfY2xhc3MsIHZvaWQgKm9iaiwKKwkJICAgc3RydWN0IGdzbV9ubV9zdGF0ZSAqb2xkX3N0YXRlLCBzdHJ1Y3QgZ3NtX25tX3N0YXRlICpuZXdfc3RhdGUpCit7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgc3RhdHVzX3RpbWVyX2NiKHZvaWQgKmRhdGEpCit7CisJYWJpc19ubV9iczExX2dldF9zdGF0ZShnX2J0cyk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2Jhbm5lcih2b2lkKQoreworCXByaW50ZigiYnMxMV9jb25maWcgKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIGFuZCBEaWV0ZXIgU3BhYXJcbiIpOworCXByaW50ZigiVGhpcyBpcyBGUkVFIFNPRlRXQVJFIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWVxuXG4iKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfaGVscCh2b2lkKQoreworCXByaW50ZigiYnMxMV9jb25maWcgW29wdGlvbnNdIFtjb21tYW5kXVxuIik7CisJcHJpbnRmKCJcblN1cHBvcnRlZCBvcHRpb25zOlxuIik7CisJcHJpbnRmKCJcdC1oIC0taGVscFx0XHRcdFByaW50IHRoaXMgaGVscCB0ZXh0XG4iKTsKKwlwcmludGYoIlx0LXAgLS1wb3J0IDwvZGV2L3R0eVhYWD5cdFx0U3BlY2lmeSBzZXJpYWwgcG9ydFxuIik7CisJcHJpbnRmKCJcdC1zIC0tc29mdHdhcmUgPGZpbGU+XHRcdFNwZWNpZnkgU29mdHdhcmUgZmlsZVxuIik7CisJcHJpbnRmKCJcdC1TIC0tc2FmZXR5IDxmaWxlPlx0XHRTcGVjaWZ5IFNhZmV0eSBMb2FkIGZpbGVcbiIpOworCXByaW50ZigiXHQtZCAtLWRlbGF5IDxtcz5cdFx0XHRTcGVjaWZ5IGRlbGF5IGluIG1pbGxpc2Vjb25kc1xuIik7CisJcHJpbnRmKCJcdC1EIC0tZGlzY29ubmVjdFx0XHRcdERpc2Nvbm5lY3QgQlRTIGZyb20gQlNDXG4iKTsKKwlwcmludGYoIlx0LXcgLS13aW4tc2l6ZSA8bnVtPlx0XHRTcGVjaWZ5IFdpbmRvdyBTaXplXG4iKTsKKwlwcmludGYoIlx0LWYgLS1mb3JjZWRcdFx0XHRGb3JjZSBTb2Z0d2FyZSBMb2FkXG4iKTsKKwlwcmludGYoIlxuU3VwcG9ydGVkIGNvbW1hbmRzOlxuIik7CisJcHJpbnRmKCJcdHF1ZXJ5XHRcdFx0UXVlcnkgdGhlIEJTLTExIGFib3V0IHNlcmlhbCBudW1iZXIgYW5kIGNvbmZpZ3VyYXRpb25cbiIpOworCXByaW50ZigiXHRkaXNjb25uZWN0XHRcdERpc2Nvbm5lY3QgQS1iaXMgbGluayAoZ28gaW50byBhZG1pbmlzdHJhdGl2ZSBzdGF0ZSlcbiIpOworCXByaW50ZigiXHRyZXNjb25uZWN0XHRcdFJlY29ubmVjdCBBLWJpcyBsaW5rIChnbyBpbnRvIG5vcm1hbCBzdGF0ZSlcbiIpOworCXByaW50ZigiXHRyZXN0YXJ0XHRcdFx0UmVzdGFydCB0aGUgQlRTXG4iKTsKKwlwcmludGYoIlx0c29mdHdhcmVcdFx0RG93bmxvYWQgU29mdHdhcmUgKG9ubHkgaW4gYWRtaW5pc3RyYXRpdmUgc3RhdGUpXG4iKTsKKwlwcmludGYoIlx0Y3JlYXRlLXRyeDFcdFx0Q3JlYXRlIG9iamVjdHMgZm9yIFRSWDEgKERhbmdlcjogWW91ciBCUy0xMSBtaWdodCBvdmVyaGVhdClcbiIpOworCXByaW50ZigiXHRkZWxldGUtdHJ4MVx0XHREZWxldGUgb2JqZWN0cyBmb3IgVFJYMVxuIik7CisJcHJpbnRmKCJcdHBsbC1lMS1sb2NrZWRcdFx0U2V0IHRoZSBQTEwgdG8gYmUgbG9ja2VkIHRvIEUxIGNsb2NrXG4iKTsKKwlwcmludGYoIlx0cGxsLXN0YW5kYWxvbmVcdFx0U2V0IHRoZSBQTEwgdG8gYmUgaW4gc3RhbmRhbG9uZSBtb2RlXG4iKTsKKwlwcmludGYoIlx0cGxsLXNldHZhbHVlIDx2YWx1ZT5cdFNldCB0aGUgUExMIHNldCB2YWx1ZVxuIik7CisJcHJpbnRmKCJcdHBsbC13b3JrdmFsdWUgPHZhbHVlPlx0U2V0IHRoZSBQTEwgd29yayB2YWx1ZVxuIik7CisJcHJpbnRmKCJcdG9tbC10ZWlcdFx0XHRTZXQgT01MIEUxIFRTIGFuZCBURUlcbiIpOworCXByaW50ZigiXHRicG9ydDAtc3Rhclx0XHRTZXQgQlBPUlQwIGxpbmUgY29uZmlnIHRvIHN0YXJcbiIpOworCXByaW50ZigiXHRicG9ydDAtbXVsdGlwb3J0XHRTZXQgQlBPUlQwIGxpbmUgY29uZmlnIHRvIG11bHRpcG9ydFxuIik7CisJcHJpbnRmKCJcdGNyZWF0ZS1icG9ydDFcdFx0Q3JlYXRlIEJQT1JUMSBvYmplY3RcbiIpOworCXByaW50ZigiXHRkZWxldGUtYnBvcnQxXHRcdERlbGV0ZSBCUE9SVDEgb2JqZWN0XG4iKTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX29wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBvcHRpb25faW5kZXggPSAwOworCXByaW50X2Jhbm5lcigpOworCisJd2hpbGUgKDEpIHsKKwkJaW50IGM7CisJCXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0geworCQkJeyAiaGVscCIsIDAsIDAsICdoJyB9LAorCQkJeyAicG9ydCIsIDEsIDAsICdwJyB9LAorCQkJeyAic29mdHdhcmUiLCAxLCAwLCAncycgfSwKKwkJCXsgInNhZmV0eSIsIDEsIDAsICdTJyB9LAorCQkJeyAiZGVsYXkiLCAxLCAwLCAnZCcgfSwKKwkJCXsgImRpc2Nvbm5lY3QiLCAwLCAwLCAnRCcgfSwKKwkJCXsgIndpbi1zaXplIiwgMSwgMCwgJ3cnIH0sCisJCQl7ICJmb3JjZWQiLCAwLCAwLCAnZicgfSwKKwkJCXsgInJlc3RhcnQiLCAwLCAwLCAncicgfSwKKwkJCXsgImRlYnVnIiwgMSwgMCwgJ2InfSwKKwkJfTsKKworCQljID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgImhwOnM6Uzp0ZDpEdzpmcmE6IiwKKwkJCQlsb25nX29wdGlvbnMsICZvcHRpb25faW5kZXgpOworCisJCWlmIChjID09IC0xKQorCQkJYnJlYWs7CisKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ2gnOgorCQkJcHJpbnRfaGVscCgpOworCQkJZXhpdCgwKTsKKwkJY2FzZSAncCc6CisJCQlzZXJpYWxfcG9ydCA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICdiJzoKKwkJCWRlYnVnX3BhcnNlX2NhdGVnb3J5X21hc2soc3RkZXJyX3RhcmdldCwgb3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdzJzoKKwkJCWZuYW1lX3NvZnR3YXJlID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ1MnOgorCQkJZm5hbWVfc2FmZXR5ID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ2QnOgorCQkJZGVsYXlfbXMgPSBhdG9pKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAndyc6CisJCQl3aW5fc2l6ZSA9IGF0b2kob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdEJzoKKwkJCXBhcmFtX2Rpc2Nvbm5lY3QgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ2YnOgorCQkJcGFyYW1fZm9yY2VkID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdyJzoKKwkJCXBhcmFtX2Rpc2Nvbm5lY3QgPSAxOworCQkJcGFyYW1fcmVzdGFydCA9IDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChvcHRpbmQgPCBhcmdjKQorCQljb21tYW5kID0gYXJndltvcHRpbmRdOworCSAgICAgICAgaWYgKG9wdGluZCsxIDwgYXJnYykKKwkJCXZhbHVlID0gYXJndltvcHRpbmQrMV07CisKK30KKworc3RhdGljIGludCBudW1fc2lnaW50OworCitzdGF0aWMgdm9pZCBzaWduYWxfaGFuZGxlcihpbnQgc2lnbmFsKQoreworCWZwcmludGYoc3Rkb3V0LCAiXG5zaWduYWwgJXUgcmVjZWl2ZWRcbiIsIHNpZ25hbCk7CisKKwlzd2l0Y2ggKHNpZ25hbCkgeworCWNhc2UgU0lHSU5UOgorCQludW1fc2lnaW50Kys7CisJCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAwKTsKKwkJaWYgKG51bV9zaWdpbnQgPj0gMykKKwkJCWV4aXQoMCk7CisJCWJyZWFrOworCX0KK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBnc21fbmV0d29yayAqZ3NtbmV0OworCWludCByYzsKKworCWRlYnVnX2luaXQoKTsKKwlzdGRlcnJfdGFyZ2V0ID0gZGVidWdfdGFyZ2V0X2NyZWF0ZV9zdGRlcnIoKTsKKwlkZWJ1Z19hZGRfdGFyZ2V0KHN0ZGVycl90YXJnZXQpOworCWRlYnVnX3NldF9hbGxfZmlsdGVyKHN0ZGVycl90YXJnZXQsIDEpOworCWhhbmRsZV9vcHRpb25zKGFyZ2MsIGFyZ3YpOworCWJ0c19tb2RlbF9iczExX2luaXQoKTsKKworCWdzbW5ldCA9IGdzbV9uZXR3b3JrX2luaXQoMSwgMSwgTlVMTCk7CisJaWYgKCFnc21uZXQpIHsKKwkJZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gYWxsb2NhdGUgZ3NtIG5ldHdvcmtcbiIpOworCQlleGl0KDEpOworCX0KKwlnX2J0cyA9IGdzbV9idHNfYWxsb2MoZ3NtbmV0LCBHU01fQlRTX1RZUEVfQlMxMSwgSEFSRENPREVEX1RTQywKKwkJCQlIQVJEQ09ERURfQlNJQyk7CisKKwlyYyA9IHJzMjMyX3NldHVwKHNlcmlhbF9wb3J0LCBkZWxheV9tcywgZ19idHMpOworCWlmIChyYyA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJQcm9ibGVtIHNldHRpbmcgdXAgc2VyaWFsIHBvcnRcbiIpOworCQlleGl0KDEpOworCX0KKworCXNpZ25hbChTSUdJTlQsICZzaWduYWxfaGFuZGxlcik7CisKKwlhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihnX2J0cywgMSk7CisJLy9hYmlzX25tX2JzMTFfZ2V0X3Nlcm5vKGdfYnRzKTsKKworCXN0YXR1c190aW1lci5jYiA9IHN0YXR1c190aW1lcl9jYjsKKworCXdoaWxlICgxKSB7CisJCWJzY19zZWxlY3RfbWFpbigwKTsKKwl9CisKKwlhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihnX2J0cywgMCk7CisKKwlleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvYnNjX2hhY2suYyBiL29wZW5ic2Mvc3JjL2JzY19oYWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNkZTRkZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2JzY19oYWNrLmMKQEAgLTAsMCArMSwyNjggQEAKKy8qIEEgaGFja2lzaCBtaW5pbWFsIEJTQyAoK01TQyArSExSKSBpbXBsZW1lbnRhdGlvbiAqLworCisvKiAoQykgMjAwOC0yMDEwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2RlZmluZSBfR05VX1NPVVJDRQorI2luY2x1ZGUgPGdldG9wdC5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9kYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2UxX2lucHV0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKworLyogTUNDIGFuZCBNTkMgZm9yIHRoZSBMb2NhdGlvbiBBcmVhIElkZW50aWZpZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgZGVidWdfdGFyZ2V0ICpzdGRlcnJfdGFyZ2V0Oworc3RydWN0IGdzbV9uZXR3b3JrICpic2NfZ3NtbmV0ID0gMDsKK3N0YXRpYyBjb25zdCBjaGFyICpkYXRhYmFzZV9uYW1lID0gImhsci5zcWxpdGUzIjsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25maWdfZmlsZSA9ICJvcGVuYnNjLmNmZyI7CitleHRlcm4gY29uc3QgY2hhciAqb3BlbmJzY192ZXJzaW9uOworZXh0ZXJuIGNvbnN0IGNoYXIgKm9wZW5ic2NfY29weXJpZ2h0OworCisvKiB0aW1lciB0byBzdG9yZSBzdGF0aXN0aWNzICovCisjZGVmaW5lIERCX1NZTkNfSU5URVJWQUwJNjAsIDAKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBkYl9zeW5jX3RpbWVyOworCitleHRlcm4gaW50IGJzY19ib290c3RyYXBfbmV0d29yayhpbnQgKCptbWNfcmV2KShzdHJ1Y3QgZ3NtX25ldHdvcmsgKiwgaW50LCB2b2lkICopLAorCQkJCSBjb25zdCBjaGFyICpjZmdfZmlsZSk7CitleHRlcm4gaW50IGJzY19zaHV0ZG93bl9uZXQoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQpOworCitzdGF0aWMgdm9pZCBjcmVhdGVfcGNhcF9maWxlKGNoYXIgKmZpbGUpCit7CisJbW9kZV90IG1vZGUgPSBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lST1RIOworCWludCBmZCA9IG9wZW4oZmlsZSwgT19XUk9OTFl8T19UUlVOQ3xPX0NSRUFULCBtb2RlKTsKKworCWlmIChmZCA8IDApIHsKKwkJcGVycm9yKCJGYWlsZWQgdG8gb3BlbiBmaWxlIGZvciBwY2FwIik7CisJCXJldHVybjsKKwl9CisKKwllMV9zZXRfcGNhcF9mZChmZCk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3VzYWdlKCkKK3sKKwlwcmludGYoIlVzYWdlOiBic2NfaGFja1xuIik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2hlbHAoKQoreworCXByaW50ZigiICBTb21lIHVzZWZ1bCBoZWxwLi4uXG4iKTsKKwlwcmludGYoIiAgLWggLS1oZWxwIHRoaXMgdGV4dFxuIik7CisJcHJpbnRmKCIgIC1kIG9wdGlvbiAtLWRlYnVnPURSTEw6RENDOkRNTTpEUlI6RFJTTDpETk0gZW5hYmxlIGRlYnVnZ2luZ1xuIik7CisJcHJpbnRmKCIgIC1jIC0tY29uZmlnLWZpbGUgZmlsZW5hbWUgVGhlIGNvbmZpZyBmaWxlIHRvIHVzZS5cbiIpOworCXByaW50ZigiICAtcyAtLWRpc2FibGUtY29sb3JcbiIpOworCXByaW50ZigiICAtbCAtLWRhdGFiYXNlIGRiLW5hbWUgVGhlIGRhdGFiYXNlIHRvIHVzZVxuIik7CisJcHJpbnRmKCIgIC1hIC0tYXV0aG9yaXplLWV2ZXJ5b25lLiBBdXRob3JpemUgZXZlcnkgbmV3IHN1YnNjcmliZXIuIERhbmdlcm91cyEuXG4iKTsKKwlwcmludGYoIiAgLXAgLS1wY2FwIGZpbGUgIFRoZSBmaWxlbmFtZSBvZiB0aGUgcGNhcCBmaWxlXG4iKTsKKwlwcmludGYoIiAgLVQgLS10aW1lc3RhbXAgUHJlZml4IGV2ZXJ5IGxvZyBsaW5lIHdpdGggYSB0aW1lc3RhbXBcbiIpOworCXByaW50ZigiICAtViAtLXZlcnNpb24uIFByaW50IHRoZSB2ZXJzaW9uIG9mIE9wZW5CU0MuXG4iKTsKKwlwcmludGYoIiAgLVAgLS1ydHAtcHJveHkgRW5hYmxlIHRoZSBSVFAgUHJveHkgY29kZSBpbnNpZGUgT3BlbkJTQ1xuIik7CisJcHJpbnRmKCIgIC1lIC0tbG9nLWxldmVsIG51bWJlci4gU2V0IGEgZ2xvYmFsIGxvZ2xldmVsLlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3ZlcnNpb24oKQoreworCXByaW50ZigiJXNcbiIsIG9wZW5ic2NfdmVyc2lvbik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2NvcHlyaWdodCgpCit7CisJcHV0cyhvcGVuYnNjX2NvcHlyaWdodCk7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9vcHRpb25zKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKwl3aGlsZSAoMSkgeworCQlpbnQgb3B0aW9uX2luZGV4ID0gMCwgYzsKKwkJc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPSB7CisJCQl7ImhlbHAiLCAwLCAwLCAnaCd9LAorCQkJeyJkZWJ1ZyIsIDEsIDAsICdkJ30sCisJCQl7ImNvbmZpZy1maWxlIiwgMSwgMCwgJ2MnfSwKKwkJCXsiZGlzYWJsZS1jb2xvciIsIDAsIDAsICdzJ30sCisJCQl7ImRhdGFiYXNlIiwgMSwgMCwgJ2wnfSwKKwkJCXsiYXV0aG9yaXplLWV2ZXJ5b25lIiwgMCwgMCwgJ2EnfSwKKwkJCXsicGNhcCIsIDEsIDAsICdwJ30sCisJCQl7InRpbWVzdGFtcCIsIDAsIDAsICdUJ30sCisJCQl7InZlcnNpb24iLCAwLCAwLCAnVicgfSwKKwkJCXsicnRwLXByb3h5IiwgMCwgMCwgJ1AnfSwKKwkJCXsibG9nLWxldmVsIiwgMSwgMCwgJ2UnfSwKKwkJCXswLCAwLCAwLCAwfQorCQl9OworCisJCWMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiaGQ6c2w6YXI6cDpUUFZjOmU6IiwKKwkJCQlsb25nX29wdGlvbnMsICZvcHRpb25faW5kZXgpOworCQlpZiAoYyA9PSAtMSkKKwkJCWJyZWFrOworCisJCXN3aXRjaCAoYykgeworCQljYXNlICdoJzoKKwkJCXByaW50X3VzYWdlKCk7CisJCQlwcmludF9oZWxwKCk7CisJCQlleGl0KDApOworCQljYXNlICdzJzoKKwkJCWRlYnVnX3NldF91c2VfY29sb3Ioc3RkZXJyX3RhcmdldCwgMCk7CisJCQlicmVhazsKKwkJY2FzZSAnZCc6CisJCQlkZWJ1Z19wYXJzZV9jYXRlZ29yeV9tYXNrKHN0ZGVycl90YXJnZXQsIG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnbCc6CisJCQlkYXRhYmFzZV9uYW1lID0gc3RyZHVwKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnYyc6CisJCQljb25maWdfZmlsZSA9IHN0cmR1cChvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ3AnOgorCQkJY3JlYXRlX3BjYXBfZmlsZShvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ1QnOgorCQkJZGVidWdfc2V0X3ByaW50X3RpbWVzdGFtcChzdGRlcnJfdGFyZ2V0LCAxKTsKKwkJCWJyZWFrOworCQljYXNlICdQJzoKKwkJCWlwYWNjX3J0cF9kaXJlY3QgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgJ2UnOgorCQkJZGVidWdfc2V0X2xvZ19sZXZlbChzdGRlcnJfdGFyZ2V0LCBhdG9pKG9wdGFyZykpOworCQkJYnJlYWs7CisJCWNhc2UgJ1YnOgorCQkJcHJpbnRfdmVyc2lvbigpOworCQkJcHJpbnRmKCJcbiIpOworCQkJcHJpbnRfY29weXJpZ2h0KCk7CisJCQlleGl0KDApOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiBpZ25vcmUgKi8KKwkJCWJyZWFrOworCQl9CisJfQorfQorCitleHRlcm4gdm9pZCAqdGFsbF92dHlfY3R4Oworc3RhdGljIHZvaWQgc2lnbmFsX2hhbmRsZXIoaW50IHNpZ25hbCkKK3sKKwlmcHJpbnRmKHN0ZG91dCwgInNpZ25hbCAldSByZWNlaXZlZFxuIiwgc2lnbmFsKTsKKworCXN3aXRjaCAoc2lnbmFsKSB7CisJY2FzZSBTSUdJTlQ6CisJCWJzY19zaHV0ZG93bl9uZXQoYnNjX2dzbW5ldCk7CisJCWRpc3BhdGNoX3NpZ25hbChTU19HTE9CQUwsIFNfR0xPQkFMX1NIVVRET1dOLCBOVUxMKTsKKwkJc2xlZXAoMyk7CisJCWV4aXQoMCk7CisJCWJyZWFrOworCWNhc2UgU0lHQUJSVDoKKwkJLyogaW4gY2FzZSBvZiBhYm9ydCwgd2Ugd2FudCB0byBvYnRhaW4gYSB0YWxsb2MgcmVwb3J0CisJCSAqIGFuZCB0aGVuIHJldHVybiB0byB0aGUgY2FsbGVyLCB3aG8gd2lsbCBhYm9ydCB0aGUgcHJvY2VzcyAqLworCWNhc2UgU0lHVVNSMToKKwkJdGFsbG9jX3JlcG9ydCh0YWxsX3Z0eV9jdHgsIHN0ZGVycik7CisJCXRhbGxvY19yZXBvcnRfZnVsbCh0YWxsX2JzY19jdHgsIHN0ZGVycik7CisJCWJyZWFrOworCWNhc2UgU0lHVVNSMjoKKwkJdGFsbG9jX3JlcG9ydF9mdWxsKHRhbGxfdnR5X2N0eCwgc3RkZXJyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCisvKiB0aW1lciBoYW5kbGluZyAqLworc3RhdGljIGludCBfZGJfc3RvcmVfY291bnRlcihzdHJ1Y3QgY291bnRlciAqY291bnRlciwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gZGJfc3RvcmVfY291bnRlcihjb3VudGVyKTsKK30KKworc3RhdGljIHZvaWQgZGJfc3luY190aW1lcl9jYih2b2lkICpkYXRhKQoreworCS8qIHN0b3JlIGNvdW50ZXJzIHRvIGRhdGFiYXNlIGFuZCByZS1zY2hlZHVsZSAqLworCWNvdW50ZXJzX2Zvcl9lYWNoKF9kYl9zdG9yZV9jb3VudGVyLCBOVUxMKTsKKwlic2Nfc2NoZWR1bGVfdGltZXIoJmRiX3N5bmNfdGltZXIsIERCX1NZTkNfSU5URVJWQUwpOworfQorCitleHRlcm4gaW50IGJ0c19tb2RlbF91bmtub3duX2luaXQodm9pZCk7CitleHRlcm4gaW50IGJ0c19tb2RlbF9iczExX2luaXQodm9pZCk7CitleHRlcm4gaW50IGJ0c19tb2RlbF9uYW5vYnRzX2luaXQodm9pZCk7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgcmM7CisKKwlkZWJ1Z19pbml0KCk7CisJdGFsbF9ic2NfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KE5VTEwsIDEsICJvcGVuYnNjIik7CisJdGFsbG9jX2N0eF9pbml0KCk7CisJb25fZHNvX2xvYWRfdG9rZW4oKTsKKwlvbl9kc29fbG9hZF9ycmxwKCk7CisJb25fZHNvX2xvYWRfaG9fZGVjKCk7CisJc3RkZXJyX3RhcmdldCA9IGRlYnVnX3RhcmdldF9jcmVhdGVfc3RkZXJyKCk7CisJZGVidWdfYWRkX3RhcmdldChzdGRlcnJfdGFyZ2V0KTsKKworCWJ0c19tb2RlbF91bmtub3duX2luaXQoKTsKKwlidHNfbW9kZWxfYnMxMV9pbml0KCk7CisJYnRzX21vZGVsX25hbm9idHNfaW5pdCgpOworCisJLyogZW5hYmxlIGZpbHRlcnMgKi8KKwlkZWJ1Z19zZXRfYWxsX2ZpbHRlcihzdGRlcnJfdGFyZ2V0LCAxKTsKKworCS8qIHBhcnNlIG9wdGlvbnMgKi8KKwloYW5kbGVfb3B0aW9ucyhhcmdjLCBhcmd2KTsKKworCS8qIHNlZWQgdGhlIFBSTkcgKi8KKwlzcmFuZCh0aW1lKE5VTEwpKTsKKworCWlmIChkYl9pbml0KGRhdGFiYXNlX25hbWUpKSB7CisJCXByaW50ZigiREI6IEZhaWxlZCB0byBpbml0IGRhdGFiYXNlLiBQbGVhc2UgY2hlY2sgdGhlIG9wdGlvbiBzZXR0aW5ncy5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCXByaW50ZigiREI6IERhdGFiYXNlIGluaXRpYWxpemVkLlxuIik7CisKKwlpZiAoZGJfcHJlcGFyZSgpKSB7CisJCXByaW50ZigiREI6IEZhaWxlZCB0byBwcmVwYXJlIGRhdGFiYXNlLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisJcHJpbnRmKCJEQjogRGF0YWJhc2UgcHJlcGFyZWQuXG4iKTsKKworCS8qIHNldHVwIHRoZSB0aW1lciAqLworCWRiX3N5bmNfdGltZXIuY2IgPSBkYl9zeW5jX3RpbWVyX2NiOworCWRiX3N5bmNfdGltZXIuZGF0YSA9IE5VTEw7CisJYnNjX3NjaGVkdWxlX3RpbWVyKCZkYl9zeW5jX3RpbWVyLCBEQl9TWU5DX0lOVEVSVkFMKTsKKworCXJjID0gYnNjX2Jvb3RzdHJhcF9uZXR3b3JrKG1uY2NfcmVjdiwgY29uZmlnX2ZpbGUpOworCWlmIChyYyA8IDApCisJCWV4aXQoMSk7CisKKwlzaWduYWwoU0lHSU5ULCAmc2lnbmFsX2hhbmRsZXIpOworCXNpZ25hbChTSUdBQlJULCAmc2lnbmFsX2hhbmRsZXIpOworCXNpZ25hbChTSUdVU1IxLCAmc2lnbmFsX2hhbmRsZXIpOworCXNpZ25hbChTSUdVU1IyLCAmc2lnbmFsX2hhbmRsZXIpOworCXNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKKworCXdoaWxlICgxKSB7CisJCWJzY191cHF1ZXVlKGJzY19nc21uZXQpOworCQlkZWJ1Z19yZXNldF9jb250ZXh0KCk7CisJCWJzY19zZWxlY3RfbWFpbigwKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9ic2NfaW5pdC5jIGIvb3BlbmJzYy9zcmMvYnNjX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzQzNjYyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvYnNjX2luaXQuYwpAQCAtMCwwICsxLDEwMTYgQEAKKy8qIEEgaGFja2lzaCBtaW5pbWFsIEJTQyAoK01TQyArSExSKSBpbXBsZW1lbnRhdGlvbiAqLworCisvKiAoQykgMjAwOC0yMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9nc21fdXRpbHMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8wOC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19yc2wuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfbm0uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9taXNkbi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdGVsbmV0X2ludGVyZmFjZS5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc3lzdGVtX2luZm9ybWF0aW9uLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9wYWdpbmcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorCisvKiBnbG9iYWwgcG9pbnRlciB0byB0aGUgZ3NtIG5ldHdvcmsgZGF0YSBzdHJ1Y3R1cmUgKi8KK2V4dGVybiBzdHJ1Y3QgZ3NtX25ldHdvcmsgKmJzY19nc21uZXQ7CisKK3N0YXRpYyB2b2lkIHBhdGNoX25tX3RhYmxlcyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKKworLyogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBhcmUgZm9yIE9NIGFuZCBOTSBwYWNrZXRzIHRoYXQgd2UgY2Fubm90IHlldAorICogZ2VuZXJhdGUgYnkgY29kZSBidXQgd2UganVzdCBwYXNzIG9uICovCisKKy8vIEJUUyBTaXRlIE1hbmFnZXIsIFNFVCBBVFRSSUJVVEVTCisKKy8qCisgIE9iamVjdCBDbGFzczogQlRTIFNpdGUgTWFuYWdlcgorICBJbnN0YW5jZSAxOiBGRgorICBJbnN0YW5jZSAyOiBGRgorICBJbnN0YW5jZSAzOiBGRgorU0VUIEFUVFJJQlVURVMKKyAgc0FiaXNFeHRlcm5hbFRpbWU6IDIwMDcvMDkvMDggICAxNDozNjoxMQorICBvbUxBUERSZWxUaW1lcjogMzBzZWMKKyAgc2hvcnRMQVBESW50VGltZXI6IDVzZWMKKyAgZW1lcmdlbmN5VGltZXIxOiAxMCBtaW51dGVzCisgIGVtZXJnZW5jeVRpbWVyMjogMCBtaW51dGVzCisqLworCit1bnNpZ25lZCBjaGFyIG1zZ18xW10gPQoreworCU5NX01UX0JTMTFfU0VUX0FUVFIsIE5NX09DX1NJVEVfTUFOQUdFUiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkJTk1fQVRUX0JTMTFfQUJJU19FWFRfVElNRSwgMHgwNywKKwkJCTB4RDcsIDB4MDksIDB4MDgsIDB4MEUsIDB4MjQsIDB4MEIsIDB4Q0UsCisJCTB4MDIsCisJCQkweDAwLCAweDFFLAorCQlOTV9BVFRfQlMxMV9TSF9MQVBEX0lOVF9USU1FUiwKKwkJCTB4MDEsIDB4MDUsCisJCTB4NDIsIDB4MDIsIDB4MDAsIDB4MEEsCisJCTB4NDQsIDB4MDIsIDB4MDAsIDB4MDAKK307CisKKy8vIEJUUywgU0VUIEJUUyBBVFRSSUJVVEVTCisKKy8qCisgIE9iamVjdCBDbGFzczogQlRTCisgIEJUUyByZWxhdC4gTnVtYmVyOiAwCisgIEluc3RhbmNlIDI6IEZGCisgIEluc3RhbmNlIDM6IEZGCitTRVQgQlRTIEFUVFJJQlVURVMKKyAgYnNJZGVudGl0eUNvZGUgLyBCU0lDOgorICAgIFBMTU5fY29sb3VyX2NvZGU6IDdoCisgICAgQlNfY29sb3VyX2NvZGU6ICAgN2gKKyAgQlRTIEFpciBUaW1lciBUMzEwNTogNCAgLHVuaXQgMTAgbXMKKyAgYnRzSXNIb3BwaW5nOiBGQUxTRQorICBwZXJpb2RDQ0NITG9hZEluZGljYXRpb246IDFzZWMKKyAgdGhyZXNob2xkQ0NDSExvYWRJbmRpY2F0aW9uOiAwJQorICBjZWxsQWxsb2NhdGlvbk51bWJlcjogMDBoID0gR1NNIDkwMAorICBlbmFibGVJbnRlcmZlcmVuY2VDbGFzczogMDBoID0gIERpc2FibGVkCisgIGZBQ0NIUXVhbDogNiAoRkFDQ0ggc3RlYWxpbmcgZmxhZ3MgbWludXMgMSkKKyAgaW50YXZlUGFyYW1ldGVyOiAzMSBTQUNDSCBtdWx0aWZyYW1lcworICBpbnRlcmZlcmVuY2VMZXZlbEJvdW5kYXJpZXM6CisgICAgSW50ZXJmZXJlbmNlIEJvdW5kYXJ5IDE6IDBBaAorICAgIEludGVyZmVyZW5jZSBCb3VuZGFyeSAyOiAwRmgKKyAgICBJbnRlcmZlcmVuY2UgQm91bmRhcnkgMzogMTRoCisgICAgSW50ZXJmZXJlbmNlIEJvdW5kYXJ5IDQ6IDE5aAorICAgIEludGVyZmVyZW5jZSBCb3VuZGFyeSA1OiAxRWgKKyAgbVNUeFB3ck1heDogMTEKKyAgICAgIEdTTSByYW5nZTogICAgIDI9MzlkQm0sIDE1PTEzZEJtLCBzdGVwc2l6ZSAyIGRCbQorICAgICAgRENTMTgwMCByYW5nZTogMD0zMGRCbSwgMTU9MGRCbSwgc3RlcHNpemUgMiBkQm0KKyAgICAgIFBDUzE5MDAgcmFuZ2U6IDA9MzBkQm0sIDE1PTBkQm0sIHN0ZXBzaXplIDIgZEJtCisgICAgICAgICAgICAgICAgICAgIDMwPTMzZEJtLCAzMT0zMmRCbQorICBueTE6CisgICAgTWF4aW11bSBudW1iZXIgb2YgcmVwZXRpdGlvbnMgZm9yIFBIWVNJQ0FMIElORk9STUFUSU9OIG1lc3NhZ2UgKEdTTSAwNC4wOCk6IDIwCisgIHBvd2VyT3V0cHV0VGhyZXNob2xkczoKKyAgICBPdXQgUG93ZXIgRmF1bHQgVGhyZXNob2xkOiAgICAgLTEwIGRCCisgICAgUmVkIE91dCBQb3dlciBUaHJlc2hvbGQ6ICAgICAgIC0gNiBkQgorICAgIEV4Y2Vzc2l2ZSBPdXQgUG93ZXIgVGhyZXNob2xkOiAgIDUgZEIKKyAgckFDSEJ1c3lUaHJlc2hvbGQ6IC0xMjcgZEJtCisgIHJBQ0hMb2FkQXZlcmFnaW5nU2xvdHM6IDI1MCAsbnVtYmVyIG9mIFJBQ0ggYnVyc3QgcGVyaW9kcworICByZlJlc291cmNlSW5kaWNhdGlvblBlcmlvZDogMTI1ICBTQUNDSCBtdWx0aWZyYW1lcworICBUMjAwOgorICAgIFNEQ0NIOiAgICAgICAgICAgICAgICAwNDQgaW4gIDUgbXMKKyAgICBGQUNDSC9GdWxsIHJhdGU6ICAgICAgMDMxIGluICA1IG1zCisgICAgRkFDQ0gvSGFsZiByYXRlOiAgICAgIDA0MSBpbiAgNSBtcworICAgIFNBQ0NIIHdpdGggVENIIFNBUEkwOiAwOTAgaW4gMTAgbXMKKyAgICBTQUNDSCB3aXRoIFNEQ0NIOiAgICAgMDkwIGluIDEwIG1zCisgICAgU0RDQ0ggd2l0aCBTQVBJMzogICAgIDA5MCBpbiAgNSBtcworICAgIFNBQ0NIIHdpdGggVENIIFNBUEkzOiAxMzUgaW4gMTAgbXMKKyAgdFN5bmM6IDkwMDAgdW5pdHMgb2YgMTAgbXNlYworICB0VHJhdTogOTAwMCB1bml0cyBvZiAxMCBtc2VjCisgIGVuYWJsZVVtTG9vcFRlc3Q6IDAwaCA9ICBkaXNhYmxlZAorICBlbmFibGVFeGNlc3NpdmVEaXN0YW5jZTogMDBoID0gIERpc2FibGVkCisgIGV4Y2Vzc2l2ZURpc3RhbmNlOiA2NGttCisgIGhvcHBpbmdNb2RlOiAwMGggPSBiYXNlYmFuZCBob3BwaW5nCisgIGNlbGxUeXBlOiAwMGggPSAgU3RhbmRhcmQgQ2VsbAorICBCQ0NIIEFSRkNOIC8gYkNDSEZyZXF1ZW5jeTogMQorKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYnMxMV9hdHRyX2J0c1tdID0KK3sKKwkJTk1fQVRUX0JTSUMsIEhBUkRDT0RFRF9CU0lDLAorCQlOTV9BVFRfQlRTX0FJUl9USU1FUiwgMHgwNCwKKwkJTk1fQVRUX0JTMTFfQlRTTFNfSE9QUElORywgMHgwMCwKKwkJTk1fQVRUX0NDQ0hfTF9JX1AsIDB4MDEsCisJCU5NX0FUVF9DQ0NIX0xfVCwgMHgwMCwKKwkJTk1fQVRUX0JTMTFfQ0VMTF9BTExPQ19OUiwgTk1fQlMxMV9DQU5SX0dTTSwKKwkJTk1fQVRUX0JTMTFfRU5BX0lOVEVSRl9DTEFTUywgMHgwMSwKKwkJTk1fQVRUX0JTMTFfRkFDQ0hfUVVBTCwgMHgwNiwKKwkJLyogaW50ZXJmZXJlbmNlIGF2Zy4gcGVyaW9kIGluIG51bWJlcnMgb2YgU0FDQ0ggbXVsdGlmciAqLworCQlOTV9BVFRfSU5UQVZFX1BBUkFNLCAweDFGLAorCQlOTV9BVFRfSU5URVJGX0JPVU5ELCAweDBBLCAweDBGLCAweDE0LCAweDE5LCAweDFFLCAweDdCLAorCQlOTV9BVFRfQ0NDSF9MX1QsIDB4MjMsCisJCU5NX0FUVF9HU01fVElNRSwgMHgyOCwgMHgwMCwKKwkJTk1fQVRUX0FETV9TVEFURSwgMHgwMywKKwkJTk1fQVRUX1JBQ0hfQl9USFJFU0gsIDB4N0YsCisJCU5NX0FUVF9MREFWR19TTE9UUywgMHgwMCwgMHhGQSwKKwkJTk1fQVRUX0JTMTFfUkZfUkVTX0lORF9QRVIsIDB4N0QsCisJCU5NX0FUVF9UMjAwLCAweDJDLCAweDFGLCAweDI5LCAweDVBLCAweDVBLCAweDVBLCAweDg3LAorCQlOTV9BVFRfQlMxMV9UU1lOQywgMHgyMywgMHgyOCwKKwkJTk1fQVRUX0JTMTFfVFRSQVUsIDB4MjMsIDB4MjgsCisJCU5NX0FUVF9URVNUX0RVUiwgMHgwMSwgMHgwMCwKKwkJTk1fQVRUX09VVFNUX0FMQVJNLCAweDAxLCAweDAwLAorCQlOTV9BVFRfQlMxMV9FWENFU1NJVkVfRElTVEFOQ0UsIDB4MDEsIDB4NDAsCisJCU5NX0FUVF9CUzExX0hPUFBJTkdfTU9ERSwgMHgwMSwgMHgwMCwKKwkJTk1fQVRUX0JTMTFfUExMLCAweDAxLCAweDAwLAorCQlOTV9BVFRfQkNDSF9BUkZDTiwgMHgwMCwgSEFSRENPREVEX0FSRkNOLyoweDAxKi8sCit9OworCisvLyBIYW5kb3ZlciBSZWNvZ25pdGlvbiwgU0VUIEFUVFJJQlVURVMKKworLyoKK0lsbGVnYWwgQ29udGVudHMgR1NNIEZvcm1hdHRlZCBPJk0gTXNnCisgIE9iamVjdCBDbGFzczogSGFuZG92ZXIgUmVjb2duaXRpb24KKyAgQlRTIHJlbGF0LiBOdW1iZXI6IDAKKyAgSW5zdGFuY2UgMjogRkYKKyAgSW5zdGFuY2UgMzogRkYKK1NFVCBBVFRSSUJVVEVTCisgIGVuYWJsZURlbGF5UG93ZXJCdWRnZXRITzogMDBoID0gRGlzYWJsZWQKKyAgZW5hYmxlRGlzdGFuY2VITzogMDBoID0gIERpc2FibGVkCisgIGVuYWJsZUludGVybmFsSW50ZXJDZWxsSGFuZG92ZXI6IDAwaCA9IERpc2FibGVkCisgIGVuYWJsZUludGVybmFsSW50cmFDZWxsSGFuZG92ZXI6IDAwaCA9ICBEaXNhYmxlZAorICBlbmFibGVQb3dlckJ1ZGdldEhPOiAwMGggPSBEaXNhYmxlZAorICBlbmFibGVSWExFVkhPOiAwMGggPSAgRGlzYWJsZWQKKyAgZW5hYmxlUlhRVUFMSE86IDAwaCA9ICBEaXNhYmxlZAorICBob0F2ZXJhZ2luZ0Rpc3RhbmNlOiA4ICBTQUNDSCBtdWx0aWZyYW1lcworICBob0F2ZXJhZ2luZ0xldjoKKyAgICBBX0xFVl9ITzogOCAgU0FDQ0ggbXVsdGlmcmFtZXMKKyAgICBXX0xFVl9ITzogMSAgU0FDQ0ggbXVsdGlmcmFtZXMKKyAgaG9BdmVyYWdpbmdQb3dlckJ1ZGdldDogIDE2ICBTQUNDSCBtdWx0aWZyYW1lcworICBob0F2ZXJhZ2luZ1F1YWw6CisgICAgQV9RVUFMX0hPOiA4ICBTQUNDSCBtdWx0aWZyYW1lcworICAgIFdfUVVBTF9ITzogMiAgU0FDQ0ggbXVsdGlmcmFtZXMKKyAgaG9Mb3dlclRocmVzaG9sZExldkRMOiAoMTAgLSAxMTApIGRCbQorICBob0xvd2VyVGhyZXNob2xkTGV2VUw6ICg1IC0gMTEwKSBkQm0KKyAgaG9Mb3dlclRocmVzaG9sZFF1YWxETDogMDZoID0gICA2LjQlIDwgQkVSIDwgMTIuOCUKKyAgaG9Mb3dlclRocmVzaG9sZFF1YWxVTDogMDZoID0gICA2LjQlIDwgQkVSIDwgMTIuOCUKKyAgaG9UaHJlc2hvbGRMZXZETGludHJhIDogKDIwIC0gMTEwKSBkQm0KKyAgaG9UaHJlc2hvbGRMZXZVTGludHJhOiAoMjAgLSAxMTApIGRCbQorICBob1RocmVzaG9sZE1zUmFuZ2VNYXg6IDIwIGttCisgIG5DZWxsOiAwNmgKKyAgdGltZXJIT1JlcXVlc3Q6IDMgICx1bml0IDIgU0FDQ0ggbXVsdGlmcmFtZXMKKyovCisKK3Vuc2lnbmVkIGNoYXIgbXNnXzNbXSA9Cit7CisJTk1fTVRfQlMxMV9TRVRfQVRUUiwgTk1fT0NfQlMxMV9IQU5ET1ZFUiwgMHgwMCwgMHhGRiwgMHhGRiwKKwkJMHhEMCwgMHgwMCwJCS8qIGVuYWJsZURlbGF5UG93ZXJCdWRnZXRITyAqLworCQkweDY0LCAweDAwLAkJLyogZW5hYmxlRGlzdGFuY2VITyAqLworCQkweDY3LCAweDAwLAkJLyogZW5hYmxlSW50ZXJuYWxJbnRlckNlbGxIYW5kb3ZlciAqLworCQkweDY4LCAweDAwLAkJLyogZW5hYmxlSW50ZXJuYWxJbnRlckNlbGxIYW5kb3ZlciAqLworCQkweDZBLCAweDAwLAkJLyogZW5hYmxlUG93ZXJCdWRnZXRITyAqLworCQkweDZDLCAweDAwLAkJLyogZW5hYmxlUlhMRVZITyAqLworCQkweDZELCAweDAwLAkJLyogZW5hYmxlUlhRVUFMSE8gKi8KKwkJMHg2RiwgMHgwOCwJCS8qIGhvQXZlcmFnaW5nRGlzdGFuY2UgKi8KKwkJMHg3MCwgMHgwOCwgMHgwMSwJLyogaG9BdmVyYWdpbmdMZXYgKi8KKwkJMHg3MSwgMHgxMCwgMHgxMCwgMHgxMCwKKwkJMHg3MiwgMHgwOCwgMHgwMiwJLyogaG9BdmVyYWdpbmdRdWFsICovCisJCTB4NzMsIDB4MEEsCQkvKiBob0xvd2VyVGhyZXNob2xkTGV2REwgKi8KKwkJMHg3NCwgMHgwNSwJCS8qIGhvTG93ZXJUaHJlc2hvbGRMZXZVTCAqLworCQkweDc1LCAweDA2LAkJLyogaG9Mb3dlclRocmVzaG9sZFF1YWxETCAqLworCQkweDc2LCAweDA2LAkJLyogaG9Mb3dlclRocmVzaG9sZFF1YWxVTCAqLworCQkweDc4LCAweDE0LAkJLyogaG9UaHJlc2hvbGRMZXZETGludHJhICovCisJCTB4NzksIDB4MTQsCQkvKiBob1RocmVzaG9sZExldlVMaW50cmEgKi8KKwkJMHg3QSwgMHgxNCwJCS8qIGhvVGhyZXNob2xkTXNSYW5nZU1heCAqLworCQkweDdELCAweDA2LAkJLyogbkNlbGwgKi8KKwkJTk1fQVRUX0JTMTFfVElNRVJfSE9fUkVRVUVTVCwgMHgwMywKKwkJMHgyMCwgMHgwMSwgMHgwMCwKKwkJMHg0NSwgMHgwMSwgMHgwMCwKKwkJMHg0OCwgMHgwMSwgMHgwMCwKKwkJMHg1QSwgMHgwMSwgMHgwMCwKKwkJMHg1QiwgMHgwMSwgMHgwNSwKKwkJMHg1RSwgMHgwMSwgMHgxQSwKKwkJMHg1RiwgMHgwMSwgMHgyMCwKKwkJMHg5RCwgMHgwMSwgMHgwMCwKKwkJMHg0NywgMHgwMSwgMHgwMCwKKwkJMHg1QywgMHgwMSwgMHg2NCwKKwkJMHg1RCwgMHgwMSwgMHgxRSwKKwkJMHg5NywgMHgwMSwgMHgyMCwKKwkJMHhGNywgMHgwMSwgMHgzQywKK307CisKKy8vIFBvd2VyIENvbnRyb2wsIFNFVCBBVFRSSUJVVEVTCisKKy8qCisgIE9iamVjdCBDbGFzczogUG93ZXIgQ29udHJvbAorICBCVFMgcmVsYXQuIE51bWJlcjogMAorICBJbnN0YW5jZSAyOiBGRgorICBJbnN0YW5jZSAzOiBGRgorU0VUIEFUVFJJQlVURVMKKyAgZW5hYmxlTXNQb3dlckNvbnRyb2w6IDAwaCA9ICBEaXNhYmxlZAorICBlbmFibGVQb3dlckNvbnRyb2xSTEZXOiAwMGggPSAgRGlzYWJsZWQKKyAgcGNBdmVyYWdpbmdMZXY6CisgICAgQV9MRVZfUEM6IDQgIFNBQ0NIIG11bHRpZnJhbWVzCisgICAgV19MRVZfUEM6IDEgIFNBQ0NIIG11bHRpZnJhbWVzCisgIHBjQXZlcmFnaW5nUXVhbDoKKyAgICBBX1FVQUxfUEM6IDQgIFNBQ0NIIG11bHRpZnJhbWVzCisgICAgV19RVUFMX1BDOiAyICBTQUNDSCBtdWx0aWZyYW1lcworICBwY0xvd2VyVGhyZXNob2xkTGV2REw6IDBGaAorICBwY0xvd2VyVGhyZXNob2xkTGV2VUw6IDBBaAorICBwY0xvd2VyVGhyZXNob2xkUXVhbERMOiAwNWggPSAgIDMuMiUgPCBCRVIgPCAgNi40JQorICBwY0xvd2VyVGhyZXNob2xkUXVhbFVMOiAwNWggPSAgIDMuMiUgPCBCRVIgPCAgNi40JQorICBwY1JMRlRocmVzaG9sZDogMENoCisgIHBjVXBwZXJUaHJlc2hvbGRMZXZETDogMTRoCisgIHBjVXBwZXJUaHJlc2hvbGRMZXZVTDogMEZoCisgIHBjVXBwZXJUaHJlc2hvbGRRdWFsREw6IDA0aCA9ICAgMS42JSA8IEJFUiA8ICAzLjIlCisgIHBjVXBwZXJUaHJlc2hvbGRRdWFsVUw6IDA0aCA9ICAgMS42JSA8IEJFUiA8ICAzLjIlCisgIHBvd2VyQ29uZmlybTogMiAgLHVuaXQgMiBTQUNDSCBtdWx0aWZyYW1lcworICBwb3dlckNvbnRyb2xJbnRlcnZhbDogMiAgLHVuaXQgMiBTQUNDSCBtdWx0aWZyYW1lcworICBwb3dlckluY3JTdGVwU2l6ZTogMDJoID0gNCBkQgorICBwb3dlclJlZFN0ZXBTaXplOiAwMWggPSAyIGRCCisgIHJhZGlvTGlua1RpbWVvdXRCczogNjQgIFNBQ0NIIG11bHRpZnJhbWVzCisgIGVuYWJsZUJTUG93ZXJDb250cm9sOiAwMGggPSAgZGlzYWJsZWQKKyovCisKK3Vuc2lnbmVkIGNoYXIgbXNnXzRbXSA9Cit7CisJTk1fTVRfQlMxMV9TRVRfQVRUUiwgTk1fT0NfQlMxMV9QV1JfQ1RSTCwgMHgwMCwgMHhGRiwgMHhGRiwKKwkJTk1fQVRUX0JTMTFfRU5BX01TX1BXUl9DVFJMLCAweDAwLAorCQlOTV9BVFRfQlMxMV9FTkFfUFdSX0NUUkxfUkxGVywgMHgwMCwKKwkJMHg3RSwgMHgwNCwgMHgwMSwJLyogcGNBdmVyYWdpbmdMZXYgKi8KKwkJMHg3RiwgMHgwNCwgMHgwMiwJLyogcGNBdmVyYWdpbmdRdWFsICovCisJCTB4ODAsIDB4MEYsCQkvKiBwY0xvd2VyVGhyZXNob2xkTGV2REwgKi8KKwkJMHg4MSwgMHgwQSwJCS8qIHBjTG93ZXJUaHJlc2hvbGRMZXZVTCAqLworCQkweDgyLCAweDA1LAkJLyogcGNMb3dlclRocmVzaG9sZFF1YWxETCAqLworCQkweDgzLCAweDA1LAkJLyogcGNMb3dlclRocmVzaG9sZFF1YWxVTCAqLworCQkweDg0LCAweDBDLCAJCS8qIHBjUkxGVGhyZXNob2xkICovCisJCTB4ODUsIDB4MTQsIAkJLyogcGNVcHBlclRocmVzaG9sZExldkRMICovCisJCTB4ODYsIDB4MEYsIAkJLyogcGNVcHBlclRocmVzaG9sZExldlVMICovCisJCTB4ODcsIDB4MDQsCQkvKiBwY1VwcGVyVGhyZXNob2xkUXVhbERMICovCisJCTB4ODgsIDB4MDQsCQkvKiBwY1VwcGVyVGhyZXNob2xkUXVhbFVMICovCisJCTB4ODksIDB4MDIsCQkvKiBwb3dlckNvbmZpcm0gKi8KKwkJMHg4QSwgMHgwMiwJCS8qIHBvd2VyQ29uZmlybUludGVydmFsICovCisJCTB4OEIsIDB4MDIsCQkvKiBwb3dlckluY3JTdGVwU2l6ZSAqLworCQkweDhDLCAweDAxLAkJLyogcG93ZXJSZWRTdGVwU2l6ZSAqLworCQkweDhELCAweDQwLAkJLyogcmFkaW9MaW5rVGltZW91dEJzICovCisJCTB4NjUsIDB4MDEsIDB4MDAgLy8gc2V0IHRvIDB4MDEgdG8gZW5hYmxlIEJTUG93ZXJDb250cm9sCit9OworCisKKy8vIFRyYW5zY2VpdmVyLCBTRVQgVFJYIEFUVFJJQlVURVMgKFRSWCAwKQorCisvKgorICBPYmplY3QgQ2xhc3M6IFRyYW5zY2VpdmVyCisgIEJUUyByZWxhdC4gTnVtYmVyOiAwCisgIFRyYW5jZWl2ZXIgbnVtYmVyOiAwCisgIEluc3RhbmNlIDM6IEZGCitTRVQgVFJYIEFUVFJJQlVURVMKKyAgYVJGQ05MaXN0IChIRVgpOiAgMDAwMQorICB0eFB3ck1heFJlZHVjdGlvbjogMDBoID0gICAzMGRCCisgIHJhZGlvTWVhc0dyYW46IDI1NCAgU0FDQ0ggbXVsdGlmcmFtZXMKKyAgcmFkaW9NZWFzUmVwOiAwMWggPSAgZW5hYmxlZAorICBtZW1iZXJPZkVtZXJnZW5jeUNvbmZpZzogMDFoID0gIFRSVUUKKyAgdHJ4QXJlYTogMDBoID0gVFJYIGRvZXNuJ3QgYmVsb25nIHRvIGEgY29uY2VudHJpYyBjZWxsCisqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciBiczExX2F0dHJfcmFkaW9bXSA9Cit7CisJCU5NX0FUVF9BUkZDTl9MSVNULCAweDAxLCAweDAwLCBIQVJEQ09ERURfQVJGQ04gLyoweDAxKi8sCisJCU5NX0FUVF9SRl9NQVhQT1dSX1IsIDB4MDAsCisJCU5NX0FUVF9CUzExX1JBRElPX01FQVNfR1JBTiwgMHgwMSwgMHgwNSwKKwkJTk1fQVRUX0JTMTFfUkFESU9fTUVBU19SRVAsIDB4MDEsIDB4MDEsCisJCU5NX0FUVF9CUzExX0VNUkdfQ0ZHX01FTUJFUiwgMHgwMSwgMHgwMSwKKwkJTk1fQVRUX0JTMTFfVFJYX0FSRUEsIDB4MDEsIDB4MDAsCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBuYW5vYnRzX2F0dHJfYnRzW10gPSB7CisJTk1fQVRUX0lOVEVSRl9CT1VORCwgMHg1NSwgMHg1YiwgMHg2MSwgMHg2NywgMHg2ZCwgMHg3MywKKwkvKiBpbnRlcmZlcmVuY2UgYXZnLiBwZXJpb2QgaW4gbnVtYmVycyBvZiBTQUNDSCBtdWx0aWZyICovCisJTk1fQVRUX0lOVEFWRV9QQVJBTSwgMHgwNiwKKwkvKiBjb25uIGZhaWwgYmFzZWQgb24gU0FDQ0ggZXJyb3IgcmF0ZSAqLworCU5NX0FUVF9DT05OX0ZBSUxfQ1JJVCwgMHgwMCwgMHgwMiwgMHgwMSwgMHgxMCwKKwlOTV9BVFRfVDIwMCwgMHgxZSwgMHgyNCwgMHgyNCwgMHhhOCwgMHgzNCwgMHgyMSwgMHhhOCwKKwlOTV9BVFRfTUFYX1RBLCAweDNmLAorCU5NX0FUVF9PVkVSTF9QRVJJT0QsIDB4MDAsIDB4MDEsIDEwLCAvKiBzZWNvbmRzICovCisJTk1fQVRUX0NDQ0hfTF9ULCAxMCwgLyogcGVyY2VudCAqLworCU5NX0FUVF9DQ0NIX0xfSV9QLCAxLCAvKiBzZWNvbmRzICovCisJTk1fQVRUX1JBQ0hfQl9USFJFU0gsIDEwLCAvKiBidXN5IHRocmVzaG9sZCBpbiAtIGRCbSAqLworCU5NX0FUVF9MREFWR19TTE9UUywgMHgwMywgMHhlOCwgLyogcmFjaCBsb2FkIGF2ZXJhZ2luZyAxMDAwIHNsb3RzICovCisJTk1fQVRUX0JUU19BSVJfVElNRVIsIDEyOCwgLyogbWlsaXNlY29uZHMgKi8KKwlOTV9BVFRfTlkxLCAxMCwgLyogMTAgcmV0cmFuc21pc3Npb25zIG9mIHBoeXNpY2FsIGNvbmZpZyAqLworCU5NX0FUVF9CQ0NIX0FSRkNOLCBIQVJEQ09ERURfQVJGQ04gPj4gOCwgSEFSRENPREVEX0FSRkNOICYgMHhmZiwKKwlOTV9BVFRfQlNJQywgSEFSRENPREVEX0JTSUMsCisJTk1fQVRUX0lQQUNDX0NHSSwgMCwgNywgIDB4MDAsIDB4ZjEsIDB4MTAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBuYW5vYnRzX2F0dHJfcmFkaW9bXSA9IHsKKwlOTV9BVFRfUkZfTUFYUE9XUl9SLCAweDBjLCAvKiBudW1iZXIgb2YgLTJkQiByZWR1Y3Rpb24gc3RlcHMgLyBQbiAqLworCU5NX0FUVF9BUkZDTl9MSVNULCAweDAwLCAweDAyLCBIQVJEQ09ERURfQVJGQ04gPj4gOCwgSEFSRENPREVEX0FSRkNOICYgMHhmZiwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG5hbm9idHNfYXR0cl9uc2VbXSA9IHsKKwlOTV9BVFRfSVBBQ0NfTlNFSSwgMCwgMiwgIDB4MDMsIDB4OWQsIC8qIE5TRUkgOTI1ICovCisJTk1fQVRUX0lQQUNDX05TX0NGRywgMCwgNywgIDMsICAvKiAodW4pYmxvY2tpbmcgdGltZXIgKFRucy1ibG9jaykgKi8KKwkJCQkgICAgMywgIC8qICh1bilibG9ja2luZyByZXRyaWVzICovCisJCQkJICAgIDMsICAvKiByZXNldCB0aW1lciAoVG5zLXJlc2V0KSAqLworCQkJCSAgICAzLCAgLyogcmVzZXQgcmV0cmllcyAqLworCQkJCSAgICAzMCwgIC8qIHRlc3QgdGltZXIgKFRucy10ZXN0KSAqLworCQkJCSAgICAzLCAgLyogYWxpdmUgdGltZXIgKFRucy1hbGl2ZSkgKi8KKwkJCQkgICAgMTAsIC8qIGFsaXZlIHJldHJpcmVzICovCisJTk1fQVRUX0lQQUNDX0JTU0dQX0NGRywgMCwgMTEsCisJCQkJICAgIDMsICAvKiBibG9ja2ltZyB0aW1lciAoVDEpICovCisJCQkJICAgIDMsICAvKiBibG9ja2luZyByZXRyaWVzICovCisJCQkJICAgIDMsICAvKiB1bmJsb2NraW5nIHJldHJpZXMgKi8KKwkJCQkgICAgMywgIC8qIHJlc2V0IHRpbWVyICovCisJCQkJICAgIDMsICAvKiByZXNldCByZXRyaWVzICovCisJCQkJICAgIDEwLCAvKiBzdXNwZW5kIHRpbWVyIChUMykgaW4gMTAwbXMgKi8KKwkJCQkgICAgMywgIC8qIHN1c3BlbmQgcmV0cmllcyAqLworCQkJCSAgICAxMCwgLyogcmVzdW1lIHRpbWVyIChUNCkgaW4gMTAwbXMgKi8KKwkJCQkgICAgMywgIC8qIHJlc3VtZSByZXRyaWVzICovCisJCQkJICAgIDEwLCAvKiBjYXBhYmlsaXR5IHVwZGF0ZSB0aW1lciAoVDUpICovCisJCQkJICAgIDMsICAvKiBjYXBhYmlsaXR5IHVwZGF0ZSByZXRyaWVzICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBuYW5vYnRzX2F0dHJfY2VsbFtdID0geworCU5NX0FUVF9JUEFDQ19SQUMsIDAsIDEsICAxLCAvKiByb3V0aW5nIGFyZWEgY29kZSAqLworCU5NX0FUVF9JUEFDQ19HUFJTX1BBR0lOR19DRkcsIDAsIDIsCisJCTUsCS8qIHJlcGVhdCB0aW1lICg1MG1zKSAqLworCQkzLAkvKiByZXBlYXQgY291bnQgKi8KKwlOTV9BVFRfSVBBQ0NfQlZDSSwgMCwgMiwgIDB4MDMsIDB4OWQsIC8qIEJWQ0kgOTI1ICovCisJTk1fQVRUX0lQQUNDX1JMQ19DRkcsIDAsIDksCisJCTIwLCAJLyogVDMxNDIgKi8KKwkJNSwgCS8qIFQzMTY5ICovCisJCTUsCS8qIFQzMTkxICovCisJCTIwMCwJLyogVDMxOTMgKi8KKwkJNSwJLyogVDMxOTUgKi8KKwkJMTAsCS8qIE4zMTAxICovCisJCTQsCS8qIE4zMTAzICovCisJCTgsCS8qIE4zMTA1ICovCisJCTE1LAkvKiBSTEMgQ1YgY291bnRkb3duICovCisJTk1fQVRUX0lQQUNDX0NPRElOR19TQ0hFTUVTLCAwLCAyLCAgMHgwZiwgMHgwMCwKKwlOTV9BVFRfSVBBQ0NfUkxDX0NGR18yLCAwLCA1LAorCQkweDAwLCAyNTAsCisJCTB4MDAsIDI1MCwKKwkJMiwJLyogTUNTMiAqLworI2lmIDAKKwkvKiBFREdFIG1vZGVsIG9ubHksIGJyZWFrcyBvbGRlciBtb2RlbHMuCisJICogU2hvdWxkIGlucXVpcmUgdGhlIEJUUyBjYXBhYmlsaXRpZXMgKi8KKwlOTV9BVFRfSVBBQ0NfUkxDX0NGR18zLCAwLCAxLAorCQkyLAkvKiBNQ1MyICovCisjZW5kaWYKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG5hbm9idHNfYXR0cl9uc3ZjMFtdID0geworCU5NX0FUVF9JUEFDQ19OU1ZDSSwgMCwgMiwgIDB4MDMsIDB4OWQsIC8qIDkyNSAqLworCU5NX0FUVF9JUEFDQ19OU19MSU5LX0NGRywgMCwgOCwKKwkJMHg1OSwgMHhkOCwgLyogcmVtb3RlIHVkcCBwb3J0ICgyMzAwMCkgKi8KKwkJMTkyLCAxNjgsIDEwMCwgMTEsIC8qIHJlbW90ZSBpcCBhZGRyZXNzICovCisJCTB4NTksIDB4ZDgsIC8qIGxvY2FsIHVkcCBwb3J0ICgyMzAwMCkgKi8KK307CisKKy8qIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuZXZlciB3ZSBnZXQgYSBHU00gMTIuMjEgc3RhdGUgY2hhbmdlIGV2ZW50ICovCitpbnQgbm1fc3RhdGVfZXZlbnQoZW51bSBubV9ldnQgZXZ0LCB1X2ludDhfdCBvYmpfY2xhc3MsIHZvaWQgKm9iaiwKKwkJICAgc3RydWN0IGdzbV9ubV9zdGF0ZSAqb2xkX3N0YXRlLCBzdHJ1Y3QgZ3NtX25tX3N0YXRlICpuZXdfc3RhdGUpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKwlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzOworCXN0cnVjdCBnc21fYnRzX2dwcnNfbnN2YyAqbnN2YzsKKworCS8qIFRoaXMgZXZlbnQtZHJpdmVuIEJUUyBzZXR1cCBpcyBjdXJyZW50bHkgb25seSByZXF1aXJlZCBvbiBuYW5vQlRTICovCisKKwkvKiBFVlRfU1RBVEVDSEdfQURNIGlzIGNhbGxlZCBhZnRlciB3ZSBjYWxsIGNoZ19hZG1fc3RhdGUoKSBhbmQgd291bGQgY3JlYXRlCisJICogZW5kbGVzcyBsb29wICovCisJaWYgKGV2dCAhPSBFVlRfU1RBVEVDSEdfT1BFUikKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKG9ial9jbGFzcykgeworCWNhc2UgTk1fT0NfU0lURV9NQU5BR0VSOgorCQlidHMgPSBjb250YWluZXJfb2Yob2JqLCBzdHJ1Y3QgZ3NtX2J0cywgc2l0ZV9tZ3IpOworCQlpZiAoKG5ld19zdGF0ZS0+b3BlcmF0aW9uYWwgPT0gMiAmJgorCQkgICAgIG5ld19zdGF0ZS0+YXZhaWxhYmlsaXR5ID09IE5NX0FWU1RBVEVfT0spIHx8CisJCSAgICAobmV3X3N0YXRlLT5vcGVyYXRpb25hbCA9PSAxICYmCisJCSAgICAgbmV3X3N0YXRlLT5hdmFpbGFiaWxpdHkgPT0gTk1fQVZTVEFURV9PRkZfTElORSkpCisJCQlhYmlzX25tX29wc3RhcnQoYnRzLCBvYmpfY2xhc3MsIDB4ZmYsIDB4ZmYsIDB4ZmYpOworCQlicmVhazsKKwljYXNlIE5NX09DX0JUUzoKKwkJYnRzID0gb2JqOworCQlpZiAobmV3X3N0YXRlLT5hdmFpbGFiaWxpdHkgPT0gTk1fQVZTVEFURV9ERVBFTkRFTkNZKSB7CisJCQlwYXRjaF9ubV90YWJsZXMoYnRzKTsKKwkJCWFiaXNfbm1fc2V0X2J0c19hdHRyKGJ0cywgbmFub2J0c19hdHRyX2J0cywKKwkJCQkJICAgICBzaXplb2YobmFub2J0c19hdHRyX2J0cykpOworCQkJYWJpc19ubV9jaGdfYWRtX3N0YXRlKGJ0cywgb2JqX2NsYXNzLAorCQkJCQkgICAgICBidHMtPmJ0c19uciwgMHhmZiwgMHhmZiwKKwkJCQkJICAgICAgTk1fU1RBVEVfVU5MT0NLRUQpOworCQkJYWJpc19ubV9vcHN0YXJ0KGJ0cywgb2JqX2NsYXNzLAorCQkJCQlidHMtPmJ0c19uciwgMHhmZiwgMHhmZik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBOTV9PQ19DSEFOTkVMOgorCQl0cyA9IG9iajsKKwkJdHJ4ID0gdHMtPnRyeDsKKwkJaWYgKG5ld19zdGF0ZS0+b3BlcmF0aW9uYWwgPT0gMSAmJgorCQkgICAgbmV3X3N0YXRlLT5hdmFpbGFiaWxpdHkgPT0gTk1fQVZTVEFURV9ERVBFTkRFTkNZKSB7CisJCQlwYXRjaF9ubV90YWJsZXModHJ4LT5idHMpOworCQkJZW51bSBhYmlzX25tX2NoYW5fY29tYiBjY29tYiA9CisJCQkJCQlhYmlzX25tX2NoY29tYjRwY2hhbih0cy0+cGNoYW4pOworCQkJYWJpc19ubV9zZXRfY2hhbm5lbF9hdHRyKHRzLCBjY29tYik7CisJCQlhYmlzX25tX2NoZ19hZG1fc3RhdGUodHJ4LT5idHMsIG9ial9jbGFzcywKKwkJCQkJICAgICAgdHJ4LT5idHMtPmJ0c19uciwgdHJ4LT5uciwgdHMtPm5yLAorCQkJCQkgICAgICBOTV9TVEFURV9VTkxPQ0tFRCk7CisJCQlhYmlzX25tX29wc3RhcnQodHJ4LT5idHMsIG9ial9jbGFzcywKKwkJCQkJdHJ4LT5idHMtPmJ0c19uciwgdHJ4LT5uciwgdHMtPm5yKTsKKwkJfQorCQlicmVhazsKKwljYXNlIE5NX09DX1JBRElPX0NBUlJJRVI6CisJCXRyeCA9IG9iajsKKwkJaWYgKG5ld19zdGF0ZS0+b3BlcmF0aW9uYWwgPT0gMSAmJgorCQkgICAgbmV3X3N0YXRlLT5hdmFpbGFiaWxpdHkgPT0gTk1fQVZTVEFURV9PSykKKwkJCWFiaXNfbm1fb3BzdGFydCh0cngtPmJ0cywgb2JqX2NsYXNzLCB0cngtPmJ0cy0+YnRzX25yLAorCQkJCQl0cngtPm5yLCAweGZmKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9PQ19HUFJTX05TRToKKwkJYnRzID0gY29udGFpbmVyX29mKG9iaiwgc3RydWN0IGdzbV9idHMsIGdwcnMubnNlKTsKKwkJaWYgKCFidHMtPmdwcnMuZW5hYmxlZCkKKwkJCWJyZWFrOworCQlpZiAobmV3X3N0YXRlLT5hdmFpbGFiaWxpdHkgPT0gNSkgeworCQkJYWJpc19ubV9pcGFjY2Vzc19zZXRfYXR0cihidHMsIG9ial9jbGFzcywgYnRzLT5idHNfbnIsCisJCQkJCQkgIDB4ZmYsIDB4ZmYsIG5hbm9idHNfYXR0cl9uc2UsCisJCQkJCQkgIHNpemVvZihuYW5vYnRzX2F0dHJfbnNlKSk7CisJCQlhYmlzX25tX29wc3RhcnQoYnRzLCBvYmpfY2xhc3MsIGJ0cy0+YnRzX25yLAorCQkJCQkweGZmLCAweGZmKTsKKwkJCWFiaXNfbm1fY2hnX2FkbV9zdGF0ZShidHMsIG9ial9jbGFzcywgYnRzLT5idHNfbnIsCisJCQkJCSAgICAgIDB4ZmYsIDB4ZmYsIE5NX1NUQVRFX1VOTE9DS0VEKTsKKwkJfQorCQlicmVhazsKKwljYXNlIE5NX09DX0dQUlNfQ0VMTDoKKwkJYnRzID0gY29udGFpbmVyX29mKG9iaiwgc3RydWN0IGdzbV9idHMsIGdwcnMuY2VsbCk7CisJCWlmICghYnRzLT5ncHJzLmVuYWJsZWQpCisJCQlicmVhazsKKwkJaWYgKG5ld19zdGF0ZS0+YXZhaWxhYmlsaXR5ID09IDUpIHsKKwkJCWFiaXNfbm1faXBhY2Nlc3Nfc2V0X2F0dHIoYnRzLCBvYmpfY2xhc3MsIGJ0cy0+YnRzX25yLAorCQkJCQkJICAwLCAweGZmLCBuYW5vYnRzX2F0dHJfY2VsbCwKKwkJCQkJCSAgc2l6ZW9mKG5hbm9idHNfYXR0cl9jZWxsKSk7CisJCQlhYmlzX25tX29wc3RhcnQoYnRzLCBvYmpfY2xhc3MsIGJ0cy0+YnRzX25yLAorCQkJCQkwLCAweGZmKTsKKwkJCWFiaXNfbm1fY2hnX2FkbV9zdGF0ZShidHMsIG9ial9jbGFzcywgYnRzLT5idHNfbnIsCisJCQkJCSAgICAgIDAsIDB4ZmYsIE5NX1NUQVRFX1VOTE9DS0VEKTsKKwkJfQorCQlicmVhazsKKwljYXNlIE5NX09DX0dQUlNfTlNWQzoKKwkJbnN2YyA9IG9iajsKKwkJYnRzID0gbnN2Yy0+YnRzOworCQlpZiAoIWJ0cy0+Z3Bycy5lbmFibGVkKQorCQkJYnJlYWs7CisJICAgICAgICAvKiBXZSBza2lwIE5TVkMxIHNpbmNlIHdlIG9ubHkgdXNlIE5TVkMwICovCisJCWlmIChuc3ZjLT5pZCA9PSAxKQorCQkJYnJlYWs7CisJCWlmIChuZXdfc3RhdGUtPmF2YWlsYWJpbGl0eSA9PSBOTV9BVlNUQVRFX09GRl9MSU5FKSB7CisJCQlhYmlzX25tX2lwYWNjZXNzX3NldF9hdHRyKGJ0cywgb2JqX2NsYXNzLCBidHMtPmJ0c19uciwKKwkJCQkJCSAgbnN2Yy0+aWQsIDB4ZmYsCisJCQkJCQkgIG5hbm9idHNfYXR0cl9uc3ZjMCwKKwkJCQkJCSAgc2l6ZW9mKG5hbm9idHNfYXR0cl9uc3ZjMCkpOworCQkJYWJpc19ubV9vcHN0YXJ0KGJ0cywgb2JqX2NsYXNzLCBidHMtPmJ0c19uciwKKwkJCQkJbnN2Yy0+aWQsIDB4ZmYpOworCQkJYWJpc19ubV9jaGdfYWRtX3N0YXRlKGJ0cywgb2JqX2NsYXNzLCBidHMtPmJ0c19uciwKKwkJCQkJICAgICAgbnN2Yy0+aWQsIDB4ZmYsCisJCQkJCSAgICAgIE5NX1NUQVRFX1VOTE9DS0VEKTsKKwkJfQorCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogQ2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgd2UgcmVjZWl2ZSBhIDEyLjIxIFNXIGFjdGl2YXRlZCByZXBvcnQgKi8KK3N0YXRpYyBpbnQgc3dfYWN0aXZfcmVwKHN0cnVjdCBtc2diICptYikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9mb21faGRyICpmb2ggPSBtc2diX2wzKG1iKTsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gbWItPnRyeC0+YnRzOworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgZm9oLT5vYmpfaW5zdC50cnhfbnIpOworCisJaWYgKCF0cngpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChmb2gtPm9ial9jbGFzcykgeworCWNhc2UgTk1fT0NfQkFTRUJfVFJBTlNDOgorCQlhYmlzX25tX2NoZ19hZG1fc3RhdGUodHJ4LT5idHMsIGZvaC0+b2JqX2NsYXNzLAorCQkJCSAgICAgIHRyeC0+YnRzLT5idHNfbnIsIHRyeC0+bnIsIDB4ZmYsCisJCQkJICAgICAgTk1fU1RBVEVfVU5MT0NLRUQpOworCQlhYmlzX25tX29wc3RhcnQodHJ4LT5idHMsIGZvaC0+b2JqX2NsYXNzLAorCQkJCXRyeC0+YnRzLT5idHNfbnIsIHRyeC0+bnIsIDB4ZmYpOworCQkvKiBUUlggc29mdHdhcmUgaXMgYWN0aXZlLCB0ZWxsIGl0IHRvIGluaXRpYXRlIFJTTCBMaW5rICovCisJCWFiaXNfbm1faXBhY2Nlc3NfcnNsX2Nvbm5lY3QodHJ4LCAwLCAzMDAzLCB0cngtPnJzbF90ZWkpOworCQlicmVhazsKKwljYXNlIE5NX09DX1JBRElPX0NBUlJJRVI6IHsKKwkJLyoKKwkJICogTG9ja2luZyB0aGUgcmFkaW8gY2FycmllciB3aWxsIG1ha2UgaXQgZ28KKwkJICogb2ZmbGluZSBhZ2FpbiBhbmQgd2Ugd291bGQgY29tZSBoZXJlLiBUaGUKKwkJICogZnJhbWV3b3JrIHNob3VsZCBkZXRlcm1pbmUgdGhhdCB0aGVyZSB3YXMKKwkJICogbm8gY2hhbmdlIGFuZCBhdm9pZCByZWN1cnNpb24uCisJCSAqCisJCSAqIFRoaXMgY29kZSBpcyBoZXJlIHRvIG1ha2Ugc3VyZSB0aGF0IG9uIHN0YXJ0CisJCSAqIGEgVFJYIHJlbWFpbnMgbG9ja2VkLgorCQkgKi8KKwkJaW50IHJjX3N0YXRlID0gdHJ4LT5ubV9zdGF0ZS5hZG1pbmlzdHJhdGl2ZTsKKwkJLyogUGF0Y2ggQVJGQ04gaW50byByYWRpbyBhdHRyaWJ1dGUgKi8KKwkJbmFub2J0c19hdHRyX3JhZGlvWzVdICY9IDB4ZjA7CisJCW5hbm9idHNfYXR0cl9yYWRpb1s1XSB8PSB0cngtPmFyZmNuID4+IDg7CisJCW5hbm9idHNfYXR0cl9yYWRpb1s2XSA9IHRyeC0+YXJmY24gJiAweGZmOworCQlhYmlzX25tX3NldF9yYWRpb19hdHRyKHRyeCwgbmFub2J0c19hdHRyX3JhZGlvLAorCQkJCSAgICAgICBzaXplb2YobmFub2J0c19hdHRyX3JhZGlvKSk7CisJCWFiaXNfbm1fY2hnX2FkbV9zdGF0ZSh0cngtPmJ0cywgZm9oLT5vYmpfY2xhc3MsCisJCQkJICAgICAgdHJ4LT5idHMtPmJ0c19uciwgdHJ4LT5uciwgMHhmZiwKKwkJCQkgICAgICByY19zdGF0ZSk7CisJCWFiaXNfbm1fb3BzdGFydCh0cngtPmJ0cywgZm9oLT5vYmpfY2xhc3MsIHRyeC0+YnRzLT5idHNfbnIsCisJCQkJdHJ4LT5uciwgMHhmZik7CisJCWJyZWFrOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKiBDYWxsYmFjayBmdW5jdGlvbiBmb3IgTkFDSyBvbiB0aGUgT01MIE5NICovCitzdGF0aWMgaW50IG9tbF9tc2dfbmFjayh1X2ludDhfdCBtdCkKK3sKKwlpZiAobXQgPT0gTk1fTVRfU0VUX0JUU19BVFRSX05BQ0spIHsKKwkJTE9HUChETk0sIExPR0xfRkFUQUwsICJGYWlsZWQgdG8gc2V0IEJUUyBhdHRyaWJ1dGVzLiBUaGF0IGlzIGZhdGFsLiAiCisJCQkJIldhcyB0aGUgYnRzIHR5cGUgYW5kIGZyZXF1ZW5jeSBwcm9wZXJseSBzcGVjaWZpZWQ/XG4iKTsKKwkJZXhpdCgtMSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBldmVyeSB0aW1lIHdlIHJlY2VpdmUgYSBzaWduYWwgZnJvbSBOTSAqLworc3RhdGljIGludCBubV9zaWdfY2IodW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IHNpZ25hbCwKKwkJICAgICB2b2lkICpoYW5kbGVyX2RhdGEsIHZvaWQgKnNpZ25hbF9kYXRhKQoreworCXVfaW50OF90ICptc2dfdHlwZTsKKworCXN3aXRjaCAoc2lnbmFsKSB7CisJY2FzZSBTX05NX1NXX0FDVElWX1JFUDoKKwkJcmV0dXJuIHN3X2FjdGl2X3JlcChzaWduYWxfZGF0YSk7CisJY2FzZSBTX05NX05BQ0s6CisJCW1zZ190eXBlID0gc2lnbmFsX2RhdGE7CisJCXJldHVybiBvbWxfbXNnX25hY2soKm1zZ190eXBlKTsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJvb3RzdHJhcF9vbV9uYW5vYnRzKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJLyogV2UgZG9uJ3QgZG8gY2FsbGJhY2sgYmFzZWQgYm9vdHN0cmFwcGluZywgYnV0IGV2ZW50IGRyaXZlbiAoc2VlIGFib3ZlKSAqLworfQorCitzdGF0aWMgdm9pZCBubV9yZWNvbmZpZ190cyhzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzKQoreworCWVudW0gYWJpc19ubV9jaGFuX2NvbWIgY2NvbWIgPSBhYmlzX25tX2NoY29tYjRwY2hhbih0cy0+cGNoYW4pOworCXN0cnVjdCBnc21fZTFfc3Vic2xvdCAqZTFsID0gJnRzLT5lMV9saW5rOworCisJYWJpc19ubV9zZXRfY2hhbm5lbF9hdHRyKHRzLCBjY29tYik7CisKKwlpZiAoaXNfaXBhY2Nlc3NfYnRzKHRzLT50cngtPmJ0cykpCisJCXJldHVybjsKKworCXN3aXRjaCAodHMtPnBjaGFuKSB7CisJY2FzZSBHU01fUENIQU5fVENIX0Y6CisJY2FzZSBHU01fUENIQU5fVENIX0g6CisJCWFiaXNfbm1fY29ubl90ZXJyX3RyYWYodHMsIGUxbC0+ZTFfbnIsIGUxbC0+ZTFfdHMsCisJCQkJCWUxbC0+ZTFfdHNfc3MpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG5tX3JlY29uZmlnX3RyeChzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCkKK3sKKwlzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKmUxbCA9ICZ0cngtPnJzbF9lMV9saW5rOworCWludCBpOworCisJcGF0Y2hfbm1fdGFibGVzKHRyeC0+YnRzKTsKKworCXN3aXRjaCAodHJ4LT5idHMtPnR5cGUpIHsKKwljYXNlIEdTTV9CVFNfVFlQRV9CUzExOgorCQkvKiBGSVhNRTogZGlzY292ZXIgdGhpcyBieSBmZXRjaGluZyBhbiBhdHRyaWJ1dGUgKi8KKyNpZiAwCisJCXRyeC0+bm9taW5hbF9wb3dlciA9IDE1OyAvKiAxNWRCbSA9PSAzMG1XIFBBIGNvbmZpZ3VyYXRpb24gKi8KKyNlbHNlCisJCXRyeC0+bm9taW5hbF9wb3dlciA9IDI0OyAvKiAyNGRCbSA9PSAyNTBtVyBQQSBjb25maWd1cmF0aW9uICovCisjZW5kaWYKKwkJYWJpc19ubV9jb25uX3RlcnJfc2lnbih0cngsIGUxbC0+ZTFfbnIsIGUxbC0+ZTFfdHMsCisJCQkJCWUxbC0+ZTFfdHNfc3MpOworCQlhYmlzX25tX2VzdGFibGlzaF90ZWkodHJ4LT5idHMsIHRyeC0+bnIsIGUxbC0+ZTFfbnIsCisJCQkJICAgICAgZTFsLT5lMV90cywgZTFsLT5lMV90c19zcywgdHJ4LT5yc2xfdGVpKTsKKworCQkvKiBTZXQgUmFkaW8gQXR0cmlidXRlcyAqLworCQlpZiAodHJ4ID09IHRyeC0+YnRzLT5jMCkKKwkJCWFiaXNfbm1fc2V0X3JhZGlvX2F0dHIodHJ4LCBiczExX2F0dHJfcmFkaW8sCisJCQkJCSAgICAgICBzaXplb2YoYnMxMV9hdHRyX3JhZGlvKSk7CisJCWVsc2UgeworCQkJdV9pbnQ4X3QgdHJ4MV9hdHRyX3JhZGlvW3NpemVvZihiczExX2F0dHJfcmFkaW8pXTsKKwkJCXVfaW50OF90IGFyZmNuX2xvdyA9IHRyeC0+YXJmY24gJiAweGZmOworCQkJdV9pbnQ4X3QgYXJmY25faGlnaCA9ICh0cngtPmFyZmNuID4+IDgpICYgMHgwZjsKKwkJCW1lbWNweSh0cngxX2F0dHJfcmFkaW8sIGJzMTFfYXR0cl9yYWRpbywKKwkJCQlzaXplb2YodHJ4MV9hdHRyX3JhZGlvKSk7CisKKwkJCS8qIHBhdGNoIEFSRkNOIGludG8gVFJYIEF0dHJpYnV0ZXMgKi8KKwkJCXRyeDFfYXR0cl9yYWRpb1syXSAmPSAweGYwOworCQkJdHJ4MV9hdHRyX3JhZGlvWzJdIHw9IGFyZmNuX2hpZ2g7CisJCQl0cngxX2F0dHJfcmFkaW9bM10gPSBhcmZjbl9sb3c7CisKKwkJCWFiaXNfbm1fc2V0X3JhZGlvX2F0dHIodHJ4LCB0cngxX2F0dHJfcmFkaW8sCisJCQkJCSAgICAgICBzaXplb2YodHJ4MV9hdHRyX3JhZGlvKSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBHU01fQlRTX1RZUEVfTkFOT0JUUzoKKwkJc3dpdGNoICh0cngtPmJ0cy0+YmFuZCkgeworCQljYXNlIEdTTV9CQU5EXzg1MDoKKwkJY2FzZSBHU01fQkFORF85MDA6CisJCQl0cngtPm5vbWluYWxfcG93ZXIgPSAyMDsKKwkJCWJyZWFrOworCQljYXNlIEdTTV9CQU5EXzE4MDA6CisJCWNhc2UgR1NNX0JBTkRfMTkwMDoKKwkJCXRyeC0+bm9taW5hbF9wb3dlciA9IDIzOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIlVuc3VwcG9ydGVkIG5hbm9CVFMgR1NNIGJhbmQgJXNcbiIsCisJCQkJZ3NtX2JhbmRfbmFtZSh0cngtPmJ0cy0+YmFuZCkpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJZm9yIChpID0gMDsgaSA8IFRSWF9OUl9UUzsgaSsrKQorCQlubV9yZWNvbmZpZ190cygmdHJ4LT50c1tpXSk7Cit9CisKK3N0YXRpYyB2b2lkIG5tX3JlY29uZmlnX2J0cyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCisJc3dpdGNoIChidHMtPnR5cGUpIHsKKwljYXNlIEdTTV9CVFNfVFlQRV9CUzExOgorCQlwYXRjaF9ubV90YWJsZXMoYnRzKTsKKwkJYWJpc19ubV9yYXdfbXNnKGJ0cywgc2l6ZW9mKG1zZ18xKSwgbXNnXzEpOyAvKiBzZXQgQlRTIFNpdGVNZ3IgYXR0ciovCisJCWFiaXNfbm1fc2V0X2J0c19hdHRyKGJ0cywgYnMxMV9hdHRyX2J0cywgc2l6ZW9mKGJzMTFfYXR0cl9idHMpKTsKKwkJYWJpc19ubV9yYXdfbXNnKGJ0cywgc2l6ZW9mKG1zZ18zKSwgbXNnXzMpOyAvKiBzZXQgQlRTIGhhbmRvdmVyIGF0dHIgKi8KKwkJYWJpc19ubV9yYXdfbXNnKGJ0cywgc2l6ZW9mKG1zZ180KSwgbXNnXzQpOyAvKiBzZXQgQlRTIHBvd2VyIGNvbnRyb2wgYXR0ciAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0cngsICZidHMtPnRyeF9saXN0LCBsaXN0KQorCQlubV9yZWNvbmZpZ190cngodHJ4KTsKK30KKworc3RhdGljIHZvaWQgYm9vdHN0cmFwX29tX2JzMTEoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwkvKiBzdG9wIHNlbmRpbmcgZXZlbnQgcmVwb3J0cyAqLworCWFiaXNfbm1fZXZlbnRfcmVwb3J0cyhidHMsIDApOworCisJLyogYmVnaW4gREIgdHJhbnNtaXNzaW9uICovCisJYWJpc19ubV9iczExX2RiX3RyYW5zbWlzc2lvbihidHMsIDEpOworCisJLyogZW5kIERCIHRyYW5zbWlzc2lvbiAqLworCWFiaXNfbm1fYnMxMV9kYl90cmFuc21pc3Npb24oYnRzLCAwKTsKKworCS8qIFJlc2V0IEJUUyBTaXRlIG1hbmFnZXIgcmVzb3VyY2UgKi8KKwlhYmlzX25tX2JzMTFfcmVzZXRfcmVzb3VyY2UoYnRzKTsKKworCS8qIGJlZ2luIERCIHRyYW5zbWlzc2lvbiAqLworCWFiaXNfbm1fYnMxMV9kYl90cmFuc21pc3Npb24oYnRzLCAxKTsKKworCS8qIHJlY29uZmlndXJlIEJUUyB3aXRoIGFsbCBUUlggYW5kIGFsbCBUUyAqLworCW5tX3JlY29uZmlnX2J0cyhidHMpOworCisJLyogZW5kIERCIHRyYW5zbWlzc2lvbiAqLworCWFiaXNfbm1fYnMxMV9kYl90cmFuc21pc3Npb24oYnRzLCAwKTsKKworCS8qIFJlc2V0IEJUUyBTaXRlIG1hbmFnZXIgcmVzb3VyY2UgKi8KKwlhYmlzX25tX2JzMTFfcmVzZXRfcmVzb3VyY2UoYnRzKTsKKworCS8qIHJlc3RhcnQgc2VuZGluZyBldmVudCByZXBvcnRzICovCisJYWJpc19ubV9ldmVudF9yZXBvcnRzKGJ0cywgMSk7Cit9CisKK3N0YXRpYyB2b2lkIGJvb3RzdHJhcF9vbShzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCUxPR1AoRE5NLCBMT0dMX05PVElDRSwgImJvb3RzdHJhcHBpbmcgT01MIGZvciBCVFMgJXVcbiIsIGJ0cy0+bnIpOworCisJc3dpdGNoIChidHMtPnR5cGUpIHsKKwljYXNlIEdTTV9CVFNfVFlQRV9CUzExOgorCQlib290c3RyYXBfb21fYnMxMShidHMpOworCQlicmVhazsKKwljYXNlIEdTTV9CVFNfVFlQRV9OQU5PQlRTOgorCQlib290c3RyYXBfb21fbmFub2J0cyhidHMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIlVuYWJsZSB0byBib290c3RyYXAgT01MOiBVbmtub3duIEJUUyB0eXBlICVkXG4iLCBidHMtPnR5cGUpOworCX0KK30KKworc3RhdGljIGludCBzaHV0ZG93bl9vbShzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCUxPR1AoRE5NLCBMT0dMX05PVElDRSwgInNodXR0aW5nIGRvd24gT01MIGZvciBCVFMgJXVcbiIsIGJ0cy0+bnIpOworCisJLyogc3RvcCBzZW5kaW5nIGV2ZW50IHJlcG9ydHMgKi8KKwlhYmlzX25tX2V2ZW50X3JlcG9ydHMoYnRzLCAwKTsKKworCS8qIGJlZ2luIERCIHRyYW5zbWlzc2lvbiAqLworCWFiaXNfbm1fYnMxMV9kYl90cmFuc21pc3Npb24oYnRzLCAxKTsKKworCS8qIGVuZCBEQiB0cmFuc21pc3Npb24gKi8KKwlhYmlzX25tX2JzMTFfZGJfdHJhbnNtaXNzaW9uKGJ0cywgMCk7CisKKwkvKiBSZXNldCBCVFMgU2l0ZSBtYW5hZ2VyIHJlc291cmNlICovCisJYWJpc19ubV9iczExX3Jlc2V0X3Jlc291cmNlKGJ0cyk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGJzY19zaHV0ZG93bl9uZXQoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGJ0cywgJm5ldC0+YnRzX2xpc3QsIGxpc3QpIHsKKwkJaW50IHJjOworCQlyYyA9IHNodXRkb3duX29tKGJ0cyk7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIHNldCBhbGwgc3lzdGVtIGluZm9ybWF0aW9uIHR5cGVzICovCitzdGF0aWMgaW50IHNldF9zeXN0ZW1faW5mb3Moc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpCit7CisJaW50IGksIHJjOworCXVfaW50OF90IHNpX3RtcFsyM107CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHRyeC0+YnRzOworCisJYnRzLT5zaV9jb21tb24uY2VsbF9zZWxfcGFyLm1zX3R4cHdyX21heF9jY2NoID0KKwkJCW1zX3B3cl9jdGxfbHZsKGJ0cy0+YmFuZCwgYnRzLT5tc19tYXhfcG93ZXIpOworCWJ0cy0+c2lfY29tbW9uLmNlbGxfc2VsX3Bhci5uZWNpID0gYnRzLT5uZXR3b3JrLT5uZWNpOworCisJaWYgKHRyeCA9PSB0cngtPmJ0cy0+YzApIHsKKwkJZm9yIChpID0gMTsgaSA8PSA0OyBpKyspIHsKKwkJCXJjID0gZ3NtX2dlbmVyYXRlX3NpKHNpX3RtcCwgdHJ4LT5idHMsIGkpOworCQkJaWYgKHJjIDwgMCkKKwkJCQlnb3RvIGVycl9vdXQ7CisJCQlERUJVR1AoRFJSLCAiU0klMnU6ICVzXG4iLCBpLCBoZXhkdW1wKHNpX3RtcCwgcmMpKTsKKwkJCXJzbF9iY2NoX2luZm8odHJ4LCBpLCBzaV90bXAsIHNpemVvZihzaV90bXApKTsKKwkJfQorCQlpZiAoYnRzLT5ncHJzLmVuYWJsZWQpIHsKKwkJCWkgPSAxMzsKKwkJCXJjID0gZ3NtX2dlbmVyYXRlX3NpKHNpX3RtcCwgdHJ4LT5idHMsIFJTTF9TWVNURU1fSU5GT18xMyk7CisJCQlpZiAocmMgPCAwKQorCQkJCWdvdG8gZXJyX291dDsKKwkJCURFQlVHUChEUlIsICJTSSUydTogJXNcbiIsIGksIGhleGR1bXAoc2lfdG1wLCByYykpOworCQkJcnNsX2JjY2hfaW5mbyh0cngsIFJTTF9TWVNURU1fSU5GT18xMywgc2lfdG1wLCByYyk7CisJCX0KKwl9CisKKwlpID0gNTsKKwlyYyA9IGdzbV9nZW5lcmF0ZV9zaShzaV90bXAsIHRyeC0+YnRzLCBSU0xfU1lTVEVNX0lORk9fNSk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBlcnJfb3V0OworCURFQlVHUChEUlIsICJTSSUydTogJXNcbiIsIGksIGhleGR1bXAoc2lfdG1wLCByYykpOworCXJzbF9zYWNjaF9maWxsaW5nKHRyeCwgUlNMX1NZU1RFTV9JTkZPXzUsIHNpX3RtcCwgcmMpOworCisJaSA9IDY7CisJcmMgPSBnc21fZ2VuZXJhdGVfc2koc2lfdG1wLCB0cngtPmJ0cywgUlNMX1NZU1RFTV9JTkZPXzYpOworCWlmIChyYyA8IDApCisJCWdvdG8gZXJyX291dDsKKwlERUJVR1AoRFJSLCAiU0klMnU6ICVzXG4iLCBpLCBoZXhkdW1wKHNpX3RtcCwgcmMpKTsKKwlyc2xfc2FjY2hfZmlsbGluZyh0cngsIFJTTF9TWVNURU1fSU5GT182LCBzaV90bXAsIHJjKTsKKworCXJldHVybiAwOworZXJyX291dDoKKwlMT0dQKERSUiwgTE9HTF9FUlJPUiwgIkNhbm5vdCBnZW5lcmF0ZSBTSSAldSBmb3IgQlRTICV1LCBtb3N0IGxpa2VseSAiCisJCSJhIHByb2JsZW0gd2l0aCBuZWlnaGJvciBjZWxsIGxpc3QgZ2VuZXJhdGlvblxuIiwKKwkJaSwgdHJ4LT5idHMtPm5yKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBQYXRjaCB0aGUgdmFyaW91cyBTWVNURU0gSU5GT1JNQVRJT04gdGFibGVzIHRvIHVwZGF0ZQorICogdGhlIExBSQorICovCitzdGF0aWMgdm9pZCBwYXRjaF9ubV90YWJsZXMoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwl1X2ludDhfdCBhcmZjbl9sb3cgPSBidHMtPmMwLT5hcmZjbiAmIDB4ZmY7CisJdV9pbnQ4X3QgYXJmY25faGlnaCA9IChidHMtPmMwLT5hcmZjbiA+PiA4KSAmIDB4MGY7CisKKwkvKiBwYXRjaCBBUkZDTiBpbnRvIEJUUyBBdHRyaWJ1dGVzICovCisJYnMxMV9hdHRyX2J0c1s2OV0gJj0gMHhmMDsKKwliczExX2F0dHJfYnRzWzY5XSB8PSBhcmZjbl9oaWdoOworCWJzMTFfYXR0cl9idHNbNzBdID0gYXJmY25fbG93OworCW5hbm9idHNfYXR0cl9idHNbNDJdICY9IDB4ZjA7CisJbmFub2J0c19hdHRyX2J0c1s0Ml0gfD0gYXJmY25faGlnaDsKKwluYW5vYnRzX2F0dHJfYnRzWzQzXSA9IGFyZmNuX2xvdzsKKworCS8qIHBhdGNoIEFSRkNOIGludG8gVFJYIEF0dHJpYnV0ZXMgKi8KKwliczExX2F0dHJfcmFkaW9bMl0gJj0gMHhmMDsKKwliczExX2F0dHJfcmFkaW9bMl0gfD0gYXJmY25faGlnaDsKKwliczExX2F0dHJfcmFkaW9bM10gPSBhcmZjbl9sb3c7CisKKwkvKiBwYXRjaCBCU0lDICovCisJYnMxMV9hdHRyX2J0c1sxXSA9IGJ0cy0+YnNpYzsKKwluYW5vYnRzX2F0dHJfYnRzW3NpemVvZihuYW5vYnRzX2F0dHJfYnRzKS0xMV0gPSBidHMtPmJzaWM7CisKKwkvKiBwYXRjaCBDR0kgKi8KKwlhYmlzX25tX2lwYWNjZXNzX2NnaShuYW5vYnRzX2F0dHJfYnRzK3NpemVvZihuYW5vYnRzX2F0dHJfYnRzKS03LCBidHMpOworCisJLyogcGF0Y2ggdGhlIHBvd2VyIHJlZHVjdGlvbiAqLworCWJzMTFfYXR0cl9yYWRpb1s1XSA9IGJ0cy0+YzAtPm1heF9wb3dlcl9yZWQgLyAyOworCW5hbm9idHNfYXR0cl9yYWRpb1sxXSA9IGJ0cy0+YzAtPm1heF9wb3dlcl9yZWQgLyAyOworCisJLyogcGF0Y2ggTlNFSSAqLworCW5hbm9idHNfYXR0cl9uc2VbM10gPSBidHMtPmdwcnMubnNlLm5zZWkgPj4gODsKKwluYW5vYnRzX2F0dHJfbnNlWzRdID0gYnRzLT5ncHJzLm5zZS5uc2VpICYgMHhmZjsKKworCS8qIHBhdGNoIE5TVkNJICovCisJbmFub2J0c19hdHRyX25zdmMwWzNdID0gYnRzLT5ncHJzLm5zdmNbMF0ubnN2Y2kgPj4gODsKKwluYW5vYnRzX2F0dHJfbnN2YzBbNF0gPSBidHMtPmdwcnMubnN2Y1swXS5uc3ZjaSAmIDB4ZmY7CisKKwkvKiBwYXRjaCBJUCBhZGRyZXNzIGFzIFNHU04gSVAgKi8KKwkqKHVfaW50MTZfdCAqKShuYW5vYnRzX2F0dHJfbnN2YzArOCkgPQorCQkJCWh0b25zKGJ0cy0+Z3Bycy5uc3ZjWzBdLnJlbW90ZV9wb3J0KTsKKwkqKHVfaW50MzJfdCAqKShuYW5vYnRzX2F0dHJfbnN2YzArMTApID0KKwkJCQlodG9ubChidHMtPmdwcnMubnN2Y1swXS5yZW1vdGVfaXApOworCSoodV9pbnQxNl90ICopKG5hbm9idHNfYXR0cl9uc3ZjMCsxNCkgPQorCQkJCWh0b25zKGJ0cy0+Z3Bycy5uc3ZjWzBdLmxvY2FsX3BvcnQpOworCisJLyogcGF0Y2ggQlZDSSAqLworCW5hbm9idHNfYXR0cl9jZWxsWzEyXSA9IGJ0cy0+Z3Bycy5jZWxsLmJ2Y2kgPj4gODsKKwluYW5vYnRzX2F0dHJfY2VsbFsxM10gPSBidHMtPmdwcnMuY2VsbC5idmNpICYgMHhmZjsKKwkvKiBwYXRjaCBSQUMgKi8KKwluYW5vYnRzX2F0dHJfY2VsbFszXSA9IGJ0cy0+Z3Bycy5yYWM7CisKK30KKworc3RhdGljIHZvaWQgYm9vdHN0cmFwX3JzbChzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCkKK3sKKwlMT0dQKERSU0wsIExPR0xfTk9USUNFLCAiYm9vdHN0cmFwcGluZyBSU0wgZm9yIEJUUy9UUlggKCV1LyV1KSAiCisJCSJvbiBBUkZDTiAldSB1c2luZyBNQ0M9JXUgTU5DPSV1IExBQz0ldSBDSUQ9JXUgQlNJQz0ldSBUU0M9JXVcbiIsCisJCXRyeC0+YnRzLT5uciwgdHJ4LT5uciwgdHJ4LT5hcmZjbiwgYnNjX2dzbW5ldC0+Y291bnRyeV9jb2RlLAorCQlic2NfZ3NtbmV0LT5uZXR3b3JrX2NvZGUsIHRyeC0+YnRzLT5sb2NhdGlvbl9hcmVhX2NvZGUsCisJCXRyeC0+YnRzLT5jZWxsX2lkZW50aXR5LCB0cngtPmJ0cy0+YnNpYywgdHJ4LT5idHMtPnRzYyk7CisJc2V0X3N5c3RlbV9pbmZvcyh0cngpOworfQorCit2b2lkIGlucHV0X2V2ZW50KGludCBldmVudCwgZW51bSBlMWlucF9zaWduX3R5cGUgdHlwZSwgc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpCit7CisJc3dpdGNoIChldmVudCkgeworCWNhc2UgRVZUX0UxX1RFSV9VUDoKKwkJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgRTFJTlBfU0lHTl9PTUw6CisJCQlib290c3RyYXBfb20odHJ4LT5idHMpOworCQkJYnJlYWs7CisJCWNhc2UgRTFJTlBfU0lHTl9SU0w6CisJCQlib290c3RyYXBfcnNsKHRyeCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgRVZUX0UxX1RFSV9ETjoKKwkJTE9HUChETUksIExPR0xfTk9USUNFLCAiTG9zdCBzb21lIEUxIFRFSSBsaW5rXG4iKTsKKwkJLyogRklYTUU6IGRlYWwgd2l0aCBURUkgb3IgTDEgbGluayBsb3NzICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCBib290c3RyYXBfYnRzKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3dpdGNoIChidHMtPmJhbmQpIHsKKwljYXNlIEdTTV9CQU5EXzE4MDA6CisJCWlmIChidHMtPmMwLT5hcmZjbiA8IDUxMiB8fCBidHMtPmMwLT5hcmZjbiA+IDg4NSkgeworCQkJTE9HUChETk0sIExPR0xfRVJST1IsICJHU00xODAwIGNoYW5uZWwgbXVzdCBiZSBiZXR3ZWVuIDUxMi04ODUuXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCWNhc2UgR1NNX0JBTkRfMTkwMDoKKwkJaWYgKGJ0cy0+YzAtPmFyZmNuIDwgNTEyIHx8IGJ0cy0+YzAtPmFyZmNuID4gODEwKSB7CisJCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIkdTTTE5MDAgY2hhbm5lbCBtdXN0IGJlIGJldHdlZW4gNTEyLTgxMC5cbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBHU01fQkFORF85MDA6CisJCWlmIChidHMtPmMwLT5hcmZjbiA8IDEgfHwKKwkJICAgKGJ0cy0+YzAtPmFyZmNuID4gMTI0ICYmIGJ0cy0+YzAtPmFyZmNuIDwgOTU1KSB8fAorCQkgICAgYnRzLT5jMC0+YXJmY24gPiAxMDIzKSAgeworCQkJTE9HUChETk0sIExPR0xfRVJST1IsICJHU005MDAgY2hhbm5lbCBtdXN0IGJlIGJldHdlZW4gMS0xMjQsIDk1NS0xMDIzLlxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIlVuc3VwcG9ydGVkIGZyZXF1ZW5jeSBiYW5kLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChidHMtPm5ldHdvcmstPmF1dGhfcG9saWN5ID09IEdTTV9BVVRIX1BPTElDWV9BQ0NFUFRfQUxMICYmCisJICAgICFidHMtPnNpX2NvbW1vbi5yYWNoX2NvbnRyb2wuY2VsbF9iYXIpCisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiXG5XQVJOSU5HOiBZb3UgYXJlIHJ1bm5pbmcgYW4gJ2FjY2VwdC1hbGwnICIKKwkJCSJuZXR3b3JrIG9uIGEgQlRTIHRoYXQgaXMgbm90IGJhcnJlZC4gIFRoaXMgIgorCQkJImNvbmZpZ3VyYXRpb24gaXMgbGlrZWx5IHRvIGludGVyZmVyZSB3aXRoIHByb2R1Y3Rpb24gIgorCQkJIkdTTSBuZXR3b3JrcyBhbmQgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiBhIFJGICIKKwkJCSJzaGllbGRlZCBlbnZpcm9ubWVudCBzdWNoIGFzIGEgZmFyYWRheSBjYWdlIVxuXG4iKTsKKworCS8qIENvbnRyb2wgQ2hhbm5lbCBEZXNjcmlwdGlvbiAqLworCWJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYy5hdHQgPSAxOworCWJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYy5jY2NoX2NvbmYgPSBSU0xfQkNDSF9DQ0NIX0NPTkZfMV9DOworCWJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYy5ic19wYV9tZnJtcyA9IFJTTF9CU19QQV9NRlJNU181OworCS8qIFQzMjEyIGlzIHNldCBmcm9tIHZ0eS9jb25maWcgKi8KKworCS8qIHNvbWUgZGVmYXVsdHMgZm9yIG91ciBzeXN0ZW0gaW5mb3JtYXRpb24gKi8KKwlidHMtPnNpX2NvbW1vbi5jZWxsX29wdGlvbnMucmFkaW9fbGlua190aW1lb3V0ID0gMjsgLyogMTIgKi8KKwlidHMtPnNpX2NvbW1vbi5jZWxsX29wdGlvbnMuZHR4ID0gMjsgLyogTVMgc2hhbGwgbm90IHVzZSB1cHBsaW5rIERUWCAqLworCWJ0cy0+c2lfY29tbW9uLmNlbGxfb3B0aW9ucy5wd3JjID0gMDsgLyogUFdSQyBub3Qgc2V0ICovCisKKwlidHMtPnNpX2NvbW1vbi5jZWxsX3NlbF9wYXIuYWNzID0gMDsKKworCWJ0cy0+c2lfY29tbW9uLm5jY19wZXJtaXR0ZWQgPSAweGZmOworCisJcGFnaW5nX2luaXQoYnRzKTsKKworCXJldHVybiAwOworfQorCitpbnQgYnNjX2Jvb3RzdHJhcF9uZXR3b3JrKGludCAoKm1uY2NfcmVjdikoc3RydWN0IGdzbV9uZXR3b3JrICosIGludCwgdm9pZCAqKSwKKwkJCSAgY29uc3QgY2hhciAqY29uZmlnX2ZpbGUpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKwlpbnQgcmM7CisKKwkvKiBpbml0aWFsaXplIG91ciBkYXRhIHN0cnVjdHVyZXMgKi8KKwlic2NfZ3NtbmV0ID0gZ3NtX25ldHdvcmtfaW5pdCgxLCAxLCBtbmNjX3JlY3YpOworCWlmICghYnNjX2dzbW5ldCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlic2NfZ3NtbmV0LT5uYW1lX2xvbmcgPSB0YWxsb2Nfc3RyZHVwKGJzY19nc21uZXQsICJPcGVuQlNDIik7CisJYnNjX2dzbW5ldC0+bmFtZV9zaG9ydCA9IHRhbGxvY19zdHJkdXAoYnNjX2dzbW5ldCwgIk9wZW5CU0MiKTsKKworCXRlbG5ldF9pbml0KGJzY19nc21uZXQsIDQyNDIpOworCXJjID0gdnR5X3JlYWRfY29uZmlnX2ZpbGUoY29uZmlnX2ZpbGUpOworCWlmIChyYyA8IDApIHsKKwkJTE9HUChETk0sIExPR0xfRkFUQUwsICJGYWlsZWQgdG8gcGFyc2UgdGhlIGNvbmZpZyBmaWxlOiAnJXMnXG4iLCBjb25maWdfZmlsZSk7CisJCXJldHVybiByYzsKKwl9CisKKwlyZWdpc3Rlcl9zaWduYWxfaGFuZGxlcihTU19OTSwgbm1fc2lnX2NiLCBOVUxMKTsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGJ0cywgJmJzY19nc21uZXQtPmJ0c19saXN0LCBsaXN0KSB7CisJCWJvb3RzdHJhcF9idHMoYnRzKTsKKwkJaWYgKCFpc19pcGFjY2Vzc19idHMoYnRzKSkKKwkJCXJjID0gZTFfcmVjb25maWdfYnRzKGJ0cyk7CisKKwkJaWYgKHJjIDwgMCkKKwkJCWV4aXQgKDEpOworCX0KKworCS8qIGluaXRpYWxpemUgbmFub0JUUyBzdXBwb3J0IG9tY2UgKi8KKwlyYyA9IGlwYWNjZXNzX3NldHVwKGJzY19nc21uZXQpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9ic2NfcmxsLmMgYi9vcGVuYnNjL3NyYy9ic2NfcmxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU1MWQ5NAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2JzY19ybGwuYwpAQCAtMCwwICsxLDExNyBAQAorLyogR1NNIEJTQyBSYWRpbyBMaW5rIExheWVyIEFQSQorICogM0dQUCBUUyAwOC41OCB2ZXJzaW9uIDguNi4wIFJlbGVhc2UgMTk5OSAvIEVUU0kgVFMgMTAwIDU5NiBWOC42LjAgKi8KKworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGltZXIuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2JzY19ybGwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9jaGFuX2FsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX3JzbC5oPgorCitzdHJ1Y3QgYnNjX3JsbF9yZXEgeworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKwl1X2ludDhfdCBsaW5rX2lkOworCisJdm9pZCAoKmNiKShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgbGlua19pZCwKKwkJICAgdm9pZCAqZGF0YSwgZW51bSBic2Nfcmxscl9pbmQpOworCXZvaWQgKmRhdGE7Cit9OworCisvKiB3ZSBvbmx5IGNvbXBhcmUgQzEsIEMyIGFuZCBTQVBJICovCisjZGVmaW5lIExJTktJRF9NQVNLCTB4QzcKKworc3RhdGljIExMSVNUX0hFQUQoYnNjX3JsbF9yZXFzKTsKKworc3RhdGljIHZvaWQgY29tcGxldGVfcmxscihzdHJ1Y3QgYnNjX3JsbF9yZXEgKnJsbHIsIGVudW0gYnNjX3JsbHJfaW5kIHR5cGUpCit7CisJbGxpc3RfZGVsKCZybGxyLT5saXN0KTsKKwlwdXRfbGNoYW4ocmxsci0+bGNoYW4pOworCXJsbHItPmNiKHJsbHItPmxjaGFuLCBybGxyLT5saW5rX2lkLCBybGxyLT5kYXRhLCB0eXBlKTsKKwl0YWxsb2NfZnJlZShybGxyKTsKK30KKworc3RhdGljIHZvaWQgdGltZXJfY2Iodm9pZCAqX3JsbHIpCit7CisJc3RydWN0IGJzY19ybGxfcmVxICpybGxyID0gX3JsbHI7CisKKwljb21wbGV0ZV9ybGxyKHJsbHIsIEJTQ19STExSX0lORF9USU1FT1VUKTsKK30KKworLyogZXN0YWJsaXNoIGEgUkxMIGNvbm5lY3Rpb24gd2l0aCBnaXZlbiBTQVBJIC8gcHJpb3JpdHkgKi8KK2ludCBybGxfZXN0YWJsaXNoKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBzYXBpLAorCQkgIHZvaWQgKCpjYikoc3RydWN0IGdzbV9sY2hhbiAqLCB1X2ludDhfdCwgdm9pZCAqLAorCQkJICAgICBlbnVtIGJzY19ybGxyX2luZCksCisJCSAgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYnNjX3JsbF9yZXEgKnJsbHIgPSB0YWxsb2NfemVybyh0YWxsX2JzY19jdHgsIHN0cnVjdCBic2NfcmxsX3JlcSk7CisJdV9pbnQ4X3QgbGlua19pZDsKKwlpZiAoIXJsbHIpCisJCXJldHVybiAtRU5PTUVNOworCisJbGlua19pZCA9IHNhcGk7CisKKwkvKiBJZiB3ZSBhcmUgYSBUQ0ggYW5kIG5vdCBpbiBzaWduYWxsaW5nIG1vZGUsIHdlIG5lZWQgdG8KKwkgKiBpbmRpY2F0ZSB0aGF0IHRoZSBuZXcgUkxMIGNvbm5lY3Rpb24gaXMgdG8gYmUgbWFkZSBvbiB0aGUgU0FDQ0ggKi8KKwlpZiAoKGxjaGFuLT50eXBlID09IEdTTV9MQ0hBTl9UQ0hfRiB8fAorCSAgICAgbGNoYW4tPnR5cGUgPT0gR1NNX0xDSEFOX1RDSF9IKSAmJiBzYXBpICE9IDApCisJCWxpbmtfaWQgfD0gMHg0MDsKKworCXVzZV9sY2hhbihsY2hhbik7CisJcmxsci0+bGNoYW4gPSBsY2hhbjsKKwlybGxyLT5saW5rX2lkID0gbGlua19pZDsKKwlybGxyLT5jYiA9IGNiOworCXJsbHItPmRhdGEgPSBkYXRhOworCisJbGxpc3RfYWRkKCZybGxyLT5saXN0LCAmYnNjX3JsbF9yZXFzKTsKKworCXJsbHItPnRpbWVyLmNiID0gJnRpbWVyX2NiOworCXJsbHItPnRpbWVyLmRhdGEgPSBybGxyOworCisJYnNjX3NjaGVkdWxlX3RpbWVyKCZybGxyLT50aW1lciwgMTAsIDApOworCisJLyogc2VuZCB0aGUgUlNMIFJMTCBFU1RhYmxpc2ggUkVRdWVzdCAqLworCXJldHVybiByc2xfZXN0YWJsaXNoX3JlcXVlc3Qocmxsci0+bGNoYW4sIHJsbHItPmxpbmtfaWQpOworfQorCisvKiBDYWxsZWQgZnJvbSBSU0wgY29kZSBpbiBjYXNlIHdlIGhhdmUgcmVjZWl2ZWQgYW4gaW5kaWNhdGlvbiByZWdhcmRpbmcKKyAqIGFueSBSTEwgbGluayAqLwordm9pZCBybGxfaW5kaWNhdGlvbihzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgbGlua19pZCwgdV9pbnQ4X3QgdHlwZSkKK3sKKwlzdHJ1Y3QgYnNjX3JsbF9yZXEgKnJsbHIsICpybGxyMjsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmxsciwgcmxscjIsICZic2NfcmxsX3JlcXMsIGxpc3QpIHsKKwkJaWYgKHJsbHItPmxjaGFuID09IGxjaGFuICYmCisJCSAgICAocmxsci0+bGlua19pZCAmIExJTktJRF9NQVNLKSA9PSAobGlua19pZCAmIExJTktJRF9NQVNLKSkgeworCQkJYnNjX2RlbF90aW1lcigmcmxsci0+dGltZXIpOworCQkJY29tcGxldGVfcmxscihybGxyLCB0eXBlKTsKKwkJCXJldHVybjsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2JzY192ZXJzaW9uLmMgYi9vcGVuYnNjL3NyYy9ic2NfdmVyc2lvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNjYxOTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9ic2NfdmVyc2lvbi5jCkBAIC0wLDAgKzEsMzIgQEAKKy8qIEhvbGQgdGhlIGNvcHlyaWdodCBhbmQgdmVyc2lvbiBzdHJpbmcgKi8KKy8qIChDKSAyMDEwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgImJzY2NvbmZpZy5oIgorCitjb25zdCBjaGFyICpvcGVuYnNjX3ZlcnNpb24gPSAiT3BlbkJTQyAiIFBBQ0tBR0VfVkVSU0lPTjsKK2NvbnN0IGNoYXIgKm9wZW5ic2NfY29weXJpZ2h0ID0KKwkiQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgSGFyYWxkIFdlbHRlLCBIb2xnZXIgRnJleXRoZXJcbiIKKwkiQ29udHJpYnV0aW9ucyBieSBEYW5pZWwgV2lsbG1hbm4sIEphbiBMw7xiYmUsU3RlZmFuIFNjaG1pZHRcbiIKKwkiRGlldGVyIFNwYWFyLCBBbmRyZWFzIEV2ZXJzYmVyZ1xuXG4iCisJIkxpY2Vuc2UgR1BMdjIrOiBHTlUgR1BMIHZlcnNpb24gMiBvciBsYXRlciA8aHR0cDovL2dudS5vcmcvbGljZW5zZXMvZ3BsLmh0bWw+XG4iCisJIlRoaXMgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGFyZSBmcmVlIHRvIGNoYW5nZSBhbmQgcmVkaXN0cmlidXRlIGl0LlxuIgorCSJUaGVyZSBpcyBOTyBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3LlxuIjsKKworCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9idHNfaXBhY2Nlc3NfbmFub2J0cy5jIGIvb3BlbmJzYy9zcmMvYnRzX2lwYWNjZXNzX25hbm9idHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjQ4ZWE5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvYnRzX2lwYWNjZXNzX25hbm9idHMuYwpAQCAtMCwwICsxLDg0IEBACisvKiBpcC5hY2Nlc3MgbmFub0JUUyBzcGVjaWZpYyBjb2RlICovCisKKy8qIChDKSAyMDA5LTIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19ubS5oPgorCitzdGF0aWMgc3RydWN0IGdzbV9idHNfbW9kZWwgbW9kZWxfbmFub2J0cyA9IHsKKwkudHlwZSA9IEdTTV9CVFNfVFlQRV9OQU5PQlRTLAorCS5ubV9hdHRfdGx2ZGVmID0geworCQkuZGVmID0geworCQkJLyogaXAuYWNjZXNzIHNwZWNpZmljcyAqLworCQkJW05NX0FUVF9JUEFDQ19EU1RfSVBdID0JCXsgVExWX1RZUEVfRklYRUQsIDQgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfRFNUX0lQX1BPUlRdID0JeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorCQkJW05NX0FUVF9JUEFDQ19TVFJFQU1fSURdID0JeyBUTFZfVFlQRV9UViwgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfRlJFUV9DVFJMXSA9CXsgVExWX1RZUEVfVFYsIH0sCisJCQlbTk1fQVRUX0lQQUNDX1NFQ19PTUxfQ0ZHXSA9CXsgVExWX1RZUEVfRklYRUQsIDYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfSVBfSUZfQ0ZHXSA9CXsgVExWX1RZUEVfRklYRUQsIDggfSwKKwkJCVtOTV9BVFRfSVBBQ0NfSVBfR1dfQ0ZHXSA9CXsgVExWX1RZUEVfRklYRUQsIDEyIH0sCisJCQlbTk1fQVRUX0lQQUNDX0lOX1NFUlZfVElNRV0gPQl7IFRMVl9UWVBFX0ZJWEVELCA0IH0sCisJCQlbTk1fQVRUX0lQQUNDX0xPQ0FUSU9OXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfUEFHSU5HX0NGR10gPQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisJCQlbTk1fQVRUX0lQQUNDX1VOSVRfSURdID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19VTklUX05BTUVdID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19TTk1QX0NGR10gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX1BSSU1fT01MX0NGR19MSVNUXSA9IHsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfTlZfRkxBR1NdID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19GUkVRX0NUUkxdID0JeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorCQkJW05NX0FUVF9JUEFDQ19QUklNX09NTF9GQl9UT1VUXSA9IHsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfQ1VSX1NXX0NGR10gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX1RJTUlOR19CVVNdID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19DR0ldID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfUkFDXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX09CSl9WRVJTSU9OXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfR1BSU19QQUdJTkdfQ0ZHXT0geyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19OU0VJXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX0JWQ0ldID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfTlNWQ0ldID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfTlNfQ0ZHXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX0JTU0dQX0NGR10gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX05TX0xJTktfQ0ZHXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfUkxDX0NGR10gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX0FMTV9USFJFU0hfTElTVF09CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfTU9OSVRfVkFMX0xJU1RdID0geyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19USUJfQ09OVFJPTF0gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX1NVUFBfRkVBVFVSRVNdID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19DT0RJTkdfU0NIRU1FU10gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX1JMQ19DRkdfMl0gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX0hFQVJUQl9UT1VUXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfVVBUSU1FXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX1JMQ19DRkdfM10gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX1NTTF9DRkddID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19TRUNfUE9TU0lCTEVdID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19JTUxfU1NMX1NUQVRFXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfUkVWT0NfREFURV0gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCX0sCisJfSwKK307CisKK2ludCBidHNfbW9kZWxfbmFub2J0c19pbml0KHZvaWQpCit7CisJcmV0dXJuIGdzbV9idHNfbW9kZWxfcmVnaXN0ZXIoJm1vZGVsX25hbm9idHMpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvYnRzX3NpZW1lbnNfYnMxMS5jIGIvb3BlbmJzYy9zcmMvYnRzX3NpZW1lbnNfYnMxMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NjY4MjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9idHNfc2llbWVuc19iczExLmMKQEAgLTAsMCArMSw2NiBAQAorLyogU2llbWVucyBCUy0xMSBzcGVjaWZpYyBjb2RlICovCisKKy8qIChDKSAyMDA5LTIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19ubS5oPgorCitzdGF0aWMgc3RydWN0IGdzbV9idHNfbW9kZWwgbW9kZWxfYnMxMSA9IHsKKwkudHlwZSA9IEdTTV9CVFNfVFlQRV9CUzExLAorCS5ubV9hdHRfdGx2ZGVmID0geworCQkuZGVmID0geworCQkJW05NX0FUVF9BVkFJTF9TVEFUVVNdID0JCXsgVExWX1RZUEVfVExWIH0sCisJCQkvKiBCUzExIHNwZWNpZmljcyAqLworCQkJW05NX0FUVF9CUzExX0VTTl9GV19DT0RFX05PXSA9CXsgVExWX1RZUEVfVExWIH0sCisJCQlbTk1fQVRUX0JTMTFfRVNOX0hXX0NPREVfTk9dID0JeyBUTFZfVFlQRV9UTFYgfSwKKwkJCVtOTV9BVFRfQlMxMV9FU05fUENCX1NFUklBTF0gPQl7IFRMVl9UWVBFX1RMViB9LAorCQkJW05NX0FUVF9CUzExX0JPT1RfU1dfVkVSU10gPQl7IFRMVl9UWVBFX1RMViB9LAorCQkJWzB4ZDVdID0JCQl7IFRMVl9UWVBFX1RMViB9LAorCQkJWzB4YThdID0JCQl7IFRMVl9UWVBFX1RMViB9LAorCQkJW05NX0FUVF9CUzExX1BBU1NXT1JEXSA9CXsgVExWX1RZUEVfVExWIH0sCisJCQlbTk1fQVRUX0JTMTFfVFhQV1JdID0JCXsgVExWX1RZUEVfVExWIH0sCisJCQlbTk1fQVRUX0JTMTFfUlNTSV9PRkZTXSA9CXsgVExWX1RZUEVfVExWIH0sCisJCQlbTk1fQVRUX0JTMTFfTElORV9DRkddID0gCXsgVExWX1RZUEVfVFYgfSwKKwkJCVtOTV9BVFRfQlMxMV9MMV9QUk9UX1RZUEVdID0JeyBUTFZfVFlQRV9UViB9LAorCQkJW05NX0FUVF9CUzExX0JJVF9FUlJfVEhFU0hdID0JeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorCQkJW05NX0FUVF9CUzExX0RJVkVSU0lUWV0gPQl7IFRMVl9UWVBFX1RMViB9LAorCQkJW05NX0FUVF9CUzExX0xNVF9MT0dPTl9TRVNTSU9OXT17IFRMVl9UWVBFX1RMViB9LAkKKwkJCVtOTV9BVFRfQlMxMV9MTVRfTE9HSU5fVElNRV0gPQl7IFRMVl9UWVBFX1RMViB9LAorCQkJW05NX0FUVF9CUzExX0xNVF9VU0VSX0FDQ19MRVZdID17IFRMVl9UWVBFX1RMViB9LAorCQkJW05NX0FUVF9CUzExX0xNVF9VU0VSX05BTUVdID0JeyBUTFZfVFlQRV9UTFYgfSwKKwkJCVtOTV9BVFRfQlMxMV9CVFNfU1RBVEVdCT0JeyBUTFZfVFlQRV9UTFYgfSwKKwkJCVtOTV9BVFRfQlMxMV9FMV9TVEFURV0JPQl7IFRMVl9UWVBFX1RMViB9LAorCQkJW05NX0FUVF9CUzExX1BMTF9NT0RFXQk9CXsgVExWX1RZUEVfVExWIH0sCisJCQlbTk1fQVRUX0JTMTFfUExMXQk9CXsgVExWX1RZUEVfVExWIH0sCisJCQlbTk1fQVRUX0JTMTFfQ0NMS19BQ0NVUkFDWV0gPQl7IFRMVl9UWVBFX1RWIH0sCisJCQlbTk1fQVRUX0JTMTFfQ0NMS19UWVBFXSA9CXsgVExWX1RZUEVfVFYgfSwKKwkJCVsweDk1XSA9CQkJeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorCQl9LAorCX0sCit9OworCitpbnQgYnRzX21vZGVsX2JzMTFfaW5pdCh2b2lkKQoreworCXJldHVybiBnc21fYnRzX21vZGVsX3JlZ2lzdGVyKCZtb2RlbF9iczExKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2J0c191bmtub3duLmMgYi9vcGVuYnNjL3NyYy9idHNfdW5rbm93bi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhYzVkOTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9idHNfdW5rbm93bi5jCkBAIC0wLDAgKzEsNDAgQEAKKy8qIEdlbmVyaWMgQlRTIC0gVlRZIGNvZGUgdHJpZXMgdG8gYWxsb2NhdGUgdGhpcyBCVFMgYmVmb3JlIHR5cGUgaXMga25vd24gKi8KKworLyogKEMpIDIwMTAgYnkgRGFuaWVsIFdpbGxtYW5uIDxkYW5pZWxAdG90YWx1ZWJlcndhY2h1bmcuZGU+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90bHYuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfbm0uaD4KKworc3RhdGljIHN0cnVjdCBnc21fYnRzX21vZGVsIG1vZGVsX3Vua25vd24gPSB7CisJLnR5cGUgPSBHU01fQlRTX1RZUEVfVU5LTk9XTiwKKwkubm1fYXR0X3RsdmRlZiA9IHsKKwkJLmRlZiA9IHsKKwkJfSwKKwl9LAorfTsKKworaW50IGJ0c19tb2RlbF91bmtub3duX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gZ3NtX2J0c19tb2RlbF9yZWdpc3RlcigmbW9kZWxfdW5rbm93bik7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9jaGFuX2FsbG9jLmMgYi9vcGVuYnNjL3NyYy9jaGFuX2FsbG9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU4ODUyNAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2NoYW5fYWxsb2MuYwpAQCAtMCwwICsxLDQxOCBAQAorLyogR1NNIENoYW5uZWwgYWxsb2NhdGlvbiByb3V0aW5lcworICoKKyAqIChDKSAyMDA4IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOCwgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9jaGFuX2FsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX25tLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX3JzbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorCitzdGF0aWMgdm9pZCBhdXRvX3JlbGVhc2VfY2hhbm5lbCh2b2lkICpfbGNoYW4pOworCitzdGF0aWMgaW50IHRzX2lzX3VzYWJsZShzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzKQoreworCS8qIEZJWE1FOiBIb3cgZG9lcyB0aGlzIGJlaGF2ZSBmb3IgQlMtMTEgPyAqLworCWlmIChpc19pcGFjY2Vzc19idHModHMtPnRyeC0+YnRzKSkgeworCQlpZiAoIW5tX2lzX3J1bm5pbmcoJnRzLT5ubV9zdGF0ZSkpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworaW50IHRyeF9pc191c2FibGUoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpCit7CisJLyogRklYTUU6IEhvdyBkb2VzIHRoaXMgYmVoYXZlIGZvciBCUy0xMSA/ICovCisJaWYgKGlzX2lwYWNjZXNzX2J0cyh0cngtPmJ0cykpIHsKKwkJaWYgKCFubV9pc19ydW5uaW5nKCZ0cngtPm5tX3N0YXRlKSB8fAorCQkgICAgIW5tX2lzX3J1bm5pbmcoJnRyeC0+YmJfdHJhbnNjLm5tX3N0YXRlKSkKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzX2MwX2FsbG9jKHN0cnVjdCBnc21fYnRzICpidHMsCisJCQkJICAgZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyBwY2hhbikKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCA9IGJ0cy0+YzA7CisJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyA9ICZ0cngtPnRzWzBdOworCisJaWYgKHBjaGFuICE9IEdTTV9QQ0hBTl9DQ0NIICYmCisJICAgIHBjaGFuICE9IEdTTV9QQ0hBTl9DQ0NIX1NEQ0NINCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAodHMtPnBjaGFuICE9IEdTTV9QQ0hBTl9OT05FKQorCQlyZXR1cm4gTlVMTDsKKworCXRzLT5wY2hhbiA9IHBjaGFuOworCisJcmV0dXJuIHRzOworfQorCisvKiBBbGxvY2F0ZSBhIHBoeXNpY2FsIGNoYW5uZWwgKFRTKSAqLworc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0c19hbGxvYyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLAorCQkJCWVudW0gZ3NtX3BoeXNfY2hhbl9jb25maWcgcGNoYW4pCit7CisJaW50IGo7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0cngsICZidHMtPnRyeF9saXN0LCBsaXN0KSB7CisJCWludCBmcm9tLCB0bzsKKworCQlpZiAoIXRyeF9pc191c2FibGUodHJ4KSkKKwkJCWNvbnRpbnVlOworCisJCS8qIHRoZSBmb2xsb3dpbmcgY29uc3RyYWludHMgYXJlIHB1cmUgcG9saWN5LAorCQkgKiBubyByZXF1aXJlbWVudCB0byBwdXQgdGhpcyByZXN0cmljdGlvbiBpbiBwbGFjZSAqLworCQlpZiAodHJ4ID09IGJ0cy0+YzApIHsKKwkJCS8qIE9uIHRoZSBmaXJzdCBUUlggd2UgcnVuIG9uZSBDQ0NIIGFuZCBvbmUgU0RDQ0g4ICovCisJCQlzd2l0Y2ggKHBjaGFuKSB7CisJCQljYXNlIEdTTV9QQ0hBTl9DQ0NIOgorCQkJY2FzZSBHU01fUENIQU5fQ0NDSF9TRENDSDQ6CisJCQkJZnJvbSA9IDA7IHRvID0gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgR1NNX1BDSEFOX1RDSF9GOgorCQkJY2FzZSBHU01fUENIQU5fVENIX0g6CisJCQkJZnJvbSA9IDE7IHRvID0gNzsKKwkJCQlicmVhazsKKwkJCWNhc2UgR1NNX1BDSEFOX1NEQ0NIOF9TQUNDSDhDOgorCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIEV2ZXJ5IHNlY29uZGFyeSBUUlggaXMgY29uZmlndXJlZCBmb3IgVENIL0YKKwkJCSAqIGFuZCBUQ0gvSCBvbmx5ICovCisJCQlzd2l0Y2ggKHBjaGFuKSB7CisJCQljYXNlIEdTTV9QQ0hBTl9TRENDSDhfU0FDQ0g4QzoKKwkJCQlmcm9tID0gMTsgdG8gPSAxOworCQkJY2FzZSBHU01fUENIQU5fVENIX0Y6CisJCQljYXNlIEdTTV9QQ0hBTl9UQ0hfSDoKKwkJCQlmcm9tID0gMTsgdG8gPSA3OworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfQorCisJCWZvciAoaiA9IGZyb207IGogPD0gdG87IGorKykgeworCQkJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyA9ICZ0cngtPnRzW2pdOworCisJCQlpZiAoIXRzX2lzX3VzYWJsZSh0cykpCisJCQkJY29udGludWU7CisKKwkJCWlmICh0cy0+cGNoYW4gPT0gR1NNX1BDSEFOX05PTkUpIHsKKwkJCQl0cy0+cGNoYW4gPSBwY2hhbjsKKwkJCQkvKiBzZXQgY2hhbm5lbCBhdHRyaWJ1dGUgb24gT01MICovCisJCQkJYWJpc19ubV9zZXRfY2hhbm5lbF9hdHRyKHRzLCBhYmlzX25tX2NoY29tYjRwY2hhbihwY2hhbikpOworCQkJCXJldHVybiB0czsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyogRnJlZSBhIHBoeXNpY2FsIGNoYW5uZWwgKFRTKSAqLwordm9pZCB0c19mcmVlKHN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMpCit7CisJdHMtPnBjaGFuID0gR1NNX1BDSEFOX05PTkU7Cit9CisKK3N0YXRpYyBjb25zdCB1X2ludDhfdCBzdWJzbG90c19wZXJfcGNoYW5bXSA9IHsKKwlbR1NNX1BDSEFOX05PTkVdID0gMCwKKwlbR1NNX1BDSEFOX0NDQ0hdID0gMCwKKwlbR1NNX1BDSEFOX0NDQ0hfU0RDQ0g0XSA9IDQsCisJW0dTTV9QQ0hBTl9UQ0hfRl0gPSAxLAorCVtHU01fUENIQU5fVENIX0hdID0gMiwKKwlbR1NNX1BDSEFOX1NEQ0NIOF9TQUNDSDhDXSA9IDgsCisJLyogRklYTUU6IHdoYXQgYWJvdXQgZHluYW1pYyBUQ0hfRl9UQ0hfSCA/ICovCit9OworCitzdGF0aWMgc3RydWN0IGdzbV9sY2hhbiAqCitfbGNfZmluZF90cngoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIGVudW0gZ3NtX3BoeXNfY2hhbl9jb25maWcgcGNoYW4pCit7CisJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0czsKKwlpbnQgaiwgc3M7CisKKwlpZiAoIXRyeF9pc191c2FibGUodHJ4KSkKKwkJcmV0dXJuIE5VTEw7CisKKwlmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7CisJCXRzID0gJnRyeC0+dHNbal07CisJCWlmICghdHNfaXNfdXNhYmxlKHRzKSkKKwkJCWNvbnRpbnVlOworCQlpZiAodHMtPnBjaGFuICE9IHBjaGFuKQorCQkJY29udGludWU7CisJCS8qIGNoZWNrIGlmIGFsbCBzdWItc2xvdHMgYXJlIGFsbG9jYXRlZCB5ZXQgKi8KKwkJZm9yIChzcyA9IDA7IHNzIDwgc3Vic2xvdHNfcGVyX3BjaGFuW3BjaGFuXTsgc3MrKykgeworCQkJc3RydWN0IGdzbV9sY2hhbiAqbGMgPSAmdHMtPmxjaGFuW3NzXTsKKwkJCWlmIChsYy0+dHlwZSA9PSBHU01fTENIQU5fTk9ORSAmJgorCQkJICAgIGxjLT5zdGF0ZSA9PSBMQ0hBTl9TX05PTkUpCisJCQkJcmV0dXJuIGxjOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGdzbV9sY2hhbiAqCitfbGNfZmluZF9idHMoc3RydWN0IGdzbV9idHMgKmJ0cywgZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyBwY2hhbikKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKwlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzOworCXN0cnVjdCBnc21fbGNoYW4gKmxjOworCisJaWYgKGJ0cy0+Y2hhbl9hbGxvY19yZXZlcnNlKSB7CisJCWxsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UodHJ4LCAmYnRzLT50cnhfbGlzdCwgbGlzdCkgeworCQkJbGMgPSBfbGNfZmluZF90cngodHJ4LCBwY2hhbik7CisJCQlpZiAobGMpCisJCQkJcmV0dXJuIGxjOworCQl9CisJfSBlbHNlIHsKKwkJbGxpc3RfZm9yX2VhY2hfZW50cnkodHJ4LCAmYnRzLT50cnhfbGlzdCwgbGlzdCkgeworCQkJbGMgPSBfbGNfZmluZF90cngodHJ4LCBwY2hhbik7CisJCQlpZiAobGMpCisJCQkJcmV0dXJuIGxjOworCQl9CisJfQorCisJLyogd2UgY2Fubm90IGFsbG9jYXRlIG1vcmUgb2YgdGhlc2UgKi8KKwlpZiAocGNoYW4gPT0gR1NNX1BDSEFOX0NDQ0hfU0RDQ0g0KQorCQlyZXR1cm4gTlVMTDsKKworCS8qIGlmIHdlJ3ZlIHJlYWNoZWQgaGVyZSwgd2UgbmVlZCB0byBhbGxvY2F0ZSBhIG5ldyBwaHlzaWNhbAorCSAqIGNoYW5uZWwgZm9yIHRoZSBsb2dpY2FsIGNoYW5uZWwgdHlwZSByZXF1ZXN0ZWQgKi8KKwl0cyA9IHRzX2FsbG9jKGJ0cywgcGNoYW4pOworCWlmICghdHMpIHsKKwkJLyogbm8gbW9yZSByYWRpbyByZXNvdXJjZXMgKi8KKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiAmdHMtPmxjaGFuWzBdOworfQorCisvKiBBbGxvY2F0ZSBhIGxvZ2ljYWwgY2hhbm5lbCAqLworc3RydWN0IGdzbV9sY2hhbiAqbGNoYW5fYWxsb2Moc3RydWN0IGdzbV9idHMgKmJ0cywgZW51bSBnc21fY2hhbl90IHR5cGUpCit7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBOVUxMOworCWVudW0gZ3NtX3BoeXNfY2hhbl9jb25maWcgZmlyc3QsIHNlY29uZDsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgR1NNX0xDSEFOX1NEQ0NIOgorCQlpZiAoYnRzLT5jaGFuX2FsbG9jX3JldmVyc2UpIHsKKwkJCWZpcnN0ID0gR1NNX1BDSEFOX1NEQ0NIOF9TQUNDSDhDOworCQkJc2Vjb25kID0gR1NNX1BDSEFOX0NDQ0hfU0RDQ0g0OworCQl9IGVsc2UgeworCQkJZmlyc3QgPSBHU01fUENIQU5fQ0NDSF9TRENDSDQ7CisJCQlzZWNvbmQgPSBHU01fUENIQU5fU0RDQ0g4X1NBQ0NIOEM7CisJCX0KKworCQlsY2hhbiA9IF9sY19maW5kX2J0cyhidHMsIGZpcnN0KTsKKwkJaWYgKGxjaGFuID09IE5VTEwpCisJCQlsY2hhbiA9IF9sY19maW5kX2J0cyhidHMsIHNlY29uZCk7CisJCWJyZWFrOworCWNhc2UgR1NNX0xDSEFOX1RDSF9GOgorCQlsY2hhbiA9IF9sY19maW5kX2J0cyhidHMsIEdTTV9QQ0hBTl9UQ0hfRik7CisJCWJyZWFrOworCWNhc2UgR1NNX0xDSEFOX1RDSF9IOgorCQlsY2hhbiA9X2xjX2ZpbmRfYnRzKGJ0cywgR1NNX1BDSEFOX1RDSF9IKTsKKwkJLyogSWYgd2UgZG9uJ3QgaGF2ZSBUQ0gvSCBhdmFpbGFibGUsIGZhbGwtYmFjayB0byBUQ0gvRiAqLworCQlpZiAoIWxjaGFuKSB7CisJCQlsY2hhbiA9IF9sY19maW5kX2J0cyhidHMsIEdTTV9QQ0hBTl9UQ0hfRik7CisJCQl0eXBlID0gR1NNX0xDSEFOX1RDSF9GOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRFJMTCwgTE9HTF9FUlJPUiwgIlVua25vd24gZ3NtX2NoYW5fdCAldVxuIiwgdHlwZSk7CisJfQorCisJaWYgKGxjaGFuKSB7CisJCWxjaGFuLT50eXBlID0gdHlwZTsKKwkJbGNoYW4tPnVzZV9jb3VudCA9IDA7CisKKwkJLyogY2xlYXIgc2FwaXMgKi8KKwkJbWVtc2V0KGxjaGFuLT5zYXBpcywgMCwgQVJSQVlfU0laRShsY2hhbi0+c2FwaXMpKTsKKworCQkvKiBjbGVhciBtdWx0aSByYXRlIGNvbmZpZyAqLworCQltZW1zZXQoJmxjaGFuLT5tcl9jb25mLCAwLCBzaXplb2YobGNoYW4tPm1yX2NvbmYpKTsKKworCQkvKiBDb25maWd1cmUgdGhlIHRpbWUgYW5kIHN0YXJ0IGl0IHNvIGl0IHdpbGwgYmUgY2xvc2VkICovCisJCWxjaGFuLT5yZWxlYXNlX3RpbWVyLmNiID0gYXV0b19yZWxlYXNlX2NoYW5uZWw7CisJCWxjaGFuLT5yZWxlYXNlX3RpbWVyLmRhdGEgPSBsY2hhbjsKKwkJYnNjX3NjaGVkdWxlX3RpbWVyKCZsY2hhbi0+cmVsZWFzZV90aW1lciwgTENIQU5fUkVMRUFTRV9USU1FT1VUKTsKKwl9CisKKwlyZXR1cm4gbGNoYW47Cit9CisKKy8qIEZyZWUgYSBsb2dpY2FsIGNoYW5uZWwgKi8KK3ZvaWQgbGNoYW5fZnJlZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlpbnQgaTsKKworCWxjaGFuLT50eXBlID0gR1NNX0xDSEFOX05PTkU7CisJaWYgKGxjaGFuLT5zdWJzY3IpIHsKKwkJc3Vic2NyX3B1dChsY2hhbi0+c3Vic2NyKTsKKwkJbGNoYW4tPnN1YnNjciA9IE5VTEw7CisJfQorCisJLyogV2UgbWlnaHQga2lsbCBhbiBhY3RpdmUgY2hhbm5lbC4uLiAqLworCWlmIChsY2hhbi0+dXNlX2NvdW50ICE9IDApIHsKKwkJZGlzcGF0Y2hfc2lnbmFsKFNTX0xDSEFOLCBTX0xDSEFOX1VORVhQRUNURURfUkVMRUFTRSwgbGNoYW4pOworCQlsY2hhbi0+dXNlX2NvdW50ID0gMDsKKwl9CisKKwkvKiBzdG9wIHRoZSB0aW1lciAqLworCWJzY19kZWxfdGltZXIoJmxjaGFuLT5yZWxlYXNlX3RpbWVyKTsKKwlic2NfZGVsX3RpbWVyKCZsY2hhbi0+VDMxMDEpOworCisJLyogY2xlYXIgY2FjaGVkIG1lYXN1ZW1lbnQgcmVwb3J0cyAqLworCWxjaGFuLT5tZWFzX3JlcF9pZHggPSAwOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGxjaGFuLT5tZWFzX3JlcCk7IGkrKykgeworCQlsY2hhbi0+bWVhc19yZXBbaV0uZmxhZ3MgPSAwOworCQlsY2hhbi0+bWVhc19yZXBbaV0ubnIgPSAwOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShsY2hhbi0+bmVpZ2hfbWVhcyk7IGkrKykKKwkJbGNoYW4tPm5laWdoX21lYXNbaV0uYXJmY24gPSAwOworCisJbGNoYW4tPnNpbGVudF9jYWxsID0gMDsKKworCS8qIEZJWE1FOiB0c19mcmVlKCkgdGhlIHRpbWVzbG90LCBpZiB3ZSdyZSB0aGUgbGFzdCBsb2dpY2FsCisJICogY2hhbm5lbCB1c2luZyBpdCAqLworfQorCisvKiBDb25zaWRlciByZWxlYXNpbmcgdGhlIGNoYW5uZWwgbm93ICovCitpbnQgbGNoYW5fYXV0b19yZWxlYXNlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCWlmIChsY2hhbi0+dXNlX2NvdW50ID4gMCkgeworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBBc3N1bWUgd2UgaGF2ZSBHU00wNC4wOCBydW5uaW5nIGFuZCBzZW5kIGEgcmVsZWFzZSAqLworCWlmIChsY2hhbi0+c3Vic2NyKSB7CisJCWdzbTQ4X3NlbmRfcnJfcmVsZWFzZShsY2hhbik7CisJfQorCisJLyogc3Bvb2ZlZD8gbWVzc2FnZSAqLworCWlmIChsY2hhbi0+dXNlX2NvdW50IDwgMCkKKwkJTE9HUChEUkxMLCBMT0dMX0VSUk9SLCAiQ2hhbm5lbCBjb3VudCBpcyBuZWdhdGl2ZTogJWRcbiIsCisJCQlsY2hhbi0+dXNlX2NvdW50KTsKKworCURFQlVHUChEUkxMLCAiJXMgUmVjeWNsaW5nIENoYW5uZWxcbiIsIGdzbV9sY2hhbl9uYW1lKGxjaGFuKSk7CisJcnNsX3JlbGVhc2VfcmVxdWVzdChsY2hhbiwgMCk7CisJcmV0dXJuIDE7Cit9CisKKy8qIEF1dG8gcmVsZWFzZSB0aGUgY2hhbm5lbCB3aGVuIHRoZSB1c2UgY291bnQgaXMgemVybyAqLworc3RhdGljIHZvaWQgYXV0b19yZWxlYXNlX2NoYW5uZWwodm9pZCAqX2xjaGFuKQoreworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0gX2xjaGFuOworCisJaWYgKCFsY2hhbl9hdXRvX3JlbGVhc2UobGNoYW4pKQorCQlic2Nfc2NoZWR1bGVfdGltZXIoJmxjaGFuLT5yZWxlYXNlX3RpbWVyLCBMQ0hBTl9SRUxFQVNFX1RJTUVPVVQpOworfQorCitzdHJ1Y3QgZ3NtX2xjaGFuKiBsY2hhbl9maW5kKHN0cnVjdCBnc21fYnRzICpidHMsIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKSB7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisJaW50IHRzX25vLCBsY2hhbl9ubzsgCisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0cngsICZidHMtPnRyeF9saXN0LCBsaXN0KSB7CisJCWZvciAodHNfbm8gPSAwOyB0c19ubyA8IDg7ICsrdHNfbm8pIHsKKwkJCWZvciAobGNoYW5fbm8gPSAwOyBsY2hhbl9ubyA8IFRTX01BWF9MQ0hBTjsgKytsY2hhbl9ubykgeworCQkJCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0KKwkJCQkJJnRyeC0+dHNbdHNfbm9dLmxjaGFuW2xjaGFuX25vXTsKKwkJCQlpZiAoc3Vic2NyID09IGxjaGFuLT5zdWJzY3IpCisJCQkJCXJldHVybiBsY2hhbjsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbl9mb3Jfc3Vic2NyKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCXN0cnVjdCBnc21fYnRzICpidHM7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBzdWJzY3ItPm5ldDsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGJ0cywgJm5ldC0+YnRzX2xpc3QsIGxpc3QpIHsKKwkJbGNoYW4gPSBsY2hhbl9maW5kKGJ0cywgc3Vic2NyKTsKKwkJaWYgKGxjaGFuKQorCQkJcmV0dXJuIGxjaGFuOworCX0KKworCXJldHVybiBOVUxMOworfQorCit2b2lkIGJ0c19jaGFuX2xvYWQoc3RydWN0IHBjaGFuX2xvYWQgKmNsLCBjb25zdCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkodHJ4LCAmYnRzLT50cnhfbGlzdCwgbGlzdCkgeworCQlpbnQgaTsKKworCQkvKiBza2lwIGFkbWluaXN0cmF0aXZlbHkgZGVhY3RpdmF0ZWQgdHJhbnhzY2VpdmVycyAqLworCQlpZiAoIW5tX2lzX3J1bm5pbmcoJnRyeC0+bm1fc3RhdGUpIHx8CisJCSAgICAhbm1faXNfcnVubmluZygmdHJ4LT5iYl90cmFuc2Mubm1fc3RhdGUpKQorCQkJY29udGludWU7CisKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodHJ4LT50cyk7IGkrKykgeworCQkJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyA9ICZ0cngtPnRzW2ldOworCQkJc3RydWN0IGxvYWRfY291bnRlciAqcGwgPSAmY2wtPnBjaGFuW3RzLT5wY2hhbl07CisJCQlpbnQgajsKKworCQkJLyogc2tpcCBhZG1pbmlzdHJhdGl2ZWx5IGRlYWN0aXZhdGVkIHRpbWVzbG90cyAqLworCQkJaWYgKCFubV9pc19ydW5uaW5nKCZ0cy0+bm1fc3RhdGUpKQorCQkJCWNvbnRpbnVlOworCisJCQlmb3IgKGogPSAwOyBqIDwgc3Vic2xvdHNfcGVyX3BjaGFuW3RzLT5wY2hhbl07IGorKykgeworCQkJCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0gJnRzLT5sY2hhbltqXTsKKworCQkJCXBsLT50b3RhbCsrOworCisJCQkJc3dpdGNoIChsY2hhbi0+c3RhdGUpIHsKKwkJCQljYXNlIExDSEFOX1NfTk9ORToKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJcGwtPnVzZWQrKzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCit2b2lkIG5ldHdvcmtfY2hhbl9sb2FkKHN0cnVjdCBwY2hhbl9sb2FkICpwbCwgc3RydWN0IGdzbV9uZXR3b3JrICpuZXQpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKworCW1lbXNldChwbCwgMCwgc2l6ZW9mKCpwbCkpOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoYnRzLCAmbmV0LT5idHNfbGlzdCwgbGlzdCkKKwkJYnRzX2NoYW5fbG9hZChwbCwgYnRzKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2RiLmMgYi9vcGVuYnNjL3NyYy9kYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYzFkNmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9kYi5jCkBAIC0wLDAgKzEsMTE3OSBAQAorLyogU2ltcGxlIEhMUi9WTFIgZGF0YWJhc2UgYmFja2VuZCB1c2luZyBkYmkgKi8KKy8qIChDKSAyMDA4IGJ5IEphbiBMdWViYmUgPGpsdWViYmVAZGViaWFuLm9yZz4KKyAqIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8xMS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGIuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvc3RhdGlzdGljcy5oPgorCisjaW5jbHVkZSA8bGliZ2VuLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGRiaS9kYmkuaD4KKworc3RhdGljIGNoYXIgKmRiX2Jhc2VuYW1lID0gTlVMTDsKK3N0YXRpYyBjaGFyICpkYl9kaXJuYW1lID0gTlVMTDsKK3N0YXRpYyBkYmlfY29ubiBjb25uOworCitzdGF0aWMgY2hhciAqY3JlYXRlX3N0bXRzW10gPSB7CisJIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIE1ldGEgKCIKKwkJImlkIElOVEVHRVIgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCwgIgorCQkia2V5IFRFWFQgVU5JUVVFIE5PVCBOVUxMLCAiCisJCSJ2YWx1ZSBURVhUIE5PVCBOVUxMIgorCQkiKSIsCisJIklOU0VSVCBPUiBJR05PUkUgSU5UTyBNZXRhICIKKwkJIihrZXksIHZhbHVlKSAiCisJCSJWQUxVRVMgIgorCQkiKCdyZXZpc2lvbicsICcyJykiLAorCSJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBTdWJzY3JpYmVyICgiCisJCSJpZCBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQsICIKKwkJImNyZWF0ZWQgVElNRVNUQU1QIE5PVCBOVUxMLCAiCisJCSJ1cGRhdGVkIFRJTUVTVEFNUCBOT1QgTlVMTCwgIgorCQkiaW1zaSBOVU1FUklDIFVOSVFVRSBOT1QgTlVMTCwgIgorCQkibmFtZSBURVhULCAiCisJCSJleHRlbnNpb24gVEVYVCBVTklRVUUsICIKKwkJImF1dGhvcml6ZWQgSU5URUdFUiBOT1QgTlVMTCBERUZBVUxUIDAsICIKKwkJInRtc2kgVEVYVCBVTklRVUUsICIKKwkJImxhYyBJTlRFR0VSIE5PVCBOVUxMIERFRkFVTFQgMCIKKwkJIikiLAorCSJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBBdXRoVG9rZW4gKCIKKwkJImlkIElOVEVHRVIgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCwgIgorCQkic3Vic2NyaWJlcl9pZCBJTlRFR0VSIFVOSVFVRSBOT1QgTlVMTCwgIgorCQkiY3JlYXRlZCBUSU1FU1RBTVAgTk9UIE5VTEwsICIKKwkJInRva2VuIFRFWFQgVU5JUVVFIE5PVCBOVUxMIgorCQkiKSIsCisJIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIEVxdWlwbWVudCAoIgorCQkiaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULCAiCisJCSJjcmVhdGVkIFRJTUVTVEFNUCBOT1QgTlVMTCwgIgorCQkidXBkYXRlZCBUSU1FU1RBTVAgTk9UIE5VTEwsICIKKwkJIm5hbWUgVEVYVCwgIgorCQkiY2xhc3NtYXJrMSBOVU1FUklDLCAiCisJCSJjbGFzc21hcmsyIEJMT0IsICIKKwkJImNsYXNzbWFyazMgQkxPQiwgIgorCQkiaW1laSBOVU1FUklDIFVOSVFVRSBOT1QgTlVMTCIKKwkJIikiLAorCSJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBFcXVpcG1lbnRXYXRjaCAoIgorCQkiaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULCAiCisJCSJjcmVhdGVkIFRJTUVTVEFNUCBOT1QgTlVMTCwgIgorCQkidXBkYXRlZCBUSU1FU1RBTVAgTk9UIE5VTEwsICIKKwkJInN1YnNjcmliZXJfaWQgTlVNRVJJQyBOT1QgTlVMTCwgIgorCQkiZXF1aXBtZW50X2lkIE5VTUVSSUMgTk9UIE5VTEwsICIKKwkJIlVOSVFVRSAoc3Vic2NyaWJlcl9pZCwgZXF1aXBtZW50X2lkKSAiCisJCSIpIiwKKwkiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgU01TICgiCisJCS8qIG1ldGFkYXRhLCBub3QgcGFydCBvZiBzbXMgKi8KKwkJImlkIElOVEVHRVIgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCwgIgorCQkiY3JlYXRlZCBUSU1FU1RBTVAgTk9UIE5VTEwsICIKKwkJInNlbnQgVElNRVNUQU1QLCAiCisJCSJzZW5kZXJfaWQgSU5URUdFUiBOT1QgTlVMTCwgIgorCQkicmVjZWl2ZXJfaWQgSU5URUdFUiBOT1QgTlVMTCwgIgorCQkiZGVsaXZlcl9hdHRlbXB0cyBJTlRFR0VSIE5PVCBOVUxMIERFRkFVTFQgMCwgIgorCQkvKiBkYXRhIGRpcmVjdGx5IGNvcGllZC9kZXJpdmVkIGZyb20gU01TICovCisJCSJ2YWxpZF91bnRpbCBUSU1FU1RBTVAsICIKKwkJInJlcGx5X3BhdGhfcmVxIElOVEVHRVIgTk9UIE5VTEwsICIKKwkJInN0YXR1c19yZXBfcmVxIElOVEVHRVIgTk9UIE5VTEwsICIKKwkJInByb3RvY29sX2lkIElOVEVHRVIgTk9UIE5VTEwsICIKKwkJImRhdGFfY29kaW5nX3NjaGVtZSBJTlRFR0VSIE5PVCBOVUxMLCAiCisJCSJ1ZF9oZHJfaW5kIElOVEVHRVIgTk9UIE5VTEwsICIKKwkJImRlc3RfYWRkciBURVhULCAiCisJCSJ1c2VyX2RhdGEgQkxPQiwgIgkvKiBUUC1VRCAqLworCQkvKiBhZGRpdGlvbmFsIGRhdGEsIGludGVycHJldGVkIGZyb20gU01TICovCisJCSJoZWFkZXIgQkxPQiwgIgkJLyogVUQgSGVhZGVyICovCisJCSJ0ZXh0IFRFWFQgIgkJLyogZGVjb2RlZCBVRCBhZnRlciBVREggKi8KKwkJIikiLAorCSJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBWTFIgKCIKKwkJImlkIElOVEVHRVIgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCwgIgorCQkiY3JlYXRlZCBUSU1FU1RBTVAgTk9UIE5VTEwsICIKKwkJInVwZGF0ZWQgVElNRVNUQU1QIE5PVCBOVUxMLCAiCisJCSJzdWJzY3JpYmVyX2lkIE5VTUVSSUMgVU5JUVVFIE5PVCBOVUxMLCAiCisJCSJsYXN0X2J0cyBOVU1FUklDIE5PVCBOVUxMICIKKwkJIikiLAorCSJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBBcGR1QmxvYnMgKCIKKwkJImlkIElOVEVHRVIgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCwgIgorCQkiY3JlYXRlZCBUSU1FU1RBTVAgTk9UIE5VTEwsICIKKwkJImFwZHVfaWRfZmxhZ3MgSU5URUdFUiBOT1QgTlVMTCwgIgorCQkic3Vic2NyaWJlcl9pZCBJTlRFR0VSIE5PVCBOVUxMLCAiCisJCSJhcGR1IEJMT0IgIgorCQkiKSIsCisJIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIENvdW50ZXJzICgiCisJCSJpZCBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQsICIKKwkJInRpbWVzdGFtcCBUSU1FU1RBTVAgTk9UIE5VTEwsICIKKwkJInZhbHVlIElOVEVHRVIgTk9UIE5VTEwsICIKKwkJIm5hbWUgVEVYVCBOT1QgTlVMTCAiCisJCSIpIiwKKwkiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgQXV0aEtleXMgKCIKKwkJImlkIElOVEVHRVIgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCwgIgorCQkic3Vic2NyaWJlcl9pZCBJTlRFR0VSIFVOSVFVRSBOT1QgTlVMTCwgIgorCQkiYWxnb3JpdGhtX2lkIElOVEVHRVIgTk9UIE5VTEwsICIKKwkJImEzYThfa2kgQkxPQiAiCisJCSIpIiwKKwkiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgQXV0aFR1cGxlcyAoIgorCQkiaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULCAiCisJCSJzdWJzY3JpYmVyX2lkIE5VTUVSSUMgVU5JUVVFIE5PVCBOVUxMLCAiCisJCSJpc3N1ZWQgVElNRVNUQU1QIE5PVCBOVUxMLCAiCisJCSJ1c2VfY291bnQgSU5URUdFUiBOT1QgTlVMTCBERUZBVUxUIDAsICIKKwkJImtleV9zZXEgSU5URUdFUiBOT1QgTlVMTCwgIgorCQkicmFuZCBCTE9CIE5PVCBOVUxMLCAiCisJCSJzcmVzIEJMT0IgTk9UIE5VTEwsICIKKwkJImtjIEJMT0IgTk9UIE5VTEwgIgorCQkiKSIsCit9OworCit2b2lkIGRiX2Vycm9yX2Z1bmMoZGJpX2Nvbm4gY29ubiwgdm9pZCAqZGF0YSkKK3sKKwljb25zdCBjaGFyICptc2c7CisJZGJpX2Nvbm5fZXJyb3IoY29ubiwgJm1zZyk7CisJTE9HUChEREIsIExPR0xfRVJST1IsICJEQkk6ICVzXG4iLCBtc2cpOworfQorCitzdGF0aWMgaW50IGNoZWNrX2RiX3JldmlzaW9uKHZvaWQpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJY29uc3QgY2hhciAqcmV2OworCisJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnkoY29ubiwKKwkJCQkiU0VMRUNUIHZhbHVlIEZST00gTWV0YSBXSEVSRSBrZXk9J3JldmlzaW9uJyIpOworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghZGJpX3Jlc3VsdF9uZXh0X3JvdyhyZXN1bHQpKSB7CisJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV2ID0gZGJpX3Jlc3VsdF9nZXRfc3RyaW5nKHJlc3VsdCwgInZhbHVlIik7CisJaWYgKCFyZXYgfHwgYXRvaShyZXYpICE9IDIpIHsKKwkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCXJldHVybiAwOworfQorCitpbnQgZGJfaW5pdChjb25zdCBjaGFyICpuYW1lKQoreworCWRiaV9pbml0aWFsaXplKE5VTEwpOworCisJY29ubiA9IGRiaV9jb25uX25ldygic3FsaXRlMyIpOworCWlmIChjb25uID09IE5VTEwpIHsKKwkJTE9HUChEREIsIExPR0xfRkFUQUwsICJGYWlsZWQgdG8gY3JlYXRlIGNvbm5lY3Rpb24uXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZGJpX2Nvbm5fZXJyb3JfaGFuZGxlciggY29ubiwgZGJfZXJyb3JfZnVuYywgTlVMTCApOworCisJLyogTXlTUUwKKwlkYmlfY29ubl9zZXRfb3B0aW9uKGNvbm4sICJob3N0IiwgImxvY2FsaG9zdCIpOworCWRiaV9jb25uX3NldF9vcHRpb24oY29ubiwgInVzZXJuYW1lIiwgInlvdXJfbmFtZSIpOworCWRiaV9jb25uX3NldF9vcHRpb24oY29ubiwgInBhc3N3b3JkIiwgInlvdXJfcGFzc3dvcmQiKTsKKwlkYmlfY29ubl9zZXRfb3B0aW9uKGNvbm4sICJkYm5hbWUiLCAieW91cl9kYm5hbWUiKTsKKwlkYmlfY29ubl9zZXRfb3B0aW9uKGNvbm4sICJlbmNvZGluZyIsICJVVEYtOCIpOworCSovCisKKwkvKiBTcUxpdGUgMyAqLworCWRiX2Jhc2VuYW1lID0gc3RyZHVwKG5hbWUpOworCWRiX2Rpcm5hbWUgPSBzdHJkdXAobmFtZSk7CisJZGJpX2Nvbm5fc2V0X29wdGlvbihjb25uLCAic3FsaXRlM19kYmRpciIsIGRpcm5hbWUoZGJfZGlybmFtZSkpOworCWRiaV9jb25uX3NldF9vcHRpb24oY29ubiwgImRibmFtZSIsIGJhc2VuYW1lKGRiX2Jhc2VuYW1lKSk7CisKKwlpZiAoZGJpX2Nvbm5fY29ubmVjdChjb25uKSA8IDApCisJCWdvdG8gb3V0X2VycjsKKworCXJldHVybiAwOworCitvdXRfZXJyOgorCWZyZWUoZGJfZGlybmFtZSk7CisJZnJlZShkYl9iYXNlbmFtZSk7CisJZGJfZGlybmFtZSA9IGRiX2Jhc2VuYW1lID0gTlVMTDsKKwlyZXR1cm4gLTE7Cit9CisKKworaW50IGRiX3ByZXBhcmUoKQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY3JlYXRlX3N0bXRzKTsgaSsrKSB7CisJCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5KGNvbm4sIGNyZWF0ZV9zdG10c1tpXSk7CisJCWlmICghcmVzdWx0KSB7CisJCQlMT0dQKEREQiwgTE9HTF9FUlJPUiwKKwkJCSAgICAgIkZhaWxlZCB0byBjcmVhdGUgc29tZSB0YWJsZS5cbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJfQorCisJaWYgKGNoZWNrX2RiX3JldmlzaW9uKCkgPCAwKSB7CisJCUxPR1AoRERCLCBMT0dMX0ZBVEFMLCAiRGF0YWJhc2Ugc2NoZW1hIHJldmlzaW9uIGludmFsaWQsICIKKwkJCSJwbGVhc2UgdXBkYXRlIHlvdXIgZGF0YWJhc2Ugc2NoZW1hXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBkYl9maW5pKCkKK3sKKwlkYmlfY29ubl9jbG9zZShjb25uKTsKKwlkYmlfc2h1dGRvd24oKTsKKworCWlmIChkYl9kaXJuYW1lKQorCSAgICBmcmVlKGRiX2Rpcm5hbWUpOworCWlmIChkYl9iYXNlbmFtZSkKKwkgICAgZnJlZShkYl9iYXNlbmFtZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBnc21fc3Vic2NyaWJlciAqZGJfY3JlYXRlX3N1YnNjcmliZXIoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIGNoYXIgKmltc2kpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisKKwkvKiBJcyB0aGlzIHN1YnNjcmliZXIga25vd24gaW4gdGhlIGRiPyAqLworCXN1YnNjciA9IGRiX2dldF9zdWJzY3JpYmVyKG5ldCwgR1NNX1NVQlNDUklCRVJfSU1TSSwgaW1zaSk7IAorCWlmIChzdWJzY3IpIHsKKwkJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIlVQREFURSBTdWJzY3JpYmVyIHNldCB1cGRhdGVkID0gZGF0ZXRpbWUoJ25vdycpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiV0hFUkUgaW1zaSA9ICVzICIgLCBpbXNpKTsKKwkJaWYgKCFyZXN1bHQpCisJCQlMT0dQKEREQiwgTE9HTF9FUlJPUiwgImZhaWxlZCB0byB1cGRhdGUgdGltZXN0YW1wXG4iKTsKKwkJZWxzZQorCQkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJCXJldHVybiBzdWJzY3I7CisJfQorCisJc3Vic2NyID0gc3Vic2NyX2FsbG9jKCk7CisJc3Vic2NyLT5mbGFncyB8PSBHU01fU1VCU0NSSUJFUl9GSVJTVF9DT05UQUNUOworCWlmICghc3Vic2NyKQorCQlyZXR1cm4gTlVMTDsKKwlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJIklOU0VSVCBJTlRPIFN1YnNjcmliZXIgIgorCQkiKGltc2ksIGNyZWF0ZWQsIHVwZGF0ZWQpICIKKwkJIlZBTFVFUyAiCisJCSIoJXMsIGRhdGV0aW1lKCdub3cnKSwgZGF0ZXRpbWUoJ25vdycpKSAiLAorCQlpbXNpCisJKTsKKwlpZiAoIXJlc3VsdCkKKwkJTE9HUChEREIsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIFN1YnNjcmliZXIgYnkgSU1TSS5cbiIpOworCXN1YnNjci0+bmV0ID0gbmV0OworCXN1YnNjci0+aWQgPSBkYmlfY29ubl9zZXF1ZW5jZV9sYXN0KGNvbm4sIE5VTEwpOworCXN0cm5jcHkoc3Vic2NyLT5pbXNpLCBpbXNpLCBHU01fSU1TSV9MRU5HVEgtMSk7CisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJTE9HUChEREIsIExPR0xfSU5GTywgIk5ldyBTdWJzY3JpYmVyOiBJRCAlbGx1LCBJTVNJICVzXG4iLCBzdWJzY3ItPmlkLCBzdWJzY3ItPmltc2kpOworCWRiX3N1YnNjcmliZXJfYWxsb2NfZXh0ZW4oc3Vic2NyKTsKKwlyZXR1cm4gc3Vic2NyOworfQorCitzdGF0aWMgaW50IGdldF9lcXVpcG1lbnRfYnlfc3Vic2NyKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCWNvbnN0IGNoYXIgKnN0cmluZzsKKwl1bnNpZ25lZCBjaGFyIGNtMTsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpjbTIsICpjbTM7CisJc3RydWN0IGdzbV9lcXVpcG1lbnQgKmVxdWlwID0gJnN1YnNjci0+ZXF1aXBtZW50OworCisJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCQkJIlNFTEVDVCBlcXVpcG1lbnQuKiBGUk9NIEVxdWlwbWVudCxFcXVpcG1lbnRXYXRjaCAiCisJCQkJIldIRVJFIEVxdWlwbWVudFdhdGNoLmVxdWlwbWVudF9pZD1FcXVpcG1lbnQuaWQgIgorCQkJCSJBTkQgRXF1aXBtZW50V2F0Y2guc3Vic2NyaWJlcl9pZCA9ICVsbHUgIgorCQkJCSJPUkRFUiBCWSB1cGRhdGVkIERFU0MiLCBzdWJzY3ItPmlkKTsKKwlpZiAoIXJlc3VsdCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoIWRiaV9yZXN1bHRfbmV4dF9yb3cocmVzdWx0KSkgeworCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJZXF1aXAtPmlkID0gZGJpX3Jlc3VsdF9nZXRfdWxvbmdsb25nKHJlc3VsdCwgImlkIik7CisKKwlzdHJpbmcgPSBkYmlfcmVzdWx0X2dldF9zdHJpbmcocmVzdWx0LCAiaW1laSIpOworCWlmIChzdHJpbmcpCisJCXN0cm5jcHkoZXF1aXAtPmltZWksIHN0cmluZywgc2l6ZW9mKGVxdWlwLT5pbWVpKSk7CisKKwlzdHJpbmcgPSBkYmlfcmVzdWx0X2dldF9zdHJpbmcocmVzdWx0LCAiY2xhc3NtYXJrMSIpOworCWlmIChzdHJpbmcpCisJCSBjbTEgPSBhdG9pKHN0cmluZykgJiAweGZmOworCWVxdWlwLT5jbGFzc21hcmsxID0gKigoc3RydWN0IGdzbTQ4X2NsYXNzbWFyazEgKikgJmNtMSk7CisKKwllcXVpcC0+Y2xhc3NtYXJrMl9sZW4gPSBkYmlfcmVzdWx0X2dldF9maWVsZF9sZW5ndGgocmVzdWx0LCAiY2xhc3NtYXJrMiIpOworCWNtMiA9IGRiaV9yZXN1bHRfZ2V0X2JpbmFyeShyZXN1bHQsICJjbGFzc21hcmsyIik7CisJaWYgKGVxdWlwLT5jbGFzc21hcmsyX2xlbiA+IHNpemVvZihlcXVpcC0+Y2xhc3NtYXJrMikpCisJCWVxdWlwLT5jbGFzc21hcmsyX2xlbiA9IHNpemVvZihlcXVpcC0+Y2xhc3NtYXJrMik7CisJbWVtY3B5KGVxdWlwLT5jbGFzc21hcmsyLCBjbTIsIGVxdWlwLT5jbGFzc21hcmsyX2xlbik7CisKKwllcXVpcC0+Y2xhc3NtYXJrM19sZW4gPSBkYmlfcmVzdWx0X2dldF9maWVsZF9sZW5ndGgocmVzdWx0LCAiY2xhc3NtYXJrMyIpOworCWNtMyA9IGRiaV9yZXN1bHRfZ2V0X2JpbmFyeShyZXN1bHQsICJjbGFzc21hcmszIik7CisJaWYgKGVxdWlwLT5jbGFzc21hcmszX2xlbiA+IHNpemVvZihlcXVpcC0+Y2xhc3NtYXJrMykpCisJCWVxdWlwLT5jbGFzc21hcmszX2xlbiA9IHNpemVvZihlcXVpcC0+Y2xhc3NtYXJrMyk7CisJbWVtY3B5KGVxdWlwLT5jbGFzc21hcmszLCBjbTMsIGVxdWlwLT5jbGFzc21hcmszX2xlbik7CisKKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKworCXJldHVybiAwOworfQorCitpbnQgZ2V0X2F1dGhpbmZvX2J5X3N1YnNjcihzdHJ1Y3QgZ3NtX2F1dGhfaW5mbyAqYWluZm8sCisJCQkgICBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICphM2E4X2tpOworCisJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCQkiU0VMRUNUICogRlJPTSBBdXRoS2V5cyBXSEVSRSBzdWJzY3JpYmVyX2lkPSV1IiwKKwkJCSBzdWJzY3ItPmlkKTsKKwlpZiAoIXJlc3VsdCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoIWRiaV9yZXN1bHRfbmV4dF9yb3cocmVzdWx0KSkgeworCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJYWluZm8tPmF1dGhfYWxnbyA9IGRiaV9yZXN1bHRfZ2V0X3Vsb25nbG9uZyhyZXN1bHQsICJhbGdvcml0aG1faWQiKTsKKwlhaW5mby0+YTNhOF9raV9sZW4gPSBkYmlfcmVzdWx0X2dldF9maWVsZF9sZW5ndGgocmVzdWx0LCAiYTNhOF9raSIpOworCWEzYThfa2kgPSBkYmlfcmVzdWx0X2dldF9iaW5hcnkocmVzdWx0LCAiYTNhOF9raSIpOworCWlmIChhaW5mby0+YTNhOF9raV9sZW4gPiBzaXplb2YoYWluZm8tPmEzYThfa2kpKQorCQlhaW5mby0+YTNhOF9raV9sZW4gPSBzaXplb2YoYWluZm8tPmEzYThfa2lfbGVuKTsKKwltZW1jcHkoYWluZm8tPmEzYThfa2ksIGEzYThfa2ksIGFpbmZvLT5hM2E4X2tpX2xlbik7CisKKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKworCXJldHVybiAwOworfQorCitpbnQgc2V0X2F1dGhpbmZvX2Zvcl9zdWJzY3Ioc3RydWN0IGdzbV9hdXRoX2luZm8gKmFpbmZvLAorCQkJICAgIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCXN0cnVjdCBnc21fYXV0aF9pbmZvIGFpbmZvX29sZDsKKwlpbnQgcmMsIHVwZDsKKwl1bnNpZ25lZCBjaGFyICpraV9zdHI7CisKKwkvKiBEZWxldGlvbiA/ICovCisJaWYgKGFpbmZvID09IE5VTEwpIHsKKwkJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCQkiREVMRVRFIEZST00gQXV0aEtleXMgV0hFUkUgc3Vic2NyaWJlcl9pZD0ldSIsCisJCQlzdWJzY3ItPmlkKTsKKworCQlpZiAoIXJlc3VsdCkKKwkJCXJldHVybiAtRUlPOworCisJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCisJCXJldHVybiAwOworCX0KKworCS8qIENoZWNrIGlmIGFscmVhZHkgZXhpc3RpbmcgKi8KKwlyYyA9IGdldF9hdXRoaW5mb19ieV9zdWJzY3IoJmFpbmZvX29sZCwgc3Vic2NyKTsKKwlpZiAocmMgJiYgcmMgIT0gLUVOT0VOVCkKKwkJcmV0dXJuIHJjOworCXVwZCA9IHJjID8gMCA6IDE7CisKKwkvKiBVcGRhdGUgLyBJbnNlcnQgKi8KKwlkYmlfY29ubl9xdW90ZV9iaW5hcnlfY29weShjb25uLAorCQlhaW5mby0+YTNhOF9raSwgYWluZm8tPmEzYThfa2lfbGVuLCAma2lfc3RyKTsKKworCWlmICghdXBkKSB7CisJCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkJCSJJTlNFUlQgSU5UTyBBdXRoS2V5cyAiCisJCQkJIihzdWJzY3JpYmVyX2lkLCBhbGdvcml0aG1faWQsIGEzYThfa2kpICIKKwkJCQkiVkFMVUVTICgldSwgJXUsICVzKSIsCisJCQkJc3Vic2NyLT5pZCwgYWluZm8tPmF1dGhfYWxnbywga2lfc3RyKTsKKwl9IGVsc2UgeworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCQkiVVBEQVRFIEF1dGhLZXlzICIKKwkJCQkiU0VUIGFsZ29yaXRobV9pZD0ldSwgYTNhOF9raT0lcyAiCisJCQkJIldIRVJFIHN1YnNjcmliZXJfaWQ9JXUiLAorCQkJCWFpbmZvLT5hdXRoX2FsZ28sIGtpX3N0ciwgc3Vic2NyLT5pZCk7CisJfQorCisJZnJlZShraV9zdHIpOworCisJaWYgKCFyZXN1bHQpCisJCXJldHVybiAtRUlPOworCisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGdldF9hdXRodHVwbGVfYnlfc3Vic2NyKHN0cnVjdCBnc21fYXV0aF90dXBsZSAqYXR1cGxlLAorCQkJICAgIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCWludCBsZW47CisJY29uc3QgdW5zaWduZWQgY2hhciAqYmxvYjsKKworCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkJIlNFTEVDVCAqIEZST00gQXV0aFR1cGxlcyBXSEVSRSBzdWJzY3JpYmVyX2lkPSV1IiwKKwkJCXN1YnNjci0+aWQpOworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gLUVJTzsKKworCWlmICghZGJpX3Jlc3VsdF9uZXh0X3JvdyhyZXN1bHQpKSB7CisJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwltZW1zZXQoYXR1cGxlLCAwLCBzaXplb2YoYXR1cGxlKSk7CisKKwlhdHVwbGUtPnVzZV9jb3VudCA9IGRiaV9yZXN1bHRfZ2V0X3Vsb25nbG9uZyhyZXN1bHQsICJ1c2VfY291bnQiKTsKKwlhdHVwbGUtPmtleV9zZXEgPSBkYmlfcmVzdWx0X2dldF91bG9uZ2xvbmcocmVzdWx0LCAia2V5X3NlcSIpOworCisJbGVuID0gZGJpX3Jlc3VsdF9nZXRfZmllbGRfbGVuZ3RoKHJlc3VsdCwgInJhbmQiKTsKKwlpZiAobGVuICE9IHNpemVvZihhdHVwbGUtPnJhbmQpKQorCQlnb3RvIGVycl9zaXplOworCisJYmxvYiA9IGRiaV9yZXN1bHRfZ2V0X2JpbmFyeShyZXN1bHQsICJyYW5kIik7CisJbWVtY3B5KGF0dXBsZS0+cmFuZCwgYmxvYiwgbGVuKTsKKworCWxlbiA9IGRiaV9yZXN1bHRfZ2V0X2ZpZWxkX2xlbmd0aChyZXN1bHQsICJzcmVzIik7CisJaWYgKGxlbiAhPSBzaXplb2YoYXR1cGxlLT5zcmVzKSkKKwkJZ290byBlcnJfc2l6ZTsKKworCWJsb2IgPSBkYmlfcmVzdWx0X2dldF9iaW5hcnkocmVzdWx0LCAic3JlcyIpOworCW1lbWNweShhdHVwbGUtPnNyZXMsIGJsb2IsIGxlbik7CisKKwlsZW4gPSBkYmlfcmVzdWx0X2dldF9maWVsZF9sZW5ndGgocmVzdWx0LCAia2MiKTsKKwlpZiAobGVuICE9IHNpemVvZihhdHVwbGUtPmtjKSkKKwkJZ290byBlcnJfc2l6ZTsKKworCWJsb2IgPSBkYmlfcmVzdWx0X2dldF9iaW5hcnkocmVzdWx0LCAia2MiKTsKKwltZW1jcHkoYXR1cGxlLT5rYywgYmxvYiwgbGVuKTsKKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCisJcmV0dXJuIDA7CisKK2Vycl9zaXplOgorCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCXJldHVybiAtRUlPOworfQorCitpbnQgc2V0X2F1dGh0dXBsZV9mb3Jfc3Vic2NyKHN0cnVjdCBnc21fYXV0aF90dXBsZSAqYXR1cGxlLAorCQkJICAgICBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKwlpbnQgcmMsIHVwZDsKKwlzdHJ1Y3QgZ3NtX2F1dGhfdHVwbGUgYXR1cGxlX29sZDsKKwl1bnNpZ25lZCBjaGFyICpyYW5kX3N0ciwgKnNyZXNfc3RyLCAqa2Nfc3RyOworCisJLyogRGVsZXRpb24gPyAqLworCWlmIChhdHVwbGUgPT0gTlVMTCkgeworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCSJERUxFVEUgRlJPTSBBdXRoVHVwbGVzIFdIRVJFIHN1YnNjcmliZXJfaWQ9JXUiLAorCQkJc3Vic2NyLT5pZCk7CisKKwkJaWYgKCFyZXN1bHQpCisJCQlyZXR1cm4gLUVJTzsKKworCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBDaGVjayBpZiBhbHJlYWR5IGV4aXN0aW5nICovCisJcmMgPSBnZXRfYXV0aHR1cGxlX2J5X3N1YnNjcigmYXR1cGxlX29sZCwgc3Vic2NyKTsKKwlpZiAocmMgJiYgcmMgIT0gLUVOT0VOVCkKKwkJcmV0dXJuIHJjOworCXVwZCA9IHJjID8gMCA6IDE7CisKKwkvKiBVcGRhdGUgLyBJbnNlcnQgKi8KKwlkYmlfY29ubl9xdW90ZV9iaW5hcnlfY29weShjb25uLAorCQlhdHVwbGUtPnJhbmQsIHNpemVvZihhdHVwbGUtPnJhbmQpLCAmcmFuZF9zdHIpOworCWRiaV9jb25uX3F1b3RlX2JpbmFyeV9jb3B5KGNvbm4sCisJCWF0dXBsZS0+c3Jlcywgc2l6ZW9mKGF0dXBsZS0+c3JlcyksICZzcmVzX3N0cik7CisJZGJpX2Nvbm5fcXVvdGVfYmluYXJ5X2NvcHkoY29ubiwKKwkJYXR1cGxlLT5rYywgc2l6ZW9mKGF0dXBsZS0+a2MpLCAma2Nfc3RyKTsKKworCWlmICghdXBkKSB7CisJCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkJCSJJTlNFUlQgSU5UTyBBdXRoVHVwbGVzICIKKwkJCQkiKHN1YnNjcmliZXJfaWQsIGlzc3VlZCwgdXNlX2NvdW50LCAiCisJCQkJICJrZXlfc2VxLCByYW5kLCBzcmVzLCBrYykgIgorCQkJCSJWQUxVRVMgKCV1LCBkYXRldGltZSgnbm93JyksICV1LCAiCisJCQkJICIldSwgJXMsICVzLCAlcyApICIsCisJCQkJc3Vic2NyLT5pZCwgYXR1cGxlLT51c2VfY291bnQsIGF0dXBsZS0+a2V5X3NlcSwKKwkJCQlyYW5kX3N0ciwgc3Jlc19zdHIsIGtjX3N0cik7CisJfSBlbHNlIHsKKwkJY2hhciAqaXNzdWVkID0gYXR1cGxlLT5rZXlfc2VxID09IGF0dXBsZV9vbGQua2V5X3NlcSA/CisJCQkJCSJpc3N1ZWQiIDogImRhdGV0aW1lKCdub3cnKSI7CisJCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkJCSJVUERBVEUgQXV0aEtleXMgIgorCQkJCSJTRVQgaXNzdWVkPSVzLCB1c2VfY291bnQ9JXUsICIKKwkJCQkgImtleV9zZXE9JXUsIHJhbmQ9JXMsIHNyZXM9JXMsIGtjPSVzICIKKwkJCQkiV0hFUkUgc3Vic2NyaWJlcl9pZCA9ICV1IiwKKwkJCQlpc3N1ZWQsIGF0dXBsZS0+dXNlX2NvdW50LCBhdHVwbGUtPmtleV9zZXEsCisJCQkJcmFuZF9zdHIsIHNyZXNfc3RyLCBrY19zdHIsIHN1YnNjci0+aWQpOworCX0KKworCWZyZWUocmFuZF9zdHIpOworCWZyZWUoc3Jlc19zdHIpOworCWZyZWUoa2Nfc3RyKTsKKworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gLUVJTzsKKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgQkFTRV9RVUVSWSAiU0VMRUNUICogRlJPTSBTdWJzY3JpYmVyICIKK3N0cnVjdCBnc21fc3Vic2NyaWJlciAqZGJfZ2V0X3N1YnNjcmliZXIoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsCisJCQkJCSBlbnVtIGdzbV9zdWJzY3JpYmVyX2ZpZWxkIGZpZWxkLAorCQkJCQkgY29uc3QgY2hhciAqaWQpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJY29uc3QgY2hhciAqc3RyaW5nOworCWNoYXIgKnF1b3RlZDsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKKworCXN3aXRjaCAoZmllbGQpIHsKKwljYXNlIEdTTV9TVUJTQ1JJQkVSX0lNU0k6CisJCWRiaV9jb25uX3F1b3RlX3N0cmluZ19jb3B5KGNvbm4sIGlkLCAmcXVvdGVkKTsKKwkJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCQlCQVNFX1FVRVJZCisJCQkiV0hFUkUgaW1zaSA9ICVzICIsCisJCQlxdW90ZWQKKwkJKTsKKwkJZnJlZShxdW90ZWQpOworCQlicmVhazsKKwljYXNlIEdTTV9TVUJTQ1JJQkVSX1RNU0k6CisJCWRiaV9jb25uX3F1b3RlX3N0cmluZ19jb3B5KGNvbm4sIGlkLCAmcXVvdGVkKTsKKwkJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCQlCQVNFX1FVRVJZCisJCQkiV0hFUkUgdG1zaSA9ICVzICIsCisJCQlxdW90ZWQKKwkJKTsKKwkJZnJlZShxdW90ZWQpOworCQlicmVhazsKKwljYXNlIEdTTV9TVUJTQ1JJQkVSX0VYVEVOU0lPTjoKKwkJZGJpX2Nvbm5fcXVvdGVfc3RyaW5nX2NvcHkoY29ubiwgaWQsICZxdW90ZWQpOworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCUJBU0VfUVVFUlkKKwkJCSJXSEVSRSBleHRlbnNpb24gPSAlcyAiLAorCQkJcXVvdGVkCisJCSk7CisJCWZyZWUocXVvdGVkKTsKKwkJYnJlYWs7CisJY2FzZSBHU01fU1VCU0NSSUJFUl9JRDoKKwkJZGJpX2Nvbm5fcXVvdGVfc3RyaW5nX2NvcHkoY29ubiwgaWQsICZxdW90ZWQpOworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCUJBU0VfUVVFUlkKKwkJCSJXSEVSRSBpZCA9ICVzICIsIHF1b3RlZCk7CisJCWZyZWUocXVvdGVkKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChEREIsIExPR0xfTk9USUNFLCAiVW5rbm93biBxdWVyeSBzZWxlY3RvciBmb3IgU3Vic2NyaWJlci5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKCFyZXN1bHQpIHsKKwkJTE9HUChEREIsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gcXVlcnkgU3Vic2NyaWJlci5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKCFkYmlfcmVzdWx0X25leHRfcm93KHJlc3VsdCkpIHsKKwkJREVCVUdQKEREQiwgIkZhaWxlZCB0byBmaW5kIHRoZSBTdWJzY3JpYmVyLiAnJXUnICclcydcbiIsCisJCQlmaWVsZCwgaWQpOworCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc3Vic2NyID0gc3Vic2NyX2FsbG9jKCk7CisJc3Vic2NyLT5uZXQgPSBuZXQ7CisJc3Vic2NyLT5pZCA9IGRiaV9yZXN1bHRfZ2V0X3Vsb25nbG9uZyhyZXN1bHQsICJpZCIpOworCXN0cmluZyA9IGRiaV9yZXN1bHRfZ2V0X3N0cmluZyhyZXN1bHQsICJpbXNpIik7CisJaWYgKHN0cmluZykKKwkJc3RybmNweShzdWJzY3ItPmltc2ksIHN0cmluZywgR1NNX0lNU0lfTEVOR1RIKTsKKworCXN0cmluZyA9IGRiaV9yZXN1bHRfZ2V0X3N0cmluZyhyZXN1bHQsICJ0bXNpIik7CisJaWYgKHN0cmluZykKKwkJc3Vic2NyLT50bXNpID0gdG1zaV9mcm9tX3N0cmluZyhzdHJpbmcpOworCisJc3RyaW5nID0gZGJpX3Jlc3VsdF9nZXRfc3RyaW5nKHJlc3VsdCwgIm5hbWUiKTsKKwlpZiAoc3RyaW5nKQorCQlzdHJuY3B5KHN1YnNjci0+bmFtZSwgc3RyaW5nLCBHU01fTkFNRV9MRU5HVEgpOworCisJc3RyaW5nID0gZGJpX3Jlc3VsdF9nZXRfc3RyaW5nKHJlc3VsdCwgImV4dGVuc2lvbiIpOworCWlmIChzdHJpbmcpCisJCXN0cm5jcHkoc3Vic2NyLT5leHRlbnNpb24sIHN0cmluZywgR1NNX0VYVEVOU0lPTl9MRU5HVEgpOworCisJc3Vic2NyLT5sYWMgPSBkYmlfcmVzdWx0X2dldF91aW50KHJlc3VsdCwgImxhYyIpOworCXN1YnNjci0+YXV0aG9yaXplZCA9IGRiaV9yZXN1bHRfZ2V0X3VpbnQocmVzdWx0LCAiYXV0aG9yaXplZCIpOworCURFQlVHUChEREIsICJGb3VuZCBTdWJzY3JpYmVyOiBJRCAlbGx1LCBJTVNJICVzLCBOQU1FICclcycsIFRNU0kgJXUsIEVYVEVOICclcycsIExBQyAlaHUsIEFVVEggJXVcbiIsCisJCXN1YnNjci0+aWQsIHN1YnNjci0+aW1zaSwgc3Vic2NyLT5uYW1lLCBzdWJzY3ItPnRtc2ksIHN1YnNjci0+ZXh0ZW5zaW9uLAorCQlzdWJzY3ItPmxhYywgc3Vic2NyLT5hdXRob3JpemVkKTsKKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKworCWdldF9lcXVpcG1lbnRfYnlfc3Vic2NyKHN1YnNjcik7CisKKwlyZXR1cm4gc3Vic2NyOworfQorCitpbnQgZGJfc3luY19zdWJzY3JpYmVyKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyaWJlcikKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKwljaGFyIHRtc2lbMTRdOworCWNoYXIgKnFfdG1zaTsKKworCWlmIChzdWJzY3JpYmVyLT50bXNpICE9IEdTTV9SRVNFUlZFRF9UTVNJKSB7CisJCXNwcmludGYodG1zaSwgIiV1Iiwgc3Vic2NyaWJlci0+dG1zaSk7CisJCWRiaV9jb25uX3F1b3RlX3N0cmluZ19jb3B5KGNvbm4sCisJCQkJICAgdG1zaSwKKwkJCQkgICAmcV90bXNpKTsKKwl9IGVsc2UKKwkJcV90bXNpID0gc3RyZHVwKCJOVUxMIik7CisKKwlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJIlVQREFURSBTdWJzY3JpYmVyICIKKwkJIlNFVCB1cGRhdGVkID0gZGF0ZXRpbWUoJ25vdycpLCAiCisJCSJuYW1lID0gJyVzJywgIgorCQkiZXh0ZW5zaW9uID0gJyVzJywgIgorCQkiYXV0aG9yaXplZCA9ICVpLCAiCisJCSJ0bXNpID0gJXMsICIKKwkJImxhYyA9ICVpICIKKwkJIldIRVJFIGltc2kgPSAlcyAiLAorCQlzdWJzY3JpYmVyLT5uYW1lLAorCQlzdWJzY3JpYmVyLT5leHRlbnNpb24sCisJCXN1YnNjcmliZXItPmF1dGhvcml6ZWQsCisJCXFfdG1zaSwKKwkJc3Vic2NyaWJlci0+bGFjLAorCQlzdWJzY3JpYmVyLT5pbXNpKTsKKworCWZyZWUocV90bXNpKTsKKworCWlmICghcmVzdWx0KSB7CisJCUxPR1AoRERCLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIHVwZGF0ZSBTdWJzY3JpYmVyIChieSBJTVNJKS5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKworCXJldHVybiAwOworfQorCitpbnQgZGJfc3luY19lcXVpcG1lbnQoc3RydWN0IGdzbV9lcXVpcG1lbnQgKmVxdWlwKQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCXVuc2lnbmVkIGNoYXIgKmNtMiwgKmNtMzsKKwl1X2ludDhfdCBjbGFzc21hcmsxOworCisJbWVtY3B5KCZjbGFzc21hcmsxLCAmZXF1aXAtPmNsYXNzbWFyazEsIHNpemVvZihjbGFzc21hcmsxKSk7CisJREVCVUdQKEREQiwgIlN5bmMgRXF1aXBtZW50IElNRUk9JXMsIGNsYXNzbWFyazE9JTAyeCIsCisJCWVxdWlwLT5pbWVpLCBjbGFzc21hcmsxKTsKKwlpZiAoZXF1aXAtPmNsYXNzbWFyazJfbGVuKQorCQlERUJVR1BDKEREQiwgIiwgY2xhc3NtYXJrMj0lcyIsCisJCQloZXhkdW1wKGVxdWlwLT5jbGFzc21hcmsyLCBlcXVpcC0+Y2xhc3NtYXJrMl9sZW4pKTsKKwlpZiAoZXF1aXAtPmNsYXNzbWFyazNfbGVuKQorCQlERUJVR1BDKEREQiwgIiwgY2xhc3NtYXJrMz0lcyIsCisJCQloZXhkdW1wKGVxdWlwLT5jbGFzc21hcmszLCBlcXVpcC0+Y2xhc3NtYXJrM19sZW4pKTsKKwlERUJVR1BDKEREQiwgIlxuIik7CisKKwlkYmlfY29ubl9xdW90ZV9iaW5hcnlfY29weShjb25uLCBlcXVpcC0+Y2xhc3NtYXJrMiwKKwkJCQkgICBlcXVpcC0+Y2xhc3NtYXJrMl9sZW4sICZjbTIpOworCWRiaV9jb25uX3F1b3RlX2JpbmFyeV9jb3B5KGNvbm4sIGVxdWlwLT5jbGFzc21hcmszLAorCQkJCSAgIGVxdWlwLT5jbGFzc21hcmszX2xlbiwgJmNtMyk7CisKKwlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJIlVQREFURSBFcXVpcG1lbnQgU0VUICIKKwkJCSJ1cGRhdGVkID0gZGF0ZXRpbWUoJ25vdycpLCAiCisJCQkiY2xhc3NtYXJrMSA9ICV1LCAiCisJCQkiY2xhc3NtYXJrMiA9ICVzLCAiCisJCQkiY2xhc3NtYXJrMyA9ICVzICIKKwkJIldIRVJFIGltZWkgPSAnJXMnICIsCisJCWNsYXNzbWFyazEsIGNtMiwgY20zLCBlcXVpcC0+aW1laSk7CisKKwlmcmVlKGNtMik7CisJZnJlZShjbTMpOworCisJaWYgKCFyZXN1bHQpIHsKKwkJTE9HUChEREIsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gdXBkYXRlIEVxdWlwbWVudFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCXJldHVybiAwOworfQorCitpbnQgZGJfc3Vic2NyaWJlcl9hbGxvY190bXNpKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyaWJlcikKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdCA9IE5VTEw7CisJY2hhciB0bXNpWzE0XTsKKwljaGFyKiB0bXNpX3F1b3RlZDsKKworCWZvciAoOzspIHsKKwkJc3Vic2NyaWJlci0+dG1zaSA9IHJhbmQoKTsKKwkJaWYgKHN1YnNjcmliZXItPnRtc2kgPT0gR1NNX1JFU0VSVkVEX1RNU0kpCisJCQljb250aW51ZTsKKworCQlzcHJpbnRmKHRtc2ksICIldSIsIHN1YnNjcmliZXItPnRtc2kpOworCQlkYmlfY29ubl9xdW90ZV9zdHJpbmdfY29weShjb25uLCB0bXNpLCAmdG1zaV9xdW90ZWQpOworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCSJTRUxFQ1QgKiBGUk9NIFN1YnNjcmliZXIgIgorCQkJIldIRVJFIHRtc2kgPSAlcyAiLAorCQkJdG1zaV9xdW90ZWQpOworCisJCWZyZWUodG1zaV9xdW90ZWQpOworCisJCWlmICghcmVzdWx0KSB7CisJCQlMT0dQKEREQiwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBxdWVyeSBTdWJzY3JpYmVyICIKKwkJCQkid2hpbGUgYWxsb2NhdGluZyBuZXcgVE1TSS5cbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJaWYgKGRiaV9yZXN1bHRfZ2V0X251bXJvd3MocmVzdWx0KSkgeworCQkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIWRiaV9yZXN1bHRfbmV4dF9yb3cocmVzdWx0KSkgeworCQkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJCQlERUJVR1AoRERCLCAiQWxsb2NhdGVkIFRNU0kgJXUgZm9yIElNU0kgJXMuXG4iLAorCQkJCXN1YnNjcmliZXItPnRtc2ksIHN1YnNjcmliZXItPmltc2kpOworCQkJcmV0dXJuIGRiX3N5bmNfc3Vic2NyaWJlcihzdWJzY3JpYmVyKTsKKwkJfQorCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBkYl9zdWJzY3JpYmVyX2FsbG9jX2V4dGVuKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyaWJlcikKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdCA9IE5VTEw7CisJdV9pbnQzMl90IHRyeTsKKworCWZvciAoOzspIHsKKwkJdHJ5ID0gKHJhbmQoKSUoR1NNX01BWF9FWFRFTi1HU01fTUlOX0VYVEVOKzEpK0dTTV9NSU5fRVhURU4pOworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCSJTRUxFQ1QgKiBGUk9NIFN1YnNjcmliZXIgIgorCQkJIldIRVJFIGV4dGVuc2lvbiA9ICVpIiwKKwkJCXRyeQorCQkpOworCQlpZiAoIXJlc3VsdCkgeworCQkJTE9HUChEREIsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gcXVlcnkgU3Vic2NyaWJlciAiCisJCQkJIndoaWxlIGFsbG9jYXRpbmcgbmV3IGV4dGVuc2lvbi5cbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJaWYgKGRiaV9yZXN1bHRfZ2V0X251bXJvd3MocmVzdWx0KSl7CisJCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghZGJpX3Jlc3VsdF9uZXh0X3JvdyhyZXN1bHQpKSB7CisJCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJCWJyZWFrOworCQl9CisJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCX0KKwlzcHJpbnRmKHN1YnNjcmliZXItPmV4dGVuc2lvbiwgIiVpIiwgdHJ5KTsKKwlERUJVR1AoRERCLCAiQWxsb2NhdGVkIGV4dGVuc2lvbiAlaSBmb3IgSU1TSSAlcy5cbiIsIHRyeSwgc3Vic2NyaWJlci0+aW1zaSk7CisJcmV0dXJuIGRiX3N5bmNfc3Vic2NyaWJlcihzdWJzY3JpYmVyKTsKK30KKy8qCisgKiB0cnkgdG8gYWxsb2NhdGUgYSBuZXcgdW5pcXVlIHRva2VuIGZvciB0aGlzIHN1YnNjcmliZXIgYW5kIHJldHVybiBpdAorICogdmlhIGEgcGFyYW1ldGVyLiBpZiB0aGUgc3Vic2NyaWJlciBhbHJlYWR5IGhhcyBhIHRva2VuLCByZXR1cm4KKyAqIGFuIGVycm9yLgorICovCisKK2ludCBkYl9zdWJzY3JpYmVyX2FsbG9jX3Rva2VuKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyaWJlciwgdV9pbnQzMl90ICp0b2tlbikKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKwl1X2ludDMyX3QgdHJ5OworCisJZm9yICg7OykgeworCQl0cnkgPSByYW5kKCk7CisJCWlmICghdHJ5KSAvKiAwIGlzIGFuIGludmFsaWQgdG9rZW4gKi8KKwkJCWNvbnRpbnVlOworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCSJTRUxFQ1QgKiBGUk9NIEF1dGhUb2tlbiAiCisJCQkiV0hFUkUgc3Vic2NyaWJlcl9pZCA9ICVsbHUgT1IgdG9rZW4gPSBcIiUwOFhcIiAiLAorCQkJc3Vic2NyaWJlci0+aWQsIHRyeSk7CisJCWlmICghcmVzdWx0KSB7CisJCQlMT0dQKEREQiwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBxdWVyeSBBdXRoVG9rZW4gIgorCQkJCSJ3aGlsZSBhbGxvY2F0aW5nIG5ldyB0b2tlbi5cbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJaWYgKGRiaV9yZXN1bHRfZ2V0X251bXJvd3MocmVzdWx0KSkgeworCQkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIWRiaV9yZXN1bHRfbmV4dF9yb3cocmVzdWx0KSkgeworCQkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJCQlicmVhazsKKwkJfQorCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwl9CisJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCSJJTlNFUlQgSU5UTyBBdXRoVG9rZW4gIgorCQkiKHN1YnNjcmliZXJfaWQsIGNyZWF0ZWQsIHRva2VuKSAiCisJCSJWQUxVRVMgIgorCQkiKCVsbHUsIGRhdGV0aW1lKCdub3cnKSwgXCIlMDhYXCIpICIsCisJCXN1YnNjcmliZXItPmlkLCB0cnkpOworCWlmICghcmVzdWx0KSB7CisJCUxPR1AoRERCLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSB0b2tlbiAlMDhYIGZvciAiCisJCQkiSU1TSSAlcy5cbiIsIHRyeSwgc3Vic2NyaWJlci0+aW1zaSk7CisJCXJldHVybiAxOworCX0KKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkqdG9rZW4gPSB0cnk7CisJREVCVUdQKEREQiwgIkFsbG9jYXRlZCB0b2tlbiAlMDhYIGZvciBJTVNJICVzLlxuIiwgdHJ5LCBzdWJzY3JpYmVyLT5pbXNpKTsKKworCXJldHVybiAwOworfQorCitpbnQgZGJfc3Vic2NyaWJlcl9hc3NvY19pbWVpKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyaWJlciwgY2hhciBpbWVpW0dTTV9JTUVJX0xFTkdUSF0pCit7CisJdW5zaWduZWQgbG9uZyBsb25nIGVxdWlwbWVudF9pZCwgd2F0Y2hfaWQ7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisKKwlzdHJuY3B5KHN1YnNjcmliZXItPmVxdWlwbWVudC5pbWVpLCBpbWVpLAorCQlzaXplb2Yoc3Vic2NyaWJlci0+ZXF1aXBtZW50LmltZWkpLTEpLAorCisJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCSJJTlNFUlQgT1IgSUdOT1JFIElOVE8gRXF1aXBtZW50ICIKKwkJIihpbWVpLCBjcmVhdGVkLCB1cGRhdGVkKSAiCisJCSJWQUxVRVMgIgorCQkiKCVzLCBkYXRldGltZSgnbm93JyksIGRhdGV0aW1lKCdub3cnKSkgIiwKKwkJaW1laSk7CisJaWYgKCFyZXN1bHQpIHsKKwkJTE9HUChEREIsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIEVxdWlwbWVudCBieSBJTUVJLlxuIik7CisJCXJldHVybiAxOworCX0KKworCWVxdWlwbWVudF9pZCA9IDA7CisJaWYgKGRiaV9yZXN1bHRfZ2V0X251bXJvd3NfYWZmZWN0ZWQocmVzdWx0KSkgeworCQllcXVpcG1lbnRfaWQgPSBkYmlfY29ubl9zZXF1ZW5jZV9sYXN0KGNvbm4sIE5VTEwpOworCX0KKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKworCWlmIChlcXVpcG1lbnRfaWQpCisJCURFQlVHUChEREIsICJOZXcgRXF1aXBtZW50OiBJRCAlbGx1LCBJTUVJICVzXG4iLCBlcXVpcG1lbnRfaWQsIGltZWkpOworCWVsc2UgeworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCSJTRUxFQ1QgaWQgRlJPTSBFcXVpcG1lbnQgIgorCQkJIldIRVJFIGltZWkgPSAlcyAiLAorCQkJaW1laQorCQkpOworCQlpZiAoIXJlc3VsdCkgeworCQkJTE9HUChEREIsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gcXVlcnkgRXF1aXBtZW50IGJ5IElNRUkuXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisJCWlmICghZGJpX3Jlc3VsdF9uZXh0X3JvdyhyZXN1bHQpKSB7CisJCQlMT0dQKEREQiwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBmaW5kIHRoZSBFcXVpcG1lbnQuXG4iKTsKKwkJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJZXF1aXBtZW50X2lkID0gZGJpX3Jlc3VsdF9nZXRfdWxvbmdsb25nKHJlc3VsdCwgImlkIik7CisJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCX0KKworCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkiSU5TRVJUIE9SIElHTk9SRSBJTlRPIEVxdWlwbWVudFdhdGNoICIKKwkJIihzdWJzY3JpYmVyX2lkLCBlcXVpcG1lbnRfaWQsIGNyZWF0ZWQsIHVwZGF0ZWQpICIKKwkJIlZBTFVFUyAiCisJCSIoJWxsdSwgJWxsdSwgZGF0ZXRpbWUoJ25vdycpLCBkYXRldGltZSgnbm93JykpICIsCisJCXN1YnNjcmliZXItPmlkLCBlcXVpcG1lbnRfaWQpOworCWlmICghcmVzdWx0KSB7CisJCUxPR1AoRERCLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSBFcXVpcG1lbnRXYXRjaC5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwl3YXRjaF9pZCA9IDA7CisJaWYgKGRiaV9yZXN1bHRfZ2V0X251bXJvd3NfYWZmZWN0ZWQocmVzdWx0KSkKKwkJd2F0Y2hfaWQgPSBkYmlfY29ubl9zZXF1ZW5jZV9sYXN0KGNvbm4sIE5VTEwpOworCisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJaWYgKHdhdGNoX2lkKQorCQlERUJVR1AoRERCLCAiTmV3IEVxdWlwbWVudFdhdGNoOiBJRCAlbGx1LCBJTVNJICVzLCBJTUVJICVzXG4iLAorCQkJZXF1aXBtZW50X2lkLCBzdWJzY3JpYmVyLT5pbXNpLCBpbWVpKTsKKwllbHNlIHsKKwkJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCQkiVVBEQVRFIEVxdWlwbWVudFdhdGNoICIKKwkJCSJTRVQgdXBkYXRlZCA9IGRhdGV0aW1lKCdub3cnKSAiCisJCQkiV0hFUkUgc3Vic2NyaWJlcl9pZCA9ICVsbHUgQU5EIGVxdWlwbWVudF9pZCA9ICVsbHUgIiwKKwkJCXN1YnNjcmliZXItPmlkLCBlcXVpcG1lbnRfaWQpOworCQlpZiAoIXJlc3VsdCkgeworCQkJTE9HUChEREIsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gdXBkYXRlIEVxdWlwbWVudFdhdGNoLlxuIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJREVCVUdQKEREQiwgIlVwZGF0ZWQgRXF1aXBtZW50V2F0Y2g6IElEICVsbHUsIElNU0kgJXMsIElNRUkgJXNcbiIsCisJCQllcXVpcG1lbnRfaWQsIHN1YnNjcmliZXItPmltc2ksIGltZWkpOworCX0KKworCXJldHVybiAwOworfQorCisvKiBzdG9yZSBhbiBbdW5zZW50XSBTTVMgdG8gdGhlIGRhdGFiYXNlICovCitpbnQgZGJfc21zX3N0b3JlKHN0cnVjdCBnc21fc21zICpzbXMpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJY2hhciAqcV90ZXh0LCAqcV9kYWRkcjsKKwl1bnNpZ25lZCBjaGFyICpxX3VkYXRhOworCWNoYXIgKnZhbGlkaXR5X3RpbWVzdGFtcCA9ICIyMjIyLTItMiI7CisKKwkvKiBGSVhNRTogZ2VuZXJhdGUgdmFsaWRpdHkgdGltZXN0YW1wIGJhc2VkIG9uIHZhbGlkaXR5X21pbnV0ZXMgKi8KKworCWRiaV9jb25uX3F1b3RlX3N0cmluZ19jb3B5KGNvbm4sIChjaGFyICopc21zLT50ZXh0LCAmcV90ZXh0KTsKKwlkYmlfY29ubl9xdW90ZV9zdHJpbmdfY29weShjb25uLCAoY2hhciAqKXNtcy0+ZGVzdF9hZGRyLCAmcV9kYWRkcik7CisJZGJpX2Nvbm5fcXVvdGVfYmluYXJ5X2NvcHkoY29ubiwgc21zLT51c2VyX2RhdGEsIHNtcy0+dXNlcl9kYXRhX2xlbiwKKwkJCQkgICAmcV91ZGF0YSk7CisJLyogRklYTUU6IGNvcnJlY3QgdmFsaWRpdHkgcGVyaW9kICovCisJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCSJJTlNFUlQgSU5UTyBTTVMgIgorCQkiKGNyZWF0ZWQsIHNlbmRlcl9pZCwgcmVjZWl2ZXJfaWQsIHZhbGlkX3VudGlsLCAiCisJCSAicmVwbHlfcGF0aF9yZXEsIHN0YXR1c19yZXBfcmVxLCBwcm90b2NvbF9pZCwgIgorCQkgImRhdGFfY29kaW5nX3NjaGVtZSwgdWRfaGRyX2luZCwgZGVzdF9hZGRyLCAiCisJCSAidXNlcl9kYXRhLCB0ZXh0KSBWQUxVRVMgIgorCQkiKGRhdGV0aW1lKCdub3cnKSwgJWxsdSwgJWxsdSwgJXUsICIKKwkJICIldSwgJXUsICV1LCAldSwgJXUsICVzLCAlcywgJXMpIiwKKwkJc21zLT5zZW5kZXItPmlkLAorCQlzbXMtPnJlY2VpdmVyID8gc21zLT5yZWNlaXZlci0+aWQgOiAwLCB2YWxpZGl0eV90aW1lc3RhbXAsCisJCXNtcy0+cmVwbHlfcGF0aF9yZXEsIHNtcy0+c3RhdHVzX3JlcF9yZXEsIHNtcy0+cHJvdG9jb2xfaWQsCisJCXNtcy0+ZGF0YV9jb2Rpbmdfc2NoZW1lLCBzbXMtPnVkX2hkcl9pbmQsCisJCXFfZGFkZHIsIHFfdWRhdGEsIHFfdGV4dCk7CisJZnJlZShxX3RleHQpOworCWZyZWUocV9kYWRkcik7CisJZnJlZShxX3VkYXRhKTsKKworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gLUVJTzsKKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGdzbV9zbXMgKnNtc19mcm9tX3Jlc3VsdChzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgZGJpX3Jlc3VsdCByZXN1bHQpCit7CisJc3RydWN0IGdzbV9zbXMgKnNtcyA9IHNtc19hbGxvYygpOworCWxvbmcgbG9uZyB1bnNpZ25lZCBpbnQgc2VuZGVyX2lkLCByZWNlaXZlcl9pZDsKKwljb25zdCBjaGFyICp0ZXh0LCAqZGFkZHI7CisJY29uc3QgdW5zaWduZWQgY2hhciAqdXNlcl9kYXRhOworCisJaWYgKCFzbXMpCisJCXJldHVybiBOVUxMOworCisJc21zLT5pZCA9IGRiaV9yZXN1bHRfZ2V0X3Vsb25nbG9uZyhyZXN1bHQsICJpZCIpOworCisJc2VuZGVyX2lkID0gZGJpX3Jlc3VsdF9nZXRfdWxvbmdsb25nKHJlc3VsdCwgInNlbmRlcl9pZCIpOworCXNtcy0+c2VuZGVyID0gc3Vic2NyX2dldF9ieV9pZChuZXQsIHNlbmRlcl9pZCk7CisKKwlyZWNlaXZlcl9pZCA9IGRiaV9yZXN1bHRfZ2V0X3Vsb25nbG9uZyhyZXN1bHQsICJyZWNlaXZlcl9pZCIpOworCXNtcy0+cmVjZWl2ZXIgPSBzdWJzY3JfZ2V0X2J5X2lkKG5ldCwgcmVjZWl2ZXJfaWQpOworCisJLyogRklYTUU6IHZhbGlkaXR5ICovCisJLyogRklYTUU6IHRob3NlIHNob3VsZCBhbGwgYmUgZ2V0X3VjaGFyLCBidXQgc3FsaXRlMyBpcyBicmFpbmRlYWQgKi8KKwlzbXMtPnJlcGx5X3BhdGhfcmVxID0gZGJpX3Jlc3VsdF9nZXRfdWludChyZXN1bHQsICJyZXBseV9wYXRoX3JlcSIpOworCXNtcy0+c3RhdHVzX3JlcF9yZXEgPSBkYmlfcmVzdWx0X2dldF91aW50KHJlc3VsdCwgInN0YXR1c19yZXBfcmVxIik7CisJc21zLT51ZF9oZHJfaW5kID0gZGJpX3Jlc3VsdF9nZXRfdWludChyZXN1bHQsICJ1ZF9oZHJfaW5kIik7CisJc21zLT5wcm90b2NvbF9pZCA9IGRiaV9yZXN1bHRfZ2V0X3VpbnQocmVzdWx0LCAicHJvdG9jb2xfaWQiKTsKKwlzbXMtPmRhdGFfY29kaW5nX3NjaGVtZSA9IGRiaV9yZXN1bHRfZ2V0X3VpbnQocmVzdWx0LAorCQkJCQkJICAiZGF0YV9jb2Rpbmdfc2NoZW1lIik7CisJLyogc21zLT5tc2dfcmVmIGlzIHRlbXBvcmFyeSBhbmQgbm90IHN0b3JlZCBpbiBEQiAqLworCisJZGFkZHIgPSBkYmlfcmVzdWx0X2dldF9zdHJpbmcocmVzdWx0LCAiZGVzdF9hZGRyIik7CisJaWYgKGRhZGRyKSB7CisJCXN0cm5jcHkoc21zLT5kZXN0X2FkZHIsIGRhZGRyLCBzaXplb2Yoc21zLT5kZXN0X2FkZHIpKTsKKwkJc21zLT5kZXN0X2FkZHJbc2l6ZW9mKHNtcy0+ZGVzdF9hZGRyKS0xXSA9ICdcMCc7CisJfQorCisJc21zLT51c2VyX2RhdGFfbGVuID0gZGJpX3Jlc3VsdF9nZXRfZmllbGRfbGVuZ3RoKHJlc3VsdCwgInVzZXJfZGF0YSIpOworCXVzZXJfZGF0YSA9IGRiaV9yZXN1bHRfZ2V0X2JpbmFyeShyZXN1bHQsICJ1c2VyX2RhdGEiKTsKKwlpZiAoc21zLT51c2VyX2RhdGFfbGVuID4gc2l6ZW9mKHNtcy0+dXNlcl9kYXRhKSkKKwkJc21zLT51c2VyX2RhdGFfbGVuID0gKHVfaW50OF90KSBzaXplb2Yoc21zLT51c2VyX2RhdGEpOworCW1lbWNweShzbXMtPnVzZXJfZGF0YSwgdXNlcl9kYXRhLCBzbXMtPnVzZXJfZGF0YV9sZW4pOworCisJdGV4dCA9IGRiaV9yZXN1bHRfZ2V0X3N0cmluZyhyZXN1bHQsICJ0ZXh0Iik7CisJaWYgKHRleHQpIHsKKwkJc3RybmNweShzbXMtPnRleHQsIHRleHQsIHNpemVvZihzbXMtPnRleHQpKTsKKwkJc21zLT50ZXh0W3NpemVvZihzbXMtPnRleHQpLTFdID0gJ1wwJzsKKwl9CisJcmV0dXJuIHNtczsKK30KKworLyogcmV0cmlldmUgdGhlIG5leHQgdW5zZW50IFNNUyB3aXRoIElEID49IG1pbl9pZCAqLworc3RydWN0IGdzbV9zbXMgKmRiX3Ntc19nZXRfdW5zZW50KHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCBpbnQgbWluX2lkKQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCXN0cnVjdCBnc21fc21zICpzbXM7CisKKwlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJIlNFTEVDVCAqIEZST00gU01TLFN1YnNjcmliZXIgIgorCQkiV0hFUkUgc21zLmlkID49ICVsbHUgQU5EIHNtcy5zZW50IGlzIE5VTEwgIgorCQkJIkFORCBzbXMucmVjZWl2ZXJfaWQgPSBzdWJzY3JpYmVyLmlkICIKKwkJCSJBTkQgc3Vic2NyaWJlci5sYWMgPiAwICIKKwkJIk9SREVSIEJZIHNtcy5pZCBMSU1JVCAxIiwKKwkJbWluX2lkKTsKKwlpZiAoIXJlc3VsdCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIWRiaV9yZXN1bHRfbmV4dF9yb3cocmVzdWx0KSkgeworCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc21zID0gc21zX2Zyb21fcmVzdWx0KG5ldCwgcmVzdWx0KTsKKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCisJcmV0dXJuIHNtczsKK30KKworc3RydWN0IGdzbV9zbXMgKmRiX3Ntc19nZXRfdW5zZW50X2J5X3N1YnNjcihzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgaW50IG1pbl9zdWJzY3JfaWQpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJc3RydWN0IGdzbV9zbXMgKnNtczsKKworCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkiU0VMRUNUICogRlJPTSBTTVMsU3Vic2NyaWJlciAiCisJCSJXSEVSRSBzbXMucmVjZWl2ZXJfaWQgPj0gJWxsdSBBTkQgc21zLnNlbnQgaXMgTlVMTCAiCisJCQkiQU5EIHNtcy5yZWNlaXZlcl9pZCA9IHN1YnNjcmliZXIuaWQgIiAKKwkJCSJBTkQgc3Vic2NyaWJlci5sYWMgPiAwICIKKwkJIk9SREVSIEJZIHNtcy5yZWNlaXZlcl9pZCwgaWQgTElNSVQgMSIsCisJCW1pbl9zdWJzY3JfaWQpOworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghZGJpX3Jlc3VsdF9uZXh0X3JvdyhyZXN1bHQpKSB7CisJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzbXMgPSBzbXNfZnJvbV9yZXN1bHQobmV0LCByZXN1bHQpOworCisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisKKwlyZXR1cm4gc21zOworfQorCisvKiByZXRyaWV2ZSB0aGUgbmV4dCB1bnNlbnQgU01TIGZvciBhIGdpdmVuIHN1YnNjcmliZXIgKi8KK3N0cnVjdCBnc21fc21zICpkYl9zbXNfZ2V0X3Vuc2VudF9mb3Jfc3Vic2NyKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCXN0cnVjdCBnc21fc21zICpzbXM7CisKKwlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJIlNFTEVDVCAqIEZST00gU01TLFN1YnNjcmliZXIgIgorCQkiV0hFUkUgc21zLnJlY2VpdmVyX2lkID0gJWxsdSBBTkQgc21zLnNlbnQgaXMgTlVMTCAiCisJCQkiQU5EIHNtcy5yZWNlaXZlcl9pZCA9IHN1YnNjcmliZXIuaWQgIgorCQkJIkFORCBzdWJzY3JpYmVyLmxhYyA+IDAgIgorCQkiT1JERVIgQlkgc21zLmlkIExJTUlUIDEiLAorCQlzdWJzY3ItPmlkKTsKKwlpZiAoIXJlc3VsdCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIWRiaV9yZXN1bHRfbmV4dF9yb3cocmVzdWx0KSkgeworCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc21zID0gc21zX2Zyb21fcmVzdWx0KHN1YnNjci0+bmV0LCByZXN1bHQpOworCisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisKKwlyZXR1cm4gc21zOworfQorCisvKiBtYXJrIGEgZ2l2ZW4gU01TIGFzIHJlYWQgKi8KK2ludCBkYl9zbXNfbWFya19zZW50KHN0cnVjdCBnc21fc21zICpzbXMpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisKKwlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJIlVQREFURSBTTVMgIgorCQkiU0VUIHNlbnQgPSBkYXRldGltZSgnbm93JykgIgorCQkiV0hFUkUgaWQgPSAlbGx1Iiwgc21zLT5pZCk7CisJaWYgKCFyZXN1bHQpIHsKKwkJTE9HUChEREIsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gbWFyayBTTVMgJWxsdSBhcyBzZW50LlxuIiwgc21zLT5pZCk7CisJCXJldHVybiAxOworCX0KKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCXJldHVybiAwOworfQorCisvKiBpbmNyZWFzZSB0aGUgbnVtYmVyIG9mIGF0dGVtcHRlZCBkZWxpdmVyaWVzICovCitpbnQgZGJfc21zX2luY19kZWxpdmVyX2F0dGVtcHRzKHN0cnVjdCBnc21fc21zICpzbXMpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisKKwlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJIlVQREFURSBTTVMgIgorCQkiU0VUIGRlbGl2ZXJfYXR0ZW1wdHMgPSBkZWxpdmVyX2F0dGVtcHRzICsgMSAiCisJCSJXSEVSRSBpZCA9ICVsbHUiLCBzbXMtPmlkKTsKKwlpZiAoIXJlc3VsdCkgeworCQlMT0dQKEREQiwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBpbmMgZGVsaXZlciBhdHRlbXB0cyBmb3IgIgorCQkJIlNNUyAlbGx1LlxuIiwgc21zLT5pZCk7CisJCXJldHVybiAxOworCX0KKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCXJldHVybiAwOworfQorCitpbnQgZGJfYXBkdV9ibG9iX3N0b3JlKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLCAKKwkJCXVfaW50OF90IGFwZHVfaWRfZmxhZ3MsIHVfaW50OF90IGxlbiwKKwkJCXVfaW50OF90ICphcGR1KQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCXVuc2lnbmVkIGNoYXIgKnFfYXBkdTsKKworCWRiaV9jb25uX3F1b3RlX2JpbmFyeV9jb3B5KGNvbm4sIGFwZHUsIGxlbiwgJnFfYXBkdSk7CisKKwlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJIklOU0VSVCBJTlRPIEFwZHVCbG9icyAiCisJCSIoY3JlYXRlZCxzdWJzY3JpYmVyX2lkLGFwZHVfaWRfZmxhZ3MsYXBkdSkgVkFMVUVTICIKKwkJIihkYXRldGltZSgnbm93JyksJWxsdSwldSwlcykiLAorCQlzdWJzY3ItPmlkLCBhcGR1X2lkX2ZsYWdzLCBxX2FwZHUpOworCisJZnJlZShxX2FwZHUpOworCisJaWYgKCFyZXN1bHQpCisJCXJldHVybiAtRUlPOworCisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBkYl9zdG9yZV9jb3VudGVyKHN0cnVjdCBjb3VudGVyICpjdHIpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJY2hhciAqcV9uYW1lOworCisJZGJpX2Nvbm5fcXVvdGVfc3RyaW5nX2NvcHkoY29ubiwgY3RyLT5uYW1lLCAmcV9uYW1lKTsKKworCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkiSU5TRVJUIElOVE8gQ291bnRlcnMgIgorCQkiKHRpbWVzdGFtcCxuYW1lLHZhbHVlKSBWQUxVRVMgIgorCQkiKGRhdGV0aW1lKCdub3cnKSwlcywlbHUpIiwgcV9uYW1lLCBjdHItPnZhbHVlKTsKKworCWZyZWUocV9uYW1lKTsKKworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gLUVJTzsKKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZGVidWcuYyBiL29wZW5ic2Mvc3JjL2RlYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY3YTFjMwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2RlYnVnLmMKQEAgLTAsMCArMSw0MjcgQEAKKy8qIERlYnVnZ2luZy9Mb2dnaW5nIHN1cHBvcnQgY29kZSAqLworLyogKEMpIDIwMDggYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDA4IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdXRpbHMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorCisvKiBkZWZhdWx0IGNhdGVnb3JpZXMgKi8KK3N0YXRpYyBzdHJ1Y3QgZGVidWdfY2F0ZWdvcnkgZGVmYXVsdF9jYXRlZ29yaWVzW0RlYnVnX0xhc3RFbnRyeV0gPSB7CisgICAgW0RSTExdCT0geyAuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFIH0sCisgICAgW0RDQ10JPSB7IC5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UgfSwKKyAgICBbRE5NXQk9IHsgLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSB9LAorICAgIFtEUlJdCT0geyAuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFIH0sCisgICAgW0RSU0xdCT0geyAuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFIH0sCisgICAgW0RNTV0JPSB7IC5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9JTkZPIH0sCisgICAgW0RNTkNDXQk9IHsgLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSB9LAorICAgIFtEU01TXQk9IHsgLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSB9LAorICAgIFtEUEFHXQk9IHsgLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSB9LAorICAgIFtETUVBU10JPSB7IC5lbmFibGVkID0gMCwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UgfSwKKyAgICBbRE1JXQk9IHsgLmVuYWJsZWQgPSAwLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSB9LAorICAgIFtETUlCXQk9IHsgLmVuYWJsZWQgPSAwLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSB9LAorICAgIFtETVVYXQk9IHsgLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSB9LAorICAgIFtESU5QXQk9IHsgLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSB9LAorICAgIFtEU0NDUF0JPSB7IC5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UgfSwKKyAgICBbRE1TQ10JPSB7IC5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UgfSwKKyAgICBbRE1HQ1BdCT0geyAuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFIH0sCisgICAgW0RIT10JPSB7IC5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UgfSwKKyAgICBbRERCXQk9IHsgLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSB9LAorICAgIFtEUkVGXQk9IHsgLmVuYWJsZWQgPSAwLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSB9LAorfTsKKworc3RydWN0IGRlYnVnX2luZm8geworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqY29sb3I7CisJY29uc3QgY2hhciAqZGVzY3JpcHRpb247CisJaW50IG51bWJlcjsKKwlpbnQgcG9zaXRpb247Cit9OworCitzdHJ1Y3QgZGVidWdfY29udGV4dCB7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW47CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGVidWdfY29udGV4dCBkZWJ1Z19jb250ZXh0Oworc3RhdGljIHZvaWQgKnRhbGxfZGJnX2N0eCA9IE5VTEw7CitzdGF0aWMgTExJU1RfSEVBRCh0YXJnZXRfbGlzdCk7CisKKyNkZWZpbmUgREVCVUdfQ0FURUdPUlkoTlVNQkVSLCBOQU1FLCBDT0xPUiwgREVTQ1JJUFRJT04pIFwKKwl7IC5uYW1lID0gTkFNRSwgLmNvbG9yID0gQ09MT1IsIC5kZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OLCAubnVtYmVyID0gTlVNQkVSIH0sCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGVidWdfaW5mbyBkZWJ1Z19pbmZvW10gPSB7CisJREVCVUdfQ0FURUdPUlkoRFJMTCwgICJEUkxMIiwgIlwwMzNbMTszMW0iLCAiIikKKwlERUJVR19DQVRFR09SWShEQ0MsICAgIkRDQyIsICAiXDAzM1sxOzMybSIsICIiKQorCURFQlVHX0NBVEVHT1JZKERNTSwgICAiRE1NIiwgICJcMDMzWzE7MzNtIiwgIiIpCisJREVCVUdfQ0FURUdPUlkoRFJSLCAgICJEUlIiLCAgIlwwMzNbMTszNG0iLCAiIikKKwlERUJVR19DQVRFR09SWShEUlNMLCAgIkRSU0wiLCAiXDAzM1sxOzM1bSIsICIiKQorCURFQlVHX0NBVEVHT1JZKEROTSwgICAiRE5NIiwgICJcMDMzWzE7MzZtIiwgIiIpCisJREVCVUdfQ0FURUdPUlkoRFNNUywgICJEU01TIiwgIlwwMzNbMTszN20iLCAiIikKKwlERUJVR19DQVRFR09SWShEUEFHLCAgIkRQQUciLCAiXDAzM1sxOzM4bSIsICIiKQorCURFQlVHX0NBVEVHT1JZKERNTkNDLCAiRE1OQ0MiLCJcMDMzWzE7MzltIiwgIiIpCisJREVCVUdfQ0FURUdPUlkoRElOUCwgICJESU5QIiwgIiIsICIiKQorCURFQlVHX0NBVEVHT1JZKERNSSwgICJETUkiLCAiIiwgIiIpCisJREVCVUdfQ0FURUdPUlkoRE1JQiwgICJETUlCIiwgIiIsICIiKQorCURFQlVHX0NBVEVHT1JZKERNVVgsICAiRE1VWCIsICIiLCAiIikKKwlERUJVR19DQVRFR09SWShETUVBUywgICJETUVBUyIsICIiLCAiIikKKwlERUJVR19DQVRFR09SWShEU0NDUCwgIkRTQ0NQIiwgIiIsICIiKQorCURFQlVHX0NBVEVHT1JZKERNU0MsICJETVNDIiwgIiIsICIiKQorCURFQlVHX0NBVEVHT1JZKERNR0NQLCAiRE1HQ1AiLCAiIiwgIiIpCisJREVCVUdfQ0FURUdPUlkoREhPLCAiREhPIiwgIiIsICIiKQorCURFQlVHX0NBVEVHT1JZKEREQiwgIkREQiIsICIiLCAiIikKKwlERUJVR19DQVRFR09SWShEUkVGLCAiRFJFRiIsICIiLCAiIikKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nIGxvZ2xldmVsX3N0cnNbXSA9IHsKKwl7IDAsCSJFVkVSWVRISU5HIiB9LAorCXsgMSwJIkRFQlVHIiB9LAorCXsgMywJIklORk8iIH0sCisJeyA1LAkiTk9USUNFIiB9LAorCXsgNywJIkVSUk9SIiB9LAorCXsgOCwJIkZBVEFMIiB9LAorCXsgMCwgTlVMTCB9LAorfTsKKworaW50IGRlYnVnX3BhcnNlX2xldmVsKGNvbnN0IGNoYXIgKmx2bCkKK3sKKwlyZXR1cm4gZ2V0X3N0cmluZ192YWx1ZShsb2dsZXZlbF9zdHJzLCBsdmwpOworfQorCitpbnQgZGVidWdfcGFyc2VfY2F0ZWdvcnkoY29uc3QgY2hhciAqY2F0ZWdvcnkpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkZWJ1Z19pbmZvKTsgKytpKSB7CisJCWlmICghc3RyY2FzZWNtcChkZWJ1Z19pbmZvW2ldLm5hbWUrMSwgY2F0ZWdvcnkpKQorCQkJcmV0dXJuIGRlYnVnX2luZm9baV0ubnVtYmVyOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCisvKgorICogUGFyc2UgdGhlIGNhdGVnb3J5IG1hc2suCisgKiBUaGUgZm9ybWF0IGNhbiBiZSB0aGlzOiBjYXRlZ29yeTE6Y2F0ZWdvcnkyOmNhdGVnb3J5MworICogb3IgY2F0ZWdvcnkxLDI6Y2F0ZWdvcnkyLDM6Li4uCisgKi8KK3ZvaWQgZGVidWdfcGFyc2VfY2F0ZWdvcnlfbWFzayhzdHJ1Y3QgZGVidWdfdGFyZ2V0KiB0YXJnZXQsIGNvbnN0IGNoYXIgKl9tYXNrKQoreworCWludCBpID0gMDsKKwljaGFyICptYXNrID0gc3RyZHVwKF9tYXNrKTsKKwljaGFyICpjYXRlZ29yeV90b2tlbiA9IE5VTEw7CisKKwkvKiBEaXNhYmxlIGV2ZXJ5dGhpbmcgdG8gZW5hYmxlIGl0IGFmdGVyd2FyZHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0YXJnZXQtPmNhdGVnb3JpZXMpOyArK2kpCisJCXRhcmdldC0+Y2F0ZWdvcmllc1tpXS5lbmFibGVkID0gMDsKKworCWNhdGVnb3J5X3Rva2VuID0gc3RydG9rKG1hc2ssICI6Iik7CisJZG8geworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkZWJ1Z19pbmZvKTsgKytpKSB7CisJCQljaGFyKiBjb2xvbiA9IHN0cnN0cihjYXRlZ29yeV90b2tlbiwgIiwiKTsKKwkJCWludCBsZW5ndGggPSBzdHJsZW4oY2F0ZWdvcnlfdG9rZW4pOworCisJCQlpZiAoY29sb24pCisJCQkgICAgbGVuZ3RoID0gY29sb24gLSBjYXRlZ29yeV90b2tlbjsKKworCQkJaWYgKHN0cm5jYXNlY21wKGRlYnVnX2luZm9baV0ubmFtZSwgY2F0ZWdvcnlfdG9rZW4sIGxlbmd0aCkgPT0gMCkgeworCQkJCWludCBudW1iZXIgPSBkZWJ1Z19pbmZvW2ldLm51bWJlcjsKKwkJCQlpbnQgbGV2ZWwgPSAwOworCisJCQkJaWYgKGNvbG9uKQorCQkJCQlsZXZlbCA9IGF0b2koY29sb24rMSk7CisKKwkJCQl0YXJnZXQtPmNhdGVnb3JpZXNbbnVtYmVyXS5lbmFibGVkID0gMTsKKwkJCQl0YXJnZXQtPmNhdGVnb3JpZXNbbnVtYmVyXS5sb2dsZXZlbCA9IGxldmVsOworCQkJfQorCQl9CisJfSB3aGlsZSAoKGNhdGVnb3J5X3Rva2VuID0gc3RydG9rKE5VTEwsICI6IikpKTsKKworCWZyZWUobWFzayk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKiBjb2xvcihpbnQgc3Vic3lzKQoreworCWludCBpID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRlYnVnX2luZm8pOyArK2kpIHsKKwkJaWYgKGRlYnVnX2luZm9baV0ubnVtYmVyID09IHN1YnN5cykKKwkJCXJldHVybiBkZWJ1Z19pbmZvW2ldLmNvbG9yOworCX0KKworCXJldHVybiAiIjsKK30KKworc3RhdGljIHZvaWQgX291dHB1dChzdHJ1Y3QgZGVidWdfdGFyZ2V0ICp0YXJnZXQsIHVuc2lnbmVkIGludCBzdWJzeXMsIGNoYXIgKmZpbGUsIGludCBsaW5lLAorCQkgICAgaW50IGNvbnQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCkKK3sKKwljaGFyIGNvbFszMF07CisJY2hhciBzdWJbMzBdOworCWNoYXIgdGltWzMwXTsKKwljaGFyIGJ1Zls0MDk2XTsKKwljaGFyIGZpbmFsWzQwOTZdOworCisJLyogcHJlcGFyZSB0aGUgZGF0YSAqLworCWNvbFswXSA9ICdcMCc7CisJc3ViWzBdID0gJ1wwJzsKKwl0aW1bMF0gPSAnXDAnOworCWJ1ZlswXSA9ICdcMCc7CisKKwkvKiBhcmUgd2UgdXNpbmcgY29sb3IgKi8KKwlpZiAodGFyZ2V0LT51c2VfY29sb3IpIHsKKwkJc25wcmludGYoY29sLCBzaXplb2YoY29sKSwgIiVzIiwgY29sb3Ioc3Vic3lzKSk7CisJCWNvbFtzaXplb2YoY29sKS0xXSA9ICdcMCc7CisJfQorCXZzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmb3JtYXQsIGFwKTsKKwlidWZbc2l6ZW9mKGJ1ZiktMV0gPSAnXDAnOworCisJaWYgKCFjb250KSB7CisJCWlmICh0YXJnZXQtPnByaW50X3RpbWVzdGFtcCkgeworCQkJY2hhciAqdGltZXN0cjsKKwkJCXRpbWVfdCB0bTsKKwkJCXRtID0gdGltZShOVUxMKTsKKwkJCXRpbWVzdHIgPSBjdGltZSgmdG0pOworCQkJdGltZXN0cltzdHJsZW4odGltZXN0ciktMV0gPSAnXDAnOworCQkJc25wcmludGYodGltLCBzaXplb2YodGltKSwgIiVzICIsIHRpbWVzdHIpOworCQkJdGltW3NpemVvZih0aW0pLTFdID0gJ1wwJzsKKwkJfQorCQlzbnByaW50ZihzdWIsIHNpemVvZihzdWIpLCAiPCU0LjR4PiAlczolZCAiLCBzdWJzeXMsIGZpbGUsIGxpbmUpOworCQlzdWJbc2l6ZW9mKHN1YiktMV0gPSAnXDAnOworCX0KKworCXNucHJpbnRmKGZpbmFsLCBzaXplb2YoZmluYWwpLCAiJXMlcyVzJXNcMDMzWzA7bSIsIGNvbCwgdGltLCBzdWIsIGJ1Zik7CisJZmluYWxbc2l6ZW9mKGZpbmFsKS0xXSA9ICdcMCc7CisJdGFyZ2V0LT5vdXRwdXQodGFyZ2V0LCBmaW5hbCk7Cit9CisKKworc3RhdGljIHZvaWQgX2RlYnVncCh1bnNpZ25lZCBpbnQgc3Vic3lzLCBpbnQgbGV2ZWwsIGNoYXIgKmZpbGUsIGludCBsaW5lLAorCQkgICAgaW50IGNvbnQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCkKK3sKKwlzdHJ1Y3QgZGVidWdfdGFyZ2V0ICp0YXI7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0YXIsICZ0YXJnZXRfbGlzdCwgZW50cnkpIHsKKwkJc3RydWN0IGRlYnVnX2NhdGVnb3J5ICpjYXRlZ29yeTsKKwkJaW50IG91dHB1dCA9IDA7CisKKwkJY2F0ZWdvcnkgPSAmdGFyLT5jYXRlZ29yaWVzW3N1YnN5c107CisJCS8qIHN1YnN5c3RlbSBpcyBub3Qgc3VwcG9zZWQgdG8gYmUgZGVidWdnZWQgKi8KKwkJaWYgKCFjYXRlZ29yeS0+ZW5hYmxlZCkKKwkJCWNvbnRpbnVlOworCisJCS8qIENoZWNrIHRoZSBnbG9iYWwgbG9nIGxldmVsICovCisJCWlmICh0YXItPmxvZ2xldmVsICE9IDAgJiYgbGV2ZWwgPCB0YXItPmxvZ2xldmVsKQorCQkJY29udGludWU7CisKKwkJLyogQ2hlY2sgdGhlIGNhdGVnb3J5IGxvZyBsZXZlbCAqLworCQlpZiAodGFyLT5sb2dsZXZlbCA9PSAwICYmIGNhdGVnb3J5LT5sb2dsZXZlbCAhPSAwICYmIGxldmVsIDwgY2F0ZWdvcnktPmxvZ2xldmVsKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogQXBwbHkgZmlsdGVycyBoZXJlLi4uIGlmIHRoYXQgYmVjb21lcyBtZXNzeSB3ZSB3aWxsIG5lZWQgdG8gcHV0CisJCSAqIGZpbHRlcnMgaW4gYSBsaXN0IGFuZCBlYWNoIGZpbHRlciB3aWxsIHNheSBzdG9wLCBjb250aW51ZSwgb3V0cHV0CisJCSAqLworCQlpZiAoKHRhci0+ZmlsdGVyX21hcCAmIERFQlVHX0ZJTFRFUl9BTEwpICE9IDApIHsKKwkJCW91dHB1dCA9IDE7CisJCX0gZWxzZSBpZiAoKHRhci0+ZmlsdGVyX21hcCAmIERFQlVHX0ZJTFRFUl9JTVNJKSAhPSAwCisJCQkgICAgICAmJiBkZWJ1Z19jb250ZXh0LnN1YnNjciAmJiBzdHJjbXAoZGVidWdfY29udGV4dC5zdWJzY3ItPmltc2ksIHRhci0+aW1zaV9maWx0ZXIpID09IDApIHsKKwkJCW91dHB1dCA9IDE7CisJCX0KKworCQlpZiAob3V0cHV0KSB7CisJCQkvKiBGSVhNRTogY29weWluZyB0aGUgdmFfbGlzdCBpcyBhbiB1Z2x5IHdvcmthcm91bmQgYWdhaW5zdCBhIGJ1ZworCQkJICogaGlkZGVuIHNvbWV3aGVyZSBpbiBfb3V0cHV0LiAgSWYgd2UgZG8gbm90IGNvcHkgaGVyZSwgdGhlIGZpcnN0CisJCQkgKiBjYWxsIHRvIF9vdXRwdXQoKSB3aWxsIGNvcnJ1cHQgdGhlIHZhX2xpc3QgY29udGVudHMsIGFuZCBhbnkKKwkJCSAqIGZ1cnRoZXIgX291dHB1dCgpIGNhbGxzIHdpdGggdGhlIHNhbWUgdmFfbGlzdCB3aWxsIHNlZ2ZhdWx0ICovCisJCQl2YV9saXN0IGJwOworCQkJdmFfY29weShicCwgYXApOworCQkJX291dHB1dCh0YXIsIHN1YnN5cywgZmlsZSwgbGluZSwgY29udCwgZm9ybWF0LCBicCk7CisJCQl2YV9lbmQoYnApOworCQl9CisJfQorfQorCit2b2lkIGRlYnVncCh1bnNpZ25lZCBpbnQgc3Vic3lzLCBjaGFyICpmaWxlLCBpbnQgbGluZSwgaW50IGNvbnQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisKKwl2YV9zdGFydChhcCwgZm9ybWF0KTsKKwlfZGVidWdwKHN1YnN5cywgTE9HTF9ERUJVRywgZmlsZSwgbGluZSwgY29udCwgZm9ybWF0LCBhcCk7CisJdmFfZW5kKGFwKTsKK30KKwordm9pZCBkZWJ1Z3AyKHVuc2lnbmVkIGludCBzdWJzeXMsIHVuc2lnbmVkIGludCBsZXZlbCwgY2hhciAqZmlsZSwgaW50IGxpbmUsIGludCBjb250LCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCisJdmFfc3RhcnQoYXAsIGZvcm1hdCk7CisJX2RlYnVncChzdWJzeXMsIGxldmVsLCBmaWxlLCBsaW5lLCBjb250LCBmb3JtYXQsIGFwKTsKKwl2YV9lbmQoYXApOworfQorCitzdGF0aWMgY2hhciBoZXhkX2J1ZmZbNDA5Nl07CisKK2NoYXIgKmhleGR1bXAoY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuKQoreworCWludCBpOworCWNoYXIgKmN1ciA9IGhleGRfYnVmZjsKKworCWhleGRfYnVmZlswXSA9IDA7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWludCBsZW5fcmVtYWluID0gc2l6ZW9mKGhleGRfYnVmZikgLSAoY3VyIC0gaGV4ZF9idWZmKTsKKwkJaW50IHJjID0gc25wcmludGYoY3VyLCBsZW5fcmVtYWluLCAiJTAyeCAiLCBidWZbaV0pOworCQlpZiAocmMgPD0gMCkKKwkJCWJyZWFrOworCQljdXIgKz0gcmM7CisJfQorCWhleGRfYnVmZltzaXplb2YoaGV4ZF9idWZmKS0xXSA9IDA7CisJcmV0dXJuIGhleGRfYnVmZjsKK30KKworCisKK3ZvaWQgZGVidWdfYWRkX3RhcmdldChzdHJ1Y3QgZGVidWdfdGFyZ2V0ICp0YXJnZXQpCit7CisJbGxpc3RfYWRkX3RhaWwoJnRhcmdldC0+ZW50cnksICZ0YXJnZXRfbGlzdCk7Cit9CisKK3ZvaWQgZGVidWdfZGVsX3RhcmdldChzdHJ1Y3QgZGVidWdfdGFyZ2V0ICp0YXJnZXQpCit7CisJbGxpc3RfZGVsKCZ0YXJnZXQtPmVudHJ5KTsKK30KKwordm9pZCBkZWJ1Z19yZXNldF9jb250ZXh0KHZvaWQpCit7CisJbWVtc2V0KCZkZWJ1Z19jb250ZXh0LCAwLCBzaXplb2YoZGVidWdfY29udGV4dCkpOworfQorCisvKiBjdXJyZW50bHkgd2UgYXJlIG5vdCByZWZmaW5nIHRoZXNlICovCit2b2lkIGRlYnVnX3NldF9jb250ZXh0KGludCBjdHgsIHZvaWQgKnZhbHVlKQoreworCXN3aXRjaCAoY3R4KSB7CisJY2FzZSBCU0NfQ1RYX0xDSEFOOgorCQlkZWJ1Z19jb250ZXh0LmxjaGFuID0gKHN0cnVjdCBnc21fbGNoYW4gKikgdmFsdWU7CisJCWJyZWFrOworCWNhc2UgQlNDX0NUWF9TVUJTQ1I6CisJCWRlYnVnX2NvbnRleHQuc3Vic2NyID0gKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqKSB2YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBCU0NfQ1RYX0JUUzoKKwkJZGVidWdfY29udGV4dC5idHMgPSAoc3RydWN0IGdzbV9idHMgKikgdmFsdWU7CisJCWJyZWFrOworCWNhc2UgQlNDX0NUWF9TQ0NQOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK3ZvaWQgZGVidWdfc2V0X2ltc2lfZmlsdGVyKHN0cnVjdCBkZWJ1Z190YXJnZXQgKnRhcmdldCwgY29uc3QgY2hhciAqaW1zaSkKK3sKKwlpZiAoaW1zaSkgeworCQl0YXJnZXQtPmZpbHRlcl9tYXAgfD0gREVCVUdfRklMVEVSX0lNU0k7CisJCXRhcmdldC0+aW1zaV9maWx0ZXIgPSB0YWxsb2Nfc3RyZHVwKHRhcmdldCwgaW1zaSk7CisJfSBlbHNlIGlmICh0YXJnZXQtPmltc2lfZmlsdGVyKSB7CisJCXRhcmdldC0+ZmlsdGVyX21hcCAmPSB+REVCVUdfRklMVEVSX0lNU0k7CisJCXRhbGxvY19mcmVlKHRhcmdldC0+aW1zaV9maWx0ZXIpOworCQl0YXJnZXQtPmltc2lfZmlsdGVyID0gTlVMTDsKKwl9Cit9CisKK3ZvaWQgZGVidWdfc2V0X2FsbF9maWx0ZXIoc3RydWN0IGRlYnVnX3RhcmdldCAqdGFyZ2V0LCBpbnQgYWxsKQoreworCWlmIChhbGwpCisJCXRhcmdldC0+ZmlsdGVyX21hcCB8PSBERUJVR19GSUxURVJfQUxMOworCWVsc2UKKwkJdGFyZ2V0LT5maWx0ZXJfbWFwICY9IH5ERUJVR19GSUxURVJfQUxMOworfQorCit2b2lkIGRlYnVnX3NldF91c2VfY29sb3Ioc3RydWN0IGRlYnVnX3RhcmdldCAqdGFyZ2V0LCBpbnQgdXNlX2NvbG9yKQoreworCXRhcmdldC0+dXNlX2NvbG9yID0gdXNlX2NvbG9yOworfQorCit2b2lkIGRlYnVnX3NldF9wcmludF90aW1lc3RhbXAoc3RydWN0IGRlYnVnX3RhcmdldCAqdGFyZ2V0LCBpbnQgcHJpbnRfdGltZXN0YW1wKQoreworCXRhcmdldC0+cHJpbnRfdGltZXN0YW1wID0gcHJpbnRfdGltZXN0YW1wOworfQorCit2b2lkIGRlYnVnX3NldF9sb2dfbGV2ZWwoc3RydWN0IGRlYnVnX3RhcmdldCAqdGFyZ2V0LCBpbnQgbG9nX2xldmVsKQoreworCXRhcmdldC0+bG9nbGV2ZWwgPSBsb2dfbGV2ZWw7Cit9CisKK3ZvaWQgZGVidWdfc2V0X2NhdGVnb3J5X2ZpbHRlcihzdHJ1Y3QgZGVidWdfdGFyZ2V0ICp0YXJnZXQsIGludCBjYXRlZ29yeSwgaW50IGVuYWJsZSwgaW50IGxldmVsKQoreworCWlmIChjYXRlZ29yeSA+PSBEZWJ1Z19MYXN0RW50cnkpCisJCXJldHVybjsKKwl0YXJnZXQtPmNhdGVnb3JpZXNbY2F0ZWdvcnldLmVuYWJsZWQgPSAhIWVuYWJsZTsKKwl0YXJnZXQtPmNhdGVnb3JpZXNbY2F0ZWdvcnldLmxvZ2xldmVsID0gbGV2ZWw7Cit9CisKK3N0YXRpYyB2b2lkIF9zdGRlcnJfb3V0cHV0KHN0cnVjdCBkZWJ1Z190YXJnZXQgKnRhcmdldCwgY29uc3QgY2hhciAqbG9nKQoreworCWZwcmludGYodGFyZ2V0LT50Z3Rfc3Rkb3V0Lm91dCwgIiVzIiwgbG9nKTsKKwlmZmx1c2godGFyZ2V0LT50Z3Rfc3Rkb3V0Lm91dCk7Cit9CisKK3N0cnVjdCBkZWJ1Z190YXJnZXQgKmRlYnVnX3RhcmdldF9jcmVhdGUodm9pZCkKK3sKKwlzdHJ1Y3QgZGVidWdfdGFyZ2V0ICp0YXJnZXQ7CisKKwl0YXJnZXQgPSB0YWxsb2NfemVybyh0YWxsX2RiZ19jdHgsIHN0cnVjdCBkZWJ1Z190YXJnZXQpOworCWlmICghdGFyZ2V0KQorCQlyZXR1cm4gTlVMTDsKKworCUlOSVRfTExJU1RfSEVBRCgmdGFyZ2V0LT5lbnRyeSk7CisJbWVtY3B5KHRhcmdldC0+Y2F0ZWdvcmllcywgZGVmYXVsdF9jYXRlZ29yaWVzLCBzaXplb2YoZGVmYXVsdF9jYXRlZ29yaWVzKSk7CisJdGFyZ2V0LT51c2VfY29sb3IgPSAxOworCXRhcmdldC0+cHJpbnRfdGltZXN0YW1wID0gMDsKKwl0YXJnZXQtPmxvZ2xldmVsID0gMDsKKwlyZXR1cm4gdGFyZ2V0OworfQorCitzdHJ1Y3QgZGVidWdfdGFyZ2V0ICpkZWJ1Z190YXJnZXRfY3JlYXRlX3N0ZGVycih2b2lkKQoreworCXN0cnVjdCBkZWJ1Z190YXJnZXQgKnRhcmdldDsKKworCXRhcmdldCA9IGRlYnVnX3RhcmdldF9jcmVhdGUoKTsKKwlpZiAoIXRhcmdldCkKKwkJcmV0dXJuIE5VTEw7CisKKwl0YXJnZXQtPnRndF9zdGRvdXQub3V0ID0gc3RkZXJyOworCXRhcmdldC0+b3V0cHV0ID0gX3N0ZGVycl9vdXRwdXQ7CisJcmV0dXJuIHRhcmdldDsKK30KKwordm9pZCBkZWJ1Z19pbml0KHZvaWQpCit7CisJdGFsbF9kYmdfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KE5VTEwsIDEsICJkZWJ1ZyIpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZTFfY29uZmlnLmMgYi9vcGVuYnNjL3NyYy9lMV9jb25maWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGZiY2VjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZTFfY29uZmlnLmMKQEAgLTAsMCArMSwyMzYgQEAKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZTFfaW5wdXQuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3RyYXVfZnJhbWUuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3RyYXVfbXV4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9taXNkbi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvaXBhY2Nlc3MuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisKKyNkZWZpbmUgU0FQSV9MMk1MCTAKKyNkZWZpbmUgU0FQSV9PTUwJNjIKKyNkZWZpbmUgU0FQSV9SU0wJMAkvKiA2MyA/ICovCisKKy8qIFRoZSBlMV9yZWNvbmZpZ18qKCkgZnVuY3Rpb25zIGJlbG93IHRhbGUgdGhlIGNvbmZpZ3VyYXRpb24gcHJlc2VudCBpbiB0aGUKKyAqIGJ0cy90cngvdHMgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBlbnN1cmUgdGhlIEUxIGNvbmZpZ3VyYXRpb24gcmVmbGVjdHMgdGhlCisgKiB0aW1lc2xvdC9zdWJzbG90L1RFSSBjb25maWd1cmF0aW9uICovCisKK2ludCBlMV9yZWNvbmZpZ190cyhzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzKQoreworCXN0cnVjdCBnc21fZTFfc3Vic2xvdCAqZTFfbGluayA9ICZ0cy0+ZTFfbGluazsKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZTsKKwlzdHJ1Y3QgZTFpbnBfdHMgKmUxX3RzOworCisJREVCVUdQKERNSSwgImUxX3JlY29uZmlnX3RzKCV1LCV1LCV1KVxuIiwgdHMtPnRyeC0+YnRzLT5uciwgdHMtPnRyeC0+bnIsIHRzLT5ucik7CisKKwlpZiAoIWUxX2xpbmstPmUxX3RzKQorCQlyZXR1cm4gMDsKKworCWxpbmUgPSBlMWlucF9saW5lX2dldF9jcmVhdGUoZTFfbGluay0+ZTFfbnIpOworCWlmICghbGluZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzd2l0Y2ggKHRzLT5wY2hhbikgeworCWNhc2UgR1NNX1BDSEFOX1RDSF9GOgorCWNhc2UgR1NNX1BDSEFOX1RDSF9IOgorCQllMV90cyA9ICZsaW5lLT50c1tlMV9saW5rLT5lMV90cy0xXTsKKwkJZTFpbnBfdHNfY29uZmlnKGUxX3RzLCBsaW5lLCBFMUlOUF9UU19UWVBFX1RSQVUpOworCQlzdWJjaF9kZW11eF9hY3RpdmF0ZSgmZTFfdHMtPnRyYXUuZGVtdXgsIGUxX2xpbmstPmUxX3RzX3NzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBlMV9yZWNvbmZpZ190cngoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpCit7CisJc3RydWN0IGdzbV9lMV9zdWJzbG90ICplMV9saW5rID0gJnRyeC0+cnNsX2UxX2xpbms7CisJc3RydWN0IGUxaW5wX3RzICpzaWduX3RzOworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lOworCXN0cnVjdCBlMWlucF9zaWduX2xpbmsgKnJzbF9saW5rOworCWludCBpOworCisJaWYgKCFlMV9saW5rLT5lMV90cykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBSU0wgTGluayAqLworCWxpbmUgPSBlMWlucF9saW5lX2dldF9jcmVhdGUoZTFfbGluay0+ZTFfbnIpOworCWlmICghbGluZSkKKwkJcmV0dXJuIC1FTk9NRU07CisJc2lnbl90cyA9ICZsaW5lLT50c1tlMV9saW5rLT5lMV90cy0xXTsKKwllMWlucF90c19jb25maWcoc2lnbl90cywgbGluZSwgRTFJTlBfVFNfVFlQRV9TSUdOKTsKKwlyc2xfbGluayA9IGUxaW5wX3NpZ25fbGlua19jcmVhdGUoc2lnbl90cywgRTFJTlBfU0lHTl9SU0wsCisJCQkJCSAgdHJ4LCB0cngtPnJzbF90ZWksIFNBUElfUlNMKTsKKwlpZiAoIXJzbF9saW5rKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAodHJ4LT5yc2xfbGluaykKKwkJZTFpbnBfc2lnbl9saW5rX2Rlc3Ryb3kodHJ4LT5yc2xfbGluayk7CisJdHJ4LT5yc2xfbGluayA9IHJzbF9saW5rOworCisJZm9yIChpID0gMDsgaSA8IFRSWF9OUl9UUzsgaSsrKQorCQllMV9yZWNvbmZpZ190cygmdHJ4LT50c1tpXSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGUxX3JlY29uZmlnX2J0cyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBnc21fZTFfc3Vic2xvdCAqZTFfbGluayA9ICZidHMtPm9tbF9lMV9saW5rOworCXN0cnVjdCBlMWlucF90cyAqc2lnbl90czsKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZTsKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpvbWxfbGluazsKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKworCURFQlVHUChETUksICJlMV9yZWNvbmZpZ19idHMoJXUpXG4iLCBidHMtPm5yKTsKKworCWlmICghZTFfbGluay0+ZTFfdHMpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogT01MIGxpbmsgKi8KKwlsaW5lID0gZTFpbnBfbGluZV9nZXRfY3JlYXRlKGUxX2xpbmstPmUxX25yKTsKKwlpZiAoIWxpbmUpCisJCXJldHVybiAtRU5PTUVNOworCXNpZ25fdHMgPSAmbGluZS0+dHNbZTFfbGluay0+ZTFfdHMtMV07CisJZTFpbnBfdHNfY29uZmlnKHNpZ25fdHMsIGxpbmUsIEUxSU5QX1RTX1RZUEVfU0lHTik7CisJb21sX2xpbmsgPSBlMWlucF9zaWduX2xpbmtfY3JlYXRlKHNpZ25fdHMsIEUxSU5QX1NJR05fT01MLAorCQkJCQkgIGJ0cy0+YzAsIGJ0cy0+b21sX3RlaSwgU0FQSV9PTUwpOworCWlmICghb21sX2xpbmspCisJCXJldHVybiAtRU5PTUVNOworCWlmIChidHMtPm9tbF9saW5rKQorCQllMWlucF9zaWduX2xpbmtfZGVzdHJveShidHMtPm9tbF9saW5rKTsKKwlidHMtPm9tbF9saW5rID0gb21sX2xpbms7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0cngsICZidHMtPnRyeF9saXN0LCBsaXN0KQorCQllMV9yZWNvbmZpZ190cngodHJ4KTsKKworCS8qIG5vdGlmeSBFMSBpbnB1dCBzb21ldGhpbmcgaGFzIGNoYW5nZWQgKi8KKwlyZXR1cm4gZTFpbnBfbGluZV91cGRhdGUobGluZSk7Cit9CisKKyNpZiAwCisvKiBkbyBzb21lIGNvbXBpbGVkLWluIGNvbmZpZ3VyYXRpb24gZm9yIG91ciBCVFMvRTEgc2V0dXAgKi8KK2ludCBlMV9jb25maWcoc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IGNhcmRuciwgaW50IHJlbGVhc2VfbDIpCit7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmU7CisJc3RydWN0IGUxaW5wX3RzICpzaWduX3RzOworCXN0cnVjdCBlMWlucF9zaWduX2xpbmsgKm9tbF9saW5rLCAqcnNsX2xpbms7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cnggPSBidHMtPmMwOworCWludCBiYXNlX3RzOworCisJc3dpdGNoIChidHMtPm5yKSB7CisJY2FzZSAwOgorCQkvKiBGaXJzdCBCVFMgdXNlcyBFMSBUUyAwMSwwMiwwMywwNCwwNSAqLworCQliYXNlX3RzID0gSEFSRENPREVEX0JUUzBfVFMgLSAxOworCQlicmVhazsKKwljYXNlIDE6CisJCS8qIFNlY29uZCBCVFMgdXNlcyBFMSBUUyAwNiwwNywwOCwwOSwxMCAqLworCQliYXNlX3RzID0gSEFSRENPREVEX0JUUzFfVFMgLSAxOworCQlicmVhazsKKwljYXNlIDI6CisJCS8qIFRoaXJkIEJUUyB1c2VzIEUxIFRTIDExLDEyLDEzLDE0LDE1ICovCisJCWJhc2VfdHMgPSBIQVJEQ09ERURfQlRTMl9UUyAtIDE7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbGluZSA9IHRhbGxvY196ZXJvKHRhbGxfYnNjX2N0eCwgc3RydWN0IGUxaW5wX2xpbmUpOworCWlmICghbGluZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBjcmVhdGUgRTEgdGltZXNsb3RzIGZvciBzaWduYWxsaW5nIGFuZCBUUkFVIGZyYW1lcyAqLworCWUxaW5wX3RzX2NvbmZpZygmbGluZS0+dHNbYmFzZV90cysxLTFdLCBsaW5lLCBFMUlOUF9UU19UWVBFX1NJR04pOworCWUxaW5wX3RzX2NvbmZpZygmbGluZS0+dHNbYmFzZV90cysyLTFdLCBsaW5lLCBFMUlOUF9UU19UWVBFX1RSQVUpOworCWUxaW5wX3RzX2NvbmZpZygmbGluZS0+dHNbYmFzZV90cyszLTFdLCBsaW5lLCBFMUlOUF9UU19UWVBFX1RSQVUpOworCisJLyogY3JlYXRlIHNpZ25hbGxpbmcgbGlua3MgZm9yIFRTMSAqLworCXNpZ25fdHMgPSAmbGluZS0+dHNbYmFzZV90cysxLTFdOworCW9tbF9saW5rID0gZTFpbnBfc2lnbl9saW5rX2NyZWF0ZShzaWduX3RzLCBFMUlOUF9TSUdOX09NTCwKKwkJCQkJICB0cngsIFRFSV9PTUwsIFNBUElfT01MKTsKKwlyc2xfbGluayA9IGUxaW5wX3NpZ25fbGlua19jcmVhdGUoc2lnbl90cywgRTFJTlBfU0lHTl9SU0wsCisJCQkJCSAgdHJ4LCBURUlfUlNMLCBTQVBJX1JTTCk7CisKKwkvKiBjcmVhdGUgYmFjay1saW5rcyBmcm9tIGJ0cy90cnggKi8KKwlidHMtPm9tbF9saW5rID0gb21sX2xpbms7CisJdHJ4LT5yc2xfbGluayA9IHJzbF9saW5rOworCisJLyogZW5hYmxlIHN1YmNoYW5uZWwgZGVtdXhlciBvbiBUUzIgKi8KKwlzdWJjaF9kZW11eF9hY3RpdmF0ZSgmbGluZS0+dHNbYmFzZV90cysyLTFdLnRyYXUuZGVtdXgsIDEpOworCXN1YmNoX2RlbXV4X2FjdGl2YXRlKCZsaW5lLT50c1tiYXNlX3RzKzItMV0udHJhdS5kZW11eCwgMik7CisJc3ViY2hfZGVtdXhfYWN0aXZhdGUoJmxpbmUtPnRzW2Jhc2VfdHMrMi0xXS50cmF1LmRlbXV4LCAzKTsKKworCS8qIGVuYWJsZSBzdWJjaGFubmVsIGRlbXV4ZXIgb24gVFMzICovCisJc3ViY2hfZGVtdXhfYWN0aXZhdGUoJmxpbmUtPnRzW2Jhc2VfdHMrMy0xXS50cmF1LmRlbXV4LCAwKTsKKwlzdWJjaF9kZW11eF9hY3RpdmF0ZSgmbGluZS0+dHNbYmFzZV90cyszLTFdLnRyYXUuZGVtdXgsIDEpOworCXN1YmNoX2RlbXV4X2FjdGl2YXRlKCZsaW5lLT50c1tiYXNlX3RzKzMtMV0udHJhdS5kZW11eCwgMik7CisJc3ViY2hfZGVtdXhfYWN0aXZhdGUoJmxpbmUtPnRzW2Jhc2VfdHMrMy0xXS50cmF1LmRlbXV4LCAzKTsKKworCXRyeCA9IGdzbV9idHNfdHJ4X251bShidHMsIDEpOworCWlmICh0cngpIHsKKwkJLyogY3JlYXRlIEUxIHRpbWVzbG90cyBmb3IgVFJBVSBmcmFtZXMgb2YgVFJYMSAqLworCQllMWlucF90c19jb25maWcoJmxpbmUtPnRzW2Jhc2VfdHMrNC0xXSwgbGluZSwgRTFJTlBfVFNfVFlQRV9UUkFVKTsKKwkJZTFpbnBfdHNfY29uZmlnKCZsaW5lLT50c1tiYXNlX3RzKzUtMV0sIGxpbmUsIEUxSU5QX1RTX1RZUEVfVFJBVSk7CisKKwkJLyogY3JlYXRlIFJTTCBzaWduYWxsaW5nIGxpbmsgZm9yIFRSWDEgKi8KKwkJc2lnbl90cyA9ICZsaW5lLT50c1tiYXNlX3RzKzEtMV07CisJCXJzbF9saW5rID0gZTFpbnBfc2lnbl9saW5rX2NyZWF0ZShzaWduX3RzLCBFMUlOUF9TSUdOX1JTTCwKKwkJCQkJICB0cngsIFRFSV9SU0wrMSwgU0FQSV9SU0wpOworCQkvKiBjcmVhdGUgYmFjay1saW5rcyBmcm9tIHRyeCAqLworCQl0cngtPnJzbF9saW5rID0gcnNsX2xpbms7CisKKwkJLyogZW5hYmxlIHN1YmNoYW5uZWwgZGVtdXhlciBvbiBUUzIgKi8KKwkJc3ViY2hfZGVtdXhfYWN0aXZhdGUoJmxpbmUtPnRzW2Jhc2VfdHMrNC0xXS50cmF1LmRlbXV4LCAwKTsKKwkJc3ViY2hfZGVtdXhfYWN0aXZhdGUoJmxpbmUtPnRzW2Jhc2VfdHMrNC0xXS50cmF1LmRlbXV4LCAxKTsKKwkJc3ViY2hfZGVtdXhfYWN0aXZhdGUoJmxpbmUtPnRzW2Jhc2VfdHMrNC0xXS50cmF1LmRlbXV4LCAyKTsKKwkJc3ViY2hfZGVtdXhfYWN0aXZhdGUoJmxpbmUtPnRzW2Jhc2VfdHMrNC0xXS50cmF1LmRlbXV4LCAzKTsKKworCQkvKiBlbmFibGUgc3ViY2hhbm5lbCBkZW11eGVyIG9uIFRTMyAqLworCQlzdWJjaF9kZW11eF9hY3RpdmF0ZSgmbGluZS0+dHNbYmFzZV90cys1LTFdLnRyYXUuZGVtdXgsIDApOworCQlzdWJjaF9kZW11eF9hY3RpdmF0ZSgmbGluZS0+dHNbYmFzZV90cys1LTFdLnRyYXUuZGVtdXgsIDEpOworCQlzdWJjaF9kZW11eF9hY3RpdmF0ZSgmbGluZS0+dHNbYmFzZV90cys1LTFdLnRyYXUuZGVtdXgsIDIpOworCQlzdWJjaF9kZW11eF9hY3RpdmF0ZSgmbGluZS0+dHNbYmFzZV90cys1LTFdLnRyYXUuZGVtdXgsIDMpOworCX0KKworCXJldHVybiBtaV9zZXR1cChjYXJkbnIsIGxpbmUsIHJlbGVhc2VfbDIpOworfQorI2VuZGlmCisKKy8qIGNvbmZpZ3VyZSBwc2V1ZG8gRTEgbGluZSBpbiBpcC5hY2Nlc3Mgc3R5bGUgYW5kIGNvbm5lY3QgdG8gQlRTICovCitpbnQgaWFfY29uZmlnX2Nvbm5lY3Qoc3RydWN0IGdzbV9idHMgKmJ0cywgc3RydWN0IHNvY2thZGRyX2luICpzaW4pCit7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmU7CisJc3RydWN0IGUxaW5wX3RzICpzaWduX3RzLCAqcnNsX3RzOworCXN0cnVjdCBlMWlucF9zaWduX2xpbmsgKm9tbF9saW5rLCAqcnNsX2xpbms7CisKKwlsaW5lID0gdGFsbG9jX3plcm8odGFsbF9ic2NfY3R4LCBzdHJ1Y3QgZTFpbnBfbGluZSk7CisJaWYgKCFsaW5lKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIGNyZWF0ZSBFMSB0aW1lc2xvdHMgZm9yIHNpZ25hbGxpbmcgYW5kIFRSQVUgZnJhbWVzICovCisJZTFpbnBfdHNfY29uZmlnKCZsaW5lLT50c1sxLTFdLCBsaW5lLCBFMUlOUF9UU19UWVBFX1NJR04pOworCWUxaW5wX3RzX2NvbmZpZygmbGluZS0+dHNbMi0xXSwgbGluZSwgRTFJTlBfVFNfVFlQRV9TSUdOKTsKKworCS8qIGNyZWF0ZSBzaWduYWxsaW5nIGxpbmtzIGZvciBUUzEgKi8KKwlzaWduX3RzID0gJmxpbmUtPnRzWzEtMV07CisJcnNsX3RzID0gJmxpbmUtPnRzWzItMV07CisJb21sX2xpbmsgPSBlMWlucF9zaWduX2xpbmtfY3JlYXRlKHNpZ25fdHMsIEUxSU5QX1NJR05fT01MLAorCQkJCQkgIGJ0cy0+YzAsIDB4ZmYsIDApOworCXJzbF9saW5rID0gZTFpbnBfc2lnbl9saW5rX2NyZWF0ZShyc2xfdHMsIEUxSU5QX1NJR05fUlNMLAorCQkJCQkgIGJ0cy0+YzAsIDAsIDApOworCisJLyogY3JlYXRlIGJhY2stbGlua3MgZnJvbSBidHMvdHJ4ICovCisJYnRzLT5vbWxfbGluayA9IG9tbF9saW5rOworCWJ0cy0+YzAtPnJzbF9saW5rID0gcnNsX2xpbms7CisKKwkvKiBkZWZhdWx0IHBvcnQgYXQgQlRTIGZvciBpbmNvbWluZyBjb25uZWN0aW9ucyBpcyAzMDA2ICovCisJaWYgKHNpbi0+c2luX3BvcnQgPT0gMCkKKwkJc2luLT5zaW5fcG9ydCA9IGh0b25zKDMwMDYpOworCisJcmV0dXJuIGlwYWNjZXNzX2Nvbm5lY3QobGluZSwgc2luKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2UxX2lucHV0LmMgYi9vcGVuYnNjL3NyYy9lMV9pbnB1dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMDM1OWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9lMV9pbnB1dC5jCkBAIC0wLDAgKzEsNTU1IEBACisvKiBPcGVuQlNDIEFiaXMgaW50ZXJmYWNlIHRvIEUxICovCisKKy8qIChDKSAyMDA4LTIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3lzL2ZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPG1JU0ROaWYuaD4KKworLy8jZGVmaW5lIEFGX0NPTVBBVElCSUxJVFlfRlVOQworLy8jaW5jbHVkZSA8Y29tcGF0X2FmX2lzZG4uaD4KKyNpZm5kZWYgQUZfSVNETgorI2RlZmluZSBBRl9JU0ROIDM0CisjZGVmaW5lIFBGX0lTRE4gQUZfSVNETgorI2VuZGlmCisKKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2UxX2lucHV0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX25tLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX3JzbC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2xpbnV4bGlzdC5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc3ViY2hhbl9kZW11eC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdHJhdV9mcmFtZS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdHJhdV9tdXguaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvbWlzZG4uaD4KKworI2RlZmluZSBOVU1fRTFfVFMJMzIKKworLyogbGlzdCBvZiBhbGwgRTEgZHJpdmVycyAqLworTExJU1RfSEVBRChlMWlucF9kcml2ZXJfbGlzdCk7CisKKy8qIGxpc3Qgb2YgYWxsIEUxIGxpbmVzICovCitMTElTVF9IRUFEKGUxaW5wX2xpbmVfbGlzdCk7CisKK3N0YXRpYyB2b2lkICp0YWxsX3NpZ2xfY3R4OworCisvKiB0byBiZSBpbXBsZW1lbnRlZCwgZS5nLiBieSBic2NfaGFjay5jICovCit2b2lkIGlucHV0X2V2ZW50KGludCBldmVudCwgZW51bSBlMWlucF9zaWduX3R5cGUgdHlwZSwgc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpOworCisvKgorICogcGNhcCB3cml0aW5nIG9mIHRoZSBtaXNkbiBsb2FkCisgKiBwY2FwIGZvcm1hdCBpcyBmcm9tIGh0dHA6Ly93aWtpLndpcmVzaGFyay5vcmcvRGV2ZWxvcG1lbnQvTGlicGNhcEZpbGVGb3JtYXQKKyAqLworI2RlZmluZSBETFRfTElOVVhfTEFQRAkJMTc3CisjZGVmaW5lIFBDQVBfSU5QVVQJCTAKKyNkZWZpbmUgUENBUF9PVVRQVVQJCTEKKworc3RydWN0IHBjYXBfaGRyIHsKKwl1X2ludDMyX3QgbWFnaWNfbnVtYmVyOworCXVfaW50MTZfdCB2ZXJzaW9uX21ham9yOworCXVfaW50MTZfdCB2ZXJzaW9uX21pbm9yOworCWludDMyX3QgIHRoaXN6b25lOworCXVfaW50MzJfdCBzaWdmaWdzOworCXVfaW50MzJfdCBzbmFwbGVuOworCXVfaW50MzJfdCBuZXR3b3JrOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHBjYXByZWNfaGRyIHsKKwl1X2ludDMyX3QgdHNfc2VjOworCXVfaW50MzJfdCB0c191c2VjOworCXVfaW50MzJfdCBpbmNsX2xlbjsKKwl1X2ludDMyX3Qgb3JpZ19sZW47Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgZmFrZV9saW51eF9sYXBkX2hlYWRlciB7CisgICAgICAgIHVfaW50MTZfdCBwa3R0eXBlOworCXVfaW50MTZfdCBoYXR5cGU7CisJdV9pbnQxNl90IGhhbGVuOworCXVfaW50NjRfdCBhZGRyOworCWludDE2X3QgcHJvdG9jb2w7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgbGFwZF9oZWFkZXIgeworCXVfaW50OF90IGVhMSA6IDE7CisJdV9pbnQ4X3QgY3IgOiAxOworCXVfaW50OF90IHNhcGkgOiA2OworCXVfaW50OF90IGVhMiA6IDE7CisJdV9pbnQ4X3QgdGVpIDogNzsKKwl1X2ludDhfdCBjb250cm9sX2ZvbzsgLyogZmFrZSBVTSdzIC4uLiAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RhdGljX2Fzc2VydCgoaW50KSYoKHN0cnVjdCBmYWtlX2xpbnV4X2xhcGRfaGVhZGVyKilOVUxMKS0+aGF0eXBlID09IDIsCWhhdHlwZV9vZmZzZXQpOworc3RhdGljX2Fzc2VydCgoaW50KSYoKHN0cnVjdCBmYWtlX2xpbnV4X2xhcGRfaGVhZGVyKilOVUxMKS0+aGFsZW4gPT0gNCwJCWhhbGVuX29mZnNldCk7CitzdGF0aWNfYXNzZXJ0KChpbnQpJigoc3RydWN0IGZha2VfbGludXhfbGFwZF9oZWFkZXIqKU5VTEwpLT5hZGRyID09IDYsCQlhZGRyX29mZnNldCk7CitzdGF0aWNfYXNzZXJ0KChpbnQpJigoc3RydWN0IGZha2VfbGludXhfbGFwZF9oZWFkZXIqKU5VTEwpLT5wcm90b2NvbCA9PSAxNCwJcHJvdG9fb2Zmc2V0KTsKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCBmYWtlX2xpbnV4X2xhcGRfaGVhZGVyKSA9PSAxNiwJCQlsYXBkX2hlYWRlcl9zaXplKTsKKworCitzdGF0aWMgaW50IHBjYXBfZmQgPSAtMTsKKwordm9pZCBlMV9zZXRfcGNhcF9mZChpbnQgZmQpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgcGNhcF9oZHIgaGVhZGVyID0geworCQkubWFnaWNfbnVtYmVyCT0gMHhhMWIyYzNkNCwKKwkJLnZlcnNpb25fbWFqb3IJPSAyLAorCQkudmVyc2lvbl9taW5vcgk9IDQsCisJCS50aGlzem9uZQk9IDAsCisJCS5zaWdmaWdzCT0gMCwKKwkJLnNuYXBsZW4JPSA2NTUzNSwKKwkJLm5ldHdvcmsJPSBETFRfTElOVVhfTEFQRCwKKwl9OworCisJcGNhcF9mZCA9IGZkOworCXJldCA9IHdyaXRlKHBjYXBfZmQsICZoZWFkZXIsIHNpemVvZihoZWFkZXIpKTsKK30KKworLyogVGhpcyBjdXJyZW50bHkgb25seSB3b3JrcyBmb3IgdGhlIEQtQ2hhbm5lbCAqLworc3RhdGljIHZvaWQgd3JpdGVfcGNhcF9wYWNrZXQoaW50IGRpcmVjdGlvbiwgaW50IHNhcGksIGludCB0ZWksCisJCQkgICAgICBzdHJ1Y3QgbXNnYiAqbXNnKSB7CisJaWYgKHBjYXBfZmQgPCAwKQorCQlyZXR1cm47CisKKwlpbnQgcmV0OworCXRpbWVfdCBjdXJfdGltZTsKKwlzdHJ1Y3QgdG0gKnRtOworCWludCBtaV9oZWFkID0gKGRpcmVjdGlvbj09UENBUF9JTlBVVCkgPyBNSVNETl9IRUFERVJfTEVOIDogMDsKKworCXN0cnVjdCBmYWtlX2xpbnV4X2xhcGRfaGVhZGVyIGhlYWRlciA9IHsKKwkJLnBrdHR5cGUJPSA0LAorCQkuaGF0eXBlCQk9IDAsCisJCS5oYWxlbgkJPSAwLAorCQkuYWRkcgkJPSBkaXJlY3Rpb24gPT0gUENBUF9PVVRQVVQgPyAweDAgOiAweDEsCisJCS5wcm90b2NvbAk9IG50b2hzKDQ4KSwKKwl9OworCisJc3RydWN0IGxhcGRfaGVhZGVyIGxhcGRfaGVhZGVyID0geworCQkuZWExCQk9IDAsCisJCS5jcgkJPSBkaXJlY3Rpb24gPT0gUENBUF9PVVRQVVQgPyAxIDogMCwKKwkJLnNhcGkJCT0gc2FwaSAmIDB4M0YsCisJCS5lYTIJCT0gMSwKKwkJLnRlaQkJPSB0ZWkgJiAweDdGLAorCQkuY29udHJvbF9mb28JPSAweDAzIC8qIFVJICovLAorCX07CQorCisJc3RydWN0IHBjYXByZWNfaGRyIHBheWxvYWRfaGVhZGVyID0geworCQkudHNfc2VjCSAgICA9IDAsCisJCS50c191c2VjICAgID0gMCwKKwkJLmluY2xfbGVuICAgPSBtc2ctPmxlbiArIHNpemVvZihzdHJ1Y3QgZmFrZV9saW51eF9sYXBkX2hlYWRlcikKKwkJCQkrIHNpemVvZihzdHJ1Y3QgbGFwZF9oZWFkZXIpCisJCQkJLSBtaV9oZWFkLAorCQkub3JpZ19sZW4gICA9IG1zZy0+bGVuICsgc2l6ZW9mKHN0cnVjdCBmYWtlX2xpbnV4X2xhcGRfaGVhZGVyKQorCQkJCSsgc2l6ZW9mKHN0cnVjdCBsYXBkX2hlYWRlcikKKwkJCQktIG1pX2hlYWQsCisJfTsKKworCisJY3VyX3RpbWUgPSB0aW1lKE5VTEwpOworCXRtID0gbG9jYWx0aW1lKCZjdXJfdGltZSk7CisJcGF5bG9hZF9oZWFkZXIudHNfc2VjID0gbWt0aW1lKHRtKTsKKworCXJldCA9IHdyaXRlKHBjYXBfZmQsICZwYXlsb2FkX2hlYWRlciwgc2l6ZW9mKHBheWxvYWRfaGVhZGVyKSk7CisJcmV0ID0gd3JpdGUocGNhcF9mZCwgJmhlYWRlciwgc2l6ZW9mKGhlYWRlcikpOworCXJldCA9IHdyaXRlKHBjYXBfZmQsICZsYXBkX2hlYWRlciwgc2l6ZW9mKGxhcGRfaGVhZGVyKSk7CisJcmV0ID0gd3JpdGUocGNhcF9mZCwgbXNnLT5kYXRhICsgbWlfaGVhZCwKKwkJCW1zZy0+bGVuIC0gbWlfaGVhZCk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpzaWduX3R5cGVzW10gPSB7CisJW0UxSU5QX1NJR05fTk9ORV0JPSAiTm9uZSIsCisJW0UxSU5QX1NJR05fT01MXQk9ICJPTUwiLAorCVtFMUlOUF9TSUdOX1JTTF0JPSAiUlNMIiwKK307Citjb25zdCBjaGFyICplMWlucF9zaWdudHlwZV9uYW1lKGVudW0gZTFpbnBfc2lnbl90eXBlIHRwKQoreworCWlmICh0cCA+PSBBUlJBWV9TSVpFKHNpZ25fdHlwZXMpKQorCQlyZXR1cm4gInVuZGVmaW5lZCI7CisJcmV0dXJuIHNpZ25fdHlwZXNbdHBdOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqdHNfdHlwZXNbXSA9IHsKKwlbRTFJTlBfVFNfVFlQRV9OT05FXQk9ICJOb25lIiwKKwlbRTFJTlBfVFNfVFlQRV9TSUdOXQk9ICJTaWduYWxsaW5nIiwKKwlbRTFJTlBfVFNfVFlQRV9UUkFVXQk9ICJUUkFVIiwKK307CisKK2NvbnN0IGNoYXIgKmUxaW5wX3RzdHlwZV9uYW1lKGVudW0gZTFpbnBfdHNfdHlwZSB0cCkKK3sKKwlpZiAodHAgPj0gQVJSQVlfU0laRSh0c190eXBlcykpCisJCXJldHVybiAidW5kZWZpbmVkIjsKKwlyZXR1cm4gdHNfdHlwZXNbdHBdOworfQorCisvKiBjYWxsYmFjayB3aGVuIGEgVFJBVSBmcmFtZSB3YXMgcmVjZWl2ZWQgKi8KK3N0YXRpYyBpbnQgc3ViY2hfY2Ioc3RydWN0IHN1YmNoX2RlbXV4ICpkbXgsIGludCBjaCwgdV9pbnQ4X3QgKmRhdGEsIGludCBsZW4sCisJCSAgICB2b2lkICpfcHJpdikKK3sKKwlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90cyA9IF9wcml2OworCXN0cnVjdCBnc21fZTFfc3Vic2xvdCBzcmNfc3M7CisKKwlzcmNfc3MuZTFfbnIgPSBlMWlfdHMtPmxpbmUtPm51bTsKKwlzcmNfc3MuZTFfdHMgPSBlMWlfdHMtPm51bTsKKwlzcmNfc3MuZTFfdHNfc3MgPSBjaDsKKworCXJldHVybiB0cmF1X211eF9pbnB1dCgmc3JjX3NzLCBkYXRhLCBsZW4pOworfQorCitpbnQgYWJpc19yc2xfc2VuZG1zZyhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBlMWlucF9zaWduX2xpbmsgKnNpZ25fbGluazsKKwlzdHJ1Y3QgZTFpbnBfZHJpdmVyICplMWlucF9kcml2ZXI7CisJc3RydWN0IGUxaW5wX3RzICplMWlfdHM7CisKKwltc2ctPmwyaCA9IG1zZy0+ZGF0YTsKKworCWlmICghbXNnLT50cngpIHsKKwkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAicnNsX3NlbmRtc2c6IG1zZy0+dHJ4ID09IE5VTEw6ICVzXG4iLAorCQkJaGV4ZHVtcChtc2ctPmRhdGEsIG1zZy0+bGVuKSk7CisJCXRhbGxvY19mcmVlKG1zZyk7CisJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSBpZiAoIW1zZy0+dHJ4LT5yc2xfbGluaykgeworCQlMT0dQKERSU0wsIExPR0xfRVJST1IsICJyc2xfc2VuZG1zZzogbXNnLT50cngtPnJzbF9saW5rID09IE5VTEw6ICVzXG4iLAorCQkJaGV4ZHVtcChtc2ctPmRhdGEsIG1zZy0+bGVuKSk7CisJCXRhbGxvY19mcmVlKG1zZyk7CisJCXJldHVybiAtRUlPOworCX0KKworCXNpZ25fbGluayA9IG1zZy0+dHJ4LT5yc2xfbGluazsKKwllMWlfdHMgPSBzaWduX2xpbmstPnRzOworCWlmICghYnNjX3RpbWVyX3BlbmRpbmcoJmUxaV90cy0+c2lnbi50eF90aW1lcikpIHsKKwkJLyogbm90aWZ5IHRoZSBkcml2ZXIgd2UgaGF2ZSBzb21ldGhpbmcgdG8gd3JpdGUgKi8KKwkJZTFpbnBfZHJpdmVyID0gc2lnbl9saW5rLT50cy0+bGluZS0+ZHJpdmVyOworCQllMWlucF9kcml2ZXItPndhbnRfd3JpdGUoZTFpX3RzKTsKKwl9CisJbXNnYl9lbnF1ZXVlKCZzaWduX2xpbmstPnR4X2xpc3QsIG1zZyk7CisKKwkvKiBkdW1wIGl0ICovCisJd3JpdGVfcGNhcF9wYWNrZXQoUENBUF9PVVRQVVQsIHNpZ25fbGluay0+c2FwaSwgc2lnbl9saW5rLT50ZWksIG1zZyk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IF9hYmlzX25tX3NlbmRtc2coc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpzaWduX2xpbms7CisJc3RydWN0IGUxaW5wX2RyaXZlciAqZTFpbnBfZHJpdmVyOworCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzOworCisJbXNnLT5sMmggPSBtc2ctPmRhdGE7CisKKwlpZiAoIW1zZy0+dHJ4IHx8ICFtc2ctPnRyeC0+YnRzIHx8ICFtc2ctPnRyeC0+YnRzLT5vbWxfbGluaykgeworCQlMT0dQKERSU0wsIExPR0xfRVJST1IsICJubV9zZW5kbXNnOiBtc2ctPnRyeCA9PSBOVUxMXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc2lnbl9saW5rID0gbXNnLT50cngtPmJ0cy0+b21sX2xpbms7CisJZTFpX3RzID0gc2lnbl9saW5rLT50czsKKwlpZiAoIWJzY190aW1lcl9wZW5kaW5nKCZlMWlfdHMtPnNpZ24udHhfdGltZXIpKSB7CisJCS8qIG5vdGlmeSB0aGUgZHJpdmVyIHdlIGhhdmUgc29tZXRoaW5nIHRvIHdyaXRlICovCisJCWUxaW5wX2RyaXZlciA9IHNpZ25fbGluay0+dHMtPmxpbmUtPmRyaXZlcjsKKwkJZTFpbnBfZHJpdmVyLT53YW50X3dyaXRlKGUxaV90cyk7CisJfQorCW1zZ2JfZW5xdWV1ZSgmc2lnbl9saW5rLT50eF9saXN0LCBtc2cpOworCisJLyogZHVtcCBpdCAqLworCXdyaXRlX3BjYXBfcGFja2V0KFBDQVBfT1VUUFVULCBzaWduX2xpbmstPnNhcGksIHNpZ25fbGluay0+dGVpLCBtc2cpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFRpbWVzbG90ICovCisKKy8qIGNvbmZpZ3VyZSBhbmQgaW5pdGlhbGl6ZSBvbmUgZTFpbnBfdHMgKi8KK2ludCBlMWlucF90c19jb25maWcoc3RydWN0IGUxaW5wX3RzICp0cywgc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUsCisJCSAgICBlbnVtIGUxaW5wX3RzX3R5cGUgdHlwZSkKK3sKKwlpZiAodHMtPnR5cGUgPT0gdHlwZSAmJiB0cy0+bGluZSAmJiBsaW5lKQorCQlyZXR1cm4gMDsKKworCXRzLT50eXBlID0gdHlwZTsKKwl0cy0+bGluZSA9IGxpbmU7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEUxSU5QX1RTX1RZUEVfU0lHTjoKKwkJSU5JVF9MTElTVF9IRUFEKCZ0cy0+c2lnbi5zaWduX2xpbmtzKTsKKwkJYnJlYWs7CisJY2FzZSBFMUlOUF9UU19UWVBFX1RSQVU6CisJCXN1YmNoYW5fbXV4X2luaXQoJnRzLT50cmF1Lm11eCk7CisJCXRzLT50cmF1LmRlbXV4Lm91dF9jYiA9IHN1YmNoX2NiOworCQl0cy0+dHJhdS5kZW11eC5kYXRhID0gdHM7CisJCXN1YmNoX2RlbXV4X2luaXQoJnRzLT50cmF1LmRlbXV4KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChETUksIExPR0xfRVJST1IsICJ1bnN1cHBvcnRlZCBFMSB0aW1lc2xvdCB0eXBlICV1XG4iLAorCQkJdHMtPnR5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZTFpbnBfbGluZSAqZTFpbnBfbGluZV9nZXQodV9pbnQ4X3QgZTFfbnIpCit7CisJc3RydWN0IGUxaW5wX2xpbmUgKmUxaV9saW5lOworCisJLyogaXRlcmF0ZSBvdmVyIGdsb2JhbCBsaXN0IG9mIGUxIGxpbmVzICovCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoZTFpX2xpbmUsICZlMWlucF9saW5lX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGUxaV9saW5lLT5udW0gPT0gZTFfbnIpCisJCQlyZXR1cm4gZTFpX2xpbmU7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgZTFpbnBfbGluZSAqZTFpbnBfbGluZV9nZXRfY3JlYXRlKHVfaW50OF90IGUxX25yKQoreworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lOworCWludCBpOworCisJbGluZSA9IGUxaW5wX2xpbmVfZ2V0KGUxX25yKTsKKwlpZiAobGluZSkKKwkJcmV0dXJuIGxpbmU7CisKKwlsaW5lID0gdGFsbG9jX3plcm8odGFsbF9ic2NfY3R4LCBzdHJ1Y3QgZTFpbnBfbGluZSk7CisJaWYgKCFsaW5lKQorCQlyZXR1cm4gTlVMTDsKKworCWxpbmUtPm51bSA9IGUxX25yOworCWZvciAoaSA9IDA7IGkgPCBOVU1fRTFfVFM7IGkrKykgeworCQlsaW5lLT50c1tpXS5udW0gPSBpKzE7CisJCWxpbmUtPnRzW2ldLmxpbmUgPSBsaW5lOworCX0KKwlsbGlzdF9hZGRfdGFpbCgmbGluZS0+bGlzdCwgJmUxaW5wX2xpbmVfbGlzdCk7CisKKwlyZXR1cm4gbGluZTsKK30KKworc3RhdGljIHN0cnVjdCBlMWlucF90cyAqZTFpbnBfdHNfZ2V0KHVfaW50OF90IGUxX25yLCB1X2ludDhfdCB0c19ucikKK3sKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqZTFpX2xpbmU7CisKKwllMWlfbGluZSA9IGUxaW5wX2xpbmVfZ2V0KGUxX25yKTsKKwlpZiAoIWUxaV9saW5lKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiAmZTFpX2xpbmUtPnRzW3RzX25yLTFdOworfQorCitzdHJ1Y3Qgc3ViY2hfbXV4ICplMWlucF9nZXRfbXV4KHVfaW50OF90IGUxX25yLCB1X2ludDhfdCB0c19ucikKK3sKKwlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90cyA9IGUxaW5wX3RzX2dldChlMV9uciwgdHNfbnIpOworCisJaWYgKCFlMWlfdHMpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuICZlMWlfdHMtPnRyYXUubXV4OworfQorCisvKiBTaWduYWxsaW5nIExpbmsgKi8KKworc3RydWN0IGUxaW5wX3NpZ25fbGluayAqZTFpbnBfbG9va3VwX3NpZ25fbGluayhzdHJ1Y3QgZTFpbnBfdHMgKmUxaSwKKwkJCQkJIAl1X2ludDhfdCB0ZWksIHVfaW50OF90IHNhcGkpCit7CisJc3RydWN0IGUxaW5wX3NpZ25fbGluayAqbGluazsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGxpbmssICZlMWktPnNpZ24uc2lnbl9saW5rcywgbGlzdCkgeworCQlpZiAobGluay0+c2FwaSA9PSBzYXBpICYmIGxpbmstPnRlaSA9PSB0ZWkpCisJCQlyZXR1cm4gbGluazsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyogY3JlYXRlIGEgbmV3IHNpZ25hbGxpbmcgbGluayBpbiBhIEUxIHRpbWVzbG90ICovCisKK3N0cnVjdCBlMWlucF9zaWduX2xpbmsgKgorZTFpbnBfc2lnbl9saW5rX2NyZWF0ZShzdHJ1Y3QgZTFpbnBfdHMgKnRzLCBlbnVtIGUxaW5wX3NpZ25fdHlwZSB0eXBlLAorCQkJc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIHVfaW50OF90IHRlaSwKKwkJCXVfaW50OF90IHNhcGkpCit7CisJc3RydWN0IGUxaW5wX3NpZ25fbGluayAqbGluazsKKworCWlmICh0cy0+dHlwZSAhPSBFMUlOUF9UU19UWVBFX1NJR04pCisJCXJldHVybiBOVUxMOworCisJbGluayA9IHRhbGxvY196ZXJvKHRhbGxfc2lnbF9jdHgsIHN0cnVjdCBlMWlucF9zaWduX2xpbmspOworCWlmICghbGluaykKKwkJcmV0dXJuIE5VTEw7CisKKwlsaW5rLT50cyA9IHRzOworCWxpbmstPnR5cGUgPSB0eXBlOworCUlOSVRfTExJU1RfSEVBRCgmbGluay0+dHhfbGlzdCk7CisJbGluay0+dHJ4ID0gdHJ4OworCWxpbmstPnRlaSA9IHRlaTsKKwlsaW5rLT5zYXBpID0gc2FwaTsKKworCWxsaXN0X2FkZF90YWlsKCZsaW5rLT5saXN0LCAmdHMtPnNpZ24uc2lnbl9saW5rcyk7CisKKwlyZXR1cm4gbGluazsKK30KKwordm9pZCBlMWlucF9zaWduX2xpbmtfZGVzdHJveShzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpsaW5rKQoreworCWxsaXN0X2RlbCgmbGluay0+bGlzdCk7CisJdGFsbG9jX2ZyZWUobGluayk7Cit9CisKKy8qIHRoZSBFMSBkcml2ZXIgdGVsbHMgdXMgaGUgaGFzIHJlY2VpdmVkIHNvbWV0aGluZyBvbiBhIFRTICovCitpbnQgZTFpbnBfcnhfdHMoc3RydWN0IGUxaW5wX3RzICp0cywgc3RydWN0IG1zZ2IgKm1zZywKKwkJdV9pbnQ4X3QgdGVpLCB1X2ludDhfdCBzYXBpKQoreworCXN0cnVjdCBlMWlucF9zaWduX2xpbmsgKmxpbms7CisJaW50IHJldDsKKworCXN3aXRjaCAodHMtPnR5cGUpIHsKKwljYXNlIEUxSU5QX1RTX1RZUEVfU0lHTjoKKwkJLyogY29uc3VsdCB0aGUgbGlzdCBvZiBzaWduYWxsaW5nIGxpbmtzICovCisJCXdyaXRlX3BjYXBfcGFja2V0KFBDQVBfSU5QVVQsIHNhcGksIHRlaSwgbXNnKTsKKwkJbGluayA9IGUxaW5wX2xvb2t1cF9zaWduX2xpbmsodHMsIHRlaSwgc2FwaSk7CisJCWlmICghbGluaykgeworCQkJTE9HUChETUksIExPR0xfRVJST1IsICJkaWRuJ3QgZmluZCBzaWduYWxsaW5nIGxpbmsgZm9yICIKKwkJCQkidGVpICVkLCBzYXBpICVkXG4iLCB0ZWksIHNhcGkpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlkZWJ1Z19zZXRfY29udGV4dChCU0NfQ1RYX0JUUywgbGluay0+dHJ4LT5idHMpOworCQlzd2l0Y2ggKGxpbmstPnR5cGUpIHsKKwkJY2FzZSBFMUlOUF9TSUdOX09NTDoKKwkJCW1zZy0+dHJ4ID0gbGluay0+dHJ4OworCQkJcmV0ID0gYWJpc19ubV9yY3Ztc2cobXNnKTsKKwkJCWJyZWFrOworCQljYXNlIEUxSU5QX1NJR05fUlNMOgorCQkJbXNnLT50cnggPSBsaW5rLT50cng7CisJCQlyZXQgPSBhYmlzX3JzbF9yY3Ztc2cobXNnKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0ID0gLUVJTlZBTDsKKwkJCUxPR1AoRE1JLCBMT0dMX0VSUk9SLCAidW5rbm93biBsaW5rIHR5cGUgJXVcbiIsIGxpbmstPnR5cGUpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBFMUlOUF9UU19UWVBFX1RSQVU6CisJCXJldCA9IHN1YmNoX2RlbXV4X2luKCZ0cy0+dHJhdS5kZW11eCwgbXNnLT5sMmgsIG1zZ2JfbDJsZW4obXNnKSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCUxPR1AoRE1JLCBMT0dMX0VSUk9SLCAidW5rbm93biBUUyB0eXBlICV1XG4iLCB0cy0+dHlwZSk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgVFNYX0FMTE9DX1NJWkUgNDA5NgorCisvKiBjYWxsZWQgYnkgZHJpdmVyIGlmIGl0IHdhbnRzIHRvIHRyYW5zbWl0IG9uIGEgZ2l2ZW4gVFMgKi8KK3N0cnVjdCBtc2diICplMWlucF90eF90cyhzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90cywKKwkJCSBzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICoqc2lnbl9saW5rKQoreworCXN0cnVjdCBlMWlucF9zaWduX2xpbmsgKmxpbms7CisJc3RydWN0IG1zZ2IgKm1zZyA9IE5VTEw7CisJaW50IGxlbjsKKworCXN3aXRjaCAoZTFpX3RzLT50eXBlKSB7CisJY2FzZSBFMUlOUF9UU19UWVBFX1NJR046CisJCS8qIEZJWE1FOiBpbXBsZW1lbnQgdGhpcyByb3VuZCByb2JpbiAqLworCQlsbGlzdF9mb3JfZWFjaF9lbnRyeShsaW5rLCAmZTFpX3RzLT5zaWduLnNpZ25fbGlua3MsIGxpc3QpIHsKKwkJCW1zZyA9IG1zZ2JfZGVxdWV1ZSgmbGluay0+dHhfbGlzdCk7CisJCQlpZiAobXNnKSB7CisJCQkJaWYgKHNpZ25fbGluaykKKwkJCQkJKnNpZ25fbGluayA9IGxpbms7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBFMUlOUF9UU19UWVBFX1RSQVU6CisJCW1zZyA9IG1zZ2JfYWxsb2MoVFNYX0FMTE9DX1NJWkUsICJUUkFVX1RYIik7CisJCWlmICghbXNnKQorCQkJcmV0dXJuIE5VTEw7CisJCWxlbiA9IHN1YmNoYW5fbXV4X291dCgmZTFpX3RzLT50cmF1Lm11eCwgbXNnLT5kYXRhLCA0MCk7CisJCW1zZ2JfcHV0KG1zZywgNDApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERNSSwgTE9HTF9FUlJPUiwgInVuc3VwcG9ydGVkIEUxIFRTIHR5cGUgJXVcbiIsIGUxaV90cy0+dHlwZSk7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gbXNnOworfQorCisvKiBjYWxsZWQgYnkgZHJpdmVyIGluIGNhc2Ugc29tZSBraW5kIG9mIGxpbmsgc3RhdGUgZXZlbnQgKi8KK2ludCBlMWlucF9ldmVudChzdHJ1Y3QgZTFpbnBfdHMgKnRzLCBpbnQgZXZ0LCB1X2ludDhfdCB0ZWksIHVfaW50OF90IHNhcGkpCit7CisJc3RydWN0IGUxaW5wX3NpZ25fbGluayAqbGluazsKKworCWxpbmsgPSBlMWlucF9sb29rdXBfc2lnbl9saW5rKHRzLCB0ZWksIHNhcGkpOworCWlmICghbGluaykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBGSVhNRTogcmVwb3J0IGZ1cnRoZXIgdXB3YXJkcyAqLworCWlucHV0X2V2ZW50KGV2dCwgbGluay0+dHlwZSwgbGluay0+dHJ4KTsKKwlyZXR1cm4gMDsKK30KKworLyogcmVnaXN0ZXIgYSBkcml2ZXIgd2l0aCB0aGUgRTEgY29yZSAqLworaW50IGUxaW5wX2RyaXZlcl9yZWdpc3RlcihzdHJ1Y3QgZTFpbnBfZHJpdmVyICpkcnYpCit7CisJbGxpc3RfYWRkX3RhaWwoJmRydi0+bGlzdCwgJmUxaW5wX2RyaXZlcl9saXN0KTsKKwlyZXR1cm4gMDsKK30KKworaW50IGUxaW5wX2xpbmVfdXBkYXRlKHN0cnVjdCBlMWlucF9saW5lICpsaW5lKQoreworCXJldHVybiBtaV9lMV9saW5lX3VwZGF0ZShsaW5lKTsKK30KKworc3RhdGljIGludCBlMWlfc2lnX2NiKHVuc2lnbmVkIGludCBzdWJzeXMsIHVuc2lnbmVkIGludCBzaWduYWwsCisJCSAgICAgIHZvaWQgKmhhbmRsZXJfZGF0YSwgdm9pZCAqc2lnbmFsX2RhdGEpCit7CisJaWYgKHN1YnN5cyAhPSBTU19HTE9CQUwgfHwKKwkgICAgc2lnbmFsICE9IFNfR0xPQkFMX1NIVVRET1dOKQorCQlyZXR1cm4gMDsKKworCWlmIChwY2FwX2ZkKSB7CisJCWNsb3NlKHBjYXBfZmQpOworCQlwY2FwX2ZkID0gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2F0dHJpYnV0ZV9fKChjb25zdHJ1Y3RvcikpIHZvaWQgb25fZHNvX2xvYWRfZTFfaW5wKHZvaWQpCit7CisJdGFsbF9zaWdsX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX2JzY19jdHgsIDEsCisJCQkJCSAgICJlMWlucF9zaWduX2xpbmsiKTsKKwlyZWdpc3Rlcl9zaWduYWxfaGFuZGxlcihTU19HTE9CQUwsIGUxaV9zaWdfY2IsIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZ3NtXzA0XzA4LmMgYi9vcGVuYnNjL3NyYy9nc21fMDRfMDguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWRhMGJkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZ3NtXzA0XzA4LmMKQEAgLTAsMCArMSwyOTIxIEBACisvKiBHU00gTW9iaWxlIFJhZGlvIEludGVyZmFjZSBMYXllciAzIG1lc3NhZ2VzIG9uIHRoZSBBLWJpcyBpbnRlcmZhY2UgCisgKiAzR1BQIFRTIDA0LjA4IHZlcnNpb24gNy4yMS4wIFJlbGVhc2UgMTk5OCAvIEVUU0kgVFMgMTAwIDk0MCBWNy4yMS4wICovCisKKy8qIChDKSAyMDA4LTIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDA4LCAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2RiLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2JpdHZlYy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvZ3NtX3V0aWxzLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzExLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMDguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfcnNsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9jaGFuX2FsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9wYWdpbmcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdHJhdV9mcmFtZS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdHJhdV9tdXguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3J0cF9wcm94eS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2dzbTQ4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy90cmFuc2FjdGlvbi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdXNzZC5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lsZW50X2NhbGwuaD4KKwordm9pZCAqdGFsbF9sb2NvcF9jdHg7CisKK2ludCBnc20wNDA4X2xvY191cGRfYWNjKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDMyX3QgdG1zaSk7CitzdGF0aWMgaW50IGdzbTQ4X3R4X3NpbXBsZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwKKwkJCSAgIHVfaW50OF90IHBkaXNjLCB1X2ludDhfdCBtc2dfdHlwZSk7CitzdGF0aWMgdm9pZCBzY2hlZHVsZV9yZWplY3Qoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pOworCitzdHJ1Y3QgZ3NtX2xhaSB7CisJdV9pbnQxNl90IG1jYzsKKwl1X2ludDE2X3QgbW5jOworCXVfaW50MTZfdCBsYWM7Cit9OworCitzdGF0aWMgdV9pbnQzMl90IG5ld19jYWxscmVmID0gMHg4MDAwMDAwMTsKKworc3RhdGljIGludCBhdXRob3JpemVfc3Vic2NyaWJlcihzdHJ1Y3QgZ3NtX2xvY191cGRhdGluZ19vcGVyYXRpb24gKmxvYywKKwkJCQlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcmliZXIpCit7CisJaWYgKCFzdWJzY3JpYmVyKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogRG8gbm90IHNlbmQgYWNjZXB0IHlldCBhcyBtb3JlIGluZm9ybWF0aW9uIHNob3VsZCBhcnJpdmUuIFNvbWUKKwkgKiBwaG9uZXMgd2lsbCBub3Qgc2VuZCB1cyB0aGUgaW5mb3JtYXRpb24gYW5kIHdlIHdpbGwgaGF2ZSB0byBjaGVjaworCSAqIHdoYXQgd2Ugd2FudCB0byBkbyB3aXRoIHRoYXQuCisJICovCisJaWYgKGxvYyAmJiAobG9jLT53YWl0aW5nX2Zvcl9pbXNpIHx8IGxvYy0+d2FpdGluZ19mb3JfaW1laSkpCisJCXJldHVybiAwOworCisJc3dpdGNoIChzdWJzY3JpYmVyLT5uZXQtPmF1dGhfcG9saWN5KSB7CisJY2FzZSBHU01fQVVUSF9QT0xJQ1lfQ0xPU0VEOgorCQlyZXR1cm4gc3Vic2NyaWJlci0+YXV0aG9yaXplZDsKKwljYXNlIEdTTV9BVVRIX1BPTElDWV9UT0tFTjoKKwkJaWYgKHN1YnNjcmliZXItPmF1dGhvcml6ZWQpCisJCQlyZXR1cm4gc3Vic2NyaWJlci0+YXV0aG9yaXplZDsKKwkJcmV0dXJuIChzdWJzY3JpYmVyLT5mbGFncyAmIEdTTV9TVUJTQ1JJQkVSX0ZJUlNUX0NPTlRBQ1QpOworCWNhc2UgR1NNX0FVVEhfUE9MSUNZX0FDQ0VQVF9BTEw6CisJCXJldHVybiAxOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIHZvaWQgcmVsZWFzZV9sb2NfdXBkYXRpbmdfcmVxKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCWlmICghbGNoYW4tPmxvY19vcGVyYXRpb24pCisJCXJldHVybjsKKworCWJzY19kZWxfdGltZXIoJmxjaGFuLT5sb2Nfb3BlcmF0aW9uLT51cGRhdGluZ190aW1lcik7CisJdGFsbG9jX2ZyZWUobGNoYW4tPmxvY19vcGVyYXRpb24pOworCWxjaGFuLT5sb2Nfb3BlcmF0aW9uID0gMDsKKwlwdXRfbGNoYW4obGNoYW4pOworfQorCitzdGF0aWMgdm9pZCBhbGxvY2F0ZV9sb2NfdXBkYXRpbmdfcmVxKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCXVzZV9sY2hhbihsY2hhbik7CisJcmVsZWFzZV9sb2NfdXBkYXRpbmdfcmVxKGxjaGFuKTsKKworCWxjaGFuLT5sb2Nfb3BlcmF0aW9uID0gdGFsbG9jX3plcm8odGFsbF9sb2NvcF9jdHgsCisJCQkJCSAgIHN0cnVjdCBnc21fbG9jX3VwZGF0aW5nX29wZXJhdGlvbik7Cit9CisKK3N0YXRpYyBpbnQgZ3NtMDQwOF9hdXRob3JpemUoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHN0cnVjdCBtc2diICptc2cpCit7CisJaWYgKGF1dGhvcml6ZV9zdWJzY3JpYmVyKGxjaGFuLT5sb2Nfb3BlcmF0aW9uLCBsY2hhbi0+c3Vic2NyKSkgeworCQlpbnQgcmM7CisKKwkJZGJfc3Vic2NyaWJlcl9hbGxvY190bXNpKGxjaGFuLT5zdWJzY3IpOworCQlyZWxlYXNlX2xvY191cGRhdGluZ19yZXEobGNoYW4pOworCQlyYyA9IGdzbTA0MDhfbG9jX3VwZF9hY2MobXNnLT5sY2hhbiwgbGNoYW4tPnN1YnNjci0+dG1zaSk7CisJCWlmIChsY2hhbi0+dHMtPnRyeC0+YnRzLT5uZXR3b3JrLT5zZW5kX21tX2luZm8pIHsKKwkJCS8qIHNlbmQgTU0gSU5GTyB3aXRoIG5ldHdvcmsgbmFtZSAqLworCQkJcmMgPSBnc200OF90eF9tbV9pbmZvKG1zZy0+bGNoYW4pOworCQl9CisKKwkJLyogY2FsbCBzdWJzY3JfdXBkYXRlIGFmdGVyIHB1dHRpbmcgdGhlIGxvY191cGRfYWNjCisJCSAqIGluIHRoZSB0cmFuc21pdCBxdWV1ZSwgc2luY2UgU19TVUJTQ1JfQVRUQUNIRUQgbWlnaHQKKwkJICogdHJpZ2dlciBmdXJ0aGVyIGFjdGlvbiBsaWtlIFNNUyBkZWxpdmVyeSAqLworCQlzdWJzY3JfdXBkYXRlKGxjaGFuLT5zdWJzY3IsIG1zZy0+dHJ4LT5idHMsCisJCQkgICAgICBHU01fU1VCU0NSSUJFUl9VUERBVEVfQVRUQUNIRUQpOworCQkvKiB0cnkgdG8gY2xvc2UgY2hhbm5lbCBBU0FQICovCisJCWxjaGFuX2F1dG9fcmVsZWFzZShsY2hhbik7CisJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnc20wNDA4X2hhbmRsZV9sY2hhbl9zaWduYWwodW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IHNpZ25hbCwKKwkJCQkJdm9pZCAqaGFuZGxlcl9kYXRhLCB2b2lkICpzaWduYWxfZGF0YSkKK3sKKwlzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgKnRlbXA7CisKKwlpZiAoc3Vic3lzICE9IFNTX0xDSEFOIHx8IHNpZ25hbCAhPSBTX0xDSEFOX1VORVhQRUNURURfUkVMRUFTRSkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIENhbmNlbCBhbnkgb3V0c3RhbmRpbmcgbG9jYXRpb24gdXBkYXRpbmcgcmVxdWVzdAorCSAqIG9wZXJhdGlvbiB0YWtpbmcgcGxhY2Ugb24gdGhlIGxjaGFuLgorCSAqLworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0gKHN0cnVjdCBnc21fbGNoYW4gKilzaWduYWxfZGF0YTsKKwlpZiAoIWxjaGFuKQorCQlyZXR1cm4gMDsKKworCXJlbGVhc2VfbG9jX3VwZGF0aW5nX3JlcShsY2hhbik7CisKKwkvKiBGcmVlIGFsbCB0cmFuc2FjdGlvbnMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWxlYXNlZCBsY2hhbiAqLworCS8qIEZJWE1FOiB0aGlzIGlzIG5vdCBuZWNjZXNzYXJpbHkgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvLCB3ZSBzaG91bGQKKwkgKiBvbmx5IHNldCB0cmFucy0+bGNoYW4gdG8gTlVMTCBhbmQgd2FpdCBmb3IgYW5vdGhlciBsY2hhbiB0byBiZQorCSAqIGVzdGFibGlzaGVkIHRvIHRoZSBzYW1lIE1NIGVudGl0eSAocGhvbmUvc3Vic2NyaWJlcikgKi8KKwlsbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHRyYW5zLCB0ZW1wLCAmbGNoYW4tPnRzLT50cngtPmJ0cy0+bmV0d29yay0+dHJhbnNfbGlzdCwgZW50cnkpIHsKKwkJaWYgKHRyYW5zLT5sY2hhbiA9PSBsY2hhbikKKwkJCXRyYW5zX2ZyZWUodHJhbnMpOworCX0KKworCXJldHVybiAwOworfQorCisvKiBDaGFwdGVyIDkuMi4xNCA6IFNlbmQgTE9DQVRJT04gVVBEQVRJTkcgUkVKRUNUICovCitpbnQgZ3NtMDQwOF9sb2NfdXBkX3JlaihzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgY2F1c2UpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IGxjaGFuLT50cy0+dHJ4LT5idHM7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaDsKKwkKKwltc2ctPmxjaGFuID0gbGNoYW47CisKKwlnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkgKyAxKTsKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19NTTsKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9NTV9MT0NfVVBEX1JFSkVDVDsKKwlnaC0+ZGF0YVswXSA9IGNhdXNlOworCisJTE9HUChETU0sIExPR0xfSU5GTywgIlN1YnNjcmliZXIgJXM6IExPQ0FUSU9OIFVQREFUSU5HIFJFSkVDVCAiCisJICAgICAiTEFDPSV1IEJUUz0ldVxuIiwgbGNoYW4tPnN1YnNjciA/CisJICAgICAJCQlzdWJzY3JfbmFtZShsY2hhbi0+c3Vic2NyKSA6ICJ1bmtub3duIiwKKwkgICAgIGxjaGFuLT50cy0+dHJ4LT5idHMtPmxvY2F0aW9uX2FyZWFfY29kZSwgbGNoYW4tPnRzLT50cngtPmJ0cy0+bnIpOworCisJY291bnRlcl9pbmMoYnRzLT5uZXR3b3JrLT5zdGF0cy5sb2NfdXBkX3Jlc3AucmVqZWN0KTsKKwkKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIE5VTEwpOworfQorCisvKiBDaGFwdGVyIDkuMi4xMyA6IFNlbmQgTE9DQVRJT04gVVBEQVRFIEFDQ0VQVCAqLworaW50IGdzbTA0MDhfbG9jX3VwZF9hY2Moc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50MzJfdCB0bXNpKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSBsY2hhbi0+dHMtPnRyeC0+YnRzOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2g7CisJc3RydWN0IGdzbTQ4X2xvY19hcmVhX2lkICpsYWk7CisJdV9pbnQ4X3QgKm1pZDsKKwkKKwltc2ctPmxjaGFuID0gbGNoYW47CisKKwlnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCWdoLT5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX01NOworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX01NX0xPQ19VUERfQUNDRVBUOworCisJbGFpID0gKHN0cnVjdCBnc200OF9sb2NfYXJlYV9pZCAqKSBtc2diX3B1dChtc2csIHNpemVvZigqbGFpKSk7CisJZ3NtNDhfZ2VuZXJhdGVfbGFpKGxhaSwgYnRzLT5uZXR3b3JrLT5jb3VudHJ5X2NvZGUsCisJCSAgICAgYnRzLT5uZXR3b3JrLT5uZXR3b3JrX2NvZGUsIGJ0cy0+bG9jYXRpb25fYXJlYV9jb2RlKTsKKworCW1pZCA9IG1zZ2JfcHV0KG1zZywgR1NNNDhfTUlEX1RNU0lfTEVOKTsKKwlnc200OF9nZW5lcmF0ZV9taWRfZnJvbV90bXNpKG1pZCwgdG1zaSk7CisKKwlERUJVR1AoRE1NLCAiLT4gTE9DQVRJT04gVVBEQVRFIEFDQ0VQVFxuIik7CisKKwljb3VudGVyX2luYyhidHMtPm5ldHdvcmstPnN0YXRzLmxvY191cGRfcmVzcC5hY2NlcHQpOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCBOVUxMKTsKK30KKworLyogVHJhbnNtaXQgQ2hhcHRlciA5LjIuMTAgSWRlbnRpdHkgUmVxdWVzdCAqLworc3RhdGljIGludCBtbV90eF9pZGVudGl0eV9yZXEoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGlkX3R5cGUpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaDsKKworCW1zZy0+bGNoYW4gPSBsY2hhbjsKKworCWdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSArIDEpOworCWdoLT5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX01NOworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX01NX0lEX1JFUTsKKwlnaC0+ZGF0YVswXSA9IGlkX3R5cGU7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIE5VTEwpOworfQorCisKKy8qIFBhcnNlIENoYXB0ZXIgOS4yLjExIElkZW50aXR5IFJlc3BvbnNlICovCitzdGF0aWMgaW50IG1tX3J4X2lkX3Jlc3Aoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IG1zZy0+bGNoYW47CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IGxjaGFuLT50cy0+dHJ4LT5idHM7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBidHMtPm5ldHdvcms7CisJdV9pbnQ4X3QgbWlfdHlwZSA9IGdoLT5kYXRhWzFdICYgR1NNX01JX1RZUEVfTUFTSzsKKwljaGFyIG1pX3N0cmluZ1tHU000OF9NSV9TSVpFXTsKKworCWdzbTQ4X21pX3RvX3N0cmluZyhtaV9zdHJpbmcsIHNpemVvZihtaV9zdHJpbmcpLCAmZ2gtPmRhdGFbMV0sIGdoLT5kYXRhWzBdKTsKKwlERUJVR1AoRE1NLCAiSURFTlRJVFkgUkVTUE9OU0U6IG1pX3R5cGU9MHglMDJ4IE1JKCVzKVxuIiwKKwkJbWlfdHlwZSwgbWlfc3RyaW5nKTsKKworCWRpc3BhdGNoX3NpZ25hbChTU19TVUJTQ1IsIFNfU1VCU0NSX0lERU5USVRZLCBnaC0+ZGF0YSk7CisKKwlzd2l0Y2ggKG1pX3R5cGUpIHsKKwljYXNlIEdTTV9NSV9UWVBFX0lNU0k6CisJCS8qIGxvb2sgdXAgc3Vic2NyaWJlciBiYXNlZCBvbiBJTVNJLCBjcmVhdGUgaWYgbm90IGZvdW5kICovCisJCWlmICghbGNoYW4tPnN1YnNjcikgeworCQkJbGNoYW4tPnN1YnNjciA9IHN1YnNjcl9nZXRfYnlfaW1zaShuZXQsIG1pX3N0cmluZyk7CisJCQlpZiAoIWxjaGFuLT5zdWJzY3IpCisJCQkJbGNoYW4tPnN1YnNjciA9IGRiX2NyZWF0ZV9zdWJzY3JpYmVyKG5ldCwgbWlfc3RyaW5nKTsKKwkJfQorCQlpZiAobGNoYW4tPmxvY19vcGVyYXRpb24pCisJCQlsY2hhbi0+bG9jX29wZXJhdGlvbi0+d2FpdGluZ19mb3JfaW1zaSA9IDA7CisJCWJyZWFrOworCWNhc2UgR1NNX01JX1RZUEVfSU1FSToKKwljYXNlIEdTTV9NSV9UWVBFX0lNRUlTVjoKKwkJLyogdXBkYXRlIHN1YnNjcmliZSA8LT4gSU1FSSBtYXBwaW5nICovCisJCWlmIChsY2hhbi0+c3Vic2NyKSB7CisJCQlkYl9zdWJzY3JpYmVyX2Fzc29jX2ltZWkobGNoYW4tPnN1YnNjciwgbWlfc3RyaW5nKTsKKwkJCWRiX3N5bmNfZXF1aXBtZW50KCZsY2hhbi0+c3Vic2NyLT5lcXVpcG1lbnQpOworCQl9CisJCWlmIChsY2hhbi0+bG9jX29wZXJhdGlvbikKKwkJCWxjaGFuLT5sb2Nfb3BlcmF0aW9uLT53YWl0aW5nX2Zvcl9pbWVpID0gMDsKKwkJYnJlYWs7CisJfQorCisJLyogQ2hlY2sgaWYgd2UgY2FuIGxldCB0aGUgbW9iaWxlIHN0YXRpb24gZW50ZXIgKi8KKwlyZXR1cm4gZ3NtMDQwOF9hdXRob3JpemUobGNoYW4sIG1zZyk7Cit9CisKKworc3RhdGljIHZvaWQgbG9jX3VwZF9yZWpfY2Iodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IGRhdGE7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IGxjaGFuLT50cy0+dHJ4LT5idHM7CisKKwlyZWxlYXNlX2xvY191cGRhdGluZ19yZXEobGNoYW4pOworCWdzbTA0MDhfbG9jX3VwZF9yZWoobGNoYW4sIGJ0cy0+bmV0d29yay0+cmVqZWN0X2NhdXNlKTsKKwlsY2hhbl9hdXRvX3JlbGVhc2UobGNoYW4pOworfQorCitzdGF0aWMgdm9pZCBzY2hlZHVsZV9yZWplY3Qoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJbGNoYW4tPmxvY19vcGVyYXRpb24tPnVwZGF0aW5nX3RpbWVyLmNiID0gbG9jX3VwZF9yZWpfY2I7CisJbGNoYW4tPmxvY19vcGVyYXRpb24tPnVwZGF0aW5nX3RpbWVyLmRhdGEgPSBsY2hhbjsKKwlic2Nfc2NoZWR1bGVfdGltZXIoJmxjaGFuLT5sb2Nfb3BlcmF0aW9uLT51cGRhdGluZ190aW1lciwgNSwgMCk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpsdXBkX25hbWUodV9pbnQ4X3QgdHlwZSkKK3sKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEdTTTQ4X0xVUERfTk9STUFMOgorCQlyZXR1cm4gIk5PUk1BTCI7CisJY2FzZSBHU000OF9MVVBEX1BFUklPRElDOgorCQlyZXR1cm4gIlBFUk9JRE9DIjsKKwljYXNlIEdTTTQ4X0xVUERfSU1TSV9BVFQ6CisJCXJldHVybiAiSU1TSSBBVFRBQ0giOworCWRlZmF1bHQ6CisJCXJldHVybiAiVU5LTk9XTiI7CisJfQorfQorCisvKiBDaGFwdGVyIDkuMi4xNTogUmVjZWl2ZSBMb2NhdGlvbiBVcGRhdGluZyBSZXF1ZXN0ICovCitzdGF0aWMgaW50IG1tX3J4X2xvY191cGRfcmVxKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJc3RydWN0IGdzbTQ4X2xvY191cGRfcmVxICpsdTsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IE5VTEw7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBtc2ctPmxjaGFuOworCXN0cnVjdCBnc21fYnRzICpidHMgPSBsY2hhbi0+dHMtPnRyeC0+YnRzOworCXVfaW50OF90IG1pX3R5cGU7CisJY2hhciBtaV9zdHJpbmdbR1NNNDhfTUlfU0laRV07CisJaW50IHJjOworCisgCWx1ID0gKHN0cnVjdCBnc200OF9sb2NfdXBkX3JlcSAqKSBnaC0+ZGF0YTsKKworCW1pX3R5cGUgPSBsdS0+bWlbMF0gJiBHU01fTUlfVFlQRV9NQVNLOworCisJZ3NtNDhfbWlfdG9fc3RyaW5nKG1pX3N0cmluZywgc2l6ZW9mKG1pX3N0cmluZyksIGx1LT5taSwgbHUtPm1pX2xlbik7CisKKwlERUJVR1BDKERNTSwgIm1pX3R5cGU9MHglMDJ4IE1JKCVzKSB0eXBlPSVzICIsIG1pX3R5cGUsIG1pX3N0cmluZywKKwkJbHVwZF9uYW1lKGx1LT50eXBlKSk7CisKKwlkaXNwYXRjaF9zaWduYWwoU1NfU1VCU0NSLCBTX1NVQlNDUl9JREVOVElUWSwgJmx1LT5taV9sZW4pOworCisJc3dpdGNoIChsdS0+dHlwZSkgeworCWNhc2UgR1NNNDhfTFVQRF9OT1JNQUw6CisJCWNvdW50ZXJfaW5jKGJ0cy0+bmV0d29yay0+c3RhdHMubG9jX3VwZF90eXBlLm5vcm1hbCk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTFVQRF9JTVNJX0FUVDoKKwkJY291bnRlcl9pbmMoYnRzLT5uZXR3b3JrLT5zdGF0cy5sb2NfdXBkX3R5cGUuYXR0YWNoKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9MVVBEX1BFUklPRElDOgorCQljb3VudGVyX2luYyhidHMtPm5ldHdvcmstPnN0YXRzLmxvY191cGRfdHlwZS5wZXJpb2RpYyk7CisJCWJyZWFrOworCX0KKworCS8qCisJICogUHNldWRvIFNwb29mIGRldGVjdGlvbjogSnVzdCBkcm9wIGEgc2Vjb25kL2NvbmN1cnJlbnQKKwkgKiBsb2NhdGlvbiB1cGRhdGluZyByZXF1ZXN0LgorCSAqLworCWlmIChsY2hhbi0+bG9jX29wZXJhdGlvbikgeworCQlERUJVR1BDKERNTSwgImlnbm9yaW5nIHJlcXVlc3QgZHVlIGFuIGV4aXN0aW5nIG9uZTogJXAuXG4iLAorCQkJbGNoYW4tPmxvY19vcGVyYXRpb24pOworCQlnc20wNDA4X2xvY191cGRfcmVqKGxjaGFuLCBHU000OF9SRUpFQ1RfUFJPVE9DT0xfRVJST1IpOworCQlyZXR1cm4gMDsKKwl9CisKKwlhbGxvY2F0ZV9sb2NfdXBkYXRpbmdfcmVxKGxjaGFuKTsKKworCXN3aXRjaCAobWlfdHlwZSkgeworCWNhc2UgR1NNX01JX1RZUEVfSU1TSToKKwkJREVCVUdQQyhETU0sICJcbiIpOworCQkvKiB3ZSBhbHdheXMgd2FudCB0aGUgSU1FSSwgdG9vICovCisJCXJjID0gbW1fdHhfaWRlbnRpdHlfcmVxKGxjaGFuLCBHU01fTUlfVFlQRV9JTUVJKTsKKwkJbGNoYW4tPmxvY19vcGVyYXRpb24tPndhaXRpbmdfZm9yX2ltZWkgPSAxOworCisJCS8qIGxvb2sgdXAgc3Vic2NyaWJlciBiYXNlZCBvbiBJTVNJLCBjcmVhdGUgaWYgbm90IGZvdW5kICovCisJCXN1YnNjciA9IHN1YnNjcl9nZXRfYnlfaW1zaShidHMtPm5ldHdvcmssIG1pX3N0cmluZyk7CisJCWlmICghc3Vic2NyKSB7CisJCQlzdWJzY3IgPSBkYl9jcmVhdGVfc3Vic2NyaWJlcihidHMtPm5ldHdvcmssIG1pX3N0cmluZyk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBHU01fTUlfVFlQRV9UTVNJOgorCQlERUJVR1BDKERNTSwgIlxuIik7CisJCS8qIHdlIGFsd2F5cyB3YW50IHRoZSBJTUVJLCB0b28gKi8KKwkJcmMgPSBtbV90eF9pZGVudGl0eV9yZXEobGNoYW4sIEdTTV9NSV9UWVBFX0lNRUkpOworCQlsY2hhbi0+bG9jX29wZXJhdGlvbi0+d2FpdGluZ19mb3JfaW1laSA9IDE7CisKKwkJLyogbG9vayB1cCB0aGUgc3Vic2NyaWJlciBiYXNlZCBvbiBUTVNJLCByZXF1ZXN0IElNU0kgaWYgaXQgZmFpbHMgKi8KKwkJc3Vic2NyID0gc3Vic2NyX2dldF9ieV90bXNpKGJ0cy0+bmV0d29yaywKKwkJCQkJICAgIHRtc2lfZnJvbV9zdHJpbmcobWlfc3RyaW5nKSk7CisJCWlmICghc3Vic2NyKSB7CisJCQkvKiBzZW5kIElERU5USVRZIFJFUVVFU1QgbWVzc2FnZSB0byBnZXQgSU1TSSAqLworCQkJcmMgPSBtbV90eF9pZGVudGl0eV9yZXEobGNoYW4sIEdTTV9NSV9UWVBFX0lNU0kpOworCQkJbGNoYW4tPmxvY19vcGVyYXRpb24tPndhaXRpbmdfZm9yX2ltc2kgPSAxOworCQl9CisJCWJyZWFrOworCWNhc2UgR1NNX01JX1RZUEVfSU1FSToKKwljYXNlIEdTTV9NSV9UWVBFX0lNRUlTVjoKKwkJLyogbm8gc2ltIGNhcmQuLi4gRklYTUU6IHdoYXQgdG8gZG8gPyAqLworCQlERUJVR1BDKERNTSwgInVuaW1wbGVtZW50ZWQgbW9iaWxlIGlkZW50aXR5IHR5cGVcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgkKKwkJREVCVUdQQyhETU0sICJ1bmtub3duIG1vYmlsZSBpZGVudGl0eSB0eXBlXG4iKTsKKwkJYnJlYWs7CisJfQorCisJLyogc2NoZWR1bGUgdGhlIHJlamVjdCB0aW1lciAqLworCXNjaGVkdWxlX3JlamVjdChsY2hhbik7CisKKwlpZiAoIXN1YnNjcikgeworCQlERUJVR1BDKERSUiwgIjwtIENhbid0IGZpbmQgYW55IHN1YnNjcmliZXIgZm9yIHRoaXMgSURcbiIpOworCQkvKiBGSVhNRTogcmVxdWVzdCBpZD8gY2xvc2UgY2hhbm5lbD8gKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbGNoYW4tPnN1YnNjciA9IHN1YnNjcjsKKwlsY2hhbi0+c3Vic2NyLT5lcXVpcG1lbnQuY2xhc3NtYXJrMSA9IGx1LT5jbGFzc21hcmsxOworCisJLyogY2hlY2sgaWYgd2UgY2FuIGxldCB0aGUgc3Vic2NyaWJlciBpbnRvIG91ciBuZXR3b3JrIGltbWVkaWF0ZWx5CisJICogb3IgaWYgd2UgbmVlZCB0byB3YWl0IGZvciBpZGVudGl0eSByZXNwb25zZXMuICovCisJcmV0dXJuIGdzbTA0MDhfYXV0aG9yaXplKGxjaGFuLCBtc2cpOworfQorCisjaWYgMAorc3RhdGljIHVfaW50OF90IHRvX2JjZDgodV9pbnQ4X3QgdmFsKQoreworICAgICAgIHJldHVybiAoKHZhbCAvIDEwKSA8PCA0KSB8ICh2YWwgJSAxMCk7Cit9CisjZW5kaWYKKworLyogU2VjdGlvbiA5LjIuMTVhICovCitpbnQgZ3NtNDhfdHhfbW1faW5mbyhzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoOworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0ID0gbGNoYW4tPnRzLT50cngtPmJ0cy0+bmV0d29yazsKKwl1X2ludDhfdCAqcHRyODsKKwlpbnQgbmFtZV9sZW4sIG5hbWVfcGFkOworI2lmIDAKKwl0aW1lX3QgY3VyX3Q7CisJc3RydWN0IHRtKiBjdXJfdGltZTsKKwlpbnQgdHoxNW1pbjsKKyNlbmRpZgorCisJbXNnLT5sY2hhbiA9IGxjaGFuOworCisJZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19NTTsKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9NTV9JTkZPOworCisJaWYgKG5ldC0+bmFtZV9sb25nKSB7CisjaWYgMAorCQluYW1lX2xlbiA9IHN0cmxlbihuZXQtPm5hbWVfbG9uZyk7CisJCS8qIDEwLjUuMy41YSAqLworCQlwdHI4ID0gbXNnYl9wdXQobXNnLCAzKTsKKwkJcHRyOFswXSA9IEdTTTQ4X0lFX05BTUVfTE9ORzsKKwkJcHRyOFsxXSA9IG5hbWVfbGVuKjIgKzE7CisJCXB0cjhbMl0gPSAweDkwOyAvKiBVQ1MyLCBubyBzcGFyZSBiaXRzLCBubyBDSSAqLworCisJCXB0cjE2ID0gKHVfaW50MTZfdCAqKSBtc2diX3B1dChtc2csIG5hbWVfbGVuKjIpOworCQlmb3IgKGkgPSAwOyBpIDwgbmFtZV9sZW47IGkrKykKKwkJCXB0cjE2W2ldID0gaHRvbnMobmV0LT5uYW1lX2xvbmdbaV0pOworCisJCS8qIEZJWE1FOiBVc2UgQ2VsbCBCcm9hZGNhc3QsIG5vdCBVQ1MtMiwgc2luY2UKKwkJICogVUNTLTIgaXMgb25seSBzdXBwb3J0ZWQgYnkgbGF0ZXIgcmV2aXNpb25zIG9mIHRoZSBzcGVjICovCisjZW5kaWYKKwkJbmFtZV9sZW4gPSAoc3RybGVuKG5ldC0+bmFtZV9sb25nKSo3KS84OworCQluYW1lX3BhZCA9ICg4IC0gc3RybGVuKG5ldC0+bmFtZV9sb25nKSo3KSU4OworCQlpZiAobmFtZV9wYWQgPiAwKQorCQkJbmFtZV9sZW4rKzsKKwkJLyogMTAuNS4zLjVhICovCisJCXB0cjggPSBtc2diX3B1dChtc2csIDMpOworCQlwdHI4WzBdID0gR1NNNDhfSUVfTkFNRV9MT05HOworCQlwdHI4WzFdID0gbmFtZV9sZW4gKzE7CisJCXB0cjhbMl0gPSAweDgwIHwgbmFtZV9wYWQ7IC8qIENlbGwgQnJvYWRjYXN0IERDUywgbm8gQ0kgKi8KKworCQlwdHI4ID0gbXNnYl9wdXQobXNnLCBuYW1lX2xlbik7CisJCWdzbV83Yml0X2VuY29kZShwdHI4LCBuZXQtPm5hbWVfbG9uZyk7CisKKwl9CisKKwlpZiAobmV0LT5uYW1lX3Nob3J0KSB7CisjaWYgMAorCQluYW1lX2xlbiA9IHN0cmxlbihuZXQtPm5hbWVfc2hvcnQpOworCQkvKiAxMC41LjMuNWEgKi8KKwkJcHRyOCA9ICh1X2ludDhfdCAqKSBtc2diX3B1dChtc2csIDMpOworCQlwdHI4WzBdID0gR1NNNDhfSUVfTkFNRV9TSE9SVDsKKwkJcHRyOFsxXSA9IG5hbWVfbGVuKjIgKyAxOworCQlwdHI4WzJdID0gMHg5MDsgLyogVUNTMiwgbm8gc3BhcmUgYml0cywgbm8gQ0kgKi8KKworCQlwdHIxNiA9ICh1X2ludDE2X3QgKikgbXNnYl9wdXQobXNnLCBuYW1lX2xlbioyKTsKKwkJZm9yIChpID0gMDsgaSA8IG5hbWVfbGVuOyBpKyspCisJCQlwdHIxNltpXSA9IGh0b25zKG5ldC0+bmFtZV9zaG9ydFtpXSk7CisjZW5kaWYKKwkJbmFtZV9sZW4gPSAoc3RybGVuKG5ldC0+bmFtZV9zaG9ydCkqNykvODsKKwkJbmFtZV9wYWQgPSAoOCAtIHN0cmxlbihuZXQtPm5hbWVfc2hvcnQpKjcpJTg7CisJCWlmIChuYW1lX3BhZCA+IDApCisJCQluYW1lX2xlbisrOworCQkvKiAxMC41LjMuNWEgKi8KKwkJcHRyOCA9ICh1X2ludDhfdCAqKSBtc2diX3B1dChtc2csIDMpOworCQlwdHI4WzBdID0gR1NNNDhfSUVfTkFNRV9TSE9SVDsKKwkJcHRyOFsxXSA9IG5hbWVfbGVuICsxOworCQlwdHI4WzJdID0gMHg4MCB8IG5hbWVfcGFkOyAvKiBDZWxsIEJyb2FkY2FzdCBEQ1MsIG5vIENJICovCisKKwkJcHRyOCA9IG1zZ2JfcHV0KG1zZywgbmFtZV9sZW4pOworCQlnc21fN2JpdF9lbmNvZGUocHRyOCwgbmV0LT5uYW1lX3Nob3J0KTsKKworCX0KKworI2lmIDAKKwkvKiBTZWN0aW9uIDEwLjUuMy45ICovCisJY3VyX3QgPSB0aW1lKE5VTEwpOworCWN1cl90aW1lID0gZ210aW1lKCZjdXJfdCk7CisJcHRyOCA9IG1zZ2JfcHV0KG1zZywgOCk7CisJcHRyOFswXSA9IEdTTTQ4X0lFX05FVF9USU1FX1RaOworCXB0cjhbMV0gPSB0b19iY2Q4KGN1cl90aW1lLT50bV95ZWFyICUgMTAwKTsKKwlwdHI4WzJdID0gdG9fYmNkOChjdXJfdGltZS0+dG1fbW9uKTsKKwlwdHI4WzNdID0gdG9fYmNkOChjdXJfdGltZS0+dG1fbWRheSk7CisJcHRyOFs0XSA9IHRvX2JjZDgoY3VyX3RpbWUtPnRtX2hvdXIpOworCXB0cjhbNV0gPSB0b19iY2Q4KGN1cl90aW1lLT50bV9taW4pOworCXB0cjhbNl0gPSB0b19iY2Q4KGN1cl90aW1lLT50bV9zZWMpOworCS8qIDAyLjQyOiBjb2RlZCBhcyBCQ0QgZW5jb2RlZCBzaWduZWQgdmFsdWUgaW4gdW5pdHMgb2YgMTUgbWludXRlcyAqLworCXR6MTVtaW4gPSAoY3VyX3RpbWUtPnRtX2dtdG9mZikvKDYwKjE1KTsKKwlwdHI4WzddID0gdG9fYmNkOCh0ejE1bWluKTsKKwlpZiAodHoxNW1pbiA8IDApCisJCXB0cjhbN10gfD0gMHg4MDsKKyNlbmRpZgorCisJREVCVUdQKERNTSwgIi0+IE1NIElORk9cbiIpOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCBOVUxMKTsKK30KKworLyogU2VjdGlvbiA5LjIuMiAqLworaW50IGdzbTQ4X3R4X21tX2F1dGhfcmVxKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCAqcmFuZCwgaW50IGtleV9zZXEpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCXN0cnVjdCBnc200OF9hdXRoX3JlcSAqYXIgPSAoc3RydWN0IGdzbTQ4X2F1dGhfcmVxICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCphcikpOworCisJREVCVUdQKERNTSwgIi0+IEFVVEggUkVRIChyYW5kID0gJXMpXG4iLCBoZXhkdW1wKHJhbmQsIDE2KSk7CisKKwltc2ctPmxjaGFuID0gbGNoYW47CisJZ2gtPnByb3RvX2Rpc2NyID0gR1NNNDhfUERJU0NfTU07CisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfTU1fQVVUSF9SRVE7CisKKwlhci0+a2V5X3NlcSA9IGtleV9zZXE7CisKKwkvKiAxNiBieXRlcyBSQU5EIHBhcmFtZXRlcnMgKi8KKwlpZiAocmFuZCkKKwkJbWVtY3B5KGFyLT5yYW5kLCByYW5kLCAxNik7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIE5VTEwpOworfQorCisvKiBTZWN0aW9uIDkuMi4xICovCitpbnQgZ3NtNDhfdHhfbW1fYXV0aF9yZWooc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJREVCVUdQKERNTSwgIi0+IEFVVEggUkVKRUNUXG4iKTsKKwlyZXR1cm4gZ3NtNDhfdHhfc2ltcGxlKGxjaGFuLCBHU000OF9QRElTQ19NTSwgR1NNNDhfTVRfTU1fQVVUSF9SRUopOworfQorCitzdGF0aWMgaW50IGdzbTQ4X3R4X21tX3NlcnZfYWNrKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCURFQlVHUChETU0sICItPiBDTSBTRVJWSUNFIEFDS1xuIik7CisJcmV0dXJuIGdzbTQ4X3R4X3NpbXBsZShsY2hhbiwgR1NNNDhfUERJU0NfTU0sIEdTTTQ4X01UX01NX0NNX1NFUlZfQUNDKTsKK30KKworLyogOS4yLjYgQ00gc2VydmljZSByZWplY3QgKi8KK3N0YXRpYyBpbnQgZ3NtNDhfdHhfbW1fc2Vydl9yZWooc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sCisJCQkJZW51bSBnc200OF9yZWplY3RfdmFsdWUgdmFsdWUpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaDsKKworCWdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSArIDEpOworCisJbXNnLT5sY2hhbiA9IGxjaGFuOworCXVzZV9sY2hhbihsY2hhbik7CisKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19NTTsKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9NTV9DTV9TRVJWX1JFSjsKKwlnaC0+ZGF0YVswXSA9IHZhbHVlOworCURFQlVHUChETU0sICItPiBDTSBTRVJWSUNFIFJlamVjdCBjYXVzZTogJWRcbiIsIHZhbHVlKTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgTlVMTCk7Cit9CisKKy8qCisgKiBIYW5kbGUgQ00gU2VydmljZSBSZXF1ZXN0cworICogYSkgVmVyaWZ5IHRoYXQgdGhlIHBhY2tldCBpcyBsb25nIGVub3VnaCB0byBjb250YWluIHRoZSBpbmZvcm1hdGlvbgorICogICAgd2UgcmVxdWlyZSBvdGhlcndzaWUgcmVqZWN0IHdpdGggSU5DT1JSRUNUX01FU1NBR0UKKyAqIGIpIFRyeSB0byBwYXJzZSB0aGUgVE1TSS4gSWYgd2UgZG8gbm90IGhhdmUgb25lIHJlamVjdAorICogYykgQ2hlY2sgdGhhdCB3ZSBrbm93IHRoZSBzdWJzY3JpYmVyIHdpdGggdGhlIFRNU0kgb3RoZXJ3aXNlIHJlamVjdAorICogICAgd2l0aCBhIEhMUiBjYXVzZQorICogZCkgU2V0IHRoZSBzdWJzY3JpYmVyIG9uIHRoZSBnc21fbGNoYW4gYW5kIGFjY2VwdAorICovCitzdGF0aWMgaW50IGdzbTQ4X3J4X21tX3NlcnZfcmVxKHN0cnVjdCBtc2diICptc2cpCit7CisJdV9pbnQ4X3QgbWlfdHlwZTsKKwljaGFyIG1pX3N0cmluZ1tHU000OF9NSV9TSVpFXTsKKworCXN0cnVjdCBnc21fYnRzICpidHMgPSBtc2ctPmxjaGFuLT50cy0+dHJ4LT5idHM7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJc3RydWN0IGdzbTQ4X3NlcnZpY2VfcmVxdWVzdCAqcmVxID0KKwkJCShzdHJ1Y3QgZ3NtNDhfc2VydmljZV9yZXF1ZXN0ICopZ2gtPmRhdGE7CisJLyogdW5mb3J0dW5hdGVseSBpbiBQaGFzZTEgdGhlIGNsYXNzbWFyMiBsZW5ndGggaXMgdmFyaWFibGUgKi8KKwl1X2ludDhfdCBjbGFzc21hcmsyX2xlbiA9IGdoLT5kYXRhWzFdOworCXVfaW50OF90ICpjbGFzc21hcmsyID0gZ2gtPmRhdGErMjsKKwl1X2ludDhfdCBtaV9sZW4gPSAqKGNsYXNzbWFyazIgKyBjbGFzc21hcmsyX2xlbik7CisJdV9pbnQ4X3QgKm1pID0gKGNsYXNzbWFyazIgKyBjbGFzc21hcmsyX2xlbiArIDEpOworCisJREVCVUdQKERNTSwgIjwtIENNIFNFUlZJQ0UgUkVRVUVTVCAiKTsKKwlpZiAobXNnLT5kYXRhX2xlbiA8IHNpemVvZihzdHJ1Y3QgZ3NtNDhfc2VydmljZV9yZXF1ZXN0KikpIHsKKwkJREVCVUdQQyhETU0sICJ3cm9uZyBzaXplZCBtZXNzYWdlXG4iKTsKKwkJcmV0dXJuIGdzbTQ4X3R4X21tX3NlcnZfcmVqKG1zZy0+bGNoYW4sCisJCQkJCSAgICBHU000OF9SRUpFQ1RfSU5DT1JSRUNUX01FU1NBR0UpOworCX0KKworCWlmIChtc2ctPmRhdGFfbGVuIDwgcmVxLT5taV9sZW4gKyA2KSB7CisJCURFQlVHUEMoRE1NLCAiZG9lcyBub3QgZml0IGluIHBhY2tldFxuIik7CisJCXJldHVybiBnc200OF90eF9tbV9zZXJ2X3Jlaihtc2ctPmxjaGFuLAorCQkJCQkgICAgR1NNNDhfUkVKRUNUX0lOQ09SUkVDVF9NRVNTQUdFKTsKKwl9CisKKwltaV90eXBlID0gbWlbMF0gJiBHU01fTUlfVFlQRV9NQVNLOworCWlmIChtaV90eXBlICE9IEdTTV9NSV9UWVBFX1RNU0kpIHsKKwkJREVCVUdQQyhETU0sICJtaV90eXBlIGlzIG5vdCBUTVNJOiAlZFxuIiwgbWlfdHlwZSk7CisJCXJldHVybiBnc200OF90eF9tbV9zZXJ2X3Jlaihtc2ctPmxjaGFuLAorCQkJCQkgICAgR1NNNDhfUkVKRUNUX0lOQ09SUkVDVF9NRVNTQUdFKTsKKwl9CisKKwlnc200OF9taV90b19zdHJpbmcobWlfc3RyaW5nLCBzaXplb2YobWlfc3RyaW5nKSwgbWksIG1pX2xlbik7CisJREVCVUdQQyhETU0sICJzZXJ2X3R5cGU9MHglMDJ4IG1pX3R5cGU9MHglMDJ4IE0oJXMpXG4iLAorCQlyZXEtPmNtX3NlcnZpY2VfdHlwZSwgbWlfdHlwZSwgbWlfc3RyaW5nKTsKKworCWRpc3BhdGNoX3NpZ25hbChTU19TVUJTQ1IsIFNfU1VCU0NSX0lERU5USVRZLCAoY2xhc3NtYXJrMiArIGNsYXNzbWFyazJfbGVuKSk7CisKKwlpZiAoaXNfc2llbWVuc19idHMoYnRzKSkKKwkJc2VuZF9zaWVtZW5zX21ycGNpKG1zZy0+bGNoYW4sIGNsYXNzbWFyazItMSk7CisKKwlzdWJzY3IgPSBzdWJzY3JfZ2V0X2J5X3Rtc2koYnRzLT5uZXR3b3JrLAorCQkJCSAgICB0bXNpX2Zyb21fc3RyaW5nKG1pX3N0cmluZykpOworCisJLyogRklYTUU6IGlmIHdlIGRvbid0IGtub3cgdGhlIFRNU0ksIGlucXVpcmUgYWJpdCBJTVNJIGFuZCBhbGxvY2F0ZSBuZXcgVE1TSSAqLworCWlmICghc3Vic2NyKQorCQlyZXR1cm4gZ3NtNDhfdHhfbW1fc2Vydl9yZWoobXNnLT5sY2hhbiwKKwkJCQkJICAgIEdTTTQ4X1JFSkVDVF9JTVNJX1VOS05PV05fSU5fSExSKTsKKworCWlmICghbXNnLT5sY2hhbi0+c3Vic2NyKQorCQltc2ctPmxjaGFuLT5zdWJzY3IgPSBzdWJzY3I7CisJZWxzZSBpZiAobXNnLT5sY2hhbi0+c3Vic2NyID09IHN1YnNjcikKKwkJc3Vic2NyX3B1dChzdWJzY3IpOyAvKiBsY2hhbiBhbHJlYWR5IGhhcyBhIHJlZiwgZG9uJ3QgbmVlZCBhbm90aGVyIG9uZSAqLworCWVsc2UgeworCQlERUJVR1AoRE1NLCAiPC0gQ00gQ2hhbm5lbCBhbHJlYWR5IG93bmVkIGJ5IHNvbWVvbmUgZWxzZT9cbiIpOworCQlzdWJzY3JfcHV0KHN1YnNjcik7CisJfQorCisJc3Vic2NyLT5lcXVpcG1lbnQuY2xhc3NtYXJrMl9sZW4gPSBjbGFzc21hcmsyX2xlbjsKKwltZW1jcHkoc3Vic2NyLT5lcXVpcG1lbnQuY2xhc3NtYXJrMiwgY2xhc3NtYXJrMiwgY2xhc3NtYXJrMl9sZW4pOworCWRiX3N5bmNfZXF1aXBtZW50KCZzdWJzY3ItPmVxdWlwbWVudCk7CisKKwlyZXR1cm4gZ3NtNDhfdHhfbW1fc2Vydl9hY2sobXNnLT5sY2hhbik7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfcnhfbW1faW1zaV9kZXRhY2hfaW5kKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IG1zZy0+bGNoYW4tPnRzLT50cngtPmJ0czsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwlzdHJ1Y3QgZ3NtNDhfaW1zaV9kZXRhY2hfaW5kICppZGkgPQorCQkJCShzdHJ1Y3QgZ3NtNDhfaW1zaV9kZXRhY2hfaW5kICopIGdoLT5kYXRhOworCXVfaW50OF90IG1pX3R5cGUgPSBpZGktPm1pWzBdICYgR1NNX01JX1RZUEVfTUFTSzsKKwljaGFyIG1pX3N0cmluZ1tHU000OF9NSV9TSVpFXTsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IE5VTEw7CisKKwlnc200OF9taV90b19zdHJpbmcobWlfc3RyaW5nLCBzaXplb2YobWlfc3RyaW5nKSwgaWRpLT5taSwgaWRpLT5taV9sZW4pOworCURFQlVHUChETU0sICJJTVNJIERFVEFDSCBJTkRJQ0FUSU9OOiBtaV90eXBlPTB4JTAyeCBNSSglcyk6ICIsCisJCW1pX3R5cGUsIG1pX3N0cmluZyk7CisKKwljb3VudGVyX2luYyhidHMtPm5ldHdvcmstPnN0YXRzLmxvY191cGRfdHlwZS5kZXRhY2gpOworCisJc3dpdGNoIChtaV90eXBlKSB7CisJY2FzZSBHU01fTUlfVFlQRV9UTVNJOgorCQlzdWJzY3IgPSBzdWJzY3JfZ2V0X2J5X3Rtc2koYnRzLT5uZXR3b3JrLAorCQkJCQkgICAgdG1zaV9mcm9tX3N0cmluZyhtaV9zdHJpbmcpKTsKKwkJYnJlYWs7CisJY2FzZSBHU01fTUlfVFlQRV9JTVNJOgorCQlzdWJzY3IgPSBzdWJzY3JfZ2V0X2J5X2ltc2koYnRzLT5uZXR3b3JrLCBtaV9zdHJpbmcpOworCQlicmVhazsKKwljYXNlIEdTTV9NSV9UWVBFX0lNRUk6CisJY2FzZSBHU01fTUlfVFlQRV9JTUVJU1Y6CisJCS8qIG5vIHNpbSBjYXJkLi4uIEZJWE1FOiB3aGF0IHRvIGRvID8gKi8KKwkJREVCVUdQQyhETU0sICJ1bmltcGxlbWVudGVkIG1vYmlsZSBpZGVudGl0eSB0eXBlXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoJCisJCURFQlVHUEMoRE1NLCAidW5rbm93biBtb2JpbGUgaWRlbnRpdHkgdHlwZVxuIik7CisJCWJyZWFrOworCX0KKworCWlmIChzdWJzY3IpIHsKKwkJc3Vic2NyX3VwZGF0ZShzdWJzY3IsIG1zZy0+dHJ4LT5idHMsCisJCQkJR1NNX1NVQlNDUklCRVJfVVBEQVRFX0RFVEFDSEVEKTsKKwkJREVCVUdQKERNTSwgIlN1YnNjcmliZXI6ICVzXG4iLCBzdWJzY3JfbmFtZShzdWJzY3IpKTsKKworCQlzdWJzY3ItPmVxdWlwbWVudC5jbGFzc21hcmsxID0gaWRpLT5jbGFzc21hcmsxOworCQlkYl9zeW5jX2VxdWlwbWVudCgmc3Vic2NyLT5lcXVpcG1lbnQpOworCisJCXN1YnNjcl9wdXQoc3Vic2NyKTsKKwl9IGVsc2UKKwkJREVCVUdQKERNTSwgIlVua25vd24gU3Vic2NyaWJlciA/IT9cbiIpOworCisJLyogRklYTUU6IGl0ZXJhdGUgb3ZlciBhbGwgdHJhbnNhY3Rpb25zIGFuZCByZWxlYXNlIHRoZW0sCisJICogaW1hZ2luZSBhbiBJTVNJIERFVEFDSCBoYXBwZW5pbmcgZHVyaW5nIGFuIGFjdGl2ZSBjYWxsISAqLworCisJLyogc3Vic2NyaWJlciBpcyBkZXRhY2hlZDogc2hvdWxkIHdlIHJlbGVhc2UgbGNoYW4/ICovCisJbGNoYW5fYXV0b19yZWxlYXNlKG1zZy0+bGNoYW4pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfcnhfbW1fc3RhdHVzKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisKKwlERUJVR1AoRE1NLCAiTU0gU1RBVFVTIChyZWplY3QgY2F1c2UgMHglMDJ4KVxuIiwgZ2gtPmRhdGFbMF0pOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFJlY2VpdmUgYSBHU00gMDQuMDggTW9iaWxpdHkgTWFuYWdlbWVudCAoTU0pIG1lc3NhZ2UgKi8KK3N0YXRpYyBpbnQgZ3NtMDQwOF9yY3ZfbW0oc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwlpbnQgcmMgPSAwOworCisJc3dpdGNoIChnaC0+bXNnX3R5cGUgJiAweGJmKSB7CisJY2FzZSBHU000OF9NVF9NTV9MT0NfVVBEX1JFUVVFU1Q6CisJCURFQlVHUChETU0sICJMT0NBVElPTiBVUERBVElORyBSRVFVRVNUOiAiKTsKKwkJcmMgPSBtbV9yeF9sb2NfdXBkX3JlcShtc2cpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X01UX01NX0lEX1JFU1A6CisJCXJjID0gbW1fcnhfaWRfcmVzcChtc2cpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X01UX01NX0NNX1NFUlZfUkVROgorCQlyYyA9IGdzbTQ4X3J4X21tX3NlcnZfcmVxKG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfTU1fU1RBVFVTOgorCQlyYyA9IGdzbTQ4X3J4X21tX3N0YXR1cyhtc2cpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X01UX01NX1RNU0lfUkVBTExfQ09NUEw6CisJCURFQlVHUChETU0sICJUTVNJIFJlYWxsb2NhdGlvbiBDb21wbGV0ZWQuIFN1YnNjcmliZXI6ICVzXG4iLAorCQkgICAgICAgbXNnLT5sY2hhbi0+c3Vic2NyID8KKwkJCQlzdWJzY3JfbmFtZShtc2ctPmxjaGFuLT5zdWJzY3IpIDoKKwkJCQkidW5rbm93biBzdWJzY3JpYmVyIik7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfTU1fSU1TSV9ERVRBQ0hfSU5EOgorCQlyYyA9IGdzbTQ4X3J4X21tX2ltc2lfZGV0YWNoX2luZChtc2cpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X01UX01NX0NNX1JFRVNUX1JFUToKKwkJREVCVUdQKERNTSwgIkNNIFJFRVNUQUJMSVNIIFJFUVVFU1Q6IE5vdCBpbXBsZW1lbnRlZFxuIik7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfTU1fQVVUSF9SRVNQOgorCQlERUJVR1AoRE1NLCAiQVVUSEVOVElDQVRJT04gUkVTUE9OU0U6IE5vdCBpbXBsZW1lbnRlZFxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRE1NLCBMT0dMX05PVElDRSwgIlVua25vd24gR1NNIDA0LjA4IE1NIG1zZyB0eXBlIDB4JTAyeFxuIiwKKwkJCWdoLT5tc2dfdHlwZSk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KKworLyogUmVjZWl2ZSBhIFBBR0lORyBSRVNQT05TRSBtZXNzYWdlIGZyb20gdGhlIE1TICovCitzdGF0aWMgaW50IGdzbTQ4X3J4X3JyX3BhZ19yZXNwKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IG1zZy0+bGNoYW4tPnRzLT50cngtPmJ0czsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwl1X2ludDhfdCAqY2xhc3NtYXJrMl9sdiA9IGdoLT5kYXRhICsgMTsKKwl1X2ludDhfdCBtaV90eXBlOworCWNoYXIgbWlfc3RyaW5nW0dTTTQ4X01JX1NJWkVdOworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gTlVMTDsKKwlpbnQgcmMgPSAwOworCisJZ3NtNDhfcGFnaW5nX2V4dHJhY3RfbWkobXNnLCBtaV9zdHJpbmcsICZtaV90eXBlKTsKKwlERUJVR1AoRFJSLCAiUEFHSU5HIFJFU1BPTlNFOiBtaV90eXBlPTB4JTAyeCBNSSglcylcbiIsCisJCW1pX3R5cGUsIG1pX3N0cmluZyk7CisKKwlzd2l0Y2ggKG1pX3R5cGUpIHsKKwljYXNlIEdTTV9NSV9UWVBFX1RNU0k6CisJCXN1YnNjciA9IHN1YnNjcl9nZXRfYnlfdG1zaShidHMtPm5ldHdvcmssCisJCQkJCSAgICB0bXNpX2Zyb21fc3RyaW5nKG1pX3N0cmluZykpOworCQlicmVhazsKKwljYXNlIEdTTV9NSV9UWVBFX0lNU0k6CisJCXN1YnNjciA9IHN1YnNjcl9nZXRfYnlfaW1zaShidHMtPm5ldHdvcmssIG1pX3N0cmluZyk7CisJCWJyZWFrOworCX0KKworCWlmICghc3Vic2NyKSB7CisJCURFQlVHUChEUlIsICI8LSBDYW4ndCBmaW5kIGFueSBzdWJzY3JpYmVyIGZvciB0aGlzIElEXG4iKTsKKwkJLyogRklYTUU6IHJlcXVlc3QgaWQ/IGNsb3NlIGNoYW5uZWw/ICovCisJCXJldHVybiAtRUlOVkFMOworCX0KKwlERUJVR1AoRFJSLCAiPC0gQ2hhbm5lbCB3YXMgcmVxdWVzdGVkIGJ5ICVzXG4iLAorCQlzdWJzY3ItPm5hbWUgJiYgc3RybGVuKHN1YnNjci0+bmFtZSkgPyBzdWJzY3ItPm5hbWUgOiBzdWJzY3ItPmltc2kpOworCisJc3Vic2NyLT5lcXVpcG1lbnQuY2xhc3NtYXJrMl9sZW4gPSAqY2xhc3NtYXJrMl9sdjsKKwltZW1jcHkoc3Vic2NyLT5lcXVpcG1lbnQuY2xhc3NtYXJrMiwgY2xhc3NtYXJrMl9sdisxLCAqY2xhc3NtYXJrMl9sdik7CisJZGJfc3luY19lcXVpcG1lbnQoJnN1YnNjci0+ZXF1aXBtZW50KTsKKworCXJjID0gZ3NtNDhfaGFuZGxlX3BhZ2luZ19yZXNwKG1zZywgc3Vic2NyKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfcnhfcnJfY2xhc3NtYXJrKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IgPSBtc2ctPmxjaGFuLT5zdWJzY3I7CisJdW5zaWduZWQgaW50IHBheWxvYWRfbGVuID0gbXNnYl9sM2xlbihtc2cpIC0gc2l6ZW9mKCpnaCk7CisJdV9pbnQ4X3QgY20yX2xlbiwgY20zX2xlbiA9IDA7CisJdV9pbnQ4X3QgKmNtMiwgKmNtMyA9IE5VTEw7CisKKwlERUJVR1AoRFJSLCAiQ0xBU1NNQVJLIENIQU5HRSAiKTsKKworCS8qIGNsYXNzbWFyayAyICovCisJY20yX2xlbiA9IGdoLT5kYXRhWzBdOworCWNtMiA9ICZnaC0+ZGF0YVsxXTsKKwlERUJVR1BDKERSUiwgIkNNMihsZW49JXUpICIsIGNtMl9sZW4pOworCisJaWYgKHBheWxvYWRfbGVuID4gY20yX2xlbiArIDEpIHsKKwkJLyogd2UgbXVzdCBoYXZlIGEgY2xhc3NtYXJrMyAqLworCQlpZiAoZ2gtPmRhdGFbY20yX2xlbisxXSAhPSAweDIwKSB7CisJCQlERUJVR1BDKERSUiwgIkVSUiBDTTMgVEFHXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmIChjbTJfbGVuID4gMykgeworCQkJREVCVUdQQyhEUlIsICJDTTIgdG9vIGxvbmchXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCQorCQljbTNfbGVuID0gZ2gtPmRhdGFbY20yX2xlbisyXTsKKwkJY20zID0gJmdoLT5kYXRhW2NtMl9sZW4rM107CisJCWlmIChjbTNfbGVuID4gMTQpIHsKKwkJCURFQlVHUEMoRFJSLCAiQ00zIGxlbiAldSB0b28gbG9uZyFcbiIsIGNtM19sZW4pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJREVCVUdQQyhEUlIsICJDTTMobGVuPSV1KVxuIiwgY20zX2xlbik7CisJfQorCWlmIChzdWJzY3IpIHsKKwkJc3Vic2NyLT5lcXVpcG1lbnQuY2xhc3NtYXJrMl9sZW4gPSBjbTJfbGVuOworCQltZW1jcHkoc3Vic2NyLT5lcXVpcG1lbnQuY2xhc3NtYXJrMiwgY20yLCBjbTJfbGVuKTsKKwkJaWYgKGNtMykgeworCQkJc3Vic2NyLT5lcXVpcG1lbnQuY2xhc3NtYXJrM19sZW4gPSBjbTNfbGVuOworCQkJbWVtY3B5KHN1YnNjci0+ZXF1aXBtZW50LmNsYXNzbWFyazMsIGNtMywgY20zX2xlbik7CisJCX0KKwkJZGJfc3luY19lcXVpcG1lbnQoJnN1YnNjci0+ZXF1aXBtZW50KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnc200OF9yeF9ycl9zdGF0dXMoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKworCURFQlVHUChEUlIsICJTVEFUVVMgcnJfY2F1c2UgPSAlc1xuIiwgCisJCXJyX2NhdXNlX25hbWUoZ2gtPmRhdGFbMF0pKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdzbTQ4X3J4X3JyX21lYXNfcmVwKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbV9tZWFzX3JlcCAqbWVhc19yZXAgPSBsY2hhbl9uZXh0X21lYXNfcmVwKG1zZy0+bGNoYW4pOworCisJLyogVGhpcyBzaG91bGRuJ3QgYWN0dWFsbHkgZW5kIHVwIGhlcmUsIGFzIFJTTCB0cmVhdHMKKwkgKiBMMyBJbmZvIG9mIDA4LjU4IE1FQVNVUkVNRU5UIFJFUE9SVCBkaWZmZXJlbnQgYnkgY2FsbGluZworCSAqIGRpcmVjdGx5IGludG8gZ3NtNDhfcGFyc2VfbWVhc19yZXAgKi8KKwlERUJVR1AoRE1FQVMsICJESVJFQ1QgR1NNNDggTUVBU1VSRU1FTlQgUkVQT1JUID8hPyAiKTsKKwlnc200OF9wYXJzZV9tZWFzX3JlcChtZWFzX3JlcCwgbXNnKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdzbTQ4X3J4X3JyX2FwcF9pbmZvKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJdV9pbnQ4X3QgYXBkdV9pZF9mbGFnczsKKwl1X2ludDhfdCBhcGR1X2xlbjsKKwl1X2ludDhfdCAqYXBkdV9kYXRhOworCisJYXBkdV9pZF9mbGFncyA9IGdoLT5kYXRhWzBdOworCWFwZHVfbGVuID0gZ2gtPmRhdGFbMV07CisJYXBkdV9kYXRhID0gZ2gtPmRhdGErMjsKKwkKKwlERUJVR1AoRE5NLCAiUlggQVBQTElDQVRJT04gSU5GTyBpZC9mbGFncz0weCUwMnggYXBkdV9sZW49JXUgYXBkdT0lcyIsCisJCWFwZHVfaWRfZmxhZ3MsIGFwZHVfbGVuLCBoZXhkdW1wKGFwZHVfZGF0YSwgYXBkdV9sZW4pKTsKKworCXJldHVybiBkYl9hcGR1X2Jsb2Jfc3RvcmUobXNnLT5sY2hhbi0+c3Vic2NyLCBhcGR1X2lkX2ZsYWdzLCBhcGR1X2xlbiwgYXBkdV9kYXRhKTsKK30KKworLyogQ2hhcHRlciA5LjEuMTYgSGFuZG92ZXIgY29tcGxldGUgKi8KK3N0YXRpYyBpbnQgZ3NtNDhfcnhfcnJfaG9fY29tcGwoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKworCURFQlVHUChEUlIsICJIQU5ET1ZFUiBDT01QTEVURSBjYXVzZSA9ICVzXG4iLAorCQlycl9jYXVzZV9uYW1lKGdoLT5kYXRhWzBdKSk7CisKKwlkaXNwYXRjaF9zaWduYWwoU1NfTENIQU4sIFNfTENIQU5fSEFORE9WRVJfQ09NUEwsIG1zZy0+bGNoYW4pOworCS8qIEZJWE1FOiByZWxlYXNlIG9sZCBjaGFubmVsICovCisKKwlyZXR1cm4gMDsKK30KKworLyogQ2hhcHRlciA5LjEuMTcgSGFuZG92ZXIgRmFpbHVyZSAqLworc3RhdGljIGludCBnc200OF9yeF9ycl9ob19mYWlsKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisKKwlERUJVR1AoRFJSLCAiSEFORE9WRVIgRkFJTEVEIGNhdXNlID0gJXNcbiIsCisJCXJyX2NhdXNlX25hbWUoZ2gtPmRhdGFbMF0pKTsKKworCWRpc3BhdGNoX3NpZ25hbChTU19MQ0hBTiwgU19MQ0hBTl9IQU5ET1ZFUl9GQUlMLCBtc2ctPmxjaGFuKTsKKwkvKiBGSVhNRTogcmVsZWFzZSBhbGxvY2F0ZWQgbmV3IGNoYW5uZWwgKi8KKworCXJldHVybiAwOworfQorCisvKiBSZWNlaXZlIGEgR1NNIDA0LjA4IFJhZGlvIFJlc291cmNlIChSUikgbWVzc2FnZSAqLworc3RhdGljIGludCBnc20wNDA4X3Jjdl9ycihzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKGdoLT5tc2dfdHlwZSkgeworCWNhc2UgR1NNNDhfTVRfUlJfQ0xTTV9DSEc6CisJCXJjID0gZ3NtNDhfcnhfcnJfY2xhc3NtYXJrKG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfUlJfR1BSU19TVVNQX1JFUToKKwkJREVCVUdQKERSUiwgIkdSUFMgU1VTUEVORCBSRVFVRVNUXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9SUl9QQUdfUkVTUDoKKwkJcmMgPSBnc200OF9yeF9ycl9wYWdfcmVzcChtc2cpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X01UX1JSX0NIQU5fTU9ERV9NT0RJRl9BQ0s6CisJCXJjID0gZ3NtNDhfcnhfcnJfbW9kaWZfYWNrKG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfUlJfU1RBVFVTOgorCQlyYyA9IGdzbTQ4X3J4X3JyX3N0YXR1cyhtc2cpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X01UX1JSX01FQVNfUkVQOgorCQlyYyA9IGdzbTQ4X3J4X3JyX21lYXNfcmVwKG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfUlJfQVBQX0lORk86CisJCXJjID0gZ3NtNDhfcnhfcnJfYXBwX2luZm8obXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9SUl9DSVBIX01fQ09NUEw6CisJCURFQlVHUChEUlIsICJDSVBIRVJJTkcgTU9ERSBDT01QTEVURVxuIik7CisJCS8qIEZJWE1FOiBjaGVjayBmb3IgTUkgKGlmIGFueSkgKi8KKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9SUl9IQU5ET19DT01QTDoKKwkJcmMgPSBnc200OF9yeF9ycl9ob19jb21wbChtc2cpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X01UX1JSX0hBTkRPX0ZBSUw6CisJCXJjID0gZ3NtNDhfcnhfcnJfaG9fZmFpbChtc2cpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERSUiwgTE9HTF9OT1RJQ0UsICJVbmltcGxlbWVudGVkICIKKwkJCSJHU00gMDQuMDggUlIgbXNnIHR5cGUgMHglMDJ4XG4iLCBnaC0+bXNnX3R5cGUpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBnc200OF9zZW5kX3JyX2FwcF9pbmZvKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBhcGR1X2lkLAorCQkJICAgdV9pbnQ4X3QgYXBkdV9sZW4sIGNvbnN0IHVfaW50OF90ICphcGR1KQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2g7CisKKwltc2ctPmxjaGFuID0gbGNoYW47CisJCisJREVCVUdQKERSUiwgIlRYIEFQUExJQ0FUSU9OIElORk8gaWQ9MHglMDJ4LCBsZW49JXVcbiIsCisJCWFwZHVfaWQsIGFwZHVfbGVuKTsKKwkKKwlnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkgKyAyICsgYXBkdV9sZW4pOworCWdoLT5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX1JSOworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX1JSX0FQUF9JTkZPOworCWdoLT5kYXRhWzBdID0gYXBkdV9pZDsKKwlnaC0+ZGF0YVsxXSA9IGFwZHVfbGVuOworCW1lbWNweShnaC0+ZGF0YSsyLCBhcGR1LCBhcGR1X2xlbik7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIE5VTEwpOworfQorCisvKiBDYWxsIENvbnRyb2wgKi8KKworLyogVGhlIGVudGlyZSBjYWxsIGNvbnRyb2wgY29kZSBpcyB3cml0dGVuIGluIGFjY29yZGFuY2Ugd2l0aCBGaWd1cmUgNy4xMGMKKyAqIGZvciAndmVyeSBlYXJseSBhc3NpZ25tZW50JywgaS5lLiB3ZSBhbGxvY2F0ZSBhIFRDSC9GIGR1cmluZyBJTU1FRElBVEUKKyAqIEFTU0lHTiwgdGhlbiBmaXJzdCB1c2UgdGhhdCBUQ0gvRiBmb3Igc2lnbmFsbGluZyBhbmQgbGF0ZXIgTU9ERSBNT0RJRlkKKyAqIGl0IGZvciB2b2ljZSAqLworCitzdGF0aWMgdm9pZCBuZXdfY2Nfc3RhdGUoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIGludCBzdGF0ZSkKK3sKKwlpZiAoc3RhdGUgPiAzMSB8fCBzdGF0ZSA8IDApCisJCXJldHVybjsKKworCURFQlVHUChEQ0MsICJuZXcgc3RhdGUgJXMgLT4gJXNcbiIsCisJCWdzbTQ4X2NjX3N0YXRlX25hbWUodHJhbnMtPmNjLnN0YXRlKSwKKwkJZ3NtNDhfY2Nfc3RhdGVfbmFtZShzdGF0ZSkpOworCisJdHJhbnMtPmNjLnN0YXRlID0gc3RhdGU7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfc3RhdHVzKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCB2b2lkICphcmcpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCXVfaW50OF90ICpjYXVzZSwgKmNhbGxfc3RhdGU7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19TVEFUVVM7CisKKwljYXVzZSA9IG1zZ2JfcHV0KG1zZywgMyk7CisJY2F1c2VbMF0gPSAyOworCWNhdXNlWzFdID0gR1NNNDhfQ0FVU0VfQ1NfR1NNIHwgR1NNNDhfQ0FVU0VfTE9DX1VTRVI7CisJY2F1c2VbMl0gPSAweDgwIHwgMzA7CS8qIHJlc3BvbnNlIHRvIHN0YXR1cyBpbnF1aXJ5ICovCisKKwljYWxsX3N0YXRlID0gbXNnYl9wdXQobXNnLCAxKTsKKwljYWxsX3N0YXRlWzBdID0gMHhjMCB8IDB4MDA7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKK30KKworc3RhdGljIGludCBnc200OF90eF9zaW1wbGUoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sCisJCQkgICB1X2ludDhfdCBwZGlzYywgdV9pbnQ4X3QgbXNnX3R5cGUpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCisJbXNnLT5sY2hhbiA9IGxjaGFuOworCisJZ2gtPnByb3RvX2Rpc2NyID0gcGRpc2M7CisJZ2gtPm1zZ190eXBlID0gbXNnX3R5cGU7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBnc200OF9zdG9wX2NjX3RpbWVyKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zKQoreworCWlmIChic2NfdGltZXJfcGVuZGluZygmdHJhbnMtPmNjLnRpbWVyKSkgeworCQlERUJVR1AoRENDLCAic3RvcHBpbmcgcGVuZGluZyB0aW1lciBUJXhcbiIsIHRyYW5zLT5jYy5UY3VycmVudCk7CisJCWJzY19kZWxfdGltZXIoJnRyYW5zLT5jYy50aW1lcik7CisJCXRyYW5zLT5jYy5UY3VycmVudCA9IDA7CisJfQorfQorIAorc3RhdGljIGludCBtbmNjX3JlY3Ztc2coc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLAorCQkJaW50IG1zZ190eXBlLCBzdHJ1Y3QgZ3NtX21uY2MgKm1uY2MpCit7CisJc3RydWN0IG1zZ2IgKm1zZzsKKworCWlmICh0cmFucykKKwkJaWYgKHRyYW5zLT5sY2hhbikKKwkJCURFQlVHUChEQ0MsICIoYnRzICVkIHRyeCAlZCB0cyAlZCB0aSAleCBzdWIgJXMpICIKKwkJCQkiU2VuZGluZyAnJXMnIHRvIE1OQ0MuXG4iLAorCQkJCXRyYW5zLT5sY2hhbi0+dHMtPnRyeC0+YnRzLT5uciwKKwkJCQl0cmFucy0+bGNoYW4tPnRzLT50cngtPm5yLAorCQkJCXRyYW5zLT5sY2hhbi0+dHMtPm5yLCB0cmFucy0+dHJhbnNhY3Rpb25faWQsCisJCQkJKHRyYW5zLT5zdWJzY3IpPyh0cmFucy0+c3Vic2NyLT5leHRlbnNpb24pOiItIiwKKwkJCQlnZXRfbW5jY19uYW1lKG1zZ190eXBlKSk7CisJCWVsc2UKKwkJCURFQlVHUChEQ0MsICIoYnRzIC0gdHJ4IC0gdHMgLSB0aSAtLSBzdWIgJXMpICIKKwkJCQkiU2VuZGluZyAnJXMnIHRvIE1OQ0MuXG4iLAorCQkJCSh0cmFucy0+c3Vic2NyKT8odHJhbnMtPnN1YnNjci0+ZXh0ZW5zaW9uKToiLSIsCisJCQkJZ2V0X21uY2NfbmFtZShtc2dfdHlwZSkpOworCWVsc2UKKwkJREVCVUdQKERDQywgIihidHMgLSB0cnggLSB0cyAtIHRpIC0tIHN1YiAtKSAiCisJCQkiU2VuZGluZyAnJXMnIHRvIE1OQ0MuXG4iLCBnZXRfbW5jY19uYW1lKG1zZ190eXBlKSk7CisKKwltbmNjLT5tc2dfdHlwZSA9IG1zZ190eXBlOworCQorCW1zZyA9IG1zZ2JfYWxsb2Moc2l6ZW9mKHN0cnVjdCBnc21fbW5jYyksICJNTkNDIik7CisJaWYgKCFtc2cpCisJCXJldHVybiAtRU5PTUVNOworCW1lbWNweShtc2ctPmRhdGEsIG1uY2MsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwltc2diX2VucXVldWUoJm5ldC0+dXBxdWV1ZSwgbXNnKTsKKworCXJldHVybiAwOworfQorCitpbnQgbW5jY19yZWxlYXNlX2luZChzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgc3RydWN0IGdzbV90cmFucyAqdHJhbnMsCisJCSAgICAgdV9pbnQzMl90IGNhbGxyZWYsIGludCBsb2NhdGlvbiwgaW50IHZhbHVlKQoreworCXN0cnVjdCBnc21fbW5jYyByZWw7CisKKwltZW1zZXQoJnJlbCwgMCwgc2l6ZW9mKHJlbCkpOworCXJlbC5jYWxscmVmID0gY2FsbHJlZjsKKwltbmNjX3NldF9jYXVzZSgmcmVsLCBsb2NhdGlvbiwgdmFsdWUpOworCXJldHVybiBtbmNjX3JlY3Ztc2cobmV0LCB0cmFucywgTU5DQ19SRUxfSU5ELCAmcmVsKTsKK30KKworLyogQ2FsbCBDb250cm9sIFNwZWNpZmljIHRyYW5zYWN0aW9uIHJlbGVhc2UuCisgKiBnZXRzIGNhbGxlZCBieSB0cmFuc19mcmVlLCBETyBOT1QgQ0FMTCBZT1VSU0VMRiEgKi8KK3ZvaWQgX2dzbTQ4X2NjX3RyYW5zX2ZyZWUoc3RydWN0IGdzbV90cmFucyAqdHJhbnMpCit7CisJZ3NtNDhfc3RvcF9jY190aW1lcih0cmFucyk7CisKKwkvKiBzZW5kIHJlbGVhc2UgdG8gTDQsIGlmIGNhbGxyZWYgc3RpbGwgZXhpc3RzICovCisJaWYgKHRyYW5zLT5jYWxscmVmKSB7CisJCS8qIFJlc3NvdXJjZSB1bmF2YWlsYWJsZSAqLworCQltbmNjX3JlbGVhc2VfaW5kKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIHRyYW5zLT5jYWxscmVmLAorCQkJCSBHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUsCisJCQkJIEdTTTQ4X0NDX0NBVVNFX1JFU09VUkNFX1VOQVZBSUwpOworCX0KKwlpZiAodHJhbnMtPmNjLnN0YXRlICE9IEdTTV9DU1RBVEVfTlVMTCkKKwkJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX05VTEwpOworCWlmICh0cmFucy0+bGNoYW4pCisJCXRyYXVfbXV4X3VubWFwKCZ0cmFucy0+bGNoYW4tPnRzLT5lMV9saW5rLCB0cmFucy0+Y2FsbHJlZik7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfc2V0dXAoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZyk7CisgCisvKiBjYWxsLWJhY2sgZnJvbSBwYWdpbmcgdGhlIEItZW5kIG9mIHRoZSBjb25uZWN0aW9uICovCitzdGF0aWMgaW50IHNldHVwX3RyaWdfcGFnX2V2dCh1bnNpZ25lZCBpbnQgaG9va251bSwgdW5zaWduZWQgaW50IGV2ZW50LAorCQkJICAgICAgc3RydWN0IG1zZ2IgKm1zZywgdm9pZCAqX2xjaGFuLCB2b2lkICpwYXJhbSkKK3sKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IF9sY2hhbjsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IHBhcmFtOworCXN0cnVjdCBnc21fdHJhbnMgKnRyYW5zdCwgKnRtcDsKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldDsKKworCWlmIChob29rbnVtICE9IEdTTV9IT09LX1JSX1BBR0lORykKKwkJcmV0dXJuIC1FSU5WQUw7CisgIAorCWlmICghc3Vic2NyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwluZXQgPSBzdWJzY3ItPm5ldDsKKwlpZiAoIW5ldCkgeworCQlERUJVR1AoRENDLCAiRXJyb3IgTmV0d29yayBub3Qgc2V0IVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGNoZWNrIGFsbCB0cmFuYWN0aW9ucyAod2l0aG91dCBsY2hhbikgZm9yIHN1YnNjcmliZXIgKi8KKwlsbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHRyYW5zdCwgdG1wLCAmbmV0LT50cmFuc19saXN0LCBlbnRyeSkgeworCQlpZiAodHJhbnN0LT5zdWJzY3IgIT0gc3Vic2NyIHx8IHRyYW5zdC0+bGNoYW4pCisJCQljb250aW51ZTsKKwkJc3dpdGNoIChldmVudCkgeworCQljYXNlIEdTTV9QQUdJTkdfU1VDQ0VFREVEOgorCQkJaWYgKCFsY2hhbikgLy8gcGFyYW5vaWQKKwkJCQlicmVhazsKKwkJCURFQlVHUChEQ0MsICJQYWdpbmcgc3Vic2NyICVzIHN1Y2NlZWRlZCFcbiIsCisJCQkJc3Vic2NyLT5leHRlbnNpb24pOworCQkJLyogQXNzaWduIGxjaGFuICovCisJCQlpZiAoIXRyYW5zdC0+bGNoYW4pIHsKKwkJCQl0cmFuc3QtPmxjaGFuID0gbGNoYW47CisJCQkJdXNlX2xjaGFuKGxjaGFuKTsKKwkJCX0KKwkJCS8qIHNlbmQgU0VUVVAgcmVxdWVzdCB0byBjYWxsZWQgcGFydHkgKi8KKwkJCWdzbTQ4X2NjX3R4X3NldHVwKHRyYW5zdCwgJnRyYW5zdC0+Y2MubXNnKTsKKwkJCWJyZWFrOworCQljYXNlIEdTTV9QQUdJTkdfRVhQSVJFRDoKKwkJCURFQlVHUChEQ0MsICJQYWdpbmcgc3Vic2NyICVzIGV4cGlyZWQhXG4iLAorCQkJCXN1YnNjci0+ZXh0ZW5zaW9uKTsKKwkJCS8qIFRlbXBvcmFyaWx5IG91dCBvZiBvcmRlciAqLworCQkJbW5jY19yZWxlYXNlX2luZCh0cmFuc3QtPnN1YnNjci0+bmV0LCB0cmFuc3QsCisJCQkJCSB0cmFuc3QtPmNhbGxyZWYsCisJCQkJCSBHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUsCisJCQkJCSBHU000OF9DQ19DQVVTRV9ERVNUX09PTyk7CisJCQl0cmFuc3QtPmNhbGxyZWYgPSAwOworCQkJdHJhbnNfZnJlZSh0cmFuc3QpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGNoX3JlY3ZfbW5jYyhzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgdV9pbnQzMl90IGNhbGxyZWYsIGludCBlbmFibGUpOworCisvKiBzb21lIG90aGVyIHBhcnQgb2YgdGhlIGNvZGUgc2VuZHMgdXMgYSBzaWduYWwgKi8KK3N0YXRpYyBpbnQgaGFuZGxlX2FiaXNpcF9zaWduYWwodW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IHNpZ25hbCwKKwkJCQkgdm9pZCAqaGFuZGxlcl9kYXRhLCB2b2lkICpzaWduYWxfZGF0YSkKK3sKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IHNpZ25hbF9kYXRhOworCWludCByYzsKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldDsKKwlzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuczsKKworCWlmIChzdWJzeXMgIT0gU1NfQUJJU0lQKQorCQlyZXR1cm4gMDsKKworCS8qIGluIGNhc2Ugd2UgdXNlIGRpcmVjdCBCVFMtdG8tQlRTIFJUUCAqLworCWlmIChpcGFjY19ydHBfZGlyZWN0KQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAoc2lnbmFsKSB7CisJY2FzZSBTX0FCSVNJUF9DUkNYX0FDSzoKKwkJLyogY2hlY2sgaWYgYW55IHRyYW5zYWN0aW9ucyBvbiB0aGlzIGxjaGFuIHN0aWxsIGhhdmUKKwkJICogYSB0Y2hfcmVjdl9tbmNjIHJlcXVlc3QgcGVuZGluZyAqLworCQluZXQgPSBsY2hhbi0+dHMtPnRyeC0+YnRzLT5uZXR3b3JrOworCQlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0cmFucywgJm5ldC0+dHJhbnNfbGlzdCwgZW50cnkpIHsKKwkJCWlmICh0cmFucy0+bGNoYW4gPT0gbGNoYW4gJiYgdHJhbnMtPnRjaF9yZWN2KSB7CisJCQkJREVCVUdQKERDQywgInBlbmRpbmcgdGNoX3JlY3ZfbW5jYyByZXF1ZXN0XG4iKTsKKwkJCQl0Y2hfcmVjdl9tbmNjKG5ldCwgdHJhbnMtPmNhbGxyZWYsIDEpOworCQkJfQorCQl9CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCisvKiBtYXAgdHdvIGlwYWNjZXNzIFJUUCBzdHJlYW1zIG9udG8gZWFjaCBvdGhlciAqLworc3RhdGljIGludCB0Y2hfbWFwKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCBzdHJ1Y3QgZ3NtX2xjaGFuICpyZW1vdGVfbGNoYW4pCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IGxjaGFuLT50cy0+dHJ4LT5idHM7CisJc3RydWN0IGdzbV9idHMgKnJlbW90ZV9idHMgPSByZW1vdGVfbGNoYW4tPnRzLT50cngtPmJ0czsKKwlpbnQgcmM7CisKKwlERUJVR1AoRENDLCAiU2V0dGluZyB1cCBUQ0ggbWFwIGJldHdlZW4gKGJ0cz0ldSx0cng9JXUsdHM9JXUpIGFuZCAoYnRzPSV1LHRyeD0ldSx0cz0ldSlcbiIsCisJCWJ0cy0+bnIsIGxjaGFuLT50cy0+dHJ4LT5uciwgbGNoYW4tPnRzLT5uciwKKwkJcmVtb3RlX2J0cy0+bnIsIHJlbW90ZV9sY2hhbi0+dHMtPnRyeC0+bnIsIHJlbW90ZV9sY2hhbi0+dHMtPm5yKTsKKworCWlmIChidHMtPnR5cGUgIT0gcmVtb3RlX2J0cy0+dHlwZSkgeworCQlERUJVR1AoRENDLCAiQ2Fubm90IHN3aXRjaCBjYWxscyBiZXR3ZWVuIGRpZmZlcmVudCBCVFMgdHlwZXMgeWV0XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLy8gdG9kbzogbWFwIGJldHdlZW4gZGlmZmVyZW50IGJ0cyB0eXBlcworCXN3aXRjaCAoYnRzLT50eXBlKSB7CisJY2FzZSBHU01fQlRTX1RZUEVfTkFOT0JUUzoKKwkJaWYgKCFpcGFjY19ydHBfZGlyZWN0KSB7CisJCQkvKiBjb25uZWN0IHRoZSBUQ0gncyB0byBvdXIgUlRQIHByb3h5ICovCisJCQlyYyA9IHJzbF9pcGFjY19tZGN4X3RvX3J0cHNvY2sobGNoYW4pOworCQkJaWYgKHJjIDwgMCkKKwkJCQlyZXR1cm4gcmM7CisJCQlyYyA9IHJzbF9pcGFjY19tZGN4X3RvX3J0cHNvY2socmVtb3RlX2xjaGFuKTsKKyN3YXJuaW5nIGRvIHdlIG5lZWQgYSBjaGVjayBvZiByYyBoZXJlPworCisJCQkvKiBjb25uZWN0IHRoZW0gd2l0aCBlYWNoIG90aGVyICovCisJCQlydHBfc29ja2V0X3Byb3h5KGxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQsCisJCQkJCSByZW1vdGVfbGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCk7CisJCX0gZWxzZSB7CisJCQkvKiBkaXJlY3RseSBjb25uZWN0IFRDSCBSVFAgc3RyZWFtcyB0byBlYWNoIG90aGVyICovCisJCQlyYyA9IHJzbF9pcGFjY19tZGN4KGxjaGFuLCByZW1vdGVfbGNoYW4tPmFiaXNfaXAuYm91bmRfaXAsCisJCQkJCQlyZW1vdGVfbGNoYW4tPmFiaXNfaXAuYm91bmRfcG9ydCwKKwkJCQkJCXJlbW90ZV9sY2hhbi0+YWJpc19pcC5ydHBfcGF5bG9hZDIpOworCQkJaWYgKHJjIDwgMCkKKwkJCQlyZXR1cm4gcmM7CisJCQlyYyA9IHJzbF9pcGFjY19tZGN4KHJlbW90ZV9sY2hhbiwgbGNoYW4tPmFiaXNfaXAuYm91bmRfaXAsCisJCQkJCQlsY2hhbi0+YWJpc19pcC5ib3VuZF9wb3J0LAorCQkJCQkJbGNoYW4tPmFiaXNfaXAucnRwX3BheWxvYWQyKTsKKwkJfQorCQlicmVhazsKKwljYXNlIEdTTV9CVFNfVFlQRV9CUzExOgorCQl0cmF1X211eF9tYXBfbGNoYW4obGNoYW4sIHJlbW90ZV9sY2hhbik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURFQlVHUChEQ0MsICJVbmtub3duIEJUUyB0eXBlICV1XG4iLCBidHMtPnR5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogYnJpZGdlIGNoYW5uZWxzIG9mIHR3byB0cmFuc2FjdGlvbnMgKi8KK3N0YXRpYyBpbnQgdGNoX2JyaWRnZShzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgdV9pbnQzMl90ICpyZWZzKQoreworCXN0cnVjdCBnc21fdHJhbnMgKnRyYW5zMSA9IHRyYW5zX2ZpbmRfYnlfY2FsbHJlZihuZXQsIHJlZnNbMF0pOworCXN0cnVjdCBnc21fdHJhbnMgKnRyYW5zMiA9IHRyYW5zX2ZpbmRfYnlfY2FsbHJlZihuZXQsIHJlZnNbMV0pOworCisJaWYgKCF0cmFuczEgfHwgIXRyYW5zMikKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoIXRyYW5zMS0+bGNoYW4gfHwgIXRyYW5zMi0+bGNoYW4pCisJCXJldHVybiAtRUlPOworCisJLyogdGhyb3VnaC1jb25uZWN0IGNoYW5uZWwgKi8KKwlyZXR1cm4gdGNoX21hcCh0cmFuczEtPmxjaGFuLCB0cmFuczItPmxjaGFuKTsKK30KKworLyogZW5hYmxlIHJlY2VpdmUgb2YgY2hhbm5lbHMgdG8gTU5DQyB1cHF1ZXVlICovCitzdGF0aWMgaW50IHRjaF9yZWN2X21uY2Moc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIHVfaW50MzJfdCBjYWxscmVmLCBpbnQgZW5hYmxlKQoreworCXN0cnVjdCBnc21fdHJhbnMgKnRyYW5zOworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuOworCXN0cnVjdCBnc21fYnRzICpidHM7CisJaW50IHJjOworCisJLyogRmluZCBjYWxscmVmICovCisJdHJhbnMgPSB0cmFuc19maW5kX2J5X2NhbGxyZWYobmV0LCBjYWxscmVmKTsKKwlpZiAoIXRyYW5zKQorCQlyZXR1cm4gLUVJTzsKKwlpZiAoIXRyYW5zLT5sY2hhbikKKwkJcmV0dXJuIDA7CisJbGNoYW4gPSB0cmFucy0+bGNoYW47CisJYnRzID0gbGNoYW4tPnRzLT50cngtPmJ0czsKKworCXN3aXRjaCAoYnRzLT50eXBlKSB7CisJY2FzZSBHU01fQlRTX1RZUEVfTkFOT0JUUzoKKwkJaWYgKGlwYWNjX3J0cF9kaXJlY3QpIHsKKwkJCURFQlVHUChEQ0MsICJFcnJvcjogUlRQIHByb3h5IGlzIGRpc2FibGVkXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCS8qIGluIGNhc2UsIHdlIGRvbid0IGhhdmUgYSBSVFAgc29ja2V0IHlldCwgd2Ugbm90ZSB0aGlzCisJCSAqIGluIHRoZSB0cmFuc2FjdGlvbiBhbmQgdHJ5IGxhdGVyICovCisJCWlmICghbGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCkgeworCQkJdHJhbnMtPnRjaF9yZWN2ID0gZW5hYmxlOworCQkJREVCVUdQKERDQywgInF1ZXVlIHRjaF9yZWN2X21uY2MgcmVxdWVzdCAoJWQpXG4iLCBlbmFibGUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKGVuYWJsZSkgeworCQkJLyogY29ubmVjdCB0aGUgVENIJ3MgdG8gb3VyIFJUUCBwcm94eSAqLworCQkJcmMgPSByc2xfaXBhY2NfbWRjeF90b19ydHBzb2NrKGxjaGFuKTsKKwkJCWlmIChyYyA8IDApCisJCQkJcmV0dXJuIHJjOworCQkJLyogYXNzaWduIHNvY2tldCB0byBhcHBsaWNhdGlvbiBpbnRlcmZhY2UgKi8KKwkJCXJ0cF9zb2NrZXRfdXBzdHJlYW0obGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCwKKwkJCQluZXQsIGNhbGxyZWYpOworCQl9IGVsc2UKKwkJCXJ0cF9zb2NrZXRfdXBzdHJlYW0obGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCwKKwkJCQluZXQsIDApOworCQlicmVhazsKKwljYXNlIEdTTV9CVFNfVFlQRV9CUzExOgorCQlpZiAoZW5hYmxlKQorCQkJcmV0dXJuIHRyYXVfcmVjdl9sY2hhbihsY2hhbiwgY2FsbHJlZik7CisJCXJldHVybiB0cmF1X211eF91bm1hcChOVUxMLCBjYWxscmVmKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJREVCVUdQKERDQywgIlVua25vd24gQlRTIHR5cGUgJXVcbiIsIGJ0cy0+dHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X3N0YXR1c19lbnEoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCit7CisJREVCVUdQKERDQywgIi0+IFNUQVRVUyBFTlFcbiIpOworCXJldHVybiBnc200OF9jY190eF9zdGF0dXModHJhbnMsIG1zZyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfcmVsZWFzZShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKTsKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfZGlzY29ubmVjdChzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKTsKKworc3RhdGljIHZvaWQgZ3NtNDhfY2NfdGltZW91dCh2b2lkICphcmcpCit7CisJc3RydWN0IGdzbV90cmFucyAqdHJhbnMgPSBhcmc7CisJaW50IGRpc2Nvbm5lY3QgPSAwLCByZWxlYXNlID0gMDsKKwlpbnQgbW9fY2F1c2UgPSBHU000OF9DQ19DQVVTRV9SRUNPVkVSWV9USU1FUjsKKwlpbnQgbW9fbG9jYXRpb24gPSBHU000OF9DQVVTRV9MT0NfVVNFUjsKKwlpbnQgbDRfY2F1c2UgPSBHU000OF9DQ19DQVVTRV9OT1JNQUxfVU5TUEVDOworCWludCBsNF9sb2NhdGlvbiA9IEdTTTQ4X0NBVVNFX0xPQ19QUk5fU19MVTsKKwlzdHJ1Y3QgZ3NtX21uY2MgbW9fcmVsLCBsNF9yZWw7CisKKwltZW1zZXQoJm1vX3JlbCwgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCW1vX3JlbC5jYWxscmVmID0gdHJhbnMtPmNhbGxyZWY7CisJbWVtc2V0KCZsNF9yZWwsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwlsNF9yZWwuY2FsbHJlZiA9IHRyYW5zLT5jYWxscmVmOworCisJc3dpdGNoKHRyYW5zLT5jYy5UY3VycmVudCkgeworCWNhc2UgMHgzMDM6CisJCXJlbGVhc2UgPSAxOworCQlsNF9jYXVzZSA9IEdTTTQ4X0NDX0NBVVNFX1VTRVJfTk9UUkVTUE9ORDsKKwkJYnJlYWs7CisJY2FzZSAweDMxMDoKKwkJZGlzY29ubmVjdCA9IDE7CisJCWw0X2NhdXNlID0gR1NNNDhfQ0NfQ0FVU0VfVVNFUl9OT1RSRVNQT05EOworCQlicmVhazsKKwljYXNlIDB4MzEzOgorCQlkaXNjb25uZWN0ID0gMTsKKwkJLyogdW5rbm93biwgZGlkIG5vdCBmaW5kIGl0IGluIHRoZSBzcGVjcyAqLworCQlicmVhazsKKwljYXNlIDB4MzAxOgorCQlkaXNjb25uZWN0ID0gMTsKKwkJbDRfY2F1c2UgPSBHU000OF9DQ19DQVVTRV9VU0VSX05PVFJFU1BPTkQ7CisJCWJyZWFrOworCWNhc2UgMHgzMDg6CisJCWlmICghdHJhbnMtPmNjLlQzMDhfc2Vjb25kKSB7CisJCQkvKiByZXN0YXJ0IFQzMDggYSBzZWNvbmQgdGltZSAqLworCQkJZ3NtNDhfY2NfdHhfcmVsZWFzZSh0cmFucywgJnRyYW5zLT5jYy5tc2cpOworCQkJdHJhbnMtPmNjLlQzMDhfc2Vjb25kID0gMTsKKwkJCWJyZWFrOyAvKiBzdGF5IGluIHJlbGVhc2Ugc3RhdGUgKi8KKwkJfQorCQl0cmFuc19mcmVlKHRyYW5zKTsKKwkJcmV0dXJuOworLy8JCXJlbGVhc2UgPSAxOworLy8JCWw0X2NhdXNlID0gMTQ7CisvLwkJYnJlYWs7CisJY2FzZSAweDMwNjoKKwkJcmVsZWFzZSA9IDE7CisJCW1vX2NhdXNlID0gdHJhbnMtPmNjLm1zZy5jYXVzZS52YWx1ZTsKKwkJbW9fbG9jYXRpb24gPSB0cmFucy0+Y2MubXNnLmNhdXNlLmxvY2F0aW9uOworCQlicmVhazsKKwljYXNlIDB4MzIzOgorCQlkaXNjb25uZWN0ID0gMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmVsZWFzZSA9IDE7CisJfQorCisJaWYgKHJlbGVhc2UgJiYgdHJhbnMtPmNhbGxyZWYpIHsKKwkJLyogcHJvY2VzcyByZWxlYXNlIHRvd2FyZHMgbGF5ZXIgNCAqLworCQltbmNjX3JlbGVhc2VfaW5kKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIHRyYW5zLT5jYWxscmVmLAorCQkJCSBsNF9sb2NhdGlvbiwgbDRfY2F1c2UpOworCQl0cmFucy0+Y2FsbHJlZiA9IDA7CisJfQorCisJaWYgKGRpc2Nvbm5lY3QgJiYgdHJhbnMtPmNhbGxyZWYpIHsKKwkJLyogcHJvY2VzcyBkaXNjb25uZWN0IHRvd2FyZHMgbGF5ZXIgNCAqLworCQltbmNjX3NldF9jYXVzZSgmbDRfcmVsLCBsNF9sb2NhdGlvbiwgbDRfY2F1c2UpOworCQltbmNjX3JlY3Ztc2codHJhbnMtPnN1YnNjci0+bmV0LCB0cmFucywgTU5DQ19ESVNDX0lORCwgJmw0X3JlbCk7CisJfQorCisJLyogcHJvY2VzcyBkaXNjb25uZWN0IHRvd2FyZHMgbW9iaWxlIHN0YXRpb24gKi8KKwlpZiAoZGlzY29ubmVjdCB8fCByZWxlYXNlKSB7CisJCW1uY2Nfc2V0X2NhdXNlKCZtb19yZWwsIG1vX2xvY2F0aW9uLCBtb19jYXVzZSk7CisJCW1vX3JlbC5jYXVzZS5kaWFnWzBdID0gKCh0cmFucy0+Y2MuVGN1cnJlbnQgJiAweGYwMCkgPj4gOCkgKyAnMCc7CisJCW1vX3JlbC5jYXVzZS5kaWFnWzFdID0gKCh0cmFucy0+Y2MuVGN1cnJlbnQgJiAweDBmMCkgPj4gNCkgKyAnMCc7CisJCW1vX3JlbC5jYXVzZS5kaWFnWzJdID0gKHRyYW5zLT5jYy5UY3VycmVudCAmIDB4MDBmKSArICcwJzsKKwkJbW9fcmVsLmNhdXNlLmRpYWdfbGVuID0gMzsKKworCQlpZiAoZGlzY29ubmVjdCkKKwkJCWdzbTQ4X2NjX3R4X2Rpc2Nvbm5lY3QodHJhbnMsICZtb19yZWwpOworCQlpZiAocmVsZWFzZSkKKwkJCWdzbTQ4X2NjX3R4X3JlbGVhc2UodHJhbnMsICZtb19yZWwpOworCX0KKworfQorCitzdGF0aWMgdm9pZCBnc200OF9zdGFydF9jY190aW1lcihzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgaW50IGN1cnJlbnQsCisJCQkJIGludCBzZWMsIGludCBtaWNybykKK3sKKwlERUJVR1AoRENDLCAic3RhcnRpbmcgdGltZXIgVCV4IHdpdGggJWQgc2Vjb25kc1xuIiwgY3VycmVudCwgc2VjKTsKKwl0cmFucy0+Y2MudGltZXIuY2IgPSBnc200OF9jY190aW1lb3V0OworCXRyYW5zLT5jYy50aW1lci5kYXRhID0gdHJhbnM7CisJYnNjX3NjaGVkdWxlX3RpbWVyKCZ0cmFucy0+Y2MudGltZXIsIHNlYywgbWljcm8pOworCXRyYW5zLT5jYy5UY3VycmVudCA9IGN1cnJlbnQ7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2Nfcnhfc2V0dXAoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJdV9pbnQ4X3QgbXNnX3R5cGUgPSBnaC0+bXNnX3R5cGUgJiAweGJmOworCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbiA9IG1zZ2JfbDNsZW4obXNnKSAtIHNpemVvZigqZ2gpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXN0cnVjdCBnc21fbW5jYyBzZXR1cDsKKworCW1lbXNldCgmc2V0dXAsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwlzZXR1cC5jYWxscmVmID0gdHJhbnMtPmNhbGxyZWY7CisJdGx2X3BhcnNlKCZ0cCwgJmdzbTQ4X2F0dF90bHZkZWYsIGdoLT5kYXRhLCBwYXlsb2FkX2xlbiwgMCwgMCk7CisJLyogZW1lcmdlbmN5IHNldHVwIGlzIGlkZW50aWZpZWQgYnkgbXNnX3R5cGUgKi8KKwlpZiAobXNnX3R5cGUgPT0gR1NNNDhfTVRfQ0NfRU1FUkdfU0VUVVApCisJCXNldHVwLmVtZXJnZW5jeSA9IDE7CisKKwkvKiB1c2Ugc3Vic2NyaWJlciBhcyBjYWxsaW5nIHBhcnR5IG51bWJlciAqLworCWlmICh0cmFucy0+c3Vic2NyKSB7CisJCXNldHVwLmZpZWxkcyB8PSBNTkNDX0ZfQ0FMTElORzsKKwkJc3RybmNweShzZXR1cC5jYWxsaW5nLm51bWJlciwgdHJhbnMtPnN1YnNjci0+ZXh0ZW5zaW9uLAorCQkJc2l6ZW9mKHNldHVwLmNhbGxpbmcubnVtYmVyKS0xKTsKKwkJc3RybmNweShzZXR1cC5pbXNpLCB0cmFucy0+c3Vic2NyLT5pbXNpLAorCQkJc2l6ZW9mKHNldHVwLmltc2kpLTEpOworCX0KKwkvKiBiZWFyZXIgY2FwYWJpbGl0eSAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9CRUFSRVJfQ0FQKSkgeworCQlzZXR1cC5maWVsZHMgfD0gTU5DQ19GX0JFQVJFUl9DQVA7CisJCWdzbTQ4X2RlY29kZV9iZWFyZXJfY2FwKCZzZXR1cC5iZWFyZXJfY2FwLAorCQkJCSAgVExWUF9WQUwoJnRwLCBHU000OF9JRV9CRUFSRVJfQ0FQKS0xKTsKKwl9CisJLyogZmFjaWxpdHkgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfRkFDSUxJVFkpKSB7CisJCXNldHVwLmZpZWxkcyB8PSBNTkNDX0ZfRkFDSUxJVFk7CisJCWdzbTQ4X2RlY29kZV9mYWNpbGl0eSgmc2V0dXAuZmFjaWxpdHksCisJCQkJVExWUF9WQUwoJnRwLCBHU000OF9JRV9GQUNJTElUWSktMSk7CisJfQorCS8qIGNhbGxlZCBwYXJ0eSBiY2QgbnVtYmVyICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0NBTExFRF9CQ0QpKSB7CisJCXNldHVwLmZpZWxkcyB8PSBNTkNDX0ZfQ0FMTEVEOworCQlnc200OF9kZWNvZGVfY2FsbGVkKCZzZXR1cC5jYWxsZWQsCisJCQkgICAgICBUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX0NBTExFRF9CQ0QpLTEpOworCX0KKwkvKiB1c2VyLXVzZXIgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfVVNFUl9VU0VSKSkgeworCQlzZXR1cC5maWVsZHMgfD0gTU5DQ19GX1VTRVJVU0VSOworCQlnc200OF9kZWNvZGVfdXNlcnVzZXIoJnNldHVwLnVzZXJ1c2VyLAorCQkJCVRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfVVNFUl9VU0VSKS0xKTsKKwl9CisJLyogc3MtdmVyc2lvbiAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9TU19WRVJTKSkgeworCQlzZXR1cC5maWVsZHMgfD0gTU5DQ19GX1NTVkVSU0lPTjsKKwkJZ3NtNDhfZGVjb2RlX3NzdmVyc2lvbigmc2V0dXAuc3N2ZXJzaW9uLAorCQkJCSBUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX1NTX1ZFUlMpLTEpOworCX0KKwkvKiBDTElSIHN1cHByZXNzaW9uICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0NMSVJfU1VQUCkpCisJCXNldHVwLmNsaXIuc3VwID0gMTsKKwkvKiBDTElSIGludm9jYXRpb24gKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfQ0xJUl9JTlZPQykpCisJCXNldHVwLmNsaXIuaW52ID0gMTsKKwkvKiBjYyBjYXAgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfQ0NfQ0FQKSkgeworCQlzZXR1cC5maWVsZHMgfD0gTU5DQ19GX0NDQ0FQOworCQlnc200OF9kZWNvZGVfY2NjYXAoJnNldHVwLmNjY2FwLAorCQkJICAgICBUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX0NDX0NBUCktMSk7CisJfQorCisJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX0lOSVRJQVRFRCk7CisKKwlMT0dQKERDQywgTE9HTF9JTkZPLCAiU3Vic2NyaWJlciAlcyAoJXMpIHNlbmRzIFNFVFVQIHRvICVzXG4iLAorCSAgICAgc3Vic2NyX25hbWUodHJhbnMtPnN1YnNjciksIHRyYW5zLT5zdWJzY3ItPmV4dGVuc2lvbiwKKwkgICAgIHNldHVwLmNhbGxlZC5udW1iZXIpOworCisJLyogaW5kaWNhdGUgc2V0dXAgdG8gTU5DQyAqLworCW1uY2NfcmVjdm1zZyh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLCBNTkNDX1NFVFVQX0lORCwgJnNldHVwKTsKKworCS8qIE1OQ0MgY29kZSB3aWxsIG1vZGlmeSB0aGUgY2hhbm5lbCBhc3luY2hyb25vdXNseSwgd2Ugc2hvdWxkCisJICogaXBhY2Nlc3MtYmluZCBvbmx5IGFmdGVyIHRoZSBtb2RpZmljYXRpb24gaGFzIGJlZW4gbWFkZSB0byB0aGUKKwkgKiBsY2hhbi0+dGNoX21vZGUgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9zZXR1cChzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2g7CisJc3RydWN0IGdzbV9tbmNjICpzZXR1cCA9IGFyZzsKKwlpbnQgcmMsIHRyYW5zX2lkOworCisJZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCS8qIHRyYW5zYWN0aW9uIGlkIG11c3Qgbm90IGJlIGFzc2lnbmVkICovCisJaWYgKHRyYW5zLT50cmFuc2FjdGlvbl9pZCAhPSAweGZmKSB7IC8qIHVuYXNzc2lnbmVkICovCisJCURFQlVHUChEQ0MsICJUWCBTZXR1cCB3aXRoIGFzc2lnbmVkIHRyYW5zYWN0aW9uLiAiCisJCQkiVGhpcyBpcyBub3QgYWxsb3dlZCFcbiIpOworCQkvKiBUZW1wb3JhcmlseSBvdXQgb2Ygb3JkZXIgKi8KKwkJcmMgPSBtbmNjX3JlbGVhc2VfaW5kKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIHRyYW5zLT5jYWxscmVmLAorCQkJCSAgICAgIEdTTTQ4X0NBVVNFX0xPQ19QUk5fU19MVSwKKwkJCQkgICAgICBHU000OF9DQ19DQVVTRV9SRVNPVVJDRV9VTkFWQUlMKTsKKwkJdHJhbnMtPmNhbGxyZWYgPSAwOworCQl0cmFuc19mcmVlKHRyYW5zKTsKKwkJcmV0dXJuIHJjOworCX0KKwkKKwkvKiBHZXQgZnJlZSB0cmFuc2FjdGlvbl9pZCAqLworCXRyYW5zX2lkID0gdHJhbnNfYXNzaWduX3RyYW5zX2lkKHRyYW5zLT5zdWJzY3IsIEdTTTQ4X1BESVNDX0NDLCAwKTsKKwlpZiAodHJhbnNfaWQgPCAwKSB7CisJCS8qIG5vIGZyZWUgdHJhbnNhY3Rpb24gSUQgKi8KKwkJcmMgPSBtbmNjX3JlbGVhc2VfaW5kKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIHRyYW5zLT5jYWxscmVmLAorCQkJCSAgICAgIEdTTTQ4X0NBVVNFX0xPQ19QUk5fU19MVSwKKwkJCQkgICAgICBHU000OF9DQ19DQVVTRV9SRVNPVVJDRV9VTkFWQUlMKTsKKwkJdHJhbnMtPmNhbGxyZWYgPSAwOworCQl0cmFuc19mcmVlKHRyYW5zKTsKKwkJcmV0dXJuIHJjOworCX0KKwl0cmFucy0+dHJhbnNhY3Rpb25faWQgPSB0cmFuc19pZDsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX1NFVFVQOworCisJZ3NtNDhfc3RhcnRfY2NfdGltZXIodHJhbnMsIDB4MzAzLCBHU000OF9UMzAzKTsKKworCS8qIGJlYXJlciBjYXBhYmlsaXR5ICovCisJaWYgKHNldHVwLT5maWVsZHMgJiBNTkNDX0ZfQkVBUkVSX0NBUCkKKwkJZ3NtNDhfZW5jb2RlX2JlYXJlcl9jYXAobXNnLCAwLCAmc2V0dXAtPmJlYXJlcl9jYXApOworCS8qIGZhY2lsaXR5ICovCisJaWYgKHNldHVwLT5maWVsZHMgJiBNTkNDX0ZfRkFDSUxJVFkpCisJCWdzbTQ4X2VuY29kZV9mYWNpbGl0eShtc2csIDAsICZzZXR1cC0+ZmFjaWxpdHkpOworCS8qIHByb2dyZXNzICovCisJaWYgKHNldHVwLT5maWVsZHMgJiBNTkNDX0ZfUFJPR1JFU1MpCisJCWdzbTQ4X2VuY29kZV9wcm9ncmVzcyhtc2csIDAsICZzZXR1cC0+cHJvZ3Jlc3MpOworCS8qIGNhbGxpbmcgcGFydHkgQkNEIG51bWJlciAqLworCWlmIChzZXR1cC0+ZmllbGRzICYgTU5DQ19GX0NBTExJTkcpCisJCWdzbTQ4X2VuY29kZV9jYWxsaW5nKG1zZywgJnNldHVwLT5jYWxsaW5nKTsKKwkvKiBjYWxsZWQgcGFydHkgQkNEIG51bWJlciAqLworCWlmIChzZXR1cC0+ZmllbGRzICYgTU5DQ19GX0NBTExFRCkKKwkJZ3NtNDhfZW5jb2RlX2NhbGxlZChtc2csICZzZXR1cC0+Y2FsbGVkKTsKKwkvKiB1c2VyLXVzZXIgKi8KKwlpZiAoc2V0dXAtPmZpZWxkcyAmIE1OQ0NfRl9VU0VSVVNFUikKKwkJZ3NtNDhfZW5jb2RlX3VzZXJ1c2VyKG1zZywgMCwgJnNldHVwLT51c2VydXNlcik7CisJLyogcmVkaXJlY3RpbmcgcGFydHkgQkNEIG51bWJlciAqLworCWlmIChzZXR1cC0+ZmllbGRzICYgTU5DQ19GX1JFRElSRUNUSU5HKQorCQlnc200OF9lbmNvZGVfcmVkaXJlY3RpbmcobXNnLCAmc2V0dXAtPnJlZGlyZWN0aW5nKTsKKwkvKiBzaWduYWwgKi8KKwlpZiAoc2V0dXAtPmZpZWxkcyAmIE1OQ0NfRl9TSUdOQUwpCisJCWdzbTQ4X2VuY29kZV9zaWduYWwobXNnLCBzZXR1cC0+c2lnbmFsKTsKKwkKKwluZXdfY2Nfc3RhdGUodHJhbnMsIEdTTV9DU1RBVEVfQ0FMTF9QUkVTRU5UKTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X2NhbGxfY29uZihzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwl1bnNpZ25lZCBpbnQgcGF5bG9hZF9sZW4gPSBtc2diX2wzbGVuKG1zZykgLSBzaXplb2YoKmdoKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwlzdHJ1Y3QgZ3NtX21uY2MgY2FsbF9jb25mOworCisJZ3NtNDhfc3RvcF9jY190aW1lcih0cmFucyk7CisJZ3NtNDhfc3RhcnRfY2NfdGltZXIodHJhbnMsIDB4MzEwLCBHU000OF9UMzEwKTsKKworCW1lbXNldCgmY2FsbF9jb25mLCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJY2FsbF9jb25mLmNhbGxyZWYgPSB0cmFucy0+Y2FsbHJlZjsKKwl0bHZfcGFyc2UoJnRwLCAmZ3NtNDhfYXR0X3RsdmRlZiwgZ2gtPmRhdGEsIHBheWxvYWRfbGVuLCAwLCAwKTsKKyNpZiAwCisJLyogcmVwZWF0ICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX1JFUEVBVF9DSVIpKQorCQljYWxsX2NvbmYucmVwZWF0ID0gMTsKKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfUkVQRUFUX1NFUSkpCisJCWNhbGxfY29uZi5yZXBlYXQgPSAyOworI2VuZGlmCisJLyogYmVhcmVyIGNhcGFiaWxpdHkgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfQkVBUkVSX0NBUCkpIHsKKwkJY2FsbF9jb25mLmZpZWxkcyB8PSBNTkNDX0ZfQkVBUkVSX0NBUDsKKwkJZ3NtNDhfZGVjb2RlX2JlYXJlcl9jYXAoJmNhbGxfY29uZi5iZWFyZXJfY2FwLAorCQkJCSAgVExWUF9WQUwoJnRwLCBHU000OF9JRV9CRUFSRVJfQ0FQKS0xKTsKKwl9CisJLyogY2F1c2UgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfQ0FVU0UpKSB7CisJCWNhbGxfY29uZi5maWVsZHMgfD0gTU5DQ19GX0NBVVNFOworCQlnc200OF9kZWNvZGVfY2F1c2UoJmNhbGxfY29uZi5jYXVzZSwKKwkJCSAgICAgVExWUF9WQUwoJnRwLCBHU000OF9JRV9DQVVTRSktMSk7CisJfQorCS8qIGNjIGNhcCAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9DQ19DQVApKSB7CisJCWNhbGxfY29uZi5maWVsZHMgfD0gTU5DQ19GX0NDQ0FQOworCQlnc200OF9kZWNvZGVfY2NjYXAoJmNhbGxfY29uZi5jY2NhcCwKKwkJCSAgICAgVExWUF9WQUwoJnRwLCBHU000OF9JRV9DQ19DQVApLTEpOworCX0KKworCW5ld19jY19zdGF0ZSh0cmFucywgR1NNX0NTVEFURV9NT19URVJNX0NBTExfQ09ORik7CisKKwlyZXR1cm4gbW5jY19yZWN2bXNnKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIE1OQ0NfQ0FMTF9DT05GX0lORCwKKwkJCSAgICAmY2FsbF9jb25mKTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9jYWxsX3Byb2Moc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgKnByb2NlZWRpbmcgPSBhcmc7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfQ0NfQ0FMTF9QUk9DOworCisJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX01PX0NBTExfUFJPQyk7CisKKwkvKiBiZWFyZXIgY2FwYWJpbGl0eSAqLworCWlmIChwcm9jZWVkaW5nLT5maWVsZHMgJiBNTkNDX0ZfQkVBUkVSX0NBUCkKKwkJZ3NtNDhfZW5jb2RlX2JlYXJlcl9jYXAobXNnLCAwLCAmcHJvY2VlZGluZy0+YmVhcmVyX2NhcCk7CisJLyogZmFjaWxpdHkgKi8KKwlpZiAocHJvY2VlZGluZy0+ZmllbGRzICYgTU5DQ19GX0ZBQ0lMSVRZKQorCQlnc200OF9lbmNvZGVfZmFjaWxpdHkobXNnLCAwLCAmcHJvY2VlZGluZy0+ZmFjaWxpdHkpOworCS8qIHByb2dyZXNzICovCisJaWYgKHByb2NlZWRpbmctPmZpZWxkcyAmIE1OQ0NfRl9QUk9HUkVTUykKKwkJZ3NtNDhfZW5jb2RlX3Byb2dyZXNzKG1zZywgMCwgJnByb2NlZWRpbmctPnByb2dyZXNzKTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X2FsZXJ0aW5nKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbiA9IG1zZ2JfbDNsZW4obXNnKSAtIHNpemVvZigqZ2gpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXN0cnVjdCBnc21fbW5jYyBhbGVydGluZzsKKwkKKwlnc200OF9zdG9wX2NjX3RpbWVyKHRyYW5zKTsKKwlnc200OF9zdGFydF9jY190aW1lcih0cmFucywgMHgzMDEsIEdTTTQ4X1QzMDEpOworCisJbWVtc2V0KCZhbGVydGluZywgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCWFsZXJ0aW5nLmNhbGxyZWYgPSB0cmFucy0+Y2FsbHJlZjsKKwl0bHZfcGFyc2UoJnRwLCAmZ3NtNDhfYXR0X3RsdmRlZiwgZ2gtPmRhdGEsIHBheWxvYWRfbGVuLCAwLCAwKTsKKwkvKiBmYWNpbGl0eSAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9GQUNJTElUWSkpIHsKKwkJYWxlcnRpbmcuZmllbGRzIHw9IE1OQ0NfRl9GQUNJTElUWTsKKwkJZ3NtNDhfZGVjb2RlX2ZhY2lsaXR5KCZhbGVydGluZy5mYWNpbGl0eSwKKwkJCQlUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX0ZBQ0lMSVRZKS0xKTsKKwl9CisKKwkvKiBwcm9ncmVzcyAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9QUk9HUl9JTkQpKSB7CisJCWFsZXJ0aW5nLmZpZWxkcyB8PSBNTkNDX0ZfUFJPR1JFU1M7CisJCWdzbTQ4X2RlY29kZV9wcm9ncmVzcygmYWxlcnRpbmcucHJvZ3Jlc3MsCisJCQkJVExWUF9WQUwoJnRwLCBHU000OF9JRV9QUk9HUl9JTkQpLTEpOworCX0KKwkvKiBzcy12ZXJzaW9uICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX1NTX1ZFUlMpKSB7CisJCWFsZXJ0aW5nLmZpZWxkcyB8PSBNTkNDX0ZfU1NWRVJTSU9OOworCQlnc200OF9kZWNvZGVfc3N2ZXJzaW9uKCZhbGVydGluZy5zc3ZlcnNpb24sCisJCQkJIFRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfU1NfVkVSUyktMSk7CisJfQorCisJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX0NBTExfUkVDRUlWRUQpOworCisJcmV0dXJuIG1uY2NfcmVjdm1zZyh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLCBNTkNDX0FMRVJUX0lORCwKKwkJCSAgICAmYWxlcnRpbmcpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X2FsZXJ0aW5nKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCB2b2lkICphcmcpCit7CisJc3RydWN0IGdzbV9tbmNjICphbGVydGluZyA9IGFyZzsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19BTEVSVElORzsKKworCS8qIGZhY2lsaXR5ICovCisJaWYgKGFsZXJ0aW5nLT5maWVsZHMgJiBNTkNDX0ZfRkFDSUxJVFkpCisJCWdzbTQ4X2VuY29kZV9mYWNpbGl0eShtc2csIDAsICZhbGVydGluZy0+ZmFjaWxpdHkpOworCS8qIHByb2dyZXNzICovCisJaWYgKGFsZXJ0aW5nLT5maWVsZHMgJiBNTkNDX0ZfUFJPR1JFU1MpCisJCWdzbTQ4X2VuY29kZV9wcm9ncmVzcyhtc2csIDAsICZhbGVydGluZy0+cHJvZ3Jlc3MpOworCS8qIHVzZXItdXNlciAqLworCWlmIChhbGVydGluZy0+ZmllbGRzICYgTU5DQ19GX1VTRVJVU0VSKQorCQlnc200OF9lbmNvZGVfdXNlcnVzZXIobXNnLCAwLCAmYWxlcnRpbmctPnVzZXJ1c2VyKTsKKworCW5ld19jY19zdGF0ZSh0cmFucywgR1NNX0NTVEFURV9DQUxMX0RFTElWRVJFRCk7CisJCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCB0cmFucyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfcHJvZ3Jlc3Moc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgKnByb2dyZXNzID0gYXJnOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX1BST0dSRVNTOworCisJLyogcHJvZ3Jlc3MgKi8KKwlnc200OF9lbmNvZGVfcHJvZ3Jlc3MobXNnLCAxLCAmcHJvZ3Jlc3MtPnByb2dyZXNzKTsKKwkvKiB1c2VyLXVzZXIgKi8KKwlpZiAocHJvZ3Jlc3MtPmZpZWxkcyAmIE1OQ0NfRl9VU0VSVVNFUikKKwkJZ3NtNDhfZW5jb2RlX3VzZXJ1c2VyKG1zZywgMCwgJnByb2dyZXNzLT51c2VydXNlcik7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9jb25uZWN0KHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCB2b2lkICphcmcpCit7CisJc3RydWN0IGdzbV9tbmNjICpjb25uZWN0ID0gYXJnOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX0NPTk5FQ1Q7CisKKwlnc200OF9zdG9wX2NjX3RpbWVyKHRyYW5zKTsKKwlnc200OF9zdGFydF9jY190aW1lcih0cmFucywgMHgzMTMsIEdTTTQ4X1QzMTMpOworCisJLyogZmFjaWxpdHkgKi8KKwlpZiAoY29ubmVjdC0+ZmllbGRzICYgTU5DQ19GX0ZBQ0lMSVRZKQorCQlnc200OF9lbmNvZGVfZmFjaWxpdHkobXNnLCAwLCAmY29ubmVjdC0+ZmFjaWxpdHkpOworCS8qIHByb2dyZXNzICovCisJaWYgKGNvbm5lY3QtPmZpZWxkcyAmIE1OQ0NfRl9QUk9HUkVTUykKKwkJZ3NtNDhfZW5jb2RlX3Byb2dyZXNzKG1zZywgMCwgJmNvbm5lY3QtPnByb2dyZXNzKTsKKwkvKiBjb25uZWN0ZWQgbnVtYmVyICovCisJaWYgKGNvbm5lY3QtPmZpZWxkcyAmIE1OQ0NfRl9DT05ORUNURUQpCisJCWdzbTQ4X2VuY29kZV9jb25uZWN0ZWQobXNnLCAmY29ubmVjdC0+Y29ubmVjdGVkKTsKKwkvKiB1c2VyLXVzZXIgKi8KKwlpZiAoY29ubmVjdC0+ZmllbGRzICYgTU5DQ19GX1VTRVJVU0VSKQorCQlnc200OF9lbmNvZGVfdXNlcnVzZXIobXNnLCAwLCAmY29ubmVjdC0+dXNlcnVzZXIpOworCisJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX0NPTk5FQ1RfSU5EKTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X2Nvbm5lY3Qoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJdW5zaWduZWQgaW50IHBheWxvYWRfbGVuID0gbXNnYl9sM2xlbihtc2cpIC0gc2l6ZW9mKCpnaCk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJc3RydWN0IGdzbV9tbmNjIGNvbm5lY3Q7CisKKwlnc200OF9zdG9wX2NjX3RpbWVyKHRyYW5zKTsKKworCW1lbXNldCgmY29ubmVjdCwgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCWNvbm5lY3QuY2FsbHJlZiA9IHRyYW5zLT5jYWxscmVmOworCXRsdl9wYXJzZSgmdHAsICZnc200OF9hdHRfdGx2ZGVmLCBnaC0+ZGF0YSwgcGF5bG9hZF9sZW4sIDAsIDApOworCS8qIHVzZSBzdWJzY3JpYmVyIGFzIGNvbm5lY3RlZCBwYXJ0eSBudW1iZXIgKi8KKwlpZiAodHJhbnMtPnN1YnNjcikgeworCQljb25uZWN0LmZpZWxkcyB8PSBNTkNDX0ZfQ09OTkVDVEVEOworCQlzdHJuY3B5KGNvbm5lY3QuY29ubmVjdGVkLm51bWJlciwgdHJhbnMtPnN1YnNjci0+ZXh0ZW5zaW9uLAorCQkJc2l6ZW9mKGNvbm5lY3QuY29ubmVjdGVkLm51bWJlciktMSk7CisJCXN0cm5jcHkoY29ubmVjdC5pbXNpLCB0cmFucy0+c3Vic2NyLT5pbXNpLAorCQkJc2l6ZW9mKGNvbm5lY3QuaW1zaSktMSk7CisJfQorCS8qIGZhY2lsaXR5ICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0ZBQ0lMSVRZKSkgeworCQljb25uZWN0LmZpZWxkcyB8PSBNTkNDX0ZfRkFDSUxJVFk7CisJCWdzbTQ4X2RlY29kZV9mYWNpbGl0eSgmY29ubmVjdC5mYWNpbGl0eSwKKwkJCQlUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX0ZBQ0lMSVRZKS0xKTsKKwl9CisJLyogdXNlci11c2VyICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX1VTRVJfVVNFUikpIHsKKwkJY29ubmVjdC5maWVsZHMgfD0gTU5DQ19GX1VTRVJVU0VSOworCQlnc200OF9kZWNvZGVfdXNlcnVzZXIoJmNvbm5lY3QudXNlcnVzZXIsCisJCQkJVExWUF9WQUwoJnRwLCBHU000OF9JRV9VU0VSX1VTRVIpLTEpOworCX0KKwkvKiBzcy12ZXJzaW9uICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX1NTX1ZFUlMpKSB7CisJCWNvbm5lY3QuZmllbGRzIHw9IE1OQ0NfRl9TU1ZFUlNJT047CisJCWdzbTQ4X2RlY29kZV9zc3ZlcnNpb24oJmNvbm5lY3Quc3N2ZXJzaW9uLAorCQkJCSBUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX1NTX1ZFUlMpLTEpOworCX0KKworCW5ld19jY19zdGF0ZSh0cmFucywgR1NNX0NTVEFURV9DT05ORUNUX1JFUVVFU1QpOworCisJcmV0dXJuIG1uY2NfcmVjdm1zZyh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLCBNTkNDX1NFVFVQX0NORiwgJmNvbm5lY3QpOworfQorCisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfcnhfY29ubmVjdF9hY2soc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbV9tbmNjIGNvbm5lY3RfYWNrOworCisJZ3NtNDhfc3RvcF9jY190aW1lcih0cmFucyk7CisKKwluZXdfY2Nfc3RhdGUodHJhbnMsIEdTTV9DU1RBVEVfQUNUSVZFKTsKKwkKKwltZW1zZXQoJmNvbm5lY3RfYWNrLCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJY29ubmVjdF9hY2suY2FsbHJlZiA9IHRyYW5zLT5jYWxscmVmOworCXJldHVybiBtbmNjX3JlY3Ztc2codHJhbnMtPnN1YnNjci0+bmV0LCB0cmFucywgTU5DQ19TRVRVUF9DT01QTF9JTkQsCisJCQkgICAgJmNvbm5lY3RfYWNrKTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9jb25uZWN0X2FjayhzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX0NPTk5FQ1RfQUNLOworCisJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX0FDVElWRSk7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKK30KKworc3RhdGljIGludCBnc200OF9jY19yeF9kaXNjb25uZWN0KHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbiA9IG1zZ2JfbDNsZW4obXNnKSAtIHNpemVvZigqZ2gpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXN0cnVjdCBnc21fbW5jYyBkaXNjOworCisJZ3NtNDhfc3RvcF9jY190aW1lcih0cmFucyk7CisKKwluZXdfY2Nfc3RhdGUodHJhbnMsIEdTTV9DU1RBVEVfRElTQ09OTkVDVF9SRVEpOworCisJbWVtc2V0KCZkaXNjLCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJZGlzYy5jYWxscmVmID0gdHJhbnMtPmNhbGxyZWY7CisJdGx2X3BhcnNlKCZ0cCwgJmdzbTQ4X2F0dF90bHZkZWYsIGdoLT5kYXRhLCBwYXlsb2FkX2xlbiwgR1NNNDhfSUVfQ0FVU0UsIDApOworCS8qIGNhdXNlICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0NBVVNFKSkgeworCQlkaXNjLmZpZWxkcyB8PSBNTkNDX0ZfQ0FVU0U7CisJCWdzbTQ4X2RlY29kZV9jYXVzZSgmZGlzYy5jYXVzZSwKKwkJCSAgICAgVExWUF9WQUwoJnRwLCBHU000OF9JRV9DQVVTRSktMSk7CisJfQorCS8qIGZhY2lsaXR5ICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0ZBQ0lMSVRZKSkgeworCQlkaXNjLmZpZWxkcyB8PSBNTkNDX0ZfRkFDSUxJVFk7CisJCWdzbTQ4X2RlY29kZV9mYWNpbGl0eSgmZGlzYy5mYWNpbGl0eSwKKwkJCQlUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX0ZBQ0lMSVRZKS0xKTsKKwl9CisJLyogdXNlci11c2VyICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX1VTRVJfVVNFUikpIHsKKwkJZGlzYy5maWVsZHMgfD0gTU5DQ19GX1VTRVJVU0VSOworCQlnc200OF9kZWNvZGVfdXNlcnVzZXIoJmRpc2MudXNlcnVzZXIsCisJCQkJVExWUF9WQUwoJnRwLCBHU000OF9JRV9VU0VSX1VTRVIpLTEpOworCX0KKwkvKiBzcy12ZXJzaW9uICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX1NTX1ZFUlMpKSB7CisJCWRpc2MuZmllbGRzIHw9IE1OQ0NfRl9TU1ZFUlNJT047CisJCWdzbTQ4X2RlY29kZV9zc3ZlcnNpb24oJmRpc2Muc3N2ZXJzaW9uLAorCQkJCSBUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX1NTX1ZFUlMpLTEpOworCX0KKworCXJldHVybiBtbmNjX3JlY3Ztc2codHJhbnMtPnN1YnNjci0+bmV0LCB0cmFucywgTU5DQ19ESVNDX0lORCwgJmRpc2MpOworCit9CisKK3N0YXRpYyBzdHJ1Y3QgZ3NtX21uY2NfY2F1c2UgZGVmYXVsdF9jYXVzZSA9IHsKKwkubG9jYXRpb24JPSBHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUsCisJLmNvZGluZwkJPSAwLAorCS5yZWMJCT0gMCwKKwkucmVjX3ZhbAk9IDAsCisJLnZhbHVlCQk9IEdTTTQ4X0NDX0NBVVNFX05PUk1BTF9VTlNQRUMsCisJLmRpYWdfbGVuCT0gMCwKKwkuZGlhZwkJPSB7IDAgfSwKK307CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfZGlzY29ubmVjdChzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqZGlzYyA9IGFyZzsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19ESVNDT05ORUNUOworCisJZ3NtNDhfc3RvcF9jY190aW1lcih0cmFucyk7CisJZ3NtNDhfc3RhcnRfY2NfdGltZXIodHJhbnMsIDB4MzA2LCBHU000OF9UMzA2KTsKKworCS8qIGNhdXNlICovCisJaWYgKGRpc2MtPmZpZWxkcyAmIE1OQ0NfRl9DQVVTRSkKKwkJZ3NtNDhfZW5jb2RlX2NhdXNlKG1zZywgMSwgJmRpc2MtPmNhdXNlKTsKKwllbHNlCisJCWdzbTQ4X2VuY29kZV9jYXVzZShtc2csIDEsICZkZWZhdWx0X2NhdXNlKTsKKworCS8qIGZhY2lsaXR5ICovCisJaWYgKGRpc2MtPmZpZWxkcyAmIE1OQ0NfRl9GQUNJTElUWSkKKwkJZ3NtNDhfZW5jb2RlX2ZhY2lsaXR5KG1zZywgMCwgJmRpc2MtPmZhY2lsaXR5KTsKKwkvKiBwcm9ncmVzcyAqLworCWlmIChkaXNjLT5maWVsZHMgJiBNTkNDX0ZfUFJPR1JFU1MpCisJCWdzbTQ4X2VuY29kZV9wcm9ncmVzcyhtc2csIDAsICZkaXNjLT5wcm9ncmVzcyk7CisJLyogdXNlci11c2VyICovCisJaWYgKGRpc2MtPmZpZWxkcyAmIE1OQ0NfRl9VU0VSVVNFUikKKwkJZ3NtNDhfZW5jb2RlX3VzZXJ1c2VyKG1zZywgMCwgJmRpc2MtPnVzZXJ1c2VyKTsKKworCS8qIHN0b3JlIGRpc2Nvbm5lY3QgY2F1c2UgZm9yIFQzMDYgZXhwaXJ5ICovCisJbWVtY3B5KCZ0cmFucy0+Y2MubXNnLCBkaXNjLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisKKwluZXdfY2Nfc3RhdGUodHJhbnMsIEdTTV9DU1RBVEVfRElTQ09OTkVDVF9JTkQpOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCB0cmFucyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfcnhfcmVsZWFzZShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwl1bnNpZ25lZCBpbnQgcGF5bG9hZF9sZW4gPSBtc2diX2wzbGVuKG1zZykgLSBzaXplb2YoKmdoKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwlzdHJ1Y3QgZ3NtX21uY2MgcmVsOworCWludCByYzsKKworCWdzbTQ4X3N0b3BfY2NfdGltZXIodHJhbnMpOworCisJbWVtc2V0KCZyZWwsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwlyZWwuY2FsbHJlZiA9IHRyYW5zLT5jYWxscmVmOworCXRsdl9wYXJzZSgmdHAsICZnc200OF9hdHRfdGx2ZGVmLCBnaC0+ZGF0YSwgcGF5bG9hZF9sZW4sIDAsIDApOworCS8qIGNhdXNlICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0NBVVNFKSkgeworCQlyZWwuZmllbGRzIHw9IE1OQ0NfRl9DQVVTRTsKKwkJZ3NtNDhfZGVjb2RlX2NhdXNlKCZyZWwuY2F1c2UsCisJCQkgICAgIFRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfQ0FVU0UpLTEpOworCX0KKwkvKiBmYWNpbGl0eSAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9GQUNJTElUWSkpIHsKKwkJcmVsLmZpZWxkcyB8PSBNTkNDX0ZfRkFDSUxJVFk7CisJCWdzbTQ4X2RlY29kZV9mYWNpbGl0eSgmcmVsLmZhY2lsaXR5LAorCQkJCVRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfRkFDSUxJVFkpLTEpOworCX0KKwkvKiB1c2VyLXVzZXIgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfVVNFUl9VU0VSKSkgeworCQlyZWwuZmllbGRzIHw9IE1OQ0NfRl9VU0VSVVNFUjsKKwkJZ3NtNDhfZGVjb2RlX3VzZXJ1c2VyKCZyZWwudXNlcnVzZXIsCisJCQkJVExWUF9WQUwoJnRwLCBHU000OF9JRV9VU0VSX1VTRVIpLTEpOworCX0KKwkvKiBzcy12ZXJzaW9uICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX1NTX1ZFUlMpKSB7CisJCXJlbC5maWVsZHMgfD0gTU5DQ19GX1NTVkVSU0lPTjsKKwkJZ3NtNDhfZGVjb2RlX3NzdmVyc2lvbigmcmVsLnNzdmVyc2lvbiwKKwkJCQkgVExWUF9WQUwoJnRwLCBHU000OF9JRV9TU19WRVJTKS0xKTsKKwl9CisKKwlpZiAodHJhbnMtPmNjLnN0YXRlID09IEdTTV9DU1RBVEVfUkVMRUFTRV9SRVEpIHsKKwkJLyogcmVsZWFzZSBjb2xsaXNpb24gNS40LjUgKi8KKwkJcmMgPSBtbmNjX3JlY3Ztc2codHJhbnMtPnN1YnNjci0+bmV0LCB0cmFucywgTU5DQ19SRUxfQ05GLCAmcmVsKTsKKwl9IGVsc2UgeworCQlyYyA9IGdzbTQ4X3R4X3NpbXBsZShtc2ctPmxjaGFuLAorCQkJCSAgICAgR1NNNDhfUERJU0NfQ0MgfCAodHJhbnMtPnRyYW5zYWN0aW9uX2lkIDw8IDQpLAorCQkJCSAgICAgR1NNNDhfTVRfQ0NfUkVMRUFTRV9DT01QTCk7CisJCXJjID0gbW5jY19yZWN2bXNnKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIE1OQ0NfUkVMX0lORCwgJnJlbCk7CisJfQorCisJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX05VTEwpOworCisJdHJhbnMtPmNhbGxyZWYgPSAwOworCXRyYW5zX2ZyZWUodHJhbnMpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X3JlbGVhc2Uoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgKnJlbCA9IGFyZzsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19SRUxFQVNFOworCisJdHJhbnMtPmNhbGxyZWYgPSAwOworCQorCWdzbTQ4X3N0b3BfY2NfdGltZXIodHJhbnMpOworCWdzbTQ4X3N0YXJ0X2NjX3RpbWVyKHRyYW5zLCAweDMwOCwgR1NNNDhfVDMwOCk7CisKKwkvKiBjYXVzZSAqLworCWlmIChyZWwtPmZpZWxkcyAmIE1OQ0NfRl9DQVVTRSkKKwkJZ3NtNDhfZW5jb2RlX2NhdXNlKG1zZywgMCwgJnJlbC0+Y2F1c2UpOworCS8qIGZhY2lsaXR5ICovCisJaWYgKHJlbC0+ZmllbGRzICYgTU5DQ19GX0ZBQ0lMSVRZKQorCQlnc200OF9lbmNvZGVfZmFjaWxpdHkobXNnLCAwLCAmcmVsLT5mYWNpbGl0eSk7CisJLyogdXNlci11c2VyICovCisJaWYgKHJlbC0+ZmllbGRzICYgTU5DQ19GX1VTRVJVU0VSKQorCQlnc200OF9lbmNvZGVfdXNlcnVzZXIobXNnLCAwLCAmcmVsLT51c2VydXNlcik7CisKKwl0cmFucy0+Y2MuVDMwOF9zZWNvbmQgPSAwOworCW1lbWNweSgmdHJhbnMtPmNjLm1zZywgcmVsLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisKKwlpZiAodHJhbnMtPmNjLnN0YXRlICE9IEdTTV9DU1RBVEVfUkVMRUFTRV9SRVEpCisJCW5ld19jY19zdGF0ZSh0cmFucywgR1NNX0NTVEFURV9SRUxFQVNFX1JFUSk7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKK30KKworc3RhdGljIGludCBnc200OF9jY19yeF9yZWxlYXNlX2NvbXBsKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbiA9IG1zZ2JfbDNsZW4obXNnKSAtIHNpemVvZigqZ2gpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXN0cnVjdCBnc21fbW5jYyByZWw7CisJaW50IHJjID0gMDsKKworCWdzbTQ4X3N0b3BfY2NfdGltZXIodHJhbnMpOworCisJbWVtc2V0KCZyZWwsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwlyZWwuY2FsbHJlZiA9IHRyYW5zLT5jYWxscmVmOworCXRsdl9wYXJzZSgmdHAsICZnc200OF9hdHRfdGx2ZGVmLCBnaC0+ZGF0YSwgcGF5bG9hZF9sZW4sIDAsIDApOworCS8qIGNhdXNlICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0NBVVNFKSkgeworCQlyZWwuZmllbGRzIHw9IE1OQ0NfRl9DQVVTRTsKKwkJZ3NtNDhfZGVjb2RlX2NhdXNlKCZyZWwuY2F1c2UsCisJCQkgICAgIFRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfQ0FVU0UpLTEpOworCX0KKwkvKiBmYWNpbGl0eSAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9GQUNJTElUWSkpIHsKKwkJcmVsLmZpZWxkcyB8PSBNTkNDX0ZfRkFDSUxJVFk7CisJCWdzbTQ4X2RlY29kZV9mYWNpbGl0eSgmcmVsLmZhY2lsaXR5LAorCQkJCVRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfRkFDSUxJVFkpLTEpOworCX0KKwkvKiB1c2VyLXVzZXIgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfVVNFUl9VU0VSKSkgeworCQlyZWwuZmllbGRzIHw9IE1OQ0NfRl9VU0VSVVNFUjsKKwkJZ3NtNDhfZGVjb2RlX3VzZXJ1c2VyKCZyZWwudXNlcnVzZXIsCisJCQkJVExWUF9WQUwoJnRwLCBHU000OF9JRV9VU0VSX1VTRVIpLTEpOworCX0KKwkvKiBzcy12ZXJzaW9uICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX1NTX1ZFUlMpKSB7CisJCXJlbC5maWVsZHMgfD0gTU5DQ19GX1NTVkVSU0lPTjsKKwkJZ3NtNDhfZGVjb2RlX3NzdmVyc2lvbigmcmVsLnNzdmVyc2lvbiwKKwkJCQkgVExWUF9WQUwoJnRwLCBHU000OF9JRV9TU19WRVJTKS0xKTsKKwl9CisKKwlpZiAodHJhbnMtPmNhbGxyZWYpIHsKKwkJc3dpdGNoICh0cmFucy0+Y2Muc3RhdGUpIHsKKwkJY2FzZSBHU01fQ1NUQVRFX0NBTExfUFJFU0VOVDoKKwkJCXJjID0gbW5jY19yZWN2bXNnKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsCisJCQkJCSAgTU5DQ19SRUpfSU5ELCAmcmVsKTsKKwkJCWJyZWFrOworCQljYXNlIEdTTV9DU1RBVEVfUkVMRUFTRV9SRVE6CisJCQlyYyA9IG1uY2NfcmVjdm1zZyh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLAorCQkJCQkgIE1OQ0NfUkVMX0NORiwgJnJlbCk7CisJCQkvKiBGSVhNRTogaW4gY2FzZSBvZiBtdWx0aXBsZSBjYWxscywgd2UgY2FuJ3Qgc2ltcGx5CisJCQkgKiBoYW5nIHVwIGhlcmUgISAqLworCQkJbGNoYW5fYXV0b19yZWxlYXNlKG1zZy0+bGNoYW4pOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyYyA9IG1uY2NfcmVjdm1zZyh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLAorCQkJCQkgIE1OQ0NfUkVMX0lORCwgJnJlbCk7CisJCX0KKwl9CisKKwl0cmFucy0+Y2FsbHJlZiA9IDA7CisJdHJhbnNfZnJlZSh0cmFucyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfcmVsZWFzZV9jb21wbChzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqcmVsID0gYXJnOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX1JFTEVBU0VfQ09NUEw7CisKKwl0cmFucy0+Y2FsbHJlZiA9IDA7CisJCisJZ3NtNDhfc3RvcF9jY190aW1lcih0cmFucyk7CisKKwkvKiBjYXVzZSAqLworCWlmIChyZWwtPmZpZWxkcyAmIE1OQ0NfRl9DQVVTRSkKKwkJZ3NtNDhfZW5jb2RlX2NhdXNlKG1zZywgMCwgJnJlbC0+Y2F1c2UpOworCS8qIGZhY2lsaXR5ICovCisJaWYgKHJlbC0+ZmllbGRzICYgTU5DQ19GX0ZBQ0lMSVRZKQorCQlnc200OF9lbmNvZGVfZmFjaWxpdHkobXNnLCAwLCAmcmVsLT5mYWNpbGl0eSk7CisJLyogdXNlci11c2VyICovCisJaWYgKHJlbC0+ZmllbGRzICYgTU5DQ19GX1VTRVJVU0VSKQorCQlnc200OF9lbmNvZGVfdXNlcnVzZXIobXNnLCAwLCAmcmVsLT51c2VydXNlcik7CisKKwl0cmFuc19mcmVlKHRyYW5zKTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X2ZhY2lsaXR5KHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbiA9IG1zZ2JfbDNsZW4obXNnKSAtIHNpemVvZigqZ2gpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXN0cnVjdCBnc21fbW5jYyBmYWM7CisKKwltZW1zZXQoJmZhYywgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCWZhYy5jYWxscmVmID0gdHJhbnMtPmNhbGxyZWY7CisJdGx2X3BhcnNlKCZ0cCwgJmdzbTQ4X2F0dF90bHZkZWYsIGdoLT5kYXRhLCBwYXlsb2FkX2xlbiwgR1NNNDhfSUVfRkFDSUxJVFksIDApOworCS8qIGZhY2lsaXR5ICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0ZBQ0lMSVRZKSkgeworCQlmYWMuZmllbGRzIHw9IE1OQ0NfRl9GQUNJTElUWTsKKwkJZ3NtNDhfZGVjb2RlX2ZhY2lsaXR5KCZmYWMuZmFjaWxpdHksCisJCQkJVExWUF9WQUwoJnRwLCBHU000OF9JRV9GQUNJTElUWSktMSk7CisJfQorCS8qIHNzLXZlcnNpb24gKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfU1NfVkVSUykpIHsKKwkJZmFjLmZpZWxkcyB8PSBNTkNDX0ZfU1NWRVJTSU9OOworCQlnc200OF9kZWNvZGVfc3N2ZXJzaW9uKCZmYWMuc3N2ZXJzaW9uLAorCQkJCSBUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX1NTX1ZFUlMpLTEpOworCX0KKworCXJldHVybiBtbmNjX3JlY3Ztc2codHJhbnMtPnN1YnNjci0+bmV0LCB0cmFucywgTU5DQ19GQUNJTElUWV9JTkQsICZmYWMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X2ZhY2lsaXR5KHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCB2b2lkICphcmcpCit7CisJc3RydWN0IGdzbV9tbmNjICpmYWMgPSBhcmc7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfQ0NfRkFDSUxJVFk7CisKKwkvKiBmYWNpbGl0eSAqLworCWdzbTQ4X2VuY29kZV9mYWNpbGl0eShtc2csIDEsICZmYWMtPmZhY2lsaXR5KTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X2hvbGQoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbV9tbmNjIGhvbGQ7CisKKwltZW1zZXQoJmhvbGQsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwlob2xkLmNhbGxyZWYgPSB0cmFucy0+Y2FsbHJlZjsKKwlyZXR1cm4gbW5jY19yZWN2bXNnKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIE1OQ0NfSE9MRF9JTkQsICZob2xkKTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9ob2xkX2FjayhzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX0hPTERfQUNLOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCB0cmFucyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfaG9sZF9yZWooc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgKmhvbGRfcmVqID0gYXJnOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX0hPTERfUkVKOworCisJLyogY2F1c2UgKi8KKwlpZiAoaG9sZF9yZWotPmZpZWxkcyAmIE1OQ0NfRl9DQVVTRSkKKwkJZ3NtNDhfZW5jb2RlX2NhdXNlKG1zZywgMSwgJmhvbGRfcmVqLT5jYXVzZSk7CisJZWxzZQorCQlnc200OF9lbmNvZGVfY2F1c2UobXNnLCAxLCAmZGVmYXVsdF9jYXVzZSk7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKK30KKworc3RhdGljIGludCBnc200OF9jY19yeF9yZXRyaWV2ZShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgcmV0cmlldmU7CisKKwltZW1zZXQoJnJldHJpZXZlLCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJcmV0cmlldmUuY2FsbHJlZiA9IHRyYW5zLT5jYWxscmVmOworCXJldHVybiBtbmNjX3JlY3Ztc2codHJhbnMtPnN1YnNjci0+bmV0LCB0cmFucywgTU5DQ19SRVRSSUVWRV9JTkQsCisJCQkgICAgJnJldHJpZXZlKTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9yZXRyaWV2ZV9hY2soc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19SRVRSX0FDSzsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X3JldHJpZXZlX3JlaihzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqcmV0cmlldmVfcmVqID0gYXJnOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX1JFVFJfUkVKOworCisJLyogY2F1c2UgKi8KKwlpZiAocmV0cmlldmVfcmVqLT5maWVsZHMgJiBNTkNDX0ZfQ0FVU0UpCisJCWdzbTQ4X2VuY29kZV9jYXVzZShtc2csIDEsICZyZXRyaWV2ZV9yZWotPmNhdXNlKTsKKwllbHNlCisJCWdzbTQ4X2VuY29kZV9jYXVzZShtc2csIDEsICZkZWZhdWx0X2NhdXNlKTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X3N0YXJ0X2R0bWYoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJdW5zaWduZWQgaW50IHBheWxvYWRfbGVuID0gbXNnYl9sM2xlbihtc2cpIC0gc2l6ZW9mKCpnaCk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJc3RydWN0IGdzbV9tbmNjIGR0bWY7CisKKwltZW1zZXQoJmR0bWYsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwlkdG1mLmNhbGxyZWYgPSB0cmFucy0+Y2FsbHJlZjsKKwl0bHZfcGFyc2UoJnRwLCAmZ3NtNDhfYXR0X3RsdmRlZiwgZ2gtPmRhdGEsIHBheWxvYWRfbGVuLCAwLCAwKTsKKwkvKiBrZXlwYWQgZmFjaWxpdHkgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfS1BEX0ZBQ0lMSVRZKSkgeworCQlkdG1mLmZpZWxkcyB8PSBNTkNDX0ZfS0VZUEFEOworCQlnc200OF9kZWNvZGVfa2V5cGFkKCZkdG1mLmtleXBhZCwKKwkJCSAgICAgIFRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfS1BEX0ZBQ0lMSVRZKS0xKTsKKwl9CisKKwlyZXR1cm4gbW5jY19yZWN2bXNnKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIE1OQ0NfU1RBUlRfRFRNRl9JTkQsICZkdG1mKTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9zdGFydF9kdG1mX2FjayhzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqZHRtZiA9IGFyZzsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19TVEFSVF9EVE1GX0FDSzsKKworCS8qIGtleXBhZCAqLworCWlmIChkdG1mLT5maWVsZHMgJiBNTkNDX0ZfS0VZUEFEKQorCQlnc200OF9lbmNvZGVfa2V5cGFkKG1zZywgZHRtZi0+a2V5cGFkKTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X3N0YXJ0X2R0bWZfcmVqKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCB2b2lkICphcmcpCit7CisJc3RydWN0IGdzbV9tbmNjICpkdG1mID0gYXJnOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX1NUQVJUX0RUTUZfUkVKOworCisJLyogY2F1c2UgKi8KKwlpZiAoZHRtZi0+ZmllbGRzICYgTU5DQ19GX0NBVVNFKQorCQlnc200OF9lbmNvZGVfY2F1c2UobXNnLCAxLCAmZHRtZi0+Y2F1c2UpOworCWVsc2UKKwkJZ3NtNDhfZW5jb2RlX2NhdXNlKG1zZywgMSwgJmRlZmF1bHRfY2F1c2UpOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCB0cmFucyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfc3RvcF9kdG1mX2FjayhzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX1NUT1BfRFRNRl9BQ0s7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKK30KKworc3RhdGljIGludCBnc200OF9jY19yeF9zdG9wX2R0bWYoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbV9tbmNjIGR0bWY7CisKKwltZW1zZXQoJmR0bWYsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwlkdG1mLmNhbGxyZWYgPSB0cmFucy0+Y2FsbHJlZjsKKworCXJldHVybiBtbmNjX3JlY3Ztc2codHJhbnMtPnN1YnNjci0+bmV0LCB0cmFucywgTU5DQ19TVE9QX0RUTUZfSU5ELCAmZHRtZik7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfcnhfbW9kaWZ5KHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbiA9IG1zZ2JfbDNsZW4obXNnKSAtIHNpemVvZigqZ2gpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXN0cnVjdCBnc21fbW5jYyBtb2RpZnk7CisKKwltZW1zZXQoJm1vZGlmeSwgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCW1vZGlmeS5jYWxscmVmID0gdHJhbnMtPmNhbGxyZWY7CisJdGx2X3BhcnNlKCZ0cCwgJmdzbTQ4X2F0dF90bHZkZWYsIGdoLT5kYXRhLCBwYXlsb2FkX2xlbiwgR1NNNDhfSUVfQkVBUkVSX0NBUCwgMCk7CisJLyogYmVhcmVyIGNhcGFiaWxpdHkgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfQkVBUkVSX0NBUCkpIHsKKwkJbW9kaWZ5LmZpZWxkcyB8PSBNTkNDX0ZfQkVBUkVSX0NBUDsKKwkJZ3NtNDhfZGVjb2RlX2JlYXJlcl9jYXAoJm1vZGlmeS5iZWFyZXJfY2FwLAorCQkJCSAgVExWUF9WQUwoJnRwLCBHU000OF9JRV9CRUFSRVJfQ0FQKS0xKTsKKwl9CisKKwluZXdfY2Nfc3RhdGUodHJhbnMsIEdTTV9DU1RBVEVfTU9fT1JJR19NT0RJRlkpOworCisJcmV0dXJuIG1uY2NfcmVjdm1zZyh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLCBNTkNDX01PRElGWV9JTkQsICZtb2RpZnkpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X21vZGlmeShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqbW9kaWZ5ID0gYXJnOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX01PRElGWTsKKworCWdzbTQ4X3N0YXJ0X2NjX3RpbWVyKHRyYW5zLCAweDMyMywgR1NNNDhfVDMyMyk7CisKKwkvKiBiZWFyZXIgY2FwYWJpbGl0eSAqLworCWdzbTQ4X2VuY29kZV9iZWFyZXJfY2FwKG1zZywgMSwgJm1vZGlmeS0+YmVhcmVyX2NhcCk7CisKKwluZXdfY2Nfc3RhdGUodHJhbnMsIEdTTV9DU1RBVEVfTU9fVEVSTV9NT0RJRlkpOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCB0cmFucyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfcnhfbW9kaWZ5X2NvbXBsZXRlKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbiA9IG1zZ2JfbDNsZW4obXNnKSAtIHNpemVvZigqZ2gpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXN0cnVjdCBnc21fbW5jYyBtb2RpZnk7CisKKwlnc200OF9zdG9wX2NjX3RpbWVyKHRyYW5zKTsKKworCW1lbXNldCgmbW9kaWZ5LCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJbW9kaWZ5LmNhbGxyZWYgPSB0cmFucy0+Y2FsbHJlZjsKKwl0bHZfcGFyc2UoJnRwLCAmZ3NtNDhfYXR0X3RsdmRlZiwgZ2gtPmRhdGEsIHBheWxvYWRfbGVuLCBHU000OF9JRV9CRUFSRVJfQ0FQLCAwKTsKKwkvKiBiZWFyZXIgY2FwYWJpbGl0eSAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9CRUFSRVJfQ0FQKSkgeworCQltb2RpZnkuZmllbGRzIHw9IE1OQ0NfRl9CRUFSRVJfQ0FQOworCQlnc200OF9kZWNvZGVfYmVhcmVyX2NhcCgmbW9kaWZ5LmJlYXJlcl9jYXAsCisJCQkJICBUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX0JFQVJFUl9DQVApLTEpOworCX0KKworCW5ld19jY19zdGF0ZSh0cmFucywgR1NNX0NTVEFURV9BQ1RJVkUpOworCisJcmV0dXJuIG1uY2NfcmVjdm1zZyh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLCBNTkNDX01PRElGWV9DTkYsICZtb2RpZnkpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X21vZGlmeV9jb21wbGV0ZShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqbW9kaWZ5ID0gYXJnOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX01PRElGWV9DT01QTDsKKworCS8qIGJlYXJlciBjYXBhYmlsaXR5ICovCisJZ3NtNDhfZW5jb2RlX2JlYXJlcl9jYXAobXNnLCAxLCAmbW9kaWZ5LT5iZWFyZXJfY2FwKTsKKworCW5ld19jY19zdGF0ZSh0cmFucywgR1NNX0NTVEFURV9BQ1RJVkUpOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCB0cmFucyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfcnhfbW9kaWZ5X3JlamVjdChzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwl1bnNpZ25lZCBpbnQgcGF5bG9hZF9sZW4gPSBtc2diX2wzbGVuKG1zZykgLSBzaXplb2YoKmdoKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwlzdHJ1Y3QgZ3NtX21uY2MgbW9kaWZ5OworCisJZ3NtNDhfc3RvcF9jY190aW1lcih0cmFucyk7CisKKwltZW1zZXQoJm1vZGlmeSwgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCW1vZGlmeS5jYWxscmVmID0gdHJhbnMtPmNhbGxyZWY7CisJdGx2X3BhcnNlKCZ0cCwgJmdzbTQ4X2F0dF90bHZkZWYsIGdoLT5kYXRhLCBwYXlsb2FkX2xlbiwgR1NNNDhfSUVfQkVBUkVSX0NBUCwgR1NNNDhfSUVfQ0FVU0UpOworCS8qIGJlYXJlciBjYXBhYmlsaXR5ICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0JFQVJFUl9DQVApKSB7CisJCW1vZGlmeS5maWVsZHMgfD0gR1NNNDhfSUVfQkVBUkVSX0NBUDsKKwkJZ3NtNDhfZGVjb2RlX2JlYXJlcl9jYXAoJm1vZGlmeS5iZWFyZXJfY2FwLAorCQkJCSAgVExWUF9WQUwoJnRwLCBHU000OF9JRV9CRUFSRVJfQ0FQKS0xKTsKKwl9CisJLyogY2F1c2UgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfQ0FVU0UpKSB7CisJCW1vZGlmeS5maWVsZHMgfD0gTU5DQ19GX0NBVVNFOworCQlnc200OF9kZWNvZGVfY2F1c2UoJm1vZGlmeS5jYXVzZSwKKwkJCSAgICAgVExWUF9WQUwoJnRwLCBHU000OF9JRV9DQVVTRSktMSk7CisJfQorCisJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX0FDVElWRSk7CisKKwlyZXR1cm4gbW5jY19yZWN2bXNnKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIE1OQ0NfTU9ESUZZX1JFSiwgJm1vZGlmeSk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfbW9kaWZ5X3JlamVjdChzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqbW9kaWZ5ID0gYXJnOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX01PRElGWV9SRUpFQ1Q7CisKKwkvKiBiZWFyZXIgY2FwYWJpbGl0eSAqLworCWdzbTQ4X2VuY29kZV9iZWFyZXJfY2FwKG1zZywgMSwgJm1vZGlmeS0+YmVhcmVyX2NhcCk7CisJLyogY2F1c2UgKi8KKwlnc200OF9lbmNvZGVfY2F1c2UobXNnLCAxLCAmbW9kaWZ5LT5jYXVzZSk7CisKKwluZXdfY2Nfc3RhdGUodHJhbnMsIEdTTV9DU1RBVEVfQUNUSVZFKTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X25vdGlmeShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqbm90aWZ5ID0gYXJnOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX05PVElGWTsKKworCS8qIG5vdGlmeSAqLworCWdzbTQ4X2VuY29kZV9ub3RpZnkobXNnLCBub3RpZnktPm5vdGlmeSk7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKK30KKworc3RhdGljIGludCBnc200OF9jY19yeF9ub3RpZnkoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJdW5zaWduZWQgaW50IHBheWxvYWRfbGVuID0gbXNnYl9sM2xlbihtc2cpIC0gc2l6ZW9mKCpnaCk7CisvLwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwlzdHJ1Y3QgZ3NtX21uY2Mgbm90aWZ5OworCisJbWVtc2V0KCZub3RpZnksIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwlub3RpZnkuY2FsbHJlZiA9IHRyYW5zLT5jYWxscmVmOworLy8JdGx2X3BhcnNlKCZ0cCwgJmdzbTQ4X2F0dF90bHZkZWYsIGdoLT5kYXRhLCBwYXlsb2FkX2xlbik7CisJaWYgKHBheWxvYWRfbGVuID49IDEpCisJCWdzbTQ4X2RlY29kZV9ub3RpZnkoJm5vdGlmeS5ub3RpZnksIGdoLT5kYXRhKTsKKworCXJldHVybiBtbmNjX3JlY3Ztc2codHJhbnMtPnN1YnNjci0+bmV0LCB0cmFucywgTU5DQ19OT1RJRllfSU5ELCAmbm90aWZ5KTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF91c2VyaW5mbyhzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqdXNlciA9IGFyZzsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19VU0VSX0lORk87CisKKwkvKiB1c2VyLXVzZXIgKi8KKwlpZiAodXNlci0+ZmllbGRzICYgTU5DQ19GX1VTRVJVU0VSKQorCQlnc200OF9lbmNvZGVfdXNlcnVzZXIobXNnLCAxLCAmdXNlci0+dXNlcnVzZXIpOworCS8qIG1vcmUgZGF0YSAqLworCWlmICh1c2VyLT5tb3JlKQorCQlnc200OF9lbmNvZGVfbW9yZShtc2cpOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCB0cmFucyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfcnhfdXNlcmluZm8oc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJdW5zaWduZWQgaW50IHBheWxvYWRfbGVuID0gbXNnYl9sM2xlbihtc2cpIC0gc2l6ZW9mKCpnaCk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJc3RydWN0IGdzbV9tbmNjIHVzZXI7CisKKwltZW1zZXQoJnVzZXIsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwl1c2VyLmNhbGxyZWYgPSB0cmFucy0+Y2FsbHJlZjsKKwl0bHZfcGFyc2UoJnRwLCAmZ3NtNDhfYXR0X3RsdmRlZiwgZ2gtPmRhdGEsIHBheWxvYWRfbGVuLCBHU000OF9JRV9VU0VSX1VTRVIsIDApOworCS8qIHVzZXItdXNlciAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9VU0VSX1VTRVIpKSB7CisJCXVzZXIuZmllbGRzIHw9IE1OQ0NfRl9VU0VSVVNFUjsKKwkJZ3NtNDhfZGVjb2RlX3VzZXJ1c2VyKCZ1c2VyLnVzZXJ1c2VyLAorCQkJCVRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfVVNFUl9VU0VSKS0xKTsKKwl9CisJLyogbW9yZSBkYXRhICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX01PUkVfREFUQSkpCisJCXVzZXIubW9yZSA9IDE7CisKKwlyZXR1cm4gbW5jY19yZWN2bXNnKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIE1OQ0NfVVNFUklORk9fSU5ELCAmdXNlcik7Cit9CisKK3N0YXRpYyBpbnQgX2dzbTQ4X2xjaGFuX21vZGlmeShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqbW9kZSA9IGFyZzsKKworCXJldHVybiBnc200OF9sY2hhbl9tb2RpZnkodHJhbnMtPmxjaGFuLCBtb2RlLT5sY2hhbl9tb2RlKTsKK30KKworc3RhdGljIHN0cnVjdCBkb3duc3RhdGUgeworCXVfaW50MzJfdAlzdGF0ZXM7CisJaW50CQl0eXBlOworCWludAkJKCpyb3V0KSAoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZyk7Cit9IGRvd25zdGF0ZWxpc3RbXSA9IHsKKwkvKiBtb2JpbGUgb3JpZ2luYXRpbmcgY2FsbCBlc3RhYmxpc2htZW50ICovCisJe1NCSVQoR1NNX0NTVEFURV9JTklUSUFURUQpLCAvKiA1LjIuMS4yICovCisJIE1OQ0NfQ0FMTF9QUk9DX1JFUSwgZ3NtNDhfY2NfdHhfY2FsbF9wcm9jfSwKKwl7U0JJVChHU01fQ1NUQVRFX0lOSVRJQVRFRCkgfCBTQklUKEdTTV9DU1RBVEVfTU9fQ0FMTF9QUk9DKSwgLyogNS4yLjEuMiB8IDUuMi4xLjUgKi8KKwkgTU5DQ19BTEVSVF9SRVEsIGdzbTQ4X2NjX3R4X2FsZXJ0aW5nfSwKKwl7U0JJVChHU01fQ1NUQVRFX0lOSVRJQVRFRCkgfCBTQklUKEdTTV9DU1RBVEVfTU9fQ0FMTF9QUk9DKSB8IFNCSVQoR1NNX0NTVEFURV9DQUxMX0RFTElWRVJFRCksIC8qIDUuMi4xLjIgfCA1LjIuMS42IHwgNS4yLjEuNiAqLworCSBNTkNDX1NFVFVQX1JTUCwgZ3NtNDhfY2NfdHhfY29ubmVjdH0sCisJe1NCSVQoR1NNX0NTVEFURV9NT19DQUxMX1BST0MpLCAvKiA1LjIuMS40LjIgKi8KKwkgTU5DQ19QUk9HUkVTU19SRVEsIGdzbTQ4X2NjX3R4X3Byb2dyZXNzfSwKKwkvKiBtb2JpbGUgdGVybWluYXRpbmcgY2FsbCBlc3RhYmxpc2htZW50ICovCisJe1NCSVQoR1NNX0NTVEFURV9OVUxMKSwgLyogNS4yLjIuMSAqLworCSBNTkNDX1NFVFVQX1JFUSwgZ3NtNDhfY2NfdHhfc2V0dXB9LAorCXtTQklUKEdTTV9DU1RBVEVfQ09OTkVDVF9SRVFVRVNUKSwKKwkgTU5DQ19TRVRVUF9DT01QTF9SRVEsIGdzbTQ4X2NjX3R4X2Nvbm5lY3RfYWNrfSwKKwkgLyogc2lnbmFsbGluZyBkdXJpbmcgY2FsbCAqLworCXtTQklUKEdTTV9DU1RBVEVfQUNUSVZFKSwKKwkgTU5DQ19OT1RJRllfUkVRLCBnc200OF9jY190eF9ub3RpZnl9LAorCXtBTExfU1RBVEVTIC0gU0JJVChHU01fQ1NUQVRFX05VTEwpIC0gU0JJVChHU01fQ1NUQVRFX1JFTEVBU0VfUkVRKSwKKwkgTU5DQ19GQUNJTElUWV9SRVEsIGdzbTQ4X2NjX3R4X2ZhY2lsaXR5fSwKKwl7QUxMX1NUQVRFUywKKwkgTU5DQ19TVEFSVF9EVE1GX1JTUCwgZ3NtNDhfY2NfdHhfc3RhcnRfZHRtZl9hY2t9LAorCXtBTExfU1RBVEVTLAorCSBNTkNDX1NUQVJUX0RUTUZfUkVKLCBnc200OF9jY190eF9zdGFydF9kdG1mX3Jlan0sCisJe0FMTF9TVEFURVMsCisJIE1OQ0NfU1RPUF9EVE1GX1JTUCwgZ3NtNDhfY2NfdHhfc3RvcF9kdG1mX2Fja30sCisJe1NCSVQoR1NNX0NTVEFURV9BQ1RJVkUpLAorCSBNTkNDX0hPTERfQ05GLCBnc200OF9jY190eF9ob2xkX2Fja30sCisJe1NCSVQoR1NNX0NTVEFURV9BQ1RJVkUpLAorCSBNTkNDX0hPTERfUkVKLCBnc200OF9jY190eF9ob2xkX3Jlan0sCisJe1NCSVQoR1NNX0NTVEFURV9BQ1RJVkUpLAorCSBNTkNDX1JFVFJJRVZFX0NORiwgZ3NtNDhfY2NfdHhfcmV0cmlldmVfYWNrfSwKKwl7U0JJVChHU01fQ1NUQVRFX0FDVElWRSksCisJIE1OQ0NfUkVUUklFVkVfUkVKLCBnc200OF9jY190eF9yZXRyaWV2ZV9yZWp9LAorCXtTQklUKEdTTV9DU1RBVEVfQUNUSVZFKSwKKwkgTU5DQ19NT0RJRllfUkVRLCBnc200OF9jY190eF9tb2RpZnl9LAorCXtTQklUKEdTTV9DU1RBVEVfTU9fT1JJR19NT0RJRlkpLAorCSBNTkNDX01PRElGWV9SU1AsIGdzbTQ4X2NjX3R4X21vZGlmeV9jb21wbGV0ZX0sCisJe1NCSVQoR1NNX0NTVEFURV9NT19PUklHX01PRElGWSksCisJIE1OQ0NfTU9ESUZZX1JFSiwgZ3NtNDhfY2NfdHhfbW9kaWZ5X3JlamVjdH0sCisJe1NCSVQoR1NNX0NTVEFURV9BQ1RJVkUpLAorCSBNTkNDX1VTRVJJTkZPX1JFUSwgZ3NtNDhfY2NfdHhfdXNlcmluZm99LAorCS8qIGNsZWFyaW5nICovCisJe1NCSVQoR1NNX0NTVEFURV9JTklUSUFURUQpLAorCSBNTkNDX1JFSl9SRVEsIGdzbTQ4X2NjX3R4X3JlbGVhc2VfY29tcGx9LAorCXtBTExfU1RBVEVTIC0gU0JJVChHU01fQ1NUQVRFX05VTEwpIC0gU0JJVChHU01fQ1NUQVRFX0RJU0NPTk5FQ1RfSU5EKSAtIFNCSVQoR1NNX0NTVEFURV9SRUxFQVNFX1JFUSkgLSBTQklUKEdTTV9DU1RBVEVfRElTQ09OTkVDVF9SRVEpLCAvKiA1LjQuNCAqLworCSBNTkNDX0RJU0NfUkVRLCBnc200OF9jY190eF9kaXNjb25uZWN0fSwKKwl7QUxMX1NUQVRFUyAtIFNCSVQoR1NNX0NTVEFURV9OVUxMKSAtIFNCSVQoR1NNX0NTVEFURV9SRUxFQVNFX1JFUSksIC8qIDUuNC4zLjIgKi8KKwkgTU5DQ19SRUxfUkVRLCBnc200OF9jY190eF9yZWxlYXNlfSwKKwkvKiBzcGVjaWFsICovCisJe0FMTF9TVEFURVMsCisJIE1OQ0NfTENIQU5fTU9ESUZZLCBfZ3NtNDhfbGNoYW5fbW9kaWZ5fSwKK307CisKKyNkZWZpbmUgRE9XTlNMTEVOIFwKKwkoc2l6ZW9mKGRvd25zdGF0ZWxpc3QpIC8gc2l6ZW9mKHN0cnVjdCBkb3duc3RhdGUpKQorCisKK2ludCBtbmNjX3NlbmQoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIGludCBtc2dfdHlwZSwgdm9pZCAqYXJnKQoreworCWludCBpLCByYyA9IDA7CisJc3RydWN0IGdzbV90cmFucyAqdHJhbnMgPSBOVUxMLCAqdHJhbnN0OworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0gTlVMTDsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gTlVMTDsKKwlzdHJ1Y3QgZ3NtX21uY2MgKmRhdGEgPSBhcmcsIHJlbDsKKworCS8qIGhhbmRsZSBzcGVjaWFsIG1lc3NhZ2VzICovCisJc3dpdGNoKG1zZ190eXBlKSB7CisJY2FzZSBNTkNDX0JSSURHRToKKwkJcmV0dXJuIHRjaF9icmlkZ2UobmV0LCBhcmcpOworCWNhc2UgTU5DQ19GUkFNRV9EUk9QOgorCQlyZXR1cm4gdGNoX3JlY3ZfbW5jYyhuZXQsIGRhdGEtPmNhbGxyZWYsIDApOworCWNhc2UgTU5DQ19GUkFNRV9SRUNWOgorCQlyZXR1cm4gdGNoX3JlY3ZfbW5jYyhuZXQsIGRhdGEtPmNhbGxyZWYsIDEpOworCWNhc2UgR1NNX1RDSEZfRlJBTUU6CisJCS8qIEZpbmQgY2FsbHJlZiAqLworCQl0cmFucyA9IHRyYW5zX2ZpbmRfYnlfY2FsbHJlZihuZXQsIGRhdGEtPmNhbGxyZWYpOworCQlpZiAoIXRyYW5zKQorCQkJcmV0dXJuIC1FSU87CisJCWlmICghdHJhbnMtPmxjaGFuKQorCQkJcmV0dXJuIDA7CisJCWlmICh0cmFucy0+bGNoYW4tPnR5cGUgIT0gR1NNX0xDSEFOX1RDSF9GKQorCQkJcmV0dXJuIDA7CisJCWJ0cyA9IHRyYW5zLT5sY2hhbi0+dHMtPnRyeC0+YnRzOworCQlzd2l0Y2ggKGJ0cy0+dHlwZSkgeworCQljYXNlIEdTTV9CVFNfVFlQRV9OQU5PQlRTOgorCQkJaWYgKCF0cmFucy0+bGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCkKKwkJCQlyZXR1cm4gMDsKKwkJCXJldHVybiBydHBfc2VuZF9mcmFtZSh0cmFucy0+bGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCwgYXJnKTsKKwkJY2FzZSBHU01fQlRTX1RZUEVfQlMxMToKKwkJCXJldHVybiB0cmF1X3NlbmRfZnJhbWUodHJhbnMtPmxjaGFuLCBhcmcpOworCQlkZWZhdWx0OgorCQkJREVCVUdQKERDQywgIlVua25vd24gQlRTIHR5cGUgJXVcbiIsIGJ0cy0+dHlwZSk7CisJCX0KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbWVtc2V0KCZyZWwsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwlyZWwuY2FsbHJlZiA9IGRhdGEtPmNhbGxyZWY7CisKKwkvKiBGaW5kIGNhbGxyZWYgKi8KKwl0cmFucyA9IHRyYW5zX2ZpbmRfYnlfY2FsbHJlZihuZXQsIGRhdGEtPmNhbGxyZWYpOworCisJLyogQ2FsbHJlZiB1bmtub3duICovCisJaWYgKCF0cmFucykgeworCQlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKKworCQlpZiAobXNnX3R5cGUgIT0gTU5DQ19TRVRVUF9SRVEpIHsKKwkJCURFQlVHUChEQ0MsICIoYnRzIC0gdHJ4IC0gdHMgLSB0aSAtLSBzdWIgJXMpICIKKwkJCQkiUmVjZWl2ZWQgJyVzJyBmcm9tIE1OQ0Mgd2l0aCAiCisJCQkJInVua25vd24gY2FsbHJlZiAlZFxuIiwgZGF0YS0+Y2FsbGVkLm51bWJlciwKKwkJCQlnZXRfbW5jY19uYW1lKG1zZ190eXBlKSwgZGF0YS0+Y2FsbHJlZik7CisJCQkvKiBJbnZhbGlkIGNhbGwgcmVmZXJlbmNlICovCisJCQlyZXR1cm4gbW5jY19yZWxlYXNlX2luZChuZXQsIE5VTEwsIGRhdGEtPmNhbGxyZWYsCisJCQkJCQlHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUsCisJCQkJCQlHU000OF9DQ19DQVVTRV9JTlZBTF9UUkFOU19JRCk7CisJCX0KKwkJaWYgKCFkYXRhLT5jYWxsZWQubnVtYmVyWzBdICYmICFkYXRhLT5pbXNpWzBdKSB7CisJCQlERUJVR1AoRENDLCAiKGJ0cyAtIHRyeCAtIHRzIC0gdGkpICIKKwkJCQkiUmVjZWl2ZWQgJyVzJyBmcm9tIE1OQ0Mgd2l0aCAiCisJCQkJIm5vIG51bWJlciBvciBJTVNJXG4iLCBnZXRfbW5jY19uYW1lKG1zZ190eXBlKSk7CisJCQkvKiBJbnZhbGlkIG51bWJlciAqLworCQkJcmV0dXJuIG1uY2NfcmVsZWFzZV9pbmQobmV0LCBOVUxMLCBkYXRhLT5jYWxscmVmLAorCQkJCQkJR1NNNDhfQ0FVU0VfTE9DX1BSTl9TX0xVLAorCQkJCQkJR1NNNDhfQ0NfQ0FVU0VfSU5WX05SX0ZPUk1BVCk7CisJCX0KKwkJLyogTmV3IHRyYW5zYWN0aW9uIGR1ZSB0byBzZXR1cCwgZmluZCBzdWJzY3JpYmVyICovCisJCWlmIChkYXRhLT5jYWxsZWQubnVtYmVyWzBdKQorCQkJc3Vic2NyID0gc3Vic2NyX2dldF9ieV9leHRlbnNpb24obmV0LAorCQkJCQkJCWRhdGEtPmNhbGxlZC5udW1iZXIpOworCQllbHNlCisJCQlzdWJzY3IgPSBzdWJzY3JfZ2V0X2J5X2ltc2kobmV0LCBkYXRhLT5pbXNpKTsKKwkJLyogSWYgc3Vic2NyaWJlciBpcyBub3QgZm91bmQgKi8KKwkJaWYgKCFzdWJzY3IpIHsKKwkJCURFQlVHUChEQ0MsICIoYnRzIC0gdHJ4IC0gdHMgLSB0aSAtLSBzdWIgJXMpICIKKwkJCQkiUmVjZWl2ZWQgJyVzJyBmcm9tIE1OQ0Mgd2l0aCAiCisJCQkJInVua25vd24gc3Vic2NyaWJlciAlc1xuIiwgZGF0YS0+Y2FsbGVkLm51bWJlciwKKwkJCQlnZXRfbW5jY19uYW1lKG1zZ190eXBlKSwgZGF0YS0+Y2FsbGVkLm51bWJlcik7CisJCQkvKiBVbmtub3duIHN1YnNjcmliZXIgKi8KKwkJCXJldHVybiBtbmNjX3JlbGVhc2VfaW5kKG5ldCwgTlVMTCwgZGF0YS0+Y2FsbHJlZiwKKwkJCQkJCUdTTTQ4X0NBVVNFX0xPQ19QUk5fU19MVSwKKwkJCQkJCUdTTTQ4X0NDX0NBVVNFX1VOQVNTSUdORURfTlIpOworCQl9CisJCS8qIElmIHN1YnNjcmliZXIgaXMgbm90ICJhdHRhY2hlZCIgKi8KKwkJaWYgKCFzdWJzY3ItPmxhYykgeworCQkJREVCVUdQKERDQywgIihidHMgLSB0cnggLSB0cyAtIHRpIC0tIHN1YiAlcykgIgorCQkJCSJSZWNlaXZlZCAnJXMnIGZyb20gTU5DQyB3aXRoICIKKwkJCQkiZGV0YWNoZWQgc3Vic2NyaWJlciAlc1xuIiwgZGF0YS0+Y2FsbGVkLm51bWJlciwKKwkJCQlnZXRfbW5jY19uYW1lKG1zZ190eXBlKSwgZGF0YS0+Y2FsbGVkLm51bWJlcik7CisJCQlzdWJzY3JfcHV0KHN1YnNjcik7CisJCQkvKiBUZW1wb3JhcmlseSBvdXQgb2Ygb3JkZXIgKi8KKwkJCXJldHVybiBtbmNjX3JlbGVhc2VfaW5kKG5ldCwgTlVMTCwgZGF0YS0+Y2FsbHJlZiwKKwkJCQkJCUdTTTQ4X0NBVVNFX0xPQ19QUk5fU19MVSwKKwkJCQkJCUdTTTQ4X0NDX0NBVVNFX0RFU1RfT09PKTsKKwkJfQorCQkvKiBDcmVhdGUgdHJhbnNhY3Rpb24gKi8KKwkJdHJhbnMgPSB0cmFuc19hbGxvYyhzdWJzY3IsIEdTTTQ4X1BESVNDX0NDLCAweGZmLCBkYXRhLT5jYWxscmVmKTsKKwkJaWYgKCF0cmFucykgeworCQkJREVCVUdQKERDQywgIk5vIG1lbW9yeSBmb3IgdHJhbnMuXG4iKTsKKwkJCXN1YnNjcl9wdXQoc3Vic2NyKTsKKwkJCS8qIFJlc3NvdXJjZSB1bmF2YWlsYWJsZSAqLworCQkJbW5jY19yZWxlYXNlX2luZChuZXQsIE5VTEwsIGRhdGEtPmNhbGxyZWYsCisJCQkJCSBHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUsCisJCQkJCSBHU000OF9DQ19DQVVTRV9SRVNPVVJDRV9VTkFWQUlMKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCS8qIEZpbmQgbGNoYW4gKi8KKwkJbGNoYW4gPSBsY2hhbl9mb3Jfc3Vic2NyKHN1YnNjcik7CisJCS8qIElmIHN1YnNjcmliZXIgaGFzIG5vIGxjaGFuICovCisJCWlmICghbGNoYW4pIHsKKwkJCS8qIGZpbmQgdHJhbnNhY3Rpb24gd2l0aCB0aGlzIHN1YnNjcmliZXIgYWxyZWFkeSBwYWdpbmcgKi8KKwkJCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHRyYW5zdCwgJm5ldC0+dHJhbnNfbGlzdCwgZW50cnkpIHsKKwkJCQkvKiBUcmFuc2FjdGlvbiBvZiBvdXIgbGNoYW4/ICovCisJCQkJaWYgKHRyYW5zdCA9PSB0cmFucyB8fAorCQkJCSAgICB0cmFuc3QtPnN1YnNjciAhPSBzdWJzY3IpCisJCQkJCWNvbnRpbnVlOworCQkJCURFQlVHUChEQ0MsICIoYnRzICVkIHRyeCAtIHRzIC0gdGkgLS0gc3ViICVzKSAiCisJCQkJCSJSZWNlaXZlZCAnJXMnIGZyb20gTU5DQyB3aXRoICIKKwkJCQkJInVuYWxsb2NhdGVkIGNoYW5uZWwsIHBhZ2luZyBhbHJlYWR5ICIKKwkJCQkJInN0YXJ0ZWQuXG4iLCBidHMtPm5yLAorCQkJCQlkYXRhLT5jYWxsZWQubnVtYmVyLAorCQkJCQlnZXRfbW5jY19uYW1lKG1zZ190eXBlKSk7CisJCQkJc3Vic2NyX3B1dChzdWJzY3IpOworCQkJCXRyYW5zX2ZyZWUodHJhbnMpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJLyogc3RvcmUgc2V0dXAgaW5mb3JtYXRpb25zIHVudGlsIHBhZ2luZyB3YXMgc3VjY2Vzc2Z1bGwgKi8KKwkJCW1lbWNweSgmdHJhbnMtPmNjLm1zZywgZGF0YSwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCQkJLyogVHJpZ2dlciBwYWdpbmcgKi8KKwkJCXBhZ2luZ19yZXF1ZXN0KG5ldCwgc3Vic2NyLCBSU0xfQ0hBTk5FRURfVENIX0YsCisJCQkJCXNldHVwX3RyaWdfcGFnX2V2dCwgc3Vic2NyKTsKKwkJCXN1YnNjcl9wdXQoc3Vic2NyKTsKKwkJCXJldHVybiAwOworCQl9CisJCS8qIEFzc2lnbiBsY2hhbiAqLworCQl0cmFucy0+bGNoYW4gPSBsY2hhbjsKKwkJdXNlX2xjaGFuKGxjaGFuKTsKKwkJc3Vic2NyX3B1dChzdWJzY3IpOworCX0KKwlsY2hhbiA9IHRyYW5zLT5sY2hhbjsKKworCS8qIGlmIHBhZ2luZyBkaWQgbm90IHJlc3BvbmQgeWV0ICovCisJaWYgKCFsY2hhbikgeworCQlERUJVR1AoRENDLCAiKGJ0cyAtIHRyeCAtIHRzIC0gdGkgLS0gc3ViICVzKSAiCisJCQkiUmVjZWl2ZWQgJyVzJyBmcm9tIE1OQ0MgaW4gcGFnaW5nIHN0YXRlXG4iLCAKKwkJCSh0cmFucy0+c3Vic2NyKT8odHJhbnMtPnN1YnNjci0+ZXh0ZW5zaW9uKToiLSIsCisJCQlnZXRfbW5jY19uYW1lKG1zZ190eXBlKSk7CisJCW1uY2Nfc2V0X2NhdXNlKCZyZWwsIEdTTTQ4X0NBVVNFX0xPQ19QUk5fU19MVSwKKwkJCQlHU000OF9DQ19DQVVTRV9OT1JNX0NBTExfQ0xFQVIpOworCQlpZiAobXNnX3R5cGUgPT0gTU5DQ19SRUxfUkVRKQorCQkJcmMgPSBtbmNjX3JlY3Ztc2cobmV0LCB0cmFucywgTU5DQ19SRUxfQ05GLCAmcmVsKTsKKwkJZWxzZQorCQkJcmMgPSBtbmNjX3JlY3Ztc2cobmV0LCB0cmFucywgTU5DQ19SRUxfSU5ELCAmcmVsKTsKKwkJdHJhbnMtPmNhbGxyZWYgPSAwOworCQl0cmFuc19mcmVlKHRyYW5zKTsKKwkJcmV0dXJuIHJjOworCX0KKworCURFQlVHUChEQ0MsICIoYnRzICVkIHRyeCAlZCB0cyAlZCB0aSAlMDJ4IHN1YiAlcykgIgorCQkiUmVjZWl2ZWQgJyVzJyBmcm9tIE1OQ0MgaW4gc3RhdGUgJWQgKCVzKVxuIiwKKwkJbGNoYW4tPnRzLT50cngtPmJ0cy0+bnIsIGxjaGFuLT50cy0+dHJ4LT5uciwgbGNoYW4tPnRzLT5uciwKKwkJdHJhbnMtPnRyYW5zYWN0aW9uX2lkLAorCQkobGNoYW4tPnN1YnNjcik/KGxjaGFuLT5zdWJzY3ItPmV4dGVuc2lvbik6Ii0iLAorCQlnZXRfbW5jY19uYW1lKG1zZ190eXBlKSwgdHJhbnMtPmNjLnN0YXRlLAorCQlnc200OF9jY19zdGF0ZV9uYW1lKHRyYW5zLT5jYy5zdGF0ZSkpOworCisJLyogRmluZCBmdW5jdGlvbiBmb3IgY3VycmVudCBzdGF0ZSBhbmQgbWVzc2FnZSAqLworCWZvciAoaSA9IDA7IGkgPCBET1dOU0xMRU47IGkrKykKKwkJaWYgKChtc2dfdHlwZSA9PSBkb3duc3RhdGVsaXN0W2ldLnR5cGUpCisJCSAmJiAoKDEgPDwgdHJhbnMtPmNjLnN0YXRlKSAmIGRvd25zdGF0ZWxpc3RbaV0uc3RhdGVzKSkKKwkJCWJyZWFrOworCWlmIChpID09IERPV05TTExFTikgeworCQlERUJVR1AoRENDLCAiTWVzc2FnZSB1bmhhbmRsZWQgYXQgdGhpcyBzdGF0ZS5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyYyA9IGRvd25zdGF0ZWxpc3RbaV0ucm91dCh0cmFucywgYXJnKTsKKworCXJldHVybiByYzsKK30KKworCitzdGF0aWMgc3RydWN0IGRhdGFzdGF0ZSB7CisJdV9pbnQzMl90CXN0YXRlczsKKwlpbnQJCXR5cGU7CisJaW50CQkoKnJvdXQpIChzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgc3RydWN0IG1zZ2IgKm1zZyk7Cit9IGRhdGFzdGF0ZWxpc3RbXSA9IHsKKwkvKiBtb2JpbGUgb3JpZ2luYXRpbmcgY2FsbCBlc3RhYmxpc2htZW50ICovCisJe1NCSVQoR1NNX0NTVEFURV9OVUxMKSwgLyogNS4yLjEuMiAqLworCSBHU000OF9NVF9DQ19TRVRVUCwgZ3NtNDhfY2Nfcnhfc2V0dXB9LAorCXtTQklUKEdTTV9DU1RBVEVfTlVMTCksIC8qIDUuMi4xLjIgKi8KKwkgR1NNNDhfTVRfQ0NfRU1FUkdfU0VUVVAsIGdzbTQ4X2NjX3J4X3NldHVwfSwKKwl7U0JJVChHU01fQ1NUQVRFX0NPTk5FQ1RfSU5EKSwgLyogNS4yLjEuMiAqLworCSBHU000OF9NVF9DQ19DT05ORUNUX0FDSywgZ3NtNDhfY2NfcnhfY29ubmVjdF9hY2t9LAorCS8qIG1vYmlsZSB0ZXJtaW5hdGluZyBjYWxsIGVzdGFibGlzaG1lbnQgKi8KKwl7U0JJVChHU01fQ1NUQVRFX0NBTExfUFJFU0VOVCksIC8qIDUuMi4yLjMuMiAqLworCSBHU000OF9NVF9DQ19DQUxMX0NPTkYsIGdzbTQ4X2NjX3J4X2NhbGxfY29uZn0sCisJe1NCSVQoR1NNX0NTVEFURV9DQUxMX1BSRVNFTlQpIHwgU0JJVChHU01fQ1NUQVRFX01PX1RFUk1fQ0FMTF9DT05GKSwgLyogPz8/PyB8IDUuMi4yLjMuMiAqLworCSBHU000OF9NVF9DQ19BTEVSVElORywgZ3NtNDhfY2NfcnhfYWxlcnRpbmd9LAorCXtTQklUKEdTTV9DU1RBVEVfQ0FMTF9QUkVTRU5UKSB8IFNCSVQoR1NNX0NTVEFURV9NT19URVJNX0NBTExfQ09ORikgfCBTQklUKEdTTV9DU1RBVEVfQ0FMTF9SRUNFSVZFRCksIC8qICg1LjIuMi42KSB8IDUuMi4yLjYgfCA1LjIuMi42ICovICAKKwkgR1NNNDhfTVRfQ0NfQ09OTkVDVCwgZ3NtNDhfY2NfcnhfY29ubmVjdH0sCisJIC8qIHNpZ25hbGxpbmcgZHVyaW5nIGNhbGwgKi8KKwl7QUxMX1NUQVRFUyAtIFNCSVQoR1NNX0NTVEFURV9OVUxMKSwKKwkgR1NNNDhfTVRfQ0NfRkFDSUxJVFksIGdzbTQ4X2NjX3J4X2ZhY2lsaXR5fSwKKwl7U0JJVChHU01fQ1NUQVRFX0FDVElWRSksCisJIEdTTTQ4X01UX0NDX05PVElGWSwgZ3NtNDhfY2Nfcnhfbm90aWZ5fSwKKwl7QUxMX1NUQVRFUywKKwkgR1NNNDhfTVRfQ0NfU1RBUlRfRFRNRiwgZ3NtNDhfY2Nfcnhfc3RhcnRfZHRtZn0sCisJe0FMTF9TVEFURVMsCisJIEdTTTQ4X01UX0NDX1NUT1BfRFRNRiwgZ3NtNDhfY2Nfcnhfc3RvcF9kdG1mfSwKKwl7QUxMX1NUQVRFUywKKwkgR1NNNDhfTVRfQ0NfU1RBVFVTX0VOUSwgZ3NtNDhfY2Nfcnhfc3RhdHVzX2VucX0sCisJe1NCSVQoR1NNX0NTVEFURV9BQ1RJVkUpLAorCSBHU000OF9NVF9DQ19IT0xELCBnc200OF9jY19yeF9ob2xkfSwKKwl7U0JJVChHU01fQ1NUQVRFX0FDVElWRSksCisJIEdTTTQ4X01UX0NDX1JFVFIsIGdzbTQ4X2NjX3J4X3JldHJpZXZlfSwKKwl7U0JJVChHU01fQ1NUQVRFX0FDVElWRSksCisJIEdTTTQ4X01UX0NDX01PRElGWSwgZ3NtNDhfY2NfcnhfbW9kaWZ5fSwKKwl7U0JJVChHU01fQ1NUQVRFX01PX1RFUk1fTU9ESUZZKSwKKwkgR1NNNDhfTVRfQ0NfTU9ESUZZX0NPTVBMLCBnc200OF9jY19yeF9tb2RpZnlfY29tcGxldGV9LAorCXtTQklUKEdTTV9DU1RBVEVfTU9fVEVSTV9NT0RJRlkpLAorCSBHU000OF9NVF9DQ19NT0RJRllfUkVKRUNULCBnc200OF9jY19yeF9tb2RpZnlfcmVqZWN0fSwKKwl7U0JJVChHU01fQ1NUQVRFX0FDVElWRSksCisJIEdTTTQ4X01UX0NDX1VTRVJfSU5GTywgZ3NtNDhfY2NfcnhfdXNlcmluZm99LAorCS8qIGNsZWFyaW5nICovCisJe0FMTF9TVEFURVMgLSBTQklUKEdTTV9DU1RBVEVfTlVMTCkgLSBTQklUKEdTTV9DU1RBVEVfUkVMRUFTRV9SRVEpLCAvKiA1LjQuMy4yICovCisJIEdTTTQ4X01UX0NDX0RJU0NPTk5FQ1QsIGdzbTQ4X2NjX3J4X2Rpc2Nvbm5lY3R9LAorCXtBTExfU1RBVEVTIC0gU0JJVChHU01fQ1NUQVRFX05VTEwpLCAvKiA1LjQuNC4xLjIuMiAqLworCSBHU000OF9NVF9DQ19SRUxFQVNFLCBnc200OF9jY19yeF9yZWxlYXNlfSwKKwl7QUxMX1NUQVRFUywgLyogNS40LjMuNCAqLworCSBHU000OF9NVF9DQ19SRUxFQVNFX0NPTVBMLCBnc200OF9jY19yeF9yZWxlYXNlX2NvbXBsfSwKK307CisKKyNkZWZpbmUgREFUQVNMTEVOIFwKKwkoc2l6ZW9mKGRhdGFzdGF0ZWxpc3QpIC8gc2l6ZW9mKHN0cnVjdCBkYXRhc3RhdGUpKQorCitzdGF0aWMgaW50IGdzbTA0MDhfcmN2X2NjKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJdV9pbnQ4X3QgbXNnX3R5cGUgPSBnaC0+bXNnX3R5cGUgJiAweGJmOworCXVfaW50OF90IHRyYW5zYWN0aW9uX2lkID0gKChnaC0+cHJvdG9fZGlzY3IgJiAweGYwKSBeIDB4ODApID4+IDQ7IC8qIGZsaXAgKi8KKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IG1zZy0+bGNoYW47CisJc3RydWN0IGdzbV90cmFucyAqdHJhbnMgPSBOVUxMOworCWludCBpLCByYyA9IDA7CisKKwlpZiAobXNnX3R5cGUgJiAweDgwKSB7CisJCURFQlVHUChEQ0MsICJNU0cgMHglMnggbm90IGRlZmluZWQgZm9yIFBEIGVycm9yXG4iLCBtc2dfdHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkKKwkvKiBGaW5kIHRyYW5zYWN0aW9uICovCisJdHJhbnMgPSB0cmFuc19maW5kX2J5X2lkKGxjaGFuLT5zdWJzY3IsIEdTTTQ4X1BESVNDX0NDLCB0cmFuc2FjdGlvbl9pZCk7CisKKwlERUJVR1AoRENDLCAiKGJ0cyAlZCB0cnggJWQgdHMgJWQgdGkgJXggc3ViICVzKSAiCisJCSJSZWNlaXZlZCAnJXMnIGZyb20gTVMgaW4gc3RhdGUgJWQgKCVzKVxuIiwKKwkJbGNoYW4tPnRzLT50cngtPmJ0cy0+bnIsIGxjaGFuLT50cy0+dHJ4LT5uciwgbGNoYW4tPnRzLT5uciwKKwkJdHJhbnNhY3Rpb25faWQsIChsY2hhbi0+c3Vic2NyKT8obGNoYW4tPnN1YnNjci0+ZXh0ZW5zaW9uKToiLSIsCisJCWdzbTQ4X2NjX21zZ19uYW1lKG1zZ190eXBlKSwgdHJhbnM/KHRyYW5zLT5jYy5zdGF0ZSk6MCwKKwkJZ3NtNDhfY2Nfc3RhdGVfbmFtZSh0cmFucz8odHJhbnMtPmNjLnN0YXRlKTowKSk7CisKKwkvKiBDcmVhdGUgdHJhbnNhY3Rpb24gKi8KKwlpZiAoIXRyYW5zKSB7CisJCURFQlVHUChEQ0MsICJVbmtub3duIHRyYW5zYWN0aW9uIElEICV4LCAiCisJCQkiY3JlYXRpbmcgbmV3IHRyYW5zLlxuIiwgdHJhbnNhY3Rpb25faWQpOworCQkvKiBDcmVhdGUgdHJhbnNhY3Rpb24gKi8KKwkJdHJhbnMgPSB0cmFuc19hbGxvYyhsY2hhbi0+c3Vic2NyLCBHU000OF9QRElTQ19DQywKKwkJCQkgICAgdHJhbnNhY3Rpb25faWQsIG5ld19jYWxscmVmKyspOworCQlpZiAoIXRyYW5zKSB7CisJCQlERUJVR1AoRENDLCAiTm8gbWVtb3J5IGZvciB0cmFucy5cbiIpOworCQkJcmMgPSBnc200OF90eF9zaW1wbGUobXNnLT5sY2hhbiwKKwkJCQkJICAgICBHU000OF9QRElTQ19DQyB8ICh0cmFuc2FjdGlvbl9pZCA8PCA0KSwKKwkJCQkJICAgICBHU000OF9NVF9DQ19SRUxFQVNFX0NPTVBMKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCS8qIEFzc2lnbiB0cmFuc2FjdGlvbiAqLworCQl0cmFucy0+bGNoYW4gPSBsY2hhbjsKKwkJdXNlX2xjaGFuKGxjaGFuKTsKKwl9CisKKwkvKiBmaW5kIGZ1bmN0aW9uIGZvciBjdXJyZW50IHN0YXRlIGFuZCBtZXNzYWdlICovCisJZm9yIChpID0gMDsgaSA8IERBVEFTTExFTjsgaSsrKQorCQlpZiAoKG1zZ190eXBlID09IGRhdGFzdGF0ZWxpc3RbaV0udHlwZSkKKwkJICYmICgoMSA8PCB0cmFucy0+Y2Muc3RhdGUpICYgZGF0YXN0YXRlbGlzdFtpXS5zdGF0ZXMpKQorCQkJYnJlYWs7CisJaWYgKGkgPT0gREFUQVNMTEVOKSB7CisJCURFQlVHUChEQ0MsICJNZXNzYWdlIHVuaGFuZGxlZCBhdCB0aGlzIHN0YXRlLlxuIik7CisJCXJldHVybiAwOworCX0KKworCXJjID0gZGF0YXN0YXRlbGlzdFtpXS5yb3V0KHRyYW5zLCBtc2cpOworCisJcmV0dXJuIHJjOworfQorCisvKiBoZXJlIHdlIHBhc3MgaW4gYSBtc2diIGZyb20gdGhlIFJTTC0+UkxMLiAgV2UgZXhwZWN0IHRoZSBsMyBwb2ludGVyIHRvIGJlIHNldCAqLworaW50IGdzbTA0MDhfcmN2bXNnKHN0cnVjdCBtc2diICptc2csIHVfaW50OF90IGxpbmtfaWQpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJdV9pbnQ4X3QgcGRpc2MgPSBnaC0+cHJvdG9fZGlzY3IgJiAweDBmOworCWludCByYyA9IDA7CisKKwlpZiAoc2lsZW50X2NhbGxfcmVyb3V0ZShtc2cpKQorCQlyZXR1cm4gc2lsZW50X2NhbGxfcngobXNnKTsKKwkKKwlzd2l0Y2ggKHBkaXNjKSB7CisJY2FzZSBHU000OF9QRElTQ19DQzoKKwkJcmMgPSBnc20wNDA4X3Jjdl9jYyhtc2cpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X1BESVNDX01NOgorCQlyYyA9IGdzbTA0MDhfcmN2X21tKG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfUERJU0NfUlI6CisJCXJjID0gZ3NtMDQwOF9yY3ZfcnIobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9QRElTQ19TTVM6CisJCXJjID0gZ3NtMDQxMV9yY3Zfc21zKG1zZywgbGlua19pZCk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfUERJU0NfTU1fR1BSUzoKKwljYXNlIEdTTTQ4X1BESVNDX1NNX0dQUlM6CisJCUxPR1AoRFJMTCwgTE9HTF9OT1RJQ0UsICJVbmltcGxlbWVudGVkICIKKwkJCSJHU00gMDQuMDggZGlzY3JpbWluYXRvciAweCUwMnhcbiIsIHBkaXNjKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9QRElTQ19OQ19TUzoKKwkJcmMgPSBoYW5kbGVfcmN2X3Vzc2QobXNnKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChEUkxMLCBMT0dMX05PVElDRSwgIlVua25vd24gIgorCQkJIkdTTSAwNC4wOCBkaXNjcmltaW5hdG9yIDB4JTAyeFxuIiwgcGRpc2MpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIGRlcXVldWUgbWVzc2FnZXMgdG8gbGF5ZXIgNCAqLworaW50IGJzY191cHF1ZXVlKHN0cnVjdCBnc21fbmV0d29yayAqbmV0KQoreworCXN0cnVjdCBnc21fbW5jYyAqbW5jYzsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCWludCB3b3JrID0gMDsKKworCWlmIChuZXQpCisJCXdoaWxlICgobXNnID0gbXNnYl9kZXF1ZXVlKCZuZXQtPnVwcXVldWUpKSkgeworCQkJbW5jYyA9IChzdHJ1Y3QgZ3NtX21uY2MgKiltc2ctPmRhdGE7CisJCQlpZiAobmV0LT5tbmNjX3JlY3YpCisJCQkJbmV0LT5tbmNjX3JlY3YobmV0LCBtbmNjLT5tc2dfdHlwZSwgbW5jYyk7CisJCQl3b3JrID0gMTsgLyogd29yayBkb25lICovCisJCQl0YWxsb2NfZnJlZShtc2cpOworCQl9CisKKwlyZXR1cm4gd29yazsKK30KKworLyoKKyAqIFRoaXMgd2lsbCBiZSByYW4gYnkgdGhlIGxpbmtlciB3aGVuIGxvYWRpbmcgdGhlIERTTy4gV2UgdXNlIGl0IHRvCisgKiBkbyBzeXN0ZW0gaW5pdGlhbGl6YXRpb24sIGUuZy4gcmVnaXN0cmF0aW9uIG9mIHNpZ25hbCBoYW5kbGVycy4KKyAqLworc3RhdGljIF9fYXR0cmlidXRlX18oKGNvbnN0cnVjdG9yKSkgdm9pZCBvbl9kc29fbG9hZF8wNDA4KHZvaWQpCit7CisJcmVnaXN0ZXJfc2lnbmFsX2hhbmRsZXIoU1NfTENIQU4sIGdzbTA0MDhfaGFuZGxlX2xjaGFuX3NpZ25hbCwgTlVMTCk7CisJcmVnaXN0ZXJfc2lnbmFsX2hhbmRsZXIoU1NfQUJJU0lQLCBoYW5kbGVfYWJpc2lwX3NpZ25hbCwgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9nc21fMDRfMDhfdXRpbHMuYyBiL29wZW5ic2Mvc3JjL2dzbV8wNF8wOF91dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NzJmMTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9nc21fMDRfMDhfdXRpbHMuYwpAQCAtMCwwICsxLDYyOSBAQAorLyogR1NNIE1vYmlsZSBSYWRpbyBJbnRlcmZhY2UgTGF5ZXIgMyBtZXNzYWdlcyBvbiB0aGUgQS1iaXMgaW50ZXJmYWNlCisgKiAzR1BQIFRTIDA0LjA4IHZlcnNpb24gNy4yMS4wIFJlbGVhc2UgMTk5OCAvIEVUU0kgVFMgMTAwIDk0MCBWNy4yMS4wCisgKiB1dGlsaXR5IGZ1bmN0aW9ucworICovCisKKy8qIChDKSAyMDA4LTIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDA4LCAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2dzbTQ4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzA4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy90cmFuc2FjdGlvbi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvcGFnaW5nLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKworI2RlZmluZSBHU000OF9BTExPQ19TSVpFCTEwMjQKKyNkZWZpbmUgR1NNNDhfQUxMT0NfSEVBRFJPT00JMTI4CisKKy8qIHNob3VsZCBpcC5hY2Nlc3MgQlRTIHVzZSBkaXJlY3QgUlRQIHN0cmVhbXMgYmV0d2VlbiBlYWNoIG90aGVyICgxKSwKKyAqIG9yIHNob3VsZCBPcGVuQlNDIGFsd2F5cyBhY3QgYXMgUlRQIHJlbGF5L3Byb3h5IGluIGJldHdlZW4gKDApID8gKi8KK2ludCBpcGFjY19ydHBfZGlyZWN0ID0gMTsKKworc3RydWN0IG1zZ2IgKmdzbTQ4X21zZ2JfYWxsb2Modm9pZCkKK3sKKwlyZXR1cm4gbXNnYl9hbGxvY19oZWFkcm9vbShHU000OF9BTExPQ19TSVpFLCBHU000OF9BTExPQ19IRUFEUk9PTSwKKwkJCQkgICAiR1NNIDA0LjA4Iik7Cit9CisKK2ludCBnc200OF9zZW5kbXNnKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnLT5kYXRhOworCisJLyogaWYgd2UgZ2V0IHBhc3NlZCBhIHRyYW5zYWN0aW9uIHJlZmVyZW5jZSwgZG8gc29tZSBjb21tb24KKwkgKiB3b3JrIHRoYXQgdGhlIGNhbGxlciBubyBsb25nZXIgaGFzIHRvIGRvICovCisJaWYgKHRyYW5zKSB7CisJCWdoLT5wcm90b19kaXNjciA9IHRyYW5zLT5wcm90b2NvbCB8ICh0cmFucy0+dHJhbnNhY3Rpb25faWQgPDwgNCk7CisJCW1zZy0+bGNoYW4gPSB0cmFucy0+bGNoYW47CisJfQorCisJaWYgKG1zZy0+bGNoYW4pIHsKKwkJbXNnLT50cnggPSBtc2ctPmxjaGFuLT50cy0+dHJ4OworCisJCWlmICgoZ2gtPnByb3RvX2Rpc2NyICYgR1NNNDhfUERJU0NfTUFTSykgPT0gR1NNNDhfUERJU0NfQ0MpCisJCQlERUJVR1AoRENDLCAiKGJ0cyAlZCB0cnggJWQgdHMgJWQgdGkgJTAyeCkgIgorCQkJCSJTZW5kaW5nICclcycgdG8gTVMuXG4iLCBtc2ctPnRyeC0+YnRzLT5uciwKKwkJCQltc2ctPnRyeC0+bnIsIG1zZy0+bGNoYW4tPnRzLT5uciwKKwkJCQlnaC0+cHJvdG9fZGlzY3IgJiAweGYwLAorCQkJCWdzbTQ4X2NjX21zZ19uYW1lKGdoLT5tc2dfdHlwZSkpOworCQllbHNlCisJCQlERUJVR1AoRENDLCAiKGJ0cyAlZCB0cnggJWQgdHMgJWQgcGQgJTAyeCkgIgorCQkJCSJTZW5kaW5nIDB4JTAyeCB0byBNUy5cbiIsIG1zZy0+dHJ4LT5idHMtPm5yLAorCQkJCW1zZy0+dHJ4LT5uciwgbXNnLT5sY2hhbi0+dHMtPm5yLAorCQkJCWdoLT5wcm90b19kaXNjciwgZ2gtPm1zZ190eXBlKTsKKwl9CisKKwltc2ctPmwzaCA9IG1zZy0+ZGF0YTsKKworCXJldHVybiByc2xfZGF0YV9yZXF1ZXN0KG1zZywgMCk7Cit9CisKKy8qIFNlY3Rpb24gOS4xLjggLyBUYWJsZSA5LjkgKi8KK3N0cnVjdCBjaHJlcSB7CisJdV9pbnQ4X3QgdmFsOworCXVfaW50OF90IG1hc2s7CisJZW51bSBjaHJlcV90eXBlIHR5cGU7Cit9OworCisvKiBJZiBTWVNURU0gSU5GT1JNQVRJT04gVFlQRSA0IE5FQ0kgYml0ID09IDEgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2hyZXEgY2hyZXFfdHlwZV9uZWNpMVtdID0geworCXsgMHhhMCwgMHhlMCwgQ0hSRVFfVF9FTUVSR19DQUxMIH0sCisJeyAweGMwLCAweGUwLCBDSFJFUV9UX0NBTExfUkVFU1RfVENIX0YgfSwKKwl7IDB4NjgsIDB4ZmMsIENIUkVRX1RfQ0FMTF9SRUVTVF9UQ0hfSCB9LAorCXsgMHg2YywgMHhmYywgQ0hSRVFfVF9DQUxMX1JFRVNUX1RDSF9IX0RCTCB9LAorCXsgMHhlMCwgMHhlMCwgQ0hSRVFfVF9TRENDSCB9LAorCXsgMHg0MCwgMHhmMCwgQ0hSRVFfVF9WT0lDRV9DQUxMX1RDSF9IIH0sCisJeyAweDUwLCAweGYwLCBDSFJFUV9UX0RBVEFfQ0FMTF9UQ0hfSCB9LAorCXsgMHgwMCwgMHhmMCwgQ0hSRVFfVF9MT0NBVElPTl9VUEQgfSwKKwl7IDB4MTAsIDB4ZjAsIENIUkVRX1RfU0RDQ0ggfSwKKwl7IDB4ODAsIDB4ZTAsIENIUkVRX1RfUEFHX1JfQU5ZX05FQ0kxIH0sCisJeyAweDIwLCAweGYwLCBDSFJFUV9UX1BBR19SX1RDSF9GIH0sCisJeyAweDMwLCAweGYwLCBDSFJFUV9UX1BBR19SX1RDSF9GSCB9LAorCXsgMHg2NywgMHhmZiwgQ0hSRVFfVF9MTVUgfSwKKwl7IDB4NjAsIDB4ZjksIENIUkVRX1RfUkVTRVJWRURfU0RDQ0ggfSwKKwl7IDB4NjEsIDB4ZmIsIENIUkVRX1RfUkVTRVJWRURfU0RDQ0ggfSwKKwl7IDB4NjMsCTB4ZmYsIENIUkVRX1RfUkVTRVJWRURfU0RDQ0ggfSwKKwl7IDB4N2YsIDB4ZmYsIENIUkVRX1RfUkVTRVJWRURfSUdOT1JFIH0sCit9OworCisvKiBJZiBTWVNURU0gSU5GT1JNQVRJT04gVFlQRSA0IE5FQ0kgYml0ID09IDAgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2hyZXEgY2hyZXFfdHlwZV9uZWNpMFtdID0geworCXsgMHhhMCwgMHhlMCwgQ0hSRVFfVF9FTUVSR19DQUxMIH0sCisJeyAweGMwLCAweGUwLCBDSFJFUV9UX0NBTExfUkVFU1RfVENIX0ggfSwKKwl7IDB4ZTAsIDB4ZTAsIENIUkVRX1RfVENIX0YgfSwKKwl7IDB4NTAsIDB4ZjAsIENIUkVRX1RfREFUQV9DQUxMX1RDSF9IIH0sCisJeyAweDAwLCAweGUwLCBDSFJFUV9UX0xPQ0FUSU9OX1VQRCB9LAorCXsgMHg4MCwgMHhlMCwgQ0hSRVFfVF9QQUdfUl9BTllfTkVDSTAgfSwKKwl7IDB4MjAsIDB4ZjAsIENIUkVRX1RfUEFHX1JfVENIX0YgfSwKKwl7IDB4MzAsIDB4ZjAsIENIUkVRX1RfUEFHX1JfVENIX0ZIIH0sCisJeyAweDY3LCAweGZmLCBDSFJFUV9UX0xNVSB9LAorCXsgMHg2MCwgMHhmOSwgQ0hSRVFfVF9SRVNFUlZFRF9TRENDSCB9LAorCXsgMHg2MSwgMHhmYiwgQ0hSRVFfVF9SRVNFUlZFRF9TRENDSCB9LAorCXsgMHg2MywJMHhmZiwgQ0hSRVFfVF9SRVNFUlZFRF9TRENDSCB9LAorCXsgMHg3ZiwgMHhmZiwgQ0hSRVFfVF9SRVNFUlZFRF9JR05PUkUgfSwKK307CisKK3N0YXRpYyBjb25zdCBlbnVtIGdzbV9jaGFuX3QgY3R5cGVfYnlfY2hyZXFbXSA9IHsKKwlbQ0hSRVFfVF9FTUVSR19DQUxMXQkJPSBHU01fTENIQU5fVENIX0YsCisJW0NIUkVRX1RfQ0FMTF9SRUVTVF9UQ0hfRl0JPSBHU01fTENIQU5fVENIX0YsCisJW0NIUkVRX1RfQ0FMTF9SRUVTVF9UQ0hfSF0JPSBHU01fTENIQU5fVENIX0gsCisJW0NIUkVRX1RfQ0FMTF9SRUVTVF9UQ0hfSF9EQkxdCT0gR1NNX0xDSEFOX1RDSF9ILAorCVtDSFJFUV9UX1NEQ0NIXQkJCT0gR1NNX0xDSEFOX1NEQ0NILAorCVtDSFJFUV9UX1RDSF9GXQkJCT0gR1NNX0xDSEFOX1RDSF9GLAorCVtDSFJFUV9UX1ZPSUNFX0NBTExfVENIX0hdCT0gR1NNX0xDSEFOX1RDSF9ILAorCVtDSFJFUV9UX0RBVEFfQ0FMTF9UQ0hfSF0JPSBHU01fTENIQU5fVENIX0gsCisJW0NIUkVRX1RfTE9DQVRJT05fVVBEXQkJPSBHU01fTENIQU5fU0RDQ0gsCisJW0NIUkVRX1RfUEFHX1JfQU5ZX05FQ0kxXQk9IEdTTV9MQ0hBTl9TRENDSCwKKwlbQ0hSRVFfVF9QQUdfUl9BTllfTkVDSTBdCT0gR1NNX0xDSEFOX1NEQ0NILAorCVtDSFJFUV9UX1BBR19SX1RDSF9GXQkJPSBHU01fTENIQU5fVENIX0YsCisJW0NIUkVRX1RfUEFHX1JfVENIX0ZIXQkJPSBHU01fTENIQU5fVENIX0YsCisJW0NIUkVRX1RfTE1VXQkJCT0gR1NNX0xDSEFOX1NEQ0NILAorCVtDSFJFUV9UX1JFU0VSVkVEX1NEQ0NIXQk9IEdTTV9MQ0hBTl9TRENDSCwKKwlbQ0hSRVFfVF9SRVNFUlZFRF9JR05PUkVdCT0gR1NNX0xDSEFOX1VOS05PV04sCit9OworCitzdGF0aWMgY29uc3QgZW51bSBnc21fY2hyZXFfcmVhc29uX3QgcmVhc29uX2J5X2NocmVxW10gPSB7CisJW0NIUkVRX1RfRU1FUkdfQ0FMTF0JCT0gR1NNX0NIUkVRX1JFQVNPTl9FTUVSRywKKwlbQ0hSRVFfVF9DQUxMX1JFRVNUX1RDSF9GXQk9IEdTTV9DSFJFUV9SRUFTT05fQ0FMTCwKKwlbQ0hSRVFfVF9DQUxMX1JFRVNUX1RDSF9IXQk9IEdTTV9DSFJFUV9SRUFTT05fQ0FMTCwKKwlbQ0hSRVFfVF9DQUxMX1JFRVNUX1RDSF9IX0RCTF0JPSBHU01fQ0hSRVFfUkVBU09OX0NBTEwsCisJW0NIUkVRX1RfU0RDQ0hdCQkJPSBHU01fQ0hSRVFfUkVBU09OX09USEVSLAorCVtDSFJFUV9UX1RDSF9GXQkJCT0gR1NNX0NIUkVRX1JFQVNPTl9PVEhFUiwKKwlbQ0hSRVFfVF9WT0lDRV9DQUxMX1RDSF9IXQk9IEdTTV9DSFJFUV9SRUFTT05fQ0FMTCwKKwlbQ0hSRVFfVF9EQVRBX0NBTExfVENIX0hdCT0gR1NNX0NIUkVRX1JFQVNPTl9PVEhFUiwKKwlbQ0hSRVFfVF9MT0NBVElPTl9VUERdCQk9IEdTTV9DSFJFUV9SRUFTT05fTE9DQVRJT05fVVBELAorCVtDSFJFUV9UX1BBR19SX0FOWV9ORUNJMV0JPSBHU01fQ0hSRVFfUkVBU09OX1BBRywKKwlbQ0hSRVFfVF9QQUdfUl9BTllfTkVDSTBdCT0gR1NNX0NIUkVRX1JFQVNPTl9QQUcsCisJW0NIUkVRX1RfUEFHX1JfVENIX0ZdCQk9IEdTTV9DSFJFUV9SRUFTT05fUEFHLAorCVtDSFJFUV9UX1BBR19SX1RDSF9GSF0JCT0gR1NNX0NIUkVRX1JFQVNPTl9QQUcsCisJW0NIUkVRX1RfTE1VXQkJCT0gR1NNX0NIUkVRX1JFQVNPTl9PVEhFUiwKKwlbQ0hSRVFfVF9SRVNFUlZFRF9TRENDSF0JPSBHU01fQ0hSRVFfUkVBU09OX09USEVSLAorCVtDSFJFUV9UX1JFU0VSVkVEX0lHTk9SRV0JPSBHU01fQ0hSRVFfUkVBU09OX09USEVSLAorfTsKKworZW51bSBnc21fY2hhbl90IGdldF9jdHlwZV9ieV9jaHJlcShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCByYSwgaW50IG5lY2kpCit7CisJaW50IGk7CisJaW50IGxlbmd0aDsKKwljb25zdCBzdHJ1Y3QgY2hyZXEgKmNocmVxOworCisJaWYgKG5lY2kpIHsKKwkJY2hyZXEgPSBjaHJlcV90eXBlX25lY2kxOworCQlsZW5ndGggPSBBUlJBWV9TSVpFKGNocmVxX3R5cGVfbmVjaTEpOworCX0gZWxzZSB7CisJCWNocmVxID0gY2hyZXFfdHlwZV9uZWNpMDsKKwkJbGVuZ3RoID0gQVJSQVlfU0laRShjaHJlcV90eXBlX25lY2kwKTsKKwl9CisKKworCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQljb25zdCBzdHJ1Y3QgY2hyZXEgKmNociA9ICZjaHJlcVtpXTsKKwkJaWYgKChyYSAmIGNoci0+bWFzaykgPT0gY2hyLT52YWwpCisJCQlyZXR1cm4gY3R5cGVfYnlfY2hyZXFbY2hyLT50eXBlXTsKKwl9CisJTE9HUChEUlIsIExPR0xfRVJST1IsICJVbmtub3duIENIQU5ORUwgUkVRVUVTVCBSUUQgMHglMDJ4XG4iLCByYSk7CisJcmV0dXJuIEdTTV9MQ0hBTl9TRENDSDsKK30KKworZW51bSBnc21fY2hyZXFfcmVhc29uX3QgZ2V0X3JlYXNvbl9ieV9jaHJlcShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCByYSwgaW50IG5lY2kpCit7CisJaW50IGk7CisJaW50IGxlbmd0aDsKKwljb25zdCBzdHJ1Y3QgY2hyZXEgKmNocmVxOworCisJaWYgKG5lY2kpIHsKKwkJY2hyZXEgPSBjaHJlcV90eXBlX25lY2kxOworCQlsZW5ndGggPSBBUlJBWV9TSVpFKGNocmVxX3R5cGVfbmVjaTEpOworCX0gZWxzZSB7CisJCWNocmVxID0gY2hyZXFfdHlwZV9uZWNpMDsKKwkJbGVuZ3RoID0gQVJSQVlfU0laRShjaHJlcV90eXBlX25lY2kwKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IGNocmVxICpjaHIgPSAmY2hyZXFbaV07CisJCWlmICgocmEgJiBjaHItPm1hc2spID09IGNoci0+dmFsKQorCQkJcmV0dXJuIHJlYXNvbl9ieV9jaHJlcVtjaHItPnR5cGVdOworCX0KKwlMT0dQKERSUiwgTE9HTF9FUlJPUiwgIlVua25vd24gQ0hBTk5FTCBSRVFVRVNUIFJFQVNPTiAweCUwMnhcbiIsIHJhKTsKKwlyZXR1cm4gR1NNX0NIUkVRX1JFQVNPTl9PVEhFUjsKK30KKworLyogNy4xLjcgYW5kIDkuMS43OiBSUiBDSEFObmVsIFJFTGVhc2UgKi8KK2ludCBnc200OF9zZW5kX3JyX3JlbGVhc2Uoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCXVfaW50OF90ICpjYXVzZTsKKworCW1zZy0+bGNoYW4gPSBsY2hhbjsKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19SUjsKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9SUl9DSEFOX1JFTDsKKworCWNhdXNlID0gbXNnYl9wdXQobXNnLCAxKTsKKwljYXVzZVswXSA9IEdTTTQ4X1JSX0NBVVNFX05PUk1BTDsKKworCURFQlVHUChEUlIsICJTZW5kaW5nIENoYW5uZWwgUmVsZWFzZTogQ2hhbjogTnVtYmVyOiAlZCBUeXBlOiAlZFxuIiwKKwkJbGNoYW4tPm5yLCBsY2hhbi0+dHlwZSk7CisKKwkvKiBTZW5kIGFjdHVhbCByZWxlYXNlIHJlcXVlc3QgdG8gTVMgKi8KKwlnc200OF9zZW5kbXNnKG1zZywgTlVMTCk7CisJLyogRklYTUU6IFN0YXJ0IFRpbWVyIFQzMTA5ICovCisKKwkvKiBEZWFjdGl2YXRlIHRoZSBTQUNDSCBvbiB0aGUgQlRTIHNpZGUgKi8KKwlyZXR1cm4gcnNsX2RlYWN0X3NhY2NoKGxjaGFuKTsKK30KKworLyogQ29udmVydCBNb2JpbGUgSWRlbnRpdHkgKDEwLjUuMS40KSB0byBzdHJpbmcgKi8KK2ludCBnc200OF9taV90b19zdHJpbmcoY2hhciAqc3RyaW5nLCBjb25zdCBpbnQgc3RyX2xlbiwgY29uc3QgdV9pbnQ4X3QgKm1pLCBjb25zdCBpbnQgbWlfbGVuKQoreworCWludCBpOworCXVfaW50OF90IG1pX3R5cGU7CisJY2hhciAqc3RyX2N1ciA9IHN0cmluZzsKKwl1X2ludDMyX3QgdG1zaTsKKworCW1pX3R5cGUgPSBtaVswXSAmIEdTTV9NSV9UWVBFX01BU0s7CisKKwlzd2l0Y2ggKG1pX3R5cGUpIHsKKwljYXNlIEdTTV9NSV9UWVBFX05PTkU6CisJCWJyZWFrOworCWNhc2UgR1NNX01JX1RZUEVfVE1TSToKKwkJLyogVGFibGUgMTAuNS40LjMsIHJldmVyc2UgZ2VuZXJhdGVfbWlkX2Zyb21fdG1zaSAqLworCQlpZiAobWlfbGVuID09IEdTTTQ4X1RNU0lfTEVOICYmIG1pWzBdID09ICgweGYwIHwgR1NNX01JX1RZUEVfVE1TSSkpIHsKKwkJCW1lbWNweSgmdG1zaSwgJm1pWzFdLCA0KTsKKwkJCXRtc2kgPSBudG9obCh0bXNpKTsKKwkJCXJldHVybiBzbnByaW50ZihzdHJpbmcsIHN0cl9sZW4sICIldSIsIHRtc2kpOworCQl9CisJCWJyZWFrOworCWNhc2UgR1NNX01JX1RZUEVfSU1TSToKKwljYXNlIEdTTV9NSV9UWVBFX0lNRUk6CisJY2FzZSBHU01fTUlfVFlQRV9JTUVJU1Y6CisJCSpzdHJfY3VyKysgPSBiY2QyY2hhcihtaVswXSA+PiA0KTsKKworICAgICAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBtaV9sZW47IGkrKykgeworCQkJaWYgKHN0cl9jdXIgKyAyID49IHN0cmluZyArIHN0cl9sZW4pCisJCQkJcmV0dXJuIHN0cl9jdXIgLSBzdHJpbmc7CisJCQkqc3RyX2N1cisrID0gYmNkMmNoYXIobWlbaV0gJiAweGYpOworCQkJLyogc2tpcCBsYXN0IG5pYmJsZSBpbiBsYXN0IGlucHV0IGJ5dGUgd2hlbiBHU01fRVZFTiAqLworCQkJaWYoIChpICE9IG1pX2xlbi0xKSB8fCAobWlbMF0gJiBHU01fTUlfT0REKSkKKwkJCQkqc3RyX2N1cisrID0gYmNkMmNoYXIobWlbaV0gPj4gNCk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCSpzdHJfY3VyKysgPSAnXDAnOworCisJcmV0dXJuIHN0cl9jdXIgLSBzdHJpbmc7Cit9CisKKworaW50IHNlbmRfc2llbWVuc19tcnBjaShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwKKwkJICAgICAgIHVfaW50OF90ICpjbGFzc21hcmsyX2x2KQoreworCXN0cnVjdCByc2xfbXJwY2kgbXJwY2k7CisKKwlpZiAoY2xhc3NtYXJrMl9sdlswXSA8IDIpCisJCXJldHVybiAtRUlOVkFMOworCisJbXJwY2kucG93ZXJfY2xhc3MgPSBjbGFzc21hcmsyX2x2WzFdICYgMHg3OworCW1ycGNpLnZnY3NfY2FwYWJsZSA9IGNsYXNzbWFyazJfbHZbMl0gJiAoMSA8PCAxKTsKKwltcnBjaS52YnNfY2FwYWJsZSA9IGNsYXNzbWFyazJfbHZbMl0gJiAoMSA8PDIpOworCW1ycGNpLmdzbV9waGFzZSA9IChjbGFzc21hcmsyX2x2WzFdKSA+PiA1ICYgMHgzOworCisJcmV0dXJuIHJzbF9zaWVtZW5zX21ycGNpKGxjaGFuLCAmbXJwY2kpOworfQorCitpbnQgZ3NtNDhfcGFnaW5nX2V4dHJhY3RfbWkoc3RydWN0IG1zZ2IgKm1zZywgY2hhciAqbWlfc3RyaW5nLCB1X2ludDhfdCAqbWlfdHlwZSkKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwl1X2ludDhfdCAqY2xhc3NtYXJrMl9sdiA9IGdoLT5kYXRhICsgMTsKKwl1X2ludDhfdCAqbWlfbHYgPSBnaC0+ZGF0YSArIDIgKyAqY2xhc3NtYXJrMl9sdjsKKwkqbWlfdHlwZSA9IG1pX2x2WzFdICYgR1NNX01JX1RZUEVfTUFTSzsKKworCXJldHVybiBnc200OF9taV90b19zdHJpbmcobWlfc3RyaW5nLCBHU000OF9NSV9TSVpFLCBtaV9sdisxLCAqbWlfbHYpOworfQorCitpbnQgZ3NtNDhfaGFuZGxlX3BhZ2luZ19yZXNwKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSBtc2ctPmxjaGFuLT50cy0+dHJ4LT5idHM7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJdV9pbnQ4X3QgKmNsYXNzbWFyazJfbHYgPSBnaC0+ZGF0YSArIDE7CisJc3RydWN0IHBhZ2luZ19zaWduYWxfZGF0YSBzaWdfZGF0YTsKKworCWlmIChpc19zaWVtZW5zX2J0cyhidHMpKQorCQlzZW5kX3NpZW1lbnNfbXJwY2kobXNnLT5sY2hhbiwgY2xhc3NtYXJrMl9sdik7CisKKwlpZiAoIW1zZy0+bGNoYW4tPnN1YnNjcikgeworCQltc2ctPmxjaGFuLT5zdWJzY3IgPSBzdWJzY3I7CisJfSBlbHNlIGlmIChtc2ctPmxjaGFuLT5zdWJzY3IgIT0gc3Vic2NyKSB7CisJCUxPR1AoRFJSLCBMT0dMX0VSUk9SLCAiPC0gQ2hhbm5lbCBhbHJlYWR5IG93bmVkIGJ5IHNvbWVvbmUgZWxzZT9cbiIpOworCQlzdWJzY3JfcHV0KHN1YnNjcik7CisJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSB7CisJCURFQlVHUChEUlIsICI8LSBDaGFubmVsIGFscmVhZHkgb3duZWQgYnkgdXNcbiIpOworCQlzdWJzY3JfcHV0KHN1YnNjcik7CisJCXN1YnNjciA9IG1zZy0+bGNoYW4tPnN1YnNjcjsKKwl9CisKKwlzaWdfZGF0YS5zdWJzY3IgPSBzdWJzY3I7CisJc2lnX2RhdGEuYnRzCT0gbXNnLT5sY2hhbi0+dHMtPnRyeC0+YnRzOworCXNpZ19kYXRhLmxjaGFuCT0gbXNnLT5sY2hhbjsKKworCWJ0cy0+bmV0d29yay0+c3RhdHMucGFnaW5nLmNvbXBsZXRlZCsrOworCisJZGlzcGF0Y2hfc2lnbmFsKFNTX1BBR0lORywgU19QQUdJTkdfU1VDQ0VFREVELCAmc2lnX2RhdGEpOworCisJLyogU3RvcCBwYWdpbmcgb24gdGhlIGJ0cyB3ZSByZWNlaXZlZCB0aGUgcGFnaW5nIHJlc3BvbnNlICovCisJcGFnaW5nX3JlcXVlc3Rfc3RvcChtc2ctPnRyeC0+YnRzLCBzdWJzY3IsIG1zZy0+bGNoYW4pOworCXJldHVybiAwOworfQorCisvKiBDaGFwdGVyIDkuMS45OiBDaXBoZXJpbmcgTW9kZSBDb21tYW5kICovCitpbnQgZ3NtNDhfc2VuZF9ycl9jaXBoX21vZGUoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIGludCB3YW50X2ltZWlzdikKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoOworCXVfaW50OF90IGNpcGhfbW9kX3NldDsKKworCW1zZy0+bGNoYW4gPSBsY2hhbjsKKworCURFQlVHUChEUlIsICJUWCBDSVBIRVJJTkcgTU9ERSBDTURcbiIpOworCisJaWYgKGxjaGFuLT5lbmNyLmFsZ19pZCA8PSBSU0xfRU5DX0FMR19BNSgwKSkKKwkJY2lwaF9tb2Rfc2V0ID0gMDsKKwllbHNlCisJCWNpcGhfbW9kX3NldCA9IChsY2hhbi0+ZW5jci5hbGdfaWQtMik8PDEgfCAxOworCisJZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpICsgMSk7CisJZ2gtPnByb3RvX2Rpc2NyID0gR1NNNDhfUERJU0NfUlI7CisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfUlJfQ0lQSF9NX0NNRDsKKwlnaC0+ZGF0YVswXSA9ICh3YW50X2ltZWlzdiAmIDB4MSkgPDwgNCB8IChjaXBoX21vZF9zZXQgJiAweGYpOworCisJcmV0dXJuIHJzbF9lbmNyeXB0aW9uX2NtZChtc2cpOworfQorCitzdGF0aWMgdm9pZCBnc200OF9jZWxsX2Rlc2Moc3RydWN0IGdzbTQ4X2NlbGxfZGVzYyAqY2QsCisJCQkgICAgY29uc3Qgc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwljZC0+bmNjID0gKGJ0cy0+YnNpYyA+PiAzICYgMHg3KTsKKwljZC0+YmNjID0gKGJ0cy0+YnNpYyAmIDB4Nyk7CisJY2QtPmFyZmNuX2hpID0gYnRzLT5jMC0+YXJmY24gPj4gODsKKwljZC0+YXJmY25fbG8gPSBidHMtPmMwLT5hcmZjbiAmIDB4ZmY7Cit9CisKK3N0YXRpYyB2b2lkIGdzbTQ4X2NoYW5fZGVzYyhzdHJ1Y3QgZ3NtNDhfY2hhbl9kZXNjICpjZCwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwl1X2ludDE2X3QgYXJmY24gPSBsY2hhbi0+dHMtPnRyeC0+YXJmY24gJiAweDNmZjsKKworCWNkLT5jaGFuX25yID0gbGNoYW4yY2hhbl9ucihsY2hhbik7CisJY2QtPmgwLnRzYyA9IGxjaGFuLT50cy0+dHJ4LT5idHMtPnRzYzsKKwljZC0+aDAuaCA9IDA7CisJY2QtPmgwLmFyZmNuX2hpZ2ggPSBhcmZjbiA+PiA4OworCWNkLT5oMC5hcmZjbl9sb3cgPSBhcmZjbiAmIDB4ZmY7Cit9CisKKy8qIENoYXB0ZXIgOS4xLjE1OiBIYW5kb3ZlciBDb21tYW5kICovCitpbnQgZ3NtNDhfc2VuZF9ob19jbWQoc3RydWN0IGdzbV9sY2hhbiAqb2xkX2xjaGFuLCBzdHJ1Y3QgZ3NtX2xjaGFuICpuZXdfbGNoYW4sCisJCSAgICAgIHVfaW50OF90IHBvd2VyX2NvbW1hbmQsIHVfaW50OF90IGhvX3JlZikKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisJc3RydWN0IGdzbTQ4X2hvX2NtZCAqaG8gPQorCQkoc3RydWN0IGdzbTQ4X2hvX2NtZCAqKSBtc2diX3B1dChtc2csIHNpemVvZigqaG8pKTsKKworCW1zZy0+bGNoYW4gPSBvbGRfbGNoYW47CisJZ2gtPnByb3RvX2Rpc2NyID0gR1NNNDhfUERJU0NfUlI7CisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfUlJfSEFORE9fQ01EOworCisJLyogbWFuZGF0b3J5IGJpdHMgKi8KKwlnc200OF9jZWxsX2Rlc2MoJmhvLT5jZWxsX2Rlc2MsIG5ld19sY2hhbi0+dHMtPnRyeC0+YnRzKTsKKwlnc200OF9jaGFuX2Rlc2MoJmhvLT5jaGFuX2Rlc2MsIG5ld19sY2hhbik7CisJaG8tPmhvX3JlZiA9IGhvX3JlZjsKKwloby0+cG93ZXJfY29tbWFuZCA9IHBvd2VyX2NvbW1hbmQ7CisKKwkvKiBGSVhNRTogb3B0aW9uYWwgYml0cyBmb3IgdHlwZSBvZiBzeW5jaHJvbml6YXRpb24/ICovCisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIE5VTEwpOworfQorCisvKiBDaGFwdGVyIDkuMS4yOiBBc3NpZ25tZW50IENvbW1hbmQgKi8KK2ludCBnc200OF9zZW5kX3JyX2Fzc19jbWQoc3RydWN0IGdzbV9sY2hhbiAqZGVzdF9sY2hhbiwgc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IHBvd2VyX2NvbW1hbmQpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCXN0cnVjdCBnc200OF9hc3NfY21kICphc3MgPQorCQkoc3RydWN0IGdzbTQ4X2Fzc19jbWQgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmFzcykpOworCisJREVCVUdQKERSUiwgIi0+IEFTU0lHTk1FTlQgQ09NTUFORCB0Y2hfbW9kZT0weCUwMnhcbiIsIGxjaGFuLT50Y2hfbW9kZSk7CisKKwltc2ctPmxjaGFuID0gZGVzdF9sY2hhbjsKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19SUjsKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9SUl9BU1NfQ01EOworCisJLyoKKwkgKiBmaWxsIHRoZSBjaGFubmVsIGluZm9ybWF0aW9uIGVsZW1lbnQsIHRoaXMgY29kZQorCSAqIHNob3VsZCBwcm9iYWJseSBiZSBzaGFyZWQgd2l0aCByc2xfcnhfY2hhbl9ycWQoKSwKKwkgKiBnc200OF90eF9jaGFuX21vZGVfbW9kaWZ5LiBCdXQgYmV3YXJlIHRoYXQgMTAuNS4yLjUKKwkgKiAxMC41LjIuNS5hIGhhdmUgc2xpZ2h0bHkgZGlmZmVyZW50IHNlbWFudGljIGZvcgorCSAqIHRoZSBjaGFuX2Rlc2MuIEJ1dCBhcyBsb25nIGFzIG11bHRpLXNsb3QgY29uZmlndXJhdGlvbnMKKwkgKiBhcmUgbm90IHVzZWQgd2Ugc2VlbSB0byBiZSBmaW5lLgorCSAqLworCWdzbTQ4X2NoYW5fZGVzYygmYXNzLT5jaGFuX2Rlc2MsIGxjaGFuKTsKKwlhc3MtPnBvd2VyX2NvbW1hbmQgPSBwb3dlcl9jb21tYW5kOworCisJbXNnYl90dl9wdXQobXNnLCBHU000OF9JRV9DSEFOTU9ERV8xLCBsY2hhbi0+dGNoX21vZGUpOworCisJLyogaW4gY2FzZSBvZiBtdWx0aSByYXRlIHdlIG5lZWQgdG8gYXR0YWNoIGEgY29uZmlnICovCisJaWYgKGxjaGFuLT50Y2hfbW9kZSA9PSBHU000OF9DTU9ERV9TUEVFQ0hfQU1SKSB7CisJCWlmIChsY2hhbi0+bXJfY29uZi52ZXIgPT0gMCkgeworCQkJTE9HUChEUlIsIExPR0xfRVJST1IsICJCVUc6IFVzaW5nIG11bHRpcmF0ZSBjb2RlYyAiCisJCQkJIndpdGhvdXQgbXVsdGlyYXRlIGNvbmZpZy5cbiIpOworCQl9IGVsc2UgeworCQkJdV9pbnQ4X3QgKmRhdGEgPSBtc2diX3B1dChtc2csIDQpOworCQkJZGF0YVswXSA9IEdTTTQ4X0lFX01VTF9SQVRFX0NGRzsKKwkJCWRhdGFbMV0gPSAweDI7CisJCQltZW1jcHkoJmRhdGFbMl0sICZsY2hhbi0+bXJfY29uZiwgMik7CisJCX0KKwl9CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIE5VTEwpOworfQorCisvKiA5LjEuNSBDaGFubmVsIG1vZGUgbW9kaWZ5OiBNb2RpZnkgdGhlIG1vZGUgb24gdGhlIE1TIHNpZGUgKi8KK2ludCBnc200OF90eF9jaGFuX21vZGVfbW9kaWZ5KHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBtb2RlKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKwlzdHJ1Y3QgZ3NtNDhfY2hhbl9tb2RlX21vZGlmeSAqY21tID0KKwkJKHN0cnVjdCBnc200OF9jaGFuX21vZGVfbW9kaWZ5ICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpjbW0pKTsKKwl1X2ludDE2X3QgYXJmY24gPSBsY2hhbi0+dHMtPnRyeC0+YXJmY24gJiAweDNmZjsKKworCURFQlVHUChEUlIsICItPiBDSEFOTkVMIE1PREUgTU9ESUZZIG1vZGU9MHglMDJ4XG4iLCBtb2RlKTsKKworCWxjaGFuLT50Y2hfbW9kZSA9IG1vZGU7CisJbXNnLT5sY2hhbiA9IGxjaGFuOworCWdoLT5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX1JSOworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX1JSX0NIQU5fTU9ERV9NT0RJRjsKKworCS8qIGZpbGwgdGhlIGNoYW5uZWwgaW5mb3JtYXRpb24gZWxlbWVudCwgdGhpcyBjb2RlCisJICogc2hvdWxkIHByb2JhYmx5IGJlIHNoYXJlZCB3aXRoIHJzbF9yeF9jaGFuX3JxZCgpICovCisJY21tLT5jaGFuX2Rlc2MuY2hhbl9uciA9IGxjaGFuMmNoYW5fbnIobGNoYW4pOworCWNtbS0+Y2hhbl9kZXNjLmgwLnRzYyA9IGxjaGFuLT50cy0+dHJ4LT5idHMtPnRzYzsKKwljbW0tPmNoYW5fZGVzYy5oMC5oID0gMDsKKwljbW0tPmNoYW5fZGVzYy5oMC5hcmZjbl9oaWdoID0gYXJmY24gPj4gODsKKwljbW0tPmNoYW5fZGVzYy5oMC5hcmZjbl9sb3cgPSBhcmZjbiAmIDB4ZmY7CisJY21tLT5tb2RlID0gbW9kZTsKKworCS8qIGluIGNhc2Ugb2YgbXVsdGkgcmF0ZSB3ZSBuZWVkIHRvIGF0dGFjaCBhIGNvbmZpZyAqLworCWlmIChsY2hhbi0+dGNoX21vZGUgPT0gR1NNNDhfQ01PREVfU1BFRUNIX0FNUikgeworCQlpZiAobGNoYW4tPm1yX2NvbmYudmVyID09IDApIHsKKwkJCUxPR1AoRFJSLCBMT0dMX0VSUk9SLCAiQlVHOiBVc2luZyBtdWx0aXJhdGUgY29kZWMgIgorCQkJCSJ3aXRob3V0IG11bHRpcmF0ZSBjb25maWcuXG4iKTsKKwkJfSBlbHNlIHsKKwkJCXVfaW50OF90ICpkYXRhID0gbXNnYl9wdXQobXNnLCA0KTsKKwkJCWRhdGFbMF0gPSBHU000OF9JRV9NVUxfUkFURV9DRkc7CisJCQlkYXRhWzFdID0gMHgyOworCQkJbWVtY3B5KCZkYXRhWzJdLCAmbGNoYW4tPm1yX2NvbmYsIDIpOworCQl9CisJfQorCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCBOVUxMKTsKK30KKworaW50IGdzbTQ4X2xjaGFuX21vZGlmeShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgbGNoYW5fbW9kZSkKK3sKKwlpbnQgcmM7CisKKwlyYyA9IGdzbTQ4X3R4X2NoYW5fbW9kZV9tb2RpZnkobGNoYW4sIGxjaGFuX21vZGUpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCXJldHVybiByYzsKK30KKworaW50IGdzbTQ4X3J4X3JyX21vZGlmX2FjayhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCWludCByYzsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwlzdHJ1Y3QgZ3NtNDhfY2hhbl9tb2RlX21vZGlmeSAqbW9kID0KKwkJCQkoc3RydWN0IGdzbTQ4X2NoYW5fbW9kZV9tb2RpZnkgKikgZ2gtPmRhdGE7CisKKwlERUJVR1AoRFJSLCAiQ0hBTk5FTCBNT0RFIE1PRElGWSBBQ0tcbiIpOworCisJaWYgKG1vZC0+bW9kZSAhPSBtc2ctPmxjaGFuLT50Y2hfbW9kZSkgeworCQlMT0dQKERSUiwgTE9HTF9FUlJPUiwgIkNIQU5ORUwgTU9ERSBjaGFuZ2UgZmFpbGVkLiBXYW50ZWQ6ICVkIEdvdDogJWRcbiIsCisJCQltc2ctPmxjaGFuLT50Y2hfbW9kZSwgbW9kLT5tb2RlKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIHVwZGF0ZSB0aGUgY2hhbm5lbCB0eXBlICovCisJc3dpdGNoIChtb2QtPm1vZGUpIHsKKwljYXNlIEdTTTQ4X0NNT0RFX1NJR046CisJCW1zZy0+bGNoYW4tPnJzbF9jbW9kZSA9IFJTTF9DTU9EX1NQRF9TSUdOOworCQlicmVhazsKKwljYXNlIEdTTTQ4X0NNT0RFX1NQRUVDSF9WMToKKwljYXNlIEdTTTQ4X0NNT0RFX1NQRUVDSF9FRlI6CisJY2FzZSBHU000OF9DTU9ERV9TUEVFQ0hfQU1SOgorCQltc2ctPmxjaGFuLT5yc2xfY21vZGUgPSBSU0xfQ01PRF9TUERfU1BFRUNIOworCQlicmVhazsKKwljYXNlIEdTTTQ4X0NNT0RFX0RBVEFfMTRrNToKKwljYXNlIEdTTTQ4X0NNT0RFX0RBVEFfMTJrMDoKKwljYXNlIEdTTTQ4X0NNT0RFX0RBVEFfNmswOgorCWNhc2UgR1NNNDhfQ01PREVfREFUQV8zazY6CisJCW1zZy0+bGNoYW4tPnJzbF9jbW9kZSA9IFJTTF9DTU9EX1NQRF9EQVRBOworCQlicmVhazsKKwl9CisKKwkvKiBXZSd2ZSBzdWNjZXNzZnVsbHkgbW9kaWZpZWQgdGhlIE1TIHNpZGUgb2YgdGhlIGNoYW5uZWwsCisJICogbm93IGdvIG9uIHRvIG1vZGlmeSB0aGUgQlRTIHNpZGUgb2YgdGhlIGNoYW5uZWwgKi8KKwlyYyA9IHJzbF9jaGFuX21vZGVfbW9kaWZ5X3JlcShtc2ctPmxjaGFuKTsKKworCS8qIEZJWE1FOiB3ZSBub3Qgb25seSBuZWVkIHRvIGRvIHRoaXMgYWZ0ZXIgbW9kZSBtb2RpZnksIGJ1dAorCSAqIGFsc28gYWZ0ZXIgY2hhbm5lbCBhY3RpdmF0aW9uICovCisJaWYgKGlzX2lwYWNjZXNzX2J0cyhtc2ctPmxjaGFuLT50cy0+dHJ4LT5idHMpICYmIG1vZC0+bW9kZSAhPSBHU000OF9DTU9ERV9TSUdOKQorCQlyc2xfaXBhY2NfY3JjeChtc2ctPmxjaGFuKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBnc200OF9wYXJzZV9tZWFzX3JlcChzdHJ1Y3QgZ3NtX21lYXNfcmVwICpyZXAsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJdW5zaWduZWQgaW50IHBheWxvYWRfbGVuID0gbXNnYl9sM2xlbihtc2cpIC0gc2l6ZW9mKCpnaCk7CisJdV9pbnQ4X3QgKmRhdGEgPSBnaC0+ZGF0YTsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gbXNnLT5sY2hhbi0+dHMtPnRyeC0+YnRzOworCXN0cnVjdCBiaXR2ZWMgKm5idiA9ICZidHMtPnNpX2NvbW1vbi5uZWlnaF9saXN0OworCXN0cnVjdCBnc21fbWVhc19yZXBfY2VsbCAqbXJjOworCisJaWYgKGdoLT5tc2dfdHlwZSAhPSBHU000OF9NVF9SUl9NRUFTX1JFUCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZGF0YVswXSAmIDB4ODApCisJCXJlcC0+ZmxhZ3MgfD0gTUVBU19SRVBfRl9CQTE7CisJaWYgKGRhdGFbMF0gJiAweDQwKQorCQlyZXAtPmZsYWdzIHw9IE1FQVNfUkVQX0ZfVUxfRFRYOworCWlmICgoZGF0YVsxXSAmIDB4NDApID09IDB4MDApCisJCXJlcC0+ZmxhZ3MgfD0gTUVBU19SRVBfRl9ETF9WQUxJRDsKKworCXJlcC0+ZGwuZnVsbC5yeF9sZXYgPSBkYXRhWzBdICYgMHgzZjsKKwlyZXAtPmRsLnN1Yi5yeF9sZXYgPSBkYXRhWzFdICYgMHgzZjsKKwlyZXAtPmRsLmZ1bGwucnhfcXVhbCA9IChkYXRhWzNdID4+IDQpICYgMHg3OworCXJlcC0+ZGwuc3ViLnJ4X3F1YWwgPSAoZGF0YVszXSA+PiAxKSAmIDB4NzsKKworCXJlcC0+bnVtX2NlbGwgPSAoKGRhdGFbM10gPj4gNikgJiAweDMpIHwgKChkYXRhWzJdICYgMHgwMSkgPDwgMik7CisJaWYgKHJlcC0+bnVtX2NlbGwgPCAxIHx8IHJlcC0+bnVtX2NlbGwgPiA2KQorCQlyZXR1cm4gMDsKKworCS8qIGFuIGVuY29kaW5nIG5pZ2h0bWFyZSBpbiBwZXJmZWN0aW9uICovCisJbXJjID0gJnJlcC0+Y2VsbFswXTsKKwltcmMtPnJ4bGV2ID0gZGF0YVszXSAmIDB4M2Y7CisJbXJjLT5uZWlnaF9pZHggPSBkYXRhWzRdID4+IDM7CisJbXJjLT5hcmZjbiA9IGJpdHZlY19nZXRfbnRoX3NldF9iaXQobmJ2LCBtcmMtPm5laWdoX2lkeCArIDEpOworCW1yYy0+YnNpYyA9ICgoZGF0YVs0XSAmIDB4MDcpIDw8IDMpIHwgKGRhdGFbNV0gPj4gNSk7CisJaWYgKHJlcC0+bnVtX2NlbGwgPCAyKQorCQlyZXR1cm4gMDsKKworCW1yYyA9ICZyZXAtPmNlbGxbMV07CisJbXJjLT5yeGxldiA9ICgoZGF0YVs1XSAmIDB4MWYpIDw8IDEpIHwgKGRhdGFbNl0gPj4gNyk7CisJbXJjLT5uZWlnaF9pZHggPSAoZGF0YVs2XSA+PiAyKSAmIDB4MWY7CisJbXJjLT5hcmZjbiA9IGJpdHZlY19nZXRfbnRoX3NldF9iaXQobmJ2LCBtcmMtPm5laWdoX2lkeCArIDEpOworCW1yYy0+YnNpYyA9ICgoZGF0YVs2XSAmIDB4MDMpIDw8IDQpIHwgKGRhdGFbN10gPj4gNCk7CisJaWYgKHJlcC0+bnVtX2NlbGwgPCAzKQorCQlyZXR1cm4gMDsKKworCW1yYyA9ICZyZXAtPmNlbGxbMl07CisJbXJjLT5yeGxldiA9ICgoZGF0YVs3XSAmIDB4MGYpIDw8IDIpIHwgKGRhdGFbOF0gPj4gNik7CisJbXJjLT5uZWlnaF9pZHggPSAoZGF0YVs4XSA+PiAxKSAmIDB4MWY7CisJbXJjLT5hcmZjbiA9IGJpdHZlY19nZXRfbnRoX3NldF9iaXQobmJ2LCBtcmMtPm5laWdoX2lkeCArIDEpOworCW1yYy0+YnNpYyA9ICgoZGF0YVs4XSAmIDB4MDEpIDw8IDUpIHwgKGRhdGFbOV0gPj4gMyk7CisJaWYgKHJlcC0+bnVtX2NlbGwgPCA0KQorCQlyZXR1cm4gMDsKKworCW1yYyA9ICZyZXAtPmNlbGxbM107CisJbXJjLT5yeGxldiA9ICgoZGF0YVs5XSAmIDB4MDcpIDw8IDMpIHwgKGRhdGFbMTBdID4+IDUpOworCW1yYy0+bmVpZ2hfaWR4ID0gZGF0YVsxMF0gJiAweDFmOworCW1yYy0+YXJmY24gPSBiaXR2ZWNfZ2V0X250aF9zZXRfYml0KG5idiwgbXJjLT5uZWlnaF9pZHggKyAxKTsKKwltcmMtPmJzaWMgPSBkYXRhWzExXSA+PiAyOworCWlmIChyZXAtPm51bV9jZWxsIDwgNSkKKwkJcmV0dXJuIDA7CisKKwltcmMgPSAmcmVwLT5jZWxsWzRdOworCW1yYy0+cnhsZXYgPSAoKGRhdGFbMTFdICYgMHgwMykgPDwgNCkgfCAoZGF0YVsxMl0gPj4gNCk7CisJbXJjLT5uZWlnaF9pZHggPSAoKGRhdGFbMTJdICYgMHhmKSA8PCAxKSB8IChkYXRhWzEzXSA+PiA3KTsKKwltcmMtPmFyZmNuID0gYml0dmVjX2dldF9udGhfc2V0X2JpdChuYnYsIG1yYy0+bmVpZ2hfaWR4ICsgMSk7CisJbXJjLT5ic2ljID0gKGRhdGFbMTNdID4+IDEpICYgMHgzZjsKKwlpZiAocmVwLT5udW1fY2VsbCA8IDYpCisJCXJldHVybiAwOworCisJbXJjID0gJnJlcC0+Y2VsbFs1XTsKKwltcmMtPnJ4bGV2ID0gKChkYXRhWzEzXSAmIDB4MDEpIDw8IDUpIHwgKGRhdGFbMTRdID4+IDMpOworCW1yYy0+bmVpZ2hfaWR4ID0gKChkYXRhWzE0XSAmIDB4MDcpIDw8IDIpIHwgKGRhdGFbMTVdID4+IDYpOworCW1yYy0+YXJmY24gPSBiaXR2ZWNfZ2V0X250aF9zZXRfYml0KG5idiwgbXJjLT5uZWlnaF9pZHggKyAxKTsKKwltcmMtPmJzaWMgPSBkYXRhWzE1XSAmIDB4M2Y7CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZ3NtXzA0XzExLmMgYi9vcGVuYnNjL3NyYy9nc21fMDRfMTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODFjMzc1Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZ3NtXzA0XzExLmMKQEAgLTAsMCArMSwxMjQxIEBACisvKiBQb2ludC10by1Qb2ludCAoUFApIFNob3J0IE1lc3NhZ2UgU2VydmljZSAoU01TKQorICogU3VwcG9ydCBvbiBNb2JpbGUgUmFkaW8gSW50ZXJmYWNlCisgKiAzR1BQIFRTIDA0LjExIHZlcnNpb24gNy4xLjAgUmVsZWFzZSAxOTk4IC8gRVRTSSBUUyAxMDAgOTQyIFY3LjEuMCAqLworCisvKiAoQykgMjAwOCBieSBEYW5pZWwgV2lsbG1hbm4gPGRhbmllbEB0b3RhbHVlYmVyd2FjaHVuZy5kZT4KKyAqIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzExLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMDguaD4KKyNpbmNsdWRlIDxvc21vY29yZS9nc21fdXRpbHMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfcnNsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RiLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy90cmFuc2FjdGlvbi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvcGFnaW5nLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ic2NfcmxsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9jaGFuX2FsbG9jLmg+CisKKyNkZWZpbmUgR1NNNDExX0FMTE9DX1NJWkUJMTAyNAorI2RlZmluZSBHU000MTFfQUxMT0NfSEVBRFJPT00JMTI4CisKKyNkZWZpbmUgVU1fU0FQSV9TTVMgMwkvKiBTZWUgR1NNIDA0LjA1LzA0LjA2ICovCisKK3ZvaWQgKnRhbGxfZ3Ntc19jdHg7CitzdGF0aWMgdV9pbnQzMl90IG5ld19jYWxscmVmID0gMHg0MDAwMDAwMTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgY3BfY2F1c2Vfc3Ryc1tdID0geworCXsgR1NNNDExX0NQX0NBVVNFX05FVF9GQUlMLAkiTmV0d29yayBGYWlsdXJlIiB9LAorCXsgR1NNNDExX0NQX0NBVVNFX0NPTkdFU1RJT04sCSJDb25nZXN0aW9uIiB9LAorCXsgR1NNNDExX0NQX0NBVVNFX0lOVl9UUkFOU19JRCwJIkludmFsaWQgVHJhbnNhY3Rpb24gSUQiIH0sCisJeyBHU000MTFfQ1BfQ0FVU0VfU0VNQU5UX0lOQ19NU0csICJTZW1hbnRpY2FsbHkgSW5jb3JyZWN0IE1lc3NhZ2UiIH0sCisJeyBHU000MTFfQ1BfQ0FVU0VfSU5WX01BTkRfSU5GLAkiSW52YWxpZCBNYW5kYXRvcnkgSW5mb3JtYXRpb24iIH0sCisJeyBHU000MTFfQ1BfQ0FVU0VfTVNHVFlQRV9OT1RFWElTVCwgIk1lc3NhZ2UgVHlwZSBkb2Vzbid0IGV4aXN0IiB9LAorCXsgR1NNNDExX0NQX0NBVVNFX01TR19JTkNPTVBfU1RBVEUsIAorCQkJCSJNZXNzYWdlIGluY29tcGF0aWJsZSB3aXRoIHByb3RvY29sIHN0YXRlIiB9LAorCXsgR1NNNDExX0NQX0NBVVNFX0lFX05PVEVYSVNULAkiSUUgZG9lcyBub3QgZXhpc3QiIH0sCisJeyBHU000MTFfQ1BfQ0FVU0VfUFJPVE9DT0xfRVJSLAkiUHJvdG9jb2wgRXJyb3IiIH0sCisJeyAwLCAwIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nIHJwX2NhdXNlX3N0cnNbXSA9IHsKKwl7IEdTTTQxMV9SUF9DQVVTRV9NT19OVU1fVU5BU1NJR05FRCwgIihNTykgTnVtYmVyIG5vdCBhc3NpZ25lZCIgfSwKKwl7IEdTTTQxMV9SUF9DQVVTRV9NT19PUF9ERVRfQkFSUiwgIihNTykgT3BlcmF0b3IgZGV0ZXJtaW5lZCBiYXJyaW5nIiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX01PX0NBTExfQkFSUkVELCAiKE1PKSBDYWxsIGJhcnJlZCIgfSwKKwl7IEdTTTQxMV9SUF9DQVVTRV9NT19TTVNfUkVKRUNURUQsICIoTU8pIFNNUyByZWplY3RlZCIgfSwKKwl7IEdTTTQxMV9SUF9DQVVTRV9NT19ERVNUX09VVF9PRl9PUkRFUiwgIihNTykgRGVzdGluYXRpb24gb3V0IG9mIG9yZGVyIiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX01PX1VOSURFTlRJRklFRF9TVUJTQ1IsICIoTU8pIFVuaWRlbnRpZmllZCBzdWJzY3JpYmVyIiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX01PX0ZBQ0lMSVRZX1JFSiwgIihNTykgRmFjaWxpdHkgcmVqZWN0IiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX01PX1VOS05PV05fU1VCU0NSLCAiKE1PKSBVbmtub3duIHN1YnNjcmliZXIiIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfTU9fTkVUX09VVF9PRl9PUkRFUiwgIihNTykgTmV0d29yayBvdXQgb2Ygb3JkZXIiIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfTU9fVEVNUF9GQUlMLCAiKE1PKSBUZW1wb3JhcnkgZmFpbHVyZSIgfSwKKwl7IEdTTTQxMV9SUF9DQVVTRV9NT19DT05HRVNUSU9OLCAiKE1PKSBDb25nZXN0aW9uIiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX01PX1JFU19VTkFWQUlMLCAiKE1PKSBSZXNvdXJjZSB1bmF2YWlsYWJsZSIgfSwKKwl7IEdTTTQxMV9SUF9DQVVTRV9NT19SRVFfRkFDX05PVFNVQlNDUiwgIihNTykgUmVxdWVzdGVkIGZhY2lsaXR5IG5vdCBzdWJzY3JpYmVkIiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX01PX1JFUV9GQUNfTk9USU1QTCwgIihNTykgUmVxdWVzdGVkIGZhY2lsaXR5IG5vdCBpbXBsZW1lbnRlZCIgfSwKKwl7IEdTTTQxMV9SUF9DQVVTRV9NT19JTlRFUldPUktJTkcsICIoTU8pIEludGVyd29ya2luZyIgfSwKKwkvKiB2YWxpZCBvbmx5IGZvciBNVCAqLworCXsgR1NNNDExX1JQX0NBVVNFX01UX01FTV9FWENFRURFRCwgIihNVCkgTWVtb3J5IEV4Y2VlZGVkIiB9LAorCS8qIHZhbGlkIGZvciBib3RoIGRpcmVjdGlvbnMgKi8KKwl7IEdTTTQxMV9SUF9DQVVTRV9JTlZfVFJBTlNfUkVGLCAiSW52YWxpZCBUcmFuc2FjdGlvbiBSZWZlcmVuY2UiIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfU0VNQU5UX0lOQ19NU0csICJTZW1hbnRpY2FsbHkgSW5jb3JyZWN0IE1lc3NhZ2UiIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfSU5WX01BTkRfSU5GLCAiSW52YWxpZCBNYW5kYXRvcnkgSW5mb3JtYXRpb24iIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfTVNHVFlQRV9OT1RFWElTVCwgIk1lc3NhZ2UgVHlwZSBub24tZXhpc3RhbnQiIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfTVNHX0lOQ09NUF9TVEFURSwgIk1lc3NhZ2UgaW5jb21wYXRpYmxlIHdpdGggcHJvdG9jb2wgc3RhdGUiIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfSUVfTk9URVhJU1QsICJJbmZvcm1hdGlvbiBFbGVtZW50IG5vdCBleGlzdGluZyIgfSwKKwl7IEdTTTQxMV9SUF9DQVVTRV9QUk9UT0NPTF9FUlIsICJQcm90b2NvbCBFcnJvciIgfSwKKwl7IDAsIE5VTEwgfQorfTsKKworc3RydWN0IGdzbV9zbXMgKnNtc19hbGxvYyh2b2lkKQoreworCXJldHVybiB0YWxsb2NfemVybyh0YWxsX2dzbXNfY3R4LCBzdHJ1Y3QgZ3NtX3Ntcyk7Cit9CisKK3ZvaWQgc21zX2ZyZWUoc3RydWN0IGdzbV9zbXMgKnNtcykKK3sKKwkvKiBkcm9wIHJlZmVyZW5jZXMgdG8gc3Vic2NyaWJlciBzdHJ1Y3R1cmUgKi8KKwlpZiAoc21zLT5zZW5kZXIpCisJCXN1YnNjcl9wdXQoc21zLT5zZW5kZXIpOworCWlmIChzbXMtPnJlY2VpdmVyKQorCQlzdWJzY3JfcHV0KHNtcy0+cmVjZWl2ZXIpOworCisJdGFsbG9jX2ZyZWUoc21zKTsKK30KKworc3RydWN0IG1zZ2IgKmdzbTQxMV9tc2diX2FsbG9jKHZvaWQpCit7CisJcmV0dXJuIG1zZ2JfYWxsb2NfaGVhZHJvb20oR1NNNDExX0FMTE9DX1NJWkUsIEdTTTQxMV9BTExPQ19IRUFEUk9PTSwKKwkJCQkgICAiR1NNIDA0LjExIik7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDExX3NlbmRtc2coc3RydWN0IG1zZ2IgKm1zZywgdV9pbnQ4X3QgbGlua19pZCkKK3sKKwlpZiAobXNnLT5sY2hhbikKKwkJbXNnLT50cnggPSBtc2ctPmxjaGFuLT50cy0+dHJ4OworCisJbXNnLT5sM2ggPSBtc2ctPmRhdGE7CisKKwlERUJVR1AoRFNNUywgIkdTTTQuMTEgVFggJXNcbiIsIGhleGR1bXAobXNnLT5kYXRhLCBtc2ctPmxlbikpOworCisJcmV0dXJuIHJzbF9kYXRhX3JlcXVlc3QobXNnLCBsaW5rX2lkKTsKK30KKworLyogU01DIFRDMSogaXMgZXhwaXJlZCAqLworc3RhdGljIHZvaWQgY3BfdGltZXJfZXhwaXJlZCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBnc21fdHJhbnMgKnRyYW5zID0gZGF0YTsKKworCURFQlVHUChEU01TLCAiU01DIFRpbWVyIFRDMSogaXMgZXhwaXJlZCwgY2FsbGluZyB0cmFuc19mcmVlKClcbiIpOworCS8qIEZJWE1FOiB3ZSBuZWVkIHRvIHJlLXRyYW5zbWl0IHRoZSBsYXN0IENQLURBVEEgMS4uMyB0aW1lcyAqLworCXRyYW5zX2ZyZWUodHJhbnMpOworfQorCisvKiBQcmVmaXggbXNnIHdpdGggYSAwNC4wOC8wNC4xMSBDUCBoZWFkZXIgKi8KK3N0YXRpYyBpbnQgZ3NtNDExX2NwX3NlbmRtc2coc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdzbV90cmFucyAqdHJhbnMsCisJCQkgICAgIHVfaW50OF90IG1zZ190eXBlKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoOworCisJZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1c2gobXNnLCBzaXplb2YoKmdoKSk7CisJLyogT3V0Z29pbmcgbmVlZHMgdGhlIGhpZ2hlc3QgYml0IHNldCAqLworCWdoLT5wcm90b19kaXNjciA9IHRyYW5zLT5wcm90b2NvbCB8ICh0cmFucy0+dHJhbnNhY3Rpb25faWQ8PDQpOworCWdoLT5tc2dfdHlwZSA9IG1zZ190eXBlOworCisJLyogYXNzaWduIHRoZSBvdXRnb2luZyBsY2hhbiAqLworCW1zZy0+bGNoYW4gPSB0cmFucy0+bGNoYW47CisKKwkvKiBtb2JpbGUgb3JpZ2luYXRpbmcgKi8KKwlzd2l0Y2ggKGdoLT5tc2dfdHlwZSkgeworCWNhc2UgR1NNNDExX01UX0NQX0RBVEE6CisJCS8qIDUuMi4zLjEuMjogZW50ZXIgTU8td2FpdCBmb3IgQ1AtYWNrICovCisJCS8qIDUuMi4zLjIuMzogZW50ZXIgTVQtd2FpdCBmb3IgQ1AtQUNLICovCisJCXRyYW5zLT5zbXMuY3Bfc3RhdGUgPSBHU000MTFfQ1BTX1dBSVRfQ1BfQUNLOworCQl0cmFucy0+c21zLmNwX3RpbWVyLmRhdGEgPSB0cmFuczsKKwkJdHJhbnMtPnNtcy5jcF90aW1lci5jYiA9IGNwX3RpbWVyX2V4cGlyZWQ7CisJCS8qIDUuMy4yLjE6IFNldCBUaW1lciBUQzFBICovCisJCWJzY19zY2hlZHVsZV90aW1lcigmdHJhbnMtPnNtcy5jcF90aW1lciwgR1NNNDExX1RNUl9UQzFBKTsKKwkJREVCVUdQKERTTVMsICJUWDogQ1AtREFUQSAiKTsKKwkJYnJlYWs7CisJY2FzZSBHU000MTFfTVRfQ1BfQUNLOgorCQlERUJVR1AoRFNNUywgIlRYOiBDUC1BQ0sgIik7CisJCWJyZWFrOworCWNhc2UgR1NNNDExX01UX0NQX0VSUk9SOgorCQlERUJVR1AoRFNNUywgIlRYOiBDUC1FUlJPUiAiKTsKKwkJYnJlYWs7CisJfQorCisJREVCVUdQQyhEU01TLCAidHJhbnM9JXhcbiIsIHRyYW5zLT50cmFuc2FjdGlvbl9pZCk7CisKKwlyZXR1cm4gZ3NtNDExX3NlbmRtc2cobXNnLCB0cmFucy0+c21zLmxpbmtfaWQpOworfQorCisvKiBQcmVmaXggbXNnIHdpdGggYSBSUC1EQVRBIGhlYWRlciBhbmQgc2VuZCBhcyBDUC1EQVRBICovCitzdGF0aWMgaW50IGdzbTQxMV9ycF9zZW5kbXNnKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLAorCQkJICAgICB1X2ludDhfdCBycF9tc2dfdHlwZSwgdV9pbnQ4X3QgcnBfbXNnX3JlZikKK3sKKwlzdHJ1Y3QgZ3NtNDExX3JwX2hkciAqcnA7CisJdV9pbnQ4X3QgbGVuID0gbXNnLT5sZW47CisKKwkvKiBHU00gMDQuMTEgUlAtREFUQSBoZWFkZXIgKi8KKwlycCA9IChzdHJ1Y3QgZ3NtNDExX3JwX2hkciAqKW1zZ2JfcHVzaChtc2csIHNpemVvZigqcnApKTsKKwlycC0+bGVuID0gbGVuICsgMjsKKwlycC0+bXNnX3R5cGUgPSBycF9tc2dfdHlwZTsKKwlycC0+bXNnX3JlZiA9IHJwX21zZ19yZWY7IC8qIEZJWE1FOiBDaG9vc2UgcmFuZG9tbHkgKi8KKworCXJldHVybiBnc200MTFfY3Bfc2VuZG1zZyhtc2csIHRyYW5zLCBHU000MTFfTVRfQ1BfREFUQSk7Cit9CisKKy8qIFR1cm4gaW50IGludG8gc2VtaS1vY3RldCByZXByZXNlbnRhdGlvbjogOTggPT4gMHg4OSAqLworc3RhdGljIHVfaW50OF90IGJjZGlmeSh1X2ludDhfdCB2YWx1ZSkKK3sKKwl1X2ludDhfdCByZXQ7CisKKwlyZXQgPSB2YWx1ZSAvIDEwOworCXJldCB8PSAodmFsdWUgJSAxMCkgPDwgNDsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIFR1cm4gc2VtaS1vY3RldCByZXByZXNlbnRhdGlvbiBpbnRvIGludDogMHg4OSA9PiA5OCAqLworc3RhdGljIHVfaW50OF90IHVuYmNkaWZ5KHVfaW50OF90IHZhbHVlKQoreworCXVfaW50OF90IHJldDsKKworCWlmICgodmFsdWUgJiAweDBGKSA+IDkgfHwgKHZhbHVlID4+IDQpID4gOSkKKwkJTE9HUChEU01TLCBMT0dMX0VSUk9SLCAKKwkJICAgICAidW5iY2RpZnkgZ290IHRvbyBiaWcgbmliYmxlOiAweCUwMlhcbiIsIHZhbHVlKTsKKworCXJldCA9ICh2YWx1ZSYweDBGKSoxMDsKKwlyZXQgKz0gdmFsdWU+PjQ7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBHZW5lcmF0ZSAwMy40MCBUUC1TQ1RTICovCitzdGF0aWMgdm9pZCBnc20zNDBfZ2VuX3NjdHModV9pbnQ4X3QgKnNjdHMsIHRpbWVfdCB0aW1lKQoreworCXN0cnVjdCB0bSAqdG0gPSBsb2NhbHRpbWUoJnRpbWUpOworCisJKnNjdHMrKyA9IGJjZGlmeSh0bS0+dG1feWVhciAlIDEwMCk7CisJKnNjdHMrKyA9IGJjZGlmeSh0bS0+dG1fbW9uICsgMSk7CisJKnNjdHMrKyA9IGJjZGlmeSh0bS0+dG1fbWRheSk7CisJKnNjdHMrKyA9IGJjZGlmeSh0bS0+dG1faG91cik7CisJKnNjdHMrKyA9IGJjZGlmeSh0bS0+dG1fbWluKTsKKwkqc2N0cysrID0gYmNkaWZ5KHRtLT50bV9zZWMpOworCSpzY3RzKysgPSBiY2RpZnkodG0tPnRtX2dtdG9mZi8oNjAqMTUpKTsKK30KKworLyogRGVjb2RlIDAzLjQwIFRQLVNDVFMgKGludG8gdXRjL2dtdCB0aW1lc3RhbXApICovCitzdGF0aWMgdGltZV90IGdzbTM0MF9zY3RzKHVfaW50OF90ICpzY3RzKQoreworCXN0cnVjdCB0bSB0bTsKKworCXVfaW50OF90IHlyID0gdW5iY2RpZnkoKnNjdHMrKyk7CisKKwlpZiAoeXIgPD0gODApCisJCXRtLnRtX3llYXIgPSAxMDAgKyB5cjsKKwllbHNlCisJCXRtLnRtX3llYXIgPSB5cjsKKwl0bS50bV9tb24gID0gdW5iY2RpZnkoKnNjdHMrKykgLSAxOworCXRtLnRtX21kYXkgPSB1bmJjZGlmeSgqc2N0cysrKTsKKwl0bS50bV9ob3VyID0gdW5iY2RpZnkoKnNjdHMrKyk7CisJdG0udG1fbWluICA9IHVuYmNkaWZ5KCpzY3RzKyspOworCXRtLnRtX3NlYyAgPSB1bmJjZGlmeSgqc2N0cysrKTsKKwkvKiBhY2NvcmRpbmcgdG8gZ3NtIDAzLjQwIHRpbWUgem9uZSBpcworCSAgICJleHByZXNzZWQgaW4gcXVhcnRlcnMgb2YgYW4gaG91ciIgKi8KKwl0bS50bV9nbXRvZmYgPSB1bmJjZGlmeSgqc2N0cysrKSAqIDE1KjYwOworCisJcmV0dXJuIG1rdGltZSgmdG0pOworfQorCisvKiBSZXR1cm4gdGhlIGRlZmF1bHQgdmFsaWRpdHkgcGVyaW9kIGluIG1pbnV0ZXMgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdzbTM0MF92cF9kZWZhdWx0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBtaW51dGVzOworCS8qIERlZmF1bHQgdmFsaWRpdHk6IHR3byBkYXlzICovCisJbWludXRlcyA9IDI0ICogNjAgKiAyOworCXJldHVybiBtaW51dGVzOworfQorCisvKiBEZWNvZGUgdmFsaWRpdHkgcGVyaW9kIGZvcm1hdCAncmVsYXRpdmUnICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBnc20zNDBfdnBfcmVsYXRpdmUodV9pbnQ4X3QgKnNtc192cCkKK3sKKwkvKiBDaGFwdGVyIDkuMi4zLjEyLjEgKi8KKwl1X2ludDhfdCB2cDsKKwl1bnNpZ25lZCBsb25nIG1pbnV0ZXM7CisKKwl2cCA9ICooc21zX3ZwKTsKKwlpZiAodnAgPD0gMTQzKQorCQltaW51dGVzID0gdnAgKyAxICogNTsKKwllbHNlIGlmICh2cCA8PSAxNjcpCisJCW1pbnV0ZXMgPSAxMio2MCArICh2cC0xNDMpICogMzA7CisJZWxzZSBpZiAodnAgPD0gMTk2KQorCQltaW51dGVzID0gdnAtMTY2ICogNjAgKiAyNDsKKwllbHNlCisJCW1pbnV0ZXMgPSB2cC0xOTIgKiA2MCAqIDI0ICogNzsKKwlyZXR1cm4gbWludXRlczsKK30KKworLyogRGVjb2RlIHZhbGlkaXR5IHBlcmlvZCBmb3JtYXQgJ2Fic29sdXRlJyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ3NtMzQwX3ZwX2Fic29sdXRlKHVfaW50OF90ICpzbXNfdnApCit7CisJLyogQ2hhcHRlciA5LjIuMy4xMi4yICovCisJdGltZV90IGV4cGlyZXMsIG5vdzsKKwl1bnNpZ25lZCBsb25nIG1pbnV0ZXM7CisKKwlleHBpcmVzID0gZ3NtMzQwX3NjdHMoc21zX3ZwKTsKKwlub3cgPSBta3RpbWUoZ210aW1lKE5VTEwpKTsKKwlpZiAoZXhwaXJlcyA8PSBub3cpCisJCW1pbnV0ZXMgPSAwOworCWVsc2UKKwkJbWludXRlcyA9IChleHBpcmVzLW5vdykvNjA7CisJcmV0dXJuIG1pbnV0ZXM7Cit9CisKKy8qIERlY29kZSB2YWxpZGl0eSBwZXJpb2QgZm9ybWF0ICdyZWxhdGl2ZSBpbiBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uJyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ3NtMzQwX3ZwX3JlbGF0aXZlX2ludGVnZXIodV9pbnQ4X3QgKnNtc192cCkKK3sKKwl1X2ludDhfdCB2cDsKKwl1bnNpZ25lZCBsb25nIG1pbnV0ZXM7CisJdnAgPSAqKHNtc192cCk7CisJaWYgKHZwID09IDApIHsKKwkJTE9HUChEU01TLCBMT0dMX0VSUk9SLAorCQkgICAgICJyZXNlcnZlZCByZWxhdGl2ZV9pbnRlZ2VyIHZhbGlkaXR5IHBlcmlvZFxuIik7CisJCXJldHVybiBnc20zNDBfdnBfZGVmYXVsdCgpOworCX0KKwltaW51dGVzID0gdnAvNjA7CisJcmV0dXJuIG1pbnV0ZXM7Cit9CisKKy8qIERlY29kZSB2YWxpZGl0eSBwZXJpb2QgZm9ybWF0ICdyZWxhdGl2ZSBpbiBzZW1pLW9jdGV0IHJlcHJlc2VudGF0aW9uJyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ3NtMzQwX3ZwX3JlbGF0aXZlX3NlbWlvY3RldCh1X2ludDhfdCAqc21zX3ZwKQoreworCXVuc2lnbmVkIGxvbmcgbWludXRlczsKKwltaW51dGVzID0gdW5iY2RpZnkoKnNtc192cCsrKSo2MDsgIC8qIGhvdXJzICovCisJbWludXRlcyArPSB1bmJjZGlmeSgqc21zX3ZwKyspOyAgICAvKiBtaW51dGVzICovCisJbWludXRlcyArPSB1bmJjZGlmeSgqc21zX3ZwKyspLzYwOyAvKiBzZWNvbmRzICovCisJcmV0dXJuIG1pbnV0ZXM7Cit9CisKKy8qIGRlY29kZSB2YWxpZGl0eSBwZXJpb2QuIHJldHVybiBtaW51dGVzICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBnc20zNDBfdmFsaWRpdHlfcGVyaW9kKHVfaW50OF90IHNtc192cGYsIHVfaW50OF90ICpzbXNfdnApCit7CisJdV9pbnQ4X3QgZmk7IC8qIGZ1bmN0aW9uYWxpdHkgaW5kaWNhdG9yICovCisKKwlzd2l0Y2ggKHNtc192cGYpIHsKKwljYXNlIEdTTTM0MF9UUF9WUEZfUkVMQVRJVkU6CisJCXJldHVybiBnc20zNDBfdnBfcmVsYXRpdmUoc21zX3ZwKTsKKwljYXNlIEdTTTM0MF9UUF9WUEZfQUJTT0xVVEU6CisJCXJldHVybiBnc20zNDBfdnBfYWJzb2x1dGUoc21zX3ZwKTsKKwljYXNlIEdTTTM0MF9UUF9WUEZfRU5IQU5DRUQ6CisJCS8qIENoYXB0ZXIgOS4yLjMuMTIuMyAqLworCQlmaSA9ICpzbXNfdnArKzsKKwkJLyogaWdub3JlIGFkZGl0aW9uYWwgZmkgKi8KKwkJaWYgKGZpICYgKDE8PDcpKSBzbXNfdnArKzsKKwkJLyogcmVhZCB2YWxpZGl0eSBwZXJpb2QgZm9ybWF0ICovCisJCXN3aXRjaCAoZmkgJiAwYjExMSkgeworCQljYXNlIDBiMDAwOgorCQkJcmV0dXJuIGdzbTM0MF92cF9kZWZhdWx0KCk7IC8qIG5vIHZwZiBzcGVjaWZpZWQgKi8KKwkJY2FzZSAwYjAwMToKKwkJCXJldHVybiBnc20zNDBfdnBfcmVsYXRpdmUoc21zX3ZwKTsKKwkJY2FzZSAwYjAxMDoKKwkJCXJldHVybiBnc20zNDBfdnBfcmVsYXRpdmVfaW50ZWdlcihzbXNfdnApOworCQljYXNlIDBiMDExOgorCQkJcmV0dXJuIGdzbTM0MF92cF9yZWxhdGl2ZV9zZW1pb2N0ZXQoc21zX3ZwKTsKKwkJZGVmYXVsdDoKKwkJCS8qIFRoZSBHU00gc3BlYyBzYXlzIHRoYXQgdGhlIFNDIHNob3VsZCByZWplY3QgYW55CisJCQkgICB1bnN1cHBvcnRlZCBhbmQvb3IgdW5kZWZpbmVkIHZhbHVlcy4gRklYTUUgKi8KKwkJCUxPR1AoRFNNUywgTE9HTF9FUlJPUiwKKwkJCSAgICAgIlJlc2VydmVkIGVuaGFuY2VkIHZhbGlkaXR5IHBlcmlvZCBmb3JtYXRcbiIpOworCQkJcmV0dXJuIGdzbTM0MF92cF9kZWZhdWx0KCk7CisJCX0KKwljYXNlIEdTTTM0MF9UUF9WUEZfTk9ORToKKwlkZWZhdWx0OgorCQlyZXR1cm4gZ3NtMzQwX3ZwX2RlZmF1bHQoKTsKKwl9Cit9CisKKy8qIGRldGVybWluZSBjb2RpbmcgYWxwaGFiZXQgZGVwZW5kZW50IG9uIEdTTSAwMy4zOCBTZWN0aW9uIDQgRENTICovCitlbnVtIHNtc19hbHBoYWJldCBnc20zMzhfZ2V0X3Ntc19hbHBoYWJldCh1X2ludDhfdCBkY3MpCit7CisJdV9pbnQ4X3QgY2diaXRzID0gZGNzID4+IDQ7CisJZW51bSBzbXNfYWxwaGFiZXQgYWxwaGEgPSBEQ1NfTk9ORTsKKworCWlmICgoY2diaXRzICYgMHhjKSA9PSAwKSB7CisJCWlmIChjZ2JpdHMgJiAyKQorCQkJTE9HUChEU01TLCBMT0dMX05PVElDRSwKKwkJCSAgICAgIkNvbXByZXNzZWQgU01TIG5vdCBzdXBwb3J0ZWQgeWV0XG4iKTsKKworCQlzd2l0Y2ggKChkY3MgPj4gMikmMHgwMykgeworCQljYXNlIDA6CisJCQlhbHBoYSA9IERDU183QklUX0RFRkFVTFQ7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJYWxwaGEgPSBEQ1NfOEJJVF9EQVRBOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWFscGhhID0gRENTX1VDUzI7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSBpZiAoY2diaXRzID09IDB4YyB8fCBjZ2JpdHMgPT0gMHhkKQorCQlhbHBoYSA9IERDU183QklUX0RFRkFVTFQ7CisJZWxzZSBpZiAoY2diaXRzID09IDB4ZSkKKwkJYWxwaGEgPSBEQ1NfVUNTMjsKKwllbHNlIGlmIChjZ2JpdHMgPT0gMHhmKSB7CisJCWlmIChkY3MgJiA0KQorCQkJYWxwaGEgPSBEQ1NfOEJJVF9EQVRBOworCQllbHNlCisJCQlhbHBoYSA9IERDU183QklUX0RFRkFVTFQ7CisJfQorCisJcmV0dXJuIGFscGhhOworfQorCitzdGF0aWMgaW50IGdzbTM0MF9yeF9zbXNfc3VibWl0KHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBnc21fc21zICpnc21zKQoreworCWlmIChkYl9zbXNfc3RvcmUoZ3NtcykgIT0gMCkgeworCQlMT0dQKERTTVMsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gc3RvcmUgU01TIGluIERhdGFiYXNlXG4iKTsKKwkJcmV0dXJuIEdTTTQxMV9SUF9DQVVTRV9NT19ORVRfT1VUX09GX09SREVSOworCX0KKwkvKiBkaXNwYXRjaCBhIHNpZ25hbCB0byB0ZWxsIGhpZ2hlciBsZXZlbCBhYm91dCBpdCAqLworCWRpc3BhdGNoX3NpZ25hbChTU19TTVMsIFNfU01TX1NVQk1JVFRFRCwgZ3Ntcyk7CisJLyogdHJ5IGRlbGl2ZXJpbmcgdGhlIFNNUyByaWdodCBub3cgKi8KKwkvL2dzbTQxMV9zZW5kX3Ntc19zdWJzY3IoZ3Ntcy0+cmVjZWl2ZXIsIGdzbXMpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGdlbmVyYXRlIGEgVFBEVSBhZGRyZXNzIGZpZWxkIGNvbXBsaWFudCB3aXRoIDAzLjQwIHNlYy4gOS4xLjIuNSAqLworc3RhdGljIGludCBnc20zNDBfZ2VuX29hKHVfaW50OF90ICpvYSwgdW5zaWduZWQgaW50IG9hX2xlbiwKKwkJCSBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikKK3sKKwlpbnQgbGVuX2luX2J5dGVzOworCisJb2FbMV0gPSAweGI5OyAvKiBuZXR3b3Jrcy1zcGVjaWZpYyBudW1iZXIsIHByaXZhdGUgbnVtYmVyaW5nIHBsYW4gKi8KKworCWxlbl9pbl9ieXRlcyA9IGdzbTQ4X2VuY29kZV9iY2RfbnVtYmVyKG9hLCBvYV9sZW4sIDEsIHN1YnNjci0+ZXh0ZW5zaW9uKTsKKworCS8qIEdTTSAwMy40MCB0ZWxscyB1cyB0aGUgbGVuZ3RoIGlzIGluICd1c2VmdWwgc2VtaS1vY3RldHMnICovCisJb2FbMF0gPSBzdHJsZW4oc3Vic2NyLT5leHRlbnNpb24pICYgMHhmZjsKKworCXJldHVybiBsZW5faW5fYnl0ZXM7Cit9CisKKy8qIGdlbmVyYXRlIGEgbXNnYiBjb250YWluaW5nIGEgVFBEVSBkZXJpdmVkIGZyb20gc3RydWN0IGdzbV9zbXMsCisgKiByZXR1cm5zIHRvdGFsIHNpemUgb2YgVFBEVSAqLworc3RhdGljIGludCBnc20zNDBfZ2VuX3RwZHUoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdzbV9zbXMgKnNtcykKK3sKKwl1X2ludDhfdCAqc21zcDsKKwl1X2ludDhfdCBvYVsxMl07CS8qIG1heCBsZW4gcGVyIDAzLjQwICovCisJdV9pbnQ4X3Qgb2FfbGVuID0gMDsKKwl1X2ludDhfdCBvY3RldF9sZW47CisJdW5zaWduZWQgaW50IG9sZF9tc2dfbGVuID0gbXNnLT5sZW47CisKKwkvKiBnZW5lcmF0ZSBmaXJzdCBvY3RldCB3aXRoIG1hc2tlZCBiaXRzICovCisJc21zcCA9IG1zZ2JfcHV0KG1zZywgMSk7CisJLyogVFAtTVRJIChtZXNzYWdlIHR5cGUgaW5kaWNhdG9yKSAqLworCSpzbXNwID0gR1NNMzQwX1NNU19ERUxJVkVSX1NDMk1TOworCS8qIFRQLU1NUyAobW9yZSBtZXNzYWdlcyB0byBzZW5kKSAqLworCWlmICgwIC8qIEZJWE1FICovKQorCQkqc21zcCB8PSAweDA0OworCS8qIFRQLVNSSShkZWxpdmVyKS9TUlIoc3VibWl0KSAqLworCWlmIChzbXMtPnN0YXR1c19yZXBfcmVxKQorCQkqc21zcCB8PSAweDIwOworCS8qIFRQLVVESEkgKGluZGljYXRpbmcgVFAtVUQgY29udGFpbnMgYSBoZWFkZXIpICovCisJaWYgKHNtcy0+dWRfaGRyX2luZCkKKwkJKnNtc3AgfD0gMHg0MDsKKyNpZiAwCisJLyogVFAtUlAgKGluZGljYXRpbmcgdGhhdCBhIHJlcGx5IHBhdGggZXhpc3RzKSAqLworCWlmIChzbXMtPgorCQkqc21zcCB8PSAweDgwOworI2VuZGlmCisJCisJLyogZ2VuZXJhdGUgb3JpZ2luYXRvciBhZGRyZXNzICovCisJb2FfbGVuID0gZ3NtMzQwX2dlbl9vYShvYSwgc2l6ZW9mKG9hKSwgc21zLT5zZW5kZXIpOworCXNtc3AgPSBtc2diX3B1dChtc2csIG9hX2xlbik7CisJbWVtY3B5KHNtc3AsIG9hLCBvYV9sZW4pOworCisJLyogZ2VuZXJhdGUgVFAtUElEICovCisJc21zcCA9IG1zZ2JfcHV0KG1zZywgMSk7CisJKnNtc3AgPSBzbXMtPnByb3RvY29sX2lkOworCisJLyogZ2VuZXJhdGUgVFAtRENTICovCisJc21zcCA9IG1zZ2JfcHV0KG1zZywgMSk7CisJKnNtc3AgPSBzbXMtPmRhdGFfY29kaW5nX3NjaGVtZTsKKworCS8qIGdlbmVyYXRlIFRQLVNDVFMgKi8KKwlzbXNwID0gbXNnYl9wdXQobXNnLCA3KTsKKwlnc20zNDBfZ2VuX3NjdHMoc21zcCwgdGltZShOVUxMKSk7CisKKwkvKiBnZW5lcmF0ZSBUUC1VREwgKi8KKwlzbXNwID0gbXNnYl9wdXQobXNnLCAxKTsKKwkqc21zcCA9IHNtcy0+dXNlcl9kYXRhX2xlbjsKKworCS8qIGdlbmVyYXRlIFRQLVVEICovCisJc3dpdGNoIChnc20zMzhfZ2V0X3Ntc19hbHBoYWJldChzbXMtPmRhdGFfY29kaW5nX3NjaGVtZSkpIHsKKwljYXNlIERDU183QklUX0RFRkFVTFQ6CisJCW9jdGV0X2xlbiA9IHNtcy0+dXNlcl9kYXRhX2xlbio3Lzg7CisJCWlmIChzbXMtPnVzZXJfZGF0YV9sZW4qNyU4ICE9IDApCisJCQlvY3RldF9sZW4rKzsKKwkJLyogV2FybmluZywgdXNlcl9kYXRhX2xlbiBpbmRpY2F0ZXMgdGhlIGFtb3VudCBvZiBzZXB0ZXRzCisJCSAqIChjaGFyYWN0ZXJzKSwgd2UgbmVlZCBhbW91bnQgb2Ygb2N0ZXRzIG9jY3VwaWVkICovCisJCXNtc3AgPSBtc2diX3B1dChtc2csIG9jdGV0X2xlbik7CisJCW1lbWNweShzbXNwLCBzbXMtPnVzZXJfZGF0YSwgb2N0ZXRfbGVuKTsKKwkJYnJlYWs7CisJY2FzZSBEQ1NfVUNTMjoKKwljYXNlIERDU184QklUX0RBVEE6CisJCXNtc3AgPSBtc2diX3B1dChtc2csIHNtcy0+dXNlcl9kYXRhX2xlbik7CisJCW1lbWNweShzbXNwLCBzbXMtPnVzZXJfZGF0YSwgc21zLT51c2VyX2RhdGFfbGVuKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChEU01TLCBMT0dMX05PVElDRSwgIlVuaGFuZGxlZCBEYXRhIENvZGluZyBTY2hlbWU6IDB4JTAyWFxuIiwKKwkJICAgICBzbXMtPmRhdGFfY29kaW5nX3NjaGVtZSk7CisJCWJyZWFrOworCX0KKworCXJldHVybiBtc2ctPmxlbiAtIG9sZF9tc2dfbGVuOworfQorCisvKiBwcm9jZXNzIGFuIGluY29taW5nIFRQRFUgKGNhbGxlZCBmcm9tIFJQLURBVEEpIAorICogcmV0dXJuIHZhbHVlID4gMDogUlAgQ0FVU0UgZm9yIEVSUk9SOyA8IDA6IHNpbGVudCBlcnJvcjsgMCA9IHN1Y2Nlc3MgKi8gCitzdGF0aWMgaW50IGdzbTM0MF9yeF90cGR1KHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IG1zZy0+bGNoYW4tPnRzLT50cngtPmJ0czsKKwl1X2ludDhfdCAqc21zcCA9IG1zZ2Jfc21zKG1zZyk7CisJc3RydWN0IGdzbV9zbXMgKmdzbXM7CisJdV9pbnQ4X3Qgc21zX210aSwgc21zX21tcywgc21zX3ZwZiwgc21zX2FscGhhYmV0LCBzbXNfcnA7CisJdV9pbnQ4X3QgKnNtc192cDsKKwl1X2ludDhfdCBkYV9sZW5fYnl0ZXM7CisJdV9pbnQ4X3QgYWRkcmVzc19sdlsxMl07IC8qIGFjY29yZGluZyB0byAwMy40MCAvIDkuMS4yLjUgKi8KKwlpbnQgcmMgPSAwOworCisJY291bnRlcl9pbmMoYnRzLT5uZXR3b3JrLT5zdGF0cy5zbXMuc3VibWl0dGVkKTsKKworCWdzbXMgPSBzbXNfYWxsb2MoKTsKKwlpZiAoIWdzbXMpCisJCXJldHVybiBHU000MTFfUlBfQ0FVU0VfTU9fTkVUX09VVF9PRl9PUkRFUjsKKworCS8qIGludmVydCB0aG9zZSBmaWVsZHMgd2hlcmUgMCBtZWFucyBhY3RpdmUvcHJlc2VudCAqLworCXNtc19tdGkgPSAqc21zcCAmIDB4MDM7CisJc21zX21tcyA9ICEhKCpzbXNwICYgMHgwNCk7CisJc21zX3ZwZiA9ICgqc21zcCAmIDB4MTgpID4+IDM7CisJZ3Ntcy0+c3RhdHVzX3JlcF9yZXEgPSAoKnNtc3AgJiAweDIwKTsKKwlnc21zLT51ZF9oZHJfaW5kID0gKCpzbXNwICYgMHg0MCk7CisJc21zX3JwICA9ICgqc21zcCAmIDB4ODApOworCisJc21zcCsrOworCWdzbXMtPm1zZ19yZWYgPSAqc21zcCsrOworCisJLyogbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzICovCisJZGFfbGVuX2J5dGVzID0gMiArICpzbXNwLzIgKyAqc21zcCUyOworCWlmIChkYV9sZW5fYnl0ZXMgPiAxMikgeworCQlMT0dQKERTTVMsIExPR0xfRVJST1IsICJEZXN0aW5hdGlvbiBBZGRyZXNzID4gMTIgYnl0ZXMgPyE/XG4iKTsKKwkJcmMgPSBHU000MTFfUlBfQ0FVU0VfU0VNQU5UX0lOQ19NU0c7CisJCWdvdG8gb3V0OworCX0KKwltZW1zZXQoYWRkcmVzc19sdiwgMCwgc2l6ZW9mKGFkZHJlc3NfbHYpKTsKKwltZW1jcHkoYWRkcmVzc19sdiwgc21zcCwgZGFfbGVuX2J5dGVzKTsKKwkvKiBtYW5nbGUgZmlyc3QgYnl0ZSB0byByZWZsZWN0IGxlbmd0aCBpbiBieXRlcywgbm90IGRpZ2l0cyAqLworCWFkZHJlc3NfbHZbMF0gPSBkYV9sZW5fYnl0ZXMgLSAxOworCS8qIGNvbnZlcnQgdG8gcmVhbCBudW1iZXIgKi8KKwlnc200OF9kZWNvZGVfYmNkX251bWJlcihnc21zLT5kZXN0X2FkZHIsIHNpemVvZihnc21zLT5kZXN0X2FkZHIpLCBhZGRyZXNzX2x2LCAxKTsKKwlzbXNwICs9IGRhX2xlbl9ieXRlczsKKworCWdzbXMtPnByb3RvY29sX2lkID0gKnNtc3ArKzsKKwlnc21zLT5kYXRhX2NvZGluZ19zY2hlbWUgPSAqc21zcCsrOworCisJc21zX2FscGhhYmV0ID0gZ3NtMzM4X2dldF9zbXNfYWxwaGFiZXQoZ3Ntcy0+ZGF0YV9jb2Rpbmdfc2NoZW1lKTsKKworCXN3aXRjaCAoc21zX3ZwZikgeworCWNhc2UgR1NNMzQwX1RQX1ZQRl9SRUxBVElWRToKKwkJc21zX3ZwID0gc21zcCsrOworCQlicmVhazsKKwljYXNlIEdTTTM0MF9UUF9WUEZfQUJTT0xVVEU6CisJY2FzZSBHU00zNDBfVFBfVlBGX0VOSEFOQ0VEOgorCQlzbXNfdnAgPSBzbXNwOworCQkvKiB0aGUgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IGluZGljYXRvci4uLiAqLworCQlpZiAoc21zX3ZwZiA9PSBHU00zNDBfVFBfVlBGX0VOSEFOQ0VEICYmICpzbXNwICYgKDE8PDcpKQorCQkJc21zcCsrOworCQlzbXNwICs9IDc7CisJCWJyZWFrOworCWNhc2UgR1NNMzQwX1RQX1ZQRl9OT05FOgorCQlzbXNfdnAgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERTTVMsIExPR0xfTk9USUNFLCAKKwkJICAgICAiU01TIFZhbGlkaXR5IHBlcmlvZCBub3QgaW1wbGVtZW50ZWQ6IDB4JTAyeFxuIiwgc21zX3ZwZik7CisJCXJldHVybiBHU000MTFfUlBfQ0FVU0VfTU9fTkVUX09VVF9PRl9PUkRFUjsKKwl9CisJZ3Ntcy0+dXNlcl9kYXRhX2xlbiA9ICpzbXNwKys7CisJaWYgKGdzbXMtPnVzZXJfZGF0YV9sZW4pIHsKKwkJbWVtY3B5KGdzbXMtPnVzZXJfZGF0YSwgc21zcCwgZ3Ntcy0+dXNlcl9kYXRhX2xlbik7CisKKwkJc3dpdGNoIChzbXNfYWxwaGFiZXQpIHsKKwkJY2FzZSBEQ1NfN0JJVF9ERUZBVUxUOgorCQkJZ3NtXzdiaXRfZGVjb2RlKGdzbXMtPnRleHQsIHNtc3AsIGdzbXMtPnVzZXJfZGF0YV9sZW4pOworCQkJYnJlYWs7CisJCWNhc2UgRENTXzhCSVRfREFUQToKKwkJY2FzZSBEQ1NfVUNTMjoKKwkJY2FzZSBEQ1NfTk9ORToKKwkJCWJyZWFrOworCQl9CisJfQorCisJZ3Ntcy0+c2VuZGVyID0gc3Vic2NyX2dldChtc2ctPmxjaGFuLT5zdWJzY3IpOworCisJTE9HUChEU01TLCBMT0dMX0lORk8sICJSWCBTTVM6IFNlbmRlcjogJXMsIE1USTogMHglMDJ4LCBWUEY6IDB4JTAyeCwgIgorCSAgICAgIk1SOiAweCUwMnggUElEOiAweCUwMngsIERDUzogMHglMDJ4LCBEQTogJXMsICIKKwkgICAgICJVc2VyRGF0YUxlbmd0aDogMHglMDJ4LCBVc2VyRGF0YTogXCIlc1wiXG4iLAorCSAgICAgc3Vic2NyX25hbWUoZ3Ntcy0+c2VuZGVyKSwgc21zX210aSwgc21zX3ZwZiwgZ3Ntcy0+bXNnX3JlZiwKKwkgICAgIGdzbXMtPnByb3RvY29sX2lkLCBnc21zLT5kYXRhX2NvZGluZ19zY2hlbWUsIGdzbXMtPmRlc3RfYWRkciwKKwkgICAgIGdzbXMtPnVzZXJfZGF0YV9sZW4sCisJCQlzbXNfYWxwaGFiZXQgPT0gRENTXzdCSVRfREVGQVVMVCA/IGdzbXMtPnRleHQgOiAKKwkJCQloZXhkdW1wKGdzbXMtPnVzZXJfZGF0YSwgZ3Ntcy0+dXNlcl9kYXRhX2xlbikpOworCisJZ3Ntcy0+dmFsaWRpdHlfbWludXRlcyA9IGdzbTM0MF92YWxpZGl0eV9wZXJpb2Qoc21zX3ZwZiwgc21zX3ZwKTsKKworCWRpc3BhdGNoX3NpZ25hbChTU19TTVMsIDAsIGdzbXMpOworCisJLyogZGV0ZXJtaW5lIGdzbXMtPnJlY2VpdmVyIGJhc2VkIG9uIGRpYWxsZWQgbnVtYmVyICovCisJZ3Ntcy0+cmVjZWl2ZXIgPSBzdWJzY3JfZ2V0X2J5X2V4dGVuc2lvbihidHMtPm5ldHdvcmssIGdzbXMtPmRlc3RfYWRkcik7CisJaWYgKCFnc21zLT5yZWNlaXZlcikgeworCQlyYyA9IDE7IC8qIGNhdXNlIDE6IHVua25vd24gc3Vic2NyaWJlciAqLworCQljb3VudGVyX2luYyhidHMtPm5ldHdvcmstPnN0YXRzLnNtcy5ub19yZWNlaXZlcik7CisJCWdvdG8gb3V0OworCX0KKworCXN3aXRjaCAoc21zX210aSkgeworCWNhc2UgR1NNMzQwX1NNU19TVUJNSVRfTVMyU0M6CisJCS8qIE1TIGlzIHN1Ym1pdHRpbmcgYSBTTVMgKi8KKwkJcmMgPSBnc20zNDBfcnhfc21zX3N1Ym1pdChtc2csIGdzbXMpOworCQlicmVhazsKKwljYXNlIEdTTTM0MF9TTVNfQ09NTUFORF9NUzJTQzoKKwljYXNlIEdTTTM0MF9TTVNfREVMSVZFUl9SRVBfTVMyU0M6CisJCUxPR1AoRFNNUywgTE9HTF9OT1RJQ0UsICJVbmltcGxlbWVudGVkIE1USSAweCUwMnhcbiIsIHNtc19tdGkpOworCQlyYyA9IEdTTTQxMV9SUF9DQVVTRV9JRV9OT1RFWElTVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChEU01TLCBMT0dMX05PVElDRSwgIlVuZGVmaW5lZCBNVEkgMHglMDJ4XG4iLCBzbXNfbXRpKTsKKwkJcmMgPSBHU000MTFfUlBfQ0FVU0VfSUVfTk9URVhJU1Q7CisJCWJyZWFrOworCX0KKworCWlmICghcmMgJiYgIWdzbXMtPnJlY2VpdmVyKQorCQlyYyA9IEdTTTQxMV9SUF9DQVVTRV9NT19OVU1fVU5BU1NJR05FRDsKKworb3V0OgorCXNtc19mcmVlKGdzbXMpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGdzbTQxMV9zZW5kX3JwX2FjayhzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdV9pbnQ4X3QgbXNnX3JlZikKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDExX21zZ2JfYWxsb2MoKTsKKworCURFQlVHUChEU01TLCAiVFg6IFNNUyBSUCBBQ0tcbiIpOworCisJcmV0dXJuIGdzbTQxMV9ycF9zZW5kbXNnKG1zZywgdHJhbnMsIEdTTTQxMV9NVF9SUF9BQ0tfTVQsIG1zZ19yZWYpOworfQorCitzdGF0aWMgaW50IGdzbTQxMV9zZW5kX3JwX2Vycm9yKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLAorCQkJCXVfaW50OF90IG1zZ19yZWYsIHVfaW50OF90IGNhdXNlKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200MTFfbXNnYl9hbGxvYygpOworCisJbXNnYl90dl9wdXQobXNnLCAxLCBjYXVzZSk7CisKKwlMT0dQKERTTVMsIExPR0xfTk9USUNFLCAiVFg6IFNNUyBSUCBFUlJPUiwgY2F1c2UgJWQgKCVzKVxuIiwgY2F1c2UsCisJCWdldF92YWx1ZV9zdHJpbmcocnBfY2F1c2Vfc3RycywgY2F1c2UpKTsKKworCXJldHVybiBnc200MTFfcnBfc2VuZG1zZyhtc2csIHRyYW5zLCBHU000MTFfTVRfUlBfRVJST1JfTVQsIG1zZ19yZWYpOworfQorCisvKiBSZWNlaXZlIGEgMDQuMTEgVFBEVSBpbnNpZGUgUlAtREFUQSAvIHVzZXIgZGF0YSAqLworc3RhdGljIGludCBnc200MTFfcnhfcnBfdWQoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdzbV90cmFucyAqdHJhbnMsCisJCQkgIHN0cnVjdCBnc200MTFfcnBfaGRyICpycGgsCisJCQkgIHVfaW50OF90IHNyY19sZW4sIHVfaW50OF90ICpzcmMsCisJCQkgIHVfaW50OF90IGRzdF9sZW4sIHVfaW50OF90ICpkc3QsCisJCQkgIHVfaW50OF90IHRwZHVfbGVuLCB1X2ludDhfdCAqdHBkdSkKK3sKKwlpbnQgcmMgPSAwOworCisJaWYgKHNyY19sZW4gJiYgc3JjKQorCQlMT0dQKERTTVMsIExPR0xfRVJST1IsICJSUC1EQVRBIChNTykgd2l0aCBTUkMgPyE/XG4iKTsKKworCWlmICghZHN0X2xlbiB8fCAhZHN0IHx8ICF0cGR1X2xlbiB8fCAhdHBkdSkgeworCQlMT0dQKERTTVMsIExPR0xfRVJST1IsCisJCQkiUlAtREFUQSAoTU8pIHdpdGhvdXQgRFNUIG9yIFRQRFUgPyE/XG4iKTsKKwkJZ3NtNDExX3NlbmRfcnBfZXJyb3IodHJhbnMsIHJwaC0+bXNnX3JlZiwKKwkJCQkgICAgIEdTTTQxMV9SUF9DQVVTRV9JTlZfTUFORF9JTkYpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJbXNnLT5zbXNoID0gdHBkdTsKKworCURFQlVHUChEU01TLCAiRFNUKCV1LCVzKVxuIiwgZHN0X2xlbiwgaGV4ZHVtcChkc3QsIGRzdF9sZW4pKTsKKworCXJjID0gZ3NtMzQwX3J4X3RwZHUobXNnKTsKKwlpZiAocmMgPT0gMCkKKwkJcmV0dXJuIGdzbTQxMV9zZW5kX3JwX2Fjayh0cmFucywgcnBoLT5tc2dfcmVmKTsKKwllbHNlIGlmIChyYyA+IDApCisJCXJldHVybiBnc200MTFfc2VuZF9ycF9lcnJvcih0cmFucywgcnBoLT5tc2dfcmVmLCByYyk7CisJZWxzZQorCQlyZXR1cm4gcmM7Cit9CisKKy8qIFJlY2VpdmUgYSAwNC4xMSBSUC1EQVRBIG1lc3NhZ2UgaW4gYWNjb3JkYW5jZSB3aXRoIFNlY3Rpb24gNy4zLjEuMiAqLworc3RhdGljIGludCBnc200MTFfcnhfcnBfZGF0YShzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywKKwkJCSAgICAgc3RydWN0IGdzbTQxMV9ycF9oZHIgKnJwaCkKK3sKKwl1X2ludDhfdCBzcmNfbGVuLCBkc3RfbGVuLCBycHVkX2xlbjsKKwl1X2ludDhfdCAqc3JjID0gTlVMTCwgKmRzdCA9IE5VTEwgLCAqcnBfdWQgPSBOVUxMOworCisJLyogaW4gdGhlIE1PIGNhc2UsIHRoaXMgc2hvdWxkIGFsd2F5cyBiZSB6ZXJvIGxlbmd0aCAqLworCXNyY19sZW4gPSBycGgtPmRhdGFbMF07CisJaWYgKHNyY19sZW4pCisJCXNyYyA9ICZycGgtPmRhdGFbMV07CisKKwlkc3RfbGVuID0gcnBoLT5kYXRhWzErc3JjX2xlbl07CisJaWYgKGRzdF9sZW4pCisJCWRzdCA9ICZycGgtPmRhdGFbMStzcmNfbGVuKzFdOworCisJcnB1ZF9sZW4gPSBycGgtPmRhdGFbMStzcmNfbGVuKzErZHN0X2xlbl07CisJaWYgKHJwdWRfbGVuKQorCQlycF91ZCA9ICZycGgtPmRhdGFbMStzcmNfbGVuKzErZHN0X2xlbisxXTsKKworCURFQlVHUChEU01TLCAiUlhfUlAtREFUQTogc3JjX2xlbj0ldSwgZHN0X2xlbj0ldSB1ZF9sZW49JXVcbiIsCisJCXNyY19sZW4sIGRzdF9sZW4sIHJwdWRfbGVuKTsKKwlyZXR1cm4gZ3NtNDExX3J4X3JwX3VkKG1zZywgdHJhbnMsIHJwaCwgc3JjX2xlbiwgc3JjLCBkc3RfbGVuLCBkc3QsCisJCQkJcnB1ZF9sZW4sIHJwX3VkKTsKK30KKworLyogUmVjZWl2ZSBhIDA0LjExIFJQLUFDSyBtZXNzYWdlIChyZXNwb25zZSB0byBSUC1EQVRBIGZyb20gdXMpICovCitzdGF0aWMgaW50IGdzbTQxMV9yeF9ycF9hY2soc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdzbV90cmFucyAqdHJhbnMsCisJCQkgICAgc3RydWN0IGdzbTQxMV9ycF9oZHIgKnJwaCkKK3sKKwlzdHJ1Y3QgZ3NtX3NtcyAqc21zID0gdHJhbnMtPnNtcy5zbXM7CisKKwkvKiBBY25rb3dsZWRnZW1lbnQgdG8gTVQgUlBfREFUQSwgaS5lLiB0aGUgTVMgY29uZmlybXMgaXQKKwkgKiBzdWNjZXNzZnVsbHkgcmVjZWl2ZWQgYSBTTVMuICBXZSBjYW4gbm93IHNhZmVseSBtYXJrIGl0IGFzCisJICogdHJhbnNtaXR0ZWQgKi8KKworCWlmICghdHJhbnMtPnNtcy5pc19tdCkgeworCQlMT0dQKERTTVMsIExPR0xfRVJST1IsICJSWCBSUC1BQ0sgb24gYSBNTyB0cmFuc2ZlciA/XG4iKTsKKwkJcmV0dXJuIGdzbTQxMV9zZW5kX3JwX2Vycm9yKHRyYW5zLCBycGgtPm1zZ19yZWYsCisJCQkJCSAgICBHU000MTFfUlBfQ0FVU0VfTVNHX0lOQ09NUF9TVEFURSk7CisJfQorCisJaWYgKCFzbXMpIHsKKwkJTE9HUChEU01TLCBMT0dMX0VSUk9SLCAiUlggUlAtQUNLIGJ1dCBubyBzbXMgaW4gdHJhbnNhY3Rpb24/IT9cbiIpOworCQlyZXR1cm4gZ3NtNDExX3NlbmRfcnBfZXJyb3IodHJhbnMsIHJwaC0+bXNnX3JlZiwKKwkJCQkJICAgIEdTTTQxMV9SUF9DQVVTRV9QUk9UT0NPTF9FUlIpOworCX0KKworCS8qIG1hcmsgdGhpcyBTTVMgYXMgc2VudCBpbiBkYXRhYmFzZSAqLworCWRiX3Ntc19tYXJrX3NlbnQoc21zKTsKKworCWRpc3BhdGNoX3NpZ25hbChTU19TTVMsIFNfU01TX0RFTElWRVJFRCwgc21zKTsKKworCXNtc19mcmVlKHNtcyk7CisJdHJhbnMtPnNtcy5zbXMgPSBOVUxMOworCisJLyogY2hlY2sgZm9yIG1vcmUgbWVzc2FnZXMgZm9yIHRoaXMgc3Vic2NyaWJlciAqLworCXNtcyA9IGRiX3Ntc19nZXRfdW5zZW50X2Zvcl9zdWJzY3IobXNnLT5sY2hhbi0+c3Vic2NyKTsKKwlpZiAoc21zKQorCQlnc200MTFfc2VuZF9zbXNfbGNoYW4obXNnLT5sY2hhbiwgc21zKTsKKworCS8qIGZyZWUgdGhlIHRyYW5zYWN0aW9uIGhlcmUgKi8KKwl0cmFuc19mcmVlKHRyYW5zKTsKKworCS8qIHJlbGVhc2UgY2hhbm5lbCBpZiBkb25lICovCisJaWYgKCFzbXMpCisJCXJzbF9yZWxlYXNlX3JlcXVlc3QobXNnLT5sY2hhbiwgdHJhbnMtPnNtcy5saW5rX2lkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdzbTQxMV9yeF9ycF9lcnJvcihzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywKKwkJCSAgICAgIHN0cnVjdCBnc200MTFfcnBfaGRyICpycGgpCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSB0cmFucy0+bGNoYW4tPnRzLT50cngtPmJ0cy0+bmV0d29yazsKKwlzdHJ1Y3QgZ3NtX3NtcyAqc21zID0gdHJhbnMtPnNtcy5zbXM7CisJdV9pbnQ4X3QgY2F1c2VfbGVuID0gcnBoLT5kYXRhWzBdOworCXVfaW50OF90IGNhdXNlID0gcnBoLT5kYXRhWzFdOworCisJLyogRXJyb3IgaW4gcmVzcG9uc2UgdG8gTVQgUlBfREFUQSwgaS5lLiB0aGUgTVMgZGlkIG5vdAorCSAqIHN1Y2Nlc3NmdWxseSByZWNlaXZlIHRoZSBTTVMuICBXZSBuZWVkIHRvIGludmVzdGlnYXRlCisJICogdGhlIGNhdXNlIGFuZCB0YWtlIGFjdGlvbiBkZXBlbmRpbmcgb24gaXQgKi8KKworCUxPR1AoRFNNUywgTE9HTF9OT1RJQ0UsICIlczogUlggU01TIFJQLUVSUk9SLCBjYXVzZSAlZDolZCAoJXMpXG4iLAorCSAgICAgc3Vic2NyX25hbWUobXNnLT5sY2hhbi0+c3Vic2NyKSwgY2F1c2VfbGVuLCBjYXVzZSwKKwkgICAgIGdldF92YWx1ZV9zdHJpbmcocnBfY2F1c2Vfc3RycywgY2F1c2UpKTsKKworCWlmICghdHJhbnMtPnNtcy5pc19tdCkgeworCQlMT0dQKERTTVMsIExPR0xfRVJST1IsICJSWCBSUC1FUlIgb24gYSBNTyB0cmFuc2ZlciA/XG4iKTsKKyNpZiAwCisJCXJldHVybiBnc200MTFfc2VuZF9ycF9lcnJvcih0cmFucywgcnBoLT5tc2dfcmVmLAorCQkJCQkgICAgR1NNNDExX1JQX0NBVVNFX01TR19JTkNPTVBfU1RBVEUpOworI2VuZGlmCisJfQorCisJaWYgKCFzbXMpIHsKKwkJTE9HUChEU01TLCBMT0dMX0VSUk9SLAorCQkJIlJYIFJQLUVSUiwgYnV0IG5vIHNtcyBpbiB0cmFuc2FjdGlvbj8hP1xuIik7CisJCXJldHVybiAtRUlOVkFMOworI2lmIDAKKwkJcmV0dXJuIGdzbTQxMV9zZW5kX3JwX2Vycm9yKHRyYW5zLCBycGgtPm1zZ19yZWYsCisJCQkJCSAgICBHU000MTFfUlBfQ0FVU0VfUFJPVE9DT0xfRVJSKTsKKyNlbmRpZgorCX0KKworCWlmIChjYXVzZSA9PSBHU000MTFfUlBfQ0FVU0VfTVRfTUVNX0VYQ0VFREVEKSB7CisJCS8qIE1TIGhhcyBub3QgZW5vdWdoIG1lbW9yeSB0byBzdG9yZSB0aGUgbWVzc2FnZS4gIFdlIG5lZWQKKwkJICogdG8gc3RvcmUgdGhpcyBpbiBvdXIgZGF0YWJhc2UgYW5kIHdhdGkgZm9yIGEgU01NQSBtZXNzYWdlICovCisJCS8qIEZJWE1FICovCisJCWRpc3BhdGNoX3NpZ25hbChTU19TTVMsIFNfU01TX01FTV9FWENFRURFRCwgdHJhbnMtPnN1YnNjcik7CisJCWNvdW50ZXJfaW5jKG5ldC0+c3RhdHMuc21zLnJwX2Vycl9tZW0pOworCX0gZWxzZQorCQljb3VudGVyX2luYyhuZXQtPnN0YXRzLnNtcy5ycF9lcnJfb3RoZXIpOworCisJc21zX2ZyZWUoc21zKTsKKwl0cmFucy0+c21zLnNtcyA9IE5VTEw7CisKKwkvL3RyYW5zX2ZyZWUodHJhbnMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDExX3J4X3JwX3NtbWEoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdzbV90cmFucyAqdHJhbnMsCisJCQkgICAgIHN0cnVjdCBnc200MTFfcnBfaGRyICpycGgpCit7CisJc3RydWN0IGdzbV9zbXMgKnNtczsKKwlpbnQgcmM7CisKKwlyYyA9IGdzbTQxMV9zZW5kX3JwX2Fjayh0cmFucywgcnBoLT5tc2dfcmVmKTsKKwl0cmFucy0+c21zLnJwX3N0YXRlID0gR1NNNDExX1JQU19JRExFOworCisJLyogTVMgdGVsbHMgdXMgdGhhdCBpdCBoYXMgbWVtb3J5IGZvciBtb3JlIFNNUywgd2UgbmVlZAorCSAqIHRvIGNoZWNrIGlmIHdlIGhhdmUgYW55IHBlbmRpbmcgbWVzc2FnZXMgZm9yIGl0IGFuZCB0aGVuCisJICogdHJhbnNmZXIgdGhvc2UgKi8KKwlkaXNwYXRjaF9zaWduYWwoU1NfU01TLCBTX1NNU19TTU1BLCB0cmFucy0+c3Vic2NyKTsKKworCS8qIGNoZWNrIGZvciBtb3JlIG1lc3NhZ2VzIGZvciB0aGlzIHN1YnNjcmliZXIgKi8KKwlzbXMgPSBkYl9zbXNfZ2V0X3Vuc2VudF9mb3Jfc3Vic2NyKG1zZy0+bGNoYW4tPnN1YnNjcik7CisJaWYgKHNtcykKKwkJZ3NtNDExX3NlbmRfc21zX2xjaGFuKG1zZy0+bGNoYW4sIHNtcyk7CisJZWxzZQorCQlyc2xfcmVsZWFzZV9yZXF1ZXN0KG1zZy0+bGNoYW4sIHRyYW5zLT5zbXMubGlua19pZCk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDExX3J4X2NwX2RhdGEoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdzbTQ4X2hkciAqZ2gsCisJCQkgICAgIHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zKQoreworCXN0cnVjdCBnc200MTFfcnBfaGRyICpycF9kYXRhID0gKHN0cnVjdCBnc200MTFfcnBfaGRyKikmZ2gtPmRhdGE7CisJdV9pbnQ4X3QgbXNnX3R5cGUgPSAgcnBfZGF0YS0+bXNnX3R5cGUgJiAweDA3OworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKG1zZ190eXBlKSB7CisJY2FzZSBHU000MTFfTVRfUlBfREFUQV9NTzoKKwkJREVCVUdQKERTTVMsICJSWCBTTVMgUlAtREFUQSAoTU8pXG4iKTsKKwkJLyogc3RhcnQgVFIyTiBhbmQgZW50ZXIgJ3dhaXQgdG8gc2VuZCBSUC1BQ0sgc3RhdGUnICovCisJCXRyYW5zLT5zbXMucnBfc3RhdGUgPSBHU000MTFfUlBTX1dBSVRfVE9fVFhfUlBfQUNLOworCQlyYyA9IGdzbTQxMV9yeF9ycF9kYXRhKG1zZywgdHJhbnMsIHJwX2RhdGEpOworCQlicmVhazsKKwljYXNlIEdTTTQxMV9NVF9SUF9BQ0tfTU86CisJCURFQlVHUChEU01TLCJSWCBTTVMgUlAtQUNLIChNTylcbiIpOworCQlyYyA9IGdzbTQxMV9yeF9ycF9hY2sobXNnLCB0cmFucywgcnBfZGF0YSk7CisJCWJyZWFrOworCWNhc2UgR1NNNDExX01UX1JQX1NNTUFfTU86CisJCURFQlVHUChEU01TLCAiUlggU01TIFJQLVNNTUFcbiIpOworCQkvKiBzdGFydCBUUjJOIGFuZCBlbnRlciAnd2FpdCB0byBzZW5kIFJQLUFDSyBzdGF0ZScgKi8KKwkJdHJhbnMtPnNtcy5ycF9zdGF0ZSA9IEdTTTQxMV9SUFNfV0FJVF9UT19UWF9SUF9BQ0s7CisJCXJjID0gZ3NtNDExX3J4X3JwX3NtbWEobXNnLCB0cmFucywgcnBfZGF0YSk7CisJCWJyZWFrOworCWNhc2UgR1NNNDExX01UX1JQX0VSUk9SX01POgorCQlyYyA9IGdzbTQxMV9yeF9ycF9lcnJvcihtc2csIHRyYW5zLCBycF9kYXRhKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChEU01TLCBMT0dMX05PVElDRSwgIkludmFsaWQgUlAgdHlwZSAweCUwMnhcbiIsIG1zZ190eXBlKTsKKwkJcmMgPSBnc200MTFfc2VuZF9ycF9lcnJvcih0cmFucywgcnBfZGF0YS0+bXNnX3JlZiwKKwkJCQkJICBHU000MTFfUlBfQ0FVU0VfTVNHVFlQRV9OT1RFWElTVCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KKworLyogc2VuZCBDUC1BQ0sgdG8gZ2l2ZW4gdHJhbnNhY3Rpb24gKi8KK3N0YXRpYyBpbnQgZ3NtNDExX3R4X2NwX2FjayhzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucykKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDExX21zZ2JfYWxsb2MoKTsKKwlpbnQgcmM7CisKKwlyYyA9IGdzbTQxMV9jcF9zZW5kbXNnKG1zZywgdHJhbnMsIEdTTTQxMV9NVF9DUF9BQ0spOworCisJaWYgKHRyYW5zLT5zbXMuaXNfbXQpIHsKKwkJLyogSWYgdGhpcyBpcyBhIE1UIFNNUyBERUxJVkVSLCB3ZSBjYW4gY2xlYXIgdHJhbnNhY3Rpb24gaGVyZSAqLworCQl0cmFucy0+c21zLmNwX3N0YXRlID0gR1NNNDExX0NQU19JRExFOworCQkvL3RyYW5zX2ZyZWUodHJhbnMpOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBnc200MTFfdHhfY3BfZXJyb3Ioc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHVfaW50OF90IGNhdXNlKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200MTFfbXNnYl9hbGxvYygpOworCXVfaW50OF90ICpjYXVzZXA7CisKKwlMT0dQKERTTVMsIExPR0xfTk9USUNFLCAiVFggQ1AtRVJST1IsIGNhdXNlICVkICglcylcbiIsIGNhdXNlLAorCQlnZXRfdmFsdWVfc3RyaW5nKGNwX2NhdXNlX3N0cnMsIGNhdXNlKSk7CisKKwljYXVzZXAgPSBtc2diX3B1dChtc2csIDEpOworCSpjYXVzZXAgPSBjYXVzZTsKKworCXJldHVybiBnc200MTFfY3Bfc2VuZG1zZyhtc2csIHRyYW5zLCBHU000MTFfTVRfQ1BfRVJST1IpOworfQorCisvKiBFbnRyeSBwb2ludCBmb3IgaW5jb21pbmcgR1NNNDhfUERJU0NfU01TIGZyb20gYWJpc19yc2wuYyAqLworaW50IGdzbTA0MTFfcmN2X3NtcyhzdHJ1Y3QgbXNnYiAqbXNnLCB1X2ludDhfdCBsaW5rX2lkKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVfaW50OF90IG1zZ190eXBlID0gZ2gtPm1zZ190eXBlOworCXVfaW50OF90IHRyYW5zYWN0aW9uX2lkID0gKChnaC0+cHJvdG9fZGlzY3IgPj4gNCkgXiAweDgpOyAvKiBmbGlwICovCisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBtc2ctPmxjaGFuOworCXN0cnVjdCBnc21fdHJhbnMgKnRyYW5zOworCWludCByYyA9IDA7CisKKwlpZiAoIWxjaGFuLT5zdWJzY3IpCisJCXJldHVybiAtRUlPOworCQkvKiBGSVhNRTogc2VuZCBzb21lIGVycm9yIG1lc3NhZ2UgKi8KKworCURFQlVHUChEU01TLCAidHJhbnNfaWQ9JXggIiwgdHJhbnNhY3Rpb25faWQpOworCXRyYW5zID0gdHJhbnNfZmluZF9ieV9pZChsY2hhbi0+c3Vic2NyLCBHU000OF9QRElTQ19TTVMsCisJCQkJIHRyYW5zYWN0aW9uX2lkKTsKKwlpZiAoIXRyYW5zKSB7CisJCURFQlVHUEMoRFNNUywgIihuZXcpICIpOworCQl0cmFucyA9IHRyYW5zX2FsbG9jKGxjaGFuLT5zdWJzY3IsIEdTTTQ4X1BESVNDX1NNUywKKwkJCQkgICAgdHJhbnNhY3Rpb25faWQsIG5ld19jYWxscmVmKyspOworCQlpZiAoIXRyYW5zKSB7CisJCQlERUJVR1BDKERTTVMsICJObyBtZW1vcnkgZm9yIHRyYW5zXG4iKTsKKwkJCS8qIEZJWE1FOiBzZW5kIHNvbWUgZXJyb3IgbWVzc2FnZSAqLworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJdHJhbnMtPnNtcy5jcF9zdGF0ZSA9IEdTTTQxMV9DUFNfSURMRTsKKwkJdHJhbnMtPnNtcy5ycF9zdGF0ZSA9IEdTTTQxMV9SUFNfSURMRTsKKwkJdHJhbnMtPnNtcy5pc19tdCA9IDA7CisJCXRyYW5zLT5zbXMubGlua19pZCA9IGxpbmtfaWQ7CisKKwkJdHJhbnMtPmxjaGFuID0gbGNoYW47CisJCXVzZV9sY2hhbihsY2hhbik7CisJfQorCisJc3dpdGNoKG1zZ190eXBlKSB7CisJY2FzZSBHU000MTFfTVRfQ1BfREFUQToKKwkJREVCVUdQQyhEU01TLCAiUlggU01TIENQLURBVEFcbiIpOworCisJCS8qIDUuNDogRm9yIE1PLCBpZiBhIENQLURBVEEgaXMgcmVjZWl2ZWQgZm9yIGEgbmV3CisJCSAqIHRyYW5zYWN0aW9uLCBlcXVhbHMgcmVjZXB0aW9uIG9mIGFuIGltcGxpY2l0CisJCSAqIGxhc3QgQ1AtQUNLIGZvciBwcmV2aW91cyB0cmFuc2FjdGlvbiAqLworCQlpZiAodHJhbnMtPnNtcy5jcF9zdGF0ZSA9PSBHU000MTFfQ1BTX0lETEUpIHsKKwkJCWludCBpOworCQkJc3RydWN0IGdzbV90cmFucyAqcHRyYW5zOworCisJCQkvKiBTY2FuIHRocm91Z2ggYWxsIHJlbW90ZSBpbml0aWF0ZWQgdHJhbnNhY3Rpb25zICovCisJCQlmb3IgKGk9ODsgaTwxNTsgaSsrKSB7CisJCQkJaWYgKGkgPT0gdHJhbnNhY3Rpb25faWQpCisJCQkJCWNvbnRpbnVlOworCisJCQkJcHRyYW5zID0gdHJhbnNfZmluZF9ieV9pZChsY2hhbi0+c3Vic2NyLAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgR1NNNDhfUERJU0NfU01TLCBpKTsKKwkJCQlpZiAoIXB0cmFucykKKwkJCQkJY29udGludWU7CisKKwkJCQlERUJVR1AoRFNNUywgIkltcGxpY2l0IENQLUFDSyBmb3IgdHJhbnNfaWQ9JXhcbiIsIGkpOworCisJCQkJLyogRmluaXNoIGl0IGZvciBnb29kICovCisJCQkJYnNjX2RlbF90aW1lcigmcHRyYW5zLT5zbXMuY3BfdGltZXIpOworCQkJCXB0cmFucy0+c21zLmNwX3N0YXRlID0gR1NNNDExX0NQU19JRExFOworCQkJCXRyYW5zX2ZyZWUocHRyYW5zKTsKKwkJCX0KKwkJfQorCisJCS8qIDUuMi4zLjEuMzogTU8gc3RhdGUgZXhpc3RzIHdoZW4gU01DIGhhcyByZWNlaXZlZAorCQkgKiBDUC1EQVRBLCBpbmNsdWRpbmcgc2VuZGluZyBvZiB0aGUgYXNzb2MuIENQLUFDSyAqLworCQkvKiA1LjIuMy4yLjQ6IE1UIHN0YXRlIGV4aXN0cyB3aGVuIFNNQyBoYXMgcmVjZWl2ZWQKKwkJICogQ1AtREFUQSwgaW5jbHVkaW5nIHNlbmRpbmcgb2YgdGhlIGFzc29jLiBDUC1BQ0sgKi8KKwkJdHJhbnMtPnNtcy5jcF9zdGF0ZSA9IEdTTTQxMV9DUFNfTU1fRVNUQUJMSVNIRUQ7CisKKwkJLyogU01DIGluc3RhbmNlIGFja25vd2xlZGdlcyB0aGUgQ1AtREFUQSBmcmFtZSAqLworCQlnc200MTFfdHhfY3BfYWNrKHRyYW5zKTsKKwkJCisJCXJjID0gZ3NtNDExX3J4X2NwX2RhdGEobXNnLCBnaCwgdHJhbnMpOworI2lmIDAKKwkJLyogU2VuZCBDUC1BQ0sgb3IgQ1AtRVJPUlIgaW4gcmVzcG9uc2UgKi8KKwkJaWYgKHJjIDwgMCkgeworCQkJcmMgPSBnc200MTFfdHhfY3BfZXJyb3IodHJhbnMsIEdTTTQxMV9DUF9DQVVTRV9ORVRfRkFJTCk7CisJCX0gZWxzZQorCQkJcmMgPSBnc200MTFfdHhfY3BfYWNrKHRyYW5zKTsKKyNlbmRpZgorCQlicmVhazsKKwljYXNlIEdTTTQxMV9NVF9DUF9BQ0s6CisJCS8qIHByZXZpb3VzIENQLURBVEEgaW4gdGhpcyB0cmFuc2FjdGlvbiB3YXMgY29uZmlybWVkICovCisJCURFQlVHUEMoRFNNUywgIlJYIFNNUyBDUC1BQ0tcbiIpOworCQkvKiA1LjIuMy4xLjM6IE1PIHN0YXRlIGV4aXN0cyB3aGVuIFNNQyBoYXMgcmVjZWl2ZWQgQ1AtQUNLICovCisJCS8qIDUuMi4zLjIuNDogTVQgc3RhdGUgZXhpc3RzIHdoZW4gU01DIGhhcyByZWNlaXZlZCBDUC1BQ0sgKi8KKwkJdHJhbnMtPnNtcy5jcF9zdGF0ZSA9IEdTTTQxMV9DUFNfTU1fRVNUQUJMSVNIRUQ7CisJCS8qIFN0b3AgVEMxKiBhZnRlciBDUC1BQ0sgaGFzIGJlZW4gcmVjZWl2ZWQgKi8KKwkJYnNjX2RlbF90aW1lcigmdHJhbnMtPnNtcy5jcF90aW1lcik7CisKKwkJaWYgKCF0cmFucy0+c21zLmlzX210KSB7CisJCQkvKiBGSVhNRTogd2UgaGF2ZSBzb250IG9uZSBDUC1EQVRBLCB3aGljaCB3YXMgbm93CisJCQkgKiBhY2tub3dsZWRnZWQuICBDaGVjayBpZiB3ZSB3YW50IHRvIHRyYW5zZmVyIG1vcmUsCisJCQkgKiBpLmUuIG11bHRpLXBhcnQgbWVzc2FnZSAqLworCQkJdHJhbnMtPnNtcy5jcF9zdGF0ZSA9IEdTTTQxMV9DUFNfSURMRTsKKwkJCXRyYW5zX2ZyZWUodHJhbnMpOworCQl9CisJCWJyZWFrOworCWNhc2UgR1NNNDExX01UX0NQX0VSUk9SOgorCQlERUJVR1BDKERTTVMsICJSWCBTTVMgQ1AtRVJST1IsIGNhdXNlICVkICglcylcbiIsIGdoLT5kYXRhWzBdLAorCQkJZ2V0X3ZhbHVlX3N0cmluZyhjcF9jYXVzZV9zdHJzLCBnaC0+ZGF0YVswXSkpOworCQlic2NfZGVsX3RpbWVyKCZ0cmFucy0+c21zLmNwX3RpbWVyKTsKKwkJdHJhbnMtPnNtcy5jcF9zdGF0ZSA9IEdTTTQxMV9DUFNfSURMRTsKKwkJdHJhbnNfZnJlZSh0cmFucyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURFQlVHUEMoRFNNUywgIlJYIFVuaW1wbGVtZW50ZWQgQ1AgbXNnX3R5cGU6IDB4JTAyeFxuIiwgbXNnX3R5cGUpOworCQlyYyA9IGdzbTQxMV90eF9jcF9lcnJvcih0cmFucywgR1NNNDExX0NQX0NBVVNFX01TR1RZUEVfTk9URVhJU1QpOworCQl0cmFucy0+c21zLmNwX3N0YXRlID0gR1NNNDExX0NQU19JRExFOworCQl0cmFuc19mcmVlKHRyYW5zKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorCisjaWYgMAorLyogVGVzdCBUUERVIC0gQUxMIFlPVVIgKi8KK3N0YXRpYyB1X2ludDhfdCB0cGR1X3Rlc3RbXSA9IHsKKwkweDA0LCAweDA0LCAweDgxLCAweDMyLCAweDI0LCAweDAwLCAweDAwLCAweDgwLCAweDIxLCAweDAzLCAweDQxLCAweDI0LAorCTB4MzIsIDB4NDAsIDB4MUYsIDB4NDEsIDB4MjYsIDB4MTMsIDB4OTQsIDB4N0QsIDB4NTYsIDB4QTUsIDB4MjAsIDB4MjgsCisJMHhGMiwgMHhFOSwgMHgyQywgMHg4MiwgMHg4MiwgMHhEMiwgMHgyMiwgMHg0OCwgMHg1OCwgMHg2NCwgMHgzRSwgMHg5RCwKKwkweDQ3LCAweDEwLCAweEY1LCAweDA5LCAweEFBLCAweDRFLCAweDAxCit9OworI2VuZGlmCisKKy8qIFRha2UgYSBTTVMgaW4gZ3NtX3NtcyBzdHJ1Y3R1cmUgYW5kIHNlbmQgaXQgdGhyb3VnaCBhbiBhbHJlYWR5CisgKiBleGlzdGluZyBsY2hhbi4gV2UgYWxzbyBhc3N1bWUgdGhhdCB0aGUgY2FsbGVyIGVuc3VyZWQgdGhpcyBsY2hhbiBhbHJlYWR5CisgKiBoYXMgYSBTQVBJMyBSTEwgY29ubmVjdGlvbiEgKi8KK2ludCBnc200MTFfc2VuZF9zbXNfbGNoYW4oc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHN0cnVjdCBnc21fc21zICpzbXMpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQxMV9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbV90cmFucyAqdHJhbnM7CisJdV9pbnQ4X3QgKmRhdGEsICpycF91ZF9sZW47CisJdV9pbnQ4X3QgbXNnX3JlZiA9IDQyOworCWludCB0cmFuc2FjdGlvbl9pZDsKKwlpbnQgcmM7CisKKwl0cmFuc2FjdGlvbl9pZCA9IHRyYW5zX2Fzc2lnbl90cmFuc19pZChsY2hhbi0+c3Vic2NyLCBHU000OF9QRElTQ19TTVMsIDApOworCWlmICh0cmFuc2FjdGlvbl9pZCA9PSAtMSkgeworCQlMT0dQKERTTVMsIExPR0xfRVJST1IsICJObyBhdmFpbGFibGUgdHJhbnNhY3Rpb24gaWRzXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwltc2ctPmxjaGFuID0gbGNoYW47CisKKwlERUJVR1AoRFNNUywgInNlbmRfc21zX2xjaGFuKClcbiIpOworCisJLyogRklYTUU6IGFsbG9jYXRlIHRyYW5zYWN0aW9uIHdpdGggbWVzc2FnZSByZWZlcmVuY2UgKi8KKwl0cmFucyA9IHRyYW5zX2FsbG9jKGxjaGFuLT5zdWJzY3IsIEdTTTQ4X1BESVNDX1NNUywKKwkJCSAgICB0cmFuc2FjdGlvbl9pZCwgbmV3X2NhbGxyZWYrKyk7CisJaWYgKCF0cmFucykgeworCQlMT0dQKERTTVMsIExPR0xfRVJST1IsICJObyBtZW1vcnkgZm9yIHRyYW5zXG4iKTsKKwkJLyogRklYTUU6IHNlbmQgc29tZSBlcnJvciBtZXNzYWdlICovCisJCXJldHVybiAtRU5PTUVNOworCX0KKwl0cmFucy0+c21zLmNwX3N0YXRlID0gR1NNNDExX0NQU19JRExFOworCXRyYW5zLT5zbXMucnBfc3RhdGUgPSBHU000MTFfUlBTX0lETEU7CisJdHJhbnMtPnNtcy5pc19tdCA9IDE7CisJdHJhbnMtPnNtcy5zbXMgPSBzbXM7CisJdHJhbnMtPnNtcy5saW5rX2lkID0gVU1fU0FQSV9TTVM7CS8qIEZJWE1FOiBtYWluIG9yIFNBQ0NIID8gKi8KKworCXRyYW5zLT5sY2hhbiA9IGxjaGFuOworCXVzZV9sY2hhbihsY2hhbik7CisKKwkvKiBIYXJkY29kZSBTTVNDIE9yaWdpbmF0aW5nIEFkZHJlc3MgZm9yIG5vdyAqLworCWRhdGEgPSAodV9pbnQ4X3QgKiltc2diX3B1dChtc2csIDgpOworCWRhdGFbMF0gPSAweDA3OwkvKiBvcmlnaW5hdG9yIGxlbmd0aCA9PSA3ICovCisJZGF0YVsxXSA9IDB4OTE7IC8qIHR5cGUgb2YgbnVtYmVyOiBpbnRlcm5hdGlvbmFsLCBJU0ROICovCisJZGF0YVsyXSA9IDB4NDQ7IC8qIDQ0Nzc4NTAxNjAwNSAqLworCWRhdGFbM10gPSAweDc3OworCWRhdGFbNF0gPSAweDU4OworCWRhdGFbNV0gPSAweDEwOworCWRhdGFbNl0gPSAweDA2OworCWRhdGFbN10gPSAweDUwOworCisJLyogSGFyZGNvZGVkIERlc3RpbmF0aW9uIEFkZHJlc3MgKi8KKwlkYXRhID0gKHVfaW50OF90ICopbXNnYl9wdXQobXNnLCAxKTsKKwlkYXRhWzBdID0gMDsJLyogZGVzdGluYXRpb24gbGVuZ3RoID09IDAgKi8KKworCS8qIG9idGFpbiBhIHBvaW50ZXIgZm9yIHRoZSBycF91ZF9sZW4sIHNvIHdlIGNhbiBmaWxsIGl0IGxhdGVyICovCisJcnBfdWRfbGVuID0gKHVfaW50OF90ICopbXNnYl9wdXQobXNnLCAxKTsKKworI2lmIDEKKwkvKiBnZW5lcmF0ZSB0aGUgMDMuNDAgVFBEVSAqLworCXJjID0gZ3NtMzQwX2dlbl90cGR1KG1zZywgc21zKTsKKwlpZiAocmMgPCAwKSB7CisJCW1zZ2JfZnJlZShtc2cpOworCQlyZXR1cm4gcmM7CisJfQorCisJKnJwX3VkX2xlbiA9IHJjOworI2Vsc2UKKwlkYXRhID0gbXNnYl9wdXQobXNnLCBzaXplb2YodHBkdV90ZXN0KSk7CisJbWVtY3B5KGRhdGEsIHRwZHVfdGVzdCwgc2l6ZW9mKHRwZHVfdGVzdCkpOworCSpycF91ZF9sZW4gPSBzaXplb2YodHBkdV90ZXN0KTsKKyNlbmRpZgorCisJREVCVUdQKERTTVMsICJUWDogU01TIERFTElWRVJcbiIpOworCisJY291bnRlcl9pbmMobGNoYW4tPnRzLT50cngtPmJ0cy0+bmV0d29yay0+c3RhdHMuc21zLmRlbGl2ZXJlZCk7CisKKwlyZXR1cm4gZ3NtNDExX3JwX3NlbmRtc2cobXNnLCB0cmFucywgR1NNNDExX01UX1JQX0RBVEFfTVQsIG1zZ19yZWYpOworCS8qIEZJWE1FOiBlbnRlciAnd2FpdCBmb3IgUlAtQUNLJyBzdGF0ZSwgc3RhcnQgVFIxTiAqLworfQorCisvKiBSTEwgU0FQSTMgZXN0YWJsaXNoIGNhbGxiYWNrLiBOb3cgd2UgaGF2ZSBhIFJMTCBjb25uZWN0aW9uIGFuZAorICogY2FuIGRlbGl2ZXIgdGhlIGFjdHVhbCBtZXNzYWdlICovCitzdGF0aWMgdm9pZCBybGxfaW5kX2NiKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBsaW5rX2lkLAorCQkJdm9pZCAqX3NtcywgZW51bSBic2Nfcmxscl9pbmQgdHlwZSkKK3sKKwlzdHJ1Y3QgZ3NtX3NtcyAqc21zID0gX3NtczsKKworCURFQlVHUChEU01TLCAicmxsX2luZF9jYihsY2hhbj0lcCwgbGlua19pZD0ldSwgc21zPSVwLCB0eXBlPSV1XG4iLAorCQlsY2hhbiwgbGlua19pZCwgc21zLCB0eXBlKTsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgQlNDX1JMTFJfSU5EX0VTVF9DT05GOgorCQlnc200MTFfc2VuZF9zbXNfbGNoYW4obGNoYW4sIHNtcyk7CisJCWJyZWFrOworCWNhc2UgQlNDX1JMTFJfSU5EX1JFTF9JTkQ6CisJY2FzZSBCU0NfUkxMUl9JTkRfRVJSX0lORDoKKwljYXNlIEJTQ19STExSX0lORF9USU1FT1VUOgorCQlzbXNfZnJlZShzbXMpOworCQlicmVhazsKKwl9Cit9CisKKy8qIHBhZ2luZyBjYWxsYmFjay4gSGVyZSB3ZSBnZXQgY2FsbGVkIGlmIHBhZ2luZyBhIHN1YnNjcmliZXIgaGFzCisgKiBzdWNjZWVkZWQgb3IgZmFpbGVkLiAqLworc3RhdGljIGludCBwYWdpbmdfY2Jfc2VuZF9zbXModW5zaWduZWQgaW50IGhvb2tudW0sIHVuc2lnbmVkIGludCBldmVudCwKKwkJCSAgICAgIHN0cnVjdCBtc2diICptc2csIHZvaWQgKl9sY2hhbiwgdm9pZCAqX3NtcykKK3sKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IF9sY2hhbjsKKwlzdHJ1Y3QgZ3NtX3NtcyAqc21zID0gX3NtczsKKwlpbnQgcmM7CisKKwlERUJVR1AoRFNNUywgInBhZ2luZ19jYl9zZW5kX3Ntcyhob29rbnVtPSV1LCBldmVudD0ldSwgbXNnPSVwLCIKKwkJImxjaGFuPSVwLCBzbXM9JXApXG4iLCBob29rbnVtLCBldmVudCwgbXNnLCBsY2hhbiwgc21zKTsKKworCWlmIChob29rbnVtICE9IEdTTV9IT09LX1JSX1BBR0lORykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBHU01fUEFHSU5HX1NVQ0NFRURFRDoKKwkJLyogUGFnaW5nIGFib3J0ZWQgd2l0aG91dCBsY2hhbiA/IT8gKi8KKwkJaWYgKCFsY2hhbikgeworCQkJc21zX2ZyZWUoc21zKTsKKwkJCXJjID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisJCS8qIEVzdGFibGlzaCBhIFNBUEkzIFJMTCBjb25uZWN0aW9uIGZvciBTTVMgKi8KKwkJcmMgPSBybGxfZXN0YWJsaXNoKGxjaGFuLCBVTV9TQVBJX1NNUywgcmxsX2luZF9jYiwgc21zKTsKKwkJYnJlYWs7CisJY2FzZSBHU01fUEFHSU5HX0VYUElSRUQ6CisJCXNtc19mcmVlKHNtcyk7CisJCXJjID0gLUVUSU1FRE9VVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmMgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIGhpZ2gtbGV2ZWwgZnVuY3Rpb24gdG8gc2VuZCBhIFNNUyB0byBhIGdpdmVuIHN1YnNjcmliZXIuIFRoZSBmdW5jdGlvbgorICogd2lsbCB0YWtlIGNhcmUgb2YgcGFnaW5nIHRoZSBzdWJzY3JpYmVyLCBlc3RhYmxpc2hpbmcgdGhlIFJMTCBTQVBJMworICogY29ubmVjdGlvbiwgZXRjLiAqLworaW50IGdzbTQxMV9zZW5kX3Ntc19zdWJzY3Ioc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsCisJCQkgICBzdHJ1Y3QgZ3NtX3NtcyAqc21zKQoreworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuOworCWludCByYzsKKworCS8qIGNoZWNrIGlmIHdlIGFscmVhZHkgaGF2ZSBhbiBvcGVuIGxjaGFuIHRvIHRoZSBzdWJzY3JpYmVyLgorCSAqIGlmIHllcywgc2VuZCB0aGUgU01TIHRoaXMgd2F5ICovCisJbGNoYW4gPSBsY2hhbl9mb3Jfc3Vic2NyKHN1YnNjcik7CisJaWYgKGxjaGFuKQorCQlyZXR1cm4gcmxsX2VzdGFibGlzaChsY2hhbiwgVU1fU0FQSV9TTVMsCisJCQkJICAgICBybGxfaW5kX2NiLCBzbXMpOworCisJLyogaWYgbm90LCB3ZSBoYXZlIHRvIHN0YXJ0IHBhZ2luZyAqLworCXJjID0gcGFnaW5nX3JlcXVlc3Qoc3Vic2NyLT5uZXQsIHN1YnNjciwgUlNMX0NIQU5ORUVEX1NEQ0NILAorCQkJICAgIHBhZ2luZ19jYl9zZW5kX3Ntcywgc21zKTsKKwlpZiAocmMgPD0gMCkKKwkJc21zX2ZyZWUoc21zKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN1YnNjcl9zaWdfY2IodW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IHNpZ25hbCwKKwkJCSB2b2lkICpoYW5kbGVyX2RhdGEsIHZvaWQgKnNpZ25hbF9kYXRhKQoreworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyOworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuOworCXN0cnVjdCBnc21fc21zICpzbXM7CisKKwlzd2l0Y2ggKHNpZ25hbCkgeworCWNhc2UgU19TVUJTQ1JfQVRUQUNIRUQ6CisJCS8qIEEgc3Vic2NyaWJlciBoYXMgYXR0YWNoZWQuIENoZWNrIGlmIHRoZXJlIGFyZQorCQkgKiBhbnkgcGVuZGluZyBTTVMgZm9yIGhpbSB0byBiZSBkZWxpdmVyZWQgKi8KKwkJc3Vic2NyID0gc2lnbmFsX2RhdGE7CisJCWxjaGFuID0gbGNoYW5fZm9yX3N1YnNjcihzdWJzY3IpOworCQlpZiAoIWxjaGFuKQorCQkJYnJlYWs7CisJCXNtcyA9IGRiX3Ntc19nZXRfdW5zZW50X2Zvcl9zdWJzY3Ioc3Vic2NyKTsKKwkJaWYgKCFzbXMpCisJCQlicmVhazsKKwkJLyogRXN0YWJsaXNoIGEgU0FQSTMgUkxMIGNvbm5lY3Rpb24gZm9yIFNNUyAqLworCQlybGxfZXN0YWJsaXNoKGxjaGFuLCBVTV9TQVBJX1NNUywgcmxsX2luZF9jYiwgc21zKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCit2b2lkIF9nc200MTFfc21zX3RyYW5zX2ZyZWUoc3RydWN0IGdzbV90cmFucyAqdHJhbnMpCit7CisJYnNjX2RlbF90aW1lcigmdHJhbnMtPnNtcy5jcF90aW1lcik7Cit9CisKK3N0YXRpYyBfX2F0dHJpYnV0ZV9fKChjb25zdHJ1Y3RvcikpIHZvaWQgb25fZHNvX2xvYWRfc21zKHZvaWQpCit7CisJcmVnaXN0ZXJfc2lnbmFsX2hhbmRsZXIoU1NfU1VCU0NSLCBzdWJzY3Jfc2lnX2NiLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2dzbV8wNF84MC5jIGIvb3BlbmJzYy9zcmMvZ3NtXzA0XzgwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI3MTI3NAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2dzbV8wNF84MC5jCkBAIC0wLDAgKzEsMzMwIEBACisvKiBHU00gTW9iaWxlIFJhZGlvIEludGVyZmFjZSBMYXllciAzIG1lc3NhZ2VzIG9uIHRoZSBBLWJpcyBpbnRlcmZhY2UKKyAqIDNHUFAgVFMgMDQuMDggdmVyc2lvbiA3LjIxLjAgUmVsZWFzZSAxOTk4IC8gRVRTSSBUUyAxMDAgOTQwIFY3LjIxLjAgKi8KKworLyogKEMpIDIwMDgtMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMDgsIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogKEMpIDIwMDkgYnkgTWlrZSBIYWJlbiA8bWljaGFlbC5oYWJlbkBidGludGVybmV0LmNvbT4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvZ3NtX3V0aWxzLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMDguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF84MC5oPgorCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworc3RhdGljIGludCBwYXJzZV91c3NkKHVfaW50OF90ICp1c3NkLCBzdHJ1Y3QgdXNzZF9yZXF1ZXN0ICpyZXEpOworc3RhdGljIGludCBwYXJzZV91c3NkX2luZm9fZWxlbWVudHModV9pbnQ4X3QgKnVzc2RfaWUsCisJCQkJCXN0cnVjdCB1c3NkX3JlcXVlc3QgKnJlcSk7CitzdGF0aWMgaW50IHBhcnNlX2ZhY2lsaXR5X2llKHVfaW50OF90ICpmYWNpbGl0eV9pZSwgdV9pbnQ4X3QgbGVuZ3RoLAorCQkJCQlzdHJ1Y3QgdXNzZF9yZXF1ZXN0ICpyZXEpOworc3RhdGljIGludCBwYXJzZV9zc19pbnZva2UodV9pbnQ4X3QgKmludm9rZV9kYXRhLCB1X2ludDhfdCBsZW5ndGgsCisJCQkJCXN0cnVjdCB1c3NkX3JlcXVlc3QgKnJlcSk7CitzdGF0aWMgaW50IHBhcnNlX3Byb2Nlc3NfdXNzX3JlcSh1X2ludDhfdCAqdXNzX3JlcV9kYXRhLCB1X2ludDhfdCBsZW5ndGgsCisJCQkJCXN0cnVjdCB1c3NkX3JlcXVlc3QgKnJlcSk7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciAqbXNnYl93cmFwX3dpdGhfVEwoc3RydWN0IG1zZ2IgKm1zZ2IsIHVfaW50OF90IHRhZykKK3sKKwltc2diLT5kYXRhIC09IDI7CisJbXNnYi0+ZGF0YVswXSA9IHRhZzsKKwltc2diLT5kYXRhWzFdID0gbXNnYi0+bGVuOworCW1zZ2ItPmxlbiArPSAyOworCXJldHVybiBtc2diLT5kYXRhOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgKm1zZ2JfcHVzaF9UTFYxKHN0cnVjdCBtc2diICptc2diLCB1X2ludDhfdCB0YWcsCisJCQkJCSAgICB1X2ludDhfdCB2YWx1ZSkKK3sKKwltc2diLT5kYXRhIC09IDM7CisJbXNnYi0+bGVuICs9IDM7CisJbXNnYi0+ZGF0YVswXSA9IHRhZzsKKwltc2diLT5kYXRhWzFdID0gMTsKKwltc2diLT5kYXRhWzJdID0gdmFsdWU7CisJcmV0dXJuIG1zZ2ItPmRhdGE7Cit9CisKKworLyogRGVjb2RlIGEgbW9iaWxlLW9yaWdpbmF0ZWQgVVNTRC1yZXF1ZXN0IG1lc3NhZ2UgKi8KK2ludCBnc20wNDgwX2RlY29kZV91c3NkX3JlcXVlc3QoY29uc3Qgc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IHVzc2RfcmVxdWVzdCAqcmVxKQoreworCWludCByYyA9IDA7CisJdV9pbnQ4X3QgKnBhcnNlX3B0ciA9IG1zZ2JfbDMobXNnKTsKKworCWlmICgoKnBhcnNlX3B0ciAmIDB4MEYpID09IEdTTTQ4X1BESVNDX05DX1NTKSB7CisJCXJlcS0+dHJhbnNhY3Rpb25faWQgPSAqcGFyc2VfcHRyICYgMHg3MDsKKwkJcmMgPSBwYXJzZV91c3NkKHBhcnNlX3B0cisxLCByZXEpOworCX0KKworCWlmICghcmMpCisJCURFQlVHUChETU0sICJFcnJvciBvY2N1cnJlZCB3aGlsZSBwYXJzaW5nIHJlY2VpdmVkIFVTU0QhXG4iKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBwYXJzZV91c3NkKHVfaW50OF90ICp1c3NkLCBzdHJ1Y3QgdXNzZF9yZXF1ZXN0ICpyZXEpCit7CisJaW50IHJjID0gMTsKKwl1X2ludDhfdCBtc2dfdHlwZSA9IHVzc2RbMF0gJiAweEJGOyAgLyogbWVzc2FnZS10eXBlIC0gc2VjdGlvbiAzLjQgKi8KKworCXN3aXRjaCAobXNnX3R5cGUpIHsKKwljYXNlIEdTTTA0ODBfTVRZUEVfUkVMRUFTRV9DT01QTEVURToKKwkJREVCVUdQKERNTSwgIlVTUyBSZWxlYXNlIENvbXBsZXRlXG4iKTsKKwkJLyogY291bGQgYWxzbyBwYXJzZSBvdXQgdGhlIG9wdGlvbmFsIENhdXNlL0ZhY2lsaXR5IGRhdGEgKi8KKwkJcmVxLT50ZXh0WzBdID0gMHhGRjsKKwkJYnJlYWs7CisJY2FzZSBHU00wNDgwX01UWVBFX1JFR0lTVEVSOgorCWNhc2UgR1NNMDQ4MF9NVFlQRV9GQUNJTElUWToKKwkJcmMgJj0gcGFyc2VfdXNzZF9pbmZvX2VsZW1lbnRzKHVzc2QrMSwgcmVxKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZnByaW50ZihzdGRlcnIsICJVbmtub3duIEdTTSAwNC44MCBtZXNzYWdlLXR5cGUgZmllbGQgMHglMDJ4XG4iLAorCQkJdXNzZFswXSk7CisJCXJjID0gMDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHBhcnNlX3Vzc2RfaW5mb19lbGVtZW50cyh1X2ludDhfdCAqdXNzZF9pZSwgc3RydWN0IHVzc2RfcmVxdWVzdCAqcmVxKQoreworCWludCByYzsKKwkvKiBJbmZvcm1hdGlvbiBFbGVtZW50IElkZW50aWZpZXIgLSB0YWJsZSAzLjIgJiBHU00gMDQuMDggc2VjdGlvbiAxMC41ICovCisJdV9pbnQ4X3QgaWVpID0gdXNzZF9pZVswXTsKKwl1X2ludDhfdCBpZWlfbGVuZ3RoID0gdXNzZF9pZVsxXTsKKworCXN3aXRjaCAoaWVpKSB7CisJY2FzZSBHU000OF9JRV9DQVVTRToKKwkJYnJlYWs7CisJY2FzZSBHU00wNDgwX0lFX0ZBQ0lMSVRZOgorCQlyYyA9IHBhcnNlX2ZhY2lsaXR5X2llKHVzc2RfaWUrMiwgaWVpX2xlbmd0aCwgcmVxKTsKKwkJYnJlYWs7CisJY2FzZSBHU00wNDgwX0lFX1NTX1ZFUlNJT046CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWZwcmludGYoc3RkZXJyLCAiVW5oYW5kbGVkIEdTTSAwNC4wOCBvciAwNC44MCBJRUkgMHglMDJ4XG4iLAorCQkJaWVpKTsKKwkJcmMgPSAwOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfZmFjaWxpdHlfaWUodV9pbnQ4X3QgKmZhY2lsaXR5X2llLCB1X2ludDhfdCBsZW5ndGgsCisJCQkJCQlzdHJ1Y3QgdXNzZF9yZXF1ZXN0ICpyZXEpCit7CisJaW50IHJjID0gMTsKKwl1X2ludDhfdCBvZmZzZXQgPSAwOworCisJZG8geworCQkvKiBDb21wb25lbnQgVHlwZSB0YWcgLSB0YWJsZSAzLjcgKi8KKwkJdV9pbnQ4X3QgY29tcG9uZW50X3R5cGUgPSBmYWNpbGl0eV9pZVtvZmZzZXRdOworCQl1X2ludDhfdCBjb21wb25lbnRfbGVuZ3RoID0gZmFjaWxpdHlfaWVbb2Zmc2V0KzFdOworCisJCXN3aXRjaCAoY29tcG9uZW50X3R5cGUpIHsKKwkJY2FzZSBHU00wNDgwX0NUWVBFX0lOVk9LRToKKwkJCXJjICY9IHBhcnNlX3NzX2ludm9rZShmYWNpbGl0eV9pZSsyLAorCQkJCQkJY29tcG9uZW50X2xlbmd0aCwKKwkJCQkJCXJlcSk7CisJCQlicmVhazsKKwkJY2FzZSBHU00wNDgwX0NUWVBFX1JFVFVSTl9SRVNVTFQ6CisJCQlicmVhazsKKwkJY2FzZSBHU00wNDgwX0NUWVBFX1JFVFVSTl9FUlJPUjoKKwkJCWJyZWFrOworCQljYXNlIEdTTTA0ODBfQ1RZUEVfUkVKRUNUOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gR1NNIDA0LjgwIEZhY2lsaXR5ICIKKwkJCQkiQ29tcG9uZW50IFR5cGUgMHglMDJ4XG4iLCBjb21wb25lbnRfdHlwZSk7CisJCQlyYyA9IDA7CisJCQlicmVhazsKKwkJfQorCQlvZmZzZXQgKz0gKGNvbXBvbmVudF9sZW5ndGgrMik7CisJfSB3aGlsZSAob2Zmc2V0IDwgbGVuZ3RoKTsKKworCXJldHVybiByYzsKK30KKworLyogUGFyc2UgYW4gSW52b2tlIGNvbXBvbmVudCAtIHNlZSB0YWJsZSAzLjMgKi8KK3N0YXRpYyBpbnQgcGFyc2Vfc3NfaW52b2tlKHVfaW50OF90ICppbnZva2VfZGF0YSwgdV9pbnQ4X3QgbGVuZ3RoLAorCQkJCQkJc3RydWN0IHVzc2RfcmVxdWVzdCAqcmVxKQoreworCWludCByYyA9IDE7CisJdV9pbnQ4X3Qgb2Zmc2V0OworCisJLyogbWFuZGF0b3J5IHBhcnQgKi8KKwlpZiAoaW52b2tlX2RhdGFbMF0gIT0gR1NNMDQ4MF9DT01QSURUQUdfSU5WT0tFX0lEKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVW5leHBlY3RlZCBHU00gMDQuODAgQ29tcG9uZW50LUlEIHRhZyAiCisJCQkiMHglMDJ4IChleHBlY3RpbmcgSW52b2tlIElEIHRhZylcbiIsIGludm9rZV9kYXRhWzBdKTsKKwl9CisKKwlvZmZzZXQgPSBpbnZva2VfZGF0YVsxXSArIDI7CisJcmVxLT5pbnZva2VfaWQgPSBpbnZva2VfZGF0YVsyXTsKKworCS8qIG9wdGlvbmFsIHBhcnQgKi8KKwlpZiAoaW52b2tlX2RhdGFbb2Zmc2V0XSA9PSBHU00wNDgwX0NPTVBJRFRBR19MSU5LRURfSUQpCisJCW9mZnNldCArPSBpbnZva2VfZGF0YVtvZmZzZXQrMV0gKyAyOyAgLyogc2tpcCBvdmVyIGl0ICovCisKKwkvKiBtYW5kYXRvcnkgcGFydCAqLworCWlmIChpbnZva2VfZGF0YVtvZmZzZXRdID09IEdTTTA0ODBfT1BFUkFUSU9OX0NPREUpIHsKKwkJdV9pbnQ4X3Qgb3BlcmF0aW9uX2NvZGUgPSBpbnZva2VfZGF0YVtvZmZzZXQrMl07CisJCXN3aXRjaCAob3BlcmF0aW9uX2NvZGUpIHsKKwkJY2FzZSBHU00wNDgwX09QX0NPREVfUFJPQ0VTU19VU1NfUkVROgorCQkJcmMgPSBwYXJzZV9wcm9jZXNzX3Vzc19yZXEoaW52b2tlX2RhdGEgKyBvZmZzZXQgKyAzLAorCQkJCQkJICAgbGVuZ3RoIC0gb2Zmc2V0IC0gMywKKwkJCQkJCSAgIHJlcSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWZwcmludGYoc3RkZXJyLCAiR1NNIDA0LjgwIG9wZXJhdGlvbiBjb2RlIDB4JTAyeCAiCisJCQkJImlzIG5vdCB5ZXQgaGFuZGxlZFxuIiwgb3BlcmF0aW9uX2NvZGUpOworCQkJcmMgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVuZXhwZWN0ZWQgR1NNIDA0LjgwIENvbXBvbmVudC1JRCB0YWcgMHglMDJ4ICIKKwkJCSIoZXhwZWN0aW5nIE9wZXJhdGlvbiBDb2RlIHRhZylcbiIsCisJCQlpbnZva2VfZGF0YVswXSk7CisJCXJjID0gMDsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIFBhcnNlIHRoZSBwYXJhbWV0ZXJzIG9mIGEgUHJvY2VzcyBVbnN0cnVjdHVyZWRTUyBSZXF1ZXN0ICovCitzdGF0aWMgaW50IHBhcnNlX3Byb2Nlc3NfdXNzX3JlcSh1X2ludDhfdCAqdXNzX3JlcV9kYXRhLCB1X2ludDhfdCBsZW5ndGgsCisJCQkJCXN0cnVjdCB1c3NkX3JlcXVlc3QgKnJlcSkKK3sKKwlpbnQgcmMgPSAwOworCWludCBudW1fY2hhcnM7CisJdV9pbnQ4X3QgZGNzOworCisJaWYgKHVzc19yZXFfZGF0YVswXSA9PSBHU01fMDQ4MF9TRVFVRU5DRV9UQUcpIHsKKwkJaWYgKHVzc19yZXFfZGF0YVsyXSA9PSBBU04xX09DVEVUX1NUUklOR19UQUcpIHsKKwkJCWRjcyA9IHVzc19yZXFfZGF0YVs0XTsKKwkJCWlmICgoZGNzID09IDB4MEYpICYmCisJCQkgICAgKHVzc19yZXFfZGF0YVs1XSA9PSBBU04xX09DVEVUX1NUUklOR19UQUcpKSB7CisJCQkJbnVtX2NoYXJzID0gKHVzc19yZXFfZGF0YVs2XSAqIDgpIC8gNzsKKwkJCQkvKiBQcmV2ZW50IGEgbW9iaWxlLW9yaWdpbmF0ZWQgYnVmZmVyLW92ZXJydW4hICovCisJCQkJaWYgKG51bV9jaGFycyA+IE1BWF9MRU5fVVNTRF9TVFJJTkcpCisJCQkJCW51bV9jaGFycyA9IE1BWF9MRU5fVVNTRF9TVFJJTkc7CisJCQkJZ3NtXzdiaXRfZGVjb2RlKHJlcS0+dGV4dCwKKwkJCQkJCSYodXNzX3JlcV9kYXRhWzddKSwgbnVtX2NoYXJzKTsKKwkJCQkvKiBhcHBlbmQgbnVsbC10ZXJtaW5hdG9yICovCisJCQkJcmVxLT50ZXh0W251bV9jaGFycysxXSA9IDA7ICAKKwkJCQlyYyA9IDE7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHJjOworfQorCisvKiBTZW5kIHJlc3BvbnNlIHRvIGEgbW9iaWxlLW9yaWdpbmF0ZWQgUHJvY2Vzc1Vuc3RydWN0dXJlZFNTLVJlcXVlc3QgKi8KK2ludCBnc20wNDgwX3NlbmRfdXNzZF9yZXNwb25zZShjb25zdCBzdHJ1Y3QgbXNnYiAqaW5fbXNnLCBjb25zdCBjaGFyICpyZXNwb25zZV90ZXh0LAorCQkJCQkJY29uc3Qgc3RydWN0IHVzc2RfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2g7CisJdV9pbnQ4X3QgKnB0cjg7CisJaW50IHJlc3BvbnNlX2xlbjsKKworCXJlc3BvbnNlX2xlbiA9IChzdHJsZW4ocmVzcG9uc2VfdGV4dCkgKiA3KSAvIDg7CisJaWYgKCgoc3RybGVuKHJlc3BvbnNlX3RleHQpICogNykgJSA4KSAhPSAwKQorCQlyZXNwb25zZV9sZW4gKz0gMTsKKworCW1zZy0+YnRzX2xpbmsgPSBpbl9tc2ctPmJ0c19saW5rOworCW1zZy0+bGNoYW4gPSBpbl9tc2ctPmxjaGFuOworCisJLyogRmlyc3QgcHV0IHRoZSBwYXlsb2FkIHRleHQgaW50byB0aGUgbWVzc2FnZSAqLworCXB0cjggPSBtc2diX3B1dChtc2csIHJlc3BvbnNlX2xlbik7CisJZ3NtXzdiaXRfZW5jb2RlKHB0cjgsIHJlc3BvbnNlX3RleHQpOworCisJLyogVGhlbiB3cmFwIGl0IGFzIGFuIE9jdGV0IFN0cmluZyAqLworCW1zZ2Jfd3JhcF93aXRoX1RMKG1zZywgQVNOMV9PQ1RFVF9TVFJJTkdfVEFHKTsKKworCS8qIFByZS1wZW5kIHRoZSBEQ1Mgb2N0ZXQgc3RyaW5nICovCisJbXNnYl9wdXNoX1RMVjEobXNnLCBBU04xX09DVEVUX1NUUklOR19UQUcsIDB4MEYpOworCisJLyogVGhlbiB3cmFwIHRoZXNlIGFzIGEgU2VxdWVuY2UgKi8KKwltc2diX3dyYXBfd2l0aF9UTChtc2csIEdTTV8wNDgwX1NFUVVFTkNFX1RBRyk7CisKKwkvKiBQcmUtcGVuZCB0aGUgb3BlcmF0aW9uIGNvZGUgKi8KKwltc2diX3B1c2hfVExWMShtc2csIEdTTTA0ODBfT1BFUkFUSU9OX0NPREUsCisJCQlHU00wNDgwX09QX0NPREVfUFJPQ0VTU19VU1NfUkVRKTsKKworCS8qIFdyYXAgdGhlIG9wZXJhdGlvbiBjb2RlIGFuZCBJQTUgc3RyaW5nIGFzIGEgc2VxdWVuY2UgKi8KKwltc2diX3dyYXBfd2l0aF9UTChtc2csIEdTTV8wNDgwX1NFUVVFTkNFX1RBRyk7CisKKwkvKiBQcmUtcGVuZCB0aGUgaW52b2tlIElEICovCisJbXNnYl9wdXNoX1RMVjEobXNnLCBHU00wNDgwX0NPTVBJRFRBR19JTlZPS0VfSUQsIHJlcS0+aW52b2tlX2lkKTsKKworCS8qIFdyYXAgdGhpcyB1cCBhcyBhIFJldHVybiBSZXN1bHQgY29tcG9uZW50ICovCisJbXNnYl93cmFwX3dpdGhfVEwobXNnLCBHU00wNDgwX0NUWVBFX1JFVFVSTl9SRVNVTFQpOworCisJLyogV3JhcCB0aGUgY29tcG9uZW50IGluIGEgRmFjaWxpdHkgbWVzc2FnZSAqLworCW1zZ2Jfd3JhcF93aXRoX1RMKG1zZywgR1NNMDQ4MF9JRV9GQUNJTElUWSk7CisKKwkvKiBBbmQgZmluYWxseSBwcmUtcGVuZCB0aGUgTDMgaGVhZGVyICovCisJZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1c2gobXNnLCBzaXplb2YoKmdoKSk7CisJZ2gtPnByb3RvX2Rpc2NyID0gR1NNNDhfUERJU0NfTkNfU1MgfCByZXEtPnRyYW5zYWN0aW9uX2lkCisJCQkJCXwgKDE8PDcpOyAgLyogVEkgZGlyZWN0aW9uID0gMSAqLworCWdoLT5tc2dfdHlwZSA9IEdTTTA0ODBfTVRZUEVfUkVMRUFTRV9DT01QTEVURTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgTlVMTCk7Cit9CisKK2ludCBnc20wNDgwX3NlbmRfdXNzZF9yZWplY3QoY29uc3Qgc3RydWN0IG1zZ2IgKmluX21zZywKKwkJCQljb25zdCBzdHJ1Y3QgdXNzZF9yZXF1ZXN0ICpyZXEpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaDsKKworCW1zZy0+YnRzX2xpbmsgPSBpbl9tc2ctPmJ0c19saW5rOworCW1zZy0+bGNoYW4gPSBpbl9tc2ctPmxjaGFuOworCisJLyogRmlyc3QgaW5zZXJ0IHRoZSBwcm9ibGVtIGNvZGUgKi8KKwltc2diX3B1c2hfVExWMShtc2csIEdTTV8wNDgwX1BST0JMRU1fQ09ERV9UQUdfR0VORVJBTCwKKwkJCUdTTV8wNDgwX0dFTl9QUk9CX0NPREVfVU5SRUNPR05JU0VEKTsKKworCS8qIEJlZm9yZSBpdCBpbnNlcnQgdGhlIGludm9rZSBJRCAqLworCW1zZ2JfcHVzaF9UTFYxKG1zZywgR1NNMDQ4MF9DT01QSURUQUdfSU5WT0tFX0lELCByZXEtPmludm9rZV9pZCk7CisKKwkvKiBXcmFwIHRoaXMgdXAgYXMgYSBSZWplY3QgY29tcG9uZW50ICovCisJbXNnYl93cmFwX3dpdGhfVEwobXNnLCBHU00wNDgwX0NUWVBFX1JFSkVDVCk7CisKKwkvKiBXcmFwIHRoZSBjb21wb25lbnQgaW4gYSBGYWNpbGl0eSBtZXNzYWdlICovCisJbXNnYl93cmFwX3dpdGhfVEwobXNnLCBHU00wNDgwX0lFX0ZBQ0lMSVRZKTsKKworCS8qIEFuZCBmaW5hbGx5IHByZS1wZW5kIHRoZSBMMyBoZWFkZXIgKi8KKwlnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHVzaChtc2csIHNpemVvZigqZ2gpKTsKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19OQ19TUzsKKwlnaC0+cHJvdG9fZGlzY3IgfD0gcmVxLT50cmFuc2FjdGlvbl9pZCB8ICgxPDw3KTsgIC8qIFRJIGRpcmVjdGlvbiA9IDEgKi8KKwlnaC0+bXNnX3R5cGUgPSBHU00wNDgwX01UWVBFX1JFTEVBU0VfQ09NUExFVEU7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZ3NtX2RhdGEuYyBiL29wZW5ic2Mvc3JjL2dzbV9kYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc2MzY3ZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2dzbV9kYXRhLmMKQEAgLTAsMCArMSw1MzYgQEAKKy8qIChDKSAyMDA4LTIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvZ3NtX3V0aWxzLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX25tLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvc3RhdGlzdGljcy5oPgorCit2b2lkICp0YWxsX2JzY19jdHg7CisKK3N0YXRpYyBMTElTVF9IRUFEKGJ0c19tb2RlbHMpOworCit2b2lkIHNldF90c19lMWxpbmsoc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cywgdV9pbnQ4X3QgZTFfbnIsCisJCSAgIHVfaW50OF90IGUxX3RzLCB1X2ludDhfdCBlMV90c19zcykKK3sKKwl0cy0+ZTFfbGluay5lMV9uciA9IGUxX25yOworCXRzLT5lMV9saW5rLmUxX3RzID0gZTFfdHM7CisJdHMtPmUxX2xpbmsuZTFfdHNfc3MgPSBlMV90c19zczsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgcGNoYW5fbmFtZXNbXSA9IHsKKwl7IEdTTV9QQ0hBTl9OT05FLAkiTk9ORSIgfSwKKwl7IEdTTV9QQ0hBTl9DQ0NILAkiQ0NDSCIgfSwKKwl7IEdTTV9QQ0hBTl9DQ0NIX1NEQ0NINCwiQ0NDSCtTRENDSDQiIH0sCisJeyBHU01fUENIQU5fVENIX0YsCSJUQ0gvRiIgfSwKKwl7IEdTTV9QQ0hBTl9UQ0hfSCwJIlRDSC9IIiB9LAorCXsgR1NNX1BDSEFOX1NEQ0NIOF9TQUNDSDhDLCAiU0RDQ0g4IiB9LAorCXsgR1NNX1BDSEFOX1BEQ0gsCSJQRENIIiB9LAorCXsgR1NNX1BDSEFOX1RDSF9GX1BEQ0gsCSJUQ0gvRl9QRENIIiB9LAorCXsgR1NNX1BDSEFOX1VOS05PV04sCSJVTktOT1dOIiB9LAorCXsgMCwJCQlOVUxMIH0KK307CisKK2NvbnN0IGNoYXIgKmdzbV9wY2hhbl9uYW1lKGVudW0gZ3NtX3BoeXNfY2hhbl9jb25maWcgYykKK3sKKwlyZXR1cm4gZ2V0X3ZhbHVlX3N0cmluZyhwY2hhbl9uYW1lcywgYyk7Cit9CisKK2VudW0gZ3NtX3BoeXNfY2hhbl9jb25maWcgZ3NtX3BjaGFuX3BhcnNlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIGdldF9zdHJpbmdfdmFsdWUocGNoYW5fbmFtZXMsIG5hbWUpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyBsY2hhbnRfbmFtZXNbXSA9IHsKKwl7IEdTTV9MQ0hBTl9OT05FLAkiTk9ORSIgfSwKKwl7IEdTTV9MQ0hBTl9TRENDSCwJIlNEQ0NIIiB9LAorCXsgR1NNX0xDSEFOX1RDSF9GLAkiVENIL0YiIH0sCisJeyBHU01fTENIQU5fVENIX0gsCSJUQ0gvSCIgfSwKKwl7IEdTTV9MQ0hBTl9VTktOT1dOLAkiVU5LTk9XTiIgfSwKKwl7IDAsCQkJTlVMTCB9Cit9OworCitjb25zdCBjaGFyICpnc21fbGNoYW50X25hbWUoZW51bSBnc21fY2hhbl90IGMpCit7CisJcmV0dXJuIGdldF92YWx1ZV9zdHJpbmcobGNoYW50X25hbWVzLCBjKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgbGNoYW5fc19uYW1lc1tdID0geworCXsgTENIQU5fU19OT05FLAkJIk5PTkUiIH0sCisJeyBMQ0hBTl9TX0FDVF9SRVEsCSJBQ1RJVkFUSU9OIFJFUVVFU1RFRCIgfSwKKwl7IExDSEFOX1NfQUNUSVZFLAkiQUNUSVZFIiB9LAorCXsgTENIQU5fU19JTkFDVElWRSwJIklOQUNUSVZFIiB9LAorCXsgTENIQU5fU19SRUxfUkVRLAkiUkVMRUFTRSBSRVFVRVNURUQiIH0sCisJeyAwLAkJCU5VTEwgfQorfTsKKworY29uc3QgY2hhciAqZ3NtX2xjaGFuc19uYW1lKGVudW0gZ3NtX2xjaGFuX3N0YXRlIHMpCit7CisJcmV0dXJuIGdldF92YWx1ZV9zdHJpbmcobGNoYW5fc19uYW1lcywgcyk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nIGNocmVxX25hbWVzW10gPSB7CisJeyBHU01fQ0hSRVFfUkVBU09OX0VNRVJHLAkiRU1FUkdFTkNZIiB9LAorCXsgR1NNX0NIUkVRX1JFQVNPTl9QQUcsCQkiUEFHSU5HIiB9LAorCXsgR1NNX0NIUkVRX1JFQVNPTl9DQUxMLAkiQ0FMTCIgfSwKKwl7IEdTTV9DSFJFUV9SRUFTT05fTE9DQVRJT05fVVBELCJMT0NBVElPTl9VUERBVEUiIH0sCisJeyBHU01fQ0hSRVFfUkVBU09OX09USEVSLAkiT1RIRVIiIH0sCisJeyAwLAkJCQlOVUxMIH0KK307CisKK2NvbnN0IGNoYXIgKmdzbV9jaHJlcV9uYW1lKGVudW0gZ3NtX2NocmVxX3JlYXNvbl90IGMpCit7CisJcmV0dXJuIGdldF92YWx1ZV9zdHJpbmcoY2hyZXFfbmFtZXMsIGMpOworfQorCitzdGF0aWMgc3RydWN0IGdzbV9idHNfbW9kZWwgKmJ0c19tb2RlbF9maW5kKGVudW0gZ3NtX2J0c190eXBlIHR5cGUpCit7CisJc3RydWN0IGdzbV9idHNfbW9kZWwgKm1vZGVsOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkobW9kZWwsICZidHNfbW9kZWxzLCBsaXN0KSB7CisJCWlmIChtb2RlbC0+dHlwZSA9PSB0eXBlKQorCQkJcmV0dXJuIG1vZGVsOworCX0KKworCXJldHVybiBOVUxMOworfQorCitpbnQgZ3NtX2J0c19tb2RlbF9yZWdpc3RlcihzdHJ1Y3QgZ3NtX2J0c19tb2RlbCAqbW9kZWwpCit7CisJaWYgKGJ0c19tb2RlbF9maW5kKG1vZGVsLT50eXBlKSkKKwkJcmV0dXJuIC1FRVhJU1Q7CisKKwl0bHZfZGVmX3BhdGNoKCZtb2RlbC0+bm1fYXR0X3RsdmRlZiwgJm5tX2F0dF90bHZkZWYpOworCWxsaXN0X2FkZF90YWlsKCZtb2RlbC0+bGlzdCwgJmJ0c19tb2RlbHMpOworCXJldHVybiAwOworfQorCisKK3N0cnVjdCBnc21fYnRzX3RyeCAqZ3NtX2J0c190cnhfYWxsb2Moc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCA9IHRhbGxvY196ZXJvKGJ0cywgc3RydWN0IGdzbV9idHNfdHJ4KTsKKwlpbnQgazsKKworCWlmICghdHJ4KQorCQlyZXR1cm4gTlVMTDsKKworCXRyeC0+YnRzID0gYnRzOworCXRyeC0+bnIgPSBidHMtPm51bV90cngrKzsKKwl0cngtPm5tX3N0YXRlLmFkbWluaXN0cmF0aXZlID0gTk1fU1RBVEVfVU5MT0NLRUQ7CisKKwlmb3IgKGsgPSAwOyBrIDwgVFJYX05SX1RTOyBrKyspIHsKKwkJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyA9ICZ0cngtPnRzW2tdOworCQlpbnQgbDsKKwkJCisJCXRzLT50cnggPSB0cng7CisJCXRzLT5uciA9IGs7CisJCXRzLT5wY2hhbiA9IEdTTV9QQ0hBTl9OT05FOworCisJCWZvciAobCA9IDA7IGwgPCBUU19NQVhfTENIQU47IGwrKykgeworCQkJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW47CisJCQlsY2hhbiA9ICZ0cy0+bGNoYW5bbF07CisKKwkJCWxjaGFuLT50cyA9IHRzOworCQkJbGNoYW4tPm5yID0gbDsKKwkJCWxjaGFuLT50eXBlID0gR1NNX0xDSEFOX05PTkU7CisJCX0KKwl9CisKKwlpZiAodHJ4LT5uciAhPSAwKQorCQl0cngtPm5vbWluYWxfcG93ZXIgPSBidHMtPmMwLT5ub21pbmFsX3Bvd2VyOworCisJbGxpc3RfYWRkX3RhaWwoJnRyeC0+bGlzdCwgJmJ0cy0+dHJ4X2xpc3QpOworCisJcmV0dXJuIHRyeDsKK30KKworc3RydWN0IGdzbV9idHMgKmdzbV9idHNfYWxsb2Moc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIGVudW0gZ3NtX2J0c190eXBlIHR5cGUsCisJCQkgICAgICB1X2ludDhfdCB0c2MsIHVfaW50OF90IGJzaWMpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHRhbGxvY196ZXJvKG5ldCwgc3RydWN0IGdzbV9idHMpOworCXN0cnVjdCBnc21fYnRzX21vZGVsICptb2RlbCA9IGJ0c19tb2RlbF9maW5kKHR5cGUpOworCWludCBpOworCisJaWYgKCFidHMpCisJCXJldHVybiBOVUxMOworCisJaWYgKCFtb2RlbCAmJiB0eXBlICE9IEdTTV9CVFNfVFlQRV9VTktOT1dOKSB7CisJCXRhbGxvY19mcmVlKGJ0cyk7CisJCXJldHVybiBOVUxMOworCX0KKworCWJ0cy0+bmV0d29yayA9IG5ldDsKKwlidHMtPm5yID0gbmV0LT5udW1fYnRzKys7CisJYnRzLT50eXBlID0gdHlwZTsKKwlidHMtPm1vZGVsID0gbW9kZWw7CisJYnRzLT50c2MgPSB0c2M7CisJYnRzLT5ic2ljID0gYnNpYzsKKwlidHMtPm51bV90cnggPSAwOworCUlOSVRfTExJU1RfSEVBRCgmYnRzLT50cnhfbGlzdCk7CisJYnRzLT5tc19tYXhfcG93ZXIgPSAxNTsJLyogZEJtICovCisJYnRzLT5zaV9jb21tb24uY2VsbF9zZWxfcGFyLmNlbGxfcmVzZWxfaHlzdCA9IDI7IC8qIDQgZEIgKi8KKwlidHMtPnNpX2NvbW1vbi5jZWxsX3NlbF9wYXIucnhsZXZfYWNjX21pbiA9IDA7CisJYnRzLT5zaV9jb21tb24ubmVpZ2hfbGlzdC5kYXRhID0gYnRzLT5zaV9jb21tb24uZGF0YS5uZWlnaF9saXN0OworCWJ0cy0+c2lfY29tbW9uLm5laWdoX2xpc3QuZGF0YV9sZW4gPQorCQkJCXNpemVvZihidHMtPnNpX2NvbW1vbi5kYXRhLm5laWdoX2xpc3QpOworCWJ0cy0+c2lfY29tbW9uLmNlbGxfYWxsb2MuZGF0YSA9IGJ0cy0+c2lfY29tbW9uLmRhdGEuY2VsbF9hbGxvYzsKKwlidHMtPnNpX2NvbW1vbi5jZWxsX2FsbG9jLmRhdGFfbGVuID0KKwkJCQlzaXplb2YoYnRzLT5zaV9jb21tb24uZGF0YS5jZWxsX2FsbG9jKTsKKwlidHMtPnNpX2NvbW1vbi5yYWNoX2NvbnRyb2wucmUgPSAxOyAvKiBubyByZS1lc3RhYmxpc2htZW50ICovCisJYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sLnR4X2ludGVnZXIgPSA5OyAgLyogMTIgc2xvdHMgc3ByZWFkIC0gMjE3LzExNSBzbG90cyBkZWxheSAqLworCWJ0cy0+c2lfY29tbW9uLnJhY2hfY29udHJvbC5tYXhfdHJhbnMgPSAzOyAvKiA3IHJldHJhbnNtaXNzaW9ucyAqLworCWJ0cy0+c2lfY29tbW9uLnJhY2hfY29udHJvbC50MiA9IDQ7IC8qIG5vIGVtZXJnZW5jeSBjYWxscyAqLworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYnRzLT5ncHJzLm5zdmMpOyBpKyspIHsKKwkJYnRzLT5ncHJzLm5zdmNbaV0uYnRzID0gYnRzOworCQlidHMtPmdwcnMubnN2Y1tpXS5pZCA9IGk7CisJfQorCisJLyogY3JlYXRlIG91ciBwcmltYXJ5IFRSWCAqLworCWJ0cy0+YzAgPSBnc21fYnRzX3RyeF9hbGxvYyhidHMpOworCWlmICghYnRzLT5jMCkgeworCQl0YWxsb2NfZnJlZShidHMpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJYnRzLT5jMC0+dHNbMF0ucGNoYW4gPSBHU01fUENIQU5fQ0NDSF9TRENDSDQ7CisKKwlsbGlzdF9hZGRfdGFpbCgmYnRzLT5saXN0LCAmbmV0LT5idHNfbGlzdCk7CisKKwlyZXR1cm4gYnRzOworfQorCitzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbV9uZXR3b3JrX2luaXQodV9pbnQxNl90IGNvdW50cnlfY29kZSwgdV9pbnQxNl90IG5ldHdvcmtfY29kZSwKKwkJCQkgICAgIGludCAoKm1uY2NfcmVjdikoc3RydWN0IGdzbV9uZXR3b3JrICosIGludCwgdm9pZCAqKSkKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldDsKKworCW5ldCA9IHRhbGxvY196ZXJvKHRhbGxfYnNjX2N0eCwgc3RydWN0IGdzbV9uZXR3b3JrKTsKKwlpZiAoIW5ldCkKKwkJcmV0dXJuIE5VTEw7CisKKwluZXQtPmNvdW50cnlfY29kZSA9IGNvdW50cnlfY29kZTsKKwluZXQtPm5ldHdvcmtfY29kZSA9IG5ldHdvcmtfY29kZTsKKwluZXQtPm51bV9idHMgPSAwOworCW5ldC0+cmVqZWN0X2NhdXNlID0gR1NNNDhfUkVKRUNUX1JPQU1JTkdfTk9UX0FMTE9XRUQ7CisJbmV0LT5UMzEwMSA9IEdTTV9UMzEwMV9ERUZBVUxUOworCW5ldC0+VDMxMTMgPSBHU01fVDMxMTNfREVGQVVMVDsKKwkvKiBGSVhNRTogaW5pdGlhbGl6ZSBhbGwgb3RoZXIgdGltZXJzISAqLworCisJLyogZGVmYXVsdCBzZXQgb2YgaGFuZG92ZXIgcGFyYW1ldGVycyAqLworCW5ldC0+aGFuZG92ZXIud2luX3J4bGV2X2F2ZyA9IDEwOworCW5ldC0+aGFuZG92ZXIud2luX3J4cXVhbF9hdmcgPSAxOworCW5ldC0+aGFuZG92ZXIud2luX3J4bGV2X2F2Z19uZWlnaCA9IDEwOworCW5ldC0+aGFuZG92ZXIucHdyX2ludGVydmFsID0gNjsKKwluZXQtPmhhbmRvdmVyLnB3cl9oeXN0ZXJlc2lzID0gMzsKKwluZXQtPmhhbmRvdmVyLm1heF9kaXN0YW5jZSA9IDk5OTk7CisKKwlJTklUX0xMSVNUX0hFQUQoJm5ldC0+dHJhbnNfbGlzdCk7CisJSU5JVF9MTElTVF9IRUFEKCZuZXQtPnVwcXVldWUpOworCUlOSVRfTExJU1RfSEVBRCgmbmV0LT5idHNfbGlzdCk7CisKKwluZXQtPnN0YXRzLmNocmVxLnRvdGFsID0gY291bnRlcl9hbGxvYygibmV0LmNocmVxLnRvdGFsIik7CisJbmV0LT5zdGF0cy5jaHJlcS5ub19jaGFubmVsID0gY291bnRlcl9hbGxvYygibmV0LmNocmVxLm5vX2NoYW5uZWwiKTsKKwluZXQtPnN0YXRzLmhhbmRvdmVyLmF0dGVtcHRlZCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5oYW5kb3Zlci5hdHRlbXB0ZWQiKTsKKwluZXQtPnN0YXRzLmhhbmRvdmVyLm5vX2NoYW5uZWwgPSBjb3VudGVyX2FsbG9jKCJuZXQuaGFuZG92ZXIubm9fY2hhbm5lbCIpOworCW5ldC0+c3RhdHMuaGFuZG92ZXIudGltZW91dCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5oYW5kb3Zlci50aW1lb3V0Iik7CisJbmV0LT5zdGF0cy5oYW5kb3Zlci5jb21wbGV0ZWQgPSBjb3VudGVyX2FsbG9jKCJuZXQuaGFuZG92ZXIuY29tcGxldGVkIik7CisJbmV0LT5zdGF0cy5oYW5kb3Zlci5mYWlsZWQgPSBjb3VudGVyX2FsbG9jKCJuZXQuaGFuZG92ZXIuZmFpbGVkIik7CisJbmV0LT5zdGF0cy5sb2NfdXBkX3R5cGUuYXR0YWNoID0gY291bnRlcl9hbGxvYygibmV0LmxvY191cGRfdHlwZS5hdHRhY2giKTsKKwluZXQtPnN0YXRzLmxvY191cGRfdHlwZS5ub3JtYWwgPSBjb3VudGVyX2FsbG9jKCJuZXQubG9jX3VwZF90eXBlLm5vcm1hbCIpOworCW5ldC0+c3RhdHMubG9jX3VwZF90eXBlLnBlcmlvZGljID0gY291bnRlcl9hbGxvYygibmV0LmxvY191cGRfdHlwZS5wZXJpb2RpYyIpOworCW5ldC0+c3RhdHMubG9jX3VwZF90eXBlLmRldGFjaCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5pbXNpX2RldGFjaC5jb3VudCIpOworCW5ldC0+c3RhdHMubG9jX3VwZF9yZXNwLnJlamVjdCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5sb2NfdXBkX3Jlc3AucmVqZWN0Iik7CisJbmV0LT5zdGF0cy5sb2NfdXBkX3Jlc3AuYWNjZXB0ID0gY291bnRlcl9hbGxvYygibmV0LmxvY191cGRfcmVzcC5hY2NlcHQiKTsKKwluZXQtPnN0YXRzLnBhZ2luZy5hdHRlbXB0ZWQgPSBjb3VudGVyX2FsbG9jKCJuZXQucGFnaW5nLmF0dGVtcHRlZCIpOworCW5ldC0+c3RhdHMucGFnaW5nLmRldGFjaGVkID0gY291bnRlcl9hbGxvYygibmV0LnBhZ2luZy5kZXRhY2hlZCIpOworCW5ldC0+c3RhdHMucGFnaW5nLmNvbXBsZXRlZCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5wYWdpbmcuY29tcGxldGVkIik7CisJbmV0LT5zdGF0cy5wYWdpbmcuZXhwaXJlZCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5wYWdpbmcuZXhwaXJlZCIpOworCW5ldC0+c3RhdHMuc21zLnN1Ym1pdHRlZCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5zbXMuc3VibWl0dGVkIik7CisJbmV0LT5zdGF0cy5zbXMubm9fcmVjZWl2ZXIgPSBjb3VudGVyX2FsbG9jKCJuZXQuc21zLm5vX3JlY2VpdmVyIik7CisJbmV0LT5zdGF0cy5zbXMuZGVsaXZlcmVkID0gY291bnRlcl9hbGxvYygibmV0LnNtcy5kZWxpdmVyZWQiKTsKKwluZXQtPnN0YXRzLnNtcy5ycF9lcnJfbWVtID0gY291bnRlcl9hbGxvYygibmV0LnNtcy5ycF9lcnJfbWVtIik7CisJbmV0LT5zdGF0cy5zbXMucnBfZXJyX290aGVyID0gY291bnRlcl9hbGxvYygibmV0LnNtcy5ycF9lcnJfb3RoZXIiKTsKKwluZXQtPnN0YXRzLmNhbGwuZGlhbGxlZCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5jYWxsLmRpYWxsZWQiKTsKKwluZXQtPnN0YXRzLmNhbGwuYWxlcnRlZCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5jYWxsLmFsZXJ0ZWQiKTsKKwluZXQtPnN0YXRzLmNhbGwuY29ubmVjdGVkID0gY291bnRlcl9hbGxvYygibmV0LmNhbGwuY29ubmVjdGVkIik7CisKKwluZXQtPm1uY2NfcmVjdiA9IG1uY2NfcmVjdjsKKworCXJldHVybiBuZXQ7Cit9CisKK3N0cnVjdCBnc21fYnRzICpnc21fYnRzX251bShzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgaW50IG51bSkKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCisJaWYgKG51bSA+PSBuZXQtPm51bV9idHMpCisJCXJldHVybiBOVUxMOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoYnRzLCAmbmV0LT5idHNfbGlzdCwgbGlzdCkgeworCQlpZiAoYnRzLT5uciA9PSBudW0pCisJCQlyZXR1cm4gYnRzOworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKiBHZXQgcmVmZXJlbmNlIHRvIGEgbmVpZ2hib3IgY2VsbCBvbiBhIGdpdmVuIEJDQ0ggQVJGQ04gKi8KK3N0cnVjdCBnc21fYnRzICpnc21fYnRzX25laWdoYm9yKGNvbnN0IHN0cnVjdCBnc21fYnRzICpidHMsCisJCQkJIHVfaW50MTZfdCBhcmZjbiwgdV9pbnQ4X3QgYnNpYykKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqbmVpZ2g7CisJLyogRklYTUU6IHVzZSBzb21lIGJldHRlciBoZXVyaXN0aWNzIGhlcmUgdG8gZGV0ZXJtaW5lIHdoaWNoIGNlbGwKKwkgKiB1c2luZyB0aGlzIEFSRkNOIHJlYWxseSBpcyBjbG9zZXN0IHRvIHRoZSB0YXJnZXQgY2VsbC4gIEZvcgorCSAqIG5vdyB3ZSBzaW1wbHkgYXNzdW1lIHRoYXQgZWFjaCBBUkZDTiB3aWxsIG9ubHkgYmUgdXNlZCBieSBvbmUKKwkgKiBjZWxsICovCisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShuZWlnaCwgJmJ0cy0+bmV0d29yay0+YnRzX2xpc3QsIGxpc3QpIHsKKwkJaWYgKG5laWdoLT5jMC0+YXJmY24gPT0gYXJmY24gJiYKKwkJICAgIG5laWdoLT5ic2ljID09IGJzaWMpCisJCQlyZXR1cm4gbmVpZ2g7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBnc21fYnRzX3RyeCAqZ3NtX2J0c190cnhfbnVtKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBudW0pCit7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisKKwlpZiAobnVtID49IGJ0cy0+bnVtX3RyeCkKKwkJcmV0dXJuIE5VTEw7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0cngsICZidHMtPnRyeF9saXN0LCBsaXN0KSB7CisJCWlmICh0cngtPm5yID09IG51bSkKKwkJCXJldHVybiB0cng7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBjaGFyIHRzMnN0clsyNTVdOworCitjaGFyICpnc21fdHJ4X25hbWUoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpCit7CisJc25wcmludGYodHMyc3RyLCBzaXplb2YodHMyc3RyKSwgIihidHM9JWQsdHJ4PSVkKSIsCisJCSB0cngtPmJ0cy0+bnIsIHRyeC0+bnIpOworCisJcmV0dXJuIHRzMnN0cjsKK30KKworCitjaGFyICpnc21fdHNfbmFtZShzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzKQoreworCXNucHJpbnRmKHRzMnN0ciwgc2l6ZW9mKHRzMnN0ciksICIoYnRzPSVkLHRyeD0lZCx0cz0lZCkiLAorCQkgdHMtPnRyeC0+YnRzLT5uciwgdHMtPnRyeC0+bnIsIHRzLT5ucik7CisKKwlyZXR1cm4gdHMyc3RyOworfQorCitjaGFyICpnc21fbGNoYW5fbmFtZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzID0gbGNoYW4tPnRzOworCisJc25wcmludGYodHMyc3RyLCBzaXplb2YodHMyc3RyKSwgIihidHM9JWQsdHJ4PSVkLHRzPSVkLHNzPSVkKSIsCisJCSB0cy0+dHJ4LT5idHMtPm5yLCB0cy0+dHJ4LT5uciwgdHMtPm5yLCBsY2hhbi0+bnIpOworCisJcmV0dXJuIHRzMnN0cjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgYnRzX3R5cGVzW10gPSB7CisJeyBHU01fQlRTX1RZUEVfVU5LTk9XTiwJInVua25vd24iIH0sCisJeyBHU01fQlRTX1RZUEVfQlMxMSwJImJzMTEiIH0sCisJeyBHU01fQlRTX1RZUEVfTkFOT0JUUywJIm5hbm9idHMiIH0sCisJeyAwLAkJCU5VTEwgfQorfTsKKworZW51bSBnc21fYnRzX3R5cGUgcGFyc2VfYnRzdHlwZShjb25zdCBjaGFyICphcmcpCit7CisJcmV0dXJuIGdldF9zdHJpbmdfdmFsdWUoYnRzX3R5cGVzLCBhcmcpOworfQorCitjb25zdCBjaGFyICpidHN0eXBlMnN0cihlbnVtIGdzbV9idHNfdHlwZSB0eXBlKQoreworCXJldHVybiBnZXRfdmFsdWVfc3RyaW5nKGJ0c190eXBlcywgdHlwZSk7Cit9CisKK3N0cnVjdCBnc21fYnRzX3RyeCAqZ3NtX2J0c190cnhfYnlfbnIoc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IG5yKQoreworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkodHJ4LCAmYnRzLT50cnhfbGlzdCwgbGlzdCkgeworCQlpZiAodHJ4LT5uciA9PSBucikKKwkJCXJldHVybiB0cng7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKiBTZWFyY2ggZm9yIGEgQlRTIGluIHRoZSBnaXZlbiBMb2NhdGlvbiBBcmVhOyBvcHRpb25hbGx5IHN0YXJ0IHNlYXJjaGluZworICogd2l0aCBzdGFydF9idHMgKGZvciBjb250aW51aW5nIHRvIHNlYXJjaCBhZnRlciB0aGUgZmlyc3QgcmVzdWx0KSAqLworc3RydWN0IGdzbV9idHMgKmdzbV9idHNfYnlfbGFjKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCB1bnNpZ25lZCBpbnQgbGFjLAorCQkJCXN0cnVjdCBnc21fYnRzICpzdGFydF9idHMpCit7CisJaW50IGk7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKwlpbnQgc2tpcCA9IDA7CisKKwlpZiAoc3RhcnRfYnRzKQorCQlza2lwID0gMTsKKworCWZvciAoaSA9IDA7IGkgPCBuZXQtPm51bV9idHM7IGkrKykgeworCQlidHMgPSBnc21fYnRzX251bShuZXQsIGkpOworCisJCWlmIChza2lwKSB7CisJCQlpZiAoc3RhcnRfYnRzID09IGJ0cykKKwkJCQlza2lwID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGxhYyA9PSBHU01fTEFDX1JFU0VSVkVEX0FMTF9CVFMgfHwgYnRzLT5sb2NhdGlvbl9hcmVhX2NvZGUgPT0gbGFjKQorCQkJcmV0dXJuIGJ0czsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nIGF1dGhfcG9saWN5X25hbWVzW10gPSB7CisJeyBHU01fQVVUSF9QT0xJQ1lfQ0xPU0VELAkiY2xvc2VkIiB9LAorCXsgR1NNX0FVVEhfUE9MSUNZX0FDQ0VQVF9BTEwsCSJhY2NlcHQtYWxsIiB9LAorCXsgR1NNX0FVVEhfUE9MSUNZX1RPS0VOLAkidG9rZW4iIH0sCisJeyAwLAkJCQlOVUxMIH0KK307CisKK2VudW0gZ3NtX2F1dGhfcG9saWN5IGdzbV9hdXRoX3BvbGljeV9wYXJzZShjb25zdCBjaGFyICphcmcpCit7CisJcmV0dXJuIGdldF9zdHJpbmdfdmFsdWUoYXV0aF9wb2xpY3lfbmFtZXMsIGFyZyk7Cit9CisKK2NvbnN0IGNoYXIgKmdzbV9hdXRoX3BvbGljeV9uYW1lKGVudW0gZ3NtX2F1dGhfcG9saWN5IHBvbGljeSkKK3sKKwlyZXR1cm4gZ2V0X3ZhbHVlX3N0cmluZyhhdXRoX3BvbGljeV9uYW1lcywgcG9saWN5KTsKK30KKworLyogdGhpcyBzaG91bGQgbm90IGJlIGhlcmUgYnV0IGluIGdzbV8wNF8wOC4uLiBidXQgdGhhdCBjcmVhdGVzCisgICBpbiB0dXJuIGEgZGVwZW5kZW5jeSBuaWdodG1hcmUgKGFiaXNfbm0gZGVwZW5kaW5nIG9uIDA0XzA4LCAuLi4pICovCitzdGF0aWMgaW50IGdzbTQ4X2NvbnN0cnVjdF9yYSh1X2ludDhfdCAqYnVmLCBjb25zdCBzdHJ1Y3QgZ3Byc19yYV9pZCAqcmFpZCkKK3sKKwl1X2ludDE2X3QgbWNjID0gcmFpZC0+bWNjOworCXVfaW50MTZfdCBtbmMgPSByYWlkLT5tbmM7CisKKwlidWZbMF0gPSAoKG1jYyAvIDEwMCkgJSAxMCkgfCAoKChtY2MgLyAxMCkgJSAxMCkgPDwgNCk7CisJYnVmWzFdID0gKG1jYyAlIDEwKTsKKworCS8qIEkgd29uZGVyIHdobyBjYW1lIHVwIHdpdGggdGhlIHN0dXBpZGl0eSBvZiBlbmNvZGluZyB0aGUgTU5DCisJICogZGlmZmVyZW50bHkgZGVwZW5kaW5nIG9uIGhvdyBtYW55IGRpZ2l0cyBpdHMgZGVjaW1hbCBudW1iZXIgaGFzISAqLworCWlmIChtbmMgPCAxMDApIHsKKwkJYnVmWzFdIHw9IDB4ZjA7CisJCWJ1ZlsyXSA9ICgobW5jIC8gMTApICUgMTApIHwgKChtbmMgJSAxMCkgPDwgNCk7CisJfSBlbHNlIHsKKwkJYnVmWzFdIHw9IChtbmMgJSAxMCkgPDwgNDsKKwkJYnVmWzJdID0gKChtbmMgLyAxMDApICUgMTApIHwgKCgobWNjIC8gMTApICUgMTApIDw8IDQpOworCX0KKworCSoodV9pbnQxNl90ICopKGJ1ZiszKSA9IGh0b25zKHJhaWQtPmxhYyk7CisKKwlidWZbNV0gPSByYWlkLT5yYWM7CisKKwlyZXR1cm4gNjsKK30KKwordm9pZCBncHJzX3JhX2lkX2J5X2J0cyhzdHJ1Y3QgZ3Byc19yYV9pZCAqcmFpZCwgc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlyYWlkLT5tY2MgPSBidHMtPm5ldHdvcmstPmNvdW50cnlfY29kZTsKKwlyYWlkLT5tbmMgPSBidHMtPm5ldHdvcmstPm5ldHdvcmtfY29kZTsKKwlyYWlkLT5sYWMgPSBidHMtPmxvY2F0aW9uX2FyZWFfY29kZTsKKwlyYWlkLT5yYWMgPSBidHMtPmdwcnMucmFjOworfQorCitpbnQgZ3NtNDhfcmFfaWRfYnlfYnRzKHVfaW50OF90ICpidWYsIHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGdwcnNfcmFfaWQgcmFpZDsKKworCWdwcnNfcmFfaWRfYnlfYnRzKCZyYWlkLCBidHMpOworCisJcmV0dXJuIGdzbTQ4X2NvbnN0cnVjdF9yYShidWYsICZyYWlkKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgcnJscF9tb2RlX25hbWVzW10gPSB7CisJeyBSUkxQX01PREVfTk9ORSwJIm5vbmUiIH0sCisJeyBSUkxQX01PREVfTVNfQkFTRUQsCSJtcy1iYXNlZCIgfSwKKwl7IFJSTFBfTU9ERV9NU19QUkVGLAkibXMtcHJlZmVycmVkIiB9LAorCXsgUlJMUF9NT0RFX0FTU19QUkVGLAkiYXNzLXByZWZlcnJlZCIgfSwKKwl7IDAsCQkJTlVMTCB9Cit9OworCitlbnVtIHJybHBfbW9kZSBycmxwX21vZGVfcGFyc2UoY29uc3QgY2hhciAqYXJnKQoreworCXJldHVybiBnZXRfc3RyaW5nX3ZhbHVlKHJybHBfbW9kZV9uYW1lcywgYXJnKTsKK30KKworY29uc3QgY2hhciAqcnJscF9tb2RlX25hbWUoZW51bSBycmxwX21vZGUgbW9kZSkKK3sKKwlyZXR1cm4gZ2V0X3ZhbHVlX3N0cmluZyhycmxwX21vZGVfbmFtZXMsIG1vZGUpOworfQorCitzdHJ1Y3QgZ3NtX21lYXNfcmVwICpsY2hhbl9uZXh0X21lYXNfcmVwKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCXN0cnVjdCBnc21fbWVhc19yZXAgKm1lYXNfcmVwOworCisJbWVhc19yZXAgPSAmbGNoYW4tPm1lYXNfcmVwW2xjaGFuLT5tZWFzX3JlcF9pZHhdOworCW1lbXNldChtZWFzX3JlcCwgMCwgc2l6ZW9mKCptZWFzX3JlcCkpOworCW1lYXNfcmVwLT5sY2hhbiA9IGxjaGFuOworCWxjaGFuLT5tZWFzX3JlcF9pZHggPSAobGNoYW4tPm1lYXNfcmVwX2lkeCArIDEpCisJCQkJCSUgQVJSQVlfU0laRShsY2hhbi0+bWVhc19yZXApOworCisJcmV0dXJuIG1lYXNfcmVwOworfQorCitpbnQgZ3NtX3NldF9idHNfdHlwZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBlbnVtIGdzbV9idHNfdHlwZSB0eXBlKQoreworCXN0cnVjdCBnc21fYnRzX21vZGVsICptb2RlbDsKKworCW1vZGVsID0gYnRzX21vZGVsX2ZpbmQodHlwZSk7CisJaWYgKCFtb2RlbCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlidHMtPnR5cGUgPSB0eXBlOworCWJ0cy0+bW9kZWwgPSBtb2RlbDsKKworCXN3aXRjaCAoYnRzLT50eXBlKSB7CisJY2FzZSBHU01fQlRTX1RZUEVfTkFOT0JUUzoKKwkJLyogU2V0IHRoZSBkZWZhdWx0IE9NTCBTdHJlYW0gSUQgdG8gMHhmZiAqLworCQlidHMtPm9tbF90ZWkgPSAweGZmOworCQlidHMtPmMwLT5ub21pbmFsX3Bvd2VyID0gMjM7CisJCWJyZWFrOworCWNhc2UgR1NNX0JUU19UWVBFX0JTMTE6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZ3NtX3N1YnNjcmliZXIuYyBiL29wZW5ic2Mvc3JjL2dzbV9zdWJzY3JpYmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkyNTA4NwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2dzbV9zdWJzY3JpYmVyLmMKQEAgLTAsMCArMSwxMzAgQEAKKy8qIFRoZSBjb25jZXB0IG9mIGEgc3Vic2NyaWJlciBmb3IgdGhlIE1TQywgcm91Z2hseSBITFIvVkxSIGZ1bmN0aW9uYWxpdHkgKi8KKworLyogKEMpIDIwMDggYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9zdWJzY3JpYmVyLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kYi5oPgorCitleHRlcm4gc3RydWN0IGxsaXN0X2hlYWQgKnN1YnNjcl9ic2NfYWN0aXZlX3N1YnNjcmliZXIodm9pZCk7CisKK2NoYXIgKnN1YnNjcl9uYW1lKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCWlmIChzdHJsZW4oc3Vic2NyLT5uYW1lKSkKKwkJcmV0dXJuIHN1YnNjci0+bmFtZTsKKworCXJldHVybiBzdWJzY3ItPmltc2k7Cit9CisKK3N0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyX2dldF9ieV90bXNpKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LAorCQkJCQkgIHVfaW50MzJfdCB0bXNpKQoreworCWNoYXIgdG1zaV9zdHJpbmdbMTRdOworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyOworCisJLyogd2UgbWlnaHQgaGF2ZSBhIHJlY29yZCBpbiBtZW1vcnkgYWxyZWFkeSAqLworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHN1YnNjciwgc3Vic2NyX2JzY19hY3RpdmVfc3Vic2NyaWJlcigpLCBlbnRyeSkgeworCQlpZiAodG1zaSA9PSBzdWJzY3ItPnRtc2kpCisJCQlyZXR1cm4gc3Vic2NyX2dldChzdWJzY3IpOworCX0KKworCXNwcmludGYodG1zaV9zdHJpbmcsICIldSIsIHRtc2kpOworCXJldHVybiBkYl9nZXRfc3Vic2NyaWJlcihuZXQsIEdTTV9TVUJTQ1JJQkVSX1RNU0ksIHRtc2lfc3RyaW5nKTsKK30KKworc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JfZ2V0X2J5X2ltc2koc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsCisJCQkJCSAgY29uc3QgY2hhciAqaW1zaSkKK3sKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHN1YnNjciwgc3Vic2NyX2JzY19hY3RpdmVfc3Vic2NyaWJlcigpLCBlbnRyeSkgeworCQlpZiAoc3RyY21wKHN1YnNjci0+aW1zaSwgaW1zaSkgPT0gMCkKKwkJCXJldHVybiBzdWJzY3JfZ2V0KHN1YnNjcik7CisJfQorCisJcmV0dXJuIGRiX2dldF9zdWJzY3JpYmVyKG5ldCwgR1NNX1NVQlNDUklCRVJfSU1TSSwgaW1zaSk7Cit9CisKK3N0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyX2dldF9ieV9leHRlbnNpb24oc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsCisJCQkJCSAgICAgICBjb25zdCBjaGFyICpleHQpCit7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShzdWJzY3IsIHN1YnNjcl9ic2NfYWN0aXZlX3N1YnNjcmliZXIoKSwgZW50cnkpIHsKKwkJaWYgKHN0cmNtcChzdWJzY3ItPmV4dGVuc2lvbiwgZXh0KSA9PSAwKQorCQkJcmV0dXJuIHN1YnNjcl9nZXQoc3Vic2NyKTsKKwl9CisKKwlyZXR1cm4gZGJfZ2V0X3N1YnNjcmliZXIobmV0LCBHU01fU1VCU0NSSUJFUl9FWFRFTlNJT04sIGV4dCk7Cit9CisKK3N0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyX2dldF9ieV9pZChzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwKKwkJCQkJdW5zaWduZWQgbG9uZyBsb25nIGlkKQoreworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyOworCWNoYXIgYnVmWzMyXTsKKwlzcHJpbnRmKGJ1ZiwgIiVsbHUiLCBpZCk7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShzdWJzY3IsIHN1YnNjcl9ic2NfYWN0aXZlX3N1YnNjcmliZXIoKSwgZW50cnkpIHsKKwkJaWYgKHN1YnNjci0+aWQgPT0gaWQpCisJCQlyZXR1cm4gc3Vic2NyX2dldChzdWJzY3IpOworCX0KKworCXJldHVybiBkYl9nZXRfc3Vic2NyaWJlcihuZXQsIEdTTV9TVUJTQ1JJQkVSX0lELCBidWYpOworfQorCisKK2ludCBzdWJzY3JfdXBkYXRlKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqcywgc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IHJlYXNvbikKK3sKKwkvKiBGSVhNRTogTWlncmF0ZSBwZW5kaW5nIHJlcXVlc3RzIGZyb20gb25lIEJTQyB0byBhbm90aGVyICovCisJc3dpdGNoIChyZWFzb24pIHsKKwljYXNlIEdTTV9TVUJTQ1JJQkVSX1VQREFURV9BVFRBQ0hFRDoKKwkJcy0+bmV0ID0gYnRzLT5uZXR3b3JrOworCQkvKiBJbmRpY2F0ZSAiYXR0YWNoZWQgdG8gTEFDIiAqLworCQlzLT5sYWMgPSBidHMtPmxvY2F0aW9uX2FyZWFfY29kZTsKKwkJTE9HUChETU0sIExPR0xfSU5GTywgIlN1YnNjcmliZXIgJXMgQVRUQUNIRUQgTEFDPSV1XG4iLAorCQkJc3Vic2NyX25hbWUocyksIHMtPmxhYyk7CisJCWRpc3BhdGNoX3NpZ25hbChTU19TVUJTQ1IsIFNfU1VCU0NSX0FUVEFDSEVELCBzKTsKKwkJYnJlYWs7CisJY2FzZSBHU01fU1VCU0NSSUJFUl9VUERBVEVfREVUQUNIRUQ6CisJCS8qIE9ubHkgZGV0YWNoIGlmIHdlIGFyZSBjdXJyZW50bHkgaW4gdGhpcyBhcmVhICovCisJCWlmIChidHMtPmxvY2F0aW9uX2FyZWFfY29kZSA9PSBzLT5sYWMpCisJCQlzLT5sYWMgPSBHU01fTEFDX1JFU0VSVkVEX0RFVEFDSEVEOworCQlMT0dQKERNTSwgTE9HTF9JTkZPLCAiU3Vic2NyaWJlciAlcyBERVRBQ0hFRFxuIiwgc3Vic2NyX25hbWUocykpOworCQlkaXNwYXRjaF9zaWduYWwoU1NfU1VCU0NSLCBTX1NVQlNDUl9ERVRBQ0hFRCwgcyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWZwcmludGYoc3RkZXJyLCAic3Vic2NyX3VwZGF0ZSB3aXRoIHVua25vd24gcmVhc29uOiAlZFxuIiwKKwkJCXJlYXNvbik7CisJCWJyZWFrOworCX07CisJcmV0dXJuIGRiX3N5bmNfc3Vic2NyaWJlcihzKTsKK30KKworCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9nc21fc3Vic2NyaWJlcl9iYXNlLmMgYi9vcGVuYnNjL3NyYy9nc21fc3Vic2NyaWJlcl9iYXNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVlODljMAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2dzbV9zdWJzY3JpYmVyX2Jhc2UuYwpAQCAtMCwwICsxLDIxMyBAQAorLyogVGhlIGNvbmNlcHQgb2YgYSBzdWJzY3JpYmVyIGFzIHNlZW4gYnkgdGhlIEJTQyAqLworCisvKiAoQykgMjAwOCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3BhZ2luZy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKworTExJU1RfSEVBRChhY3RpdmVfc3Vic2NyaWJlcnMpOwordm9pZCAqdGFsbF9zdWJzY3JfY3R4Owordm9pZCAqdGFsbF9zdWJfcmVxX2N0eDsKKworLyogZm9yIHRoZSBnc21fc3Vic2NyaWJlci5jICovCitzdHJ1Y3QgbGxpc3RfaGVhZCAqc3Vic2NyX2JzY19hY3RpdmVfc3Vic2NyaWJlcih2b2lkKQoreworCXJldHVybiAmYWN0aXZlX3N1YnNjcmliZXJzOworfQorCisvKgorICogU3RydWN0IGZvciBwZW5kaW5nIGNoYW5uZWwgcmVxdWVzdHMuIFRoaXMgaXMgbWFuYWdlZCBpbiB0aGUKKyAqIGxsaXN0X2hlYWQgcmVxdWVzdHMgb2YgZWFjaCBzdWJzY3JpYmVyLiBUaGUgcmVmZXJlbmNlIGNvdW50aW5nCisgKiBzaG91bGQgd29yayBpbiBzdWNoIGEgd2F5IHRoYXQgYSBzdWJzY3JpYmVyIHdpdGggYSBwZW5kaW5nIHJlcXVlc3QKKyAqIHJlbWFpbnMgaW4gbWVtb3J5LgorICovCitzdHJ1Y3Qgc3Vic2NyX3JlcXVlc3QgeworCXN0cnVjdCBsbGlzdF9oZWFkIGVudHJ5OworCisJLyogYmFjayByZWZlcmVuY2UgKi8KKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKKworCS8qIHRoZSByZXF1ZXN0ZWQgY2hhbm5lbCB0eXBlICovCisJaW50IGNoYW5uZWxfdHlwZTsKKworCS8qIHRoZSBjYWxsYmFjayBkYXRhICovCisJZ3NtX2NiZm4gKmNiZm47CisJdm9pZCAqcGFyYW07Cit9OworCisvKgorICogV2UgZ290IHRoZSBjaGFubmVsIGFzc2lnbmVkIGFuZCBjYW4gbm93IGhhbmQgdGhpcyBjaGFubmVsCisgKiBvdmVyIHRvIG9uZSBvZiBvdXIgY2FsbGJhY2tzLgorICovCitzdGF0aWMgaW50IHN1YnNjcl9wYWdpbmdfY2IodW5zaWduZWQgaW50IGhvb2tudW0sIHVuc2lnbmVkIGludCBldmVudCwKKwkJCSAgICAgc3RydWN0IG1zZ2IgKm1zZywgdm9pZCAqZGF0YSwgdm9pZCAqcGFyYW0pCit7CisJc3RydWN0IHN1YnNjcl9yZXF1ZXN0ICpyZXF1ZXN0OworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqKXBhcmFtOworCisJLyogVGhlcmUgaXMgbm8gcmVxdWVzdCBhbnltb3JlLi4uICovCisJaWYgKGxsaXN0X2VtcHR5KCZzdWJzY3ItPnJlcXVlc3RzKSkKKwkJcmV0dXJuIC0xOworCisJLyoKKwkgKiBGSVhNRTogV2hhdCB0byBkbyB3aXRoIHBhZ2luZyByZXF1ZXN0cyBjb21pbmcgZHVyaW5nCisJICogdGhpcyBjYWxsYmFjaz8gV2UgbXVzdCBiZSBzdXJlIHRvIG5vdCBzdGFydCBwYWdpbmcgd2hlbgorCSAqIHdlIGhhdmUgYW4gYWN0aXZlIGNvbm5lY3Rpb24gdG8gYSBzdWJzY3JpYmVyIGFuZCB0byBtYWtlCisJICogdGhlIHN1YnNjcl9wdXRfY2hhbm5lbCB3b3JrIGFzIHJlcXVpcmVkLi4uCisJICovCisJcmVxdWVzdCA9IChzdHJ1Y3Qgc3Vic2NyX3JlcXVlc3QgKilzdWJzY3ItPnJlcXVlc3RzLm5leHQ7CisJbGxpc3RfZGVsKCZyZXF1ZXN0LT5lbnRyeSk7CisJc3Vic2NyLT5pbl9jYWxsYmFjayA9IDE7CisJcmVxdWVzdC0+Y2Jmbihob29rbnVtLCBldmVudCwgbXNnLCBkYXRhLCByZXF1ZXN0LT5wYXJhbSk7CisJc3Vic2NyLT5pbl9jYWxsYmFjayA9IDA7CisKKwl0YWxsb2NfZnJlZShyZXF1ZXN0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3Vic2NyX3NlbmRfcGFnaW5nX3JlcXVlc3Qoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCit7CisJc3RydWN0IHN1YnNjcl9yZXF1ZXN0ICpyZXF1ZXN0OworCWludCByYzsKKworCWFzc2VydCghbGxpc3RfZW1wdHkoJnN1YnNjci0+cmVxdWVzdHMpKTsKKworCXJlcXVlc3QgPSAoc3RydWN0IHN1YnNjcl9yZXF1ZXN0ICopc3Vic2NyLT5yZXF1ZXN0cy5uZXh0OworCXJjID0gcGFnaW5nX3JlcXVlc3Qoc3Vic2NyLT5uZXQsIHN1YnNjciwgcmVxdWVzdC0+Y2hhbm5lbF90eXBlLAorCQkJICAgIHN1YnNjcl9wYWdpbmdfY2IsIHN1YnNjcik7CisKKwkvKiBwYWdpbmcgZmFpbGVkLCBxdWl0IG5vdyAqLworCWlmIChyYyA8PSAwKSB7CisJCXN1YnNjcl9wYWdpbmdfY2IoR1NNX0hPT0tfUlJfUEFHSU5HLCBHU01fUEFHSU5HX0VYUElSRUQsCisJCQkJIE5VTEwsIE5VTEwsIHJlcXVlc3QtPnBhcmFtKTsKKwl9Cit9CisKK3N0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyX2FsbG9jKHZvaWQpCit7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzOworCisJcyA9IHRhbGxvY196ZXJvKHRhbGxfc3Vic2NyX2N0eCwgc3RydWN0IGdzbV9zdWJzY3JpYmVyKTsKKwlpZiAoIXMpCisJCXJldHVybiBOVUxMOworCisJbGxpc3RfYWRkX3RhaWwoJnMtPmVudHJ5LCAmYWN0aXZlX3N1YnNjcmliZXJzKTsKKwlzLT51c2VfY291bnQgPSAxOworCXMtPnRtc2kgPSBHU01fUkVTRVJWRURfVE1TSTsKKworCUlOSVRfTExJU1RfSEVBRCgmcy0+cmVxdWVzdHMpOworCisJcmV0dXJuIHM7Cit9CisKK3N0YXRpYyB2b2lkIHN1YnNjcl9mcmVlKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCWxsaXN0X2RlbCgmc3Vic2NyLT5lbnRyeSk7CisJdGFsbG9jX2ZyZWUoc3Vic2NyKTsKK30KKworc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JfZ2V0KHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCXN1YnNjci0+dXNlX2NvdW50Kys7CisJREVCVUdQKERSRUYsICJzdWJzY3IgJXMgdXNhZ2UgaW5jcmVhc2VzIHVzYWdlIHRvOiAlZFxuIiwKKwkJCXN1YnNjci0+ZXh0ZW5zaW9uLCBzdWJzY3ItPnVzZV9jb3VudCk7CisJcmV0dXJuIHN1YnNjcjsKK30KKworc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JfcHV0KHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCXN1YnNjci0+dXNlX2NvdW50LS07CisJREVCVUdQKERSRUYsICJzdWJzY3IgJXMgdXNhZ2UgZGVjcmVhc2VkIHVzYWdlIHRvOiAlZFxuIiwKKwkJCXN1YnNjci0+ZXh0ZW5zaW9uLCBzdWJzY3ItPnVzZV9jb3VudCk7CisJaWYgKHN1YnNjci0+dXNlX2NvdW50IDw9IDApCisJCXN1YnNjcl9mcmVlKHN1YnNjcik7CisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgc3Vic2NyX2dldF9jaGFubmVsKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorCQkJaW50IHR5cGUsIGdzbV9jYmZuICpjYmZuLCB2b2lkICpwYXJhbSkKK3sKKwlzdHJ1Y3Qgc3Vic2NyX3JlcXVlc3QgKnJlcXVlc3Q7CisKKwlyZXF1ZXN0ID0gdGFsbG9jKHRhbGxfc3ViX3JlcV9jdHgsIHN0cnVjdCBzdWJzY3JfcmVxdWVzdCk7CisJaWYgKCFyZXF1ZXN0KSB7CisJCWlmIChjYmZuKQorCQkJY2JmbihHU01fSE9PS19SUl9QQUdJTkcsIEdTTV9QQUdJTkdfT09NLAorCQkJCU5VTEwsIE5VTEwsIHBhcmFtKTsKKwkJcmV0dXJuOworCX0KKworCW1lbXNldChyZXF1ZXN0LCAwLCBzaXplb2YoKnJlcXVlc3QpKTsKKwlyZXF1ZXN0LT5zdWJzY3IgPSBzdWJzY3I7CisJcmVxdWVzdC0+Y2hhbm5lbF90eXBlID0gdHlwZTsKKwlyZXF1ZXN0LT5jYmZuID0gY2JmbjsKKwlyZXF1ZXN0LT5wYXJhbSA9IHBhcmFtOworCisJLyoKKwkgKiBGSVhNRTogV2UgbWlnaHQgYmUgYWJsZSB0byBhc3NpZ24gbW9yZSB0aGFuIG9uZQorCSAqIGNoYW5uZWwsIGUuZy4gdm9pY2UgYW5kIFNNUyBzdWJtaXQgYXQgdGhlIHNhbWUKKwkgKiB0aW1lLgorCSAqLworCWlmICghc3Vic2NyLT5pbl9jYWxsYmFjayAmJiBsbGlzdF9lbXB0eSgmc3Vic2NyLT5yZXF1ZXN0cykpIHsKKwkJLyogYWRkIHRvIHRoZSBsaXN0LCBzZW5kIGEgcmVxdWVzdCAqLworCQlsbGlzdF9hZGRfdGFpbCgmcmVxdWVzdC0+ZW50cnksICZzdWJzY3ItPnJlcXVlc3RzKTsKKwkJc3Vic2NyX3NlbmRfcGFnaW5nX3JlcXVlc3Qoc3Vic2NyKTsKKwl9IGVsc2UgeworCQkvKiB0aGlzIHdpbGwgYmUgcGlja2VkIHVwIGxhdGVyLCBmcm9tIHN1YnNjcl9wdXRfY2hhbm5lbCAqLworCQlsbGlzdF9hZGRfdGFpbCgmcmVxdWVzdC0+ZW50cnksICZzdWJzY3ItPnJlcXVlc3RzKTsKKwl9Cit9CisKK3ZvaWQgc3Vic2NyX3B1dF9jaGFubmVsKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCS8qCisJICogRklYTUU6IENvbnRpbnVlIHdpdGggb3RoZXIgcmVxdWVzdHMgbm93Li4uIGJ5IGNoZWNraW5nCisJICogdGhlIGdzbV9zdWJzY3JpYmVyIGluc2lkZSB0aGUgZ3NtX2xjaGFuLiBEcm9wIHRoZSByZWYgY291bnQKKwkgKiBvZiB0aGUgbGNoYW4gYWZ0ZXIgaGF2aW5nIGFza2VkIHRoZSBuZXh0IHJlcXVlc3RlZSB0byBoYW5kbGUKKwkgKiB0aGUgY2hhbm5lbC4KKwkgKi8KKwkvKgorCSAqIEZJWE1FOiBpcyB0aGUgbGNoYW4gaXMgb2YgYSBkaWZmZXJlbnQgdHlwZSB3ZSBjb3VsZCBzdGlsbAorCSAqIGlzc3VlIGFuIGltbWVkaWF0ZSBhc3NpZ25tZW50IGZvciBhbm90aGVyIGNoYW5uZWwgYW5kIHRoZW4KKwkgKiBjbG9zZSB0aGlzIG9uZS4KKwkgKi8KKwkvKgorCSAqIEN1cnJlbnRseSB3ZSB3aWxsIGRyb3AgdGhlIGxhc3QgcmVmIG9mIHRoZSBsY2hhbiB3aGljaAorCSAqIHdpbGwgcmVzdWx0IGluIGEgY2hhbm5lbCByZWxlYXNlIG9uIFJTTCBhbmQgd2Ugd2lsbCBzdGFydAorCSAqIHRoZSBwYWdpbmcuIFRoaXMgc2hvdWxkIHdvcmsgbW9zdCBvZiB0aGUgdGltZSBhcyB0aGUgTVMKKwkgKiB3aWxsIGxpc3RlbiB0byB0aGUgcGFnaW5nIHJlcXVlc3RzIGJlZm9yZSB3ZSB0aW1lb3V0CisJICovCisKKwlwdXRfbGNoYW4obGNoYW4pOworCisJaWYgKGxjaGFuLT5zdWJzY3IgJiYgIWxsaXN0X2VtcHR5KCZsY2hhbi0+c3Vic2NyLT5yZXF1ZXN0cykpCisJCXN1YnNjcl9zZW5kX3BhZ2luZ19yZXF1ZXN0KGxjaGFuLT5zdWJzY3IpOworfQorCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9oYW5kb3Zlcl9kZWNpc2lvbi5jIGIvb3BlbmJzYy9zcmMvaGFuZG92ZXJfZGVjaXNpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmFmY2E2Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvaGFuZG92ZXJfZGVjaXNpb24uYwpAQCAtMCwwICsxLDI5OCBAQAorLyogSGFuZG92ZXIgRGVjaXNpb24gbWFraW5nIGZvciBJbnRlci1CVFMgKEludHJhLUJTQykgSGFuZG92ZXIuICBUaGlzCisgKiBvbmx5IGltcGxlbWVudHMgdGhlIGhhbmRvdmVyIGFsZ29yaXRobS9kZWNpc2lvbiwgYnV0IG5vdCBleGVjdXRpb24KKyAqIG9mIGl0ICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9tZWFzX3JlcC5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9oYW5kb3Zlci5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2dzbV91dGlscy5oPgorCisvKiBpc3N1ZSBoYW5kb3ZlciB0byBhIGNlbGwgaWRlbnRpZmllZCBieSBBUkZDTiBhbmQgQlNJQyAqLworc3RhdGljIGludCBoYW5kb3Zlcl90b19hcmZjbl9ic2ljKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLAorCQkJCSAgdV9pbnQxNl90IGFyZmNuLCB1X2ludDhfdCBic2ljKQoreworCXN0cnVjdCBnc21fYnRzICpuZXdfYnRzOworCisJLyogcmVzb2x2ZSB0aGUgZ3NtX2J0cyBzdHJ1Y3R1cmUgZm9yIHRoZSBiZXN0IG5laWdoYm9yICovCisJbmV3X2J0cyA9IGdzbV9idHNfbmVpZ2hib3IobGNoYW4tPnRzLT50cngtPmJ0cywgYXJmY24sIGJzaWMpOworCWlmICghbmV3X2J0cykgeworCQlMT0dQKERITywgTE9HTF9OT1RJQ0UsICJ1bmFibGUgdG8gZGV0ZXJtaW5lIG5laWdoYm9yIEJUUyAiCisJCSAgICAgImZvciBBUkZDTiAldSBCU0lDICV1ID8hP1xuIiwgYXJmY24sIGJzaWMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBhbmQgYWN0dWFsbHkgdHJ5IHRvIGhhbmRvdmVyIHRvIHRoYXQgY2VsbCAqLworCXJldHVybiBic2NfaGFuZG92ZXJfc3RhcnQobGNoYW4sIG5ld19idHMpOworfQorCisvKiBkaWQgd2UgZ2V0IGEgUlhMRVYgZm9yIGEgZ2l2ZW4gY2VsbCBpbiB0aGUgZ2l2ZW4gcmVwb3J0PyAqLworc3RhdGljIGludCByeGxldl9mb3JfY2VsbF9pbl9yZXAoc3RydWN0IGdzbV9tZWFzX3JlcCAqbXIsCisJCQkJIHVfaW50MTZfdCBhcmZjbiwgdV9pbnQ4X3QgYnNpYykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBtci0+bnVtX2NlbGw7IGkrKykgeworCQlzdHJ1Y3QgZ3NtX21lYXNfcmVwX2NlbGwgKm1yYyA9ICZtci0+Y2VsbFtpXTsKKworCQkvKiBzZWFyY2ggZm9yIG1hdGNoaW5nIHJlcG9ydCAqLworCQlpZiAoIShtcmMtPmFyZmNuID09IGFyZmNuICYmIG1yYy0+YnNpYyA9PSBic2ljKSkKKwkJCWNvbnRpbnVlOworCisJCW1yYy0+ZmxhZ3MgfD0gTVJDX0ZfUFJPQ0VTU0VEOworCQlyZXR1cm4gbXJjLT5yeGxldjsKKwl9CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKy8qIG9idGFpbiBhdmVyYWdlZCByeGxldiBmb3IgZ2l2ZW4gbmVpZ2hib3IgKi8KK3N0YXRpYyBpbnQgbmVpZ2hfbWVhc19hdmcoc3RydWN0IG5laWdoX21lYXNfcHJvYyAqbm1wLCBpbnQgd2luZG93KQoreworCXVuc2lnbmVkIGludCBpLCBpZHg7CisJaW50IGF2ZyA9IDA7CisKKwlpZHggPSBjYWxjX2luaXRpYWxfaWR4KEFSUkFZX1NJWkUobm1wLT5yeGxldiksCisJCQkJbm1wLT5yeGxldl9jbnQgJSBBUlJBWV9TSVpFKG5tcC0+cnhsZXYpLAorCQkJCXdpbmRvdyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgd2luZG93OyBpKyspIHsKKwkJaW50IGogPSAoaWR4K2kpICUgQVJSQVlfU0laRShubXAtPnJ4bGV2KTsKKworCQlhdmcgKz0gbm1wLT5yeGxldltqXTsKKwl9CisKKwlyZXR1cm4gYXZnIC8gd2luZG93OworfQorCisvKiBmaW5kIGVtcHR5IG9yIGV2aWN0IGJhZCBuZWlnaGJvciAqLworc3RhdGljIHN0cnVjdCBuZWlnaF9tZWFzX3Byb2MgKmZpbmRfZXZpY3RfbmVpZ2goc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJaW50IGosIHdvcnN0ID0gOTk5OTk5OworCXN0cnVjdCBuZWlnaF9tZWFzX3Byb2MgKm5tcF93b3JzdDsKKworCS8qIGZpcnN0IHRyeSB0byBmaW5kIGFuIGVtcHR5L3VudXNlZCBzbG90ICovCisJZm9yIChqID0gMDsgaiA8IEFSUkFZX1NJWkUobGNoYW4tPm5laWdoX21lYXMpOyBqKyspIHsKKwkJc3RydWN0IG5laWdoX21lYXNfcHJvYyAqbm1wID0gJmxjaGFuLT5uZWlnaF9tZWFzW2pdOworCQlpZiAoIW5tcC0+YXJmY24pCisJCQlyZXR1cm4gbm1wOworCX0KKworCS8qIG5vIGVtcHR5IHNsb3QgZm91bmQuIGV2aWN0IHdvcnN0IG5laWdoYm9yIGZyb20gbGlzdCAqLworCWZvciAoaiA9IDA7IGogPCBBUlJBWV9TSVpFKGxjaGFuLT5uZWlnaF9tZWFzKTsgaisrKSB7CisJCXN0cnVjdCBuZWlnaF9tZWFzX3Byb2MgKm5tcCA9ICZsY2hhbi0+bmVpZ2hfbWVhc1tqXTsKKwkJaW50IGF2ZyA9IG5laWdoX21lYXNfYXZnKG5tcCwgTUFYX1dJTl9ORUlHSF9BVkcpOworCQlpZiAoYXZnIDwgd29yc3QpIHsKKwkJCXdvcnN0ID0gYXZnOworCQkJbm1wX3dvcnN0ID0gbm1wOworCQl9CisJfQorCisJcmV0dXJuIG5tcF93b3JzdDsKK30KKworLyogcHJvY2VzcyBuZWlnaGJvciBjZWxsIG1lYXN1cmVtZW50IHJlcG9ydHMgKi8KK3N0YXRpYyB2b2lkIHByb2Nlc3NfbWVhc19uZWlnaChzdHJ1Y3QgZ3NtX21lYXNfcmVwICptcikKK3sKKwlpbnQgaSwgaiwgaWR4OworCisJLyogZm9yIGVhY2ggcmVwb3J0ZWQgY2VsbCwgdHJ5IHRvIHVwZGF0ZSBnbG9iYWwgc3RhdGUgKi8KKwlmb3IgKGogPSAwOyBqIDwgQVJSQVlfU0laRShtci0+bGNoYW4tPm5laWdoX21lYXMpOyBqKyspIHsKKwkJc3RydWN0IG5laWdoX21lYXNfcHJvYyAqbm1wID0gJm1yLT5sY2hhbi0+bmVpZ2hfbWVhc1tqXTsKKwkJdW5zaWduZWQgaW50IGlkeDsKKwkJaW50IHJ4bGV2OworCisJCS8qIHNraXAgdW51c2VkIGVudHJpZXMgKi8KKwkJaWYgKCFubXAtPmFyZmNuKQorCQkJY29udGludWU7CisKKwkJcnhsZXYgPSByeGxldl9mb3JfY2VsbF9pbl9yZXAobXIsIG5tcC0+YXJmY24sIG5tcC0+YnNpYyk7CisJCWlkeCA9IG5tcC0+cnhsZXZfY250ICUgQVJSQVlfU0laRShubXAtPnJ4bGV2KTsKKwkJaWYgKHJ4bGV2ID49IDApIHsKKwkJCW5tcC0+cnhsZXZbaWR4XSA9IHJ4bGV2OworCQkJbm1wLT5sYXN0X3NlZW5fbnIgPSBtci0+bnI7CisJCX0gZWxzZQorCQkJbm1wLT5yeGxldltpZHhdID0gMDsKKwkJbm1wLT5yeGxldl9jbnQrKzsKKwl9CisKKwkvKiBpdGVyYXRlIG92ZXIgbGlzdCBvZiByZXBvcnRlZCBjZWxscywgY2hlY2sgaWYgd2UgZGlkIG5vdAorCSAqIHByb2Nlc3MgYWxsIG9mIHRoZW0gKi8KKwlmb3IgKGkgPSAwOyBpIDwgbXItPm51bV9jZWxsOyBpKyspIHsKKwkJc3RydWN0IGdzbV9tZWFzX3JlcF9jZWxsICptcmMgPSAmbXItPmNlbGxbaV07CisJCXN0cnVjdCBuZWlnaF9tZWFzX3Byb2MgKm5tcDsKKworCQlpZiAobXJjLT5mbGFncyAmIE1SQ19GX1BST0NFU1NFRCkKKwkJCWNvbnRpbnVlOworCisJCW5tcCA9IGZpbmRfZXZpY3RfbmVpZ2gobXItPmxjaGFuKTsKKworCQlubXAtPmFyZmNuID0gbXJjLT5hcmZjbjsKKwkJbm1wLT5ic2ljID0gbXJjLT5ic2ljOworCisJCWlkeCA9IG5tcC0+cnhsZXZfY250ICUgQVJSQVlfU0laRShubXAtPnJ4bGV2KTsKKwkJbm1wLT5yeGxldltpZHhdID0gbXJjLT5yeGxldjsKKwkJbm1wLT5yeGxldl9jbnQrKzsKKwkJbm1wLT5sYXN0X3NlZW5fbnIgPSBtci0+bnI7CisKKwkJbXJjLT5mbGFncyB8PSBNUkNfRl9QUk9DRVNTRUQ7CisJfQorfQorCisvKiBhdHRlbXB0IHRvIGRvIGEgaGFuZG92ZXIgKi8KK3N0YXRpYyBpbnQgYXR0ZW1wdF9oYW5kb3ZlcihzdHJ1Y3QgZ3NtX21lYXNfcmVwICptcikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IG1yLT5sY2hhbi0+dHMtPnRyeC0+YnRzLT5uZXR3b3JrOworCXN0cnVjdCBuZWlnaF9tZWFzX3Byb2MgKmJlc3RfY2VsbCA9IE5VTEw7CisJdW5zaWduZWQgaW50IGJlc3RfYmV0dGVyX2RiID0gMDsKKwlpbnQgaSwgcmM7CisKKwkvKiBmaW5kIHRoZSBiZXN0IGNlbGwgaW4gdGhpcyByZXBvcnQgdGhhdCBpcyBhdCBsZWFzdCBSWExFVl9IWVNUCisJICogYmV0dGVyIHRoYW4gdGhlIGN1cnJlbnQgc2VydmluZyBjZWxsICovCisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtci0+bGNoYW4tPm5laWdoX21lYXMpOyBpKyspIHsKKwkJc3RydWN0IG5laWdoX21lYXNfcHJvYyAqbm1wID0gJm1yLT5sY2hhbi0+bmVpZ2hfbWVhc1tpXTsKKwkJaW50IGF2ZywgYmV0dGVyOworCisJCS8qIHNraXAgZW1wdHkgc2xvdHMgKi8KKwkJaWYgKG5tcC0+YXJmY24gPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCS8qIGNhY3VsYXRlIGF2ZXJhZ2UgcnhsZXYgZm9yIHRoaXMgY2VsbCBvdmVyIHRoZSB3aW5kb3cgKi8KKwkJYXZnID0gbmVpZ2hfbWVhc19hdmcobm1wLCBuZXQtPmhhbmRvdmVyLndpbl9yeGxldl9hdmdfbmVpZ2gpOworCisJCS8qIGNoZWNrIGlmIGh5c3RlcmVzaXMgaXMgZnVsZmlsbGVkICovCisJCWlmIChhdmcgPCBtci0+ZGwuZnVsbC5yeF9sZXYgKyBuZXQtPmhhbmRvdmVyLnB3cl9oeXN0ZXJlc2lzKQorCQkJY29udGludWU7CisKKwkJYmV0dGVyID0gYXZnIC0gbXItPmRsLmZ1bGwucnhfbGV2OworCQlpZiAoYmV0dGVyID4gYmVzdF9iZXR0ZXJfZGIpIHsKKwkJCWJlc3RfY2VsbCA9IG5tcDsKKwkJCWJlc3RfYmV0dGVyX2RiID0gYmV0dGVyOworCQl9CisJfQorCisJaWYgKCFiZXN0X2NlbGwpCisJCXJldHVybiAwOworCisJTE9HUChESE8sIExPR0xfSU5GTywgIiVzOiBDZWxsIG9uIEFSRkNOICV1IGlzIGJldHRlcjogIiwKKwkJZ3NtX3RzX25hbWUobXItPmxjaGFuLT50cyksIGJlc3RfY2VsbC0+YXJmY24pOworCWlmICghbmV0LT5oYW5kb3Zlci5hY3RpdmUpIHsKKwkJTE9HUEMoREhPLCBMT0dMX0lORk8sICJTa2lwcGluZywgSGFuZG92ZXIgZGlzYWJsZWRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyYyA9IGhhbmRvdmVyX3RvX2FyZmNuX2JzaWMobXItPmxjaGFuLCBiZXN0X2NlbGwtPmFyZmNuLCBiZXN0X2NlbGwtPmJzaWMpOworCXN3aXRjaCAocmMpIHsKKwljYXNlIDA6CisJCUxPR1BDKERITywgTE9HTF9JTkZPLCAiU3RhcnRpbmcgaGFuZG92ZXJcbiIpOworCQlicmVhazsKKwljYXNlIC1FTk9TUEM6CisJCUxPR1BDKERITywgTE9HTF9JTkZPLCAiTm8gY2hhbm5lbCBhdmFpbGFibGVcbiIpOworCQlicmVhazsKKwljYXNlIC1FQlVTWToKKwkJTE9HUEMoREhPLCBMT0dMX0lORk8sICJIYW5kb3ZlciBhbHJlYWR5IGFjdGl2ZVxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1BDKERITywgTE9HTF9FUlJPUiwgIlVua25vd24gZXJyb3JcbiIpOworCX0KKwlyZXR1cm4gcmM7Cit9CisKKy8qIHByb2Nlc3MgYW4gYWxyZWFkeSBwYXJzZWQgbWVhc3VyZW1lbnQgcmVwb3J0IGFuZCBkZWNpZGUgaWYgd2Ugd2FudCB0bworICogYXR0ZW1wdCBhIGhhbmRvdmVyICovCitzdGF0aWMgaW50IHByb2Nlc3NfbWVhc19yZXAoc3RydWN0IGdzbV9tZWFzX3JlcCAqbXIpCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBtci0+bGNoYW4tPnRzLT50cngtPmJ0cy0+bmV0d29yazsKKwlpbnQgYXZfcnhsZXY7CisKKwkvKiB3ZSBjdXJyZW50bHkgb25seSBkbyBoYW5kb3ZlciBmb3IgVENIIGNoYW5uZWxzICovCisJc3dpdGNoIChtci0+bGNoYW4tPnR5cGUpIHsKKwljYXNlIEdTTV9MQ0hBTl9UQ0hfRjoKKwljYXNlIEdTTV9MQ0hBTl9UQ0hfSDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJLyogcGFyc2UgYWN0dWFsIG5laWdoYm9yIGNlbGwgaW5mbyAqLworCWlmIChtci0+bnVtX2NlbGwgPiAwICYmIG1yLT5udW1fY2VsbCA8IDcpCisJCXByb2Nlc3NfbWVhc19uZWlnaChtcik7CisKKwlhdl9yeGxldiA9IGdldF9tZWFzX3JlcF9hdmcobXItPmxjaGFuLCBNRUFTX1JFUF9ETF9SWExFVl9GVUxMLAorCQkJCSAgICBuZXQtPmhhbmRvdmVyLndpbl9yeGxldl9hdmcpOworCisJLyogSW50ZXJmZXJlbmNlIEhPICovCisJaWYgKHJ4bGV2MmRibShhdl9yeGxldikgPiAtODUgJiYKKwkgICAgbWVhc19yZXBfbl9vdXRfb2ZfbV9iZShtci0+bGNoYW4sIE1FQVNfUkVQX0RMX1JYUVVBTF9GVUxMLAorCQkJCSAgIDMsIDQsIDUpKQorCQlyZXR1cm4gYXR0ZW1wdF9oYW5kb3Zlcihtcik7CisKKwkvKiBCYWQgUXVhbGl0eSAqLworCWlmIChtZWFzX3JlcF9uX291dF9vZl9tX2JlKG1yLT5sY2hhbiwgTUVBU19SRVBfRExfUlhRVUFMX0ZVTEwsCisJCQkJICAgMywgNCwgNSkpCisJCXJldHVybiBhdHRlbXB0X2hhbmRvdmVyKG1yKTsKKworCS8qIExvdyBMZXZlbCAqLworCWlmIChyeGxldjJkYm0oYXZfcnhsZXYpIDw9IC0xMTApCisJCXJldHVybiBhdHRlbXB0X2hhbmRvdmVyKG1yKTsKKworCS8qIERpc3RhbmNlICovCisJaWYgKG1yLT5tc19sMS50YSA+IG5ldC0+aGFuZG92ZXIubWF4X2Rpc3RhbmNlKQorCQlyZXR1cm4gYXR0ZW1wdF9oYW5kb3Zlcihtcik7CisKKwkvKiBQb3dlciBCdWRnZXQgQUtBIEJldHRlciBDZWxsICovCisJaWYgKChtci0+bnIgJSBuZXQtPmhhbmRvdmVyLnB3cl9pbnRlcnZhbCkgPT0gMCkKKwkJcmV0dXJuIGF0dGVtcHRfaGFuZG92ZXIobXIpOworCisJcmV0dXJuIDA7CisKK30KKworc3RhdGljIGludCBob19kZWNfc2lnX2NiKHVuc2lnbmVkIGludCBzdWJzeXMsIHVuc2lnbmVkIGludCBzaWduYWwsCisJCQkgICB2b2lkICpoYW5kbGVyX2RhdGEsIHZvaWQgKnNpZ25hbF9kYXRhKQoreworCXN0cnVjdCBnc21fbWVhc19yZXAgKm1yOworCisJaWYgKHN1YnN5cyAhPSBTU19MQ0hBTikKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKHNpZ25hbCkgeworCWNhc2UgU19MQ0hBTl9NRUFTX1JFUDoKKwkJbXIgPSBzaWduYWxfZGF0YTsKKwkJcHJvY2Vzc19tZWFzX3JlcChtcik7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCit2b2lkIG9uX2Rzb19sb2FkX2hvX2RlYyh2b2lkKQoreworCXJlZ2lzdGVyX3NpZ25hbF9oYW5kbGVyKFNTX0xDSEFOLCBob19kZWNfc2lnX2NiLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2hhbmRvdmVyX2xvZ2ljLmMgYi9vcGVuYnNjL3NyYy9oYW5kb3Zlcl9sb2dpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNGM1NjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9oYW5kb3Zlcl9sb2dpYy5jCkBAIC0wLDAgKzEsMzc2IEBACisvKiBIYW5kb3ZlciBMb2dpYyBmb3IgSW50ZXItQlRTIChJbnRyYS1CU0MpIEhhbmRvdmVyLiAgVGhpcyBkb2VzIG5vdAorICogYWN0dWFsbHkgaW1wbGVtZW50IHRoZSBoYW5kb3ZlciBhbGdvcml0aG0vZGVjaXNpb24sIGJ1dCBleGVjdXRlcyBhCisgKiBoYW5kb3ZlciBkZWNpc2lvbiAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9nc21fdXRpbHMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9zdWJzY3JpYmVyLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMDguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfcnNsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9jaGFuX2FsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3RyYW5zYWN0aW9uLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ydHBfcHJveHkuaD4KKworc3RydWN0IGJzY19oYW5kb3ZlciB7CisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKworCXN0cnVjdCBnc21fbGNoYW4gKm9sZF9sY2hhbjsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpuZXdfbGNoYW47CisKKwlzdHJ1Y3QgdGltZXJfbGlzdCBUMzEwMzsKKworCXVfaW50OF90IGhvX3JlZjsKK307CisKK3N0YXRpYyBMTElTVF9IRUFEKGJzY19oYW5kb3ZlcnMpOworCitzdGF0aWMgc3RydWN0IGJzY19oYW5kb3ZlciAqYnNjX2hvX2J5X25ld19sY2hhbihzdHJ1Y3QgZ3NtX2xjaGFuICpuZXdfbGNoYW4pCit7CisJc3RydWN0IGJzY19oYW5kb3ZlciAqaG87CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShobywgJmJzY19oYW5kb3ZlcnMsIGxpc3QpIHsKKwkJaWYgKGhvLT5uZXdfbGNoYW4gPT0gbmV3X2xjaGFuKQorCQkJcmV0dXJuIGhvOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGJzY19oYW5kb3ZlciAqYnNjX2hvX2J5X29sZF9sY2hhbihzdHJ1Y3QgZ3NtX2xjaGFuICpvbGRfbGNoYW4pCit7CisJc3RydWN0IGJzY19oYW5kb3ZlciAqaG87CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShobywgJmJzY19oYW5kb3ZlcnMsIGxpc3QpIHsKKwkJaWYgKGhvLT5vbGRfbGNoYW4gPT0gb2xkX2xjaGFuKQorCQkJcmV0dXJuIGhvOworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKiBIYW5kIG92ZXIgdGhlIHNwZWNpZmllZCBsb2dpY2FsIGNoYW5uZWwgdG8gdGhlIHNwZWNpZmllZCBuZXcgQlRTLgorICogVGhpcyBpcyB0aGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgdGhlIGFjdHVhbCBoYW5kb3ZlciBhbGdvcml0aG0sCisgKiBhZnRlciBpdCBoYXMgZGVjaWRlZCBpdCB3YW50cyB0byBpbml0aWF0ZSBITyB0byBhIHNwZWNpZmljIEJUUyAqLworaW50IGJzY19oYW5kb3Zlcl9zdGFydChzdHJ1Y3QgZ3NtX2xjaGFuICpvbGRfbGNoYW4sIHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGdzbV9sY2hhbiAqbmV3X2xjaGFuOworCXN0cnVjdCBic2NfaGFuZG92ZXIgKmhvOworCXN0YXRpYyB1X2ludDhfdCBob19yZWY7CisJaW50IHJjOworCisJLyogZG9uJ3QgYXR0ZW1wdCBtdWx0aXBsZSBoYW5kb3ZlcnMgZm9yIHRoZSBzYW1lIGxjaGFuIGF0CisJICogdGhlIHNhbWUgdGltZSAqLworCWlmIChic2NfaG9fYnlfb2xkX2xjaGFuKG9sZF9sY2hhbikpCisJCXJldHVybiAtRUJVU1k7CisKKwlERUJVR1AoREhPLCAiKG9sZF9sY2hhbiBvbiBCVFMgJXUsIG5ldyBCVFMgJXUpXG4iLAorCQlvbGRfbGNoYW4tPnRzLT50cngtPmJ0cy0+bnIsIGJ0cy0+bnIpOworCisJY291bnRlcl9pbmMoYnRzLT5uZXR3b3JrLT5zdGF0cy5oYW5kb3Zlci5hdHRlbXB0ZWQpOworCisJbmV3X2xjaGFuID0gbGNoYW5fYWxsb2MoYnRzLCBvbGRfbGNoYW4tPnR5cGUpOworCWlmICghbmV3X2xjaGFuKSB7CisJCUxPR1AoREhPLCBMT0dMX05PVElDRSwgIk5vIGZyZWUgY2hhbm5lbFxuIik7CisJCWNvdW50ZXJfaW5jKGJ0cy0+bmV0d29yay0+c3RhdHMuaGFuZG92ZXIubm9fY2hhbm5lbCk7CisJCXJldHVybiAtRU5PU1BDOworCX0KKworCWhvID0gdGFsbG9jX3plcm8oTlVMTCwgc3RydWN0IGJzY19oYW5kb3Zlcik7CisJaWYgKCFobykgeworCQlMT0dQKERITywgTE9HTF9GQVRBTCwgIk91dCBvZiBNZW1vcnlcbiIpOworCQlsY2hhbl9mcmVlKG5ld19sY2hhbik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwloby0+b2xkX2xjaGFuID0gb2xkX2xjaGFuOworCWhvLT5uZXdfbGNoYW4gPSBuZXdfbGNoYW47CisJaG8tPmhvX3JlZiA9IGhvX3JlZisrOworCisJLyogY29weSBzb21lIHBhcmFtZXRlcnMgZnJvbSBvbGQgbGNoYW4gKi8KKwltZW1jcHkoJm5ld19sY2hhbi0+ZW5jciwgJm9sZF9sY2hhbi0+ZW5jciwgc2l6ZW9mKG5ld19sY2hhbi0+ZW5jcikpOworCW5ld19sY2hhbi0+bXNfcG93ZXIgPSBvbGRfbGNoYW4tPm1zX3Bvd2VyOworCW5ld19sY2hhbi0+YnNfcG93ZXIgPSBvbGRfbGNoYW4tPmJzX3Bvd2VyOworCW5ld19sY2hhbi0+cnNsX2Ntb2RlID0gb2xkX2xjaGFuLT5yc2xfY21vZGU7CisJbmV3X2xjaGFuLT50Y2hfbW9kZSA9IG9sZF9sY2hhbi0+dGNoX21vZGU7CisJbmV3X2xjaGFuLT5zdWJzY3IgPSBzdWJzY3JfZ2V0KG9sZF9sY2hhbi0+c3Vic2NyKTsKKworCS8qIEZJWE1FOiBkbyB3ZSBoYXZlIGEgYmV0dGVyIGlkZWEgb2YgdGhlIHRpbWluZyBhZHZhbmNlPyAqLworCXJjID0gcnNsX2NoYW5fYWN0aXZhdGVfbGNoYW4obmV3X2xjaGFuLCBSU0xfQUNUX0lOVEVSX0FTWU5DLCAwLAorCQkJCSAgICAgaG8tPmhvX3JlZik7CisJaWYgKHJjIDwgMCkgeworCQlMT0dQKERITywgTE9HTF9FUlJPUiwgImNvdWxkIG5vdCBhY3RpdmF0ZSBjaGFubmVsXG4iKTsKKwkJdGFsbG9jX2ZyZWUoaG8pOworCQlsY2hhbl9mcmVlKG5ld19sY2hhbik7CisJCXJldHVybiByYzsKKwl9CisKKwlsbGlzdF9hZGQoJmhvLT5saXN0LCAmYnNjX2hhbmRvdmVycyk7CisJLyogd2UgY29udGludWUgaW4gdGhlIFNTX0xDSEFOIGhhbmRsZXIgLyBob19jaGFuX2FjdGl2X2FjayAqLworCisJcmV0dXJuIDA7Cit9CisKKy8qIFQzMTAzIGV4cGlyZWQ6IEhhbmRvdmVyIGhhcyBmYWlsZWQgd2l0aG91dCBITyBDT01QTEVURSBvciBITyBGQUlMICovCitzdGF0aWMgdm9pZCBob19UMzEwM19jYih2b2lkICpfaG8pCit7CisJc3RydWN0IGJzY19oYW5kb3ZlciAqaG8gPSBfaG87CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBoby0+bmV3X2xjaGFuLT50cy0+dHJ4LT5idHMtPm5ldHdvcms7CisKKwlERUJVR1AoREhPLCAiSE8gVDMxMDMgZXhwaXJlZFxuIik7CisJY291bnRlcl9pbmMobmV0LT5zdGF0cy5oYW5kb3Zlci50aW1lb3V0KTsKKworCWxjaGFuX2ZyZWUoaG8tPm5ld19sY2hhbik7CisJbGxpc3RfZGVsKCZoby0+bGlzdCk7CisJdGFsbG9jX2ZyZWUoaG8pOworfQorCisvKiBSU0wgaGFzIGFja25vd2xlZGdlZCBhY3RpdmF0aW9uIG9mIHRoZSBuZXcgbGNoYW4gKi8KK3N0YXRpYyBpbnQgaG9fY2hhbl9hY3Rpdl9hY2soc3RydWN0IGdzbV9sY2hhbiAqbmV3X2xjaGFuKQoreworCXN0cnVjdCBic2NfaGFuZG92ZXIgKmhvOworCWludCByYzsKKworCS8qIHdlIG5lZWQgdG8gY2hlY2sgaWYgdGhpcyBjaGFubmVsIGFjdGl2YXRpb24gaXMgcmVsYXRlZCB0bworCSAqIGEgaGFuZG92ZXIgYXQgYWxsIChhbmQgaWYsIHdoaWNoIHBhcnRpY3VsYXIgaGFuZG92ZXIpICovCisJaG8gPSBic2NfaG9fYnlfbmV3X2xjaGFuKG5ld19sY2hhbik7CisJaWYgKCFobykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlERUJVR1AoREhPLCAiaGFuZG92ZXIgYWN0aXZhdGUgYWNrLCBzZW5kIEhPIENvbW1hbmRcbiIpOworCisJLyogd2UgY2FuIG5vdyBzZW5kIHRoZSAwNC4wOCBIQU5ET1ZFUiBDT01NQU5EIHRvIHRoZSBNUworCSAqIHVzaW5nIHRoZSBvbGQgbGNoYW4gKi8KKworCXJjID0gZ3NtNDhfc2VuZF9ob19jbWQoaG8tPm9sZF9sY2hhbiwgbmV3X2xjaGFuLCAwLCBoby0+aG9fcmVmKTsKKworCS8qIHN0YXJ0IFQzMTAzLiAgV2UgY2FuIGNvbnRpbnVlIGVpdGhlciB3aXRoIFQzMTAzIGV4cGlyYXRpb24sCisJICogMDQuMDggSEFORE9WRVIgQ09NUExFVEUgb3IgMDQuMDggSEFORE9WRVIgRkFJTCAqLworCWhvLT5UMzEwMy5jYiA9IGhvX1QzMTAzX2NiOworCWhvLT5UMzEwMy5kYXRhID0gaG87CisJYnNjX3NjaGVkdWxlX3RpbWVyKCZoby0+VDMxMDMsIDEwLCAwKTsKKworCS8qIGNyZWF0ZSBhIFJUUCBjb25uZWN0aW9uICovCisJaWYgKGlzX2lwYWNjZXNzX2J0cyhuZXdfbGNoYW4tPnRzLT50cngtPmJ0cykpCisJCXJzbF9pcGFjY19jcmN4KG5ld19sY2hhbik7CisKKwlyZXR1cm4gMDsKK30KKworLyogUlNMIGhhcyBub3QgYWNrbm93bGVkZ2VkIGFjdGl2YXRpb24gb2YgdGhlIG5ldyBsY2hhbiAqLworc3RhdGljIGludCBob19jaGFuX2FjdGl2X25hY2soc3RydWN0IGdzbV9sY2hhbiAqbmV3X2xjaGFuKQoreworCXN0cnVjdCBic2NfaGFuZG92ZXIgKmhvOworCisJaG8gPSBic2NfaG9fYnlfbmV3X2xjaGFuKG5ld19sY2hhbik7CisJaWYgKCFobykgeworCQlMT0dQKERITywgTE9HTF9FUlJPUiwgInVuYWJsZSB0byBmaW5kIEhPIHJlY29yZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWxsaXN0X2RlbCgmaG8tPmxpc3QpOworCXRhbGxvY19mcmVlKGhvKTsKKworCS8qIEZJWE1FOiBtYXliZSB3ZSBzaG91bGQgdHJ5IHRvIGFsbG9jYXRlIGEgbmV3IExDSEFOIGhlcmU/ICovCisKKwlyZXR1cm4gMDsKK30KKworLyogR1NNIDA0LjA4IEhBTkRPVkVSIENPTVBMRVRFIGhhcyBiZWVuIHJlY2VpdmVkIG9uIG5ldyBjaGFubmVsICovCitzdGF0aWMgaW50IGhvX2dzbTQ4X2hvX2NvbXBsKHN0cnVjdCBnc21fbGNoYW4gKm5ld19sY2hhbikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IG5ld19sY2hhbi0+dHMtPnRyeC0+YnRzLT5uZXR3b3JrOworCXN0cnVjdCBic2NfaGFuZG92ZXIgKmhvOworCisJaG8gPSBic2NfaG9fYnlfbmV3X2xjaGFuKG5ld19sY2hhbik7CisJaWYgKCFobykgeworCQlMT0dQKERITywgTE9HTF9FUlJPUiwgInVuYWJsZSB0byBmaW5kIEhPIHJlY29yZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCUxPR1AoREhPLCBMT0dMX0lORk8sICJTdWJzY3JpYmVyICVzIEhPIGZyb20gQlRTICV1LT4ldSBvbiBBUkZDTiAiCisJICAgICAiJXUtPiV1XG4iLCBzdWJzY3JfbmFtZShoby0+b2xkX2xjaGFuLT5zdWJzY3IpLAorCSAgICAgaG8tPm9sZF9sY2hhbi0+dHMtPnRyeC0+YnRzLT5uciwgbmV3X2xjaGFuLT50cy0+dHJ4LT5idHMtPm5yLAorCSAgICAgaG8tPm9sZF9sY2hhbi0+dHMtPnRyeC0+YXJmY24sIG5ld19sY2hhbi0+dHMtPnRyeC0+YXJmY24pOworCisJY291bnRlcl9pbmMobmV0LT5zdGF0cy5oYW5kb3Zlci5jb21wbGV0ZWQpOworCisJYnNjX2RlbF90aW1lcigmaG8tPlQzMTAzKTsKKworCS8qIHVwZGF0ZSBsY2hhbiBwb2ludGVyIG9mIHRyYW5zYWN0aW9uICovCisJdHJhbnNfbGNoYW5fY2hhbmdlKGhvLT5vbGRfbGNoYW4sIG5ld19sY2hhbik7CisKKwloby0+b2xkX2xjaGFuLT5zdGF0ZSA9IExDSEFOX1NfSU5BQ1RJVkU7CisJbGNoYW5fYXV0b19yZWxlYXNlKGhvLT5vbGRfbGNoYW4pOworCisJLyogZG8gc29tZXRoaW5nIHRvIHJlLXJvdXRlIHRoZSBhY3R1YWwgc3BlZWNoIGZyYW1lcyAhICovCisKKwlsbGlzdF9kZWwoJmhvLT5saXN0KTsKKwl0YWxsb2NfZnJlZShobyk7CisKKwlyZXR1cm4gMDsKK30KKworLyogR1NNIDA0LjA4IEhBTkRPVkVSIEZBSUwgaGFzIGJlZW4gcmVjZWl2ZWQgKi8KK3N0YXRpYyBpbnQgaG9fZ3NtNDhfaG9fZmFpbChzdHJ1Y3QgZ3NtX2xjaGFuICpvbGRfbGNoYW4pCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBvbGRfbGNoYW4tPnRzLT50cngtPmJ0cy0+bmV0d29yazsKKwlzdHJ1Y3QgYnNjX2hhbmRvdmVyICpobzsKKworCWhvID0gYnNjX2hvX2J5X29sZF9sY2hhbihvbGRfbGNoYW4pOworCWlmICghaG8pIHsKKwkJTE9HUChESE8sIExPR0xfRVJST1IsICJ1bmFibGUgdG8gZmluZCBITyByZWNvcmRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwljb3VudGVyX2luYyhuZXQtPnN0YXRzLmhhbmRvdmVyLmZhaWxlZCk7CisKKwlic2NfZGVsX3RpbWVyKCZoby0+VDMxMDMpOworCWxsaXN0X2RlbCgmaG8tPmxpc3QpOworCXB1dF9sY2hhbihoby0+bmV3X2xjaGFuKTsKKwl0YWxsb2NfZnJlZShobyk7CisKKwlyZXR1cm4gMDsKK30KKworLyogR1NNIDA4LjU4IEhBTkRPVkVSIERFVEVDVCBoYXMgYmVlbiByZWNlaXZlZCAqLworc3RhdGljIGludCBob19yc2xfZGV0ZWN0KHN0cnVjdCBnc21fbGNoYW4gKm5ld19sY2hhbikKK3sKKwlzdHJ1Y3QgYnNjX2hhbmRvdmVyICpobzsKKworCWhvID0gYnNjX2hvX2J5X25ld19sY2hhbihuZXdfbGNoYW4pOworCWlmICghaG8pIHsKKwkJTE9HUChESE8sIExPR0xfRVJST1IsICJ1bmFibGUgdG8gZmluZCBITyByZWNvcmRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBGSVhNRTogZG8gd2UgYWN0dWFsbHkgd2FudCB0byBkbyBzb21ldGhpbmcgaGVyZSA/ICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBob19pcGFjX2NyY3hfYWNrKHN0cnVjdCBnc21fbGNoYW4gKm5ld19sY2hhbikKK3sKKwlzdHJ1Y3QgYnNjX2hhbmRvdmVyICpobzsKKwlzdHJ1Y3QgcnRwX3NvY2tldCAqb2xkX3JzLCAqbmV3X3JzLCAqb3RoZXJfcnM7CisKKwlobyA9IGJzY19ob19ieV9uZXdfbGNoYW4obmV3X2xjaGFuKTsKKwlpZiAoIWhvKSB7CisJCS8qIGl0IGlzIHBlcmZlY3RseSBub3JtYWwsIHdlIGhhdmUgQ1JDWCBldmVuIGluIG5vbi1ITyBjYXNlcyAqLworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoaXBhY2NfcnRwX2RpcmVjdCkgeworCQlMT0dQKERITywgTE9HTF9FUlJPUiwgInVuYWJsZSB0byBoYW5kb3ZlciBpbiBkaXJlY3QgUlRQIG1vZGVcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBSVFAgUHJveHkgbW9kZSAqLworCW5ld19ycyA9IG5ld19sY2hhbi0+YWJpc19pcC5ydHBfc29ja2V0OworCW9sZF9ycyA9IGhvLT5vbGRfbGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldDsKKworCWlmICghbmV3X3JzKSB7CisJCUxPR1AoREhPLCBMT0dMX0VSUk9SLCAibm8gUlRQIHNvY2tldCBmb3IgbmV3X2xjaGFuXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcnNsX2lwYWNjX21kY3hfdG9fcnRwc29jayhuZXdfbGNoYW4pOworCisJaWYgKCFvbGRfcnMpIHsKKwkJTE9HUChESE8sIExPR0xfRVJST1IsICJubyBSVFAgc29jZWt0IGZvciBvbGRfbGNoYW5cbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBjb3B5IHJ4X2FjdGlvbiBhbmQgcmVmZXJlbmNlIHRvIG90aGVyIHNvY2sgKi8KKwluZXdfcnMtPnJ4X2FjdGlvbiA9IG9sZF9ycy0+cnhfYWN0aW9uOworCW5ld19ycy0+dHhfYWN0aW9uID0gb2xkX3JzLT50eF9hY3Rpb247CisJbmV3X3JzLT50cmFuc21pdCA9IG9sZF9ycy0+dHJhbnNtaXQ7CisKKwlzd2l0Y2ggKGhvLT5vbGRfbGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldC0+cnhfYWN0aW9uKSB7CisJY2FzZSBSVFBfUFJPWFk6CisJCW90aGVyX3JzID0gb2xkX3JzLT5wcm94eS5vdGhlcl9zb2NrOworCQlydHBfc29ja2V0X3Byb3h5KG5ld19ycywgb3RoZXJfcnMpOworCQkvKiBkZWxldGUgcmVmZXJlbmNlIHRvIG90aGVyIGVuZCBzb2NrZXQgdG8gcHJldmVudAorCQkgKiBydHBfc29ja2V0X2ZyZWUoKSBmcm9tIHJlbW92aW5nIHRoZSBpbnZlcnNlIHJlZmVyZW5jZSAqLworCQlvbGRfcnMtPnByb3h5Lm90aGVyX3NvY2sgPSBOVUxMOworCQlicmVhazsKKwljYXNlIFJUUF9SRUNWX1VQU1RSRUFNOgorCQluZXdfcnMtPnJlY2VpdmUgPSBvbGRfcnMtPnJlY2VpdmU7CisJCWJyZWFrOworCWNhc2UgUlRQX05PTkU6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhvX2xvZ2ljX3NpZ19jYih1bnNpZ25lZCBpbnQgc3Vic3lzLCB1bnNpZ25lZCBpbnQgc2lnbmFsLAorCQkJICAgdm9pZCAqaGFuZGxlcl9kYXRhLCB2b2lkICpzaWduYWxfZGF0YSkKK3sKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKworCXN3aXRjaCAoc3Vic3lzKSB7CisJY2FzZSBTU19MQ0hBTjoKKwkJbGNoYW4gPSBzaWduYWxfZGF0YTsKKwkJc3dpdGNoIChzaWduYWwpIHsKKwkJY2FzZSBTX0xDSEFOX0FDVElWQVRFX0FDSzoKKwkJCXJldHVybiBob19jaGFuX2FjdGl2X2FjayhsY2hhbik7CisJCWNhc2UgU19MQ0hBTl9BQ1RJVkFURV9OQUNLOgorCQkJcmV0dXJuIGhvX2NoYW5fYWN0aXZfbmFjayhsY2hhbik7CisJCWNhc2UgU19MQ0hBTl9IQU5ET1ZFUl9ERVRFQ1Q6CisJCQlyZXR1cm4gaG9fcnNsX2RldGVjdChsY2hhbik7CisJCWNhc2UgU19MQ0hBTl9IQU5ET1ZFUl9DT01QTDoKKwkJCXJldHVybiBob19nc200OF9ob19jb21wbChsY2hhbik7CisJCWNhc2UgU19MQ0hBTl9IQU5ET1ZFUl9GQUlMOgorCQkJcmV0dXJuIGhvX2dzbTQ4X2hvX2ZhaWwobGNoYW4pOworCQl9CisJCWJyZWFrOworCWNhc2UgU1NfQUJJU0lQOgorCQlsY2hhbiA9IHNpZ25hbF9kYXRhOworCQlzd2l0Y2ggKHNpZ25hbCkgeworCQljYXNlIFNfQUJJU0lQX0NSQ1hfQUNLOgorCQkJcmV0dXJuIGhvX2lwYWNfY3JjeF9hY2sobGNoYW4pOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2F0dHJpYnV0ZV9fKChjb25zdHJ1Y3RvcikpIHZvaWQgb25fZHNvX2xvYWRfaG9fbG9naWModm9pZCkKK3sKKwlyZWdpc3Rlcl9zaWduYWxfaGFuZGxlcihTU19MQ0hBTiwgaG9fbG9naWNfc2lnX2NiLCBOVUxMKTsKKwlyZWdpc3Rlcl9zaWduYWxfaGFuZGxlcihTU19BQklTSVAsIGhvX2xvZ2ljX3NpZ19jYiwgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9pbnB1dC9pcGFjY2Vzcy5jIGIvb3BlbmJzYy9zcmMvaW5wdXQvaXBhY2Nlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWQ3NTYzCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvaW5wdXQvaXBhY2Nlc3MuYwpAQCAtMCwwICsxLDcyNSBAQAorLyogT3BlbkJTQyBBYmlzIGlucHV0IGRyaXZlciBmb3IgaXAuYWNjZXNzICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy9mY250bC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19ubS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19yc2wuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3N1YmNoYW5fZGVtdXguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2UxX2lucHV0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9pcGFjY2Vzcy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorCisjZGVmaW5lIFBSSVZfT01MIDEKKyNkZWZpbmUgUFJJVl9SU0wgMgorCisvKiBkYXRhIHN0cnVjdHVyZSBmb3Igb25lIEUxIGludGVyZmFjZSB3aXRoIEEtYmlzICovCitzdHJ1Y3QgaWFfZTFfaGFuZGxlIHsKKwlzdHJ1Y3QgYnNjX2ZkIGxpc3Rlbl9mZDsKKwlzdHJ1Y3QgYnNjX2ZkIHJzbF9saXN0ZW5fZmQ7CisJc3RydWN0IGdzbV9uZXR3b3JrICpnc21uZXQ7Cit9OworCitzdGF0aWMgc3RydWN0IGlhX2UxX2hhbmRsZSAqZTFoOworCisKKyNkZWZpbmUgVFMxX0FMTE9DX1NJWkUJMzAwCisKK3N0YXRpYyBjb25zdCB1X2ludDhfdCBwb25nW10gPSB7IDAsIDEsIElQQUNfUFJPVE9fSVBBQ0NFU1MsIElQQUNfTVNHVF9QT05HIH07CitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgaWRfYWNrW10gPSB7IDAsIDEsIElQQUNfUFJPVE9fSVBBQ0NFU1MsIElQQUNfTVNHVF9JRF9BQ0sgfTsKK3N0YXRpYyBjb25zdCB1X2ludDhfdCBpZF9yZXFbXSA9IHsgMCwgMTcsIElQQUNfUFJPVE9fSVBBQ0NFU1MsIElQQUNfTVNHVF9JRF9HRVQsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfVU5JVCwgCisJCQkJCTB4MDEsIElQQUNfSURUQUdfTUFDQUREUiwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19MT0NBVElPTjEsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfTE9DQVRJT04yLAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX0VRVUlQVkVSUywKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19TV1ZFUlNJT04sCisJCQkJCTB4MDEsIElQQUNfSURUQUdfVU5JVE5BTUUsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfU0VSTlIsCisJCQkJfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmlkdGFnX25hbWVzW10gPSB7CisJW0lQQUNfSURUQUdfU0VSTlJdCT0gIlNlcmlhbF9OdW1iZXIiLAorCVtJUEFDX0lEVEFHX1VOSVROQU1FXQk9ICJVbml0X05hbWUiLAorCVtJUEFDX0lEVEFHX0xPQ0FUSU9OMV0JPSAiTG9jYXRpb25fMSIsCisJW0lQQUNfSURUQUdfTE9DQVRJT04yXQk9ICJMb2NhdGlvbl8yIiwKKwlbSVBBQ19JRFRBR19FUVVJUFZFUlNdCT0gIkVxdWlwbWVudF9WZXJzaW9uIiwKKwlbSVBBQ19JRFRBR19TV1ZFUlNJT05dCT0gIlNvZnR3YXJlX1ZlcnNpb24iLAorCVtJUEFDX0lEVEFHX0lQQUREUl0JPSAiSVBfQWRkcmVzcyIsCisJW0lQQUNfSURUQUdfTUFDQUREUl0JPSAiTUFDX0FkZHJlc3MiLAorCVtJUEFDX0lEVEFHX1VOSVRdCT0gIlVuaXRfSUQiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmlwYWNfaWR0YWdfbmFtZShpbnQgdGFnKQoreworCWlmICh0YWcgPj0gQVJSQVlfU0laRShpZHRhZ19uYW1lcykpCisJCXJldHVybiAidW5rbm93biI7CisKKwlyZXR1cm4gaWR0YWdfbmFtZXNbdGFnXTsKK30KKworaW50IGlwYWNjZXNzX2lkdGFnX3BhcnNlKHN0cnVjdCB0bHZfcGFyc2VkICpkZWMsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwl1X2ludDhfdCB0X2xlbjsKKwl1X2ludDhfdCB0X3RhZzsKKwl1X2ludDhfdCAqY3VyID0gYnVmOworCisJd2hpbGUgKGN1ciA8IGJ1ZiArIGxlbikgeworCQl0X2xlbiA9ICpjdXIrKzsKKwkJdF90YWcgPSAqY3VyKys7CisKKwkJREVCVUdQQyhETUksICIlcz0nJXMnICIsIGlwYWNfaWR0YWdfbmFtZSh0X3RhZyksIGN1cik7CisKKwkJZGVjLT5sdlt0X3RhZ10ubGVuID0gdF9sZW47CisJCWRlYy0+bHZbdF90YWddLnZhbCA9IGN1cjsKKworCQljdXIgKz0gdF9sZW47CisJfQorCXJldHVybiAwOworfQorCitzdHJ1Y3QgZ3NtX2J0cyAqZmluZF9idHNfYnlfdW5pdGlkKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LAorCQkJCSAgIHVfaW50MTZfdCBzaXRlX2lkLCB1X2ludDE2X3QgYnRzX2lkKQoreworCXN0cnVjdCBnc21fYnRzICpidHM7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShidHMsICZuZXQtPmJ0c19saXN0LCBsaXN0KSB7CisKKwkJaWYgKCFpc19pcGFjY2Vzc19idHMoYnRzKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChidHMtPmlwX2FjY2Vzcy5zaXRlX2lkID09IHNpdGVfaWQgJiYKKwkJICAgIGJ0cy0+aXBfYWNjZXNzLmJ0c19pZCA9PSBidHNfaWQpCisJCQlyZXR1cm4gYnRzOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHBhcnNlX3VuaXRpZChjb25zdCBjaGFyICpzdHIsIHVfaW50MTZfdCAqc2l0ZV9pZCwgdV9pbnQxNl90ICpidHNfaWQsCisJCQl1X2ludDE2X3QgKnRyeF9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHVsOworCWNoYXIgKmVuZHB0cjsKKwljb25zdCBjaGFyICpucHRyOworCisJbnB0ciA9IHN0cjsKKwl1bCA9IHN0cnRvdWwobnB0ciwgJmVuZHB0ciwgMTApOworCWlmIChlbmRwdHIgPD0gbnB0cikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHNpdGVfaWQpCisJCSpzaXRlX2lkID0gdWwgJiAweGZmZmY7CisKKwlpZiAoKmVuZHB0cisrICE9ICcvJykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlucHRyID0gZW5kcHRyOworCXVsID0gc3RydG91bChucHRyLCAmZW5kcHRyLCAxMCk7CisJaWYgKGVuZHB0ciA8PSBucHRyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoYnRzX2lkKQorCQkqYnRzX2lkID0gdWwgJiAweGZmZmY7CisKKwlpZiAoKmVuZHB0cisrICE9ICcvJykKKwkJcmV0dXJuIC1FSU5WQUw7CisJCisJbnB0ciA9IGVuZHB0cjsKKwl1bCA9IHN0cnRvdWwobnB0ciwgJmVuZHB0ciwgMTApOworCWlmIChlbmRwdHIgPD0gbnB0cikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHRyeF9pZCkKKwkJKnRyeF9pZCA9IHVsICYgMHhmZmZmOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHNlbmQgdGhlIGlkIGFjayAqLworaW50IGlwYWNjZXNzX3NlbmRfaWRfYWNrKGludCBmZCkKK3sKKwlyZXR1cm4gd3JpdGUoZmQsIGlkX2Fjaywgc2l6ZW9mKGlkX2FjaykpOworfQorCitpbnQgaXBhY2Nlc3Nfc2VuZF9pZF9yZXEoaW50IGZkKQoreworCXJldHVybiB3cml0ZShmZCwgaWRfcmVxLCBzaXplb2YoaWRfcmVxKSk7Cit9CisKKy8qIGJhc2UgaGFuZGxpbmcgb2YgdGhlIGlwLmFjY2VzcyBwcm90b2NvbCAqLworaW50IGlwYWNjZXNzX3Jjdm1zZ19iYXNlKHN0cnVjdCBtc2diICptc2csCisJCQkgc3RydWN0IGJzY19mZCAqYmZkKQoreworCXVfaW50OF90IG1zZ190eXBlID0gKihtc2ctPmwyaCk7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKG1zZ190eXBlKSB7CisJY2FzZSBJUEFDX01TR1RfUElORzoKKwkJcmV0ID0gd3JpdGUoYmZkLT5mZCwgcG9uZywgc2l6ZW9mKHBvbmcpKTsKKwkJYnJlYWs7CisJY2FzZSBJUEFDX01TR1RfUE9ORzoKKwkJREVCVUdQKERNSSwgIlBPTkchXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBJUEFDX01TR1RfSURfQUNLOgorCQlERUJVR1AoRE1JLCAiSURfQUNLPyAtPiBBQ0shXG4iKTsKKwkJcmV0ID0gaXBhY2Nlc3Nfc2VuZF9pZF9hY2soYmZkLT5mZCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcGFjY2Vzc19yY3Ztc2coc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUsIHN0cnVjdCBtc2diICptc2csCisJCQkgICBzdHJ1Y3QgYnNjX2ZkICpiZmQpCit7CisJc3RydWN0IHRsdl9wYXJzZWQgdGx2cDsKKwl1X2ludDhfdCBtc2dfdHlwZSA9ICoobXNnLT5sMmgpOworCXVfaW50MTZfdCBzaXRlX2lkID0gMCwgYnRzX2lkID0gMCwgdHJ4X2lkID0gMDsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCisJLyogaGFuZGxlIGJhc2UgbWVzc2FnZXMgKi8KKwlpcGFjY2Vzc19yY3Ztc2dfYmFzZShtc2csIGJmZCk7CisKKwlzd2l0Y2ggKG1zZ190eXBlKSB7CisJY2FzZSBJUEFDX01TR1RfSURfUkVTUDoKKwkJREVCVUdQKERNSSwgIklEX1JFU1AgIik7CisJCS8qIHBhcnNlIHRhZ3MsIHNlYXJjaCBmb3IgVW5pdCBJRCAqLworCQlpcGFjY2Vzc19pZHRhZ19wYXJzZSgmdGx2cCwgKHVfaW50OF90ICopbXNnLT5sMmggKyAyLAorCQkJCSBtc2diX2wybGVuKG1zZyktMik7CisJCURFQlVHUChETUksICJcbiIpOworCisJCWlmICghVExWUF9QUkVTRU5UKCZ0bHZwLCBJUEFDX0lEVEFHX1VOSVQpKQorCQkJYnJlYWs7CisKKwkJLyogbG9va3VwIEJUUywgY3JlYXRlIHNpZ25fbGluaywgLi4uICovCisJCXBhcnNlX3VuaXRpZCgoY2hhciAqKVRMVlBfVkFMKCZ0bHZwLCBJUEFDX0lEVEFHX1VOSVQpLAorCQkJICAgICAmc2l0ZV9pZCwgJmJ0c19pZCwgJnRyeF9pZCk7CisJCWJ0cyA9IGZpbmRfYnRzX2J5X3VuaXRpZChlMWgtPmdzbW5ldCwgc2l0ZV9pZCwgYnRzX2lkKTsKKwkJaWYgKCFidHMpIHsKKwkJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgIlVuYWJsZSB0byBmaW5kIEJUUyBjb25maWd1cmF0aW9uIGZvciAiCisJCQkgICAgICAgIiAldS8ldS8ldSwgZGlzY29ubmVjdGluZ1xuIiwgc2l0ZV9pZCwgYnRzX2lkLAorCQkJCXRyeF9pZCk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlERUJVR1AoRElOUCwgIklkZW50aWZpZWQgQlRTICV1LyV1LyV1XG4iLCBzaXRlX2lkLCBidHNfaWQsIHRyeF9pZCk7CisJCWlmIChiZmQtPnByaXZfbnIgPT0gUFJJVl9PTUwpIHsKKwkJCWJ0cy0+b21sX2xpbmsgPSBlMWlucF9zaWduX2xpbmtfY3JlYXRlKCZsaW5lLT50c1tQUklWX09NTCAtIDFdLAorCQkJCQkJICBFMUlOUF9TSUdOX09NTCwgYnRzLT5jMCwKKwkJCQkJCSAgYnRzLT5vbWxfdGVpLCAwKTsKKwkJfSBlbHNlIGlmIChiZmQtPnByaXZfbnIgPT0gUFJJVl9SU0wpIHsKKwkJCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzOworCQkJc3RydWN0IGJzY19mZCAqbmV3YmZkOworCQkJc3RydWN0IGdzbV9idHNfdHJ4ICp0cnggPSBnc21fYnRzX3RyeF9udW0oYnRzLCB0cnhfaWQpOworCQkJCisJCQliZmQtPmRhdGEgPSBsaW5lID0gYnRzLT5vbWxfbGluay0+dHMtPmxpbmU7CisJCQllMWlfdHMgPSAmbGluZS0+dHNbUFJJVl9SU0wgKyB0cnhfaWQgLSAxXTsKKwkJCW5ld2JmZCA9ICZlMWlfdHMtPmRyaXZlci5pcGFjY2Vzcy5mZDsKKwkJCWUxaW5wX3RzX2NvbmZpZyhlMWlfdHMsIGxpbmUsIEUxSU5QX1RTX1RZUEVfU0lHTik7CisKKwkJCXRyeC0+cnNsX2xpbmsgPSBlMWlucF9zaWduX2xpbmtfY3JlYXRlKGUxaV90cywKKwkJCQkJCQlFMUlOUF9TSUdOX1JTTCwgdHJ4LAorCQkJCQkJCXRyeC0+cnNsX3RlaSwgMCk7CisKKwkJCWlmIChuZXdiZmQtPmZkID49IDApIHsKKwkJCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJCVFMgaXMgc3RpbGwgcmVnaXN0ZXJlZC4gQ2xvc2luZyBvbGQgY29ubmVjdGlvbi5cbiIpOworCQkJCWJzY191bnJlZ2lzdGVyX2ZkKG5ld2JmZCk7CisJCQkJY2xvc2UobmV3YmZkLT5mZCk7CisJCQkJbmV3YmZkLT5mZCA9IC0xOworCQkJfQorCisJCQkvKiBnZXQgcmlkIG9mIG91ciBvbGQgdGVtcG9yYXJ5IGJmZCAqLworCQkJbWVtY3B5KG5ld2JmZCwgYmZkLCBzaXplb2YoKm5ld2JmZCkpOworCQkJbmV3YmZkLT5wcml2X25yID0gUFJJVl9SU0wgKyB0cnhfaWQ7CisJCQlic2NfdW5yZWdpc3Rlcl9mZChiZmQpOworCQkJYnNjX3JlZ2lzdGVyX2ZkKG5ld2JmZCk7CisJCQl0YWxsb2NfZnJlZShiZmQpOworCQl9CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBPTUxfVVAJCTB4MDAwMQorI2RlZmluZSBSU0xfVVAJCTB4MDAwMgorCisvKgorICogcmVhZCBvbmUgaXBhIG1lc3NhZ2UgZnJvbSB0aGUgc29ja2V0CisgKiByZXR1cm4gTlVMTCBpbiBjYXNlIG9mIGVycm9yCisgKi8KK3N0cnVjdCBtc2diICppcGFjY2Vzc19yZWFkX21zZyhzdHJ1Y3QgYnNjX2ZkICpiZmQsIGludCAqZXJyb3IpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG1zZ2JfYWxsb2MoVFMxX0FMTE9DX1NJWkUsICJBYmlzL0lQIik7CisJc3RydWN0IGlwYWNjZXNzX2hlYWQgKmhoOworCWludCBsZW4sIHJldCA9IDA7CisKKwlpZiAoIW1zZykgeworCQkqZXJyb3IgPSAtRU5PTUVNOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBmaXJzdCByZWFkIG91ciAzLWJ5dGUgaGVhZGVyICovCisJaGggPSAoc3RydWN0IGlwYWNjZXNzX2hlYWQgKikgbXNnLT5kYXRhOworCXJldCA9IHJlY3YoYmZkLT5mZCwgbXNnLT5kYXRhLCBzaXplb2YoKmhoKSwgMCk7CisJaWYgKHJldCA9PSAwKSB7CisJCW1zZ2JfZnJlZShtc2cpOworCQkqZXJyb3IgPSByZXQ7CisJCXJldHVybiBOVUxMOworCX0gZWxzZSBpZiAocmV0ICE9IHNpemVvZigqaGgpKSB7CisJCWlmIChlcnJubyAhPSBFQUdBSU4pCisJCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJyZWN2IGVycm9yICVkICVzXG4iLCByZXQsIHN0cmVycm9yKGVycm5vKSk7CisJCW1zZ2JfZnJlZShtc2cpOworCQkqZXJyb3IgPSByZXQ7CisJCXJldHVybiBOVUxMOworCX0KKworCW1zZ2JfcHV0KG1zZywgcmV0KTsKKworCS8qIHRoZW4gcmVhZCB0ZSBsZW5ndGggYXMgc3BlY2lmaWVkIGluIGhlYWRlciAqLworCW1zZy0+bDJoID0gbXNnLT5kYXRhICsgc2l6ZW9mKCpoaCk7CisJbGVuID0gbnRvaHMoaGgtPmxlbik7CisKKwlpZiAobGVuIDwgMCB8fCBUUzFfQUxMT0NfU0laRSA8IGxlbiArIHNpemVvZigqaGgpKSB7CisJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgIkNhbiBub3QgcmVhZCB0aGlzIHBhY2tldC4gJWQgYXZhaWxcbiIsIGxlbik7CisJCW1zZ2JfZnJlZShtc2cpOworCQkqZXJyb3IgPSAtRUlPOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXQgPSByZWN2KGJmZC0+ZmQsIG1zZy0+bDJoLCBsZW4sIDApOworCWlmIChyZXQgPCBsZW4pIHsKKwkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAic2hvcnQgcmVhZCEgR290ICVkIGZyb20gJWRcbiIsIHJldCwgbGVuKTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCSplcnJvciA9IC1FSU87CisJCXJldHVybiBOVUxMOworCX0KKwltc2diX3B1dChtc2csIHJldCk7CisKKwlyZXR1cm4gbXNnOworfQorCitzdGF0aWMgaW50IGhhbmRsZV90czFfcmVhZChzdHJ1Y3QgYnNjX2ZkICpiZmQpCit7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUgPSBiZmQtPmRhdGE7CisJdW5zaWduZWQgaW50IHRzX25yID0gYmZkLT5wcml2X25yOworCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzID0gJmxpbmUtPnRzW3RzX25yLTFdOworCXN0cnVjdCBlMWlucF9zaWduX2xpbmsgKmxpbms7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwlzdHJ1Y3QgaXBhY2Nlc3NfaGVhZCAqaGg7CisJaW50IHJldCA9IDAsIGVycm9yOworCisJbXNnID0gaXBhY2Nlc3NfcmVhZF9tc2coYmZkLCAmZXJyb3IpOworCWlmICghbXNnKSB7CisJCWlmIChlcnJvciA9PSAwKSB7CisJCQlsaW5rID0gZTFpbnBfbG9va3VwX3NpZ25fbGluayhlMWlfdHMsIElQQUNfUFJPVE9fT01MLCAwKTsKKwkJCWlmIChsaW5rKSB7CisJCQkJbGluay0+dHJ4LT5idHMtPmlwX2FjY2Vzcy5mbGFncyA9IDA7CisJCQkJTE9HUChESU5QLCBMT0dMX05PVElDRSwgIkJUUyAldSBkaXNhcHBlYXJlZCwgZGVhZCBzb2NrZXRcbiIsCisJCQkJCWxpbmstPnRyeC0+YnRzLT5ucik7CisJCQl9IGVsc2UKKwkJCQlMT0dQKERJTlAsIExPR0xfTk9USUNFLCAidW5rbm93biBCVFMgZGlzYXBwZWFyZWQsIGRlYWQgc29ja2V0XG4iKTsKKwkJCWUxaW5wX2V2ZW50KGUxaV90cywgRVZUX0UxX1RFSV9ETiwgMCwgSVBBQ19QUk9UT19SU0wpOworCQkJZTFpbnBfZXZlbnQoZTFpX3RzLCBFVlRfRTFfVEVJX0ROLCAwLCBJUEFDX1BST1RPX09NTCk7CisJCQlic2NfdW5yZWdpc3Rlcl9mZChiZmQpOworCQkJY2xvc2UoYmZkLT5mZCk7CisJCQliZmQtPmZkID0gLTE7CisJCX0KKwkJcmV0dXJuIGVycm9yOworCX0KKworCURFQlVHUChETUksICJSWCAldTogJXNcbiIsIHRzX25yLCBoZXhkdW1wKG1zZ2JfbDIobXNnKSwgbXNnYl9sMmxlbihtc2cpKSk7CisKKwloaCA9IChzdHJ1Y3QgaXBhY2Nlc3NfaGVhZCAqKSBtc2ctPmRhdGE7CisJaWYgKGhoLT5wcm90byA9PSBJUEFDX1BST1RPX0lQQUNDRVNTKSB7CisJCXJldCA9IGlwYWNjZXNzX3Jjdm1zZyhsaW5lLCBtc2csIGJmZCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQllMWlucF9ldmVudChlMWlfdHMsIEVWVF9FMV9URUlfRE4sIDAsIElQQUNfUFJPVE9fUlNMKTsKKwkJCWUxaW5wX2V2ZW50KGUxaV90cywgRVZUX0UxX1RFSV9ETiwgMCwgSVBBQ19QUk9UT19PTUwpOworCQkJYnNjX3VucmVnaXN0ZXJfZmQoYmZkKTsKKwkJCWNsb3NlKGJmZC0+ZmQpOworCQkJYmZkLT5mZCA9IC0xOworCQl9CisJCW1zZ2JfZnJlZShtc2cpOworCQlyZXR1cm4gcmV0OworCX0KKwkvKiBCSUcgRkFUIFdBUk5JTkc6IGJmZCBtaWdodCBubyBsb25nZXIgZXhpc3QgaGVyZSwgc2luY2UgaXBhY2Nlc3NfcmN2bXNnKCkKKwkgKiBtaWdodCBoYXZlIGZyZWUnZCBpdCAhISEgKi8KKworCWxpbmsgPSBlMWlucF9sb29rdXBfc2lnbl9saW5rKGUxaV90cywgaGgtPnByb3RvLCAwKTsKKwlpZiAoIWxpbmspIHsKKwkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAibm8gbWF0Y2hpbmcgc2lnbmFsbGluZyBsaW5rIGZvciAiCisJCQkiaGgtPnByb3RvPTB4JTAyeFxuIiwgaGgtPnByb3RvKTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCXJldHVybiAtRUlPOworCX0KKwltc2ctPnRyeCA9IGxpbmstPnRyeDsKKworCXN3aXRjaCAobGluay0+dHlwZSkgeworCWNhc2UgRTFJTlBfU0lHTl9SU0w6CisJCWlmICghKG1zZy0+dHJ4LT5idHMtPmlwX2FjY2Vzcy5mbGFncyAmIChSU0xfVVAgPDwgbXNnLT50cngtPm5yKSkpIHsKKwkJCWUxaW5wX2V2ZW50KGUxaV90cywgRVZUX0UxX1RFSV9VUCwgbGluay0+dGVpLCBsaW5rLT5zYXBpKTsKKwkJCW1zZy0+dHJ4LT5idHMtPmlwX2FjY2Vzcy5mbGFncyB8PSAoUlNMX1VQIDw8IG1zZy0+dHJ4LT5ucik7CisJCX0KKwkJcmV0ID0gYWJpc19yc2xfcmN2bXNnKG1zZyk7CisJCWJyZWFrOworCWNhc2UgRTFJTlBfU0lHTl9PTUw6CisJCWlmICghKG1zZy0+dHJ4LT5idHMtPmlwX2FjY2Vzcy5mbGFncyAmIE9NTF9VUCkpIHsKKwkJCWUxaW5wX2V2ZW50KGUxaV90cywgRVZUX0UxX1RFSV9VUCwgbGluay0+dGVpLCBsaW5rLT5zYXBpKTsKKwkJCW1zZy0+dHJ4LT5idHMtPmlwX2FjY2Vzcy5mbGFncyB8PSBPTUxfVVA7CisJCX0KKwkJcmV0ID0gYWJpc19ubV9yY3Ztc2cobXNnKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChESU5QLCBMT0dMX05PVElDRSwgIlVua25vd24gSVAuYWNjZXNzIHByb3RvY29sIHByb3RvPTB4JTAyeFxuIiwgaGgtPnByb3RvKTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGlwYWNjZXNzX3ByZXBlbmRfaGVhZGVyKHN0cnVjdCBtc2diICptc2csIGludCBwcm90bykKK3sKKwlzdHJ1Y3QgaXBhY2Nlc3NfaGVhZCAqaGg7CisKKwkvKiBwcmVwZW5kIHRoZSBpcC5hY2Nlc3MgaGVhZGVyICovCisJaGggPSAoc3RydWN0IGlwYWNjZXNzX2hlYWQgKikgbXNnYl9wdXNoKG1zZywgc2l6ZW9mKCpoaCkpOworCWhoLT5sZW4gPSBodG9ucyhtc2ctPmxlbiAtIHNpemVvZigqaGgpKTsKKwloaC0+cHJvdG8gPSBwcm90bzsKK30KKworc3RhdGljIGludCB0c193YW50X3dyaXRlKHN0cnVjdCBlMWlucF90cyAqZTFpX3RzKQoreworCWUxaV90cy0+ZHJpdmVyLmlwYWNjZXNzLmZkLndoZW4gfD0gQlNDX0ZEX1dSSVRFOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRpbWVvdXRfdHMxX3dyaXRlKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGUxaW5wX3RzICplMWlfdHMgPSAoc3RydWN0IGUxaW5wX3RzICopZGF0YTsKKworCS8qIHRyaWdnZXIgd3JpdGUgb2YgdHMxLCBkdWUgdG8gdHggZGVsYXkgdGltZXIgKi8KKwl0c193YW50X3dyaXRlKGUxaV90cyk7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX3RzMV93cml0ZShzdHJ1Y3QgYnNjX2ZkICpiZmQpCit7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUgPSBiZmQtPmRhdGE7CisJdW5zaWduZWQgaW50IHRzX25yID0gYmZkLT5wcml2X25yOworCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzID0gJmxpbmUtPnRzW3RzX25yLTFdOworCXN0cnVjdCBlMWlucF9zaWduX2xpbmsgKnNpZ25fbGluazsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCXVfaW50OF90IHByb3RvOworCWludCByZXQ7CisKKwliZmQtPndoZW4gJj0gfkJTQ19GRF9XUklURTsKKworCS8qIGdldCB0aGUgbmV4dCBtc2cgZm9yIHRoaXMgdGltZXNsb3QgKi8KKwltc2cgPSBlMWlucF90eF90cyhlMWlfdHMsICZzaWduX2xpbmspOworCWlmICghbXNnKSB7CisJCS8qIG5vIG1lc3NhZ2UgYWZ0ZXIgdHggZGVsYXkgdGltZXIgKi8KKwkJcmV0dXJuIDA7CisJfQorCisJc3dpdGNoIChzaWduX2xpbmstPnR5cGUpIHsKKwljYXNlIEUxSU5QX1NJR05fT01MOgorCQlwcm90byA9IElQQUNfUFJPVE9fT01MOworCQlicmVhazsKKwljYXNlIEUxSU5QX1NJR05fUlNMOgorCQlwcm90byA9IElQQUNfUFJPVE9fUlNMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQltc2diX2ZyZWUobXNnKTsKKwkJYmZkLT53aGVuIHw9IEJTQ19GRF9XUklURTsgLyogY29tZSBiYWNrIGZvciBtb3JlIG1zZyAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltc2ctPmwyaCA9IG1zZy0+ZGF0YTsKKwlpcGFjY2Vzc19wcmVwZW5kX2hlYWRlcihtc2csIHNpZ25fbGluay0+dGVpKTsKKworCURFQlVHUChETUksICJUWCAldTogJXNcbiIsIHRzX25yLCBoZXhkdW1wKG1zZy0+bDJoLCBtc2diX2wybGVuKG1zZykpKTsKKworCXJldCA9IHNlbmQoYmZkLT5mZCwgbXNnLT5kYXRhLCBtc2ctPmxlbiwgMCk7CisJbXNnYl9mcmVlKG1zZyk7CisKKwkvKiBzZXQgdHggZGVsYXkgdGltZXIgZm9yIG5leHQgZXZlbnQgKi8KKwllMWlfdHMtPnNpZ24udHhfdGltZXIuY2IgPSB0aW1lb3V0X3RzMV93cml0ZTsKKwllMWlfdHMtPnNpZ24udHhfdGltZXIuZGF0YSA9IGUxaV90czsKKwlic2Nfc2NoZWR1bGVfdGltZXIoJmUxaV90cy0+c2lnbi50eF90aW1lciwgMCwgMTAwKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIGNhbGxiYWNrIGZyb20gc2VsZWN0LmMgaW4gY2FzZSBvbmUgb2YgdGhlIGZkJ3MgY2FuIGJlIHJlYWQvd3JpdHRlbiAqLworc3RhdGljIGludCBpcGFjY2Vzc19mZF9jYihzdHJ1Y3QgYnNjX2ZkICpiZmQsIHVuc2lnbmVkIGludCB3aGF0KQoreworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lID0gYmZkLT5kYXRhOworCXVuc2lnbmVkIGludCB0c19uciA9IGJmZC0+cHJpdl9ucjsKKwl1bnNpZ25lZCBpbnQgaWR4ID0gdHNfbnItMTsKKwlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90czsKKwlpbnQgcmMgPSAwOworCisJLyogSW4gY2FzZSBvZiBlYXJseSBSU0wgd2UgbWlnaHQgbm90IHlldCBoYXZlIGEgbGluZSAqLworCisJaWYgKGxpbmUpCisgCQllMWlfdHMgPSAmbGluZS0+dHNbaWR4XTsKKworCWlmICghbGluZSB8fCBlMWlfdHMtPnR5cGUgPT0gRTFJTlBfVFNfVFlQRV9TSUdOKSB7CisJCWlmICh3aGF0ICYgQlNDX0ZEX1JFQUQpCisJCQlyYyA9IGhhbmRsZV90czFfcmVhZChiZmQpOworCQlpZiAod2hhdCAmIEJTQ19GRF9XUklURSkKKwkJCXJjID0gaGFuZGxlX3RzMV93cml0ZShiZmQpOworCX0gZWxzZQorCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJ1bmtub3duIEUxIFRTIHR5cGUgJXVcbiIsIGUxaV90cy0+dHlwZSk7CisKKwlyZXR1cm4gcmM7Cit9CisKKworc3RydWN0IGUxaW5wX2RyaXZlciBpcGFjY2Vzc19kcml2ZXIgPSB7CisJLm5hbWUgPSAiaXAuYWNjZXNzIiwKKwkud2FudF93cml0ZSA9IHRzX3dhbnRfd3JpdGUsCit9OworCisvKiBjYWxsYmFjayBvZiB0aGUgT01MIGxpc3RlbmluZyBmaWxlZGVzY3JpcHRvciAqLworc3RhdGljIGludCBsaXN0ZW5fZmRfY2Ioc3RydWN0IGJzY19mZCAqbGlzdGVuX2JmZCwgdW5zaWduZWQgaW50IHdoYXQpCit7CisJaW50IHJldDsKKwlpbnQgaWR4ID0gMDsKKwlpbnQgaTsKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZTsKKwlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90czsKKwlzdHJ1Y3QgYnNjX2ZkICpiZmQ7CisJc3RydWN0IHNvY2thZGRyX2luIHNhOworCXNvY2tsZW5fdCBzYV9sZW4gPSBzaXplb2Yoc2EpOworCisJaWYgKCEod2hhdCAmIEJTQ19GRF9SRUFEKSkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBhY2NlcHQobGlzdGVuX2JmZC0+ZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNhLCAmc2FfbGVuKTsKKwlpZiAocmV0IDwgMCkgeworCQlwZXJyb3IoImFjY2VwdCIpOworCQlyZXR1cm4gcmV0OworCX0KKwlMT0dQKERJTlAsIExPR0xfTk9USUNFLCAiYWNjZXB0KCllZCBuZXcgT01MIGxpbmsgZnJvbSAlc1xuIiwKKwkJaW5ldF9udG9hKHNhLnNpbl9hZGRyKSk7CisKKwlsaW5lID0gdGFsbG9jX3plcm8odGFsbF9ic2NfY3R4LCBzdHJ1Y3QgZTFpbnBfbGluZSk7CisJaWYgKCFsaW5lKSB7CisJCWNsb3NlKHJldCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlsaW5lLT5kcml2ZXIgPSAmaXBhY2Nlc3NfZHJpdmVyOworCS8vbGluZS0+ZHJpdmVyX2RhdGEgPSBlMWg7CisJLyogY3JlYXRlIHZpcnJ0dWFsIEUxIHRpbWVzbG90cyBmb3Igc2lnbmFsbGluZyAqLworCWUxaW5wX3RzX2NvbmZpZygmbGluZS0+dHNbMS0xXSwgbGluZSwgRTFJTlBfVFNfVFlQRV9TSUdOKTsKKworCS8qIGluaXRpYWxpemUgdGhlIGZkcyAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGxpbmUtPnRzKTsgKytpKQorCQlsaW5lLT50c1tpXS5kcml2ZXIuaXBhY2Nlc3MuZmQuZmQgPSAtMTsKKworCWUxaV90cyA9ICZsaW5lLT50c1tpZHhdOworCisJYmZkID0gJmUxaV90cy0+ZHJpdmVyLmlwYWNjZXNzLmZkOworCWJmZC0+ZmQgPSByZXQ7CisJYmZkLT5kYXRhID0gbGluZTsKKwliZmQtPnByaXZfbnIgPSBQUklWX09NTDsKKwliZmQtPmNiID0gaXBhY2Nlc3NfZmRfY2I7CisJYmZkLT53aGVuID0gQlNDX0ZEX1JFQUQ7CisJcmV0ID0gYnNjX3JlZ2lzdGVyX2ZkKGJmZCk7CisJaWYgKHJldCA8IDApIHsKKwkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAiY291bGQgbm90IHJlZ2lzdGVyIEZEXG4iKTsKKwkJY2xvc2UoYmZkLT5mZCk7CisJCXRhbGxvY19mcmVlKGxpbmUpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIFJlcXVlc3QgSUQuIEZJWE1FOiByZXF1ZXN0IExPQ0FUSU9OLCBIVy9TVyBWRXJzaW9uLCBVbml0IE5hbWUsIFNlcm5vICovCisJcmV0ID0gaXBhY2Nlc3Nfc2VuZF9pZF9yZXEoYmZkLT5mZCk7CisKKyAgICAgICAgcmV0dXJuIHJldDsKKwkvL3JldHVybiBlMWlucF9saW5lX3JlZ2lzdGVyKGxpbmUpOworfQorCitzdGF0aWMgaW50IHJzbF9saXN0ZW5fZmRfY2Ioc3RydWN0IGJzY19mZCAqbGlzdGVuX2JmZCwgdW5zaWduZWQgaW50IHdoYXQpCit7CisJc3RydWN0IHNvY2thZGRyX2luIHNhOworCXNvY2tsZW5fdCBzYV9sZW4gPSBzaXplb2Yoc2EpOworCXN0cnVjdCBic2NfZmQgKmJmZDsKKwlpbnQgcmV0OworCisJaWYgKCEod2hhdCAmIEJTQ19GRF9SRUFEKSkKKwkJcmV0dXJuIDA7CisKKwliZmQgPSB0YWxsb2NfemVybyh0YWxsX2JzY19jdHgsIHN0cnVjdCBic2NfZmQpOworCWlmICghYmZkKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIFNvbWUgQlRTIGhhcyBjb25uZWN0ZWQgdG8gdXMsIGJ1dCB3ZSBkb24ndCBrbm93IHlldCB3aGljaCBsaW5lCisJICogKGFzIGNyZWF0ZWQgYnkgdGhlIE9NTCBsaW5rKSB0byBhc3NvY2lhdGUgaXQgd2l0aC4gIFRodXMsIHdlCisJICogYWxsb2NhdGUgYSB0ZW1wb3JhcnkgYmZkIHVudGlsIHdlIGhhdmUgcmVjZWl2ZWQgSUQgZnJvbSBCVFMgKi8KKworCWJmZC0+ZmQgPSBhY2NlcHQobGlzdGVuX2JmZC0+ZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNhLCAmc2FfbGVuKTsKKwlpZiAoYmZkLT5mZCA8IDApIHsKKwkJcGVycm9yKCJhY2NlcHQiKTsKKwkJcmV0dXJuIGJmZC0+ZmQ7CisJfQorCUxPR1AoRElOUCwgTE9HTF9OT1RJQ0UsICJhY2NlcHQoKWVkIG5ldyBSU0wgbGluayBmcm9tICVzXG4iLCBpbmV0X250b2Eoc2Euc2luX2FkZHIpKTsKKwliZmQtPnByaXZfbnIgPSBQUklWX1JTTDsKKwliZmQtPmNiID0gaXBhY2Nlc3NfZmRfY2I7CisJYmZkLT53aGVuID0gQlNDX0ZEX1JFQUQ7CisJcmV0ID0gYnNjX3JlZ2lzdGVyX2ZkKGJmZCk7CisJaWYgKHJldCA8IDApIHsKKwkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAiY291bGQgbm90IHJlZ2lzdGVyIEZEXG4iKTsKKwkJY2xvc2UoYmZkLT5mZCk7CisJCXRhbGxvY19mcmVlKGJmZCk7CisJCXJldHVybiByZXQ7CisJfQorCS8qIFJlcXVlc3QgSUQuIEZJWE1FOiByZXF1ZXN0IExPQ0FUSU9OLCBIVy9TVyBWRXJzaW9uLCBVbml0IE5hbWUsIFNlcm5vICovCisJcmV0ID0gd3JpdGUoYmZkLT5mZCwgaWRfcmVxLCBzaXplb2YoaWRfcmVxKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYWtlX3NvY2soc3RydWN0IGJzY19mZCAqYmZkLCB1X2ludDE2X3QgcG9ydCwKKwkJICAgICBpbnQgKCpjYikoc3RydWN0IGJzY19mZCAqZmQsIHVuc2lnbmVkIGludCB3aGF0KSkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKKwlpbnQgcmV0LCBvbiA9IDE7CisJCisJYmZkLT5mZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApOworCWJmZC0+Y2IgPSBjYjsKKwliZmQtPndoZW4gPSBCU0NfRkRfUkVBRDsKKwkvL2JmZC0+ZGF0YSA9IGxpbmU7CisKKwlpZiAoYmZkLT5mZCA8IDApIHsKKwkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAiY291bGQgbm90IGNyZWF0ZSBUQ1Agc29ja2V0LlxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCW1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKKwlhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCWFkZHIuc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKKwlhZGRyLnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9BTlk7CisKKwlzZXRzb2Nrb3B0KGJmZC0+ZmQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgJm9uLCBzaXplb2Yob24pKTsKKworCXJldCA9IGJpbmQoYmZkLT5mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwgc2l6ZW9mKGFkZHIpKTsKKwlpZiAocmV0IDwgMCkgeworCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJjb3VsZCBub3QgYmluZCBsMiBzb2NrZXQgJXNcbiIsCisJCQlzdHJlcnJvcihlcnJubykpOworCQljbG9zZShiZmQtPmZkKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0ID0gbGlzdGVuKGJmZC0+ZmQsIDEpOworCWlmIChyZXQgPCAwKSB7CisJCXBlcnJvcigibGlzdGVuIik7CisJCWNsb3NlKGJmZC0+ZmQpOworCQlyZXR1cm4gcmV0OworCX0KKwkKKwlyZXQgPSBic2NfcmVnaXN0ZXJfZmQoYmZkKTsKKwlpZiAocmV0IDwgMCkgeworCQlwZXJyb3IoInJlZ2lzdGVyX2xpc3Rlbl9mZCIpOworCQljbG9zZShiZmQtPmZkKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIEFjdGl2ZWx5IGNvbm5lY3QgdG8gYSBCVFMuICBDdXJyZW50bHkgdXNlZCBieSBpcGFjY2Vzcy1jb25maWcuYyAqLworaW50IGlwYWNjZXNzX2Nvbm5lY3Qoc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUsIHN0cnVjdCBzb2NrYWRkcl9pbiAqc2EpCit7CisJc3RydWN0IGUxaW5wX3RzICplMWlfdHMgPSAmbGluZS0+dHNbMF07CisJc3RydWN0IGJzY19mZCAqYmZkID0gJmUxaV90cy0+ZHJpdmVyLmlwYWNjZXNzLmZkOworCWludCByZXQsIG9uID0gMTsKKworCWJmZC0+ZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKTsKKwliZmQtPmNiID0gaXBhY2Nlc3NfZmRfY2I7CisJYmZkLT53aGVuID0gQlNDX0ZEX1JFQUQgfCBCU0NfRkRfV1JJVEU7CisJYmZkLT5kYXRhID0gbGluZTsKKwliZmQtPnByaXZfbnIgPSBQUklWX09NTDsKKworCWlmIChiZmQtPmZkIDwgMCkgeworCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJjb3VsZCBub3QgY3JlYXRlIFRDUCBzb2NrZXQuXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJc2V0c29ja29wdChiZmQtPmZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZvbiwgc2l6ZW9mKG9uKSk7CisKKwlyZXQgPSBjb25uZWN0KGJmZC0+ZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgc2EsIHNpemVvZigqc2EpKTsKKwlpZiAocmV0IDwgMCkgeworCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJjb3VsZCBub3QgY29ubmVjdCBzb2NrZXRcbiIpOworCQljbG9zZShiZmQtPmZkKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBic2NfcmVnaXN0ZXJfZmQoYmZkKTsKKwlpZiAocmV0IDwgMCkgeworCQljbG9zZShiZmQtPmZkKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJCisJbGluZS0+ZHJpdmVyID0gJmlwYWNjZXNzX2RyaXZlcjsKKworICAgICAgICByZXR1cm4gcmV0OworCS8vcmV0dXJuIGUxaW5wX2xpbmVfcmVnaXN0ZXIobGluZSk7Cit9CisKK2ludCBpcGFjY2Vzc19zZXR1cChzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbW5ldCkKK3sKKwlpbnQgcmV0OworCisJLyogcmVnaXN0ZXIgdGhlIGRyaXZlciB3aXRoIHRoZSBjb3JlICovCisJLyogRklYTUU6IGRvIHRoaXMgaW4gdGhlIHBsdWdpbiBpbml0aWFsaXplciBmdW5jdGlvbiAqLworCXJldCA9IGUxaW5wX2RyaXZlcl9yZWdpc3RlcigmaXBhY2Nlc3NfZHJpdmVyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZTFoID0gdGFsbG9jX3plcm8odGFsbF9ic2NfY3R4LCBzdHJ1Y3QgaWFfZTFfaGFuZGxlKTsKKwlpZiAoIWUxaCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllMWgtPmdzbW5ldCA9IGdzbW5ldDsKKworCS8qIExpc3RlbiBmb3IgT01MIGNvbm5lY3Rpb25zICovCisJcmV0ID0gbWFrZV9zb2NrKCZlMWgtPmxpc3Rlbl9mZCwgSVBBX1RDUF9QT1JUX09NTCwgbGlzdGVuX2ZkX2NiKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIExpc3RlbiBmb3IgUlNMIGNvbm5lY3Rpb25zICovCisJcmV0ID0gbWFrZV9zb2NrKCZlMWgtPnJzbF9saXN0ZW5fZmQsIElQQV9UQ1BfUE9SVF9SU0wsIHJzbF9saXN0ZW5fZmRfY2IpOworCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2lucHV0L21pc2RuLmMgYi9vcGVuYnNjL3NyYy9pbnB1dC9taXNkbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2OTMwZDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9pbnB1dC9taXNkbi5jCkBAIC0wLDAgKzEsNTM2IEBACisvKiBPcGVuQlNDIEFiaXMgaW5wdXQgZHJpdmVyIGZvciBtSVNETnVzZXIgKi8KKworLyogKEMpIDIwMDgtMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzeXMvZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8bUlTRE5pZi5oPgorCisvLyNkZWZpbmUgQUZfQ09NUEFUSUJJTElUWV9GVU5DCisvLyNpbmNsdWRlIDxjb21wYXRfYWZfaXNkbi5oPgorI2lmbmRlZiBBRl9JU0ROCisjZGVmaW5lIEFGX0lTRE4gMzQKKyNkZWZpbmUgUEZfSVNETiBBRl9JU0ROCisjZW5kaWYKKworI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19ubS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19yc2wuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3N1YmNoYW5fZGVtdXguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2UxX2lucHV0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisKKyNkZWZpbmUgVFMxX0FMTE9DX1NJWkUJMzAwCisKK3N0cnVjdCBwcmltX25hbWUgeworCXVuc2lnbmVkIGludCBwcmltOworCWNvbnN0IGNoYXIgKm5hbWU7Cit9OworCitjb25zdCBzdHJ1Y3QgcHJpbV9uYW1lIHByaW1fbmFtZXNbXSA9IHsKKwl7IFBIX0NPTlRST0xfSU5ELCAiUEhfQ09OVFJPTF9JTkQiIH0sCisJeyBQSF9EQVRBX0lORCwgIlBIX0RBVEFfSU5EIiB9LAorCXsgUEhfREFUQV9DTkYsICJQSF9EQVRBX0NORiIgfSwKKwl7IFBIX0FDVElWQVRFX0lORCwgIlBIX0FDVElWQVRFX0lORCIgfSwKKwl7IERMX0VTVEFCTElTSF9JTkQsICJETF9FU1RBQkxJU0hfSU5EIiB9LAorCXsgRExfRVNUQUJMSVNIX0NORiwgIkRMX0VTVEFCTElTSF9DTkYiIH0sCisJeyBETF9SRUxFQVNFX0lORCwgIkRMX1JFTEVBU0VfSU5EIiB9LAorCXsgRExfUkVMRUFTRV9DTkYsICJETF9SRUxFQVNFX0NORiIgfSwKKwl7IERMX0RBVEFfSU5ELCAiRExfREFUQV9JTkQiIH0sCisJeyBETF9VTklUREFUQV9JTkQsICJETF9VTklUREFUQV9JTkQiIH0sCisJeyBETF9JTkZPUk1BVElPTl9JTkQsICJETF9JTkZPUk1BVElPTl9JTkQiIH0sCisJeyBNUEhfQUNUSVZBVEVfSU5ELCAiTVBIX0FDVElWQVRFX0lORCIgfSwKKwl7IE1QSF9ERUFDVElWQVRFX0lORCwgIk1QSF9ERUFDVElWQVRFX0lORCIgfSwKK307CisKK2NvbnN0IGNoYXIgKmdldF9wcmltX25hbWUodW5zaWduZWQgaW50IHByaW0pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwcmltX25hbWVzKTsgaSsrKSB7CisJCWlmIChwcmltX25hbWVzW2ldLnByaW0gPT0gcHJpbSkKKwkJCXJldHVybiBwcmltX25hbWVzW2ldLm5hbWU7CisJfQorCisJcmV0dXJuICJVTktOT1dOIjsKK30KKworc3RhdGljIGludCBoYW5kbGVfdHMxX3JlYWQoc3RydWN0IGJzY19mZCAqYmZkKQoreworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lID0gYmZkLT5kYXRhOworCXVuc2lnbmVkIGludCB0c19uciA9IGJmZC0+cHJpdl9ucjsKKwlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90cyA9ICZsaW5lLT50c1t0c19uci0xXTsKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpsaW5rOworCXN0cnVjdCBtc2diICptc2cgPSBtc2diX2FsbG9jKFRTMV9BTExPQ19TSVpFLCAibUlTRE4gVFMxIik7CisJc3RydWN0IHNvY2thZGRyX21JU0ROIGwyYWRkcjsKKwlzdHJ1Y3QgbUlTRE5oZWFkICpoaDsKKwlzb2NrbGVuX3QgYWxlbjsKKwlpbnQgcmV0OworCisJaWYgKCFtc2cpCisJCXJldHVybiAtRU5PTUVNOworCisJaGggPSAoc3RydWN0IG1JU0ROaGVhZCAqKSBtc2ctPmRhdGE7CisKKwlhbGVuID0gc2l6ZW9mKGwyYWRkcik7CisJcmV0ID0gcmVjdmZyb20oYmZkLT5mZCwgbXNnLT5kYXRhLCAzMDAsIDAsCisJCSAgICAgICAoc3RydWN0IHNvY2thZGRyICopICZsMmFkZHIsICZhbGVuKTsKKwlpZiAocmV0IDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgInJlY3Zmcm9tIGVycm9yICAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoYWxlbiAhPSBzaXplb2YobDJhZGRyKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzIGVycm9yIGxlblxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltc2diX3B1dChtc2csIHJldCk7CisKKwlERUJVR1AoRE1JLCAiYWxlbiA9JWQsIGRldiglZCkgY2hhbm5lbCglZCkgc2FwaSglZCkgdGVpKCVkKVxuIiwKKwkJYWxlbiwgbDJhZGRyLmRldiwgbDJhZGRyLmNoYW5uZWwsIGwyYWRkci5zYXBpLCBsMmFkZHIudGVpKTsKKworCURFQlVHUChETUksICI8PSBsZW4gPSAlZCwgcHJpbSgweCV4KSBpZCgweCV4KTogJXNcbiIsCisJCXJldCwgaGgtPnByaW0sIGhoLT5pZCwgZ2V0X3ByaW1fbmFtZShoaC0+cHJpbSkpOworCisJc3dpdGNoIChoaC0+cHJpbSkgeworCWNhc2UgRExfSU5GT1JNQVRJT05fSU5EOgorCQkvKiBtSVNETiB0ZWxscyB1cyB3aGljaCBjaGFubmVsIG51bWJlciBpcyBhbGxvY2F0ZWQgZm9yIHRoaXMKKwkJICogdHVwbGUgb2YgKFNBUEksIFRFSSkuICovCisJCURFQlVHUChETUksICJETF9JTkZPUk1BVElPTl9JTkQ6IHVzZSBjaGFubmVsKCVkKSBzYXBpKCVkKSB0ZWkoJWQpIGZvciBub3dcbiIsCisJCQlsMmFkZHIuY2hhbm5lbCwgbDJhZGRyLnNhcGksIGwyYWRkci50ZWkpOworCQlsaW5rID0gZTFpbnBfbG9va3VwX3NpZ25fbGluayhlMWlfdHMsIGwyYWRkci50ZWksIGwyYWRkci5zYXBpKTsKKwkJaWYgKCFsaW5rKSB7CisJCQlERUJVR1BDKERNSSwgIm1JU0ROIG1lc3NhZ2UgZm9yIHVua25vd24gc2lnbl9saW5rXG4iKTsKKwkJCW1zZ2JfZnJlZShtc2cpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJLyogc2F2ZSB0aGUgY2hhbm5lbCBudW1iZXIgaW4gdGhlIGRyaXZlciBwcml2YXRlIHN0cnVjdCAqLworCQlsaW5rLT5kcml2ZXIubWlzZG4uY2hhbm5lbCA9IGwyYWRkci5jaGFubmVsOworCQlicmVhazsKKwljYXNlIERMX0VTVEFCTElTSF9JTkQ6CisJCURFQlVHUChETUksICJETF9FU1RBQkxJU0hfSU5EOiBjaGFubmVsKCVkKSBzYXBpKCVkKSB0ZWkoJWQpXG4iLAorCQlsMmFkZHIuY2hhbm5lbCwgbDJhZGRyLnNhcGksIGwyYWRkci50ZWkpOworCQlyZXQgPSBlMWlucF9ldmVudChlMWlfdHMsIEVWVF9FMV9URUlfVVAsIGwyYWRkci50ZWksIGwyYWRkci5zYXBpKTsKKwkJYnJlYWs7CisJY2FzZSBETF9SRUxFQVNFX0lORDoKKwkJREVCVUdQKERNSSwgIkRMX1JFTEVBU0VfSU5EOiBjaGFubmVsKCVkKSBzYXBpKCVkKSB0ZWkoJWQpXG4iLAorCQlsMmFkZHIuY2hhbm5lbCwgbDJhZGRyLnNhcGksIGwyYWRkci50ZWkpOworCQlyZXQgPSBlMWlucF9ldmVudChlMWlfdHMsIEVWVF9FMV9URUlfRE4sIGwyYWRkci50ZWksIGwyYWRkci5zYXBpKTsKKwkJYnJlYWs7CisJY2FzZSBETF9EQVRBX0lORDoKKwljYXNlIERMX1VOSVREQVRBX0lORDoKKwkJbXNnLT5sMmggPSBtc2ctPmRhdGEgKyBNSVNETl9IRUFERVJfTEVOOworCQlERUJVR1AoRE1JLCAiUlg6ICVzXG4iLCBoZXhkdW1wKG1zZ2JfbDIobXNnKSwgcmV0IC0gTUlTRE5fSEVBREVSX0xFTikpOworCQlyZXQgPSBlMWlucF9yeF90cyhlMWlfdHMsIG1zZywgbDJhZGRyLnRlaSwgbDJhZGRyLnNhcGkpOworCQlicmVhazsKKwljYXNlIFBIX0FDVElWQVRFX0lORDoKKwkJREVCVUdQKERNSSwgIlBIX0FDVElWQVRFX0lORDogY2hhbm5lbCglZCkgc2FwaSglZCkgdGVpKCVkKVxuIiwKKwkJbDJhZGRyLmNoYW5uZWwsIGwyYWRkci5zYXBpLCBsMmFkZHIudGVpKTsKKwkJYnJlYWs7CisJY2FzZSBQSF9ERUFDVElWQVRFX0lORDoKKwkJREVCVUdQKERNSSwgIlBIX0RFQUNUSVZBVEVfSU5EOiBjaGFubmVsKCVkKSBzYXBpKCVkKSB0ZWkoJWQpXG4iLAorCQlsMmFkZHIuY2hhbm5lbCwgbDJhZGRyLnNhcGksIGwyYWRkci50ZWkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0c193YW50X3dyaXRlKHN0cnVjdCBlMWlucF90cyAqZTFpX3RzKQoreworCS8qIFdlIG5ldmVyIGluY2x1ZGUgdGhlIG1JU0ROIEItQ2hhbm5lbCBGRCBpbnRvIHRoZQorCSAqIHdyaXRlc2V0LCBzaW5jZSBpdCBkb2Vzbid0IHN1cHBvcnQgcG9sbCgpIGJhc2VkCisJICogd3JpdGUgZmxvdyBjb250cm9sICovCQkKKwlpZiAoZTFpX3RzLT50eXBlID09IEUxSU5QX1RTX1RZUEVfVFJBVSkKKwkJcmV0dXJuIDA7CisKKwllMWlfdHMtPmRyaXZlci5taXNkbi5mZC53aGVuIHw9IEJTQ19GRF9XUklURTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0aW1lb3V0X3RzMV93cml0ZSh2b2lkICpkYXRhKQoreworCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzID0gKHN0cnVjdCBlMWlucF90cyAqKWRhdGE7CisKKwkvKiB0cmlnZ2VyIHdyaXRlIG9mIHRzMSwgZHVlIHRvIHR4IGRlbGF5IHRpbWVyICovCisJdHNfd2FudF93cml0ZShlMWlfdHMpOworfQorCitzdGF0aWMgaW50IGhhbmRsZV90czFfd3JpdGUoc3RydWN0IGJzY19mZCAqYmZkKQoreworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lID0gYmZkLT5kYXRhOworCXVuc2lnbmVkIGludCB0c19uciA9IGJmZC0+cHJpdl9ucjsKKwlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90cyA9ICZsaW5lLT50c1t0c19uci0xXTsKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpzaWduX2xpbms7CisJc3RydWN0IHNvY2thZGRyX21JU0ROIHNhOworCXN0cnVjdCBtc2diICptc2c7CisJc3RydWN0IG1JU0ROaGVhZCAqaGg7CisJdV9pbnQ4X3QgKmwyX2RhdGE7CisJaW50IHJldDsKKworCWJmZC0+d2hlbiAmPSB+QlNDX0ZEX1dSSVRFOworCisJLyogZ2V0IHRoZSBuZXh0IG1zZyBmb3IgdGhpcyB0aW1lc2xvdCAqLworCW1zZyA9IGUxaW5wX3R4X3RzKGUxaV90cywgJnNpZ25fbGluayk7CisJaWYgKCFtc2cpIHsKKwkJLyogbm8gbWVzc2FnZSBhZnRlciB0eCBkZWxheSB0aW1lciAqLworCQlyZXR1cm4gMDsKKwl9CisKKwlsMl9kYXRhID0gbXNnLT5kYXRhOworCisJLyogcHJlcGVuZCB0aGUgbUlTRE5oZWFkICovCisJaGggPSAoc3RydWN0IG1JU0ROaGVhZCAqKSBtc2diX3B1c2gobXNnLCBzaXplb2YoKmhoKSk7CisJaGgtPnByaW0gPSBETF9EQVRBX1JFUTsKKworCURFQlVHUChETUksICJUWCBURUkoJWQpIFNBUEkoJWQpOiAlc1xuIiwgc2lnbl9saW5rLT50ZWksCisJCXNpZ25fbGluay0+c2FwaSwgaGV4ZHVtcChsMl9kYXRhLCBtc2ctPmxlbiAtIE1JU0ROX0hFQURFUl9MRU4pKTsKKworCS8qIGNvbnN0cnVjdCB0aGUgc29ja2FkZHIgKi8KKwlzYS5mYW1pbHkgPSBBRl9JU0ROOworCXNhLnNhcGkgPSBzaWduX2xpbmstPnNhcGk7CisJc2EuZGV2ID0gc2lnbl9saW5rLT50ZWk7CisJc2EuY2hhbm5lbCA9IHNpZ25fbGluay0+ZHJpdmVyLm1pc2RuLmNoYW5uZWw7CisKKwlyZXQgPSBzZW5kdG8oYmZkLT5mZCwgbXNnLT5kYXRhLCBtc2ctPmxlbiwgMCwKKwkJICAgICAoc3RydWN0IHNvY2thZGRyICopJnNhLCBzaXplb2Yoc2EpKTsKKwlpZiAocmV0IDwgMCkKKwkJZnByaW50ZihzdGRlcnIsICIlcyBzZW5kdG8gZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwltc2diX2ZyZWUobXNnKTsKKworCS8qIHNldCB0eCBkZWxheSB0aW1lciBmb3IgbmV4dCBldmVudCAqLworCWUxaV90cy0+c2lnbi50eF90aW1lci5jYiA9IHRpbWVvdXRfdHMxX3dyaXRlOworCWUxaV90cy0+c2lnbi50eF90aW1lci5kYXRhID0gZTFpX3RzOworCWJzY19zY2hlZHVsZV90aW1lcigmZTFpX3RzLT5zaWduLnR4X3RpbWVyLCAwLCA1MDAwMCk7CisKKwlyZXR1cm4gcmV0OworfQorCisjZGVmaW5lIEJDSEFOX1RYX0dSQU4JMTYwCisvKiB3cml0ZSB0byBhIEIgY2hhbm5lbCBUUyAqLworc3RhdGljIGludCBoYW5kbGVfdHNYX3dyaXRlKHN0cnVjdCBic2NfZmQgKmJmZCkKK3sKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSA9IGJmZC0+ZGF0YTsKKwl1bnNpZ25lZCBpbnQgdHNfbnIgPSBiZmQtPnByaXZfbnI7CisJc3RydWN0IGUxaW5wX3RzICplMWlfdHMgPSAmbGluZS0+dHNbdHNfbnItMV07CisJc3RydWN0IG1JU0ROaGVhZCAqaGg7CisJdV9pbnQ4X3QgdHhfYnVmW0JDSEFOX1RYX0dSQU4gKyBzaXplb2YoKmhoKV07CisJc3RydWN0IHN1YmNoX211eCAqbXggPSAmZTFpX3RzLT50cmF1Lm11eDsKKwlpbnQgcmV0OworCisJaGggPSAoc3RydWN0IG1JU0ROaGVhZCAqKSB0eF9idWY7CisJaGgtPnByaW0gPSBQSF9EQVRBX1JFUTsKKworCXN1YmNoYW5fbXV4X291dChteCwgdHhfYnVmK3NpemVvZigqaGgpLCBCQ0hBTl9UWF9HUkFOKTsKKworCURFQlVHUChETUlCLCAiQkNIQU4gVFg6ICVzXG4iLAorCQloZXhkdW1wKHR4X2J1ZitzaXplb2YoKmhoKSwgQkNIQU5fVFhfR1JBTikpOworCisJcmV0ID0gc2VuZChiZmQtPmZkLCB0eF9idWYsIHNpemVvZigqaGgpICsgQkNIQU5fVFhfR1JBTiwgMCk7CisJaWYgKHJldCA8IHNpemVvZigqaGgpICsgQkNIQU5fVFhfR1JBTikKKwkJREVCVUdQKERNSUIsICJzZW5kIHJldHVybnMgJWQgaW5zdGVhZCBvZiAlbHVcbiIsIHJldCwKKwkJCXNpemVvZigqaGgpICsgQkNIQU5fVFhfR1JBTik7CisKKwlyZXR1cm4gcmV0OworfQorCisjZGVmaW5lIFRTWF9BTExPQ19TSVpFIDQwOTYKKy8qIEZJWE1FOiByZWFkIGZyb20gYSBCIGNoYW5uZWwgVFMgKi8KK3N0YXRpYyBpbnQgaGFuZGxlX3RzWF9yZWFkKHN0cnVjdCBic2NfZmQgKmJmZCkKK3sKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSA9IGJmZC0+ZGF0YTsKKwl1bnNpZ25lZCBpbnQgdHNfbnIgPSBiZmQtPnByaXZfbnI7CisJc3RydWN0IGUxaW5wX3RzICplMWlfdHMgPSAmbGluZS0+dHNbdHNfbnItMV07CisJc3RydWN0IG1zZ2IgKm1zZyA9IG1zZ2JfYWxsb2MoVFNYX0FMTE9DX1NJWkUsICJtSVNETiBUU3giKTsKKwlzdHJ1Y3QgbUlTRE5oZWFkICpoaDsKKwlpbnQgcmV0OworCisJaWYgKCFtc2cpCisJCXJldHVybiAtRU5PTUVNOworCisJaGggPSAoc3RydWN0IG1JU0ROaGVhZCAqKSBtc2ctPmRhdGE7CisKKwlyZXQgPSByZWN2KGJmZC0+ZmQsIG1zZy0+ZGF0YSwgVFNYX0FMTE9DX1NJWkUsIDApOworCWlmIChyZXQgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAicmVjdmZyb20gZXJyb3IgICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gcmV0OworCX0KKworCW1zZ2JfcHV0KG1zZywgcmV0KTsKKworCWlmIChoaC0+cHJpbSAhPSBQSF9DT05UUk9MX0lORCkKKwkJREVCVUdQKERNSUIsICI8PSBCQ0hBTiBsZW4gPSAlZCwgcHJpbSgweCV4KSBpZCgweCV4KTogJXNcbiIsCisJCQlyZXQsIGhoLT5wcmltLCBoaC0+aWQsIGdldF9wcmltX25hbWUoaGgtPnByaW0pKTsKKworCXN3aXRjaCAoaGgtPnByaW0pIHsKKwljYXNlIFBIX0RBVEFfSU5EOgorCQltc2ctPmwyaCA9IG1zZy0+ZGF0YSArIE1JU0ROX0hFQURFUl9MRU47CisJCURFQlVHUChETUlCLCAiQkNIQU4gUlg6ICVzXG4iLAorCQkJaGV4ZHVtcChtc2diX2wyKG1zZyksIHJldCAtIE1JU0ROX0hFQURFUl9MRU4pKTsKKwkJcmV0ID0gZTFpbnBfcnhfdHMoZTFpX3RzLCBtc2csIDAsIDApOworCQlicmVhazsKKwljYXNlIFBIX0FDVElWQVRFX0lORDoKKwljYXNlIFBIX0RBVEFfQ05GOgorCQkvKiBwaHlzaWNhbCBsYXllciBpbmRpY2F0ZXMgdGhhdCBkYXRhIGhhcyBiZWVuIHNlbnQsCisJCSAqIHdlIHRodXMgY2FuIHNlbmQgc29tZSBtb3JlIGRhdGEgKi8KKwkJcmV0ID0gaGFuZGxlX3RzWF93cml0ZShiZmQpOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwkvKiBGSVhNRTogd2h5IGRvIHdlIGZyZWUgc2lnbmFsbGluZyBtc2dzIGluIHRoZSBjYWxsZXIsIGFuZCB0cmF1IG5vdD8gKi8KKwltc2diX2ZyZWUobXNnKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIGNhbGxiYWNrIGZyb20gc2VsZWN0LmMgaW4gY2FzZSBvbmUgb2YgdGhlIGZkJ3MgY2FuIGJlIHJlYWQvd3JpdHRlbiAqLworc3RhdGljIGludCBtaXNkbl9mZF9jYihzdHJ1Y3QgYnNjX2ZkICpiZmQsIHVuc2lnbmVkIGludCB3aGF0KQoreworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lID0gYmZkLT5kYXRhOworCXVuc2lnbmVkIGludCB0c19uciA9IGJmZC0+cHJpdl9ucjsKKwl1bnNpZ25lZCBpbnQgaWR4ID0gdHNfbnItMTsKKwlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90cyA9ICZsaW5lLT50c1tpZHhdOworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKGUxaV90cy0+dHlwZSkgeworCWNhc2UgRTFJTlBfVFNfVFlQRV9TSUdOOgorCQlpZiAod2hhdCAmIEJTQ19GRF9SRUFEKQorCQkJcmMgPSBoYW5kbGVfdHMxX3JlYWQoYmZkKTsKKwkJaWYgKHdoYXQgJiBCU0NfRkRfV1JJVEUpCisJCQlyYyA9IGhhbmRsZV90czFfd3JpdGUoYmZkKTsKKwkJYnJlYWs7CisJY2FzZSBFMUlOUF9UU19UWVBFX1RSQVU6CisJCWlmICh3aGF0ICYgQlNDX0ZEX1JFQUQpCisJCQlyYyA9IGhhbmRsZV90c1hfcmVhZChiZmQpOworCQkvKiBXZSBuZXZlciBpbmNsdWRlIHRoZSBtSVNETiBCLUNoYW5uZWwgRkQgaW50byB0aGUKKwkJICogd3JpdGVzZXQsIHNpbmNlIGl0IGRvZXNuJ3Qgc3VwcG9ydCBwb2xsKCkgYmFzZWQKKwkJICogd3JpdGUgZmxvdyBjb250cm9sICovCQkKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZnByaW50ZihzdGRlcnIsICJ1bmtub3duIEUxIFRTIHR5cGUgJXVcbiIsIGUxaV90cy0+dHlwZSk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBhY3RpdmF0ZV9iY2hhbihzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSwgaW50IHRzLCBpbnQgYWN0KQoreworCXN0cnVjdCBtSVNETmhlYWQgaGg7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgaWR4ID0gdHMtMTsKKwlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90cyA9ICZsaW5lLT50c1tpZHhdOworCXN0cnVjdCBic2NfZmQgKmJmZCA9ICZlMWlfdHMtPmRyaXZlci5taXNkbi5mZDsKKworCWZwcmludGYoc3Rkb3V0LCAiYWN0aXZhdGUgYmNoYW5cbiIpOworCWlmIChhY3QpCisJCWhoLnByaW0gPSBQSF9BQ1RJVkFURV9SRVE7CisJZWxzZQorCQloaC5wcmltID0gUEhfREVBQ1RJVkFURV9SRVE7CisKKwloaC5pZCA9IE1JU0ROX0lEX0FOWTsKKwlyZXQgPSBzZW5kdG8oYmZkLT5mZCwgJmhoLCBzaXplb2YoaGgpLCAwLCBOVUxMLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlmcHJpbnRmKHN0ZG91dCwgImNvdWxkIG5vdCBzZW5kIEFDVElWQVRFX1JRICVzXG4iLAorCQkJc3RyZXJyb3IoZXJybm8pKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdHJ1Y3QgZTFpbnBfZHJpdmVyIG1pc2RuX2RyaXZlciA9IHsKKwkubmFtZSA9ICJtSVNETnVzZXIiLAorCS53YW50X3dyaXRlID0gdHNfd2FudF93cml0ZSwKK307CisKK3N0YXRpYyBpbnQgbWlfZTFfc2V0dXAoc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUsIGludCByZWxlYXNlX2wyKQoreworCWludCB0cywgcmV0OworCisJLyogVFMwIGlzIENSQzQsIGRvbid0IG5lZWQgYW55IGZkIGZvciBpdCAqLworCWZvciAodHMgPSAxOyB0cyA8IE5VTV9FMV9UUzsgdHMrKykgeworCQl1bnNpZ25lZCBpbnQgaWR4ID0gdHMtMTsKKwkJc3RydWN0IGUxaW5wX3RzICplMWlfdHMgPSAmbGluZS0+dHNbaWR4XTsKKwkJc3RydWN0IGJzY19mZCAqYmZkID0gJmUxaV90cy0+ZHJpdmVyLm1pc2RuLmZkOworCQlzdHJ1Y3Qgc29ja2FkZHJfbUlTRE4gYWRkcjsKKworCQliZmQtPmRhdGEgPSBsaW5lOworCQliZmQtPnByaXZfbnIgPSB0czsKKwkJYmZkLT5jYiA9IG1pc2RuX2ZkX2NiOworCisJCXN3aXRjaCAoZTFpX3RzLT50eXBlKSB7CisJCWNhc2UgRTFJTlBfVFNfVFlQRV9OT05FOgorCQkJY29udGludWU7CisJCQlicmVhazsKKwkJY2FzZSBFMUlOUF9UU19UWVBFX1NJR046CisJCQliZmQtPmZkID0gc29ja2V0KFBGX0lTRE4sIFNPQ0tfREdSQU0sIElTRE5fUF9MQVBEX05UKTsKKwkJCWJmZC0+d2hlbiA9IEJTQ19GRF9SRUFEOworCQkJYnJlYWs7CisJCWNhc2UgRTFJTlBfVFNfVFlQRV9UUkFVOgorCQkJYmZkLT5mZCA9IHNvY2tldChQRl9JU0ROLCBTT0NLX0RHUkFNLCBJU0ROX1BfQl9SQVcpOworCQkJLyogV2UgbmV2ZXIgaW5jbHVkZSB0aGUgbUlTRE4gQi1DaGFubmVsIEZEIGludG8gdGhlCisJIAkJKiB3cml0ZXNldCwgc2luY2UgaXQgZG9lc24ndCBzdXBwb3J0IHBvbGwoKSBiYXNlZAorCSAJCSogd3JpdGUgZmxvdyBjb250cm9sICovCQkKKwkJCWJmZC0+d2hlbiA9IEJTQ19GRF9SRUFEOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoYmZkLT5mZCA8IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiJXMgY291bGQgbm90IG9wZW4gc29ja2V0ICVzXG4iLAorCQkJCV9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuIGJmZC0+ZmQ7CisJCX0KKworCQltZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7CisJCWFkZHIuZmFtaWx5ID0gQUZfSVNETjsKKwkJYWRkci5kZXYgPSBsaW5lLT5udW07CisJCXN3aXRjaCAoZTFpX3RzLT50eXBlKSB7CisJCWNhc2UgRTFJTlBfVFNfVFlQRV9TSUdOOgorCQkJYWRkci5jaGFubmVsID0gMDsKKwkJCS8qIFNBUEkgbm90IHN1cHBvcnRlZCB5ZXQgaW4ga2VybmVsICovCisJCQkvL2FkZHIuc2FwaSA9IGUxaW5wX3RzLT5zaWduLnNhcGk7CisJCQlhZGRyLnNhcGkgPSAwOworCQkJYWRkci50ZWkgPSBHUk9VUF9URUk7CisJCQlicmVhazsKKwkJY2FzZSBFMUlOUF9UU19UWVBFX1RSQVU6CisJCQlhZGRyLmNoYW5uZWwgPSB0czsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJREVCVUdQKERNSSwgInVuc3VwcG9ydGVkIEUxIFRTIHR5cGU6ICV1XG4iLAorCQkJCWUxaV90cy0+dHlwZSk7CisJCQlicmVhazsKKwkJfQorCisJCXJldCA9IGJpbmQoYmZkLT5mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwgc2l6ZW9mKGFkZHIpKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiY291bGQgbm90IGJpbmQgbDIgc29ja2V0ICVzXG4iLAorCQkJCXN0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCWlmIChlMWlfdHMtPnR5cGUgPT0gRTFJTlBfVFNfVFlQRV9TSUdOKSB7CisJCQlyZXQgPSBpb2N0bChiZmQtPmZkLCBJTUNMRUFSX0wyLCAmcmVsZWFzZV9sMik7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiY291bGQgbm90IHNlbmQgSU9DVEwgSU1DTEVBTl9MMiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJfQorCisJCS8qIEZJWE1FOiBvbmx5IGFjdGl2YXRlIEItQ2hhbm5lbHMgb25jZSB3ZSBzdGFydCB0bworCQkgKiB1c2UgdGhlbSB0byBjb25zZXJ2ZSBDUFUgcG93ZXIgKi8KKwkJaWYgKGUxaV90cy0+dHlwZSA9PSBFMUlOUF9UU19UWVBFX1RSQVUpCisJCQlhY3RpdmF0ZV9iY2hhbihsaW5lLCB0cywgMSk7CisKKwkJcmV0ID0gYnNjX3JlZ2lzdGVyX2ZkKGJmZCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCByZWdpc3RlciBGRDogJXNcbiIsCisJCQkJc3RyZXJyb3IocmV0KSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBtaV9lMV9saW5lX3VwZGF0ZShzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSkKK3sKKwlzdHJ1Y3QgbUlTRE5fZGV2aW5mbyBkZXZpbmZvOworCWludCBzaywgcmV0LCBjbnQ7CisKKwlpZiAoIWxpbmUtPmRyaXZlcikgeworCQkvKiB0aGlzIG11c3QgYmUgdGhlIGZpcnN0IHVwZGF0ZSAqLworCQlsaW5lLT5kcml2ZXIgPSAmbWlzZG5fZHJpdmVyOworCX0gZWxzZSB7CisJCS8qIHRoaXMgaXMgYSBzdWJzZXF1ZW50IHVwZGF0ZSAqLworCQkvKiBGSVhNRTogZmlyc3QgY2xvc2UgYWxsIHNvY2tldHMgKi8KKwkJZnByaW50ZihzdGRlcnIsICJpbmNyZW1lbnRhbCBsaW5lIHVwZGF0ZXMgbm90IHN1cHBvcnRlZCB5ZXRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobGluZS0+ZHJpdmVyICE9ICZtaXNkbl9kcml2ZXIpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogb3BlbiB0aGUgSVNETiBjYXJkIGRldmljZSAqLworCXNrID0gc29ja2V0KFBGX0lTRE4sIFNPQ0tfUkFXLCBJU0ROX1BfQkFTRSk7CisJaWYgKHNrIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzIGNvdWxkIG5vdCBvcGVuIHNvY2tldCAlc1xuIiwKKwkJCV9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gc2s7CisJfQorCisJcmV0ID0gaW9jdGwoc2ssIElNR0VUQ09VTlQsICZjbnQpOworCWlmIChyZXQpIHsKKwkJZnByaW50ZihzdGRlcnIsICIlcyBlcnJvciBnZXR0aW5nIGludGVyZiBjb3VudDogJXNcbiIsCisJCQlfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKKwkJY2xvc2Uoc2spOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJLy9ERUJVR1AoRE1JLCIlZCBkZXZpY2UlcyBmb3VuZFxuIiwgY250LCAoY250PT0xKT8iIjoicyIpOworCXByaW50ZigiJWQgZGV2aWNlJXMgZm91bmRcbiIsIGNudCwgKGNudD09MSk/IiI6InMiKTsKKyNpZiAxCisJZGV2aW5mby5pZCA9IGxpbmUtPm51bTsKKwlyZXQgPSBpb2N0bChzaywgSU1HRVRERVZJTkZPLCAmZGV2aW5mbyk7CisJaWYgKHJldCA8IDApIHsKKwkJZnByaW50ZihzdGRvdXQsICJlcnJvciBnZXR0aW5nIGluZm8gZm9yIGRldmljZSAlZDogJXNcbiIsCisJCQlsaW5lLT5udW0sIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlmcHJpbnRmKHN0ZG91dCwgIiAgICAgICAgaWQ6ICAgICAgICAgICAgICVkXG4iLCBkZXZpbmZvLmlkKTsKKwlmcHJpbnRmKHN0ZG91dCwgIiAgICAgICAgRHByb3RvY29sczogICAgICUwOHhcbiIsIGRldmluZm8uRHByb3RvY29scyk7CisJZnByaW50ZihzdGRvdXQsICIgICAgICAgIEJwcm90b2NvbHM6ICAgICAlMDh4XG4iLCBkZXZpbmZvLkJwcm90b2NvbHMpOworCWZwcmludGYoc3Rkb3V0LCAiICAgICAgICBwcm90b2NvbDogICAgICAgJWRcbiIsIGRldmluZm8ucHJvdG9jb2wpOworCWZwcmludGYoc3Rkb3V0LCAiICAgICAgICBucmJjaGFuOiAgICAgICAgJWRcbiIsIGRldmluZm8ubnJiY2hhbik7CisJZnByaW50ZihzdGRvdXQsICIgICAgICAgIG5hbWU6ICAgICAgICAgICAlc1xuIiwgZGV2aW5mby5uYW1lKTsKKyNlbmRpZgorCisJaWYgKCEoZGV2aW5mby5EcHJvdG9jb2xzICYgKDEgPDwgSVNETl9QX05UX0UxKSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJlcnJvcjogY2FyZCBpcyBub3Qgb2YgdHlwZSBFMSAoTlQtbW9kZSlcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSBtaV9lMV9zZXR1cChsaW5lLCAxKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2F0dHJpYnV0ZV9fKChjb25zdHJ1Y3RvcikpIHZvaWQgb25fZHNvX2xvYWRfc21zKHZvaWQpCit7CisJLyogcmVnaXN0ZXIgdGhlIGRyaXZlciB3aXRoIHRoZSBjb3JlICovCisJZTFpbnBfZHJpdmVyX3JlZ2lzdGVyKCZtaXNkbl9kcml2ZXIpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvaXBhY2Nlc3MvaXBhY2Nlc3MtY29uZmlnLmMgYi9vcGVuYnNjL3NyYy9pcGFjY2Vzcy9pcGFjY2Vzcy1jb25maWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzA5NTBkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvaXBhY2Nlc3MvaXBhY2Nlc3MtY29uZmlnLmMKQEAgLTAsMCArMSw3MzUgQEAKKy8qIGlwLmFjY2VzcyBuYW5vQlRTIGNvbmZpZ3VyYXRpb24gdG9vbCAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIKKyAqIChDKSAyMDA5IGJ5IE9uIFdhdmVzCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworCisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGltZXIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2lwYWNjZXNzLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZTFfaW5wdXQuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfbm0uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKworc3RhdGljIHN0cnVjdCBnc21fbmV0d29yayAqZ3NtbmV0OworCitzdGF0aWMgaW50IG5ldF9saXN0ZW5fdGVzdG5yOworc3RhdGljIGludCByZXN0YXJ0Oworc3RhdGljIGNoYXIgKnByaW1fb21sX2lwOworc3RhdGljIGNoYXIgKnVuaXRfaWQ7CitzdGF0aWMgdV9pbnQxNl90IG52X2ZsYWdzOworc3RhdGljIHVfaW50MTZfdCBudl9tYXNrOworc3RhdGljIGNoYXIgKnNvZnR3YXJlID0gTlVMTDsKK3N0YXRpYyBpbnQgc3dfbG9hZF9zdGF0ZSA9IDA7CitzdGF0aWMgaW50IG9tbF9zdGF0ZSA9IDA7CitzdGF0aWMgaW50IGR1bXBfZmlsZXMgPSAwOworc3RhdGljIGNoYXIgKmZpcm13YXJlX2FuYWx5c2lzID0gTlVMTDsKKworc3RydWN0IHN3X2xvYWQgeworCXVfaW50OF90IGZpbGVfaWRbMjU1XTsKKwl1X2ludDhfdCBmaWxlX2lkX2xlbjsKKworCXVfaW50OF90IGZpbGVfdmVyc2lvblsyNTVdOworCXVfaW50OF90IGZpbGVfdmVyc2lvbl9sZW47Cit9OworCitzdGF0aWMgdm9pZCAqdGFsbF9jdHhfY29uZmlnID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3Qgc3dfbG9hZCAqc3dfbG9hZDEgPSBOVUxMOworc3RhdGljIHN0cnVjdCBzd19sb2FkICpzd19sb2FkMiA9IE5VTEw7CisKKy8qCitzdGF0aWMgdV9pbnQ4X3QgcHJpbV9vbWxfYXR0cltdID0geyAweDk1LCAweDAwLCA3LCAweDg4LCAxOTIsIDE2OCwgMTAwLCAxMSwgMHgwMCwgMHgwMCB9Oworc3RhdGljIHVfaW50OF90IHVuaXRfaWRfYXR0cltdID0geyAweDkxLCAweDAwLCA5LCAnMicsICczJywgJzQnLCAnMicsICcvJyAsICcwJywgJy8nLCAnMCcsIDB4MDAgfTsKKyovCisKKy8qCisgKiBDYWxsYmFjayBmdW5jdGlvbiBmb3IgTkFDSyBvbiB0aGUgT01MIE5NCisgKgorICogQ3VycmVudGx5IHdlIHNlbmQgdGhlIGNvbmZpZyByZXF1ZXN0cyBidXQgZG9uJ3QgY2hlY2sgdGhlCisgKiByZXN1bHQuIFRoZSBuYW5vQlRTIHdpbGwgc2VuZCB1cyBhIE5BQ0sgd2hlbiB3ZSBkaWQgc29tZXRoaW5nIHRoZQorICogQlRTIGRpZG4ndCBsaWtlLgorICovCitzdGF0aWMgaW50IGlwYWNjX21zZ19uYWNrKHVfaW50OF90IG10KQoreworCWZwcmludGYoc3RkZXJyLCAiRmFpbHVyZSB0byBzZXQgYXR0cmlidXRlLiBUaGlzIHNlZW1zIGZhdGFsXG4iKTsKKwlleGl0KC0xKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcGFjY19tc2dfYWNrKHVfaW50OF90IG10LCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCWlmIChzd19sb2FkX3N0YXRlID09IDEpIHsKKwkJZnByaW50ZihzdGRlcnIsICJUaGUgbmV3IHNvZnR3YXJlIGlzIGFjdGl2YWVkLlxuIik7CisKKwkJaWYgKHJlc3RhcnQpIHsKKwkJCWFiaXNfbm1faXBhY2Nlc3NfcmVzdGFydChidHMpOworCQl9IGVsc2UgeworCQkJZXhpdCgwKTsKKwkJfQorCX0gZWxzZSBpZiAob21sX3N0YXRlID09IDEpIHsKKwkJZnByaW50ZihzdGRlcnIsICJTZXQgdGhlIHByaW1hcnkgT01MIElQLlxuIik7CisJCWlmIChyZXN0YXJ0KSB7CisJCQlhYmlzX25tX2lwYWNjZXNzX3Jlc3RhcnQoYnRzKTsKKwkJfSBlbHNlIHsKKwkJCWV4aXQoMCk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGlwYWNjX2ZlcnJfZWxlbSB7CisJaW50MTZfdCBmcmVxX2VycjsKKwl1X2ludDhfdCBmcmVxX3F1YWw7CisJdV9pbnQ4X3QgYXJmY247Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgaXBhY2NfY3VzYWdlX2VsZW0geworCXVfaW50MTZfdCBhcmZjbjoxMCwKKwkJICByeGxldjo2OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0YXRpYyBpbnQgdGVzdF9yZXAodm9pZCAqX21zZykKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gX21zZzsKKwlzdHJ1Y3QgYWJpc19vbV9mb21faGRyICpmb2ggPSBtc2diX2wzKG1zZyk7CisJdV9pbnQxNl90IHRlc3RfcmVwX2xlbiwgZmVycl9saXN0X2xlbjsKKwlzdHJ1Y3QgaXBhY2NfZmVycl9lbGVtICppZmU7CisJc3RydWN0IGlwYWNfYmNjaF9pbmZvIGJpbmZvOworCWludCBpLCByYzsKKworCURFQlVHUChETk0sICJURVNUIFJFUE9SVDogIik7CisKKwlpZiAoZm9oLT5kYXRhWzBdICE9IE5NX0FUVF9URVNUX05PIHx8CisJICAgIGZvaC0+ZGF0YVsyXSAhPSBOTV9BVFRfVEVTVF9SRVBPUlQpCisJCXJldHVybiAtRUlOVkFMOworCisJREVCVUdQQyhETk0sICJ0ZXN0X25vPTB4JTAyeCAiLCBmb2gtPmRhdGFbMV0pOworCS8qIGRhdGFbMl0gPT0gTk1fQVRUX1RFU1RfUkVQT1JUICovCisJLyogZGF0YVszLi40XTogdGVzdF9yZXBfbGVuICovCisJdGVzdF9yZXBfbGVuID0gbnRvaHMoKih1X2ludDE2X3QgKikgJmZvaC0+ZGF0YVszXSk7CisJLyogZGF0YVs1XTogaXAuYWNjZXNzIHRlc3QgcmVzdWx0ICovCisJREVCVUdQQyhETk0sICJ0ZXN0X3Jlcz0lc1xuIiwgaXBhY2NfdGVzdHJlc19uYW1lKGZvaC0+ZGF0YVs1XSkpOworCisJLyogZGF0YVs2XTogaXAuYWNjZXNzIG5lc3RlZCBJRS4gMyA9PSBmcmVxX2Vycl9saXN0ICovCisJc3dpdGNoIChmb2gtPmRhdGFbNl0pIHsKKwljYXNlIE5NX0lQQUNfRUlFX0ZSRVFfRVJSX0xJU1Q6CisJCS8qIGRhdGFbNy4uOF06IGxlbmd0aCBvZiBmZXJyX2xpc3QgKi8KKwkJZmVycl9saXN0X2xlbiA9IG50b2hzKCoodV9pbnQxNl90ICopICZmb2gtPmRhdGFbN10pOworCisJCS8qIGRhdGFbOS4uLl06IGZyZXF1ZW5jeSBlcnJvciBsaXN0IGVsZW1lbnRzICovCisJCWZvciAoaSA9IDA7IGkgPCBmZXJyX2xpc3RfbGVuOyBpKz0gc2l6ZW9mKCppZmUpKSB7CisJCQlpZmUgPSAoc3RydWN0IGlwYWNjX2ZlcnJfZWxlbSAqKSAoZm9oLT5kYXRhICsgOSArIGkpOworCQkJREVCVUdQKEROTSwgIj09PiBBUkZDTiAlNHUsIEZyZXF1ZW5jeSBFcnJvciAlNmhkXG4iLAorCQkJaWZlLT5hcmZjbiwgbnRvaHMoaWZlLT5mcmVxX2VycikpOworCQl9CisJCWJyZWFrOworCWNhc2UgTk1fSVBBQ19FSUVfQ0hBTl9VU0VfTElTVDoKKwkJLyogZGF0YVs3Li44XTogbGVuZ3RoIG9mIGZlcnJfbGlzdCAqLworCQlmZXJyX2xpc3RfbGVuID0gbnRvaHMoKih1X2ludDE2X3QgKikgJmZvaC0+ZGF0YVs3XSk7CisKKwkJLyogZGF0YVs5Li4uXTogY2hhbm5lbCB1c2FnZSBsaXN0IGVsZW1lbnRzICovCisJCWZvciAoaSA9IDA7IGkgPCBmZXJyX2xpc3RfbGVuOyBpKz0gMikgeworCQkJdV9pbnQxNl90ICpjdV9wdHIgPSAodV9pbnQxNl90ICopKGZvaC0+ZGF0YSArIDkgKyBpKTsKKwkJCXVfaW50MTZfdCBjdSA9IG50b2hzKCpjdV9wdHIpOworCQkJREVCVUdQKEROTSwgIj09PiBBUkZDTiAlNHUsIFJ4TGV2ICUydVxuIiwKKwkJCQljdSAmIDB4M2ZmLCBjdSA+PiAxMCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBOTV9JUEFDX0VJRV9CQ0NIX0lORk9fVFlQRToKKwkJYnJlYWs7CisJY2FzZSBOTV9JUEFDX0VJRV9CQ0NIX0lORk86CisJCXJjID0gaXBhY19wYXJzZV9iY2NoX2luZm8oJmJpbmZvLCBmb2gtPmRhdGErNik7CisJCWlmIChyYyA8IDApIHsKKwkJCURFQlVHUChETk0sICJCQ0NIIEluZm8gcGFyc2luZyBmYWlsZWRcbiIpOworCQkJYnJlYWs7CisJCX0KKwkJREVCVUdQKEROTSwgIj09PiBBUkZDTiAldSwgUnhMZXYgJTJ1LCBSeFF1YWwgJTJ1OiAlM2QtJWQsIExBQyAlZCBDSSAlZFxuIiwKKwkJCWJpbmZvLmFyZmNuLCBiaW5mby5yeF9sZXYsIGJpbmZvLnJ4X3F1YWwsCisJCQliaW5mby5jZ2kubWNjLCBiaW5mby5jZ2kubW5jLAorCQkJYmluZm8uY2dpLmxhYywgYmluZm8uY2dpLmNpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbm1fc2lnX2NiKHVuc2lnbmVkIGludCBzdWJzeXMsIHVuc2lnbmVkIGludCBzaWduYWwsCisJCSAgICAgdm9pZCAqaGFuZGxlcl9kYXRhLCB2b2lkICpzaWduYWxfZGF0YSkKK3sKKwlzdHJ1Y3QgaXBhY2NfYWNrX3NpZ25hbF9kYXRhICppcGFjY19kYXRhOworCisJc3dpdGNoIChzaWduYWwpIHsKKwljYXNlIFNfTk1fSVBBQ0NfTkFDSzoKKwkJaXBhY2NfZGF0YSA9IHNpZ25hbF9kYXRhOworCQlyZXR1cm4gaXBhY2NfbXNnX25hY2soaXBhY2NfZGF0YS0+bXNnX3R5cGUpOworCWNhc2UgU19OTV9JUEFDQ19BQ0s6CisJCWlwYWNjX2RhdGEgPSBzaWduYWxfZGF0YTsKKwkJcmV0dXJuIGlwYWNjX21zZ19hY2soaXBhY2NfZGF0YS0+bXNnX3R5cGUsIGlwYWNjX2RhdGEtPmJ0cyk7CisJY2FzZSBTX05NX1RFU1RfUkVQOgorCQlyZXR1cm4gdGVzdF9yZXAoc2lnbmFsX2RhdGEpOworCWNhc2UgU19OTV9JUEFDQ19SRVNUQVJUX0FDSzoKKwkJcHJpbnRmKCJUaGUgQlRTIGhhcyBhY2tlZCB0aGUgcmVzdGFydC4gRXhpdGluZy5cbiIpOworCQlleGl0KDApOworCQlicmVhazsKKwljYXNlIFNfTk1fSVBBQ0NfUkVTVEFSVF9OQUNLOgorCQlwcmludGYoIlRoZSBCVFMgaGFzIG5hY2tlZCB0aGUgcmVzdGFydC4gRXhpdGluZy5cbiIpOworCQlleGl0KDApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogY2FsbGJhY2sgZnVuY3Rpb24gcGFzc2VkIHRvIHRoZSBBQklTIE9NTCBjb2RlICovCitzdGF0aWMgaW50IHBlcmNlbnQ7CitzdGF0aWMgaW50IHBlcmNlbnRfb2xkOworc3RhdGljIGludCBzd2xvYWRfY2Jmbih1bnNpZ25lZCBpbnQgaG9vaywgdW5zaWduZWQgaW50IGV2ZW50LCBzdHJ1Y3QgbXNnYiAqX21zZywKKwkJICAgICAgIHZvaWQgKmRhdGEsIHZvaWQgKnBhcmFtKQoreworCXN0cnVjdCBtc2diICptc2c7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKworCWlmIChob29rICE9IEdTTV9IT09LX05NX1NXTE9BRCkKKwkJcmV0dXJuIDA7CisKKwlidHMgPSAoc3RydWN0IGdzbV9idHMgKikgZGF0YTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIE5NX01UX0xPQURfSU5JVF9BQ0s6CisJCWZwcmludGYoc3Rkb3V0LCAiU29mdHdhcmUgTG9hZCBJbml0aWF0ZSBBQ0tcbiIpOworCQlicmVhazsKKwljYXNlIE5NX01UX0xPQURfSU5JVF9OQUNLOgorCQlmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBTb2Z0d2FyZSBMb2FkIEluaXRpYXRlIE5BQ0tcbiIpOworCQlleGl0KDUpOworCQlicmVhazsKKwljYXNlIE5NX01UX0xPQURfRU5EX0FDSzoKKwkJZnByaW50ZihzdGRlcnIsICJMT0FEIEVORCBBQ0suLi4iKTsKKwkJLyogbm93IG1ha2UgaXQgdGhlIGRlZmF1bHQgKi8KKwkJc3dfbG9hZF9zdGF0ZSA9IDE7CisKKwkJbXNnID0gbXNnYl9hbGxvYygxMDI0LCAic3c6IG52YXR0ciIpOworCQltc2ctPmwyaCA9IG1zZ2JfcHV0KG1zZywgMyk7CisJCW1zZy0+bDNoID0gJm1zZy0+bDJoWzNdOworCisJCS8qIGFjdGl2YXRlIHNvZnR3YXJlICovCisJCWlmIChzd19sb2FkMSkgeworCQkJbXNnYl92X3B1dChtc2csIE5NX0FUVF9TV19ERVNDUik7CisJCQltc2diX3RsMTZ2X3B1dChtc2csIE5NX0FUVF9GSUxFX0lELCBzd19sb2FkMS0+ZmlsZV9pZF9sZW4sIHN3X2xvYWQxLT5maWxlX2lkKTsKKwkJCW1zZ2JfdGwxNnZfcHV0KG1zZywgTk1fQVRUX0ZJTEVfVkVSU0lPTiwgc3dfbG9hZDEtPmZpbGVfdmVyc2lvbl9sZW4sCisJCQkJCXN3X2xvYWQxLT5maWxlX3ZlcnNpb24pOworCQl9CisKKwkJaWYgKHN3X2xvYWQyKSB7CisJCQltc2diX3ZfcHV0KG1zZywgTk1fQVRUX1NXX0RFU0NSKTsKKwkJCW1zZ2JfdGwxNnZfcHV0KG1zZywgTk1fQVRUX0ZJTEVfSUQsIHN3X2xvYWQyLT5maWxlX2lkX2xlbiwgc3dfbG9hZDItPmZpbGVfaWQpOworCQkJbXNnYl90bDE2dl9wdXQobXNnLCBOTV9BVFRfRklMRV9WRVJTSU9OLCBzd19sb2FkMi0+ZmlsZV92ZXJzaW9uX2xlbiwKKwkJCQkJc3dfbG9hZDItPmZpbGVfdmVyc2lvbik7CisJCX0KKworCQkvKiBmaWxsIGluIHRoZSBkYXRhICovCisJCW1zZy0+bDJoWzBdID0gTk1fQVRUX0lQQUNDX0NVUl9TV19DRkc7CisJCW1zZy0+bDJoWzFdID0gbXNnYl9sM2xlbihtc2cpID4+IDg7CisJCW1zZy0+bDJoWzJdID0gbXNnYl9sM2xlbihtc2cpICYgMHhmZjsKKwkJcHJpbnRmKCJGb28gbDJoOiAlcCBsM2g6ICVwLi4uIGxlbmd0aCBsMjogJXUgIGwzOiAldVxuIiwgbXNnLT5sMmgsIG1zZy0+bDNoLCBtc2diX2wybGVuKG1zZyksIG1zZ2JfbDNsZW4obXNnKSk7CisJCWFiaXNfbm1faXBhY2Nlc3Nfc2V0X252YXR0cihidHMtPmMwLCBtc2ctPmwyaCwgbXNnYl9sMmxlbihtc2cpKTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfTE9BRF9FTkRfTkFDSzoKKwkJZnByaW50ZihzdGRlcnIsICJFUlJPUjogU29mdHdhcmUgTG9hZCBFbmQgTkFDS1xuIik7CisJCWV4aXQoMyk7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfQUNUSVZBVEVfU1dfTkFDSzoKKwkJZnByaW50ZihzdGRlcnIsICJFUlJPUjogQWN0aXZhdGUgU29mdHdhcmUgTkFDS1xuIik7CisJCWV4aXQoNCk7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfQUNUSVZBVEVfU1dfQUNLOgorCQlicmVhazsKKwljYXNlIE5NX01UX0xPQURfU0VHX0FDSzoKKwkJcGVyY2VudCA9IGFiaXNfbm1fc29mdHdhcmVfbG9hZF9zdGF0dXMoYnRzKTsKKwkJaWYgKHBlcmNlbnQgPiBwZXJjZW50X29sZCkKKwkJCXByaW50ZigiU29mdHdhcmUgRG93bmxvYWQgUHJvZ3Jlc3M6ICVkJSVcbiIsIHBlcmNlbnQpOworCQlwZXJjZW50X29sZCA9IHBlcmNlbnQ7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfTE9BRF9BQk9SVDoKKwkJZnByaW50ZihzdGRlcnIsICJFUlJPUjogTG9hZCBhYm9ydGVkIGJ5IHRoZSBCVFMuXG4iKTsKKwkJZXhpdCg2KTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBib290c3RyYXBfb20oc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlpbnQgbGVuOworCXN0YXRpYyB1X2ludDhfdCBidWZbMTAyNF07CisJdV9pbnQ4X3QgKmN1ciA9IGJ1ZjsKKworCXByaW50ZigiT01MIGxpbmsgZXN0YWJsaXNoZWRcbiIpOworCisJaWYgKHVuaXRfaWQpIHsKKwkJbGVuID0gc3RybGVuKHVuaXRfaWQpOworCQlpZiAobGVuID4gc2l6ZW9mKGJ1ZiktMTApCisJCQlyZXR1cm47CisJCWJ1ZlswXSA9IE5NX0FUVF9JUEFDQ19VTklUX0lEOworCQlidWZbMV0gPSAobGVuKzEpID4+IDg7CisJCWJ1ZlsyXSA9IChsZW4rMSkgJiAweGZmOworCQltZW1jcHkoYnVmKzMsIHVuaXRfaWQsIGxlbik7CisJCWJ1ZlszK2xlbl0gPSAwOworCQlwcmludGYoInNldHRpbmcgVW5pdCBJRCB0byAnJXMnXG4iLCB1bml0X2lkKTsKKwkJYWJpc19ubV9pcGFjY2Vzc19zZXRfbnZhdHRyKGJ0cy0+YzAsIGJ1ZiwgMytsZW4rMSk7CisJfQorCWlmIChwcmltX29tbF9pcCkgeworCQlzdHJ1Y3QgaW5fYWRkciBpYTsKKworCQlpZiAoIWluZXRfYXRvbihwcmltX29tbF9pcCwgJmlhKSkgeworCQkJZnByaW50ZihzdGRlcnIsICJpbnZhbGlkIElQIGFkZHJlc3M6ICVzXG4iLAorCQkJCXByaW1fb21sX2lwKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qIDB4ODggKyBJUCArIHBvcnQgKi8KKwkJbGVuID0gMSArIHNpemVvZihpYSkgKyAyOworCisJCSpjdXIrKyA9IE5NX0FUVF9JUEFDQ19QUklNX09NTF9DRkdfTElTVDsKKwkJKmN1cisrID0gKGxlbikgPj4gODsKKwkJKmN1cisrID0gKGxlbikgJiAweGZmOworCQkqY3VyKysgPSAweDg4OworCQltZW1jcHkoY3VyLCAmaWEsIHNpemVvZihpYSkpOworCQljdXIgKz0gc2l6ZW9mKGlhKTsKKwkJKmN1cisrID0gMDsKKwkJKmN1cisrID0gMDsKKwkJcHJpbnRmKCJzZXR0aW5nIHByaW1hcnkgT01MIGxpbmsgSVAgdG8gJyVzJ1xuIiwgaW5ldF9udG9hKGlhKSk7CisJCW9tbF9zdGF0ZSA9IDE7CisJCWFiaXNfbm1faXBhY2Nlc3Nfc2V0X252YXR0cihidHMtPmMwLCBidWYsIDMrbGVuKTsKKwl9CisJaWYgKG52X21hc2spIHsKKwkJbGVuID0gNDsKKworCQkqY3VyKysgPSBOTV9BVFRfSVBBQ0NfTlZfRkxBR1M7CisJCSpjdXIrKyA9IChsZW4pID4+IDg7CisJCSpjdXIrKyA9IChsZW4pICYgMHhmZjsKKwkJKmN1cisrID0gbnZfZmxhZ3MgJiAweGZmOworCQkqY3VyKysgPSBudl9tYXNrICYgMHhmZjsKKwkJKmN1cisrID0gbnZfZmxhZ3MgPj4gODsKKwkJKmN1cisrID0gbnZfbWFzayA+PiA4OworCQlwcmludGYoInNldHRpbmcgTlYgRmxhZ3MvTWFzayB0byAweCUwNHgvMHglMDR4XG4iLAorCQkJbnZfZmxhZ3MsIG52X21hc2spOworCQlhYmlzX25tX2lwYWNjZXNzX3NldF9udmF0dHIoYnRzLT5jMCwgYnVmLCAzK2xlbik7CisJfQorCisJaWYgKHJlc3RhcnQgJiYgIXByaW1fb21sX2lwICYmICFzb2Z0d2FyZSkgeworCQlwcmludGYoInJlc3RhcnRpbmcgQlRTXG4iKTsKKwkJYWJpc19ubV9pcGFjY2Vzc19yZXN0YXJ0KGJ0cyk7CisJfQorCit9CisKK3ZvaWQgaW5wdXRfZXZlbnQoaW50IGV2ZW50LCBlbnVtIGUxaW5wX3NpZ25fdHlwZSB0eXBlLCBzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCkKK3sKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBFVlRfRTFfVEVJX1VQOgorCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBFMUlOUF9TSUdOX09NTDoKKwkJCWJvb3RzdHJhcF9vbSh0cngtPmJ0cyk7CisJCQlicmVhazsKKwkJY2FzZSBFMUlOUF9TSUdOX1JTTDoKKwkJCS8qIEZJWE1FICovCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgRVZUX0UxX1RFSV9ETjoKKwkJZnByaW50ZihzdGRlcnIsICJMb3N0IHNvbWUgRTEgVEVJIGxpbmtcbiIpOworCQkvKiBGSVhNRTogZGVhbCB3aXRoIFRFSSBvciBMMSBsaW5rIGxvc3MgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCitpbnQgbm1fc3RhdGVfZXZlbnQoZW51bSBubV9ldnQgZXZ0LCB1X2ludDhfdCBvYmpfY2xhc3MsIHZvaWQgKm9iaiwKKwkJICAgc3RydWN0IGdzbV9ubV9zdGF0ZSAqb2xkX3N0YXRlLCBzdHJ1Y3QgZ3NtX25tX3N0YXRlICpuZXdfc3RhdGUpCit7CisJaWYgKGV2dCA9PSBFVlRfU1RBVEVDSEdfT1BFUiAmJgorCSAgICBvYmpfY2xhc3MgPT0gTk1fT0NfUkFESU9fQ0FSUklFUiAmJgorCSAgICBuZXdfc3RhdGUtPmF2YWlsYWJpbGl0eSA9PSAzKSB7CisJCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gb2JqOworCisJCWlmIChuZXRfbGlzdGVuX3Rlc3RucikgeworCQkJdV9pbnQ4X3QgcGh5c19jb25maWdbXSA9IHsgMHgwMiwgMHgwYSwgMHgwMCwgMHgwMSwgMHgwMiB9OworCQkJYWJpc19ubV9wZXJmb3JtX3Rlc3QodHJ4LT5idHMsIDIsIDAsIDAsIDB4ZmYsCisJCQkJCSAgICAgbmV0X2xpc3Rlbl90ZXN0bnIsIDEsCisJCQkJCSAgICAgcGh5c19jb25maWcsIHNpemVvZihwaHlzX2NvbmZpZykpOworCQl9IGVsc2UgaWYgKHNvZnR3YXJlKSB7CisJCQlpbnQgcmM7CisJCQlwcmludGYoIkF0dGVtcHRpbmcgc29mdHdhcmUgdXBsb2FkIHdpdGggJyVzJ1xuIiwgc29mdHdhcmUpOworCQkJcmMgPSBhYmlzX25tX3NvZnR3YXJlX2xvYWQodHJ4LT5idHMsIHNvZnR3YXJlLCAxOSwgMCwgc3dsb2FkX2NiZm4sIHRyeC0+YnRzKTsKKwkJCWlmIChyYyA8IDApIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBzdGFydCBzb2Z0d2FyZSBsb2FkXG4iKTsKKwkJCQlleGl0KC0zKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzd19sb2FkICpjcmVhdGVfc3dsb2FkKHN0cnVjdCBzZHBfaGVhZGVyICpoZWFkZXIpCit7CisJc3RydWN0IHN3X2xvYWQgKmxvYWQ7CisKKwlsb2FkID0gdGFsbG9jX3plcm8odGFsbF9jdHhfY29uZmlnLCBzdHJ1Y3Qgc3dfbG9hZCk7CisKKwlzdHJuY3B5KChjaGFyICopbG9hZC0+ZmlsZV9pZCwgaGVhZGVyLT5maXJtd2FyZV9pbmZvLnN3X3BhcnQsIDIwKTsKKwlsb2FkLT5maWxlX2lkX2xlbiA9IHN0cmxlbihoZWFkZXItPmZpcm13YXJlX2luZm8uc3dfcGFydCkgKyAxOworCisJc3RybmNweSgoY2hhciAqKWxvYWQtPmZpbGVfdmVyc2lvbiwgaGVhZGVyLT5maXJtd2FyZV9pbmZvLnZlcnNpb24sIDIwKTsKKwlsb2FkLT5maWxlX3ZlcnNpb25fbGVuID0gc3RybGVuKGhlYWRlci0+ZmlybXdhcmVfaW5mby52ZXJzaW9uKSArIDE7CisKKwlyZXR1cm4gbG9hZDsKK30KKworc3RhdGljIGludCBmaW5kX3N3X2xvYWRfcGFyYW1zKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCXN0cnVjdCBzdGF0IHN0YXQ7CisJc3RydWN0IHNkcF9oZWFkZXIgKmhlYWRlcjsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCAqZW50cnk7CisJaW50IGZkOworCXZvaWQgKnRhbGxfZmlybV9jdHggPSAwOworCisJZW50cnkgPSB0YWxsb2NfemVybyh0YWxsX2Zpcm1fY3R4LCBzdHJ1Y3QgbGxpc3RfaGVhZCk7CisJSU5JVF9MTElTVF9IRUFEKGVudHJ5KTsKKworCWZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOworCWlmICghZmQpIHsKKwkJcGVycm9yKCJuYWRhIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiB2ZXJpZnkgdGhlIGZpbGUgKi8KKwlpZiAoZnN0YXQoZmQsICZzdGF0KSA9PSAtMSkgeworCQlwZXJyb3IoIkNhbiBub3Qgc3RhdCB0aGUgZmlsZSIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaXBhY2Nlc3NfYW5hbHl6ZV9maWxlKGZkLCBzdGF0LnN0X3NpemUsIDAsIGVudHJ5KTsKKwlpZiAoY2xvc2UoZmQpICE9IDApIHsKKwkJcGVycm9yKCJDbG9zZSBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIHRyeSB0byBmaW5kIHdoYXQgd2UgYXJlIGxvb2tpbmcgZm9yICovCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoaGVhZGVyLCBlbnRyeSwgZW50cnkpIHsKKwkJaWYgKG50b2hzKGhlYWRlci0+ZmlybXdhcmVfaW5mby5tb3JlX21vcmVfbWFnaWMpID09IDB4MTAwMCkgeworCQkJc3dfbG9hZDEgPSBjcmVhdGVfc3dsb2FkKGhlYWRlcik7CisJCX0gZWxzZSBpZiAobnRvaHMoaGVhZGVyLT5maXJtd2FyZV9pbmZvLm1vcmVfbW9yZV9tYWdpYykgPT0gMHgyMDAxKSB7CisJCQlzd19sb2FkMiA9IGNyZWF0ZV9zd2xvYWQoaGVhZGVyKTsKKwkJfQorCX0KKworCWlmICghc3dfbG9hZDEgfHwgIXN3X2xvYWQyKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRGlkIG5vdCBmaW5kIGRhdGEuXG4iKTsKKwkJdGFsbG9jX2ZyZWUodGFsbF9maXJtX2N0eCk7CisJCXJldHVybiAtMTsKKyAgICAgICAgfQorCisJdGFsbG9jX2ZyZWUodGFsbF9maXJtX2N0eCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfZW50cnkoc3RydWN0IHNkcF9oZWFkZXJfaXRlbSAqc3ViX2VudHJ5LCBpbnQgcGFydCwgaW50IGZkKQoreworCWludCBvdXRfZmQ7CisJaW50IGNvcGllZDsKKwljaGFyIGZpbGVuYW1lWzQwOTZdOworCW9mZl90IHRhcmdldDsKKworCWlmICghZHVtcF9maWxlcykKKwkJcmV0dXJuOworCisJaWYgKHN1Yl9lbnRyeS0+aGVhZGVyX2VudHJ5LnNvbWV0aGluZzEgPT0gMCkKKwkJcmV0dXJuOworCisJc25wcmludGYoZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSksICJwYXJ0LiVkIiwgcGFydCsrKTsKKwlvdXRfZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1dST05MWSB8IE9fQ1JFQVQsIDA2NjApOworCWlmIChvdXRfZmQgPCAwKSB7CisJCXBlcnJvcigiQ2FuIG5vdCBkdW1wIGZpcm13YXJlIik7CisJCXJldHVybjsKKwl9CisKKwl0YXJnZXQgPSBzdWJfZW50cnktPmFic29sdXRlX29mZnNldCArIG50b2hsKHN1Yl9lbnRyeS0+aGVhZGVyX2VudHJ5LnN0YXJ0KSArIDQ7CisJaWYgKGxzZWVrKGZkLCB0YXJnZXQsIFNFRUtfU0VUKSAhPSB0YXJnZXQpIHsKKwkJcGVycm9yKCJzZWVrIGZhaWxlZCIpOworCQljbG9zZShvdXRfZmQpOworCQlyZXR1cm47CisJfQorCisJZm9yIChjb3BpZWQgPSAwOyBjb3BpZWQgPCBudG9obChzdWJfZW50cnktPmhlYWRlcl9lbnRyeS5sZW5ndGgpOyArK2NvcGllZCkgeworCQljaGFyIGM7CisJCWlmIChyZWFkKGZkLCAmYywgc2l6ZW9mKGMpKSAhPSBzaXplb2YoYykpIHsKKwkJCXBlcnJvcigiY29weSBmYWlsZWQiKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHdyaXRlKG91dF9mZCwgJmMsIHNpemVvZihjKSkgIT0gc2l6ZW9mKGMpKSB7CisJCQlwZXJyb3IoIndyaXRlIGZhaWxlZCIpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwljbG9zZShvdXRfZmQpOworfQorCitzdGF0aWMgdm9pZCBhbmFseXplX2Zpcm13YXJlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCXN0cnVjdCBzdGF0IHN0YXQ7CisJc3RydWN0IHNkcF9oZWFkZXIgKmhlYWRlcjsKKwlzdHJ1Y3Qgc2RwX2hlYWRlcl9pdGVtICpzdWJfZW50cnk7CisJc3RydWN0IGxsaXN0X2hlYWQgKmVudHJ5OworCWludCBmZDsKKwl2b2lkICp0YWxsX2Zpcm1fY3R4ID0gMDsKKwlpbnQgcGFydCA9IDA7CisKKwllbnRyeSA9IHRhbGxvY196ZXJvKHRhbGxfZmlybV9jdHgsIHN0cnVjdCBsbGlzdF9oZWFkKTsKKwlJTklUX0xMSVNUX0hFQUQoZW50cnkpOworCisJcHJpbnRmKCJPcGVuaW5nIHBvc3NpYmxlIGZpcm13YXJlICclcydcbiIsIGZpbGVuYW1lKTsKKwlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKKwlpZiAoIWZkKSB7CisJCXBlcnJvcigibmFkYSIpOworCQlyZXR1cm47CisJfQorCisJLyogdmVyaWZ5IHRoZSBmaWxlICovCisJaWYgKGZzdGF0KGZkLCAmc3RhdCkgPT0gLTEpIHsKKwkJcGVycm9yKCJDYW4gbm90IHN0YXQgdGhlIGZpbGUiKTsKKwkJcmV0dXJuOworCX0KKworCWlwYWNjZXNzX2FuYWx5emVfZmlsZShmZCwgc3RhdC5zdF9zaXplLCAwLCBlbnRyeSk7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShoZWFkZXIsIGVudHJ5LCBlbnRyeSkgeworCQlwcmludGYoIlByaW50aW5nIGhlYWRlciBpbmZvcm1hdGlvbjpcbiIpOworCQlwcmludGYoIm1vcmVfbW9yZV9tYWdpYzogMHgleFxuIiwgbnRvaHMoaGVhZGVyLT5maXJtd2FyZV9pbmZvLm1vcmVfbW9yZV9tYWdpYykpOworCQlwcmludGYoImhlYWRlcl9sZW5ndGg6ICV1XG4iLCBudG9obChoZWFkZXItPmZpcm13YXJlX2luZm8uaGVhZGVyX2xlbmd0aCkpOworCQlwcmludGYoImZpbGVfbGVuZ3RoOiAldVxuIiwgbnRvaGwoaGVhZGVyLT5maXJtd2FyZV9pbmZvLmZpbGVfbGVuZ3RoKSk7CisJCXByaW50Zigic3dfcGFydDogJS4yMHNcbiIsIGhlYWRlci0+ZmlybXdhcmVfaW5mby5zd19wYXJ0KTsKKwkJcHJpbnRmKCJ0ZXh0MTogJS42NHNcbiIsIGhlYWRlci0+ZmlybXdhcmVfaW5mby50ZXh0MSk7CisJCXByaW50ZigidGltZTogJS4xMnNcbiIsIGhlYWRlci0+ZmlybXdhcmVfaW5mby50aW1lKTsKKwkJcHJpbnRmKCJkYXRlOiAlLjE0c1xuIiwgaGVhZGVyLT5maXJtd2FyZV9pbmZvLmRhdGUpOworCQlwcmludGYoInRleHQyOiAlLjEwc1xuIiwgaGVhZGVyLT5maXJtd2FyZV9pbmZvLnRleHQyKTsKKwkJcHJpbnRmKCJ2ZXJzaW9uOiAlLjIwc1xuIiwgaGVhZGVyLT5maXJtd2FyZV9pbmZvLnZlcnNpb24pOworCQlwcmludGYoInN1Yml0ZW1zLi4uXG4iKTsKKworCQlsbGlzdF9mb3JfZWFjaF9lbnRyeShzdWJfZW50cnksICZoZWFkZXItPmhlYWRlcl9saXN0LCBlbnRyeSkgeworCQkJcHJpbnRmKCJcdHNvbWV0aGluZzE6ICV1XG4iLCBzdWJfZW50cnktPmhlYWRlcl9lbnRyeS5zb21ldGhpbmcxKTsKKwkJCXByaW50ZigiXHR0ZXh0MTogJS42NHNcbiIsIHN1Yl9lbnRyeS0+aGVhZGVyX2VudHJ5LnRleHQxKTsKKwkJCXByaW50ZigiXHR0aW1lOiAlLjEyc1xuIiwgc3ViX2VudHJ5LT5oZWFkZXJfZW50cnkudGltZSk7CisJCQlwcmludGYoIlx0ZGF0ZTogJS4xNHNcbiIsIHN1Yl9lbnRyeS0+aGVhZGVyX2VudHJ5LmRhdGUpOworCQkJcHJpbnRmKCJcdHRleHQyOiAlLjEwc1xuIiwgc3ViX2VudHJ5LT5oZWFkZXJfZW50cnkudGV4dDIpOworCQkJcHJpbnRmKCJcdHZlcnNpb246ICUuMjBzXG4iLCBzdWJfZW50cnktPmhlYWRlcl9lbnRyeS52ZXJzaW9uKTsKKwkJCXByaW50ZigiXHRsZW5ndGg6ICV1XG4iLCBudG9obChzdWJfZW50cnktPmhlYWRlcl9lbnRyeS5sZW5ndGgpKTsKKwkJCXByaW50ZigiXHRhZGRyMTogMHgleFxuIiwgbnRvaGwoc3ViX2VudHJ5LT5oZWFkZXJfZW50cnkuYWRkcjEpKTsKKwkJCXByaW50ZigiXHRhZGRyMjogMHgleFxuIiwgbnRvaGwoc3ViX2VudHJ5LT5oZWFkZXJfZW50cnkuYWRkcjIpKTsKKwkJCXByaW50ZigiXHRzdGFydDogMHgleFxuIiwgbnRvaGwoc3ViX2VudHJ5LT5oZWFkZXJfZW50cnkuc3RhcnQpKTsKKwkJCXByaW50ZigiXHRhYnMuIG9mZnNldDogMHglbHhcbiIsIHN1Yl9lbnRyeS0+YWJzb2x1dGVfb2Zmc2V0KTsKKwkJCXByaW50ZigiXG5cbiIpOworCisJCQlkdW1wX2VudHJ5KHN1Yl9lbnRyeSwgcGFydCsrLCBmZCk7CisJCX0KKwkJcHJpbnRmKCJcblxuIik7CisJfQorCisJaWYgKGNsb3NlKGZkKSAhPSAwKSB7CisJCXBlcnJvcigiQ2xvc2UgZmFpbGVkLlxuIik7CisJCXJldHVybjsKKwl9CisKKwl0YWxsb2NfZnJlZSh0YWxsX2Zpcm1fY3R4KTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfdXNhZ2Uodm9pZCkKK3sKKwlwcmludGYoIlVzYWdlOiBpcGFjY2Vzcy1jb25maWdcbiIpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9oZWxwKHZvaWQpCit7CisJcHJpbnRmKCIgIC11IC0tdW5pdC1pZCBVTklUX0lEXG4iKTsKKwlwcmludGYoIiAgLW8gLS1vbWwtaXAgaXBcbiIpOworCXByaW50ZigiICAtciAtLXJlc3RhcnRcbiIpOworCXByaW50ZigiICAtbiBmbGFncy9tYXNrXHRTZXQgTlZSQU0gYXR0cmlidXRlcy5cbiIpOworCXByaW50ZigiICAtbCAtLWxpc3RlbiB0ZXN0bnIgXHRQZXJmb3JtIHNwZWNpZmllZCB0ZXN0IG51bWJlclxuIik7CisJcHJpbnRmKCIgIC1oIC0taGVscCB0aGlzIHRleHRcbiIpOworCXByaW50ZigiICAtcyAtLXN0cmVhbS1pZCBJRFxuIik7CisJcHJpbnRmKCIgIC1kIC0tc29mdHdhcmUgZmlybXdhcmVcbiIpOworCXByaW50ZigiICAtZiAtLWZpcm13YXJlIGZpcm13YXJlIFByb3ZpZGUgZmlybXdhcmUgaW5mb3JtYXRpb25cbiIpOworCXByaW50ZigiICAtdyAtLXdyaXRlLWZpcm13YXJlLiBUaGlzIHdpbGwgZHVtcCB0aGUgZmlybXdhcmUgcGFydHMgdG8gdGhlIGZpbGVzeXN0ZW0uIFVzZSB3aXRoIC1mLlxuIik7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW47CisJaW50IHJjLCBvcHRpb25faW5kZXggPSAwLCBzdHJlYW1faWQgPSAweGZmOworCXN0cnVjdCBkZWJ1Z190YXJnZXQgKnN0ZGVycl90YXJnZXQ7CisKKwlkZWJ1Z19pbml0KCk7CisJc3RkZXJyX3RhcmdldCA9IGRlYnVnX3RhcmdldF9jcmVhdGVfc3RkZXJyKCk7CisJZGVidWdfYWRkX3RhcmdldChzdGRlcnJfdGFyZ2V0KTsKKwlkZWJ1Z19zZXRfYWxsX2ZpbHRlcihzdGRlcnJfdGFyZ2V0LCAxKTsKKwlkZWJ1Z19zZXRfbG9nX2xldmVsKHN0ZGVycl90YXJnZXQsIDApOworCWRlYnVnX3BhcnNlX2NhdGVnb3J5X21hc2soc3RkZXJyX3RhcmdldCwgIkROTSwwIik7CisJYnRzX21vZGVsX25hbm9idHNfaW5pdCgpOworCisJcHJpbnRmKCJpcGFjY2Vzcy1jb25maWcgKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlXG4iKTsKKwlwcmludGYoIlRoaXMgaXMgRlJFRSBTT0ZUV0FSRSB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFlcblxuIik7CisKKwl3aGlsZSAoMSkgeworCQlpbnQgYzsKKwkJdW5zaWduZWQgbG9uZyB1bDsKKwkJY2hhciAqc2xhc2g7CisJCXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0geworCQkJeyAidW5pdC1pZCIsIDEsIDAsICd1JyB9LAorCQkJeyAib21sLWlwIiwgMSwgMCwgJ28nIH0sCisJCQl7ICJyZXN0YXJ0IiwgMCwgMCwgJ3InIH0sCisJCQl7ICJoZWxwIiwgMCwgMCwgJ2gnIH0sCisJCQl7ICJsaXN0ZW4iLCAxLCAwLCAnbCcgfSwKKwkJCXsgInN0cmVhbS1pZCIsIDEsIDAsICdzJyB9LAorCQkJeyAic29mdHdhcmUiLCAxLCAwLCAnZCcgfSwKKwkJCXsgImZpcm13YXJlIiwgMSwgMCwgJ2YnIH0sCisJCQl7ICJ3cml0ZS1maXJtd2FyZSIsIDAsIDAsICd3JyB9LAorCQl9OworCisJCWMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAidTpvOnJuOmw6aHM6ZDpmOnciLCBsb25nX29wdGlvbnMsCisJCQkJJm9wdGlvbl9pbmRleCk7CisKKwkJaWYgKGMgPT0gLTEpCisJCQlicmVhazsKKworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAndSc6CisJCQl1bml0X2lkID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ28nOgorCQkJcHJpbV9vbWxfaXAgPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAncic6CisJCQlyZXN0YXJ0ID0gMTsKKwkJCWJyZWFrOworCQljYXNlICduJzoKKwkJCXNsYXNoID0gc3RyY2hyKG9wdGFyZywgJy8nKTsKKwkJCWlmICghc2xhc2gpCisJCQkJZXhpdCgyKTsKKwkJCXVsID0gc3RydG91bChvcHRhcmcsIE5VTEwsIDE2KTsKKwkJCW52X2ZsYWdzID0gdWwgJiAweGZmZmY7CisJCQl1bCA9IHN0cnRvdWwoc2xhc2grMSwgTlVMTCwgMTYpOworCQkJbnZfbWFzayA9IHVsICYgMHhmZmZmOworCQkJYnJlYWs7CisJCWNhc2UgJ2wnOgorCQkJbmV0X2xpc3Rlbl90ZXN0bnIgPSBhdG9pKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAncyc6CisJCQlzdHJlYW1faWQgPSBhdG9pKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnZCc6CisJCQlzb2Z0d2FyZSA9IHN0cmR1cChvcHRhcmcpOworCQkJaWYgKGZpbmRfc3dfbG9hZF9wYXJhbXMob3B0YXJnKSAhPSAwKQorCQkJCWV4aXQoMCk7CisJCQlicmVhazsKKwkJY2FzZSAnZic6CisJCQlmaXJtd2FyZV9hbmFseXNpcyA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICd3JzoKKwkJCWR1bXBfZmlsZXMgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ2gnOgorCQkJcHJpbnRfdXNhZ2UoKTsKKwkJCXByaW50X2hlbHAoKTsKKwkJCWV4aXQoMCk7CisJCX0KKwl9OworCisJaWYgKGZpcm13YXJlX2FuYWx5c2lzKQorCQlhbmFseXplX2Zpcm13YXJlKGZpcm13YXJlX2FuYWx5c2lzKTsKKworCWlmIChvcHRpbmQgPj0gYXJnYykgeworCQkvKiBvbmx5IHdhcm4gaWYgd2UgaGF2ZSBub3QgZG9uZSBhbnl0aGluZyBlbHNlICovCisJCWlmICghZmlybXdhcmVfYW5hbHlzaXMpCisJCQlmcHJpbnRmKHN0ZGVyciwgInlvdSBoYXZlIHRvIHNwZWNpZnkgdGhlIElQIGFkZHJlc3Mgb2YgdGhlIEJUUy4gVXNlIC0taGVscCBmb3IgbW9yZSBpbmZvcm1hdGlvblxuIik7CisJCWV4aXQoMik7CisJfQorCisJZ3NtbmV0ID0gZ3NtX25ldHdvcmtfaW5pdCgxLCAxLCBOVUxMKTsKKwlpZiAoIWdzbW5ldCkKKwkJZXhpdCgxKTsKKworCWJ0cyA9IGdzbV9idHNfYWxsb2MoZ3NtbmV0LCBHU01fQlRTX1RZUEVfTkFOT0JUUywgSEFSRENPREVEX1RTQywKKwkJCQlIQVJEQ09ERURfQlNJQyk7CisJLyogaXAuYWNjZXNzIHN1cHBvcnRzIHVwIHRvIDQgY2hhaW5lZCBUUlggKi8KKwlnc21fYnRzX3RyeF9hbGxvYyhidHMpOworCWdzbV9idHNfdHJ4X2FsbG9jKGJ0cyk7CisJZ3NtX2J0c190cnhfYWxsb2MoYnRzKTsKKwlidHMtPm9tbF90ZWkgPSBzdHJlYW1faWQ7CisJCisJcmVnaXN0ZXJfc2lnbmFsX2hhbmRsZXIoU1NfTk0sIG5tX3NpZ19jYiwgTlVMTCk7CisJcHJpbnRmKCJUcnlpbmcgdG8gY29ubmVjdCB0byBpcC5hY2Nlc3MgQlRTIC4uLlxuIik7CisKKwltZW1zZXQoJnNpbiwgMCwgc2l6ZW9mKHNpbikpOworCXNpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlpbmV0X2F0b24oYXJndltvcHRpbmRdLCAmc2luLnNpbl9hZGRyKTsKKwlyYyA9IGlhX2NvbmZpZ19jb25uZWN0KGJ0cywgJnNpbik7CisJaWYgKHJjIDwgMCkgeworCQlwZXJyb3IoIkVycm9yIGNvbm5lY3RpbmcgdG8gdGhlIEJUUyIpOworCQlleGl0KDEpOworCX0KKwkKKwl3aGlsZSAoMSkgeworCQlyYyA9IGJzY19zZWxlY3RfbWFpbigwKTsKKwkJaWYgKHJjIDwgMCkKKwkJCWV4aXQoMyk7CisJfQorCisJZXhpdCgwKTsKK30KKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvaXBhY2Nlc3MvaXBhY2Nlc3MtZmluZC5jIGIvb3BlbmJzYy9zcmMvaXBhY2Nlc3MvaXBhY2Nlc3MtZmluZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZjhhMmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9pcGFjY2Vzcy9pcGFjY2Vzcy1maW5kLmMKQEAgLTAsMCArMSwyMDggQEAKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworCisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGltZXIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2lwYWNjZXNzLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorCitzdGF0aWMgY29uc3QgY2hhciAqaWR0YWdfbmFtZXNbXSA9IHsKKwlbSVBBQ19JRFRBR19TRVJOUl0JPSAiU2VyaWFsIE51bWJlciIsCisJW0lQQUNfSURUQUdfVU5JVE5BTUVdCT0gIlVuaXQgTmFtZSIsCisJW0lQQUNfSURUQUdfTE9DQVRJT04xXQk9ICJMb2NhdGlvbiAxIiwKKwlbSVBBQ19JRFRBR19MT0NBVElPTjJdCT0gIkxvY2F0aW9uIDIiLAorCVtJUEFDX0lEVEFHX0VRVUlQVkVSU10JPSAiRXF1aXBtZW50IFZlcnNpb24iLAorCVtJUEFDX0lEVEFHX1NXVkVSU0lPTl0JPSAiU29mdHdhcmUgVmVyc2lvbiIsCisJW0lQQUNfSURUQUdfSVBBRERSXQk9ICJJUCBBZGRyZXNzIiwKKwlbSVBBQ19JRFRBR19NQUNBRERSXQk9ICJNQUMgQWRkcmVzcyIsCisJW0lQQUNfSURUQUdfVU5JVF0JPSAiVW5pdCBJRCIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqaXBhY19pZHRhZ19uYW1lKGludCB0YWcpCit7CisJaWYgKHRhZyA+PSBBUlJBWV9TSVpFKGlkdGFnX25hbWVzKSkKKwkJcmV0dXJuICJ1bmtub3duIjsKKworCXJldHVybiBpZHRhZ19uYW1lc1t0YWddOworfQorCitzdGF0aWMgaW50IHVkcF9zb2NrKGNvbnN0IGNoYXIgKmlmbmFtZSkKK3sKKwlpbnQgZmQsIHJjLCBiYyA9IDE7CisJc3RydWN0IHNvY2thZGRyX2luIHNhOworCisJZmQgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19ER1JBTSwgSVBQUk9UT19VRFApOworCWlmIChmZCA8IDApCisJCXJldHVybiBmZDsKKworCWlmIChpZm5hbWUpIHsKKwkJcmMgPSBzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19CSU5EVE9ERVZJQ0UsIGlmbmFtZSwKKwkJCQlzdHJsZW4oaWZuYW1lKSk7CisJCWlmIChyYyA8IDApCisJCQlnb3RvIGVycjsKKwl9CisKKwlzYS5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlzYS5zaW5fcG9ydCA9IGh0b25zKDMwMDYpOworCXNhLnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9BTlk7CisKKwlyYyA9IGJpbmQoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2EsIHNpemVvZihzYSkpOworCWlmIChyYyA8IDApCisJCWdvdG8gZXJyOworCisJcmMgPSBzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19CUk9BRENBU1QsICZiYywgc2l6ZW9mKGJjKSk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBlcnI7CisKKyNpZiAwCisJLyogd2UgY2Fubm90IGJpbmQsIHNpbmNlIHRoZSByZXNwb25zZSBwYWNrZXRzIGRvbid0IGNvbWUgZnJvbQorCSAqIHRoZSBicm9hZGNhc3QgYWRkcmVzcyAqLworCXNhLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCXNhLnNpbl9wb3J0ID0gaHRvbnMoMzAwNik7CisJaW5ldF9hdG9uKCIyNTUuMjU1LjI1NS4yNTUiLCAmc2Euc2luX2FkZHIpOworCisJcmMgPSBjb25uZWN0KGZkLCAoc3RydWN0IHNvY2thZGRyICopJnNhLCBzaXplb2Yoc2EpKTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIGVycjsKKyNlbmRpZgkJCisJcmV0dXJuIGZkOworCitlcnI6CisJY2xvc2UoZmQpOworCXJldHVybiByYzsKK30KKworY29uc3QgdW5zaWduZWQgY2hhciBmaW5kX3BrdFtdID0geyAweDAwLCAweDBiKzgsIElQQUNfUFJPVE9fSVBBQ0NFU1MsIDB4MDAsIAorCQkJCUlQQUNfTVNHVF9JRF9HRVQsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfTUFDQUREUiwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19JUEFERFIsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfVU5JVCwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19MT0NBVElPTjEsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfTE9DQVRJT04yLAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX0VRVUlQVkVSUywKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19TV1ZFUlNJT04sCisJCQkJCTB4MDEsIElQQUNfSURUQUdfVU5JVE5BTUUsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfU0VSTlIsCisJCQkJfTsKKworCitzdGF0aWMgaW50IGJjYXN0X2ZpbmQoaW50IGZkKQoreworCXN0cnVjdCBzb2NrYWRkcl9pbiBzYTsKKworCXNhLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCXNhLnNpbl9wb3J0ID0gaHRvbnMoMzAwNik7CisJaW5ldF9hdG9uKCIyNTUuMjU1LjI1NS4yNTUiLCAmc2Euc2luX2FkZHIpOworCisJcmV0dXJuIHNlbmR0byhmZCwgZmluZF9wa3QsIHNpemVvZihmaW5kX3BrdCksIDAsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNhLCBzaXplb2Yoc2EpKTsKK30KKworc3RhdGljIGludCBwYXJzZV9yZXNwb25zZSh1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4pCit7CisJdV9pbnQ4X3QgdF9sZW47CisJdV9pbnQ4X3QgdF90YWc7CisJdV9pbnQ4X3QgKmN1ciA9IGJ1ZjsKKworCXdoaWxlIChjdXIgPCBidWYgKyBsZW4pIHsKKwkJdF9sZW4gPSAqY3VyKys7CisJCXRfdGFnID0gKmN1cisrOworCQkKKwkJcHJpbnRmKCIlcz0nJXMnICAiLCBpcGFjX2lkdGFnX25hbWUodF90YWcpLCBjdXIpOworCisJCWN1ciArPSB0X2xlbjsKKwl9CisJcHJpbnRmKCJcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlYWRfcmVzcG9uc2UoaW50IGZkKQoreworCXVuc2lnbmVkIGNoYXIgYnVmWzI1NV07CisJc3RydWN0IHNvY2thZGRyX2luIHNhOworCWludCBsZW47CisJc29ja2xlbl90IHNhX2xlbiA9IHNpemVvZihzYSk7CisKKwlsZW4gPSByZWN2ZnJvbShmZCwgYnVmLCBzaXplb2YoYnVmKSwgMCwgKHN0cnVjdCBzb2NrYWRkciAqKSZzYSwgJnNhX2xlbik7CisJaWYgKGxlbiA8IDApCisJCXJldHVybiBsZW47CisKKwkvKiAyIGJ5dGVzIGxlbmd0aCwgMSBieXRlIHByb3RvY29sICgweGZlKSAqLworCWlmIChidWZbMl0gIT0gMHhmZSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoYnVmWzRdICE9IElQQUNfTVNHVF9JRF9SRVNQKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBwYXJzZV9yZXNwb25zZShidWYrNiwgbGVuLTYpOworfQorCitzdGF0aWMgaW50IGJmZF9jYihzdHJ1Y3QgYnNjX2ZkICpiZmQsIHVuc2lnbmVkIGludCBmbGFncykKK3sKKwlpZiAoZmxhZ3MgJiBCU0NfRkRfUkVBRCkKKwkJcmV0dXJuIHJlYWRfcmVzcG9uc2UoYmZkLT5mZCk7CisJaWYgKGZsYWdzICYgQlNDX0ZEX1dSSVRFKSB7CisJCWJmZC0+d2hlbiAmPSB+QlNDX0ZEX1dSSVRFOworCQlyZXR1cm4gYmNhc3RfZmluZChiZmQtPmZkKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKworc3RhdGljIHZvaWQgdGltZXJfY2Iodm9pZCAqX2RhdGEpCit7CisJc3RydWN0IGJzY19mZCAqYmZkID0gX2RhdGE7CisKKwliZmQtPndoZW4gfD0gQlNDX0ZEX1dSSVRFOworCisJYnNjX3NjaGVkdWxlX3RpbWVyKCZ0aW1lciwgNSwgMCk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgYnNjX2ZkIGJmZDsKKwljaGFyICppZm5hbWU7CisJaW50IHJjOworCisJcHJpbnRmKCJpcGFjY2Vzcy1maW5kIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZVxuIik7CisJcHJpbnRmKCJUaGlzIGlzIEZSRUUgU09GVFdBUkUgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZXG5cbiIpOworCisJaWYgKGFyZ2MgPCAyKSB7CisJCWZwcmludGYoc3Rkb3V0LCAieW91IG1pZ2h0IG5lZWQgdG8gc3BlY2lmeSB0aGUgb3V0Z29pbmdcbiIKKwkJCSIgbmV0d29yayBpbnRlcmZhY2UsIGUuZy4gYGAlcyBldGgwJydcbiIsIGFyZ3ZbMF0pOworCX0KKworCWlmbmFtZSA9IGFyZ3ZbMV07CisJYmZkLmNiID0gYmZkX2NiOworCWJmZC53aGVuID0gQlNDX0ZEX1JFQUQgfCBCU0NfRkRfV1JJVEU7CisJYmZkLmZkID0gdWRwX3NvY2soaWZuYW1lKTsKKwlpZiAoYmZkLmZkIDwgMCkgeworCQlwZXJyb3IoIkNhbm5vdCBjcmVhdGUgbG9jYWwgc29ja2V0IGZvciBicm9hZGNhc3QgdWRwIik7CisJCWV4aXQoMSk7CisJfQorCisJYnNjX3JlZ2lzdGVyX2ZkKCZiZmQpOworCisJdGltZXIuY2IgPSB0aW1lcl9jYjsKKwl0aW1lci5kYXRhID0gJmJmZDsKKworCWJzY19zY2hlZHVsZV90aW1lcigmdGltZXIsIDUsIDApOworCisJcHJpbnRmKCJUcnlpbmcgdG8gZmluZCBpcC5hY2Nlc3MgQlRTIGJ5IGJyb2FkY2FzdCBVRFAuLi5cbiIpOworCisJd2hpbGUgKDEpIHsKKwkJcmMgPSBic2Nfc2VsZWN0X21haW4oMCk7CisJCWlmIChyYyA8IDApCisJCQlleGl0KDMpOworCX0KKworCWV4aXQoMCk7Cit9CisKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2lwYWNjZXNzL2lwYWNjZXNzLWZpcm13YXJlLmMgYi9vcGVuYnNjL3NyYy9pcGFjY2Vzcy9pcGFjY2Vzcy1maXJtd2FyZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNDBjMWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9pcGFjY2Vzcy9pcGFjY2Vzcy1maXJtd2FyZS5jCkBAIC0wLDAgKzEsMTM2IEBACisvKiBSb3V0aW5lcyBmb3IgcGFyc2luZyBhbiBpcGFjY2VzIFNEUCBmaXJtd2FyZSBmaWxlICovCisKKy8qIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvaXBhY2Nlc3MuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNkZWZpbmUgUEFSVF9MRU5HVEggMTM4CisKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCBzZHBfaGVhZGVyX2VudHJ5KSA9PSAxMzgsIHJpZ2h0X2VudHJ5KTsKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCBzZHBfZmlybXdhcmUpID09IDE1OCwgX3JpZ2h0X2hlYWRlcl9sZW5ndGgpOworCisvKiBtb3JlIG1hZ2ljLCB0aGUgc2Vjb25kICJpbnQiIGluIHRoZSBoZWFkZXIgKi8KK3N0YXRpYyBjaGFyIG1vcmVfbWFnaWNbXSA9IHsgMHgxMCwgMHgwMiB9OworCitpbnQgaXBhY2Nlc3NfYW5hbHl6ZV9maWxlKGludCBmZCwgY29uc3QgdW5zaWduZWQgaW50IHN0X3NpemUsIGNvbnN0IHVuc2lnbmVkIGludCBiYXNlX29mZnNldCwgc3RydWN0IGxsaXN0X2hlYWQgKmxpc3QpCit7CisJc3RydWN0IHNkcF9maXJtd2FyZSAqZmlybXdhcmVfaGVhZGVyID0gMDsKKwlzdHJ1Y3Qgc2RwX2hlYWRlciAqaGVhZGVyOworCWNoYXIgYnVmWzQwOTZdOworCWludCByYywgaTsKKwl1X2ludDE2X3QgdGFibGVfc2l6ZTsKKwl1X2ludDE2X3QgdGFibGVfb2Zmc2V0OworCW9mZl90IHRhYmxlX3N0YXJ0OworCisKKwlyYyA9IHJlYWQoZmQsIGJ1Ziwgc2l6ZW9mKCpmaXJtd2FyZV9oZWFkZXIpKTsKKwlpZiAocmMgPCAwKSB7CisJCXBlcnJvcigiQ2FuIG5vdCByZWFkIGhlYWRlciBzdGFydC4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWZpcm13YXJlX2hlYWRlciA9IChzdHJ1Y3Qgc2RwX2Zpcm13YXJlICopICZidWZbMF07CisJaWYgKHN0cm5jbXAoZmlybXdhcmVfaGVhZGVyLT5tYWdpYywgIiBTRFAiLCA0KSAhPSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiV3JvbmcgbWFnaWMuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChtZW1jbXAoZmlybXdhcmVfaGVhZGVyLT5tb3JlX21hZ2ljLCBtb3JlX21hZ2ljLCAyKSAhPSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiV3JvbmcgbW9yZSBtYWdpYy4gR290OiAweCV4ICV4ICV4ICV4XG4iLAorCQkJZmlybXdhcmVfaGVhZGVyLT5tb3JlX21hZ2ljWzBdICYgMHhmZiwgZmlybXdhcmVfaGVhZGVyLT5tb3JlX21hZ2ljWzFdICYgMHhmZiwKKwkJCWZpcm13YXJlX2hlYWRlci0+bW9yZV9tYWdpY1syXSAmIDB4ZmYsIGZpcm13YXJlX2hlYWRlci0+bW9yZV9tYWdpY1szXSAmIDB4ZmYpOworCQlyZXR1cm4gLTE7CisJfQorCisKKwlpZiAobnRvaGwoZmlybXdhcmVfaGVhZGVyLT5maWxlX2xlbmd0aCkgIT0gc3Rfc2l6ZSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlRoZSBmaWxlc2l6ZSBhbmQgdGhlIGhlYWRlciBkbyBub3QgbWF0Y2guXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIGFkZCB0aGUgZmlybXdhcmUgKi8KKwloZWFkZXIgPSB0YWxsb2NfemVybyhsaXN0LCBzdHJ1Y3Qgc2RwX2hlYWRlcik7CisJaGVhZGVyLT5maXJtd2FyZV9pbmZvID0gKmZpcm13YXJlX2hlYWRlcjsKKwlJTklUX0xMSVNUX0hFQUQoJmhlYWRlci0+aGVhZGVyX2xpc3QpOworCWxsaXN0X2FkZCgmaGVhZGVyLT5lbnRyeSwgbGlzdCk7CisKKwl0YWJsZV9vZmZzZXQgPSBudG9ocyhmaXJtd2FyZV9oZWFkZXItPnRhYmxlX29mZnNldCk7CisJdGFibGVfc3RhcnQgPSBsc2VlayhmZCwgdGFibGVfb2Zmc2V0LCBTRUVLX0NVUik7CisJaWYgKHRhYmxlX3N0YXJ0ID09IC0xKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHNlZWsgdG8gdGhlIHJlbCBwb3NpdGlvbjogMHgleFxuIiwgdGFibGVfb2Zmc2V0KTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChyZWFkKGZkLCAmdGFibGVfc2l6ZSwgc2l6ZW9mKHRhYmxlX3NpemUpKSAhPSBzaXplb2YodGFibGVfc2l6ZSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJUaGUgdGFibGUgc2l6ZSBjb3VsZCBub3QgYmUgcmVhZC5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJdGFibGVfc2l6ZSA9IG50b2hzKHRhYmxlX3NpemUpOworCisJaWYgKHRhYmxlX3NpemUgJSBQQVJUX0xFTkdUSCAhPSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVGhlIHBhcnQgbGVuZ3RoIHNlZW1zIHRvIGJlIHdyb25nOiAweCV4XG4iLCB0YWJsZV9zaXplKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIGxvb2sgaW50byBlYWNoIGZpcm13YXJlIG5vdyAqLworCWZvciAoaSA9IDA7IGkgPCB0YWJsZV9zaXplIC8gUEFSVF9MRU5HVEg7ICsraSkgeworCQlzdHJ1Y3Qgc2RwX2hlYWRlcl9lbnRyeSBlbnRyeTsKKwkJc3RydWN0IHNkcF9oZWFkZXJfaXRlbSAqaGVhZGVyX2VudHJ5OworCQl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gdGFibGVfc3RhcnQgKyAyOworCQlvZmZzZXQgKz0gaSAqIDEzODsKKworCQlpZiAobHNlZWsoZmQsIG9mZnNldCwgU0VFS19TRVQpICE9IG9mZnNldCkgeworCQkJZnByaW50ZihzdGRlcnIsICJDYW4gbm90IHNlZWsgdG8gdGhlIG9mZnNldDogJXUuXG4iLCBvZmZzZXQpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJcmMgPSByZWFkKGZkLCAmZW50cnksIHNpemVvZihlbnRyeSkpOworCQlpZiAocmMgIT0gc2l6ZW9mKGVudHJ5KSkgeworCQkJZnByaW50ZihzdGRlcnIsICJDYW4gbm90IHJlYWQgdGhlIGhlYWRlciBlbnRyeS5cbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJaGVhZGVyX2VudHJ5ID0gdGFsbG9jX3plcm8oaGVhZGVyLCAgc3RydWN0IHNkcF9oZWFkZXJfaXRlbSk7CisJCWhlYWRlcl9lbnRyeS0+aGVhZGVyX2VudHJ5ID0gZW50cnk7CisJCWhlYWRlcl9lbnRyeS0+YWJzb2x1dGVfb2Zmc2V0ID0gYmFzZV9vZmZzZXQ7CisJCWxsaXN0X2FkZCgmaGVhZGVyX2VudHJ5LT5lbnRyeSwgJmhlYWRlci0+aGVhZGVyX2xpc3QpOworCisJCS8qIG5vdyB3ZSBuZWVkIHRvIGZpbmQgdGhlIFNEUCBmaWxlLi4uICovCisJCW9mZnNldCA9IG50b2hsKGVudHJ5LnN0YXJ0KSArIDQgKyBiYXNlX29mZnNldDsKKwkJaWYgKGxzZWVrKGZkLCBvZmZzZXQsIFNFRUtfU0VUKSAhPSBvZmZzZXQpIHsKKwkJCXBlcnJvcigiY2FuJ3Qgc2VlayB0byBzZHAiKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisKKwkJaXBhY2Nlc3NfYW5hbHl6ZV9maWxlKGZkLCBudG9obChlbnRyeS5sZW5ndGgpLCBvZmZzZXQsIGxpc3QpOworCX0KKworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9pcGFjY2Vzcy9pcGFjY2Vzcy1wcm94eS5jIGIvb3BlbmJzYy9zcmMvaXBhY2Nlc3MvaXBhY2Nlc3MtcHJveHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTdlMGJkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvaXBhY2Nlc3MvaXBhY2Nlc3MtcHJveHkuYwpAQCAtMCwwICsxLDExMjcgQEAKKy8qIE9wZW5CU0MgQWJpcy9JUCBwcm94eSBpcC5hY2Nlc3MgbmFub0JUUyAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzeXMvZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9pcGFjY2Vzcy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorCitzdGF0aWMgc3RydWN0IGRlYnVnX3RhcmdldCAqc3RkZXJyX3RhcmdldDsKKworLyogb25lIGluc3RhbmNlIG9mIGFuIGlwLmFjY2VzcyBwcm90b2NvbCBwcm94eSAqLworc3RydWN0IGlwYV9wcm94eSB7CisJLyogc29ja2V0IHdoZXJlIHdlIGxpc3RlbiBmb3IgaW5jb21pbmcgT01MIGZyb20gQlRTICovCisJc3RydWN0IGJzY19mZCBvbWxfbGlzdGVuX2ZkOworCS8qIHNvY2tldCB3aGVyZSB3ZSBsaXN0ZW4gZm9yIGluY29taW5nIFJTTCBmcm9tIEJUUyAqLworCXN0cnVjdCBic2NfZmQgcnNsX2xpc3Rlbl9mZDsKKwkvKiBsaXN0IG9mIEJUUydzIChzdHJ1Y3QgaXBhX2J0c19jb25uICovCisJc3RydWN0IGxsaXN0X2hlYWQgYnRzX2xpc3Q7CisJLyogdGhlIEJTQyByZWNvbm5lY3QgdGltZXIgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCByZWNvbm5fdGltZXI7Cit9OworCisvKiBnbG9iYWwgcG9pbnRlciB0byB0aGUgcHJveHkgc3RydWN0dXJlICovCitzdGF0aWMgc3RydWN0IGlwYV9wcm94eSAqaXBwOworCitzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4geworCXN0cnVjdCBic2NfZmQgZmQ7CisJc3RydWN0IGxsaXN0X2hlYWQgdHhfcXVldWU7CisJc3RydWN0IGlwYV9idHNfY29ubiAqYnRzX2Nvbm47Cit9OworCisjZGVmaW5lIE1BWF9UUlggNAorCisvKiByZXByZXNlbnRzIGEgcGFydGljdWxhciBCVFMgaW4gb3VyIHByb3h5ICovCitzdHJ1Y3QgaXBhX2J0c19jb25uIHsKKwkvKiBsaXN0IG9mIEJUUydzIChpcGFfcHJveHktPmJ0c19saXN0KSAqLworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisJLyogYmFjayBwb2ludGVyIHRvIHRoZSBwcm94eSB3aGljaCB3ZSBiZWxvbmcgdG8gKi8KKwlzdHJ1Y3QgaXBhX3Byb3h5ICppcHA7CisJLyogdGhlIHVuaXQgSUQgYXMgZGV0ZXJtaW5lZCBieSBDQ00gKi8KKwlzdHJ1Y3QgeworCQl1X2ludDE2X3Qgc2l0ZV9pZDsKKwkJdV9pbnQxNl90IGJ0c19pZDsKKwl9IHVuaXRfaWQ7CisKKwkvKiBpbmNvbWluZyBjb25uZWN0aW9ucyBmcm9tIEJUUyAqLworCXN0cnVjdCBpcGFfcHJveHlfY29ubiAqb21sX2Nvbm47CisJc3RydWN0IGlwYV9wcm94eV9jb25uICpyc2xfY29ubltNQVhfVFJYXTsKKworCS8qIG91dGdvaW5nIGNvbm5lY3Rpb25zIHRvIEJTQyAqLworCXN0cnVjdCBpcGFfcHJveHlfY29ubiAqYnNjX29tbF9jb25uOworCXN0cnVjdCBpcGFfcHJveHlfY29ubiAqYnNjX3JzbF9jb25uW01BWF9UUlhdOworCisJLyogVURQIHNvY2tldHMgZm9yIEJUUyBhbmQgQlNDIGluamVjdGlvbiAqLworCXN0cnVjdCBic2NfZmQgdWRwX2J0c19mZDsKKwlzdHJ1Y3QgYnNjX2ZkIHVkcF9ic2NfZmQ7CisKKwljaGFyICppZF90YWdzWzB4ZmZdOworCXVfaW50OF90ICppZF9yZXNwOworCXVuc2lnbmVkIGludCBpZF9yZXNwX2xlbjsKK307CisKK2VudW0gaXBwX2ZkX3R5cGUgeworCU9NTF9GUk9NX0JUUyA9IDEsCisJUlNMX0ZST01fQlRTID0gMiwKKwlPTUxfVE9fQlNDID0gMywKKwlSU0xfVE9fQlNDID0gNCwKKwlVRFBfVE9fQlRTID0gNSwKKwlVRFBfVE9fQlNDID0gNiwKK307CisKKy8qIHNvbWUgb2YgdGhlIGNvZGUgYWdhaW5zdCB3ZSBsaW5rIGZyb20gT3BlbkJTQyBuZWVkcyB0aGlzICovCit2b2lkICp0YWxsX2JzY19jdHg7CisKK3N0YXRpYyBjaGFyICpsaXN0ZW5faXBhZGRyOworc3RhdGljIGNoYXIgKmJzY19pcGFkZHI7CisKKyNkZWZpbmUgUFJPWFlfQUxMT0NfU0laRQkzMDAKKworc3RhdGljIGNvbnN0IHVfaW50OF90IHBvbmdbXSA9IHsgMCwgMSwgSVBBQ19QUk9UT19JUEFDQ0VTUywgSVBBQ19NU0dUX1BPTkcgfTsKK3N0YXRpYyBjb25zdCB1X2ludDhfdCBpZF9hY2tbXSA9IHsgMCwgMSwgSVBBQ19QUk9UT19JUEFDQ0VTUywgSVBBQ19NU0dUX0lEX0FDSyB9Oworc3RhdGljIGNvbnN0IHVfaW50OF90IGlkX3JlcVtdID0geyAwLCAxNywgSVBBQ19QUk9UT19JUEFDQ0VTUywgSVBBQ19NU0dUX0lEX0dFVCwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19VTklULAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX01BQ0FERFIsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfTE9DQVRJT04xLAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX0xPQ0FUSU9OMiwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19FUVVJUFZFUlMsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfU1dWRVJTSU9OLAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX1VOSVROQU1FLAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX1NFUk5SLAorCQkJCX07CisKK3N0YXRpYyBjb25zdCBjaGFyICppZHRhZ19uYW1lc1tdID0geworCVtJUEFDX0lEVEFHX1NFUk5SXQk9ICJTZXJpYWxfTnVtYmVyIiwKKwlbSVBBQ19JRFRBR19VTklUTkFNRV0JPSAiVW5pdF9OYW1lIiwKKwlbSVBBQ19JRFRBR19MT0NBVElPTjFdCT0gIkxvY2F0aW9uXzEiLAorCVtJUEFDX0lEVEFHX0xPQ0FUSU9OMl0JPSAiTG9jYXRpb25fMiIsCisJW0lQQUNfSURUQUdfRVFVSVBWRVJTXQk9ICJFcXVpcG1lbnRfVmVyc2lvbiIsCisJW0lQQUNfSURUQUdfU1dWRVJTSU9OXQk9ICJTb2Z0d2FyZV9WZXJzaW9uIiwKKwlbSVBBQ19JRFRBR19JUEFERFJdCT0gIklQX0FkZHJlc3MiLAorCVtJUEFDX0lEVEFHX01BQ0FERFJdCT0gIk1BQ19BZGRyZXNzIiwKKwlbSVBBQ19JRFRBR19VTklUXQk9ICJVbml0X0lEIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICppcGFjX2lkdGFnX25hbWUoaW50IHRhZykKK3sKKwlpZiAodGFnID49IEFSUkFZX1NJWkUoaWR0YWdfbmFtZXMpKQorCQlyZXR1cm4gInVua25vd24iOworCisJcmV0dXJuIGlkdGFnX25hbWVzW3RhZ107Cit9CisKK3N0YXRpYyBpbnQgaXBhY19pZHRhZ19wYXJzZShzdHJ1Y3QgdGx2X3BhcnNlZCAqZGVjLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4pCit7CisJdV9pbnQ4X3QgdF9sZW47CisJdV9pbnQ4X3QgdF90YWc7CisJdV9pbnQ4X3QgKmN1ciA9IGJ1ZjsKKworCXdoaWxlIChjdXIgPCBidWYgKyBsZW4pIHsKKwkJdF9sZW4gPSAqY3VyKys7CisJCXRfdGFnID0gKmN1cisrOworCisJCURFQlVHUEMoRE1JLCAiJXM9JyVzJyAiLCBpcGFjX2lkdGFnX25hbWUodF90YWcpLCBjdXIpOworCisJCWRlYy0+bHZbdF90YWddLmxlbiA9IHRfbGVuOworCQlkZWMtPmx2W3RfdGFnXS52YWwgPSBjdXI7CisKKwkJY3VyICs9IHRfbGVuOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXJzZV91bml0aWQoY29uc3QgY2hhciAqc3RyLCB1X2ludDE2X3QgKnNpdGVfaWQsIHVfaW50MTZfdCAqYnRzX2lkLAorCQkJdV9pbnQxNl90ICp0cnhfaWQpCit7CisJdW5zaWduZWQgbG9uZyB1bDsKKwljaGFyICplbmRwdHI7CisJY29uc3QgY2hhciAqbnB0cjsKKworCW5wdHIgPSBzdHI7CisJdWwgPSBzdHJ0b3VsKG5wdHIsICZlbmRwdHIsIDEwKTsKKwlpZiAoZW5kcHRyIDw9IG5wdHIpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChzaXRlX2lkKQorCQkqc2l0ZV9pZCA9IHVsICYgMHhmZmZmOworCisJaWYgKCplbmRwdHIrKyAhPSAnLycpCisJCXJldHVybiAtRUlOVkFMOworCisJbnB0ciA9IGVuZHB0cjsKKwl1bCA9IHN0cnRvdWwobnB0ciwgJmVuZHB0ciwgMTApOworCWlmIChlbmRwdHIgPD0gbnB0cikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGJ0c19pZCkKKwkJKmJ0c19pZCA9IHVsICYgMHhmZmZmOworCisJaWYgKCplbmRwdHIrKyAhPSAnLycpCisJCXJldHVybiAtRUlOVkFMOworCisJbnB0ciA9IGVuZHB0cjsKKwl1bCA9IHN0cnRvdWwobnB0ciwgJmVuZHB0ciwgMTApOworCWlmIChlbmRwdHIgPD0gbnB0cikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHRyeF9pZCkKKwkJKnRyeF9pZCA9IHVsICYgMHhmZmZmOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXBhX2J0c19jb25uICpmaW5kX2J0c19ieV91bml0aWQoc3RydWN0IGlwYV9wcm94eSAqaXBwLAorCQkJCQkJdV9pbnQxNl90IHNpdGVfaWQsCisJCQkJCQl1X2ludDE2X3QgYnRzX2lkKQoreworCXN0cnVjdCBpcGFfYnRzX2Nvbm4gKmlwYmM7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShpcGJjLCAmaXBwLT5idHNfbGlzdCwgbGlzdCkgeworCQlpZiAoaXBiYy0+dW5pdF9pZC5zaXRlX2lkID09IHNpdGVfaWQgJiYKKwkJICAgIGlwYmMtPnVuaXRfaWQuYnRzX2lkID09IGJ0c19pZCkKKwkJCXJldHVybiBpcGJjOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4gKmFsbG9jX2Nvbm4odm9pZCkKK3sKKwlzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4gKmlwYzsKKworCWlwYyA9IHRhbGxvY196ZXJvKHRhbGxfYnNjX2N0eCwgc3RydWN0IGlwYV9wcm94eV9jb25uKTsKKwlpZiAoIWlwYykKKwkJcmV0dXJuIE5VTEw7CisKKwlJTklUX0xMSVNUX0hFQUQoJmlwYy0+dHhfcXVldWUpOworCisJcmV0dXJuIGlwYzsKK30KKworc3RhdGljIGludCBzdG9yZV9pZHRhZ3Moc3RydWN0IGlwYV9idHNfY29ubiAqaXBiYywgc3RydWN0IHRsdl9wYXJzZWQgKnRsdnApCit7CisJdW5zaWduZWQgaW50IGksIGxlbjsKKworCWZvciAoaSA9IDA7IGkgPD0gMHhmZjsgaSsrKSB7CisJCWlmICghVExWUF9QUkVTRU5UKHRsdnAsIGkpKQorCQkJY29udGludWU7CisKKwkJbGVuID0gVExWUF9MRU4odGx2cCwgaSk7CisjaWYgMAorCQlpZiAoIWlwYmMtPmlkX3RhZ3NbaV0pCisJCQlpcGJjLT5pZF90YWdzW2ldID0gdGFsbG9jX3NpemUodGFsbF9ic2NfY3R4LCBsZW4pOworCQllbHNlCisjZW5kaWYKKwkJCWlwYmMtPmlkX3RhZ3NbaV0gPSB0YWxsb2NfcmVhbGxvY19zaXplKGlwYmMsCisJCQkJCQkJICBpcGJjLT5pZF90YWdzW2ldLCBsZW4pOworCQlpZiAoIWlwYmMtPmlkX3RhZ3NbaV0pCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQltZW1zZXQoaXBiYy0+aWRfdGFnc1tpXSwgMCwgbGVuKTsKKwkJLy9tZW1jcHkoaXBiYy0+aWRfdGFnc1tpXSwgVExWUF9WQUwodGx2cCwgaSksIGxlbik7CisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4gKmNvbm5lY3RfYnNjKHN0cnVjdCBzb2NrYWRkcl9pbiAqc2EsIGludCBwcml2X25yLCB2b2lkICpkYXRhKTsKKworI2RlZmluZSBsb2dwX2lwYmNfdWlkKHNzLCBsdmwsIGlwYmMsIHRyeF9pZCkgX2xvZ3BfaXBiY191aWQoc3MsIGx2bCwgX19GSUxFX18sIF9fTElORV9fLCBpcGJjLCB0cnhfaWQpCisKK3N0YXRpYyB2b2lkIF9sb2dwX2lwYmNfdWlkKHVuc2lnbmVkIGludCBzcywgdW5zaWduZWQgaW50IGx2bCwgY2hhciAqZmlsZSwgaW50IGxpbmUsCisJCQkgICBzdHJ1Y3QgaXBhX2J0c19jb25uICppcGJjLCB1X2ludDhfdCB0cnhfaWQpCit7CisJaWYgKGlwYmMpCisJCWRlYnVncDIoc3MsIGx2bCwgZmlsZSwgbGluZSwgMCwgIigldS8ldS8ldSkgIiwgaXBiYy0+dW5pdF9pZC5zaXRlX2lkLAorCQkgICAgIGlwYmMtPnVuaXRfaWQuYnRzX2lkLCB0cnhfaWQpOworCWVsc2UKKwkJZGVidWdwMihzcywgbHZsLCBmaWxlLCBsaW5lLCAwLCAidW5rbm93biAiKTsKK30KKworLyogVURQIHNvY2tldCBoYW5kbGluZyAqLworCitzdGF0aWMgaW50IG1ha2Vfc29jayhzdHJ1Y3QgYnNjX2ZkICpiZmQsIHVfaW50MTZfdCBwb3J0LCBpbnQgcHJvdG8sIGludCBwcml2X25yLAorCQkgICAgIGludCAoKmNiKShzdHJ1Y3QgYnNjX2ZkICpmZCwgdW5zaWduZWQgaW50IHdoYXQpLAorCQkgICAgIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CisJaW50IHJldCwgb24gPSAxOworCisJYmZkLT5mZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCBwcm90byk7CisJYmZkLT5jYiA9IGNiOworCWJmZC0+d2hlbiA9IEJTQ19GRF9SRUFEOworCWJmZC0+ZGF0YSA9IGRhdGE7CisJYmZkLT5wcml2X25yID0gcHJpdl9ucjsKKworCW1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKKwlhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCWFkZHIuc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKKwlhZGRyLnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9BTlk7CisKKwlzZXRzb2Nrb3B0KGJmZC0+ZmQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgJm9uLCBzaXplb2Yob24pKTsKKworCXJldCA9IGJpbmQoYmZkLT5mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwgc2l6ZW9mKGFkZHIpKTsKKwlpZiAocmV0IDwgMCkgeworCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJjb3VsZCBub3QgYmluZCBzb2NrZXQ6ICVzXG4iLAorCQkJc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0ID0gYnNjX3JlZ2lzdGVyX2ZkKGJmZCk7CisJaWYgKHJldCA8IDApIHsKKwkJcGVycm9yKCJyZWdpc3RlciBVRFAgZmQiKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX3VkcF9yZWFkKHN0cnVjdCBic2NfZmQgKmJmZCkKK3sKKwlzdHJ1Y3QgaXBhX2J0c19jb25uICppcGJjID0gYmZkLT5kYXRhOworCXN0cnVjdCBpcGFfcHJveHlfY29ubiAqb3RoZXJfY29ubiA9IE5VTEw7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG1zZ2JfYWxsb2MoUFJPWFlfQUxMT0NfU0laRSwgIkFiaXMvSVAgVURQIik7CisJc3RydWN0IGlwYWNjZXNzX2hlYWQgKmhoOworCWludCByZXQ7CisKKwkvKiB3aXRoIFVEUCBzb2NrZXRzLCB3ZSBjYW5ub3QgcmVhZCBwYXJ0aWFsIHBhY2tldHMgYnV0IGhhdmUgdG8gcmVhZAorCSAqIGFsbCBvZiBpdCBpbiBvbmUgZ28gKi8KKwloaCA9IChzdHJ1Y3QgaXBhY2Nlc3NfaGVhZCAqKSBtc2ctPmRhdGE7CisJcmV0ID0gcmVjdihiZmQtPmZkLCBtc2ctPmRhdGEsIG1zZy0+ZGF0YV9sZW4sIDApOworCWlmIChyZXQgPCAwKSB7CisJCWlmIChlcnJubyAhPSBFQUdBSU4pCisJCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJyZWN2IGVycm9yICAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCXJldHVybiByZXQ7CisJfQorCWlmIChyZXQgPT0gMCkgeworCQlERUJVR1AoRElOUCwgIlVEUCBwZWVyIGRpc2FwcGVhcmVkLCBkZWFkIHNvY2tldFxuIik7CisJCWJzY191bnJlZ2lzdGVyX2ZkKGJmZCk7CisJCWNsb3NlKGJmZC0+ZmQpOworCQliZmQtPmZkID0gLTE7CisJCW1zZ2JfZnJlZShtc2cpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJaWYgKHJldCA8IHNpemVvZigqaGgpKSB7CisJCURFQlVHUChESU5QLCAiY291bGQgbm90IGV2ZW4gcmVhZCBoZWFkZXIhPyFcbiIpOworCQltc2diX2ZyZWUobXNnKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCW1zZ2JfcHV0KG1zZywgcmV0KTsKKwltc2ctPmwyaCA9IG1zZy0+ZGF0YSArIHNpemVvZigqaGgpOworCURFQlVHUChETUksICJVRFAgUlg6ICVzXG4iLCBoZXhkdW1wKG1zZy0+ZGF0YSwgbXNnLT5sZW4pKTsKKworCWlmIChoaC0+bGVuICE9IG1zZy0+bGVuIC0gc2l6ZW9mKCpoaCkpIHsKKwkJREVCVUdQKERJTlAsICJsZW5ndGggKCV1LyV1KSBkaXNhZ3JlZXMgd2l0aCBoZWFkZXIoJXUpXG4iLAorCQkJbXNnLT5sZW4sIG1zZy0+bGVuIC0gMywgaGgtPmxlbik7CisJCW1zZ2JfZnJlZShtc2cpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlzd2l0Y2ggKGJmZC0+cHJpdl9uciAmIDB4ZmYpIHsKKwljYXNlIFVEUF9UT19CVFM6CisJCS8qIGluamVjdGlvbiB0b3dhcmRzIEJUUyAqLworCQlzd2l0Y2ggKGhoLT5wcm90bykgeworCQljYXNlIElQQUNfUFJPVE9fUlNMOgorCQkJLyogRklYTUU6IHdoYXQgdG8gZG8gYWJvdXQgVFJYID4gMCAqLworCQkJb3RoZXJfY29ubiA9IGlwYmMtPnJzbF9jb25uWzBdOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlERUJVR1AoRElOUCwgIlVua25vd24gcHJvdG9jb2wgMHglMDJ4LCBzZW5kaW5nIHRvICIKKwkJCQkiT01MIEZEXG4iLCBoaC0+cHJvdG8pOworCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWNhc2UgSVBBQ19QUk9UT19JUEFDQ0VTUzoKKwkJY2FzZSBJUEFDX1BST1RPX09NTDoKKwkJCW90aGVyX2Nvbm4gPSBpcGJjLT5vbWxfY29ubjsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgVURQX1RPX0JTQzoKKwkJLyogaW5qZWN0aW9uIHRvd2FyZHMgQlNDICovCisJCXN3aXRjaCAoaGgtPnByb3RvKSB7CisJCWNhc2UgSVBBQ19QUk9UT19SU0w6CisJCQkvKiBGSVhNRTogd2hhdCB0byBkbyBhYm91dCBUUlggPiAwICovCisJCQlvdGhlcl9jb25uID0gaXBiYy0+YnNjX3JzbF9jb25uWzBdOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlERUJVR1AoRElOUCwgIlVua25vd24gcHJvdG9jb2wgMHglMDJ4LCBzZW5kaW5nIHRvICIKKwkJCQkiT01MIEZEXG4iLCBoaC0+cHJvdG8pOworCQljYXNlIElQQUNfUFJPVE9fSVBBQ0NFU1M6CisJCWNhc2UgSVBBQ19QUk9UT19PTUw6CisJCQlvdGhlcl9jb25uID0gaXBiYy0+YnNjX29tbF9jb25uOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJREVCVUdQKERJTlAsICJVbmtub3duIGZpbGVkZXNjcmlwdG9yIHByaXZfbnI9JTA0eFxuIiwgYmZkLT5wcml2X25yKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKG90aGVyX2Nvbm4pIHsKKwkJLyogZW5xdWV1ZSB0aGUgbWVzc2FnZSBmb3IgVFggb24gdGhlIHJlc3BlY3RpdmUgRkQgKi8KKwkJbXNnYl9lbnF1ZXVlKCZvdGhlcl9jb25uLT50eF9xdWV1ZSwgbXNnKTsKKwkJb3RoZXJfY29ubi0+ZmQud2hlbiB8PSBCU0NfRkRfV1JJVEU7CisJfSBlbHNlCisJCW1zZ2JfZnJlZShtc2cpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX3VkcF93cml0ZShzdHJ1Y3QgYnNjX2ZkICpiZmQpCit7CisJLyogbm90IGltcGxlbWVudGVkIHlldCAqLworCWJmZC0+d2hlbiAmPSB+QlNDX0ZEX1dSSVRFOworCisJcmV0dXJuIC1FSU87Cit9CisKKy8qIGNhbGxiYWNrIGZyb20gc2VsZWN0LmMgaW4gY2FzZSBvbmUgb2YgdGhlIGZkJ3MgY2FuIGJlIHJlYWQvd3JpdHRlbiAqLworc3RhdGljIGludCB1ZHBfZmRfY2Ioc3RydWN0IGJzY19mZCAqYmZkLCB1bnNpZ25lZCBpbnQgd2hhdCkKK3sKKwlpbnQgcmMgPSAwOworCisJaWYgKHdoYXQgJiBCU0NfRkRfUkVBRCkKKwkJcmMgPSBoYW5kbGVfdWRwX3JlYWQoYmZkKTsKKwlpZiAod2hhdCAmIEJTQ19GRF9XUklURSkKKwkJcmMgPSBoYW5kbGVfdWRwX3dyaXRlKGJmZCk7CisKKwlyZXR1cm4gcmM7Cit9CisKKworc3RhdGljIGludCBpcGJjX2FsbG9jX2Nvbm5lY3Qoc3RydWN0IGlwYV9wcm94eV9jb25uICppcGMsIHN0cnVjdCBic2NfZmQgKmJmZCwKKwkJCSAgICAgIHVfaW50MTZfdCBzaXRlX2lkLCB1X2ludDE2X3QgYnRzX2lkLAorCQkJICAgICAgdV9pbnQxNl90IHRyeF9pZCwgc3RydWN0IHRsdl9wYXJzZWQgKnRsdnAsCisJCQkgICAgICBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBpcGFfYnRzX2Nvbm4gKmlwYmM7CisJdV9pbnQxNl90IHVkcF9wb3J0OworCWludCByZXQgPSAwOworCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW47CisKKwltZW1zZXQoJnNpbiwgMCwgc2l6ZW9mKHNpbikpOworCXNpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlpbmV0X2F0b24oYnNjX2lwYWRkciwgJnNpbi5zaW5fYWRkcik7CisKKwlERUJVR1AoRElOUCwgIigldS8ldS8ldSkgTmV3IEJUUyBjb25uZWN0aW9uOiAiLAorCQlzaXRlX2lkLCBidHNfaWQsIHRyeF9pZCk7CisKKwkvKiBPTUwgbmVlZHMgdG8gYmUgZXN0YWJsaXNoZWQgYmVmb3JlIFJTTCAqLworCWlmICgoYmZkLT5wcml2X25yICYgMHhmZikgIT0gT01MX0ZST01fQlRTKSB7CisJCURFQlVHUEMoRElOUCwgIk5vdCBhIE9NTCBjb25uZWN0aW9uID8hP1xuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIGFsbG9jYXRlIG5ldyBCVFMgY29ubmVjdGlvbiBkYXRhIHN0cnVjdHVyZSAqLworCWlwYmMgPSB0YWxsb2NfemVybyh0YWxsX2JzY19jdHgsIHN0cnVjdCBpcGFfYnRzX2Nvbm4pOworCWlmICghaXBiYykgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJREVCVUdQQyhESU5QLCAiQ3JlYXRlZCBCVFMgQ29ubiBkYXRhIHN0cnVjdHVyZVxuIik7CisJaXBiYy0+aXBwID0gaXBwOworCWlwYmMtPnVuaXRfaWQuc2l0ZV9pZCA9IHNpdGVfaWQ7CisJaXBiYy0+dW5pdF9pZC5idHNfaWQgPSBidHNfaWQ7CisJaXBiYy0+b21sX2Nvbm4gPSBpcGM7CisJaXBjLT5idHNfY29ubiA9IGlwYmM7CisKKwkvKiBzdG9yZSB0aGUgY29udGVudCBvZiB0aGUgSUQgVEFHUyBmb3IgbGF0ZXIgcmVmZXJlbmNlICovCisJc3RvcmVfaWR0YWdzKGlwYmMsIHRsdnApOworCWlwYmMtPmlkX3Jlc3BfbGVuID0gbXNnLT5sZW47CisJaXBiYy0+aWRfcmVzcCA9IHRhbGxvY19zaXplKHRhbGxfYnNjX2N0eCwgaXBiYy0+aWRfcmVzcF9sZW4pOworCW1lbWNweShpcGJjLT5pZF9yZXNwLCBtc2ctPmRhdGEsIGlwYmMtPmlkX3Jlc3BfbGVuKTsKKworCS8qIENyZWF0ZSBPTUwgVENQIGNvbm5lY3Rpb24gdG93YXJkcyBCU0MgKi8KKwlzaW4uc2luX3BvcnQgPSBodG9ucyhJUEFfVENQX1BPUlRfT01MKTsKKwlpcGJjLT5ic2Nfb21sX2Nvbm4gPSBjb25uZWN0X2JzYygmc2luLCBPTUxfVE9fQlNDLCBpcGJjKTsKKwlpZiAoIWlwYmMtPmJzY19vbWxfY29ubikgeworCQlyZXQgPSAtRUlPOworCQlnb3RvIGVycl9ic2NfY29ubjsKKwl9CisKKwlERUJVR1AoRElOUCwgIigldS8ldS8ldSkgT01MIENvbm5lY3RlZCB0byBCU0NcbiIsCisJCXNpdGVfaWQsIGJ0c19pZCwgdHJ4X2lkKTsKKworCS8qIENyZWF0ZSBVRFAgc29ja2V0IGZvciBCVFMgcGFja2V0IGluamVjdGlvbiAqLworCXVkcF9wb3J0ID0gMTAwMDAgKyAoc2l0ZV9pZCAlIDEwMDApKjEwMCArIChidHNfaWQgJSAxMDApOworCXJldCA9IG1ha2Vfc29jaygmaXBiYy0+dWRwX2J0c19mZCwgdWRwX3BvcnQsIElQUFJPVE9fVURQLAorCQkJVURQX1RPX0JUUywgdWRwX2ZkX2NiLCBpcGJjKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfdWRwX2J0czsKKwlERUJVR1AoRElOUCwgIigldS8ldS8ldSkgQ3JlYXRlZCBVRFAgc29ja2V0IGZvciBpbmplY3Rpb24gIgorCQkidG93YXJkcyBCVFMgYXQgcG9ydCAldVxuIiwgc2l0ZV9pZCwgYnRzX2lkLCB0cnhfaWQsIHVkcF9wb3J0KTsKKworCS8qIENyZWF0ZSBVRFAgc29ja2V0IGZvciBCU0MgcGFja2V0IGluamVjdGlvbiAqLworCXVkcF9wb3J0ID0gMjAwMDAgKyAoc2l0ZV9pZCAlIDEwMDApKjEwMCArIChidHNfaWQgJSAxMDApOworCXJldCA9IG1ha2Vfc29jaygmaXBiYy0+dWRwX2JzY19mZCwgdWRwX3BvcnQsIElQUFJPVE9fVURQLAorCQkJVURQX1RPX0JTQywgdWRwX2ZkX2NiLCBpcGJjKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfdWRwX2JzYzsKKwlERUJVR1AoRElOUCwgIigldS8ldS8ldSkgQ3JlYXRlZCBVRFAgc29ja2V0IGZvciBpbmplY3Rpb24gIgorCQkidG93YXJkcyBCU0MgYXQgcG9ydCAldVxuIiwgc2l0ZV9pZCwgYnRzX2lkLCB0cnhfaWQsIHVkcF9wb3J0KTsKKwlsbGlzdF9hZGQoJmlwYmMtPmxpc3QsICZpcHAtPmJ0c19saXN0KTsKKworCXJldHVybiAwOworCitlcnJfdWRwX2JzYzoKKwlic2NfdW5yZWdpc3Rlcl9mZCgmaXBiYy0+dWRwX2J0c19mZCk7CitlcnJfdWRwX2J0czoKKwlic2NfdW5yZWdpc3Rlcl9mZCgmaXBiYy0+YnNjX29tbF9jb25uLT5mZCk7CisJY2xvc2UoaXBiYy0+YnNjX29tbF9jb25uLT5mZC5mZCk7CisJdGFsbG9jX2ZyZWUoaXBiYy0+YnNjX29tbF9jb25uKTsKKwlpcGJjLT5ic2Nfb21sX2Nvbm4gPSBOVUxMOworZXJyX2JzY19jb25uOgorCXRhbGxvY19mcmVlKGlwYmMtPmlkX3Jlc3ApOworCXRhbGxvY19mcmVlKGlwYmMpOworI2lmIDAKKwlic2NfdW5yZWdpc3Rlcl9mZChiZmQpOworCWNsb3NlKGJmZC0+ZmQpOworCXRhbGxvY19mcmVlKGJmZCk7CisjZW5kaWYKK2Vycl9vdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpcGFjY2Vzc19yY3Ztc2coc3RydWN0IGlwYV9wcm94eV9jb25uICppcGMsIHN0cnVjdCBtc2diICptc2csCisJCQkgICBzdHJ1Y3QgYnNjX2ZkICpiZmQpCit7CisJc3RydWN0IHRsdl9wYXJzZWQgdGx2cDsKKwl1X2ludDhfdCBtc2dfdHlwZSA9ICoobXNnLT5sMmgpOworCXVfaW50MTZfdCBzaXRlX2lkLCBidHNfaWQsIHRyeF9pZDsKKwlzdHJ1Y3QgaXBhX2J0c19jb25uICppcGJjOworCWludCByZXQgPSAwOworCisJc3dpdGNoIChtc2dfdHlwZSkgeworCWNhc2UgSVBBQ19NU0dUX1BJTkc6CisJCXJldCA9IHdyaXRlKGJmZC0+ZmQsIHBvbmcsIHNpemVvZihwb25nKSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJaWYgKHJldCA8IHNpemVvZihwb25nKSkgeworCQkJREVCVUdQKERJTlAsICJzaG9ydCB3cml0ZVxuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlicmVhazsKKwljYXNlIElQQUNfTVNHVF9QT05HOgorCQlERUJVR1AoRE1JLCAiUE9ORyFcbiIpOworCQlicmVhazsKKwljYXNlIElQQUNfTVNHVF9JRF9SRVNQOgorCQlERUJVR1AoRE1JLCAiSURfUkVTUCAiKTsKKwkJLyogcGFyc2UgdGFncywgc2VhcmNoIGZvciBVbml0IElEICovCisJCWlwYWNfaWR0YWdfcGFyc2UoJnRsdnAsICh1X2ludDhfdCAqKW1zZy0+bDJoICsgMiwKKwkJCQkgbXNnYl9sMmxlbihtc2cpLTIpOworCQlERUJVR1AoRE1JLCAiXG4iKTsKKworCQlpZiAoIVRMVlBfUFJFU0VOVCgmdGx2cCwgSVBBQ19JRFRBR19VTklUKSkgeworCQkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAiTm8gVW5pdCBJRCBpbiBJRCBSRVNQT05TRSAhPyFcbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKworCQkvKiBsb29rdXAgQlRTLCBjcmVhdGUgc2lnbl9saW5rLCAuLi4gKi8KKwkJcGFyc2VfdW5pdGlkKChjaGFyICopVExWUF9WQUwoJnRsdnAsIElQQUNfSURUQUdfVU5JVCksCisJCQkgICAgICZzaXRlX2lkLCAmYnRzX2lkLCAmdHJ4X2lkKTsKKwkJaXBiYyA9IGZpbmRfYnRzX2J5X3VuaXRpZChpcHAsIHNpdGVfaWQsIGJ0c19pZCk7CisJCWlmICghaXBiYykgeworCQkJLyogV2UgaGF2ZSBub3QgZm91bmQgYW4gaXBiYyAocGVyLWJ0cyBwcm94eSBpbnN0YW5jZSkKKwkJCSAqIGZvciB0aGlzIEJUUyB5ZXQuICBUaGUgZmlyc3QgY29ubmVjdGlvbiBvZiBhIG5ldyBCVFMgbXVzdAorCQkJICogYmUgYSBPTUwgY29ubmVjdGlvbi4gIFdlIGFsbG9jYXRlIHRoZSBhc3NvY2lhdGVkIGRhdGEgc3RydWN0dXJlcywKKwkJCSAqIGFuZCB0cnkgdG8gY29ubmVjdCB0byB0aGUgcmVtb3RlIGVuZCAqLworCisJCQlyZXR1cm4gaXBiY19hbGxvY19jb25uZWN0KGlwYywgYmZkLCBzaXRlX2lkLCBidHNfaWQsCisJCQkJCQkgIHRyeF9pZCwgJnRsdnAsIG1zZyk7CisJCQkvKiBpZiB0aGlzIGZhaWxzLCB0aGUgY2FsbGVyIHdpbGwgY2xlYW4gdXAgYmZkICovCisJCX0gZWxzZSB7CisJCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOworCQkJbWVtc2V0KCZzaW4sIDAsIHNpemVvZihzaW4pKTsKKwkJCXNpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJCWluZXRfYXRvbihic2NfaXBhZGRyLCAmc2luLnNpbl9hZGRyKTsKKworCQkJREVCVUdQKERJTlAsICJJZGVudGlmaWVkIEJUUyAldS8ldS8ldVxuIiwKKwkJCQlzaXRlX2lkLCBidHNfaWQsIHRyeF9pZCk7CisKKwkJCWlmICgoYmZkLT5wcml2X25yICYgMHhmZikgIT0gUlNMX0ZST01fQlRTKSB7CisJCQkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAiU2Vjb25kIE9NTCBjb25uZWN0aW9uIGZyb20gIgorCQkJCSAgICAgInNhbWUgQlRTID8hP1xuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJCWlmICh0cnhfaWQgPiBNQVhfVFJYKSB7CisJCQkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAiV2UgZG9uJ3Qgc3VwcG9ydCBtb3JlICIKKwkJCQkgICAgICJ0aGFuICV1IFRSWFxuIiwgTUFYX1RSWCk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisKKwkJCWlwYy0+YnRzX2Nvbm4gPSBpcGJjOworCQkJLyogc3RvcmUgVFJYIG51bWJlciBpbiBoaWdoZXIgOCBiaXQgb2YgdGhlIGJmZCBwcml2YXRlIG51bWJlciAqLworCQkJYmZkLT5wcml2X25yIHw9IHRyeF9pZCA8PCA4OworCQkJaXBiYy0+cnNsX2Nvbm5bdHJ4X2lkXSA9IGlwYzsKKworCQkJLyogQ3JlYXRlIFJTTCBUQ1AgY29ubmVjdGlvbiB0b3dhcmRzIEJTQyAqLworCQkJc2luLnNpbl9wb3J0ID0gaHRvbnMoSVBBX1RDUF9QT1JUX1JTTCk7CisJCQlpcGJjLT5ic2NfcnNsX2Nvbm5bdHJ4X2lkXSA9CisJCQkJY29ubmVjdF9ic2MoJnNpbiwgUlNMX1RPX0JTQyB8ICh0cnhfaWQgPDwgOCksIGlwYmMpOworCQkJaWYgKCFpcGJjLT5ic2Nfb21sX2Nvbm4pCisJCQkJcmV0dXJuIC1FSU87CisJCQlERUJVR1AoRElOUCwgIigldS8ldS8ldSkgQ29ubmVjdGVkIFJTTCB0byBCU0NcbiIsCisJCQkJc2l0ZV9pZCwgYnRzX2lkLCB0cnhfaWQpOworCQl9CisJCWJyZWFrOworCWNhc2UgSVBBQ19NU0dUX0lEX0dFVDoKKwkJREVCVUdQKERNSSwgIklEX0dFVFxuIik7CisJCWlmICgoYmZkLT5wcml2X25yICYgMHhmZikgIT0gT01MX1RPX0JTQyAmJgorCQkgICAgKGJmZC0+cHJpdl9uciAmIDB4ZmYpICE9IFJTTF9UT19CU0MpIHsKKwkJCURFQlVHUChESU5QLCAiSURlbnRpdHkgUkVRdWVzdCBmcm9tIEJUUyA/IT9cbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJaXBiYyA9IGlwYy0+YnRzX2Nvbm47CisJCWlmICghaXBiYykgeworCQkJREVCVUdQKERJTlAsICJJRF9HRVQgZnJvbSBCU0MgYmVmb3JlIHdlIGhhdmUgSURfUkVTUCBmcm9tIEJUU1xuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlyZXQgPSB3cml0ZShiZmQtPmZkLCBpcGJjLT5pZF9yZXNwLCBpcGJjLT5pZF9yZXNwX2xlbik7CisJCWJyZWFrOworCWNhc2UgSVBBQ19NU0dUX0lEX0FDSzoKKwkJREVCVUdQKERNSSwgIklEX0FDSz8gLT4gQUNLIVxuIik7CisJCXJldCA9IHdyaXRlKGJmZC0+ZmQsIGlkX2Fjaywgc2l6ZW9mKGlkX2FjaykpOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBtc2diICppcGFjY2Vzc19yZWFkX21zZyhzdHJ1Y3QgYnNjX2ZkICpiZmQsIGludCAqZXJyb3IpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG1zZ2JfYWxsb2MoUFJPWFlfQUxMT0NfU0laRSwgIkFiaXMvSVAiKTsKKwlzdHJ1Y3QgaXBhY2Nlc3NfaGVhZCAqaGg7CisJaW50IGxlbiwgcmV0ID0gMDsKKworCWlmICghbXNnKSB7CisJCSplcnJvciA9IC1FTk9NRU07CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIGZpcnN0IHJlYWQgb3VyIDMtYnl0ZSBoZWFkZXIgKi8KKwloaCA9IChzdHJ1Y3QgaXBhY2Nlc3NfaGVhZCAqKSBtc2ctPmRhdGE7CisJcmV0ID0gcmVjdihiZmQtPmZkLCBtc2ctPmRhdGEsIDMsIDApOworCWlmIChyZXQgPCAwKSB7CisJCWlmIChlcnJubyAhPSBFQUdBSU4pCisJCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJyZWN2IGVycm9yOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCSplcnJvciA9IHJldDsKKwkJcmV0dXJuIE5VTEw7CisJfSBlbHNlIGlmIChyZXQgPT0gMCkgeworCQltc2diX2ZyZWUobXNnKTsKKwkJKmVycm9yID0gcmV0OworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltc2diX3B1dChtc2csIHJldCk7CisKKwkvKiB0aGVuIHJlYWQgdGUgbGVuZ3RoIGFzIHNwZWNpZmllZCBpbiBoZWFkZXIgKi8KKwltc2ctPmwyaCA9IG1zZy0+ZGF0YSArIHNpemVvZigqaGgpOworCWxlbiA9IG50b2hzKGhoLT5sZW4pOworCXJldCA9IHJlY3YoYmZkLT5mZCwgbXNnLT5sMmgsIGxlbiwgMCk7CisJaWYgKHJldCA8IGxlbikgeworCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJzaG9ydCByZWFkIVxuIik7CisJCW1zZ2JfZnJlZShtc2cpOworCQkqZXJyb3IgPSAtRUlPOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbXNnYl9wdXQobXNnLCByZXQpOworCisJcmV0dXJuIG1zZzsKK30KKworc3RhdGljIHN0cnVjdCBpcGFfcHJveHlfY29ubiAqaXBjX2J5X3ByaXZfbnIoc3RydWN0IGlwYV9idHNfY29ubiAqaXBiYywKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgcHJpdl9ucikKK3sKKwlzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4gKmJzY19jb25uOworCXVuc2lnbmVkIGludCB0cnhfaWQgPSBwcml2X25yID4+IDg7CisKKwlzd2l0Y2ggKHByaXZfbnIgJiAweGZmKSB7CisJY2FzZSBPTUxfRlJPTV9CVFM6IC8qIGluY29taW5nIE9NTCBkYXRhIGZyb20gQlRTLCBmb3J3YXJkIHRvIEJTQyBPTUwgKi8KKwkJYnNjX2Nvbm4gPSBpcGJjLT5ic2Nfb21sX2Nvbm47CisJCWJyZWFrOworCWNhc2UgUlNMX0ZST01fQlRTOiAvKiBpbmNvbWluZyBSU0wgZGF0YSBmcm9tIEJUUywgZm9yd2FyZCB0byBCU0MgUlNMICovCisJCWJzY19jb25uID0gaXBiYy0+YnNjX3JzbF9jb25uW3RyeF9pZF07CisJCWJyZWFrOworCWNhc2UgT01MX1RPX0JTQzogLyogaW5jb21pbmcgT01MIGRhdGEgZnJvbSBCU0MsIGZvcndhcmQgdG8gQlRTIE9NTCAqLworCQlic2NfY29ubiA9IGlwYmMtPm9tbF9jb25uOworCQlicmVhazsKKwljYXNlIFJTTF9UT19CU0M6IC8qIGluY29taW5nIFJTTCBkYXRhIGZyb20gQlNDLCBmb3J3YXJkIHRvIEJUUyBSU0wgKi8KKwkJYnNjX2Nvbm4gPSBpcGJjLT5yc2xfY29ublt0cnhfaWRdOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlic2NfY29ubiA9IE5VTEw7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gYnNjX2Nvbm47Cit9CisKK3N0YXRpYyB2b2lkIHJlY29ubl90bXJfY2Iodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaXBhX3Byb3h5ICppcHAgPSBkYXRhOworCXN0cnVjdCBpcGFfYnRzX2Nvbm4gKmlwYmM7CisJc3RydWN0IHNvY2thZGRyX2luIHNpbjsKKwlpbnQgaTsKKworCURFQlVHUChESU5QLCAiUnVubmluZyByZWNvbm5lY3QgdGltZXJcbiIpOworCisJbWVtc2V0KCZzaW4sIDAsIHNpemVvZihzaW4pKTsKKwlzaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJaW5ldF9hdG9uKGJzY19pcGFkZHIsICZzaW4uc2luX2FkZHIpOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoaXBiYywgJmlwcC0+YnRzX2xpc3QsIGxpc3QpIHsKKwkJLyogaWYgT01MIHRvIEJTQyBpcyBkZWFkLCB0cnkgdG8gcmVzdG9yZSBpdCAqLworCQlpZiAoaXBiYy0+b21sX2Nvbm4gJiYgIWlwYmMtPmJzY19vbWxfY29ubikgeworCQkJc2luLnNpbl9wb3J0ID0gaHRvbnMoSVBBX1RDUF9QT1JUX09NTCk7CisJCQlsb2dwX2lwYmNfdWlkKERJTlAsIExPR0xfTk9USUNFLCBpcGJjLCAwKTsKKwkJCUxPR1BDKERJTlAsIExPR0xfTk9USUNFLCAiT01MIFRyeWluZyB0byByZWNvbm5lY3RcbiIpOworCQkJaXBiYy0+YnNjX29tbF9jb25uID0gY29ubmVjdF9ic2MoJnNpbiwgT01MX1RPX0JTQywgaXBiYyk7CisJCQlpZiAoIWlwYmMtPmJzY19vbWxfY29ubikKKwkJCQlnb3RvIHJlc2NoZWR1bGU7CisJCQlsb2dwX2lwYmNfdWlkKERJTlAsIExPR0xfTk9USUNFLCBpcGJjLCAwKTsKKwkJCUxPR1BDKERJTlAsIExPR0xfTk9USUNFLCAiT01MIFJlY29ubmVjdGVkXG4iKTsKKwkJfQorCQkvKiBpZiB3ZSAoc3RpbGwpIGRvbid0IGhhdmUgYSBPTUwgY29ubmVjdGlvbiwgc2tpcCBSU0wgKi8KKwkJaWYgKCFpcGJjLT5vbWxfY29ubiB8fCAhaXBiYy0+YnNjX29tbF9jb25uKQorCQkJY29udGludWU7CisKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaXBiYy0+cnNsX2Nvbm4pOyBpKyspIHsKKwkJCXVuc2lnbmVkIGludCBwcml2X25yOworCQkJLyogZG9uJ3QgZXN0YWJsaXNoIFJTTCBsaW5rcyB3aGljaCB3ZSBkb24ndCBoYXZlICovCisJCQlpZiAoIWlwYmMtPnJzbF9jb25uW2ldKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGlwYmMtPmJzY19yc2xfY29ubltpXSkKKwkJCQljb250aW51ZTsKKwkJCXByaXZfbnIgPSBpcGJjLT5yc2xfY29ubltpXS0+ZmQucHJpdl9ucjsKKwkJCXByaXZfbnIgJj0gfjB4ZmY7CisJCQlwcml2X25yIHw9IFJTTF9UT19CU0M7CisJCQlzaW4uc2luX3BvcnQgPSBodG9ucyhJUEFfVENQX1BPUlRfUlNMKTsKKwkJCWxvZ3BfaXBiY191aWQoRElOUCwgTE9HTF9OT1RJQ0UsIGlwYmMsIHByaXZfbnIgPj4gOCk7CisJCQlMT0dQQyhESU5QLCBMT0dMX05PVElDRSwgIlJTTCBUcnlpbmcgdG8gcmVjb25uZWN0XG4iKTsKKwkJCWlwYmMtPmJzY19yc2xfY29ubltpXSA9IGNvbm5lY3RfYnNjKCZzaW4sIHByaXZfbnIsIGlwYmMpOworCQkJaWYgKCFpcGJjLT5ic2NfcnNsX2Nvbm4pCisJCQkJZ290byByZXNjaGVkdWxlOworCQkJbG9ncF9pcGJjX3VpZChESU5QLCBMT0dMX05PVElDRSwgaXBiYywgcHJpdl9uciA+PiA4KTsKKwkJCUxPR1BDKERJTlAsIExPR0xfTk9USUNFLCAiUlNMIFJlY29ubmVjdGVkXG4iKTsKKwkJfQorCX0KKwlyZXR1cm47CisKK3Jlc2NoZWR1bGU6CisJYnNjX3NjaGVkdWxlX3RpbWVyKCZpcHAtPnJlY29ubl90aW1lciwgNSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9kZWFkX3NvY2tldChzdHJ1Y3QgYnNjX2ZkICpiZmQpCit7CisJc3RydWN0IGlwYV9wcm94eV9jb25uICppcGMgPSBiZmQtPmRhdGE7CQkvKiBsb2NhbCBjb25uICovCisJc3RydWN0IGlwYV9wcm94eV9jb25uICpic2NfY29ubjsJCS8qIHJlbW90ZSBjb25uICovCisJc3RydWN0IGlwYV9idHNfY29ubiAqaXBiYyA9IGlwYy0+YnRzX2Nvbm47CisJdW5zaWduZWQgaW50IHRyeF9pZCA9IGJmZC0+cHJpdl9uciA+PiA4OworCXN0cnVjdCBtc2diICptc2csICptc2cyOworCisJYnNjX3VucmVnaXN0ZXJfZmQoYmZkKTsKKwljbG9zZShiZmQtPmZkKTsKKwliZmQtPmZkID0gLTE7CisKKwkvKiBGSVhNRTogY2xlYXIgdHhfcXVldWUsIHJlbW92ZSBhbGwgcmVmZXJlbmNlcywgZXRjLiAqLworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobXNnLCBtc2cyLCAmaXBjLT50eF9xdWV1ZSwgbGlzdCkKKwkJbXNnYl9mcmVlKG1zZyk7CisKKwlzd2l0Y2ggKGJmZC0+cHJpdl9uciAmIDB4ZmYpIHsKKwljYXNlIE9NTF9GUk9NX0JUUzogLyogaW5jb21pbmcgT01MIGRhdGEgZnJvbSBCVFMsIGZvcndhcmQgdG8gQlNDIE9NTCAqLworCQlpcGJjLT5vbWxfY29ubiA9IE5VTEw7CisJCWJzY19jb25uID0gaXBiYy0+YnNjX29tbF9jb25uOworCQkvKiBjbG9zZSB0aGUgY29ubmVjdGlvbiB0byB0aGUgQlNDICovCisJCWJzY191bnJlZ2lzdGVyX2ZkKCZic2NfY29ubi0+ZmQpOworCQljbG9zZShic2NfY29ubi0+ZmQuZmQpOworCQlsbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1zZywgbXNnMiwgJmJzY19jb25uLT50eF9xdWV1ZSwgbGlzdCkKKwkJCW1zZ2JfZnJlZShtc2cpOworCQl0YWxsb2NfZnJlZShic2NfY29ubik7CisJCWlwYmMtPmJzY19vbWxfY29ubiA9IE5VTEw7CisJCS8qIEZJWE1FOiBkbyB3ZSBuZWVkIHRvIGRlbGV0ZSB0aGUgZW50aXJlIGlwYmMgPyAqLworCQlicmVhazsKKwljYXNlIFJTTF9GUk9NX0JUUzogLyogaW5jb21pbmcgUlNMIGRhdGEgZnJvbSBCVFMsIGZvcndhcmQgdG8gQlNDIFJTTCAqLworCQlpcGJjLT5yc2xfY29ublt0cnhfaWRdID0gTlVMTDsKKwkJYnNjX2Nvbm4gPSBpcGJjLT5ic2NfcnNsX2Nvbm5bdHJ4X2lkXTsKKwkJLyogY2xvc2UgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIEJTQyAqLworCQlic2NfdW5yZWdpc3Rlcl9mZCgmYnNjX2Nvbm4tPmZkKTsKKwkJY2xvc2UoYnNjX2Nvbm4tPmZkLmZkKTsKKwkJbGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtc2csIG1zZzIsICZic2NfY29ubi0+dHhfcXVldWUsIGxpc3QpCisJCQltc2diX2ZyZWUobXNnKTsKKwkJdGFsbG9jX2ZyZWUoYnNjX2Nvbm4pOworCQlpcGJjLT5ic2NfcnNsX2Nvbm5bdHJ4X2lkXSA9IE5VTEw7CisJCWJyZWFrOworCWNhc2UgT01MX1RPX0JTQzogLyogaW5jb21pbmcgT01MIGRhdGEgZnJvbSBCU0MsIGZvcndhcmQgdG8gQlRTIE9NTCAqLworCQlpcGJjLT5ic2Nfb21sX2Nvbm4gPSBOVUxMOworCQlic2NfY29ubiA9IGlwYmMtPm9tbF9jb25uOworCQkvKiBzdGFydCByZWNvbm5lY3QgdGltZXIgKi8KKwkJYnNjX3NjaGVkdWxlX3RpbWVyKCZpcHAtPnJlY29ubl90aW1lciwgNSwgMCk7CisJCWJyZWFrOworCWNhc2UgUlNMX1RPX0JTQzogLyogaW5jb21pbmcgUlNMIGRhdGEgZnJvbSBCU0MsIGZvcndhcmQgdG8gQlRTIFJTTCAqLworCQlpcGJjLT5ic2NfcnNsX2Nvbm5bdHJ4X2lkXSA9IE5VTEw7CisJCWJzY19jb25uID0gaXBiYy0+cnNsX2Nvbm5bdHJ4X2lkXTsKKwkJLyogc3RhcnQgcmVjb25uZWN0IHRpbWVyICovCisJCWJzY19zY2hlZHVsZV90aW1lcigmaXBwLT5yZWNvbm5fdGltZXIsIDUsIDApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlic2NfY29ubiA9IE5VTEw7CisJCWJyZWFrOworCX0KKworCXRhbGxvY19mcmVlKGlwYyk7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX3RjcF9yZWFkKHN0cnVjdCBic2NfZmQgKmJmZCkKK3sKKwlzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4gKmlwYyA9IGJmZC0+ZGF0YTsKKwlzdHJ1Y3QgaXBhX2J0c19jb25uICppcGJjID0gaXBjLT5idHNfY29ubjsKKwlzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4gKmJzY19jb25uOworCXN0cnVjdCBtc2diICptc2c7CisJc3RydWN0IGlwYWNjZXNzX2hlYWQgKmhoOworCWludCByZXQgPSAwOworCWNoYXIgKmJ0c2JzYzsKKworCWlmICgoYmZkLT5wcml2X25yICYgMHhmZikgPD0gMikKKwkJYnRzYnNjID0gIkJUUyI7CisJZWxzZQorCQlidHNic2MgPSAiQlNDIjsKKworCW1zZyA9IGlwYWNjZXNzX3JlYWRfbXNnKGJmZCwgJnJldCk7CisJaWYgKCFtc2cpIHsKKwkJaWYgKHJldCA9PSAwKSB7CisJCQlsb2dwX2lwYmNfdWlkKERJTlAsIExPR0xfTk9USUNFLCBpcGJjLCBiZmQtPnByaXZfbnIgPj4gOCk7CisJCQlMT0dQQyhESU5QLCBMT0dMX05PVElDRSwgIiVzIGRpc2FwcGVhcmVkLCAiCisJCQkgICAgICJkZWFkIHNvY2tldFxuIiwgYnRzYnNjKTsKKwkJCWhhbmRsZV9kZWFkX3NvY2tldChiZmQpOworCQl9CisJCXJldHVybiByZXQ7CisJfQorCisJbXNnYl9wdXQobXNnLCByZXQpOworCWxvZ3BfaXBiY191aWQoRE1JLCBMT0dMX0RFQlVHLCBpcGJjLCBiZmQtPnByaXZfbnIgPj4gOCk7CisJREVCVUdQQyhETUksICJSWDwtJXM6ICVzXG4iLCBidHNic2MsIGhleGR1bXAobXNnLT5kYXRhLCBtc2ctPmxlbikpOworCisJaGggPSAoc3RydWN0IGlwYWNjZXNzX2hlYWQgKikgbXNnLT5kYXRhOworCWlmIChoaC0+cHJvdG8gPT0gSVBBQ19QUk9UT19JUEFDQ0VTUykgeworCQlyZXQgPSBpcGFjY2Vzc19yY3Ztc2coaXBjLCBtc2csIGJmZCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlic2NfdW5yZWdpc3Rlcl9mZChiZmQpOworCQkJY2xvc2UoYmZkLT5mZCk7CisJCQliZmQtPmZkID0gLTE7CisJCQl0YWxsb2NfZnJlZShiZmQpOworCQl9CisJCS8qIHdlIGRvIG5vdCBmb3J3YXJkIHRoZSBDQ00gcHJvdG9jb2wgdGhyb3VnaCB0aGUKKwkJICogcHJveHkgYnV0IHJhdGhlciB0ZXJtaW5hdGUgaXQgb3Vyc2VsdmVzICovCisJCW1zZ2JfZnJlZShtc2cpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmICghaXBiYykgeworCQlMT0dQKERJTlAsIExPR0xfRVJST1IsCisJCSAgICAgInJlY2VpdmVkICVzIHBhY2tldCBidXQgbm8gaXBjLT5idHNfY29ubj8hP1xuIiwgYnRzYnNjKTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCXJldHVybiAtRUlPOworCX0KKworCWJzY19jb25uID0gaXBjX2J5X3ByaXZfbnIoaXBiYywgYmZkLT5wcml2X25yKTsKKwlpZiAoYnNjX2Nvbm4pIHsKKwkJLyogZW5xdWV1ZSBwYWNrZXQgdG93YXJkcyBCU0MgKi8KKwkJbXNnYl9lbnF1ZXVlKCZic2NfY29ubi0+dHhfcXVldWUsIG1zZyk7CisJCS8qIG1hcmsgcmVzcGVjdGl2ZSBmaWxlZGVzY3JpcHRvciBhcyAnd2Ugd2FudCB0byB3cml0ZScgKi8KKwkJYnNjX2Nvbm4tPmZkLndoZW4gfD0gQlNDX0ZEX1dSSVRFOworCX0gZWxzZSB7CisJCWxvZ3BfaXBiY191aWQoRElOUCwgTE9HTF9JTkZPLCBpcGJjLCBiZmQtPnByaXZfbnIgPj4gOCk7CisJCUxPR1BDKERJTlAsIExPR0xfSU5GTywgIkRyb3BwaW5nIHBhY2tldCBmcm9tICVzLCAiCisJCSAgICAgInNpbmNlIHJlbW90ZSBjb25uZWN0aW9uIGlzIGRlYWRcbiIsIGJ0c2JzYyk7CisJCW1zZ2JfZnJlZShtc2cpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qIGEgVENQIHNvY2tldCBpcyByZWFkeSB0byBiZSB3cml0dGVuIHRvICovCitzdGF0aWMgaW50IGhhbmRsZV90Y3Bfd3JpdGUoc3RydWN0IGJzY19mZCAqYmZkKQoreworCXN0cnVjdCBpcGFfcHJveHlfY29ubiAqaXBjID0gYmZkLT5kYXRhOworCXN0cnVjdCBpcGFfYnRzX2Nvbm4gKmlwYmMgPSBpcGMtPmJ0c19jb25uOworCXN0cnVjdCBsbGlzdF9oZWFkICpsaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCWNoYXIgKmJ0c2JzYzsKKwlpbnQgcmV0OworCisJaWYgKChiZmQtPnByaXZfbnIgJiAweGZmKSA8PSAyKQorCQlidHNic2MgPSAiQlRTIjsKKwllbHNlCisJCWJ0c2JzYyA9ICJCU0MiOworCisKKwkvKiBnZXQgdGhlIG5leHQgbXNnIGZvciB0aGlzIHRpbWVzbG90ICovCisJaWYgKGxsaXN0X2VtcHR5KCZpcGMtPnR4X3F1ZXVlKSkgeworCQliZmQtPndoZW4gJj0gfkJTQ19GRF9XUklURTsKKwkJcmV0dXJuIDA7CisJfQorCWxoID0gaXBjLT50eF9xdWV1ZS5uZXh0OworCWxsaXN0X2RlbChsaCk7CisJbXNnID0gbGxpc3RfZW50cnkobGgsIHN0cnVjdCBtc2diLCBsaXN0KTsKKworCWxvZ3BfaXBiY191aWQoRE1JLCBMT0dMX0RFQlVHLCBpcGJjLCBiZmQtPnByaXZfbnIgPj4gOCk7CisJREVCVUdQQyhETUksICJUWCAlMDR4OiAlc1xuIiwgYmZkLT5wcml2X25yLAorCQloZXhkdW1wKG1zZy0+ZGF0YSwgbXNnLT5sZW4pKTsKKworCXJldCA9IHNlbmQoYmZkLT5mZCwgbXNnLT5kYXRhLCBtc2ctPmxlbiwgMCk7CisJbXNnYl9mcmVlKG1zZyk7CisKKwlpZiAocmV0ID09IDApIHsKKwkJbG9ncF9pcGJjX3VpZChESU5QLCBMT0dMX05PVElDRSwgaXBiYywgYmZkLT5wcml2X25yID4+IDgpOworCQlMT0dQKERJTlAsIExPR0xfTk9USUNFLCAiJXMgZGlzYXBwZWFyZWQsIGRlYWQgc29ja2V0XG4iLCBidHNic2MpOworCQloYW5kbGVfZGVhZF9zb2NrZXQoYmZkKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBjYWxsYmFjayBmcm9tIHNlbGVjdC5jIGluIGNhc2Ugb25lIG9mIHRoZSBmZCdzIGNhbiBiZSByZWFkL3dyaXR0ZW4gKi8KK3N0YXRpYyBpbnQgaXBhY2Nlc3NfZmRfY2Ioc3RydWN0IGJzY19mZCAqYmZkLCB1bnNpZ25lZCBpbnQgd2hhdCkKK3sKKwlpbnQgcmMgPSAwOworCisJaWYgKHdoYXQgJiBCU0NfRkRfUkVBRCkgeworCQlyYyA9IGhhbmRsZV90Y3BfcmVhZChiZmQpOworCQlpZiAocmMgPCAwKQorCQkJcmV0dXJuIHJjOworCX0KKwlpZiAod2hhdCAmIEJTQ19GRF9XUklURSkKKwkJcmMgPSBoYW5kbGVfdGNwX3dyaXRlKGJmZCk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIGNhbGxiYWNrIG9mIHRoZSBsaXN0ZW5pbmcgZmlsZWRlc2NyaXB0b3IgKi8KK3N0YXRpYyBpbnQgbGlzdGVuX2ZkX2NiKHN0cnVjdCBic2NfZmQgKmxpc3Rlbl9iZmQsIHVuc2lnbmVkIGludCB3aGF0KQoreworCWludCByZXQ7CisJc3RydWN0IGlwYV9wcm94eV9jb25uICppcGM7CisJc3RydWN0IGJzY19mZCAqYmZkOworCXN0cnVjdCBzb2NrYWRkcl9pbiBzYTsKKwlzb2NrbGVuX3Qgc2FfbGVuID0gc2l6ZW9mKHNhKTsKKworCWlmICghKHdoYXQgJiBCU0NfRkRfUkVBRCkpCisJCXJldHVybiAwOworCisJcmV0ID0gYWNjZXB0KGxpc3Rlbl9iZmQtPmZkLCAoc3RydWN0IHNvY2thZGRyICopICZzYSwgJnNhX2xlbik7CisJaWYgKHJldCA8IDApIHsKKwkJcGVycm9yKCJhY2NlcHQiKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJREVCVUdQKERJTlAsICJhY2NlcHQoKWVkIG5ldyAlcyBsaW5rIGZyb20gJXNcbiIsIAorCQkobGlzdGVuX2JmZC0+cHJpdl9uciAmIDB4ZmYpID09IE9NTF9GUk9NX0JUUyA/ICJPTUwiIDogIlJTTCIsCisJCWluZXRfbnRvYShzYS5zaW5fYWRkcikpOworCisJaXBjID0gYWxsb2NfY29ubigpOworCWlmICghaXBjKSB7CisJCWNsb3NlKHJldCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWJmZCA9ICZpcGMtPmZkOworCWJmZC0+ZmQgPSByZXQ7CisJYmZkLT5kYXRhID0gaXBjOworCWJmZC0+cHJpdl9uciA9IGxpc3Rlbl9iZmQtPnByaXZfbnI7CisJYmZkLT5jYiA9IGlwYWNjZXNzX2ZkX2NiOworCWJmZC0+d2hlbiA9IEJTQ19GRF9SRUFEOworCXJldCA9IGJzY19yZWdpc3Rlcl9mZChiZmQpOworCWlmIChyZXQgPCAwKSB7CisJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgImNvdWxkIG5vdCByZWdpc3RlciBGRFxuIik7CisJCWNsb3NlKGJmZC0+ZmQpOworCQl0YWxsb2NfZnJlZShpcGMpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIFJlcXVlc3QgSUQuIEZJWE1FOiByZXF1ZXN0IExPQ0FUSU9OLCBIVy9TVyBWRXJzaW9uLCBVbml0IE5hbWUsIFNlcm5vICovCisJcmV0ID0gd3JpdGUoYmZkLT5mZCwgaWRfcmVxLCBzaXplb2YoaWRfcmVxKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYWtlX2xpc3Rlbl9zb2NrKHN0cnVjdCBic2NfZmQgKmJmZCwgdV9pbnQxNl90IHBvcnQsIGludCBwcml2X25yLAorCQkgICAgIGludCAoKmNiKShzdHJ1Y3QgYnNjX2ZkICpmZCwgdW5zaWduZWQgaW50IHdoYXQpKQoreworCXN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOworCWludCByZXQsIG9uID0gMTsKKworCWJmZC0+ZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKTsKKwliZmQtPmNiID0gY2I7CisJYmZkLT53aGVuID0gQlNDX0ZEX1JFQUQ7CisJYmZkLT5wcml2X25yID0gcHJpdl9ucjsKKworCW1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKKwlhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCWFkZHIuc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKKwlpZiAoIWxpc3Rlbl9pcGFkZHIpCisJCWFkZHIuc2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsKKwllbHNlCisJCWluZXRfYXRvbihsaXN0ZW5faXBhZGRyLCAmYWRkci5zaW5fYWRkcik7CisKKwlzZXRzb2Nrb3B0KGJmZC0+ZmQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgJm9uLCBzaXplb2Yob24pKTsKKworCXJldCA9IGJpbmQoYmZkLT5mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwgc2l6ZW9mKGFkZHIpKTsKKwlpZiAocmV0IDwgMCkgeworCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJjb3VsZCBub3QgYmluZCBsaXN0ZW4gc29ja2V0ICVzXG4iLAorCQkJc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0ID0gbGlzdGVuKGJmZC0+ZmQsIDEpOworCWlmIChyZXQgPCAwKSB7CisJCXBlcnJvcigibGlzdGVuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gYnNjX3JlZ2lzdGVyX2ZkKGJmZCk7CisJaWYgKHJldCA8IDApIHsKKwkJcGVycm9yKCJyZWdpc3Rlcl9saXN0ZW5fZmQiKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIEFjdGl2ZWx5IGNvbm5lY3QgdG8gYSBCU0MuICAqLworc3RhdGljIHN0cnVjdCBpcGFfcHJveHlfY29ubiAqY29ubmVjdF9ic2Moc3RydWN0IHNvY2thZGRyX2luICpzYSwgaW50IHByaXZfbnIsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGlwYV9wcm94eV9jb25uICppcGM7CisJc3RydWN0IGJzY19mZCAqYmZkOworCWludCByZXQsIG9uID0gMTsKKworCWlwYyA9IGFsbG9jX2Nvbm4oKTsKKwlpZiAoIWlwYykKKwkJcmV0dXJuIE5VTEw7CisKKwlpcGMtPmJ0c19jb25uID0gZGF0YTsKKworCWJmZCA9ICZpcGMtPmZkOworCWJmZC0+ZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKTsKKwliZmQtPmNiID0gaXBhY2Nlc3NfZmRfY2I7CisJYmZkLT53aGVuID0gQlNDX0ZEX1JFQUQgfCBCU0NfRkRfV1JJVEU7CisJYmZkLT5kYXRhID0gaXBjOworCWJmZC0+cHJpdl9uciA9IHByaXZfbnI7CisKKwlzZXRzb2Nrb3B0KGJmZC0+ZmQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgJm9uLCBzaXplb2Yob24pKTsKKworCXJldCA9IGNvbm5lY3QoYmZkLT5mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSBzYSwgc2l6ZW9mKCpzYSkpOworCWlmIChyZXQgPCAwKSB7CisJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgImNvdWxkIG5vdCBjb25uZWN0IHNvY2tldFxuIik7CisJCWNsb3NlKGJmZC0+ZmQpOworCQl0YWxsb2NfZnJlZShpcGMpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBwcmUtZmlsbCB0eF9xdWV1ZSB3aXRoIGlkZW50aXR5IHJlcXVlc3QgKi8KKwlyZXQgPSBic2NfcmVnaXN0ZXJfZmQoYmZkKTsKKwlpZiAocmV0IDwgMCkgeworCQljbG9zZShiZmQtPmZkKTsKKwkJdGFsbG9jX2ZyZWUoaXBjKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIGlwYzsKK30KKworc3RhdGljIGludCBpcGFjY2Vzc19wcm94eV9zZXR1cCh2b2lkKQoreworCWludCByZXQ7CisKKwlpcHAgPSB0YWxsb2NfemVybyh0YWxsX2JzY19jdHgsIHN0cnVjdCBpcGFfcHJveHkpOworCWlmICghaXBwKQorCQlyZXR1cm4gLUVOT01FTTsKKwlJTklUX0xMSVNUX0hFQUQoJmlwcC0+YnRzX2xpc3QpOworCWlwcC0+cmVjb25uX3RpbWVyLmNiID0gcmVjb25uX3Rtcl9jYjsKKwlpcHAtPnJlY29ubl90aW1lci5kYXRhID0gaXBwOworCisJLyogTGlzdGVuIGZvciBPTUwgY29ubmVjdGlvbnMgKi8KKwlyZXQgPSBtYWtlX2xpc3Rlbl9zb2NrKCZpcHAtPm9tbF9saXN0ZW5fZmQsIElQQV9UQ1BfUE9SVF9PTUwsCisJCQkJT01MX0ZST01fQlRTLCBsaXN0ZW5fZmRfY2IpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogTGlzdGVuIGZvciBSU0wgY29ubmVjdGlvbnMgKi8KKwlyZXQgPSBtYWtlX2xpc3Rlbl9zb2NrKCZpcHAtPnJzbF9saXN0ZW5fZmQsIElQQV9UQ1BfUE9SVF9SU0wsCisJCQkJUlNMX0ZST01fQlRTLCBsaXN0ZW5fZmRfY2IpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgc2lnbmFsX2hhbmRsZXIoaW50IHNpZ25hbCkKK3sKKwlmcHJpbnRmKHN0ZG91dCwgInNpZ25hbCAldSByZWNlaXZlZFxuIiwgc2lnbmFsKTsKKworCXN3aXRjaCAoc2lnbmFsKSB7CisJY2FzZSBTSUdBQlJUOgorCQkvKiBpbiBjYXNlIG9mIGFib3J0LCB3ZSB3YW50IHRvIG9idGFpbiBhIHRhbGxvYyByZXBvcnQKKwkJICogYW5kIHRoZW4gcmV0dXJuIHRvIHRoZSBjYWxsZXIsIHdobyB3aWxsIGFib3J0IHRoZSBwcm9jZXNzICovCisJY2FzZSBTSUdVU1IxOgorCQl0YWxsb2NfcmVwb3J0X2Z1bGwodGFsbF9ic2NfY3R4LCBzdGRlcnIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgcmM7CisKKwlsaXN0ZW5faXBhZGRyID0gIjE5Mi4xNjguMTAwLjExIjsKKwlic2NfaXBhZGRyID0gIjE5Mi4xNjguMTAwLjIzOSI7CisKKwl0YWxsX2JzY19jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QoTlVMTCwgMSwgImlwYWNjZXNzLXByb3h5Iik7CisKKwlkZWJ1Z19pbml0KCk7CisJc3RkZXJyX3RhcmdldCA9IGRlYnVnX3RhcmdldF9jcmVhdGVfc3RkZXJyKCk7CisJZGVidWdfYWRkX3RhcmdldChzdGRlcnJfdGFyZ2V0KTsKKwlkZWJ1Z19zZXRfYWxsX2ZpbHRlcihzdGRlcnJfdGFyZ2V0LCAxKTsKKwlkZWJ1Z19wYXJzZV9jYXRlZ29yeV9tYXNrKHN0ZGVycl90YXJnZXQsICJESU5QOkRNSSIpOworCisJcmMgPSBpcGFjY2Vzc19wcm94eV9zZXR1cCgpOworCWlmIChyYyA8IDApCisJCWV4aXQoMSk7CisKKwlzaWduYWwoU0lHVVNSMSwgJnNpZ25hbF9oYW5kbGVyKTsKKwlzaWduYWwoU0lHQUJSVCwgJnNpZ25hbF9oYW5kbGVyKTsKKworCXdoaWxlICgxKSB7CisJCWJzY19zZWxlY3RfbWFpbigwKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9pc2Ruc3luYy5jIGIvb3BlbmJzYy9zcmMvaXNkbnN5bmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODgxOWFjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvaXNkbnN5bmMuYwpAQCAtMCwwICsxLDE5MiBAQAorLyogaXNkbnN5bmMuYworICoKKyAqIEF1dGhvciAgICAgICBBbmRyZWFzIEV2ZXJzYmVyZyA8am9sbHlAZXZlcnNiZXJnLmV1PgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgIm1JU0ROaWYuaCIKKyNkZWZpbmUgTUlTRE5fT0xEX0FGX0NPTVBBVElCSUxJVFkKKyNkZWZpbmUgQUZfQ09NUEFUSUJJTElUWV9GVU5DCisjaW5jbHVkZSAiY29tcGF0X2FmX2lzZG4uaCIKKworaW50IGNhcmQgPSAwOworaW50IHNvY2sgPSAtMTsKKworaW50IG1JU0ROX29wZW4odm9pZCkKK3sKKwlpbnQJCQlmZCwgcmV0OworCXN0cnVjdCBtSVNETl9kZXZpbmZvCWRldmluZm87CisJc3RydWN0IHNvY2thZGRyX21JU0ROCWwyYWRkcjsKKworCWZkID0gc29ja2V0KFBGX0lTRE4sIFNPQ0tfUkFXLCBJU0ROX1BfQkFTRSk7CisJaWYgKGZkIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBvcGVuIHNvY2tldCAoJXMpXG4iLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gZmQ7CisJfQorCWRldmluZm8uaWQgPSBjYXJkOworCXJldCA9IGlvY3RsKGZkLCBJTUdFVERFVklORk8sICZkZXZpbmZvKTsKKwlpZiAocmV0IDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwiY291bGQgbm90IHNlbmQgSU9DVEwgSU1HRVRDT1VOVCAoJXMpXG4iLCBzdHJlcnJvcihlcnJubykpOworCQljbG9zZShmZCk7CisJCXJldHVybiByZXQ7CisJfQorCWNsb3NlKGZkKTsKKwlpZiAoIShkZXZpbmZvLkRwcm90b2NvbHMgJiAoMSA8PCBJU0ROX1BfVEVfUzApKQorCSAmJiAhKGRldmluZm8uRHByb3RvY29scyAmICgxIDw8IElTRE5fUF9URV9FMSkpKSB7CisJCWZwcmludGYoc3RkZXJyLCJJbnRlcmZhY2UgZG9lcyBub3Qgc3VwcG9ydCBURSBtb2RlICglcylcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJZmQgPSBzb2NrZXQoUEZfSVNETiwgU09DS19ER1JBTSwgSVNETl9QX0xBUERfVEUpOworCWlmIChmZCA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsImNvdWxkIG5vdCBvcGVuIElTRE5fUF9MQVBEX1RFIHNvY2tldCAoJXMpXG4iLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gZmQ7CisJfQorCWwyYWRkci5mYW1pbHkgPSBBRl9JU0ROOworCWwyYWRkci5kZXYgPSBjYXJkOworCWwyYWRkci5jaGFubmVsID0gMDsKKwlsMmFkZHIuc2FwaSA9IDA7CisJbDJhZGRyLnRlaSA9IDA7CisJcmV0ID0gYmluZChmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZsMmFkZHIsIHNpemVvZihsMmFkZHIpKTsKKwlpZiAocmV0IDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwiY291bGQgbm90IGJpbmQgc29ja2V0IGZvciBjYXJkICVkICglcylcbiIsIGNhcmQsIHN0cmVycm9yKGVycm5vKSk7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJc29jayA9IGZkOworCisJcmV0dXJuIHNvY2s7Cit9CisKKwordm9pZCBtSVNETl9oYW5kbGUodm9pZCkKK3sKKwlpbnQgcmV0OworCWZkX3NldCByZmQ7CisJc3RydWN0IHRpbWV2YWwgdHY7CisJc3RydWN0IHNvY2thZGRyX21JU0ROIGFkZHI7CisJc29ja2xlbl90IGFsZW47CisJdW5zaWduZWQgY2hhciBidWZmZXJbMjA0OF07CisJc3RydWN0IG1JU0ROaGVhZCAqaGggPSAoc3RydWN0IG1JU0ROaGVhZCAqKWJ1ZmZlcjsKKwlpbnQgbDEgPSAwLCBsMiA9IDAsIHRlaSA9IDA7CisKKwl3aGlsZSgxKSB7CithZ2FpbjoKKwkJRkRfWkVSTygmcmZkKTsKKwkJRkRfU0VUKHNvY2ssICZyZmQpOworCQl0di50dl9zZWMgPSAyOworCQl0di50dl91c2VjID0gMDsKKwkJcmV0ID0gc2VsZWN0KHNvY2srMSwgJnJmZCwgTlVMTCwgTlVMTCwgJnR2KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWlmIChlcnJubyA9PSBFSU5UUikKKwkJCQljb250aW51ZTsKKwkJCWZwcmludGYoc3RkZXJyLCAiJXMgYWJvcnRlZDogJXNcbiIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoZXJybm8pKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChGRF9JU1NFVChzb2NrLCAmcmZkKSkgeworCQkJYWxlbiA9IHNpemVvZihhZGRyKTsKKwkJCXJldCA9IHJlY3Zmcm9tKHNvY2ssIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIDAsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHIsICZhbGVuKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICIlcyByZWFkIHNvY2tldCBlcnJvciAlc1xuIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihlcnJubykpOworCQkJfSBlbHNlIGlmIChyZXQgPCBNSVNETl9IRUFERVJfTEVOKSB7CisJCQkJCWZwcmludGYoc3RkZXJyLCAiJXMgcmVhZCBzb2NrZXQgc2hvciBmcmFtZVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCX0gZWxzZSB7CisJCQkJc3dpdGNoKGhoLT5wcmltKSB7CisJCQkJCWNhc2UgTVBIX0FDVElWQVRFX0lORDoKKwkJCQkJY2FzZSBQSF9BQ1RJVkFURV9JTkQ6CisJCQkJCQlpZiAoIWwxKSB7CisJCQkJCQkJcHJpbnRmKCJQSF9BQ1RJVkFURVxuIik7CisJCQkJCQkJcHJpbnRmKCIqKiogU3luYyBhdmFpbGFibGUgZnJvbSBpbnRlcmZhY2UgOi0pXG4iKTsKKwkJCQkJCQlsMSA9IDE7CisJCQkJCQl9CisJCQkJCQlnb3RvIGFnYWluOworCQkJCQlicmVhazsKKwkJCQkJY2FzZSBNUEhfREVBQ1RJVkFURV9JTkQ6CisJCQkJCWNhc2UgUEhfREVBQ1RJVkFURV9JTkQ6CisJCQkJCQlpZiAobDEpIHsKKwkJCQkJCQlwcmludGYoIlBIX0RFQUNUSVZBVEVcbiIpOworCQkJCQkJCXByaW50ZigiKioqIExvc3Qgc3luYyBvbiBpbnRlcmZhY2UgICAgICAgIDotKFxuIik7CisJCQkJCQkJbDEgPSAwOworCQkJCQkJfQorCQkJCQkJZ290byBhZ2FpbjsKKwkJCQkJYnJlYWs7CisJCQkJCWNhc2UgRExfRVNUQUJMSVNIX0lORDoKKwkJCQkJY2FzZSBETF9FU1RBQkxJU0hfQ05GOgorCQkJCQkJcHJpbnRmKCJETF9FU1RBQkxJU0hcbiIpOworCQkJCQkJbDIgPSAxOworCQkJCQkJZ290byBhZ2FpbjsKKwkJCQkJYnJlYWs7CisJCQkJCWNhc2UgRExfUkVMRUFTRV9JTkQ6CisJCQkJCWNhc2UgRExfUkVMRUFTRV9DTkY6CisJCQkJCQlwcmludGYoIkRMX1JFTEVBU0VcbiIpOworCQkJCQkJbDIgPSAwOworCQkJCQkJZ290byBhZ2FpbjsKKwkJCQkJYnJlYWs7CisJCQkJCWNhc2UgRExfSU5GT1JNQVRJT05fSU5EOgorCQkJCQkJcHJpbnRmKCJETF9JTkZPUk1BVElPTiAodGVpICVkIHNhcGkgJWQpXG4iLCBhZGRyLnRlaSwgYWRkci5zYXBpKTsKKwkJCQkJCXRlaSA9IDE7CisJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0OgorLy8JCQkJCQlwcmludGYoInByaW0gJXhcbiIsIGhoLT5wcmltKTsKKwkJCQkJCWdvdG8gYWdhaW47CisJCQkJfQorCQkJfQorCQl9CisJCWlmICh0ZWkgJiYgIWwyKSB7CisJCQloaC0+cHJpbSA9IERMX0VTVEFCTElTSF9SRVE7CisJCQlwcmludGYoIi0+IGFjdGl2YXRpbmcgbGF5ZXIgMlxuIik7CisJCQlzZW5kdG8oc29jaywgYnVmZmVyLCBNSVNETl9IRUFERVJfTEVOLCAwLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCBhbGVuKTsKKwkJfQorCX0KK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgcmV0OworCisJaWYgKGFyZ2MgPD0gMSkKKwl7CisJCXByaW50ZigiVXNhZ2U6ICVzIDxjYXJkPlxuXG4iLCBhcmd2WzBdKTsKKwkJcHJpbnRmKCJPcGVucyBnaXZlbiBjYXJkIG51bWJlciBpbiBURS1tb2RlIFBUUCBhbmQgdHJpZXMgdG8ga2VlcCBsYXllciAyIGVzdGFibGlzaGVkLlxuIik7CisJCXByaW50ZigiVGhpcyBrZWVwcyBsYXllciAxIGFjdGl2YXRlZCB0byByZXRyaWV2ZSBhIHN0ZWFkeSBzeW5jIHNpZ25hbCBmcm9tIG5ldHdvcmsuXG4iKTsKKwkJcmV0dXJuKDApOworCX0KKworCWNhcmQgPSBhdG9pKGFyZ3ZbMV0pOworCisJaW5pdF9hZl9pc2RuKCk7CisKKwlpZiAoKHJldCA9IG1JU0ROX29wZW4oKSA8IDApKQorCQlyZXR1cm4ocmV0KTsKKworCW1JU0ROX2hhbmRsZSgpOworCisJY2xvc2Uoc29jayk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL21lYXNfcmVwLmMgYi9vcGVuYnNjL3NyYy9tZWFzX3JlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiOWNjMWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9tZWFzX3JlcC5jCkBAIC0wLDAgKzEsMTE0IEBACisvKiBNZWFzdXJlbWVudCBSZXBvcnQgUHJvY2Vzc2luZyAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9tZWFzX3JlcC5oPgorCitzdGF0aWMgaW50IGdldF9maWVsZChjb25zdCBzdHJ1Y3QgZ3NtX21lYXNfcmVwICpyZXAsCisJCSAgICAgZW51bSBtZWFzX3JlcF9maWVsZCBmaWVsZCkKK3sKKwlzd2l0Y2ggKGZpZWxkKSB7CisJY2FzZSBNRUFTX1JFUF9ETF9SWExFVl9GVUxMOgorCQlyZXR1cm4gcmVwLT5kbC5mdWxsLnJ4X2xldjsKKwljYXNlIE1FQVNfUkVQX0RMX1JYTEVWX1NVQjoKKwkJcmV0dXJuIHJlcC0+ZGwuc3ViLnJ4X2xldjsKKwljYXNlIE1FQVNfUkVQX0RMX1JYUVVBTF9GVUxMOgorCQlyZXR1cm4gcmVwLT5kbC5mdWxsLnJ4X3F1YWw7CisJY2FzZSBNRUFTX1JFUF9ETF9SWFFVQUxfU1VCOgorCQlyZXR1cm4gcmVwLT5kbC5zdWIucnhfcXVhbDsKKwljYXNlIE1FQVNfUkVQX1VMX1JYTEVWX0ZVTEw6CisJCXJldHVybiByZXAtPnVsLmZ1bGwucnhfbGV2OworCWNhc2UgTUVBU19SRVBfVUxfUlhMRVZfU1VCOgorCQlyZXR1cm4gcmVwLT51bC5zdWIucnhfbGV2OworCWNhc2UgTUVBU19SRVBfVUxfUlhRVUFMX0ZVTEw6CisJCXJldHVybiByZXAtPnVsLmZ1bGwucnhfcXVhbDsKKwljYXNlIE1FQVNfUkVQX1VMX1JYUVVBTF9TVUI6CisJCXJldHVybiByZXAtPnVsLnN1Yi5yeF9xdWFsOworCX0KKworCXJldHVybiAwOworfQorCisKK3Vuc2lnbmVkIGludCBjYWxjX2luaXRpYWxfaWR4KHVuc2lnbmVkIGludCBhcnJheV9zaXplLAorCQkJICAgICAgdW5zaWduZWQgaW50IG1lYXNfcmVwX2lkeCwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBudW1fdmFsdWVzKQoreworCWludCBvZmZzLCBpZHg7CisKKwkvKiBmcm9tIHdoaWNoIGVsZW1lbnQgZG8gd2UgbmVlZCB0byBzdGFydCBpZiB3ZSdyZSBpbnRlcmVzdGVkCisJICogaW4gYW4gYXZlcmFnZSBvZiAnbnVtJyBlbGVtZW50cyAqLworCW9mZnMgPSBtZWFzX3JlcF9pZHggLSBudW1fdmFsdWVzOworCisJaWYgKG9mZnMgPCAwKQorCQlpZHggPSBhcnJheV9zaXplICsgb2ZmczsKKwllbHNlCisJCWlkeCA9IG9mZnM7CisKKwlyZXR1cm4gaWR4OworfQorCisvKiBvYnRhaW4gYW4gYXZlcmFnZSBvdmVyIHRoZSBsYXN0ICdudW0nIGZpZWxkcyBpbiB0aGUgbWVhcyByZXBzICovCitpbnQgZ2V0X21lYXNfcmVwX2F2Zyhjb25zdCBzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwKKwkJICAgICBlbnVtIG1lYXNfcmVwX2ZpZWxkIGZpZWxkLCB1bnNpZ25lZCBpbnQgbnVtKQoreworCXVuc2lnbmVkIGludCBpLCBpZHg7CisJaW50IGF2ZyA9IDA7CisKKwlpZHggPSBjYWxjX2luaXRpYWxfaWR4KEFSUkFZX1NJWkUobGNoYW4tPm1lYXNfcmVwKSwKKwkJCQlsY2hhbi0+bWVhc19yZXBfaWR4LCBudW0pOworCisJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisJCWludCBqID0gKGlkeCtpKSAlIEFSUkFZX1NJWkUobGNoYW4tPm1lYXNfcmVwKTsKKworCQlhdmcgKz0gZ2V0X2ZpZWxkKCZsY2hhbi0+bWVhc19yZXBbal0sIGZpZWxkKTsKKwl9CisKKwlyZXR1cm4gYXZnIC8gbnVtOworfQorCisvKiBDaGVjayBpZiBOIG91dCBvZiBNIGxhc3QgdmFsdWVzIGZvciBGSUVMRCBhcmUgPj0gYmQgKi8KK2ludCBtZWFzX3JlcF9uX291dF9vZl9tX2JlKGNvbnN0IHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLAorCQkJZW51bSBtZWFzX3JlcF9maWVsZCBmaWVsZCwKKwkJCXVuc2lnbmVkIGludCBuLCB1bnNpZ25lZCBpbnQgbSwgaW50IGJlKQoreworCXVuc2lnbmVkIGludCBpLCBpZHg7CisJaW50IGNvdW50ID0gMDsKKworCWlkeCA9IGNhbGNfaW5pdGlhbF9pZHgoQVJSQVlfU0laRShsY2hhbi0+bWVhc19yZXApLAorCQkJCWxjaGFuLT5tZWFzX3JlcF9pZHgsIG0pOworCisJZm9yIChpID0gMDsgaSA8IG07IGkrKykgeworCQlpbnQgaiA9IChpZHggKyBpKSAlIEFSUkFZX1NJWkUobGNoYW4tPm1lYXNfcmVwKTsKKwkJaW50IHZhbCA9IGdldF9maWVsZCgmbGNoYW4tPm1lYXNfcmVwW2pdLCBmaWVsZCk7CisKKwkJaWYgKHZhbCA+PSBiZSkKKwkJCWNvdW50Kys7CisKKwkJaWYgKGNvdW50ID49IG4pCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL21nY3AuY2ZnIGIvb3BlbmJzYy9zcmMvbWdjcC5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc4ZjU0NgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL21nY3AuY2ZnCkBAIC0wLDAgKzEsMTkgQEAKKyEKKyEgTUdDUCBjb25maWd1cmF0aW9uIGhhbmQgZWRpdGVkCishICAgIQorcGFzc3dvcmQgZm9vCishCitsaW5lIHZ0eQorIG5vIGxvZ2luCishCittZ2NwCishICBsb2NhbCBpcCAyMTMuMTY3LjEzNC4xNAorICBidHMgaXAgMTcyLjE2LjI1Mi40MworICBiaW5kIGlwIDIxMy4xNjcuMTM0LjE0MQorICBiaW5kIHBvcnQgMjQyNworICBiaW5kIGVhcmx5IDEKKyAgcnRwIGJhc2UgNDAwMAorICBzZHAgYXVkaW8gcGF5bG9hZCBudW1iZXIgOTgKKyAgc2RwIGF1ZGlvIHBheWxvYWQgbmFtZSBBTVIvODAwMAorICBudW1iZXIgZW5kcG9pbnRzIDMxCisgIGxvb3AgMQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvbWdjcC9tZ2NwX21haW4uYyBiL29wZW5ic2Mvc3JjL21nY3AvbWdjcF9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ1YTFlOQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL21nY3AvbWdjcF9tYWluLmMKQEAgLTAsMCArMSwyMzcgQEAKKy8qIEEgTWVkaWEgR2F0ZXdheSBDb250cm9sIFByb3RvY29sIE1lZGlhIEdhdGV3YXk6IFJGQyAzNDM1ICovCisvKiBUaGUgbWFpbiBtZXRob2QgdG8gZHJpdmUgaXQgYXMgYSBzdGFuZGFsb25lIHByb2Nlc3MgICAgICAqLworCisvKgorICogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogKEMpIDIwMDkgYnkgT24tV2F2ZXMKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvbWdjcC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdGVsbmV0X2ludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiLi4vLi4vYnNjY29uZmlnLmgiCisKKy8qIHRoaXMgaXMgaGVyZSBmb3IgdGhlIHZ0eS4uLiBpdCB3aWxsIG5ldmVyIGJlIGNhbGxlZCAqLwordm9pZCBzdWJzY3JfcHV0KCkgeyBhYm9ydCgpOyB9CisKKyNkZWZpbmUgX0dOVV9TT1VSQ0UKKyNpbmNsdWRlIDxnZXRvcHQuaD4KKworI3dhcm5pbmcgIk1ha2UgdXNlIG9mIHRoZSBydHAgcHJveHkgY29kZSIKKworc3RhdGljIHN0cnVjdCBic2NfZmQgYmZkOworc3RhdGljIGludCBmaXJzdF9yZXF1ZXN0ID0gMTsKK3N0YXRpYyBzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZzsKK2NvbnN0IGNoYXIgKm9wZW5ic2NfdmVyc2lvbiA9ICJPcGVuQlNDIE1HQ1AgIiBQQUNLQUdFX1ZFUlNJT047Citjb25zdCBjaGFyICpvcGVuYnNjX2NvcHlyaWdodCA9IAorCSJDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBIb2xnZXIgRnJleXRoZXIgYW5kIE9uLVdhdmVzXG4iCisJIkNvbnRyaWJ1dGlvbnMgYnkgRGFuaWVsIFdpbGxtYW5uLCBKYW4gTMO8YmJlLFN0ZWZhbiBTY2htaWR0XG4iCisJIkRpZXRlciBTcGFhciwgQW5kcmVhcyBFdmVyc2JlcmcsIEhhcmFsZCBXZWx0ZVxuXG4iCisJIkxpY2Vuc2UgR1BMdjIrOiBHTlUgR1BMIHZlcnNpb24gMiBvciBsYXRlciA8aHR0cDovL2dudS5vcmcvbGljZW5zZXMvZ3BsLmh0bWw+XG4iCisJIlRoaXMgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGFyZSBmcmVlIHRvIGNoYW5nZSBhbmQgcmVkaXN0cmlidXRlIGl0LlxuIgorCSJUaGVyZSBpcyBOTyBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3LlxuIjsKKworc3RhdGljIGNoYXIgKmNvbmZpZ19maWxlID0gIm1nY3AuY2ZnIjsKKworLyogdXNlZCBieSBtc2diIGFuZCBtZ2NwICovCit2b2lkICp0YWxsX2JzY19jdHggPSBOVUxMOworCitzdGF0aWMgdm9pZCBwcmludF9oZWxwKCkKK3sKKwlwcmludGYoIlNvbWUgdXNlZnVsIGhlbHAuLi5cbiIpOworCXByaW50ZigiIC1oIC0taGVscCBpcyBwcmludGluZyB0aGlzIHRleHQuXG4iKTsKKwlwcmludGYoIiAtYyAtLWNvbmZpZy1maWxlIGZpbGVuYW1lIFRoZSBjb25maWcgZmlsZSB0byB1c2UuXG4iKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfdmVyc2lvbigpCit7CisJcHJpbnRmKCIlc1xuXG4iLCBvcGVuYnNjX3ZlcnNpb24pOworCXByaW50ZihvcGVuYnNjX2NvcHlyaWdodCk7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9vcHRpb25zKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKwl3aGlsZSAoMSkgeworCQlpbnQgb3B0aW9uX2luZGV4ID0gMCwgYzsKKwkJc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPSB7CisJCQl7ImhlbHAiLCAwLCAwLCAnaCd9LAorCQkJeyJjb25maWctZmlsZSIsIDEsIDAsICdjJ30sCisJCQl7InZlcnNpb24iLCAwLCAwLCAnVid9LAorCQkJezAsIDAsIDAsIDB9LAorCQl9OworCisJCWMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiaGM6ViIsIGxvbmdfb3B0aW9ucywgJm9wdGlvbl9pbmRleCk7CisKKwkJaWYgKGMgPT0gLTEpCisJCQlicmVhazsKKworCQlzd2l0Y2goYykgeworCQljYXNlICdoJzoKKwkJCXByaW50X2hlbHAoKTsKKwkJCWV4aXQoMCk7CisJCQlicmVhazsKKwkJY2FzZSAnYyc6CisJCQljb25maWdfZmlsZSA9IHRhbGxvY19zdHJkdXAodGFsbF9ic2NfY3R4LCBvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ1YnOgorCQkJcHJpbnRfdmVyc2lvbigpOworCQkJZXhpdCgwKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogaWdub3JlICovCisJCQlicmVhazsKKwkJfTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9jYWxsX2FnZW50KHN0cnVjdCBic2NfZmQgKmZkLCB1bnNpZ25lZCBpbnQgd2hhdCkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKKwlzb2NrbGVuX3Qgc2xlbiA9IHNpemVvZihhZGRyKTsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCXN0cnVjdCBtc2diICpyZXNwOworCisJbXNnID0gKHN0cnVjdCBtc2diICopIGZkLT5kYXRhOworCisJLyogcmVhZCBvbmUgbGVzcyBzbyB3ZSBjYW4gdXNlIGl0IGFzIGEgXDAgKi8KKwlpbnQgcmMgPSByZWN2ZnJvbShiZmQuZmQsIG1zZy0+ZGF0YSwgbXNnLT5kYXRhX2xlbiAtIDEsIDAsCisJCShzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHIsICZzbGVuKTsKKwlpZiAocmMgPCAwKSB7CisJCXBlcnJvcigiR2F0ZXdheSBmYWlsZWQgdG8gcmVhZCIpOworCQlyZXR1cm4gLTE7CisJfSBlbHNlIGlmIChzbGVuID4gc2l6ZW9mKGFkZHIpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiR2F0ZXdheSByZWNlaXZlZCBtZXNzYWdlIGZyb20gb3V0ZXJzcGFjZTogJWQgJWRcbiIsCisJCQlzbGVuLCBzaXplb2YoYWRkcikpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGZpcnN0X3JlcXVlc3QpIHsKKwkJZmlyc3RfcmVxdWVzdCA9IDA7CisJCXJlc3AgPSBtZ2NwX2NyZWF0ZV9yc2lwKCk7CisKKwkJaWYgKHJlc3ApIHsKKwkJCXNlbmR0byhiZmQuZmQsIHJlc3AtPmwyaCwgbXNnYl9sMmxlbihyZXNwKSwgMCwKKwkJCQkoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCBzaXplb2YoYWRkcikpOworCQkJbXNnYl9mcmVlKHJlc3ApOworCQl9CisJCXJldHVybiAwOworICAgICAgICB9CisKKwkvKiBoYW5kbGUgbWVzc2FnZSBub3cgKi8KKwltc2ctPmwyaCA9IG1zZ2JfcHV0KG1zZywgcmMpOworCXJlc3AgPSBtZ2NwX2hhbmRsZV9tZXNzYWdlKGNmZywgbXNnKTsKKwltc2diX3Jlc2V0KG1zZyk7CisKKwlpZiAocmVzcCkgeworCQlzZW5kdG8oYmZkLmZkLCByZXNwLT5sMmgsIG1zZ2JfbDJsZW4ocmVzcCksIDAsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHIsIHNpemVvZihhZGRyKSk7CisJCW1zZ2JfZnJlZShyZXNwKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworCXN0cnVjdCBnc21fbmV0d29yayBkdW1teV9uZXR3b3JrOworCXN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOworCWludCBvbiA9IDEsIHJjOworCXN0cnVjdCBkZWJ1Z190YXJnZXQgKnN0ZGVycl90YXJnZXQ7CisKKwl0YWxsX2JzY19jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QoTlVMTCwgMSwgIm1nY3AtY2FsbGFnZW50Iik7CisKKwlkZWJ1Z19pbml0KCk7CisJc3RkZXJyX3RhcmdldCA9IGRlYnVnX3RhcmdldF9jcmVhdGVfc3RkZXJyKCk7CisJZGVidWdfYWRkX3RhcmdldChzdGRlcnJfdGFyZ2V0KTsKKwlkZWJ1Z19zZXRfYWxsX2ZpbHRlcihzdGRlcnJfdGFyZ2V0LCAxKTsKKworCWNmZyA9IG1nY3BfY29uZmlnX2FsbG9jKCk7CisJaWYgKCFjZmcpCisJCXJldHVybiAtMTsKKworCWhhbmRsZV9vcHRpb25zKGFyZ2MsIGFyZ3YpOworCisJdGVsbmV0X2luaXQoJmR1bW15X25ldHdvcmssIDQyNDMpOworICAgICAgICByYyA9IG1nY3BfcGFyc2VfY29uZmlnKGNvbmZpZ19maWxlLCBjZmcpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCisgICAgICAgIC8qIHdlIG5lZWQgdG8gYmluZCBhIHNvY2tldCAqLworICAgICAgICBpZiAocmMgPT0gMCkgeworCQliZmQud2hlbiA9IEJTQ19GRF9SRUFEOworCQliZmQuY2IgPSByZWFkX2NhbGxfYWdlbnQ7CisJCWJmZC5mZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKwkJaWYgKGJmZC5mZCA8IDApIHsKKwkJCXBlcnJvcigiR2F0ZXdheSBmYWlsZWQgdG8gbGlzdGVuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlzZXRzb2Nrb3B0KGJmZC5mZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmb24sIHNpemVvZihvbikpOworCisJCW1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKKwkJYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJYWRkci5zaW5fcG9ydCA9IGh0b25zKGNmZy0+c291cmNlX3BvcnQpOworCQlpbmV0X2F0b24oY2ZnLT5zb3VyY2VfYWRkciwgJmFkZHIuc2luX2FkZHIpOworCisJCWlmIChiaW5kKGJmZC5mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwgc2l6ZW9mKGFkZHIpKSA8IDApIHsKKwkJCXBlcnJvcigiR2F0ZXdheSBmYWlsZWQgdG8gYmluZCIpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJYmZkLmRhdGEgPSBtc2diX2FsbG9jKDQwOTYsICJtZ2NwLW1zZyIpOworCQlpZiAoIWJmZC5kYXRhKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkdhdGV3YXkgbWVtb3J5IGVycm9yLlxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCisJCWlmIChic2NfcmVnaXN0ZXJfZmQoJmJmZCkgIT0gMCkgeworCQkJREVCVUdQKERNR0NQLCAiRmFpbGVkIHRvIHJlZ2lzdGVyIHRoZSBmZFxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlERUJVR1AoRE1HQ1AsICJDb25maWd1cmVkIGZvciBNR0NQLlxuIik7CisJfQorCisJLyogaW5pdGlhbGlzYXRpb24gKi8KKwlzcmFuZCh0aW1lKE5VTEwpKTsKKworCS8qIG1haW4gbG9vcCAqLworCXdoaWxlICgxKSB7CisJCWJzY19zZWxlY3RfbWFpbigwKTsKKwl9CisKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvbWdjcC9tZ2NwX25ldHdvcmsuYyBiL29wZW5ic2Mvc3JjL21nY3AvbWdjcF9uZXR3b3JrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc2Y2E0NwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL21nY3AvbWdjcF9uZXR3b3JrLmMKQEAgLTAsMCArMSwyNTUgQEAKKy8qIEEgTWVkaWEgR2F0ZXdheSBDb250cm9sIFByb3RvY29sIE1lZGlhIEdhdGV3YXk6IFJGQyAzNDM1ICovCisvKiBUaGUgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gKi8KKworLyoKKyAqIChDKSAyMDA5LTIwMTAgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogKEMpIDIwMDktMjAxMCBieSBPbi1XYXZlcworICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlbmRpYW4uaD4KKworI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL21nY3AuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL21nY3BfaW50ZXJuYWwuaD4KKworI3dhcm5pbmcgIk1ha2UgdXNlIG9mIHRoZSBydHAgcHJveHkgY29kZSIKKworLyogYWNjb3JkaW5nIHRvIHJ0cF9wcm94eS5jIFJGQyAzNTUwICovCitzdHJ1Y3QgcnRwX2hkciB7CisjaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorCXVfaW50OF90ICBjc3JjX2NvdW50OjQsCisJCSAgZXh0ZW5zaW9uOjEsCisJCSAgcGFkZGluZzoxLAorCQkgIHZlcnNpb246MjsKKwl1X2ludDhfdCAgcGF5bG9hZF90eXBlOjcsCisJCSAgbWFya2VyOjE7CisjZWxpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisJdV9pbnQ4X3QgIHZlcnNpb246MiwKKwkJICBwYWRkaW5nOjEsCisJCSAgZXh0ZW5zaW9uOjEsCisJCSAgY3NyY19jb3VudDo0OworCXVfaW50OF90ICBtYXJrZXI6MSwKKwkJICBwYXlsb2FkX3R5cGU6NzsKKyNlbmRpZgorCXVfaW50MTZfdCBzZXF1ZW5jZTsKKwl1X2ludDMyX3QgdGltZXN0YW1wOworCXVfaW50MzJfdCBzc3JjOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworCitlbnVtIHsKKwlERVNUX05FVFdPUksgPSAwLAorCURFU1RfQlRTID0gMSwKK307CisKK2VudW0geworCVBST1RPX1JUUCwKKwlQUk9UT19SVENQLAorfTsKKworCitzdGF0aWMgaW50IHVkcF9zZW5kKGludCBmZCwgc3RydWN0IGluX2FkZHIgKmFkZHIsIGludCBwb3J0LCBjaGFyICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IHNvY2thZGRyX2luIG91dDsKKwlvdXQuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJb3V0LnNpbl9wb3J0ID0gcG9ydDsKKwltZW1jcHkoJm91dC5zaW5fYWRkciwgYWRkciwgc2l6ZW9mKCphZGRyKSk7CisKKwlyZXR1cm4gc2VuZHRvKGZkLCBidWYsIGxlbiwgMCwgKHN0cnVjdCBzb2NrYWRkciAqKSZvdXQsIHNpemVvZihvdXQpKTsKK30KKworc3RhdGljIHZvaWQgcGF0Y2hfcGF5bG9hZChpbnQgcGF5bG9hZCwgY2hhciAqZGF0YSwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgcnRwX2hkciAqcnRwX2hkcjsKKworCWlmIChsZW4gPCBzaXplb2YoKnJ0cF9oZHIpKQorCQlyZXR1cm47CisKKwlydHBfaGRyID0gKHN0cnVjdCBydHBfaGRyICopIGRhdGE7CisJcnRwX2hkci0+cGF5bG9hZF90eXBlID0gcGF5bG9hZDsKK30KKworLyoKKyAqIFRoZXJlIGlzIGRhdGEgY29taW5nLiBXZSB3aWxsIGhhdmUgdG8gZmlndXJlIG91dCBpZiBpdAorICogY2FtZSBmcm9tIHRoZSBCVFMgb3IgdGhlIE1lZGlhR2F0ZXdheSBvZiB0aGUgTVNDLiBPbiB0b3AKKyAqIG9mIHRoYXQgd2UgbmVlZCB0byBmaWd1cmUgb3V0IGlmIGl0IHdhcyBSVFAgb3IgUlRDUC4KKyAqCisgKiBDdXJyZW50bHkgd2UgZG8gbm90IGNvbW11bmljYXRlIHdpdGggdGhlIEJTQyBzbyB3ZSBoYXZlCisgKiBubyBpZGVhIHdoZXJlIHRoZSBCVFMgaXMgbGlzdGVuaW5nIGZvciBSVFAgYW5kIG5lZWQgdG8KKyAqIGRvIHRoZSBjbGFzc2ljIHJvdXRpbmcgdHJpY2suIFdhaXQgZm9yIHRoZSBmaXJzdCBwYWNrZXQKKyAqIGZyb20gdGhlIEJUUyBhbmQgdGhlbiBnbyBhaGVhZC4KKyAqLworc3RhdGljIGludCBydHBfZGF0YV9jYihzdHJ1Y3QgYnNjX2ZkICpmZCwgdW5zaWduZWQgaW50IHdoYXQpCit7CisJY2hhciBidWZbNDA5Nl07CisJc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CisJc29ja2xlbl90IHNsZW4gPSBzaXplb2YoYWRkcik7CisJc3RydWN0IG1nY3BfZW5kcG9pbnQgKmVuZHA7CisJc3RydWN0IG1nY3BfY29uZmlnICpjZmc7CisJaW50IHJjLCBkZXN0LCBwcm90bzsKKworCWVuZHAgPSAoc3RydWN0IG1nY3BfZW5kcG9pbnQgKikgZmQtPmRhdGE7CisJY2ZnID0gZW5kcC0+Y2ZnOworCisJcmMgPSByZWN2ZnJvbShmZC0+ZmQsICZidWYsIHNpemVvZihidWYpLCAwLAorCQkJICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHIsICZzbGVuKTsKKwlpZiAocmMgPCAwKSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gcmVjZWl2ZSBtZXNzYWdlIG9uOiAweCV4XG4iLAorCQkJRU5EUE9JTlRfTlVNQkVSKGVuZHApKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIGRvIG5vdCBmb3J3YXJkIGF5bnRoaW5nLi4uIG1heWJlIHRoZXJlIGlzIGEgcGFja2V0IGZyb20gdGhlIGJ0cyAqLworCWlmIChlbmRwLT5jaSA9PSBDSV9VTlVTRUQpIHsKKwkJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIlVua25vd24gbWVzc2FnZSBvbiBlbmRwb2ludDogMHgleFxuIiwgRU5EUE9JTlRfTlVNQkVSKGVuZHApKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qCisJICogRmlndXJlIG91dCB3aGVyZSB0byBmb3J3YXJkIGl0IHRvLiBUaGlzIGNvZGUgYXNzdW1lcyB0aGF0IHdlCisJICogaGF2ZSByZWNlaXZlZCB0aGUgQ29ubmVjdGlvbiBNb2RpZnkgYW5kIGtub3cgd2hvIGlzIGEgbGVnaXRpbWF0ZQorCSAqIHBhcnRuZXIuIEFjY29yZGluZyB0byB0aGUgc3BlYyB3ZSBjb3VsZCBhdHRlbXB0IHRvIGZvcndhcmQgZXZlbgorCSAqIGFmdGVyIHRoZSBDcmVhdGUgQ29ubmVjdGlvbiBidXQgd2Ugd2lsbCBub3QgYXMgd2UgYXJlIG5vdCByZWFsbHkKKwkgKiBhYmxlIHRvIHRlbGwgaWYgdGhpcyBpcyBsZWdpdGltYXRlLgorCSAqLworCSN3YXJuaW5nICJTbGlnaHQgc3BlYyB2aW9sYXRpb24uIFdpdGggY29ubmVjdGlvbiBtb2RlIHJlY3Zvbmx5IHdlIHNob3VsZCBhdHRlbXB0IHRvIGZvcndhcmQuIgorCWRlc3QgPSBtZW1jbXAoJmFkZHIuc2luX2FkZHIsICZlbmRwLT5yZW1vdGUsIHNpemVvZihhZGRyLnNpbl9hZGRyKSkgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAoZW5kcC0+bmV0X3J0cCA9PSBhZGRyLnNpbl9wb3J0IHx8IGVuZHAtPm5ldF9ydGNwID09IGFkZHIuc2luX3BvcnQpCisJCQk/IERFU1RfQlRTIDogREVTVF9ORVRXT1JLOworCXByb3RvID0gZmQgPT0gJmVuZHAtPmxvY2FsX3J0cCA/IFBST1RPX1JUUCA6IFBST1RPX1JUQ1A7CisKKwkvKiBXZSBoYXZlIG5vIGlkZWEgd2hvIGNhbGxlZCB1cywgbWF5YmUgaXQgaXMgdGhlIEJUUy4gKi8KKwlpZiAoZGVzdCA9PSBERVNUX05FVFdPUksgJiYgKGVuZHAtPmJ0c19ydHAgPT0gMCB8fCBjZmctPmZvcndhcmRfaXApKSB7CisJCS8qIGl0IHdhcyB0aGUgQlRTLi4uICovCisJCWlmICghY2ZnLT5idHNfaXAgfHwgbWVtY21wKCZhZGRyLnNpbl9hZGRyLCAmY2ZnLT5idHNfaW4sIHNpemVvZihjZmctPmJ0c19pbikpID09IDApIHsKKwkJCWlmIChmZCA9PSAmZW5kcC0+bG9jYWxfcnRwKSB7CisJCQkJZW5kcC0+YnRzX3J0cCA9IGFkZHIuc2luX3BvcnQ7CisJCQl9IGVsc2UgeworCQkJCWVuZHAtPmJ0c19ydGNwID0gYWRkci5zaW5fcG9ydDsKKwkJCX0KKworCQkJZW5kcC0+YnRzID0gYWRkci5zaW5fYWRkcjsKKwkJCUxPR1AoRE1HQ1AsIExPR0xfTk9USUNFLCAiRm91bmQgQlRTIGZvciBlbmRwb2ludDogMHgleCBvbiBwb3J0OiAlZC8lZFxuIiwKKwkJCQlFTkRQT0lOVF9OVU1CRVIoZW5kcCksIG50b2hzKGVuZHAtPmJ0c19ydHApLCBudG9ocyhlbmRwLT5idHNfcnRjcCkpOworCQl9CisJfQorCisJLyogZGlzcGF0Y2ggKi8KKwlpZiAoY2ZnLT5hdWRpb19sb29wKQorCQlkZXN0ID0gIWRlc3Q7CisKKwlpZiAoZGVzdCA9PSBERVNUX05FVFdPUkspIHsKKwkJcGF0Y2hfcGF5bG9hZChlbmRwLT5uZXRfcGF5bG9hZF90eXBlLCBidWYsIHJjKTsKKwkJcmV0dXJuIHVkcF9zZW5kKGZkLT5mZCwgJmVuZHAtPnJlbW90ZSwKKwkJCSAgICAgcHJvdG8gPT0gUFJPVE9fUlRQID8gZW5kcC0+bmV0X3J0cCA6IGVuZHAtPm5ldF9ydGNwLAorCQkJICAgICBidWYsIHJjKTsKKwl9IGVsc2UgeworCQlwYXRjaF9wYXlsb2FkKGVuZHAtPmJ0c19wYXlsb2FkX3R5cGUsIGJ1ZiwgcmMpOworCQlyZXR1cm4gdWRwX3NlbmQoZmQtPmZkLCAmZW5kcC0+YnRzLAorCQkJICAgICBwcm90byA9PSBQUk9UT19SVFAgPyBlbmRwLT5idHNfcnRwIDogZW5kcC0+YnRzX3J0Y3AsCisJCQkgICAgIGJ1ZiwgcmMpOworCX0KK30KKworc3RhdGljIGludCBjcmVhdGVfYmluZChjb25zdCBjaGFyICpzb3VyY2VfYWRkciwgc3RydWN0IGJzY19mZCAqZmQsIGludCBwb3J0KQoreworCXN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOworCWludCBvbiA9IDE7CisKKwlmZC0+ZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisJaWYgKGZkLT5mZCA8IDApIHsKKwkJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBjcmVhdGUgVURQIHBvcnQuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXNldHNvY2tvcHQoZmQtPmZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZvbiwgc2l6ZW9mKG9uKSk7CisJbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOworCWFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworCWluZXRfYXRvbihzb3VyY2VfYWRkciwgJmFkZHIuc2luX2FkZHIpOworCisJaWYgKGJpbmQoZmQtPmZkLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCBzaXplb2YoYWRkcikpIDwgMCkgeworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmluZF9ydHAoc3RydWN0IG1nY3BfZW5kcG9pbnQgKmVuZHApCit7CisJc3RydWN0IG1nY3BfY29uZmlnICpjZmcgPSBlbmRwLT5jZmc7CisKKwlpZiAoY3JlYXRlX2JpbmQoY2ZnLT5zb3VyY2VfYWRkciwgJmVuZHAtPmxvY2FsX3J0cCwgZW5kcC0+cnRwX3BvcnQpICE9IDApIHsKKwkJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBjcmVhdGUgUlRQIHBvcnQ6ICVzOiVkIG9uIDB4JXhcbiIsCisJCSAgICAgICBjZmctPnNvdXJjZV9hZGRyLCBlbmRwLT5ydHBfcG9ydCwgRU5EUE9JTlRfTlVNQkVSKGVuZHApKTsKKwkJZ290byBjbGVhbnVwMDsKKwl9CisKKwlpZiAoY3JlYXRlX2JpbmQoY2ZnLT5zb3VyY2VfYWRkciwgJmVuZHAtPmxvY2FsX3J0Y3AsIGVuZHAtPnJ0cF9wb3J0ICsgMSkgIT0gMCkgeworCQlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSBSVENQIHBvcnQ6ICVzOiVkIG9uIDB4JXhcbiIsCisJCSAgICAgICBjZmctPnNvdXJjZV9hZGRyLCBlbmRwLT5ydHBfcG9ydCArIDEsIEVORFBPSU5UX05VTUJFUihlbmRwKSk7CisJCWdvdG8gY2xlYW51cDE7CisJfQorCisJZW5kcC0+bG9jYWxfcnRwLmNiID0gcnRwX2RhdGFfY2I7CisJZW5kcC0+bG9jYWxfcnRwLmRhdGEgPSBlbmRwOworCWVuZHAtPmxvY2FsX3J0cC53aGVuID0gQlNDX0ZEX1JFQUQ7CisJaWYgKGJzY19yZWdpc3Rlcl9mZCgmZW5kcC0+bG9jYWxfcnRwKSAhPSAwKSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gcmVnaXN0ZXIgUlRQIHBvcnQgJWQgb24gMHgleFxuIiwKKwkJCWVuZHAtPnJ0cF9wb3J0LCBFTkRQT0lOVF9OVU1CRVIoZW5kcCkpOworCQlnb3RvIGNsZWFudXAyOworCX0KKworCWVuZHAtPmxvY2FsX3J0Y3AuY2IgPSBydHBfZGF0YV9jYjsKKwllbmRwLT5sb2NhbF9ydGNwLmRhdGEgPSBlbmRwOworCWVuZHAtPmxvY2FsX3J0Y3Aud2hlbiA9IEJTQ19GRF9SRUFEOworCWlmIChic2NfcmVnaXN0ZXJfZmQoJmVuZHAtPmxvY2FsX3J0Y3ApICE9IDApIHsKKwkJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byByZWdpc3RlciBSVENQIHBvcnQgJWQgb24gMHgleFxuIiwKKwkJCWVuZHAtPnJ0cF9wb3J0ICsgMSwgRU5EUE9JTlRfTlVNQkVSKGVuZHApKTsKKwkJZ290byBjbGVhbnVwMzsKKwl9CisKKwlyZXR1cm4gMDsKKworY2xlYW51cDM6CisJYnNjX3VucmVnaXN0ZXJfZmQoJmVuZHAtPmxvY2FsX3J0cCk7CitjbGVhbnVwMjoKKwljbG9zZShlbmRwLT5sb2NhbF9ydGNwLmZkKTsKKwllbmRwLT5sb2NhbF9ydGNwLmZkID0gLTE7CitjbGVhbnVwMToKKwljbG9zZShlbmRwLT5sb2NhbF9ydHAuZmQpOworCWVuZHAtPmxvY2FsX3J0cC5mZCA9IC0xOworY2xlYW51cDA6CisJcmV0dXJuIC0xOworfQorCitpbnQgbWdjcF9iaW5kX3J0cF9wb3J0KHN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwLCBpbnQgcnRwX3BvcnQpCit7CisJZW5kcC0+cnRwX3BvcnQgPSBydHBfcG9ydDsKKwlyZXR1cm4gYmluZF9ydHAoZW5kcCk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9tZ2NwL21nY3BfcHJvdG9jb2wuYyBiL29wZW5ic2Mvc3JjL21nY3AvbWdjcF9wcm90b2NvbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZWY1NDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9tZ2NwL21nY3BfcHJvdG9jb2wuYwpAQCAtMCwwICsxLDc0NSBAQAorLyogQSBNZWRpYSBHYXRld2F5IENvbnRyb2wgUHJvdG9jb2wgTWVkaWEgR2F0ZXdheTogUkZDIDM0MzUgKi8KKy8qIFRoZSBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiAqLworCisvKgorICogKEMpIDIwMDktMjAxMCBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiAoQykgMjAwOS0yMDEwIGJ5IE9uLVdhdmVzCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL21nY3AuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL21nY3BfaW50ZXJuYWwuaD4KKworZW51bSBtZ2NwX2Nvbm5lY3Rpb25fbW9kZSB7CisJTUdDUF9DT05OX05PTkUgPSAwLAorCU1HQ1BfQ09OTl9SRUNWX09OTFkgPSAxLAorCU1HQ1BfQ09OTl9TRU5EX09OTFkgPSAyLAorCU1HQ1BfQ09OTl9SRUNWX1NFTkQgPSBNR0NQX0NPTk5fUkVDVl9PTkxZIHwgTUdDUF9DT05OX1NFTkRfT05MWSwKK307CisKKy8qKgorICogTWFjcm8gZm9yIHRva2VuaXppbmcgTUdDUCBtZXNzYWdlcyBhbmQgU0RQIGluIG9uZSBnby4KKyAqCisgKi8KKyNkZWZpbmUgTVNHX1RPS0VOSVpFX1NUQVJUIFwKKwlsaW5lX3N0YXJ0ID0gMDsJCQkJCQlcCisJZm9yIChpID0gMDsgaSA8IG1zZ2JfbDNsZW4obXNnKTsgKytpKSB7CQkJXAorCQkvKiB3ZSBoYXZlIGEgbGluZSBlbmQgKi8JCQlcCisJCWlmIChtc2ctPmwzaFtpXSA9PSAnXG4nKSB7CQkJXAorCQkJLyogc2tpcCB0aGUgZmlyc3QgbGluZSAqLwkJXAorCQkJaWYgKGxpbmVfc3RhcnQgPT0gMCkgewkJCVwKKwkJCQlsaW5lX3N0YXJ0ID0gaSArIDE7CQlcCisJCQkJY29udGludWU7CQkJXAorCQkJfQkJCQkJXAorCQkJCQkJCQlcCisJCQkvKiBjaGVjayBpZiB3ZSBoYXZlIGEgcHJvcGVyIHBhcmFtICovCVwKKwkJCWlmIChpIC0gbGluZV9zdGFydCA9PSAxICYmIG1zZy0+bDNoW2xpbmVfc3RhcnRdID09ICdccicpIHsgXAorCQkJfSBlbHNlIGlmIChpIC0gbGluZV9zdGFydCA+IDIJCVwKKwkJCSAgICAmJiBpc2xvd2VyKG1zZy0+bDNoW2xpbmVfc3RhcnRdKQlcCisJCQkgICAgJiYgbXNnLT5sM2hbbGluZV9zdGFydCArIDFdID09ICc9JykgeyBcCisJCQl9IGVsc2UgaWYgKGkgLSBsaW5lX3N0YXJ0IDwgMwkJXAorCQkJICAgIHx8IG1zZy0+bDNoW2xpbmVfc3RhcnQgKyAxXSAhPSAnOicJXAorCQkJICAgIHx8IG1zZy0+bDNoW2xpbmVfc3RhcnQgKyAyXSAhPSAnICcpCVwKKwkJCQlnb3RvIGVycm9yOwkJCVwKKwkJCQkJCQkJXAorCQkJbXNnLT5sM2hbaV0gPSAnXDAnOwkJCVwKKwkJCWlmIChtc2ctPmwzaFtpLTFdID09ICdccicpCQlcCisJCQkJbXNnLT5sM2hbaS0xXSA9ICdcMCc7CisKKyNkZWZpbmUgTVNHX1RPS0VOSVpFX0VORCBcCisJCQlsaW5lX3N0YXJ0ID0gaSArIDE7IFwKKwkJfQkJCSAgICBcCisJfQorCisKK3N0cnVjdCBtZ2NwX21zZ19wdHIgeworCXVuc2lnbmVkIGludCBzdGFydDsKKwl1bnNpZ25lZCBpbnQgbGVuZ3RoOworfTsKKworc3RydWN0IG1nY3BfcmVxdWVzdCB7CisJY2hhciAqbmFtZTsKKwlzdHJ1Y3QgbXNnYiAqKCpoYW5kbGVfcmVxdWVzdCkgKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnLCBzdHJ1Y3QgbXNnYiAqbXNnKTsKKwljaGFyICpkZWJ1Z19uYW1lOworfTsKKworI2RlZmluZSBNR0NQX1JFUVVFU1QoTkFNRSwgUkVRLCBERUJVR19OQU1FKSBcCisJeyAubmFtZSA9IE5BTUUsIC5oYW5kbGVfcmVxdWVzdCA9IFJFUSwgLmRlYnVnX25hbWUgPSBERUJVR19OQU1FIH0sCisKK3N0YXRpYyBzdHJ1Y3QgbXNnYiAqaGFuZGxlX2F1ZGl0X2VuZHBvaW50KHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnLCBzdHJ1Y3QgbXNnYiAqbXNnKTsKK3N0YXRpYyBzdHJ1Y3QgbXNnYiAqaGFuZGxlX2NyZWF0ZV9jb24oc3RydWN0IG1nY3BfY29uZmlnICpjZmcsIHN0cnVjdCBtc2diICptc2cpOworc3RhdGljIHN0cnVjdCBtc2diICpoYW5kbGVfZGVsZXRlX2NvbihzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgc3RydWN0IG1zZ2IgKm1zZyk7CitzdGF0aWMgc3RydWN0IG1zZ2IgKmhhbmRsZV9tb2RpZnlfY29uKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnLCBzdHJ1Y3QgbXNnYiAqbXNnKTsKKworc3RhdGljIGludCBnZW5lcmF0ZV9jYWxsX2lkKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnKQoreworCWludCBpOworCisJLyogdXNlIHRoZSBjYWxsIGlkICovCisJKytjZmctPmxhc3RfY2FsbF9pZDsKKworCS8qIGhhbmRsZSB3cmFwIGFyb3VuZCAqLworCWlmIChjZmctPmxhc3RfY2FsbF9pZCA9PSBDSV9VTlVTRUQpCisJCSsrY2ZnLT5sYXN0X2NhbGxfaWQ7CisKKwkvKiBjYWxsc3RhY2sgY2FuIG9ubHkgYmUgb2Ygc2l6ZSBudW1iZXJfb2ZfZW5kcG9pbnRzICovCisJLyogdmVyaWZ5IHRoYXQgdGhlIGNhbGwgaWQgaXMgZnJlZSwgZS5nLiBpbiBjYXNlIG9mIG92ZXJydW4gKi8KKwlmb3IgKGkgPSAxOyBpIDwgY2ZnLT5udW1iZXJfZW5kcG9pbnRzOyArK2kpCisJCWlmIChjZmctPmVuZHBvaW50c1tpXS5jaSA9PSBjZmctPmxhc3RfY2FsbF9pZCkKKwkJCXJldHVybiBnZW5lcmF0ZV9jYWxsX2lkKGNmZyk7CisKKwlyZXR1cm4gY2ZnLT5sYXN0X2NhbGxfaWQ7Cit9CisKKy8qIEZJWElNRS9UT0RPOiBuZWVkIHRvIGhhdmUgYSBsaXN0IG9mIHBlbmRpbmcgdHJhbnNhY3Rpb25zIGFuZCBjaGVjayB0aGF0ICovCitzdGF0aWMgdW5zaWduZWQgaW50IGdlbmVyYXRlX3RyYW5zYWN0aW9uX2lkKCkKK3sKKwlyZXR1cm4gYWJzKHJhbmQoKSk7Cit9CisKKy8qCisgKiBhcnJheSBvZiBmdW5jdGlvbiBwb2ludGVycyBmb3IgaGFuZGxpbmcgdmFyaW91cworICogbWVzc2FnZXMuIEluIHRoZSBmdXR1cmUgdGhpcyBtaWdodCBiZSBiaW5hcnkgc29ydGVkCisgKiBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBtZ2NwX3JlcXVlc3QgbWdjcF9yZXF1ZXN0cyBbXSA9IHsKKwlNR0NQX1JFUVVFU1QoIkFVRVAiLCBoYW5kbGVfYXVkaXRfZW5kcG9pbnQsICJBdWRpdEVuZHBvaW50IikKKwlNR0NQX1JFUVVFU1QoIkNSQ1giLCBoYW5kbGVfY3JlYXRlX2NvbiwgIkNyZWF0ZUNvbm5lY3Rpb24iKQorCU1HQ1BfUkVRVUVTVCgiRExDWCIsIGhhbmRsZV9kZWxldGVfY29uLCAiRGVsZXRlQ29ubmVjdGlvbiIpCisJTUdDUF9SRVFVRVNUKCJNRENYIiwgaGFuZGxlX21vZGlmeV9jb24sICJNb2RpZml5Q29ubmVjdGlvbiIpCit9OworCitzdGF0aWMgc3RydWN0IG1zZ2IgKm1nY3BfbXNnYl9hbGxvYyh2b2lkKQoreworCXN0cnVjdCBtc2diICptc2c7CisJbXNnID0gbXNnYl9hbGxvY19oZWFkcm9vbSg0MDk2LCAxMjgsICJNR0NQIG1zZyIpOworCWlmICghbXNnKQorCSAgICBMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIG1zZ2IgZm9yIE1HQ1AgZGF0YS5cbiIpOworCisJcmV0dXJuIG1zZzsKK30KKworc3RydWN0IG1zZ2IgKm1nY3BfY3JlYXRlX3Jlc3BvbnNlX3dpdGhfZGF0YShpbnQgY29kZSwgY29uc3QgY2hhciAqbXNnLCBjb25zdCBjaGFyICp0cmFucywKKwkJCQkgICAgY29uc3QgY2hhciAqZGF0YSkKK3sKKwlpbnQgbGVuOworCXN0cnVjdCBtc2diICpyZXM7CisKKwlyZXMgPSBtZ2NwX21zZ2JfYWxsb2MoKTsKKwlpZiAoIXJlcykKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoZGF0YSkgeworCQlsZW4gPSBzbnByaW50ZigoY2hhciAqKSByZXMtPmRhdGEsIDIwNDgsICIlZCAlc1xuJXMiLCBjb2RlLCB0cmFucywgZGF0YSk7CisJfSBlbHNlIHsKKwkJbGVuID0gc25wcmludGYoKGNoYXIgKikgcmVzLT5kYXRhLCAyMDQ4LCAiJWQgJXNcbiIsIGNvZGUsIHRyYW5zKTsKKwl9CisKKwlyZXMtPmwyaCA9IG1zZ2JfcHV0KHJlcywgbGVuKTsKKwlMT0dQKERNR0NQLCBMT0dMX0RFQlVHLCAiU2VuZGluZyByZXNwb25zZTogY29kZTogJWQgZm9yICclcydcbiIsIGNvZGUsIHJlcy0+bDJoKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgc3RydWN0IG1zZ2IgKmNyZWF0ZV9yZXNwb25zZShpbnQgY29kZSwgY29uc3QgY2hhciAqbXNnLCBjb25zdCBjaGFyICp0cmFucykKK3sKKwlyZXR1cm4gbWdjcF9jcmVhdGVfcmVzcG9uc2Vfd2l0aF9kYXRhKGNvZGUsIG1zZywgdHJhbnMsIE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IG1zZ2IgKmNyZWF0ZV9yZXNwb25zZV93aXRoX3NkcChzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqZW5kcCwKKwkJCQkJICAgICBjb25zdCBjaGFyICptc2csIGNvbnN0IGNoYXIgKnRyYW5zX2lkKQoreworCWNvbnN0IGNoYXIgKmFkZHIgPSBlbmRwLT5jZmctPmxvY2FsX2lwOworCWNoYXIgc2RwX3JlY29yZFs0MDk2XTsKKworCWlmICghYWRkcikKKwkJYWRkciA9IGVuZHAtPmNmZy0+c291cmNlX2FkZHI7CisKKwlzbnByaW50ZihzZHBfcmVjb3JkLCBzaXplb2Yoc2RwX3JlY29yZCkgLSAxLAorCQkJIkk6ICVkXG5cbiIKKwkJCSJ2PTBcclxuIgorCQkJImM9SU4gSVA0ICVzXHJcbiIKKwkJCSJtPWF1ZGlvICVkIFJUUC9BVlAgJWRcclxuIgorCQkJImE9cnRwbWFwOiVkICVzXHJcbiIsCisJCQllbmRwLT5jaSwgYWRkciwgZW5kcC0+cnRwX3BvcnQsCisJCQllbmRwLT5idHNfcGF5bG9hZF90eXBlLCBlbmRwLT5idHNfcGF5bG9hZF90eXBlLAorCQkgICAgICAgIGVuZHAtPmNmZy0+YXVkaW9fbmFtZSk7CisJcmV0dXJuIG1nY3BfY3JlYXRlX3Jlc3BvbnNlX3dpdGhfZGF0YSgyMDAsIG1zZywgdHJhbnNfaWQsIHNkcF9yZWNvcmQpOworfQorCisvKiBzZW5kIGEgc3RhdGljIHJlY29yZCAqLworc3RydWN0IG1zZ2IgKm1nY3BfY3JlYXRlX3JzaXAodm9pZCkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCWludCBsZW47CisKKwltc2cgPSBtZ2NwX21zZ2JfYWxsb2MoKTsKKwlpZiAoIW1zZykKKwkJcmV0dXJuIE5VTEw7CisKKwlsZW4gPSBzbnByaW50ZigoY2hhciAqKSBtc2ctPmRhdGEsIDIwNDgsCisJCQkiUlNJUCAldSAqQG1ndyBNR0NQIDEuMFxuIgorCQkJIlJNOiByZXN0YXJ0XG4iLCBnZW5lcmF0ZV90cmFuc2FjdGlvbl9pZCgpKTsKKwltc2ctPmwyaCA9IG1zZ2JfcHV0KG1zZywgbGVuKTsKKwlyZXR1cm4gbXNnOworfQorCisvKgorICogaGFuZGxlIGluY29taW5nIG1lc3NhZ2VzOgorICogICAtIHRoaXMgY2FuIGJlIGEgY29tbWFuZCAoZm91ciBsZXR0ZXJzLCBzcGFjZSwgdHJhbnNhY3Rpb24gaWQpCisgKiAgIC0gb3IgYSByZXNwb25zZSAodGhyZWUgbnVtYmVycywgc3BhY2UsIHRyYW5zYWN0aW9uIGlkKQorICovCitzdHJ1Y3QgbXNnYiAqbWdjcF9oYW5kbGVfbWVzc2FnZShzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKyAgICAgICAgaW50IGNvZGU7CisJc3RydWN0IG1zZ2IgKnJlc3AgPSBOVUxMOworCisJaWYgKG1zZy0+bGVuIDwgNCkgeworCQlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAibWdzIHRvbyBzaG9ydDogJWRcbiIsIG1zZy0+bGVuKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisgICAgICAgIC8qIGF0dGVtcHQgdG8gdHJlYXQgaXQgYXMgYSByZXNwb25zZSAqLworICAgICAgICBpZiAoc3NjYW5mKChjb25zdCBjaGFyICopJm1zZy0+ZGF0YVswXSwgIiUzZCAlKnMiLCAmY29kZSkgPT0gMSkgeworCQlMT0dQKERNR0NQLCBMT0dMX0RFQlVHLCAiUmVzcG9uc2U6IENvZGU6ICVkXG4iLCBjb2RlKTsKKwl9IGVsc2UgeworCQlpbnQgaSwgaGFuZGxlZCA9IDA7CisJCW1zZy0+bDNoID0gJm1zZy0+bDJoWzRdOworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtZ2NwX3JlcXVlc3RzKTsgKytpKQorCQkJaWYgKHN0cm5jbXAobWdjcF9yZXF1ZXN0c1tpXS5uYW1lLCAoY29uc3QgY2hhciAqKSAmbXNnLT5kYXRhWzBdLCA0KSA9PSAwKSB7CisJCQkJaGFuZGxlZCA9IDE7CisJCQkJcmVzcCA9IG1nY3BfcmVxdWVzdHNbaV0uaGFuZGxlX3JlcXVlc3QoY2ZnLCBtc2cpOworCQkJCWJyZWFrOworCQkJfQorCQlpZiAoIWhhbmRsZWQpIHsKKwkJCUxPR1AoRE1HQ1AsIExPR0xfTk9USUNFLCAiTVNHIHdpdGggdHlwZTogJyUuNHMnIG5vdCBoYW5kbGVkXG4iLCAmbXNnLT5kYXRhWzBdKTsKKwkJfQorCX0KKworCXJldHVybiByZXNwOworfQorCisvKiBzdHJpbmcgdG9rZW5pemVyIGZvciB0aGUgcG9vciAqLworc3RhdGljIGludCBmaW5kX21zZ19wb2ludGVycyhzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgbWdjcF9tc2dfcHRyICpwdHJzLCBpbnQgcHRyc19sZW5ndGgpCit7CisJaW50IGksIGZvdW5kID0gMDsKKworCWludCB3aGl0ZXNwYWNlID0gMTsKKwlmb3IgKGkgPSAwOyBpIDwgbXNnYl9sM2xlbihtc2cpICYmIHB0cnNfbGVuZ3RoID4gMDsgKytpKSB7CisJCS8qIGlmIHdlIGhhdmUgYSBzcGFjZSB3ZSBmb3VuZCBhbiBlbmQgKi8KKwkJaWYgKG1zZy0+bDNoW2ldCT09ICcgJyB8fCBtc2ctPmwzaFtpXSA9PSAnXHInIHx8IG1zZy0+bDNoW2ldID09ICdcbicpIHsKKwkJCWlmICghd2hpdGVzcGFjZSkgeworCQkJCSsrZm91bmQ7CisJCQkJd2hpdGVzcGFjZSA9IDE7CisJCQkJcHRycy0+bGVuZ3RoID0gaSAtIHB0cnMtPnN0YXJ0IC0gMTsKKwkJCQkrK3B0cnM7CisJCQkJLS1wdHJzX2xlbmd0aDsKKwkJCX0gZWxzZSB7CisJCQkgICAgLyogc2tpcCBhbnkgbnVtYmVyIG9mIHdoaXRlc3BhY2UgKi8KKwkJCX0KKworCQkJLyogbGluZSBlbmQuLi4gc3RvcCAqLworCQkJaWYgKG1zZy0+bDNoW2ldID09ICdccicgfHwgbXNnLT5sM2hbaV0gPT0gJ1xuJykKKwkJCQlicmVhazsKKwkJfSBlbHNlIGlmIChtc2ctPmwzaFtpXSA9PSAnXHInIHx8IG1zZy0+bDNoW2ldID09ICdcbicpIHsKKwkJCS8qIGxpbmUgZW5kLCBiZSBkb25lICovCisJCQlicmVhazsKKwkJfSBlbHNlIGlmICh3aGl0ZXNwYWNlKSB7CisJCQl3aGl0ZXNwYWNlID0gMDsKKwkJCXB0cnMtPnN0YXJ0ID0gaTsKKwkJfQorCX0KKworCWlmIChwdHJzX2xlbmd0aCA9PSAwKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIGZvdW5kOworfQorCitzdGF0aWMgc3RydWN0IG1nY3BfZW5kcG9pbnQgKmZpbmRfZW5kcG9pbnQoc3RydWN0IG1nY3BfY29uZmlnICpjZmcsIGNvbnN0IGNoYXIgKm1nY3ApCit7CisJY2hhciAqZW5kcHRyID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgZ3cgPSBJTlRfTUFYOworCisJZ3cgPSBzdHJ0b3VsKG1nY3AsICZlbmRwdHIsIDE2KTsKKwlpZiAoZ3cgPT0gMCB8fCBndyA+PSBjZmctPm51bWJlcl9lbmRwb2ludHMgfHwgc3RyY21wKGVuZHB0ciwgIkBtZ3ciKSAhPSAwKSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJOb3QgYWJsZSB0byBmaW5kIGVuZHBvaW50OiAnJXMnXG4iLCBtZ2NwKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuICZjZmctPmVuZHBvaW50c1tnd107Cit9CisKK3N0YXRpYyBpbnQgYW5hbHl6ZV9oZWFkZXIoc3RydWN0IG1nY3BfY29uZmlnICpjZmcsIHN0cnVjdCBtc2diICptc2csCisJCQkgIHN0cnVjdCBtZ2NwX21zZ19wdHIgKnB0ciwgaW50IHNpemUsCisJCQkgIGNvbnN0IGNoYXIgKip0cmFuc2FjdGlvbl9pZCwgc3RydWN0IG1nY3BfZW5kcG9pbnQgKiplbmRwKQoreworCWludCBmb3VuZDsKKworCSp0cmFuc2FjdGlvbl9pZCA9ICIwMDAwMDAiOworCisJaWYgKHNpemUgPCAzKSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJOb3QgZW5vdWdoIHNwYWNlIGluIHB0clxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlmb3VuZCA9IGZpbmRfbXNnX3BvaW50ZXJzKG1zZywgcHRyLCBzaXplKTsKKworCWlmIChmb3VuZCA8PSAzKSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJHYXRld2F5OiBOb3QgZW5vdWdoIHBhcmFtcy4gRm91bmQ6ICVkXG4iLCBmb3VuZCk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKgorCSAqIHJlcGxhY2UgdGhlIHNwYWNlIHdpdGggXDAuIHRoZSBtYWluIG1ldGhvZCBndXJhbnRlc3MgdGhhdAorCSAqIHdlIHN0aWxsIGhhdmUgKyAxIGZvciBudWxsIHRlcm1pbmF0aW9uCisJICovCisJbXNnLT5sM2hbcHRyWzNdLnN0YXJ0ICsgcHRyWzNdLmxlbmd0aCArIDFdID0gJ1wwJzsKKwltc2ctPmwzaFtwdHJbMl0uc3RhcnQgKyBwdHJbMl0ubGVuZ3RoICsgMV0gPSAnXDAnOworCW1zZy0+bDNoW3B0clsxXS5zdGFydCArIHB0clsxXS5sZW5ndGggKyAxXSA9ICdcMCc7CisJbXNnLT5sM2hbcHRyWzBdLnN0YXJ0ICsgcHRyWzBdLmxlbmd0aCArIDFdID0gJ1wwJzsKKworCWlmIChzdHJuY21wKCIxLjAiLCAoY29uc3QgY2hhciAqKSZtc2ctPmwzaFtwdHJbM10uc3RhcnRdLCAzKSAhPSAwCisJICAgIHx8IHN0cm5jbXAoIk1HQ1AiLCAoY29uc3QgY2hhciAqKSZtc2ctPmwzaFtwdHJbMl0uc3RhcnRdLCA0KSAhPSAwKSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJXcm9uZyBNR0NQIHZlcnNpb24uIE5vdCBoYW5kbGluZzogJyVzJyAnJXMnXG4iLAorCQkJKGNvbnN0IGNoYXIgKikmbXNnLT5sM2hbcHRyWzNdLnN0YXJ0XSwKKwkJCShjb25zdCBjaGFyICopJm1zZy0+bDNoW3B0clsyXS5zdGFydF0pOworCQlyZXR1cm4gLTE7CisJfQorCisJKnRyYW5zYWN0aW9uX2lkID0gKGNvbnN0IGNoYXIgKikmbXNnLT5sM2hbcHRyWzBdLnN0YXJ0XTsKKwkqZW5kcCA9IGZpbmRfZW5kcG9pbnQoY2ZnLCAoY29uc3QgY2hhciAqKSZtc2ctPmwzaFtwdHJbMV0uc3RhcnRdKTsKKwlyZXR1cm4gKmVuZHAgPT0gTlVMTDsKK30KKworc3RhdGljIGludCB2ZXJpZnlfY2FsbF9pZChjb25zdCBzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqZW5kcCwKKwkJCSAgY29uc3QgY2hhciAqY2FsbGlkKQoreworCWlmIChzdHJjbXAoZW5kcC0+Y2FsbGlkLCBjYWxsaWQpICE9IDApIHsKKwkJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIkNhbGxJRHMgZG9lcyBub3QgbWF0Y2ggb24gMHgleC4gJyVzJyAhPSAnJXMnXG4iLAorCQkJRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBlbmRwLT5jYWxsaWQsIGNhbGxpZCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2ZXJpZnlfY2koY29uc3Qgc3RydWN0IG1nY3BfZW5kcG9pbnQgKmVuZHAsCisJCSAgICAgY29uc3QgY2hhciAqY2kpCit7CisJaWYgKGF0b2koY2kpICE9IGVuZHAtPmNpKSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJDb25uZWN0aW9uSWRlbnRpZmllcnMgZG8gbm90IG1hdGNoIG9uIDB4JXguICVkICE9ICVzXG4iLAorCQkJRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBlbmRwLT5jaSwgY2kpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbXNnYiAqaGFuZGxlX2F1ZGl0X2VuZHBvaW50KHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBtZ2NwX21zZ19wdHIgZGF0YV9wdHJzWzZdOworCWludCBmb3VuZCwgcmVzcG9uc2U7CisJY29uc3QgY2hhciAqdHJhbnNfaWQ7CisJc3RydWN0IG1nY3BfZW5kcG9pbnQgKmVuZHA7CisKKwlmb3VuZCA9IGFuYWx5emVfaGVhZGVyKGNmZywgbXNnLCBkYXRhX3B0cnMsIEFSUkFZX1NJWkUoZGF0YV9wdHJzKSwgJnRyYW5zX2lkLCAmZW5kcCk7CisJaWYgKGZvdW5kICE9IDApCisJICAgIHJlc3BvbnNlID0gNTAwOworCWVsc2UKKwkgICAgcmVzcG9uc2UgPSAyMDA7CisKKwlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlKHJlc3BvbnNlLCAiQVVFUCIsIHRyYW5zX2lkKTsKK30KKworc3RhdGljIGludCBwYXJzZV9jb25uX21vZGUoY29uc3QgY2hhciogbXNnLCBpbnQgKmNvbm5fbW9kZSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlpZiAoc3RyY21wKG1zZywgInJlY3Zvbmx5IikgPT0gMCkKKwkJKmNvbm5fbW9kZSA9IE1HQ1BfQ09OTl9SRUNWX09OTFk7CisJZWxzZSBpZiAoc3RyY21wKG1zZywgInNlbmRyZWN2IikgPT0gMCkKKwkJKmNvbm5fbW9kZSA9IE1HQ1BfQ09OTl9SRUNWX1NFTkQ7CisJZWxzZSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJVbmtub3duIGNvbm5lY3Rpb24gbW9kZTogJyVzJ1xuIiwgbXNnKTsKKwkJcmV0ID0gLTE7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBtc2diICpoYW5kbGVfY3JlYXRlX2NvbihzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgbWdjcF9tc2dfcHRyIGRhdGFfcHRyc1s2XTsKKwlpbnQgZm91bmQsIGksIGxpbmVfc3RhcnQ7CisJY29uc3QgY2hhciAqdHJhbnNfaWQ7CisJc3RydWN0IG1nY3BfZW5kcG9pbnQgKmVuZHA7CisJaW50IGVycm9yX2NvZGUgPSA1MDA7CisJaW50IHBvcnQ7CisKKwlmb3VuZCA9IGFuYWx5emVfaGVhZGVyKGNmZywgbXNnLCBkYXRhX3B0cnMsIEFSUkFZX1NJWkUoZGF0YV9wdHJzKSwgJnRyYW5zX2lkLCAmZW5kcCk7CisJaWYgKGZvdW5kICE9IDApCisJCXJldHVybiBjcmVhdGVfcmVzcG9uc2UoNTAwLCAiQ1JDWCIsIHRyYW5zX2lkKTsKKworCWlmIChlbmRwLT5jaSAhPSBDSV9VTlVTRUQpIHsKKwkJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIkVuZHBvaW50IGlzIGFscmVhZHkgdXNlZC4gMHgleFxuIiwgRU5EUE9JTlRfTlVNQkVSKGVuZHApKTsKKwkJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZSg1MDAsICJDUkNYIiwgdHJhbnNfaWQpOworCX0KKworCS8qIHBhcnNlIENhbGxJRCBDOiBhbmQgTG9jYWxQYXJhbWV0ZXJzIEw6ICovCisJTVNHX1RPS0VOSVpFX1NUQVJUCisJc3dpdGNoIChtc2ctPmwzaFtsaW5lX3N0YXJ0XSkgeworCWNhc2UgJ0wnOgorCQllbmRwLT5sb2NhbF9vcHRpb25zID0gdGFsbG9jX3N0cmR1cChjZmctPmVuZHBvaW50cywKKwkJCShjb25zdCBjaGFyICopJm1zZy0+bDNoW2xpbmVfc3RhcnQgKyAzXSk7CisJCWJyZWFrOworCWNhc2UgJ0MnOgorCQllbmRwLT5jYWxsaWQgPSB0YWxsb2Nfc3RyZHVwKGNmZy0+ZW5kcG9pbnRzLAorCQkJKGNvbnN0IGNoYXIgKikmbXNnLT5sM2hbbGluZV9zdGFydCArIDNdKTsKKwkJYnJlYWs7CisJY2FzZSAnTSc6CisJCWlmIChwYXJzZV9jb25uX21vZGUoKGNvbnN0IGNoYXIgKikmbXNnLT5sM2hbbGluZV9zdGFydCArIDNdLAorCQkJICAgICZlbmRwLT5jb25uX21vZGUpICE9IDApIHsKKwkJICAgIGVycm9yX2NvZGUgPSA1MTc7CisJCSAgICBnb3RvIGVycm9yMjsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERNR0NQLCBMT0dMX05PVElDRSwgIlVuaGFuZGxlZCBvcHRpb246ICclYycvJWQgb24gMHgleFxuIiwKKwkJCW1zZy0+bDNoW2xpbmVfc3RhcnRdLCBtc2ctPmwzaFtsaW5lX3N0YXJ0XSwKKwkJCUVORFBPSU5UX05VTUJFUihlbmRwKSk7CisJCWJyZWFrOworCX0KKwlNU0dfVE9LRU5JWkVfRU5ECisKKwkvKiBpbml0aWFsaXplICovCisJZW5kcC0+bmV0X3J0cCA9IGVuZHAtPm5ldF9ydGNwID0gZW5kcC0+YnRzX3J0cCA9IGVuZHAtPmJ0c19ydGNwID0gMDsKKworCS8qIHNldCB0byB6ZXJvIHVudGlsIHdlIGdldCB0aGUgaW5mbyAqLworCW1lbXNldCgmZW5kcC0+cmVtb3RlLCAwLCBzaXplb2YoZW5kcC0+cmVtb3RlKSk7CisKKwkvKiBiaW5kIHRvIHRoZSBwb3J0IG5vdyAqLworCXBvcnQgPSBydHBfY2FsY3VsYXRlX3BvcnQoRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBjZmctPnJ0cF9iYXNlX3BvcnQpOworCWlmIChjZmctPmVhcmx5X2JpbmQpCisJCWVuZHAtPnJ0cF9wb3J0ID0gcG9ydDsKKwllbHNlIGlmIChtZ2NwX2JpbmRfcnRwX3BvcnQoZW5kcCwgcG9ydCkgIT0gMCkKKwkJZ290byBlcnJvcjI7CisKKwkvKiBhc3NpZ24gYSBsb2NhbCBjYWxsIGlkZW50aWZpZXIgb3IgZmFpbCAqLworCWVuZHAtPmNpID0gZ2VuZXJhdGVfY2FsbF9pZChjZmcpOworCWlmIChlbmRwLT5jaSA9PSBDSV9VTlVTRUQpCisJCWdvdG8gZXJyb3IyOworCisJZW5kcC0+YnRzX3BheWxvYWRfdHlwZSA9IGNmZy0+YXVkaW9fcGF5bG9hZDsKKworCS8qIHBvbGljeSBDQiAqLworCWlmIChjZmctPnBvbGljeV9jYikgeworCQlzd2l0Y2ggKGNmZy0+cG9saWN5X2NiKGNmZywgRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBNR0NQX0VORFBfQ1JDWCwgdHJhbnNfaWQpKSB7CisJCWNhc2UgTUdDUF9QT0xJQ1lfUkVKRUNUOgorCQkJTE9HUChETUdDUCwgTE9HTF9OT1RJQ0UsICJDUkNYIHJlamVjdGVkIGJ5IHBvbGljeSBvbiAweCV4XG4iLAorCQkJICAgICBFTkRQT0lOVF9OVU1CRVIoZW5kcCkpOworCQkJbWdjcF9mcmVlX2VuZHAoZW5kcCk7CisJCQlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlKDUwMCwgIkNSQ1giLCB0cmFuc19pZCk7CisJCQlicmVhazsKKwkJY2FzZSBNR0NQX1BPTElDWV9ERUZFUjoKKwkJCS8qIHN0b3AgcHJvY2Vzc2luZyAqLworCQkJcmV0dXJuIE5VTEw7CisJCQlicmVhazsKKwkJY2FzZSBNR0NQX1BPTElDWV9DT05UOgorCQkJLyoganVzdCBjb250aW51ZSAqLworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlMT0dQKERNR0NQLCBMT0dMX05PVElDRSwgIkNyZWF0aW5nIGVuZHBvaW50IG9uOiAweCV4IENJOiAldSBwb3J0OiAldVxuIiwKKwkJRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBlbmRwLT5jaSwgZW5kcC0+cnRwX3BvcnQpOworCWlmIChjZmctPmNoYW5nZV9jYikKKwkJY2ZnLT5jaGFuZ2VfY2IoY2ZnLCBFTkRQT0lOVF9OVU1CRVIoZW5kcCksIE1HQ1BfRU5EUF9DUkNYLCBlbmRwLT5ydHBfcG9ydCk7CisKKwlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlX3dpdGhfc2RwKGVuZHAsICJDUkNYIiwgdHJhbnNfaWQpOworZXJyb3I6CisJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIk1hbGZvcm1lZCBsaW5lOiAlcyBvbiAweCV4IHdpdGg6IGxpbmVfc3RhcnQ6ICVkICVkXG4iLAorCQkgICAgaGV4ZHVtcChtc2ctPmwzaCwgbXNnYl9sM2xlbihtc2cpKSwKKwkJICAgIEVORFBPSU5UX05VTUJFUihlbmRwKSwgbGluZV9zdGFydCwgaSk7CisJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZShlcnJvcl9jb2RlLCAiQ1JDWCIsIHRyYW5zX2lkKTsKKworZXJyb3IyOgorCUxPR1AoRE1HQ1AsIExPR0xfTk9USUNFLCAiUmVzb3VyY2UgZXJyb3Igb24gMHgleFxuIiwgRU5EUE9JTlRfTlVNQkVSKGVuZHApKTsKKwlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlKGVycm9yX2NvZGUsICJDUkNYIiwgdHJhbnNfaWQpOworfQorCitzdGF0aWMgc3RydWN0IG1zZ2IgKmhhbmRsZV9tb2RpZnlfY29uKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBtZ2NwX21zZ19wdHIgZGF0YV9wdHJzWzZdOworCWludCBmb3VuZCwgaSwgbGluZV9zdGFydDsKKwljb25zdCBjaGFyICp0cmFuc19pZDsKKwlzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqZW5kcDsKKwlpbnQgZXJyb3JfY29kZSA9IDUwMDsKKworCWZvdW5kID0gYW5hbHl6ZV9oZWFkZXIoY2ZnLCBtc2csIGRhdGFfcHRycywgQVJSQVlfU0laRShkYXRhX3B0cnMpLCAmdHJhbnNfaWQsICZlbmRwKTsKKwlpZiAoZm91bmQgIT0gMCkKKwkJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZShlcnJvcl9jb2RlLCAiTURDWCIsIHRyYW5zX2lkKTsKKworCWlmIChlbmRwLT5jaSA9PSBDSV9VTlVTRUQpIHsKKwkJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIkVuZHBvaW50IGlzIG5vdCBob2xkaW5nIGEgY29ubmVjdGlvbi4gMHgleFxuIiwgRU5EUE9JTlRfTlVNQkVSKGVuZHApKTsKKwkJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZShlcnJvcl9jb2RlLCAiTURDWCIsIHRyYW5zX2lkKTsKKwl9CisKKwlNU0dfVE9LRU5JWkVfU1RBUlQKKwlzd2l0Y2ggKG1zZy0+bDNoW2xpbmVfc3RhcnRdKSB7CisJY2FzZSAnQyc6IHsKKwkJaWYgKHZlcmlmeV9jYWxsX2lkKGVuZHAsIChjb25zdCBjaGFyICopJm1zZy0+bDNoW2xpbmVfc3RhcnQgKyAzXSkgIT0gMCkKKwkJCWdvdG8gZXJyb3IzOworCQlicmVhazsKKwl9CisJY2FzZSAnSSc6IHsKKwkJaWYgKHZlcmlmeV9jaShlbmRwLCAoY29uc3QgY2hhciAqKSZtc2ctPmwzaFtsaW5lX3N0YXJ0ICsgM10pICE9IDApCisJCQlnb3RvIGVycm9yMzsKKwkJYnJlYWs7CisJfQorCWNhc2UgJ0wnOgorCQkvKiBza2lwICovCisJCWJyZWFrOworCWNhc2UgJ00nOgorCQlpZiAocGFyc2VfY29ubl9tb2RlKChjb25zdCBjaGFyICopJm1zZy0+bDNoW2xpbmVfc3RhcnQgKyAzXSwKKwkJCSAgICAmZW5kcC0+Y29ubl9tb2RlKSAhPSAwKSB7CisJCSAgICBlcnJvcl9jb2RlID0gNTE3OworCQkgICAgZ290byBlcnJvcjM7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAnXDAnOgorCQkvKiBTRFAgZmlsZSBiZWdpbnMgKi8KKwkJYnJlYWs7CisJY2FzZSAnYSc6CisJY2FzZSAnbyc6CisJY2FzZSAncyc6CisJY2FzZSAndCc6CisJY2FzZSAndic6CisJCS8qIHNraXAgdGhlc2UgU0RQIGF0dHJpYnV0ZXMgKi8KKwkJYnJlYWs7CisJY2FzZSAnbSc6IHsKKwkJaW50IHBvcnQ7CisJCWludCBwYXlsb2FkOworCQljb25zdCBjaGFyICpwYXJhbSA9IChjb25zdCBjaGFyICopJm1zZy0+bDNoW2xpbmVfc3RhcnRdOworCisJCWlmIChzc2NhbmYocGFyYW0sICJtPWF1ZGlvICVkIFJUUC9BVlAgJWQiLCAmcG9ydCwgJnBheWxvYWQpID09IDIpIHsKKwkJCWVuZHAtPm5ldF9ydHAgPSBodG9ucyhwb3J0KTsKKwkJCWVuZHAtPm5ldF9ydGNwID0gaHRvbnMocG9ydCArIDEpOworCQkJZW5kcC0+bmV0X3BheWxvYWRfdHlwZSA9IHBheWxvYWQ7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgJ2MnOiB7CisJCWNoYXIgaXB2NFsxNl07CisJCWNvbnN0IGNoYXIgKnBhcmFtID0gKGNvbnN0IGNoYXIgKikmbXNnLT5sM2hbbGluZV9zdGFydF07CisKKwkJaWYgKHNzY2FuZihwYXJhbSwgImM9SU4gSVA0ICUxNXMiLCBpcHY0KSA9PSAxKSB7CisJCQlpbmV0X2F0b24oaXB2NCwgJmVuZHAtPnJlbW90ZSk7CisJCX0KKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCUxPR1AoRE1HQ1AsIExPR0xfTk9USUNFLCAiVW5oYW5kbGVkIG9wdGlvbjogJyVjJy8lZCBvbiAweCV4XG4iLAorCQkJbXNnLT5sM2hbbGluZV9zdGFydF0sIG1zZy0+bDNoW2xpbmVfc3RhcnRdLAorCQkJRU5EUE9JTlRfTlVNQkVSKGVuZHApKTsKKwkJYnJlYWs7CisJfQorCU1TR19UT0tFTklaRV9FTkQKKworCS8qIHBvbGljeSBDQiAqLworCWlmIChjZmctPnBvbGljeV9jYikgeworCQlzd2l0Y2ggKGNmZy0+cG9saWN5X2NiKGNmZywgRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBNR0NQX0VORFBfTURDWCwgdHJhbnNfaWQpKSB7CisJCWNhc2UgTUdDUF9QT0xJQ1lfUkVKRUNUOgorCQkJTE9HUChETUdDUCwgTE9HTF9OT1RJQ0UsICJNRENYIHJlamVjdGVkIGJ5IHBvbGljeSBvbiAweCV4XG4iLAorCQkJICAgICBFTkRQT0lOVF9OVU1CRVIoZW5kcCkpOworCQkJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZSg1MDAsICJNRENYIiwgdHJhbnNfaWQpOworCQkJYnJlYWs7CisJCWNhc2UgTUdDUF9QT0xJQ1lfREVGRVI6CisJCQkvKiBzdG9wIHByb2Nlc3NpbmcgKi8KKwkJCXJldHVybiBOVUxMOworCQkJYnJlYWs7CisJCWNhc2UgTUdDUF9QT0xJQ1lfQ09OVDoKKwkJCS8qIGp1c3QgY29udGludWUgKi8KKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogbW9kaWZ5ICovCisJTE9HUChETUdDUCwgTE9HTF9OT1RJQ0UsICJNb2RpZmllZCBlbmRwb2ludCBvbjogMHgleCBTZXJ2ZXI6ICVzOiV1XG4iLAorCQlFTkRQT0lOVF9OVU1CRVIoZW5kcCksIGluZXRfbnRvYShlbmRwLT5yZW1vdGUpLCBudG9ocyhlbmRwLT5uZXRfcnRwKSk7CisJaWYgKGNmZy0+Y2hhbmdlX2NiKQorCQljZmctPmNoYW5nZV9jYihjZmcsIEVORFBPSU5UX05VTUJFUihlbmRwKSwgTUdDUF9FTkRQX01EQ1gsIGVuZHAtPnJ0cF9wb3J0KTsKKwlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlX3dpdGhfc2RwKGVuZHAsICJNRENYIiwgdHJhbnNfaWQpOworCitlcnJvcjoKKwlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiTWFsZm9ybWVkIGxpbmU6ICVzIG9uIDB4JXggd2l0aDogbGluZV9zdGFydDogJWQgJWQgJWRcbiIsCisJCSAgICBoZXhkdW1wKG1zZy0+bDNoLCBtc2diX2wzbGVuKG1zZykpLAorCQkgICAgRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBsaW5lX3N0YXJ0LCBpLCBtc2ctPmwzaFtsaW5lX3N0YXJ0XSk7CisJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZShlcnJvcl9jb2RlLCAiTURDWCIsIHRyYW5zX2lkKTsKKworZXJyb3IzOgorCXJldHVybiBjcmVhdGVfcmVzcG9uc2UoZXJyb3JfY29kZSwgIk1EQ1giLCB0cmFuc19pZCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbXNnYiAqaGFuZGxlX2RlbGV0ZV9jb24oc3RydWN0IG1nY3BfY29uZmlnICpjZmcsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IG1nY3BfbXNnX3B0ciBkYXRhX3B0cnNbNl07CisJaW50IGZvdW5kLCBpLCBsaW5lX3N0YXJ0OworCWNvbnN0IGNoYXIgKnRyYW5zX2lkOworCXN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwOworCWludCBlcnJvcl9jb2RlID0gNTAwOworCisJZm91bmQgPSBhbmFseXplX2hlYWRlcihjZmcsIG1zZywgZGF0YV9wdHJzLCBBUlJBWV9TSVpFKGRhdGFfcHRycyksICZ0cmFuc19pZCwgJmVuZHApOworCWlmIChmb3VuZCAhPSAwKQorCQlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlKGVycm9yX2NvZGUsICJETENYIiwgdHJhbnNfaWQpOworCisJaWYgKGVuZHAtPmNpID09IENJX1VOVVNFRCkgeworCQlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiRW5kcG9pbnQgaXMgbm90IHVzZWQuIDB4JXhcbiIsIEVORFBPSU5UX05VTUJFUihlbmRwKSk7CisJCXJldHVybiBjcmVhdGVfcmVzcG9uc2UoZXJyb3JfY29kZSwgIkRMQ1giLCB0cmFuc19pZCk7CisJfQorCisJTVNHX1RPS0VOSVpFX1NUQVJUCisJc3dpdGNoIChtc2ctPmwzaFtsaW5lX3N0YXJ0XSkgeworCWNhc2UgJ0MnOiB7CisJCWlmICh2ZXJpZnlfY2FsbF9pZChlbmRwLCAoY29uc3QgY2hhciAqKSZtc2ctPmwzaFtsaW5lX3N0YXJ0ICsgM10pICE9IDApCisJCQlnb3RvIGVycm9yMzsKKwkJYnJlYWs7CisJfQorCWNhc2UgJ0knOiB7CisJCWlmICh2ZXJpZnlfY2koZW5kcCwgKGNvbnN0IGNoYXIgKikmbXNnLT5sM2hbbGluZV9zdGFydCArIDNdKSAhPSAwKQorCQkJZ290byBlcnJvcjM7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlMT0dQKERNR0NQLCBMT0dMX05PVElDRSwgIlVuaGFuZGxlZCBvcHRpb246ICclYycvJWQgb24gMHgleFxuIiwKKwkJCW1zZy0+bDNoW2xpbmVfc3RhcnRdLCBtc2ctPmwzaFtsaW5lX3N0YXJ0XSwKKwkJCUVORFBPSU5UX05VTUJFUihlbmRwKSk7CisJCWJyZWFrOworCX0KKwlNU0dfVE9LRU5JWkVfRU5ECisKKwkvKiBwb2xpY3kgQ0IgKi8KKwlpZiAoY2ZnLT5wb2xpY3lfY2IpIHsKKwkJc3dpdGNoIChjZmctPnBvbGljeV9jYihjZmcsIEVORFBPSU5UX05VTUJFUihlbmRwKSwgTUdDUF9FTkRQX0RMQ1gsIHRyYW5zX2lkKSkgeworCQljYXNlIE1HQ1BfUE9MSUNZX1JFSkVDVDoKKwkJCUxPR1AoRE1HQ1AsIExPR0xfTk9USUNFLCAiRExDWCByZWplY3RlZCBieSBwb2xpY3kgb24gMHgleFxuIiwKKwkJCSAgICAgRU5EUE9JTlRfTlVNQkVSKGVuZHApKTsKKwkJCXJldHVybiBjcmVhdGVfcmVzcG9uc2UoNTAwLCAiRExDWCIsIHRyYW5zX2lkKTsKKwkJCWJyZWFrOworCQljYXNlIE1HQ1BfUE9MSUNZX0RFRkVSOgorCQkJLyogc3RvcCBwcm9jZXNzaW5nICovCisJCQlyZXR1cm4gTlVMTDsKKwkJCWJyZWFrOworCQljYXNlIE1HQ1BfUE9MSUNZX0NPTlQ6CisJCQkvKiBqdXN0IGNvbnRpbnVlICovCisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIGZyZWUgdGhlIGNvbm5lY3Rpb24gKi8KKwltZ2NwX2ZyZWVfZW5kcChlbmRwKTsKKwlpZiAoY2ZnLT5jaGFuZ2VfY2IpCisJCWNmZy0+Y2hhbmdlX2NiKGNmZywgRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBNR0NQX0VORFBfRExDWCwgZW5kcC0+cnRwX3BvcnQpOworCisJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZSgyNTAsICJETENYIiwgdHJhbnNfaWQpOworCitlcnJvcjoKKwlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiTWFsZm9ybWVkIGxpbmU6ICVzIG9uIDB4JXggd2l0aDogbGluZV9zdGFydDogJWQgJWRcbiIsCisJCSAgICBoZXhkdW1wKG1zZy0+bDNoLCBtc2diX2wzbGVuKG1zZykpLAorCQkgICAgRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBsaW5lX3N0YXJ0LCBpKTsKKwlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlKGVycm9yX2NvZGUsICJETENYIiwgdHJhbnNfaWQpOworCitlcnJvcjM6CisJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZShlcnJvcl9jb2RlLCAiRExDWCIsIHRyYW5zX2lkKTsKK30KKworc3RydWN0IG1nY3BfY29uZmlnICptZ2NwX2NvbmZpZ19hbGxvYyh2b2lkKQoreworCXN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnOworCisJY2ZnID0gdGFsbG9jX3plcm8oTlVMTCwgc3RydWN0IG1nY3BfY29uZmlnKTsKKwlpZiAoIWNmZykgeworCQlMT0dQKERNR0NQLCBMT0dMX0ZBVEFMLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGNvbmZpZy5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwljZmctPnNvdXJjZV9wb3J0ID0gMjQyNzsKKwljZmctPnNvdXJjZV9hZGRyID0gdGFsbG9jX3N0cmR1cChjZmcsICIwLjAuMC4wIik7CisJY2ZnLT5hdWRpb19uYW1lID0gdGFsbG9jX3N0cmR1cChjZmcsICJHU00tRUZSLzgwMDAiKTsKKwljZmctPmF1ZGlvX3BheWxvYWQgPSA5NzsKKwljZmctPnJ0cF9iYXNlX3BvcnQgPSBSVFBfUE9SVF9ERUZBVUxUOworCisJcmV0dXJuIGNmZzsKK30KKworaW50IG1nY3BfZW5kcG9pbnRzX2FsbG9jYXRlKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnKQoreworCWludCBpOworCisJLyogSW5pdGlhbGl6ZSBhbGwgZW5kcG9pbnRzICovCisJY2ZnLT5lbmRwb2ludHMgPSBfdGFsbG9jX3plcm9fYXJyYXkoY2ZnLAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IG1nY3BfZW5kcG9pbnQpLAorCQkJCSAgICAgICBjZmctPm51bWJlcl9lbmRwb2ludHMsICJlbmRwb2ludHMiKTsKKwlpZiAoIWNmZy0+ZW5kcG9pbnRzKQorCQlyZXR1cm4gLTE7CisKKwlmb3IgKGkgPSAwOyBpIDwgY2ZnLT5udW1iZXJfZW5kcG9pbnRzOyArK2kpIHsKKwkJY2ZnLT5lbmRwb2ludHNbaV0ubG9jYWxfcnRwLmZkID0gLTE7CisJCWNmZy0+ZW5kcG9pbnRzW2ldLmxvY2FsX3J0Y3AuZmQgPSAtMTsKKwkJY2ZnLT5lbmRwb2ludHNbaV0uY2kgPSBDSV9VTlVTRUQ7CisJCWNmZy0+ZW5kcG9pbnRzW2ldLmNmZyA9IGNmZzsKKwkJY2ZnLT5lbmRwb2ludHNbaV0ubmV0X3BheWxvYWRfdHlwZSA9IC0xOworCQljZmctPmVuZHBvaW50c1tpXS5idHNfcGF5bG9hZF90eXBlID0gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbWdjcF9mcmVlX2VuZHAoc3RydWN0IG1nY3BfZW5kcG9pbnQgKmVuZHApCit7CisJTE9HUChETUdDUCwgTE9HTF9OT1RJQ0UsICJEZWxldGluZyBlbmRwb2ludCBvbjogMHgleFxuIiwgRU5EUE9JTlRfTlVNQkVSKGVuZHApKTsKKwllbmRwLT5jaT0gQ0lfVU5VU0VEOworCisJaWYgKGVuZHAtPmNhbGxpZCkgeworCQl0YWxsb2NfZnJlZShlbmRwLT5jYWxsaWQpOworCQllbmRwLT5jYWxsaWQgPSBOVUxMOworCX0KKworCWlmIChlbmRwLT5sb2NhbF9vcHRpb25zKSB7CisJCXRhbGxvY19mcmVlKGVuZHAtPmxvY2FsX29wdGlvbnMpOworCQllbmRwLT5jYWxsaWQgPSBOVUxMOworCX0KKworCWlmICghZW5kcC0+Y2ZnLT5lYXJseV9iaW5kKSB7CisJCWJzY191bnJlZ2lzdGVyX2ZkKCZlbmRwLT5sb2NhbF9ydHApOworCQlic2NfdW5yZWdpc3Rlcl9mZCgmZW5kcC0+bG9jYWxfcnRjcCk7CisJfQorCisJZW5kcC0+bmV0X3J0cCA9IGVuZHAtPm5ldF9ydGNwID0gZW5kcC0+YnRzX3J0cCA9IGVuZHAtPmJ0c19ydGNwID0gMDsKKwllbmRwLT5uZXRfcGF5bG9hZF90eXBlID0gZW5kcC0+YnRzX3BheWxvYWRfdHlwZSA9IC0xOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvbWdjcC9tZ2NwX3Z0eS5jIGIvb3BlbmJzYy9zcmMvbWdjcC9tZ2NwX3Z0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxM2IzY2YKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9tZ2NwL21nY3BfdnR5LmMKQEAgLTAsMCArMSwzMzkgQEAKKy8qIEEgTWVkaWEgR2F0ZXdheSBDb250cm9sIFByb3RvY29sIE1lZGlhIEdhdGV3YXk6IFJGQyAzNDM1ICovCisvKiBUaGUgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gKi8KKworLyoKKyAqIChDKSAyMDA5LTIwMTAgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogKEMpIDIwMDktMjAxMCBieSBPbi1XYXZlcworICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvbWdjcC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvbWdjcF9pbnRlcm5hbC5oPgorCisjaW5jbHVkZSA8dnR5L2NvbW1hbmQuaD4KKyNpbmNsdWRlIDx2dHkvdnR5Lmg+CisKK3N0YXRpYyBzdHJ1Y3QgbWdjcF9jb25maWcgKmdfY2ZnID0gTlVMTDsKKworLyoKKyAqIHZ0eSBjb2RlIGZvciBtZ2NwIGJlbG93CisgKi8KK3N0cnVjdCBjbWRfbm9kZSBtZ2NwX25vZGUgPSB7CisJTUdDUF9OT0RFLAorCSIlcyhtZ2NwKSMiLAorCTEsCit9OworCitzdGF0aWMgaW50IGNvbmZpZ193cml0ZV9tZ2NwKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwl2dHlfb3V0KHZ0eSwgIm1nY3AlcyIsIFZUWV9ORVdMSU5FKTsKKwlpZiAoZ19jZmctPmxvY2FsX2lwKQorCQl2dHlfb3V0KHZ0eSwgIiBsb2NhbCBpcCAlcyVzIiwgZ19jZmctPmxvY2FsX2lwLCBWVFlfTkVXTElORSk7CisJaWYgKGdfY2ZnLT5idHNfaXApCisJCXZ0eV9vdXQodnR5LCAiICBidHMgaXAgJXMlcyIsIGdfY2ZnLT5idHNfaXAsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgYmluZCBpcCAlcyVzIiwgZ19jZmctPnNvdXJjZV9hZGRyLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIGJpbmQgcG9ydCAldSVzIiwgZ19jZmctPnNvdXJjZV9wb3J0LCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIGJpbmQgZWFybHkgJXUlcyIsICEhZ19jZmctPmVhcmx5X2JpbmQsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgcnRwIGJhc2UgJXUlcyIsIGdfY2ZnLT5ydHBfYmFzZV9wb3J0LCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIHNkcCBhdWRpbyBwYXlsb2FkIG51bWJlciAldSVzIiwgZ19jZmctPmF1ZGlvX3BheWxvYWQsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgc2RwIGF1ZGlvIHBheWxvYWQgbmFtZSAlcyVzIiwgZ19jZmctPmF1ZGlvX25hbWUsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgbG9vcCAldSVzIiwgISFnX2NmZy0+YXVkaW9fbG9vcCwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBlbmRwb2ludHMgJXUlcyIsIGdfY2ZnLT5udW1iZXJfZW5kcG9pbnRzLCBWVFlfTkVXTElORSk7CisJaWYgKGdfY2ZnLT5mb3J3YXJkX2lwKQorCQl2dHlfb3V0KHZ0eSwgIiBmb3J3YXJkIGF1ZGlvIGlwICVzJXMiLCBnX2NmZy0+Zm9yd2FyZF9pcCwgVlRZX05FV0xJTkUpOworCWlmIChnX2NmZy0+Zm9yd2FyZF9wb3J0ICE9IDApCisJCXZ0eV9vdXQodnR5LCAiIGZvcndhcmQgYXVkaW8gcG9ydCAlZCVzIiwgZ19jZmctPmZvcndhcmRfcG9ydCwgVlRZX05FV0xJTkUpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihzaG93X21jZ3AsIHNob3dfbWdjcF9jbWQsICJzaG93IG1nY3AiLAorICAgICAgU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIE1HQ1AgTWVkaWEgR2F0ZXdheSIpCit7CisJaW50IGk7CisKKwl2dHlfb3V0KHZ0eSwgIk1HQ1AgaXMgdXAgYW5kIHJ1bm5pbmcgd2l0aCAldSBlbmRwb2ludHM6JXMiLCBnX2NmZy0+bnVtYmVyX2VuZHBvaW50cyAtIDEsIFZUWV9ORVdMSU5FKTsKKwlmb3IgKGkgPSAxOyBpIDwgZ19jZmctPm51bWJlcl9lbmRwb2ludHM7ICsraSkgeworCQlzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqZW5kcCA9ICZnX2NmZy0+ZW5kcG9pbnRzW2ldOworCQl2dHlfb3V0KHZ0eSwgIiBFbmRwb2ludCAweCUuMng6IENJOiAlZCBuZXQ6ICV1LyV1IGJ0czogJXUvJXUlcyIsCisJCQlpLCBlbmRwLT5jaSwKKwkJCW50b2hzKGVuZHAtPm5ldF9ydHApLCBudG9ocyhlbmRwLT5uZXRfcnRjcCksCisJCQludG9ocyhlbmRwLT5idHNfcnRwKSwgbnRvaHMoZW5kcC0+YnRzX3J0Y3ApLCBWVFlfTkVXTElORSk7CisJfQorCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbWdjcCwKKyAgICAgIGNmZ19tZ2NwX2NtZCwKKyAgICAgICJtZ2NwIiwKKyAgICAgICJDb25maWd1cmUgdGhlIE1HQ1AiKQoreworCXZ0eS0+bm9kZSA9IE1HQ1BfTk9ERTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19tZ2NwX2xvY2FsX2lwLAorICAgICAgY2ZnX21nY3BfbG9jYWxfaXBfY21kLAorICAgICAgImxvY2FsIGlwIElQIiwKKyAgICAgICJTZXQgdGhlIElQIHRvIGJlIHVzZWQgaW4gU0RQIHJlY29yZHMiKQoreworCWlmIChnX2NmZy0+bG9jYWxfaXApCisJCXRhbGxvY19mcmVlKGdfY2ZnLT5sb2NhbF9pcCk7CisJZ19jZmctPmxvY2FsX2lwID0gdGFsbG9jX3N0cmR1cChnX2NmZywgYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbWdjcF9idHNfaXAsCisgICAgICBjZmdfbWdjcF9idHNfaXBfY21kLAorICAgICAgImJ0cyBpcCBJUCIsCisgICAgICAiU2V0IHRoZSBJUCBvZiB0aGUgQlRTIGZvciBSVFAgZm9yd2FyZGluZyIpCit7CisJaWYgKGdfY2ZnLT5idHNfaXApCisJCXRhbGxvY19mcmVlKGdfY2ZnLT5idHNfaXApOworCWdfY2ZnLT5idHNfaXAgPSB0YWxsb2Nfc3RyZHVwKGdfY2ZnLCBhcmd2WzBdKTsKKwlpbmV0X2F0b24oZ19jZmctPmJ0c19pcCwgJmdfY2ZnLT5idHNfaW4pOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX21nY3BfYmluZF9pcCwKKyAgICAgIGNmZ19tZ2NwX2JpbmRfaXBfY21kLAorICAgICAgImJpbmQgaXAgSVAiLAorICAgICAgIkJpbmQgdGhlIE1HQ1AgdG8gdGhpcyBsb2NhbCBhZGRyIikKK3sKKwlpZiAoZ19jZmctPnNvdXJjZV9hZGRyKQorCQl0YWxsb2NfZnJlZShnX2NmZy0+c291cmNlX2FkZHIpOworCWdfY2ZnLT5zb3VyY2VfYWRkciA9IHRhbGxvY19zdHJkdXAoZ19jZmcsIGFyZ3ZbMF0pOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX21nY3BfYmluZF9wb3J0LAorICAgICAgY2ZnX21nY3BfYmluZF9wb3J0X2NtZCwKKyAgICAgICJiaW5kIHBvcnQgPDAtNjU1MzQ+IiwKKyAgICAgICJCaW5kIHRoZSBNR0NQIHRvIHRoaXMgcG9ydCIpCit7CisJdW5zaWduZWQgaW50IHBvcnQgPSBhdG9pKGFyZ3ZbMF0pOworCWlmIChwb3J0ID4gNjU1MzQpIHsKKwkJdnR5X291dCh2dHksICIlJSB3cm9uZyBiaW5kIHBvcnQgJyVzJyVzIiwgYXJndlswXSwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJZ19jZmctPnNvdXJjZV9wb3J0ID0gcG9ydDsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19tZ2NwX2JpbmRfZWFybHksCisgICAgICBjZmdfbWdjcF9iaW5kX2Vhcmx5X2NtZCwKKyAgICAgICJiaW5kIGVhcmx5ICgwfDEpIiwKKyAgICAgICJCaW5kIGFsbCBSVFAgcG9ydHMgZWFybHkiKQoreworCXVuc2lnbmVkIGludCBiaW5kID0gYXRvaShhcmd2WzBdKTsKKwlpZiAoYmluZCAhPSAwICYmIGJpbmQgIT0gMSkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIHBhcmFtIG11c3QgYmUgMCBvciAxLiVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJZ19jZmctPmVhcmx5X2JpbmQgPSBiaW5kID09IDE7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbWdjcF9ydHBfYmFzZV9wb3J0LAorICAgICAgY2ZnX21nY3BfcnRwX2Jhc2VfcG9ydF9jbWQsCisgICAgICAicnRwIGJhc2UgPDAtNjU1MzQ+IiwKKyAgICAgICJCYXNlIHBvcnQgdG8gdXNlIikKK3sKKwl1bnNpZ25lZCBpbnQgcG9ydCA9IGF0b2koYXJndlswXSk7CisJaWYgKHBvcnQgPiA2NTUzNCkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIHdyb25nIGJhc2UgcG9ydCAnJXMnJXMiLCBhcmd2WzBdLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlnX2NmZy0+cnRwX2Jhc2VfcG9ydCA9IHBvcnQ7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbWdjcF9zZHBfcGF5bG9hZF9udW1iZXIsCisgICAgICBjZmdfbWdjcF9zZHBfcGF5bG9hZF9udW1iZXJfY21kLAorICAgICAgInNkcCBhdWRpbyBwYXlsb2FkIG51bWJlciA8MS0yNTU+IiwKKyAgICAgICJTZXQgdGhlIGF1ZGlvIGNvZGVjIHRvIHVzZSIpCit7CisJdW5zaWduZWQgaW50IHBheWxvYWQgPSBhdG9pKGFyZ3ZbMF0pOworCWlmIChwYXlsb2FkID4gMjU1KSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgd3JvbmcgcGF5bG9hZCBudW1iZXIgJyVzJyVzIiwgYXJndlswXSwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJZ19jZmctPmF1ZGlvX3BheWxvYWQgPSBwYXlsb2FkOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX21nY3Bfc2RwX3BheWxvYWRfbmFtZSwKKyAgICAgIGNmZ19tZ2NwX3NkcF9wYXlsb2FkX25hbWVfY21kLAorICAgICAgInNkcCBhdWRpbyBwYXlsb2FkIG5hbWUgTkFNRSIsCisgICAgICAiU2V0IHRoZSBhdWRpbyBuYW1lIHRvIHVzZSIpCit7CisJaWYgKGdfY2ZnLT5hdWRpb19uYW1lKQorCQl0YWxsb2NfZnJlZShnX2NmZy0+YXVkaW9fbmFtZSk7CisJZ19jZmctPmF1ZGlvX25hbWUgPSB0YWxsb2Nfc3RyZHVwKGdfY2ZnLCBhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19tZ2NwX2xvb3AsCisgICAgICBjZmdfbWdjcF9sb29wX2NtZCwKKyAgICAgICJsb29wICgwfDEpIiwKKyAgICAgICJMb29wIHRoZSBhdWRpbyIpCit7CisJZ19jZmctPmF1ZGlvX2xvb3AgPSBhdG9pKGFyZ3ZbMF0pOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX21nY3BfbnVtYmVyX2VuZHAsCisgICAgICBjZmdfbWdjcF9udW1iZXJfZW5kcF9jbWQsCisgICAgICAibnVtYmVyIGVuZHBvaW50cyA8MC02NTUzND4iLAorICAgICAgIlRoZSBudW1iZXIgb2YgZW5kcG9pbnRzIHRvIGFsbG9jYXRlLiBUaGlzIGlzIG5vdCBkeW5hbWljLiIpCit7CisJLyogKyAxIGFzIHdlIHN0YXJ0IGNvdW50aW5nIGF0IG9uZSAqLworCWdfY2ZnLT5udW1iZXJfZW5kcG9pbnRzID0gYXRvaShhcmd2WzBdKSArIDE7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbWdjcF9mb3J3YXJkX2lwLAorICAgICAgY2ZnX21nY3BfZm9yd2FyZF9pcF9jbWQsCisgICAgICAiZm9yd2FyZCBhdWRpbyBpcCBJUCIsCisgICAgICAiRm9yd2FyZCBwYWNrZXRzIGZyb20gYW5kIHRvIHRoZSBJUC4gVGhpcyBkaXNhYmxlcyBtb3N0IG9mIHRoZSBNR0NQIGZlYXR1cmUuIikKK3sKKwlpZiAoZ19jZmctPmZvcndhcmRfaXApCisJCXRhbGxvY19mcmVlKGdfY2ZnLT5mb3J3YXJkX2lwKTsKKwlnX2NmZy0+Zm9yd2FyZF9pcCA9IHRhbGxvY19zdHJkdXAoZ19jZmcsIGFyZ3ZbMF0pOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX21nY3BfZm9yd2FyZF9wb3J0LAorICAgICAgY2ZnX21nY3BfZm9yd2FyZF9wb3J0X2NtZCwKKyAgICAgICJmb3J3YXJkIGF1ZGlvIHBvcnQgPDEtMTUwMDA+IiwKKyAgICAgICJGb3J3YXJkIHBhY2tldHMgZnJvbSBhbmQgdG8gdGhlIHBvcnQuIFRoaXMgZGlzYWJsZXMgbW9zdCBvZiB0aGUgTUdDUCBmZWF0dXJlLiIpCit7CisJZ19jZmctPmZvcndhcmRfcG9ydCA9IGF0b2koYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitpbnQgbWdjcF92dHlfaW5pdCh2b2lkKQoreworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzaG93X21nY3BfY21kKTsKKworCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJmNmZ19tZ2NwX2NtZCk7CisJaW5zdGFsbF9ub2RlKCZtZ2NwX25vZGUsIGNvbmZpZ193cml0ZV9tZ2NwKTsKKwlpbnN0YWxsX2RlZmF1bHQoTUdDUF9OT0RFKTsKKwlpbnN0YWxsX2VsZW1lbnQoTUdDUF9OT0RFLCAmY2ZnX21nY3BfbG9jYWxfaXBfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoTUdDUF9OT0RFLCAmY2ZnX21nY3BfYnRzX2lwX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KE1HQ1BfTk9ERSwgJmNmZ19tZ2NwX2JpbmRfaXBfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoTUdDUF9OT0RFLCAmY2ZnX21nY3BfYmluZF9wb3J0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KE1HQ1BfTk9ERSwgJmNmZ19tZ2NwX2JpbmRfZWFybHlfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoTUdDUF9OT0RFLCAmY2ZnX21nY3BfcnRwX2Jhc2VfcG9ydF9jbWQpOworCWluc3RhbGxfZWxlbWVudChNR0NQX05PREUsICZjZmdfbWdjcF9zZHBfcGF5bG9hZF9udW1iZXJfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoTUdDUF9OT0RFLCAmY2ZnX21nY3Bfc2RwX3BheWxvYWRfbmFtZV9jbWQpOworCWluc3RhbGxfZWxlbWVudChNR0NQX05PREUsICZjZmdfbWdjcF9sb29wX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KE1HQ1BfTk9ERSwgJmNmZ19tZ2NwX251bWJlcl9lbmRwX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KE1HQ1BfTk9ERSwgJmNmZ19tZ2NwX2ZvcndhcmRfaXBfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoTUdDUF9OT0RFLCAmY2ZnX21nY3BfZm9yd2FyZF9wb3J0X2NtZCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBtZ2NwX3BhcnNlX2NvbmZpZyhjb25zdCBjaGFyICpjb25maWdfZmlsZSwgc3RydWN0IG1nY3BfY29uZmlnICpjZmcpCit7CisJaW50IGksIHJjOworCisJZ19jZmcgPSBjZmc7CisJcmMgPSB2dHlfcmVhZF9jb25maWdfZmlsZShjb25maWdfZmlsZSk7CisJaWYgKHJjIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBwYXJzZSB0aGUgY29uZmlnIGZpbGU6ICclcydcbiIsIGNvbmZpZ19maWxlKTsKKwkJcmV0dXJuIHJjOworCX0KKworCisJaWYgKCFnX2NmZy0+YnRzX2lwKQorCQlmcHJpbnRmKHN0ZGVyciwgIk5vIEJUUyBpcCBhZGRyZXNzIHNwZWNpZmllZC4gVGhpcyB3aWxsIGFsbG93IGV2ZXJ5b25lIHRvIGNvbm5lY3QuXG4iKTsKKworCWlmIChtZ2NwX2VuZHBvaW50c19hbGxvY2F0ZShnX2NmZykgIT0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBhbGxvY2F0ZSBlbmRwb2ludHM6ICVkLiBRdWl0dGluZy5cbiIsIGdfY2ZnLT5udW1iZXJfZW5kcG9pbnRzKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qCisJICogVGhpcyBhcHBsaWNhdGlvbiBzdXBwb3J0cyB0d28gbW9kZXMuCisgICAgICAgICAqICAgIDEuKSBhIHRydWUgTUdDUCBnYXRld2F5IHdpdGggc3VwcG9ydCBmb3IgQVVFUCwgQ1JDWCwgTURDWCwgRExDWAorICAgICAgICAgKiAgICAyLikgcGxhaW4gZm9yd2FyZGluZyBvZiBSVFAgcGFja2V0cyBvbiB0aGUgZW5kcG9pbnRzLgorCSAqIGJvdGggbW9kZXMgYXJlIG11dHVhbCBleGNsdXNpdmUKKwkgKi8KKwlpZiAoZ19jZmctPmZvcndhcmRfaXApIHsKKwkJaW50IHBvcnQgPSBnX2NmZy0+cnRwX2Jhc2VfcG9ydDsKKwkJaWYgKGdfY2ZnLT5mb3J3YXJkX3BvcnQgIT0gMCkKKwkJCXBvcnQgPSBnX2NmZy0+Zm9yd2FyZF9wb3J0OworCisJCWlmICghZ19jZmctPmVhcmx5X2JpbmQpIHsKKwkJCUxPR1AoRE1HQ1AsIExPR0xfTk9USUNFLCAiRm9yd2FyZGluZyByZXF1aXJlcyBlYXJseSBiaW5kLlxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQkvKgorCQkgKiBTdG9yZSB0aGUgZm9yd2FyZCBJUCBhbmQgYXNzaWduIGEgY2kuIEZvciBlYXJseSBiaW5kCisJCSAqIHRoZSBzb2NrZXRzIHdpbGwgYmUgY3JlYXRlZCBhZnRlciB0aGlzLgorCQkgKi8KKwkJZm9yIChpID0gMTsgaSA8IGdfY2ZnLT5udW1iZXJfZW5kcG9pbnRzOyArK2kpIHsKKwkJCXN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwID0gJmdfY2ZnLT5lbmRwb2ludHNbaV07CisJCQlpbmV0X2F0b24oZ19jZmctPmZvcndhcmRfaXAsICZlbmRwLT5yZW1vdGUpOworCQkJZW5kcC0+Y2kgPSBDSV9VTlVTRUQgKyAyMzsKKwkJCWVuZHAtPm5ldF9ydHAgPSBodG9ucyhydHBfY2FsY3VsYXRlX3BvcnQoRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBwb3J0KSk7CisJCQllbmRwLT5uZXRfcnRjcCA9IGh0b25zKHJ0cF9jYWxjdWxhdGVfcG9ydChFTkRQT0lOVF9OVU1CRVIoZW5kcCksIHBvcnQpICsgMSk7CisJCX0KKworCQlMT0dQKERNR0NQLCBMT0dMX05PVElDRSwgIkNvbmZpZ3VyZWQgZm9yIEF1ZGlvIEZvcndhcmRpbmcuXG4iKTsKKwl9CisKKwkvKiBlYXJseSBiaW5kICovCisJaWYgKGdfY2ZnLT5lYXJseV9iaW5kKSB7CisJCWZvciAoaSA9IDE7IGkgPCBnX2NmZy0+bnVtYmVyX2VuZHBvaW50czsgKytpKSB7CisJCQlzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqZW5kcCA9ICZnX2NmZy0+ZW5kcG9pbnRzW2ldOworCQkJaW50IHJ0cF9wb3J0OworCisJCQlydHBfcG9ydCA9IHJ0cF9jYWxjdWxhdGVfcG9ydChFTkRQT0lOVF9OVU1CRVIoZW5kcCksIGdfY2ZnLT5ydHBfYmFzZV9wb3J0KTsKKwkJCWlmIChtZ2NwX2JpbmRfcnRwX3BvcnQoZW5kcCwgcnRwX3BvcnQpICE9IDApIHsKKwkJCQlMT0dQKERNR0NQLCBMT0dMX0ZBVEFMLCAiRmFpbGVkIHRvIGJpbmQ6ICVkXG4iLCBydHBfcG9ydCk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuICEhZ19jZmctPmZvcndhcmRfaXA7Cit9CisKK3N0cnVjdCBnc21fbmV0d29yazsKK2ludCBic2NfdnR5X2luaXQoc3RydWN0IGdzbV9uZXR3b3JrICpkdW1teSkKK3sKKwljbWRfaW5pdCgxKTsKKwl2dHlfaW5pdCgpOworCisgICAgICAgIG1nY3BfdnR5X2luaXQoKTsKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvbW5jYy5jIGIvb3BlbmJzYy9zcmMvbW5jYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZDU5YWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9tbmNjLmMKQEAgLTAsMCArMSw0NjggQEAKKy8qIChDKSAyMDA4LTIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDA5IGJ5IEFuZHJlYXMgRXZlcnNiZXJnIDxBbmRyZWFzLkV2ZXJzYmVyZ0B2ZXJzYXRlbC5kZT4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8wOC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL21uY2MuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy90cmFuc2FjdGlvbi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvcnRwX3Byb3h5Lmg+CisKK3ZvaWQgKnRhbGxfY2FsbF9jdHg7CisKK3N0YXRpYyBzdHJ1Y3QgbW5jY19uYW1lcyB7CisJY2hhciAqbmFtZTsKKwlpbnQgdmFsdWU7Cit9IG1uY2NfbmFtZXNbXSA9IHsKKwl7Ik1OQ0NfU0VUVVBfUkVRIiwJMHgwMTAxfSwKKwl7Ik1OQ0NfU0VUVVBfSU5EIiwJMHgwMTAyfSwKKwl7Ik1OQ0NfU0VUVVBfUlNQIiwJMHgwMTAzfSwKKwl7Ik1OQ0NfU0VUVVBfQ05GIiwJMHgwMTA0fSwKKwl7Ik1OQ0NfU0VUVVBfQ09NUExfUkVRIiwweDAxMDV9LAorCXsiTU5DQ19TRVRVUF9DT01QTF9JTkQiLDB4MDEwNn0sCisJeyJNTkNDX0NBTExfQ09ORl9JTkQiLAkweDAxMDd9LAorCXsiTU5DQ19DQUxMX1BST0NfUkVRIiwJMHgwMTA4fSwKKwl7Ik1OQ0NfUFJPR1JFU1NfUkVRIiwJMHgwMTA5fSwKKwl7Ik1OQ0NfQUxFUlRfUkVRIiwJMHgwMTBhfSwKKwl7Ik1OQ0NfQUxFUlRfSU5EIiwJMHgwMTBifSwKKwl7Ik1OQ0NfTk9USUZZX1JFUSIsCTB4MDEwY30sCisJeyJNTkNDX05PVElGWV9JTkQiLAkweDAxMGR9LAorCXsiTU5DQ19ESVNDX1JFUSIsCTB4MDEwZX0sCisJeyJNTkNDX0RJU0NfSU5EIiwJMHgwMTBmfSwKKwl7Ik1OQ0NfUkVMX1JFUSIsCTB4MDExMH0sCisJeyJNTkNDX1JFTF9JTkQiLAkweDAxMTF9LAorCXsiTU5DQ19SRUxfQ05GIiwJMHgwMTEyfSwKKwl7Ik1OQ0NfRkFDSUxJVFlfUkVRIiwJMHgwMTEzfSwKKwl7Ik1OQ0NfRkFDSUxJVFlfSU5EIiwJMHgwMTE0fSwKKwl7Ik1OQ0NfU1RBUlRfRFRNRl9JTkQiLAkweDAxMTV9LAorCXsiTU5DQ19TVEFSVF9EVE1GX1JTUCIsCTB4MDExNn0sCisJeyJNTkNDX1NUQVJUX0RUTUZfUkVKIiwJMHgwMTE3fSwKKwl7Ik1OQ0NfU1RPUF9EVE1GX0lORCIsCTB4MDExOH0sCisJeyJNTkNDX1NUT1BfRFRNRl9SU1AiLAkweDAxMTl9LAorCXsiTU5DQ19NT0RJRllfUkVRIiwJMHgwMTFhfSwKKwl7Ik1OQ0NfTU9ESUZZX0lORCIsCTB4MDExYn0sCisJeyJNTkNDX01PRElGWV9SU1AiLAkweDAxMWN9LAorCXsiTU5DQ19NT0RJRllfQ05GIiwJMHgwMTFkfSwKKwl7Ik1OQ0NfTU9ESUZZX1JFSiIsCTB4MDExZX0sCisJeyJNTkNDX0hPTERfSU5EIiwJMHgwMTFmfSwKKwl7Ik1OQ0NfSE9MRF9DTkYiLAkweDAxMjB9LAorCXsiTU5DQ19IT0xEX1JFSiIsCTB4MDEyMX0sCisJeyJNTkNDX1JFVFJJRVZFX0lORCIsCTB4MDEyMn0sCisJeyJNTkNDX1JFVFJJRVZFX0NORiIsCTB4MDEyM30sCisJeyJNTkNDX1JFVFJJRVZFX1JFSiIsCTB4MDEyNH0sCisJeyJNTkNDX1VTRVJJTkZPX1JFUSIsCTB4MDEyNX0sCisJeyJNTkNDX1VTRVJJTkZPX0lORCIsCTB4MDEyNn0sCisJeyJNTkNDX1JFSl9SRVEiLAkweDAxMjd9LAorCXsiTU5DQ19SRUpfSU5EIiwJMHgwMTI4fSwKKworCXsiTU5DQ19CUklER0UiLAkJMHgwMjAwfSwKKwl7Ik1OQ0NfRlJBTUVfUkVDViIsCTB4MDIwMX0sCisJeyJNTkNDX0ZSQU1FX0RST1AiLAkweDAyMDJ9LAorCXsiTU5DQ19MQ0hBTl9NT0RJRlkiLAkweDAyMDN9LAorCisJeyJHU01fVENIX0ZSQU1FIiwJMHgwMzAwfSwKKworCXtOVUxMLCAwfSB9OworCitzdGF0aWMgTExJU1RfSEVBRChjYWxsX2xpc3QpOworCitzdGF0aWMgdV9pbnQzMl90IG5ld19jYWxscmVmID0gMHgwMDAwMDAwMTsKKworY2hhciAqZ2V0X21uY2NfbmFtZShpbnQgdmFsdWUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBtbmNjX25hbWVzW2ldLm5hbWU7IGkrKykgeworCQlpZiAobW5jY19uYW1lc1tpXS52YWx1ZSA9PSB2YWx1ZSkKKwkJCXJldHVybiBtbmNjX25hbWVzW2ldLm5hbWU7CisJfQorCisJcmV0dXJuICJNTkNDX1Vua25vd24iOworfQorCitzdGF0aWMgdm9pZCBmcmVlX2NhbGwoc3RydWN0IGdzbV9jYWxsICpjYWxsKQoreworCWxsaXN0X2RlbCgmY2FsbC0+ZW50cnkpOworCURFQlVHUChETU5DQywgIihjYWxsICV4KSBDYWxsIHJlbW92ZWQuXG4iLCBjYWxsLT5jYWxscmVmKTsKKwl0YWxsb2NfZnJlZShjYWxsKTsKK30KKworCitzdHJ1Y3QgZ3NtX2NhbGwgKmdldF9jYWxsX3JlZih1X2ludDMyX3QgY2FsbHJlZikKK3sKKwlzdHJ1Y3QgZ3NtX2NhbGwgKmNhbGx0OworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoY2FsbHQsICZjYWxsX2xpc3QsIGVudHJ5KSB7CisJCWlmIChjYWxsdC0+Y2FsbHJlZiA9PSBjYWxscmVmKQorCQkJcmV0dXJuIGNhbGx0OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBtbmNjX3NldF9jYXVzZShzdHJ1Y3QgZ3NtX21uY2MgKmRhdGEsIGludCBsb2MsIGludCB2YWwpCit7CisJZGF0YS0+ZmllbGRzIHw9IE1OQ0NfRl9DQVVTRTsKKwlkYXRhLT5jYXVzZS5sb2NhdGlvbiA9IGxvYzsKKwlkYXRhLT5jYXVzZS52YWx1ZSA9IHZhbDsKK30KKworLyogb24gaW5jb21pbmcgY2FsbCwgbG9vayB1cCBkYXRhYmFzZSBhbmQgc2VuZCBzZXR1cCB0byByZW1vdGUgc3Vic2NyLiAqLworc3RhdGljIGludCBtbmNjX3NldHVwX2luZChzdHJ1Y3QgZ3NtX2NhbGwgKmNhbGwsIGludCBtc2dfdHlwZSwKKwkJCSAgc3RydWN0IGdzbV9tbmNjICpzZXR1cCkKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgbW5jYzsKKwlzdHJ1Y3QgZ3NtX2NhbGwgKnJlbW90ZTsKKworCW1lbXNldCgmbW5jYywgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCW1uY2MuY2FsbHJlZiA9IGNhbGwtPmNhbGxyZWY7CisKKwkvKiBhbHJlYWR5IGhhdmUgcmVtb3RlIGNhbGwgKi8KKwlpZiAoY2FsbC0+cmVtb3RlX3JlZikKKwkJcmV0dXJuIDA7CisJCisJLyogdHJhbnNmZXIgbW9kZSAxIHdvdWxkIGJlIHBhY2tldCBtb2RlLCB3aGljaCB3YXMgbmV2ZXIgc3BlY2lmaWVkICovCisJaWYgKHNldHVwLT5iZWFyZXJfY2FwLm1vZGUgIT0gMCkgeworCQlMT0dQKERNTkNDLCBMT0dMX05PVElDRSwgIihjYWxsICV4KSBXZSBkb24ndCBzdXBwb3J0ICIKKwkJCSJwYWNrZXQgbW9kZVxuIiwgY2FsbC0+Y2FsbHJlZik7CisJCW1uY2Nfc2V0X2NhdXNlKCZtbmNjLCBHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUsCisJCQkJR1NNNDhfQ0NfQ0FVU0VfQkVBUkVSX0NBX1VOQVZBSUwpOworCQlnb3RvIG91dF9yZWplY3Q7CisJfQorCisJLyogd2UgY3VycmVudGx5IG9ubHkgZG8gc3BlZWNoICovCisJaWYgKHNldHVwLT5iZWFyZXJfY2FwLnRyYW5zZmVyICE9IEdTTV9NTkNDX0JDQVBfU1BFRUNIKSB7CisJCUxPR1AoRE1OQ0MsIExPR0xfTk9USUNFLCAiKGNhbGwgJXgpIFdlIG9ubHkgc3VwcG9ydCAiCisJCQkidm9pY2UgY2FsbHNcbiIsIGNhbGwtPmNhbGxyZWYpOworCQltbmNjX3NldF9jYXVzZSgmbW5jYywgR1NNNDhfQ0FVU0VfTE9DX1BSTl9TX0xVLAorCQkJCUdTTTQ4X0NDX0NBVVNFX0JFQVJFUl9DQV9VTkFWQUlMKTsKKwkJZ290byBvdXRfcmVqZWN0OworCX0KKworCS8qIGNyZWF0ZSByZW1vdGUgY2FsbCAqLworCWlmICghKHJlbW90ZSA9IHRhbGxvYyh0YWxsX2NhbGxfY3R4LCBzdHJ1Y3QgZ3NtX2NhbGwpKSkgeworCQltbmNjX3NldF9jYXVzZSgmbW5jYywgR1NNNDhfQ0FVU0VfTE9DX1BSTl9TX0xVLAorCQkJCUdTTTQ4X0NDX0NBVVNFX1JFU09VUkNFX1VOQVZBSUwpOworCQlnb3RvIG91dF9yZWplY3Q7CisJfQorCWxsaXN0X2FkZF90YWlsKCZyZW1vdGUtPmVudHJ5LCAmY2FsbF9saXN0KTsKKwlyZW1vdGUtPm5ldCA9IGNhbGwtPm5ldDsKKwlyZW1vdGUtPmNhbGxyZWYgPSBuZXdfY2FsbHJlZisrOworCURFQlVHUChETU5DQywgIihjYWxsICV4KSBDcmVhdGluZyBuZXcgcmVtb3RlIGluc3RhbmNlICV4LlxuIiwKKwkJY2FsbC0+Y2FsbHJlZiwgcmVtb3RlLT5jYWxscmVmKTsKKworCS8qIGxpbmsgcmVtb3RlIGNhbGwgKi8KKwljYWxsLT5yZW1vdGVfcmVmID0gcmVtb3RlLT5jYWxscmVmOworCXJlbW90ZS0+cmVtb3RlX3JlZiA9IGNhbGwtPmNhbGxyZWY7CisKKwkvKiBtb2RpZnkgbW9kZSAqLworCW1lbXNldCgmbW5jYywgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCW1uY2MuY2FsbHJlZiA9IGNhbGwtPmNhbGxyZWY7CisJbW5jYy5sY2hhbl9tb2RlID0gR1NNNDhfQ01PREVfU1BFRUNIX0VGUjsKKwlERUJVR1AoRE1OQ0MsICIoY2FsbCAleCkgTW9kaWZ5IGNoYW5uZWwgbW9kZS5cbiIsIGNhbGwtPmNhbGxyZWYpOworCW1uY2Nfc2VuZChjYWxsLT5uZXQsIE1OQ0NfTENIQU5fTU9ESUZZLCAmbW5jYyk7CisKKwkvKiBzZW5kIGNhbGwgcHJvY2VlZGluZyAqLworCW1lbXNldCgmbW5jYywgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCW1uY2MuY2FsbHJlZiA9IGNhbGwtPmNhbGxyZWY7CisJREVCVUdQKERNTkNDLCAiKGNhbGwgJXgpIEFjY2VwdGluZyBjYWxsLlxuIiwgY2FsbC0+Y2FsbHJlZik7CisJbW5jY19zZW5kKGNhbGwtPm5ldCwgTU5DQ19DQUxMX1BST0NfUkVRLCAmbW5jYyk7CisKKwkvKiBzZW5kIHNldHVwIHRvIHJlbW90ZSAqLworLy8Jc2V0dXAtPmZpZWxkcyB8PSBNTkNDX0ZfU0lHTkFMOworLy8Jc2V0dXAtPnNpZ25hbCA9IEdTTTQ4X1NJR05BTF9ESUFMVE9ORTsKKwlzZXR1cC0+Y2FsbHJlZiA9IHJlbW90ZS0+Y2FsbHJlZjsKKwlERUJVR1AoRE1OQ0MsICIoY2FsbCAleCkgRm9yd2FyZGluZyBTRVRVUCB0byByZW1vdGUuXG4iLCBjYWxsLT5jYWxscmVmKTsKKwlyZXR1cm4gbW5jY19zZW5kKHJlbW90ZS0+bmV0LCBNTkNDX1NFVFVQX1JFUSwgc2V0dXApOworCitvdXRfcmVqZWN0OgorCW1uY2Nfc2VuZChjYWxsLT5uZXQsIE1OQ0NfUkVKX1JFUSwgJm1uY2MpOworCWZyZWVfY2FsbChjYWxsKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtbmNjX2FsZXJ0X2luZChzdHJ1Y3QgZ3NtX2NhbGwgKmNhbGwsIGludCBtc2dfdHlwZSwKKwkJCSAgc3RydWN0IGdzbV9tbmNjICphbGVydCkKK3sKKwlzdHJ1Y3QgZ3NtX2NhbGwgKnJlbW90ZTsKKworCS8qIHNlbmQgYWxlcnRpbmcgdG8gcmVtb3RlICovCisJaWYgKCEocmVtb3RlID0gZ2V0X2NhbGxfcmVmKGNhbGwtPnJlbW90ZV9yZWYpKSkKKwkJcmV0dXJuIDA7CisJYWxlcnQtPmNhbGxyZWYgPSByZW1vdGUtPmNhbGxyZWY7CisJREVCVUdQKERNTkNDLCAiKGNhbGwgJXgpIEZvcndhcmRpbmcgQUxFUlQgdG8gcmVtb3RlLlxuIiwgY2FsbC0+Y2FsbHJlZik7CisJcmV0dXJuIG1uY2Nfc2VuZChyZW1vdGUtPm5ldCwgTU5DQ19BTEVSVF9SRVEsIGFsZXJ0KTsKK30KKworc3RhdGljIGludCBtbmNjX25vdGlmeV9pbmQoc3RydWN0IGdzbV9jYWxsICpjYWxsLCBpbnQgbXNnX3R5cGUsCisJCQkgICBzdHJ1Y3QgZ3NtX21uY2MgKm5vdGlmeSkKK3sKKwlzdHJ1Y3QgZ3NtX2NhbGwgKnJlbW90ZTsKKworCS8qIHNlbmQgbm90aWZ5IHRvIHJlbW90ZSAqLworCWlmICghKHJlbW90ZSA9IGdldF9jYWxsX3JlZihjYWxsLT5yZW1vdGVfcmVmKSkpCisJCXJldHVybiAwOworCW5vdGlmeS0+Y2FsbHJlZiA9IHJlbW90ZS0+Y2FsbHJlZjsKKwlERUJVR1AoRE1OQ0MsICIoY2FsbCAleCkgRm9yd2FyZGluZyBOT1RJRiB0byByZW1vdGUuXG4iLCBjYWxsLT5jYWxscmVmKTsKKwlyZXR1cm4gbW5jY19zZW5kKHJlbW90ZS0+bmV0LCBNTkNDX05PVElGWV9SRVEsIG5vdGlmeSk7Cit9CisKK3N0YXRpYyBpbnQgbW5jY19zZXR1cF9jbmYoc3RydWN0IGdzbV9jYWxsICpjYWxsLCBpbnQgbXNnX3R5cGUsCisJCQkgIHN0cnVjdCBnc21fbW5jYyAqY29ubmVjdCkKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgY29ubmVjdF9hY2ssIGZyYW1lX3JlY3Y7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBjYWxsLT5uZXQ7CisJc3RydWN0IGdzbV9jYWxsICpyZW1vdGU7CisJdV9pbnQzMl90IHJlZnNbMl07CisKKwkvKiBhY2tub3dsZWRnZSBjb25uZWN0ICovCisJbWVtc2V0KCZjb25uZWN0X2FjaywgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCWNvbm5lY3RfYWNrLmNhbGxyZWYgPSBjYWxsLT5jYWxscmVmOworCURFQlVHUChETU5DQywgIihjYWxsICV4KSBBY2tub3dsZWRnZSBTRVRVUC5cbiIsIGNhbGwtPmNhbGxyZWYpOworCW1uY2Nfc2VuZChjYWxsLT5uZXQsIE1OQ0NfU0VUVVBfQ09NUExfUkVRLCAmY29ubmVjdF9hY2spOworCisJLyogc2VuZCBjb25uZWN0IG1lc3NhZ2UgdG8gcmVtb3RlICovCisJaWYgKCEocmVtb3RlID0gZ2V0X2NhbGxfcmVmKGNhbGwtPnJlbW90ZV9yZWYpKSkKKwkJcmV0dXJuIDA7CisJY29ubmVjdC0+Y2FsbHJlZiA9IHJlbW90ZS0+Y2FsbHJlZjsKKwlERUJVR1AoRE1OQ0MsICIoY2FsbCAleCkgU2VuZGluZyBDT05ORUNUIHRvIHJlbW90ZS5cbiIsIGNhbGwtPmNhbGxyZWYpOworCW1uY2Nfc2VuZChyZW1vdGUtPm5ldCwgTU5DQ19TRVRVUF9SU1AsIGNvbm5lY3QpOworCisJLyogYnJpZGdlIHRjaCAqLworCXJlZnNbMF0gPSBjYWxsLT5jYWxscmVmOworCXJlZnNbMV0gPSBjYWxsLT5yZW1vdGVfcmVmOworCURFQlVHUChETU5DQywgIihjYWxsICV4KSBCcmlkZ2luZyB3aXRoIHJlbW90ZS5cbiIsIGNhbGwtPmNhbGxyZWYpOworCisJLyogaW4gZGlyZWN0IG1vZGUsIHdlIGFsd2F5cyBoYXZlIHRvIGJyaWRnZSB0aGUgY2hhbm5lbHMgKi8KKwlpZiAoaXBhY2NfcnRwX2RpcmVjdCkKKwkJcmV0dXJuIG1uY2Nfc2VuZChjYWxsLT5uZXQsIE1OQ0NfQlJJREdFLCByZWZzKTsKKworCS8qIHByb3h5IG1vZGUgKi8KKwlpZiAoIW5ldC0+aGFuZG92ZXIuYWN0aXZlKSB7CisJCS8qIGluIHRoZSBuby1oYW5kb3ZlciBjYXNlLCB3ZSBjYW4gYnJpZGdlLCBpLmUuIHVzZQorCQkgKiB0aGUgb2xkIFJUUCBwcm94eSBjb2RlICovCisJCXJldHVybiBtbmNjX3NlbmQoY2FsbC0+bmV0LCBNTkNDX0JSSURHRSwgcmVmcyk7CisJfSBlbHNlIHsKKwkJLyogaW4gY2FzZSBvZiBoYW5kb3Zlciwgd2UgbmVlZCB0byByZS13cml0ZSB0aGUgUlRQCisJCSAqIFNTUkMsIHNlcXVlbmNlIGFuZCB0aW1lc3RhbXAgdmFsdWVzIGFuZCB0aHVzCisJCSAqIG5lZWQgdG8gZW5hYmxlIFJUUCByZWNlaXZlIGZvciBib3RoIGRpcmVjdGlvbnMgKi8KKwkJbWVtc2V0KCZmcmFtZV9yZWN2LCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJCWZyYW1lX3JlY3YuY2FsbHJlZiA9IGNhbGwtPmNhbGxyZWY7CisJCW1uY2Nfc2VuZChjYWxsLT5uZXQsIE1OQ0NfRlJBTUVfUkVDViwgJmZyYW1lX3JlY3YpOworCQlmcmFtZV9yZWN2LmNhbGxyZWYgPSBjYWxsLT5yZW1vdGVfcmVmOworCQlyZXR1cm4gbW5jY19zZW5kKGNhbGwtPm5ldCwgTU5DQ19GUkFNRV9SRUNWLCAmZnJhbWVfcmVjdik7CisJfQorfQorCitzdGF0aWMgaW50IG1uY2NfZGlzY19pbmQoc3RydWN0IGdzbV9jYWxsICpjYWxsLCBpbnQgbXNnX3R5cGUsCisJCQkgc3RydWN0IGdzbV9tbmNjICpkaXNjKQoreworCXN0cnVjdCBnc21fY2FsbCAqcmVtb3RlOworCisJLyogc2VuZCByZWxlYXNlICovCisJREVCVUdQKERNTkNDLCAiKGNhbGwgJXgpIFJlbGVhc2luZyBjYWxsIHdpdGggY2F1c2UgJWRcbiIsCisJCWNhbGwtPmNhbGxyZWYsIGRpc2MtPmNhdXNlLnZhbHVlKTsKKwltbmNjX3NlbmQoY2FsbC0+bmV0LCBNTkNDX1JFTF9SRVEsIGRpc2MpOworCisJLyogc2VuZCBkaXNjIHRvIHJlbW90ZSAqLworCWlmICghKHJlbW90ZSA9IGdldF9jYWxsX3JlZihjYWxsLT5yZW1vdGVfcmVmKSkpIHsKKwkJcmV0dXJuIDA7CisJfQorCWRpc2MtPmNhbGxyZWYgPSByZW1vdGUtPmNhbGxyZWY7CisJREVCVUdQKERNTkNDLCAiKGNhbGwgJXgpIERpc2Nvbm5lY3RpbmcgcmVtb3RlIHdpdGggY2F1c2UgJWRcbiIsCisJCXJlbW90ZS0+Y2FsbHJlZiwgZGlzYy0+Y2F1c2UudmFsdWUpOworCXJldHVybiBtbmNjX3NlbmQocmVtb3RlLT5uZXQsIE1OQ0NfRElTQ19SRVEsIGRpc2MpOworfQorCitzdGF0aWMgaW50IG1uY2NfcmVsX2luZChzdHJ1Y3QgZ3NtX2NhbGwgKmNhbGwsIGludCBtc2dfdHlwZSwgc3RydWN0IGdzbV9tbmNjICpyZWwpCit7CisJc3RydWN0IGdzbV9jYWxsICpyZW1vdGU7CisKKwkvKiBzZW5kIHJlbGVhc2UgdG8gcmVtb3RlICovCisJaWYgKCEocmVtb3RlID0gZ2V0X2NhbGxfcmVmKGNhbGwtPnJlbW90ZV9yZWYpKSkgeworCQlmcmVlX2NhbGwoY2FsbCk7CisJCXJldHVybiAwOworCX0KKwlyZWwtPmNhbGxyZWYgPSByZW1vdGUtPmNhbGxyZWY7CisJREVCVUdQKERNTkNDLCAiKGNhbGwgJXgpIFJlbGVhc2luZyByZW1vdGUgd2l0aCBjYXVzZSAlZFxuIiwKKwkJY2FsbC0+Y2FsbHJlZiwgcmVsLT5jYXVzZS52YWx1ZSk7CisJbW5jY19zZW5kKHJlbW90ZS0+bmV0LCBNTkNDX1JFTF9SRVEsIHJlbCk7CisKKwlmcmVlX2NhbGwoY2FsbCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtbmNjX3JlbF9jbmYoc3RydWN0IGdzbV9jYWxsICpjYWxsLCBpbnQgbXNnX3R5cGUsIHN0cnVjdCBnc21fbW5jYyAqcmVsKQoreworCWZyZWVfY2FsbChjYWxsKTsKKwlyZXR1cm4gMDsKK30KKworLyogcmVjZWl2aW5nIGEgVENIL0YgZnJhbWUgZnJvbSB0aGUgQlNDIGNvZGUgKi8KK3N0YXRpYyBpbnQgbW5jY19yY3ZfdGNoZihzdHJ1Y3QgZ3NtX2NhbGwgKmNhbGwsIGludCBtc2dfdHlwZSwKKwkJCSBzdHJ1Y3QgZ3NtX2RhdGFfZnJhbWUgKmRmcikKK3sKKwlzdHJ1Y3QgZ3NtX3RyYW5zICpyZW1vdGVfdHJhbnM7CisKKwlyZW1vdGVfdHJhbnMgPSB0cmFuc19maW5kX2J5X2NhbGxyZWYoY2FsbC0+bmV0LCBjYWxsLT5yZW1vdGVfcmVmKTsKKworCS8qIHRoaXMgc2hvdWxkbid0IHJlYWxseSBoYXBwZW4gKi8KKwlpZiAoIXJlbW90ZV90cmFucyB8fCAhcmVtb3RlX3RyYW5zLT5sY2hhbikgeworCQlMT0dQKERNTkNDLCBMT0dMX0VSUk9SLCAiTm8gdHJhbnNhY3Rpb24gb3IgdHJhbnNhY3Rpb24gd2l0aG91dCBsY2hhbj8hP1xuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIFJUUCBzb2NrZXQgb2YgcmVtb3RlIGVuZCBoYXMgbWVhbndoaWxlIGRpZWQgKi8KKwlpZiAoIXJlbW90ZV90cmFucy0+bGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gcnRwX3NlbmRfZnJhbWUocmVtb3RlX3RyYW5zLT5sY2hhbi0+YWJpc19pcC5ydHBfc29ja2V0LCBkZnIpOworfQorCisKK2ludCBtbmNjX3JlY3Yoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIGludCBtc2dfdHlwZSwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqZGF0YSA9IGFyZzsKKwlpbnQgY2FsbHJlZjsKKwlzdHJ1Y3QgZ3NtX2NhbGwgKmNhbGwgPSBOVUxMLCAqY2FsbHQ7CisJaW50IHJjID0gMDsKKworCS8qIFNwZWNpYWwgbWVzc2FnZXMgKi8KKwlzd2l0Y2gobXNnX3R5cGUpIHsKKwl9CisJCisJLyogZmluZCBjYWxscmVmICovCisJY2FsbHJlZiA9IGRhdGEtPmNhbGxyZWY7CisJbGxpc3RfZm9yX2VhY2hfZW50cnkoY2FsbHQsICZjYWxsX2xpc3QsIGVudHJ5KSB7CisJCWlmIChjYWxsdC0+Y2FsbHJlZiA9PSBjYWxscmVmKSB7CisJCQljYWxsID0gY2FsbHQ7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIGNyZWF0ZSBjYWxscmVmLCBpZiBzZXR1cCBpcyByZWNlaXZlZCAqLworCWlmICghY2FsbCkgeworCQlpZiAobXNnX3R5cGUgIT0gTU5DQ19TRVRVUF9JTkQpCisJCQlyZXR1cm4gMDsgLyogZHJvcCAqLworCQkvKiBjcmVhdGUgY2FsbCAqLworCQlpZiAoIShjYWxsID0gdGFsbG9jX3plcm8odGFsbF9jYWxsX2N0eCwgc3RydWN0IGdzbV9jYWxsKSkpIHsKKwkJCXN0cnVjdCBnc21fbW5jYyByZWw7CisJCQkKKwkJCW1lbXNldCgmcmVsLCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJCQlyZWwuY2FsbHJlZiA9IGNhbGxyZWY7CisJCQltbmNjX3NldF9jYXVzZSgmcmVsLCBHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUsCisJCQkJICAgICAgIEdTTTQ4X0NDX0NBVVNFX1JFU09VUkNFX1VOQVZBSUwpOworCQkJbW5jY19zZW5kKG5ldCwgTU5DQ19SRUxfUkVRLCAmcmVsKTsKKwkJCXJldHVybiAwOworCQl9CisJCWxsaXN0X2FkZF90YWlsKCZjYWxsLT5lbnRyeSwgJmNhbGxfbGlzdCk7CisJCWNhbGwtPm5ldCA9IG5ldDsKKwkJY2FsbC0+Y2FsbHJlZiA9IGNhbGxyZWY7CisJCURFQlVHUChETU5DQywgIihjYWxsICV4KSBDYWxsIGNyZWF0ZWQuXG4iLCBjYWxsLT5jYWxscmVmKTsKKwl9CisKKwlzd2l0Y2ggKG1zZ190eXBlKSB7CisJY2FzZSBHU01fVENIRl9GUkFNRToKKwljYXNlIEdTTV9UQ0hGX0ZSQU1FX0VGUjoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJREVCVUdQKERNTkNDLCAiKGNhbGwgJXgpIFJlY2VpdmVkIG1lc3NhZ2UgJXNcbiIsIGNhbGwtPmNhbGxyZWYsCisJCQlnZXRfbW5jY19uYW1lKG1zZ190eXBlKSk7CisJCWJyZWFrOworCX0KKworCXN3aXRjaChtc2dfdHlwZSkgeworCWNhc2UgTU5DQ19TRVRVUF9JTkQ6CisJCXJjID0gbW5jY19zZXR1cF9pbmQoY2FsbCwgbXNnX3R5cGUsIGFyZyk7CisJCWJyZWFrOworCWNhc2UgTU5DQ19TRVRVUF9DTkY6CisJCXJjID0gbW5jY19zZXR1cF9jbmYoY2FsbCwgbXNnX3R5cGUsIGFyZyk7CisJCWJyZWFrOworCWNhc2UgTU5DQ19TRVRVUF9DT01QTF9JTkQ6CisJCWJyZWFrOworCWNhc2UgTU5DQ19DQUxMX0NPTkZfSU5EOgorCQkvKiB3ZSBub3cgbmVlZCB0byBNT0RJRlkgdGhlIGNoYW5uZWwgKi8KKwkJZGF0YS0+bGNoYW5fbW9kZSA9IEdTTTQ4X0NNT0RFX1NQRUVDSF9FRlI7CisJCW1uY2Nfc2VuZChjYWxsLT5uZXQsIE1OQ0NfTENIQU5fTU9ESUZZLCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBNTkNDX0FMRVJUX0lORDoKKwkJcmMgPSBtbmNjX2FsZXJ0X2luZChjYWxsLCBtc2dfdHlwZSwgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBNTkNDX05PVElGWV9JTkQ6CisJCXJjID0gbW5jY19ub3RpZnlfaW5kKGNhbGwsIG1zZ190eXBlLCBhcmcpOworCQlicmVhazsKKwljYXNlIE1OQ0NfRElTQ19JTkQ6CisJCXJjID0gbW5jY19kaXNjX2luZChjYWxsLCBtc2dfdHlwZSwgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBNTkNDX1JFTF9JTkQ6CisJY2FzZSBNTkNDX1JFSl9JTkQ6CisJCXJjID0gbW5jY19yZWxfaW5kKGNhbGwsIG1zZ190eXBlLCBhcmcpOworCQlicmVhazsKKwljYXNlIE1OQ0NfUkVMX0NORjoKKwkJcmMgPSBtbmNjX3JlbF9jbmYoY2FsbCwgbXNnX3R5cGUsIGFyZyk7CisJCWJyZWFrOworCWNhc2UgTU5DQ19GQUNJTElUWV9JTkQ6CisJCWJyZWFrOworCWNhc2UgTU5DQ19TVEFSVF9EVE1GX0lORDoKKwkJYnJlYWs7CisJY2FzZSBNTkNDX1NUT1BfRFRNRl9JTkQ6CisJCWJyZWFrOworCWNhc2UgTU5DQ19NT0RJRllfSU5EOgorCQltbmNjX3NldF9jYXVzZShkYXRhLCBHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUsCisJCQkJR1NNNDhfQ0NfQ0FVU0VfU0VSVl9PUFRfVU5JTVBMKTsKKwkJREVCVUdQKERNTkNDLCAiKGNhbGwgJXgpIFJlamVjdGluZyBNT0RJRlkgd2l0aCBjYXVzZSAlZFxuIiwKKwkJCWNhbGwtPmNhbGxyZWYsIGRhdGEtPmNhdXNlLnZhbHVlKTsKKwkJcmMgPSBtbmNjX3NlbmQobmV0LCBNTkNDX01PRElGWV9SRUosIGRhdGEpOworCQlicmVhazsKKwljYXNlIE1OQ0NfTU9ESUZZX0NORjoKKwkJYnJlYWs7CisJY2FzZSBNTkNDX0hPTERfSU5EOgorCQltbmNjX3NldF9jYXVzZShkYXRhLCBHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUsCisJCQkJR1NNNDhfQ0NfQ0FVU0VfU0VSVl9PUFRfVU5JTVBMKTsKKwkJREVCVUdQKERNTkNDLCAiKGNhbGwgJXgpIFJlamVjdGluZyBIT0xEIHdpdGggY2F1c2UgJWRcbiIsCisJCQljYWxsLT5jYWxscmVmLCBkYXRhLT5jYXVzZS52YWx1ZSk7CisJCXJjID0gbW5jY19zZW5kKG5ldCwgTU5DQ19IT0xEX1JFSiwgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgTU5DQ19SRVRSSUVWRV9JTkQ6CisJCW1uY2Nfc2V0X2NhdXNlKGRhdGEsIEdTTTQ4X0NBVVNFX0xPQ19QUk5fU19MVSwKKwkJCQlHU000OF9DQ19DQVVTRV9TRVJWX09QVF9VTklNUEwpOworCQlERUJVR1AoRE1OQ0MsICIoY2FsbCAleCkgUmVqZWN0aW5nIFJFVFJJRVZFIHdpdGggY2F1c2UgJWRcbiIsCisJCQljYWxsLT5jYWxscmVmLCBkYXRhLT5jYXVzZS52YWx1ZSk7CisJCXJjID0gbW5jY19zZW5kKG5ldCwgTU5DQ19SRVRSSUVWRV9SRUosIGRhdGEpOworCQlicmVhazsKKwljYXNlIEdTTV9UQ0hGX0ZSQU1FOgorCWNhc2UgR1NNX1RDSEZfRlJBTUVfRUZSOgorCQlyYyA9IG1uY2NfcmN2X3RjaGYoY2FsbCwgbXNnX3R5cGUsIGFyZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRE1OQ0MsIExPR0xfTk9USUNFLCAiKGNhbGwgJXgpIE1lc3NhZ2UgdW5oYW5kbGVkXG4iLCBjYWxscmVmKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvb3BlbmJzYy5jZmcuMS0xIGIvb3BlbmJzYy9zcmMvb3BlbmJzYy5jZmcuMS0xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNTgwNGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9vcGVuYnNjLmNmZy4xLTEKQEAgLTAsMCArMSw1NCBAQAorIQorISBPcGVuQlNDIGNvbmZpZ3VyYXRpb24gc2F2ZWQgZnJvbSB2dHkKKyEgICAhCitwYXNzd29yZCBmb28KKyEKK2xpbmUgdnR5Cisgbm8gbG9naW4KKyEKK25ldHdvcmsKKyBuZXR3b3JrIGNvdW50cnkgY29kZSAxCisgbW9iaWxlIG5ldHdvcmsgY29kZSAxCisgc2hvcnQgbmFtZSBPcGVuQlNDCisgbG9uZyBuYW1lIE9wZW5CU0MKKyB0aW1lciB0MzEwMSAxMAorIHRpbWVyIHQzMTEzIDYwCisgYnRzIDAKKyAgdHlwZSBiczExCisgIGJhbmQgR1NNOTAwCisgIGNlbGxfaWRlbnRpdHkgMQorICBsb2NhdGlvbl9hcmVhX2NvZGUgMQorICB0cmFpbmluZ19zZXF1ZW5jZV9jb2RlIDcKKyAgYmFzZV9zdGF0aW9uX2lkX2NvZGUgNjMKKyAgb21sIGUxIGxpbmUgMCB0aW1lc2xvdCAxIHN1Yi1zbG90IGZ1bGwKKyAgb21sIGUxIHRlaSAyNQorICB0cnggMAorICAgYXJmY24gMTIxCisgICBtYXhfcG93ZXJfcmVkIDAKKyAgIHJzbCBlMSBsaW5lIDAgdGltZXNsb3QgMSBzdWItc2xvdCBmdWxsCisgICByc2wgZTEgdGVpIDEKKyAgICB0aW1lc2xvdCAwCisgICAgIHBoeXNfY2hhbl9jb25maWcgQ0NDSCtTRENDSDQKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDEgc3ViLXNsb3QgZnVsbAorICAgIHRpbWVzbG90IDEKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMiBzdWItc2xvdCAxCisgICAgdGltZXNsb3QgMgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAyIHN1Yi1zbG90IDIKKyAgICB0aW1lc2xvdCAzCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDIgc3ViLXNsb3QgMworICAgIHRpbWVzbG90IDQKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMyBzdWItc2xvdCAwCisgICAgdGltZXNsb3QgNQorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAzIHN1Yi1zbG90IDEKKyAgICB0aW1lc2xvdCA2CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDMgc3ViLXNsb3QgMgorICAgIHRpbWVzbG90IDcKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMyBzdWItc2xvdCAzCisKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL29wZW5ic2MuY2ZnLjEtMiBiL29wZW5ic2Mvc3JjL29wZW5ic2MuY2ZnLjEtMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGQ1MGM3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvb3BlbmJzYy5jZmcuMS0yCkBAIC0wLDAgKzEsODIgQEAKKyEKKyEgT3BlbkJTQyBjb25maWd1cmF0aW9uIHNhdmVkIGZyb20gdnR5CishICAgIQorcGFzc3dvcmQgZm9vCishCitsaW5lIHZ0eQorIG5vIGxvZ2luCishCituZXR3b3JrCisgbmV0d29yayBjb3VudHJ5IGNvZGUgMQorIG1vYmlsZSBuZXR3b3JrIGNvZGUgMQorIHNob3J0IG5hbWUgT3BlbkJTQworIGxvbmcgbmFtZSBPcGVuQlNDCisgdGltZXIgdDMxMDEgMTAKKyB0aW1lciB0MzExMyA2MAorIGJ0cyAwCisgIHR5cGUgYnMxMQorICBiYW5kIEdTTTkwMAorICBjZWxsX2lkZW50aXR5IDEKKyAgbG9jYXRpb25fYXJlYV9jb2RlIDEKKyAgdHJhaW5pbmdfc2VxdWVuY2VfY29kZSA3CisgIGJhc2Vfc3RhdGlvbl9pZF9jb2RlIDYzCisgIG9tbCBlMSBsaW5lIDAgdGltZXNsb3QgMSBzdWItc2xvdCBmdWxsCisgIG9tbCBlMSB0ZWkgMjUKKyAgdHJ4IDAKKyAgIGFyZmNuIDEyMQorICAgbWF4X3Bvd2VyX3JlZCAwCisgICByc2wgZTEgbGluZSAwIHRpbWVzbG90IDEgc3ViLXNsb3QgZnVsbAorICAgcnNsIGUxIHRlaSAxCisgICAgdGltZXNsb3QgMAorICAgICBwaHlzX2NoYW5fY29uZmlnIENDQ0grU0RDQ0g0CisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAxIHN1Yi1zbG90IGZ1bGwKKyAgICB0aW1lc2xvdCAxCisgICAgIHBoeXNfY2hhbl9jb25maWcgU0RDQ0g4CisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAyIHN1Yi1zbG90IDEKKyAgICB0aW1lc2xvdCAyCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDIgc3ViLXNsb3QgMgorICAgIHRpbWVzbG90IDMKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMiBzdWItc2xvdCAzCisgICAgdGltZXNsb3QgNAorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAzIHN1Yi1zbG90IDAKKyAgICB0aW1lc2xvdCA1CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDMgc3ViLXNsb3QgMQorICAgIHRpbWVzbG90IDYKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMyBzdWItc2xvdCAyCisgICAgdGltZXNsb3QgNworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAzIHN1Yi1zbG90IDMKKyAgdHJ4IDEKKyAgIGFyZmNuIDEyMworICAgbWF4X3Bvd2VyX3JlZCAwCisgICByc2wgZTEgbGluZSAwIHRpbWVzbG90IDEgc3ViLXNsb3QgZnVsbAorICAgcnNsIGUxIHRlaSAyCisgICAgdGltZXNsb3QgMAorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCA0IHN1Yi1zbG90IDAKKyAgICB0aW1lc2xvdCAxCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDQgc3ViLXNsb3QgMQorICAgIHRpbWVzbG90IDIKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgNCBzdWItc2xvdCAyCisgICAgdGltZXNsb3QgMworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCA0IHN1Yi1zbG90IDMKKyAgICB0aW1lc2xvdCA0CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDUgc3ViLXNsb3QgMAorICAgIHRpbWVzbG90IDUKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgNSBzdWItc2xvdCAxCisgICAgdGltZXNsb3QgNgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCA1IHN1Yi1zbG90IDIKKyAgICB0aW1lc2xvdCA3CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDUgc3ViLXNsb3QgMwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvb3BlbmJzYy5jZmcuMi0yIGIvb3BlbmJzYy9zcmMvb3BlbmJzYy5jZmcuMi0yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZTgwMDMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9vcGVuYnNjLmNmZy4yLTIKQEAgLTAsMCArMSwxNDggQEAKKyEKKyEgT3BlbkJTQyBjb25maWd1cmF0aW9uIHNhdmVkIGZyb20gdnR5CishICAgIQorcGFzc3dvcmQgZm9vCishCitsaW5lIHZ0eQorIG5vIGxvZ2luCishCituZXR3b3JrCisgbmV0d29yayBjb3VudHJ5IGNvZGUgMQorIG1vYmlsZSBuZXR3b3JrIGNvZGUgMQorIHNob3J0IG5hbWUgT3BlbkJTQworIGxvbmcgbmFtZSBPcGVuQlNDCisgdGltZXIgdDMxMDEgMTAKKyB0aW1lciB0MzExMyA2MAorIGJ0cyAwCisgIHR5cGUgYnMxMQorICBiYW5kIEdTTTkwMAorICBjZWxsX2lkZW50aXR5IDEKKyAgbG9jYXRpb25fYXJlYV9jb2RlIDEKKyAgdHJhaW5pbmdfc2VxdWVuY2VfY29kZSA3CisgIGJhc2Vfc3RhdGlvbl9pZF9jb2RlIDYzCisgIG9tbCBlMSBsaW5lIDAgdGltZXNsb3QgMSBzdWItc2xvdCBmdWxsCisgIG9tbCBlMSB0ZWkgMjUKKyAgdHJ4IDAKKyAgIGFyZmNuIDEyMQorICAgbWF4X3Bvd2VyX3JlZCAwCisgICByc2wgZTEgbGluZSAwIHRpbWVzbG90IDEgc3ViLXNsb3QgZnVsbAorICAgcnNsIGUxIHRlaSAxCisgICAgdGltZXNsb3QgMAorICAgICBwaHlzX2NoYW5fY29uZmlnIENDQ0grU0RDQ0g0CisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAxIHN1Yi1zbG90IGZ1bGwKKyAgICB0aW1lc2xvdCAxCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDIgc3ViLXNsb3QgMQorICAgIHRpbWVzbG90IDIKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMiBzdWItc2xvdCAyCisgICAgdGltZXNsb3QgMworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAyIHN1Yi1zbG90IDMKKyAgICB0aW1lc2xvdCA0CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDMgc3ViLXNsb3QgMAorICAgIHRpbWVzbG90IDUKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMyBzdWItc2xvdCAxCisgICAgdGltZXNsb3QgNgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAzIHN1Yi1zbG90IDIKKyAgICB0aW1lc2xvdCA3CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDMgc3ViLXNsb3QgMworICB0cnggMQorICAgYXJmY24gMTIzCisgICBtYXhfcG93ZXJfcmVkIDAKKyAgIHJzbCBlMSBsaW5lIDAgdGltZXNsb3QgMSBzdWItc2xvdCBmdWxsCisgICByc2wgZTEgdGVpIDIKKyAgICB0aW1lc2xvdCAwCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDQgc3ViLXNsb3QgMAorICAgIHRpbWVzbG90IDEKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgNCBzdWItc2xvdCAxCisgICAgdGltZXNsb3QgMgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCA0IHN1Yi1zbG90IDIKKyAgICB0aW1lc2xvdCAzCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDQgc3ViLXNsb3QgMworICAgIHRpbWVzbG90IDQKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgNSBzdWItc2xvdCAwCisgICAgdGltZXNsb3QgNQorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCA1IHN1Yi1zbG90IDEKKyAgICB0aW1lc2xvdCA2CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDUgc3ViLXNsb3QgMgorICAgIHRpbWVzbG90IDcKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgNSBzdWItc2xvdCAzCisgYnRzIDEKKyAgdHlwZSBiczExCisgIGJhbmQgR1NNOTAwCisgIGxvY2F0aW9uX2FyZWFfY29kZSAyCisgIHRyYWluaW5nX3NlcXVlbmNlX2NvZGUgNworICBiYXNlX3N0YXRpb25faWRfY29kZSA2MworICBvbWwgZTEgbGluZSAxIHRpbWVzbG90IDYgc3ViLXNsb3QgZnVsbAorICBvbWwgZTEgdGVpIDI1CisgIHRyeCAwCisgICBhcmZjbiAxMjIKKyAgIG1heF9wb3dlcl9yZWQgMAorICAgcnNsIGUxIGxpbmUgMSB0aW1lc2xvdCA2IHN1Yi1zbG90IGZ1bGwKKyAgIHJzbCBlMSB0ZWkgMQorICAgIHRpbWVzbG90IDAKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBDQ0NIK1NEQ0NINAorICAgICBlMSBsaW5lIDEgdGltZXNsb3QgNyBzdWItc2xvdCAwCisgICAgdGltZXNsb3QgMQorICAgICBwaHlzX2NoYW5fY29uZmlnIFNEQ0NIOAorICAgICBlMSBsaW5lIDEgdGltZXNsb3QgNyBzdWItc2xvdCAxCisgICAgdGltZXNsb3QgMgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMSB0aW1lc2xvdCA3IHN1Yi1zbG90IDIKKyAgICB0aW1lc2xvdCAzCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAxIHRpbWVzbG90IDcgc3ViLXNsb3QgMworICAgIHRpbWVzbG90IDQKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDEgdGltZXNsb3QgOCBzdWItc2xvdCAwCisgICAgdGltZXNsb3QgNQorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMSB0aW1lc2xvdCA4IHN1Yi1zbG90IDEKKyAgICB0aW1lc2xvdCA2CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAxIHRpbWVzbG90IDggc3ViLXNsb3QgMgorICAgIHRpbWVzbG90IDcKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDEgdGltZXNsb3QgOCBzdWItc2xvdCAzCisgIHRyeCAxCisgICBhcmZjbiAxMjQKKyAgIG1heF9wb3dlcl9yZWQgMAorICAgcnNsIGUxIGxpbmUgMSB0aW1lc2xvdCA2IHN1Yi1zbG90IGZ1bGwKKyAgIHJzbCBlMSB0ZWkgMgorICAgIHRpbWVzbG90IDAKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDEgdGltZXNsb3QgOSBzdWItc2xvdCAwCisgICAgdGltZXNsb3QgMQorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMSB0aW1lc2xvdCA5IHN1Yi1zbG90IDEKKyAgICB0aW1lc2xvdCAyCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAxIHRpbWVzbG90IDkgc3ViLXNsb3QgMgorICAgIHRpbWVzbG90IDMKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDEgdGltZXNsb3QgOSBzdWItc2xvdCAzCisgICAgdGltZXNsb3QgNAorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMSB0aW1lc2xvdCAxMCBzdWItc2xvdCAwCisgICAgdGltZXNsb3QgNQorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMSB0aW1lc2xvdCAxMCBzdWItc2xvdCAxCisgICAgdGltZXNsb3QgNgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMSB0aW1lc2xvdCAxMCBzdWItc2xvdCAyCisgICAgdGltZXNsb3QgNworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMSB0aW1lc2xvdCAxMCBzdWItc2xvdCAzCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9vcGVuYnNjLmNmZy5uYW5vYnRzIGIvb3BlbmJzYy9zcmMvb3BlbmJzYy5jZmcubmFub2J0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWNlYWVjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvb3BlbmJzYy5jZmcubmFub2J0cwpAQCAtMCwwICsxLDQwIEBACishCishIE9wZW5CU0MgY29uZmlndXJhdGlvbiBzYXZlZCBmcm9tIHZ0eQorIQorcGFzc3dvcmQgZm9vCishCitsaW5lIHZ0eQorIG5vIGxvZ2luCishCituZXR3b3JrCisgbmV0d29yayBjb3VudHJ5IGNvZGUgMQorIG1vYmlsZSBuZXR3b3JrIGNvZGUgMQorIHNob3J0IG5hbWUgT3BlbkJTQworIGxvbmcgbmFtZSBPcGVuQlNDCisgdGltZXIgdDMxMDEgMTAKKyB0aW1lciB0MzExMyA2MAorIGJ0cyAwCisgIHR5cGUgbmFub2J0cworICBpcC5hY2Nlc3MgdW5pdF9pZCAxODAxIDAKKyAgYmFuZCBHU00xODAwCisgIGxvY2F0aW9uX2FyZWFfY29kZSAxCisgIHRyYWluaW5nX3NlcXVlbmNlX2NvZGUgNworICBiYXNlX3N0YXRpb25faWRfY29kZSA2MworICB0cnggMAorICAgYXJmY24gNTE0CisgICAgdGltZXNsb3QgMAorICAgICBwaHlzX2NoYW5fY29uZmlnIENDQ0grU0RDQ0g0CisgICAgdGltZXNsb3QgMQorICAgICBwaHlzX2NoYW5fY29uZmlnIFNEQ0NIOAorICAgIHRpbWVzbG90IDIKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgIHRpbWVzbG90IDMKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgIHRpbWVzbG90IDQKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgIHRpbWVzbG90IDUKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgIHRpbWVzbG90IDYKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgIHRpbWVzbG90IDcKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvcGFnaW5nLmMgYi9vcGVuYnNjL3NyYy9wYWdpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzM3NTBkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvcGFnaW5nLmMKQEAgLTAsMCArMSwzMzkgQEAKKy8qIFBhZ2luZyBoZWxwZXIgYW5kIG1hbmFnZXIuLi4uICovCisvKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworLyoKKyAqIFJlbGV2YW50IHNwZWNzOgorICogICAgIDEyLjIxOgorICogICAgICAgLSA5LjQuMTIgZm9yIENDQ0ggTG9jYWwgVGhyZXNob2xkCisgKgorICogICAgIDA1LjU4OgorICogICAgICAgLSA4LjUuMiBDQ0NIIExvYWQgaW5kaWNhdGlvbgorICogICAgICAgLSA5LjMuMTUgUGFnaW5nIExvYWQKKyAqCisgKiBBcHByb2FjaDoKKyAqICAgICAgIC0gU2VuZCBwYWdpbmcgY29tbWFuZCB0byBzdWJzY3JpYmVyCisgKiAgICAgICAtIE9uIENoYW5uZWwgUmVxdWVzdCB3ZSB3aWxsIHJlbWVtYmVyIHRoZSByZWFzb24KKyAqICAgICAgIC0gQWZ0ZXIgdGhlIEFDSyB3ZSB3aWxsIHJlcXVlc3QgdGhlIGlkZW50aXR5CisgKgkgLSBUaGVuIHdlIHdpbGwgc2VuZCBhc3NpZ24gdGhlIGdzbV9zdWJzY3JpYmVyIGFuZAorICoJIC0gYW5kIGNhbGwgYSBjYWxsYmFjaworICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9wYWdpbmcuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfcnNsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorCit2b2lkICp0YWxsX3BhZ2luZ19jdHg7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY2FsY3VsYXRlX2dyb3VwKHN0cnVjdCBnc21fYnRzICpidHMsIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCWludCBjY2NoX2NvbmY7CisJaW50IGJzX2NjX2NoYW5zOworCWludCBibG9ja3M7CisJdW5zaWduZWQgaW50IGdyb3VwOworCQorCWNjY2hfY29uZiA9IGJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYy5jY2NoX2NvbmY7CisJYnNfY2NfY2hhbnMgPSByc2xfY2NjaF9jb25mX3RvX2JzX2NjX2NoYW5zKGNjY2hfY29uZik7CisJLyogY29kZSB3b3JkICsgMiwgYXMgMiBjaGFubmVscyBlcXVhbHMgMHgwICovCisJYmxvY2tzID0gcnNsX251bWJlcl9vZl9wYWdpbmdfc3ViY2hhbm5lbHMoYnRzKTsKKwlncm91cCA9IGdldF9wYWdpbmdfZ3JvdXAoc3RyX3RvX2ltc2koc3Vic2NyLT5pbXNpKSwKKwkJCQkJYnNfY2NfY2hhbnMsIGJsb2Nrcyk7CisJcmV0dXJuIGdyb3VwOworfQorCisvKgorICogS2lsbCBvbmUgcGFnaW5nIHJlcXVlc3QgdXBkYXRlIHRoZSBpbnRlcm5hbCBsaXN0Li4uCisgKi8KK3N0YXRpYyB2b2lkIHBhZ2luZ19yZW1vdmVfcmVxdWVzdChzdHJ1Y3QgZ3NtX2J0c19wYWdpbmdfc3RhdGUgKnBhZ2luZ19idHMsCisJCQkJc3RydWN0IGdzbV9wYWdpbmdfcmVxdWVzdCAqdG9fYmVfZGVsZXRlZCkKK3sKKwkvKiBVcGRhdGUgdGhlIGxhc3RfcmVxdWVzdCBpZiB0aGF0IGlzIG5lY2Vzc2FyeSAqLworCWlmICh0b19iZV9kZWxldGVkID09IHBhZ2luZ19idHMtPmxhc3RfcmVxdWVzdCkgeworCQlwYWdpbmdfYnRzLT5sYXN0X3JlcXVlc3QgPQorCQkJKHN0cnVjdCBnc21fcGFnaW5nX3JlcXVlc3QgKilwYWdpbmdfYnRzLT5sYXN0X3JlcXVlc3QtPmVudHJ5Lm5leHQ7CisJCWlmICgmdG9fYmVfZGVsZXRlZC0+ZW50cnkgPT0gJnBhZ2luZ19idHMtPnBlbmRpbmdfcmVxdWVzdHMpCisJCQlwYWdpbmdfYnRzLT5sYXN0X3JlcXVlc3QgPSBOVUxMOworCX0KKworCWJzY19kZWxfdGltZXIoJnRvX2JlX2RlbGV0ZWQtPlQzMTEzKTsKKwlsbGlzdF9kZWwoJnRvX2JlX2RlbGV0ZWQtPmVudHJ5KTsKKwlzdWJzY3JfcHV0KHRvX2JlX2RlbGV0ZWQtPnN1YnNjcik7CisJdGFsbG9jX2ZyZWUodG9fYmVfZGVsZXRlZCk7Cit9CisKK3N0YXRpYyB2b2lkIHBhZ2VfbXMoc3RydWN0IGdzbV9wYWdpbmdfcmVxdWVzdCAqcmVxdWVzdCkKK3sKKwl1X2ludDhfdCBtaVsxMjhdOworCXVuc2lnbmVkIGludCBtaV9sZW47CisJdW5zaWduZWQgaW50IHBhZ2VfZ3JvdXA7CisKKwlERUJVR1AoRFBBRywgIkdvaW5nIHRvIHNlbmQgcGFnaW5nIGNvbW1hbmRzOiBpbXNpOiAnJXMnIHRtc2k6ICcweCV4J1xuIiwKKwkJcmVxdWVzdC0+c3Vic2NyLT5pbXNpLCByZXF1ZXN0LT5zdWJzY3ItPnRtc2kpOworCisJaWYgKHJlcXVlc3QtPnN1YnNjci0+dG1zaSA9PSBHU01fUkVTRVJWRURfVE1TSSkKKwkJbWlfbGVuID0gZ3NtNDhfZ2VuZXJhdGVfbWlkX2Zyb21faW1zaShtaSwgcmVxdWVzdC0+c3Vic2NyLT5pbXNpKTsKKwllbHNlCisJCW1pX2xlbiA9IGdzbTQ4X2dlbmVyYXRlX21pZF9mcm9tX3Rtc2kobWksIHJlcXVlc3QtPnN1YnNjci0+dG1zaSk7CisKKwlwYWdlX2dyb3VwID0gY2FsY3VsYXRlX2dyb3VwKHJlcXVlc3QtPmJ0cywgcmVxdWVzdC0+c3Vic2NyKTsKKwlyc2xfcGFnaW5nX2NtZChyZXF1ZXN0LT5idHMsIHBhZ2VfZ3JvdXAsIG1pX2xlbiwgbWksCisJCQlyZXF1ZXN0LT5jaGFuX3R5cGUpOworfQorCitzdGF0aWMgdm9pZCBwYWdpbmdfbW92ZV90b19uZXh0KHN0cnVjdCBnc21fYnRzX3BhZ2luZ19zdGF0ZSAqcGFnaW5nX2J0cykKK3sKKwlwYWdpbmdfYnRzLT5sYXN0X3JlcXVlc3QgPQorCQkoc3RydWN0IGdzbV9wYWdpbmdfcmVxdWVzdCAqKXBhZ2luZ19idHMtPmxhc3RfcmVxdWVzdC0+ZW50cnkubmV4dDsKKwlpZiAoJnBhZ2luZ19idHMtPmxhc3RfcmVxdWVzdC0+ZW50cnkgPT0gJnBhZ2luZ19idHMtPnBlbmRpbmdfcmVxdWVzdHMpCisJCXBhZ2luZ19idHMtPmxhc3RfcmVxdWVzdCA9IE5VTEw7Cit9CisKKy8qCisgKiBUaGlzIGlzIGtpY2tlZCBieSB0aGUgcGVyaW9kaWMgUEFHSU5HIExPQUQgSW5kaWNhdG9yCisgKiBjb21pbmcgZnJvbSBhYmlzX3JzbC5jCisgKgorICogV2UgYXR0ZW1wdCB0byBpdGVyYXRlIG9uY2Ugb3ZlciB0aGUgbGlzdCBvZiBpdGVtcyBidXQKKyAqIG9ubHkgdXB0byBhdmFpbGFibGVfc2xvdHMuCisgKi8KK3N0YXRpYyB2b2lkIHBhZ2luZ19oYW5kbGVfcGVuZGluZ19yZXF1ZXN0cyhzdHJ1Y3QgZ3NtX2J0c19wYWdpbmdfc3RhdGUgKnBhZ2luZ19idHMpCit7CisJc3RydWN0IGdzbV9wYWdpbmdfcmVxdWVzdCAqaW5pdGlhbF9yZXF1ZXN0ID0gTlVMTDsKKwlzdHJ1Y3QgZ3NtX3BhZ2luZ19yZXF1ZXN0ICpjdXJyZW50X3JlcXVlc3QgPSBOVUxMOworCisJLyoKKwkgKiBEZXRlcm1pbmUgaWYgdGhlIHBlbmRpbmdfcmVxdWVzdHMgbGlzdCBpcyBlbXB0eSBhbmQKKwkgKiByZXR1cm4gdGhlbi4KKwkgKi8KKwlpZiAobGxpc3RfZW1wdHkoJnBhZ2luZ19idHMtPnBlbmRpbmdfcmVxdWVzdHMpKSB7CisJCXBhZ2luZ19idHMtPmxhc3RfcmVxdWVzdCA9IE5VTEw7CisJCS8qIHNpbmNlIHRoZSBsaXN0IGlzIGVtcHR5LCBubyBuZWVkIHRvIHJlc2NoZWR1bGUgdGhlIHRpbWVyICovCisJCXJldHVybjsKKwl9CisKKwlpZiAoIXBhZ2luZ19idHMtPmxhc3RfcmVxdWVzdCkKKwkJcGFnaW5nX2J0cy0+bGFzdF9yZXF1ZXN0ID0KKwkJCShzdHJ1Y3QgZ3NtX3BhZ2luZ19yZXF1ZXN0ICopcGFnaW5nX2J0cy0+cGVuZGluZ19yZXF1ZXN0cy5uZXh0OworCisJYXNzZXJ0KHBhZ2luZ19idHMtPmxhc3RfcmVxdWVzdCk7CisJaW5pdGlhbF9yZXF1ZXN0ID0gcGFnaW5nX2J0cy0+bGFzdF9yZXF1ZXN0OworCWN1cnJlbnRfcmVxdWVzdCA9IGluaXRpYWxfcmVxdWVzdDsKKworCWRvIHsKKwkJLyogaGFuZGxlIHRoZSBwYWdpbmcgcmVxdWVzdCBub3cgKi8KKwkJcGFnZV9tcyhjdXJyZW50X3JlcXVlc3QpOworCQlwYWdpbmdfYnRzLT5hdmFpbGFibGVfc2xvdHMtLTsKKworCQkvKgorCQkgKiBtb3ZlIHRvIHRoZSBuZXh0IGl0ZW0uIFdlIG1pZ2h0IHdyYXAgYXJvdW5kCisJCSAqIHRoaXMgbWVhbnMgbGFzdF9yZXF1ZXN0IHdpbGwgYmUgTlVMTCBhbmQgd2UganVzdAorCQkgKiBjYWxsIHBhZ2luZ19wYWdlX3RvX25leHQgYWdhaW4uIEl0IGl0IGd1cmFudGVlZAorCQkgKiB0aGF0IHRoZSBsaXN0IGlzIG5vdCBlbXB0eS4KKwkJICovCisJCXBhZ2luZ19tb3ZlX3RvX25leHQocGFnaW5nX2J0cyk7CisJCWlmICghcGFnaW5nX2J0cy0+bGFzdF9yZXF1ZXN0KQorCQkJcGFnaW5nX2J0cy0+bGFzdF9yZXF1ZXN0ID0KKwkJCQkoc3RydWN0IGdzbV9wYWdpbmdfcmVxdWVzdCAqKXBhZ2luZ19idHMtPnBlbmRpbmdfcmVxdWVzdHMubmV4dDsKKwkJY3VycmVudF9yZXF1ZXN0ID0gcGFnaW5nX2J0cy0+bGFzdF9yZXF1ZXN0OworCX0gd2hpbGUgKHBhZ2luZ19idHMtPmF2YWlsYWJsZV9zbG90cyA+IDAKKwkJICAgICYmICBpbml0aWFsX3JlcXVlc3QgIT0gY3VycmVudF9yZXF1ZXN0KTsKKworCWJzY19zY2hlZHVsZV90aW1lcigmcGFnaW5nX2J0cy0+d29ya190aW1lciwgMSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHBhZ2luZ193b3JrZXIodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZ3NtX2J0c19wYWdpbmdfc3RhdGUgKnBhZ2luZ19idHMgPSBkYXRhOworCisJcGFnaW5nX2hhbmRsZV9wZW5kaW5nX3JlcXVlc3RzKHBhZ2luZ19idHMpOworfQorCit2b2lkIHBhZ2luZ19pbml0KHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJYnRzLT5wYWdpbmcuYnRzID0gYnRzOworCUlOSVRfTExJU1RfSEVBRCgmYnRzLT5wYWdpbmcucGVuZGluZ19yZXF1ZXN0cyk7CisJYnRzLT5wYWdpbmcud29ya190aW1lci5jYiA9IHBhZ2luZ193b3JrZXI7CisJYnRzLT5wYWdpbmcud29ya190aW1lci5kYXRhID0gJmJ0cy0+cGFnaW5nOworCisJLyogTGFyZ2UgbnVtYmVyLCB1bnRpbCB3ZSBnZXQgYSBwcm9wZXIgbWVzc2FnZSAqLworCWJ0cy0+cGFnaW5nLmF2YWlsYWJsZV9zbG90cyA9IDEwMDsKK30KKworc3RhdGljIGludCBwYWdpbmdfcGVuZGluZ19yZXF1ZXN0KHN0cnVjdCBnc21fYnRzX3BhZ2luZ19zdGF0ZSAqYnRzLAorCQkJCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKSB7CisJc3RydWN0IGdzbV9wYWdpbmdfcmVxdWVzdCAqcmVxOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkocmVxLCAmYnRzLT5wZW5kaW5nX3JlcXVlc3RzLCBlbnRyeSkgeworCQlpZiAoc3Vic2NyID09IHJlcS0+c3Vic2NyKQorCQkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7CQorfQorCitzdGF0aWMgdm9pZCBwYWdpbmdfVDMxMTNfZXhwaXJlZCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBnc21fcGFnaW5nX3JlcXVlc3QgKnJlcSA9IChzdHJ1Y3QgZ3NtX3BhZ2luZ19yZXF1ZXN0ICopZGF0YTsKKwlzdHJ1Y3QgcGFnaW5nX3NpZ25hbF9kYXRhIHNpZ19kYXRhOworCXZvaWQgKmNiZm5fcGFyYW07CisJZ3NtX2NiZm4gKmNiZm47CisKKwlERUJVR1AoRFBBRywgIlQzMTEzIGV4cGlyZWQgZm9yIHJlcXVlc3QgJXAgKCVzKVxuIiwKKwkJcmVxLCByZXEtPnN1YnNjci0+aW1zaSk7CisJCisJc2lnX2RhdGEuc3Vic2NyID0gcmVxLT5zdWJzY3I7CisJc2lnX2RhdGEuYnRzCT0gcmVxLT5idHM7CisJc2lnX2RhdGEubGNoYW4JPSBOVUxMOworCisJLyogbXVzdCBiZSBkZXN0cm95ZWQgYmVmb3JlIGNhbGxpbmcgY2JmbiwgdG8gcHJldmVudCBkb3VibGUgZnJlZSAqLworCWNiZm5fcGFyYW0gPSByZXEtPmNiZm5fcGFyYW07CisJY2JmbiA9IHJlcS0+Y2JmbjsKKwlwYWdpbmdfcmVtb3ZlX3JlcXVlc3QoJnJlcS0+YnRzLT5wYWdpbmcsIHJlcSk7CisKKwljb3VudGVyX2luYyhyZXEtPmJ0cy0+bmV0d29yay0+c3RhdHMucGFnaW5nLmV4cGlyZWQpOworCisJZGlzcGF0Y2hfc2lnbmFsKFNTX1BBR0lORywgU19QQUdJTkdfRVhQSVJFRCwgJnNpZ19kYXRhKTsKKwlpZiAoY2JmbikKKwkJY2JmbihHU01fSE9PS19SUl9QQUdJTkcsIEdTTV9QQUdJTkdfRVhQSVJFRCwgTlVMTCwgTlVMTCwKKwkJCSAgY2Jmbl9wYXJhbSk7Cit9CisKK3N0YXRpYyBpbnQgX3BhZ2luZ19yZXF1ZXN0KHN0cnVjdCBnc21fYnRzICpidHMsIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorCQkJICAgIGludCB0eXBlLCBnc21fY2JmbiAqY2Jmbiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZ3NtX2J0c19wYWdpbmdfc3RhdGUgKmJ0c19lbnRyeSA9ICZidHMtPnBhZ2luZzsKKwlzdHJ1Y3QgZ3NtX3BhZ2luZ19yZXF1ZXN0ICpyZXE7CisKKwlpZiAocGFnaW5nX3BlbmRpbmdfcmVxdWVzdChidHNfZW50cnksIHN1YnNjcikpIHsKKwkJREVCVUdQKERQQUcsICJQYWdpbmcgcmVxdWVzdCBhbHJlYWR5IHBlbmRpbmdcbiIpOworCQlyZXR1cm4gLUVFWElTVDsKKwl9CisKKwlERUJVR1AoRFBBRywgIlN0YXJ0IHBhZ2luZyBvZiBzdWJzY3JpYmVyICVsbHUgb24gYnRzICVkLlxuIiwKKwkJc3Vic2NyLT5pZCwgYnRzLT5ucik7CisJcmVxID0gdGFsbG9jX3plcm8odGFsbF9wYWdpbmdfY3R4LCBzdHJ1Y3QgZ3NtX3BhZ2luZ19yZXF1ZXN0KTsKKwlyZXEtPnN1YnNjciA9IHN1YnNjcl9nZXQoc3Vic2NyKTsKKwlyZXEtPmJ0cyA9IGJ0czsKKwlyZXEtPmNoYW5fdHlwZSA9IHR5cGU7CisJcmVxLT5jYmZuID0gY2JmbjsKKwlyZXEtPmNiZm5fcGFyYW0gPSBkYXRhOworCXJlcS0+VDMxMTMuY2IgPSBwYWdpbmdfVDMxMTNfZXhwaXJlZDsKKwlyZXEtPlQzMTEzLmRhdGEgPSByZXE7CisJYnNjX3NjaGVkdWxlX3RpbWVyKCZyZXEtPlQzMTEzLCBidHMtPm5ldHdvcmstPlQzMTEzLCAwKTsKKwlsbGlzdF9hZGRfdGFpbCgmcmVxLT5lbnRyeSwgJmJ0c19lbnRyeS0+cGVuZGluZ19yZXF1ZXN0cyk7CisKKwlpZiAoIWJzY190aW1lcl9wZW5kaW5nKCZidHNfZW50cnktPndvcmtfdGltZXIpKQorCQlic2Nfc2NoZWR1bGVfdGltZXIoJmJ0c19lbnRyeS0+d29ya190aW1lciwgMSwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHBhZ2luZ19yZXF1ZXN0KHN0cnVjdCBnc21fbmV0d29yayAqbmV0d29yaywgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsCisJCSAgIGludCB0eXBlLCBnc21fY2JmbiAqY2Jmbiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gTlVMTDsKKwlpbnQgbnVtX3BhZ2VzID0gMDsKKworCWNvdW50ZXJfaW5jKG5ldHdvcmstPnN0YXRzLnBhZ2luZy5hdHRlbXB0ZWQpOworCisJLyogc3RhcnQgcGFnaW5nIHN1YnNjcmliZXIgb24gYWxsIEJUUyB3aXRoaW4gTG9jYXRpb24gQXJlYSAqLworCWRvIHsKKwkJaW50IHJjOworCisJCWJ0cyA9IGdzbV9idHNfYnlfbGFjKG5ldHdvcmssIHN1YnNjci0+bGFjLCBidHMpOworCQlpZiAoIWJ0cykKKwkJCWJyZWFrOworCisJCS8qIHNraXAgYWxsIGN1cnJlbnRseSBpbmFjdGl2ZSBUUlggKi8KKwkJaWYgKCF0cnhfaXNfdXNhYmxlKGJ0cy0+YzApKQorCQkJY29udGludWU7CisKKwkJbnVtX3BhZ2VzKys7CisKKwkJLyogVHJpZ2dlciBwYWdpbmcsIHBhc3MgYW55IGVycm9yIHRvIGNhbGxlciAqLworCQlyYyA9IF9wYWdpbmdfcmVxdWVzdChidHMsIHN1YnNjciwgdHlwZSwgY2JmbiwgZGF0YSk7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4gcmM7CisJfSB3aGlsZSAoMSk7CisKKwlpZiAobnVtX3BhZ2VzID09IDApCisJCWNvdW50ZXJfaW5jKG5ldHdvcmstPnN0YXRzLnBhZ2luZy5kZXRhY2hlZCk7CisKKwlyZXR1cm4gbnVtX3BhZ2VzOworfQorCisKKy8qIHdlIGNvbnNjaW91c2x5IGlnbm9yZSB0aGUgdHlwZSBvZiB0aGUgcmVxdWVzdCBoZXJlICovCitzdGF0aWMgdm9pZCBfcGFnaW5nX3JlcXVlc3Rfc3RvcChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciwKKwkJCQkgc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3RydWN0IGdzbV9idHNfcGFnaW5nX3N0YXRlICpidHNfZW50cnkgPSAmYnRzLT5wYWdpbmc7CisJc3RydWN0IGdzbV9wYWdpbmdfcmVxdWVzdCAqcmVxLCAqcmVxMjsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVxLCByZXEyLCAmYnRzX2VudHJ5LT5wZW5kaW5nX3JlcXVlc3RzLAorCQkJCSBlbnRyeSkgeworCQlpZiAocmVxLT5zdWJzY3IgPT0gc3Vic2NyKSB7CisJCQlpZiAobGNoYW4gJiYgcmVxLT5jYmZuKSB7CisJCQkJREVCVUdQKERQQUcsICJTdG9wIHBhZ2luZyBvbiBidHMgJWQsIGNhbGxpbmcgY2Jmbi5cbiIsIGJ0cy0+bnIpOworCQkJCXJlcS0+Y2JmbihHU01fSE9PS19SUl9QQUdJTkcsIEdTTV9QQUdJTkdfU1VDQ0VFREVELAorCQkJCQkgIE5VTEwsIGxjaGFuLCByZXEtPmNiZm5fcGFyYW0pOworCQkJfSBlbHNlCisJCQkJREVCVUdQKERQQUcsICJTdG9wIHBhZ2luZyBvbiBidHMgJWQgc2lsZW50bHkuXG4iLCBidHMtPm5yKTsKKwkJCXBhZ2luZ19yZW1vdmVfcmVxdWVzdCgmYnRzLT5wYWdpbmcsIHJlcSk7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworLyogU3RvcCBwYWdpbmcgb24gYWxsIG90aGVyIGJ0cycgKi8KK3ZvaWQgcGFnaW5nX3JlcXVlc3Rfc3RvcChzdHJ1Y3QgZ3NtX2J0cyAqX2J0cywgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsCisJCQkgc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IE5VTEw7CisKKwlpZiAoX2J0cykKKwkJX3BhZ2luZ19yZXF1ZXN0X3N0b3AoX2J0cywgc3Vic2NyLCBsY2hhbik7CisKKwlkbyB7CisJCS8qCisJCSAqIEZJWE1FOiBEb24ndCB1c2UgdGhlIGxhYyBvZiB0aGUgc3Vic2NyaWJlci4uLgorCQkgKiBhcyBpdCBtaWdodCBoYXZlIG1hZ2ljYWxseSBjaGFuZ2VkIHRoZSBsYWMuLiB1c2UgdGhlCisJCSAqIGxvY2F0aW9uIGFyZWEgb2YgdGhlIF9idHMgYXMgcmVjb25maWd1cmF0aW9uIG9mIHRoZQorCQkgKiBuZXR3b3JrIGlzIHByb2JhYmx5IGhhcHBlbmluZyBsZXNzIG9mdGVuLgorCQkgKi8KKwkJYnRzID0gZ3NtX2J0c19ieV9sYWMoc3Vic2NyLT5uZXQsIHN1YnNjci0+bGFjLCBidHMpOworCQlpZiAoIWJ0cykKKwkJCWJyZWFrOworCisJCS8qIFN0b3AgcGFnaW5nICovCisgICAgICAgICAgICAgICAgaWYgKGJ0cyAhPSBfYnRzKQorCQkJX3BhZ2luZ19yZXF1ZXN0X3N0b3AoYnRzLCBzdWJzY3IsIE5VTEwpOworCX0gd2hpbGUgKDEpOworfQorCit2b2lkIHBhZ2luZ191cGRhdGVfYnVmZmVyX3NwYWNlKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50MTZfdCBmcmVlX3Nsb3RzKQoreworCWJ0cy0+cGFnaW5nLmF2YWlsYWJsZV9zbG90cyA9IGZyZWVfc2xvdHM7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9yZXN0X29jdGV0cy5jIGIvb3BlbmJzYy9zcmMvcmVzdF9vY3RldHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjk5NmNlCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvcmVzdF9vY3RldHMuYwpAQCAtMCwwICsxLDM5NiBAQAorLyogR1NNIE1vYmlsZSBSYWRpbyBJbnRlcmZhY2UgTGF5ZXIgMyBtZXNzYWdlcyBvbiB0aGUgQS1iaXMgaW50ZXJmYWNlLAorICogcmVzdCBvY3RldCBoYW5kbGluZyBhY2NvcmRpbmcgdG8KKyAqIDNHUFAgVFMgMDQuMDggdmVyc2lvbiA3LjIxLjAgUmVsZWFzZSAxOTk4IC8gRVRTSSBUUyAxMDAgOTQwIFY3LjIxLjAgKi8KKworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvYml0dmVjLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9yZXN0X29jdGV0cy5oPgorCisvKiBnZW5lcmF0ZSBTSTEgcmVzdCBvY3RldHMgKi8KK2ludCByZXN0X29jdGV0c19zaTEodV9pbnQ4X3QgKmRhdGEsIHVfaW50OF90ICpuY2hfcG9zKQoreworCXN0cnVjdCBiaXR2ZWMgYnY7CisKKwltZW1zZXQoJmJ2LCAwLCBzaXplb2YoYnYpKTsKKwlidi5kYXRhID0gZGF0YTsKKwlidi5kYXRhX2xlbiA9IDE7CisKKwlpZiAobmNoX3BvcykgeworCQliaXR2ZWNfc2V0X2JpdCgmYnYsIEgpOworCQliaXR2ZWNfc2V0X3VpbnQoJmJ2LCAqbmNoX3BvcywgNSk7CisJfSBlbHNlCisJCWJpdHZlY19zZXRfYml0KCZidiwgTCk7CisKKwliaXR2ZWNfc3BhcmVfcGFkZGluZygmYnYsIDcpOworCXJldHVybiBidi5kYXRhX2xlbjsKK30KKworLyogQXBwZW5kIHNlbGVjdGlvbiBwYXJhbWV0ZXJzIHRvIGJpdHZlYyAqLworc3RhdGljIHZvaWQgYXBwZW5kX3NlbGVjdGlvbl9wYXJhbXMoc3RydWN0IGJpdHZlYyAqYnYsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBnc200OF9zaV9zZWxlY3Rpb25fcGFyYW1zICpzcCkKK3sKKwlpZiAoc3AtPnByZXNlbnQpIHsKKwkJYml0dmVjX3NldF9iaXQoYnYsIEgpOworCQliaXR2ZWNfc2V0X2JpdChidiwgc3AtPmNicSk7CisJCWJpdHZlY19zZXRfdWludChidiwgc3AtPmNlbGxfcmVzZWxfb2ZmLCA2KTsKKwkJYml0dmVjX3NldF91aW50KGJ2LCBzcC0+dGVtcF9vZmZzLCAzKTsKKwkJYml0dmVjX3NldF91aW50KGJ2LCBzcC0+cGVuYWx0eV90aW1lLCA1KTsKKwl9IGVsc2UKKwkJYml0dmVjX3NldF9iaXQoYnYsIEwpOworfQorCisvKiBBcHBlbmQgcG93ZXIgb2Zmc2V0IHRvIGJpdHZlYyAqLworc3RhdGljIHZvaWQgYXBwZW5kX3Bvd2VyX29mZnNldChzdHJ1Y3QgYml0dmVjICpidiwKKwkJCQljb25zdCBzdHJ1Y3QgZ3NtNDhfc2lfcG93ZXJfb2Zmc2V0ICpwbykKK3sKKwlpZiAocG8tPnByZXNlbnQpIHsKKwkJYml0dmVjX3NldF9iaXQoYnYsIEgpOworCQliaXR2ZWNfc2V0X3VpbnQoYnYsIHBvLT5wb3dlcl9vZmZzZXQsIDIpOworCX0gZWxzZQorCQliaXR2ZWNfc2V0X2JpdChidiwgTCk7Cit9CisKKy8qIEFwcGVuZCBHUFJTIGluZGljYXRvciB0byBiaXR2ZWMgKi8KK3N0YXRpYyB2b2lkIGFwcGVuZF9ncHJzX2luZChzdHJ1Y3QgYml0dmVjICpidiwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgZ3NtNDhfc2kzX2dwcnNfaW5kICpnaSkKK3sKKwlpZiAoZ2ktPnByZXNlbnQpIHsKKwkJYml0dmVjX3NldF9iaXQoYnYsIEgpOworCQliaXR2ZWNfc2V0X3VpbnQoYnYsIGdpLT5yYV9jb2xvdXIsIDMpOworCQkvKiAwID09IFNJMTMgaW4gQkNDSCBOb3JtLCAxID09IFNJMTMgc2VudCBvbiBCQ0NIIEV4dCAqLworCQliaXR2ZWNfc2V0X2JpdChidiwgZ2ktPnNpMTNfcG9zaXRpb24pOworCX0gZWxzZQorCQliaXR2ZWNfc2V0X2JpdChidiwgTCk7Cit9CisKKworLyogR2VuZXJhdGUgU0kzIFJlc3QgT2N0ZXN0cyAoQ2hhcHRlciAxMC41LjIuMzQgLyBUYWJsZSAxMC40LjcyKSAqLworaW50IHJlc3Rfb2N0ZXRzX3NpMyh1X2ludDhfdCAqZGF0YSwgY29uc3Qgc3RydWN0IGdzbTQ4X3NpX3JvX2luZm8gKnNpMykKK3sKKwlzdHJ1Y3QgYml0dmVjIGJ2OworCisJbWVtc2V0KCZidiwgMCwgc2l6ZW9mKGJ2KSk7CisJYnYuZGF0YSA9IGRhdGE7CisJYnYuZGF0YV9sZW4gPSA0OworCisJLyogT3B0aW9uYWwgU2VsZWN0aW9uIFBhcmFtZXRlcnMgKi8KKwlhcHBlbmRfc2VsZWN0aW9uX3BhcmFtcygmYnYsICZzaTMtPnNlbGVjdGlvbl9wYXJhbXMpOworCisJLyogT3B0aW9uYWwgUG93ZXIgT2Zmc2V0ICovCisJYXBwZW5kX3Bvd2VyX29mZnNldCgmYnYsICZzaTMtPnBvd2VyX29mZnNldCk7CisKKwkvKiBEbyB3ZSBoYXZlIGEgU0kydGVyIG9uIHRoZSBCQ0NIPyAqLworCWlmIChzaTMtPnNpMnRlcl9pbmRpY2F0b3IpCisJCWJpdHZlY19zZXRfYml0KCZidiwgSCk7CisJZWxzZQorCQliaXR2ZWNfc2V0X2JpdCgmYnYsIEwpOworCisJLyogRWFybHkgQ2xhc3NtYXJrIFNlbmRpbmcgQ29udHJvbCAqLworCWlmIChzaTMtPmVhcmx5X2NtX2N0cmwpCisJCWJpdHZlY19zZXRfYml0KCZidiwgSCk7CisJZWxzZQorCQliaXR2ZWNfc2V0X2JpdCgmYnYsIEwpOworCisJLyogRG8gd2UgaGF2ZSBhIFNJIFR5cGUgOSBvbiB0aGUgQkNDSD8gKi8KKwlpZiAoc2kzLT5zY2hlZHVsaW5nLnByZXNlbnQpIHsKKwkJYml0dmVjX3NldF9iaXQoJmJ2LCBIKTsKKwkJYml0dmVjX3NldF91aW50KCZidiwgc2kzLT5zY2hlZHVsaW5nLndoZXJlLCAzKTsKKwl9IGVsc2UKKwkJYml0dmVjX3NldF9iaXQoJmJ2LCBMKTsKKworCS8qIEdQUlMgSW5kaWNhdG9yICovCisJYXBwZW5kX2dwcnNfaW5kKCZidiwgJnNpMy0+Z3Byc19pbmQpOworCisJYml0dmVjX3NwYXJlX3BhZGRpbmcoJmJ2LCAoYnYuZGF0YV9sZW4qOCktMSk7CisJcmV0dXJuIGJ2LmRhdGFfbGVuOworfQorCitzdGF0aWMgaW50IGFwcGVuZF9sc2FfcGFyYW1zKHN0cnVjdCBiaXR2ZWMgKmJ2LAorCQkJICAgICBjb25zdCBzdHJ1Y3QgZ3NtNDhfbHNhX3BhcmFtcyAqbHNhX3BhcmFtcykKK3sKKwkvKiBGSVhNRSAqLworfQorCisvKiBHZW5lcmF0ZSBTSTQgUmVzdCBPY3RldHMgKENoYXB0ZXIgMTAuNS4yLjM1KSAqLworaW50IHJlc3Rfb2N0ZXRzX3NpNCh1X2ludDhfdCAqZGF0YSwgY29uc3Qgc3RydWN0IGdzbTQ4X3NpX3JvX2luZm8gKnNpNCkKK3sKKwlzdHJ1Y3QgYml0dmVjIGJ2OworCisJbWVtc2V0KCZidiwgMCwgc2l6ZW9mKGJ2KSk7CisJYnYuZGF0YSA9IGRhdGE7CisJYnYuZGF0YV9sZW4gPSAxMDsgLyogRklYTUU6IHVwIHRvID8gKi8KKworCS8qIFNJNCBSZXN0IE9jdGV0cyBPICovCisJYXBwZW5kX3NlbGVjdGlvbl9wYXJhbXMoJmJ2LCAmc2k0LT5zZWxlY3Rpb25fcGFyYW1zKTsKKwlhcHBlbmRfcG93ZXJfb2Zmc2V0KCZidiwgJnNpNC0+cG93ZXJfb2Zmc2V0KTsKKwlhcHBlbmRfZ3Byc19pbmQoJmJ2LCAmc2k0LT5ncHJzX2luZCk7CisKKwlpZiAoMCAvKiBGSVhNRSAqLykgeworCQkvKiBIIGFuZCBTSTQgUmVzdCBPY3RldHMgUyAqLworCQliaXR2ZWNfc2V0X2JpdCgmYnYsIEgpOworCisJCS8qIExTQSBQYXJhbWV0ZXJzICovCisJCWlmIChzaTQtPmxzYV9wYXJhbXMucHJlc2VudCkgeworCQkJYml0dmVjX3NldF9iaXQoJmJ2LCBIKTsKKwkJCWFwcGVuZF9sc2FfcGFyYW1zKCZidiwgJnNpNC0+bHNhX3BhcmFtcyk7CisJCX0gZWxzZQorCQkJYml0dmVjX3NldF9iaXQoJmJ2LCBMKTsKKworCQkvKiBDZWxsIElkZW50aXR5ICovCisJCWlmICgxKSB7CisJCQliaXR2ZWNfc2V0X2JpdCgmYnYsIEgpOworCQkJYml0dmVjX3NldF91aW50KCZidiwgc2k0LT5jZWxsX2lkLCAxNik7CisJCX0gZWxzZQorCQkJYml0dmVjX3NldF9iaXQoJmJ2LCBMKTsKKworCQkvKiBMU0EgSUQgSW5mb3JtYXRpb24gKi8KKwkJaWYgKDApIHsKKwkJCWJpdHZlY19zZXRfYml0KCZidiwgSCk7CisJCQkvKiBGSVhNRSAqLworCQl9IGVsc2UKKwkJCWJpdHZlY19zZXRfYml0KCZidiwgTCk7CisJfSBlbHNlIHsKKwkJLyogTCBhbmQgYnJlYWsgaW5kaWNhdG9yICovCisJCWJpdHZlY19zZXRfYml0KCZidiwgTCk7CisJCWJpdHZlY19zZXRfYml0KCZidiwgc2k0LT5icmVha19pbmQgPyBIIDogTCk7CisJfQorCisJcmV0dXJuIGJ2LmRhdGFfbGVuOworfQorCisvKiBHUFJTIE1vYmlsZSBBbGxvY2F0aW9uIGFzIHBlciBUUyAwNC42MCBDaGFwdGVyIDEyLjEwYToKKyAgIDwgR1BSUyBNb2JpbGUgQWxsb2NhdGlvbiBJRSA+IDo6PQorICAgICA8IEhTTiA6IGJpdCAoNikgPgorICAgICB7IDAgfCAxIDwgUkZMIG51bWJlciBsaXN0IDogPCBSRkwgbnVtYmVyIGxpc3Qgc3RydWN0ID4gPiB9CisgICAgIHsgMCA8IE1BX0xFTkdUSCA6IGJpdCAoNikgPgorICAgICAgICAgPCBNQV9CSVRNQVA6IGJpdCAodmFsKE1BX0xFTkdUSCkgKyAxKSA+CisgICAgIHwgMSB7IDAgfCAxIDxBUkZDTiBpbmRleCBsaXN0IDogPCBBUkZDTiBpbmRleCBsaXN0IHN0cnVjdCA+ID4gfSB9IDsKKworICAgICA8IFJGTCBudW1iZXIgbGlzdCBzdHJ1Y3QgPiA6OiA9CisgICAgICAgPCBSRkxfTlVNQkVSIDogYml0ICg0KSA+CisgICAgICAgeyAwIHwgMSA8IFJGTCBudW1iZXIgbGlzdCBzdHJ1Y3QgPiB9IDsKKyAgICAgPCBBUkZDTiBpbmRleCBsaXN0IHN0cnVjdCA+IDo6PQorICAgICAgIDwgQVJGQ05fSU5ERVggOiBiaXQoNikgPgorICAgICAgIHsgMCB8IDEgPCBBUkZDTiBpbmRleCBsaXN0IHN0cnVjdCA+IH0gOworICovCitzdGF0aWMgaW50IGFwcGVuZF9ncHJzX21vYmlsZV9hbGxvYyhzdHJ1Y3QgYml0dmVjICpidikKK3sKKwkvKiBIb3BwaW5nIFNlcXVlbmNlIE51bWJlciAqLworCWJpdHZlY19zZXRfdWludChidiwgMCwgNik7CisKKwlpZiAoMCkgeworCQkvKiBXZSB3YW50IHRvIHVzZSBhIFJGTCBudW1iZXIgbGlzdCAqLworCQliaXR2ZWNfc2V0X2JpdChidiwgMSk7CisJCS8qIEZJWE1FOiBSRkwgbnVtYmVyIGxpc3QgKi8KKwl9IGVsc2UKKwkJYml0dmVjX3NldF9iaXQoYnYsIDApOworCisJaWYgKDApIHsKKwkJLyogV2Ugd2FudCB0byB1c2UgYSBNQV9CSVRNQVAgKi8KKwkJYml0dmVjX3NldF9iaXQoYnYsIDApOworCQkvKiBGSVhNRTogTUFfTEVOR1RILCBNQV9CSVRNQVAsIC4uLiAqLworCX0gZWxzZSB7CisJCWJpdHZlY19zZXRfYml0KGJ2LCAxKTsKKwkJaWYgKDApIHsKKwkJCS8qIFdlIHdhbnQgdG8gcHJvdmlkZSBhbiBBUkZDTiBpbmRleCBsaXN0ICovCisJCQliaXR2ZWNfc2V0X2JpdChidiwgMSk7CisJCQkvKiBGSVhNRSAqLworCQl9IGVsc2UKKwkJCWJpdHZlY19zZXRfYml0KGJ2LCAwKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW5jb2RlX3QzMTkyKHVuc2lnbmVkIGludCB0MzE5MikKK3sKKwlpZiAodDMxOTIgPT0gMCkKKwkJcmV0dXJuIDM7CisJZWxzZSBpZiAodDMxOTIgPD0gODApCisJCXJldHVybiA0OworCWVsc2UgaWYgKHQzMTkyIDw9IDEyMCkKKwkJcmV0dXJuIDU7CisJZWxzZSBpZiAodDMxOTIgPD0gMTYwKQorCQlyZXR1cm4gNjsKKwllbHNlIGlmICh0MzE5MiA8PSAyMDApCisJCXJldHVybiA3OworCWVsc2UgaWYgKHQzMTkyIDw9IDUwMCkKKwkJcmV0dXJuIDA7CisJZWxzZSBpZiAodDMxOTIgPD0gMTAwMCkKKwkJcmV0dXJuIDE7CisJZWxzZSBpZiAodDMxOTIgPD0gMTUwMCkKKwkJcmV0dXJuIDI7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBlbmNvZGVfZHJ4X3RpbWVyKHVuc2lnbmVkIGludCBkcngpCit7CisJaWYgKGRyeCA9PSAwKQorCQlyZXR1cm4gMDsKKwllbHNlIGlmIChkcnggPT0gMSkKKwkJcmV0dXJuIDE7CisJZWxzZSBpZiAoZHJ4ID09IDIpCisJCXJldHVybiAyOworCWVsc2UgaWYgKGRyeCA8PSA0KQorCQlyZXR1cm4gMzsKKwllbHNlIGlmIChkcnggPD0gOCkKKwkJcmV0dXJuIDQ7CisJZWxzZSBpZiAoZHJ4IDw9IDE2KQorCQlyZXR1cm4gNTsKKwllbHNlIGlmIChkcnggPD0gMzIpCisJCXJldHVybiA2OworCWVsc2UgaWYgKGRyeCA8PSA2NCkKKwkJcmV0dXJuIDc7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKK30KKworLyogR1BSUyBDZWxsIE9wdGlvbnMgYXMgcGVyIFRTIDA0LjYwIENoYXB0ZXIgMTIuMjQKKwk8IEdQUlMgQ2VsbCBPcHRpb25zIElFID4gOjo9CisJCTwgTk1PIDogYml0KDIpID4KKwkJPCBUMzE2OCA6IGJpdCgzKSA+CisJCTwgVDMxOTIgOiBiaXQoMykgPgorCQk8IERSWF9USU1FUl9NQVg6IGJpdCgzKSA+CisJCTwgQUNDRVNTX0JVUlNUX1RZUEU6IGJpdCA+CisJCTwgQ09OVFJPTF9BQ0tfVFlQRSA6IGJpdCA+CisJCTwgQlNfQ1ZfTUFYOiBiaXQoNCkgPgorCQl7IDAgfCAxIDwgUEFOX0RFQyA6IGJpdCgzKSA+CisJCQk8IFBBTl9JTkMgOiBiaXQoMykgPgorCQkJPCBQQU5fTUFYIDogYml0KDMpID4KKwkJeyAwIHwgMSA8IEV4dGVuc2lvbiBMZW5ndGggOiBiaXQoNikgPgorCQkJPCBiaXQgKHZhbChFeHRlbnNpb24gTGVuZ3RoKSArIDEKKwkJCSYgeyA8IEV4dGVuc2lvbiBJbmZvcm1hdGlvbiA+ICEgeyBiaXQgKiogPSA8bm8gc3RyaW5nPiB9IH0gOworCTwgRXh0ZW5zaW9uIEluZm9ybWF0aW9uID4gOjo9CisJCXsgMCB8IDEgPCBFR1BSU19QQUNLRVRfQ0hBTk5FTF9SRVFVRVNUIDogYml0ID4KKwkJCTwgQkVQX1BFUklPRCA6IGJpdCg0KSA+IH0KKwkJPCBQRkNfRkVBVFVSRV9NT0RFIDogYml0ID4KKwkJPCBEVE1fU1VQUE9SVCA6IGJpdCA+CisJCTxCU1NfUEFHSU5HX0NPT1JESU5BVElPTjogYml0ID4KKwkJPHNwYXJlIGJpdCA+ICoqIDsKKyAqLworc3RhdGljIGludCBhcHBlbmRfZ3Byc19jZWxsX29wdChzdHJ1Y3QgYml0dmVjICpidiwKKwkJCQljb25zdCBzdHJ1Y3QgZ3Byc19jZWxsX29wdGlvbnMgKmdjbykKK3sKKwlpbnQgdDMxOTIsIGRyeF90aW1lcl9tYXg7CisKKwl0MzE5MiA9IGVuY29kZV90MzE5MihnY28tPnQzMTkyKTsKKwlpZiAodDMxOTIgPCAwKQorCQlyZXR1cm4gdDMxOTI7CisKKwlkcnhfdGltZXJfbWF4ID0gZW5jb2RlX2RyeF90aW1lcihnY28tPmRyeF90aW1lcl9tYXgpOworCWlmIChkcnhfdGltZXJfbWF4IDwgMCkKKwkJcmV0dXJuIGRyeF90aW1lcl9tYXg7CisKKwliaXR2ZWNfc2V0X3VpbnQoYnYsIGdjby0+bm1vLCAyKTsKKwliaXR2ZWNfc2V0X3VpbnQoYnYsIGdjby0+dDMxNjggLyA1MDAsIDMpOworCWJpdHZlY19zZXRfdWludChidiwgdDMxOTIsIDMpOworCWJpdHZlY19zZXRfdWludChidiwgZHJ4X3RpbWVyX21heCwgMyk7CisJLyogQUNDRVNTX0JVUlNUX1RZUEU6IEhhcmQtY29kZSA4Yml0ICovCisJYml0dmVjX3NldF9iaXQoYnYsIDApOworCS8qIENPTlRST0xfQUNLX1RZUEU6IEhhcmQtY29kZSB0byBSTEMvTUFDIGNvbnRyb2wgYmxvY2sgKi8KKwliaXR2ZWNfc2V0X2JpdChidiwgMSk7CisJYml0dmVjX3NldF91aW50KGJ2LCBnY28tPmJzX2N2X21heCwgNCk7CisKKwkvKiBoYXJkLWNvZGUgbm8gUEFOX3tERUMsSU5DLE1BWH0gKi8KKwliaXR2ZWNfc2V0X2JpdChidiwgMCk7CisKKwkvKiBubyBleHRlbnNpb24gaW5mb3JtYXRpb24gKEVER0UpICovCisJYml0dmVjX3NldF9iaXQoYnYsIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFwcGVuZF9ncHJzX3B3cl9jdHJsX3BhcnMoc3RydWN0IGJpdHZlYyAqYnYsCisJCQkJICAgICAgY29uc3Qgc3RydWN0IGdwcnNfcG93ZXJfY3RybF9wYXJzICpwY3ApCit7CisJYml0dmVjX3NldF91aW50KGJ2LCBwY3AtPmFscGhhLCA0KTsKKwliaXR2ZWNfc2V0X3VpbnQoYnYsIHBjcC0+dF9hdmdfdywgNSk7CisJYml0dmVjX3NldF91aW50KGJ2LCBwY3AtPnRfYXZnX3QsIDUpOworCWJpdHZlY19zZXRfdWludChidiwgcGNwLT5wY19tZWFzX2NoYW4sIDEpOworCWJpdHZlY19zZXRfdWludChidiwgcGNwLT5uX2F2Z19pLCA0KTsKK30KKworLyogR2VuZXJhdGUgU0kxMyBSZXN0IE9jdGVzdHMgKENoYXB0ZXIgMTAuNS4yLjM3YikgKi8KK2ludCByZXN0X29jdGV0c19zaTEzKHVfaW50OF90ICpkYXRhLCBjb25zdCBzdHJ1Y3QgZ3NtNDhfc2kxM19pbmZvICpzaTEzKQoreworCXN0cnVjdCBiaXR2ZWMgYnY7CisKKwltZW1zZXQoJmJ2LCAwLCBzaXplb2YoYnYpKTsKKwlidi5kYXRhID0gZGF0YTsKKwlidi5kYXRhX2xlbiA9IDIwOworCisJaWYgKDApIHsKKwkJLyogTm8gcmVzdCBvY3RldHMgKi8KKwkJYml0dmVjX3NldF9iaXQoJmJ2LCBMKTsKKwl9IGVsc2UgeworCQliaXR2ZWNfc2V0X2JpdCgmYnYsIEgpOworCQliaXR2ZWNfc2V0X3VpbnQoJmJ2LCBzaTEzLT5iY2NoX2NoYW5nZV9tYXJrLCAzKTsKKwkJYml0dmVjX3NldF91aW50KCZidiwgc2kxMy0+c2lfY2hhbmdlX2ZpZWxkLCA0KTsKKwkJaWYgKDEpIHsKKwkJCWJpdHZlY19zZXRfYml0KCZidiwgMCk7CisJCX0gZWxzZSB7CisJCQliaXR2ZWNfc2V0X2JpdCgmYnYsIDEpOworCQkJYml0dmVjX3NldF91aW50KCZidiwgc2kxMy0+YmNjaF9jaGFuZ2VfbWFyaywgMik7CisJCQlhcHBlbmRfZ3Byc19tb2JpbGVfYWxsb2MoJmJ2KTsKKwkJfQorCQlpZiAoIXNpMTMtPnBiY2NoX3ByZXNlbnQpIHsKKwkJCS8qIFBCQ0NIIG5vdCBwcmVzZW50IGluIGNlbGwgKi8KKwkJCWJpdHZlY19zZXRfYml0KCZidiwgMCk7CisJCQliaXR2ZWNfc2V0X3VpbnQoJmJ2LCBzaTEzLT5ub19wYmNjaC5yYWMsIDgpOworCQkJYml0dmVjX3NldF9iaXQoJmJ2LCBzaTEzLT5ub19wYmNjaC5zcGdjX2NjY2hfc3VwKTsKKwkJCWJpdHZlY19zZXRfdWludCgmYnYsIHNpMTMtPm5vX3BiY2NoLnByaW9fYWNjX3RociwgMyk7CisJCQliaXR2ZWNfc2V0X3VpbnQoJmJ2LCBzaTEzLT5ub19wYmNjaC5uZXRfY3RybF9vcmQsIDIpOworCQkJYXBwZW5kX2dwcnNfY2VsbF9vcHQoJmJ2LCAmc2kxMy0+Y2VsbF9vcHRzKTsKKwkJCWFwcGVuZF9ncHJzX3B3cl9jdHJsX3BhcnMoJmJ2LCAmc2kxMy0+cHdyX2N0cmxfcGFycyk7CisJCX0gZWxzZSB7CisJCQkvKiBQQkNDSCBwcmVzZW50IGluIGNlbGwgKi8KKwkJCWJpdHZlY19zZXRfYml0KCZidiwgMSk7CisJCQliaXR2ZWNfc2V0X3VpbnQoJmJ2LCBzaTEzLT5wYmNjaC5wc2kxX3JlcF9wZXIsIDQpOworCQkJLyogUEJDQ0ggRGVzY3JpcGl0b24gKi8KKwkJCWJpdHZlY19zZXRfdWludCgmYnYsIHNpMTMtPnBiY2NoLnBiLCA0KTsKKwkJCWJpdHZlY19zZXRfdWludCgmYnYsIHNpMTMtPnBiY2NoLnRzYywgMyk7CisJCQliaXR2ZWNfc2V0X3VpbnQoJmJ2LCBzaTEzLT5wYmNjaC50biwgMyk7CisJCQlzd2l0Y2ggKHNpMTMtPnBiY2NoLmNhcnJpZXJfdHlwZSkgeworCQkJY2FzZSBQQkNDSF9CQ0NIOgorCQkJCWJpdHZlY19zZXRfYml0KCZidiwgMCk7CisJCQkJYml0dmVjX3NldF9iaXQoJmJ2LCAwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUEJDQ0hfQVJGQ046CisJCQkJYml0dmVjX3NldF9iaXQoJmJ2LCAwKTsKKwkJCQliaXR2ZWNfc2V0X2JpdCgmYnYsIDEpOworCQkJCWJpdHZlY19zZXRfdWludCgmYnYsIHNpMTMtPnBiY2NoLmFyZmNuLCAxMCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFBCQ0NIX01BSU86CisJCQkJYml0dmVjX3NldF9iaXQoJmJ2LCAxKTsKKwkJCQliaXR2ZWNfc2V0X3VpbnQoJmJ2LCBzaTEzLT5wYmNjaC5tYWlvLCA2KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwliaXR2ZWNfc3BhcmVfcGFkZGluZygmYnYsIChidi5kYXRhX2xlbio4KS0xKTsKKwlyZXR1cm4gYnYuZGF0YV9sZW47Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9ycmxwLmMgYi9vcGVuYnNjL3NyYy9ycmxwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUwNDQ1MQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3JybHAuYwpAQCAtMCwwICsxLDEwNiBAQAorLyogUmFkaW8gUmVzb3VyY2UgTENTIChMb2NhdGlvbikgUHJvdG9jb2wsIEdNUyBUUyAwNC4zMSAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzA4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9zdWJzY3JpYmVyLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9jaGFuX2FsbG9jLmg+CisKKy8qIFJSTFAgbXNQb3NpdGlvblJlcSwgbnNCYXNlZCwKKyAqCUFjY3VyYWN5PTYwLCBNZXRob2Q9Z3BzLCBSZXNwb25zZVRpbWU9Miwgb25lU2V0ICovCitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgbXNfYmFzZWRfcG9zX3JlcVtdID0geyAweDQwLCAweDAxLCAweDc4LCAweGE4IH07CisKKy8qIFJSTFAgbXNQb3NpdGlvblJlcSwgbXNCYXNlZFByZWYsCisJQWNjdXJhY3k9NjAsIE1ldGhvZD1ncHNPckVPVEQsIFJlc3BvbnNlVGltZT01LCBtdWx0aXBsZVNldHMgKi8KK3N0YXRpYyBjb25zdCB1X2ludDhfdCBtc19wcmVmX3Bvc19yZXFbXSAgPSB7IDB4NDAsIDB4MDIsIDB4NzksIDB4NTAgfTsKKworLyogUlJMUCBtc1Bvc2l0aW9uUmVxLCBtc0Fzc2lzdGVkUHJlZiwKKwlBY2N1cmFjeT02MCwgTWV0aG9kPWdwc09yRU9URCwgUmVzcG9uc2VUaW1lPTUsIG11bHRpcGxlU2V0cyAqLworc3RhdGljIGNvbnN0IHVfaW50OF90IGFzc19wcmVmX3Bvc19yZXFbXSA9IHsgMHg0MCwgMHgwMywgMHg3OSwgMHg1MCB9OworCitzdGF0aWMgaW50IHNlbmRfcnJscF9yZXEoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBsY2hhbi0+dHMtPnRyeC0+YnRzLT5uZXR3b3JrOworCWNvbnN0IHVfaW50OF90ICpyZXE7CisKKwlzd2l0Y2ggKG5ldC0+cnJscC5tb2RlKSB7CisJY2FzZSBSUkxQX01PREVfTVNfQkFTRUQ6CisJCXJlcSA9IG1zX2Jhc2VkX3Bvc19yZXE7CisJCWJyZWFrOworCWNhc2UgUlJMUF9NT0RFX01TX1BSRUY6CisJCXJlcSA9IG1zX3ByZWZfcG9zX3JlcTsKKwkJYnJlYWs7CisJY2FzZSBSUkxQX01PREVfQVNTX1BSRUY6CisJCXJlcSA9IGFzc19wcmVmX3Bvc19yZXE7CisJCWJyZWFrOworCWNhc2UgUlJMUF9NT0RFX05PTkU6CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIGdzbTQ4X3NlbmRfcnJfYXBwX2luZm8obGNoYW4sIDB4MDAsCisJCQkJICAgICAgc2l6ZW9mKG1zX2Jhc2VkX3Bvc19yZXEpLCByZXEpOworfQorCitzdGF0aWMgaW50IHN1YnNjcl9zaWdfY2IodW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IHNpZ25hbCwKKwkJCSB2b2lkICpoYW5kbGVyX2RhdGEsIHZvaWQgKnNpZ25hbF9kYXRhKQoreworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyOworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuOworCisJc3dpdGNoIChzaWduYWwpIHsKKwljYXNlIFNfU1VCU0NSX0FUVEFDSEVEOgorCQkvKiBBIHN1YnNjcmliZXIgaGFzIGF0dGFjaGVkLiAqLworCQlzdWJzY3IgPSBzaWduYWxfZGF0YTsKKwkJbGNoYW4gPSBsY2hhbl9mb3Jfc3Vic2NyKHN1YnNjcik7CisJCWlmICghbGNoYW4pCisJCQlicmVhazsKKwkJc2VuZF9ycmxwX3JlcShsY2hhbik7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYWdpbmdfc2lnX2NiKHVuc2lnbmVkIGludCBzdWJzeXMsIHVuc2lnbmVkIGludCBzaWduYWwsCisJCQkgdm9pZCAqaGFuZGxlcl9kYXRhLCB2b2lkICpzaWduYWxfZGF0YSkKK3sKKwlzdHJ1Y3QgcGFnaW5nX3NpZ25hbF9kYXRhICpwc2lnX2RhdGEgPSBzaWduYWxfZGF0YTsKKworCXN3aXRjaCAoc2lnbmFsKSB7CisJY2FzZSBTX1BBR0lOR19TVUNDRUVERUQ6CisJCS8qIEEgc3Vic2NyaWJlciBoYXMgYXR0YWNoZWQuICovCisJCXNlbmRfcnJscF9yZXEocHNpZ19kYXRhLT5sY2hhbik7CisJCWJyZWFrOworCWNhc2UgU19QQUdJTkdfRVhQSVJFRDoKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCit2b2lkIG9uX2Rzb19sb2FkX3JybHAodm9pZCkKK3sKKwlyZWdpc3Rlcl9zaWduYWxfaGFuZGxlcihTU19TVUJTQ1IsIHN1YnNjcl9zaWdfY2IsIE5VTEwpOworCXJlZ2lzdGVyX3NpZ25hbF9oYW5kbGVyKFNTX1BBR0lORywgcGFnaW5nX3NpZ19jYiwgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9yczIzMi5jIGIvb3BlbmJzYy9zcmMvcnMyMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmFmNTljCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvcnMyMzIuYwpAQCAtMCwwICsxLDI0OSBAQAorLyogT3BlbkJTQyBCUy0xMSBULUxpbmsgaW50ZXJmYWNlIHVzaW5nIFBPU0lYIHNlcmlhbCBwb3J0ICovCisKKy8qIChDKSAyMDA4LTIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvcnMyMzIuaD4KKworLyogYWRhcHRpb24gbGF5ZXIgZnJvbSBHU00gMDguNTkgKyAxMi4yMSB0byBSUzIzMiAqLworCitzdHJ1Y3Qgc2VyaWFsX2hhbmRsZSB7CisJc3RydWN0IGJzY19mZCBmZDsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCB0eF9xdWV1ZTsKKworCXN0cnVjdCBtc2diICpyeF9tc2c7CisJdW5zaWduZWQgaW50IHJ4bXNnX2J5dGVzX21pc3Npbmc7CisKKwl1bnNpZ25lZCBpbnQgZGVsYXlfbXM7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKK307CisKKy8qIEZJWE1FOiB0aGlzIG5lZWRzIHRvIGdvICovCitzdGF0aWMgc3RydWN0IHNlcmlhbF9oYW5kbGUgX3Nlcl9oYW5kbGUsICpzZXJfaGFuZGxlID0gJl9zZXJfaGFuZGxlOworCisjZGVmaW5lIExBUERfSERSX0xFTgkxMAorCitzdGF0aWMgaW50IGhhbmRsZV9zZXJfd3JpdGUoc3RydWN0IGJzY19mZCAqYmZkKTsKKworLyogY2FsbGJhY2sgZnJvbSBhYmlzX25tICovCitpbnQgX2FiaXNfbm1fc2VuZG1zZyhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBzZXJpYWxfaGFuZGxlICpzaCA9IHNlcl9oYW5kbGU7CisJdV9pbnQ4X3QgKmxhcGQ7CisJdW5zaWduZWQgaW50IGxlbjsKKworCW1zZy0+bDJoID0gbXNnLT5kYXRhOworCisJLyogcHJlcGVuZCBMQVBEIGhlYWRlciAqLworCWxhcGQgPSBtc2diX3B1c2gobXNnLCBMQVBEX0hEUl9MRU4pOworCisJbGVuID0gbXNnLT5sZW4gLSAyOworCisJbGFwZFswXSA9IChsZW4gPj4gOCkgJiAweGZmOworCWxhcGRbMV0gPSBsZW4gJiAweGZmOyAvKiBsZW5ndGggb2YgYnl0ZXMgc3RhcnRpZ24gYXQgbGFwZFsyXSAqLworCWxhcGRbMl0gPSAweDAwOworCWxhcGRbM10gPSAweDA3OworCWxhcGRbNF0gPSAweDAxOworCWxhcGRbNV0gPSAweDNlOworCWxhcGRbNl0gPSAweDAwOworCWxhcGRbN10gPSAweDAwOworCWxhcGRbOF0gPSBtc2ctPmxlbiAtIDEwOyAvKiBsZW5ndGggb2YgYnl0ZXMgc3RhcnRpbmcgYXQgbGFwZFsxMF0gKi8KKwlsYXBkWzldID0gbGFwZFs4XSBeIDB4Mzg7CisKKwltc2diX2VucXVldWUoJnNoLT50eF9xdWV1ZSwgbXNnKTsKKwlzaC0+ZmQud2hlbiB8PSBCU0NfRkRfV1JJVEU7CisKKwkvKiB3ZSB0cnkgdG8gaW1tZWRpYXRlbHkgc2VuZCAqLworCWhhbmRsZV9zZXJfd3JpdGUoJnNoLT5mZCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogc2VsZWN0LmMgY2FsbGJhY2sgaW4gY2FzZSB3ZSBjYW4gd3JpdGUgdG8gdGhlIFJTMjMyICovCitzdGF0aWMgaW50IGhhbmRsZV9zZXJfd3JpdGUoc3RydWN0IGJzY19mZCAqYmZkKQoreworCXN0cnVjdCBzZXJpYWxfaGFuZGxlICpzaCA9IGJmZC0+ZGF0YTsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCWludCB3cml0dGVuOworCisJbXNnID0gbXNnYl9kZXF1ZXVlKCZzaC0+dHhfcXVldWUpOworCWlmICghbXNnKSB7CisJCWJmZC0+d2hlbiAmPSB+QlNDX0ZEX1dSSVRFOworCQlyZXR1cm4gMDsKKwl9CisKKwlERUJVR1AoRE1JLCAiUlMyMzIgVFg6ICVzXG4iLCBoZXhkdW1wKG1zZy0+ZGF0YSwgbXNnLT5sZW4pKTsKKworCS8qIHNlbmQgb3ZlciBzZXJpYWwgbGluZSAqLworCXdyaXR0ZW4gPSB3cml0ZShiZmQtPmZkLCBtc2ctPmRhdGEsIG1zZy0+bGVuKTsKKwlpZiAod3JpdHRlbiA8IG1zZy0+bGVuKSB7CisJCXBlcnJvcigic2hvcnQgd3JpdGU6Iik7CisJCW1zZ2JfZnJlZShtc2cpOworCQlyZXR1cm4gLTE7CisJfQorCisJbXNnYl9mcmVlKG1zZyk7CisJdXNsZWVwKHNoLT5kZWxheV9tcyoxMDAwKTsKKworCXJldHVybiAwOworfQorCisjZGVmaW5lIFNFUklBTF9BTExPQ19TSVpFCTMwMAorCisvKiBzZWxlY3QuYyBjYWxsYmFjayBpbiBjYXNlIHdlIGNhbiByZWFkIGZyb20gdGhlIFJTMjMyICovCitzdGF0aWMgaW50IGhhbmRsZV9zZXJfcmVhZChzdHJ1Y3QgYnNjX2ZkICpiZmQpCit7CisJc3RydWN0IHNlcmlhbF9oYW5kbGUgKnNoID0gYmZkLT5kYXRhOworCXN0cnVjdCBtc2diICptc2c7CisJaW50IHJjID0gMDsKKworCWlmICghc2gtPnJ4X21zZykgeworCQlzaC0+cnhfbXNnID0gbXNnYl9hbGxvYyhTRVJJQUxfQUxMT0NfU0laRSwgIlJTMjMyIFJ4Iik7CisJCXNoLT5yeF9tc2ctPmwyaCA9IE5VTEw7CisJCXNoLT5yeF9tc2ctPnRyeCA9IHNoLT5idHMtPmMwOworCX0KKwltc2cgPSBzaC0+cnhfbXNnOworCisJLyogZmlyc3QgcmVhZCB0d28gYnllcyB0byBvYnRhaW4gbGVuZ3RoICovCisJaWYgKG1zZy0+bGVuIDwgMikgeworCQlyYyA9IHJlYWQoc2gtPmZkLmZkLCBtc2ctPnRhaWwsIDIgLSBtc2ctPmxlbik7CisJCWlmIChyYyA8IDApIHsKKwkJCXBlcnJvcigiRVJST1IgcmVhZGluZyBmcm9tIHNlcmlhbCBwb3J0Iik7CisJCQltc2diX2ZyZWUobXNnKTsKKwkJCXJldHVybiByYzsKKwkJfQorCQltc2diX3B1dChtc2csIHJjKTsKKworCQlpZiAobXNnLT5sZW4gPj0gMikgeworCQkJLyogcGFyc2UgTEFQRCBwYXlsb2FkIGxlbmd0aCAqLworCQkJaWYgKG1zZy0+ZGF0YVswXSAhPSAwKQorCQkJCWZwcmludGYoc3RkZXJyLCAiU3VzcGljaW91cyBoZWFkZXIgYnl0ZSAwOiAweCUwMnhcbiIsCisJCQkJCW1zZy0+ZGF0YVswXSk7CisKKwkJCXNoLT5yeG1zZ19ieXRlc19taXNzaW5nID0gbXNnLT5kYXRhWzBdIDw8IDg7CisJCQlzaC0+cnhtc2dfYnl0ZXNfbWlzc2luZyArPSBtc2ctPmRhdGFbMV07CisKKwkJCWlmIChzaC0+cnhtc2dfYnl0ZXNfbWlzc2luZyA8IExBUERfSERSX0xFTiAtMikKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgbGVuZ3RoIGluIGhkcjogJXVcbiIsCisJCQkJCXNoLT5yeG1zZ19ieXRlc19taXNzaW5nKTsKKwkJfQorCX0gZWxzZSB7IAorCQkvKiB0cnkgdG8gcmVhZCBhcyBtYW55IG9mIHRoZSBtaXNzaW5nIGJ5dGVzIGFzIGFyZSBhdmFpbGFibGUgKi8KKwkJcmMgPSByZWFkKHNoLT5mZC5mZCwgbXNnLT50YWlsLCBzaC0+cnhtc2dfYnl0ZXNfbWlzc2luZyk7CisJCWlmIChyYyA8IDApIHsKKwkJCXBlcnJvcigiRVJST1IgcmVhZGluZyBmcm9tIHNlcmlhbCBwb3J0Iik7CisJCQltc2diX2ZyZWUobXNnKTsKKwkJCXJldHVybiByYzsKKwkJfQorCQltc2diX3B1dChtc2csIHJjKTsKKwkJc2gtPnJ4bXNnX2J5dGVzX21pc3NpbmcgLT0gcmM7CisKKwkJaWYgKHNoLT5yeG1zZ19ieXRlc19taXNzaW5nID09IDApIHsKKwkJCS8qIHdlIGhhdmUgb25lIGNvbXBsZXRlIG1lc3NhZ2Ugbm93ICovCisJCQlzaC0+cnhfbXNnID0gTlVMTDsKKworCQkJaWYgKG1zZy0+bGVuID4gTEFQRF9IRFJfTEVOKQorCQkJCW1zZy0+bDJoID0gbXNnLT5kYXRhICsgTEFQRF9IRFJfTEVOOworCisJCQlERUJVR1AoRE1JLCAiUlMyMzIgUlg6ICVzXG4iLCBoZXhkdW1wKG1zZy0+ZGF0YSwgbXNnLT5sZW4pKTsKKwkJCXJjID0gaGFuZGxlX3NlcmlhbF9tc2cobXNnKTsKKwkJfQorCX0KKworCXJldHVybiByYzsKK30KKworLyogc2VsZWN0LmMgY2FsbGJhY2sgKi8KK3N0YXRpYyBpbnQgc2VyaWFsX2ZkX2NiKHN0cnVjdCBic2NfZmQgKmJmZCwgdW5zaWduZWQgaW50IHdoYXQpCit7CisJaW50IHJjID0gMDsKKworCWlmICh3aGF0ICYgQlNDX0ZEX1JFQUQpCisJCXJjID0gaGFuZGxlX3Nlcl9yZWFkKGJmZCk7CisKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlpZiAod2hhdCAmIEJTQ19GRF9XUklURSkKKwkJcmMgPSBoYW5kbGVfc2VyX3dyaXRlKGJmZCk7CisKKwlyZXR1cm4gcmM7Cit9CisKK2ludCByczIzMl9zZXR1cChjb25zdCBjaGFyICpzZXJpYWxfcG9ydCwgdW5zaWduZWQgaW50IGRlbGF5X21zLAorCQlzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCWludCByYywgc2VyaWFsX2ZkOworCXN0cnVjdCB0ZXJtaW9zIHRpbzsKKworCXNlcmlhbF9mZCA9IG9wZW4oc2VyaWFsX3BvcnQsIE9fUkRXUik7CisJaWYgKHNlcmlhbF9mZCA8IDApIHsKKwkJcGVycm9yKCJjYW5ub3Qgb3BlbiBzZXJpYWwgcG9ydDoiKTsKKwkJcmV0dXJuIHNlcmlhbF9mZDsKKwl9CisKKwkvKiBzZXQgYmF1ZHJhdGUgKi8KKwlyYyA9IHRjZ2V0YXR0cihzZXJpYWxfZmQsICZ0aW8pOworCWlmIChyYyA8IDApIHsKKwkJcGVycm9yKCJ0Y2dldGF0dHIoKSIpOworCQlyZXR1cm4gcmM7CisJfQorCWNmc2V0aXNwZWVkKCZ0aW8sIEIxOTIwMCk7CisJY2ZzZXRvc3BlZWQoJnRpbywgQjE5MjAwKTsKKwl0aW8uY19jZmxhZyB8PSAgKENSRUFEIHwgQ0xPQ0FMIHwgQ1M4KTsKKwl0aW8uY19jZmxhZyAmPSB+KFBBUkVOQiB8IENTVE9QQiB8IENTSVpFIHwgQ1JUU0NUUyk7CisJdGlvLmNfbGZsYWcgJj0gfihJQ0FOT04gfCBFQ0hPIHwgRUNIT0UgfCBJU0lHKTsKKwl0aW8uY19pZmxhZyB8PSAgKElOUENLIHwgSVNUUklQKTsKKwl0aW8uY19pZmxhZyAmPSB+KElTVFJJUCB8IElYT04gfCBJWE9GRiB8IElHTkJSSyB8IElOTENSIHwgSUNSTkwgfCBJR05DUik7CisJdGlvLmNfb2ZsYWcgJj0gfihPUE9TVCk7CisJcmMgPSB0Y3NldGF0dHIoc2VyaWFsX2ZkLCBUQ1NBRFJBSU4sICZ0aW8pOworCWlmIChyYyA8IDApIHsKKwkJcGVycm9yKCJ0Y3NldGF0dHIoKSIpOworCQlyZXR1cm4gcmM7CisJfQorCisJSU5JVF9MTElTVF9IRUFEKCZzZXJfaGFuZGxlLT50eF9xdWV1ZSk7CisJc2VyX2hhbmRsZS0+ZmQuZmQgPSBzZXJpYWxfZmQ7CisJc2VyX2hhbmRsZS0+ZmQud2hlbiA9IEJTQ19GRF9SRUFEOworCXNlcl9oYW5kbGUtPmZkLmNiID0gc2VyaWFsX2ZkX2NiOworCXNlcl9oYW5kbGUtPmZkLmRhdGEgPSBzZXJfaGFuZGxlOworCXNlcl9oYW5kbGUtPmRlbGF5X21zID0gZGVsYXlfbXM7CisJc2VyX2hhbmRsZS0+YnRzID0gYnRzOworCXJjID0gYnNjX3JlZ2lzdGVyX2ZkKCZzZXJfaGFuZGxlLT5mZCk7CisJaWYgKHJjIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCByZWdpc3RlciBGRDogJXNcbiIsCisJCQlzdHJlcnJvcihyYykpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9ydHBfcHJveHkuYyBiL29wZW5ic2Mvc3JjL3J0cF9wcm94eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMmUyZmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9ydHBfcHJveHkuYwpAQCAtMCwwICsxLDcyNCBAQAorLyogUlRQIHByb3h5IGhhbmRsaW5nIGZvciBpcC5hY2Nlc3MgbmFub0JUUyAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxlbmRpYW4uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4gICAgLyogZ2V0dGltZW9mZGF5KCkgKi8KKyNpbmNsdWRlIDx1bmlzdGQuaD4gICAgICAvKiBnZXQuLigpICovCisjaW5jbHVkZSA8dGltZS5oPiAgICAgICAgLyogY2xvY2soKSAqLworI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+IC8qIHVuYW1lKCkgKi8KKworI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvcnRwX3Byb3h5Lmg+CisKK3N0YXRpYyBMTElTVF9IRUFEKHJ0cF9zb2NrZXRzKTsKKworLyogc2hvdWxkIHdlIG1hbmdsZSB0aGUgQ05BTUUgaW5zaWRlIFNERVMgb2YgUlRDUCBwYWNrZXRzPyBXZSBkaXNhYmxlCisgKiB0aGlzIGJ5IGRlZmF1bHQsIGFzIGl0IHNlZW1zIHRvIGJlIG5vdCBuZWVkZWQgKi8KK3N0YXRpYyBpbnQgbWFuZ2xlX3J0Y3BfY25hbWUgPSAwOworCitlbnVtIHJ0cF9iZmRfcHJpdiB7CisJUlRQX1BSSVZfTk9ORSwKKwlSVFBfUFJJVl9SVFAsCisJUlRQX1BSSVZfUlRDUAorfTsKKworI2RlZmluZSBSVFBfQUxMT0NfU0laRQkxNTAwCisKKy8qIGFjY29yZGluZyB0byBSRkMgMTg4OSAqLworc3RydWN0IHJ0Y3BfaGRyIHsKKwl1X2ludDhfdCBieXRlMDsKKwl1X2ludDhfdCB0eXBlOworCXVfaW50MTZfdCBsZW5ndGg7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjZGVmaW5lIFJUQ1BfVFlQRV9TREVTCTIwMgorCQorI2RlZmluZSBSVENQX0lFX0NOQU1FCTEKKworLyogYWNjb3JkaW5nIHRvIFJGQyAzNTUwICovCitzdHJ1Y3QgcnRwX2hkciB7CisjaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorCXVfaW50OF90ICBjc3JjX2NvdW50OjQsCisJCSAgZXh0ZW5zaW9uOjEsCisJCSAgcGFkZGluZzoxLAorCQkgIHZlcnNpb246MjsKKwl1X2ludDhfdCAgcGF5bG9hZF90eXBlOjcsCisJCSAgbWFya2VyOjE7CisjZWxpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisJdV9pbnQ4X3QgIHZlcnNpb246MiwKKwkJICBwYWRkaW5nOjEsCisJCSAgZXh0ZW5zaW9uOjEsCisJCSAgY3NyY19jb3VudDo0OworCXVfaW50OF90ICBtYXJrZXI6MSwKKwkJICBwYXlsb2FkX3R5cGU6NzsKKyNlbmRpZgorCXVfaW50MTZfdCBzZXF1ZW5jZTsKKwl1X2ludDMyX3QgdGltZXN0YW1wOworCXVfaW50MzJfdCBzc3JjOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHJ0cF94X2hkciB7CisJdV9pbnQxNl90IGJ5X3Byb2ZpbGU7CisJdV9pbnQxNl90IGxlbmd0aDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyNkZWZpbmUgUlRQX1ZFUlNJT04JMgorCisjZGVmaW5lIFJUUF9QVF9HU01fRlVMTAkzCisjZGVmaW5lIFJUUF9QVF9HU01fRUZSCTk3CisKKy8qIGRlY29kZSBhbiBydHAgZnJhbWUgYW5kIGNyZWF0ZSBhIG5ldyBidWZmZXIgd2l0aCBwYXlsb2FkICovCitzdGF0aWMgaW50IHJ0cF9kZWNvZGUoc3RydWN0IG1zZ2IgKm1zZywgdV9pbnQzMl90IGNhbGxyZWYsIHN0cnVjdCBtc2diICoqZGF0YSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbmV3X21zZzsKKwlzdHJ1Y3QgZ3NtX2RhdGFfZnJhbWUgKmZyYW1lOworCXN0cnVjdCBydHBfaGRyICpydHBoID0gKHN0cnVjdCBydHBfaGRyICopbXNnLT5kYXRhOworCXN0cnVjdCBydHBfeF9oZHIgKnJ0cHhoOworCXVfaW50OF90ICpwYXlsb2FkOworCWludCBwYXlsb2FkX2xlbjsKKwlpbnQgbXNnX3R5cGU7CisJaW50IHhfbGVuOworCisJaWYgKG1zZy0+bGVuIDwgMTIpIHsKKwkJREVCVUdQQyhETVVYLCAicmVjZWl2ZWQgUlRQIGZyYW1lIHRvbyBzaG9ydCAobGVuID0gJWQpXG4iLAorCQkJbXNnLT5sZW4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHJ0cGgtPnZlcnNpb24gIT0gUlRQX1ZFUlNJT04pIHsKKwkJREVCVUdQQyhETVVYLCAicmVjZWl2ZWQgUlRQIHZlcnNpb24gJWQgbm90IHN1cHBvcnRlZC5cbiIsCisJCQlydHBoLT52ZXJzaW9uKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXBheWxvYWQgPSBtc2ctPmRhdGEgKyBzaXplb2Yoc3RydWN0IHJ0cF9oZHIpICsgKHJ0cGgtPmNzcmNfY291bnQgPDwgMik7CisJcGF5bG9hZF9sZW4gPSBtc2ctPmxlbiAtIHNpemVvZihzdHJ1Y3QgcnRwX2hkcikgLSAocnRwaC0+Y3NyY19jb3VudCA8PCAyKTsKKwlpZiAocGF5bG9hZF9sZW4gPCAwKSB7CisJCURFQlVHUEMoRE1VWCwgInJlY2VpdmVkIFJUUCBmcmFtZSB0b28gc2hvcnQgKGxlbiA9ICVkLCAiCisJCQkiY3NyYyBjb3VudCA9ICVkKVxuIiwgbXNnLT5sZW4sIHJ0cGgtPmNzcmNfY291bnQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHJ0cGgtPmV4dGVuc2lvbikgeworCQlpZiAocGF5bG9hZF9sZW4gPCBzaXplb2Yoc3RydWN0IHJ0cF94X2hkcikpIHsKKwkJCURFQlVHUEMoRE1VWCwgInJlY2VpdmVkIFJUUCBmcmFtZSB0b28gc2hvcnQgZm9yICIKKwkJCQkiZXh0ZW5zaW9uIGhlYWRlclxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlydHB4aCA9IChzdHJ1Y3QgcnRwX3hfaGRyICopcGF5bG9hZDsKKwkJeF9sZW4gPSBudG9ocyhydHB4aC0+bGVuZ3RoKSAqIDQgKyBzaXplb2Yoc3RydWN0IHJ0cF94X2hkcik7CisJCXBheWxvYWQgKz0geF9sZW47CisJCXBheWxvYWRfbGVuIC09IHhfbGVuOworCQlpZiAocGF5bG9hZF9sZW4gPCAwKSB7CisJCQlERUJVR1BDKERNVVgsICJyZWNlaXZlZCBSVFAgZnJhbWUgdG9vIHNob3J0LCAiCisJCQkJImV4dGVuc2lvbiBoZWFkZXIgZXhjZWVkcyBmcmFtZSBsZW5ndGhcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisJaWYgKHJ0cGgtPnBhZGRpbmcpIHsKKwkJaWYgKHBheWxvYWRfbGVuIDwgMCkgeworCQkJREVCVUdQQyhETVVYLCAicmVjZWl2ZWQgUlRQIGZyYW1lIHRvbyBzaG9ydCBmb3IgIgorCQkJCSJwYWRkaW5nIGxlbmd0aFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlwYXlsb2FkX2xlbiAtPSBwYXlsb2FkW3BheWxvYWRfbGVuIC0gMV07CisJCWlmIChwYXlsb2FkX2xlbiA8IDApIHsKKwkJCURFQlVHUEMoRE1VWCwgInJlY2VpdmVkIFJUUCBmcmFtZSB3aXRoIHBhZGRpbmcgIgorCQkJCSJncmVhdGVyIHRoYW4gcGF5bG9hZFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCXN3aXRjaCAocnRwaC0+cGF5bG9hZF90eXBlKSB7CisJY2FzZSBSVFBfUFRfR1NNX0ZVTEw6CisJCW1zZ190eXBlID0gR1NNX1RDSEZfRlJBTUU7CisJCWlmIChwYXlsb2FkX2xlbiAhPSAzMykgeworCQkJREVCVUdQQyhETVVYLCAicmVjZWl2ZWQgUlRQIGZ1bGwgcmF0ZSBmcmFtZSB3aXRoICIKKwkJCQkicGF5bG9hZCBsZW5ndGggIT0gMzIgKGxlbiA9ICVkKVxuIiwKKwkJCQlwYXlsb2FkX2xlbik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwljYXNlIFJUUF9QVF9HU01fRUZSOgorCQltc2dfdHlwZSA9IEdTTV9UQ0hGX0ZSQU1FX0VGUjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJREVCVUdQQyhETVVYLCAicmVjZWl2ZWQgUlRQIGZyYW1lIHdpdGggdW5rbm93biBwYXlsb2FkICIKKwkJCSJ0eXBlICVkXG4iLCBydHBoLT5wYXlsb2FkX3R5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwluZXdfbXNnID0gbXNnYl9hbGxvYyhzaXplb2Yoc3RydWN0IGdzbV9kYXRhX2ZyYW1lKSArIHBheWxvYWRfbGVuLAorCQkJCSJHU00tREFUQSIpOworCWlmICghbmV3X21zZykKKwkJcmV0dXJuIC1FTk9NRU07CisJZnJhbWUgPSAoc3RydWN0IGdzbV9kYXRhX2ZyYW1lICopKG5ld19tc2ctPmRhdGEpOworCWZyYW1lLT5tc2dfdHlwZSA9IG1zZ190eXBlOworCWZyYW1lLT5jYWxscmVmID0gY2FsbHJlZjsKKwltZW1jcHkoZnJhbWUtPmRhdGEsIHBheWxvYWQsIHBheWxvYWRfbGVuKTsKKwltc2diX3B1dChuZXdfbXNnLCBzaXplb2Yoc3RydWN0IGdzbV9kYXRhX2ZyYW1lKSArIHBheWxvYWRfbGVuKTsKKworCSpkYXRhID0gbmV3X21zZzsKKwlyZXR1cm4gMDsKK30KKworLyogInRvIC0gZnJvbSIgKi8KK3N0YXRpYyB2b2lkIHR2X2RpZmZlcmVuY2Uoc3RydWN0IHRpbWV2YWwgKmRpZmYsIGNvbnN0IHN0cnVjdCB0aW1ldmFsICpmcm9tLAorCQkJICBjb25zdCBzdHJ1Y3QgdGltZXZhbCAqX190bykKK3sKKwlzdHJ1Y3QgdGltZXZhbCBfdG8gPSAqX190bywgKnRvID0gJl90bzsKKworCWlmICh0by0+dHZfdXNlYyA8IGZyb20tPnR2X3VzZWMpIHsKKwkJdG8tPnR2X3NlYyAtPSAxOworCQl0by0+dHZfdXNlYyArPSAxMDAwMDAwOworCX0KKworCWRpZmYtPnR2X3VzZWMgPSB0by0+dHZfdXNlYyAtIGZyb20tPnR2X3VzZWM7CisJZGlmZi0+dHZfc2VjID0gdG8tPnR2X3NlYyAtIGZyb20tPnR2X3NlYzsKK30KKworLyogZW5jb2RlIGFuZCBzZW5kIGEgcnRwIGZyYW1lICovCitpbnQgcnRwX3NlbmRfZnJhbWUoc3RydWN0IHJ0cF9zb2NrZXQgKnJzLCBzdHJ1Y3QgZ3NtX2RhdGFfZnJhbWUgKmZyYW1lKQoreworCXN0cnVjdCBydHBfc3ViX3NvY2tldCAqcnNzID0gJnJzLT5ydHA7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwlzdHJ1Y3QgcnRwX2hkciAqcnRwaDsKKwlpbnQgcGF5bG9hZF90eXBlOworCWludCBwYXlsb2FkX2xlbjsKKwlpbnQgZHVyYXRpb247IC8qIGluIHNhbXBsZXMgKi8KKworCWlmIChycy0+dHhfYWN0aW9uICE9IFJUUF9TRU5EX0RPV05TVFJFQU0pIHsKKwkJLyogaW5pdGlhbGl6ZSBzZXF1ZW5jZXMgKi8KKwkJcnMtPnR4X2FjdGlvbiA9IFJUUF9TRU5EX0RPV05TVFJFQU07CisJCXJzLT50cmFuc21pdC5zc3JjID0gcmFuZCgpOworCQlycy0+dHJhbnNtaXQuc2VxdWVuY2UgPSByYW5kb20oKTsKKwkJcnMtPnRyYW5zbWl0LnRpbWVzdGFtcCA9IHJhbmRvbSgpOworCX0KKworCXN3aXRjaCAoZnJhbWUtPm1zZ190eXBlKSB7CisJY2FzZSBHU01fVENIRl9GUkFNRToKKwkJcGF5bG9hZF90eXBlID0gUlRQX1BUX0dTTV9GVUxMOworCQlwYXlsb2FkX2xlbiA9IDMzOworCQlkdXJhdGlvbiA9IDE2MDsKKwkJYnJlYWs7CisJY2FzZSBHU01fVENIRl9GUkFNRV9FRlI6CisJCXBheWxvYWRfdHlwZSA9IFJUUF9QVF9HU01fRUZSOworCQlwYXlsb2FkX2xlbiA9IDMxOworCQlkdXJhdGlvbiA9IDE2MDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJREVCVUdQQyhETVVYLCAidW5zdXBwb3J0ZWQgbWVzc2FnZSB0eXBlICVkXG4iLAorCQkJZnJhbWUtPm1zZ190eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJeworCQlzdHJ1Y3QgdGltZXZhbCB0diwgdHZfZGlmZjsKKwkJbG9uZyBpbnQgdXNlY19kaWZmLCBmcmFtZV9kaWZmOworCisJCWdldHRpbWVvZmRheSgmdHYsIE5VTEwpOworCQl0dl9kaWZmZXJlbmNlKCZ0dl9kaWZmLCAmcnMtPnRyYW5zbWl0Lmxhc3RfdHYsICZ0dik7CisJCXJzLT50cmFuc21pdC5sYXN0X3R2ID0gdHY7CisKKwkJdXNlY19kaWZmID0gdHZfZGlmZi50dl9zZWMgKiAxMDAwMDAwICsgdHZfZGlmZi50dl91c2VjOworCQlmcmFtZV9kaWZmID0gKHVzZWNfZGlmZiAvIDIwMDAwKTsKKworCQlpZiAoYWJzKGZyYW1lX2RpZmYpID4gMSkgeworCQkJbG9uZyBpbnQgZnJhbWVfZGlmZl9leGNlc3MgPSBmcmFtZV9kaWZmIC0gMTsKKworCQkJTE9HUChETVVYLCBMT0dMX05PVElDRSwKKwkJCQkiQ29ycmVjdGluZyBmcmFtZSBkaWZmZXJlbmNlIG9mICVsZCBmcmFtZXNcbiIsIGZyYW1lX2RpZmZfZXhjZXNzKTsKKwkJCXJzLT50cmFuc21pdC5zZXF1ZW5jZSArPSBmcmFtZV9kaWZmX2V4Y2VzczsKKwkJCXJzLT50cmFuc21pdC50aW1lc3RhbXAgKz0gZnJhbWVfZGlmZl9leGNlc3MgKiBkdXJhdGlvbjsKKwkJfQorCX0KKworCW1zZyA9IG1zZ2JfYWxsb2Moc2l6ZW9mKHN0cnVjdCBydHBfaGRyKSArIHBheWxvYWRfbGVuLCAiUlRQLUdTTS1GVUxMIik7CisJaWYgKCFtc2cpCisJCXJldHVybiAtRU5PTUVNOworCXJ0cGggPSAoc3RydWN0IHJ0cF9oZHIgKiltc2ctPmRhdGE7CisJcnRwaC0+dmVyc2lvbiA9IFJUUF9WRVJTSU9OOworCXJ0cGgtPnBhZGRpbmcgPSAwOworCXJ0cGgtPmV4dGVuc2lvbiA9IDA7CisJcnRwaC0+Y3NyY19jb3VudCA9IDA7CisJcnRwaC0+bWFya2VyID0gMDsKKwlydHBoLT5wYXlsb2FkX3R5cGUgPSBwYXlsb2FkX3R5cGU7CisJcnRwaC0+c2VxdWVuY2UgPSBodG9ucyhycy0+dHJhbnNtaXQuc2VxdWVuY2UrKyk7CisJcnRwaC0+dGltZXN0YW1wID0gaHRvbmwocnMtPnRyYW5zbWl0LnRpbWVzdGFtcCk7CisJcnMtPnRyYW5zbWl0LnRpbWVzdGFtcCArPSBkdXJhdGlvbjsKKwlydHBoLT5zc3JjID0gaHRvbmwocnMtPnRyYW5zbWl0LnNzcmMpOworCW1lbWNweShtc2ctPmRhdGEgKyBzaXplb2Yoc3RydWN0IHJ0cF9oZHIpLCBmcmFtZS0+ZGF0YSwgcGF5bG9hZF9sZW4pOworCW1zZ2JfcHV0KG1zZywgc2l6ZW9mKHN0cnVjdCBydHBfaGRyKSArIHBheWxvYWRfbGVuKTsKKwltc2diX2VucXVldWUoJnJzcy0+dHhfcXVldWUsIG1zZyk7CisJcnNzLT5iZmQud2hlbiB8PSBCU0NfRkRfV1JJVEU7CisKKwlyZXR1cm4gMDsKK30KKworLyogaXRlcmF0ZSBvdmVyIGFsbCBjaHVua3MgaW4gb25lIFJUQ1AgbWVzc2FnZSwgbG9vayBmb3IgQ05BTUUgSUVzIGFuZAorICogcmVwbGFjZSBhbGwgb2YgdGhvc2Ugd2l0aCAnbmV3X2NuYW1lJyAqLworc3RhdGljIGludCBydGNwX3NkZXNfY25hbWVfbWFuZ2xlKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBydGNwX2hkciAqcmgsCisJCQkJICB1X2ludDE2X3QgKnJ0Y3BfbGVuLCBjb25zdCBjaGFyICpuZXdfY25hbWUpCit7CisJdV9pbnQ4X3QgKnJ0Y3BfZW5kOworCXVfaW50OF90ICpjdXIgPSAodV9pbnQ4X3QgKikgcmg7CisJdV9pbnQ4X3QgdGFnLCBsZW4gPSAwOworCisJcnRjcF9lbmQgPSBjdXIgKyAqcnRjcF9sZW47CisJLyogbW92ZSBjdXIgdG8gZW5kIG9mIFJUUCBoZWFkZXIgKi8KKwljdXIgKz0gc2l6ZW9mKCpyaCk7CisKKwkvKiBpdGVyYXRlIG92ZXIgQ2h1bmtzICovCisJd2hpbGUgKGN1cis0IDwgcnRjcF9lbmQpIHsKKwkJLyogc2tpcCBmb3VyIGJ5dGVzIFNTUkMvQ1NSQyAqLworCQljdXIgKz0gNDsKKwkKKwkJLyogaXRlcmF0ZSBvdmVyIElFJ3MgaW5zaWRlIHRoZSBjaHVuayAqLworCQl3aGlsZSAoY3VyKzEgPCBydGNwX2VuZCkgeworCQkJdGFnID0gKmN1cisrOworCQkJaWYgKHRhZyA9PSAwKSB7CisJCQkJLyogZW5kIG9mIGNodW5rLCBza2lwIGFkZGl0aW9uYWwgemVybyAqLworCQkJCXdoaWxlICgqY3VyKysgPT0gMCkgeyB9CisJCQkJYnJlYWs7CisJCQl9CisJCQlsZW4gPSAqY3VyKys7CisJCisJCQlpZiAodGFnID09IFJUQ1BfSUVfQ05BTUUpIHsKKwkJCQkvKiB3ZSd2ZSBmb3VuZCB0aGUgQ05BTUUsIGxldHMgbWFuZ2xlIGl0ICovCisJCQkJaWYgKGxlbiA8IHN0cmxlbihuZXdfY25hbWUpKSB7CisJCQkJCS8qIHdlIG5lZWQgdG8gbWFrZSBtb3JlIHNwYWNlICovCisJCQkJCWludCBpbmNyZWFzZSA9IHN0cmxlbihuZXdfY25hbWUpIC0gbGVuOworCisJCQkJCW1zZ2JfcHVzaChtc2csIGluY3JlYXNlKTsKKwkJCQkJbWVtbW92ZShjdXIrbGVuK2luY3JlYXNlLCBjdXIrbGVuLAorCQkJCQkJcnRjcF9lbmQgLSAoY3VyK2xlbikpOworCQkJCQkvKiBGSVhNRTogd2UgaGF2ZSB0byByZXNwZWN0IFJUQ1AKKwkJCQkJICogcGFkZGluZy9hbGlnbm1lbnQgcnVsZXMhICovCisJCQkJCWxlbiArPSBpbmNyZWFzZTsKKwkJCQkJKihjdXItMSkgKz0gaW5jcmVhc2U7CisJCQkJCXJ0Y3BfZW5kICs9IGluY3JlYXNlOworCQkJCQkqcnRjcF9sZW4gKz0gaW5jcmVhc2U7CisJCQkJfQorCQkJCS8qIGNvcHkgbmV3IENOQU1FIGludG8gbWVzc2FnZSAqLworCQkJCW1lbWNweShjdXIsIG5ld19jbmFtZSwgc3RybGVuKG5ld19jbmFtZSkpOworCQkJCS8qIEZJWE1FOiB6ZXJvIHRoZSBwYWRkaW5nIGluIGNhc2UgbmV3IENOQU1FCisJCQkJICogaXMgc21hbGxlciB0aGFuIG9sZCBvbmUgISEhICovCisJCQl9CisJCQljdXIgKz0gbGVuOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnRjcF9tYW5nbGUoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IHJ0cF9zb2NrZXQgKnJzKQoreworCXN0cnVjdCBydHBfc3ViX3NvY2tldCAqcnNzID0gJnJzLT5ydGNwOworCXN0cnVjdCBydGNwX2hkciAqcnRwaDsKKwl1X2ludDE2X3Qgb2xkX2xlbjsKKwlpbnQgcmM7CisKKwlpZiAoIW1hbmdsZV9ydGNwX2NuYW1lKQorCQlyZXR1cm4gMDsKKworCXByaW50ZigiUlRDUFxuIik7CisJLyogaXRlcmF0ZSBvdmVyIGxpc3Qgb2YgUlRDUCBtZXNzYWdlcyAqLworCXJ0cGggPSAoc3RydWN0IHJ0Y3BfaGRyICopbXNnLT5kYXRhOworCXdoaWxlICgodm9pZCAqKXJ0cGggKyBzaXplb2YoKnJ0cGgpIDw9ICh2b2lkICopbXNnLT5kYXRhICsgbXNnLT5sZW4pIHsKKwkJb2xkX2xlbiA9IChudG9ocyhydHBoLT5sZW5ndGgpICsgMSkgKiA0OworCQlpZiAoKHZvaWQgKilydHBoICsgb2xkX2xlbiA+ICh2b2lkICopbXNnLT5kYXRhICsgbXNnLT5sZW4pIHsKKwkJCURFQlVHUEMoRE1VWCwgInJlY2VpdmVkIFJUQ1AgcGFja2V0IHRvbyBzaG9ydCBmb3IgIgorCQkJCSJsZW5ndGggZWxlbWVudFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAocnRwaC0+dHlwZSA9PSBSVENQX1RZUEVfU0RFUykgeworCQkJY2hhciBuZXdfY25hbWVbMjU1XTsKKwkJCXN0cm5jcHkobmV3X2NuYW1lLCBpbmV0X250b2EocnNzLT5zaW5fbG9jYWwuc2luX2FkZHIpLAorCQkJCXNpemVvZihuZXdfY25hbWUpKTsKKwkJCW5ld19jbmFtZVtzaXplb2YobmV3X2NuYW1lKS0xXSA9ICdcMCc7CisJCQlyYyA9IHJ0Y3Bfc2Rlc19jbmFtZV9tYW5nbGUobXNnLCBydHBoLCAmb2xkX2xlbiwKKwkJCQkJCSAgICBuZXdfY25hbWUpOworCQkJaWYgKHJjIDwgMCkKKwkJCQlyZXR1cm4gcmM7CisJCX0KKwkJcnRwaCA9ICh2b2lkICopcnRwaCArIG9sZF9sZW47CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIHJlYWQgZnJvbSBpbmNvbWluZyBSVFAvUlRDUCBzb2NrZXQgKi8KK3N0YXRpYyBpbnQgcnRwX3NvY2tldF9yZWFkKHN0cnVjdCBydHBfc29ja2V0ICpycywgc3RydWN0IHJ0cF9zdWJfc29ja2V0ICpyc3MpCit7CisJaW50IHJjOworCXN0cnVjdCBtc2diICptc2cgPSBtc2diX2FsbG9jKFJUUF9BTExPQ19TSVpFLCAiUlRQL1JUQ1AiKTsKKwlzdHJ1Y3QgbXNnYiAqbmV3X21zZzsKKwlzdHJ1Y3QgcnRwX3N1Yl9zb2NrZXQgKm90aGVyX3JzczsKKworCWlmICghbXNnKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJjID0gcmVhZChyc3MtPmJmZC5mZCwgbXNnLT5kYXRhLCBSVFBfQUxMT0NfU0laRSk7CisJaWYgKHJjIDw9IDApIHsKKwkJcnNzLT5iZmQud2hlbiAmPSB+QlNDX0ZEX1JFQUQ7CisJCXJldHVybiByYzsKKwl9CisKKwltc2diX3B1dChtc2csIHJjKTsKKworCXN3aXRjaCAocnMtPnJ4X2FjdGlvbikgeworCWNhc2UgUlRQX1BST1hZOgorCQlpZiAoIXJzLT5wcm94eS5vdGhlcl9zb2NrKSB7CisJCQlyYyA9IC1FSU87CisJCQlnb3RvIG91dF9mcmVlOworCQl9CisJCWlmIChyc3MtPmJmZC5wcml2X25yID09IFJUUF9QUklWX1JUUCkKKwkJCW90aGVyX3JzcyA9ICZycy0+cHJveHkub3RoZXJfc29jay0+cnRwOworCQllbHNlIGlmIChyc3MtPmJmZC5wcml2X25yID09IFJUUF9QUklWX1JUQ1ApIHsKKwkJCW90aGVyX3JzcyA9ICZycy0+cHJveHkub3RoZXJfc29jay0+cnRjcDsKKwkJCS8qIG1vZGlmeSBSVENQIFNERVMgQ05BTUUgKi8KKwkJCXJjID0gcnRjcF9tYW5nbGUobXNnLCBycyk7CisJCQlpZiAocmMgPCAwKQorCQkJCWdvdG8gb3V0X2ZyZWU7CisJCX0gZWxzZSB7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlnb3RvIG91dF9mcmVlOworCQl9CisJCW1zZ2JfZW5xdWV1ZSgmb3RoZXJfcnNzLT50eF9xdWV1ZSwgbXNnKTsKKwkJb3RoZXJfcnNzLT5iZmQud2hlbiB8PSBCU0NfRkRfV1JJVEU7CisJCWJyZWFrOworCisJY2FzZSBSVFBfUkVDVl9VUFNUUkVBTToKKwkJaWYgKCFycy0+cmVjZWl2ZS5jYWxscmVmIHx8ICFycy0+cmVjZWl2ZS5uZXQpIHsKKwkJCXJjID0gLUVJTzsKKwkJCWdvdG8gb3V0X2ZyZWU7CisJCX0KKwkJaWYgKHJzcy0+YmZkLnByaXZfbnIgPT0gUlRQX1BSSVZfUlRDUCkgeworCQkJaWYgKCFtYW5nbGVfcnRjcF9jbmFtZSkgeworCQkJCW1zZ2JfZnJlZShtc2cpOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogbW9kaWZ5IFJUQ1AgU0RFUyBDTkFNRSAqLworCQkJcmMgPSBydGNwX21hbmdsZShtc2csIHJzKTsKKwkJCWlmIChyYyA8IDApCisJCQkJZ290byBvdXRfZnJlZTsKKwkJCW1zZ2JfZW5xdWV1ZSgmcnNzLT50eF9xdWV1ZSwgbXNnKTsKKwkJCXJzcy0+YmZkLndoZW4gfD0gQlNDX0ZEX1dSSVRFOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHJzcy0+YmZkLnByaXZfbnIgIT0gUlRQX1BSSVZfUlRQKSB7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlnb3RvIG91dF9mcmVlOworCQl9CisJCXJjID0gcnRwX2RlY29kZShtc2csIHJzLT5yZWNlaXZlLmNhbGxyZWYsICZuZXdfbXNnKTsKKwkJaWYgKHJjIDwgMCkKKwkJCWdvdG8gb3V0X2ZyZWU7CisJCW1zZ2JfZnJlZShtc2cpOworCQltc2diX2VucXVldWUoJnJzLT5yZWNlaXZlLm5ldC0+dXBxdWV1ZSwgbmV3X21zZyk7CisJCWJyZWFrOworCisJY2FzZSBSVFBfTk9ORTogLyogaWYgc29ja2V0IGV4aXN0cywgYnV0IGRpc2FibGVkIGJ5IGFwcCAqLworCQltc2diX2ZyZWUobXNnKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7CisKK291dF9mcmVlOgorCW1zZ2JfZnJlZShtc2cpOworCXJldHVybiByYzsKK30KKworLyogd3JpdGUgZnJvbSB0eF9xdWV1ZSB0byBSVFAvUlRDUCBzb2NrZXQgKi8KK3N0YXRpYyBpbnQgcnRwX3NvY2tldF93cml0ZShzdHJ1Y3QgcnRwX3NvY2tldCAqcnMsIHN0cnVjdCBydHBfc3ViX3NvY2tldCAqcnNzKQoreworCXN0cnVjdCBtc2diICptc2c7CisJaW50IHdyaXR0ZW47CisKKwltc2cgPSBtc2diX2RlcXVldWUoJnJzcy0+dHhfcXVldWUpOworCWlmICghbXNnKSB7CisJCXJzcy0+YmZkLndoZW4gJj0gfkJTQ19GRF9XUklURTsKKwkJcmV0dXJuIDA7CisJfQorCisJd3JpdHRlbiA9IHdyaXRlKHJzcy0+YmZkLmZkLCBtc2ctPmRhdGEsIG1zZy0+bGVuKTsKKwlpZiAod3JpdHRlbiA8IG1zZy0+bGVuKSB7CisJCUxPR1AoRE1JQiwgTE9HTF9FUlJPUiwgInNob3J0IHdyaXRlIik7CisJCW1zZ2JfZnJlZShtc2cpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwltc2diX2ZyZWUobXNnKTsKKworCXJldHVybiAwOworfQorCisKKy8qIGNhbGxiYWNrIGZvciB0aGUgc2VsZWN0LmM6YmZkXyogbGF5ZXIgKi8KK3N0YXRpYyBpbnQgcnRwX2JmZF9jYihzdHJ1Y3QgYnNjX2ZkICpiZmQsIHVuc2lnbmVkIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgcnRwX3NvY2tldCAqcnMgPSBiZmQtPmRhdGE7CisJc3RydWN0IHJ0cF9zdWJfc29ja2V0ICpyc3M7CisKKwlzd2l0Y2ggKGJmZC0+cHJpdl9ucikgeworCWNhc2UgUlRQX1BSSVZfUlRQOgorCQlyc3MgPSAmcnMtPnJ0cDsKKwkJYnJlYWs7CisJY2FzZSBSVFBfUFJJVl9SVENQOgorCQlyc3MgPSAmcnMtPnJ0Y3A7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChmbGFncyAmIEJTQ19GRF9SRUFEKQorCQlydHBfc29ja2V0X3JlYWQocnMsIHJzcyk7CisKKwlpZiAoZmxhZ3MgJiBCU0NfRkRfV1JJVEUpCisJCXJ0cF9zb2NrZXRfd3JpdGUocnMsIHJzcyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaW5pdF9yc3Moc3RydWN0IHJ0cF9zdWJfc29ja2V0ICpyc3MsIAorCQkgICAgIHN0cnVjdCBydHBfc29ja2V0ICpycywgaW50IGZkLCBpbnQgcHJpdl9ucikKK3sKKwkvKiBpbml0aWFsaXplIGJmZCAqLworCXJzcy0+YmZkLmZkID0gZmQ7CisJcnNzLT5iZmQuZGF0YSA9IHJzOworCXJzcy0+YmZkLnByaXZfbnIgPSBwcml2X25yOworCXJzcy0+YmZkLmNiID0gcnRwX2JmZF9jYjsKK30KKworc3RydWN0IHJ0cF9zb2NrZXQgKnJ0cF9zb2NrZXRfY3JlYXRlKHZvaWQpCit7CisJaW50IHJjOworCXN0cnVjdCBydHBfc29ja2V0ICpyczsKKworCURFQlVHUChETVVYLCAicnRwX3NvY2tldF9jcmVhdGUoKTogIik7CisKKwlycyA9IHRhbGxvY196ZXJvKHRhbGxfYnNjX2N0eCwgc3RydWN0IHJ0cF9zb2NrZXQpOworCWlmICghcnMpCisJCXJldHVybiBOVUxMOworCisJSU5JVF9MTElTVF9IRUFEKCZycy0+cnRwLnR4X3F1ZXVlKTsKKwlJTklUX0xMSVNUX0hFQUQoJnJzLT5ydGNwLnR4X3F1ZXVlKTsKKworCXJjID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIElQUFJPVE9fVURQKTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIG91dF9mcmVlOworCisJaW5pdF9yc3MoJnJzLT5ydHAsIHJzLCByYywgUlRQX1BSSVZfUlRQKTsKKwlyYyA9IGJzY19yZWdpc3Rlcl9mZCgmcnMtPnJ0cC5iZmQpOworCWlmIChyYyA8IDApCisJCWdvdG8gb3V0X3J0cF9zb2NrZXQ7CisKKwlyYyA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCBJUFBST1RPX1VEUCk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBvdXRfcnRwX2JmZDsKKworCWluaXRfcnNzKCZycy0+cnRjcCwgcnMsIHJjLCBSVFBfUFJJVl9SVENQKTsKKwlyYyA9IGJzY19yZWdpc3Rlcl9mZCgmcnMtPnJ0Y3AuYmZkKTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIG91dF9ydGNwX3NvY2tldDsKKworCURFQlVHUEMoRE1VWCwgInN1Y2Nlc3NcbiIpOworCisJcmMgPSBydHBfc29ja2V0X2JpbmQocnMsIElOQUREUl9BTlkpOworCWlmIChyYyA8IDApCisJCWdvdG8gb3V0X3J0Y3BfYmZkOworCisJcmV0dXJuIHJzOworCitvdXRfcnRjcF9iZmQ6CisJYnNjX3VucmVnaXN0ZXJfZmQoJnJzLT5ydGNwLmJmZCk7CitvdXRfcnRjcF9zb2NrZXQ6CisJY2xvc2UocnMtPnJ0Y3AuYmZkLmZkKTsKK291dF9ydHBfYmZkOgorCWJzY191bnJlZ2lzdGVyX2ZkKCZycy0+cnRwLmJmZCk7CitvdXRfcnRwX3NvY2tldDoKKwljbG9zZShycy0+cnRwLmJmZC5mZCk7CitvdXRfZnJlZToKKwl0YWxsb2NfZnJlZShycyk7CisJREVCVUdQQyhETVVYLCAiZmFpbGVkXG4iKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBydHBfc3ViX3NvY2tldF9iaW5kKHN0cnVjdCBydHBfc3ViX3NvY2tldCAqcnNzLCB1X2ludDMyX3QgaXAsCisJCQkJdV9pbnQxNl90IHBvcnQpCit7CisJaW50IHJjOworCXNvY2tsZW5fdCBhbGVuID0gc2l6ZW9mKHJzcy0+c2luX2xvY2FsKTsKKworCXJzcy0+c2luX2xvY2FsLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCXJzcy0+c2luX2xvY2FsLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKGlwKTsKKwlyc3MtPnNpbl9sb2NhbC5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworCXJzcy0+YmZkLndoZW4gfD0gQlNDX0ZEX1JFQUQ7CisKKwlyYyA9IGJpbmQocnNzLT5iZmQuZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmcnNzLT5zaW5fbG9jYWwsCisJCSAgc2l6ZW9mKHJzcy0+c2luX2xvY2FsKSk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJLyogcmV0cmlldmUgdGhlIGFkZHJlc3Mgd2UgYWN0dWFsbHkgYm91bmQgdG8sIGluIGNhc2Ugd2UKKwkgKiBwYXNzZWQgSU5BRERSX0FOWSBhcyBJUCBhZGRyZXNzICovCisJcmV0dXJuIGdldHNvY2tuYW1lKHJzcy0+YmZkLmZkLCAoc3RydWN0IHNvY2thZGRyICopJnJzcy0+c2luX2xvY2FsLAorCQkJICAgJmFsZW4pOworfQorCisjZGVmaW5lIFJUUF9QT1JUX0JBU0UJMzAwMDAKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbmV4dF91ZHBfcG9ydCA9IFJUUF9QT1JUX0JBU0U7CisKKy8qIGJpbmQgYSBSVFAgc29ja2V0IHRvIGEgbG9jYWwgYWRkcmVzcyAqLworaW50IHJ0cF9zb2NrZXRfYmluZChzdHJ1Y3QgcnRwX3NvY2tldCAqcnMsIHVfaW50MzJfdCBpcCkKK3sKKwlpbnQgcmMgPSAtRUlPOworCXN0cnVjdCBpbl9hZGRyIGlhOworCisJaWEuc19hZGRyID0gaHRvbmwoaXApOworCURFQlVHUChETVVYLCAicnRwX3NvY2tldF9iaW5kKHJzPSVwLCBJUD0lcyk6ICIsIHJzLAorCQlpbmV0X250b2EoaWEpKTsKKworCS8qIHRyeSB0byBiaW5kIHRvIGEgY29uc2VjdXRpdmUgcGFpciBvZiBwb3J0cyAqLworCWZvciAobmV4dF91ZHBfcG9ydCA9IG5leHRfdWRwX3BvcnQgJSAweGZmZmY7CisJICAgICBuZXh0X3VkcF9wb3J0IDwgMHhmZmZmOyBuZXh0X3VkcF9wb3J0ICs9IDIpIHsKKwkJcmMgPSBydHBfc3ViX3NvY2tldF9iaW5kKCZycy0+cnRwLCBpcCwgbmV4dF91ZHBfcG9ydCk7CisJCWlmIChyYyAhPSAwKQorCQkJY29udGludWU7CisKKwkJcmMgPSBydHBfc3ViX3NvY2tldF9iaW5kKCZycy0+cnRjcCwgaXAsIG5leHRfdWRwX3BvcnQrMSk7CisJCWlmIChyYyA9PSAwKQorCQkJYnJlYWs7CisJfQorCWlmIChyYyA8IDApIHsKKwkJREVCVUdQQyhETVVYLCAiZmFpbGVkXG4iKTsKKwkJcmV0dXJuIHJjOworCX0KKworCWlhLnNfYWRkciA9IHJzLT5ydHAuc2luX2xvY2FsLnNpbl9hZGRyLnNfYWRkcjsKKwlERUJVR1BDKERNVVgsICJCT1VORF9JUD0lcywgQk9VTkRfUE9SVD0ldVxuIiwKKwkJaW5ldF9udG9hKGlhKSwgbnRvaHMocnMtPnJ0cC5zaW5fbG9jYWwuc2luX3BvcnQpKTsKKwlyZXR1cm4gbnRvaHMocnMtPnJ0cC5zaW5fbG9jYWwuc2luX3BvcnQpOworfQorCitzdGF0aWMgaW50IHJ0cF9zdWJfc29ja2V0X2Nvbm5lY3Qoc3RydWN0IHJ0cF9zdWJfc29ja2V0ICpyc3MsCisJCQkJICB1X2ludDMyX3QgaXAsIHVfaW50MTZfdCBwb3J0KQoreworCWludCByYzsKKwlzb2NrbGVuX3QgYWxlbiA9IHNpemVvZihyc3MtPnNpbl9sb2NhbCk7CisKKwlyc3MtPnNpbl9yZW1vdGUuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJcnNzLT5zaW5fcmVtb3RlLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKGlwKTsKKwlyc3MtPnNpbl9yZW1vdGUuc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKKworCXJjID0gY29ubmVjdChyc3MtPmJmZC5mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmcnNzLT5zaW5fcmVtb3RlLAorCQkgICAgIHNpemVvZihyc3MtPnNpbl9yZW1vdGUpKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlyZXR1cm4gZ2V0c29ja25hbWUocnNzLT5iZmQuZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmcnNzLT5zaW5fbG9jYWwsCisJCQkgICAmYWxlbik7Cit9CisKKy8qICdjb25uZWN0JyBhIFJUUCBzb2NrZXQgdG8gYSByZW1vdGUgcGVlciAqLworaW50IHJ0cF9zb2NrZXRfY29ubmVjdChzdHJ1Y3QgcnRwX3NvY2tldCAqcnMsIHVfaW50MzJfdCBpcCwgdV9pbnQxNl90IHBvcnQpCit7CisJaW50IHJjOworCXN0cnVjdCBpbl9hZGRyIGlhOworCisJaWEuc19hZGRyID0gaHRvbmwoaXApOworCURFQlVHUChETVVYLCAicnRwX3NvY2tldF9jb25uZWN0KHJzPSVwLCBpcD0lcywgcG9ydD0ldSlcbiIsCisJCXJzLCBpbmV0X250b2EoaWEpLCBwb3J0KTsKKworCXJjID0gcnRwX3N1Yl9zb2NrZXRfY29ubmVjdCgmcnMtPnJ0cCwgaXAsIHBvcnQpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCXJldHVybiBydHBfc3ViX3NvY2tldF9jb25uZWN0KCZycy0+cnRjcCwgaXAsIHBvcnQrMSk7Cit9CisKKy8qIGJpbmQgdHdvIFJUUC9SVENQIHNvY2tldHMgdG9nZXRoZXIgKi8KK2ludCBydHBfc29ja2V0X3Byb3h5KHN0cnVjdCBydHBfc29ja2V0ICp0aGlzLCBzdHJ1Y3QgcnRwX3NvY2tldCAqb3RoZXIpCit7CisJREVCVUdQKERNVVgsICJydHBfc29ja2V0X3Byb3h5KHRoaXM9JXAsIG90aGVyPSVwKVxuIiwKKwkJdGhpcywgb3RoZXIpOworCisJdGhpcy0+cnhfYWN0aW9uID0gUlRQX1BST1hZOworCXRoaXMtPnByb3h5Lm90aGVyX3NvY2sgPSBvdGhlcjsKKworCW90aGVyLT5yeF9hY3Rpb24gPSBSVFBfUFJPWFk7CisJb3RoZXItPnByb3h5Lm90aGVyX3NvY2sgPSB0aGlzOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGJpbmQgUlRQL1JUQ1Agc29ja2V0IHRvIGFwcGxpY2F0aW9uICovCitpbnQgcnRwX3NvY2tldF91cHN0cmVhbShzdHJ1Y3QgcnRwX3NvY2tldCAqdGhpcywgc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsCisJCQl1X2ludDMyX3QgY2FsbHJlZikKK3sKKwlERUJVR1AoRE1VWCwgInJ0cF9zb2NrZXRfcHJveHkodGhpcz0lcCwgY2FsbHJlZj0ldSlcbiIsCisJCXRoaXMsIGNhbGxyZWYpOworCisJaWYgKGNhbGxyZWYpIHsKKwkJdGhpcy0+cnhfYWN0aW9uID0gUlRQX1JFQ1ZfVVBTVFJFQU07CisJCXRoaXMtPnJlY2VpdmUubmV0ID0gbmV0OworCQl0aGlzLT5yZWNlaXZlLmNhbGxyZWYgPSBjYWxscmVmOworCX0gZWxzZQorCQl0aGlzLT5yeF9hY3Rpb24gPSBSVFBfTk9ORTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmcmVlX3R4X3F1ZXVlKHN0cnVjdCBydHBfc3ViX3NvY2tldCAqcnNzKQoreworCXN0cnVjdCBtc2diICptc2c7CisJCisJd2hpbGUgKChtc2cgPSBtc2diX2RlcXVldWUoJnJzcy0+dHhfcXVldWUpKSkKKwkJbXNnYl9mcmVlKG1zZyk7Cit9CisKK2ludCBydHBfc29ja2V0X2ZyZWUoc3RydWN0IHJ0cF9zb2NrZXQgKnJzKQoreworCURFQlVHUChETVVYLCAicnRwX3NvY2tldF9mcmVlKHJzPSVwKVxuIiwgcnMpOworCisJLyogbWFrZSBzdXJlIHdlIGRvbid0IGxlYXZlIHJlZmVyZW5jZXMgZGFuZ2xpbmcgdG8gdXMgKi8KKwlpZiAocnMtPnJ4X2FjdGlvbiA9PSBSVFBfUFJPWFkgJiYKKwkgICAgcnMtPnByb3h5Lm90aGVyX3NvY2spCisJCXJzLT5wcm94eS5vdGhlcl9zb2NrLT5wcm94eS5vdGhlcl9zb2NrID0gTlVMTDsKKworCWJzY191bnJlZ2lzdGVyX2ZkKCZycy0+cnRwLmJmZCk7CisJY2xvc2UocnMtPnJ0cC5iZmQuZmQpOworCWZyZWVfdHhfcXVldWUoJnJzLT5ydHApOworCisJYnNjX3VucmVnaXN0ZXJfZmQoJnJzLT5ydGNwLmJmZCk7CisJY2xvc2UocnMtPnJ0Y3AuYmZkLmZkKTsKKwlmcmVlX3R4X3F1ZXVlKCZycy0+cnRjcCk7CisKKwl0YWxsb2NfZnJlZShycyk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3NjY3Avc2NjcC5jIGIvb3BlbmJzYy9zcmMvc2NjcC9zY2NwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFkYTJjNwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3NjY3Avc2NjcC5jCkBAIC0wLDAgKzEsMTM0NiBAQAorLyoKKyAqIFNDQ1AgbWFuYWdlbWVudCBjb2RlCisgKgorICogKEMpIDIwMDksIDIwMTAgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogKEMpIDIwMDksIDIwMTAgYnkgT24tV2F2ZXMKKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKworI2luY2x1ZGUgPHNjY3Avc2NjcC5oPgorCisKK3N0YXRpYyB2b2lkICp0YWxsX3NjY3BfY3R4Oworc3RhdGljIExMSVNUX0hFQUQoc2NjcF9jb25uZWN0aW9ucyk7CisKKyNkZWZpbmUgU0NDUF9NU0dfU0laRSA0MDk2CisjZGVmaW5lIFNDQ1BfTVNHX0hFQURST09NIDEyOAorCisvKiBnbG9iYWwgZGF0YSAqLworY29uc3Qgc3RydWN0IHNvY2thZGRyX3NjY3Agc2NjcF9zc25fYnNzYXAgPSB7CisJLnNjY3BfZmFtaWx5CT0gMCwKKwkuc2NjcF9zc24JPSBTQ0NQX1NTTl9CU1NBUCwKK307CisKK3N0cnVjdCBzY2NwX3N5c3RlbSB7CisJLyogbGF5ZXIzIC0+IGxheWVyMiAqLworCWludCAoKndyaXRlX2RhdGEpKHN0cnVjdCBtc2diICpkYXRhLCB2b2lkICpjb250ZXh0KTsKKwl2b2lkICp3cml0ZV9jb250ZXh0OworfTsKKworCitzdGF0aWMgc3RydWN0IHNjY3Bfc3lzdGVtIHNjY3Bfc3lzdGVtID0geworCS53cml0ZV9kYXRhID0gTlVMTCwKK307CisKK3N0cnVjdCBzY2NwX2RhdGFfY2FsbGJhY2sgeworCS8qIGNvbm5lY3Rpb24gYmFzZWQgKi8KKwlpbnQgKCphY2NlcHRfY2IpKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKiwgdm9pZCAqKTsKKwl2b2lkICphY2NlcHRfY29udGV4dDsKKworCS8qIGNvbm5lY3Rpb24gbGVzcyAqLworCWludCAoKnJlYWRfY2IpKHN0cnVjdCBtc2diICosIHVuc2lnbmVkIGludCwgdm9pZCAqKTsKKwl2b2lkICpyZWFkX2NvbnRleHQ7CisKKwl1X2ludDhfdCBzc247CisJc3RydWN0IGxsaXN0X2hlYWQgY2FsbGJhY2s7Cit9OworCitzdGF0aWMgTExJU1RfSEVBRChzY2NwX2NhbGxiYWNrcyk7CisKK3N0YXRpYyBzdHJ1Y3Qgc2NjcF9kYXRhX2NhbGxiYWNrICpfZmluZF9zc24odV9pbnQ4X3Qgc3NuKQoreworCXN0cnVjdCBzY2NwX2RhdGFfY2FsbGJhY2sgKmNiOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoY2IsICZzY2NwX2NhbGxiYWNrcywgY2FsbGJhY2spIHsKKwkJaWYgKGNiLT5zc24gPT0gc3NuKQorCQkJcmV0dXJuIGNiOworCX0KKworCS8qIG5lZWQgdG8gYWRkIG9uZSAqLworCWNiID0gdGFsbG9jX3plcm8odGFsbF9zY2NwX2N0eCwgc3RydWN0IHNjY3BfZGF0YV9jYWxsYmFjayk7CisJaWYgKCFjYikgeworCQlERUJVR1AoRFNDQ1AsICJGYWlsZWQgdG8gYWxsb2NhdGUgc2NjcCBjYWxsYmFjay5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwljYi0+c3NuID0gc3NuOworCWxsaXN0X2FkZF90YWlsKCZjYi0+Y2FsbGJhY2ssICZzY2NwX2NhbGxiYWNrcyk7CisJcmV0dXJuIGNiOworfQorCisKK3N0YXRpYyBpbnQgX3NlbmRfbXNnKHN0cnVjdCBtc2diICptc2cpCit7CisJcmV0dXJuIHNjY3Bfc3lzdGVtLndyaXRlX2RhdGEobXNnLCBzY2NwX3N5c3RlbS53cml0ZV9jb250ZXh0KTsKK30KKworLyoKKyAqIHBhcnNpbmcgcm91dGluZXMKKyAqLworc3RhdGljIGludCBjb3B5X2FkZHJlc3Moc3RydWN0IHNjY3BfYWRkcmVzcyAqYWRkciwgdV9pbnQ4X3Qgb2Zmc2V0LCBzdHJ1Y3QgbXNnYiAqbXNnYikKK3sKKwlzdHJ1Y3Qgc2NjcF9jYWxsZWRfcGFydHlfYWRkcmVzcyAqcGFydHk7CisKKwlpbnQgcm9vbSA9IG1zZ2JfbDJsZW4obXNnYikgLSBvZmZzZXQ7CisJdV9pbnQ4X3QgcmVhZCA9IDA7CisJdV9pbnQ4X3QgbGVuZ3RoOworCisJaWYgKHJvb20gPD0gMCkgeworCQlERUJVR1AoRFNDQ1AsICJOb3QgZW5vdWdoIHJvb20gZm9yIGFuIGFkZHJlc3M6ICV1XG4iLCByb29tKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWxlbmd0aCA9IG1zZ2ItPmwyaFtvZmZzZXRdOworCWlmIChyb29tIDw9IGxlbmd0aCkgeworCQlERUJVR1AoRFNDQ1AsICJOb3QgZW5vdWdoIHJvb20gZm9yIG9wdGlvbmFsIGRhdGEgJXUgJXVcbiIsIHJvb20sIGxlbmd0aCk7CisJCXJldHVybiAtMTsKKwl9CisKKworCXBhcnR5ID0gKHN0cnVjdCBzY2NwX2NhbGxlZF9wYXJ0eV9hZGRyZXNzICopKG1zZ2ItPmwyaCArIG9mZnNldCArIDEpOworCWlmIChwYXJ0eS0+cG9pbnRfY29kZV9pbmRpY2F0b3IpIHsKKwkJaWYgKGxlbmd0aCA8PSByZWFkICsgMikgeworCQkgICAgREVCVUdQKERTQ0NQLCAiUE9JIGRvZXMgbm90IGZpdCAldVxuIiwgbGVuZ3RoKTsKKwkJICAgIHJldHVybiAtMTsKKwkJfQorCisKKwkJbWVtY3B5KCZhZGRyLT5wb2ksICZwYXJ0eS0+ZGF0YVtyZWFkXSwgMik7CisJCXJlYWQgKz0gMjsKKwl9CisKKwlpZiAocGFydHktPnNzbl9pbmRpY2F0b3IpIHsKKwkJaWYgKGxlbmd0aCA8PSByZWFkICsgMSkgeworCQkgICAgREVCVUdQKERTQ0NQLCAiU1NOIGRvZXMgbm90IGZpdCAldVxuIiwgbGVuZ3RoKTsKKwkJICAgIHJldHVybiAtMTsKKwkJfQorCisJCWFkZHItPnNzbiA9IHBhcnR5LT5kYXRhW3JlYWRdOworCQlyZWFkICs9IDE7CisJfQorCisJaWYgKHBhcnR5LT5nbG9iYWxfdGl0bGVfaW5kaWNhdG9yKSB7CisJCURFQlVHUChEU0NDUCwgIkdUSSBub3Qgc3VwcG9ydGVkICV1XG4iLCAqKHVfaW50OF90ICopcGFydHkpOworCQlyZXR1cm4gLTE7CisJfQorCisJYWRkci0+YWRkcmVzcyA9ICpwYXJ0eTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaGVja19hZGRyZXNzKHN0cnVjdCBzY2NwX2FkZHJlc3MgKmFkZHIpCit7CisJLyogaWdub3JlIHBvaW50X2NvZGVfaW5kaWNhdG9yLi4uIGl0IHNob3VsZCBiZSB6ZXJvLi4uIGJ1dCAqLworCWlmIChhZGRyLT5hZGRyZXNzLnNzbl9pbmRpY2F0b3IgIT0gMQorCSAgICB8fCBhZGRyLT5hZGRyZXNzLmdsb2JhbF90aXRsZV9pbmRpY2F0b3IgPT0gMQorCSAgICB8fCBhZGRyLT5hZGRyZXNzLnJvdXRpbmdfaW5kaWNhdG9yICE9IDEpIHsKKwkJREVCVUdQKERTQ0NQLCAiSW52YWxpZCBjYWxsZWQgYWRkcmVzcyBhY2NvcmRpbmcgdG8gMDguMDY6IDB4JXggMHgleFxuIiwKKwkJCSoodV9pbnQ4X3QgKikmYWRkci0+YWRkcmVzcywgYWRkci0+c3NuKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9zY2NwX3BhcnNlX29wdGlvbmFsX2RhdGEoY29uc3QgaW50IG9mZnNldCwKKwkJCQkgICAgIHN0cnVjdCBtc2diICptc2diLCBzdHJ1Y3Qgc2NjcF9vcHRpb25hbF9kYXRhICpkYXRhKQoreworCXVfaW50MTZfdCByb29tID0gbXNnYl9sMmxlbihtc2diKSAtIG9mZnNldDsKKwl1X2ludDE2X3QgcmVhZCA9IDA7CisKKwl3aGlsZSAocm9vbSA+IHJlYWQpIHsKKwkJdV9pbnQ4X3QgdHlwZSA9IG1zZ2ItPmwyaFtvZmZzZXQgKyByZWFkXTsKKwkJaWYgKHR5cGUgPT0gU0NDUF9QTkNfRU5EX09GX09QVElPTkFMKQorCQkJcmV0dXJuIDA7CisKKwkJaWYgKHJlYWQgKyAxID49IHJvb20pIHsKKwkJCURFQlVHUChEU0NDUCwgIm5vIHBsYWNlIGZvciBsZW5ndGhcbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQl1X2ludDhfdCBsZW5ndGggPSBtc2diLT5sMmhbb2Zmc2V0ICsgcmVhZCArIDFdOworCQlyZWFkICs9IDIgKyBsZW5ndGg7CisKKworCQlpZiAocm9vbSA8PSByZWFkKSB7CisJCQlERUJVR1AoRFNDQ1AsICJubyBzcGFjZSBmb3IgdGhlIGRhdGE6IHR5cGU6ICVkIHJlYWQ6ICVkIHJvb206ICVkIGwyOiAlZFxuIiwKKwkJCSAgICAgICB0eXBlLCByZWFkLCByb29tLCBtc2diX2wybGVuKG1zZ2IpKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKHR5cGUgPT0gU0NDUF9QTkNfREFUQSkgeworCQkJZGF0YS0+ZGF0YV9sZW4gPSBsZW5ndGg7CisJCQlkYXRhLT5kYXRhX3N0YXJ0ID0gb2Zmc2V0ICsgcmVhZCAtIGxlbmd0aDsKKwkJfQorCisJfQorCisJcmV0dXJuIC0xOworfQorCitpbnQgX3NjY3BfcGFyc2VfY29ubmVjdGlvbl9yZXF1ZXN0KHN0cnVjdCBtc2diICptc2diLCBzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgKnJlc3VsdCkKK3sKKwlzdGF0aWMgY29uc3QgdV9pbnQzMl90IGhlYWRlcl9zaXplID0KKwkJCXNpemVvZihzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlcXVlc3QpOworCXN0YXRpYyBjb25zdCB1X2ludDMyX3Qgb3B0aW9uYWxfb2Zmc2V0ID0KKwkJCW9mZnNldG9mKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVxdWVzdCwgb3B0aW9uYWxfc3RhcnQpOworCXN0YXRpYyBjb25zdCB1X2ludDMyX3QgY2FsbGVkX29mZnNldCA9CisJCQlvZmZzZXRvZihzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlcXVlc3QsIHZhcmlhYmxlX2NhbGxlZCk7CisKKwlzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlcXVlc3QgKnJlcSA9IChzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlcXVlc3QgKiltc2diLT5sMmg7CisJc3RydWN0IHNjY3Bfb3B0aW9uYWxfZGF0YSBvcHRpb25hbF9kYXRhOworCisJLyogaGVhZGVyIGNoZWNrICovCisJaWYgKG1zZ2JfbDJsZW4obXNnYikgPCBoZWFkZXJfc2l6ZSkgeworCQlERUJVR1AoRFNDQ1AsICJtc2diIDwgaGVhZGVyX3NpemUgJXUgJXVcbiIsCisJCSAgICAgICAgbXNnYl9sMmxlbihtc2diKSwgaGVhZGVyX3NpemUpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogY29weSBvdXQgdGhlIGNhbGxpbmcgYW5kIGNhbGxlZCBhZGRyZXNzLiBBZGQgdGhlIG9mZnNldCAqLworCWlmIChjb3B5X2FkZHJlc3MoJnJlc3VsdC0+Y2FsbGVkLCBjYWxsZWRfb2Zmc2V0ICsgcmVxLT52YXJpYWJsZV9jYWxsZWQsIG1zZ2IpICE9IDApCisJCXJldHVybiAtMTsKKworCWlmIChjaGVja19hZGRyZXNzKCZyZXN1bHQtPmNhbGxlZCkgIT0gMCkgeworCQlERUJVR1AoRFNDQ1AsICJJbnZhbGlkIGNhbGxlZCBhZGRyZXNzIGFjY29yZGluZyB0byAwOC4wNjogMHgleCAweCV4XG4iLAorCQkJKih1X2ludDhfdCAqKSZyZXN1bHQtPmNhbGxlZC5hZGRyZXNzLCByZXN1bHQtPmNhbGxlZC5zc24pOworCQlyZXR1cm4gLTE7CisJfQorCisJcmVzdWx0LT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlID0gJnJlcS0+c291cmNlX2xvY2FsX3JlZmVyZW5jZTsKKworCS8qCisJICogcGFyc2Ugb3B0aW9uYWwgZGF0YS4KKwkgKi8KKwltZW1zZXQoJm9wdGlvbmFsX2RhdGEsIDAsIHNpemVvZihvcHRpb25hbF9kYXRhKSk7CisJaWYgKF9zY2NwX3BhcnNlX29wdGlvbmFsX2RhdGEob3B0aW9uYWxfb2Zmc2V0ICsgcmVxLT5vcHRpb25hbF9zdGFydCwgbXNnYiwgJm9wdGlvbmFsX2RhdGEpICE9IDApIHsKKwkJREVCVUdQKERTQ0NQLCAicGFyc2luZyBvZiBvcHRpb25hbCBkYXRhIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKG9wdGlvbmFsX2RhdGEuZGF0YV9sZW4gIT0gMCkgeworCQltc2diLT5sM2ggPSAmbXNnYi0+bDJoW29wdGlvbmFsX2RhdGEuZGF0YV9zdGFydF07CisJCXJlc3VsdC0+ZGF0YV9sZW4gPSBvcHRpb25hbF9kYXRhLmRhdGFfbGVuOworCX0gZWxzZSB7CisJCXJlc3VsdC0+ZGF0YV9sZW4gPSAwOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgX3NjY3BfcGFyc2VfY29ubmVjdGlvbl9yZWxlYXNlZChzdHJ1Y3QgbXNnYiAqbXNnYiwgc3RydWN0IHNjY3BfcGFyc2VfcmVzdWx0ICpyZXN1bHQpCit7CisJc3RhdGljIGludCBoZWFkZXJfc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlbGVhc2VkKTsKKwlzdGF0aWMgaW50IG9wdGlvbmFsX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVsZWFzZWQsIG9wdGlvbmFsX3N0YXJ0KTsKKworCXN0cnVjdCBzY2NwX29wdGlvbmFsX2RhdGEgb3B0aW9uYWxfZGF0YTsKKwlzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlbGVhc2VkICpybHMgPSAoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWxlYXNlZCAqKSBtc2diLT5sMmg7CisKKwkvKiB3ZSBkb24ndCBoYXZlIGVub3VnaCBzaXplIGZvciB0aGUgc3RydWN0ICovCisJaWYgKG1zZ2JfbDJsZW4obXNnYikgPCBoZWFkZXJfc2l6ZSkgeworCQlERUJVR1AoRFNDQ1AsICJtc2diID4gaGVhZGVyX3NpemUgJXUgJXVcbiIsCisJCSAgICAgICAgbXNnYl9sMmxlbihtc2diKSwgaGVhZGVyX3NpemUpOworCQlyZXR1cm4gLTE7CisJfQorCisJbWVtc2V0KCZvcHRpb25hbF9kYXRhLCAwLCBzaXplb2Yob3B0aW9uYWxfZGF0YSkpOworCWlmIChfc2NjcF9wYXJzZV9vcHRpb25hbF9kYXRhKG9wdGlvbmFsX29mZnNldCArIHJscy0+b3B0aW9uYWxfc3RhcnQsIG1zZ2IsICZvcHRpb25hbF9kYXRhKSAhPSAwKSB7CisJCURFQlVHUChEU0NDUCwgInBhcnNpbmcgb2Ygb3B0aW9uYWwgZGF0YSBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJlc3VsdC0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSA9ICZybHMtPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2U7CisJcmVzdWx0LT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UgPSAmcmxzLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2U7CisKKwlpZiAob3B0aW9uYWxfZGF0YS5kYXRhX2xlbiAhPSAwKSB7CisJCW1zZ2ItPmwzaCA9ICZtc2diLT5sMmhbb3B0aW9uYWxfZGF0YS5kYXRhX3N0YXJ0XTsKKwkJcmVzdWx0LT5kYXRhX2xlbiA9IG9wdGlvbmFsX2RhdGEuZGF0YV9sZW47CisJfSBlbHNlIHsKKwkJcmVzdWx0LT5kYXRhX2xlbiA9IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBfc2NjcF9wYXJzZV9jb25uZWN0aW9uX3JlZnVzZWQoc3RydWN0IG1zZ2IgKm1zZ2IsIHN0cnVjdCBzY2NwX3BhcnNlX3Jlc3VsdCAqcmVzdWx0KQoreworCXN0YXRpYyBjb25zdCB1X2ludDMyX3QgaGVhZGVyX3NpemUgPQorCQkJc2l6ZW9mKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVmdXNlZCk7CisJc3RhdGljIGludCBvcHRpb25hbF9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlZnVzZWQsIG9wdGlvbmFsX3N0YXJ0KTsKKworCXN0cnVjdCBzY2NwX29wdGlvbmFsX2RhdGEgb3B0aW9uYWxfZGF0YTsKKwlzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlZnVzZWQgKnJlZjsKKworCS8qIGhlYWRlciBjaGVjayAqLworCWlmIChtc2diX2wybGVuKG1zZ2IpIDwgaGVhZGVyX3NpemUpIHsKKwkJREVCVUdQKERTQ0NQLCAibXNnYiA8IGhlYWRlcl9zaXplICV1ICV1XG4iLAorCQkgICAgICAgIG1zZ2JfbDJsZW4obXNnYiksIGhlYWRlcl9zaXplKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJlZiA9IChzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlZnVzZWQgKikgbXNnYi0+bDJoOworCisJcmVzdWx0LT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UgPSAmcmVmLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2U7CisKKwltZW1zZXQoJm9wdGlvbmFsX2RhdGEsIDAsIHNpemVvZihvcHRpb25hbF9kYXRhKSk7CisJaWYgKF9zY2NwX3BhcnNlX29wdGlvbmFsX2RhdGEob3B0aW9uYWxfb2Zmc2V0ICsgcmVmLT5vcHRpb25hbF9zdGFydCwgbXNnYiwgJm9wdGlvbmFsX2RhdGEpICE9IDApIHsKKwkJREVCVUdQKERTQ0NQLCAicGFyc2luZyBvZiBvcHRpb25hbCBkYXRhIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogb3B0aW9uYWwgZGF0YSAqLworCWlmIChvcHRpb25hbF9kYXRhLmRhdGFfbGVuICE9IDApIHsKKwkJbXNnYi0+bDNoID0gJm1zZ2ItPmwyaFtvcHRpb25hbF9kYXRhLmRhdGFfc3RhcnRdOworCQlyZXN1bHQtPmRhdGFfbGVuID0gb3B0aW9uYWxfZGF0YS5kYXRhX2xlbjsKKwl9IGVsc2UgeworCQlyZXN1bHQtPmRhdGFfbGVuID0gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IF9zY2NwX3BhcnNlX2Nvbm5lY3Rpb25fY29uZmlybShzdHJ1Y3QgbXNnYiAqbXNnYiwgc3RydWN0IHNjY3BfcGFyc2VfcmVzdWx0ICpyZXN1bHQpCit7CisJc3RhdGljIHVfaW50MzJfdCBoZWFkZXJfc2l6ZSA9CisJCSAgICBzaXplb2Yoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9jb25maXJtKTsKKwlzdGF0aWMgY29uc3QgdV9pbnQzMl90IG9wdGlvbmFsX29mZnNldCA9CisJCQlvZmZzZXRvZihzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX2NvbmZpcm0sIG9wdGlvbmFsX3N0YXJ0KTsKKworCXN0cnVjdCBzY2NwX29wdGlvbmFsX2RhdGEgb3B0aW9uYWxfZGF0YTsKKwlzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX2NvbmZpcm0gKmNvbjsKKworCS8qIGhlYWRlciBjaGVjayAqLworCWlmIChtc2diX2wybGVuKG1zZ2IpIDwgaGVhZGVyX3NpemUpIHsKKwkJREVCVUdQKERTQ0NQLCAibXNnYiA8IGhlYWRlcl9zaXplICV1ICV1XG4iLAorCQkgICAgICAgIG1zZ2JfbDJsZW4obXNnYiksIGhlYWRlcl9zaXplKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWNvbiA9IChzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX2NvbmZpcm0gKikgbXNnYi0+bDJoOworCXJlc3VsdC0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlID0gJmNvbi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlOworCXJlc3VsdC0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSA9ICZjb24tPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2U7CisKKwltZW1zZXQoJm9wdGlvbmFsX2RhdGEsIDAsIHNpemVvZihvcHRpb25hbF9kYXRhKSk7CisJaWYgKF9zY2NwX3BhcnNlX29wdGlvbmFsX2RhdGEob3B0aW9uYWxfb2Zmc2V0ICsgY29uLT5vcHRpb25hbF9zdGFydCwgbXNnYiwgJm9wdGlvbmFsX2RhdGEpICE9IDApIHsKKwkJREVCVUdQKERTQ0NQLCAicGFyc2luZyBvZiBvcHRpb25hbCBkYXRhIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKG9wdGlvbmFsX2RhdGEuZGF0YV9sZW4gIT0gMCkgeworCQltc2diLT5sM2ggPSAmbXNnYi0+bDJoW29wdGlvbmFsX2RhdGEuZGF0YV9zdGFydF07CisJCXJlc3VsdC0+ZGF0YV9sZW4gPSBvcHRpb25hbF9kYXRhLmRhdGFfbGVuOworCX0gZWxzZSB7CisJCXJlc3VsdC0+ZGF0YV9sZW4gPSAwOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgX3NjY3BfcGFyc2VfY29ubmVjdGlvbl9yZWxlYXNlX2NvbXBsZXRlKHN0cnVjdCBtc2diICptc2diLCBzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgKnJlc3VsdCkKK3sKKwlzdGF0aWMgaW50IGhlYWRlcl9zaXplID0gc2l6ZW9mKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVsZWFzZV9jb21wbGV0ZSk7CisKKwlzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlbGVhc2VfY29tcGxldGUgKmNtcGw7CisKKwkvKiBoZWFkZXIgY2hlY2sgKi8KKwlpZiAobXNnYl9sMmxlbihtc2diKSA8IGhlYWRlcl9zaXplKSB7CisJCURFQlVHUChEU0NDUCwgIm1zZ2IgPCBoZWFkZXJfc2l6ZSAldSAldVxuIiwKKwkJICAgICAgICBtc2diX2wybGVuKG1zZ2IpLCBoZWFkZXJfc2l6ZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwljbXBsID0gKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVsZWFzZV9jb21wbGV0ZSAqKSBtc2diLT5sMmg7CisJcmVzdWx0LT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlID0gJmNtcGwtPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2U7CisJcmVzdWx0LT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UgPSAmY21wbC0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBfc2NjcF9wYXJzZV9jb25uZWN0aW9uX2R0MShzdHJ1Y3QgbXNnYiAqbXNnYiwgc3RydWN0IHNjY3BfcGFyc2VfcmVzdWx0ICpyZXN1bHQpCit7CisJc3RhdGljIGludCBoZWFkZXJfc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc2NjcF9kYXRhX2Zvcm0xKTsKKwlzdGF0aWMgaW50IHZhcmlhYmxlX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBzY2NwX2RhdGFfZm9ybTEsIHZhcmlhYmxlX3N0YXJ0KTsKKworCXN0cnVjdCBzY2NwX2RhdGFfZm9ybTEgKmR0MSA9IChzdHJ1Y3Qgc2NjcF9kYXRhX2Zvcm0xICopbXNnYi0+bDJoOworCisJLyogd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggc2l6ZSBmb3IgdGhlIHN0cnVjdCAqLworCWlmIChtc2diX2wybGVuKG1zZ2IpIDwgaGVhZGVyX3NpemUpIHsKKwkJREVCVUdQKERTQ0NQLCAibXNnYiA+IGhlYWRlcl9zaXplICV1ICV1XG4iLAorCQkgICAgICAgIG1zZ2JfbDJsZW4obXNnYiksIGhlYWRlcl9zaXplKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChkdDEtPnNlZ21lbnRpbmcgIT0gMCkgeworCQlERUJVR1AoRFNDQ1AsICJUaGlzIHBhY2tldCBoYXMgc2VnbWVudGluZywgbm90IHN1cHBvcnRlZDogJWRcbiIsIGR0MS0+c2VnbWVudGluZyk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXN1bHQtPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSA9ICZkdDEtPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZTsKKworCS8qIHNvbWUgbW9yZSAgc2l6ZSBjaGVja3MgaW4gaGVyZSAqLworCWlmIChtc2diX2wybGVuKG1zZ2IpIDwgdmFyaWFibGVfb2Zmc2V0ICsgZHQxLT52YXJpYWJsZV9zdGFydCArIDEpIHsKKwkJREVCVUdQKERTQ0NQLCAiTm90IGVub3VnaCBzcGFjZSBmb3IgdmFyaWFibGUgc3RhcnQ6ICV1ICV1XG4iLAorCQkJbXNnYl9sMmxlbihtc2diKSwgZHQxLT52YXJpYWJsZV9zdGFydCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXN1bHQtPmRhdGFfbGVuID0gbXNnYi0+bDJoW3ZhcmlhYmxlX29mZnNldCArIGR0MS0+dmFyaWFibGVfc3RhcnRdOworCW1zZ2ItPmwzaCA9ICZtc2diLT5sMmhbZHQxLT52YXJpYWJsZV9zdGFydCArIHZhcmlhYmxlX29mZnNldCArIDFdOworCisJaWYgKG1zZ2JfbDNsZW4obXNnYikgPCByZXN1bHQtPmRhdGFfbGVuKSB7CisJCURFQlVHUChEU0NDUCwgIk5vdCBlbm91Z2ggcm9vbSBmb3IgdGhlIHBheWxvYWQ6ICV1ICV1XG4iLAorCQkJbXNnYl9sM2xlbihtc2diKSwgcmVzdWx0LT5kYXRhX2xlbik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IF9zY2NwX3BhcnNlX3VkdChzdHJ1Y3QgbXNnYiAqbXNnYiwgc3RydWN0IHNjY3BfcGFyc2VfcmVzdWx0ICpyZXN1bHQpCit7CisJc3RhdGljIGNvbnN0IHVfaW50MzJfdCBoZWFkZXJfc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc2NjcF9kYXRhX3VuaXRkYXRhKTsKKwlzdGF0aWMgY29uc3QgdV9pbnQzMl90IGNhbGxlZF9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3Qgc2NjcF9kYXRhX3VuaXRkYXRhLCB2YXJpYWJsZV9jYWxsZWQpOworCXN0YXRpYyBjb25zdCB1X2ludDMyX3QgY2FsbGluZ19vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3Qgc2NjcF9kYXRhX3VuaXRkYXRhLCB2YXJpYWJsZV9jYWxsaW5nKTsKKwlzdGF0aWMgY29uc3QgdV9pbnQzMl90IGRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHNjY3BfZGF0YV91bml0ZGF0YSwgdmFyaWFibGVfZGF0YSk7CisKKwlzdHJ1Y3Qgc2NjcF9kYXRhX3VuaXRkYXRhICp1ZHQgPSAoc3RydWN0IHNjY3BfZGF0YV91bml0ZGF0YSAqKW1zZ2ItPmwyaDsKKworCWlmIChtc2diX2wybGVuKG1zZ2IpIDwgaGVhZGVyX3NpemUpIHsKKwkJREVCVUdQKERTQ0NQLCAibXNnYiA8IGhlYWRlcl9zaXplICV1ICV1XG4iLAorCQkgICAgICAgIG1zZ2JfbDJsZW4obXNnYiksIGhlYWRlcl9zaXplKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIGNvcHkgb3V0IHRoZSBjYWxsaW5nIGFuZCBjYWxsZWQgYWRkcmVzcy4gQWRkIHRoZSBvZmYgKi8KKwlpZiAoY29weV9hZGRyZXNzKCZyZXN1bHQtPmNhbGxlZCwgY2FsbGVkX29mZnNldCArIHVkdC0+dmFyaWFibGVfY2FsbGVkLCBtc2diKSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoY2hlY2tfYWRkcmVzcygmcmVzdWx0LT5jYWxsZWQpICE9IDApIHsKKwkJREVCVUdQKERTQ0NQLCAiSW52YWxpZCBjYWxsZWQgYWRkcmVzcyBhY2NvcmRpbmcgdG8gMDguMDY6IDB4JXggMHgleFxuIiwKKwkJCSoodV9pbnQ4X3QgKikmcmVzdWx0LT5jYWxsZWQuYWRkcmVzcywgcmVzdWx0LT5jYWxsZWQuc3NuKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChjb3B5X2FkZHJlc3MoJnJlc3VsdC0+Y2FsbGluZywgY2FsbGluZ19vZmZzZXQgKyB1ZHQtPnZhcmlhYmxlX2NhbGxpbmcsIG1zZ2IpICE9IDApCisJCXJldHVybiAtMTsKKworCWlmIChjaGVja19hZGRyZXNzKCZyZXN1bHQtPmNhbGxpbmcpICE9IDApIHsKKwkJREVCVUdQKERTQ0NQLCAiSW52YWxpZCBjYWxsZWQgYWRkcmVzcyBhY2NvcmRpbmcgdG8gMDguMDY6IDB4JXggMHgleFxuIiwKKwkJCSoodV9pbnQ4X3QgKikmcmVzdWx0LT5jYWxsZWQuYWRkcmVzcywgcmVzdWx0LT5jYWxsZWQuc3NuKTsKKwl9CisKKwkvKiB3ZSBkb24ndCBoYXZlIGVub3VnaCBzaXplIGZvciB0aGUgZGF0YSAqLworCWlmIChtc2diX2wybGVuKG1zZ2IpIDwgZGF0YV9vZmZzZXQgKyB1ZHQtPnZhcmlhYmxlX2RhdGEgKyAxKSB7CisJCURFQlVHUChEU0NDUCwgIm1zZ2IgPCBoZWFkZXIgKyBvZmZzZXQgJXUgJXUgJXVcbiIsCisJCQltc2diX2wybGVuKG1zZ2IpLCBoZWFkZXJfc2l6ZSwgdWR0LT52YXJpYWJsZV9kYXRhKTsKKwkJcmV0dXJuIC0xOworCX0KKworCisJbXNnYi0+bDNoID0gJnVkdC0+ZGF0YVt1ZHQtPnZhcmlhYmxlX2RhdGFdOworCXJlc3VsdC0+ZGF0YV9sZW4gPSBtc2diX2wzbGVuKG1zZ2IpOworCisJaWYgKG1zZ2JfbDNsZW4obXNnYikgIT0gIG1zZ2ItPmwzaFstMV0pIHsKKwkJREVCVUdQKERTQ0NQLCAibXNnYiBpcyB0cnVuY2F0ZWQgaXM6ICV1IHNob3VsZDogJXVcbiIsCisJCQltc2diX2wzbGVuKG1zZ2IpLCBtc2diLT5sM2hbLTFdKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9zY2NwX3BhcnNlX2l0KHN0cnVjdCBtc2diICptc2diLCBzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgKnJlc3VsdCkKK3sKKwlzdGF0aWMgY29uc3QgdV9pbnQzMl90IGhlYWRlcl9zaXplID0gc2l6ZW9mKHN0cnVjdCBzY2NwX2RhdGFfaXQpOworCisJc3RydWN0IHNjY3BfZGF0YV9pdCAqaXQ7CisKKwlpZiAobXNnYl9sMmxlbihtc2diKSA8IGhlYWRlcl9zaXplKSB7CisJCURFQlVHUChEU0NDUCwgIm1zZ2IgPCBoZWFkZXJfc2l6ZSAldSAldVxuIiwKKwkJICAgICAgICBtc2diX2wybGVuKG1zZ2IpLCBoZWFkZXJfc2l6ZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpdCA9IChzdHJ1Y3Qgc2NjcF9kYXRhX2l0ICopIG1zZ2ItPmwyaDsKKwlyZXN1bHQtPmRhdGFfbGVuID0gMDsKKwlyZXN1bHQtPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UgPSAmaXQtPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2U7CisJcmVzdWx0LT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UgPSAmaXQtPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZTsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogU2VuZCBVRFQuIEN1cnJlbnRseSB3ZSBoYXZlIGEgZml4ZWQgYWRkcmVzcy4uLgorICovCitzdGF0aWMgaW50IF9zY2NwX3NlbmRfZGF0YShpbnQgY2xhc3MsIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9zY2NwICppbiwKKwkJCSAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9zY2NwICpvdXQsIHN0cnVjdCBtc2diICpwYXlsb2FkKQoreworCXN0cnVjdCBzY2NwX2RhdGFfdW5pdGRhdGEgKnVkdDsKKwl1X2ludDhfdCAqZGF0YTsKKwlpbnQgcmV0OworCisJaWYgKG1zZ2JfbDNsZW4ocGF5bG9hZCkgPiAyNTYpIHsKKwkJREVCVUdQKERTQ0NQLCAiVGhlIHBheWxvYWQgaXMgdG9vIGJpZyBmb3Igb25lIHVkdFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbXNnYl9hbGxvY19oZWFkcm9vbShTQ0NQX01TR19TSVpFLAorCQkJCQkgICAgICAgU0NDUF9NU0dfSEVBRFJPT00sICJzY2NwOiB1ZHQiKTsKKwltc2ctPmwyaCA9ICZtc2ctPmRhdGFbMF07CisJdWR0ID0gKHN0cnVjdCBzY2NwX2RhdGFfdW5pdGRhdGEgKiltc2diX3B1dChtc2csIHNpemVvZigqdWR0KSk7CisKKwl1ZHQtPnR5cGUgPSBTQ0NQX01TR19UWVBFX1VEVDsKKwl1ZHQtPnByb3RvX2NsYXNzID0gY2xhc3M7CisJdWR0LT52YXJpYWJsZV9jYWxsZWQgPSAzOworCXVkdC0+dmFyaWFibGVfY2FsbGluZyA9IDU7CisJdWR0LT52YXJpYWJsZV9kYXRhID0gNzsKKworCS8qIGZvciB2YXJpYWJsZSBkYXRhIHdlIHN0YXJ0IHdpdGggYSBzaXplIGFuZCB0aGUgZGF0YSAqLworCWRhdGEgPSBtc2diX3B1dChtc2csIDEgKyAyKTsKKwlkYXRhWzBdID0gMjsKKwlkYXRhWzFdID0gMHg0MjsKKwlkYXRhWzJdID0gb3V0LT5zY2NwX3NzbjsKKworCWRhdGEgPSBtc2diX3B1dChtc2csIDEgKyAyKTsKKwlkYXRhWzBdID0gMjsKKwlkYXRhWzFdID0gMHg0MjsKKwlkYXRhWzJdID0gaW4tPnNjY3Bfc3NuOworCisJLyogY29weSB0aGUgcGF5bG9hZCAqLworCWRhdGEgPSBtc2diX3B1dChtc2csIDEgKyBtc2diX2wzbGVuKHBheWxvYWQpKTsKKwlkYXRhWzBdID0gbXNnYl9sM2xlbihwYXlsb2FkKTsKKwltZW1jcHkoJmRhdGFbMV0sIHBheWxvYWQtPmwzaCwgbXNnYl9sM2xlbihwYXlsb2FkKSk7CisKKwlyZXQgPSBfc2VuZF9tc2cobXNnKTsKKwltc2diX2ZyZWUobXNnKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX3NjY3BfaGFuZGxlX3JlYWQoc3RydWN0IG1zZ2IgKm1zZ2IpCit7CisJc3RydWN0IHNjY3BfZGF0YV9jYWxsYmFjayAqY2I7CisJc3RydWN0IHNjY3BfcGFyc2VfcmVzdWx0IHJlc3VsdDsKKworCWlmIChfc2NjcF9wYXJzZV91ZHQobXNnYiwgJnJlc3VsdCkgIT0gMCkKKwkJcmV0dXJuIC0xOworCisJY2IgPSBfZmluZF9zc24ocmVzdWx0LmNhbGxlZC5zc24pOworCWlmICghY2IgfHwgIWNiLT5yZWFkX2NiKSB7CisJCURFQlVHUChEU0NDUCwgIk5vIHJvdXRpbmcgZm9yIFVEVCBmb3IgY2FsbGVkIFNTTjogJXVcbiIsIHJlc3VsdC5jYWxsZWQuc3NuKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIHNhbml0eSBjaGVjayAqLworCXJldHVybiBjYi0+cmVhZF9jYihtc2diLCBtc2diX2wzbGVuKG1zZ2IpLCBjYi0+cmVhZF9jb250ZXh0KTsKK30KKworLyoKKyAqIGhhbmRsZSBjb25uZWN0aW9uIG9yaWVudGF0ZWQgbWV0aG9kcworICovCitzdGF0aWMgaW50IHNvdXJjZV9sb2NhbF9yZWZlcmVuY2VfaXNfZnJlZShzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlICpyZWZlcmVuY2UpCit7CisJc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm5lY3Rpb24sICZzY2NwX2Nvbm5lY3Rpb25zLCBsaXN0KSB7CisJCWlmIChtZW1jbXAocmVmZXJlbmNlLCAmY29ubmVjdGlvbi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSwgc2l6ZW9mKCpyZWZlcmVuY2UpKSA9PSAwKQorCQkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZV9pc19mcmVlKHN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UgKnJlZmVyZW5jZSkKK3sKKwlzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoY29ubmVjdGlvbiwgJnNjY3BfY29ubmVjdGlvbnMsIGxpc3QpIHsKKwkJaWYgKG1lbWNtcChyZWZlcmVuY2UsICZjb25uZWN0aW9uLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsIHNpemVvZigqcmVmZXJlbmNlKSkgPT0gMCkKKwkJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhc3NpZ25fc291cmNlX2xvY2FsX3JlZmVyZW5jZShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworCXN0YXRpYyB1X2ludDMyX3QgbGFzdF9yZWYgPSAweDMwMDAwOworCWludCB3cmFwcGVkID0gMDsKKworCWRvIHsKKwkJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSByZWZlcmVuY2U7CisJCXJlZmVyZW5jZS5vY3RldDEgPSAobGFzdF9yZWYgPj4gIDApICYgMHhmZjsKKwkJcmVmZXJlbmNlLm9jdGV0MiA9IChsYXN0X3JlZiA+PiAgOCkgJiAweGZmOworCQlyZWZlcmVuY2Uub2N0ZXQzID0gKGxhc3RfcmVmID4+IDE2KSAmIDB4ZmY7CisKKwkJKytsYXN0X3JlZjsKKwkJLyogZG8gbm90IHVzZSB0aGUgcmV2ZXJzZWQgd29yZCBhbmQgd3JhcCBhcm91bmQgKi8KKwkJaWYgKChsYXN0X3JlZiAmIDB4MDBGRkZGRkYpID09IDB4MDBGRkZGRkYpIHsKKwkJCURFQlVHUChEU0NDUCwgIldyYXBwZWQgc2VhcmNoaW5nIGZvciBhIGZyZWUgY29kZVxuIik7CisJCQlsYXN0X3JlZiA9IDA7CisJCQkrK3dyYXBwZWQ7CisJCX0KKworCQlpZiAoc291cmNlX2xvY2FsX3JlZmVyZW5jZV9pc19mcmVlKCZyZWZlcmVuY2UpID09IDApIHsKKwkJCWNvbm5lY3Rpb24tPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UgPSByZWZlcmVuY2U7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0gd2hpbGUgKHdyYXBwZWQgIT0gMik7CisKKwlERUJVR1AoRFNDQ1AsICJGaW5kaW5nIGEgZnJlZSByZWZlcmVuY2UgZmFpbGVkXG4iKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIF9zY2NwX3NldF9jb25uZWN0aW9uX3N0YXRlKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIGludCBuZXdfc3RhdGUpCit7CisJaW50IG9sZF9zdGF0ZSA9IGNvbm5lY3Rpb24tPmNvbm5lY3Rpb25fc3RhdGU7CisKKwljb25uZWN0aW9uLT5jb25uZWN0aW9uX3N0YXRlID0gbmV3X3N0YXRlOworCWlmIChjb25uZWN0aW9uLT5zdGF0ZV9jYikKKwkJY29ubmVjdGlvbi0+c3RhdGVfY2IoY29ubmVjdGlvbiwgb2xkX3N0YXRlKTsKK30KKworc3RhdGljIGludCBfc2NjcF9zZW5kX3JlZnVzZShzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlICpzcmNfcmVmLCBpbnQgY2F1c2UpCit7CisJc3RydWN0IG1zZ2IgKm1zZ2I7CisJc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWZ1c2VkICpyZWY7CisJdV9pbnQ4X3QgKmRhdGE7CisJaW50IHJldDsKKworCW1zZ2IgPSBtc2diX2FsbG9jX2hlYWRyb29tKFNDQ1BfTVNHX1NJWkUsCisJCQkJICAgU0NDUF9NU0dfSEVBRFJPT00sICJzY2NwIHJlZiIpOworCW1zZ2ItPmwyaCA9ICZtc2diLT5kYXRhWzBdOworCisJcmVmID0gKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVmdXNlZCAqKSBtc2diX3B1dChtc2diLCBzaXplb2YoKnJlZikpOworCXJlZi0+dHlwZSA9IFNDQ1BfTVNHX1RZUEVfQ1JFRjsKKwltZW1jcHkoJnJlZi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLCBzcmNfcmVmLAorCSAgICAgICBzaXplb2Yoc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSkpOworCXJlZi0+Y2F1c2UgPSBjYXVzZTsKKwlyZWYtPm9wdGlvbmFsX3N0YXJ0ID0gMTsKKworCWRhdGEgPSBtc2diX3B1dChtc2diLCAxKTsKKwlkYXRhWzBdID0gU0NDUF9QTkNfRU5EX09GX09QVElPTkFMOworCisJcmV0ID0gX3NlbmRfbXNnKG1zZ2IpOworCW1zZ2JfZnJlZShtc2diKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9zY2NwX3NlbmRfY29ubmVjdGlvbl9jb25maXJtKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisJc3RydWN0IG1zZ2IgKnJlc3BvbnNlOworCXN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fY29uZmlybSAqY29uZmlybTsKKwl1X2ludDhfdCAqb3B0aW9uYWxfZGF0YTsKKwlpbnQgcmV0OworCisJaWYgKGFzc2lnbl9zb3VyY2VfbG9jYWxfcmVmZXJlbmNlKGNvbm5lY3Rpb24pICE9IDApCisJCXJldHVybiAtMTsKKworCXJlc3BvbnNlID0gbXNnYl9hbGxvY19oZWFkcm9vbShTQ0NQX01TR19TSVpFLAorCQkJCSAgICAgICBTQ0NQX01TR19IRUFEUk9PTSwgInNjY3AgY29uZmlybSIpOworCXJlc3BvbnNlLT5sMmggPSAmcmVzcG9uc2UtPmRhdGFbMF07CisKKwljb25maXJtID0gKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fY29uZmlybSAqKSBtc2diX3B1dChyZXNwb25zZSwgc2l6ZW9mKCpjb25maXJtKSk7CisKKwljb25maXJtLT50eXBlID0gU0NDUF9NU0dfVFlQRV9DQzsKKwltZW1jcHkoJmNvbmZpcm0tPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSwKKwkgICAgICAgJmNvbm5lY3Rpb24tPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSwKKwkgICAgICAgc2l6ZW9mKGNvbm5lY3Rpb24tPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSkpOworCW1lbWNweSgmY29uZmlybS0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSwKKwkgICAgICAgJmNvbm5lY3Rpb24tPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsCisJICAgICAgIHNpemVvZihjb25uZWN0aW9uLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlKSk7CisJY29uZmlybS0+cHJvdG9fY2xhc3MgPSAyOworCWNvbmZpcm0tPm9wdGlvbmFsX3N0YXJ0ID0gMTsKKworCW9wdGlvbmFsX2RhdGEgPSAodV9pbnQ4X3QgKikgbXNnYl9wdXQocmVzcG9uc2UsIDEpOworCW9wdGlvbmFsX2RhdGFbMF0gPSBTQ0NQX1BOQ19FTkRfT0ZfT1BUSU9OQUw7CisKKwlyZXQgPSBfc2VuZF9tc2cocmVzcG9uc2UpOworCW1zZ2JfZnJlZShyZXNwb25zZSk7CisKKwlfc2NjcF9zZXRfY29ubmVjdGlvbl9zdGF0ZShjb25uZWN0aW9uLCBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfRVNUQUJMSVNIRUQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX3NjY3Bfc2VuZF9jb25uZWN0aW9uX3JlcXVlc3Qoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkJIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9zY2NwICpjYWxsZWQsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IG1zZ2IgKnJlcXVlc3Q7CisJc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZXF1ZXN0ICpyZXE7CisJdV9pbnQ4X3QgKmRhdGE7CisJdV9pbnQ4X3QgZXh0cmFfc2l6ZSA9IDMgKyAxOworCWludCByZXQ7CisKKworCWlmIChtc2cgJiYgKG1zZ2JfbDNsZW4obXNnKSA8IDMgfHwgbXNnYl9sM2xlbihtc2cpID4gMTMwKSkgeworCQlERUJVR1AoRFNDQ1AsICJJbnZhbGlkIGFtb3VudCBvZiBkYXRhLi4uICVkXG4iLCBtc2diX2wzbGVuKG1zZykpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogdHJ5IHRvIGZpbmQgYSBpZCAqLworCWlmIChhc3NpZ25fc291cmNlX2xvY2FsX3JlZmVyZW5jZShjb25uZWN0aW9uKSAhPSAwKSB7CisJCURFQlVHUChEU0NDUCwgIkFzc2lnbmluZyBhIGxvY2FsIHJlZmVyZW5jZSBmYWlsZWQuXG4iKTsKKwkJX3NjY3Bfc2V0X2Nvbm5lY3Rpb25fc3RhdGUoY29ubmVjdGlvbiwgU0NDUF9DT05ORUNUSU9OX1NUQVRFX1NFVFVQX0VSUk9SKTsKKwkJcmV0dXJuIC0xOworCX0KKworCisJaWYgKG1zZykKKwkJZXh0cmFfc2l6ZSArPSAyICsgbXNnYl9sM2xlbihtc2cpOworCXJlcXVlc3QgPSBtc2diX2FsbG9jX2hlYWRyb29tKFNDQ1BfTVNHX1NJWkUsCisJCQkJICAgICAgU0NDUF9NU0dfSEVBRFJPT00sICJzY2NwIGNvbm5lY3Rpb24gcmVxdWVzdCIpOworCXJlcXVlc3QtPmwyaCA9ICZyZXF1ZXN0LT5kYXRhWzBdOworCXJlcSA9IChzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlcXVlc3QgKikgbXNnYl9wdXQocmVxdWVzdCwgc2l6ZW9mKCpyZXEpKTsKKworCXJlcS0+dHlwZSA9IFNDQ1BfTVNHX1RZUEVfQ1I7CisJbWVtY3B5KCZyZXEtPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsICZjb25uZWN0aW9uLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLAorCSAgICAgICBzaXplb2YoY29ubmVjdGlvbi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSkpOworCXJlcS0+cHJvdG9fY2xhc3MgPSAyOworCXJlcS0+dmFyaWFibGVfY2FsbGVkID0gMjsKKwlyZXEtPm9wdGlvbmFsX3N0YXJ0ID0gNDsKKworCS8qIHdyaXRlIHRoZSBjYWxsZWQgcGFydHkgYWRkcmVzcyAqLworCWRhdGEgPSBtc2diX3B1dChyZXF1ZXN0LCAxICsgMik7CisJZGF0YVswXSA9IDI7CisJZGF0YVsxXSA9IDB4NDI7CisJZGF0YVsyXSA9IGNhbGxlZC0+c2NjcF9zc247CisKKwkvKiB3cml0ZSB0aGUgcGF5bG9hZCAqLworCWlmIChtc2cpIHsKKwkgICAgZGF0YSA9IG1zZ2JfcHV0KHJlcXVlc3QsIDIgKyBtc2diX2wzbGVuKG1zZykpOworCSAgICBkYXRhWzBdID0gU0NDUF9QTkNfREFUQTsKKwkgICAgZGF0YVsxXSA9IG1zZ2JfbDNsZW4obXNnKTsKKwkgICAgbWVtY3B5KCZkYXRhWzJdLCBtc2ctPmwzaCwgbXNnYl9sM2xlbihtc2cpKTsKKwl9CisKKwlkYXRhID0gbXNnYl9wdXQocmVxdWVzdCwgMSk7CisJZGF0YVswXSA9IFNDQ1BfUE5DX0VORF9PRl9PUFRJT05BTDsKKworCWxsaXN0X2FkZF90YWlsKCZjb25uZWN0aW9uLT5saXN0LCAmc2NjcF9jb25uZWN0aW9ucyk7CisJX3NjY3Bfc2V0X2Nvbm5lY3Rpb25fc3RhdGUoY29ubmVjdGlvbiwgU0NDUF9DT05ORUNUSU9OX1NUQVRFX1JFUVVFU1QpOworCisJcmV0ID0gX3NlbmRfbXNnKHJlcXVlc3QpOworCW1zZ2JfZnJlZShyZXF1ZXN0KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX3NjY3Bfc2VuZF9jb25uZWN0aW9uX2RhdGEoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubiwgc3RydWN0IG1zZ2IgKl9kYXRhKQoreworCXN0cnVjdCBtc2diICptc2diOworCXN0cnVjdCBzY2NwX2RhdGFfZm9ybTEgKmR0MTsKKwl1X2ludDhfdCAqZGF0YTsKKwlpbnQgZXh0cmFfc2l6ZTsKKwlpbnQgcmV0OworCisJaWYgKG1zZ2JfbDNsZW4oX2RhdGEpIDwgMiB8fCBtc2diX2wzbGVuKF9kYXRhKSA+IDI1NikgeworCQlERUJVR1AoRFNDQ1AsICJkYXRhIHNpemUgdG9vIGJpZywgc2VnbWVudGluZyB1bmltcGxlbWVudGVkLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlleHRyYV9zaXplID0gMSArIG1zZ2JfbDNsZW4oX2RhdGEpOworCW1zZ2IgPSBtc2diX2FsbG9jX2hlYWRyb29tKFNDQ1BfTVNHX1NJWkUsCisJCQkJICAgU0NDUF9NU0dfSEVBRFJPT00sICJzY2NwIGR0MSIpOworCW1zZ2ItPmwyaCA9ICZtc2diLT5kYXRhWzBdOworCisJZHQxID0gKHN0cnVjdCBzY2NwX2RhdGFfZm9ybTEgKikgbXNnYl9wdXQobXNnYiwgc2l6ZW9mKCpkdDEpKTsKKwlkdDEtPnR5cGUgPSBTQ0NQX01TR19UWVBFX0RUMTsKKwltZW1jcHkoJmR0MS0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLCAmY29ubi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLAorCSAgICAgICBzaXplb2Yoc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSkpOworCWR0MS0+c2VnbWVudGluZyA9IDA7CisKKwkvKiBjb3B5IHRoZSBkYXRhICovCisJZHQxLT52YXJpYWJsZV9zdGFydCA9IDE7CisJZGF0YSA9IG1zZ2JfcHV0KG1zZ2IsIGV4dHJhX3NpemUpOworCWRhdGFbMF0gPSBleHRyYV9zaXplIC0gMTsKKwltZW1jcHkoJmRhdGFbMV0sIF9kYXRhLT5sM2gsIGV4dHJhX3NpemUgLSAxKTsKKworCXJldCA9IF9zZW5kX21zZyhtc2diKTsKKwltc2diX2ZyZWUobXNnYik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9zY2NwX3NlbmRfY29ubmVjdGlvbl9pdChzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uKQoreworCXN0cnVjdCBtc2diICptc2diOworCXN0cnVjdCBzY2NwX2RhdGFfaXQgKml0OworCWludCByZXQ7CisKKwltc2diID0gbXNnYl9hbGxvY19oZWFkcm9vbShTQ0NQX01TR19TSVpFLAorCQkJCSAgIFNDQ1BfTVNHX0hFQURST09NLCAic2NjcCBpdCIpOworCW1zZ2ItPmwyaCA9ICZtc2diLT5kYXRhWzBdOworCWl0ID0gKHN0cnVjdCBzY2NwX2RhdGFfaXQgKikgbXNnYl9wdXQobXNnYiwgc2l6ZW9mKCppdCkpOworCWl0LT50eXBlID0gU0NDUF9NU0dfVFlQRV9JVDsKKwltZW1jcHkoJml0LT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsICZjb25uLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsCisJCXNpemVvZihzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlKSk7CisJbWVtY3B5KCZpdC0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSwgJmNvbm4tPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsCisJCXNpemVvZihzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlKSk7CisKKwlpdC0+cHJvdG9fY2xhc3MgPSAweDI7CisJaXQtPnNlcXVlbmNpbmdbMF0gPSBpdC0+c2VxdWVuY2luZ1sxXSA9IDA7CisJaXQtPmNyZWRpdCA9IDA7CisKKwlyZXQgPSBfc2VuZF9tc2cobXNnYik7CisJbXNnYl9mcmVlKG1zZ2IpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX3NjY3Bfc2VuZF9jb25uZWN0aW9uX3JlbGVhc2VkKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm4sIGludCBjYXVzZSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCXN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVsZWFzZWQgKnJlbDsKKwl1X2ludDhfdCAqZGF0YTsKKwlpbnQgcmV0OworCisJbXNnID0gbXNnYl9hbGxvY19oZWFkcm9vbShTQ0NQX01TR19TSVpFLCBTQ0NQX01TR19IRUFEUk9PTSwKKwkJCQkgICJzY2NwOiBjb25uZWN0aW9uIHJlbGVhc2VkIik7CisJbXNnLT5sMmggPSAmbXNnLT5kYXRhWzBdOworCXJlbCA9IChzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlbGVhc2VkICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpyZWwpKTsKKwlyZWwtPnR5cGUgPSBTQ0NQX01TR19UWVBFX1JMU0Q7CisJcmVsLT5yZWxlYXNlX2NhdXNlID0gY2F1c2U7CisKKwkvKiBjb3B5IHRoZSBzb3VyY2UgcmVmZXJlbmNlcyAqLworCW1lbWNweSgmcmVsLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsICZjb25uLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsCisJICAgICAgIHNpemVvZihzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlKSk7CisJbWVtY3B5KCZyZWwtPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsICZjb25uLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLAorCSAgICAgICBzaXplb2Yoc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSkpOworCisJZGF0YSA9IG1zZ2JfcHV0KG1zZywgMSk7CisJZGF0YVswXSA9IFNDQ1BfUE5DX0VORF9PRl9PUFRJT05BTDsKKworCV9zY2NwX3NldF9jb25uZWN0aW9uX3N0YXRlKGNvbm4sIFNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRUxFQVNFKTsKKwlyZXQgPSBfc2VuZF9tc2cobXNnKTsKKwltc2diX2ZyZWUobXNnKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBPcGVuIGEgY29ubmVjdGlvbi4gVGhlIGZvbGxvd2luZyBpcyBnb2luZyB0byBoYXBwZW46CisgKgorICoJLSBWZXJpZnkgdGhlIHBhY2tldCwgZS5nLiB0aGF0IHdlIGhhdmUgbm8gb3RoZXIgY29ubmVjdGlvbgorICoJICB0aGF0IGlkLgorICogICAgICAtIEFzayB0aGUgdXNlciBpZiBoZSB3YW50cyB0byBhY2NlcHQgdGhlIGNvbm5lY3Rpb24KKyAqICAgICAgLSBUcnkgdG8gb3BlbiB0aGUgY29ubmVjdGlvbiBieSBhc3NpZ25pbmcgYSBzb3VyY2UgbG9jYWwgcmVmZXJlbmNlCisgKiAgICAgICAgYW5kIHNlbmRpbmcgdGhlIHBhY2tldAorICovCitzdGF0aWMgaW50IF9zY2NwX2hhbmRsZV9jb25uZWN0aW9uX3JlcXVlc3Qoc3RydWN0IG1zZ2IgKm1zZ2IpCit7CisJc3RydWN0IHNjY3BfcGFyc2VfcmVzdWx0IHJlc3VsdDsKKworCXN0cnVjdCBzY2NwX2RhdGFfY2FsbGJhY2sgKmNiOworCXN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisKKwlpZiAoX3NjY3BfcGFyc2VfY29ubmVjdGlvbl9yZXF1ZXN0KG1zZ2IsICZyZXN1bHQpICE9IDApCisJCXJldHVybiAtMTsKKworCWNiID0gX2ZpbmRfc3NuKHJlc3VsdC5jYWxsZWQuc3NuKTsKKwlpZiAoIWNiIHx8ICFjYi0+YWNjZXB0X2NiKSB7CisJCURFQlVHUChEU0NDUCwgIk5vIHJvdXRpbmcgZm9yIENSIGZvciBjYWxsZWQgU1NOOiAldVxuIiwgcmVzdWx0LmNhbGxlZC5zc24pOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogY2hlY2sgaWYgdGhlIHN5c3RlbSB3YW50cyB0aGlzIGNvbm5lY3Rpb24gKi8KKwljb25uZWN0aW9uID0gdGFsbG9jX3plcm8odGFsbF9zY2NwX2N0eCwgc3RydWN0IHNjY3BfY29ubmVjdGlvbik7CisJaWYgKCFjb25uZWN0aW9uKSB7CisJCURFQlVHUChEU0NDUCwgIkFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qCisJICogc2FuaXR5IGNoZWNrczoKKwkgKgktIElzIHRoZSBzb3VyY2VfbG9jYWxfcmVmZXJlbmNlIGluIGFueSBvdGhlciBjb25uZWN0aW9uPworCSAqIHRoZW4gd2lsbCBjYWxsIGFjY2VwdCwgYXNzaWduIGEgImRlc3RpbmF0aW9uIiBsb2NhbCByZWZlcmVuY2UKKwkgKiBhbmQgc2VuZCBhIGNvbm5lY3Rpb24gY29uZmlybSwgb3RoZXJ3aXNlIHdlIHdpbGwgc2VuZCBhIHJlZnVzZWVkCisJICogb25lLi4uLgorCSAqLworCWlmIChkZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2VfaXNfZnJlZShyZXN1bHQuc291cmNlX2xvY2FsX3JlZmVyZW5jZSkgIT0gMCkgeworCQlERUJVR1AoRFNDQ1AsICJOZWVkIHRvIHJlamVjdCBjb25uZWN0aW9uIHdpdGggZXhpc3RpbmcgcmVmZXJlbmNlXG4iKTsKKwkJX3NjY3Bfc2VuZF9yZWZ1c2UocmVzdWx0LnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsIFNDQ1BfUkVGVVNBTF9TQ0NQX0ZBSUxVUkUpOworCQl0YWxsb2NfZnJlZShjb25uZWN0aW9uKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWNvbm5lY3Rpb24tPmluY29taW5nID0gMTsKKwljb25uZWN0aW9uLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UgPSAqcmVzdWx0LnNvdXJjZV9sb2NhbF9yZWZlcmVuY2U7CisKKwlpZiAoY2ItPmFjY2VwdF9jYihjb25uZWN0aW9uLCBjYi0+YWNjZXB0X2NvbnRleHQpICE9IDApIHsKKwkJX3NjY3Bfc2VuZF9yZWZ1c2UocmVzdWx0LnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsIFNDQ1BfUkVGVVNBTF9FTkRfVVNFUl9PUklHSU5BVEVEKTsKKwkJX3NjY3Bfc2V0X2Nvbm5lY3Rpb25fc3RhdGUoY29ubmVjdGlvbiwgU0NDUF9DT05ORUNUSU9OX1NUQVRFX1JFRlVTRUQpOworCQl0YWxsb2NfZnJlZShjb25uZWN0aW9uKTsKKwkJcmV0dXJuIDA7CisJfQorCisKKwlsbGlzdF9hZGRfdGFpbCgmY29ubmVjdGlvbi0+bGlzdCwgJnNjY3BfY29ubmVjdGlvbnMpOworCisJaWYgKF9zY2NwX3NlbmRfY29ubmVjdGlvbl9jb25maXJtKGNvbm5lY3Rpb24pICE9IDApIHsKKwkJREVCVUdQKERTQ0NQLCAiU2VuZGluZyBjb25maXJtIGZhaWxlZC4uLiBubyBhdmFpbGFibGUgc291cmNlIHJlZmVyZW5jZT9cbiIpOworCisJCV9zY2NwX3NlbmRfcmVmdXNlKHJlc3VsdC5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLCBTQ0NQX1JFRlVTQUxfU0NDUF9GQUlMVVJFKTsKKwkJX3NjY3Bfc2V0X2Nvbm5lY3Rpb25fc3RhdGUoY29ubmVjdGlvbiwgU0NDUF9DT05ORUNUSU9OX1NUQVRFX1JFRlVTRUQpOworCQlsbGlzdF9kZWwoJmNvbm5lY3Rpb24tPmxpc3QpOworCQl0YWxsb2NfZnJlZShjb25uZWN0aW9uKTsKKworCQlyZXR1cm4gLTE7CisJfQorCisJLyoKKwkgKiBJZiB3ZSBoYXZlIGRhdGEgbGV0IHVzIGZvcndhcmQgdGhpbmdzLgorCSAqLworCWlmIChyZXN1bHQuZGF0YV9sZW4gIT0gMCAmJiBjb25uZWN0aW9uLT5kYXRhX2NiKSB7CisJCWNvbm5lY3Rpb24tPmRhdGFfY2IoY29ubmVjdGlvbiwgbXNnYiwgcmVzdWx0LmRhdGFfbGVuKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogSGFuZGxlIHRoZSByZWxlYXNlIGNvbmZpcm1lZCAqLworc3RhdGljIGludCBfc2NjcF9oYW5kbGVfY29ubmVjdGlvbl9yZWxlYXNlX2NvbXBsZXRlKHN0cnVjdCBtc2diICptc2diKQoreworCXN0cnVjdCBzY2NwX3BhcnNlX3Jlc3VsdCByZXN1bHQ7CisJc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubjsKKworCWlmIChfc2NjcF9wYXJzZV9jb25uZWN0aW9uX3JlbGVhc2VfY29tcGxldGUobXNnYiwgJnJlc3VsdCkgIT0gMCkKKwkJcmV0dXJuIC0xOworCisJLyogZmluZCB0aGUgY29ubmVjdGlvbiAqLworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm4sICZzY2NwX2Nvbm5lY3Rpb25zLCBsaXN0KSB7CisJCWlmIChjb25uLT5kYXRhX2NiCisJCSAgICAmJiBtZW1jbXAoJmNvbm4tPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsCisJCQkgICAgICByZXN1bHQuZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLAorCQkJICAgICAgc2l6ZW9mKGNvbm4tPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UpKSA9PSAwCisJCSAgICAmJiBtZW1jbXAoJmNvbm4tPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSwKKwkJCSAgICAgIHJlc3VsdC5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLAorCQkJICAgICAgc2l6ZW9mKGNvbm4tPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSkpID09IDApIHsKKwkJICAgIGdvdG8gZm91bmQ7CisJCX0KKwl9CisKKworCURFQlVHUChEU0NDUCwgIlJlbGVhc2UgY29tcGxldGUgb2YgdW5rbm93biBjb25uZWN0aW9uXG4iKTsKKwlyZXR1cm4gLTE7CisKK2ZvdW5kOgorCWxsaXN0X2RlbCgmY29ubi0+bGlzdCk7CisJX3NjY3Bfc2V0X2Nvbm5lY3Rpb25fc3RhdGUoY29ubiwgU0NDUF9DT05ORUNUSU9OX1NUQVRFX1JFTEVBU0VfQ09NUExFVEUpOworCXJldHVybiAwOworfQorCisvKiBIYW5kbGUgdGhlIERhdGEgRm9ybSAxIG1lc3NhZ2UgKi8KK3N0YXRpYyBpbnQgX3NjY3BfaGFuZGxlX2Nvbm5lY3Rpb25fZHQxKHN0cnVjdCBtc2diICptc2diKQoreworCXN0cnVjdCBzY2NwX3BhcnNlX3Jlc3VsdCByZXN1bHQ7CisJc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubjsKKworCWlmIChfc2NjcF9wYXJzZV9jb25uZWN0aW9uX2R0MShtc2diLCAmcmVzdWx0KSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKwkvKiBsb29rdXAgaWYgd2UgaGF2ZSBhIGNvbm5lY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gcmVmZXJlbmNlICovCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoY29ubiwgJnNjY3BfY29ubmVjdGlvbnMsIGxpc3QpIHsKKwkJaWYgKGNvbm4tPmRhdGFfY2IKKwkJICAgICYmIG1lbWNtcCgmY29ubi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSwKKwkJCSAgICAgIHJlc3VsdC5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsCisJCQkgICAgICBzaXplb2YoY29ubi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSkpID09IDApIHsKKwkJCWdvdG8gZm91bmQ7CisJCX0KKwl9CisKKwlERUJVR1AoRFNDQ1AsICJObyBjb25uZWN0aW9uIGZvdW5kIGZvciBkdDEgZGF0YVxuIik7CisJcmV0dXJuIC0xOworCitmb3VuZDoKKwljb25uLT5kYXRhX2NiKGNvbm4sIG1zZ2IsIHJlc3VsdC5kYXRhX2xlbik7CisJcmV0dXJuIDA7Cit9CisKKy8qIGNvbmZpcm0gYSBjb25uZWN0aW9uIHJlbGVhc2UgKi8KK3N0YXRpYyBpbnQgX3NjY3Bfc2VuZF9jb25uZWN0aW9uX3JlbGVhc2VfY29tcGxldGUoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnYjsKKwlzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlbGVhc2VfY29tcGxldGUgKnJsYzsKKwlpbnQgcmV0OworCisJbXNnYiA9IG1zZ2JfYWxsb2NfaGVhZHJvb20oU0NDUF9NU0dfU0laRSwKKwkJCQkgICBTQ0NQX01TR19IRUFEUk9PTSwgInNjY3AgcmxjIik7CisJbXNnYi0+bDJoID0gJm1zZ2ItPmRhdGFbMF07CisKKwlybGMgPSAoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWxlYXNlX2NvbXBsZXRlICopIG1zZ2JfcHV0KG1zZ2IsIHNpemVvZigqcmxjKSk7CisJcmxjLT50eXBlID0gU0NDUF9NU0dfVFlQRV9STEM7CisJbWVtY3B5KCZybGMtPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSwKKwkgICAgICAgJmNvbm5lY3Rpb24tPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSwgc2l6ZW9mKHN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UpKTsKKwltZW1jcHkoJnJsYy0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSwKKwkgICAgICAgJmNvbm5lY3Rpb24tPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsIHNpemVvZihzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlKSk7CisKKwlyZXQgPSBfc2VuZF9tc2cobXNnYik7CisJbXNnYl9mcmVlKG1zZ2IpOworCisJLyoKKwkgKiBSZW1vdmUgZnJvbSB0aGUgbGlzdCBvZiBhY3RpdmUgY29ubmVjdGlvbnMgYW5kIHNldCB0aGUgc3RhdGUuIFVzZXIgY29kZQorCSAqIHNob3VsZCBub3cgZnJlZSB0aGUgZW50cnkuCisJICovCisJbGxpc3RfZGVsKCZjb25uZWN0aW9uLT5saXN0KTsKKwlfc2NjcF9zZXRfY29ubmVjdGlvbl9zdGF0ZShjb25uZWN0aW9uLCBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfUkVMRUFTRV9DT01QTEVURSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBjb25uZWN0aW9uIHJlbGVhc2VkLCBzZW5kIGEgcmVsZWFzZWQgY29uZmlybSAqLworc3RhdGljIGludCBfc2NjcF9oYW5kbGVfY29ubmVjdGlvbl9yZWxlYXNlZChzdHJ1Y3QgbXNnYiAqbXNnYikKK3sKKwlzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgcmVzdWx0OworCXN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm47CisKKwlpZiAoX3NjY3BfcGFyc2VfY29ubmVjdGlvbl9yZWxlYXNlZChtc2diLCAmcmVzdWx0KSA9PSAtMSkKKwkJcmV0dXJuIC0xOworCisJLyogbG9va3VwIGlmIHdlIGhhdmUgYSBjb25uZWN0aW9uIHdpdGggdGhlIGdpdmVuIHJlZmVyZW5jZSAqLworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm4sICZzY2NwX2Nvbm5lY3Rpb25zLCBsaXN0KSB7CisJCWlmIChjb25uLT5kYXRhX2NiCisJCSAgICAmJiBtZW1jbXAoJmNvbm4tPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsCisJCQkgICAgICByZXN1bHQuZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLAorCQkJICAgICAgc2l6ZW9mKGNvbm4tPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UpKSA9PSAwCisJCSAgICAmJiBtZW1jbXAoJmNvbm4tPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSwKKwkJCSAgICAgIHJlc3VsdC5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLAorCQkJICAgICAgc2l6ZW9mKGNvbm4tPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSkpID09IDApIHsKKwkJICAgIGdvdG8gZm91bmQ7CisJCX0KKwl9CisKKworCURFQlVHUChEU0NDUCwgIlVua25vd24gY29ubmVjdGlvbiB3YXMgcmVsZWFzZWQuXG4iKTsKKwlyZXR1cm4gLTE7CisKKwkvKiB3ZSBoYXZlIGZvdW5kIGEgY29ubmVjdGlvbiAqLworZm91bmQ6CisJLyogb3B0aW9uYWwgZGF0YSAqLworCWlmIChyZXN1bHQuZGF0YV9sZW4gIT0gMCAmJiBjb25uLT5kYXRhX2NiKSB7CisJCWNvbm4tPmRhdGFfY2IoY29ubiwgbXNnYiwgcmVzdWx0LmRhdGFfbGVuKTsKKwl9CisKKwkvKiBnZW5lcmF0ZSBhIHJlc3BvbnNlICovCisJaWYgKF9zY2NwX3NlbmRfY29ubmVjdGlvbl9yZWxlYXNlX2NvbXBsZXRlKGNvbm4pICE9IDApIHsKKwkJREVCVUdQKERTQ0NQLCAiU2VuZGluZyByZWxlYXNlIGNvbmZpcm1lZCBmYWlsZWRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX3NjY3BfaGFuZGxlX2Nvbm5lY3Rpb25fcmVmdXNlZChzdHJ1Y3QgbXNnYiAqbXNnYikKK3sKKwlzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgcmVzdWx0OworCXN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm47CisKKwlpZiAoX3NjY3BfcGFyc2VfY29ubmVjdGlvbl9yZWZ1c2VkKG1zZ2IsICZyZXN1bHQpICE9IDApCisJCXJldHVybiAtMTsKKworCS8qIGxvb2t1cCBpZiB3ZSBoYXZlIGEgY29ubmVjdGlvbiB3aXRoIHRoZSBnaXZlbiByZWZlcmVuY2UgKi8KKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uLCAmc2NjcF9jb25uZWN0aW9ucywgbGlzdCkgeworCQlpZiAoY29ubi0+aW5jb21pbmcgPT0gMCAmJiBjb25uLT5kYXRhX2NiCisJCSAgICAmJiBtZW1jbXAoJmNvbm4tPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsCisJCQkgICAgICByZXN1bHQuZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLAorCQkJICAgICAgc2l6ZW9mKGNvbm4tPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UpKSA9PSAwKSB7CisJCSAgICBnb3RvIGZvdW5kOworCQl9CisJfQorCisJREVCVUdQKERTQ0NQLCAiUmVmdXNlZCBidXQgbm8gY29ubmVjdGlvbiBmb3VuZFxuIik7CisJcmV0dXJuIC0xOworCitmb3VuZDoKKwkvKiBvcHRpb25hbCBkYXRhICovCisJaWYgKHJlc3VsdC5kYXRhX2xlbiAhPSAwICYmIGNvbm4tPmRhdGFfY2IpIHsKKwkJY29ubi0+ZGF0YV9jYihjb25uLCBtc2diLCByZXN1bHQuZGF0YV9sZW4pOworCX0KKworCisJbGxpc3RfZGVsKCZjb25uLT5saXN0KTsKKwlfc2NjcF9zZXRfY29ubmVjdGlvbl9zdGF0ZShjb25uLCBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfUkVGVVNFRCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX3NjY3BfaGFuZGxlX2Nvbm5lY3Rpb25fY29uZmlybShzdHJ1Y3QgbXNnYiAqbXNnYikKK3sKKwlzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgcmVzdWx0OworCXN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm47CisKKwlpZiAoX3NjY3BfcGFyc2VfY29ubmVjdGlvbl9jb25maXJtKG1zZ2IsICZyZXN1bHQpICE9IDApCisJCXJldHVybiAtMTsKKworCS8qIGxvb2t1cCBpZiB3ZSBoYXZlIGEgY29ubmVjdGlvbiB3aXRoIHRoZSBnaXZlbiByZWZlcmVuY2UgKi8KKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uLCAmc2NjcF9jb25uZWN0aW9ucywgbGlzdCkgeworCQlpZiAoY29ubi0+aW5jb21pbmcgPT0gMCAmJiBjb25uLT5kYXRhX2NiCisJCSAgICAmJiBtZW1jbXAoJmNvbm4tPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsCisJCQkgICAgICByZXN1bHQuZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLAorCQkJICAgICAgc2l6ZW9mKGNvbm4tPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UpKSA9PSAwKSB7CisJCSAgICBnb3RvIGZvdW5kOworCQl9CisJfQorCisJREVCVUdQKERTQ0NQLCAiQ29uZmlybWVkIGJ1dCBubyBjb25uZWN0aW9uIGZvdW5kXG4iKTsKKwlyZXR1cm4gLTE7CisKK2ZvdW5kOgorCS8qIGNvcHkgdGhlIGFkZHJlc3NlcyBvZiB0aGUgY29ubmVjdGlvbiAqLworCWNvbm4tPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSA9ICpyZXN1bHQuc291cmNlX2xvY2FsX3JlZmVyZW5jZTsKKwlfc2NjcF9zZXRfY29ubmVjdGlvbl9zdGF0ZShjb25uLCBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfRVNUQUJMSVNIRUQpOworCisJLyogb3B0aW9uYWwgZGF0YSAqLworCWlmIChyZXN1bHQuZGF0YV9sZW4gIT0gMCAmJiBjb25uLT5kYXRhX2NiKSB7CisJCWNvbm4tPmRhdGFfY2IoY29ubiwgbXNnYiwgcmVzdWx0LmRhdGFfbGVuKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitpbnQgc2NjcF9zeXN0ZW1faW5pdChpbnQgKCpvdXRnb2luZykoc3RydWN0IG1zZ2IgKmRhdGEsIHZvaWQgKmN0eCksIHZvaWQgKmN0eCkKK3sKKwlzY2NwX3N5c3RlbS53cml0ZV9kYXRhID0gb3V0Z29pbmc7CisJc2NjcF9zeXN0ZW0ud3JpdGVfY29udGV4dCA9IGN0eDsKKworCXJldHVybiAwOworfQorCisvKiBvaCBteSBnb2QgYSByZWFsIFNDQ1AgcGFja2V0LiBuZWVkIHRvIGRpc3BhdGNoIGl0IG5vdyAqLworaW50IHNjY3Bfc3lzdGVtX2luY29taW5nKHN0cnVjdCBtc2diICptc2diKQoreworCWlmIChtc2diX2wybGVuKG1zZ2IpIDwgMSApIHsKKwkJREVCVUdQKERTQ0NQLCAiVG9vIHNob3J0IHBhY2tldFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpbnQgdHlwZSA9IG1zZ2ItPmwyaFswXTsKKworCXN3aXRjaCh0eXBlKSB7CisJY2FzZSBTQ0NQX01TR19UWVBFX0NSOgorCQlyZXR1cm4gX3NjY3BfaGFuZGxlX2Nvbm5lY3Rpb25fcmVxdWVzdChtc2diKTsKKwkJYnJlYWs7CisJY2FzZSBTQ0NQX01TR19UWVBFX1JMU0Q6CisJCXJldHVybiBfc2NjcF9oYW5kbGVfY29ubmVjdGlvbl9yZWxlYXNlZChtc2diKTsKKwkJYnJlYWs7CisJY2FzZSBTQ0NQX01TR19UWVBFX0NSRUY6CisJCXJldHVybiBfc2NjcF9oYW5kbGVfY29ubmVjdGlvbl9yZWZ1c2VkKG1zZ2IpOworCQlicmVhazsKKwljYXNlIFNDQ1BfTVNHX1RZUEVfQ0M6CisJCXJldHVybiBfc2NjcF9oYW5kbGVfY29ubmVjdGlvbl9jb25maXJtKG1zZ2IpOworCQlicmVhazsKKwljYXNlIFNDQ1BfTVNHX1RZUEVfUkxDOgorCQlyZXR1cm4gX3NjY3BfaGFuZGxlX2Nvbm5lY3Rpb25fcmVsZWFzZV9jb21wbGV0ZShtc2diKTsKKwkJYnJlYWs7CisJY2FzZSBTQ0NQX01TR19UWVBFX0RUMToKKwkJcmV0dXJuIF9zY2NwX2hhbmRsZV9jb25uZWN0aW9uX2R0MShtc2diKTsKKwkJYnJlYWs7CisJY2FzZSBTQ0NQX01TR19UWVBFX1VEVDoKKwkJcmV0dXJuIF9zY2NwX2hhbmRsZV9yZWFkKG1zZ2IpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR1AoRFNDQ1AsICJ1bmltcGxlbWVudGVkIG1zZyB0eXBlOiAlZFxuIiwgdHlwZSk7CisJfTsKKworCXJldHVybiAtMTsKK30KKworLyogY3JlYXRlIGEgcGFja2V0IGZyb20gdGhlIGRhdGEgKi8KK2ludCBzY2NwX2Nvbm5lY3Rpb25fd3JpdGUoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IG1zZ2IgKmRhdGEpCit7CisJaWYgKGNvbm5lY3Rpb24tPmNvbm5lY3Rpb25fc3RhdGUgPCBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfQ09ORklSTQorCSAgICB8fCBjb25uZWN0aW9uLT5jb25uZWN0aW9uX3N0YXRlID4gU0NDUF9DT05ORUNUSU9OX1NUQVRFX0VTVEFCTElTSEVEKSB7CisJCURFQlVHUChEU0NDUCwgInNjY3BfY29ubmVjdGlvbl93cml0ZTogV3JvbmcgY29ubmVjdGlvbiBzdGF0ZTogJXAgJWRcbiIsCisJCSAgICAgICBjb25uZWN0aW9uLCBjb25uZWN0aW9uLT5jb25uZWN0aW9uX3N0YXRlKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiBfc2NjcF9zZW5kX2Nvbm5lY3Rpb25fZGF0YShjb25uZWN0aW9uLCBkYXRhKTsKK30KKworLyoKKyAqIFNlbmQgYSBJbmFjdGl2aXR5IFRlc3QgbWVzc2FnZS4gVGhlIG93bmVyIG9mIHRoZSBjb25uZWN0aW9uCisgKiBzaG91bGQgc3RhcnQgYSB0aW1lciBhbmQgY2FsbCB0aGlzIG1ldGhvZCByZWd1bGFyaWx5LiBDYWxsaW5nCisgKiB0aGlzIGV2ZXJ5IDYwIHNlY29uZHMgc2hvdWxkIGJlIGdvb2QgZW5vdWdoLgorICovCitpbnQgc2NjcF9jb25uZWN0aW9uX3NlbmRfaXQoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKwlpZiAoY29ubmVjdGlvbi0+Y29ubmVjdGlvbl9zdGF0ZSA8IFNDQ1BfQ09OTkVDVElPTl9TVEFURV9DT05GSVJNCisJICAgIHx8IGNvbm5lY3Rpb24tPmNvbm5lY3Rpb25fc3RhdGUgPiBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfRVNUQUJMSVNIRUQpIHsKKwkJREVCVUdQKERTQ0NQLCAic2NjcF9jb25uZWN0aW9uX3dyaXRlOiBXcm9uZyBjb25uZWN0aW9uIHN0YXRlOiAlcCAlZFxuIiwKKwkJICAgICAgIGNvbm5lY3Rpb24sIGNvbm5lY3Rpb24tPmNvbm5lY3Rpb25fc3RhdGUpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIF9zY2NwX3NlbmRfY29ubmVjdGlvbl9pdChjb25uZWN0aW9uKTsKK30KKworLyogc2VuZCBhIGNvbm5lY3Rpb24gcmVsZWFzZSBhbmQgd2FpdCBmb3IgdGhlIGNvbm5lY3Rpb24gcmVsZWFzZWQgKi8KK2ludCBzY2NwX2Nvbm5lY3Rpb25fY2xvc2Uoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgaW50IGNhdXNlKQoreworCWlmIChjb25uZWN0aW9uLT5jb25uZWN0aW9uX3N0YXRlIDwgU0NDUF9DT05ORUNUSU9OX1NUQVRFX0NPTkZJUk0KKwkgICAgfHwgY29ubmVjdGlvbi0+Y29ubmVjdGlvbl9zdGF0ZSA+IFNDQ1BfQ09OTkVDVElPTl9TVEFURV9FU1RBQkxJU0hFRCkgeworCQlERUJVR1BDKERTQ0NQLCAiQ2FuIG5vdCBjbG9zZSB0aGUgY29ubmVjdGlvbi4gSXQgd2FzIG5ldmVyIG9wZW5lZDogJXAgJWRcbiIsCisJCQljb25uZWN0aW9uLCBjb25uZWN0aW9uLT5jb25uZWN0aW9uX3N0YXRlKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiBfc2NjcF9zZW5kX2Nvbm5lY3Rpb25fcmVsZWFzZWQoY29ubmVjdGlvbiwgY2F1c2UpOworfQorCitpbnQgc2NjcF9jb25uZWN0aW9uX2ZyZWUoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKwlpZiAoY29ubmVjdGlvbi0+Y29ubmVjdGlvbl9zdGF0ZSA+IFNDQ1BfQ09OTkVDVElPTl9TVEFURV9OT05FCisJICAgICYmIGNvbm5lY3Rpb24tPmNvbm5lY3Rpb25fc3RhdGUgPCBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfUkVMRUFTRV9DT01QTEVURSkgeworCQlERUJVR1AoRFNDQ1AsICJUaGUgY29ubmVjdGlvbiBuZWVkcyB0byBiZSByZWxlYXNlZCBiZWZvcmUgaXQgaXMgZnJlZWQiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXRhbGxvY19mcmVlKGNvbm5lY3Rpb24pOworCXJldHVybiAwOworfQorCitzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpzY2NwX2Nvbm5lY3Rpb25fc29ja2V0KHZvaWQpCit7CisJcmV0dXJuIHRhbGxvY196ZXJvKHRhbGxfc2NjcF9jdHgsIHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24pOworfQorCitpbnQgc2NjcF9jb25uZWN0aW9uX2Nvbm5lY3Qoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubiwKKwkJCSAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc2NjcCAqbG9jYWwsCisJCQkgICAgc3RydWN0IG1zZ2IgKmRhdGEpCit7CisJcmV0dXJuIF9zY2NwX3NlbmRfY29ubmVjdGlvbl9yZXF1ZXN0KGNvbm4sIGxvY2FsLCBkYXRhKTsKK30KKworaW50IHNjY3BfY29ubmVjdGlvbl9zZXRfaW5jb21pbmcoY29uc3Qgc3RydWN0IHNvY2thZGRyX3NjY3AgKnNvY2ssCisJCQkJIGludCAoKmFjY2VwdF9jYikoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqLCB2b2lkICopLCB2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBzY2NwX2RhdGFfY2FsbGJhY2sgKmNiOworCisJaWYgKCFzb2NrKQorCQlyZXR1cm4gLTI7CisKKwljYiA9IF9maW5kX3Nzbihzb2NrLT5zY2NwX3Nzbik7CisJaWYgKCFjYikKKwkJcmV0dXJuIC0xOworCisJY2ItPmFjY2VwdF9jYiA9IGFjY2VwdF9jYjsKKwljYi0+YWNjZXB0X2NvbnRleHQgPSBjb250ZXh0OworCXJldHVybiAwOworfQorCitpbnQgc2NjcF93cml0ZShzdHJ1Y3QgbXNnYiAqZGF0YSwgY29uc3Qgc3RydWN0IHNvY2thZGRyX3NjY3AgKmluLAorCSAgICAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc2NjcCAqb3V0LCBpbnQgY2xhc3MpCit7CisJcmV0dXJuIF9zY2NwX3NlbmRfZGF0YShjbGFzcywgaW4sIG91dCwgZGF0YSk7Cit9CisKK2ludCBzY2NwX3NldF9yZWFkKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9zY2NwICpzb2NrLAorCQkgIGludCAoKnJlYWRfY2IpKHN0cnVjdCBtc2diICosIHVuc2lnbmVkIGludCwgdm9pZCAqKSwgdm9pZCAqY29udGV4dCkKK3sKKwlzdHJ1Y3Qgc2NjcF9kYXRhX2NhbGxiYWNrICpjYjsKKworCWlmICghc29jaykKKwkJcmV0dXJuIC0yOworCisJY2IgID0gX2ZpbmRfc3NuKHNvY2stPnNjY3Bfc3NuKTsKKwlpZiAoIWNiKQorCQlyZXR1cm4gLTE7CisKKwljYi0+cmVhZF9jYiA9IHJlYWRfY2I7CisJY2ItPnJlYWRfY29udGV4dCA9IGNvbnRleHQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UpIDw9IHNpemVvZih1X2ludDMyX3QpLCBlbm91Z2hfc3BhY2UpOworCit1X2ludDMyX3Qgc2NjcF9zcmNfcmVmX3RvX2ludChzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlICpyZWYpCit7CisJdV9pbnQzMl90IHNyY19yZWYgPSAwOworCW1lbWNweSgmc3JjX3JlZiwgcmVmLCBzaXplb2YoKnJlZikpOworCXJldHVybiBzcmNfcmVmOworfQorCitzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlIHNjY3Bfc3JjX3JlZl9mcm9tX2ludCh1X2ludDMyX3QgaW50X3JlZikKK3sKKwlzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlIHJlZjsKKwltZW1jcHkoJnJlZiwgJmludF9yZWYsIHNpemVvZihyZWYpKTsKKwlyZXR1cm4gcmVmOworfQorCitpbnQgc2NjcF9kZXRlcm1pbmVfbXNnX3R5cGUoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlpZiAobXNnYl9sMmxlbihtc2cpIDwgMSkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIG1zZy0+bDJoWzBdOworfQorCitpbnQgc2NjcF9wYXJzZV9oZWFkZXIoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IHNjY3BfcGFyc2VfcmVzdWx0ICpyZXN1bHQpCit7CisJaW50IHR5cGU7CisKKwlpZiAobXNnYl9sMmxlbihtc2cpIDwgMSkKKwkJcmV0dXJuIC0xOworCisJdHlwZSA9IG1zZy0+bDJoWzBdOworCXN3aXRjaCh0eXBlKSB7CisJY2FzZSBTQ0NQX01TR19UWVBFX0NSOgorCQlyZXR1cm4gX3NjY3BfcGFyc2VfY29ubmVjdGlvbl9yZXF1ZXN0KG1zZywgcmVzdWx0KTsKKwkJYnJlYWs7CisJY2FzZSBTQ0NQX01TR19UWVBFX1JMU0Q6CisJCXJldHVybiBfc2NjcF9wYXJzZV9jb25uZWN0aW9uX3JlbGVhc2VkKG1zZywgcmVzdWx0KTsKKwkJYnJlYWs7CisJY2FzZSBTQ0NQX01TR19UWVBFX0NSRUY6CisJCXJldHVybiBfc2NjcF9wYXJzZV9jb25uZWN0aW9uX3JlZnVzZWQobXNnLCByZXN1bHQpOworCQlicmVhazsKKwljYXNlIFNDQ1BfTVNHX1RZUEVfQ0M6CisJCXJldHVybiBfc2NjcF9wYXJzZV9jb25uZWN0aW9uX2NvbmZpcm0obXNnLCByZXN1bHQpOworCQlicmVhazsKKwljYXNlIFNDQ1BfTVNHX1RZUEVfUkxDOgorCQlyZXR1cm4gX3NjY3BfcGFyc2VfY29ubmVjdGlvbl9yZWxlYXNlX2NvbXBsZXRlKG1zZywgcmVzdWx0KTsKKwkJYnJlYWs7CisJY2FzZSBTQ0NQX01TR19UWVBFX0RUMToKKwkJcmV0dXJuIF9zY2NwX3BhcnNlX2Nvbm5lY3Rpb25fZHQxKG1zZywgcmVzdWx0KTsKKwkJYnJlYWs7CisJY2FzZSBTQ0NQX01TR19UWVBFX1VEVDoKKwkJcmV0dXJuIF9zY2NwX3BhcnNlX3VkdChtc2csIHJlc3VsdCk7CisJCWJyZWFrOworCWNhc2UgU0NDUF9NU0dfVFlQRV9JVDoKKwkJcmV0dXJuIF9zY2NwX3BhcnNlX2l0KG1zZywgcmVzdWx0KTsKKwkJYnJlYWs7CisJfTsKKworCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJVbmltcGxlbWVudGVkIE1TRyBUeXBlOiAweCV4XG4iLCB0eXBlKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBfX2F0dHJpYnV0ZV9fKChjb25zdHJ1Y3RvcikpIHZvaWQgb25fZHNvX2xvYWQodm9pZCkKK3sKKwl0YWxsX3NjY3BfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KE5VTEwsIDEsICJzY2NwIik7Cit9CisKK3N0YXRpYyBfX2F0dHJpYnV0ZV9fKChkZXN0cnVjdG9yKSkgdm9pZCBvbl9kc29fdW5sb2FkKHZvaWQpCit7CisJdGFsbG9jX3JlcG9ydF9mdWxsKHRhbGxfc2NjcF9jdHgsIHN0ZGVycik7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9zaWxlbnRfY2FsbC5jIGIvb3BlbmJzYy9zcmMvc2lsZW50X2NhbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWRhMjRlCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvc2lsZW50X2NhbGwuYwpAQCAtMCwwICsxLDE0MSBAQAorLyogR1NNIHNpbGVudCBjYWxsIGZlYXR1cmUgKi8KKworLyoKKyAqIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvcGFnaW5nLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfcnNsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9jaGFuX2FsbG9jLmg+CisKKy8qIHBhZ2luZyBvZiB0aGUgcmVxdWVzdGVkIHN1YnNjcmliZXIgaGFzIGNvbXBsZXRlZCAqLworc3RhdGljIGludCBwYWdpbmdfY2Jfc2lsZW50KHVuc2lnbmVkIGludCBob29rbnVtLCB1bnNpZ25lZCBpbnQgZXZlbnQsCisJCQkgICAgc3RydWN0IG1zZ2IgKm1zZywgdm9pZCAqX2xjaGFuLCB2b2lkICpfZGF0YSkKK3sKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IF9sY2hhbjsKKwlzdHJ1Y3Qgc2NhbGxfc2lnbmFsX2RhdGEgc2lnZGF0YTsKKwlpbnQgcmM7CisKKwlpZiAoaG9va251bSAhPSBHU01fSE9PS19SUl9QQUdJTkcpCisJCXJldHVybiAtRUlOVkFMOworCisJREVCVUdQKERTTVMsICJwYWdpbmdfY2Jfc2lsZW50OiAiKTsKKworCXNpZ2RhdGEubGNoYW4gPSBsY2hhbjsKKwlzaWdkYXRhLmRhdGEgPSBfZGF0YTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEdTTV9QQUdJTkdfU1VDQ0VFREVEOgorCQlERUJVR1BDKERTTVMsICJzdWNjZXNzLCB1c2luZyBUaW1lc2xvdCAldSBvbiBBUkZDTiAldVxuIiwKKwkJCWxjaGFuLT50cy0+bnIsIGxjaGFuLT50cy0+dHJ4LT5hcmZjbik7CisJCWxjaGFuLT5zaWxlbnRfY2FsbCA9IDE7CisJCS8qIGluY3JlbWVudCBsY2hhbiByZWZlcmVuY2UgY291bnQgKi8KKwkJZGlzcGF0Y2hfc2lnbmFsKFNTX1NDQUxMLCBTX1NDQUxMX1NVQ0NFU1MsICZzaWdkYXRhKTsKKwkJdXNlX2xjaGFuKGxjaGFuKTsKKwkJYnJlYWs7CisJY2FzZSBHU01fUEFHSU5HX0VYUElSRUQ6CisJCURFQlVHUChEU01TLCAiZXhwaXJlZFxuIik7CisJCWRpc3BhdGNoX3NpZ25hbChTU19TQ0FMTCwgU19TQ0FMTF9FWFBJUkVELCAmc2lnZGF0YSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJjID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorCisvKiByZWNlaXZlIGEgbGF5ZXIgMyBtZXNzYWdlIGZyb20gYSBzaWxlbnQgY2FsbCAqLworaW50IHNpbGVudF9jYWxsX3J4KHN0cnVjdCBtc2diICptc2cpCit7CisJLyogRklYTUU6IGRvIHNvbWV0aGluZyBsaWtlIHNlbmRpbmcgaXQgdGhyb3VnaCBhIFVEUCBwb3J0ICovCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBtc2dfbWF0Y2ggeworCXVfaW50OF90IHBkaXNjOworCXVfaW50OF90IG1zZ190eXBlOworfTsKKworLyogbGlzdCBvZiBtZXNzYWdlcyB0aGF0IGFyZSBoYW5kbGVkIGluc2lkZSBPcGVuQlNDLCBldmVuIGluIGEgc2lsZW50IGNhbGwgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXNnX21hdGNoIHNpbGVudF9jYWxsX2FjY2VwdFtdID0geworCXsgR1NNNDhfUERJU0NfTU0sIEdTTTQ4X01UX01NX0xPQ19VUERfUkVRVUVTVCB9LAorCXsgR1NNNDhfUERJU0NfTU0sIEdTTTQ4X01UX01NX0NNX1NFUlZfUkVRIH0sCit9OworCisvKiBkZWNpZGUgaWYgd2UgbmVlZCB0byByZXJvdXRlIGEgbWVzc2FnZSBhcyBwYXJ0IG9mIGEgc2lsZW50IGNhbGwgKi8KK2ludCBzaWxlbnRfY2FsbF9yZXJvdXRlKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJdV9pbnQ4X3QgcGRpc2MgPSBnaC0+cHJvdG9fZGlzY3IgJiAweDBmOworCWludCBpOworCisJLyogaWYgd2UncmUgbm90IHBhcnQgb2YgYSBzaWxlbnQgY2FsbCwgbmV2ZXIgcmVyb3V0ZSAqLworCWlmICghbXNnLT5sY2hhbi0+c2lsZW50X2NhbGwpCisJCXJldHVybiAwOworCisJLyogY2hlY2sgaWYgd2UgYXJlIGEgc3BlY2lhbCBtZXNzYWdlIHRoYXQgaXMgaGFuZGxlZCBpbiBvcGVuYnNjICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc2lsZW50X2NhbGxfYWNjZXB0KTsgaSsrKSB7CisJCWlmIChzaWxlbnRfY2FsbF9hY2NlcHRbaV0ucGRpc2MgPT0gcGRpc2MgJiYKKwkJICAgIHNpbGVudF9jYWxsX2FjY2VwdFtpXS5tc2dfdHlwZSA9PSBnaC0+bXNnX3R5cGUpCisJCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBvdGhlcndpc2UsIHJlcm91dGUgKi8KKwlyZXR1cm4gMTsKK30KKworCisvKiBpbml0aWF0ZSBhIHNpbGVudCBjYWxsIHdpdGggYSBnaXZlbiBzdWJzY3JpYmVyICovCitpbnQgZ3NtX3NpbGVudF9jYWxsX3N0YXJ0KHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLCB2b2lkICpkYXRhLCBpbnQgdHlwZSkKK3sKKwlpbnQgcmM7CisKKwlyYyA9IHBhZ2luZ19yZXF1ZXN0KHN1YnNjci0+bmV0LCBzdWJzY3IsIHR5cGUsCisJCQkgICAgcGFnaW5nX2NiX3NpbGVudCwgZGF0YSk7CisJcmV0dXJuIHJjOworfQorCisvKiBlbmQgYSBzaWxlbnQgY2FsbCB3aXRoIGEgZ2l2ZW4gc3Vic2NyaWJlciAqLworaW50IGdzbV9zaWxlbnRfY2FsbF9zdG9wKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuOworCisJbGNoYW4gPSBsY2hhbl9mb3Jfc3Vic2NyKHN1YnNjcik7CisJaWYgKCFsY2hhbikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBkaWQgd2UgYWN0dWFsbHkgZXN0YWJsaXNoIGEgc2lsZW50IGNhbGwgZm9yIHRoaXMgZ3V5PyAqLworCWlmICghbGNoYW4tPnNpbGVudF9jYWxsKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXB1dF9sY2hhbihsY2hhbik7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3N1YmNoYW5fZGVtdXguYyBiL29wZW5ic2Mvc3JjL3N1YmNoYW5fZGVtdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDZjMWZlCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvc3ViY2hhbl9kZW11eC5jCkBAIC0wLDAgKzEsMzIyIEBACisvKiBBIEUxIHN1Yi1jaGFubmVsIChkZSltdWx0aXBsZXhlciB3aXRoIFRSQVUgZnJhbWUgc3luYyAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL3N1YmNoYW5fZGVtdXguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3RyYXVfZnJhbWUuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorCit2b2lkICp0YWxsX3RxZV9jdHg7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhcHBlbmRfYml0KHN0cnVjdCBkZW11eF9zdWJjaCAqc2NoLCB1X2ludDhfdCBiaXQpCit7CisJc2NoLT5vdXRfYml0YnVmW3NjaC0+b3V0X2lkeCsrXSA9IGJpdDsKK30KKworI2RlZmluZSBTWU5DX0hEUl9CSVRTCTE2CitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgbnVsbGJ5dGVzW1NZTkNfSERSX0JJVFNdOworCisvKiBjaGVjayBpZiB3ZSBoYXZlIGp1c3QgY29tcGxldGVkIHRoZSAxNiBiaXQgemVybyBzeW5jIGhlYWRlciwKKyAqIGluIGFjY29yZGFuY2Ugd2l0aCBHU00gVFMgMDguNjAgQ2hhcHRlciA0LjguMSAqLworc3RhdGljIGludCBzeW5jX2hkcl9jb21wbGV0ZShzdHJ1Y3QgZGVtdXhfc3ViY2ggKnNjaCwgdV9pbnQ4X3QgYml0KQoreworCWlmIChiaXQgPT0gMCkKKwkJc2NoLT5jb25zZWN1dGl2ZV96ZXJvcysrOworCWVsc2UKKwkJc2NoLT5jb25zZWN1dGl2ZV96ZXJvcyA9IDA7CisKKwlpZiAoc2NoLT5jb25zZWN1dGl2ZV96ZXJvcyA+PSBTWU5DX0hEUl9CSVRTKSB7CisJCXNjaC0+Y29uc2VjdXRpdmVfemVyb3MgPSAwOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogcmVzeW5jaHJvbml6ZSB0byBjdXJyZW50IGxvY2F0aW9uICovCitzdGF0aWMgdm9pZCByZXN5bmNfdG9faGVyZShzdHJ1Y3QgZGVtdXhfc3ViY2ggKnNjaCkKK3sKKwltZW1zZXQoc2NoLT5vdXRfYml0YnVmLCAwLCBTWU5DX0hEUl9CSVRTKTsKKworCS8qIHNldCBpbmRleCBpbiBhIHdheSB0aGF0IHdlIGNhbiBjb250aW51ZSByZWNlaXZpbmcgYml0cyBhZnRlcgorCSAqIHRoZSBlbmQgb2YgdGhlIFNZTkMgaGVhZGVyICovCisJc2NoLT5vdXRfaWR4ID0gU1lOQ19IRFJfQklUUzsKKwlzY2gtPmluX3N5bmMgPSAxOworfQorCitpbnQgc3ViY2hfZGVtdXhfaW5pdChzdHJ1Y3Qgc3ViY2hfZGVtdXggKmRteCkKK3sKKwlpbnQgaTsKKworCWRteC0+Y2hhbl9hY3RpdiA9IDA7CisJZm9yIChpID0gMDsgaSA8IE5SX1NVQkNIOyBpKyspIHsKKwkJc3RydWN0IGRlbXV4X3N1YmNoICpzY2ggPSAmZG14LT5zdWJjaFtpXTsKKwkJc2NoLT5vdXRfaWR4ID0gMDsKKwkJbWVtc2V0KHNjaC0+b3V0X2JpdGJ1ZiwgMHhmZiwgc2l6ZW9mKHNjaC0+b3V0X2JpdGJ1ZikpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogaW5wdXQgc29tZSBhcmJpdHJhcnkgKG1vZHVsbyA0KSBudW1iZXIgb2YgYnl0ZXMgb2YgYSA2NGsgRTEgY2hhbm5lbCwKKyAqIHNwbGl0IGl0IGludG8gdGhlIDE2ayBzdWJjaGFubmVscyAqLworaW50IHN1YmNoX2RlbXV4X2luKHN0cnVjdCBzdWJjaF9kZW11eCAqZG14LCB1X2ludDhfdCAqZGF0YSwgaW50IGxlbikKK3sKKwlpbnQgaSwgYzsKKworCS8qIHdlIGF2b2lkIHBhcnRpYWxseSBmaWxsZWQgYnl0ZXMgaW4gb3V0YnVmICovCisJaWYgKGxlbiAlIDQpCisJCXJldHVybiAtRUlOVkFMOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCXVfaW50OF90IGluYnl0ZSA9IGRhdGFbaV07CisKKwkJZm9yIChjID0gMDsgYyA8IE5SX1NVQkNIOyBjKyspIHsKKwkJCXN0cnVjdCBkZW11eF9zdWJjaCAqc2NoID0gJmRteC0+c3ViY2hbY107CisJCQl1X2ludDhfdCBpbmJpdHM7CisJCQl1X2ludDhfdCBiaXQ7CisKKwkJCS8qIGlnbm9yZSBpbmFjdGl2ZSBzdWJjaGFubmVscyAqLworCQkJaWYgKCEoZG14LT5jaGFuX2FjdGl2ICYgKDEgPDwgYykpKQorCQkJCWNvbnRpbnVlOworCisJCQlpbmJpdHMgPSBpbmJ5dGUgPj4gKGMgPDwgMSk7CisKKwkJCS8qIHR3byBiaXRzIGZvciBlYWNoIHN1YmNoYW5uZWwgKi8KKwkJCWlmIChpbmJpdHMgJiAweDAxKQorCQkJCWJpdCA9IDE7CisJCQllbHNlCisJCQkJYml0ID0gMDsKKwkJCWFwcGVuZF9iaXQoc2NoLCBiaXQpOworCisJCQlpZiAoc3luY19oZHJfY29tcGxldGUoc2NoLCBiaXQpKQorCQkJCXJlc3luY190b19oZXJlKHNjaCk7CisKKwkJCWlmIChpbmJpdHMgJiAweDAyKQorCQkJCWJpdCA9IDE7CisJCQllbHNlCisJCQkJYml0ID0gMDsKKwkJCWFwcGVuZF9iaXQoc2NoLCBiaXQpOworCisJCQlpZiAoc3luY19oZHJfY29tcGxldGUoc2NoLCBiaXQpKQorCQkJCXJlc3luY190b19oZXJlKHNjaCk7CisKKwkJCS8qIEZJWE1FOiB2ZXJpZnkgdGhlIGZpcnN0IGJpdCBpbiBvY3RldCAyLCA0LCA2LCAuLi4KKwkJCSAqIGFjY29yZGluZyB0byBUUyAwOC42MCA0LjguMSAqLworCisJCQkvKiBvbmNlIHdlIGhhdmUgcmVhY2hlZCBUUkFVX0ZSQU1FX0JJVFMsIGNhbGwKKwkJCSAqIHRoZSBUUkFVIGZyYW1lIGhhbmRsZXIgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKwkJCWlmIChzY2gtPm91dF9pZHggPj0gVFJBVV9GUkFNRV9CSVRTKSB7CisJCQkJaWYgKHNjaC0+aW5fc3luYykgeworCQkJCQlkbXgtPm91dF9jYihkbXgsIGMsIHNjaC0+b3V0X2JpdGJ1ZiwKKwkJCQkJICAgIHNjaC0+b3V0X2lkeCwgZG14LT5kYXRhKTsKKwkJCQkJc2NoLT5pbl9zeW5jID0gMDsKKwkJCQl9CisJCQkJc2NoLT5vdXRfaWR4ID0gMDsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gaTsKK30KKworaW50IHN1YmNoX2RlbXV4X2FjdGl2YXRlKHN0cnVjdCBzdWJjaF9kZW11eCAqZG14LCBpbnQgc3ViY2gpCit7CisJaWYgKHN1YmNoID49IE5SX1NVQkNIKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRteC0+Y2hhbl9hY3RpdiB8PSAoMSA8PCBzdWJjaCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzdWJjaF9kZW11eF9kZWFjdGl2YXRlKHN0cnVjdCBzdWJjaF9kZW11eCAqZG14LCBpbnQgc3ViY2gpCit7CisJaWYgKHN1YmNoID49IE5SX1NVQkNIKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRteC0+Y2hhbl9hY3RpdiAmPSB+KDEgPDwgc3ViY2gpOworCXJldHVybiAwOworfQorCisvKiBNVUxUSVBMRVhFUiAqLworCitzdGF0aWMgaW50IGFsbG9jX2FkZF9pZGxlX2ZyYW1lKHN0cnVjdCBzdWJjaF9tdXggKm14LCBpbnQgc2NoX25yKQoreworCS8qIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHdpdGggaWRsZSBwYXR0ZXJuICovCisJcmV0dXJuIHN1YmNoYW5fbXV4X2VucXVldWUobXgsIHNjaF9uciwgdHJhdV9pZGxlX2ZyYW1lKCksCisJCQkJICAgVFJBVV9GUkFNRV9CSVRTKTsKK30KKworLyogcmV0dXJuIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIGJpdHMgZnJvbSB0aGUgc3BlY2lmaWVkIHN1YmNoYW5uZWwgKi8KK3N0YXRpYyBpbnQgZ2V0X3N1YmNoX2JpdHMoc3RydWN0IHN1YmNoX211eCAqbXgsIGludCBzdWJjaCwKKwkJCSAgdV9pbnQ4X3QgKmJpdHMsIGludCBudW1fcmVxdWVzdGVkKQoreworCXN0cnVjdCBtdXhfc3ViY2ggKnNjaCA9ICZteC0+c3ViY2hbc3ViY2hdOworCWludCBudW1fYml0cyA9IDA7CisKKwl3aGlsZSAobnVtX2JpdHMgPCBudW1fcmVxdWVzdGVkKSB7CisJCXN0cnVjdCBzdWJjaF90eHFfZW50cnkgKnR4ZTsKKwkJaW50IG51bV9iaXRzX2xlZnQ7CisJCWludCBudW1fYml0c190aGlzdGltZTsKKworCQkvKiBtYWtlIHN1cmUgd2UgaGF2ZSBhIHZhbGlkIGVudHJ5IGF0IHRvcCBvZiB0eCBxdWV1ZS4KKwkJICogaWYgbm90LCBhZGQgYW4gaWRsZSBmcmFtZSAqLworCQlpZiAobGxpc3RfZW1wdHkoJnNjaC0+dHhfcXVldWUpKQorCQkJYWxsb2NfYWRkX2lkbGVfZnJhbWUobXgsIHN1YmNoKTsKKwkKKwkJaWYgKGxsaXN0X2VtcHR5KCZzY2gtPnR4X3F1ZXVlKSkKKwkJCXJldHVybiAtRUlPOworCisJCXR4ZSA9IGxsaXN0X2VudHJ5KHNjaC0+dHhfcXVldWUubmV4dCwgc3RydWN0IHN1YmNoX3R4cV9lbnRyeSwgbGlzdCk7CisJCW51bV9iaXRzX2xlZnQgPSB0eGUtPmJpdF9sZW4gLSB0eGUtPm5leHRfYml0OworCisJCWlmIChudW1fYml0c19sZWZ0IDwgbnVtX3JlcXVlc3RlZCkKKwkJCW51bV9iaXRzX3RoaXN0aW1lID0gbnVtX2JpdHNfbGVmdDsKKwkJZWxzZQorCQkJbnVtX2JpdHNfdGhpc3RpbWUgPSBudW1fcmVxdWVzdGVkOworCisJCS8qIHB1bGwgdGhlIGJpdHMgZnJvbSB0aGUgdHhlICovCisJCW1lbWNweShiaXRzICsgbnVtX2JpdHMsIHR4ZS0+Yml0cyArIHR4ZS0+bmV4dF9iaXQsIG51bV9iaXRzX3RoaXN0aW1lKTsKKwkJdHhlLT5uZXh0X2JpdCArPSBudW1fYml0c190aGlzdGltZTsKKworCQkvKiBmcmVlIHRoZSB0eF9xdWV1ZSBlbnRyeSBpZiBpdCBpcyBmdWxseSBjb25zdW1lZCAqLworCQlpZiAodHhlLT5uZXh0X2JpdCA+PSB0eGUtPmJpdF9sZW4pIHsKKwkJCWxsaXN0X2RlbCgmdHhlLT5saXN0KTsKKwkJCXRhbGxvY19mcmVlKHR4ZSk7CisJCX0KKworCQkvKiBpbmNyZW1lbnQgZ2xvYmFsIG51bWJlciBvZiBiaXRzIGRlcXVldWVkICovCisJCW51bV9iaXRzICs9IG51bV9iaXRzX3RoaXN0aW1lOworCX0KKworCXJldHVybiBudW1fcmVxdWVzdGVkOworfQorCisvKiBjb21wYWN0IGFuIGFycmF5IG9mIDggc2luZ2xlLWJpdCBieXRlcyBpbnRvIG9uZSBieXRlIG9mIDggYml0cyAqLworc3RhdGljIHVfaW50OF90IGNvbXBhY3RfYml0cyhjb25zdCB1X2ludDhfdCAqYml0cykKK3sKKwl1X2ludDhfdCByZXQgPSAwOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJcmV0IHw9IChiaXRzW2ldID8gMSA6IDApIDw8IGk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBvYnRhaW4gYSBzaW5nbGUgb3V0cHV0IGJ5dGUgZnJvbSB0aGUgc3ViY2hhbm5lbCBtdXhlciAqLworc3RhdGljIGludCBtdXhfb3V0cHV0X2J5dGUoc3RydWN0IHN1YmNoX211eCAqbXgsIHVfaW50OF90ICpieXRlKQoreworCXVfaW50OF90IGJpdHNbOF07CisJaW50IHJjOworCisJLyogY29tYmluZSB0d28gYml0cyBvZiBldmVyeSBzdWJjaGFuICovCisJcmMgPSBnZXRfc3ViY2hfYml0cyhteCwgMCwgJmJpdHNbMF0sIDIpOworCXJjID0gZ2V0X3N1YmNoX2JpdHMobXgsIDEsICZiaXRzWzJdLCAyKTsKKwlyYyA9IGdldF9zdWJjaF9iaXRzKG14LCAyLCAmYml0c1s0XSwgMik7CisJcmMgPSBnZXRfc3ViY2hfYml0cyhteCwgMywgJmJpdHNbNl0sIDIpOworCisJKmJ5dGUgPSBjb21wYWN0X2JpdHMoYml0cyk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIFJlcXVlc3QgdGhlIG91dHB1dCBvZiBzb21lIG11eGVkIGJ5dGVzIGZyb20gdGhlIHN1YmNoYW4gbXV4ZXIgKi8KK2ludCBzdWJjaGFuX211eF9vdXQoc3RydWN0IHN1YmNoX211eCAqbXgsIHVfaW50OF90ICpkYXRhLCBpbnQgbGVuKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWludCByYzsKKwkJcmMgPSBtdXhfb3V0cHV0X2J5dGUobXgsICZkYXRhW2ldKTsKKwkJaWYgKHJjIDwgMCkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludCBsbGlzdF9sZW4oc3RydWN0IGxsaXN0X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IGxsaXN0X2hlYWQgKmVudHJ5OworCWludCBpID0gMDsKKworCWxsaXN0X2Zvcl9lYWNoKGVudHJ5LCBoZWFkKQorCQlpKys7CisKKwlyZXR1cm4gaTsKK30KKworLyogZXZpY3QgdGhlICdudW1fZXZpY3QnIG51bWJlciBvZiBvbGRlc3QgZW50cmllcyBpbiB0aGUgcXVldWUgKi8KK3N0YXRpYyB2b2lkIHR4X3F1ZXVlX2V2aWN0KHN0cnVjdCBtdXhfc3ViY2ggKnNjaCwgaW50IG51bV9ldmljdCkKK3sKKwlzdHJ1Y3Qgc3ViY2hfdHhxX2VudHJ5ICp0cWU7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2V2aWN0OyBpKyspIHsKKwkJaWYgKGxsaXN0X2VtcHR5KCZzY2gtPnR4X3F1ZXVlKSkKKwkJCXJldHVybjsKKworCQl0cWUgPSBsbGlzdF9lbnRyeShzY2gtPnR4X3F1ZXVlLm5leHQsIHN0cnVjdCBzdWJjaF90eHFfZW50cnksIGxpc3QpOworCQlsbGlzdF9kZWwoJnRxZS0+bGlzdCk7CisJCXRhbGxvY19mcmVlKHRxZSk7CisJfQorfQorCisvKiBlbnF1ZXVlIHNvbWUgZGF0YSBpbnRvIHRoZSB0eF9xdWV1ZSBvZiBhIGdpdmVuIHN1YmNoYW5uZWwgKi8KK2ludCBzdWJjaGFuX211eF9lbnF1ZXVlKHN0cnVjdCBzdWJjaF9tdXggKm14LCBpbnQgc19uciwgY29uc3QgdV9pbnQ4X3QgKmRhdGEsCisJCQlpbnQgbGVuKQoreworCXN0cnVjdCBtdXhfc3ViY2ggKnNjaCA9ICZteC0+c3ViY2hbc19ucl07CisJaW50IGxpc3RfbGVuID0gbGxpc3RfbGVuKCZzY2gtPnR4X3F1ZXVlKTsKKwlzdHJ1Y3Qgc3ViY2hfdHhxX2VudHJ5ICp0cWUgPSB0YWxsb2NfemVyb19zaXplKHRhbGxfdHFlX2N0eCwKKwkJCQkJCQlzaXplb2YoKnRxZSkgKyBsZW4pOworCWlmICghdHFlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXRxZS0+Yml0X2xlbiA9IGxlbjsKKwltZW1jcHkodHFlLT5iaXRzLCBkYXRhLCBsZW4pOworCisJaWYgKGxpc3RfbGVuID4gMikKKwkJdHhfcXVldWVfZXZpY3Qoc2NoLCBsaXN0X2xlbi0yKTsKKworCWxsaXN0X2FkZF90YWlsKCZ0cWUtPmxpc3QsICZzY2gtPnR4X3F1ZXVlKTsKKworCXJldHVybiAwOworfQorCisvKiBpbml0aWFsaXplIG9uZSBzdWJjaGFubmVsIG11eGVyIGluc3RhbmNlICovCitpbnQgc3ViY2hhbl9tdXhfaW5pdChzdHJ1Y3Qgc3ViY2hfbXV4ICpteCkKK3sKKwlpbnQgaTsKKworCW1lbXNldChteCwgMCwgc2l6ZW9mKCpteCkpOworCWZvciAoaSA9IDA7IGkgPCBOUl9TVUJDSDsgaSsrKSB7CisJCXN0cnVjdCBtdXhfc3ViY2ggKnNjaCA9ICZteC0+c3ViY2hbaV07CisJCUlOSVRfTExJU1RfSEVBRCgmc2NoLT50eF9xdWV1ZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9zeXN0ZW1faW5mb3JtYXRpb24uYyBiL29wZW5ic2Mvc3JjL3N5c3RlbV9pbmZvcm1hdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmOWQ2MDkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9zeXN0ZW1faW5mb3JtYXRpb24uYwpAQCAtMCwwICsxLDQ3MyBAQAorLyogR1NNIDA0LjA4IFN5c3RlbSBJbmZvcm1hdGlvbiAoU0kpIGVuY29kaW5nIGFuZCBkZWNvZGluZworICogM0dQUCBUUyAwNC4wOCB2ZXJzaW9uIDcuMjEuMCBSZWxlYXNlIDE5OTggLyBFVFNJIFRTIDEwMCA5NDAgVjcuMjEuMCAqLworCisvKiAoQykgMjAwOC0yMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMDguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX3JzbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvcmVzdF9vY3RldHMuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9iaXR2ZWMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisKKyNkZWZpbmUgR1NNNDhfQ0VMTF9DSEFOX0RFU0NfU0laRQkxNgorI2RlZmluZSBHU01fTUFDQkxPQ0tfTEVOIAkJMjMKKyNkZWZpbmUgR1NNX01BQ0JMT0NLX1BBRERJTkcJCTB4MmIKKworLyogdmVyaWZ5IHRoZSBzaXplcyBvZiB0aGUgc3lzdGVtIGluZm9ybWF0aW9uIHR5cGUgc3RydWN0cyAqLworCisvKiByZXN0IG9jdGV0cyBhcmUgbm90IHBhcnQgb2YgdGhlIHN0cnVjdCAqLworc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlX2hlYWRlcikgPT0gMywgX3NpX2hlYWRlcl9zaXplKTsKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCBnc200OF9yYWNoX2NvbnRyb2wpID09IDMsIF9zaV9yYWNoX2NvbnRyb2wpOworc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlXzEpID09IDIyLCBfc2kxX3NpemUpOworc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlXzIpID09IDIzLCBfc2kyX3NpemUpOworc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlXzMpID09IDE5LCBfc2kzX3NpemUpOworc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlXzQpID09IDEzLCBfc2k0X3NpemUpOworCisvKiBiczExIGZvcmdvdCB0aGUgbDIgbGVuLCAwLTYgcmVzdCBvY3RldHMgKi8KK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV81KSA9PSAxOCwgX3NpNV9zaXplKTsKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV82KSA9PSAxMSwgX3NpNl9zaXplKTsKKworc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlXzEzKSA9PSAzLCBfc2kxM19zaXplKTsKKworLyogRnJlcXVlbmN5IExpc3RzIGFzIHBlciBUUyAwNC4wOCAxMC41LjIuMTMgKi8KKworLyogMTAuNS4yLjEzLjI6IEJpdCBtYXAgMCBmb3JtYXQgKi8KK3N0YXRpYyBpbnQgZnJlcV9saXN0X2JtMF9zZXRfYXJmY24odV9pbnQ4X3QgKmNoYW5fbGlzdCwgdW5zaWduZWQgaW50IGFyZmNuKQoreworCXVuc2lnbmVkIGludCBieXRlLCBiaXQ7CisKKwlpZiAoYXJmY24gPiAxMjQgfHwgYXJmY24gPCAxKSB7CisJCUxPR1AoRFJSLCBMT0dMX0VSUk9SLCAiQml0bWFwIDAgb25seSBzdXBwb3J0cyBBUkZDTiAxLi4uMTI0XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogdGhlIGJpdG1hc2sgaXMgZnJvbSAxLi4xMjQsIG5vdCBmcm9tIDAuLjEyMyAqLworCWFyZmNuLS07CisKKwlieXRlID0gYXJmY24gLyA4OworCWJpdCA9IGFyZmNuICUgODsKKworCWNoYW5fbGlzdFtHU000OF9DRUxMX0NIQU5fREVTQ19TSVpFLTEtYnl0ZV0gfD0gKDEgPDwgYml0KTsKKworCXJldHVybiAwOworfQorCisvKiAxMC41LjIuMTMuNzogVmFyaWFibGUgYml0IG1hcCBmb3JtYXQgKi8KK3N0YXRpYyBpbnQgZnJlcV9saXN0X2JtcmVsX3NldF9hcmZjbih1X2ludDhfdCAqY2hhbl9saXN0LCB1bnNpZ25lZCBpbnQgYXJmY24pCit7CisJdW5zaWduZWQgaW50IGJ5dGUsIGJpdDsKKwl1bnNpZ25lZCBpbnQgbWluX2FyZmNuOworCXVuc2lnbmVkIGludCBiaXRubzsKKworCW1pbl9hcmZjbiA9IChjaGFuX2xpc3RbMF0gJiAxKSA8PCA5OworCW1pbl9hcmZjbiB8PSBjaGFuX2xpc3RbMV0gPDwgMTsKKwltaW5fYXJmY24gfD0gKGNoYW5fbGlzdFsyXSA+PiA3KSAmIDE7CisKKwkvKiBUaGUgbG93ZXIgZW5kIG9mIG91ciBiaXRtYWtzIGlzIGFsd2F5cyBpbXBsaWNpdGx5IGluY2x1ZGVkICovCisJaWYgKGFyZmNuID09IG1pbl9hcmZjbikKKwkJcmV0dXJuIDA7CisKKwlpZiAoYXJmY24gPCBtaW5fYXJmY24pIHsKKwkJTE9HUChEUlIsIExPR0xfRVJST1IsICJhcmZjbigldSkgPCBtaW4oJXUpXG4iLCBhcmZjbiwgbWluX2FyZmNuKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChhcmZjbiA+IG1pbl9hcmZjbiArIDExMSkgeworCQlMT0dQKERSUiwgTE9HTF9FUlJPUiwgImFyZmNuKCV1KSA+IG1pbigldSkgKyAxMTFcbiIsIGFyZmNuLCBtaW5fYXJmY24pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwliaXRubyA9IChhcmZjbiAtIG1pbl9hcmZjbik7CisJYnl0ZSA9IGJpdG5vIC8gODsKKwliaXQgPSBiaXRubyAlIDg7CisKKwljaGFuX2xpc3RbMiArIGJ5dGVdIHw9IDEgPDwgKDcgLSBiaXQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGdlbmVyYXRlIGEgY2VsbCBjaGFubmVsIGxpc3QgYXMgcGVyIFNlY3Rpb24gMTAuNS4yLjFiIG9mIDA0LjA4ICovCitzdGF0aWMgaW50IGJpdHZlYzJmcmVxX2xpc3QodV9pbnQ4X3QgKmNoYW5fbGlzdCwgc3RydWN0IGJpdHZlYyAqYnYsCisJCQkgICAgY29uc3Qgc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlpbnQgaSwgcmMsIG1pbiA9IDEwMjQsIG1heCA9IC0xOworCisJbWVtc2V0KGNoYW5fbGlzdCwgMCwgMTYpOworCisJLyogR1NNOTAwLW9ubHkgaGFuZHNldHMgb25seSBzdXBwb3J0ICdiaXQgbWFwIDAgZm9ybWF0JyAqLworCWlmIChidHMtPmJhbmQgPT0gR1NNX0JBTkRfOTAwKSB7CisJCWNoYW5fbGlzdFswXSA9IDA7CisKKwkJZm9yIChpID0gMDsgaSA8IGJ2LT5kYXRhX2xlbio4OyBpKyspIHsKKwkJCWlmIChiaXR2ZWNfZ2V0X2JpdF9wb3MoYnYsIGkpKSB7CisJCQkJcmMgPSBmcmVxX2xpc3RfYm0wX3NldF9hcmZjbihjaGFuX2xpc3QsIGkpOworCQkJCWlmIChyYyA8IDApCisJCQkJCXJldHVybiByYzsKKwkJCX0KKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBXZSBjdXJyZW50bHkgb25seSBzdXBwb3J0IHRoZSAnVmFyaWFibGUgYml0bWFwIGZvcm1hdCcgKi8KKwljaGFuX2xpc3RbMF0gPSAweDhlOworCisJZm9yIChpID0gMDsgaSA8IGJ2LT5kYXRhX2xlbio4OyBpKyspIHsKKwkJaWYgKGJpdHZlY19nZXRfYml0X3BvcyhidiwgaSkpIHsKKwkJCWlmIChpIDwgbWluKQorCQkJCW1pbiA9IGk7CisJCQlpZiAoaSA+IG1heCkKKwkJCQltYXggPSBpOworCQl9CisJfQorCisJaWYgKG1heCA9PSAtMSkgeworCQkvKiBFbXB0eSBzZXQsIHVzZSAnYml0IG1hcCAwIGZvcm1hdCcgKi8KKwkJY2hhbl9saXN0WzBdID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKChtYXggLSBtaW4pID4gMTExKSB7CisJCUxPR1AoRFJSLCBMT0dMX0VSUk9SLCAibWluX2FyZmNuPSV1LCBtYXhfYXJmY249JXUsICIKKwkJCSJkaXN0YW5jZSA+IDExMVxuIiwgbWluLCBtYXgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljaGFuX2xpc3RbMF0gfD0gKG1pbiA+PiA5KSAmIDE7CisJY2hhbl9saXN0WzFdID0gKG1pbiA+PiAxKTsKKwljaGFuX2xpc3RbMl0gPSAobWluICYgMSkgPDwgNzsKKworCWZvciAoaSA9IDA7IGkgPCBidi0+ZGF0YV9sZW4qODsgaSsrKSB7CisJCWlmIChiaXR2ZWNfZ2V0X2JpdF9wb3MoYnYsIGkpKSB7CisJCQlyYyA9IGZyZXFfbGlzdF9ibXJlbF9zZXRfYXJmY24oY2hhbl9saXN0LCBpKTsKKwkJCWlmIChyYyA8IDApCisJCQkJcmV0dXJuIHJjOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIGdlbmVyYXRlIGEgY2VsbCBjaGFubmVsIGxpc3QgYXMgcGVyIFNlY3Rpb24gMTAuNS4yLjFiIG9mIDA0LjA4ICovCitzdGF0aWMgaW50IGdlbmVyYXRlX2NlbGxfY2hhbl9saXN0KHVfaW50OF90ICpjaGFuX2xpc3QsIHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisJc3RydWN0IGJpdHZlYyAqYnYgPSAmYnRzLT5zaV9jb21tb24uY2VsbF9hbGxvYzsKKworCS8qIGZpcnN0IHdlIGdlbmVyYXRlIGEgYml0dmVjIG9mIGFsbCBUUlggQVJGQ04ncyBpbiBvdXIgQlRTICovCisJbGxpc3RfZm9yX2VhY2hfZW50cnkodHJ4LCAmYnRzLT50cnhfbGlzdCwgbGlzdCkKKwkJYml0dmVjX3NldF9iaXRfcG9zKGJ2LCB0cngtPmFyZmNuLCAxKTsKKworCS8qIHRoZW4gd2UgZ2VuZXJhdGUgYSBHU00gMDQuMDggZnJlcXVlbmN5IGxpc3QgZnJvbSB0aGUgYml0dmVjICovCisJcmV0dXJuIGJpdHZlYzJmcmVxX2xpc3QoY2hhbl9saXN0LCBidiwgYnRzKTsKK30KKworLyogZ2VuZXJhdGUgYSBjZWxsIGNoYW5uZWwgbGlzdCBhcyBwZXIgU2VjdGlvbiAxMC41LjIuMWIgb2YgMDQuMDggKi8KK3N0YXRpYyBpbnQgZ2VuZXJhdGVfYmNjaF9jaGFuX2xpc3QodV9pbnQ4X3QgKmNoYW5fbGlzdCwgc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqY3VyX2J0czsKKwlzdHJ1Y3QgYml0dmVjICpidiA9ICZidHMtPnNpX2NvbW1vbi5uZWlnaF9saXN0OworCisJLyogZmlyc3Qgd2UgZ2VuZXJhdGUgYSBiaXR2ZWMgb2YgdGhlIEJDQ0ggQVJGQ04ncyBpbiBvdXIgQlNDICovCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoY3VyX2J0cywgJmJ0cy0+bmV0d29yay0+YnRzX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGN1cl9idHMgPT0gYnRzKQorCQkJY29udGludWU7CisJCWJpdHZlY19zZXRfYml0X3BvcyhidiwgY3VyX2J0cy0+YzAtPmFyZmNuLCAxKTsKKwl9CisKKwkvKiB0aGVuIHdlIGdlbmVyYXRlIGEgR1NNIDA0LjA4IGZyZXF1ZW5jeSBsaXN0IGZyb20gdGhlIGJpdHZlYyAqLworCXJldHVybiBiaXR2ZWMyZnJlcV9saXN0KGNoYW5fbGlzdCwgYnYsIGJ0cyk7Cit9CisKK3N0YXRpYyBpbnQgZ2VuZXJhdGVfc2kxKHVfaW50OF90ICpvdXRwdXQsIHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJaW50IHJjOworCXN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV8xICpzaTEgPQorCQkoc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlXzEgKikgb3V0cHV0OworCisJbWVtc2V0KHNpMSwgR1NNX01BQ0JMT0NLX1BBRERJTkcsIEdTTV9NQUNCTE9DS19MRU4pOworCisJc2kxLT5oZWFkZXIubDJfcGxlbiA9ICgyMSA8PCAyKSB8IDE7CisJc2kxLT5oZWFkZXIucnJfcHJvdG9jb2xfZGlzY3JpbWluYXRvciA9IEdTTTQ4X1BESVNDX1JSOworCXNpMS0+aGVhZGVyLnNraXBfaW5kaWNhdG9yID0gMDsKKwlzaTEtPmhlYWRlci5zeXN0ZW1faW5mb3JtYXRpb24gPSBHU000OF9NVF9SUl9TWVNJTkZPXzE7CisKKwlyYyA9IGdlbmVyYXRlX2NlbGxfY2hhbl9saXN0KHNpMS0+Y2VsbF9jaGFubmVsX2Rlc2NyaXB0aW9uLCBidHMpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCXNpMS0+cmFjaF9jb250cm9sID0gYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sOworCisJLyogU0kxIFJlc3QgT2N0ZXRzICgxMC41LjIuMzIpLCBjb250YWlucyBOQ0ggcG9zaXRpb24gKi8KKwlyYyA9IHJlc3Rfb2N0ZXRzX3NpMShzaTEtPnJlc3Rfb2N0ZXRzLCBOVUxMKTsKKwlyZXR1cm4gc2l6ZW9mKCpzaTEpICsgcmM7Cit9CisKK3N0YXRpYyBpbnQgZ2VuZXJhdGVfc2kyKHVfaW50OF90ICpvdXRwdXQsIHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJaW50IHJjOworCXN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV8yICpzaTIgPQorCQkoc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlXzIgKikgb3V0cHV0OworCisJbWVtc2V0KHNpMiwgR1NNX01BQ0JMT0NLX1BBRERJTkcsIEdTTV9NQUNCTE9DS19MRU4pOworCisJc2kyLT5oZWFkZXIubDJfcGxlbiA9ICgyMiA8PCAyKSB8IDE7CisJc2kyLT5oZWFkZXIucnJfcHJvdG9jb2xfZGlzY3JpbWluYXRvciA9IEdTTTQ4X1BESVNDX1JSOworCXNpMi0+aGVhZGVyLnNraXBfaW5kaWNhdG9yID0gMDsKKwlzaTItPmhlYWRlci5zeXN0ZW1faW5mb3JtYXRpb24gPSBHU000OF9NVF9SUl9TWVNJTkZPXzI7CisKKwlyYyA9IGdlbmVyYXRlX2JjY2hfY2hhbl9saXN0KHNpMi0+YmNjaF9mcmVxdWVuY3lfbGlzdCwgYnRzKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlzaTItPm5jY19wZXJtaXR0ZWQgPSBidHMtPnNpX2NvbW1vbi5uY2NfcGVybWl0dGVkOworCXNpMi0+cmFjaF9jb250cm9sID0gYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sOworCisJcmV0dXJuIHNpemVvZigqc2kyKTsKK30KKworc3RhdGljIHN0cnVjdCBnc200OF9zaV9yb19pbmZvIHNpX2luZm8gPSB7CisJLnNlbGVjdGlvbl9wYXJhbXMgPSB7CisJCS5wcmVzZW50ID0gMCwKKwl9LAorCS5wb3dlcl9vZmZzZXQgPSB7CisJCS5wcmVzZW50ID0gMCwKKwl9LAorCS5zaTJ0ZXJfaW5kaWNhdG9yID0gMCwKKwkuZWFybHlfY21fY3RybCA9IDEsCisJLnNjaGVkdWxpbmcgPSB7CisJCS5wcmVzZW50ID0gMCwKKwl9LAorCS5ncHJzX2luZCA9IHsKKwkJLnNpMTNfcG9zaXRpb24gPSAwLAorCQkucmFfY29sb3VyID0gMCwKKwkJLnByZXNlbnQgPSAxLAorCX0sCisJLmxzYV9wYXJhbXMgPSB7CisJCS5wcmVzZW50ID0gMCwKKwl9LAorCS5jZWxsX2lkID0gMCwJLyogRklYTUU6IGRvZXNuJ3QgdGhlIGJ0cyBoYXZlIHRoaXM/ICovCisJLmJyZWFrX2luZCA9IDAsCit9OworCitzdGF0aWMgaW50IGdlbmVyYXRlX3NpMyh1X2ludDhfdCAqb3V0cHV0LCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCWludCByYzsKKwlzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfMyAqc2kzID0KKwkJKHN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV8zICopIG91dHB1dDsKKworCW1lbXNldChzaTMsIEdTTV9NQUNCTE9DS19QQURESU5HLCBHU01fTUFDQkxPQ0tfTEVOKTsKKworCXNpMy0+aGVhZGVyLmwyX3BsZW4gPSAoMTggPDwgMikgfCAxOworCXNpMy0+aGVhZGVyLnJyX3Byb3RvY29sX2Rpc2NyaW1pbmF0b3IgPSBHU000OF9QRElTQ19SUjsKKwlzaTMtPmhlYWRlci5za2lwX2luZGljYXRvciA9IDA7CisJc2kzLT5oZWFkZXIuc3lzdGVtX2luZm9ybWF0aW9uID0gR1NNNDhfTVRfUlJfU1lTSU5GT18zOworCisJc2kzLT5jZWxsX2lkZW50aXR5ID0gaHRvbnMoYnRzLT5jZWxsX2lkZW50aXR5KTsKKwlnc200OF9nZW5lcmF0ZV9sYWkoJnNpMy0+bGFpLCBidHMtPm5ldHdvcmstPmNvdW50cnlfY29kZSwKKwkJCSAgIGJ0cy0+bmV0d29yay0+bmV0d29ya19jb2RlLAorCQkJICAgYnRzLT5sb2NhdGlvbl9hcmVhX2NvZGUpOworCXNpMy0+Y29udHJvbF9jaGFubmVsX2Rlc2MgPSBidHMtPnNpX2NvbW1vbi5jaGFuX2Rlc2M7CisJc2kzLT5jZWxsX29wdGlvbnMgPSBidHMtPnNpX2NvbW1vbi5jZWxsX29wdGlvbnM7CisJc2kzLT5jZWxsX3NlbF9wYXIgPSBidHMtPnNpX2NvbW1vbi5jZWxsX3NlbF9wYXI7CisJc2kzLT5yYWNoX2NvbnRyb2wgPSBidHMtPnNpX2NvbW1vbi5yYWNoX2NvbnRyb2w7CisKKwkvKiBTSTMgUmVzdCBPY3RldHMgKDEwLjUuMi4zNCksIGNvbnRhaW5pbmcKKwkJQ0JRLCBDRUxMX1JFU0VMRUNUX09GRlNFVCwgVEVNUE9SQVJZX09GRlNFVCwgUEVOQUxUWV9USU1FCisJCVBvd2VyIE9mZnNldCwgMnRlciBJbmRpY2F0b3IsIEVhcmx5IENsYXNzbWFyayBTZW5kaW5nLAorCQlTY2hlZHVsaW5nIGlmIGFuZCBXSEVSRSwgR1BSUyBJbmRpY2F0b3IsIFNJMTMgcG9zaXRpb24gKi8KKwlyYyA9IHJlc3Rfb2N0ZXRzX3NpMyhzaTMtPnJlc3Rfb2N0ZXRzLCAmc2lfaW5mbyk7CisKKwlyZXR1cm4gc2l6ZW9mKCpzaTMpICsgcmM7Cit9CisKK3N0YXRpYyBpbnQgZ2VuZXJhdGVfc2k0KHVfaW50OF90ICpvdXRwdXQsIHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJaW50IHJjOworCXN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV80ICpzaTQgPQorCQkoc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlXzQgKikgb3V0cHV0OworCisJLyogbGVuZ3RoIG9mIGFsbCBJRXMgcHJlc2VudCBleGNlcHQgU0k0IHJlc3Qgb2N0ZXRzIGFuZCBsMl9wbGVuICovCisJaW50IGwyX3BsZW4gPSBzaXplb2YoKnNpNCkgLSAxOworCisJbWVtc2V0KHNpNCwgR1NNX01BQ0JMT0NLX1BBRERJTkcsIEdTTV9NQUNCTE9DS19MRU4pOworCisJc2k0LT5oZWFkZXIucnJfcHJvdG9jb2xfZGlzY3JpbWluYXRvciA9IEdTTTQ4X1BESVNDX1JSOworCXNpNC0+aGVhZGVyLnNraXBfaW5kaWNhdG9yID0gMDsKKwlzaTQtPmhlYWRlci5zeXN0ZW1faW5mb3JtYXRpb24gPSBHU000OF9NVF9SUl9TWVNJTkZPXzQ7CisKKwlnc200OF9nZW5lcmF0ZV9sYWkoJnNpNC0+bGFpLCBidHMtPm5ldHdvcmstPmNvdW50cnlfY29kZSwKKwkJCSAgIGJ0cy0+bmV0d29yay0+bmV0d29ya19jb2RlLAorCQkJICAgYnRzLT5sb2NhdGlvbl9hcmVhX2NvZGUpOworCXNpNC0+Y2VsbF9zZWxfcGFyID0gYnRzLT5zaV9jb21tb24uY2VsbF9zZWxfcGFyOworCXNpNC0+cmFjaF9jb250cm9sID0gYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sOworCisJLyogT3B0aW9uYWw6IENCQ0ggQ2hhbm5lbCBEZXNjcmlwdGlvbiArIENCQ0ggTW9iaWxlIEFsbG9jYXRpb24gKi8KKworCXNpNC0+aGVhZGVyLmwyX3BsZW4gPSAobDJfcGxlbiA8PCAyKSB8IDE7CisKKwkvKiBTSTQgUmVzdCBPY3RldHMgKDEwLjUuMi4zNSksIGNvbnRhaW5pbmcKKwkJT3B0aW9uYWwgUG93ZXIgb2Zmc2V0LCBHUFJTIEluZGljYXRvciwKKwkJQ2VsbCBJZGVudGl0eSwgTFNBIElELCBTZWxlY3Rpb24gUGFyYW1ldGVyICovCisJcmMgPSByZXN0X29jdGV0c19zaTQoc2k0LT5kYXRhLCAmc2lfaW5mbyk7CisKKwlyZXR1cm4gc2l6ZW9mKCpzaTQpICsgcmM7Cit9CisKK3N0YXRpYyBpbnQgZ2VuZXJhdGVfc2k1KHVfaW50OF90ICpvdXRwdXQsIHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlXzUgKnNpNTsKKwlpbnQgcmMsIGwyX3BsZW4gPSAxODsKKworCW1lbXNldChvdXRwdXQsIEdTTV9NQUNCTE9DS19QQURESU5HLCBHU01fTUFDQkxPQ0tfTEVOKTsKKworCS8qIGlwLmFjY2VzcyBuYW5vQlRTIG5lZWRzIGwyX3BsZW4hISAqLworCWlmIChpc19pcGFjY2Vzc19idHMoYnRzKSkgeworCQkqb3V0cHV0KysgPSAobDJfcGxlbiA8PCAyKSB8IDE7CisJCWwyX3BsZW4rKzsKKwl9CisKKwlzaTUgPSAoc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlXzUgKikgb3V0cHV0OworCisJLyogbDIgcHNldWRvIGxlbmd0aCwgbm90IHBhcnQgb2YgbXNnOiAxOCAqLworCXNpNS0+cnJfcHJvdG9jb2xfZGlzY3JpbWluYXRvciA9IEdTTTQ4X1BESVNDX1JSOworCXNpNS0+c2tpcF9pbmRpY2F0b3IgPSAwOworCXNpNS0+c3lzdGVtX2luZm9ybWF0aW9uID0gR1NNNDhfTVRfUlJfU1lTSU5GT181OworCXJjID0gZ2VuZXJhdGVfYmNjaF9jaGFuX2xpc3Qoc2k1LT5iY2NoX2ZyZXF1ZW5jeV9saXN0LCBidHMpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCS8qIDA0LjA4IDkuMS4zNzogTDIgUHNldWRvIExlbmd0aCBvZiAxOCAqLworCXJldHVybiBsMl9wbGVuOworfQorCitzdGF0aWMgaW50IGdlbmVyYXRlX3NpNih1X2ludDhfdCAqb3V0cHV0LCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV82ICpzaTY7CisJaW50IGwyX3BsZW4gPSAxMTsKKworCW1lbXNldChvdXRwdXQsIEdTTV9NQUNCTE9DS19QQURESU5HLCBHU01fTUFDQkxPQ0tfTEVOKTsKKworCS8qIGlwLmFjY2VzcyBuYW5vQlRTIG5lZWRzIGwyX3BsZW4hISAqLworCWlmIChpc19pcGFjY2Vzc19idHMoYnRzKSkgeworCQkqb3V0cHV0KysgPSAobDJfcGxlbiA8PCAyKSB8IDE7CisJCWwyX3BsZW4rKzsKKwl9CisKKwlzaTYgPSAoc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlXzYgKikgb3V0cHV0OworCisJLyogbDIgcHNldWRvIGxlbmd0aCwgbm90IHBhcnQgb2YgbXNnOiAxMSAqLworCXNpNi0+cnJfcHJvdG9jb2xfZGlzY3JpbWluYXRvciA9IEdTTTQ4X1BESVNDX1JSOworCXNpNi0+c2tpcF9pbmRpY2F0b3IgPSAwOworCXNpNi0+c3lzdGVtX2luZm9ybWF0aW9uID0gR1NNNDhfTVRfUlJfU1lTSU5GT182OworCXNpNi0+Y2VsbF9pZGVudGl0eSA9IGh0b25zKGJ0cy0+Y2VsbF9pZGVudGl0eSk7CisJZ3NtNDhfZ2VuZXJhdGVfbGFpKCZzaTYtPmxhaSwgYnRzLT5uZXR3b3JrLT5jb3VudHJ5X2NvZGUsCisJCQkgICBidHMtPm5ldHdvcmstPm5ldHdvcmtfY29kZSwKKwkJCSAgIGJ0cy0+bG9jYXRpb25fYXJlYV9jb2RlKTsKKwlzaTYtPmNlbGxfb3B0aW9ucyA9IGJ0cy0+c2lfY29tbW9uLmNlbGxfb3B0aW9uczsKKwlzaTYtPm5jY19wZXJtaXR0ZWQgPSBidHMtPnNpX2NvbW1vbi5uY2NfcGVybWl0dGVkOworCisJLyogU0k2IFJlc3QgT2N0ZXRzOiAxMC41LjIuMzVhOiBQQ0ggLyBOQ0ggaW5mbywgVkJTL1ZHQ1Mgb3B0aW9ucyAqLworCisJcmV0dXJuIGwyX3BsZW47Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ3NtNDhfc2kxM19pbmZvIHNpMTNfZGVmYXVsdCA9IHsKKwkuY2VsbF9vcHRzID0geworCQkubm1vIAkJPSBHUFJTX05NT19JSUksCisJCS50MzE2OAkJPSAxNTAwLAorCQkudDMxOTIJCT0gNTAwLAorCQkuZHJ4X3RpbWVyX21heAk9IDMsCisJCS5ic19jdl9tYXgJPSAxNSwKKwl9LAorCS5wd3JfY3RybF9wYXJzID0geworCQkuYWxwaGEJCT0gMTAsCS8qIGEgPSAxLjAgKi8KKwkJLnRfYXZnX3cJPSAyNSwKKwkJLnRfYXZnX3QJPSAyNSwKKwkJLnBjX21lYXNfY2hhbgk9IDAsIAkvKiBkb3dubGluZyBtZWFzdXJlZCBvbiBDQ0NIICovCisJCS5uX2F2Z19pCT0gMTUsCisJfSwKKwkuYmNjaF9jaGFuZ2VfbWFyawk9IDEsCisJLnNpX2NoYW5nZV9maWVsZAk9IDAsCisJLnBiY2NoX3ByZXNlbnQJCT0gMCwKKwl7CisJCS5ub19wYmNjaCA9IHsKKwkJCS5yYWMJCT0gMCwJLyogbmVlZHMgdG8gYmUgcGF0Y2hlZCAqLworCQkJLnNwZ2NfY2NjaF9zdXAgCT0gMCwKKwkJCS5uZXRfY3RybF9vcmQJPSAwLAorCQkJLnByaW9fYWNjX3Rocgk9IDYsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBpbnQgZ2VuZXJhdGVfc2kxMyh1X2ludDhfdCAqb3V0cHV0LCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV8xMyAqc2kxMyA9CisJCShzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfMTMgKikgb3V0cHV0OworCWludCByZXQ7CisKKwltZW1zZXQoc2kxMywgR1NNX01BQ0JMT0NLX1BBRERJTkcsIEdTTV9NQUNCTE9DS19MRU4pOworCisJc2kxMy0+aGVhZGVyLnJyX3Byb3RvY29sX2Rpc2NyaW1pbmF0b3IgPSBHU000OF9QRElTQ19SUjsKKwlzaTEzLT5oZWFkZXIuc2tpcF9pbmRpY2F0b3IgPSAwOworCXNpMTMtPmhlYWRlci5zeXN0ZW1faW5mb3JtYXRpb24gPSBHU000OF9NVF9SUl9TWVNJTkZPXzEzOworCisJc2kxM19kZWZhdWx0Lm5vX3BiY2NoLnJhYyA9IGJ0cy0+Z3Bycy5yYWM7CisKKwlyZXQgPSByZXN0X29jdGV0c19zaTEzKHNpMTMtPnJlc3Rfb2N0ZXRzLCAmc2kxM19kZWZhdWx0KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXNpMTMtPmhlYWRlci5sMl9wbGVuID0gcmV0ICYgMHhmZjsKKworCXJldHVybiBzaXplb2YgKCpzaTEzKSArIHJldDsKK30KKworaW50IGdzbV9nZW5lcmF0ZV9zaSh1X2ludDhfdCAqb3V0cHV0LCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgdHlwZSkKK3sKKwlzaV9pbmZvLmdwcnNfaW5kLnByZXNlbnQgPSBidHMtPmdwcnMuZW5hYmxlZDsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgUlNMX1NZU1RFTV9JTkZPXzE6CisJCXJldHVybiBnZW5lcmF0ZV9zaTEob3V0cHV0LCBidHMpOworCWNhc2UgUlNMX1NZU1RFTV9JTkZPXzI6CisJCXJldHVybiBnZW5lcmF0ZV9zaTIob3V0cHV0LCBidHMpOworCWNhc2UgUlNMX1NZU1RFTV9JTkZPXzM6CisJCXJldHVybiBnZW5lcmF0ZV9zaTMob3V0cHV0LCBidHMpOworCWNhc2UgUlNMX1NZU1RFTV9JTkZPXzQ6CisJCXJldHVybiBnZW5lcmF0ZV9zaTQob3V0cHV0LCBidHMpOworCWNhc2UgUlNMX1NZU1RFTV9JTkZPXzU6CisJCXJldHVybiBnZW5lcmF0ZV9zaTUob3V0cHV0LCBidHMpOworCWNhc2UgUlNMX1NZU1RFTV9JTkZPXzY6CisJCXJldHVybiBnZW5lcmF0ZV9zaTYob3V0cHV0LCBidHMpOworCWNhc2UgUlNMX1NZU1RFTV9JTkZPXzEzOgorCQlyZXR1cm4gZ2VuZXJhdGVfc2kxMyhvdXRwdXQsIGJ0cyk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy90YWxsb2NfY3R4LmMgYi9vcGVuYnNjL3NyYy90YWxsb2NfY3R4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM3OWUxMwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3RhbGxvY19jdHguYwpAQCAtMCwwICsxLDM2IEBACisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorCitleHRlcm4gdm9pZCAqdGFsbF9tc2diX2N0eDsKK2V4dGVybiB2b2lkICp0YWxsX2ZsZV9jdHg7CitleHRlcm4gdm9pZCAqdGFsbF9sb2NvcF9jdHg7CitleHRlcm4gdm9pZCAqdGFsbF9nc21zX2N0eDsKK2V4dGVybiB2b2lkICp0YWxsX3N1YnNjcl9jdHg7CitleHRlcm4gdm9pZCAqdGFsbF9zdWJfcmVxX2N0eDsKK2V4dGVybiB2b2lkICp0YWxsX2NhbGxfY3R4OworZXh0ZXJuIHZvaWQgKnRhbGxfcGFnaW5nX2N0eDsKK2V4dGVybiB2b2lkICp0YWxsX3NpZ2hfY3R4OworZXh0ZXJuIHZvaWQgKnRhbGxfdHFlX2N0eDsKK2V4dGVybiB2b2lkICp0YWxsX3RyYW5zX2N0eDsKK2V4dGVybiB2b2lkICp0YWxsX21hcF9jdHg7CitleHRlcm4gdm9pZCAqdGFsbF91cHFfY3R4OworZXh0ZXJuIHZvaWQgKnRhbGxfY3RyX2N0eDsKKwordm9pZCB0YWxsb2NfY3R4X2luaXQodm9pZCkKK3sKKwl0YWxsX21zZ2JfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfYnNjX2N0eCwgMCwgIm1zZ2IiKTsKKwl0YWxsX2ZsZV9jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QodGFsbF9ic2NfY3R4LCAwLCAKKwkJCQkJICAiYnMxMV9maWxlX2xpc3RfZW50cnkiKTsKKwl0YWxsX2xvY29wX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX2JzY19jdHgsIDAsICJsb2NfdXBkYXRpbmdfb3BlciIpOworCXRhbGxfZ3Ntc19jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QodGFsbF9ic2NfY3R4LCAwLCAic21zIik7CisJdGFsbF9zdWJzY3JfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfYnNjX2N0eCwgMCwgInN1YnNjcmliZXIiKTsKKwl0YWxsX3N1Yl9yZXFfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfYnNjX2N0eCwgMCwgInN1YnNjcl9yZXF1ZXN0Iik7CisJdGFsbF9jYWxsX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX2JzY19jdHgsIDAsICJnc21fY2FsbCIpOworCXRhbGxfcGFnaW5nX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX2JzY19jdHgsIDAsICJwYWdpbmdfcmVxdWVzdCIpOworCXRhbGxfc2lnaF9jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QodGFsbF9ic2NfY3R4LCAwLCAic2lnbmFsX2hhbmRsZXIiKTsKKwl0YWxsX3RxZV9jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QodGFsbF9ic2NfY3R4LCAwLCAic3ViY2hfdHhxX2VudHJ5Iik7CisJdGFsbF90cmFuc19jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QodGFsbF9ic2NfY3R4LCAwLCAidHJhbnNhY3Rpb24iKTsKKwl0YWxsX21hcF9jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QodGFsbF9ic2NfY3R4LCAwLCAidHJhdV9tYXBfZW50cnkiKTsKKwl0YWxsX3VwcV9jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QodGFsbF9ic2NfY3R4LCAwLCAidHJhdV91cHFfZW50cnkiKTsKKwl0YWxsX2N0cl9jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QodGFsbF9ic2NfY3R4LCAwLCAiY291bnRlciIpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvdGVsbmV0X2ludGVyZmFjZS5jIGIvb3BlbmJzYy9zcmMvdGVsbmV0X2ludGVyZmFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMTE5YjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy90ZWxuZXRfaW50ZXJmYWNlLmMKQEAgLTAsMCArMSwyMDkgQEAKKy8qIG1pbmltYWxpc3RpYyB0ZWxuZXQvbmV0d29yayBpbnRlcmZhY2UgaXQgbWlnaHQgdHVybiBpbnRvIGEgd2lyZSBpbnRlcmZhY2UgKi8KKy8qIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy90ZWxuZXRfaW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvY2hhbl9hbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzA4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMTEuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX3JzbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvcGFnaW5nLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisKKyNpbmNsdWRlIDx2dHkvYnVmZmVyLmg+CisKKyNkZWZpbmUgV1JJVEVfQ09OTkVDVElPTihmZCwgbXNnLi4uKSBcCisJaW50IHJldDsgXAorCWNoYXIgYnVmWzQwOTZdOyBcCisJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgbXNnKTsgXAorCXJldCA9IHdyaXRlKGZkLCBidWYsIHN0cmxlbihidWYpKTsKKworCisvKiBwZXIgY29ubmVjdGlvbiBkYXRhICovCitMTElTVF9IRUFEKGFjdGl2ZV9jb25uZWN0aW9ucyk7CisKK3N0YXRpYyB2b2lkICp0YWxsX3RlbG5ldF9jdHg7CisKKy8qIHBlciBuZXR3b3JrIGRhdGEgKi8KK3N0YXRpYyBpbnQgdGVsbmV0X25ld19jb25uZWN0aW9uKHN0cnVjdCBic2NfZmQgKmZkLCB1bnNpZ25lZCBpbnQgd2hhdCk7CisKK3N0YXRpYyBzdHJ1Y3QgYnNjX2ZkIHNlcnZlcl9zb2NrZXQgPSB7CisJLndoZW4JICAgID0gQlNDX0ZEX1JFQUQsCisJLmNiCSAgICA9IHRlbG5ldF9uZXdfY29ubmVjdGlvbiwKKwkucHJpdl9uciAgICA9IDAsCit9OworCit2b2lkIHRlbG5ldF9pbml0KHN0cnVjdCBnc21fbmV0d29yayAqbmV0d29yaywgaW50IHBvcnQpIHsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc29ja19hZGRyOworCWludCBmZCwgb24gPSAxOworCisJdGFsbF90ZWxuZXRfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfYnNjX2N0eCwgMSwKKwkJCQkJICAgICAidGVsbmV0X2Nvbm5lY3Rpb24iKTsKKworCWJzY192dHlfaW5pdChuZXR3b3JrKTsKKworCWZkID0gc29ja2V0KFBGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCk7CisKKwlpZiAoZmQgPCAwKSB7CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiVGVsbmV0IGludGVyZmFjZSBzb2NrZXQgY3JlYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXNldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgJm9uLCBzaXplb2Yob24pKTsKKworCW1lbXNldCgmc29ja19hZGRyLCAwLCBzaXplb2Yoc29ja19hZGRyKSk7CisJc29ja19hZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCXNvY2tfYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworCXNvY2tfYWRkci5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfTE9PUEJBQ0spOworCisJaWYgKGJpbmQoZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzb2NrX2FkZHIsIHNpemVvZihzb2NrX2FkZHIpKSA8IDApIHsKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJUZWxuZXQgaW50ZXJmYWNlIGZhaWxlZCB0byBiaW5kXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChsaXN0ZW4oZmQsIDApIDwgMCkgeworCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIlRlbG5ldCBpbnRlcmZhY2UgZmFpbGVkIHRvIGxpc3RlblxuIik7CisJCXJldHVybjsKKwl9CisKKwlzZXJ2ZXJfc29ja2V0LmRhdGEgPSBuZXR3b3JrOworCXNlcnZlcl9zb2NrZXQuZmQgPSBmZDsKKwlic2NfcmVnaXN0ZXJfZmQoJnNlcnZlcl9zb2NrZXQpOworfQorCitleHRlcm4gY29uc3QgY2hhciAqb3BlbmJzY19jb3B5cmlnaHQ7CitleHRlcm4gY29uc3QgY2hhciAqb3BlbmJzY192ZXJzaW9uOworCitzdGF0aWMgdm9pZCBwcmludF93ZWxjb21lKGludCBmZCkgeworCWludCByZXQ7CisJc3RhdGljIGNoYXIgKm1zZyA9CisJCSJXZWxjb21lIHRvIHRoZSBPcGVuQlNDIENvbnRyb2wgaW50ZXJmYWNlXG4iOworCisJcmV0ID0gd3JpdGUoZmQsIG1zZywgc3RybGVuKG1zZykpOworCXJldCA9IHdyaXRlKGZkLCBvcGVuYnNjX2NvcHlyaWdodCwgc3RybGVuKG9wZW5ic2NfY29weXJpZ2h0KSk7Cit9CisKK2ludCB0ZWxuZXRfY2xvc2VfY2xpZW50KHN0cnVjdCBic2NfZmQgKmZkKSB7CisJc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICpjb25uID0gKHN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiopZmQtPmRhdGE7CisKKwljbG9zZShmZC0+ZmQpOworCWJzY191bnJlZ2lzdGVyX2ZkKGZkKTsKKworCWlmIChjb25uLT5kYmcpIHsKKwkJZGVidWdfZGVsX3RhcmdldChjb25uLT5kYmcpOworCQl0YWxsb2NfZnJlZShjb25uLT5kYmcpOworCX0KKworCWxsaXN0X2RlbCgmY29ubi0+ZW50cnkpOworCXRhbGxvY19mcmVlKGNvbm4pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNsaWVudF9kYXRhKHN0cnVjdCBic2NfZmQgKmZkLCB1bnNpZ25lZCBpbnQgd2hhdCkKK3sKKwlzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKmNvbm4gPSBmZC0+ZGF0YTsKKwlpbnQgcmMgPSAwOworCisJaWYgKHdoYXQgJiBCU0NfRkRfUkVBRCkgeworCQljb25uLT5mZC53aGVuICY9IH5CU0NfRkRfUkVBRDsKKwkJcmMgPSB2dHlfcmVhZChjb25uLT52dHkpOworCX0KKworCS8qIHZ0eSBtaWdodCBoYXZlIGJlZW4gY2xvc2VkIGZyb20gdml0aGluIHZ0eV9yZWFkKCkgKi8KKwlpZiAoIWNvbm4tPnZ0eSkKKwkJcmV0dXJuIHJjOworCisJaWYgKHdoYXQgJiBCU0NfRkRfV1JJVEUpIHsKKwkJcmMgPSBidWZmZXJfZmx1c2hfYWxsKGNvbm4tPnZ0eS0+b2J1ZiwgZmQtPmZkKTsKKwkJaWYgKHJjID09IEJVRkZFUl9FTVBUWSkKKwkJCWNvbm4tPmZkLndoZW4gJj0gfkJTQ19GRF9XUklURTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgdGVsbmV0X25ld19jb25uZWN0aW9uKHN0cnVjdCBic2NfZmQgKmZkLCB1bnNpZ25lZCBpbnQgd2hhdCkgeworCXN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc29ja2FkZHI7CisJc29ja2xlbl90IGxlbiA9IHNpemVvZihzb2NrYWRkcik7CisJaW50IG5ld19jb25uZWN0aW9uID0gYWNjZXB0KGZkLT5mZCwgKHN0cnVjdCBzb2NrYWRkciopJnNvY2thZGRyLCAmbGVuKTsKKworCWlmIChuZXdfY29ubmVjdGlvbiA8IDApIHsKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJ0ZWxuZXQgYWNjZXB0IGZhaWxlZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKworCWNvbm5lY3Rpb24gPSB0YWxsb2NfemVybyh0YWxsX3RlbG5ldF9jdHgsIHN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbik7CisJY29ubmVjdGlvbi0+bmV0d29yayA9IChzdHJ1Y3QgZ3NtX25ldHdvcmsqKWZkLT5kYXRhOworCWNvbm5lY3Rpb24tPmZkLmRhdGEgPSBjb25uZWN0aW9uOworCWNvbm5lY3Rpb24tPmZkLmZkID0gbmV3X2Nvbm5lY3Rpb247CisJY29ubmVjdGlvbi0+ZmQud2hlbiA9IEJTQ19GRF9SRUFEOworCWNvbm5lY3Rpb24tPmZkLmNiID0gY2xpZW50X2RhdGE7CisJYnNjX3JlZ2lzdGVyX2ZkKCZjb25uZWN0aW9uLT5mZCk7CisJbGxpc3RfYWRkX3RhaWwoJmNvbm5lY3Rpb24tPmVudHJ5LCAmYWN0aXZlX2Nvbm5lY3Rpb25zKTsKKworCXByaW50X3dlbGNvbWUobmV3X2Nvbm5lY3Rpb24pOworCisJY29ubmVjdGlvbi0+dnR5ID0gdnR5X2NyZWF0ZShuZXdfY29ubmVjdGlvbiwgY29ubmVjdGlvbik7CisJaWYgKCFjb25uZWN0aW9uLT52dHkpIHsKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJjb3VsZG4ndCBjcmVhdGUgVlRZXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisvKiBjYWxsYmFjayBmcm9tIFZUWSBjb2RlICovCit2b2lkIHZ0eV9ldmVudChlbnVtIGV2ZW50IGV2ZW50LCBpbnQgc29jaywgc3RydWN0IHZ0eSAqdnR5KQoreworCXN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IHZ0eS0+cHJpdjsKKwlzdHJ1Y3QgYnNjX2ZkICpiZmQgPSAmY29ubmVjdGlvbi0+ZmQ7CisKKwlpZiAodnR5LT50eXBlICE9IFZUWV9URVJNKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBWVFlfUkVBRDoKKwkJYmZkLT53aGVuIHw9IEJTQ19GRF9SRUFEOworCQlicmVhazsKKwljYXNlIFZUWV9XUklURToKKwkJYmZkLT53aGVuIHw9IEJTQ19GRF9XUklURTsKKwkJYnJlYWs7CisJY2FzZSBWVFlfQ0xPU0VEOgorCQkvKiB2dHkgbGF5ZXIgaXMgYWJvdXQgdG8gZnJlZSgpIHZ0eSAqLworCQljb25uZWN0aW9uLT52dHkgPSBOVUxMOworCQl0ZWxuZXRfY2xvc2VfY2xpZW50KGJmZCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvdG9rZW5fYXV0aC5jIGIvb3BlbmJzYy9zcmMvdG9rZW5fYXV0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZWZlYTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy90b2tlbl9hdXRoLmMKQEAgLTAsMCArMSwxNTYgQEAKKy8qIFNNUyBiYXNlZCB0b2tlbiBhdXRoZW50aWNhdGlvbiBmb3IgYWQtaG9jIEdTTSBuZXR3b3JrcyAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8xMS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzA4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvY2hhbl9hbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGIuaD4KKworI2RlZmluZSBUT0tFTl9TTVNfVEVYVCAiSEFSIDIwMDkgR1NNLiAgUmVnaXN0ZXIgYXQgaHR0cDovL2hhcjIwMDkuZ251bW9ua3Mub3JnLyAiIFwKKwkJCSJZb3VyIElNU0kgaXMgJXMsIGF1dGggdG9rZW4gaXMgJTA4WCwgcGhvbmUgbm8gaXMgJXMuIgorCitleHRlcm4gc3RydWN0IGdzbV9zbXMgKnNtc19mcm9tX3RleHQoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpyZWNlaXZlciwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKnRleHQpOworCitzdGF0aWMgY2hhciAqYnVpbGRfc21zX3N0cmluZyhzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciwgdV9pbnQzMl90IHRva2VuKQoreworCWNoYXIgKnNtc19zdHI7CisJdW5zaWduZWQgaW50IGxlbjsKKworCWxlbiA9IHN0cmxlbihzdWJzY3ItPmltc2kpICsgOCArIHN0cmxlbihUT0tFTl9TTVNfVEVYVCk7CisJc21zX3N0ciA9IHRhbGxvY19zaXplKHRhbGxfYnNjX2N0eCwgbGVuKTsKKwlpZiAoIXNtc19zdHIpCisJCXJldHVybiBOVUxMOworCisJc25wcmludGYoc21zX3N0ciwgbGVuLCBUT0tFTl9TTVNfVEVYVCwgc3Vic2NyLT5pbXNpLCB0b2tlbiwKKwkJIHN1YnNjci0+ZXh0ZW5zaW9uKTsKKwlzbXNfc3RyW2xlbi0xXSA9ICdcMCc7CisKKwlyZXR1cm4gc21zX3N0cjsKK30KKworc3RhdGljIGludCB0b2tlbl9zdWJzY3JfY2IodW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IHNpZ25hbCwKKwkJCXZvaWQgKmhhbmRsZXJfZGF0YSwgdm9pZCAqc2lnbmFsX2RhdGEpCit7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IgPSBzaWduYWxfZGF0YTsKKwlzdHJ1Y3QgZ3NtX3NtcyAqc21zOworCWludCByYyA9IDA7CisKKwlpZiAoc2lnbmFsICE9IFNfU1VCU0NSX0FUVEFDSEVEKQorCQlyZXR1cm4gMDsKKworCWlmIChzdWJzY3ItPm5ldC0+YXV0aF9wb2xpY3kgIT0gR1NNX0FVVEhfUE9MSUNZX1RPS0VOKQorCQlyZXR1cm4gMDsKKworCWlmIChzdWJzY3ItPmZsYWdzICYgR1NNX1NVQlNDUklCRVJfRklSU1RfQ09OVEFDVCkgeworCQl1X2ludDMyX3QgdG9rZW47CisJCWNoYXIgKnNtc19zdHI7CisKKwkJLyogd2UndmUgc2VlbiB0aGlzIHN1YnNjcmliZXIgZm9yIHRoZSBmaXJzdCB0aW1lLiAqLworCQlyYyA9IGRiX3N1YnNjcmliZXJfYWxsb2NfdG9rZW4oc3Vic2NyLCAmdG9rZW4pOworCQlpZiAocmMgIT0gMCkgeworCQkJcmMgPSAtRUlPOworCQkJZ290byB1bmF1dGg7CisJCX0KKworCQlzbXNfc3RyID0gYnVpbGRfc21zX3N0cmluZyhzdWJzY3IsIHRva2VuKTsKKwkJaWYgKCFzbXNfc3RyKSB7CisJCQlyYyA9IC1FTk9NRU07CisJCQlnb3RvIHVuYXV0aDsKKwkJfQorCisJCXNtcyA9IHNtc19mcm9tX3RleHQoc3Vic2NyLCBzbXNfc3RyKTsKKwkJdGFsbG9jX2ZyZWUoc21zX3N0cik7CisJCWlmICghc21zKSB7CisJCQlyYyA9IC1FTk9NRU07CisJCQlnb3RvIHVuYXV0aDsKKwkJfQorCisJCXJjID0gZ3NtNDExX3NlbmRfc21zX3N1YnNjcihzdWJzY3IsIHNtcyk7CisKKwkJLyogRklYTUU6IGVsc2UsIGRlbGV0ZSB0aGUgc3Vic2NpcmJlciBmcm9tIGRhdGFiYXNlICovCit1bmF1dGg6CisKKwkJLyogbWFrZSBzdXJlIHdlIGRvbid0IGFsbG93IGhpbSBpbiBhZ2FpbiB1bmxlc3MgaGUgY2xpY2tzIHRoZSB3ZWIgVUkgKi8KKwkJc3Vic2NyLT5hdXRob3JpemVkID0gMDsKKwkJZGJfc3luY19zdWJzY3JpYmVyKHN1YnNjcik7CisJCWlmIChyYykgeworCQkJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBsY2hhbl9mb3Jfc3Vic2NyKHN1YnNjcik7CisJCQlpZiAobGNoYW4pIHsKKwkJCQl1X2ludDhfdCBhdXRoX3JhbmRbMTZdOworCQkJCS8qIGtpY2sgdGhlIHN1YnNjcmliZXIgb2ZmIHRoZSBuZXR3b3JrICovCisJCQkJZ3NtNDhfdHhfbW1fYXV0aF9yZXEobGNoYW4sIGF1dGhfcmFuZCwgMCk7CisJCQkJZ3NtNDhfdHhfbW1fYXV0aF9yZWoobGNoYW4pOworCQkJCS8qIEZJWE1FOiBjbG9zZSB0aGUgY2hhbm5lbCBlYXJseSA/Ki8KKwkJCQkvL2dzbTQ4X3NlbmRfcnJfUmVsZWFzZShsY2hhbik7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgdG9rZW5fc21zX2NiKHVuc2lnbmVkIGludCBzdWJzeXMsIHVuc2lnbmVkIGludCBzaWduYWwsCisJCQl2b2lkICpoYW5kbGVyX2RhdGEsIHZvaWQgKnNpZ25hbF9kYXRhKQoreworCXN0cnVjdCBnc21fc21zICpzbXMgPSBzaWduYWxfZGF0YTsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKwl1X2ludDhfdCBhdXRoX3JhbmRbMTZdOworCisKKwlpZiAoc2lnbmFsICE9IFNfU01TX0RFTElWRVJFRCkKKwkJcmV0dXJuIDA7CisKKworCS8qIHRoZXNlIGFyZSBub3QgdGhlIGRyb2lkcyB3ZSd2ZSBiZWVuIGxvb2tpbmcgZm9yICovCisJaWYgKCFzbXMtPnJlY2VpdmVyIHx8CisJICAgICEoc21zLT5yZWNlaXZlci0+ZmxhZ3MgJiBHU01fU1VCU0NSSUJFUl9GSVJTVF9DT05UQUNUKSkKKwkJcmV0dXJuIDA7CisKKworCWlmIChzbXMtPnJlY2VpdmVyLT5uZXQtPmF1dGhfcG9saWN5ICE9IEdTTV9BVVRIX1BPTElDWV9UT0tFTikKKwkJcmV0dXJuIDA7CisKKworCWxjaGFuID0gbGNoYW5fZm9yX3N1YnNjcihzbXMtPnJlY2VpdmVyKTsKKwlpZiAobGNoYW4pIHsKKwkJLyoga2ljayB0aGUgc3Vic2NyaWJlciBvZmYgdGhlIG5ldHdvcmsgKi8KKwkJZ3NtNDhfdHhfbW1fYXV0aF9yZXEobGNoYW4sIGF1dGhfcmFuZCwgMCk7CisJCWdzbTQ4X3R4X21tX2F1dGhfcmVqKGxjaGFuKTsKKwkJLyogRklYTUU6IGNsb3NlIHRoZSBjaGFubmVsIGVhcmx5ID8qLworCQkvL2dzbTQ4X3NlbmRfcnJfUmVsZWFzZShsY2hhbik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8vc3RhdGljIF9fYXR0cmlidXRlX18oKGNvbnN0cnVjdG9yKSkgdm9pZCBvbl9kc29fbG9hZF90b2tlbih2b2lkKQordm9pZCBvbl9kc29fbG9hZF90b2tlbih2b2lkKQoreworCXJlZ2lzdGVyX3NpZ25hbF9oYW5kbGVyKFNTX1NVQlNDUiwgdG9rZW5fc3Vic2NyX2NiLCBOVUxMKTsKKwlyZWdpc3Rlcl9zaWduYWxfaGFuZGxlcihTU19TTVMsIHRva2VuX3Ntc19jYiwgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy90cmFuc2FjdGlvbi5jIGIvb3BlbmJzYy9zcmMvdHJhbnNhY3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWEyNzlkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvdHJhbnNhY3Rpb24uYwpAQCAtMCwwICsxLDE3MSBAQAorLyogR1NNIDA0LjA3IFRyYW5zYWN0aW9uIGhhbmRsaW5nICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPG9wZW5ic2MvdHJhbnNhY3Rpb24uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9tbmNjLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8wOC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvbW5jYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvcGFnaW5nLmg+CisKK3ZvaWQgKnRhbGxfdHJhbnNfY3R4OworCit2b2lkIF9nc200OF9jY190cmFuc19mcmVlKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zKTsKKworc3RydWN0IGdzbV90cmFucyAqdHJhbnNfZmluZF9ieV9pZChzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciwKKwkJCQkgICB1X2ludDhfdCBwcm90bywgdV9pbnQ4X3QgdHJhbnNfaWQpCit7CisJc3RydWN0IGdzbV90cmFucyAqdHJhbnM7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBzdWJzY3ItPm5ldDsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHRyYW5zLCAmbmV0LT50cmFuc19saXN0LCBlbnRyeSkgeworCQlpZiAodHJhbnMtPnN1YnNjciA9PSBzdWJzY3IgJiYKKwkJICAgIHRyYW5zLT5wcm90b2NvbCA9PSBwcm90byAmJgorCQkgICAgdHJhbnMtPnRyYW5zYWN0aW9uX2lkID09IHRyYW5zX2lkKQorCQkJcmV0dXJuIHRyYW5zOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IGdzbV90cmFucyAqdHJhbnNfZmluZF9ieV9jYWxscmVmKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LAorCQkJCQl1X2ludDMyX3QgY2FsbHJlZikKK3sKKwlzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuczsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHRyYW5zLCAmbmV0LT50cmFuc19saXN0LCBlbnRyeSkgeworCQlpZiAodHJhbnMtPmNhbGxyZWYgPT0gY2FsbHJlZikKKwkJCXJldHVybiB0cmFuczsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBnc21fdHJhbnMgKnRyYW5zX2FsbG9jKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorCQkJICAgICAgdV9pbnQ4X3QgcHJvdG9jb2wsIHVfaW50OF90IHRyYW5zX2lkLAorCQkJICAgICAgdV9pbnQzMl90IGNhbGxyZWYpCit7CisJc3RydWN0IGdzbV90cmFucyAqdHJhbnM7CisKKwlERUJVR1AoRENDLCAic3Vic2NyPSVwLCBzdWJzY3ItPm5ldD0lcFxuIiwgc3Vic2NyLCBzdWJzY3ItPm5ldCk7CisKKwl0cmFucyA9IHRhbGxvY196ZXJvKHRhbGxfdHJhbnNfY3R4LCBzdHJ1Y3QgZ3NtX3RyYW5zKTsKKwlpZiAoIXRyYW5zKQorCQlyZXR1cm4gTlVMTDsKKworCXRyYW5zLT5zdWJzY3IgPSBzdWJzY3I7CisJc3Vic2NyX2dldCh0cmFucy0+c3Vic2NyKTsKKworCXRyYW5zLT5wcm90b2NvbCA9IHByb3RvY29sOworCXRyYW5zLT50cmFuc2FjdGlvbl9pZCA9IHRyYW5zX2lkOworCXRyYW5zLT5jYWxscmVmID0gY2FsbHJlZjsKKworCWxsaXN0X2FkZF90YWlsKCZ0cmFucy0+ZW50cnksICZzdWJzY3ItPm5ldC0+dHJhbnNfbGlzdCk7CisKKwlyZXR1cm4gdHJhbnM7Cit9CisKK3ZvaWQgdHJhbnNfZnJlZShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucykKK3sKKwlzd2l0Y2ggKHRyYW5zLT5wcm90b2NvbCkgeworCWNhc2UgR1NNNDhfUERJU0NfQ0M6CisJCV9nc200OF9jY190cmFuc19mcmVlKHRyYW5zKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9QRElTQ19TTVM6CisJCV9nc200MTFfc21zX3RyYW5zX2ZyZWUodHJhbnMpOworCQlicmVhazsKKwl9CisKKwlpZiAodHJhbnMtPmxjaGFuKQorCQlwdXRfbGNoYW4odHJhbnMtPmxjaGFuKTsKKworCWlmICghdHJhbnMtPmxjaGFuICYmIHRyYW5zLT5zdWJzY3IgJiYgdHJhbnMtPnN1YnNjci0+bmV0KSB7CisJCS8qIFN0b3AgcGFnaW5nIG9uIGFsbCBidHMnICovCisJCXBhZ2luZ19yZXF1ZXN0X3N0b3AoTlVMTCwgdHJhbnMtPnN1YnNjciwgTlVMTCk7CisJfQorCisJaWYgKHRyYW5zLT5zdWJzY3IpCisJCXN1YnNjcl9wdXQodHJhbnMtPnN1YnNjcik7CisKKwlsbGlzdF9kZWwoJnRyYW5zLT5lbnRyeSk7CisKKwl0YWxsb2NfZnJlZSh0cmFucyk7Cit9CisKKy8qIGFsbG9jYXRlIGFuIHVudXNlZCB0cmFuc2FjdGlvbiBJRCBmb3IgdGhlIGdpdmVuIHN1YnNjcmliZXIKKyAqIGluIHRoZSBnaXZlbiBwcm90b2NvbCB1c2luZyB0aGUgdGlfZmxhZyBzcGVjaWZpZWQgKi8KK2ludCB0cmFuc19hc3NpZ25fdHJhbnNfaWQoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsCisJCQkgIHVfaW50OF90IHByb3RvY29sLCB1X2ludDhfdCB0aV9mbGFnKQoreworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0ID0gc3Vic2NyLT5uZXQ7CisJc3RydWN0IGdzbV90cmFucyAqdHJhbnM7CisJdW5zaWduZWQgaW50IHVzZWRfdGlkX2JpdG1hc2sgPSAwOworCWludCBpLCBqLCBoOworCisJaWYgKHRpX2ZsYWcpCisJCXRpX2ZsYWcgPSAweDg7CisKKwkvKiBnZW5lcmF0ZSBiaXRtYXNrIG9mIGFscmVhZHktdXNlZCBUSURzIGZvciB0aGlzIChzdWJzY3IscHJvdG8pICovCisJbGxpc3RfZm9yX2VhY2hfZW50cnkodHJhbnMsICZuZXQtPnRyYW5zX2xpc3QsIGVudHJ5KSB7CisJCWlmICh0cmFucy0+c3Vic2NyICE9IHN1YnNjciB8fAorCQkgICAgdHJhbnMtPnByb3RvY29sICE9IHByb3RvY29sIHx8CisJCSAgICB0cmFucy0+dHJhbnNhY3Rpb25faWQgPT0gMHhmZikKKwkJCWNvbnRpbnVlOworCQl1c2VkX3RpZF9iaXRtYXNrIHw9ICgxIDw8IHRyYW5zLT50cmFuc2FjdGlvbl9pZCk7CisJfQorCisJLyogZmluZCBhIG5ldyBvbmUsIHRyeWluZyB0byBnbyBpbiBhICdjaXJjdWxhcicgcGF0dGVybiAqLworCWZvciAoaCA9IDY7IGggPiAwOyBoLS0pCisJCWlmICh1c2VkX3RpZF9iaXRtYXNrICYgKDEgPDwgKGggfCB0aV9mbGFnKSkpCisJCQlicmVhazsKKwlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7CisJCWogPSAoKGggKyBpKSAlIDcpIHwgdGlfZmxhZzsKKwkJaWYgKCh1c2VkX3RpZF9iaXRtYXNrICYgKDEgPDwgaikpID09IDApCisJCQlyZXR1cm4gajsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKKy8qIHVwZGF0ZSBhbGwgdHJhbnNhY3Rpb25zIHRvIHVzZSBhIGRpZmZlcmVudCBMQ0hBTiwgZS5nLgorICogYWZ0ZXIgaGFuZG92ZXIgaGFzIHN1Y2NlZWRlZCAqLworaW50IHRyYW5zX2xjaGFuX2NoYW5nZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbl9vbGQsCisJCSAgICAgICBzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbl9uZXcpCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBsY2hhbl9vbGQtPnRzLT50cngtPmJ0cy0+bmV0d29yazsKKwlzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuczsKKwlpbnQgbnVtID0gMDsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHRyYW5zLCAmbmV0LT50cmFuc19saXN0LCBlbnRyeSkgeworCQlpZiAodHJhbnMtPmxjaGFuID09IGxjaGFuX29sZCkgeworCQkJLyogZHJvcCBvbGQgY2hhbm5lbCB1c2UgY291bmQgKi8KKwkJCXB1dF9sY2hhbih0cmFucy0+bGNoYW4pOworCQkJLyogYXNzaWduIG5ldyBjaGFubmVsICovCisJCQl0cmFucy0+bGNoYW4gPSBsY2hhbl9uZXc7CisJCQkvKiBidW1wIG5ldyBjaGFubmVsIHVzZSBjb3VudCAqLworCQkJdXNlX2xjaGFuKHRyYW5zLT5sY2hhbik7CisJCQludW0rKzsKKwkJfQorCX0KKworCXJldHVybiBudW07Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy90cmF1X2ZyYW1lLmMgYi9vcGVuYnNjL3NyYy90cmF1X2ZyYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJjNjFhNQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3RyYXVfZnJhbWUuYwpAQCAtMCwwICsxLDI2MSBAQAorLyogVFJBVSBmcmFtZSBoYW5kbGluZyBhY2NvcmRpbmcgdG8gR1NNIFRTIDA4LjYwICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvdHJhdV9mcmFtZS5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc3ViY2hhbl9kZW11eC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKworc3RhdGljIHVfaW50MzJfdCBnZXRfYml0cyhjb25zdCB1X2ludDhfdCAqYml0YnVmLCBpbnQgb2Zmc2V0LCBpbnQgbnVtKQoreworCWludCBpOworCXVfaW50MzJfdCByZXQgPSAwOworCisJZm9yIChpID0gb2Zmc2V0OyBpIDwgb2Zmc2V0ICsgbnVtOyBpKyspIHsKKwkJcmV0ID0gcmV0IDw8IDE7CisJCWlmIChiaXRidWZbaV0pCisJCQlyZXQgfD0gMTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyogRGVjb2RlIGFjY29yZGluZyB0byAzLjEuMSAqLworc3RhdGljIHZvaWQgZGVjb2RlX2ZyKHN0cnVjdCBkZWNvZGVkX3RyYXVfZnJhbWUgKmZyLCBjb25zdCB1X2ludDhfdCAqdHJhdV9iaXRzKQoreworCWludCBpOworCWludCBkX2lkeCA9IDA7CisKKwkvKiBDMSAuLiBDMTUgKi8KKwltZW1jcHkoZnItPmNfYml0cyswLCB0cmF1X2JpdHMrMTcsIDE1KTsKKwkvKiBDMTYgLi4gQzIxICovCisJbWVtY3B5KGZyLT5jX2JpdHMrMTUsIHRyYXVfYml0cyszMTAsIDYpOworCS8qIFQxIC4uIFQ0ICovCisJbWVtY3B5KGZyLT50X2JpdHMrMCwgdHJhdV9iaXRzKzMxNiwgNCk7CisJLyogRDEgLi4gRDI1NSAqLworCWZvciAoaSA9IDMyOyBpIDwgMzA0OyBpKz0gMTYpIHsKKwkJbWVtY3B5KGZyLT5kX2JpdHMgKyBkX2lkeCwgdHJhdV9iaXRzK2krMSwgMTUpOworCQlkX2lkeCArPSAxNTsKKwl9CisJLyogRDI1NiAuLiBEMjYwICovCisJbWVtY3B5KGZyLT5kX2JpdHMgKyBkX2lkeCwgdHJhdV9iaXRzICsgMzA1LCA1KTsKK30KKworLyogRGVjb2RlIGFjY29yZGluZyB0byAzLjEuMiAqLworc3RhdGljIHZvaWQgZGVjb2RlX2FtcihzdHJ1Y3QgZGVjb2RlZF90cmF1X2ZyYW1lICpmciwgY29uc3QgdV9pbnQ4X3QgKnRyYXVfYml0cykKK3sKKwlpbnQgaTsKKwlpbnQgZF9pZHggPSAwOworCisJLyogQzEgLi4gQzE1ICovCisJbWVtY3B5KGZyLT5jX2JpdHMrMCwgdHJhdV9iaXRzKzE3LCAxNSk7CisJLyogQzE2IC4uIEMyNSAqLworCW1lbWNweShmci0+Y19iaXRzKzE1LCB0cmF1X2JpdHMrMzMsIDEwKTsKKwkvKiBUMSAuLiBUNCAqLworCW1lbWNweShmci0+dF9iaXRzKzAsIHRyYXVfYml0cyszMTYsIDQpOworCS8qIEQxIC4uIEQ1ICovCisJbWVtY3B5KGZyLT5kX2JpdHMsIHRyYXVfYml0cys0MywgNSk7CisJLyogRDYgLi4gRDI0NSAqLworCWZvciAoaSA9IDQ4OyBpIDwgMzA0OyBpICs9IDE2KSB7CisJCW1lbWNweShmci0+ZF9iaXRzICsgZF9pZHgsIHRyYXVfYml0cytpKzEsIDE1KTsKKwkJZF9pZHggKz0gMTU7CisJfQorCS8qIEQyNDYgLi4gRDI1NiAqLworCW1lbWNweShmci0+ZF9iaXRzICsgZF9pZHgsIHRyYXVfYml0cyArIDMwNSwgMTEpOworfQorCitpbnQgZGVjb2RlX3RyYXVfZnJhbWUoc3RydWN0IGRlY29kZWRfdHJhdV9mcmFtZSAqZnIsIGNvbnN0IHVfaW50OF90ICp0cmF1X2JpdHMpCit7CisJdV9pbnQ4X3QgY2JpdHM1ID0gZ2V0X2JpdHModHJhdV9iaXRzLCAxNywgNSk7CisKKwlzd2l0Y2ggKGNiaXRzNSkgeworCWNhc2UgVFJBVV9GVF9GUl9VUDoKKwljYXNlIFRSQVVfRlRfRlJfRE9XTjoKKwljYXNlIFRSQVVfRlRfSURMRV9VUDoKKwljYXNlIFRSQVVfRlRfSURMRV9ET1dOOgorCWNhc2UgVFJBVV9GVF9FRlI6CisJCWRlY29kZV9mcihmciwgdHJhdV9iaXRzKTsKKwkJYnJlYWs7CisJY2FzZSBUUkFVX0ZUX0FNUjoKKwkJZGVjb2RlX2FtcihmciwgdHJhdV9iaXRzKTsKKwkJYnJlYWs7CisJY2FzZSBUUkFVX0ZUX09NX1VQOgorCWNhc2UgVFJBVV9GVF9PTV9ET1dOOgorCWNhc2UgVFJBVV9GVF9EQVRBX1VQOgorCWNhc2UgVFJBVV9GVF9EQVRBX0RPV046CisJY2FzZSBUUkFVX0ZUX0QxNDVfU1lOQzoKKwljYXNlIFRSQVVfRlRfRURBVEE6CisJCUxPR1AoRE1VWCwgTE9HTF9OT1RJQ0UsICJjYW4ndCBkZWNvZGUgdW5pbXBsZW1lbnRlZCBUUkFVICIKKwkJCSJGcmFtZSBUeXBlIDB4JTAyeFxuIiwgY2JpdHM1KTsKKwkJcmV0dXJuIC0xOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERNVVgsIExPR0xfTk9USUNFLCAiY2FuJ3QgZGVjb2RlIHVua25vd24gVFJBVSAiCisJCQkiRnJhbWUgVHlwZSAweCUwMnhcbiIsIGNiaXRzNSk7CisJCXJldHVybiAtMTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2NvbnN0IHVfaW50OF90IGZ0X2ZyX2Rvd25fYml0c1tdID0geyAxLCAxLCAxLCAwLCAwIH07Citjb25zdCB1X2ludDhfdCBmdF9pZGxlX2Rvd25fYml0c1tdID0geyAwLCAxLCAxLCAxLCAwIH07CisKKy8qIG1vZGlmeSBhbiB1cGxpbmsgVFJBVSBmcmFtZSBzbyB3ZSBjYW4gc2VuZCBpdCBkb3dubGluayAqLworaW50IHRyYXVfZnJhbWVfdXAyZG93bihzdHJ1Y3QgZGVjb2RlZF90cmF1X2ZyYW1lICpmcikKK3sKKwl1X2ludDhfdCBjYml0czUgPSBnZXRfYml0cyhmci0+Y19iaXRzLCAwLCA1KTsKKworCXN3aXRjaCAoY2JpdHM1KSB7CisJY2FzZSBUUkFVX0ZUX0ZSX1VQOgorCQltZW1jcHkoZnItPmNfYml0cywgZnRfZnJfZG93bl9iaXRzLCA1KTsKKwkJLyogY2xlYXIgdGltZSBhbGlnbm1lbnQgKi8KKwkJbWVtc2V0KGZyLT5jX2JpdHMrNSwgMCwgNik7CisJCS8qIEZJWE1FOiBTUCAvIEJGSSBpbiBjYXNlIG9mIERUeCAqLworCQkvKiBDMTIgLi4gQzIxIGFyZSBzcGFyZSBhbmQgY29kZWQgYXMgJzEnICovCisJCW1lbXNldChmci0+Y19iaXRzKzExLCAweDAxLCAxMCk7CisJCWJyZWFrOworCWNhc2UgVFJBVV9GVF9FRlI6CisJCS8qIGNsZWFyIHRpbWUgYWxpZ25tZW50ICovCisJCW1lbXNldChmci0+Y19iaXRzKzUsIDAsIDYpOworCQkvKiBGSVhNRTogc2V0IFVGRSBhcHByb3ByaWF0ZWx5ICovCisJCS8qIEZJWE1FOiBTUCAvIEJGSSBpbiBjYXNlIG9mIERUeCAqLworCQlicmVhazsKKwljYXNlIFRSQVVfRlRfSURMRV9VUDoKKwkJbWVtY3B5KGZyLT5jX2JpdHMsIGZ0X2lkbGVfZG93bl9iaXRzLCA1KTsKKwkJLyogY2xlYXIgdGltZSBhbGlnbm1lbnQgKi8KKwkJbWVtc2V0KGZyLT5jX2JpdHMrNSwgMCwgNik7CisJCS8qIEZJWE1FOiBTUCAvIEJGSSBpbiBjYXNlIG9mIERUeCAqLworCQkvKiBDMTIgLi4gQzIxIGFyZSBzcGFyZSBhbmQgY29kZWQgYXMgJzEnICovCisJCW1lbXNldChmci0+Y19iaXRzKzExLCAweDAxLCAxMCk7CisJCWJyZWFrOworCWNhc2UgVFJBVV9GVF9GUl9ET1dOOgorCWNhc2UgVFJBVV9GVF9JRExFX0RPV046CisJY2FzZSBUUkFVX0ZUX09NX0RPV046CisJY2FzZSBUUkFVX0ZUX0RBVEFfRE9XTjoKKwkJLyogd2UgY2Fubm90IGNvbnZlcnQgYSBkb3dubGluayB0byBhIGRvd25saW5rIGZyYW1lICovCisJCXJldHVybiAtRUlOVkFMOworCQlicmVhazsKKwljYXNlIFRSQVVfRlRfQU1SOgorCWNhc2UgVFJBVV9GVF9PTV9VUDoKKwljYXNlIFRSQVVfRlRfREFUQV9VUDoKKwljYXNlIFRSQVVfRlRfRDE0NV9TWU5DOgorCWNhc2UgVFJBVV9GVF9FREFUQToKKwkJTE9HUChETVVYLCBMT0dMX05PVElDRSwgInVuaW1wbGVtZW50ZWQgVFJBVSBGcmFtZSBUeXBlICIKKwkJCSIweCUwMnhcbiIsIGNiaXRzNSk7CisJCXJldHVybiAtMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChETVVYLCBMT0dMX05PVElDRSwgInVua25vd24gVFJBVSBGcmFtZSBUeXBlICIKKwkJCSIweCUwMnhcbiIsIGNiaXRzNSk7CisJCXJldHVybiAtMTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7CisKK30KKworc3RhdGljIHZvaWQgZW5jb2RlX2ZyKHVfaW50OF90ICp0cmF1X2JpdHMsIGNvbnN0IHN0cnVjdCBkZWNvZGVkX3RyYXVfZnJhbWUgKmZyKQoreworCWludCBpOworCWludCBkX2lkeCA9IDA7CisKKwl0cmF1X2JpdHNbMTZdID0gMTsKKwkvKiBDMSAuLiBDMTUgKi8KKwltZW1jcHkodHJhdV9iaXRzKzE3LCBmci0+Y19iaXRzKzAsIDE1KTsKKwkvKiBEMSAuLiBEMjU1ICovCisJZm9yIChpID0gMzI7IGkgPCAzMDQ7IGkrPSAxNikgeworCQl0cmF1X2JpdHNbaV0gPSAxOworCQltZW1jcHkodHJhdV9iaXRzK2krMSwgZnItPmRfYml0cyArIGRfaWR4LCAxNSk7CisJCWRfaWR4ICs9IDE1OworCX0KKwkvKiBEMjU2IC4uIEQyNjAgKi8KKwl0cmF1X2JpdHNbMzA0XSA9IDE7CisJbWVtY3B5KHRyYXVfYml0cyArIDMwNSwgZnItPmRfYml0cyArIGRfaWR4LCA1KTsKKwkvKiBDMTYgLi4gQzIxICovCisJbWVtY3B5KHRyYXVfYml0cyszMTAsIGZyLT5jX2JpdHMrMTUsIDYpOworCisJLyogRklYTUU6IGhhbmRsZSB0aW1pbmcgYWRqdXN0bWVudCAqLworCisJLyogVDEgLi4gVDQgKi8KKwltZW1jcHkodHJhdV9iaXRzKzMxNiwgZnItPnRfYml0cyswLCA0KTsKK30KKworCitpbnQgZW5jb2RlX3RyYXVfZnJhbWUodV9pbnQ4X3QgKnRyYXVfYml0cywgY29uc3Qgc3RydWN0IGRlY29kZWRfdHJhdV9mcmFtZSAqZnIpCit7CisJdV9pbnQ4X3QgY2JpdHM1ID0gZ2V0X2JpdHMoZnItPmNfYml0cywgMCwgNSk7CisJCisJLyogMTYgYml0cyBvZiBzeW5jIGhlYWRlciAqLworCW1lbXNldCh0cmF1X2JpdHMsIDAsIDE2KTsKKworCXN3aXRjaCAoY2JpdHM1KSB7CisJY2FzZSBUUkFVX0ZUX0ZSX1VQOgorCWNhc2UgVFJBVV9GVF9GUl9ET1dOOgorCWNhc2UgVFJBVV9GVF9JRExFX1VQOgorCWNhc2UgVFJBVV9GVF9JRExFX0RPV046CisJY2FzZSBUUkFVX0ZUX0VGUjoKKwkJZW5jb2RlX2ZyKHRyYXVfYml0cywgZnIpOworCQlicmVhazsKKwljYXNlIFRSQVVfRlRfQU1SOgorCWNhc2UgVFJBVV9GVF9PTV9VUDoKKwljYXNlIFRSQVVfRlRfT01fRE9XTjoKKwljYXNlIFRSQVVfRlRfREFUQV9VUDoKKwljYXNlIFRSQVVfRlRfREFUQV9ET1dOOgorCWNhc2UgVFJBVV9GVF9EMTQ1X1NZTkM6CisJY2FzZSBUUkFVX0ZUX0VEQVRBOgorCQlMT0dQKERNVVgsIExPR0xfTk9USUNFLCAidW5pbXBsZW1lbnRlZCBUUkFVIEZyYW1lIFR5cGUgIgorCQkJIjB4JTAyeFxuIiwgY2JpdHM1KTsKKwkJcmV0dXJuIC0xOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERNVVgsIExPR0xfTk9USUNFLCAidW5rbm93biBUUkFVIEZyYW1lIFR5cGUgIgorCQkJIjB4JTAyeFxuIiwgY2JpdHM1KTsKKwkJcmV0dXJuIC0xOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkZWNvZGVkX3RyYXVfZnJhbWUgZnJfaWRsZV9mcmFtZSA9IHsKKwkuY19iaXRzID0geyAwLCAxLCAxLCAxLCAwIH0sCS8qIElETEUgRE9XTkxJTksgMy41LjUgKi8KKwkudF9iaXRzID0geyAxLCAxLCAxLCAxIH0sCit9Oworc3RhdGljIHVfaW50OF90IGVuY29kZWRfaWRsZV9mcmFtZVtUUkFVX0ZSQU1FX0JJVFNdOworc3RhdGljIGludCBkYml0c19pbml0dGVkOworCit1X2ludDhfdCAqdHJhdV9pZGxlX2ZyYW1lKHZvaWQpCit7CisJLyogb25seSBpbml0aWFsaXplIGR1cmluZyB0aGUgZmlyc3QgY2FsbCAqLworCWlmICghZGJpdHNfaW5pdHRlZCkgeworCQkvKiBzZXQgYWxsIEQtYml0cyB0byAxICovCisJCW1lbXNldCgmZnJfaWRsZV9mcmFtZS5kX2JpdHMsIDB4MDEsIDI2MCk7CisJCWVuY29kZV9mcihlbmNvZGVkX2lkbGVfZnJhbWUsICZmcl9pZGxlX2ZyYW1lKTsKKwl9CisJcmV0dXJuIGVuY29kZWRfaWRsZV9mcmFtZTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3RyYXVfbXV4LmMgYi9vcGVuYnNjL3NyYy90cmF1X211eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyZmE1YzAKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy90cmF1X211eC5jCkBAIC0wLDAgKzEsMzEzIEBACisvKiBTaW1wbGUgVFJBVSBmcmFtZSByZWZsZWN0b3IgdG8gcm91dGUgdm9pY2UgY2FsbHMgKi8KKworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3RyYXVfZnJhbWUuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3RyYXVfbXV4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zdWJjaGFuX2RlbXV4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9lMV9pbnB1dC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKwordV9pbnQ4X3QgZ3NtX2ZyX21hcFtdID0geworCTYsIDYsIDUsIDUsIDQsIDQsIDMsIDMsCisJNywgMiwgMiwgNiwgMywgMywgMywgMywKKwkzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAorCTMsIDcsIDIsIDIsIDYsIDMsIDMsIDMsCisJMywgMywgMywgMywgMywgMywgMywgMywKKwkzLCAzLCA3LCAyLCAyLCA2LCAzLCAzLAorCTMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCisJMywgMywgMywgNywgMiwgMiwgNiwgMywKKwkzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAorCTMsIDMsIDMsIDMKK307CisKK3N0cnVjdCBtYXBfZW50cnkgeworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IGdzbV9lMV9zdWJzbG90IHNyYywgZHN0OworfTsKKworc3RydWN0IHVwcXVldWVfZW50cnkgeworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQ7CisJc3RydWN0IGdzbV9lMV9zdWJzbG90IHNyYzsKKwl1X2ludDMyX3QgY2FsbHJlZjsKK307CisKK3N0YXRpYyBMTElTVF9IRUFEKHNzX21hcCk7CitzdGF0aWMgTExJU1RfSEVBRChzc191cHF1ZXVlKTsKKwordm9pZCAqdGFsbF9tYXBfY3R4LCAqdGFsbF91cHFfY3R4OworCisvKiBtYXAgb25lIHBhcnRpY3VsYXIgc3Vic2xvdCB0byBhbm90aGVyIHN1YnNsb3QgKi8KK2ludCB0cmF1X211eF9tYXAoY29uc3Qgc3RydWN0IGdzbV9lMV9zdWJzbG90ICpzcmMsCisJCSBjb25zdCBzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKmRzdCkKK3sKKwlzdHJ1Y3QgbWFwX2VudHJ5ICptZTsKKworCW1lID0gdGFsbG9jKHRhbGxfbWFwX2N0eCwgc3RydWN0IG1hcF9lbnRyeSk7CisJaWYgKCFtZSkgeworCQlMT0dQKERNSUIsIExPR0xfRkFUQUwsICJPdXQgb2YgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJREVCVUdQKERDQywgIlNldHRpbmcgdXAgVFJBVSBtdXggbWFwIGJldHdlZW4gKGUxPSV1LHRzPSV1LHNzPSV1KSAiCisJCSJhbmQgKGUxPSV1LHRzPSV1LHNzPSV1KVxuIiwKKwkJc3JjLT5lMV9uciwgc3JjLT5lMV90cywgc3JjLT5lMV90c19zcywKKwkJZHN0LT5lMV9uciwgZHN0LT5lMV90cywgZHN0LT5lMV90c19zcyk7CisKKwkvKiBtYWtlIHN1cmUgdG8gZ2V0IHJpZCBvZiBhbnkgc3RhbGUgb2xkIG1hcHBpbmdzICovCisJdHJhdV9tdXhfdW5tYXAoc3JjLCAwKTsKKwl0cmF1X211eF91bm1hcChkc3QsIDApOworCisJbWVtY3B5KCZtZS0+c3JjLCBzcmMsIHNpemVvZihtZS0+c3JjKSk7CisJbWVtY3B5KCZtZS0+ZHN0LCBkc3QsIHNpemVvZihtZS0+ZHN0KSk7CisJbGxpc3RfYWRkKCZtZS0+bGlzdCwgJnNzX21hcCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHRyYXVfbXV4X21hcF9sY2hhbihjb25zdCBzdHJ1Y3QgZ3NtX2xjaGFuICpzcmMsCQorCQkJY29uc3Qgc3RydWN0IGdzbV9sY2hhbiAqZHN0KQoreworCXN0cnVjdCBnc21fZTFfc3Vic2xvdCAqc3JjX3NzLCAqZHN0X3NzOworCisJc3JjX3NzID0gJnNyYy0+dHMtPmUxX2xpbms7CisJZHN0X3NzID0gJmRzdC0+dHMtPmUxX2xpbms7CisKKwlyZXR1cm4gdHJhdV9tdXhfbWFwKHNyY19zcywgZHN0X3NzKTsKK30KKworCisvKiB1bm1hcCBvbmUgcGFydGljdWxhciBzdWJzbG90IGZyb20gYW5vdGhlciBzdWJzbG90ICovCitpbnQgdHJhdV9tdXhfdW5tYXAoY29uc3Qgc3RydWN0IGdzbV9lMV9zdWJzbG90ICpzcywgdV9pbnQzMl90IGNhbGxyZWYpCit7CisJc3RydWN0IG1hcF9lbnRyeSAqbWUsICptZTI7CisJc3RydWN0IHVwcXVldWVfZW50cnkgKnVlLCAqdWUyOworCisJaWYgKHNzKQorCQlsbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1lLCBtZTIsICZzc19tYXAsIGxpc3QpIHsKKwkJCWlmICghbWVtY21wKCZtZS0+c3JjLCBzcywgc2l6ZW9mKCpzcykpIHx8CisJCQkgICAgIW1lbWNtcCgmbWUtPmRzdCwgc3MsIHNpemVvZigqc3MpKSkgeworCQkJCWxsaXN0X2RlbCgmbWUtPmxpc3QpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJbGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh1ZSwgdWUyLCAmc3NfdXBxdWV1ZSwgbGlzdCkgeworCQlpZiAodWUtPmNhbGxyZWYgPT0gY2FsbHJlZikgeworCQkJbGxpc3RfZGVsKCZ1ZS0+bGlzdCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoc3MgJiYgIW1lbWNtcCgmdWUtPnNyYywgc3MsIHNpemVvZigqc3MpKSkgeworCQkJbGxpc3RfZGVsKCZ1ZS0+bGlzdCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gLUVOT0VOVDsKK30KKworLyogbG9vay11cCBhbiBlbnR5IGluIHRoZSBUUkFVIG11eCBtYXAgKi8KK3N0YXRpYyBzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKgorbG9va3VwX3RyYXVfbXV4X21hcChjb25zdCBzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKnNyYykKK3sKKwlzdHJ1Y3QgbWFwX2VudHJ5ICptZTsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KG1lLCAmc3NfbWFwLCBsaXN0KSB7CisJCWlmICghbWVtY21wKCZtZS0+c3JjLCBzcmMsIHNpemVvZigqc3JjKSkpCisJCQlyZXR1cm4gJm1lLT5kc3Q7CisJCWlmICghbWVtY21wKCZtZS0+ZHN0LCBzcmMsIHNpemVvZigqc3JjKSkpCisJCQlyZXR1cm4gJm1lLT5zcmM7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKiBsb29rLXVwIGFuIGVudHkgaW4gdGhlIFRSQVUgdXBxdWV1ZSAqLworc3RydWN0IHVwcXVldWVfZW50cnkgKgorbG9va3VwX3RyYXVfdXBxdWV1ZShjb25zdCBzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKnNyYykKK3sKKwlzdHJ1Y3QgdXBxdWV1ZV9lbnRyeSAqdWU7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeSh1ZSwgJnNzX3VwcXVldWUsIGxpc3QpIHsKKwkJaWYgKCFtZW1jbXAoJnVlLT5zcmMsIHNyYywgc2l6ZW9mKCpzcmMpKSkKKwkJCXJldHVybiB1ZTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCB1X2ludDhfdCBjX2JpdHNfY2hlY2tbXSA9IHsgMCwgMCwgMCwgMSwgMCB9OworCisvKiB3ZSBnZXQgY2FsbGVkIGJ5IHN1YmNoYW5fZGVtdXggKi8KK2ludCB0cmF1X211eF9pbnB1dChzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKnNyY19lMV9zcywKKwkJICAgY29uc3QgdV9pbnQ4X3QgKnRyYXVfYml0cywgaW50IG51bV9iaXRzKQoreworCXN0cnVjdCBkZWNvZGVkX3RyYXVfZnJhbWUgdGY7CisJdV9pbnQ4X3QgdHJhdV9iaXRzX291dFtUUkFVX0ZSQU1FX0JJVFNdOworCXN0cnVjdCBnc21fZTFfc3Vic2xvdCAqZHN0X2UxX3NzID0gbG9va3VwX3RyYXVfbXV4X21hcChzcmNfZTFfc3MpOworCXN0cnVjdCBzdWJjaF9tdXggKm14OworCXN0cnVjdCB1cHF1ZXVlX2VudHJ5ICp1ZTsKKwlpbnQgcmM7CisKKwkvKiBkZWNvZGUgVFJBVSwgY2hhbmdlIGl0IHRvIGRvd25saW5rLCByZS1lbmNvZGUgKi8KKwlyYyA9IGRlY29kZV90cmF1X2ZyYW1lKCZ0ZiwgdHJhdV9iaXRzKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWlmICghZHN0X2UxX3NzKSB7CisJCXN0cnVjdCBtc2diICptc2c7CisJCXN0cnVjdCBnc21fZGF0YV9mcmFtZSAqZnJhbWU7CisJCXVuc2lnbmVkIGNoYXIgKmRhdGE7CisJCWludCBpLCBqLCBrLCBsLCBvOworCQkvKiBmcmFtZSBzaGFsbCBiZSBzZW50IHRvIHVwcXVldWUgKi8KKwkJaWYgKCEodWUgPSBsb29rdXBfdHJhdV91cHF1ZXVlKHNyY19lMV9zcykpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICghdWUtPmNhbGxyZWYpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKG1lbWNtcCh0Zi5jX2JpdHMsIGNfYml0c19jaGVjaywgc2l6ZW9mKGNfYml0c19jaGVjaykpKQorCQkJREVCVUdQQyhETVVYLCAiaWxsZWdhbCB0cmF1IChDMS1DNSkgJXNcbiIsCisJCQkJaGV4ZHVtcCh0Zi5jX2JpdHMsIHNpemVvZihjX2JpdHNfY2hlY2spKSk7CisJCW1zZyA9IG1zZ2JfYWxsb2Moc2l6ZW9mKHN0cnVjdCBnc21fZGF0YV9mcmFtZSkgKyAzMywKKwkJCQkgIkdTTS1EQVRBIik7CisJCWlmICghbXNnKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJZnJhbWUgPSAoc3RydWN0IGdzbV9kYXRhX2ZyYW1lICopbXNnLT5kYXRhOworCQltZW1zZXQoZnJhbWUsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX2RhdGFfZnJhbWUpKTsKKwkJZGF0YSA9IGZyYW1lLT5kYXRhOworCQlkYXRhWzBdID0gMHhkIDw8IDQ7CisJCS8qIHJlYXNzZW1ibGUgZC1iaXRzICovCisJCWkgPSAwOyAvKiBjb3VudHMgYml0cyAqLworCQlqID0gNDsgLyogY291bnRzIG91dHB1dCBiaXRzICovCisJCWsgPSBnc21fZnJfbWFwWzBdLTE7IC8qIGN1cnJlbnQgbnVtYmVyIGJpdCBpbiBlbGVtZW50ICovCisJCWwgPSAwOyAvKiBjb3VudHMgZWxlbWVudCBiaXRzICovCisJCW8gPSAwOyAvKiBvZmZzZXQgaW5wdXQgYml0cyAqLworCQl3aGlsZSAoaSA8IDI2MCkgeworCQkJZGF0YVtqLzhdIHw9ICh0Zi5kX2JpdHNbaytvXSA8PCAoNy0oaiU4KSkpOworCQkJaWYgKC0tayA8IDApIHsKKwkJCQlvICs9IGdzbV9mcl9tYXBbbF07CisJCQkJayA9IGdzbV9mcl9tYXBbKytsXS0xOworCQkJfQorCQkJaSsrOworCQkJaisrOworCQl9CisJCWZyYW1lLT5tc2dfdHlwZSA9IEdTTV9UQ0hGX0ZSQU1FOworCQlmcmFtZS0+Y2FsbHJlZiA9IHVlLT5jYWxscmVmOworCQltc2diX2VucXVldWUoJnVlLT5uZXQtPnVwcXVldWUsIG1zZyk7CisKKwkJcmV0dXJuIDA7CisJfQorCisJbXggPSBlMWlucF9nZXRfbXV4KGRzdF9lMV9zcy0+ZTFfbnIsIGRzdF9lMV9zcy0+ZTFfdHMpOworCWlmICghbXgpCisJCXJldHVybiAtRUlOVkFMOworCisJdHJhdV9mcmFtZV91cDJkb3duKCZ0Zik7CisJZW5jb2RlX3RyYXVfZnJhbWUodHJhdV9iaXRzX291dCwgJnRmKTsKKworCS8qIGFuZCBzZW5kIGl0IHRvIHRoZSBtdXhlciAqLworCXJldHVybiBzdWJjaGFuX211eF9lbnF1ZXVlKG14LCBkc3RfZTFfc3MtPmUxX3RzX3NzLCB0cmF1X2JpdHNfb3V0LAorCQkJCSAgIFRSQVVfRlJBTUVfQklUUyk7Cit9CisKKy8qIGFkZCByZWNlaXZlciBpbnN0YW5jZSBmb3IgbGNoYW4gYW5kIGNhbGxyZWYgKi8KK2ludCB0cmF1X3JlY3ZfbGNoYW4oc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50MzJfdCBjYWxscmVmKQoreworCXN0cnVjdCBnc21fZTFfc3Vic2xvdCAqc3JjX3NzOworCXN0cnVjdCB1cHF1ZXVlX2VudHJ5ICp1ZTsKKworCXVlID0gdGFsbG9jKHRhbGxfdXBxX2N0eCwgc3RydWN0IHVwcXVldWVfZW50cnkpOworCWlmICghdWUpCisJCXJldHVybiAtRU5PTUVNOworCisJc3JjX3NzID0gJmxjaGFuLT50cy0+ZTFfbGluazsKKworCURFQlVHUChEQ0MsICJTZXR0aW5nIHVwIFRSQVUgcmVjZWl2ZXIgKGUxPSV1LHRzPSV1LHNzPSV1KSAiCisJCSJhbmQgKGNhbGxyZWYgMHgleClcbiIsCisJCXNyY19zcy0+ZTFfbnIsIHNyY19zcy0+ZTFfdHMsIHNyY19zcy0+ZTFfdHNfc3MsCisJCWNhbGxyZWYpOworCisJLyogbWFrZSBzdXJlIHRvIGdldCByaWQgb2YgYW55IHN0YWxlIG9sZCBtYXBwaW5ncyAqLworCXRyYXVfbXV4X3VubWFwKHNyY19zcywgY2FsbHJlZik7CisKKwltZW1jcHkoJnVlLT5zcmMsIHNyY19zcywgc2l6ZW9mKHVlLT5zcmMpKTsKKwl1ZS0+bmV0ID0gbGNoYW4tPnRzLT50cngtPmJ0cy0+bmV0d29yazsKKwl1ZS0+Y2FsbHJlZiA9IGNhbGxyZWY7CisJbGxpc3RfYWRkKCZ1ZS0+bGlzdCwgJnNzX3VwcXVldWUpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCB0cmF1X3NlbmRfZnJhbWUoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHN0cnVjdCBnc21fZGF0YV9mcmFtZSAqZnJhbWUpCit7CisJdV9pbnQ4X3QgdHJhdV9iaXRzX291dFtUUkFVX0ZSQU1FX0JJVFNdOworCXN0cnVjdCBnc21fZTFfc3Vic2xvdCAqZHN0X2UxX3NzID0gJmxjaGFuLT50cy0+ZTFfbGluazsKKwlzdHJ1Y3Qgc3ViY2hfbXV4ICpteDsKKwlpbnQgaSwgaiwgaywgbCwgbzsKKwl1bnNpZ25lZCBjaGFyICpkYXRhID0gZnJhbWUtPmRhdGE7CisJc3RydWN0IGRlY29kZWRfdHJhdV9mcmFtZSB0ZjsKKworCW14ID0gZTFpbnBfZ2V0X211eChkc3RfZTFfc3MtPmUxX25yLCBkc3RfZTFfc3MtPmUxX3RzKTsKKwlpZiAoIW14KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoZnJhbWUtPm1zZ190eXBlKSB7CisJY2FzZSBHU01fVENIRl9GUkFNRToKKwkJLyogc2V0IGMtYml0cyBhbmQgdC1iaXRzICovCisJCXRmLmNfYml0c1swXSA9IDE7CisJCXRmLmNfYml0c1sxXSA9IDE7CisJCXRmLmNfYml0c1syXSA9IDE7CisJCXRmLmNfYml0c1szXSA9IDA7CisJCXRmLmNfYml0c1s0XSA9IDA7CisJCW1lbXNldCgmdGYuY19iaXRzWzVdLCAwLCA2KTsKKwkJbWVtc2V0KCZ0Zi5jX2JpdHNbMTFdLCAxLCAxMCk7CisJCW1lbXNldCgmdGYudF9iaXRzWzBdLCAxLCA0KTsKKwkJLyogcmVhc3NlbWJsZSBkLWJpdHMgKi8KKwkJaSA9IDA7IC8qIGNvdW50cyBiaXRzICovCisJCWogPSA0OyAvKiBjb3VudHMgaW5wdXQgYml0cyAqLworCQlrID0gZ3NtX2ZyX21hcFswXS0xOyAvKiBjdXJyZW50IG51bWJlciBiaXQgaW4gZWxlbWVudCAqLworCQlsID0gMDsgLyogY291bnRzIGVsZW1lbnQgYml0cyAqLworCQlvID0gMDsgLyogb2Zmc2V0IG91dHB1dCBiaXRzICovCisJCXdoaWxlIChpIDwgMjYwKSB7CisJCQl0Zi5kX2JpdHNbaytvXSA9IChkYXRhW2ovOF0gPj4gKDctKGolOCkpKSAmIDE7CisJCQlpZiAoLS1rIDwgMCkgeworCQkJCW8gKz0gZ3NtX2ZyX21hcFtsXTsKKwkJCQlrID0gZ3NtX2ZyX21hcFsrK2xdLTE7CisJCQl9CisJCQlpKys7CisJCQlqKys7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJREVCVUdQQyhETVVYLCAidW5zdXBwb3J0ZWQgbWVzc2FnZSB0eXBlICVkXG4iLAorCQkJZnJhbWUtPm1zZ190eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZW5jb2RlX3RyYXVfZnJhbWUodHJhdV9iaXRzX291dCwgJnRmKTsKKworCS8qIGFuZCBzZW5kIGl0IHRvIHRoZSBtdXhlciAqLworCXJldHVybiBzdWJjaGFuX211eF9lbnF1ZXVlKG14LCBkc3RfZTFfc3MtPmUxX3RzX3NzLCB0cmF1X2JpdHNfb3V0LAorCQkJCSAgIFRSQVVfRlJBTUVfQklUUyk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy91c3NkLmMgYi9vcGVuYnNjL3NyYy91c3NkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNkMTFmMAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3Vzc2QuYwpAQCAtMCwwICsxLDcxIEBACisvKiBOZXR3b3JrLXNwZWNpZmljIGhhbmRsaW5nIG9mIG1vYmlsZS1vcmlnaW5hdGVkIFVTU0RzLiAqLworCisvKiAoQykgMjAwOC0yMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOCwgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiAoQykgMjAwOSBieSBNaWtlIEhhYmVuIDxtaWNoYWVsLmhhYmVuQGJ0aW50ZXJuZXQuY29tPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisvKiBUaGlzIG1vZHVsZSBkZWZpbmVzIHRoZSBuZXR3b3JrLXNwZWNpZmljIGhhbmRsaW5nIG9mIG1vYmlsZS1vcmlnaW5hdGVkCisgICBVU1NEIG1lc3NhZ2VzLiAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfODAuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9zdWJzY3JpYmVyLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorCisvKiBEZWNsYXJhdGlvbnMgb2YgVVNTRCBzdHJpbmdzIHRvIGJlIHJlY29nbmlzZWQgKi8KK2NvbnN0IGNoYXIgVVNTRF9URVhUX09XTl9OVU1CRVJbXSA9ICIqIzEwMCMiOworCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyBvZiBuZXR3b3JrLXNwZWNpZmljIGhhbmRsZXIgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IHNlbmRfb3duX251bWJlcihjb25zdCBzdHJ1Y3QgbXNnYiAqbXNnLCBjb25zdCBzdHJ1Y3QgdXNzZF9yZXF1ZXN0ICpyZXEpOworCisKKy8qIEVudHJ5cG9pbnQgLSBoYW5kbGVyIGZ1bmN0aW9uIGNvbW1vbiB0byBhbGwgbW9iaWxlLW9yaWdpbmF0ZWQgVVNTRHMgKi8KK2ludCBoYW5kbGVfcmN2X3Vzc2Qoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgdXNzZF9yZXF1ZXN0IHJlcTsKKworCWdzbTA0ODBfZGVjb2RlX3Vzc2RfcmVxdWVzdChtc2csICZyZXEpOworCWlmIChyZXEudGV4dFswXSA9PSAweEZGKSAgLyogUmVsZWFzZS1Db21wbGV0ZSAqLworCQlyZXR1cm4gMDsKKworCWlmIChzdHJzdHIoVVNTRF9URVhUX09XTl9OVU1CRVIsIHJlcS50ZXh0KSAhPSBOVUxMKSB7CisJCURFQlVHUChETU0sICJVU1NEOiBPd24gbnVtYmVyIHJlcXVlc3RlZFxuIik7CisJCXJldHVybiBzZW5kX293bl9udW1iZXIobXNnLCAmcmVxKTsKKwl9IGVsc2UgeworCQlERUJVR1AoRE1NLCAiVW5oYW5kbGVkIFVTU0QgJXNcbiIsIHJlcS50ZXh0KTsKKwkJcmV0dXJuIGdzbTA0ODBfc2VuZF91c3NkX3JlamVjdChtc2csICZyZXEpOworCX0KK30KKworLyogQSBuZXR3b3JrLXNwZWNpZmljIGhhbmRsZXIgZnVuY3Rpb24gKi8KK3N0YXRpYyBpbnQgc2VuZF9vd25fbnVtYmVyKGNvbnN0IHN0cnVjdCBtc2diICptc2csIGNvbnN0IHN0cnVjdCB1c3NkX3JlcXVlc3QgKnJlcSkKK3sKKwljaGFyICpvd25fbnVtYmVyID0gbXNnLT5sY2hhbi0+c3Vic2NyLT5leHRlbnNpb247CisJY2hhciByZXNwb25zZV9zdHJpbmdbR1NNX0VYVEVOU0lPTl9MRU5HVEggKyAyMF07CisKKwkvKiBOZWVkIHRyYWlsaW5nIENSIGFzIEVPVCBjaGFyYWN0ZXIgKi8KKwlzbnByaW50ZihyZXNwb25zZV9zdHJpbmcsIHNpemVvZihyZXNwb25zZV9zdHJpbmcpLCAiWW91ciBleHRlbnNpb24gaXMgJXNcciIsIG93bl9udW1iZXIpOworCXJldHVybiBnc20wNDgwX3NlbmRfdXNzZF9yZXNwb25zZShtc2csIHJlc3BvbnNlX3N0cmluZywgcmVxKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3Z0eS9idWZmZXIuYyBiL29wZW5ic2Mvc3JjL3Z0eS9idWZmZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTVkMDYyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvdnR5L2J1ZmZlci5jCkBAIC0wLDAgKzEsNDYzIEBACisvKgorICogQnVmZmVyaW5nIG9mIG91dHB1dCBhbmQgaW5wdXQuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggS3VuaWhpcm8gSXNoaWd1cm8KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgWmVicmEuCisgKgorICogR05VIFplYnJhIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBHTlUgWmVicmEgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEdOVSBaZWJyYTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN5cy91aW8uaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPHZ0eS9idWZmZXIuaD4KKyNpbmNsdWRlIDx2dHkvdnR5Lmg+CisKKy8qIEJ1ZmZlciBtYXN0ZXIuICovCitzdHJ1Y3QgYnVmZmVyIHsKKwkvKiBEYXRhIGxpc3QuICovCisJc3RydWN0IGJ1ZmZlcl9kYXRhICpoZWFkOworCXN0cnVjdCBidWZmZXJfZGF0YSAqdGFpbDsKKworCS8qIFNpemUgb2YgZWFjaCBidWZmZXJfZGF0YSBjaHVuay4gKi8KKwlzaXplX3Qgc2l6ZTsKK307CisKKy8qIERhdGEgY29udGFpbmVyLiAqLworc3RydWN0IGJ1ZmZlcl9kYXRhIHsKKwlzdHJ1Y3QgYnVmZmVyX2RhdGEgKm5leHQ7CisKKwkvKiBMb2NhdGlvbiB0byBhZGQgbmV3IGRhdGEuICovCisJc2l6ZV90IGNwOworCisJLyogUG9pbnRlciB0byBkYXRhIG5vdCB5ZXQgZmx1c2hlZC4gKi8KKwlzaXplX3Qgc3A7CisKKwkvKiBBY3R1YWwgZGF0YSBzdHJlYW0gKHZhcmlhYmxlIGxlbmd0aCkuICovCisJdW5zaWduZWQgY2hhciBkYXRhWzBdOwkvKiByZWFsIGRpbWVuc2lvbiBpcyBidWZmZXItPnNpemUgKi8KK307CisKKy8qIEl0IHNob3VsZCBhbHdheXMgYmUgdHJ1ZSB0aGF0OiAwIDw9IHNwIDw9IGNwIDw9IHNpemUgKi8KKworLyogRGVmYXVsdCBidWZmZXIgc2l6ZSAodXNlZCBpZiBub25lIHNwZWNpZmllZCkuICBJdCBpcyByb3VuZGVkIHVwIHRvIHRoZQorICAgbmV4dCBwYWdlIGJvdW5kZXJ5LiAqLworI2RlZmluZSBCVUZGRVJfU0laRV9ERUZBVUxUCQk0MDk2CisKKyNkZWZpbmUgQlVGRkVSX0RBVEFfRlJFRShEKSB0YWxsb2NfZnJlZSgoRCkpCisKKy8qIE1ha2UgbmV3IGJ1ZmZlci4gKi8KK3N0cnVjdCBidWZmZXIgKmJ1ZmZlcl9uZXcoc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGJ1ZmZlciAqYjsKKworCWIgPSB0YWxsb2NfemVybyh0YWxsX3Z0eV9jdHgsIHN0cnVjdCBidWZmZXIpOworCisJaWYgKHNpemUpCisJCWItPnNpemUgPSBzaXplOworCWVsc2UgeworCQlzdGF0aWMgc2l6ZV90IGRlZmF1bHRfc2l6ZTsKKwkJaWYgKCFkZWZhdWx0X3NpemUpIHsKKwkJCWxvbmcgcGdzeiA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTsKKwkJCWRlZmF1bHRfc2l6ZSA9CisJCQkgICAgKCgoKEJVRkZFUl9TSVpFX0RFRkFVTFQgLSAxKSAvIHBnc3opICsgMSkgKiBwZ3N6KTsKKwkJfQorCQliLT5zaXplID0gZGVmYXVsdF9zaXplOworCX0KKworCXJldHVybiBiOworfQorCisvKiBGcmVlIGJ1ZmZlci4gKi8KK3ZvaWQgYnVmZmVyX2ZyZWUoc3RydWN0IGJ1ZmZlciAqYikKK3sKKwlidWZmZXJfcmVzZXQoYik7CisJdGFsbG9jX2ZyZWUoYik7Cit9CisKKy8qIE1ha2Ugc3RyaW5nIGNsb25lLiAqLworY2hhciAqYnVmZmVyX2dldHN0cihzdHJ1Y3QgYnVmZmVyICpiKQoreworCXNpemVfdCB0b3RsZW4gPSAwOworCXN0cnVjdCBidWZmZXJfZGF0YSAqZGF0YTsKKwljaGFyICpzOworCWNoYXIgKnA7CisKKwlmb3IgKGRhdGEgPSBiLT5oZWFkOyBkYXRhOyBkYXRhID0gZGF0YS0+bmV4dCkKKwkJdG90bGVuICs9IGRhdGEtPmNwIC0gZGF0YS0+c3A7CisJaWYgKCEocyA9IF90YWxsb2NfemVybyh0YWxsX3Z0eV9jdHgsICh0b3RsZW4gKyAxKSwgImJ1ZmZlcl9nZXRzdHIiKSkpCisJCXJldHVybiBOVUxMOworCXAgPSBzOworCWZvciAoZGF0YSA9IGItPmhlYWQ7IGRhdGE7IGRhdGEgPSBkYXRhLT5uZXh0KSB7CisJCW1lbWNweShwLCBkYXRhLT5kYXRhICsgZGF0YS0+c3AsIGRhdGEtPmNwIC0gZGF0YS0+c3ApOworCQlwICs9IGRhdGEtPmNwIC0gZGF0YS0+c3A7CisJfQorCSpwID0gJ1wwJzsKKwlyZXR1cm4gczsKK30KKworLyogUmV0dXJuIDEgaWYgYnVmZmVyIGlzIGVtcHR5LiAqLworaW50IGJ1ZmZlcl9lbXB0eShzdHJ1Y3QgYnVmZmVyICpiKQoreworCXJldHVybiAoYi0+aGVhZCA9PSBOVUxMKTsKK30KKworLyogQ2xlYXIgYW5kIGZyZWUgYWxsIGFsbG9jYXRlZCBkYXRhLiAqLwordm9pZCBidWZmZXJfcmVzZXQoc3RydWN0IGJ1ZmZlciAqYikKK3sKKwlzdHJ1Y3QgYnVmZmVyX2RhdGEgKmRhdGE7CisJc3RydWN0IGJ1ZmZlcl9kYXRhICpuZXh0OworCisJZm9yIChkYXRhID0gYi0+aGVhZDsgZGF0YTsgZGF0YSA9IG5leHQpIHsKKwkJbmV4dCA9IGRhdGEtPm5leHQ7CisJCUJVRkZFUl9EQVRBX0ZSRUUoZGF0YSk7CisJfQorCWItPmhlYWQgPSBiLT50YWlsID0gTlVMTDsKK30KKworLyogQWRkIGJ1ZmZlcl9kYXRhIHRvIHRoZSBlbmQgb2YgYnVmZmVyLiAqLworc3RhdGljIHN0cnVjdCBidWZmZXJfZGF0YSAqYnVmZmVyX2FkZChzdHJ1Y3QgYnVmZmVyICpiKQoreworCXN0cnVjdCBidWZmZXJfZGF0YSAqZDsKKworCWQgPSBfdGFsbG9jX3plcm8odGFsbF92dHlfY3R4LAorCQkJIG9mZnNldG9mKHN0cnVjdCBidWZmZXJfZGF0YSwgZGF0YVtiLT5zaXplXSksCisJCQkgImJ1ZmZlcl9hZGQiKTsKKwlpZiAoIWQpCisJCXJldHVybiBOVUxMOworCWQtPmNwID0gZC0+c3AgPSAwOworCWQtPm5leHQgPSBOVUxMOworCisJaWYgKGItPnRhaWwpCisJCWItPnRhaWwtPm5leHQgPSBkOworCWVsc2UKKwkJYi0+aGVhZCA9IGQ7CisJYi0+dGFpbCA9IGQ7CisKKwlyZXR1cm4gZDsKK30KKworLyogV3JpdGUgZGF0YSB0byBidWZmZXIuICovCit2b2lkIGJ1ZmZlcl9wdXQoc3RydWN0IGJ1ZmZlciAqYiwgY29uc3Qgdm9pZCAqcCwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGJ1ZmZlcl9kYXRhICpkYXRhID0gYi0+dGFpbDsKKwljb25zdCBjaGFyICpwdHIgPSBwOworCisJLyogV2UgdXNlIGV2ZW4gbGFzdCBvbmUgYnl0ZSBvZiBkYXRhIGJ1ZmZlci4gKi8KKwl3aGlsZSAoc2l6ZSkgeworCQlzaXplX3QgY2h1bms7CisKKwkJLyogSWYgdGhlcmUgaXMgbm8gZGF0YSBidWZmZXIgYWRkIGl0LiAqLworCQlpZiAoZGF0YSA9PSBOVUxMIHx8IGRhdGEtPmNwID09IGItPnNpemUpCisJCQlkYXRhID0gYnVmZmVyX2FkZChiKTsKKworCQljaHVuayA9CisJCSAgICAoKHNpemUgPD0KKwkJICAgICAgKGItPnNpemUgLSBkYXRhLT5jcCkpID8gc2l6ZSA6IChiLT5zaXplIC0gZGF0YS0+Y3ApKTsKKwkJbWVtY3B5KChkYXRhLT5kYXRhICsgZGF0YS0+Y3ApLCBwdHIsIGNodW5rKTsKKwkJc2l6ZSAtPSBjaHVuazsKKwkJcHRyICs9IGNodW5rOworCQlkYXRhLT5jcCArPSBjaHVuazsKKwl9Cit9CisKKy8qIEluc2VydCBjaGFyYWN0ZXIgaW50byB0aGUgYnVmZmVyLiAqLwordm9pZCBidWZmZXJfcHV0YyhzdHJ1Y3QgYnVmZmVyICpiLCB1X2NoYXIgYykKK3sKKwlidWZmZXJfcHV0KGIsICZjLCAxKTsKK30KKworLyogUHV0IHN0cmluZyB0byB0aGUgYnVmZmVyLiAqLwordm9pZCBidWZmZXJfcHV0c3RyKHN0cnVjdCBidWZmZXIgKmIsIGNvbnN0IGNoYXIgKmMpCit7CisJYnVmZmVyX3B1dChiLCBjLCBzdHJsZW4oYykpOworfQorCisvKiBLZWVwIGZsdXNoaW5nIGRhdGEgdG8gdGhlIGZkIHVudGlsIHRoZSBidWZmZXIgaXMgZW1wdHkgb3IgYW4gZXJyb3IgaXMKKyAgIGVuY291bnRlcmVkIG9yIHRoZSBvcGVyYXRpb24gd291bGQgYmxvY2suICovCitidWZmZXJfc3RhdHVzX3QgYnVmZmVyX2ZsdXNoX2FsbChzdHJ1Y3QgYnVmZmVyICpiLCBpbnQgZmQpCit7CisJYnVmZmVyX3N0YXR1c190IHJldDsKKwlzdHJ1Y3QgYnVmZmVyX2RhdGEgKmhlYWQ7CisJc2l6ZV90IGhlYWRfc3A7CisKKwlpZiAoIWItPmhlYWQpCisJCXJldHVybiBCVUZGRVJfRU1QVFk7CisJaGVhZF9zcCA9IChoZWFkID0gYi0+aGVhZCktPnNwOworCS8qIEZsdXNoIGFsbCBkYXRhLiAqLworCXdoaWxlICgocmV0ID0gYnVmZmVyX2ZsdXNoX2F2YWlsYWJsZShiLCBmZCkpID09IEJVRkZFUl9QRU5ESU5HKSB7CisJCWlmICgoYi0+aGVhZCA9PSBoZWFkKSAmJiAoaGVhZF9zcCA9PSBoZWFkLT5zcCkKKwkJICAgICYmIChlcnJubyAhPSBFSU5UUikpCisJCQkvKiBObyBkYXRhIHdhcyBmbHVzaGVkLCBzbyBrZXJuZWwgYnVmZmVyIG11c3QgYmUgZnVsbC4gKi8KKwkJCXJldHVybiByZXQ7CisJCWhlYWRfc3AgPSAoaGVhZCA9IGItPmhlYWQpLT5zcDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisjaWYgMAorLyogRmx1c2ggZW5vdWdoIGRhdGEgdG8gZmlsbCBhIHRlcm1pbmFsIHdpbmRvdyBvZiB0aGUgZ2l2ZW4gc2NlbmUgKHVzZWQgb25seQorICAgYnkgdnR5IHRlbG5ldCBpbnRlcmZhY2UpLiAqLworYnVmZmVyX3N0YXR1c190CitidWZmZXJfZmx1c2hfd2luZG93KHN0cnVjdCBidWZmZXIgKiBiLCBpbnQgZmQsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKwkJICAgIGludCBlcmFzZV9mbGFnLCBpbnQgbm9fbW9yZV9mbGFnKQoreworCWludCBuYnl0ZXM7CisJaW50IGlvdl9hbGxvYzsKKwlpbnQgaW92X2luZGV4OworCXN0cnVjdCBpb3ZlYyAqaW92OworCXN0cnVjdCBpb3ZlYyBzbWFsbF9pb3ZbM107CisJY2hhciBtb3JlW10gPSAiIC0tTW9yZS0tICI7CisJY2hhciBlcmFzZVtdID0KKwkgICAgeyAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LAorCQknICcsICcgJywgJyAnLCAnICcsICcgJywgJyAnLCAnICcsICcgJywgJyAnLCAnICcsCisJCTB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgKKwl9OworCXN0cnVjdCBidWZmZXJfZGF0YSAqZGF0YTsKKwlpbnQgY29sdW1uOworCisJaWYgKCFiLT5oZWFkKQorCQlyZXR1cm4gQlVGRkVSX0VNUFRZOworCisJaWYgKGhlaWdodCA8IDEpIHsKKwkJemxvZ193YXJuCisJCSAgICAoIiVzIGNhbGxlZCB3aXRoIG5vbi1wb3NpdGl2ZSB3aW5kb3cgaGVpZ2h0ICVkLCBmb3JjaW5nIHRvIDEiLAorCQkgICAgIF9fZnVuY19fLCBoZWlnaHQpOworCQloZWlnaHQgPSAxOworCX0gZWxzZSBpZiAoaGVpZ2h0ID49IDIpCisJCWhlaWdodC0tOworCWlmICh3aWR0aCA8IDEpIHsKKwkJemxvZ193YXJuCisJCSAgICAoIiVzIGNhbGxlZCB3aXRoIG5vbi1wb3NpdGl2ZSB3aW5kb3cgd2lkdGggJWQsIGZvcmNpbmcgdG8gMSIsCisJCSAgICAgX19mdW5jX18sIHdpZHRoKTsKKwkJd2lkdGggPSAxOworCX0KKworCS8qIEZvciBlcmFzZSBhbmQgbW9yZSBkYXRhIGFkZCB0d28gdG8gYidzIGJ1ZmZlcl9kYXRhIGNvdW50LiAqLworCWlmIChiLT5oZWFkLT5uZXh0ID09IE5VTEwpIHsKKwkJaW92X2FsbG9jID0gc2l6ZW9mKHNtYWxsX2lvdikgLyBzaXplb2Yoc21hbGxfaW92WzBdKTsKKwkJaW92ID0gc21hbGxfaW92OworCX0gZWxzZSB7CisJCWlvdl9hbGxvYyA9ICgoaGVpZ2h0ICogKHdpZHRoICsgMikpIC8gYi0+c2l6ZSkgKyAxMDsKKwkJaW92ID0gWE1BTExPQyhNVFlQRV9UTVAsIGlvdl9hbGxvYyAqIHNpemVvZigqaW92KSk7CisJfQorCWlvdl9pbmRleCA9IDA7CisKKwkvKiBQcmV2aW91c2x5IHByaW50IG91dCBpcyBwZXJmb3JtZWQuICovCisJaWYgKGVyYXNlX2ZsYWcpIHsKKwkJaW92W2lvdl9pbmRleF0uaW92X2Jhc2UgPSBlcmFzZTsKKwkJaW92W2lvdl9pbmRleF0uaW92X2xlbiA9IHNpemVvZiBlcmFzZTsKKwkJaW92X2luZGV4Kys7CisJfQorCisJLyogT3V0cHV0IGRhdGEuICovCisJY29sdW1uID0gMTsJCS8qIENvbHVtbiBwb3NpdGlvbiBvZiBuZXh0IGNoYXJhY3RlciBkaXNwbGF5ZWQuICovCisJZm9yIChkYXRhID0gYi0+aGVhZDsgZGF0YSAmJiAoaGVpZ2h0ID4gMCk7IGRhdGEgPSBkYXRhLT5uZXh0KSB7CisJCXNpemVfdCBjcDsKKworCQljcCA9IGRhdGEtPnNwOworCQl3aGlsZSAoKGNwIDwgZGF0YS0+Y3ApICYmIChoZWlnaHQgPiAwKSkgeworCQkJLyogQ2FsY3VsYXRlIGxpbmVzIHJlbWFpbmluZyBhbmQgY29sdW1uIHBvc2l0aW9uIGFmdGVyIGRpc3BsYXlpbmcKKwkJCSAgIHRoaXMgY2hhcmFjdGVyLiAqLworCQkJaWYgKGRhdGEtPmRhdGFbY3BdID09ICdccicpCisJCQkJY29sdW1uID0gMTsKKwkJCWVsc2UgaWYgKChkYXRhLT5kYXRhW2NwXSA9PSAnXG4nKSB8fCAoY29sdW1uID09IHdpZHRoKSkgeworCQkJCWNvbHVtbiA9IDE7CisJCQkJaGVpZ2h0LS07CisJCQl9IGVsc2UKKwkJCQljb2x1bW4rKzsKKwkJCWNwKys7CisJCX0KKwkJaW92W2lvdl9pbmRleF0uaW92X2Jhc2UgPSAoY2hhciAqKShkYXRhLT5kYXRhICsgZGF0YS0+c3ApOworCQlpb3ZbaW92X2luZGV4KytdLmlvdl9sZW4gPSBjcCAtIGRhdGEtPnNwOworCQlkYXRhLT5zcCA9IGNwOworCisJCWlmIChpb3ZfaW5kZXggPT0gaW92X2FsbG9jKQorCQkJLyogVGhpcyBzaG91bGQgbm90IG9yZGluYXJpbHkgaGFwcGVuLiAqLworCQl7CisJCQlpb3ZfYWxsb2MgKj0gMjsKKwkJCWlmIChpb3YgIT0gc21hbGxfaW92KSB7CisJCQkJemxvZ193YXJuKCIlczogZ3Jvd2luZyBpb3YgYXJyYXkgdG8gJWQ7ICIKKwkJCQkJICAid2lkdGggJWQsIGhlaWdodCAlZCwgc2l6ZSAlbHUiLAorCQkJCQkgIF9fZnVuY19fLCBpb3ZfYWxsb2MsIHdpZHRoLCBoZWlnaHQsCisJCQkJCSAgKHVfbG9uZykgYi0+c2l6ZSk7CisJCQkJaW92ID0KKwkJCQkgICAgWFJFQUxMT0MoTVRZUEVfVE1QLCBpb3YsCisJCQkJCSAgICAgaW92X2FsbG9jICogc2l6ZW9mKCppb3YpKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogVGhpcyBzaG91bGQgYWJzb2x1dGVseSBuZXZlciBvY2N1ci4gKi8KKwkJCQl6bG9nX2VycgorCQkJCSAgICAoIiVzOiBjb3JydXB0aW9uIGRldGVjdGVkOiBpb3Zfc21hbGwgb3ZlcmZsb3dlZDsgIgorCQkJCSAgICAgImhlYWQgJXAsIHRhaWwgJXAsIGhlYWQtPm5leHQgJXAiLAorCQkJCSAgICAgX19mdW5jX18sIGItPmhlYWQsIGItPnRhaWwsIGItPmhlYWQtPm5leHQpOworCQkJCWlvdiA9CisJCQkJICAgIFhNQUxMT0MoTVRZUEVfVE1QLAorCQkJCQkgICAgaW92X2FsbG9jICogc2l6ZW9mKCppb3YpKTsKKwkJCQltZW1jcHkoaW92LCBzbWFsbF9pb3YsIHNpemVvZihzbWFsbF9pb3YpKTsKKwkJCX0KKwkJfQorCX0KKworCS8qIEluIGNhc2Ugb2YgYG1vcmUnIGRpc3BsYXkgbmVlZC4gKi8KKwlpZiAoYi0+dGFpbCAmJiAoYi0+dGFpbC0+c3AgPCBiLT50YWlsLT5jcCkgJiYgIW5vX21vcmVfZmxhZykgeworCQlpb3ZbaW92X2luZGV4XS5pb3ZfYmFzZSA9IG1vcmU7CisJCWlvdltpb3ZfaW5kZXhdLmlvdl9sZW4gPSBzaXplb2YgbW9yZTsKKwkJaW92X2luZGV4Kys7CisJfQorI2lmZGVmIElPVl9NQVgKKwkvKiBJT1ZfTUFYIGFyZSBub3JtYWxseSBkZWZpbmVkIGluIDxzeXMvdWlvLmg+ICwgUG9zaXguMWcuCisJICAgZXhhbXBsZTogU29sYXJpczIuNiBhcmUgZGVmaW5lZCBJT1ZfTUFYIHNpemUgYXQgMTYuICAgICAqLworCXsKKwkJc3RydWN0IGlvdmVjICpjX2lvdiA9IGlvdjsKKwkJbmJ5dGVzID0gMDsJLyogTWFrZSBzdXJlIGl0J3MgaW5pdGlhbGl6ZWQuICovCisKKwkJd2hpbGUgKGlvdl9pbmRleCA+IDApIHsKKwkJCWludCBpb3Zfc2l6ZTsKKworCQkJaW92X3NpemUgPQorCQkJICAgICgoaW92X2luZGV4ID4gSU9WX01BWCkgPyBJT1ZfTUFYIDogaW92X2luZGV4KTsKKwkJCWlmICgobmJ5dGVzID0gd3JpdGV2KGZkLCBjX2lvdiwgaW92X3NpemUpKSA8IDApIHsKKwkJCQl6bG9nX3dhcm4oIiVzOiB3cml0ZXYgdG8gZmQgJWQgZmFpbGVkOiAlcyIsCisJCQkJCSAgX19mdW5jX18sIGZkLCBzYWZlX3N0cmVycm9yKGVycm5vKSk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIG1vdmUgcG9pbnRlciBpby12ZWN0b3IgKi8KKwkJCWNfaW92ICs9IGlvdl9zaXplOworCQkJaW92X2luZGV4IC09IGlvdl9zaXplOworCQl9CisJfQorI2Vsc2UJCQkJLyogSU9WX01BWCAqLworCWlmICgobmJ5dGVzID0gd3JpdGV2KGZkLCBpb3YsIGlvdl9pbmRleCkpIDwgMCkKKwkJemxvZ193YXJuKCIlczogd3JpdGV2IHRvIGZkICVkIGZhaWxlZDogJXMiLAorCQkJICBfX2Z1bmNfXywgZmQsIHNhZmVfc3RyZXJyb3IoZXJybm8pKTsKKyNlbmRpZgkJCQkvKiBJT1ZfTUFYICovCisKKwkvKiBGcmVlIHByaW50ZWQgYnVmZmVyIGRhdGEuICovCisJd2hpbGUgKGItPmhlYWQgJiYgKGItPmhlYWQtPnNwID09IGItPmhlYWQtPmNwKSkgeworCQlzdHJ1Y3QgYnVmZmVyX2RhdGEgKmRlbDsKKwkJaWYgKCEoYi0+aGVhZCA9IChkZWwgPSBiLT5oZWFkKS0+bmV4dCkpCisJCQliLT50YWlsID0gTlVMTDsKKwkJQlVGRkVSX0RBVEFfRlJFRShkZWwpOworCX0KKworCWlmIChpb3YgIT0gc21hbGxfaW92KQorCQlYRlJFRShNVFlQRV9UTVAsIGlvdik7CisKKwlyZXR1cm4gKG5ieXRlcyA8IDApID8gQlVGRkVSX0VSUk9SIDoKKwkgICAgKGItPmhlYWQgPyBCVUZGRVJfUEVORElORyA6IEJVRkZFUl9FTVBUWSk7Cit9CisjZW5kaWYKKworLyogVGhpcyBmdW5jdGlvbiAodW5saWtlIG90aGVyIGJ1ZmZlcl9mbHVzaCogZnVuY3Rpb25zIGFib3ZlKSBpcyBkZXNpZ25lZAordG8gd29yayB3aXRoIG5vbi1ibG9ja2luZyBzb2NrZXRzLiAgSXQgZG9lcyBub3QgYXR0ZW1wdCB0byB3cml0ZSBvdXQKK2FsbCBvZiB0aGUgcXVldWVkIGRhdGEsIGp1c3QgYSAiYmlnIiBjaHVuay4gIEl0IHJldHVybnMgMCBpZiBpdCB3YXMKK2FibGUgdG8gZW1wdHkgb3V0IHRoZSBidWZmZXJzIGNvbXBsZXRlbHksIDEgaWYgbW9yZSBmbHVzaGluZyBpcworcmVxdWlyZWQgbGF0ZXIsIG9yIC0xIG9uIGEgZmF0YWwgd3JpdGUgZXJyb3IuICovCitidWZmZXJfc3RhdHVzX3QgYnVmZmVyX2ZsdXNoX2F2YWlsYWJsZShzdHJ1Y3QgYnVmZmVyICogYiwgaW50IGZkKQoreworCisvKiBUaGVzZSBhcmUganVzdCByZWFzb25hYmxlIHZhbHVlcyB0byBtYWtlIHN1cmUgYSBzaWduaWZpY2FudCBhbW91bnQgb2YKK2RhdGEgaXMgd3JpdHRlbi4gIFRoZXJlJ3Mgbm8gbmVlZCB0byBnbyBjcmF6eSBhbmQgdHJ5IHRvIHdyaXRlIGl0IGFsbAoraW4gb25lIHNob3QuICovCisjaWZkZWYgSU9WX01BWAorI2RlZmluZSBNQVhfQ0hVTktTICgoSU9WX01BWCA+PSAxNikgPyAxNiA6IElPVl9NQVgpCisjZWxzZQorI2RlZmluZSBNQVhfQ0hVTktTIDE2CisjZW5kaWYKKyNkZWZpbmUgTUFYX0ZMVVNIIDEzMTA3MgorCisJc3RydWN0IGJ1ZmZlcl9kYXRhICpkOworCXNpemVfdCB3cml0dGVuOworCXN0cnVjdCBpb3ZlYyBpb3ZbTUFYX0NIVU5LU107CisJc2l6ZV90IGlvdmNudCA9IDA7CisJc2l6ZV90IG5ieXRlID0gMDsKKworCWZvciAoZCA9IGItPmhlYWQ7IGQgJiYgKGlvdmNudCA8IE1BWF9DSFVOS1MpICYmIChuYnl0ZSA8IE1BWF9GTFVTSCk7CisJICAgICBkID0gZC0+bmV4dCwgaW92Y250KyspIHsKKwkJaW92W2lvdmNudF0uaW92X2Jhc2UgPSBkLT5kYXRhICsgZC0+c3A7CisJCW5ieXRlICs9IChpb3ZbaW92Y250XS5pb3ZfbGVuID0gZC0+Y3AgLSBkLT5zcCk7CisJfQorCisJaWYgKCFuYnl0ZSkKKwkJLyogTm8gZGF0YSB0byBmbHVzaDogc2hvdWxkIHdlIGlzc3VlIGEgd2FybmluZyBtZXNzYWdlPyAqLworCQlyZXR1cm4gQlVGRkVSX0VNUFRZOworCisJLyogb25seSBwbGFjZSB3aGVyZSB3cml0dGVuIHNob3VsZCBiZSBzaWduIGNvbXBhcmVkICovCisJaWYgKChzc2l6ZV90KSAod3JpdHRlbiA9IHdyaXRldihmZCwgaW92LCBpb3ZjbnQpKSA8IDApIHsKKwkJaWYgKEVSUk5PX0lPX1JFVFJZKGVycm5vKSkKKwkJCS8qIENhbGxpbmcgY29kZSBzaG91bGQgdHJ5IGFnYWluIGxhdGVyLiAqLworCQkJcmV0dXJuIEJVRkZFUl9QRU5ESU5HOworCQlyZXR1cm4gQlVGRkVSX0VSUk9SOworCX0KKworCS8qIEZyZWUgcHJpbnRlZCBidWZmZXIgZGF0YS4gKi8KKwl3aGlsZSAod3JpdHRlbiA+IDApIHsKKwkJc3RydWN0IGJ1ZmZlcl9kYXRhICpkOworCQlpZiAoIShkID0gYi0+aGVhZCkpCisJCQlicmVhazsKKwkJaWYgKHdyaXR0ZW4gPCBkLT5jcCAtIGQtPnNwKSB7CisJCQlkLT5zcCArPSB3cml0dGVuOworCQkJcmV0dXJuIEJVRkZFUl9QRU5ESU5HOworCQl9CisKKwkJd3JpdHRlbiAtPSAoZC0+Y3AgLSBkLT5zcCk7CisJCWlmICghKGItPmhlYWQgPSBkLT5uZXh0KSkKKwkJCWItPnRhaWwgPSBOVUxMOworCQlCVUZGRVJfREFUQV9GUkVFKGQpOworCX0KKworCXJldHVybiBiLT5oZWFkID8gQlVGRkVSX1BFTkRJTkcgOiBCVUZGRVJfRU1QVFk7CisKKyN1bmRlZiBNQVhfQ0hVTktTCisjdW5kZWYgTUFYX0ZMVVNICit9CisKK2J1ZmZlcl9zdGF0dXNfdAorYnVmZmVyX3dyaXRlKHN0cnVjdCBidWZmZXIgKiBiLCBpbnQgZmQsIGNvbnN0IHZvaWQgKnAsIHNpemVfdCBzaXplKQoreworCXNzaXplX3QgbmJ5dGVzOworCisjaWYgMAorCS8qIFNob3VsZCB3ZSBhdHRlbXB0IHRvIGRyYWluIGFueSBwcmV2aW91c2x5IGJ1ZmZlcmVkIGRhdGE/ICBUaGlzIGNvdWxkIGhlbHAgcmVkdWNlIGxhdGVuY3kgaW4gcHVzaGluZyBvdXQgdGhlIGRhdGEgaWYgd2UgYXJlIHN0dWNrIGluIGEgbG9uZy1ydW5uaW5nIHRocmVhZCB0aGF0IGlzIHByZXZlbnRpbmcgdGhlIG1haW4gc2VsZWN0IGxvb3AgZnJvbSBjYWxsaW5nIHRoZSBmbHVzaCB0aHJlYWQuLi4gKi8KKworCWlmIChiLT5oZWFkICYmIChidWZmZXJfZmx1c2hfYXZhaWxhYmxlKGIsIGZkKSA9PSBCVUZGRVJfRVJST1IpKQorCQlyZXR1cm4gQlVGRkVSX0VSUk9SOworI2VuZGlmCisJaWYgKGItPmhlYWQpCisJCS8qIEJ1ZmZlciBpcyBub3QgZW1wdHksIHNvIGRvIG5vdCBhdHRlbXB0IHRvIHdyaXRlIHRoZSBuZXcgZGF0YS4gKi8KKwkJbmJ5dGVzID0gMDsKKwllbHNlIGlmICgobmJ5dGVzID0gd3JpdGUoZmQsIHAsIHNpemUpKSA8IDApIHsKKwkJaWYgKEVSUk5PX0lPX1JFVFJZKGVycm5vKSkKKwkJCW5ieXRlcyA9IDA7CisJCWVsc2UKKwkJCXJldHVybiBCVUZGRVJfRVJST1I7CisJfQorCS8qIEFkZCBhbnkgcmVtYWluaW5nIGRhdGEgdG8gdGhlIGJ1ZmZlci4gKi8KKwl7CisJCXNpemVfdCB3cml0dGVuID0gbmJ5dGVzOworCQlpZiAod3JpdHRlbiA8IHNpemUpCisJCQlidWZmZXJfcHV0KGIsICgoY29uc3QgY2hhciAqKXApICsgd3JpdHRlbiwKKwkJCQkgICBzaXplIC0gd3JpdHRlbik7CisJfQorCXJldHVybiBiLT5oZWFkID8gQlVGRkVSX1BFTkRJTkcgOiBCVUZGRVJfRU1QVFk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy92dHkvY2FyZHNoZWxsLmggYi9vcGVuYnNjL3NyYy92dHkvY2FyZHNoZWxsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUxNjRkMgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3Z0eS9jYXJkc2hlbGwuaApAQCAtMCwwICsxLDYgQEAKKyNpbmNsdWRlICIuLi8uLi9ic2Njb25maWcuaCIKKyNkZWZpbmUgUVVBR0dBX1BST0dOQU1FCVBBQ0tBR0VfTkFNRQorI2RlZmluZSBRVUFHR0FfVkVSU0lPTglQQUNLQUdFX1ZFUlNJT04KKyNkZWZpbmUgUVVBR0dBX0NPUFlSSUdIVCAiSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4iCisjZGVmaW5lIENPTkZJR0ZJTEVfTUFTSyAwMjIKKyNkZWZpbmUgU1lTQ09ORkRJUiAiL3Vzci9sb2NhbC9ldGMiCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy92dHkvY29tbWFuZC5jIGIvb3BlbmJzYy9zcmMvdnR5L2NvbW1hbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmFlZDM1Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvdnR5L2NvbW1hbmQuYwpAQCAtMCwwICsxLDM0MTEgQEAKKy8qCisgICAkSWQ6IGNvbW1hbmQuYyx2IDEuNDcgMjAwNS8wNC8yNSAxNjoyNjo0MiBwYXVsIEV4cCAkCisKKyAgIENvbW1hbmQgaW50ZXJwcmV0ZXIgcm91dGluZSBmb3IgdmlydHVhbCB0ZXJtaW5hbCBbYWthIFRlbGV0WXBlXQorICAgQ29weXJpZ2h0IChDKSAxOTk3LCA5OCwgOTkgS3VuaWhpcm8gSXNoaWd1cm8KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIFplYnJhLgorCitHTlUgWmVicmEgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKK2J5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyCitvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitHTlUgWmVicmEgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCBHTlUgWmVicmE7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiY2FyZHNoZWxsLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjZGVmaW5lIF9YT1BFTl9TT1VSQ0UKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKy8vI2luY2x1ZGUgIm1lbW9yeS5oIgorLy8jaW5jbHVkZSAibG9nLmgiCisvLyNpbmNsdWRlIDxsaWIvdmVyc2lvbi5oPgorLy8jaW5jbHVkZSAidGhyZWFkLmgiCisjaW5jbHVkZSA8dnR5L3ZlY3Rvci5oPgorI2luY2x1ZGUgPHZ0eS92dHkuaD4KKyNpbmNsdWRlIDx2dHkvY29tbWFuZC5oPgorLy8jaW5jbHVkZSAid29ya3F1ZXVlLmgiCisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorCit2b2lkICp0YWxsX3Z0eV9jbWRfY3R4OworCisvKiBDb21tYW5kIHZlY3RvciB3aGljaCBpbmNsdWRlcyBzb21lIGxldmVsIG9mIGNvbW1hbmQgbGlzdHMuIE5vcm1hbGx5CisgICBlYWNoIGRhZW1vbiBtYWludGFpbnMgZWFjaCBvd24gY21kdmVjLiAqLwordmVjdG9yIGNtZHZlYzsKKworLyogSG9zdCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuICovCitzdHJ1Y3QgaG9zdCBob3N0OworCisvKiBTdGFuZGFyZCBjb21tYW5kIG5vZGUgc3RydWN0dXJlcy4gKi8KK3N0cnVjdCBjbWRfbm9kZSBhdXRoX25vZGUgPSB7CisJQVVUSF9OT0RFLAorCSJQYXNzd29yZDogIiwKK307CisKK3N0cnVjdCBjbWRfbm9kZSB2aWV3X25vZGUgPSB7CisJVklFV19OT0RFLAorCSIlcz4gIiwKK307CisKK3N0cnVjdCBjbWRfbm9kZSBhdXRoX2VuYWJsZV9ub2RlID0geworCUFVVEhfRU5BQkxFX05PREUsCisJIlBhc3N3b3JkOiAiLAorfTsKKworc3RydWN0IGNtZF9ub2RlIGVuYWJsZV9ub2RlID0geworCUVOQUJMRV9OT0RFLAorCSIlcyMgIiwKK307CisKK3N0cnVjdCBjbWRfbm9kZSBjb25maWdfbm9kZSA9IHsKKwlDT05GSUdfTk9ERSwKKwkiJXMoY29uZmlnKSMgIiwKKwkxCit9OworCisvKiBEZWZhdWx0IG1vdGQgc3RyaW5nLiAqLworY29uc3QgY2hhciAqZGVmYXVsdF9tb3RkID0gIlxyXG5cCitIZWxsbywgdGhpcyBpcyAiIFFVQUdHQV9QUk9HTkFNRSAiICh2ZXJzaW9uICIgUVVBR0dBX1ZFUlNJT04gIikuXHJcblwKKyIgUVVBR0dBX0NPUFlSSUdIVCAiXHJcblwKK1xyXG4iOworCisjaWYgMAorc3RhdGljIHN0cnVjdCBmYWNpbGl0eV9tYXAgeworCWludCBmYWNpbGl0eTsKKwljb25zdCBjaGFyICpuYW1lOworCXNpemVfdCBtYXRjaDsKK30gc3lzbG9nX2ZhY2lsaXRpZXNbXSA9IHsKKwl7CisJTE9HX0tFUk4sICJrZXJuIiwgMX0sIHsKKwlMT0dfVVNFUiwgInVzZXIiLCAyfSwgeworCUxPR19NQUlMLCAibWFpbCIsIDF9LCB7CisJTE9HX0RBRU1PTiwgImRhZW1vbiIsIDF9LCB7CisJTE9HX0FVVEgsICJhdXRoIiwgMX0sIHsKKwlMT0dfU1lTTE9HLCAic3lzbG9nIiwgMX0sIHsKKwlMT0dfTFBSLCAibHByIiwgMn0sIHsKKwlMT0dfTkVXUywgIm5ld3MiLCAxfSwgeworCUxPR19VVUNQLCAidXVjcCIsIDJ9LCB7CisJTE9HX0NST04sICJjcm9uIiwgMX0sCisjaWZkZWYgTE9HX0ZUUAorCXsKKwlMT0dfRlRQLCAiZnRwIiwgMX0sCisjZW5kaWYKKwl7CisJTE9HX0xPQ0FMMCwgImxvY2FsMCIsIDZ9LCB7CisJTE9HX0xPQ0FMMSwgImxvY2FsMSIsIDZ9LCB7CisJTE9HX0xPQ0FMMiwgImxvY2FsMiIsIDZ9LCB7CisJTE9HX0xPQ0FMMywgImxvY2FsMyIsIDZ9LCB7CisJTE9HX0xPQ0FMNCwgImxvY2FsNCIsIDZ9LCB7CisJTE9HX0xPQ0FMNSwgImxvY2FsNSIsIDZ9LCB7CisJTE9HX0xPQ0FMNiwgImxvY2FsNiIsIDZ9LCB7CisJTE9HX0xPQ0FMNywgImxvY2FsNyIsIDZ9LCB7CiswLCBOVUxMLCAwfSx9OworCitzdGF0aWMgY29uc3QgY2hhciAqZmFjaWxpdHlfbmFtZShpbnQgZmFjaWxpdHkpCit7CisJc3RydWN0IGZhY2lsaXR5X21hcCAqZm07CisKKwlmb3IgKGZtID0gc3lzbG9nX2ZhY2lsaXRpZXM7IGZtLT5uYW1lOyBmbSsrKQorCQlpZiAoZm0tPmZhY2lsaXR5ID09IGZhY2lsaXR5KQorCQkJcmV0dXJuIGZtLT5uYW1lOworCXJldHVybiAiIjsKK30KKworc3RhdGljIGludCBmYWNpbGl0eV9tYXRjaChjb25zdCBjaGFyICpzdHIpCit7CisJc3RydWN0IGZhY2lsaXR5X21hcCAqZm07CisKKwlmb3IgKGZtID0gc3lzbG9nX2ZhY2lsaXRpZXM7IGZtLT5uYW1lOyBmbSsrKQorCQlpZiAoIXN0cm5jbXAoc3RyLCBmbS0+bmFtZSwgZm0tPm1hdGNoKSkKKwkJCXJldHVybiBmbS0+ZmFjaWxpdHk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGxldmVsX21hdGNoKGNvbnN0IGNoYXIgKnMpCit7CisJaW50IGxldmVsOworCisJZm9yIChsZXZlbCA9IDA7IHpsb2dfcHJpb3JpdHlbbGV2ZWxdICE9IE5VTEw7IGxldmVsKyspCisJCWlmICghc3RybmNtcChzLCB6bG9nX3ByaW9yaXR5W2xldmVsXSwgMikpCisJCQlyZXR1cm4gbGV2ZWw7CisJcmV0dXJuIFpMT0dfRElTQUJMRUQ7Cit9CisjZW5kaWYKKworLyogVGhpcyBpcyBjYWxsZWQgZnJvbSBtYWluIHdoZW4gYSBkYWVtb24gaXMgaW52b2tlZCB3aXRoIC12IG9yIC0tdmVyc2lvbi4gKi8KK3ZvaWQgcHJpbnRfdmVyc2lvbihjb25zdCBjaGFyICpwcm9nbmFtZSkKK3sKKwlwcmludGYoIiVzIHZlcnNpb24gJXNcbiIsIHByb2duYW1lLCBRVUFHR0FfVkVSU0lPTik7CisJcHJpbnRmKCIlc1xuIiwgUVVBR0dBX0NPUFlSSUdIVCk7Cit9CisMCisvKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGNvbmNhdGVuYXRlIGFyZ3YgYXJndW1lbnQgaW50byBhIHNpbmdsZSBzdHJpbmcKKyAgIHdpdGggaW5zZXJ0aW5nICcgJyBjaGFyYWN0ZXIgYmV0d2VlbiBlYWNoIGFyZ3VtZW50LiAgKi8KK2NoYXIgKmFyZ3ZfY29uY2F0KGNvbnN0IGNoYXIgKiphcmd2LCBpbnQgYXJnYywgaW50IHNoaWZ0KQoreworCWludCBpOworCXNpemVfdCBsZW47CisJY2hhciAqc3RyOworCWNoYXIgKnA7CisKKwlsZW4gPSAwOworCWZvciAoaSA9IHNoaWZ0OyBpIDwgYXJnYzsgaSsrKQorCQlsZW4gKz0gc3RybGVuKGFyZ3ZbaV0pICsgMTsKKwlpZiAoIWxlbikKKwkJcmV0dXJuIE5VTEw7CisJcCA9IHN0ciA9IF90YWxsb2NfemVybyh0YWxsX3Z0eV9jbWRfY3R4LCBsZW4sICJhcnZnX2NvbmNhdCIpOworCWZvciAoaSA9IHNoaWZ0OyBpIDwgYXJnYzsgaSsrKSB7CisJCXNpemVfdCBhcmdsZW47CisJCW1lbWNweShwLCBhcmd2W2ldLCAoYXJnbGVuID0gc3RybGVuKGFyZ3ZbaV0pKSk7CisJCXAgKz0gYXJnbGVuOworCQkqcCsrID0gJyAnOworCX0KKwkqKHAgLSAxKSA9ICdcMCc7CisJcmV0dXJuIHN0cjsKK30KKworLyogSW5zdGFsbCB0b3Agbm9kZSBvZiBjb21tYW5kIHZlY3Rvci4gKi8KK3ZvaWQgaW5zdGFsbF9ub2RlKHN0cnVjdCBjbWRfbm9kZSAqbm9kZSwgaW50ICgqZnVuYykgKHN0cnVjdCB2dHkgKikpCit7CisJdmVjdG9yX3NldF9pbmRleChjbWR2ZWMsIG5vZGUtPm5vZGUsIG5vZGUpOworCW5vZGUtPmZ1bmMgPSBmdW5jOworCW5vZGUtPmNtZF92ZWN0b3IgPSB2ZWN0b3JfaW5pdChWRUNUT1JfTUlOX1NJWkUpOworfQorCisvKiBDb21wYXJlIHR3byBjb21tYW5kJ3Mgc3RyaW5nLiAgVXNlZCBpbiBzb3J0X25vZGUgKCkuICovCitzdGF0aWMgaW50IGNtcF9ub2RlKGNvbnN0IHZvaWQgKnAsIGNvbnN0IHZvaWQgKnEpCit7CisJc3RydWN0IGNtZF9lbGVtZW50ICphID0gKihzdHJ1Y3QgY21kX2VsZW1lbnQgKiopcDsKKwlzdHJ1Y3QgY21kX2VsZW1lbnQgKmIgPSAqKHN0cnVjdCBjbWRfZWxlbWVudCAqKilxOworCisJcmV0dXJuIHN0cmNtcChhLT5zdHJpbmcsIGItPnN0cmluZyk7Cit9CisKK3N0YXRpYyBpbnQgY21wX2Rlc2MoY29uc3Qgdm9pZCAqcCwgY29uc3Qgdm9pZCAqcSkKK3sKKwlzdHJ1Y3QgZGVzYyAqYSA9ICooc3RydWN0IGRlc2MgKiopcDsKKwlzdHJ1Y3QgZGVzYyAqYiA9ICooc3RydWN0IGRlc2MgKiopcTsKKworCXJldHVybiBzdHJjbXAoYS0+Y21kLCBiLT5jbWQpOworfQorCisvKiBTb3J0IGVhY2ggbm9kZSdzIGNvbW1hbmQgZWxlbWVudCBhY2NvcmRpbmcgdG8gY29tbWFuZCBzdHJpbmcuICovCit2b2lkIHNvcnRfbm9kZSgpCit7CisJdW5zaWduZWQgaW50IGksIGo7CisJc3RydWN0IGNtZF9ub2RlICpjbm9kZTsKKwl2ZWN0b3IgZGVzY3ZlYzsKKwlzdHJ1Y3QgY21kX2VsZW1lbnQgKmNtZF9lbGVtZW50OworCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUoY21kdmVjKTsgaSsrKQorCQlpZiAoKGNub2RlID0gdmVjdG9yX3Nsb3QoY21kdmVjLCBpKSkgIT0gTlVMTCkgeworCQkJdmVjdG9yIGNtZF92ZWN0b3IgPSBjbm9kZS0+Y21kX3ZlY3RvcjsKKwkJCXFzb3J0KGNtZF92ZWN0b3ItPmluZGV4LCB2ZWN0b3JfYWN0aXZlKGNtZF92ZWN0b3IpLAorCQkJICAgICAgc2l6ZW9mKHZvaWQgKiksIGNtcF9ub2RlKTsKKworCQkJZm9yIChqID0gMDsgaiA8IHZlY3Rvcl9hY3RpdmUoY21kX3ZlY3Rvcik7IGorKykKKwkJCQlpZiAoKGNtZF9lbGVtZW50ID0KKwkJCQkgICAgIHZlY3Rvcl9zbG90KGNtZF92ZWN0b3IsIGopKSAhPSBOVUxMCisJCQkJICAgICYmIHZlY3Rvcl9hY3RpdmUoY21kX2VsZW1lbnQtPnN0cnZlYykpIHsKKwkJCQkJZGVzY3ZlYyA9CisJCQkJCSAgICB2ZWN0b3Jfc2xvdChjbWRfZWxlbWVudC0+c3RydmVjLAorCQkJCQkJCXZlY3Rvcl9hY3RpdmUKKwkJCQkJCQkoY21kX2VsZW1lbnQtPnN0cnZlYykgLQorCQkJCQkJCTEpOworCQkJCQlxc29ydChkZXNjdmVjLT5pbmRleCwKKwkJCQkJICAgICAgdmVjdG9yX2FjdGl2ZShkZXNjdmVjKSwKKwkJCQkJICAgICAgc2l6ZW9mKHZvaWQgKiksIGNtcF9kZXNjKTsKKwkJCQl9CisJCX0KK30KKworLyogQnJlYWtpbmcgdXAgc3RyaW5nIGludG8gZWFjaCBjb21tYW5kIHBpZWNlLiBJIGFzc3VtZSBnaXZlbgorICAgY2hhcmFjdGVyIGlzIHNlcGFyYXRlZCBieSBhIHNwYWNlIGNoYXJhY3Rlci4gUmV0dXJuIHZhbHVlIGlzIGEKKyAgIHZlY3RvciB3aGljaCBpbmNsdWRlcyBjaGFyICoqIGRhdGEgZWxlbWVudC4gKi8KK3ZlY3RvciBjbWRfbWFrZV9zdHJ2ZWMoY29uc3QgY2hhciAqc3RyaW5nKQoreworCWNvbnN0IGNoYXIgKmNwLCAqc3RhcnQ7CisJY2hhciAqdG9rZW47CisJaW50IHN0cmxlbjsKKwl2ZWN0b3Igc3RydmVjOworCisJaWYgKHN0cmluZyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWNwID0gc3RyaW5nOworCisJLyogU2tpcCB3aGl0ZSBzcGFjZXMuICovCisJd2hpbGUgKGlzc3BhY2UoKGludCkqY3ApICYmICpjcCAhPSAnXDAnKQorCQljcCsrOworCisJLyogUmV0dXJuIGlmIHRoZXJlIGlzIG9ubHkgd2hpdGUgc3BhY2VzICovCisJaWYgKCpjcCA9PSAnXDAnKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICgqY3AgPT0gJyEnIHx8ICpjcCA9PSAnIycpCisJCXJldHVybiBOVUxMOworCisJLyogUHJlcGFyZSByZXR1cm4gdmVjdG9yLiAqLworCXN0cnZlYyA9IHZlY3Rvcl9pbml0KFZFQ1RPUl9NSU5fU0laRSk7CisKKwkvKiBDb3B5IGVhY2ggY29tbWFuZCBwaWVjZSBhbmQgc2V0IGludG8gdmVjdG9yLiAqLworCXdoaWxlICgxKSB7CisJCXN0YXJ0ID0gY3A7CisJCXdoaWxlICghKGlzc3BhY2UoKGludCkqY3ApIHx8ICpjcCA9PSAnXHInIHx8ICpjcCA9PSAnXG4nKSAmJgorCQkgICAgICAgKmNwICE9ICdcMCcpCisJCQljcCsrOworCQlzdHJsZW4gPSBjcCAtIHN0YXJ0OworCQl0b2tlbiA9IF90YWxsb2NfemVybyh0YWxsX3Z0eV9jbWRfY3R4LCBzdHJsZW4gKyAxLCAibWFrZV9zdHJ2ZWMiKTsKKwkJbWVtY3B5KHRva2VuLCBzdGFydCwgc3RybGVuKTsKKwkJKih0b2tlbiArIHN0cmxlbikgPSAnXDAnOworCQl2ZWN0b3Jfc2V0KHN0cnZlYywgdG9rZW4pOworCisJCXdoaWxlICgoaXNzcGFjZSgoaW50KSpjcCkgfHwgKmNwID09ICdcbicgfHwgKmNwID09ICdccicpICYmCisJCSAgICAgICAqY3AgIT0gJ1wwJykKKwkJCWNwKys7CisKKwkJaWYgKCpjcCA9PSAnXDAnKQorCQkJcmV0dXJuIHN0cnZlYzsKKwl9Cit9CisKKy8qIEZyZWUgYWxsb2NhdGVkIHN0cmluZyB2ZWN0b3IuICovCit2b2lkIGNtZF9mcmVlX3N0cnZlYyh2ZWN0b3IgdikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwljaGFyICpjcDsKKworCWlmICghdikKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUodik7IGkrKykKKwkJaWYgKChjcCA9IHZlY3Rvcl9zbG90KHYsIGkpKSAhPSBOVUxMKQorCQkJdGFsbG9jX2ZyZWUoY3ApOworCisJdmVjdG9yX2ZyZWUodik7Cit9CisKKy8qIEZldGNoIG5leHQgZGVzY3JpcHRpb24uICBVc2VkIGluIGNtZF9tYWtlX2Rlc2N2ZWMoKS4gKi8KK3N0YXRpYyBjaGFyICpjbWRfZGVzY19zdHIoY29uc3QgY2hhciAqKnN0cmluZykKK3sKKwljb25zdCBjaGFyICpjcCwgKnN0YXJ0OworCWNoYXIgKnRva2VuOworCWludCBzdHJsZW47CisKKwljcCA9ICpzdHJpbmc7CisKKwlpZiAoY3AgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBTa2lwIHdoaXRlIHNwYWNlcy4gKi8KKwl3aGlsZSAoaXNzcGFjZSgoaW50KSpjcCkgJiYgKmNwICE9ICdcMCcpCisJCWNwKys7CisKKwkvKiBSZXR1cm4gaWYgdGhlcmUgaXMgb25seSB3aGl0ZSBzcGFjZXMgKi8KKwlpZiAoKmNwID09ICdcMCcpCisJCXJldHVybiBOVUxMOworCisJc3RhcnQgPSBjcDsKKworCXdoaWxlICghKCpjcCA9PSAnXHInIHx8ICpjcCA9PSAnXG4nKSAmJiAqY3AgIT0gJ1wwJykKKwkJY3ArKzsKKworCXN0cmxlbiA9IGNwIC0gc3RhcnQ7CisJdG9rZW4gPSBfdGFsbG9jX3plcm8odGFsbF92dHlfY21kX2N0eCwgc3RybGVuICsgMSwgImNtZF9kZXNjX3N0ciIpOworCW1lbWNweSh0b2tlbiwgc3RhcnQsIHN0cmxlbik7CisJKih0b2tlbiArIHN0cmxlbikgPSAnXDAnOworCisJKnN0cmluZyA9IGNwOworCisJcmV0dXJuIHRva2VuOworfQorCisvKiBOZXcgc3RyaW5nIHZlY3Rvci4gKi8KK3N0YXRpYyB2ZWN0b3IgY21kX21ha2VfZGVzY3ZlYyhjb25zdCBjaGFyICpzdHJpbmcsIGNvbnN0IGNoYXIgKmRlc2NzdHIpCit7CisJaW50IG11bHRpcGxlID0gMDsKKwljb25zdCBjaGFyICpzcDsKKwljaGFyICp0b2tlbjsKKwlpbnQgbGVuOworCWNvbnN0IGNoYXIgKmNwOworCWNvbnN0IGNoYXIgKmRwOworCXZlY3RvciBhbGx2ZWM7CisJdmVjdG9yIHN0cnZlYyA9IE5VTEw7CisJc3RydWN0IGRlc2MgKmRlc2M7CisKKwljcCA9IHN0cmluZzsKKwlkcCA9IGRlc2NzdHI7CisKKwlpZiAoY3AgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlhbGx2ZWMgPSB2ZWN0b3JfaW5pdChWRUNUT1JfTUlOX1NJWkUpOworCisJd2hpbGUgKDEpIHsKKwkJd2hpbGUgKGlzc3BhY2UoKGludCkqY3ApICYmICpjcCAhPSAnXDAnKQorCQkJY3ArKzsKKworCQlpZiAoKmNwID09ICcoJykgeworCQkJbXVsdGlwbGUgPSAxOworCQkJY3ArKzsKKwkJfQorCQlpZiAoKmNwID09ICcpJykgeworCQkJbXVsdGlwbGUgPSAwOworCQkJY3ArKzsKKwkJfQorCQlpZiAoKmNwID09ICd8JykgeworCQkJaWYgKCFtdWx0aXBsZSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiQ29tbWFuZCBwYXJzZSBlcnJvciE6ICVzXG4iLAorCQkJCQlzdHJpbmcpOworCQkJCWV4aXQoMSk7CisJCQl9CisJCQljcCsrOworCQl9CisKKwkJd2hpbGUgKGlzc3BhY2UoKGludCkqY3ApICYmICpjcCAhPSAnXDAnKQorCQkJY3ArKzsKKworCQlpZiAoKmNwID09ICcoJykgeworCQkJbXVsdGlwbGUgPSAxOworCQkJY3ArKzsKKwkJfQorCisJCWlmICgqY3AgPT0gJ1wwJykKKwkJCXJldHVybiBhbGx2ZWM7CisKKwkJc3AgPSBjcDsKKworCQl3aGlsZSAoIQorCQkgICAgICAgKGlzc3BhY2UoKGludCkqY3ApIHx8ICpjcCA9PSAnXHInIHx8ICpjcCA9PSAnXG4nCisJCQl8fCAqY3AgPT0gJyknIHx8ICpjcCA9PSAnfCcpICYmICpjcCAhPSAnXDAnKQorCQkJY3ArKzsKKworCQlsZW4gPSBjcCAtIHNwOworCisJCXRva2VuID0gX3RhbGxvY196ZXJvKHRhbGxfdnR5X2NtZF9jdHgsIGxlbiArIDEsICJjbWRfbWFrZV9kZXNjdmVjIik7CisJCW1lbWNweSh0b2tlbiwgc3AsIGxlbik7CisJCSoodG9rZW4gKyBsZW4pID0gJ1wwJzsKKworCQlkZXNjID0gdGFsbG9jX3plcm8odGFsbF92dHlfY21kX2N0eCwgc3RydWN0IGRlc2MpOworCQlkZXNjLT5jbWQgPSB0b2tlbjsKKwkJZGVzYy0+c3RyID0gY21kX2Rlc2Nfc3RyKCZkcCk7CisKKwkJaWYgKG11bHRpcGxlKSB7CisJCQlpZiAobXVsdGlwbGUgPT0gMSkgeworCQkJCXN0cnZlYyA9IHZlY3Rvcl9pbml0KFZFQ1RPUl9NSU5fU0laRSk7CisJCQkJdmVjdG9yX3NldChhbGx2ZWMsIHN0cnZlYyk7CisJCQl9CisJCQltdWx0aXBsZSsrOworCQl9IGVsc2UgeworCQkJc3RydmVjID0gdmVjdG9yX2luaXQoVkVDVE9SX01JTl9TSVpFKTsKKwkJCXZlY3Rvcl9zZXQoYWxsdmVjLCBzdHJ2ZWMpOworCQl9CisJCXZlY3Rvcl9zZXQoc3RydmVjLCBkZXNjKTsKKwl9Cit9CisKKy8qIENvdW50IG1hbmRhbnRvcnkgc3RyaW5nIHZlY3RvciBzaXplLiAgVGhpcyBpcyB0byBkZXRlcm1pbmUgaW5wdXRlZAorICAgY29tbWFuZCBoYXMgZW5vdWdoIGNvbW1hbmQgbGVuZ3RoLiAqLworc3RhdGljIGludCBjbWRfY21kc2l6ZSh2ZWN0b3Igc3RydmVjKQoreworCXVuc2lnbmVkIGludCBpOworCWludCBzaXplID0gMDsKKwl2ZWN0b3IgZGVzY3ZlYzsKKwlzdHJ1Y3QgZGVzYyAqZGVzYzsKKworCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKHN0cnZlYyk7IGkrKykKKwkJaWYgKChkZXNjdmVjID0gdmVjdG9yX3Nsb3Qoc3RydmVjLCBpKSkgIT0gTlVMTCkgeworCQkJaWYgKCh2ZWN0b3JfYWN0aXZlKGRlc2N2ZWMpKSA9PSAxCisJCQkgICAgJiYgKGRlc2MgPSB2ZWN0b3Jfc2xvdChkZXNjdmVjLCAwKSkgIT0gTlVMTCkgeworCQkJCWlmIChkZXNjLT5jbWQgPT0gTlVMTCB8fCBDTURfT1BUSU9OKGRlc2MtPmNtZCkpCisJCQkJCXJldHVybiBzaXplOworCQkJCWVsc2UKKwkJCQkJc2l6ZSsrOworCQkJfSBlbHNlCisJCQkJc2l6ZSsrOworCQl9CisJcmV0dXJuIHNpemU7Cit9CisKKy8qIFJldHVybiBwcm9tcHQgY2hhcmFjdGVyIG9mIHNwZWNpZmllZCBub2RlLiAqLworY29uc3QgY2hhciAqY21kX3Byb21wdChlbnVtIG5vZGVfdHlwZSBub2RlKQoreworCXN0cnVjdCBjbWRfbm9kZSAqY25vZGU7CisKKwljbm9kZSA9IHZlY3Rvcl9zbG90KGNtZHZlYywgbm9kZSk7CisJcmV0dXJuIGNub2RlLT5wcm9tcHQ7Cit9CisKKy8qIEluc3RhbGwgYSBjb21tYW5kIGludG8gYSBub2RlLiAqLwordm9pZCBpbnN0YWxsX2VsZW1lbnQoZW51bSBub2RlX3R5cGUgbnR5cGUsIHN0cnVjdCBjbWRfZWxlbWVudCAqY21kKQoreworCXN0cnVjdCBjbWRfbm9kZSAqY25vZGU7CisKKwljbm9kZSA9IHZlY3Rvcl9zbG90KGNtZHZlYywgbnR5cGUpOworCisJaWYgKGNub2RlID09IE5VTEwpIHsKKwkJZnByaW50ZihzdGRlcnIsCisJCQkiQ29tbWFuZCBub2RlICVkIGRvZXNuJ3QgZXhpc3QsIHBsZWFzZSBjaGVjayBpdFxuIiwKKwkJCW50eXBlKTsKKwkJZXhpdCgxKTsKKwl9CisKKwl2ZWN0b3Jfc2V0KGNub2RlLT5jbWRfdmVjdG9yLCBjbWQpOworCisJY21kLT5zdHJ2ZWMgPSBjbWRfbWFrZV9kZXNjdmVjKGNtZC0+c3RyaW5nLCBjbWQtPmRvYyk7CisJY21kLT5jbWRzaXplID0gY21kX2NtZHNpemUoY21kLT5zdHJ2ZWMpOworfQorCisjaWZkZWYgVlRZX0NSWVBUX1BXCitzdGF0aWMgdW5zaWduZWQgY2hhciBpdG9hNjRbXSA9CisgICAgIi4vMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiOworCitzdGF0aWMgdm9pZCB0bzY0KGNoYXIgKnMsIGxvbmcgdiwgaW50IG4pCit7CisJd2hpbGUgKC0tbiA+PSAwKSB7CisJCSpzKysgPSBpdG9hNjRbdiAmIDB4M2ZdOworCQl2ID4+PSA2OworCX0KK30KKworc3RhdGljIGNoYXIgKnplbmNyeXB0KGNvbnN0IGNoYXIgKnBhc3N3ZCkKK3sKKwljaGFyIHNhbHRbNl07CisJc3RydWN0IHRpbWV2YWwgdHY7CisJY2hhciAqY3J5cHQoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworCisJZ2V0dGltZW9mZGF5KCZ0diwgMCk7CisKKwl0bzY0KCZzYWx0WzBdLCByYW5kb20oKSwgMyk7CisJdG82NCgmc2FsdFszXSwgdHYudHZfdXNlYywgMyk7CisJc2FsdFs1XSA9ICdcMCc7CisKKwlyZXR1cm4gY3J5cHQocGFzc3dkLCBzYWx0KTsKK30KKyNlbmRpZgorCisvKiBUaGlzIGZ1bmN0aW9uIHdyaXRlIGNvbmZpZ3VyYXRpb24gb2YgdGhpcyBob3N0LiAqLworc3RhdGljIGludCBjb25maWdfd3JpdGVfaG9zdChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJaWYgKGhvc3QubmFtZSkKKwkJdnR5X291dCh2dHksICJob3N0bmFtZSAlcyVzIiwgaG9zdC5uYW1lLCBWVFlfTkVXTElORSk7CisKKwlpZiAoaG9zdC5lbmNyeXB0KSB7CisJCWlmIChob3N0LnBhc3N3b3JkX2VuY3J5cHQpCisJCQl2dHlfb3V0KHZ0eSwgInBhc3N3b3JkIDggJXMlcyIsIGhvc3QucGFzc3dvcmRfZW5jcnlwdCwKKwkJCQlWVFlfTkVXTElORSk7CisJCWlmIChob3N0LmVuYWJsZV9lbmNyeXB0KQorCQkJdnR5X291dCh2dHksICJlbmFibGUgcGFzc3dvcmQgOCAlcyVzIiwKKwkJCQlob3N0LmVuYWJsZV9lbmNyeXB0LCBWVFlfTkVXTElORSk7CisJfSBlbHNlIHsKKwkJaWYgKGhvc3QucGFzc3dvcmQpCisJCQl2dHlfb3V0KHZ0eSwgInBhc3N3b3JkICVzJXMiLCBob3N0LnBhc3N3b3JkLAorCQkJCVZUWV9ORVdMSU5FKTsKKwkJaWYgKGhvc3QuZW5hYmxlKQorCQkJdnR5X291dCh2dHksICJlbmFibGUgcGFzc3dvcmQgJXMlcyIsIGhvc3QuZW5hYmxlLAorCQkJCVZUWV9ORVdMSU5FKTsKKwl9CisKKyNpZiAwCisJaWYgKHpsb2dfZGVmYXVsdC0+ZGVmYXVsdF9sdmwgIT0gTE9HX0RFQlVHKSB7CisJCXZ0eV9vdXQodnR5LCAiISBOLkIuIFRoZSAnbG9nIHRyYXAnIGNvbW1hbmQgaXMgZGVwcmVjYXRlZC4lcyIsCisJCQlWVFlfTkVXTElORSk7CisJCXZ0eV9vdXQodnR5LCAibG9nIHRyYXAgJXMlcyIsCisJCQl6bG9nX3ByaW9yaXR5W3psb2dfZGVmYXVsdC0+ZGVmYXVsdF9sdmxdLCBWVFlfTkVXTElORSk7CisJfQorCisJaWYgKGhvc3QubG9nZmlsZQorCSAgICAmJiAoemxvZ19kZWZhdWx0LT5tYXhsdmxbWkxPR19ERVNUX0ZJTEVdICE9IFpMT0dfRElTQUJMRUQpKSB7CisJCXZ0eV9vdXQodnR5LCAibG9nIGZpbGUgJXMiLCBob3N0LmxvZ2ZpbGUpOworCQlpZiAoemxvZ19kZWZhdWx0LT5tYXhsdmxbWkxPR19ERVNUX0ZJTEVdICE9CisJCSAgICB6bG9nX2RlZmF1bHQtPmRlZmF1bHRfbHZsKQorCQkJdnR5X291dCh2dHksICIgJXMiLAorCQkJCXpsb2dfcHJpb3JpdHlbemxvZ19kZWZhdWx0LT4KKwkJCQkJICAgICAgbWF4bHZsW1pMT0dfREVTVF9GSUxFXV0pOworCQl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOworCX0KKworCWlmICh6bG9nX2RlZmF1bHQtPm1heGx2bFtaTE9HX0RFU1RfU1RET1VUXSAhPSBaTE9HX0RJU0FCTEVEKSB7CisJCXZ0eV9vdXQodnR5LCAibG9nIHN0ZG91dCIpOworCQlpZiAoemxvZ19kZWZhdWx0LT5tYXhsdmxbWkxPR19ERVNUX1NURE9VVF0gIT0KKwkJICAgIHpsb2dfZGVmYXVsdC0+ZGVmYXVsdF9sdmwpCisJCQl2dHlfb3V0KHZ0eSwgIiAlcyIsCisJCQkJemxvZ19wcmlvcml0eVt6bG9nX2RlZmF1bHQtPgorCQkJCQkgICAgICBtYXhsdmxbWkxPR19ERVNUX1NURE9VVF1dKTsKKwkJdnR5X291dCh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKKwl9CisKKwlpZiAoemxvZ19kZWZhdWx0LT5tYXhsdmxbWkxPR19ERVNUX01PTklUT1JdID09IFpMT0dfRElTQUJMRUQpCisJCXZ0eV9vdXQodnR5LCAibm8gbG9nIG1vbml0b3IlcyIsIFZUWV9ORVdMSU5FKTsKKwllbHNlIGlmICh6bG9nX2RlZmF1bHQtPm1heGx2bFtaTE9HX0RFU1RfTU9OSVRPUl0gIT0KKwkJIHpsb2dfZGVmYXVsdC0+ZGVmYXVsdF9sdmwpCisJCXZ0eV9vdXQodnR5LCAibG9nIG1vbml0b3IgJXMlcyIsCisJCQl6bG9nX3ByaW9yaXR5W3psb2dfZGVmYXVsdC0+bWF4bHZsW1pMT0dfREVTVF9NT05JVE9SXV0sCisJCQlWVFlfTkVXTElORSk7CisKKwlpZiAoemxvZ19kZWZhdWx0LT5tYXhsdmxbWkxPR19ERVNUX1NZU0xPR10gIT0gWkxPR19ESVNBQkxFRCkgeworCQl2dHlfb3V0KHZ0eSwgImxvZyBzeXNsb2ciKTsKKwkJaWYgKHpsb2dfZGVmYXVsdC0+bWF4bHZsW1pMT0dfREVTVF9TWVNMT0ddICE9CisJCSAgICB6bG9nX2RlZmF1bHQtPmRlZmF1bHRfbHZsKQorCQkJdnR5X291dCh2dHksICIgJXMiLAorCQkJCXpsb2dfcHJpb3JpdHlbemxvZ19kZWZhdWx0LT4KKwkJCQkJICAgICAgbWF4bHZsW1pMT0dfREVTVF9TWVNMT0ddXSk7CisJCXZ0eV9vdXQodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7CisJfQorCisJaWYgKHpsb2dfZGVmYXVsdC0+ZmFjaWxpdHkgIT0gTE9HX0RBRU1PTikKKwkJdnR5X291dCh2dHksICJsb2cgZmFjaWxpdHkgJXMlcyIsCisJCQlmYWNpbGl0eV9uYW1lKHpsb2dfZGVmYXVsdC0+ZmFjaWxpdHkpLCBWVFlfTkVXTElORSk7CisKKwlpZiAoemxvZ19kZWZhdWx0LT5yZWNvcmRfcHJpb3JpdHkgPT0gMSkKKwkJdnR5X291dCh2dHksICJsb2cgcmVjb3JkLXByaW9yaXR5JXMiLCBWVFlfTkVXTElORSk7CisjZW5kaWYKKwlpZiAoaG9zdC5hZHZhbmNlZCkKKwkJdnR5X291dCh2dHksICJzZXJ2aWNlIGFkdmFuY2VkLXZ0eSVzIiwgVlRZX05FV0xJTkUpOworCisJaWYgKGhvc3QuZW5jcnlwdCkKKwkJdnR5X291dCh2dHksICJzZXJ2aWNlIHBhc3N3b3JkLWVuY3J5cHRpb24lcyIsIFZUWV9ORVdMSU5FKTsKKworCWlmIChob3N0LmxpbmVzID49IDApCisJCXZ0eV9vdXQodnR5LCAic2VydmljZSB0ZXJtaW5hbC1sZW5ndGggJWQlcyIsIGhvc3QubGluZXMsCisJCQlWVFlfTkVXTElORSk7CisKKwlpZiAoaG9zdC5tb3RkZmlsZSkKKwkJdnR5X291dCh2dHksICJiYW5uZXIgbW90ZCBmaWxlICVzJXMiLCBob3N0Lm1vdGRmaWxlLAorCQkJVlRZX05FV0xJTkUpOworCWVsc2UgaWYgKCFob3N0Lm1vdGQpCisJCXZ0eV9vdXQodnR5LCAibm8gYmFubmVyIG1vdGQlcyIsIFZUWV9ORVdMSU5FKTsKKworCXJldHVybiAxOworfQorCisvKiBVdGlsaXR5IGZ1bmN0aW9uIGZvciBnZXR0aW5nIGNvbW1hbmQgdmVjdG9yLiAqLworc3RhdGljIHZlY3RvciBjbWRfbm9kZV92ZWN0b3IodmVjdG9yIHYsIGVudW0gbm9kZV90eXBlIG50eXBlKQoreworCXN0cnVjdCBjbWRfbm9kZSAqY25vZGUgPSB2ZWN0b3Jfc2xvdCh2LCBudHlwZSk7CisJcmV0dXJuIGNub2RlLT5jbWRfdmVjdG9yOworfQorCisjaWYgMAorLyogRmlsdGVyIGNvbW1hbmQgdmVjdG9yIGJ5IHN5bWJvbC4gIFRoaXMgZnVuY3Rpb24gaXMgbm90IGFjdHVhbGx5IHVzZWQ7CisgKiBzaG91bGQgaXQgYmUgZGVsZXRlZD8gKi8KK3N0YXRpYyBpbnQgY21kX2ZpbHRlcl9ieV9zeW1ib2woY2hhciAqY29tbWFuZCwgY2hhciAqc3ltYm9sKQoreworCWludCBpLCBsaW07CisKKwlpZiAoc3RyY21wKHN5bWJvbCwgIklQVjRfQUREUkVTUyIpID09IDApIHsKKwkJaSA9IDA7CisJCWxpbSA9IHN0cmxlbihjb21tYW5kKTsKKwkJd2hpbGUgKGkgPCBsaW0pIHsKKwkJCWlmICghCisJCQkgICAgKGlzZGlnaXQoKGludCljb21tYW5kW2ldKSB8fCBjb21tYW5kW2ldID09ICcuJworCQkJICAgICB8fCBjb21tYW5kW2ldID09ICcvJykpCisJCQkJcmV0dXJuIDE7CisJCQlpKys7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCWlmIChzdHJjbXAoc3ltYm9sLCAiU1RSSU5HIikgPT0gMCkgeworCQlpID0gMDsKKwkJbGltID0gc3RybGVuKGNvbW1hbmQpOworCQl3aGlsZSAoaSA8IGxpbSkgeworCQkJaWYgKCEKKwkJCSAgICAoaXNhbHBoYSgoaW50KWNvbW1hbmRbaV0pIHx8IGNvbW1hbmRbaV0gPT0gJ18nCisJCQkgICAgIHx8IGNvbW1hbmRbaV0gPT0gJy0nKSkKKwkJCQlyZXR1cm4gMTsKKwkJCWkrKzsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJaWYgKHN0cmNtcChzeW1ib2wsICJJRk5BTUUiKSA9PSAwKSB7CisJCWkgPSAwOworCQlsaW0gPSBzdHJsZW4oY29tbWFuZCk7CisJCXdoaWxlIChpIDwgbGltKSB7CisJCQlpZiAoIWlzYWxudW0oKGludCljb21tYW5kW2ldKSkKKwkJCQlyZXR1cm4gMTsKKwkJCWkrKzsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworLyogQ29tcGxldGlvbiBtYXRjaCB0eXBlcy4gKi8KK2VudW0gbWF0Y2hfdHlwZSB7CisJbm9fbWF0Y2gsCisJZXh0ZW5kX21hdGNoLAorCWlwdjRfcHJlZml4X21hdGNoLAorCWlwdjRfbWF0Y2gsCisJaXB2Nl9wcmVmaXhfbWF0Y2gsCisJaXB2Nl9tYXRjaCwKKwlyYW5nZV9tYXRjaCwKKwl2YXJhcmdfbWF0Y2gsCisJcGFydGx5X21hdGNoLAorCWV4YWN0X21hdGNoCit9OworCitzdGF0aWMgZW51bSBtYXRjaF90eXBlIGNtZF9pcHY0X21hdGNoKGNvbnN0IGNoYXIgKnN0cikKK3sKKwljb25zdCBjaGFyICpzcDsKKwlpbnQgZG90cyA9IDAsIG51bXMgPSAwOworCWNoYXIgYnVmWzRdOworCisJaWYgKHN0ciA9PSBOVUxMKQorCQlyZXR1cm4gcGFydGx5X21hdGNoOworCisJZm9yICg7OykgeworCQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisJCXNwID0gc3RyOworCQl3aGlsZSAoKnN0ciAhPSAnXDAnKSB7CisJCQlpZiAoKnN0ciA9PSAnLicpIHsKKwkJCQlpZiAoZG90cyA+PSAzKQorCQkJCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwkJCQlpZiAoKihzdHIgKyAxKSA9PSAnLicpCisJCQkJCXJldHVybiBub19tYXRjaDsKKworCQkJCWlmICgqKHN0ciArIDEpID09ICdcMCcpCisJCQkJCXJldHVybiBwYXJ0bHlfbWF0Y2g7CisKKwkJCQlkb3RzKys7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoIWlzZGlnaXQoKGludCkqc3RyKSkKKwkJCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwkJCXN0cisrOworCQl9CisKKwkJaWYgKHN0ciAtIHNwID4gMykKKwkJCXJldHVybiBub19tYXRjaDsKKworCQlzdHJuY3B5KGJ1Ziwgc3AsIHN0ciAtIHNwKTsKKwkJaWYgKGF0b2koYnVmKSA+IDI1NSkKKwkJCXJldHVybiBub19tYXRjaDsKKworCQludW1zKys7CisKKwkJaWYgKCpzdHIgPT0gJ1wwJykKKwkJCWJyZWFrOworCisJCXN0cisrOworCX0KKworCWlmIChudW1zIDwgNCkKKwkJcmV0dXJuIHBhcnRseV9tYXRjaDsKKworCXJldHVybiBleGFjdF9tYXRjaDsKK30KKworc3RhdGljIGVudW0gbWF0Y2hfdHlwZSBjbWRfaXB2NF9wcmVmaXhfbWF0Y2goY29uc3QgY2hhciAqc3RyKQoreworCWNvbnN0IGNoYXIgKnNwOworCWludCBkb3RzID0gMDsKKwljaGFyIGJ1Zls0XTsKKworCWlmIChzdHIgPT0gTlVMTCkKKwkJcmV0dXJuIHBhcnRseV9tYXRjaDsKKworCWZvciAoOzspIHsKKwkJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworCQlzcCA9IHN0cjsKKwkJd2hpbGUgKCpzdHIgIT0gJ1wwJyAmJiAqc3RyICE9ICcvJykgeworCQkJaWYgKCpzdHIgPT0gJy4nKSB7CisJCQkJaWYgKGRvdHMgPT0gMykKKwkJCQkJcmV0dXJuIG5vX21hdGNoOworCisJCQkJaWYgKCooc3RyICsgMSkgPT0gJy4nIHx8ICooc3RyICsgMSkgPT0gJy8nKQorCQkJCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwkJCQlpZiAoKihzdHIgKyAxKSA9PSAnXDAnKQorCQkJCQlyZXR1cm4gcGFydGx5X21hdGNoOworCisJCQkJZG90cysrOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoIWlzZGlnaXQoKGludCkqc3RyKSkKKwkJCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwkJCXN0cisrOworCQl9CisKKwkJaWYgKHN0ciAtIHNwID4gMykKKwkJCXJldHVybiBub19tYXRjaDsKKworCQlzdHJuY3B5KGJ1Ziwgc3AsIHN0ciAtIHNwKTsKKwkJaWYgKGF0b2koYnVmKSA+IDI1NSkKKwkJCXJldHVybiBub19tYXRjaDsKKworCQlpZiAoZG90cyA9PSAzKSB7CisJCQlpZiAoKnN0ciA9PSAnLycpIHsKKwkJCQlpZiAoKihzdHIgKyAxKSA9PSAnXDAnKQorCQkJCQlyZXR1cm4gcGFydGx5X21hdGNoOworCisJCQkJc3RyKys7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYgKCpzdHIgPT0gJ1wwJykKKwkJCQlyZXR1cm4gcGFydGx5X21hdGNoOworCQl9CisKKwkJaWYgKCpzdHIgPT0gJ1wwJykKKwkJCXJldHVybiBwYXJ0bHlfbWF0Y2g7CisKKwkJc3RyKys7CisJfQorCisJc3AgPSBzdHI7CisJd2hpbGUgKCpzdHIgIT0gJ1wwJykgeworCQlpZiAoIWlzZGlnaXQoKGludCkqc3RyKSkKKwkJCXJldHVybiBub19tYXRjaDsKKworCQlzdHIrKzsKKwl9CisKKwlpZiAoYXRvaShzcCkgPiAzMikKKwkJcmV0dXJuIG5vX21hdGNoOworCisJcmV0dXJuIGV4YWN0X21hdGNoOworfQorCisjZGVmaW5lIElQVjZfQUREUl9TVFIJCSIwMTIzNDU2Nzg5YWJjZGVmQUJDREVGOi4lIgorI2RlZmluZSBJUFY2X1BSRUZJWF9TVFIJCSIwMTIzNDU2Nzg5YWJjZGVmQUJDREVGOi4lLyIKKyNkZWZpbmUgU1RBVEVfU1RBUlQJCTEKKyNkZWZpbmUgU1RBVEVfQ09MT04JCTIKKyNkZWZpbmUgU1RBVEVfRE9VQkxFCQkzCisjZGVmaW5lIFNUQVRFX0FERFIJCTQKKyNkZWZpbmUgU1RBVEVfRE9UICAgICAgICAgICAgICAgNQorI2RlZmluZSBTVEFURV9TTEFTSAkJNgorI2RlZmluZSBTVEFURV9NQVNLCQk3CisKKyNpZmRlZiBIQVZFX0lQVjYKKworc3RhdGljIGVudW0gbWF0Y2hfdHlwZSBjbWRfaXB2Nl9tYXRjaChjb25zdCBjaGFyICpzdHIpCit7CisJaW50IHN0YXRlID0gU1RBVEVfU1RBUlQ7CisJaW50IGNvbG9ucyA9IDAsIG51bXMgPSAwLCBkb3VibGVfY29sb24gPSAwOworCWNvbnN0IGNoYXIgKnNwID0gTlVMTDsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42IHNpbjZfZHVtbXk7CisJaW50IHJldDsKKworCWlmIChzdHIgPT0gTlVMTCkKKwkJcmV0dXJuIHBhcnRseV9tYXRjaDsKKworCWlmIChzdHJzcG4oc3RyLCBJUFY2X0FERFJfU1RSKSAhPSBzdHJsZW4oc3RyKSkKKwkJcmV0dXJuIG5vX21hdGNoOworCisJLyogdXNlIGluZXRfcHRvbiB0aGF0IGhhcyBhIGJldHRlciBzdXBwb3J0LAorCSAqIGZvciBleGFtcGxlIGluZXRfcHRvbiBjYW4gc3VwcG9ydCB0aGUgYXV0b21hdGljIGFkZHJlc3NlczoKKwkgKiAgOjoxLjIuMy40CisJICovCisJcmV0ID0gaW5ldF9wdG9uKEFGX0lORVQ2LCBzdHIsICZzaW42X2R1bW15LnNpbjZfYWRkcik7CisKKwlpZiAocmV0ID09IDEpCisJCXJldHVybiBleGFjdF9tYXRjaDsKKworCXdoaWxlICgqc3RyICE9ICdcMCcpIHsKKwkJc3dpdGNoIChzdGF0ZSkgeworCQljYXNlIFNUQVRFX1NUQVJUOgorCQkJaWYgKCpzdHIgPT0gJzonKSB7CisJCQkJaWYgKCooc3RyICsgMSkgIT0gJzonICYmICooc3RyICsgMSkgIT0gJ1wwJykKKwkJCQkJcmV0dXJuIG5vX21hdGNoOworCQkJCWNvbG9ucy0tOworCQkJCXN0YXRlID0gU1RBVEVfQ09MT047CisJCQl9IGVsc2UgeworCQkJCXNwID0gc3RyOworCQkJCXN0YXRlID0gU1RBVEVfQUREUjsKKwkJCX0KKworCQkJY29udGludWU7CisJCWNhc2UgU1RBVEVfQ09MT046CisJCQljb2xvbnMrKzsKKwkJCWlmICgqKHN0ciArIDEpID09ICc6JykKKwkJCQlzdGF0ZSA9IFNUQVRFX0RPVUJMRTsKKwkJCWVsc2UgeworCQkJCXNwID0gc3RyICsgMTsKKwkJCQlzdGF0ZSA9IFNUQVRFX0FERFI7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBTVEFURV9ET1VCTEU6CisJCQlpZiAoZG91YmxlX2NvbG9uKQorCQkJCXJldHVybiBub19tYXRjaDsKKworCQkJaWYgKCooc3RyICsgMSkgPT0gJzonKQorCQkJCXJldHVybiBub19tYXRjaDsKKwkJCWVsc2UgeworCQkJCWlmICgqKHN0ciArIDEpICE9ICdcMCcpCisJCQkJCWNvbG9ucysrOworCQkJCXNwID0gc3RyICsgMTsKKwkJCQlzdGF0ZSA9IFNUQVRFX0FERFI7CisJCQl9CisKKwkJCWRvdWJsZV9jb2xvbisrOworCQkJbnVtcysrOworCQkJYnJlYWs7CisJCWNhc2UgU1RBVEVfQUREUjoKKwkJCWlmICgqKHN0ciArIDEpID09ICc6JyB8fCAqKHN0ciArIDEpID09ICdcMCcpIHsKKwkJCQlpZiAoc3RyIC0gc3AgPiAzKQorCQkJCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwkJCQludW1zKys7CisJCQkJc3RhdGUgPSBTVEFURV9DT0xPTjsKKwkJCX0KKwkJCWlmICgqKHN0ciArIDEpID09ICcuJykKKwkJCQlzdGF0ZSA9IFNUQVRFX0RPVDsKKwkJCWJyZWFrOworCQljYXNlIFNUQVRFX0RPVDoKKwkJCXN0YXRlID0gU1RBVEVfQUREUjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKworCQlpZiAobnVtcyA+IDgpCisJCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwkJaWYgKGNvbG9ucyA+IDcpCisJCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwkJc3RyKys7CisJfQorCisjaWYgMAorCWlmIChudW1zIDwgMTEpCisJCXJldHVybiBwYXJ0bHlfbWF0Y2g7CisjZW5kaWYJCQkJLyogMCAqLworCisJcmV0dXJuIGV4YWN0X21hdGNoOworfQorCitzdGF0aWMgZW51bSBtYXRjaF90eXBlIGNtZF9pcHY2X3ByZWZpeF9tYXRjaChjb25zdCBjaGFyICpzdHIpCit7CisJaW50IHN0YXRlID0gU1RBVEVfU1RBUlQ7CisJaW50IGNvbG9ucyA9IDAsIG51bXMgPSAwLCBkb3VibGVfY29sb24gPSAwOworCWludCBtYXNrOworCWNvbnN0IGNoYXIgKnNwID0gTlVMTDsKKwljaGFyICplbmRwdHIgPSBOVUxMOworCisJaWYgKHN0ciA9PSBOVUxMKQorCQlyZXR1cm4gcGFydGx5X21hdGNoOworCisJaWYgKHN0cnNwbihzdHIsIElQVjZfUFJFRklYX1NUUikgIT0gc3RybGVuKHN0cikpCisJCXJldHVybiBub19tYXRjaDsKKworCXdoaWxlICgqc3RyICE9ICdcMCcgJiYgc3RhdGUgIT0gU1RBVEVfTUFTSykgeworCQlzd2l0Y2ggKHN0YXRlKSB7CisJCWNhc2UgU1RBVEVfU1RBUlQ6CisJCQlpZiAoKnN0ciA9PSAnOicpIHsKKwkJCQlpZiAoKihzdHIgKyAxKSAhPSAnOicgJiYgKihzdHIgKyAxKSAhPSAnXDAnKQorCQkJCQlyZXR1cm4gbm9fbWF0Y2g7CisJCQkJY29sb25zLS07CisJCQkJc3RhdGUgPSBTVEFURV9DT0xPTjsKKwkJCX0gZWxzZSB7CisJCQkJc3AgPSBzdHI7CisJCQkJc3RhdGUgPSBTVEFURV9BRERSOworCQkJfQorCisJCQljb250aW51ZTsKKwkJY2FzZSBTVEFURV9DT0xPTjoKKwkJCWNvbG9ucysrOworCQkJaWYgKCooc3RyICsgMSkgPT0gJy8nKQorCQkJCXJldHVybiBub19tYXRjaDsKKwkJCWVsc2UgaWYgKCooc3RyICsgMSkgPT0gJzonKQorCQkJCXN0YXRlID0gU1RBVEVfRE9VQkxFOworCQkJZWxzZSB7CisJCQkJc3AgPSBzdHIgKyAxOworCQkJCXN0YXRlID0gU1RBVEVfQUREUjsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFNUQVRFX0RPVUJMRToKKwkJCWlmIChkb3VibGVfY29sb24pCisJCQkJcmV0dXJuIG5vX21hdGNoOworCisJCQlpZiAoKihzdHIgKyAxKSA9PSAnOicpCisJCQkJcmV0dXJuIG5vX21hdGNoOworCQkJZWxzZSB7CisJCQkJaWYgKCooc3RyICsgMSkgIT0gJ1wwJyAmJiAqKHN0ciArIDEpICE9ICcvJykKKwkJCQkJY29sb25zKys7CisJCQkJc3AgPSBzdHIgKyAxOworCisJCQkJaWYgKCooc3RyICsgMSkgPT0gJy8nKQorCQkJCQlzdGF0ZSA9IFNUQVRFX1NMQVNIOworCQkJCWVsc2UKKwkJCQkJc3RhdGUgPSBTVEFURV9BRERSOworCQkJfQorCisJCQlkb3VibGVfY29sb24rKzsKKwkJCW51bXMgKz0gMTsKKwkJCWJyZWFrOworCQljYXNlIFNUQVRFX0FERFI6CisJCQlpZiAoKihzdHIgKyAxKSA9PSAnOicgfHwgKihzdHIgKyAxKSA9PSAnLicKKwkJCSAgICB8fCAqKHN0ciArIDEpID09ICdcMCcgfHwgKihzdHIgKyAxKSA9PSAnLycpIHsKKwkJCQlpZiAoc3RyIC0gc3AgPiAzKQorCQkJCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwkJCQlmb3IgKDsgc3AgPD0gc3RyOyBzcCsrKQorCQkJCQlpZiAoKnNwID09ICcvJykKKwkJCQkJCXJldHVybiBub19tYXRjaDsKKworCQkJCW51bXMrKzsKKworCQkJCWlmICgqKHN0ciArIDEpID09ICc6JykKKwkJCQkJc3RhdGUgPSBTVEFURV9DT0xPTjsKKwkJCQllbHNlIGlmICgqKHN0ciArIDEpID09ICcuJykKKwkJCQkJc3RhdGUgPSBTVEFURV9ET1Q7CisJCQkJZWxzZSBpZiAoKihzdHIgKyAxKSA9PSAnLycpCisJCQkJCXN0YXRlID0gU1RBVEVfU0xBU0g7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBTVEFURV9ET1Q6CisJCQlzdGF0ZSA9IFNUQVRFX0FERFI7CisJCQlicmVhazsKKwkJY2FzZSBTVEFURV9TTEFTSDoKKwkJCWlmICgqKHN0ciArIDEpID09ICdcMCcpCisJCQkJcmV0dXJuIHBhcnRseV9tYXRjaDsKKworCQkJc3RhdGUgPSBTVEFURV9NQVNLOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCisJCWlmIChudW1zID4gMTEpCisJCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwkJaWYgKGNvbG9ucyA+IDcpCisJCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwkJc3RyKys7CisJfQorCisJaWYgKHN0YXRlIDwgU1RBVEVfTUFTSykKKwkJcmV0dXJuIHBhcnRseV9tYXRjaDsKKworCW1hc2sgPSBzdHJ0b2woc3RyLCAmZW5kcHRyLCAxMCk7CisJaWYgKCplbmRwdHIgIT0gJ1wwJykKKwkJcmV0dXJuIG5vX21hdGNoOworCisJaWYgKG1hc2sgPCAwIHx8IG1hc2sgPiAxMjgpCisJCXJldHVybiBub19tYXRjaDsKKworLyogSSBkb24ndCBrbm93IHdoeSBtYXNrIDwgMTMgbWFrZXMgY29tbWFuZCBtYXRjaCBwYXJ0bHkuCisgICBGb3JnaXZlIG1lIHRvIG1ha2UgdGhpcyBjb21tZW50cy4gSSBXYW50IHRvIHNldCBzdGF0aWMgZGVmYXVsdCByb3V0ZQorICAgYmVjYXVzZSBvZiBsYWNrIG9mIGZ1bmN0aW9uIHRvIG9yaWdpbmF0ZSBkZWZhdWx0IGluIG9zcGY2ZDsgc29ycnkKKyAgICAgICB5YXN1CisgIGlmIChtYXNrIDwgMTMpCisgICAgcmV0dXJuIHBhcnRseV9tYXRjaDsKKyovCisKKwlyZXR1cm4gZXhhY3RfbWF0Y2g7Cit9CisKKyNlbmRpZgkJCQkvKiBIQVZFX0lQVjYgICovCisKKyNkZWZpbmUgREVDSU1BTF9TVFJMRU5fTUFYIDEwCisKK3N0YXRpYyBpbnQgY21kX3JhbmdlX21hdGNoKGNvbnN0IGNoYXIgKnJhbmdlLCBjb25zdCBjaGFyICpzdHIpCit7CisJY2hhciAqcDsKKwljaGFyIGJ1ZltERUNJTUFMX1NUUkxFTl9NQVggKyAxXTsKKwljaGFyICplbmRwdHIgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgbWluLCBtYXgsIHZhbDsKKworCWlmIChzdHIgPT0gTlVMTCkKKwkJcmV0dXJuIDE7CisKKwl2YWwgPSBzdHJ0b3VsKHN0ciwgJmVuZHB0ciwgMTApOworCWlmICgqZW5kcHRyICE9ICdcMCcpCisJCXJldHVybiAwOworCisJcmFuZ2UrKzsKKwlwID0gc3RyY2hyKHJhbmdlLCAnLScpOworCWlmIChwID09IE5VTEwpCisJCXJldHVybiAwOworCWlmIChwIC0gcmFuZ2UgPiBERUNJTUFMX1NUUkxFTl9NQVgpCisJCXJldHVybiAwOworCXN0cm5jcHkoYnVmLCByYW5nZSwgcCAtIHJhbmdlKTsKKwlidWZbcCAtIHJhbmdlXSA9ICdcMCc7CisJbWluID0gc3RydG91bChidWYsICZlbmRwdHIsIDEwKTsKKwlpZiAoKmVuZHB0ciAhPSAnXDAnKQorCQlyZXR1cm4gMDsKKworCXJhbmdlID0gcCArIDE7CisJcCA9IHN0cmNocihyYW5nZSwgJz4nKTsKKwlpZiAocCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlpZiAocCAtIHJhbmdlID4gREVDSU1BTF9TVFJMRU5fTUFYKQorCQlyZXR1cm4gMDsKKwlzdHJuY3B5KGJ1ZiwgcmFuZ2UsIHAgLSByYW5nZSk7CisJYnVmW3AgLSByYW5nZV0gPSAnXDAnOworCW1heCA9IHN0cnRvdWwoYnVmLCAmZW5kcHRyLCAxMCk7CisJaWYgKCplbmRwdHIgIT0gJ1wwJykKKwkJcmV0dXJuIDA7CisKKwlpZiAodmFsIDwgbWluIHx8IHZhbCA+IG1heCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworLyogTWFrZSBjb21wbGV0aW9uIG1hdGNoIGFuZCByZXR1cm4gbWF0Y2ggdHlwZSBmbGFnLiAqLworc3RhdGljIGVudW0gbWF0Y2hfdHlwZQorY21kX2ZpbHRlcl9ieV9jb21wbGV0aW9uKGNoYXIgKmNvbW1hbmQsIHZlY3RvciB2LCB1bnNpZ25lZCBpbnQgaW5kZXgpCit7CisJdW5zaWduZWQgaW50IGk7CisJY29uc3QgY2hhciAqc3RyOworCXN0cnVjdCBjbWRfZWxlbWVudCAqY21kX2VsZW1lbnQ7CisJZW51bSBtYXRjaF90eXBlIG1hdGNoX3R5cGU7CisJdmVjdG9yIGRlc2N2ZWM7CisJc3RydWN0IGRlc2MgKmRlc2M7CisKKwltYXRjaF90eXBlID0gbm9fbWF0Y2g7CisKKwkvKiBJZiBjb21tYW5kIGFuZCBjbWRfZWxlbWVudCBzdHJpbmcgZG9lcyBub3QgbWF0Y2ggc2V0IE5VTEwgdG8gdmVjdG9yICovCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUodik7IGkrKykKKwkJaWYgKChjbWRfZWxlbWVudCA9IHZlY3Rvcl9zbG90KHYsIGkpKSAhPSBOVUxMKSB7CisJCQlpZiAoaW5kZXggPj0gdmVjdG9yX2FjdGl2ZShjbWRfZWxlbWVudC0+c3RydmVjKSkKKwkJCQl2ZWN0b3Jfc2xvdCh2LCBpKSA9IE5VTEw7CisJCQllbHNlIHsKKwkJCQl1bnNpZ25lZCBpbnQgajsKKwkJCQlpbnQgbWF0Y2hlZCA9IDA7CisKKwkJCQlkZXNjdmVjID0KKwkJCQkgICAgdmVjdG9yX3Nsb3QoY21kX2VsZW1lbnQtPnN0cnZlYywgaW5kZXgpOworCisJCQkJZm9yIChqID0gMDsgaiA8IHZlY3Rvcl9hY3RpdmUoZGVzY3ZlYyk7IGorKykKKwkJCQkJaWYgKChkZXNjID0gdmVjdG9yX3Nsb3QoZGVzY3ZlYywgaikpKSB7CisJCQkJCQlzdHIgPSBkZXNjLT5jbWQ7CisKKwkJCQkJCWlmIChDTURfVkFSQVJHKHN0cikpIHsKKwkJCQkJCQlpZiAobWF0Y2hfdHlwZSA8CisJCQkJCQkJICAgIHZhcmFyZ19tYXRjaCkKKwkJCQkJCQkJbWF0Y2hfdHlwZSA9CisJCQkJCQkJCSAgICB2YXJhcmdfbWF0Y2g7CisJCQkJCQkJbWF0Y2hlZCsrOworCQkJCQkJfSBlbHNlIGlmIChDTURfUkFOR0Uoc3RyKSkgeworCQkJCQkJCWlmIChjbWRfcmFuZ2VfbWF0Y2gKKwkJCQkJCQkgICAgKHN0ciwgY29tbWFuZCkpIHsKKwkJCQkJCQkJaWYgKG1hdGNoX3R5cGUgPAorCQkJCQkJCQkgICAgcmFuZ2VfbWF0Y2gpCisJCQkJCQkJCQltYXRjaF90eXBlCisJCQkJCQkJCQkgICAgPQorCQkJCQkJCQkJICAgIHJhbmdlX21hdGNoOworCisJCQkJCQkJCW1hdGNoZWQrKzsKKwkJCQkJCQl9CisJCQkJCQl9CisjaWZkZWYgSEFWRV9JUFY2CisJCQkJCQllbHNlIGlmIChDTURfSVBWNihzdHIpKSB7CisJCQkJCQkJaWYgKGNtZF9pcHY2X21hdGNoCisJCQkJCQkJICAgIChjb21tYW5kKSkgeworCQkJCQkJCQlpZiAobWF0Y2hfdHlwZSA8CisJCQkJCQkJCSAgICBpcHY2X21hdGNoKQorCQkJCQkJCQkJbWF0Y2hfdHlwZQorCQkJCQkJCQkJICAgID0KKwkJCQkJCQkJCSAgICBpcHY2X21hdGNoOworCisJCQkJCQkJCW1hdGNoZWQrKzsKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgaWYgKENNRF9JUFY2X1BSRUZJWChzdHIpKSB7CisJCQkJCQkJaWYgKGNtZF9pcHY2X3ByZWZpeF9tYXRjaChjb21tYW5kKSkgeworCQkJCQkJCQlpZiAobWF0Y2hfdHlwZSA8CisJCQkJCQkJCSAgICBpcHY2X3ByZWZpeF9tYXRjaCkKKwkJCQkJCQkJCW1hdGNoX3R5cGUKKwkJCQkJCQkJCSAgICA9CisJCQkJCQkJCQkgICAgaXB2Nl9wcmVmaXhfbWF0Y2g7CisKKwkJCQkJCQkJbWF0Y2hlZCsrOworCQkJCQkJCX0KKwkJCQkJCX0KKyNlbmRpZgkJCQkvKiBIQVZFX0lQVjYgICovCisJCQkJCQllbHNlIGlmIChDTURfSVBWNChzdHIpKSB7CisJCQkJCQkJaWYgKGNtZF9pcHY0X21hdGNoCisJCQkJCQkJICAgIChjb21tYW5kKSkgeworCQkJCQkJCQlpZiAobWF0Y2hfdHlwZSA8CisJCQkJCQkJCSAgICBpcHY0X21hdGNoKQorCQkJCQkJCQkJbWF0Y2hfdHlwZQorCQkJCQkJCQkJICAgID0KKwkJCQkJCQkJCSAgICBpcHY0X21hdGNoOworCisJCQkJCQkJCW1hdGNoZWQrKzsKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgaWYgKENNRF9JUFY0X1BSRUZJWChzdHIpKSB7CisJCQkJCQkJaWYgKGNtZF9pcHY0X3ByZWZpeF9tYXRjaChjb21tYW5kKSkgeworCQkJCQkJCQlpZiAobWF0Y2hfdHlwZSA8CisJCQkJCQkJCSAgICBpcHY0X3ByZWZpeF9tYXRjaCkKKwkJCQkJCQkJCW1hdGNoX3R5cGUKKwkJCQkJCQkJCSAgICA9CisJCQkJCQkJCQkgICAgaXB2NF9wcmVmaXhfbWF0Y2g7CisJCQkJCQkJCW1hdGNoZWQrKzsKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UKKwkJCQkJCQkvKiBDaGVjayBpcyB0aGlzIHBvaW50J3MgYXJndW1lbnQgb3B0aW9uYWwgPyAqLworCQkJCQkJaWYgKENNRF9PUFRJT04oc3RyKQorCQkJCQkJCSAgICB8fAorCQkJCQkJCSAgICBDTURfVkFSSUFCTEUoc3RyKSkgeworCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKKwkJCQkJCQkgICAgZXh0ZW5kX21hdGNoKQorCQkJCQkJCQltYXRjaF90eXBlID0KKwkJCQkJCQkJICAgIGV4dGVuZF9tYXRjaDsKKwkJCQkJCQltYXRjaGVkKys7CisJCQkJCQl9IGVsc2UKKwkJCQkJCSAgICBpZiAoc3RybmNtcAorCQkJCQkJCShjb21tYW5kLCBzdHIsCisJCQkJCQkJIHN0cmxlbihjb21tYW5kKSkgPT0KKwkJCQkJCQkwKSB7CisJCQkJCQkJaWYgKHN0cmNtcChjb21tYW5kLCBzdHIpCisJCQkJCQkJICAgID09IDApCisJCQkJCQkJCW1hdGNoX3R5cGUgPQorCQkJCQkJCQkgICAgZXhhY3RfbWF0Y2g7CisJCQkJCQkJZWxzZSB7CisJCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKKwkJCQkJCQkJICAgIHBhcnRseV9tYXRjaCkKKwkJCQkJCQkJCW1hdGNoX3R5cGUKKwkJCQkJCQkJCSAgICA9CisJCQkJCQkJCQkgICAgcGFydGx5X21hdGNoOworCQkJCQkJCX0KKwkJCQkJCQltYXRjaGVkKys7CisJCQkJCQl9CisJCQkJCX0KKwkJCQlpZiAoIW1hdGNoZWQpCisJCQkJCXZlY3Rvcl9zbG90KHYsIGkpID0gTlVMTDsKKwkJCX0KKwkJfQorCXJldHVybiBtYXRjaF90eXBlOworfQorCisvKiBGaWx0ZXIgdmVjdG9yIGJ5IGNvbW1hbmQgY2hhcmFjdGVyIHdpdGggaW5kZXguICovCitzdGF0aWMgZW51bSBtYXRjaF90eXBlCitjbWRfZmlsdGVyX2J5X3N0cmluZyhjaGFyICpjb21tYW5kLCB2ZWN0b3IgdiwgdW5zaWduZWQgaW50IGluZGV4KQoreworCXVuc2lnbmVkIGludCBpOworCWNvbnN0IGNoYXIgKnN0cjsKKwlzdHJ1Y3QgY21kX2VsZW1lbnQgKmNtZF9lbGVtZW50OworCWVudW0gbWF0Y2hfdHlwZSBtYXRjaF90eXBlOworCXZlY3RvciBkZXNjdmVjOworCXN0cnVjdCBkZXNjICpkZXNjOworCisJbWF0Y2hfdHlwZSA9IG5vX21hdGNoOworCisJLyogSWYgY29tbWFuZCBhbmQgY21kX2VsZW1lbnQgc3RyaW5nIGRvZXMgbm90IG1hdGNoIHNldCBOVUxMIHRvIHZlY3RvciAqLworCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKHYpOyBpKyspCisJCWlmICgoY21kX2VsZW1lbnQgPSB2ZWN0b3Jfc2xvdCh2LCBpKSkgIT0gTlVMTCkgeworCQkJLyogSWYgZ2l2ZW4gaW5kZXggaXMgYmlnZ2VyIHRoYW4gbWF4IHN0cmluZyB2ZWN0b3Igb2YgY29tbWFuZCwKKwkJCSAgIHNldCBOVUxMICovCisJCQlpZiAoaW5kZXggPj0gdmVjdG9yX2FjdGl2ZShjbWRfZWxlbWVudC0+c3RydmVjKSkKKwkJCQl2ZWN0b3Jfc2xvdCh2LCBpKSA9IE5VTEw7CisJCQllbHNlIHsKKwkJCQl1bnNpZ25lZCBpbnQgajsKKwkJCQlpbnQgbWF0Y2hlZCA9IDA7CisKKwkJCQlkZXNjdmVjID0KKwkJCQkgICAgdmVjdG9yX3Nsb3QoY21kX2VsZW1lbnQtPnN0cnZlYywgaW5kZXgpOworCisJCQkJZm9yIChqID0gMDsgaiA8IHZlY3Rvcl9hY3RpdmUoZGVzY3ZlYyk7IGorKykKKwkJCQkJaWYgKChkZXNjID0gdmVjdG9yX3Nsb3QoZGVzY3ZlYywgaikpKSB7CisJCQkJCQlzdHIgPSBkZXNjLT5jbWQ7CisKKwkJCQkJCWlmIChDTURfVkFSQVJHKHN0cikpIHsKKwkJCQkJCQlpZiAobWF0Y2hfdHlwZSA8CisJCQkJCQkJICAgIHZhcmFyZ19tYXRjaCkKKwkJCQkJCQkJbWF0Y2hfdHlwZSA9CisJCQkJCQkJCSAgICB2YXJhcmdfbWF0Y2g7CisJCQkJCQkJbWF0Y2hlZCsrOworCQkJCQkJfSBlbHNlIGlmIChDTURfUkFOR0Uoc3RyKSkgeworCQkJCQkJCWlmIChjbWRfcmFuZ2VfbWF0Y2gKKwkJCQkJCQkgICAgKHN0ciwgY29tbWFuZCkpIHsKKwkJCQkJCQkJaWYgKG1hdGNoX3R5cGUgPAorCQkJCQkJCQkgICAgcmFuZ2VfbWF0Y2gpCisJCQkJCQkJCQltYXRjaF90eXBlCisJCQkJCQkJCQkgICAgPQorCQkJCQkJCQkJICAgIHJhbmdlX21hdGNoOworCQkJCQkJCQltYXRjaGVkKys7CisJCQkJCQkJfQorCQkJCQkJfQorI2lmZGVmIEhBVkVfSVBWNgorCQkJCQkJZWxzZSBpZiAoQ01EX0lQVjYoc3RyKSkgeworCQkJCQkJCWlmIChjbWRfaXB2Nl9tYXRjaAorCQkJCQkJCSAgICAoY29tbWFuZCkgPT0KKwkJCQkJCQkgICAgZXhhY3RfbWF0Y2gpIHsKKwkJCQkJCQkJaWYgKG1hdGNoX3R5cGUgPAorCQkJCQkJCQkgICAgaXB2Nl9tYXRjaCkKKwkJCQkJCQkJCW1hdGNoX3R5cGUKKwkJCQkJCQkJCSAgICA9CisJCQkJCQkJCQkgICAgaXB2Nl9tYXRjaDsKKwkJCQkJCQkJbWF0Y2hlZCsrOworCQkJCQkJCX0KKwkJCQkJCX0gZWxzZSBpZiAoQ01EX0lQVjZfUFJFRklYKHN0cikpIHsKKwkJCQkJCQlpZiAoY21kX2lwdjZfcHJlZml4X21hdGNoKGNvbW1hbmQpID09IGV4YWN0X21hdGNoKSB7CisJCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKKwkJCQkJCQkJICAgIGlwdjZfcHJlZml4X21hdGNoKQorCQkJCQkJCQkJbWF0Y2hfdHlwZQorCQkJCQkJCQkJICAgID0KKwkJCQkJCQkJCSAgICBpcHY2X3ByZWZpeF9tYXRjaDsKKwkJCQkJCQkJbWF0Y2hlZCsrOworCQkJCQkJCX0KKwkJCQkJCX0KKyNlbmRpZgkJCQkvKiBIQVZFX0lQVjYgICovCisJCQkJCQllbHNlIGlmIChDTURfSVBWNChzdHIpKSB7CisJCQkJCQkJaWYgKGNtZF9pcHY0X21hdGNoCisJCQkJCQkJICAgIChjb21tYW5kKSA9PQorCQkJCQkJCSAgICBleGFjdF9tYXRjaCkgeworCQkJCQkJCQlpZiAobWF0Y2hfdHlwZSA8CisJCQkJCQkJCSAgICBpcHY0X21hdGNoKQorCQkJCQkJCQkJbWF0Y2hfdHlwZQorCQkJCQkJCQkJICAgID0KKwkJCQkJCQkJCSAgICBpcHY0X21hdGNoOworCQkJCQkJCQltYXRjaGVkKys7CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIGlmIChDTURfSVBWNF9QUkVGSVgoc3RyKSkgeworCQkJCQkJCWlmIChjbWRfaXB2NF9wcmVmaXhfbWF0Y2goY29tbWFuZCkgPT0gZXhhY3RfbWF0Y2gpIHsKKwkJCQkJCQkJaWYgKG1hdGNoX3R5cGUgPAorCQkJCQkJCQkgICAgaXB2NF9wcmVmaXhfbWF0Y2gpCisJCQkJCQkJCQltYXRjaF90eXBlCisJCQkJCQkJCQkgICAgPQorCQkJCQkJCQkJICAgIGlwdjRfcHJlZml4X21hdGNoOworCQkJCQkJCQltYXRjaGVkKys7CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIGlmIChDTURfT1BUSU9OKHN0cikKKwkJCQkJCQkgICB8fCBDTURfVkFSSUFCTEUoc3RyKSkKKwkJCQkJCXsKKwkJCQkJCQlpZiAobWF0Y2hfdHlwZSA8CisJCQkJCQkJICAgIGV4dGVuZF9tYXRjaCkKKwkJCQkJCQkJbWF0Y2hfdHlwZSA9CisJCQkJCQkJCSAgICBleHRlbmRfbWF0Y2g7CisJCQkJCQkJbWF0Y2hlZCsrOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlpZiAoc3RyY21wKGNvbW1hbmQsIHN0cikKKwkJCQkJCQkgICAgPT0gMCkgeworCQkJCQkJCQltYXRjaF90eXBlID0KKwkJCQkJCQkJICAgIGV4YWN0X21hdGNoOworCQkJCQkJCQltYXRjaGVkKys7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJaWYgKCFtYXRjaGVkKQorCQkJCQl2ZWN0b3Jfc2xvdCh2LCBpKSA9IE5VTEw7CisJCQl9CisJCX0KKwlyZXR1cm4gbWF0Y2hfdHlwZTsKK30KKworLyogQ2hlY2sgYW1iaWd1b3VzIG1hdGNoICovCitzdGF0aWMgaW50Citpc19jbWRfYW1iaWd1b3VzKGNoYXIgKmNvbW1hbmQsIHZlY3RvciB2LCBpbnQgaW5kZXgsIGVudW0gbWF0Y2hfdHlwZSB0eXBlKQoreworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGludCBqOworCWNvbnN0IGNoYXIgKnN0ciA9IE5VTEw7CisJc3RydWN0IGNtZF9lbGVtZW50ICpjbWRfZWxlbWVudDsKKwljb25zdCBjaGFyICptYXRjaGVkID0gTlVMTDsKKwl2ZWN0b3IgZGVzY3ZlYzsKKwlzdHJ1Y3QgZGVzYyAqZGVzYzsKKworCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKHYpOyBpKyspCisJCWlmICgoY21kX2VsZW1lbnQgPSB2ZWN0b3Jfc2xvdCh2LCBpKSkgIT0gTlVMTCkgeworCQkJaW50IG1hdGNoID0gMDsKKworCQkJZGVzY3ZlYyA9IHZlY3Rvcl9zbG90KGNtZF9lbGVtZW50LT5zdHJ2ZWMsIGluZGV4KTsKKworCQkJZm9yIChqID0gMDsgaiA8IHZlY3Rvcl9hY3RpdmUoZGVzY3ZlYyk7IGorKykKKwkJCQlpZiAoKGRlc2MgPSB2ZWN0b3Jfc2xvdChkZXNjdmVjLCBqKSkpIHsKKwkJCQkJZW51bSBtYXRjaF90eXBlIHJldDsKKworCQkJCQlzdHIgPSBkZXNjLT5jbWQ7CisKKwkJCQkJc3dpdGNoICh0eXBlKSB7CisJCQkJCWNhc2UgZXhhY3RfbWF0Y2g6CisJCQkJCQlpZiAoIQorCQkJCQkJICAgIChDTURfT1BUSU9OKHN0cikKKwkJCQkJCSAgICAgfHwgQ01EX1ZBUklBQkxFKHN0cikpCismJiBzdHJjbXAoY29tbWFuZCwgc3RyKSA9PSAwKQorCQkJCQkJCW1hdGNoKys7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBwYXJ0bHlfbWF0Y2g6CisJCQkJCQlpZiAoIQorCQkJCQkJICAgIChDTURfT1BUSU9OKHN0cikKKwkJCQkJCSAgICAgfHwgQ01EX1ZBUklBQkxFKHN0cikpCismJiBzdHJuY21wKGNvbW1hbmQsIHN0ciwgc3RybGVuKGNvbW1hbmQpKSA9PSAwKSB7CisJCQkJCQkJaWYgKG1hdGNoZWQKKwkJCQkJCQkgICAgJiYgc3RyY21wKG1hdGNoZWQsCisJCQkJCQkJCSAgICAgIHN0cikgIT0gMCkKKwkJCQkJCQkJcmV0dXJuIDE7CS8qIFRoZXJlIGlzIGFtYmlndW91cyBtYXRjaC4gKi8KKwkJCQkJCQllbHNlCisJCQkJCQkJCW1hdGNoZWQgPSBzdHI7CisJCQkJCQkJbWF0Y2grKzsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIHJhbmdlX21hdGNoOgorCQkJCQkJaWYgKGNtZF9yYW5nZV9tYXRjaAorCQkJCQkJICAgIChzdHIsIGNvbW1hbmQpKSB7CisJCQkJCQkJaWYgKG1hdGNoZWQKKwkJCQkJCQkgICAgJiYgc3RyY21wKG1hdGNoZWQsCisJCQkJCQkJCSAgICAgIHN0cikgIT0gMCkKKwkJCQkJCQkJcmV0dXJuIDE7CisJCQkJCQkJZWxzZQorCQkJCQkJCQltYXRjaGVkID0gc3RyOworCQkJCQkJCW1hdGNoKys7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKyNpZmRlZiBIQVZFX0lQVjYKKwkJCQkJY2FzZSBpcHY2X21hdGNoOgorCQkJCQkJaWYgKENNRF9JUFY2KHN0cikpCisJCQkJCQkJbWF0Y2grKzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIGlwdjZfcHJlZml4X21hdGNoOgorCQkJCQkJaWYgKChyZXQgPQorCQkJCQkJICAgICBjbWRfaXB2Nl9wcmVmaXhfbWF0Y2gKKwkJCQkJCSAgICAgKGNvbW1hbmQpKSAhPSBub19tYXRjaCkgeworCQkJCQkJCWlmIChyZXQgPT0gcGFydGx5X21hdGNoKQorCQkJCQkJCQlyZXR1cm4gMjsJLyogVGhlcmUgaXMgaW5jb21wbGV0ZSBtYXRjaC4gKi8KKworCQkJCQkJCW1hdGNoKys7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKyNlbmRpZgkJCQkvKiBIQVZFX0lQVjYgKi8KKwkJCQkJY2FzZSBpcHY0X21hdGNoOgorCQkJCQkJaWYgKENNRF9JUFY0KHN0cikpCisJCQkJCQkJbWF0Y2grKzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIGlwdjRfcHJlZml4X21hdGNoOgorCQkJCQkJaWYgKChyZXQgPQorCQkJCQkJICAgICBjbWRfaXB2NF9wcmVmaXhfbWF0Y2gKKwkJCQkJCSAgICAgKGNvbW1hbmQpKSAhPSBub19tYXRjaCkgeworCQkJCQkJCWlmIChyZXQgPT0gcGFydGx5X21hdGNoKQorCQkJCQkJCQlyZXR1cm4gMjsJLyogVGhlcmUgaXMgaW5jb21wbGV0ZSBtYXRjaC4gKi8KKworCQkJCQkJCW1hdGNoKys7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBleHRlbmRfbWF0Y2g6CisJCQkJCQlpZiAoQ01EX09QVElPTihzdHIpCisJCQkJCQkgICAgfHwgQ01EX1ZBUklBQkxFKHN0cikpCisJCQkJCQkJbWF0Y2grKzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIG5vX21hdGNoOgorCQkJCQlkZWZhdWx0OgorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQlpZiAoIW1hdGNoKQorCQkJCXZlY3Rvcl9zbG90KHYsIGkpID0gTlVMTDsKKwkJfQorCXJldHVybiAwOworfQorCisvKiBJZiBzcmMgbWF0Y2hlcyBkc3QgcmV0dXJuIGRzdCBzdHJpbmcsIG90aGVyd2lzZSByZXR1cm4gTlVMTCAqLworc3RhdGljIGNvbnN0IGNoYXIgKmNtZF9lbnRyeV9mdW5jdGlvbihjb25zdCBjaGFyICpzcmMsIGNvbnN0IGNoYXIgKmRzdCkKK3sKKwkvKiBTa2lwIHZhcmlhYmxlIGFyZ3VtZW50cy4gKi8KKwlpZiAoQ01EX09QVElPTihkc3QpIHx8IENNRF9WQVJJQUJMRShkc3QpIHx8IENNRF9WQVJBUkcoZHN0KSB8fAorCSAgICBDTURfSVBWNChkc3QpIHx8IENNRF9JUFY0X1BSRUZJWChkc3QpIHx8IENNRF9SQU5HRShkc3QpKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIEluIGNhc2Ugb2YgJ2NvbW1hbmQgXHQnLCBnaXZlbiBzcmMgaXMgTlVMTCBzdHJpbmcuICovCisJaWYgKHNyYyA9PSBOVUxMKQorCQlyZXR1cm4gZHN0OworCisJLyogTWF0Y2hlZCB3aXRoIGlucHV0IHN0cmluZy4gKi8KKwlpZiAoc3RybmNtcChzcmMsIGRzdCwgc3RybGVuKHNyYykpID09IDApCisJCXJldHVybiBkc3Q7CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyogSWYgc3JjIG1hdGNoZXMgZHN0IHJldHVybiBkc3Qgc3RyaW5nLCBvdGhlcndpc2UgcmV0dXJuIE5VTEwgKi8KKy8qIFRoaXMgdmVyc2lvbiB3aWxsIHJldHVybiB0aGUgZHN0IHN0cmluZyBhbHdheXMgaWYgaXQgaXMKKyAgIENNRF9WQVJJQUJMRSBmb3IgJz8nIGtleSBwcm9jZXNzaW5nICovCitzdGF0aWMgY29uc3QgY2hhciAqY21kX2VudHJ5X2Z1bmN0aW9uX2Rlc2MoY29uc3QgY2hhciAqc3JjLCBjb25zdCBjaGFyICpkc3QpCit7CisJaWYgKENNRF9WQVJBUkcoZHN0KSkKKwkJcmV0dXJuIGRzdDsKKworCWlmIChDTURfUkFOR0UoZHN0KSkgeworCQlpZiAoY21kX3JhbmdlX21hdGNoKGRzdCwgc3JjKSkKKwkJCXJldHVybiBkc3Q7CisJCWVsc2UKKwkJCXJldHVybiBOVUxMOworCX0KKyNpZmRlZiBIQVZFX0lQVjYKKwlpZiAoQ01EX0lQVjYoZHN0KSkgeworCQlpZiAoY21kX2lwdjZfbWF0Y2goc3JjKSkKKwkJCXJldHVybiBkc3Q7CisJCWVsc2UKKwkJCXJldHVybiBOVUxMOworCX0KKworCWlmIChDTURfSVBWNl9QUkVGSVgoZHN0KSkgeworCQlpZiAoY21kX2lwdjZfcHJlZml4X21hdGNoKHNyYykpCisJCQlyZXR1cm4gZHN0OworCQllbHNlCisJCQlyZXR1cm4gTlVMTDsKKwl9CisjZW5kaWYJCQkJLyogSEFWRV9JUFY2ICovCisKKwlpZiAoQ01EX0lQVjQoZHN0KSkgeworCQlpZiAoY21kX2lwdjRfbWF0Y2goc3JjKSkKKwkJCXJldHVybiBkc3Q7CisJCWVsc2UKKwkJCXJldHVybiBOVUxMOworCX0KKworCWlmIChDTURfSVBWNF9QUkVGSVgoZHN0KSkgeworCQlpZiAoY21kX2lwdjRfcHJlZml4X21hdGNoKHNyYykpCisJCQlyZXR1cm4gZHN0OworCQllbHNlCisJCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBPcHRpb25hbCBvciB2YXJpYWJsZSBjb21tYW5kcyBhbHdheXMgbWF0Y2ggb24gJz8nICovCisJaWYgKENNRF9PUFRJT04oZHN0KSB8fCBDTURfVkFSSUFCTEUoZHN0KSkKKwkJcmV0dXJuIGRzdDsKKworCS8qIEluIGNhc2Ugb2YgJ2NvbW1hbmQgXHQnLCBnaXZlbiBzcmMgaXMgTlVMTCBzdHJpbmcuICovCisJaWYgKHNyYyA9PSBOVUxMKQorCQlyZXR1cm4gZHN0OworCisJaWYgKHN0cm5jbXAoc3JjLCBkc3QsIHN0cmxlbihzcmMpKSA9PSAwKQorCQlyZXR1cm4gZHN0OworCWVsc2UKKwkJcmV0dXJuIE5VTEw7Cit9CisKKy8qIENoZWNrIHNhbWUgc3RyaW5nIGVsZW1lbnQgZXhpc3RlbmNlLiAgSWYgaXQgaXNuJ3QgdGhlcmUgcmV0dXJuCisgICAgMS4gKi8KK3N0YXRpYyBpbnQgY21kX3VuaXF1ZV9zdHJpbmcodmVjdG9yIHYsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwljaGFyICptYXRjaDsKKworCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKHYpOyBpKyspCisJCWlmICgobWF0Y2ggPSB2ZWN0b3Jfc2xvdCh2LCBpKSkgIT0gTlVMTCkKKwkJCWlmIChzdHJjbXAobWF0Y2gsIHN0cikgPT0gMCkKKwkJCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworLyogQ29tcGFyZSBzdHJpbmcgdG8gZGVzY3JpcHRpb24gdmVjdG9yLiAgSWYgdGhlcmUgaXMgc2FtZSBzdHJpbmcKKyAgIHJldHVybiAxIGVsc2UgcmV0dXJuIDAuICovCitzdGF0aWMgaW50IGRlc2NfdW5pcXVlX3N0cmluZyh2ZWN0b3IgdiwgY29uc3QgY2hhciAqc3RyKQoreworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBkZXNjICpkZXNjOworCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUodik7IGkrKykKKwkJaWYgKChkZXNjID0gdmVjdG9yX3Nsb3QodiwgaSkpICE9IE5VTEwpCisJCQlpZiAoc3RyY21wKGRlc2MtPmNtZCwgc3RyKSA9PSAwKQorCQkJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNtZF90cnlfZG9fc2hvcnRjdXQoZW51bSBub2RlX3R5cGUgbm9kZSwgY2hhciAqZmlyc3Rfd29yZCkKK3sKKwlpZiAoZmlyc3Rfd29yZCAhPSBOVUxMICYmCisJICAgIG5vZGUgIT0gQVVUSF9OT0RFICYmCisJICAgIG5vZGUgIT0gVklFV19OT0RFICYmCisJICAgIG5vZGUgIT0gQVVUSF9FTkFCTEVfTk9ERSAmJgorCSAgICBub2RlICE9IEVOQUJMRV9OT0RFICYmIDAgPT0gc3RyY21wKCJkbyIsIGZpcnN0X3dvcmQpKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworLyogJz8nIGRlc2NyaWJlIGNvbW1hbmQgc3VwcG9ydC4gKi8KK3N0YXRpYyB2ZWN0b3IKK2NtZF9kZXNjcmliZV9jb21tYW5kX3JlYWwodmVjdG9yIHZsaW5lLCBzdHJ1Y3QgdnR5ICp2dHksIGludCAqc3RhdHVzKQoreworCXVuc2lnbmVkIGludCBpOworCXZlY3RvciBjbWRfdmVjdG9yOworI2RlZmluZSBJTklUX01BVENIVkVDX1NJWkUgMTAKKwl2ZWN0b3IgbWF0Y2h2ZWM7CisJc3RydWN0IGNtZF9lbGVtZW50ICpjbWRfZWxlbWVudDsKKwl1bnNpZ25lZCBpbnQgaW5kZXg7CisJaW50IHJldDsKKwllbnVtIG1hdGNoX3R5cGUgbWF0Y2g7CisJY2hhciAqY29tbWFuZDsKKwlzdGF0aWMgc3RydWN0IGRlc2MgZGVzY19jciA9IHsgIjxjcj4iLCAiIiB9OworCisJLyogU2V0IGluZGV4LiAqLworCWlmICh2ZWN0b3JfYWN0aXZlKHZsaW5lKSA9PSAwKSB7CisJCSpzdGF0dXMgPSBDTURfRVJSX05PX01BVENIOworCQlyZXR1cm4gTlVMTDsKKwl9IGVsc2UKKwkJaW5kZXggPSB2ZWN0b3JfYWN0aXZlKHZsaW5lKSAtIDE7CisKKwkvKiBNYWtlIGNvcHkgdmVjdG9yIG9mIGN1cnJlbnQgbm9kZSdzIGNvbW1hbmQgdmVjdG9yLiAqLworCWNtZF92ZWN0b3IgPSB2ZWN0b3JfY29weShjbWRfbm9kZV92ZWN0b3IoY21kdmVjLCB2dHktPm5vZGUpKTsKKworCS8qIFByZXBhcmUgbWF0Y2ggdmVjdG9yICovCisJbWF0Y2h2ZWMgPSB2ZWN0b3JfaW5pdChJTklUX01BVENIVkVDX1NJWkUpOworCisJLyogRmlsdGVyIGNvbW1hbmRzLiAqLworCS8qIE9ubHkgd29yZHMgcHJlY2VkZXMgY3VycmVudCB3b3JkIHdpbGwgYmUgY2hlY2tlZCBpbiB0aGlzIGxvb3AuICovCisJZm9yIChpID0gMDsgaSA8IGluZGV4OyBpKyspCisJCWlmICgoY29tbWFuZCA9IHZlY3Rvcl9zbG90KHZsaW5lLCBpKSkpIHsKKwkJCW1hdGNoID0KKwkJCSAgICBjbWRfZmlsdGVyX2J5X2NvbXBsZXRpb24oY29tbWFuZCwgY21kX3ZlY3RvciwgaSk7CisKKwkJCWlmIChtYXRjaCA9PSB2YXJhcmdfbWF0Y2gpIHsKKwkJCQlzdHJ1Y3QgY21kX2VsZW1lbnQgKmNtZF9lbGVtZW50OworCQkJCXZlY3RvciBkZXNjdmVjOworCQkJCXVuc2lnbmVkIGludCBqLCBrOworCisJCQkJZm9yIChqID0gMDsgaiA8IHZlY3Rvcl9hY3RpdmUoY21kX3ZlY3Rvcik7IGorKykKKwkJCQkJaWYgKChjbWRfZWxlbWVudCA9CisJCQkJCSAgICAgdmVjdG9yX3Nsb3QoY21kX3ZlY3RvciwgaikpICE9IE5VTEwKKwkJCQkJICAgICYmCisJCQkJCSAgICAodmVjdG9yX2FjdGl2ZQorCQkJCQkgICAgIChjbWRfZWxlbWVudC0+c3RydmVjKSkpIHsKKwkJCQkJCWRlc2N2ZWMgPQorCQkJCQkJICAgIHZlY3Rvcl9zbG90KGNtZF9lbGVtZW50LT4KKwkJCQkJCQkJc3RydmVjLAorCQkJCQkJCQl2ZWN0b3JfYWN0aXZlCisJCQkJCQkJCShjbWRfZWxlbWVudC0+CisJCQkJCQkJCSBzdHJ2ZWMpIC0gMSk7CisJCQkJCQlmb3IgKGsgPSAwOworCQkJCQkJICAgICBrIDwgdmVjdG9yX2FjdGl2ZShkZXNjdmVjKTsKKwkJCQkJCSAgICAgaysrKSB7CisJCQkJCQkJc3RydWN0IGRlc2MgKmRlc2MgPQorCQkJCQkJCSAgICB2ZWN0b3Jfc2xvdChkZXNjdmVjLAorCQkJCQkJCQkJayk7CisJCQkJCQkJdmVjdG9yX3NldChtYXRjaHZlYywKKwkJCQkJCQkJICAgZGVzYyk7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCXZlY3Rvcl9zZXQobWF0Y2h2ZWMsICZkZXNjX2NyKTsKKwkJCQl2ZWN0b3JfZnJlZShjbWRfdmVjdG9yKTsKKworCQkJCXJldHVybiBtYXRjaHZlYzsKKwkJCX0KKworCQkJaWYgKChyZXQgPQorCQkJICAgICBpc19jbWRfYW1iaWd1b3VzKGNvbW1hbmQsIGNtZF92ZWN0b3IsIGksCisJCQkJCSAgICAgIG1hdGNoKSkgPT0gMSkgeworCQkJCXZlY3Rvcl9mcmVlKGNtZF92ZWN0b3IpOworCQkJCSpzdGF0dXMgPSBDTURfRVJSX0FNQklHVU9VUzsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0gZWxzZSBpZiAocmV0ID09IDIpIHsKKwkJCQl2ZWN0b3JfZnJlZShjbWRfdmVjdG9yKTsKKwkJCQkqc3RhdHVzID0gQ01EX0VSUl9OT19NQVRDSDsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfQorCisJLyogUHJlcGFyZSBtYXRjaCB2ZWN0b3IgKi8KKwkvKiAgbWF0Y2h2ZWMgPSB2ZWN0b3JfaW5pdCAoSU5JVF9NQVRDSFZFQ19TSVpFKTsgKi8KKworCS8qIE1ha2Ugc3VyZSB0aGF0IGNtZF92ZWN0b3IgaXMgZmlsdGVyZWQgYmFzZWQgb24gY3VycmVudCB3b3JkICovCisJY29tbWFuZCA9IHZlY3Rvcl9zbG90KHZsaW5lLCBpbmRleCk7CisJaWYgKGNvbW1hbmQpCisJCW1hdGNoID0gY21kX2ZpbHRlcl9ieV9jb21wbGV0aW9uKGNvbW1hbmQsIGNtZF92ZWN0b3IsIGluZGV4KTsKKworCS8qIE1ha2UgZGVzY3JpcHRpb24gdmVjdG9yLiAqLworCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKGNtZF92ZWN0b3IpOyBpKyspCisJCWlmICgoY21kX2VsZW1lbnQgPSB2ZWN0b3Jfc2xvdChjbWRfdmVjdG9yLCBpKSkgIT0gTlVMTCkgeworCQkJY29uc3QgY2hhciAqc3RyaW5nID0gTlVMTDsKKwkJCXZlY3RvciBzdHJ2ZWMgPSBjbWRfZWxlbWVudC0+c3RydmVjOworCisJCQkvKiBpZiBjb21tYW5kIGlzIE5VTEwsIGluZGV4IG1heSBiZSBlcXVhbCB0byB2ZWN0b3JfYWN0aXZlICovCisJCQlpZiAoY29tbWFuZCAmJiBpbmRleCA+PSB2ZWN0b3JfYWN0aXZlKHN0cnZlYykpCisJCQkJdmVjdG9yX3Nsb3QoY21kX3ZlY3RvciwgaSkgPSBOVUxMOworCQkJZWxzZSB7CisJCQkJLyogQ2hlY2sgaWYgY29tbWFuZCBpcyBjb21wbGV0ZWQuICovCisJCQkJaWYgKGNvbW1hbmQgPT0gTlVMTAorCQkJCSAgICAmJiBpbmRleCA9PSB2ZWN0b3JfYWN0aXZlKHN0cnZlYykpIHsKKwkJCQkJc3RyaW5nID0gIjxjcj4iOworCQkJCQlpZiAoIWRlc2NfdW5pcXVlX3N0cmluZworCQkJCQkgICAgKG1hdGNodmVjLCBzdHJpbmcpKQorCQkJCQkJdmVjdG9yX3NldChtYXRjaHZlYywgJmRlc2NfY3IpOworCQkJCX0gZWxzZSB7CisJCQkJCXVuc2lnbmVkIGludCBqOworCQkJCQl2ZWN0b3IgZGVzY3ZlYyA9CisJCQkJCSAgICB2ZWN0b3Jfc2xvdChzdHJ2ZWMsIGluZGV4KTsKKwkJCQkJc3RydWN0IGRlc2MgKmRlc2M7CisKKwkJCQkJZm9yIChqID0gMDsgaiA8IHZlY3Rvcl9hY3RpdmUoZGVzY3ZlYyk7CisJCQkJCSAgICAgaisrKQorCQkJCQkJaWYgKChkZXNjID0KKwkJCQkJCSAgICAgdmVjdG9yX3Nsb3QoZGVzY3ZlYywgaikpKSB7CisJCQkJCQkJc3RyaW5nID0KKwkJCQkJCQkgICAgY21kX2VudHJ5X2Z1bmN0aW9uX2Rlc2MKKwkJCQkJCQkgICAgKGNvbW1hbmQsCisJCQkJCQkJICAgICBkZXNjLT5jbWQpOworCQkJCQkJCWlmIChzdHJpbmcpIHsKKwkJCQkJCQkJLyogVW5pcXVlbmVzcyBjaGVjayAqLworCQkJCQkJCQlpZiAoIWRlc2NfdW5pcXVlX3N0cmluZyhtYXRjaHZlYywgc3RyaW5nKSkKKwkJCQkJCQkJCXZlY3Rvcl9zZXQKKwkJCQkJCQkJCSAgICAobWF0Y2h2ZWMsCisJCQkJCQkJCQkgICAgIGRlc2MpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl2ZWN0b3JfZnJlZShjbWRfdmVjdG9yKTsKKworCWlmICh2ZWN0b3Jfc2xvdChtYXRjaHZlYywgMCkgPT0gTlVMTCkgeworCQl2ZWN0b3JfZnJlZShtYXRjaHZlYyk7CisJCSpzdGF0dXMgPSBDTURfRVJSX05PX01BVENIOworCX0gZWxzZQorCQkqc3RhdHVzID0gQ01EX1NVQ0NFU1M7CisKKwlyZXR1cm4gbWF0Y2h2ZWM7Cit9CisKK3ZlY3RvciBjbWRfZGVzY3JpYmVfY29tbWFuZCh2ZWN0b3IgdmxpbmUsIHN0cnVjdCB2dHkgKiB2dHksIGludCAqc3RhdHVzKQoreworCXZlY3RvciByZXQ7CisKKwlpZiAoY21kX3RyeV9kb19zaG9ydGN1dCh2dHktPm5vZGUsIHZlY3Rvcl9zbG90KHZsaW5lLCAwKSkpIHsKKwkJZW51bSBub2RlX3R5cGUgb25vZGU7CisJCXZlY3RvciBzaGlmdGVkX3ZsaW5lOworCQl1bnNpZ25lZCBpbnQgaW5kZXg7CisKKwkJb25vZGUgPSB2dHktPm5vZGU7CisJCXZ0eS0+bm9kZSA9IEVOQUJMRV9OT0RFOworCQkvKiBXZSBjYW4gdHJ5IGl0IG9uIGVuYWJsZSBub2RlLCBjb3MnIHRoZSB2dHkgaXMgYXV0aGVudGljYXRlZCAqLworCisJCXNoaWZ0ZWRfdmxpbmUgPSB2ZWN0b3JfaW5pdCh2ZWN0b3JfY291bnQodmxpbmUpKTsKKwkJLyogdXNlIG1lbWNweT8gKi8KKwkJZm9yIChpbmRleCA9IDE7IGluZGV4IDwgdmVjdG9yX2FjdGl2ZSh2bGluZSk7IGluZGV4KyspIHsKKwkJCXZlY3Rvcl9zZXRfaW5kZXgoc2hpZnRlZF92bGluZSwgaW5kZXggLSAxLAorCQkJCQkgdmVjdG9yX2xvb2t1cCh2bGluZSwgaW5kZXgpKTsKKwkJfQorCisJCXJldCA9IGNtZF9kZXNjcmliZV9jb21tYW5kX3JlYWwoc2hpZnRlZF92bGluZSwgdnR5LCBzdGF0dXMpOworCisJCXZlY3Rvcl9mcmVlKHNoaWZ0ZWRfdmxpbmUpOworCQl2dHktPm5vZGUgPSBvbm9kZTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gY21kX2Rlc2NyaWJlX2NvbW1hbmRfcmVhbCh2bGluZSwgdnR5LCBzdGF0dXMpOworfQorCisvKiBDaGVjayBMQ0Qgb2YgbWF0Y2hlZCBjb21tYW5kLiAqLworc3RhdGljIGludCBjbWRfbGNkKGNoYXIgKiptYXRjaGVkKQoreworCWludCBpOworCWludCBqOworCWludCBsY2QgPSAtMTsKKwljaGFyICpzMSwgKnMyOworCWNoYXIgYzEsIGMyOworCisJaWYgKG1hdGNoZWRbMF0gPT0gTlVMTCB8fCBtYXRjaGVkWzFdID09IE5VTEwpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMTsgbWF0Y2hlZFtpXSAhPSBOVUxMOyBpKyspIHsKKwkJczEgPSBtYXRjaGVkW2kgLSAxXTsKKwkJczIgPSBtYXRjaGVkW2ldOworCisJCWZvciAoaiA9IDA7IChjMSA9IHMxW2pdKSAmJiAoYzIgPSBzMltqXSk7IGorKykKKwkJCWlmIChjMSAhPSBjMikKKwkJCQlicmVhazsKKworCQlpZiAobGNkIDwgMCkKKwkJCWxjZCA9IGo7CisJCWVsc2UgeworCQkJaWYgKGxjZCA+IGopCisJCQkJbGNkID0gajsKKwkJfQorCX0KKwlyZXR1cm4gbGNkOworfQorCisvKiBDb21tYW5kIGxpbmUgY29tcGxldGlvbiBzdXBwb3J0LiAqLworc3RhdGljIGNoYXIgKipjbWRfY29tcGxldGVfY29tbWFuZF9yZWFsKHZlY3RvciB2bGluZSwgc3RydWN0IHZ0eSAqdnR5LAorCQkJCQlpbnQgKnN0YXR1cykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl2ZWN0b3IgY21kX3ZlY3RvciA9IHZlY3Rvcl9jb3B5KGNtZF9ub2RlX3ZlY3RvcihjbWR2ZWMsIHZ0eS0+bm9kZSkpOworI2RlZmluZSBJTklUX01BVENIVkVDX1NJWkUgMTAKKwl2ZWN0b3IgbWF0Y2h2ZWM7CisJc3RydWN0IGNtZF9lbGVtZW50ICpjbWRfZWxlbWVudDsKKwl1bnNpZ25lZCBpbnQgaW5kZXg7CisJY2hhciAqKm1hdGNoX3N0cjsKKwlzdHJ1Y3QgZGVzYyAqZGVzYzsKKwl2ZWN0b3IgZGVzY3ZlYzsKKwljaGFyICpjb21tYW5kOworCWludCBsY2Q7CisKKwlpZiAodmVjdG9yX2FjdGl2ZSh2bGluZSkgPT0gMCkgeworCQkqc3RhdHVzID0gQ01EX0VSUl9OT19NQVRDSDsKKwkJcmV0dXJuIE5VTEw7CisJfSBlbHNlCisJCWluZGV4ID0gdmVjdG9yX2FjdGl2ZSh2bGluZSkgLSAxOworCisJLyogRmlyc3QsIGZpbHRlciBieSBwcmVjZWVkaW5nIGNvbW1hbmQgc3RyaW5nICovCisJZm9yIChpID0gMDsgaSA8IGluZGV4OyBpKyspCisJCWlmICgoY29tbWFuZCA9IHZlY3Rvcl9zbG90KHZsaW5lLCBpKSkpIHsKKwkJCWVudW0gbWF0Y2hfdHlwZSBtYXRjaDsKKwkJCWludCByZXQ7CisKKwkJCS8qIEZpcnN0IHRyeSBjb21wbGV0aW9uIG1hdGNoLCBpZiB0aGVyZSBpcyBleGFjdGx5IG1hdGNoIHJldHVybiAxICovCisJCQltYXRjaCA9CisJCQkgICAgY21kX2ZpbHRlcl9ieV9jb21wbGV0aW9uKGNvbW1hbmQsIGNtZF92ZWN0b3IsIGkpOworCisJCQkvKiBJZiB0aGVyZSBpcyBleGFjdCBtYXRjaCB0aGVuIGZpbHRlciBhbWJpZ3VvdXMgbWF0Y2ggZWxzZSBjaGVjaworCQkJICAgYW1iaWd1b3VzbmVzcy4gKi8KKwkJCWlmICgocmV0ID0KKwkJCSAgICAgaXNfY21kX2FtYmlndW91cyhjb21tYW5kLCBjbWRfdmVjdG9yLCBpLAorCQkJCQkgICAgICBtYXRjaCkpID09IDEpIHsKKwkJCQl2ZWN0b3JfZnJlZShjbWRfdmVjdG9yKTsKKwkJCQkqc3RhdHVzID0gQ01EX0VSUl9BTUJJR1VPVVM7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQkvKgorCQkJICAgZWxzZSBpZiAocmV0ID09IDIpCisJCQkgICB7CisJCQkgICB2ZWN0b3JfZnJlZSAoY21kX3ZlY3Rvcik7CisJCQkgICAqc3RhdHVzID0gQ01EX0VSUl9OT19NQVRDSDsKKwkJCSAgIHJldHVybiBOVUxMOworCQkJICAgfQorCQkJICovCisJCX0KKworCS8qIFByZXBhcmUgbWF0Y2ggdmVjdG9yLiAqLworCW1hdGNodmVjID0gdmVjdG9yX2luaXQoSU5JVF9NQVRDSFZFQ19TSVpFKTsKKworCS8qIE5vdyB3ZSBnb3QgaW50byBjb21wbGV0aW9uICovCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUoY21kX3ZlY3Rvcik7IGkrKykKKwkJaWYgKChjbWRfZWxlbWVudCA9IHZlY3Rvcl9zbG90KGNtZF92ZWN0b3IsIGkpKSkgeworCQkJY29uc3QgY2hhciAqc3RyaW5nOworCQkJdmVjdG9yIHN0cnZlYyA9IGNtZF9lbGVtZW50LT5zdHJ2ZWM7CisKKwkJCS8qIENoZWNrIGZpZWxkIGxlbmd0aCAqLworCQkJaWYgKGluZGV4ID49IHZlY3Rvcl9hY3RpdmUoc3RydmVjKSkKKwkJCQl2ZWN0b3Jfc2xvdChjbWRfdmVjdG9yLCBpKSA9IE5VTEw7CisJCQllbHNlIHsKKwkJCQl1bnNpZ25lZCBpbnQgajsKKworCQkJCWRlc2N2ZWMgPSB2ZWN0b3Jfc2xvdChzdHJ2ZWMsIGluZGV4KTsKKwkJCQlmb3IgKGogPSAwOyBqIDwgdmVjdG9yX2FjdGl2ZShkZXNjdmVjKTsgaisrKQorCQkJCQlpZiAoKGRlc2MgPSB2ZWN0b3Jfc2xvdChkZXNjdmVjLCBqKSkpIHsKKwkJCQkJCWlmICgoc3RyaW5nID0gY21kX2VudHJ5X2Z1bmN0aW9uKHZlY3Rvcl9zbG90KHZsaW5lLCBpbmRleCksIGRlc2MtPmNtZCkpKQorCQkJCQkJCWlmIChjbWRfdW5pcXVlX3N0cmluZyAobWF0Y2h2ZWMsIHN0cmluZykpCisJCQkJCQkJCXZlY3Rvcl9zZXQgKG1hdGNodmVjLCB0YWxsb2Nfc3RyZHVwKHRhbGxfdnR5X2NtZF9jdHgsIHN0cmluZykpOworCQkJCQl9CisJCQl9CisJCX0KKworCS8qIFdlIGRvbid0IG5lZWQgY21kX3ZlY3RvciBhbnkgbW9yZS4gKi8KKwl2ZWN0b3JfZnJlZShjbWRfdmVjdG9yKTsKKworCS8qIE5vIG1hdGNoZWQgY29tbWFuZCAqLworCWlmICh2ZWN0b3Jfc2xvdChtYXRjaHZlYywgMCkgPT0gTlVMTCkgeworCQl2ZWN0b3JfZnJlZShtYXRjaHZlYyk7CisKKwkJLyogSW4gY2FzZSBvZiAnY29tbWFuZCBcdCcgcGF0dGVybi4gIERvIHlvdSBuZWVkICc/JyBjb21tYW5kIGF0CisJCSAgIHRoZSBlbmQgb2YgdGhlIGxpbmUuICovCisJCWlmICh2ZWN0b3Jfc2xvdCh2bGluZSwgaW5kZXgpID09ICdcMCcpCisJCQkqc3RhdHVzID0gQ01EX0VSUl9OT1RISU5HX1RPRE87CisJCWVsc2UKKwkJCSpzdGF0dXMgPSBDTURfRVJSX05PX01BVENIOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBPbmx5IG9uZSBtYXRjaGVkICovCisJaWYgKHZlY3Rvcl9zbG90KG1hdGNodmVjLCAxKSA9PSBOVUxMKSB7CisJCW1hdGNoX3N0ciA9IChjaGFyICoqKW1hdGNodmVjLT5pbmRleDsKKwkJdmVjdG9yX29ubHlfd3JhcHBlcl9mcmVlKG1hdGNodmVjKTsKKwkJKnN0YXR1cyA9IENNRF9DT01QTEVURV9GVUxMX01BVENIOworCQlyZXR1cm4gbWF0Y2hfc3RyOworCX0KKwkvKiBNYWtlIGl0IHN1cmUgbGFzdCBlbGVtZW50IGlzIE5VTEwuICovCisJdmVjdG9yX3NldChtYXRjaHZlYywgTlVMTCk7CisKKwkvKiBDaGVjayBMQ0Qgb2YgbWF0Y2hlZCBzdHJpbmdzLiAqLworCWlmICh2ZWN0b3Jfc2xvdCh2bGluZSwgaW5kZXgpICE9IE5VTEwpIHsKKwkJbGNkID0gY21kX2xjZCgoY2hhciAqKiltYXRjaHZlYy0+aW5kZXgpOworCisJCWlmIChsY2QpIHsKKwkJCWludCBsZW4gPSBzdHJsZW4odmVjdG9yX3Nsb3QodmxpbmUsIGluZGV4KSk7CisKKwkJCWlmIChsZW4gPCBsY2QpIHsKKwkJCQljaGFyICpsY2RzdHI7CisKKwkJCQlsY2RzdHIgPSBfdGFsbG9jX3plcm8odGFsbF92dHlfY21kX2N0eCwgbGNkICsgMSwKKwkJCQkJCSAgICAgICJjb21wbGV0ZS1sY2RzdHIiKTsKKwkJCQltZW1jcHkobGNkc3RyLCBtYXRjaHZlYy0+aW5kZXhbMF0sIGxjZCk7CisJCQkJbGNkc3RyW2xjZF0gPSAnXDAnOworCisJCQkJLyogbWF0Y2hfc3RyID0gKGNoYXIgKiopICZsY2RzdHI7ICovCisKKwkJCQkvKiBGcmVlIG1hdGNodmVjLiAqLworCQkJCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKG1hdGNodmVjKTsgaSsrKSB7CisJCQkJCWlmICh2ZWN0b3Jfc2xvdChtYXRjaHZlYywgaSkpCisJCQkJCQl0YWxsb2NfZnJlZSh2ZWN0b3Jfc2xvdChtYXRjaHZlYywgaSkpOworCQkJCX0KKwkJCQl2ZWN0b3JfZnJlZShtYXRjaHZlYyk7CisKKwkJCQkvKiBNYWtlIG5ldyBtYXRjaHZlYy4gKi8KKwkJCQltYXRjaHZlYyA9IHZlY3Rvcl9pbml0KElOSVRfTUFUQ0hWRUNfU0laRSk7CisJCQkJdmVjdG9yX3NldChtYXRjaHZlYywgbGNkc3RyKTsKKwkJCQltYXRjaF9zdHIgPSAoY2hhciAqKiltYXRjaHZlYy0+aW5kZXg7CisJCQkJdmVjdG9yX29ubHlfd3JhcHBlcl9mcmVlKG1hdGNodmVjKTsKKworCQkJCSpzdGF0dXMgPSBDTURfQ09NUExFVEVfTUFUQ0g7CisJCQkJcmV0dXJuIG1hdGNoX3N0cjsKKwkJCX0KKwkJfQorCX0KKworCW1hdGNoX3N0ciA9IChjaGFyICoqKW1hdGNodmVjLT5pbmRleDsKKwl2ZWN0b3Jfb25seV93cmFwcGVyX2ZyZWUobWF0Y2h2ZWMpOworCSpzdGF0dXMgPSBDTURfQ09NUExFVEVfTElTVF9NQVRDSDsKKwlyZXR1cm4gbWF0Y2hfc3RyOworfQorCitjaGFyICoqY21kX2NvbXBsZXRlX2NvbW1hbmQodmVjdG9yIHZsaW5lLCBzdHJ1Y3QgdnR5ICp2dHksIGludCAqc3RhdHVzKQoreworCWNoYXIgKipyZXQ7CisKKwlpZiAoY21kX3RyeV9kb19zaG9ydGN1dCh2dHktPm5vZGUsIHZlY3Rvcl9zbG90KHZsaW5lLCAwKSkpIHsKKwkJZW51bSBub2RlX3R5cGUgb25vZGU7CisJCXZlY3RvciBzaGlmdGVkX3ZsaW5lOworCQl1bnNpZ25lZCBpbnQgaW5kZXg7CisKKwkJb25vZGUgPSB2dHktPm5vZGU7CisJCXZ0eS0+bm9kZSA9IEVOQUJMRV9OT0RFOworCQkvKiBXZSBjYW4gdHJ5IGl0IG9uIGVuYWJsZSBub2RlLCBjb3MnIHRoZSB2dHkgaXMgYXV0aGVudGljYXRlZCAqLworCisJCXNoaWZ0ZWRfdmxpbmUgPSB2ZWN0b3JfaW5pdCh2ZWN0b3JfY291bnQodmxpbmUpKTsKKwkJLyogdXNlIG1lbWNweT8gKi8KKwkJZm9yIChpbmRleCA9IDE7IGluZGV4IDwgdmVjdG9yX2FjdGl2ZSh2bGluZSk7IGluZGV4KyspIHsKKwkJCXZlY3Rvcl9zZXRfaW5kZXgoc2hpZnRlZF92bGluZSwgaW5kZXggLSAxLAorCQkJCQkgdmVjdG9yX2xvb2t1cCh2bGluZSwgaW5kZXgpKTsKKwkJfQorCisJCXJldCA9IGNtZF9jb21wbGV0ZV9jb21tYW5kX3JlYWwoc2hpZnRlZF92bGluZSwgdnR5LCBzdGF0dXMpOworCisJCXZlY3Rvcl9mcmVlKHNoaWZ0ZWRfdmxpbmUpOworCQl2dHktPm5vZGUgPSBvbm9kZTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gY21kX2NvbXBsZXRlX2NvbW1hbmRfcmVhbCh2bGluZSwgdnR5LCBzdGF0dXMpOworfQorCisvKiByZXR1cm4gcGFyZW50IG5vZGUgKi8KKy8qIE1VU1QgZXZlbnR1YWxseSBjb252ZXJnZSBvbiBDT05GSUdfTk9ERSAqLworZW51bSBub2RlX3R5cGUgdnR5X2dvX3BhcmVudChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJYXNzZXJ0KHZ0eS0+bm9kZSA+IENPTkZJR19OT0RFKTsKKworCXN3aXRjaCAodnR5LT5ub2RlKSB7CisJY2FzZSBHU01ORVRfTk9ERToKKwkJdnR5LT5ub2RlID0gQ09ORklHX05PREU7CisJCXZ0eS0+aW5kZXggPSBOVUxMOworCQlicmVhazsKKwljYXNlIEJUU19OT0RFOgorCQl2dHktPm5vZGUgPSBHU01ORVRfTk9ERTsKKwkJeworCQkJLyogc2V0IHZ0eS0+aW5kZXggY29ycmVjdGx5ICEgKi8KKwkJCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCQkJdnR5LT5pbmRleCA9IGJ0cy0+bmV0d29yazsKKwkJfQorCQlicmVhazsKKwljYXNlIFRSWF9OT0RFOgorCQl2dHktPm5vZGUgPSBCVFNfTk9ERTsKKwkJeworCQkJLyogc2V0IHZ0eS0+aW5kZXggY29ycmVjdGx5ICEgKi8KKwkJCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gdnR5LT5pbmRleDsKKwkJCXZ0eS0+aW5kZXggPSB0cngtPmJ0czsKKwkJfQorCQlicmVhazsKKwljYXNlIFRTX05PREU6CisJCXZ0eS0+bm9kZSA9IFRSWF9OT0RFOworCQl7CisJCQkvKiBzZXQgdnR5LT5pbmRleCBjb3JyZWN0bHkgISAqLworCQkJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyA9IHZ0eS0+aW5kZXg7CisJCQl2dHktPmluZGV4ID0gdHMtPnRyeDsKKwkJfQorCQlicmVhazsKKwljYXNlIFNVQlNDUl9OT0RFOgorCQl2dHktPm5vZGUgPSBWSUVXX05PREU7CisJCXN1YnNjcl9wdXQodnR5LT5pbmRleCk7CisJCXZ0eS0+aW5kZXggPSBOVUxMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl2dHktPm5vZGUgPSBDT05GSUdfTk9ERTsKKwl9CisKKwlyZXR1cm4gdnR5LT5ub2RlOworfQorCisvKiBFeGVjdXRlIGNvbW1hbmQgYnkgYXJndW1lbnQgdmxpbmUgdmVjdG9yLiAqLworc3RhdGljIGludAorY21kX2V4ZWN1dGVfY29tbWFuZF9yZWFsKHZlY3RvciB2bGluZSwgc3RydWN0IHZ0eSAqdnR5LAorCQkJIHN0cnVjdCBjbWRfZWxlbWVudCAqKmNtZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBpbnQgaW5kZXg7CisJdmVjdG9yIGNtZF92ZWN0b3I7CisJc3RydWN0IGNtZF9lbGVtZW50ICpjbWRfZWxlbWVudDsKKwlzdHJ1Y3QgY21kX2VsZW1lbnQgKm1hdGNoZWRfZWxlbWVudDsKKwl1bnNpZ25lZCBpbnQgbWF0Y2hlZF9jb3VudCwgaW5jb21wbGV0ZV9jb3VudDsKKwlpbnQgYXJnYzsKKwljb25zdCBjaGFyICphcmd2W0NNRF9BUkdDX01BWF07CisJZW51bSBtYXRjaF90eXBlIG1hdGNoID0gMDsKKwlpbnQgdmFyZmxhZzsKKwljaGFyICpjb21tYW5kOworCisJLyogTWFrZSBjb3B5IG9mIGNvbW1hbmQgZWxlbWVudHMuICovCisJY21kX3ZlY3RvciA9IHZlY3Rvcl9jb3B5KGNtZF9ub2RlX3ZlY3RvcihjbWR2ZWMsIHZ0eS0+bm9kZSkpOworCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgdmVjdG9yX2FjdGl2ZSh2bGluZSk7IGluZGV4KyspCisJCWlmICgoY29tbWFuZCA9IHZlY3Rvcl9zbG90KHZsaW5lLCBpbmRleCkpKSB7CisJCQlpbnQgcmV0OworCisJCQltYXRjaCA9CisJCQkgICAgY21kX2ZpbHRlcl9ieV9jb21wbGV0aW9uKGNvbW1hbmQsIGNtZF92ZWN0b3IsCisJCQkJCQkgICAgIGluZGV4KTsKKworCQkJaWYgKG1hdGNoID09IHZhcmFyZ19tYXRjaCkKKwkJCQlicmVhazsKKworCQkJcmV0ID0KKwkJCSAgICBpc19jbWRfYW1iaWd1b3VzKGNvbW1hbmQsIGNtZF92ZWN0b3IsIGluZGV4LCBtYXRjaCk7CisKKwkJCWlmIChyZXQgPT0gMSkgeworCQkJCXZlY3Rvcl9mcmVlKGNtZF92ZWN0b3IpOworCQkJCXJldHVybiBDTURfRVJSX0FNQklHVU9VUzsKKwkJCX0gZWxzZSBpZiAocmV0ID09IDIpIHsKKwkJCQl2ZWN0b3JfZnJlZShjbWRfdmVjdG9yKTsKKwkJCQlyZXR1cm4gQ01EX0VSUl9OT19NQVRDSDsKKwkJCX0KKwkJfQorCisJLyogQ2hlY2sgbWF0Y2hlZCBjb3VudC4gKi8KKwltYXRjaGVkX2VsZW1lbnQgPSBOVUxMOworCW1hdGNoZWRfY291bnQgPSAwOworCWluY29tcGxldGVfY291bnQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUoY21kX3ZlY3Rvcik7IGkrKykKKwkJaWYgKChjbWRfZWxlbWVudCA9IHZlY3Rvcl9zbG90KGNtZF92ZWN0b3IsIGkpKSkgeworCQkJaWYgKG1hdGNoID09IHZhcmFyZ19tYXRjaAorCQkJICAgIHx8IGluZGV4ID49IGNtZF9lbGVtZW50LT5jbWRzaXplKSB7CisJCQkJbWF0Y2hlZF9lbGVtZW50ID0gY21kX2VsZW1lbnQ7CisjaWYgMAorCQkJCXByaW50ZigiREVCVUc6ICVzXG4iLCBjbWRfZWxlbWVudC0+c3RyaW5nKTsKKyNlbmRpZgorCQkJCW1hdGNoZWRfY291bnQrKzsKKwkJCX0gZWxzZSB7CisJCQkJaW5jb21wbGV0ZV9jb3VudCsrOworCQkJfQorCQl9CisKKwkvKiBGaW5pc2ggb2YgdXNpbmcgY21kX3ZlY3Rvci4gKi8KKwl2ZWN0b3JfZnJlZShjbWRfdmVjdG9yKTsKKworCS8qIFRvIGV4ZWN1dGUgY29tbWFuZCwgbWF0Y2hlZF9jb3VudCBtdXN0IGJlIDEuICovCisJaWYgKG1hdGNoZWRfY291bnQgPT0gMCkgeworCQlpZiAoaW5jb21wbGV0ZV9jb3VudCkKKwkJCXJldHVybiBDTURfRVJSX0lOQ09NUExFVEU7CisJCWVsc2UKKwkJCXJldHVybiBDTURfRVJSX05PX01BVENIOworCX0KKworCWlmIChtYXRjaGVkX2NvdW50ID4gMSkKKwkJcmV0dXJuIENNRF9FUlJfQU1CSUdVT1VTOworCisJLyogQXJndW1lbnQgdHJlYXRtZW50ICovCisJdmFyZmxhZyA9IDA7CisJYXJnYyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZSh2bGluZSk7IGkrKykgeworCQlpZiAodmFyZmxhZykKKwkJCWFyZ3ZbYXJnYysrXSA9IHZlY3Rvcl9zbG90KHZsaW5lLCBpKTsKKwkJZWxzZSB7CisJCQl2ZWN0b3IgZGVzY3ZlYyA9CisJCQkgICAgdmVjdG9yX3Nsb3QobWF0Y2hlZF9lbGVtZW50LT5zdHJ2ZWMsIGkpOworCisJCQlpZiAodmVjdG9yX2FjdGl2ZShkZXNjdmVjKSA9PSAxKSB7CisJCQkJc3RydWN0IGRlc2MgKmRlc2MgPSB2ZWN0b3Jfc2xvdChkZXNjdmVjLCAwKTsKKworCQkJCWlmIChDTURfVkFSQVJHKGRlc2MtPmNtZCkpCisJCQkJCXZhcmZsYWcgPSAxOworCisJCQkJaWYgKHZhcmZsYWcgfHwgQ01EX1ZBUklBQkxFKGRlc2MtPmNtZCkKKwkJCQkgICAgfHwgQ01EX09QVElPTihkZXNjLT5jbWQpKQorCQkJCQlhcmd2W2FyZ2MrK10gPSB2ZWN0b3Jfc2xvdCh2bGluZSwgaSk7CisJCQl9IGVsc2UKKwkJCQlhcmd2W2FyZ2MrK10gPSB2ZWN0b3Jfc2xvdCh2bGluZSwgaSk7CisJCX0KKworCQlpZiAoYXJnYyA+PSBDTURfQVJHQ19NQVgpCisJCQlyZXR1cm4gQ01EX0VSUl9FWEVFRF9BUkdDX01BWDsKKwl9CisKKwkvKiBGb3IgdnR5c2ggZXhlY3V0aW9uLiAqLworCWlmIChjbWQpCisJCSpjbWQgPSBtYXRjaGVkX2VsZW1lbnQ7CisKKwlpZiAobWF0Y2hlZF9lbGVtZW50LT5kYWVtb24pCisJCXJldHVybiBDTURfU1VDQ0VTU19EQUVNT047CisKKwkvKiBFeGVjdXRlIG1hdGNoZWQgY29tbWFuZC4gKi8KKwlyZXR1cm4gKCptYXRjaGVkX2VsZW1lbnQtPmZ1bmMpIChtYXRjaGVkX2VsZW1lbnQsIHZ0eSwgYXJnYywgYXJndik7Cit9CisKK2ludAorY21kX2V4ZWN1dGVfY29tbWFuZCh2ZWN0b3IgdmxpbmUsIHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGNtZF9lbGVtZW50ICoqY21kLAorCQkgICAgaW50IHZ0eXNoKQoreworCWludCByZXQsIHNhdmVkX3JldCwgdHJpZWQgPSAwOworCWVudW0gbm9kZV90eXBlIG9ub2RlOworCXZvaWQgKm9pbmRleDsKKworCW9ub2RlID0gdnR5LT5ub2RlOworCW9pbmRleCA9IHZ0eS0+aW5kZXg7CisKKwlpZiAoY21kX3RyeV9kb19zaG9ydGN1dCh2dHktPm5vZGUsIHZlY3Rvcl9zbG90KHZsaW5lLCAwKSkpIHsKKwkJdmVjdG9yIHNoaWZ0ZWRfdmxpbmU7CisJCXVuc2lnbmVkIGludCBpbmRleDsKKworCQl2dHktPm5vZGUgPSBFTkFCTEVfTk9ERTsKKwkJLyogV2UgY2FuIHRyeSBpdCBvbiBlbmFibGUgbm9kZSwgY29zJyB0aGUgdnR5IGlzIGF1dGhlbnRpY2F0ZWQgKi8KKworCQlzaGlmdGVkX3ZsaW5lID0gdmVjdG9yX2luaXQodmVjdG9yX2NvdW50KHZsaW5lKSk7CisJCS8qIHVzZSBtZW1jcHk/ICovCisJCWZvciAoaW5kZXggPSAxOyBpbmRleCA8IHZlY3Rvcl9hY3RpdmUodmxpbmUpOyBpbmRleCsrKSB7CisJCQl2ZWN0b3Jfc2V0X2luZGV4KHNoaWZ0ZWRfdmxpbmUsIGluZGV4IC0gMSwKKwkJCQkJIHZlY3Rvcl9sb29rdXAodmxpbmUsIGluZGV4KSk7CisJCX0KKworCQlyZXQgPSBjbWRfZXhlY3V0ZV9jb21tYW5kX3JlYWwoc2hpZnRlZF92bGluZSwgdnR5LCBjbWQpOworCisJCXZlY3Rvcl9mcmVlKHNoaWZ0ZWRfdmxpbmUpOworCQl2dHktPm5vZGUgPSBvbm9kZTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlzYXZlZF9yZXQgPSByZXQgPSBjbWRfZXhlY3V0ZV9jb21tYW5kX3JlYWwodmxpbmUsIHZ0eSwgY21kKTsKKworCWlmICh2dHlzaCkKKwkJcmV0dXJuIHNhdmVkX3JldDsKKworCS8qIFRoaXMgYXNzdW1lcyBhbGwgbm9kZXMgYWJvdmUgQ09ORklHX05PREUgYXJlIGNoaWxkcyBvZiBDT05GSUdfTk9ERSAqLworCXdoaWxlIChyZXQgIT0gQ01EX1NVQ0NFU1MgJiYgcmV0ICE9IENNRF9XQVJOSU5HCisJICAgICAgICYmIHZ0eS0+bm9kZSA+IENPTkZJR19OT0RFKSB7CisJCXZ0eV9nb19wYXJlbnQodnR5KTsKKwkJcmV0ID0gY21kX2V4ZWN1dGVfY29tbWFuZF9yZWFsKHZsaW5lLCB2dHksIGNtZCk7CisJCXRyaWVkID0gMTsKKwkJaWYgKHJldCA9PSBDTURfU1VDQ0VTUyB8fCByZXQgPT0gQ01EX1dBUk5JTkcpIHsKKwkJCS8qIHN1Y2Nlc2Z1bGwgY29tbWFuZCwgbGVhdmUgdGhlIG5vZGUgYXMgaXMgKi8KKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisJLyogbm8gY29tbWFuZCBzdWNjZWVkZWQsIHJlc2V0IHRoZSB2dHkgdG8gdGhlIG9yaWdpbmFsIG5vZGUgYW5kCisJICAgcmV0dXJuIHRoZSBlcnJvciBmb3IgdGhpcyBub2RlICovCisJaWYgKHRyaWVkKSB7CisJCXZ0eS0+bm9kZSA9IG9ub2RlOworCQl2dHktPmluZGV4ID0gb2luZGV4OworCX0KKwlyZXR1cm4gc2F2ZWRfcmV0OworfQorCisvKiBFeGVjdXRlIGNvbW1hbmQgYnkgYXJndW1lbnQgcmVhZGxpbmUuICovCitpbnQKK2NtZF9leGVjdXRlX2NvbW1hbmRfc3RyaWN0KHZlY3RvciB2bGluZSwgc3RydWN0IHZ0eSAqdnR5LAorCQkJICAgc3RydWN0IGNtZF9lbGVtZW50ICoqY21kKQoreworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGludCBpbmRleDsKKwl2ZWN0b3IgY21kX3ZlY3RvcjsKKwlzdHJ1Y3QgY21kX2VsZW1lbnQgKmNtZF9lbGVtZW50OworCXN0cnVjdCBjbWRfZWxlbWVudCAqbWF0Y2hlZF9lbGVtZW50OworCXVuc2lnbmVkIGludCBtYXRjaGVkX2NvdW50LCBpbmNvbXBsZXRlX2NvdW50OworCWludCBhcmdjOworCWNvbnN0IGNoYXIgKmFyZ3ZbQ01EX0FSR0NfTUFYXTsKKwlpbnQgdmFyZmxhZzsKKwllbnVtIG1hdGNoX3R5cGUgbWF0Y2ggPSAwOworCWNoYXIgKmNvbW1hbmQ7CisKKwkvKiBNYWtlIGNvcHkgb2YgY29tbWFuZCBlbGVtZW50ICovCisJY21kX3ZlY3RvciA9IHZlY3Rvcl9jb3B5KGNtZF9ub2RlX3ZlY3RvcihjbWR2ZWMsIHZ0eS0+bm9kZSkpOworCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgdmVjdG9yX2FjdGl2ZSh2bGluZSk7IGluZGV4KyspCisJCWlmICgoY29tbWFuZCA9IHZlY3Rvcl9zbG90KHZsaW5lLCBpbmRleCkpKSB7CisJCQlpbnQgcmV0OworCisJCQltYXRjaCA9IGNtZF9maWx0ZXJfYnlfc3RyaW5nKHZlY3Rvcl9zbG90KHZsaW5lLCBpbmRleCksCisJCQkJCQkgICAgIGNtZF92ZWN0b3IsIGluZGV4KTsKKworCQkJLyogSWYgY29tbWFuZCBtZWV0cyAnLlZBUkFSRycgdGhlbiBmaW5pc2ggbWF0Y2hpbmcuICovCisJCQlpZiAobWF0Y2ggPT0gdmFyYXJnX21hdGNoKQorCQkJCWJyZWFrOworCisJCQlyZXQgPQorCQkJICAgIGlzX2NtZF9hbWJpZ3VvdXMoY29tbWFuZCwgY21kX3ZlY3RvciwgaW5kZXgsIG1hdGNoKTsKKwkJCWlmIChyZXQgPT0gMSkgeworCQkJCXZlY3Rvcl9mcmVlKGNtZF92ZWN0b3IpOworCQkJCXJldHVybiBDTURfRVJSX0FNQklHVU9VUzsKKwkJCX0KKwkJCWlmIChyZXQgPT0gMikgeworCQkJCXZlY3Rvcl9mcmVlKGNtZF92ZWN0b3IpOworCQkJCXJldHVybiBDTURfRVJSX05PX01BVENIOworCQkJfQorCQl9CisKKwkvKiBDaGVjayBtYXRjaGVkIGNvdW50LiAqLworCW1hdGNoZWRfZWxlbWVudCA9IE5VTEw7CisJbWF0Y2hlZF9jb3VudCA9IDA7CisJaW5jb21wbGV0ZV9jb3VudCA9IDA7CisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUoY21kX3ZlY3Rvcik7IGkrKykKKwkJaWYgKHZlY3Rvcl9zbG90KGNtZF92ZWN0b3IsIGkpICE9IE5VTEwpIHsKKwkJCWNtZF9lbGVtZW50ID0gdmVjdG9yX3Nsb3QoY21kX3ZlY3RvciwgaSk7CisKKwkJCWlmIChtYXRjaCA9PSB2YXJhcmdfbWF0Y2gKKwkJCSAgICB8fCBpbmRleCA+PSBjbWRfZWxlbWVudC0+Y21kc2l6ZSkgeworCQkJCW1hdGNoZWRfZWxlbWVudCA9IGNtZF9lbGVtZW50OworCQkJCW1hdGNoZWRfY291bnQrKzsKKwkJCX0gZWxzZQorCQkJCWluY29tcGxldGVfY291bnQrKzsKKwkJfQorCisJLyogRmluaXNoIG9mIHVzaW5nIGNtZF92ZWN0b3IuICovCisJdmVjdG9yX2ZyZWUoY21kX3ZlY3Rvcik7CisKKwkvKiBUbyBleGVjdXRlIGNvbW1hbmQsIG1hdGNoZWRfY291bnQgbXVzdCBiZSAxLiAqLworCWlmIChtYXRjaGVkX2NvdW50ID09IDApIHsKKwkJaWYgKGluY29tcGxldGVfY291bnQpCisJCQlyZXR1cm4gQ01EX0VSUl9JTkNPTVBMRVRFOworCQllbHNlCisJCQlyZXR1cm4gQ01EX0VSUl9OT19NQVRDSDsKKwl9CisKKwlpZiAobWF0Y2hlZF9jb3VudCA+IDEpCisJCXJldHVybiBDTURfRVJSX0FNQklHVU9VUzsKKworCS8qIEFyZ3VtZW50IHRyZWF0bWVudCAqLworCXZhcmZsYWcgPSAwOworCWFyZ2MgPSAwOworCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUodmxpbmUpOyBpKyspIHsKKwkJaWYgKHZhcmZsYWcpCisJCQlhcmd2W2FyZ2MrK10gPSB2ZWN0b3Jfc2xvdCh2bGluZSwgaSk7CisJCWVsc2UgeworCQkJdmVjdG9yIGRlc2N2ZWMgPQorCQkJICAgIHZlY3Rvcl9zbG90KG1hdGNoZWRfZWxlbWVudC0+c3RydmVjLCBpKTsKKworCQkJaWYgKHZlY3Rvcl9hY3RpdmUoZGVzY3ZlYykgPT0gMSkgeworCQkJCXN0cnVjdCBkZXNjICpkZXNjID0gdmVjdG9yX3Nsb3QoZGVzY3ZlYywgMCk7CisKKwkJCQlpZiAoQ01EX1ZBUkFSRyhkZXNjLT5jbWQpKQorCQkJCQl2YXJmbGFnID0gMTsKKworCQkJCWlmICh2YXJmbGFnIHx8IENNRF9WQVJJQUJMRShkZXNjLT5jbWQpCisJCQkJICAgIHx8IENNRF9PUFRJT04oZGVzYy0+Y21kKSkKKwkJCQkJYXJndlthcmdjKytdID0gdmVjdG9yX3Nsb3QodmxpbmUsIGkpOworCQkJfSBlbHNlCisJCQkJYXJndlthcmdjKytdID0gdmVjdG9yX3Nsb3QodmxpbmUsIGkpOworCQl9CisKKwkJaWYgKGFyZ2MgPj0gQ01EX0FSR0NfTUFYKQorCQkJcmV0dXJuIENNRF9FUlJfRVhFRURfQVJHQ19NQVg7CisJfQorCisJLyogRm9yIHZ0eXNoIGV4ZWN1dGlvbi4gKi8KKwlpZiAoY21kKQorCQkqY21kID0gbWF0Y2hlZF9lbGVtZW50OworCisJaWYgKG1hdGNoZWRfZWxlbWVudC0+ZGFlbW9uKQorCQlyZXR1cm4gQ01EX1NVQ0NFU1NfREFFTU9OOworCisJLyogTm93IGV4ZWN1dGUgbWF0Y2hlZCBjb21tYW5kICovCisJcmV0dXJuICgqbWF0Y2hlZF9lbGVtZW50LT5mdW5jKSAobWF0Y2hlZF9lbGVtZW50LCB2dHksIGFyZ2MsIGFyZ3YpOworfQorCisvKiBDb25maWdyYXRpb24gbWFrZSBmcm9tIGZpbGUuICovCitpbnQgY29uZmlnX2Zyb21fZmlsZShzdHJ1Y3QgdnR5ICp2dHksIEZJTEUgKiBmcCkKK3sKKwlpbnQgcmV0OworCXZlY3RvciB2bGluZTsKKworCXdoaWxlIChmZ2V0cyh2dHktPmJ1ZiwgVlRZX0JVRlNJWiwgZnApKSB7CisJCXZsaW5lID0gY21kX21ha2Vfc3RydmVjKHZ0eS0+YnVmKTsKKworCQkvKiBJbiBjYXNlIG9mIGNvbW1lbnQgbGluZSAqLworCQlpZiAodmxpbmUgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQkvKiBFeGVjdXRlIGNvbmZpZ3VyYXRpb24gY29tbWFuZCA6IHRoaXMgaXMgc3RyaWN0IG1hdGNoICovCisJCXJldCA9IGNtZF9leGVjdXRlX2NvbW1hbmRfc3RyaWN0KHZsaW5lLCB2dHksIE5VTEwpOworCisJCS8qIFRyeSBhZ2FpbiB3aXRoIHNldHRpbmcgbm9kZSB0byBDT05GSUdfTk9ERSAqLworCQl3aGlsZSAocmV0ICE9IENNRF9TVUNDRVNTICYmIHJldCAhPSBDTURfV0FSTklORworCQkgICAgICAgJiYgcmV0ICE9IENNRF9FUlJfTk9USElOR19UT0RPCisJCSAgICAgICAmJiB2dHktPm5vZGUgIT0gQ09ORklHX05PREUpIHsKKwkJCXZ0eV9nb19wYXJlbnQodnR5KTsKKwkJCXJldCA9IGNtZF9leGVjdXRlX2NvbW1hbmRfc3RyaWN0KHZsaW5lLCB2dHksIE5VTEwpOworCQl9CisKKwkJY21kX2ZyZWVfc3RydmVjKHZsaW5lKTsKKworCQlpZiAocmV0ICE9IENNRF9TVUNDRVNTICYmIHJldCAhPSBDTURfV0FSTklORworCQkgICAgJiYgcmV0ICE9IENNRF9FUlJfTk9USElOR19UT0RPKQorCQkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiBDb25maWdyYXRpb24gZnJvbSB0ZXJtaW5hbCAqLworREVGVU4oY29uZmlnX3Rlcm1pbmFsLAorICAgICAgY29uZmlnX3Rlcm1pbmFsX2NtZCwKKyAgICAgICJjb25maWd1cmUgdGVybWluYWwiLAorICAgICAgIkNvbmZpZ3VyYXRpb24gZnJvbSB2dHkgaW50ZXJmYWNlXG4iICJDb25maWd1cmF0aW9uIHRlcm1pbmFsXG4iKQoreworCWlmICh2dHlfY29uZmlnX2xvY2sodnR5KSkKKwkJdnR5LT5ub2RlID0gQ09ORklHX05PREU7CisJZWxzZSB7CisJCXZ0eV9vdXQodnR5LCAiVlRZIGNvbmZpZ3VyYXRpb24gaXMgbG9ja2VkIGJ5IG90aGVyIFZUWSVzIiwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIEVuYWJsZSBjb21tYW5kICovCitERUZVTihlbmFibGUsIGNvbmZpZ19lbmFibGVfY21kLCAiZW5hYmxlIiwgIlR1cm4gb24gcHJpdmlsZWdlZCBtb2RlIGNvbW1hbmRcbiIpCit7CisJLyogSWYgZW5hYmxlIHBhc3N3b3JkIGlzIE5VTEwsIGNoYW5nZSB0byBFTkFCTEVfTk9ERSAqLworCWlmICgoaG9zdC5lbmFibGUgPT0gTlVMTCAmJiBob3N0LmVuYWJsZV9lbmNyeXB0ID09IE5VTEwpIHx8CisJICAgIHZ0eS0+dHlwZSA9PSBWVFlfU0hFTExfU0VSVikKKwkJdnR5LT5ub2RlID0gRU5BQkxFX05PREU7CisJZWxzZQorCQl2dHktPm5vZGUgPSBBVVRIX0VOQUJMRV9OT0RFOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiBEaXNhYmxlIGNvbW1hbmQgKi8KK0RFRlVOKGRpc2FibGUsCisgICAgICBjb25maWdfZGlzYWJsZV9jbWQsICJkaXNhYmxlIiwgIlR1cm4gb2ZmIHByaXZpbGVnZWQgbW9kZSBjb21tYW5kXG4iKQoreworCWlmICh2dHktPm5vZGUgPT0gRU5BQkxFX05PREUpCisJCXZ0eS0+bm9kZSA9IFZJRVdfTk9ERTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIERvd24gdnR5IG5vZGUgbGV2ZWwuICovCitERUZVTihjb25maWdfZXhpdCwKKyAgICAgIGNvbmZpZ19leGl0X2NtZCwgImV4aXQiLCAiRXhpdCBjdXJyZW50IG1vZGUgYW5kIGRvd24gdG8gcHJldmlvdXMgbW9kZVxuIikKK3sKKwlzd2l0Y2ggKHZ0eS0+bm9kZSkgeworCWNhc2UgR1NNTkVUX05PREU6CisJCXZ0eS0+bm9kZSA9IENPTkZJR19OT0RFOworCQl2dHktPmluZGV4ID0gTlVMTDsKKwkJYnJlYWs7CisJY2FzZSBCVFNfTk9ERToKKwkJdnR5LT5ub2RlID0gR1NNTkVUX05PREU7CisJCXsKKwkJCS8qIHNldCB2dHktPmluZGV4IGNvcnJlY3RseSAhICovCisJCQlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwkJCXZ0eS0+aW5kZXggPSBidHMtPm5ldHdvcms7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBUUlhfTk9ERToKKwkJdnR5LT5ub2RlID0gQlRTX05PREU7CisJCXsKKwkJCS8qIHNldCB2dHktPmluZGV4IGNvcnJlY3RseSAhICovCisJCQlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCA9IHZ0eS0+aW5kZXg7CisJCQl2dHktPmluZGV4ID0gdHJ4LT5idHM7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBUU19OT0RFOgorCQl2dHktPm5vZGUgPSBUUlhfTk9ERTsKKwkJeworCQkJLyogc2V0IHZ0eS0+aW5kZXggY29ycmVjdGx5ICEgKi8KKwkJCXN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMgPSB2dHktPmluZGV4OworCQkJdnR5LT5pbmRleCA9IHRzLT50cng7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTVUJTQ1JfTk9ERToKKwkJdnR5LT5ub2RlID0gVklFV19OT0RFOworCQlzdWJzY3JfcHV0KHZ0eS0+aW5kZXgpOworCQl2dHktPmluZGV4ID0gTlVMTDsKKwkJYnJlYWs7CisJY2FzZSBWSUVXX05PREU6CisJY2FzZSBFTkFCTEVfTk9ERToKKwkJaWYgKDApCQkvL3Z0eV9zaGVsbCAodnR5KSkKKwkJCWV4aXQoMCk7CisJCWVsc2UKKwkJCXZ0eS0+c3RhdHVzID0gVlRZX0NMT1NFOworCQlicmVhazsKKwljYXNlIENPTkZJR19OT0RFOgorCQl2dHktPm5vZGUgPSBFTkFCTEVfTk9ERTsKKwkJdnR5X2NvbmZpZ191bmxvY2sodnR5KTsKKwkJYnJlYWs7CisJY2FzZSBWVFlfTk9ERToKKwkJdnR5LT5ub2RlID0gQ09ORklHX05PREU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIHF1aXQgaXMgYWxpYXMgb2YgZXhpdC4gKi8KK0FMSUFTKGNvbmZpZ19leGl0LAorICAgICAgY29uZmlnX3F1aXRfY21kLCAicXVpdCIsICJFeGl0IGN1cnJlbnQgbW9kZSBhbmQgZG93biB0byBwcmV2aW91cyBtb2RlXG4iKQorCisvKiBFbmQgb2YgY29uZmlndXJhdGlvbi4gKi8KKyAgICBERUZVTihjb25maWdfZW5kLAorICAgICAgY29uZmlnX2VuZF9jbWQsICJlbmQiLCAiRW5kIGN1cnJlbnQgbW9kZSBhbmQgY2hhbmdlIHRvIGVuYWJsZSBtb2RlLiIpCit7CisJc3dpdGNoICh2dHktPm5vZGUpIHsKKwljYXNlIFZJRVdfTk9ERToKKwljYXNlIEVOQUJMRV9OT0RFOgorCQkvKiBOb3RoaW5nIHRvIGRvLiAqLworCQlicmVhazsKKwljYXNlIENPTkZJR19OT0RFOgorCWNhc2UgVlRZX05PREU6CisJCXZ0eV9jb25maWdfdW5sb2NrKHZ0eSk7CisJCXZ0eS0+bm9kZSA9IEVOQUJMRV9OT0RFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiBTaG93IHZlcnNpb24uICovCitERUZVTihzaG93X3ZlcnNpb24sCisgICAgICBzaG93X3ZlcnNpb25fY21kLCAic2hvdyB2ZXJzaW9uIiwgU0hPV19TVFIgIkRpc3BsYXlzIHByb2dyYW0gdmVyc2lvblxuIikKK3sKKwl2dHlfb3V0KHZ0eSwgIiVzICVzICglcykuJXMiLCBRVUFHR0FfUFJPR05BTUUsIFFVQUdHQV9WRVJTSU9OLAorCQlob3N0Lm5hbWUgPyBob3N0Lm5hbWUgOiAiIiwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiJXMlcyIsIFFVQUdHQV9DT1BZUklHSFQsIFZUWV9ORVdMSU5FKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogSGVscCBkaXNwbGF5IGZ1bmN0aW9uIGZvciBhbGwgbm9kZS4gKi8KK0RFRlVOKGNvbmZpZ19oZWxwLAorICAgICAgY29uZmlnX2hlbHBfY21kLCAiaGVscCIsICJEZXNjcmlwdGlvbiBvZiB0aGUgaW50ZXJhY3RpdmUgaGVscCBzeXN0ZW1cbiIpCit7CisJdnR5X291dCh2dHksCisJCSJUaGlzIFZUWSBwcm92aWRlcyBhZHZhbmNlZCBoZWxwIGZlYXR1cmVzLiAgV2hlbiB5b3UgbmVlZCBoZWxwLCVzXAorYW55dGltZSBhdCB0aGUgY29tbWFuZCBsaW5lIHBsZWFzZSBwcmVzcyAnPycuJXNcCislc1wKK0lmIG5vdGhpbmcgbWF0Y2hlcywgdGhlIGhlbHAgbGlzdCB3aWxsIGJlIGVtcHR5IGFuZCB5b3UgbXVzdCBiYWNrdXAlc1wKKyB1bnRpbCBlbnRlcmluZyBhICc/JyBzaG93cyB0aGUgYXZhaWxhYmxlIG9wdGlvbnMuJXNcCitUd28gc3R5bGVzIG9mIGhlbHAgYXJlIHByb3ZpZGVkOiVzXAorMS4gRnVsbCBoZWxwIGlzIGF2YWlsYWJsZSB3aGVuIHlvdSBhcmUgcmVhZHkgdG8gZW50ZXIgYSVzXAorY29tbWFuZCBhcmd1bWVudCAoZS5nLiAnc2hvdyA/JykgYW5kIGRlc2NyaWJlcyBlYWNoIHBvc3NpYmxlJXNcCithcmd1bWVudC4lc1wKKzIuIFBhcnRpYWwgaGVscCBpcyBwcm92aWRlZCB3aGVuIGFuIGFiYnJldmlhdGVkIGFyZ3VtZW50IGlzIGVudGVyZWQlc1wKKyAgIGFuZCB5b3Ugd2FudCB0byBrbm93IHdoYXQgYXJndW1lbnRzIG1hdGNoIHRoZSBpbnB1dCVzXAorICAgKGUuZy4gJ3Nob3cgbWU/Jy4pJXMlcyIsIFZUWV9ORVdMSU5FLCBWVFlfTkVXTElORSwgVlRZX05FV0xJTkUsCisJCVZUWV9ORVdMSU5FLCBWVFlfTkVXTElORSwgVlRZX05FV0xJTkUsIFZUWV9ORVdMSU5FLCBWVFlfTkVXTElORSwgVlRZX05FV0xJTkUsIFZUWV9ORVdMSU5FLCBWVFlfTkVXTElORSwgVlRZX05FV0xJTkUsIFZUWV9ORVdMSU5FKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIEhlbHAgZGlzcGxheSBmdW5jdGlvbiBmb3IgYWxsIG5vZGUuICovCitERUZVTihjb25maWdfbGlzdCwgY29uZmlnX2xpc3RfY21kLCAibGlzdCIsICJQcmludCBjb21tYW5kIGxpc3RcbiIpCit7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IGNtZF9ub2RlICpjbm9kZSA9IHZlY3Rvcl9zbG90KGNtZHZlYywgdnR5LT5ub2RlKTsKKwlzdHJ1Y3QgY21kX2VsZW1lbnQgKmNtZDsKKworCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKGNub2RlLT5jbWRfdmVjdG9yKTsgaSsrKQorCQlpZiAoKGNtZCA9IHZlY3Rvcl9zbG90KGNub2RlLT5jbWRfdmVjdG9yLCBpKSkgIT0gTlVMTAorCQkgICAgJiYgIShjbWQtPmF0dHIgPT0gQ01EX0FUVFJfREVQUkVDQVRFRAorCQkJIHx8IGNtZC0+YXR0ciA9PSBDTURfQVRUUl9ISURERU4pKQorCQkJdnR5X291dCh2dHksICIgICVzJXMiLCBjbWQtPnN0cmluZywgVlRZX05FV0xJTkUpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogV3JpdGUgY3VycmVudCBjb25maWd1cmF0aW9uIGludG8gZmlsZS4gKi8KK0RFRlVOKGNvbmZpZ193cml0ZV9maWxlLAorICAgICAgY29uZmlnX3dyaXRlX2ZpbGVfY21kLAorICAgICAgIndyaXRlIGZpbGUiLAorICAgICAgIldyaXRlIHJ1bm5pbmcgY29uZmlndXJhdGlvbiB0byBtZW1vcnksIG5ldHdvcmssIG9yIHRlcm1pbmFsXG4iCisgICAgICAiV3JpdGUgdG8gY29uZmlndXJhdGlvbiBmaWxlXG4iKQoreworCXVuc2lnbmVkIGludCBpOworCWludCBmZDsKKwlzdHJ1Y3QgY21kX25vZGUgKm5vZGU7CisJY2hhciAqY29uZmlnX2ZpbGU7CisJY2hhciAqY29uZmlnX2ZpbGVfdG1wID0gTlVMTDsKKwljaGFyICpjb25maWdfZmlsZV9zYXYgPSBOVUxMOworCXN0cnVjdCB2dHkgKmZpbGVfdnR5OworCisJLyogQ2hlY2sgYW5kIHNlZSBpZiB3ZSBhcmUgb3BlcmF0aW5nIHVuZGVyIHZ0eXNoIGNvbmZpZ3VyYXRpb24gKi8KKwlpZiAoaG9zdC5jb25maWcgPT0gTlVMTCkgeworCQl2dHlfb3V0KHZ0eSwgIkNhbid0IHNhdmUgdG8gY29uZmlndXJhdGlvbiBmaWxlLCB1c2luZyB2dHlzaC4lcyIsCisJCQlWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwkvKiBHZXQgZmlsZW5hbWUuICovCisJY29uZmlnX2ZpbGUgPSBob3N0LmNvbmZpZzsKKworCWNvbmZpZ19maWxlX3NhdiA9CisJICAgIF90YWxsb2NfemVybyh0YWxsX3Z0eV9jbWRfY3R4LAorCQkJIHN0cmxlbihjb25maWdfZmlsZSkgKyBzdHJsZW4oQ09ORl9CQUNLVVBfRVhUKSArIDEsCisJCQkgImNvbmZpZ19maWxlX3NhdiIpOworCXN0cmNweShjb25maWdfZmlsZV9zYXYsIGNvbmZpZ19maWxlKTsKKwlzdHJjYXQoY29uZmlnX2ZpbGVfc2F2LCBDT05GX0JBQ0tVUF9FWFQpOworCisJY29uZmlnX2ZpbGVfdG1wID0gX3RhbGxvY196ZXJvKHRhbGxfdnR5X2NtZF9jdHgsIHN0cmxlbihjb25maWdfZmlsZSkgKyA4LAorCQkJCQkiY29uZmlnX2ZpbGVfdG1wIik7CisJc3ByaW50Zihjb25maWdfZmlsZV90bXAsICIlcy5YWFhYWFgiLCBjb25maWdfZmlsZSk7CisKKwkvKiBPcGVuIGZpbGUgdG8gY29uZmlndXJhdGlvbiB3cml0ZS4gKi8KKwlmZCA9IG1rc3RlbXAoY29uZmlnX2ZpbGVfdG1wKTsKKwlpZiAoZmQgPCAwKSB7CisJCXZ0eV9vdXQodnR5LCAiQ2FuJ3Qgb3BlbiBjb25maWd1cmF0aW9uIGZpbGUgJXMuJXMiLAorCQkJY29uZmlnX2ZpbGVfdG1wLCBWVFlfTkVXTElORSk7CisJCXRhbGxvY19mcmVlKGNvbmZpZ19maWxlX3RtcCk7CisJCXRhbGxvY19mcmVlKGNvbmZpZ19maWxlX3Nhdik7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwkvKiBNYWtlIHZ0eSBmb3IgY29uZmlndXJhdGlvbiBmaWxlLiAqLworCWZpbGVfdnR5ID0gdnR5X25ldygpOworCWZpbGVfdnR5LT5mZCA9IGZkOworCWZpbGVfdnR5LT50eXBlID0gVlRZX0ZJTEU7CisKKwkvKiBDb25maWcgZmlsZSBoZWFkZXIgcHJpbnQuICovCisJdnR5X291dChmaWxlX3Z0eSwgIiFcbiEgT3BlbkJTQyBjb25maWd1cmF0aW9uIHNhdmVkIGZyb20gdnR5XG4hICAgIik7CisJLy92dHlfdGltZV9wcmludCAoZmlsZV92dHksIDEpOworCXZ0eV9vdXQoZmlsZV92dHksICIhXG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKGNtZHZlYyk7IGkrKykKKwkJaWYgKChub2RlID0gdmVjdG9yX3Nsb3QoY21kdmVjLCBpKSkgJiYgbm9kZS0+ZnVuYykgeworCQkJaWYgKCgqbm9kZS0+ZnVuYykgKGZpbGVfdnR5KSkKKwkJCQl2dHlfb3V0KGZpbGVfdnR5LCAiIVxuIik7CisJCX0KKwl2dHlfY2xvc2UoZmlsZV92dHkpOworCisJaWYgKHVubGluayhjb25maWdfZmlsZV9zYXYpICE9IDApCisJCWlmIChlcnJubyAhPSBFTk9FTlQpIHsKKwkJCXZ0eV9vdXQodnR5LAorCQkJCSJDYW4ndCB1bmxpbmsgYmFja3VwIGNvbmZpZ3VyYXRpb24gZmlsZSAlcy4lcyIsCisJCQkJY29uZmlnX2ZpbGVfc2F2LCBWVFlfTkVXTElORSk7CisJCQl0YWxsb2NfZnJlZShjb25maWdfZmlsZV9zYXYpOworCQkJdGFsbG9jX2ZyZWUoY29uZmlnX2ZpbGVfdG1wKTsKKwkJCXVubGluayhjb25maWdfZmlsZV90bXApOworCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCQl9CisJaWYgKGxpbmsoY29uZmlnX2ZpbGUsIGNvbmZpZ19maWxlX3NhdikgIT0gMCkgeworCQl2dHlfb3V0KHZ0eSwgIkNhbid0IGJhY2t1cCBvbGQgY29uZmlndXJhdGlvbiBmaWxlICVzLiVzIiwKKwkJCWNvbmZpZ19maWxlX3NhdiwgVlRZX05FV0xJTkUpOworCQl0YWxsb2NfZnJlZShjb25maWdfZmlsZV9zYXYpOworCQl0YWxsb2NfZnJlZShjb25maWdfZmlsZV90bXApOworCQl1bmxpbmsoY29uZmlnX2ZpbGVfdG1wKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKwlzeW5jKCk7CisJaWYgKHVubGluayhjb25maWdfZmlsZSkgIT0gMCkgeworCQl2dHlfb3V0KHZ0eSwgIkNhbid0IHVubGluayBjb25maWd1cmF0aW9uIGZpbGUgJXMuJXMiLAorCQkJY29uZmlnX2ZpbGUsIFZUWV9ORVdMSU5FKTsKKwkJdGFsbG9jX2ZyZWUoY29uZmlnX2ZpbGVfc2F2KTsKKwkJdGFsbG9jX2ZyZWUoY29uZmlnX2ZpbGVfdG1wKTsKKwkJdW5saW5rKGNvbmZpZ19maWxlX3RtcCk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisJaWYgKGxpbmsoY29uZmlnX2ZpbGVfdG1wLCBjb25maWdfZmlsZSkgIT0gMCkgeworCQl2dHlfb3V0KHZ0eSwgIkNhbid0IHNhdmUgY29uZmlndXJhdGlvbiBmaWxlICVzLiVzIiwgY29uZmlnX2ZpbGUsCisJCQlWVFlfTkVXTElORSk7CisJCXRhbGxvY19mcmVlKGNvbmZpZ19maWxlX3Nhdik7CisJCXRhbGxvY19mcmVlKGNvbmZpZ19maWxlX3RtcCk7CisJCXVubGluayhjb25maWdfZmlsZV90bXApOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCXVubGluayhjb25maWdfZmlsZV90bXApOworCXN5bmMoKTsKKworCXRhbGxvY19mcmVlKGNvbmZpZ19maWxlX3Nhdik7CisJdGFsbG9jX2ZyZWUoY29uZmlnX2ZpbGVfdG1wKTsKKworCWlmIChjaG1vZChjb25maWdfZmlsZSwgMDY2NiAmIH5DT05GSUdGSUxFX01BU0spICE9IDApIHsKKwkJdnR5X291dCh2dHksICJDYW4ndCBjaG1vZCBjb25maWd1cmF0aW9uIGZpbGUgJXM6ICVzICglZCkuJXMiLAorCQkJY29uZmlnX2ZpbGUsIHN0cmVycm9yKGVycm5vKSwgZXJybm8sIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCXZ0eV9vdXQodnR5LCAiQ29uZmlndXJhdGlvbiBzYXZlZCB0byAlcyVzIiwgY29uZmlnX2ZpbGUsIFZUWV9ORVdMSU5FKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0FMSUFTKGNvbmZpZ193cml0ZV9maWxlLAorICAgICAgY29uZmlnX3dyaXRlX2NtZCwKKyAgICAgICJ3cml0ZSIsICJXcml0ZSBydW5uaW5nIGNvbmZpZ3VyYXRpb24gdG8gbWVtb3J5LCBuZXR3b3JrLCBvciB0ZXJtaW5hbFxuIikKKworICAgIEFMSUFTKGNvbmZpZ193cml0ZV9maWxlLAorICAgICAgY29uZmlnX3dyaXRlX21lbW9yeV9jbWQsCisgICAgICAid3JpdGUgbWVtb3J5IiwKKyAgICAgICJXcml0ZSBydW5uaW5nIGNvbmZpZ3VyYXRpb24gdG8gbWVtb3J5LCBuZXR3b3JrLCBvciB0ZXJtaW5hbFxuIgorICAgICAgIldyaXRlIGNvbmZpZ3VyYXRpb24gdG8gdGhlIGZpbGUgKHNhbWUgYXMgd3JpdGUgZmlsZSlcbiIpCisKKyAgICBBTElBUyhjb25maWdfd3JpdGVfZmlsZSwKKyAgICAgIGNvcHlfcnVubmluZ2NvbmZpZ19zdGFydHVwY29uZmlnX2NtZCwKKyAgICAgICJjb3B5IHJ1bm5pbmctY29uZmlnIHN0YXJ0dXAtY29uZmlnIiwKKyAgICAgICJDb3B5IGNvbmZpZ3VyYXRpb25cbiIKKyAgICAgICJDb3B5IHJ1bm5pbmcgY29uZmlnIHRvLi4uIFxuIgorICAgICAgIkNvcHkgcnVubmluZyBjb25maWcgdG8gc3RhcnR1cCBjb25maWcgKHNhbWUgYXMgd3JpdGUgZmlsZSlcbiIpCisKKy8qIFdyaXRlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBpbnRvIHRoZSB0ZXJtaW5hbC4gKi8KKyAgICBERUZVTihjb25maWdfd3JpdGVfdGVybWluYWwsCisgICAgICBjb25maWdfd3JpdGVfdGVybWluYWxfY21kLAorICAgICAgIndyaXRlIHRlcm1pbmFsIiwKKyAgICAgICJXcml0ZSBydW5uaW5nIGNvbmZpZ3VyYXRpb24gdG8gbWVtb3J5LCBuZXR3b3JrLCBvciB0ZXJtaW5hbFxuIgorICAgICAgIldyaXRlIHRvIHRlcm1pbmFsXG4iKQoreworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBjbWRfbm9kZSAqbm9kZTsKKworCWlmICh2dHktPnR5cGUgPT0gVlRZX1NIRUxMX1NFUlYpIHsKKwkJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUoY21kdmVjKTsgaSsrKQorCQkJaWYgKChub2RlID0gdmVjdG9yX3Nsb3QoY21kdmVjLCBpKSkgJiYgbm9kZS0+ZnVuYworCQkJICAgICYmIG5vZGUtPnZ0eXNoKSB7CisJCQkJaWYgKCgqbm9kZS0+ZnVuYykgKHZ0eSkpCisJCQkJCXZ0eV9vdXQodnR5LCAiISVzIiwgVlRZX05FV0xJTkUpOworCQkJfQorCX0gZWxzZSB7CisJCXZ0eV9vdXQodnR5LCAiJXNDdXJyZW50IGNvbmZpZ3VyYXRpb246JXMiLCBWVFlfTkVXTElORSwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJdnR5X291dCh2dHksICIhJXMiLCBWVFlfTkVXTElORSk7CisKKwkJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUoY21kdmVjKTsgaSsrKQorCQkJaWYgKChub2RlID0gdmVjdG9yX3Nsb3QoY21kdmVjLCBpKSkgJiYgbm9kZS0+ZnVuYykgeworCQkJCWlmICgoKm5vZGUtPmZ1bmMpICh2dHkpKQorCQkJCQl2dHlfb3V0KHZ0eSwgIiElcyIsIFZUWV9ORVdMSU5FKTsKKwkJCX0KKwkJdnR5X291dCh2dHksICJlbmQlcyIsIFZUWV9ORVdMSU5FKTsKKwl9CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiBXcml0ZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gaW50byB0aGUgdGVybWluYWwuICovCitBTElBUyhjb25maWdfd3JpdGVfdGVybWluYWwsCisgICAgICBzaG93X3J1bm5pbmdfY29uZmlnX2NtZCwKKyAgICAgICJzaG93IHJ1bm5pbmctY29uZmlnIiwgU0hPV19TVFIgInJ1bm5pbmcgY29uZmlndXJhdGlvblxuIikKKworLyogV3JpdGUgc3RhcnR1cCBjb25maWd1cmF0aW9uIGludG8gdGhlIHRlcm1pbmFsLiAqLworICAgIERFRlVOKHNob3dfc3RhcnR1cF9jb25maWcsCisgICAgICBzaG93X3N0YXJ0dXBfY29uZmlnX2NtZCwKKyAgICAgICJzaG93IHN0YXJ0dXAtY29uZmlnIiwgU0hPV19TVFIgIkNvbnRlbnRlcyBvZiBzdGFydHVwIGNvbmZpZ3VyYXRpb25cbiIpCit7CisJY2hhciBidWZbQlVGU0laXTsKKwlGSUxFICpjb25mcDsKKworCWNvbmZwID0gZm9wZW4oaG9zdC5jb25maWcsICJyIik7CisJaWYgKGNvbmZwID09IE5VTEwpIHsKKwkJdnR5X291dCh2dHksICJDYW4ndCBvcGVuIGNvbmZpZ3VyYXRpb24gZmlsZSBbJXNdJXMiLAorCQkJaG9zdC5jb25maWcsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCXdoaWxlIChmZ2V0cyhidWYsIEJVRlNJWiwgY29uZnApKSB7CisJCWNoYXIgKmNwID0gYnVmOworCisJCXdoaWxlICgqY3AgIT0gJ1xyJyAmJiAqY3AgIT0gJ1xuJyAmJiAqY3AgIT0gJ1wwJykKKwkJCWNwKys7CisJCSpjcCA9ICdcMCc7CisKKwkJdnR5X291dCh2dHksICIlcyVzIiwgYnVmLCBWVFlfTkVXTElORSk7CisJfQorCisJZmNsb3NlKGNvbmZwKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogSG9zdG5hbWUgY29uZmlndXJhdGlvbiAqLworREVGVU4oY29uZmlnX2hvc3RuYW1lLAorICAgICAgaG9zdG5hbWVfY21kLAorICAgICAgImhvc3RuYW1lIFdPUkQiLAorICAgICAgIlNldCBzeXN0ZW0ncyBuZXR3b3JrIG5hbWVcbiIgIlRoaXMgc3lzdGVtJ3MgbmV0d29yayBuYW1lXG4iKQoreworCWlmICghaXNhbHBoYSgoaW50KSphcmd2WzBdKSkgeworCQl2dHlfb3V0KHZ0eSwgIlBsZWFzZSBzcGVjaWZ5IHN0cmluZyBzdGFydGluZyB3aXRoIGFscGhhYmV0JXMiLAorCQkJVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJaWYgKGhvc3QubmFtZSkKKwkJdGFsbG9jX2ZyZWUoaG9zdC5uYW1lKTsKKworCWhvc3QubmFtZSA9IHRhbGxvY19zdHJkdXAodGFsbF92dHlfY21kX2N0eCwgYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjb25maWdfbm9faG9zdG5hbWUsCisgICAgICBub19ob3N0bmFtZV9jbWQsCisgICAgICAibm8gaG9zdG5hbWUgW0hPU1ROQU1FXSIsCisgICAgICBOT19TVFIgIlJlc2V0IHN5c3RlbSdzIG5ldHdvcmsgbmFtZVxuIiAiSG9zdCBuYW1lIG9mIHRoaXMgcm91dGVyXG4iKQoreworCWlmIChob3N0Lm5hbWUpCisJCXRhbGxvY19mcmVlKGhvc3QubmFtZSk7CisJaG9zdC5uYW1lID0gTlVMTDsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIFZUWSBpbnRlcmZhY2UgcGFzc3dvcmQgc2V0LiAqLworREVGVU4oY29uZmlnX3Bhc3N3b3JkLCBwYXNzd29yZF9jbWQsCisgICAgICAicGFzc3dvcmQgKDh8KSBXT1JEIiwKKyAgICAgICJBc3NpZ24gdGhlIHRlcm1pbmFsIGNvbm5lY3Rpb24gcGFzc3dvcmRcbiIKKyAgICAgICJTcGVjaWZpZXMgYSBISURERU4gcGFzc3dvcmQgd2lsbCBmb2xsb3dcbiIKKyAgICAgICJkdW1teSBzdHJpbmcgXG4iICJUaGUgSElEREVOIGxpbmUgcGFzc3dvcmQgc3RyaW5nXG4iKQoreworCS8qIEFyZ3VtZW50IGNoZWNrLiAqLworCWlmIChhcmdjID09IDApIHsKKwkJdnR5X291dCh2dHksICJQbGVhc2Ugc3BlY2lmeSBwYXNzd29yZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWlmIChhcmdjID09IDIpIHsKKwkJaWYgKCphcmd2WzBdID09ICc4JykgeworCQkJaWYgKGhvc3QucGFzc3dvcmQpCisJCQkJdGFsbG9jX2ZyZWUoaG9zdC5wYXNzd29yZCk7CisJCQlob3N0LnBhc3N3b3JkID0gTlVMTDsKKwkJCWlmIChob3N0LnBhc3N3b3JkX2VuY3J5cHQpCisJCQkJdGFsbG9jX2ZyZWUoaG9zdC5wYXNzd29yZF9lbmNyeXB0KTsKKwkJCWhvc3QucGFzc3dvcmRfZW5jcnlwdCA9IHRhbGxvY19zdHJkdXAodGFsbF92dHlfY21kX2N0eCwgYXJndlsxXSk7CisJCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisJCX0gZWxzZSB7CisJCQl2dHlfb3V0KHZ0eSwgIlVua25vd24gZW5jcnlwdGlvbiB0eXBlLiVzIiwgVlRZX05FV0xJTkUpOworCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCQl9CisJfQorCisJaWYgKCFpc2FsbnVtKChpbnQpKmFyZ3ZbMF0pKSB7CisJCXZ0eV9vdXQodnR5LAorCQkJIlBsZWFzZSBzcGVjaWZ5IHN0cmluZyBzdGFydGluZyB3aXRoIGFscGhhbnVtZXJpYyVzIiwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWlmIChob3N0LnBhc3N3b3JkKQorCQl0YWxsb2NfZnJlZShob3N0LnBhc3N3b3JkKTsKKwlob3N0LnBhc3N3b3JkID0gTlVMTDsKKworI2lmZGVmIFZUWV9DUllQVF9QVworCWlmIChob3N0LmVuY3J5cHQpIHsKKwkJaWYgKGhvc3QucGFzc3dvcmRfZW5jcnlwdCkKKwkJCXRhbGxvY19mcmVlKGhvc3QucGFzc3dvcmRfZW5jcnlwdCk7CisJCWhvc3QucGFzc3dvcmRfZW5jcnlwdCA9IHRhbGxvY19zdHJkdXAodGFsbF92dHlfY21kX2N0eCwgemVuY3J5cHQoYXJndlswXSkpOworCX0gZWxzZQorI2VuZGlmCisJCWhvc3QucGFzc3dvcmQgPSB0YWxsb2Nfc3RyZHVwKHRhbGxfdnR5X2NtZF9jdHgsIGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitBTElBUyhjb25maWdfcGFzc3dvcmQsIHBhc3N3b3JkX3RleHRfY21kLAorICAgICAgInBhc3N3b3JkIExJTkUiLAorICAgICAgIkFzc2lnbiB0aGUgdGVybWluYWwgY29ubmVjdGlvbiBwYXNzd29yZFxuIgorICAgICAgIlRoZSBVTkVOQ1JZUFRFRCAoY2xlYXJ0ZXh0KSBsaW5lIHBhc3N3b3JkXG4iKQorCisvKiBWVFkgZW5hYmxlIHBhc3N3b3JkIHNldC4gKi8KKyAgICBERUZVTihjb25maWdfZW5hYmxlX3Bhc3N3b3JkLCBlbmFibGVfcGFzc3dvcmRfY21kLAorICAgICAgImVuYWJsZSBwYXNzd29yZCAoOHwpIFdPUkQiLAorICAgICAgIk1vZGlmeSBlbmFibGUgcGFzc3dvcmQgcGFyYW1ldGVyc1xuIgorICAgICAgIkFzc2lnbiB0aGUgcHJpdmlsZWdlZCBsZXZlbCBwYXNzd29yZFxuIgorICAgICAgIlNwZWNpZmllcyBhIEhJRERFTiBwYXNzd29yZCB3aWxsIGZvbGxvd1xuIgorICAgICAgImR1bW15IHN0cmluZyBcbiIgIlRoZSBISURERU4gJ2VuYWJsZScgcGFzc3dvcmQgc3RyaW5nXG4iKQoreworCS8qIEFyZ3VtZW50IGNoZWNrLiAqLworCWlmIChhcmdjID09IDApIHsKKwkJdnR5X291dCh2dHksICJQbGVhc2Ugc3BlY2lmeSBwYXNzd29yZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCS8qIENyeXB0IHR5cGUgaXMgc3BlY2lmaWVkLiAqLworCWlmIChhcmdjID09IDIpIHsKKwkJaWYgKCphcmd2WzBdID09ICc4JykgeworCQkJaWYgKGhvc3QuZW5hYmxlKQorCQkJCXRhbGxvY19mcmVlKGhvc3QuZW5hYmxlKTsKKwkJCWhvc3QuZW5hYmxlID0gTlVMTDsKKworCQkJaWYgKGhvc3QuZW5hYmxlX2VuY3J5cHQpCisJCQkJdGFsbG9jX2ZyZWUoaG9zdC5lbmFibGVfZW5jcnlwdCk7CisJCQlob3N0LmVuYWJsZV9lbmNyeXB0ID0gdGFsbG9jX3N0cmR1cCh0YWxsX3Z0eV9jbWRfY3R4LCBhcmd2WzFdKTsKKworCQkJcmV0dXJuIENNRF9TVUNDRVNTOworCQl9IGVsc2UgeworCQkJdnR5X291dCh2dHksICJVbmtub3duIGVuY3J5cHRpb24gdHlwZS4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJfQorCX0KKworCWlmICghaXNhbG51bSgoaW50KSphcmd2WzBdKSkgeworCQl2dHlfb3V0KHZ0eSwKKwkJCSJQbGVhc2Ugc3BlY2lmeSBzdHJpbmcgc3RhcnRpbmcgd2l0aCBhbHBoYW51bWVyaWMlcyIsCisJCQlWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlpZiAoaG9zdC5lbmFibGUpCisJCXRhbGxvY19mcmVlKGhvc3QuZW5hYmxlKTsKKwlob3N0LmVuYWJsZSA9IE5VTEw7CisKKwkvKiBQbGFpbiBwYXNzd29yZCBpbnB1dC4gKi8KKyNpZmRlZiBWVFlfQ1JZUFRfUFcKKwlpZiAoaG9zdC5lbmNyeXB0KSB7CisJCWlmIChob3N0LmVuYWJsZV9lbmNyeXB0KQorCQkJdGFsbG9jX2ZyZWUoaG9zdC5lbmFibGVfZW5jcnlwdCk7CisJCWhvc3QuZW5hYmxlX2VuY3J5cHQgPSB0YWxsb2Nfc3RyZHVwKHRhbGxfdnR5X2NtZF9jdHgsIHplbmNyeXB0KGFyZ3ZbMF0pKTsKKwl9IGVsc2UKKyNlbmRpZgorCQlob3N0LmVuYWJsZSA9IHRhbGxvY19zdHJkdXAodGFsbF92dHlfY21kX2N0eCwgYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0FMSUFTKGNvbmZpZ19lbmFibGVfcGFzc3dvcmQsCisgICAgICBlbmFibGVfcGFzc3dvcmRfdGV4dF9jbWQsCisgICAgICAiZW5hYmxlIHBhc3N3b3JkIExJTkUiLAorICAgICAgIk1vZGlmeSBlbmFibGUgcGFzc3dvcmQgcGFyYW1ldGVyc1xuIgorICAgICAgIkFzc2lnbiB0aGUgcHJpdmlsZWdlZCBsZXZlbCBwYXNzd29yZFxuIgorICAgICAgIlRoZSBVTkVOQ1JZUFRFRCAoY2xlYXJ0ZXh0KSAnZW5hYmxlJyBwYXNzd29yZFxuIikKKworLyogVlRZIGVuYWJsZSBwYXNzd29yZCBkZWxldGUuICovCisgICAgREVGVU4obm9fY29uZmlnX2VuYWJsZV9wYXNzd29yZCwgbm9fZW5hYmxlX3Bhc3N3b3JkX2NtZCwKKyAgICAgICJubyBlbmFibGUgcGFzc3dvcmQiLAorICAgICAgTk9fU1RSCisgICAgICAiTW9kaWZ5IGVuYWJsZSBwYXNzd29yZCBwYXJhbWV0ZXJzXG4iCisgICAgICAiQXNzaWduIHRoZSBwcml2aWxlZ2VkIGxldmVsIHBhc3N3b3JkXG4iKQoreworCWlmIChob3N0LmVuYWJsZSkKKwkJdGFsbG9jX2ZyZWUoaG9zdC5lbmFibGUpOworCWhvc3QuZW5hYmxlID0gTlVMTDsKKworCWlmIChob3N0LmVuYWJsZV9lbmNyeXB0KQorCQl0YWxsb2NfZnJlZShob3N0LmVuYWJsZV9lbmNyeXB0KTsKKwlob3N0LmVuYWJsZV9lbmNyeXB0ID0gTlVMTDsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworI2lmZGVmIFZUWV9DUllQVF9QVworREVGVU4oc2VydmljZV9wYXNzd29yZF9lbmNyeXB0LAorICAgICAgc2VydmljZV9wYXNzd29yZF9lbmNyeXB0X2NtZCwKKyAgICAgICJzZXJ2aWNlIHBhc3N3b3JkLWVuY3J5cHRpb24iLAorICAgICAgIlNldCB1cCBtaXNjZWxsYW5lb3VzIHNlcnZpY2VcbiIgIkVuYWJsZSBlbmNyeXB0ZWQgcGFzc3dvcmRzXG4iKQoreworCWlmIChob3N0LmVuY3J5cHQpCisJCXJldHVybiBDTURfU1VDQ0VTUzsKKworCWhvc3QuZW5jcnlwdCA9IDE7CisKKwlpZiAoaG9zdC5wYXNzd29yZCkgeworCQlpZiAoaG9zdC5wYXNzd29yZF9lbmNyeXB0KQorCQkJdGFsbG9jX2ZyZWUoaG9zdC5wYXNzd29yZF9lbmNyeXB0KTsKKwkJaG9zdC5wYXNzd29yZF9lbmNyeXB0ID0gdGFsbG9jX3N0cmR1cCh0YWxsX3Z0eV9jbWRfY3R4LCB6ZW5jcnlwdChob3N0LnBhc3N3b3JkKSk7CisJfQorCWlmIChob3N0LmVuYWJsZSkgeworCQlpZiAoaG9zdC5lbmFibGVfZW5jcnlwdCkKKwkJCXRhbGxvY19mcmVlKGhvc3QuZW5hYmxlX2VuY3J5cHQpOworCQlob3N0LmVuYWJsZV9lbmNyeXB0ID0gdGFsbG9jX3N0cmR1cCh0YWxsX3Z0eV9jbWRfY3R4LCB6ZW5jcnlwdChob3N0LmVuYWJsZSkpOworCX0KKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4obm9fc2VydmljZV9wYXNzd29yZF9lbmNyeXB0LAorICAgICAgbm9fc2VydmljZV9wYXNzd29yZF9lbmNyeXB0X2NtZCwKKyAgICAgICJubyBzZXJ2aWNlIHBhc3N3b3JkLWVuY3J5cHRpb24iLAorICAgICAgTk9fU1RSICJTZXQgdXAgbWlzY2VsbGFuZW91cyBzZXJ2aWNlXG4iICJFbmFibGUgZW5jcnlwdGVkIHBhc3N3b3Jkc1xuIikKK3sKKwlpZiAoIWhvc3QuZW5jcnlwdCkKKwkJcmV0dXJuIENNRF9TVUNDRVNTOworCisJaG9zdC5lbmNyeXB0ID0gMDsKKworCWlmIChob3N0LnBhc3N3b3JkX2VuY3J5cHQpCisJCXRhbGxvY19mcmVlKGhvc3QucGFzc3dvcmRfZW5jcnlwdCk7CisJaG9zdC5wYXNzd29yZF9lbmNyeXB0ID0gTlVMTDsKKworCWlmIChob3N0LmVuYWJsZV9lbmNyeXB0KQorCQl0YWxsb2NfZnJlZShob3N0LmVuYWJsZV9lbmNyeXB0KTsKKwlob3N0LmVuYWJsZV9lbmNyeXB0ID0gTlVMTDsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKyNlbmRpZgorCitERUZVTihjb25maWdfdGVybWluYWxfbGVuZ3RoLCBjb25maWdfdGVybWluYWxfbGVuZ3RoX2NtZCwKKyAgICAgICJ0ZXJtaW5hbCBsZW5ndGggPDAtNTEyPiIsCisgICAgICAiU2V0IHRlcm1pbmFsIGxpbmUgcGFyYW1ldGVyc1xuIgorICAgICAgIlNldCBudW1iZXIgb2YgbGluZXMgb24gYSBzY3JlZW5cbiIKKyAgICAgICJOdW1iZXIgb2YgbGluZXMgb24gc2NyZWVuICgwIGZvciBubyBwYXVzaW5nKVxuIikKK3sKKwlpbnQgbGluZXM7CisJY2hhciAqZW5kcHRyID0gTlVMTDsKKworCWxpbmVzID0gc3RydG9sKGFyZ3ZbMF0sICZlbmRwdHIsIDEwKTsKKwlpZiAobGluZXMgPCAwIHx8IGxpbmVzID4gNTEyIHx8ICplbmRwdHIgIT0gJ1wwJykgeworCQl2dHlfb3V0KHZ0eSwgImxlbmd0aCBpcyBtYWxmb3JtZWQlcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKwl2dHktPmxpbmVzID0gbGluZXM7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNvbmZpZ190ZXJtaW5hbF9ub19sZW5ndGgsIGNvbmZpZ190ZXJtaW5hbF9ub19sZW5ndGhfY21kLAorICAgICAgInRlcm1pbmFsIG5vIGxlbmd0aCIsCisgICAgICAiU2V0IHRlcm1pbmFsIGxpbmUgcGFyYW1ldGVyc1xuIgorICAgICAgTk9fU1RSICJTZXQgbnVtYmVyIG9mIGxpbmVzIG9uIGEgc2NyZWVuXG4iKQoreworCXZ0eS0+bGluZXMgPSAtMTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKHNlcnZpY2VfdGVybWluYWxfbGVuZ3RoLCBzZXJ2aWNlX3Rlcm1pbmFsX2xlbmd0aF9jbWQsCisgICAgICAic2VydmljZSB0ZXJtaW5hbC1sZW5ndGggPDAtNTEyPiIsCisgICAgICAiU2V0IHVwIG1pc2NlbGxhbmVvdXMgc2VydmljZVxuIgorICAgICAgIlN5c3RlbSB3aWRlIHRlcm1pbmFsIGxlbmd0aCBjb25maWd1cmF0aW9uXG4iCisgICAgICAiTnVtYmVyIG9mIGxpbmVzIG9mIFZUWSAoMCBtZWFucyBubyBsaW5lIGNvbnRyb2wpXG4iKQoreworCWludCBsaW5lczsKKwljaGFyICplbmRwdHIgPSBOVUxMOworCisJbGluZXMgPSBzdHJ0b2woYXJndlswXSwgJmVuZHB0ciwgMTApOworCWlmIChsaW5lcyA8IDAgfHwgbGluZXMgPiA1MTIgfHwgKmVuZHB0ciAhPSAnXDAnKSB7CisJCXZ0eV9vdXQodnR5LCAibGVuZ3RoIGlzIG1hbGZvcm1lZCVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCWhvc3QubGluZXMgPSBsaW5lczsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4obm9fc2VydmljZV90ZXJtaW5hbF9sZW5ndGgsIG5vX3NlcnZpY2VfdGVybWluYWxfbGVuZ3RoX2NtZCwKKyAgICAgICJubyBzZXJ2aWNlIHRlcm1pbmFsLWxlbmd0aCBbPDAtNTEyPl0iLAorICAgICAgTk9fU1RSCisgICAgICAiU2V0IHVwIG1pc2NlbGxhbmVvdXMgc2VydmljZVxuIgorICAgICAgIlN5c3RlbSB3aWRlIHRlcm1pbmFsIGxlbmd0aCBjb25maWd1cmF0aW9uXG4iCisgICAgICAiTnVtYmVyIG9mIGxpbmVzIG9mIFZUWSAoMCBtZWFucyBubyBsaW5lIGNvbnRyb2wpXG4iKQoreworCWhvc3QubGluZXMgPSAtMTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOX0hJRERFTihkb19lY2hvLAorCSAgICAgZWNob19jbWQsCisJICAgICAiZWNobyAuTUVTU0FHRSIsCisJICAgICAiRWNobyBhIG1lc3NhZ2UgYmFjayB0byB0aGUgdnR5XG4iICJUaGUgbWVzc2FnZSB0byBlY2hvXG4iKQoreworCWNoYXIgKm1lc3NhZ2U7CisKKwl2dHlfb3V0KHZ0eSwgIiVzJXMiLAorCQkoKG1lc3NhZ2UgPQorCQkgIGFyZ3ZfY29uY2F0KGFyZ3YsIGFyZ2MsIDApKSA/IG1lc3NhZ2UgOiAiIiksIFZUWV9ORVdMSU5FKTsKKwlpZiAobWVzc2FnZSkKKwkJdGFsbG9jX2ZyZWUobWVzc2FnZSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisjaWYgMAorREVGVU4oY29uZmlnX2xvZ21zZywKKyAgICAgIGNvbmZpZ19sb2dtc2dfY21kLAorICAgICAgImxvZ21zZyAiIExPR19MRVZFTFMgIiAuTUVTU0FHRSIsCisgICAgICAiU2VuZCBhIG1lc3NhZ2UgdG8gZW5hYmxlZCBsb2dnaW5nIGRlc3RpbmF0aW9uc1xuIgorICAgICAgTE9HX0xFVkVMX0RFU0MgIlRoZSBtZXNzYWdlIHRvIHNlbmRcbiIpCit7CisJaW50IGxldmVsOworCWNoYXIgKm1lc3NhZ2U7CisKKwlpZiAoKGxldmVsID0gbGV2ZWxfbWF0Y2goYXJndlswXSkpID09IFpMT0dfRElTQUJMRUQpCisJCXJldHVybiBDTURfRVJSX05PX01BVENIOworCisJemxvZyhOVUxMLCBsZXZlbCwKKwkgICAgICgobWVzc2FnZSA9IGFyZ3ZfY29uY2F0KGFyZ3YsIGFyZ2MsIDEpKSA/IG1lc3NhZ2UgOiAiIikpOworCWlmIChtZXNzYWdlKQorCQl0YWxsb2NfZnJlZShtZXNzYWdlKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKHNob3dfbG9nZ2luZywKKyAgICAgIHNob3dfbG9nZ2luZ19jbWQsCisgICAgICAic2hvdyBsb2dnaW5nIiwgU0hPV19TVFIgIlNob3cgY3VycmVudCBsb2dnaW5nIGNvbmZpZ3VyYXRpb25cbiIpCit7CisJc3RydWN0IHpsb2cgKnpsID0gemxvZ19kZWZhdWx0OworCisJdnR5X291dCh2dHksICJTeXNsb2cgbG9nZ2luZzogIik7CisJaWYgKHpsLT5tYXhsdmxbWkxPR19ERVNUX1NZU0xPR10gPT0gWkxPR19ESVNBQkxFRCkKKwkJdnR5X291dCh2dHksICJkaXNhYmxlZCIpOworCWVsc2UKKwkJdnR5X291dCh2dHksICJsZXZlbCAlcywgZmFjaWxpdHkgJXMsIGlkZW50ICVzIiwKKwkJCXpsb2dfcHJpb3JpdHlbemwtPm1heGx2bFtaTE9HX0RFU1RfU1lTTE9HXV0sCisJCQlmYWNpbGl0eV9uYW1lKHpsLT5mYWNpbGl0eSksIHpsLT5pZGVudCk7CisJdnR5X291dCh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKKworCXZ0eV9vdXQodnR5LCAiU3Rkb3V0IGxvZ2dpbmc6ICIpOworCWlmICh6bC0+bWF4bHZsW1pMT0dfREVTVF9TVERPVVRdID09IFpMT0dfRElTQUJMRUQpCisJCXZ0eV9vdXQodnR5LCAiZGlzYWJsZWQiKTsKKwllbHNlCisJCXZ0eV9vdXQodnR5LCAibGV2ZWwgJXMiLAorCQkJemxvZ19wcmlvcml0eVt6bC0+bWF4bHZsW1pMT0dfREVTVF9TVERPVVRdXSk7CisJdnR5X291dCh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKKworCXZ0eV9vdXQodnR5LCAiTW9uaXRvciBsb2dnaW5nOiAiKTsKKwlpZiAoemwtPm1heGx2bFtaTE9HX0RFU1RfTU9OSVRPUl0gPT0gWkxPR19ESVNBQkxFRCkKKwkJdnR5X291dCh2dHksICJkaXNhYmxlZCIpOworCWVsc2UKKwkJdnR5X291dCh2dHksICJsZXZlbCAlcyIsCisJCQl6bG9nX3ByaW9yaXR5W3psLT5tYXhsdmxbWkxPR19ERVNUX01PTklUT1JdXSk7CisJdnR5X291dCh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKKworCXZ0eV9vdXQodnR5LCAiRmlsZSBsb2dnaW5nOiAiKTsKKwlpZiAoKHpsLT5tYXhsdmxbWkxPR19ERVNUX0ZJTEVdID09IFpMT0dfRElTQUJMRUQpIHx8ICF6bC0+ZnApCisJCXZ0eV9vdXQodnR5LCAiZGlzYWJsZWQiKTsKKwllbHNlCisJCXZ0eV9vdXQodnR5LCAibGV2ZWwgJXMsIGZpbGVuYW1lICVzIiwKKwkJCXpsb2dfcHJpb3JpdHlbemwtPm1heGx2bFtaTE9HX0RFU1RfRklMRV1dLAorCQkJemwtPmZpbGVuYW1lKTsKKwl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOworCisJdnR5X291dCh2dHksICJQcm90b2NvbCBuYW1lOiAlcyVzIiwKKwkJemxvZ19wcm90b19uYW1lc1t6bC0+cHJvdG9jb2xdLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICJSZWNvcmQgcHJpb3JpdHk6ICVzJXMiLAorCQkoemwtPnJlY29yZF9wcmlvcml0eSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpLCBWVFlfTkVXTElORSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNvbmZpZ19sb2dfc3Rkb3V0LAorICAgICAgY29uZmlnX2xvZ19zdGRvdXRfY21kLAorICAgICAgImxvZyBzdGRvdXQiLCAiTG9nZ2luZyBjb250cm9sXG4iICJTZXQgc3Rkb3V0IGxvZ2dpbmcgbGV2ZWxcbiIpCit7CisJemxvZ19zZXRfbGV2ZWwoTlVMTCwgWkxPR19ERVNUX1NURE9VVCwgemxvZ19kZWZhdWx0LT5kZWZhdWx0X2x2bCk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjb25maWdfbG9nX3N0ZG91dF9sZXZlbCwKKyAgICAgIGNvbmZpZ19sb2dfc3Rkb3V0X2xldmVsX2NtZCwKKyAgICAgICJsb2cgc3Rkb3V0ICIgTE9HX0xFVkVMUywKKyAgICAgICJMb2dnaW5nIGNvbnRyb2xcbiIgIlNldCBzdGRvdXQgbG9nZ2luZyBsZXZlbFxuIiBMT0dfTEVWRUxfREVTQykKK3sKKwlpbnQgbGV2ZWw7CisKKwlpZiAoKGxldmVsID0gbGV2ZWxfbWF0Y2goYXJndlswXSkpID09IFpMT0dfRElTQUJMRUQpCisJCXJldHVybiBDTURfRVJSX05PX01BVENIOworCXpsb2dfc2V0X2xldmVsKE5VTEwsIFpMT0dfREVTVF9TVERPVVQsIGxldmVsKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKG5vX2NvbmZpZ19sb2dfc3Rkb3V0LAorICAgICAgbm9fY29uZmlnX2xvZ19zdGRvdXRfY21kLAorICAgICAgIm5vIGxvZyBzdGRvdXQgW0xFVkVMXSIsCisgICAgICBOT19TVFIgIkxvZ2dpbmcgY29udHJvbFxuIiAiQ2FuY2VsIGxvZ2dpbmcgdG8gc3Rkb3V0XG4iICJMb2dnaW5nIGxldmVsXG4iKQoreworCXpsb2dfc2V0X2xldmVsKE5VTEwsIFpMT0dfREVTVF9TVERPVVQsIFpMT0dfRElTQUJMRUQpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY29uZmlnX2xvZ19tb25pdG9yLAorICAgICAgY29uZmlnX2xvZ19tb25pdG9yX2NtZCwKKyAgICAgICJsb2cgbW9uaXRvciIsCisgICAgICAiTG9nZ2luZyBjb250cm9sXG4iICJTZXQgdGVybWluYWwgbGluZSAobW9uaXRvcikgbG9nZ2luZyBsZXZlbFxuIikKK3sKKwl6bG9nX3NldF9sZXZlbChOVUxMLCBaTE9HX0RFU1RfTU9OSVRPUiwgemxvZ19kZWZhdWx0LT5kZWZhdWx0X2x2bCk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjb25maWdfbG9nX21vbml0b3JfbGV2ZWwsCisgICAgICBjb25maWdfbG9nX21vbml0b3JfbGV2ZWxfY21kLAorICAgICAgImxvZyBtb25pdG9yICIgTE9HX0xFVkVMUywKKyAgICAgICJMb2dnaW5nIGNvbnRyb2xcbiIKKyAgICAgICJTZXQgdGVybWluYWwgbGluZSAobW9uaXRvcikgbG9nZ2luZyBsZXZlbFxuIiBMT0dfTEVWRUxfREVTQykKK3sKKwlpbnQgbGV2ZWw7CisKKwlpZiAoKGxldmVsID0gbGV2ZWxfbWF0Y2goYXJndlswXSkpID09IFpMT0dfRElTQUJMRUQpCisJCXJldHVybiBDTURfRVJSX05PX01BVENIOworCXpsb2dfc2V0X2xldmVsKE5VTEwsIFpMT0dfREVTVF9NT05JVE9SLCBsZXZlbCk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihub19jb25maWdfbG9nX21vbml0b3IsCisgICAgICBub19jb25maWdfbG9nX21vbml0b3JfY21kLAorICAgICAgIm5vIGxvZyBtb25pdG9yIFtMRVZFTF0iLAorICAgICAgTk9fU1RSCisgICAgICAiTG9nZ2luZyBjb250cm9sXG4iCisgICAgICAiRGlzYWJsZSB0ZXJtaW5hbCBsaW5lIChtb25pdG9yKSBsb2dnaW5nXG4iICJMb2dnaW5nIGxldmVsXG4iKQoreworCXpsb2dfc2V0X2xldmVsKE5VTEwsIFpMT0dfREVTVF9NT05JVE9SLCBaTE9HX0RJU0FCTEVEKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2xvZ19maWxlKHN0cnVjdCB2dHkgKnZ0eSwgY29uc3QgY2hhciAqZm5hbWUsIGludCBsb2dsZXZlbCkKK3sKKwlpbnQgcmV0OworCWNoYXIgKnAgPSBOVUxMOworCWNvbnN0IGNoYXIgKmZ1bGxwYXRoOworCisJLyogUGF0aCBkZXRlY3Rpb24uICovCisJaWYgKCFJU19ESVJFQ1RPUllfU0VQKCpmbmFtZSkpIHsKKwkJY2hhciBjd2RbTUFYUEFUSExFTiArIDFdOworCQljd2RbTUFYUEFUSExFTl0gPSAnXDAnOworCisJCWlmIChnZXRjd2QoY3dkLCBNQVhQQVRITEVOKSA9PSBOVUxMKSB7CisJCQl6bG9nX2VycigiY29uZmlnX2xvZ19maWxlOiBVbmFibGUgdG8gYWxsb2MgbWVtISIpOworCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCQl9CisKKwkJaWYgKChwID0gX3RhbGxvY196ZXJvKHRhbGxfdmNtZF9jdHgsCisJCQkJICAgICAgc3RybGVuKGN3ZCkgKyBzdHJsZW4oZm5hbWUpICsgMiksCisJCQkJICAgICAgInNldF9sb2dfZmlsZSIpCisJCSAgICA9PSBOVUxMKSB7CisJCQl6bG9nX2VycigiY29uZmlnX2xvZ19maWxlOiBVbmFibGUgdG8gYWxsb2MgbWVtISIpOworCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCQl9CisJCXNwcmludGYocCwgIiVzLyVzIiwgY3dkLCBmbmFtZSk7CisJCWZ1bGxwYXRoID0gcDsKKwl9IGVsc2UKKwkJZnVsbHBhdGggPSBmbmFtZTsKKworCXJldCA9IHpsb2dfc2V0X2ZpbGUoTlVMTCwgZnVsbHBhdGgsIGxvZ2xldmVsKTsKKworCWlmIChwKQorCQl0YWxsb2NfZnJlZShwKTsKKworCWlmICghcmV0KSB7CisJCXZ0eV9vdXQodnR5LCAiY2FuJ3Qgb3BlbiBsb2dmaWxlICVzXG4iLCBmbmFtZSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlpZiAoaG9zdC5sb2dmaWxlKQorCQl0YWxsb2NfZnJlZShob3N0LmxvZ2ZpbGUpOworCisJaG9zdC5sb2dmaWxlID0gdGFsbG9jX3N0cmR1cCh0YWxsX3Z0eV9jbWRfY3R4LCBmbmFtZSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNvbmZpZ19sb2dfZmlsZSwKKyAgICAgIGNvbmZpZ19sb2dfZmlsZV9jbWQsCisgICAgICAibG9nIGZpbGUgRklMRU5BTUUiLAorICAgICAgIkxvZ2dpbmcgY29udHJvbFxuIiAiTG9nZ2luZyB0byBmaWxlXG4iICJMb2dnaW5nIGZpbGVuYW1lXG4iKQoreworCXJldHVybiBzZXRfbG9nX2ZpbGUodnR5LCBhcmd2WzBdLCB6bG9nX2RlZmF1bHQtPmRlZmF1bHRfbHZsKTsKK30KKworREVGVU4oY29uZmlnX2xvZ19maWxlX2xldmVsLAorICAgICAgY29uZmlnX2xvZ19maWxlX2xldmVsX2NtZCwKKyAgICAgICJsb2cgZmlsZSBGSUxFTkFNRSAiIExPR19MRVZFTFMsCisgICAgICAiTG9nZ2luZyBjb250cm9sXG4iCisgICAgICAiTG9nZ2luZyB0byBmaWxlXG4iICJMb2dnaW5nIGZpbGVuYW1lXG4iIExPR19MRVZFTF9ERVNDKQoreworCWludCBsZXZlbDsKKworCWlmICgobGV2ZWwgPSBsZXZlbF9tYXRjaChhcmd2WzFdKSkgPT0gWkxPR19ESVNBQkxFRCkKKwkJcmV0dXJuIENNRF9FUlJfTk9fTUFUQ0g7CisJcmV0dXJuIHNldF9sb2dfZmlsZSh2dHksIGFyZ3ZbMF0sIGxldmVsKTsKK30KKworREVGVU4obm9fY29uZmlnX2xvZ19maWxlLAorICAgICAgbm9fY29uZmlnX2xvZ19maWxlX2NtZCwKKyAgICAgICJubyBsb2cgZmlsZSBbRklMRU5BTUVdIiwKKyAgICAgIE5PX1NUUgorICAgICAgIkxvZ2dpbmcgY29udHJvbFxuIiAiQ2FuY2VsIGxvZ2dpbmcgdG8gZmlsZVxuIiAiTG9nZ2luZyBmaWxlIG5hbWVcbiIpCit7CisJemxvZ19yZXNldF9maWxlKE5VTEwpOworCisJaWYgKGhvc3QubG9nZmlsZSkKKwkJdGFsbG9jX2ZyZWUoaG9zdC5sb2dmaWxlKTsKKworCWhvc3QubG9nZmlsZSA9IE5VTEw7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0FMSUFTKG5vX2NvbmZpZ19sb2dfZmlsZSwKKyAgICAgIG5vX2NvbmZpZ19sb2dfZmlsZV9sZXZlbF9jbWQsCisgICAgICAibm8gbG9nIGZpbGUgRklMRU5BTUUgTEVWRUwiLAorICAgICAgTk9fU1RSCisgICAgICAiTG9nZ2luZyBjb250cm9sXG4iCisgICAgICAiQ2FuY2VsIGxvZ2dpbmcgdG8gZmlsZVxuIiAiTG9nZ2luZyBmaWxlIG5hbWVcbiIgIkxvZ2dpbmcgbGV2ZWxcbiIpCisKKyAgICBERUZVTihjb25maWdfbG9nX3N5c2xvZywKKyAgICAgIGNvbmZpZ19sb2dfc3lzbG9nX2NtZCwKKyAgICAgICJsb2cgc3lzbG9nIiwgIkxvZ2dpbmcgY29udHJvbFxuIiAiU2V0IHN5c2xvZyBsb2dnaW5nIGxldmVsXG4iKQoreworCXpsb2dfc2V0X2xldmVsKE5VTEwsIFpMT0dfREVTVF9TWVNMT0csIHpsb2dfZGVmYXVsdC0+ZGVmYXVsdF9sdmwpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY29uZmlnX2xvZ19zeXNsb2dfbGV2ZWwsCisgICAgICBjb25maWdfbG9nX3N5c2xvZ19sZXZlbF9jbWQsCisgICAgICAibG9nIHN5c2xvZyAiIExPR19MRVZFTFMsCisgICAgICAiTG9nZ2luZyBjb250cm9sXG4iICJTZXQgc3lzbG9nIGxvZ2dpbmcgbGV2ZWxcbiIgTE9HX0xFVkVMX0RFU0MpCit7CisJaW50IGxldmVsOworCisJaWYgKChsZXZlbCA9IGxldmVsX21hdGNoKGFyZ3ZbMF0pKSA9PSBaTE9HX0RJU0FCTEVEKQorCQlyZXR1cm4gQ01EX0VSUl9OT19NQVRDSDsKKwl6bG9nX3NldF9sZXZlbChOVUxMLCBaTE9HX0RFU1RfU1lTTE9HLCBsZXZlbCk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTl9ERVBSRUNBVEVEKGNvbmZpZ19sb2dfc3lzbG9nX2ZhY2lsaXR5LAorCQkgY29uZmlnX2xvZ19zeXNsb2dfZmFjaWxpdHlfY21kLAorCQkgImxvZyBzeXNsb2cgZmFjaWxpdHkgIiBMT0dfRkFDSUxJVElFUywKKwkJICJMb2dnaW5nIGNvbnRyb2xcbiIKKwkJICJMb2dnaW5nIGdvZXMgdG8gc3lzbG9nXG4iCisJCSAiKERlcHJlY2F0ZWQpIEZhY2lsaXR5IHBhcmFtZXRlciBmb3Igc3lzbG9nIG1lc3NhZ2VzXG4iCisJCSBMT0dfRkFDSUxJVFlfREVTQykKK3sKKwlpbnQgZmFjaWxpdHk7CisKKwlpZiAoKGZhY2lsaXR5ID0gZmFjaWxpdHlfbWF0Y2goYXJndlswXSkpIDwgMCkKKwkJcmV0dXJuIENNRF9FUlJfTk9fTUFUQ0g7CisKKwl6bG9nX3NldF9sZXZlbChOVUxMLCBaTE9HX0RFU1RfU1lTTE9HLCB6bG9nX2RlZmF1bHQtPmRlZmF1bHRfbHZsKTsKKwl6bG9nX2RlZmF1bHQtPmZhY2lsaXR5ID0gZmFjaWxpdHk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihub19jb25maWdfbG9nX3N5c2xvZywKKyAgICAgIG5vX2NvbmZpZ19sb2dfc3lzbG9nX2NtZCwKKyAgICAgICJubyBsb2cgc3lzbG9nIFtMRVZFTF0iLAorICAgICAgTk9fU1RSICJMb2dnaW5nIGNvbnRyb2xcbiIgIkNhbmNlbCBsb2dnaW5nIHRvIHN5c2xvZ1xuIiAiTG9nZ2luZyBsZXZlbFxuIikKK3sKKwl6bG9nX3NldF9sZXZlbChOVUxMLCBaTE9HX0RFU1RfU1lTTE9HLCBaTE9HX0RJU0FCTEVEKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0FMSUFTKG5vX2NvbmZpZ19sb2dfc3lzbG9nLAorICAgICAgbm9fY29uZmlnX2xvZ19zeXNsb2dfZmFjaWxpdHlfY21kLAorICAgICAgIm5vIGxvZyBzeXNsb2cgZmFjaWxpdHkgIiBMT0dfRkFDSUxJVElFUywKKyAgICAgIE5PX1NUUgorICAgICAgIkxvZ2dpbmcgY29udHJvbFxuIgorICAgICAgIkxvZ2dpbmcgZ29lcyB0byBzeXNsb2dcbiIKKyAgICAgICJGYWNpbGl0eSBwYXJhbWV0ZXIgZm9yIHN5c2xvZyBtZXNzYWdlc1xuIiBMT0dfRkFDSUxJVFlfREVTQykKKworICAgIERFRlVOKGNvbmZpZ19sb2dfZmFjaWxpdHksCisgICAgICBjb25maWdfbG9nX2ZhY2lsaXR5X2NtZCwKKyAgICAgICJsb2cgZmFjaWxpdHkgIiBMT0dfRkFDSUxJVElFUywKKyAgICAgICJMb2dnaW5nIGNvbnRyb2xcbiIKKyAgICAgICJGYWNpbGl0eSBwYXJhbWV0ZXIgZm9yIHN5c2xvZyBtZXNzYWdlc1xuIiBMT0dfRkFDSUxJVFlfREVTQykKK3sKKwlpbnQgZmFjaWxpdHk7CisKKwlpZiAoKGZhY2lsaXR5ID0gZmFjaWxpdHlfbWF0Y2goYXJndlswXSkpIDwgMCkKKwkJcmV0dXJuIENNRF9FUlJfTk9fTUFUQ0g7CisJemxvZ19kZWZhdWx0LT5mYWNpbGl0eSA9IGZhY2lsaXR5OworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4obm9fY29uZmlnX2xvZ19mYWNpbGl0eSwKKyAgICAgIG5vX2NvbmZpZ19sb2dfZmFjaWxpdHlfY21kLAorICAgICAgIm5vIGxvZyBmYWNpbGl0eSBbRkFDSUxJVFldIiwKKyAgICAgIE5PX1NUUgorICAgICAgIkxvZ2dpbmcgY29udHJvbFxuIgorICAgICAgIlJlc2V0IHN5c2xvZyBmYWNpbGl0eSB0byBkZWZhdWx0IChkYWVtb24pXG4iICJTeXNsb2cgZmFjaWxpdHlcbiIpCit7CisJemxvZ19kZWZhdWx0LT5mYWNpbGl0eSA9IExPR19EQUVNT047CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTl9ERVBSRUNBVEVEKGNvbmZpZ19sb2dfdHJhcCwKKwkJIGNvbmZpZ19sb2dfdHJhcF9jbWQsCisJCSAibG9nIHRyYXAgIiBMT0dfTEVWRUxTLAorCQkgIkxvZ2dpbmcgY29udHJvbFxuIgorCQkgIihEZXByZWNhdGVkKSBTZXQgbG9nZ2luZyBsZXZlbCBhbmQgZGVmYXVsdCBmb3IgYWxsIGRlc3RpbmF0aW9uc1xuIgorCQkgTE9HX0xFVkVMX0RFU0MpCit7CisJaW50IG5ld19sZXZlbDsKKwlpbnQgaTsKKworCWlmICgobmV3X2xldmVsID0gbGV2ZWxfbWF0Y2goYXJndlswXSkpID09IFpMT0dfRElTQUJMRUQpCisJCXJldHVybiBDTURfRVJSX05PX01BVENIOworCisJemxvZ19kZWZhdWx0LT5kZWZhdWx0X2x2bCA9IG5ld19sZXZlbDsKKwlmb3IgKGkgPSAwOyBpIDwgWkxPR19OVU1fREVTVFM7IGkrKykKKwkJaWYgKHpsb2dfZGVmYXVsdC0+bWF4bHZsW2ldICE9IFpMT0dfRElTQUJMRUQpCisJCQl6bG9nX2RlZmF1bHQtPm1heGx2bFtpXSA9IG5ld19sZXZlbDsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOX0RFUFJFQ0FURUQobm9fY29uZmlnX2xvZ190cmFwLAorCQkgbm9fY29uZmlnX2xvZ190cmFwX2NtZCwKKwkJICJubyBsb2cgdHJhcCBbTEVWRUxdIiwKKwkJIE5PX1NUUgorCQkgIkxvZ2dpbmcgY29udHJvbFxuIgorCQkgIlBlcm1pdCBhbGwgbG9nZ2luZyBpbmZvcm1hdGlvblxuIiAiTG9nZ2luZyBsZXZlbFxuIikKK3sKKwl6bG9nX2RlZmF1bHQtPmRlZmF1bHRfbHZsID0gTE9HX0RFQlVHOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY29uZmlnX2xvZ19yZWNvcmRfcHJpb3JpdHksCisgICAgICBjb25maWdfbG9nX3JlY29yZF9wcmlvcml0eV9jbWQsCisgICAgICAibG9nIHJlY29yZC1wcmlvcml0eSIsCisgICAgICAiTG9nZ2luZyBjb250cm9sXG4iCisgICAgICAiTG9nIHRoZSBwcmlvcml0eSBvZiB0aGUgbWVzc2FnZSB3aXRoaW4gdGhlIG1lc3NhZ2VcbiIpCit7CisJemxvZ19kZWZhdWx0LT5yZWNvcmRfcHJpb3JpdHkgPSAxOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4obm9fY29uZmlnX2xvZ19yZWNvcmRfcHJpb3JpdHksCisgICAgICBub19jb25maWdfbG9nX3JlY29yZF9wcmlvcml0eV9jbWQsCisgICAgICAibm8gbG9nIHJlY29yZC1wcmlvcml0eSIsCisgICAgICBOT19TVFIKKyAgICAgICJMb2dnaW5nIGNvbnRyb2xcbiIKKyAgICAgICJEbyBub3QgbG9nIHRoZSBwcmlvcml0eSBvZiB0aGUgbWVzc2FnZSB3aXRoaW4gdGhlIG1lc3NhZ2VcbiIpCit7CisJemxvZ19kZWZhdWx0LT5yZWNvcmRfcHJpb3JpdHkgPSAwOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKyNlbmRpZgorCitERUZVTihiYW5uZXJfbW90ZF9maWxlLAorICAgICAgYmFubmVyX21vdGRfZmlsZV9jbWQsCisgICAgICAiYmFubmVyIG1vdGQgZmlsZSBbRklMRV0iLAorICAgICAgIlNldCBiYW5uZXJcbiIgIkJhbm5lciBmb3IgbW90ZFxuIiAiQmFubmVyIGZyb20gYSBmaWxlXG4iICJGaWxlbmFtZVxuIikKK3sKKwlpZiAoaG9zdC5tb3RkZmlsZSkKKwkJdGFsbG9jX2ZyZWUoaG9zdC5tb3RkZmlsZSk7CisJaG9zdC5tb3RkZmlsZSA9IHRhbGxvY19zdHJkdXAodGFsbF92dHlfY21kX2N0eCwgYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGJhbm5lcl9tb3RkX2RlZmF1bHQsCisgICAgICBiYW5uZXJfbW90ZF9kZWZhdWx0X2NtZCwKKyAgICAgICJiYW5uZXIgbW90ZCBkZWZhdWx0IiwKKyAgICAgICJTZXQgYmFubmVyIHN0cmluZ1xuIiAiU3RyaW5ncyBmb3IgbW90ZFxuIiAiRGVmYXVsdCBzdHJpbmdcbiIpCit7CisJaG9zdC5tb3RkID0gZGVmYXVsdF9tb3RkOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4obm9fYmFubmVyX21vdGQsCisgICAgICBub19iYW5uZXJfbW90ZF9jbWQsCisgICAgICAibm8gYmFubmVyIG1vdGQiLCBOT19TVFIgIlNldCBiYW5uZXIgc3RyaW5nXG4iICJTdHJpbmdzIGZvciBtb3RkXG4iKQoreworCWhvc3QubW90ZCA9IE5VTEw7CisJaWYgKGhvc3QubW90ZGZpbGUpCisJCXRhbGxvY19mcmVlKGhvc3QubW90ZGZpbGUpOworCWhvc3QubW90ZGZpbGUgPSBOVUxMOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogU2V0IGNvbmZpZyBmaWxlbmFtZS4gIENhbGxlZCBmcm9tIHZ0eS5jICovCit2b2lkIGhvc3RfY29uZmlnX3NldChjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwlob3N0LmNvbmZpZyA9IHRhbGxvY19zdHJkdXAodGFsbF92dHlfY21kX2N0eCwgZmlsZW5hbWUpOworfQorCit2b2lkIGluc3RhbGxfZGVmYXVsdChlbnVtIG5vZGVfdHlwZSBub2RlKQoreworCWluc3RhbGxfZWxlbWVudChub2RlLCAmY29uZmlnX2V4aXRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQobm9kZSwgJmNvbmZpZ19xdWl0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KG5vZGUsICZjb25maWdfZW5kX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KG5vZGUsICZjb25maWdfaGVscF9jbWQpOworCWluc3RhbGxfZWxlbWVudChub2RlLCAmY29uZmlnX2xpc3RfY21kKTsKKworCWluc3RhbGxfZWxlbWVudChub2RlLCAmY29uZmlnX3dyaXRlX3Rlcm1pbmFsX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KG5vZGUsICZjb25maWdfd3JpdGVfZmlsZV9jbWQpOworCWluc3RhbGxfZWxlbWVudChub2RlLCAmY29uZmlnX3dyaXRlX21lbW9yeV9jbWQpOworCWluc3RhbGxfZWxlbWVudChub2RlLCAmY29uZmlnX3dyaXRlX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KG5vZGUsICZzaG93X3J1bm5pbmdfY29uZmlnX2NtZCk7Cit9CisKKy8qIEluaXRpYWxpemUgY29tbWFuZCBpbnRlcmZhY2UuIEluc3RhbGwgYmFzaWMgbm9kZXMgYW5kIGNvbW1hbmRzLiAqLwordm9pZCBjbWRfaW5pdChpbnQgdGVybWluYWwpCit7CisJLyogQWxsb2NhdGUgaW5pdGlhbCB0b3AgdmVjdG9yIG9mIGNvbW1hbmRzLiAqLworCWNtZHZlYyA9IHZlY3Rvcl9pbml0KFZFQ1RPUl9NSU5fU0laRSk7CisKKwkvKiBEZWZhdWx0IGhvc3QgdmFsdWUgc2V0dGluZ3MuICovCisJaG9zdC5uYW1lID0gTlVMTDsKKwlob3N0LnBhc3N3b3JkID0gTlVMTDsKKwlob3N0LmVuYWJsZSA9IE5VTEw7CisJaG9zdC5sb2dmaWxlID0gTlVMTDsKKwlob3N0LmNvbmZpZyA9IE5VTEw7CisJaG9zdC5saW5lcyA9IC0xOworCWhvc3QubW90ZCA9IGRlZmF1bHRfbW90ZDsKKwlob3N0Lm1vdGRmaWxlID0gTlVMTDsKKworCS8qIEluc3RhbGwgdG9wIG5vZGVzLiAqLworCWluc3RhbGxfbm9kZSgmdmlld19ub2RlLCBOVUxMKTsKKwlpbnN0YWxsX25vZGUoJmVuYWJsZV9ub2RlLCBOVUxMKTsKKwlpbnN0YWxsX25vZGUoJmF1dGhfbm9kZSwgTlVMTCk7CisJaW5zdGFsbF9ub2RlKCZhdXRoX2VuYWJsZV9ub2RlLCBOVUxMKTsKKwlpbnN0YWxsX25vZGUoJmNvbmZpZ19ub2RlLCBjb25maWdfd3JpdGVfaG9zdCk7CisKKwkvKiBFYWNoIG5vZGUncyBiYXNpYyBjb21tYW5kcy4gKi8KKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmc2hvd192ZXJzaW9uX2NtZCk7CisJaWYgKHRlcm1pbmFsKSB7CisJCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZjb25maWdfbGlzdF9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmY29uZmlnX2V4aXRfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJmNvbmZpZ19xdWl0X2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZjb25maWdfaGVscF9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmY29uZmlnX2VuYWJsZV9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmY29uZmlnX3Rlcm1pbmFsX2xlbmd0aF9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmY29uZmlnX3Rlcm1pbmFsX25vX2xlbmd0aF9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmZWNob19jbWQpOworCX0KKworCWlmICh0ZXJtaW5hbCkgeworCQlpbnN0YWxsX2RlZmF1bHQoRU5BQkxFX05PREUpOworCQlpbnN0YWxsX2VsZW1lbnQoRU5BQkxFX05PREUsICZjb25maWdfZGlzYWJsZV9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQoRU5BQkxFX05PREUsICZjb25maWdfdGVybWluYWxfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50IChFTkFCTEVfTk9ERSwgJmNvcHlfcnVubmluZ2NvbmZpZ19zdGFydHVwY29uZmlnX2NtZCk7CisJfQorCWluc3RhbGxfZWxlbWVudCAoRU5BQkxFX05PREUsICZzaG93X3N0YXJ0dXBfY29uZmlnX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEVOQUJMRV9OT0RFLCAmc2hvd192ZXJzaW9uX2NtZCk7CisKKwlpZiAodGVybWluYWwpIHsKKwkJaW5zdGFsbF9lbGVtZW50KEVOQUJMRV9OT0RFLCAmY29uZmlnX3Rlcm1pbmFsX2xlbmd0aF9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQoRU5BQkxFX05PREUsICZjb25maWdfdGVybWluYWxfbm9fbGVuZ3RoX2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChFTkFCTEVfTk9ERSwgJmVjaG9fY21kKTsKKworCQlpbnN0YWxsX2RlZmF1bHQoQ09ORklHX05PREUpOworCX0KKworCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJmhvc3RuYW1lX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmbm9faG9zdG5hbWVfY21kKTsKKworCWlmICh0ZXJtaW5hbCkgeworCQlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZwYXNzd29yZF9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZwYXNzd29yZF90ZXh0X2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJmVuYWJsZV9wYXNzd29yZF9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZlbmFibGVfcGFzc3dvcmRfdGV4dF9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZub19lbmFibGVfcGFzc3dvcmRfY21kKTsKKworI2lmZGVmIFZUWV9DUllQVF9QVworCQlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZzZXJ2aWNlX3Bhc3N3b3JkX2VuY3J5cHRfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmbm9fc2VydmljZV9wYXNzd29yZF9lbmNyeXB0X2NtZCk7CisjZW5kaWYKKwkJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmYmFubmVyX21vdGRfZGVmYXVsdF9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZiYW5uZXJfbW90ZF9maWxlX2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJm5vX2Jhbm5lcl9tb3RkX2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJnNlcnZpY2VfdGVybWluYWxfbGVuZ3RoX2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJm5vX3NlcnZpY2VfdGVybWluYWxfbGVuZ3RoX2NtZCk7CisKKwl9CisJc3JhbmQodGltZShOVUxMKSk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy92dHkvdmVjdG9yLmMgYi9vcGVuYnNjL3NyYy92dHkvdmVjdG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI0N2FlNQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3Z0eS92ZWN0b3IuYwpAQCAtMCwwICsxLDE5MiBAQAorLyogR2VuZXJpYyB2ZWN0b3IgaW50ZXJmYWNlIHJvdXRpbmUKKyAqIENvcHlyaWdodCAoQykgMTk5NyBLdW5paGlybyBJc2hpZ3VybworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBaZWJyYS4KKyAqCisgKiBHTlUgWmVicmEgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEdOVSBaZWJyYSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIFplYnJhOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICogMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPHZ0eS92ZWN0b3IuaD4KKyNpbmNsdWRlIDx2dHkvdnR5Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8bWVtb3J5Lmg+CisKK3ZvaWQgKnRhbGxfdnR5X3ZlY19jdHg7CisKKy8qIEluaXRpYWxpemUgdmVjdG9yIDogYWxsb2NhdGUgbWVtb3J5IGFuZCByZXR1cm4gdmVjdG9yLiAqLwordmVjdG9yIHZlY3Rvcl9pbml0KHVuc2lnbmVkIGludCBzaXplKQoreworCXZlY3RvciB2ID0gdGFsbG9jX3plcm8odGFsbF92dHlfdmVjX2N0eCwgc3RydWN0IF92ZWN0b3IpOworCWlmICghdikKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBhbGxvY2F0ZSBhdCBsZWFzdCBvbmUgc2xvdCAqLworCWlmIChzaXplID09IDApCisJCXNpemUgPSAxOworCisJdi0+YWxsb2NlZCA9IHNpemU7CisJdi0+YWN0aXZlID0gMDsKKwl2LT5pbmRleCA9IF90YWxsb2NfemVybyh0YWxsX3Z0eV92ZWNfY3R4LCBzaXplb2Yodm9pZCAqKSAqIHNpemUsCisJCQkJInZlY3Rvcl9pbml0OmluZGV4Iik7CisJaWYgKCF2LT5pbmRleCkgeworCQl0YWxsb2NfZnJlZSh2KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiB2OworfQorCit2b2lkIHZlY3Rvcl9vbmx5X3dyYXBwZXJfZnJlZSh2ZWN0b3IgdikKK3sKKwl0YWxsb2NfZnJlZSh2KTsKK30KKwordm9pZCB2ZWN0b3Jfb25seV9pbmRleF9mcmVlKHZvaWQgKmluZGV4KQoreworCXRhbGxvY19mcmVlKGluZGV4KTsKK30KKwordm9pZCB2ZWN0b3JfZnJlZSh2ZWN0b3IgdikKK3sKKwl0YWxsb2NfZnJlZSh2LT5pbmRleCk7CisJdGFsbG9jX2ZyZWUodik7Cit9CisKK3ZlY3RvciB2ZWN0b3JfY29weSh2ZWN0b3IgdikKK3sKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwl2ZWN0b3IgbmV3ID0gdGFsbG9jX3plcm8odGFsbF92dHlfdmVjX2N0eCwgc3RydWN0IF92ZWN0b3IpOworCWlmICghbmV3KQorCQlyZXR1cm4gTlVMTDsKKworCW5ldy0+YWN0aXZlID0gdi0+YWN0aXZlOworCW5ldy0+YWxsb2NlZCA9IHYtPmFsbG9jZWQ7CisKKwlzaXplID0gc2l6ZW9mKHZvaWQgKikgKiAodi0+YWxsb2NlZCk7CisJbmV3LT5pbmRleCA9IF90YWxsb2NfemVybyh0YWxsX3Z0eV92ZWNfY3R4LCBzaXplLCAidmVjdG9yX2NvcHk6aW5kZXgiKTsKKwlpZiAoIW5ldy0+aW5kZXgpIHsKKwkJdGFsbG9jX2ZyZWUobmV3KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW1lbWNweShuZXctPmluZGV4LCB2LT5pbmRleCwgc2l6ZSk7CisKKwlyZXR1cm4gbmV3OworfQorCisvKiBDaGVjayBhc3NpZ25lZCBpbmRleCwgYW5kIGlmIGl0IHJ1bnMgc2hvcnQgZG91YmxlIGluZGV4IHBvaW50ZXIgKi8KK3ZvaWQgdmVjdG9yX2Vuc3VyZSh2ZWN0b3IgdiwgdW5zaWduZWQgaW50IG51bSkKK3sKKwlpZiAodi0+YWxsb2NlZCA+IG51bSkKKwkJcmV0dXJuOworCisJdi0+aW5kZXggPSB0YWxsb2NfcmVhbGxvY19zaXplKHRhbGxfdnR5X3ZlY19jdHgsIHYtPmluZGV4LAorCQkJCSAgICAgICBzaXplb2Yodm9pZCAqKSAqICh2LT5hbGxvY2VkICogMikpOworCW1lbXNldCgmdi0+aW5kZXhbdi0+YWxsb2NlZF0sIDAsIHNpemVvZih2b2lkICopICogdi0+YWxsb2NlZCk7CisJdi0+YWxsb2NlZCAqPSAyOworCisJaWYgKHYtPmFsbG9jZWQgPD0gbnVtKQorCQl2ZWN0b3JfZW5zdXJlKHYsIG51bSk7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gb25seSByZXR1cm5zIG5leHQgZW1wdHkgc2xvdCBpbmRleC4gIEl0IGRvc2Ugbm90IG1lYW4KKyAgIHRoZSBzbG90J3MgaW5kZXggbWVtb3J5IGlzIGFzc2lnbmVkLCBwbGVhc2UgY2FsbCB2ZWN0b3JfZW5zdXJlKCkKKyAgIGFmdGVyIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gKi8KK2ludCB2ZWN0b3JfZW1wdHlfc2xvdCh2ZWN0b3IgdikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmICh2LT5hY3RpdmUgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgdi0+YWN0aXZlOyBpKyspCisJCWlmICh2LT5pbmRleFtpXSA9PSAwKQorCQkJcmV0dXJuIGk7CisKKwlyZXR1cm4gaTsKK30KKworLyogU2V0IHZhbHVlIHRvIHRoZSBzbWFsbGVzdCBlbXB0eSBzbG90LiAqLworaW50IHZlY3Rvcl9zZXQodmVjdG9yIHYsIHZvaWQgKnZhbCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWkgPSB2ZWN0b3JfZW1wdHlfc2xvdCh2KTsKKwl2ZWN0b3JfZW5zdXJlKHYsIGkpOworCisJdi0+aW5kZXhbaV0gPSB2YWw7CisKKwlpZiAodi0+YWN0aXZlIDw9IGkpCisJCXYtPmFjdGl2ZSA9IGkgKyAxOworCisJcmV0dXJuIGk7Cit9CisKKy8qIFNldCB2YWx1ZSB0byBzcGVjaWZpZWQgaW5kZXggc2xvdC4gKi8KK2ludCB2ZWN0b3Jfc2V0X2luZGV4KHZlY3RvciB2LCB1bnNpZ25lZCBpbnQgaSwgdm9pZCAqdmFsKQoreworCXZlY3Rvcl9lbnN1cmUodiwgaSk7CisKKwl2LT5pbmRleFtpXSA9IHZhbDsKKworCWlmICh2LT5hY3RpdmUgPD0gaSkKKwkJdi0+YWN0aXZlID0gaSArIDE7CisKKwlyZXR1cm4gaTsKK30KKworLyogTG9vayB1cCB2ZWN0b3IuICAqLwordm9pZCAqdmVjdG9yX2xvb2t1cCh2ZWN0b3IgdiwgdW5zaWduZWQgaW50IGkpCit7CisJaWYgKGkgPj0gdi0+YWN0aXZlKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gdi0+aW5kZXhbaV07Cit9CisKKy8qIExvb2t1cCB2ZWN0b3IsIGVuc3VyZSBpdC4gKi8KK3ZvaWQgKnZlY3Rvcl9sb29rdXBfZW5zdXJlKHZlY3RvciB2LCB1bnNpZ25lZCBpbnQgaSkKK3sKKwl2ZWN0b3JfZW5zdXJlKHYsIGkpOworCXJldHVybiB2LT5pbmRleFtpXTsKK30KKworLyogVW5zZXQgdmFsdWUgYXQgc3BlY2lmaWVkIGluZGV4IHNsb3QuICovCit2b2lkIHZlY3Rvcl91bnNldCh2ZWN0b3IgdiwgdW5zaWduZWQgaW50IGkpCit7CisJaWYgKGkgPj0gdi0+YWxsb2NlZCkKKwkJcmV0dXJuOworCisJdi0+aW5kZXhbaV0gPSBOVUxMOworCisJaWYgKGkgKyAxID09IHYtPmFjdGl2ZSkgeworCQl2LT5hY3RpdmUtLTsKKwkJd2hpbGUgKGkgJiYgdi0+aW5kZXhbLS1pXSA9PSBOVUxMICYmIHYtPmFjdGl2ZS0tKSA7CS8qIElzIHRoaXMgdWdseSA/ICovCisJfQorfQorCisvKiBDb3VudCB0aGUgbnVtYmVyIG9mIG5vdCBlbXBsdHkgc2xvdC4gKi8KK3Vuc2lnbmVkIGludCB2ZWN0b3JfY291bnQodmVjdG9yIHYpCit7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgY291bnQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IHYtPmFjdGl2ZTsgaSsrKQorCQlpZiAodi0+aW5kZXhbaV0gIT0gTlVMTCkKKwkJCWNvdW50Kys7CisKKwlyZXR1cm4gY291bnQ7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy92dHkvdnR5LmMgYi9vcGVuYnNjL3NyYy92dHkvdnR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI2MGYzOAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3Z0eS92dHkuYwpAQCAtMCwwICsxLDE2NzggQEAKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHRlcm1pb3MuaD4KKworI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisKKyNpbmNsdWRlIDxhcnBhL3RlbG5ldC5oPgorCisjaW5jbHVkZSAiY2FyZHNoZWxsLmgiCisjaW5jbHVkZSA8dnR5L3Z0eS5oPgorI2luY2x1ZGUgPHZ0eS9jb21tYW5kLmg+CisjaW5jbHVkZSA8dnR5L2J1ZmZlci5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorCisvKiBvdXIgY2FsbGJhY2ssIGxvY2F0ZWQgaW4gdGVsbmV0X2ludGVyZmFjZS5jICovCit2b2lkIHZ0eV9ldmVudChlbnVtIGV2ZW50IGV2ZW50LCBpbnQgc29jaywgc3RydWN0IHZ0eSAqdnR5KTsKKworZXh0ZXJuIHN0cnVjdCBob3N0IGhvc3Q7CisKKy8qIFZlY3RvciB3aGljaCBzdG9yZSBlYWNoIHZ0eSBzdHJ1Y3R1cmUuICovCitzdGF0aWMgdmVjdG9yIHZ0eXZlYzsKKwordmVjdG9yIFZ2dHlfc2Vydl90aHJlYWQ7CisKK2NoYXIgKnZ0eV9jd2QgPSBOVUxMOworCisvKiBDb25maWd1cmUgbG9jay4gKi8KK3N0YXRpYyBpbnQgdnR5X2NvbmZpZzsKKworc3RhdGljIGludCBub19wYXNzd29yZF9jaGVjayA9IDE7CisKK3ZvaWQgKnRhbGxfdnR5X2N0eDsKKworc3RhdGljIHZvaWQgdnR5X2NsZWFyX2J1ZihzdHJ1Y3QgdnR5ICp2dHkpCit7CisJbWVtc2V0KHZ0eS0+YnVmLCAwLCB2dHktPm1heCk7Cit9CisKKy8qIEFsbG9jYXRlIG5ldyB2dHkgc3RydWN0LiAqLworc3RydWN0IHZ0eSAqdnR5X25ldygpCit7CisJc3RydWN0IHZ0eSAqbmV3ID0gdGFsbG9jX3plcm8odGFsbF92dHlfY3R4LCBzdHJ1Y3QgdnR5KTsKKworCWlmICghbmV3KQorCQlnb3RvIG91dDsKKworCW5ldy0+b2J1ZiA9IGJ1ZmZlcl9uZXcoMCk7CS8qIFVzZSBkZWZhdWx0IGJ1ZmZlciBzaXplLiAqLworCWlmICghbmV3LT5vYnVmKQorCQlnb3RvIG91dF9uZXc7CisJbmV3LT5idWYgPSBfdGFsbG9jX3plcm8odGFsbF92dHlfY3R4LCBWVFlfQlVGU0laLCAidnR5X25ldy0+YnVmIik7CisJaWYgKCFuZXctPmJ1ZikKKwkJZ290byBvdXRfb2J1ZjsKKworCW5ldy0+bWF4ID0gVlRZX0JVRlNJWjsKKworCXJldHVybiBuZXc7CisKK291dF9vYnVmOgorCWJ1ZmZlcl9mcmVlKG5ldy0+b2J1Zik7CitvdXRfbmV3OgorCXRhbGxvY19mcmVlKG5ldyk7CisJbmV3ID0gTlVMTDsKK291dDoKKwlyZXR1cm4gbmV3OworfQorCisvKiBBdXRoZW50aWNhdGlvbiBvZiB2dHkgKi8KK3N0YXRpYyB2b2lkIHZ0eV9hdXRoKHN0cnVjdCB2dHkgKnZ0eSwgY2hhciAqYnVmKQoreworCWNoYXIgKnBhc3N3ZCA9IE5VTEw7CisJZW51bSBub2RlX3R5cGUgbmV4dF9ub2RlID0gMDsKKwlpbnQgZmFpbDsKKwljaGFyICpjcnlwdChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CisKKwlzd2l0Y2ggKHZ0eS0+bm9kZSkgeworCWNhc2UgQVVUSF9OT0RFOgorI2lmZGVmIFZUWV9DUllQVF9QVworCQlpZiAoaG9zdC5lbmNyeXB0KQorCQkJcGFzc3dkID0gaG9zdC5wYXNzd29yZF9lbmNyeXB0OworCQllbHNlCisjZW5kaWYKKwkJCXBhc3N3ZCA9IGhvc3QucGFzc3dvcmQ7CisJCWlmIChob3N0LmFkdmFuY2VkKQorCQkJbmV4dF9ub2RlID0gaG9zdC5lbmFibGUgPyBWSUVXX05PREUgOiBFTkFCTEVfTk9ERTsKKwkJZWxzZQorCQkJbmV4dF9ub2RlID0gVklFV19OT0RFOworCQlicmVhazsKKwljYXNlIEFVVEhfRU5BQkxFX05PREU6CisjaWZkZWYgVlRZX0NSWVBUX1BXCisJCWlmIChob3N0LmVuY3J5cHQpCisJCQlwYXNzd2QgPSBob3N0LmVuYWJsZV9lbmNyeXB0OworCQllbHNlCisjZW5kaWYKKwkJCXBhc3N3ZCA9IGhvc3QuZW5hYmxlOworCQluZXh0X25vZGUgPSBFTkFCTEVfTk9ERTsKKwkJYnJlYWs7CisJfQorCisJaWYgKHBhc3N3ZCkgeworI2lmZGVmIFZUWV9DUllQVF9QVworCQlpZiAoaG9zdC5lbmNyeXB0KQorCQkJZmFpbCA9IHN0cmNtcChjcnlwdChidWYsIHBhc3N3ZCksIHBhc3N3ZCk7CisJCWVsc2UKKyNlbmRpZgorCQkJZmFpbCA9IHN0cmNtcChidWYsIHBhc3N3ZCk7CisJfSBlbHNlCisJCWZhaWwgPSAxOworCisJaWYgKCFmYWlsKSB7CisJCXZ0eS0+ZmFpbCA9IDA7CisJCXZ0eS0+bm9kZSA9IG5leHRfbm9kZTsJLyogU3VjY2VzcyAhICovCisJfSBlbHNlIHsKKwkJdnR5LT5mYWlsKys7CisJCWlmICh2dHktPmZhaWwgPj0gMykgeworCQkJaWYgKHZ0eS0+bm9kZSA9PSBBVVRIX05PREUpIHsKKwkJCQl2dHlfb3V0KHZ0eSwKKwkJCQkJIiUlIEJhZCBwYXNzd29yZHMsIHRvbyBtYW55IGZhaWx1cmVzISVzIiwKKwkJCQkJVlRZX05FV0xJTkUpOworCQkJCXZ0eS0+c3RhdHVzID0gVlRZX0NMT1NFOworCQkJfSBlbHNlIHsKKwkJCQkvKiBBVVRIX0VOQUJMRV9OT0RFICovCisJCQkJdnR5LT5mYWlsID0gMDsKKwkJCQl2dHlfb3V0KHZ0eSwKKwkJCQkJIiUlIEJhZCBlbmFibGUgcGFzc3dvcmRzLCB0b28gbWFueSBmYWlsdXJlcyElcyIsCisJCQkJCVZUWV9ORVdMSU5FKTsKKwkJCQl2dHktPm5vZGUgPSBWSUVXX05PREU7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qIENsb3NlIHZ0eSBpbnRlcmZhY2UuICovCit2b2lkIHZ0eV9jbG9zZShzdHJ1Y3QgdnR5ICp2dHkpCit7CisJaW50IGk7CisKKwlpZiAodnR5LT5vYnVmKSAgeworCQkvKiBGbHVzaCBidWZmZXIuICovCisJCWJ1ZmZlcl9mbHVzaF9hbGwodnR5LT5vYnVmLCB2dHktPmZkKTsKKworCQkvKiBGcmVlIGlucHV0IGJ1ZmZlci4gKi8KKwkJYnVmZmVyX2ZyZWUodnR5LT5vYnVmKTsKKwkJdnR5LT5vYnVmID0gTlVMTDsKKwl9CisKKwkvKiBGcmVlIGNvbW1hbmQgaGlzdG9yeS4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgVlRZX01BWEhJU1Q7IGkrKykKKwkJaWYgKHZ0eS0+aGlzdFtpXSkKKwkJCXRhbGxvY19mcmVlKHZ0eS0+aGlzdFtpXSk7CisKKwkvKiBVbnNldCB2ZWN0b3IuICovCisJdmVjdG9yX3Vuc2V0KHZ0eXZlYywgdnR5LT5mZCk7CisKKwkvKiBDbG9zZSBzb2NrZXQuICovCisJaWYgKHZ0eS0+ZmQgPiAwKQorCQljbG9zZSh2dHktPmZkKTsKKworCWlmICh2dHktPmJ1ZikgeworCQl0YWxsb2NfZnJlZSh2dHktPmJ1Zik7CisJCXZ0eS0+YnVmID0gTlVMTDsKKwl9CisKKwkvKiBDaGVjayBjb25maWd1cmUuICovCisJdnR5X2NvbmZpZ191bmxvY2sodnR5KTsKKworCS8qIEZJWE1FOiBtZW1vcnkgbGVhay4gV2UgbmVlZCB0byBjYWxsIHRlbG5ldF9jbG9zZV9jbGllbnQoKSBidXQgZG9uJ3QKKwkgKiBoYXZlIGJmZCAqLworCXZ0eV9ldmVudChWVFlfQ0xPU0VELCB2dHktPmZkLCB2dHkpOworCisJLyogT0sgZnJlZSB2dHkuICovCisJdGFsbG9jX2ZyZWUodnR5KTsKK30KKworaW50IHZ0eV9zaGVsbChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJcmV0dXJuIHZ0eS0+dHlwZSA9PSBWVFlfU0hFTEwgPyAxIDogMDsKK30KKworCisvKiBWVFkgc3RhbmRhcmQgb3V0cHV0IGZ1bmN0aW9uLiAqLworaW50IHZ0eV9vdXQoc3RydWN0IHZ0eSAqdnR5LCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJaW50IGxlbiA9IDA7CisJaW50IHNpemUgPSAxMDI0OworCWNoYXIgYnVmWzEwMjRdOworCWNoYXIgKnAgPSBOVUxMOworCisJaWYgKHZ0eV9zaGVsbCh2dHkpKSB7CisJCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisJCXZwcmludGYoZm9ybWF0LCBhcmdzKTsKKwkJdmFfZW5kKGFyZ3MpOworCX0gZWxzZSB7CisJCS8qIFRyeSB0byB3cml0ZSB0byBpbml0aWFsIGJ1ZmZlci4gICovCisJCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisJCWxlbiA9IHZzbnByaW50ZihidWYsIHNpemVvZiBidWYsIGZvcm1hdCwgYXJncyk7CisJCXZhX2VuZChhcmdzKTsKKworCQkvKiBJbml0aWFsIGJ1ZmZlciBpcyBub3QgZW5vdWdoLiAgKi8KKwkJaWYgKGxlbiA8IDAgfHwgbGVuID49IHNpemUpIHsKKwkJCXdoaWxlICgxKSB7CisJCQkJaWYgKGxlbiA+IC0xKQorCQkJCQlzaXplID0gbGVuICsgMTsKKwkJCQllbHNlCisJCQkJCXNpemUgPSBzaXplICogMjsKKworCQkJCXAgPSB0YWxsb2NfcmVhbGxvY19zaXplKHRhbGxfdnR5X2N0eCwgcCwgc2l6ZSk7CisJCQkJaWYgKCFwKQorCQkJCQlyZXR1cm4gLTE7CisKKwkJCQl2YV9zdGFydChhcmdzLCBmb3JtYXQpOworCQkJCWxlbiA9IHZzbnByaW50ZihwLCBzaXplLCBmb3JtYXQsIGFyZ3MpOworCQkJCXZhX2VuZChhcmdzKTsKKworCQkJCWlmIChsZW4gPiAtMSAmJiBsZW4gPCBzaXplKQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8qIFdoZW4gaW5pdGlhbCBidWZmZXIgaXMgZW5vdWdoIHRvIHN0b3JlIGFsbCBvdXRwdXQuICAqLworCQlpZiAoIXApCisJCQlwID0gYnVmOworCisJCS8qIFBvaW50ZXIgcCBtdXN0IHBvaW50IG91dCBidWZmZXIuICovCisJCWJ1ZmZlcl9wdXQodnR5LT5vYnVmLCAodV9jaGFyICopIHAsIGxlbik7CisKKwkJLyogSWYgcCBpcyBub3QgZGlmZmVyZW50IHdpdGggYnVmLCBpdCBpcyBhbGxvY2F0ZWQgYnVmZmVyLiAgKi8KKwkJaWYgKHAgIT0gYnVmKQorCQkJdGFsbG9jX2ZyZWUocCk7CisJfQorCisJdnR5X2V2ZW50KFZUWV9XUklURSwgdnR5LT5mZCwgdnR5KTsKKworCXJldHVybiBsZW47Cit9CisKK2ludCB2dHlfb3V0X25ld2xpbmUoc3RydWN0IHZ0eSAqdnR5KQoreworCWNoYXIgKnAgPSB2dHlfbmV3bGluZSh2dHkpOworCWJ1ZmZlcl9wdXQodnR5LT5vYnVmLCBwLCBzdHJsZW4ocCkpOworCXJldHVybiAwOworfQorCitpbnQgdnR5X2NvbmZpZ19sb2NrKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpZiAodnR5X2NvbmZpZyA9PSAwKSB7CisJCXZ0eS0+Y29uZmlnID0gMTsKKwkJdnR5X2NvbmZpZyA9IDE7CisJfQorCXJldHVybiB2dHktPmNvbmZpZzsKK30KKworaW50IHZ0eV9jb25maWdfdW5sb2NrKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpZiAodnR5X2NvbmZpZyA9PSAxICYmIHZ0eS0+Y29uZmlnID09IDEpIHsKKwkJdnR5LT5jb25maWcgPSAwOworCQl2dHlfY29uZmlnID0gMDsKKwl9CisJcmV0dXJuIHZ0eS0+Y29uZmlnOworfQorCisvKiBTYXkgaGVsbG8gdG8gdnR5IGludGVyZmFjZS4gKi8KK3ZvaWQgdnR5X2hlbGxvKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpZiAoaG9zdC5tb3RkZmlsZSkgeworCQlGSUxFICpmOworCQljaGFyIGJ1Zls0MDk2XTsKKworCQlmID0gZm9wZW4oaG9zdC5tb3RkZmlsZSwgInIiKTsKKwkJaWYgKGYpIHsKKwkJCXdoaWxlIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmKSkgeworCQkJCWNoYXIgKnM7CisJCQkJLyogd29yayBiYWNrd2FyZHMgdG8gaWdub3JlIHRyYWlsbGluZyBpc3NwYWNlKCkgKi8KKwkJCQlmb3IgKHMgPSBidWYgKyBzdHJsZW4oYnVmKTsKKwkJCQkgICAgIChzID4gYnVmKSAmJiBpc3NwYWNlKCoocyAtIDEpKTsgcy0tKSA7CisJCQkJKnMgPSAnXDAnOworCQkJCXZ0eV9vdXQodnR5LCAiJXMlcyIsIGJ1ZiwgVlRZX05FV0xJTkUpOworCQkJfQorCQkJZmNsb3NlKGYpOworCQl9IGVsc2UKKwkJCXZ0eV9vdXQodnR5LCAiTU9URCBmaWxlIG5vdCBmb3VuZCVzIiwgVlRZX05FV0xJTkUpOworCX0gZWxzZSBpZiAoaG9zdC5tb3RkKQorCQl2dHlfb3V0KHZ0eSwgIiVzIiwgaG9zdC5tb3RkKTsKK30KKworLyogUHV0IG91dCBwcm9tcHQgYW5kIHdhaXQgaW5wdXQgZnJvbSB1c2VyLiAqLworc3RhdGljIHZvaWQgdnR5X3Byb21wdChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJc3RydWN0IHV0c25hbWUgbmFtZXM7CisJY29uc3QgY2hhciAqaG9zdG5hbWU7CisKKwlpZiAodnR5LT50eXBlID09IFZUWV9URVJNKSB7CisJCWhvc3RuYW1lID0gaG9zdC5uYW1lOworCQlpZiAoIWhvc3RuYW1lKSB7CisJCQl1bmFtZSgmbmFtZXMpOworCQkJaG9zdG5hbWUgPSBuYW1lcy5ub2RlbmFtZTsKKwkJfQorCQl2dHlfb3V0KHZ0eSwgY21kX3Byb21wdCh2dHktPm5vZGUpLCBob3N0bmFtZSk7CisJfQorfQorCisvKiBDb21tYW5kIGV4ZWN1dGlvbiBvdmVyIHRoZSB2dHkgaW50ZXJmYWNlLiAqLworc3RhdGljIGludCB2dHlfY29tbWFuZChzdHJ1Y3QgdnR5ICp2dHksIGNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0OworCXZlY3RvciB2bGluZTsKKworCS8qIFNwbGl0IHJlYWRsaW5lIHN0cmluZyB1cCBpbnRvIHRoZSB2ZWN0b3IgKi8KKwl2bGluZSA9IGNtZF9tYWtlX3N0cnZlYyhidWYpOworCisJaWYgKHZsaW5lID09IE5VTEwpCisJCXJldHVybiBDTURfU1VDQ0VTUzsKKworCXJldCA9IGNtZF9leGVjdXRlX2NvbW1hbmQodmxpbmUsIHZ0eSwgTlVMTCwgMCk7CisJaWYgKHJldCAhPSBDTURfU1VDQ0VTUykKKwkJc3dpdGNoIChyZXQpIHsKKwkJY2FzZSBDTURfV0FSTklORzoKKwkJCWlmICh2dHktPnR5cGUgPT0gVlRZX0ZJTEUpCisJCQkJdnR5X291dCh2dHksICJXYXJuaW5nLi4uJXMiLCBWVFlfTkVXTElORSk7CisJCQlicmVhazsKKwkJY2FzZSBDTURfRVJSX0FNQklHVU9VUzoKKwkJCXZ0eV9vdXQodnR5LCAiJSUgQW1iaWd1b3VzIGNvbW1hbmQuJXMiLCBWVFlfTkVXTElORSk7CisJCQlicmVhazsKKwkJY2FzZSBDTURfRVJSX05PX01BVENIOgorCQkJdnR5X291dCh2dHksICIlJSBVbmtub3duIGNvbW1hbmQuJXMiLCBWVFlfTkVXTElORSk7CisJCQlicmVhazsKKwkJY2FzZSBDTURfRVJSX0lOQ09NUExFVEU6CisJCQl2dHlfb3V0KHZ0eSwgIiUlIENvbW1hbmQgaW5jb21wbGV0ZS4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJCWJyZWFrOworCQl9CisJY21kX2ZyZWVfc3RydmVjKHZsaW5lKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIHRlbG5ldF9iYWNrd2FyZF9jaGFyID0gMHgwODsKK3N0YXRpYyBjb25zdCBjaGFyIHRlbG5ldF9zcGFjZV9jaGFyID0gJyAnOworCisvKiBCYXNpYyBmdW5jdGlvbiB0byB3cml0ZSBidWZmZXIgdG8gdnR5LiAqLworc3RhdGljIHZvaWQgdnR5X3dyaXRlKHN0cnVjdCB2dHkgKnZ0eSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbmJ5dGVzKQoreworCWlmICgodnR5LT5ub2RlID09IEFVVEhfTk9ERSkgfHwgKHZ0eS0+bm9kZSA9PSBBVVRIX0VOQUJMRV9OT0RFKSkKKwkJcmV0dXJuOworCisJLyogU2hvdWxkIHdlIGRvIGJ1ZmZlcmluZyBoZXJlID8gIEFuZCBtYWtlIHZ0eV9mbHVzaCAodnR5KSA/ICovCisJYnVmZmVyX3B1dCh2dHktPm9idWYsIGJ1ZiwgbmJ5dGVzKTsKK30KKworLyogRW5zdXJlIGxlbmd0aCBvZiBpbnB1dCBidWZmZXIuICBJcyBidWZmZXIgaXMgc2hvcnQsIGRvdWJsZSBpdC4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9lbnN1cmUoc3RydWN0IHZ0eSAqdnR5LCBpbnQgbGVuZ3RoKQoreworCWlmICh2dHktPm1heCA8PSBsZW5ndGgpIHsKKwkJdnR5LT5tYXggKj0gMjsKKwkJdnR5LT5idWYgPSB0YWxsb2NfcmVhbGxvY19zaXplKHRhbGxfdnR5X2N0eCwgdnR5LT5idWYsIHZ0eS0+bWF4KTsKKwkJLy8gRklYTUU6IGNoZWNrIHJldHVybgorCX0KK30KKworLyogQmFzaWMgZnVuY3Rpb24gdG8gaW5zZXJ0IGNoYXJhY3RlciBpbnRvIHZ0eS4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9zZWxmX2luc2VydChzdHJ1Y3QgdnR5ICp2dHksIGNoYXIgYykKK3sKKwlpbnQgaTsKKwlpbnQgbGVuZ3RoOworCisJdnR5X2Vuc3VyZSh2dHksIHZ0eS0+bGVuZ3RoICsgMSk7CisJbGVuZ3RoID0gdnR5LT5sZW5ndGggLSB2dHktPmNwOworCW1lbW1vdmUoJnZ0eS0+YnVmW3Z0eS0+Y3AgKyAxXSwgJnZ0eS0+YnVmW3Z0eS0+Y3BdLCBsZW5ndGgpOworCXZ0eS0+YnVmW3Z0eS0+Y3BdID0gYzsKKworCXZ0eV93cml0ZSh2dHksICZ2dHktPmJ1Zlt2dHktPmNwXSwgbGVuZ3RoICsgMSk7CisJZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorCQl2dHlfd3JpdGUodnR5LCAmdGVsbmV0X2JhY2t3YXJkX2NoYXIsIDEpOworCisJdnR5LT5jcCsrOworCXZ0eS0+bGVuZ3RoKys7Cit9CisKKy8qIFNlbGYgaW5zZXJ0IGNoYXJhY3RlciAnYycgaW4gb3ZlcndyaXRlIG1vZGUuICovCitzdGF0aWMgdm9pZCB2dHlfc2VsZl9pbnNlcnRfb3ZlcndyaXRlKHN0cnVjdCB2dHkgKnZ0eSwgY2hhciBjKQoreworCXZ0eV9lbnN1cmUodnR5LCB2dHktPmxlbmd0aCArIDEpOworCXZ0eS0+YnVmW3Z0eS0+Y3ArK10gPSBjOworCisJaWYgKHZ0eS0+Y3AgPiB2dHktPmxlbmd0aCkKKwkJdnR5LT5sZW5ndGgrKzsKKworCWlmICgodnR5LT5ub2RlID09IEFVVEhfTk9ERSkgfHwgKHZ0eS0+bm9kZSA9PSBBVVRIX0VOQUJMRV9OT0RFKSkKKwkJcmV0dXJuOworCisJdnR5X3dyaXRlKHZ0eSwgJmMsIDEpOworfQorCisvKiBJbnNlcnQgYSB3b3JkIGludG8gdnR5IGludGVyZmFjZSB3aXRoIG92ZXJ3cml0ZSBtb2RlLiAqLworc3RhdGljIHZvaWQgdnR5X2luc2VydF93b3JkX292ZXJ3cml0ZShzdHJ1Y3QgdnR5ICp2dHksIGNoYXIgKnN0cikKK3sKKwlpbnQgbGVuID0gc3RybGVuKHN0cik7CisJdnR5X3dyaXRlKHZ0eSwgc3RyLCBsZW4pOworCXN0cmNweSgmdnR5LT5idWZbdnR5LT5jcF0sIHN0cik7CisJdnR5LT5jcCArPSBsZW47CisJdnR5LT5sZW5ndGggPSB2dHktPmNwOworfQorCisvKiBGb3J3YXJkIGNoYXJhY3Rlci4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9mb3J3YXJkX2NoYXIoc3RydWN0IHZ0eSAqdnR5KQoreworCWlmICh2dHktPmNwIDwgdnR5LT5sZW5ndGgpIHsKKwkJdnR5X3dyaXRlKHZ0eSwgJnZ0eS0+YnVmW3Z0eS0+Y3BdLCAxKTsKKwkJdnR5LT5jcCsrOworCX0KK30KKworLyogQmFja3dhcmQgY2hhcmFjdGVyLiAqLworc3RhdGljIHZvaWQgdnR5X2JhY2t3YXJkX2NoYXIoc3RydWN0IHZ0eSAqdnR5KQoreworCWlmICh2dHktPmNwID4gMCkgeworCQl2dHktPmNwLS07CisJCXZ0eV93cml0ZSh2dHksICZ0ZWxuZXRfYmFja3dhcmRfY2hhciwgMSk7CisJfQorfQorCisvKiBNb3ZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUuICovCitzdGF0aWMgdm9pZCB2dHlfYmVnaW5uaW5nX29mX2xpbmUoc3RydWN0IHZ0eSAqdnR5KQoreworCXdoaWxlICh2dHktPmNwKQorCQl2dHlfYmFja3dhcmRfY2hhcih2dHkpOworfQorCisvKiBNb3ZlIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUuICovCitzdGF0aWMgdm9pZCB2dHlfZW5kX29mX2xpbmUoc3RydWN0IHZ0eSAqdnR5KQoreworCXdoaWxlICh2dHktPmNwIDwgdnR5LT5sZW5ndGgpCisJCXZ0eV9mb3J3YXJkX2NoYXIodnR5KTsKK30KKworLyogQWRkIGN1cnJlbnQgY29tbWFuZCBsaW5lIHRvIHRoZSBoaXN0b3J5IGJ1ZmZlci4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9oaXN0X2FkZChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJaW50IGluZGV4OworCisJaWYgKHZ0eS0+bGVuZ3RoID09IDApCisJCXJldHVybjsKKworCWluZGV4ID0gdnR5LT5oaW5kZXggPyB2dHktPmhpbmRleCAtIDEgOiBWVFlfTUFYSElTVCAtIDE7CisKKwkvKiBJZ25vcmUgdGhlIHNhbWUgc3RyaW5nIGFzIHByZXZpb3VzIG9uZS4gKi8KKwlpZiAodnR5LT5oaXN0W2luZGV4XSkKKwkJaWYgKHN0cmNtcCh2dHktPmJ1ZiwgdnR5LT5oaXN0W2luZGV4XSkgPT0gMCkgeworCQkJdnR5LT5ocCA9IHZ0eS0+aGluZGV4OworCQkJcmV0dXJuOworCQl9CisKKwkvKiBJbnNlcnQgaGlzdG9yeSBlbnRyeS4gKi8KKwlpZiAodnR5LT5oaXN0W3Z0eS0+aGluZGV4XSkKKwkJdGFsbG9jX2ZyZWUodnR5LT5oaXN0W3Z0eS0+aGluZGV4XSk7CisJdnR5LT5oaXN0W3Z0eS0+aGluZGV4XSA9IHRhbGxvY19zdHJkdXAodGFsbF92dHlfY3R4LCB2dHktPmJ1Zik7CisKKwkvKiBIaXN0b3J5IGluZGV4IHJvdGF0aW9uLiAqLworCXZ0eS0+aGluZGV4Kys7CisJaWYgKHZ0eS0+aGluZGV4ID09IFZUWV9NQVhISVNUKQorCQl2dHktPmhpbmRleCA9IDA7CisKKwl2dHktPmhwID0gdnR5LT5oaW5kZXg7Cit9CisKKy8qIEdldCB0ZWxuZXQgd2luZG93IHNpemUuICovCitzdGF0aWMgaW50Cit2dHlfdGVsbmV0X29wdGlvbiAoc3RydWN0IHZ0eSAqdnR5LCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBuYnl0ZXMpCit7CisjaWZkZWYgVEVMTkVUX09QVElPTl9ERUJVRworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgbmJ5dGVzOyBpKyspCisgICAgeworICAgICAgc3dpdGNoIChidWZbaV0pCisJeworCWNhc2UgSUFDOgorCSAgdnR5X291dCAodnR5LCAiSUFDICIpOworCSAgYnJlYWs7CisJY2FzZSBXSUxMOgorCSAgdnR5X291dCAodnR5LCAiV0lMTCAiKTsKKwkgIGJyZWFrOworCWNhc2UgV09OVDoKKwkgIHZ0eV9vdXQgKHZ0eSwgIldPTlQgIik7CisJICBicmVhazsKKwljYXNlIERPOgorCSAgdnR5X291dCAodnR5LCAiRE8gIik7CisJICBicmVhazsKKwljYXNlIERPTlQ6CisJICB2dHlfb3V0ICh2dHksICJET05UICIpOworCSAgYnJlYWs7CisJY2FzZSBTQjoKKwkgIHZ0eV9vdXQgKHZ0eSwgIlNCICIpOworCSAgYnJlYWs7CisJY2FzZSBTRToKKwkgIHZ0eV9vdXQgKHZ0eSwgIlNFICIpOworCSAgYnJlYWs7CisJY2FzZSBURUxPUFRfRUNITzoKKwkgIHZ0eV9vdXQgKHZ0eSwgIlRFTE9QVF9FQ0hPICVzIiwgVlRZX05FV0xJTkUpOworCSAgYnJlYWs7CisJY2FzZSBURUxPUFRfU0dBOgorCSAgdnR5X291dCAodnR5LCAiVEVMT1BUX1NHQSAlcyIsIFZUWV9ORVdMSU5FKTsKKwkgIGJyZWFrOworCWNhc2UgVEVMT1BUX05BV1M6CisJICB2dHlfb3V0ICh2dHksICJURUxPUFRfTkFXUyAlcyIsIFZUWV9ORVdMSU5FKTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICB2dHlfb3V0ICh2dHksICIleCAiLCBidWZbaV0pOworCSAgYnJlYWs7CisJfQorICAgIH0KKyAgdnR5X291dCAodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7CisKKyNlbmRpZiAvKiBURUxORVRfT1BUSU9OX0RFQlVHICovCisKKyAgc3dpdGNoIChidWZbMF0pCisgICAgeworICAgIGNhc2UgU0I6CisgICAgICB2dHktPnNiX2xlbiA9IDA7CisgICAgICB2dHktPmlhY19zYl9pbl9wcm9ncmVzcyA9IDE7CisgICAgICByZXR1cm4gMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0U6IAorICAgICAgeworCWlmICghdnR5LT5pYWNfc2JfaW5fcHJvZ3Jlc3MpCisJICByZXR1cm4gMDsKKworCWlmICgodnR5LT5zYl9sZW4gPT0gMCkgfHwgKHZ0eS0+c2JfYnVmWzBdID09ICdcMCcpKQorCSAgeworCSAgICB2dHktPmlhY19zYl9pbl9wcm9ncmVzcyA9IDA7CisJICAgIHJldHVybiAwOworCSAgfQorCXN3aXRjaCAodnR5LT5zYl9idWZbMF0pCisJICB7CisJICBjYXNlIFRFTE9QVF9OQVdTOgorCSAgICBpZiAodnR5LT5zYl9sZW4gIT0gVEVMTkVUX05BV1NfU0JfTEVOKQorCSAgICAgIHZ0eV9vdXQodnR5LCJSRkMgMTA3MyB2aW9sYXRpb24gZGV0ZWN0ZWQ6IHRlbG5ldCBOQVdTIG9wdGlvbiAiCisJCQkic2hvdWxkIHNlbmQgJWQgY2hhcmFjdGVycywgYnV0IHdlIHJlY2VpdmVkICVsdSIsCisJCQlURUxORVRfTkFXU19TQl9MRU4sICh1X2xvbmcpdnR5LT5zYl9sZW4pOworCSAgICBlbHNlIGlmIChzaXplb2YodnR5LT5zYl9idWYpIDwgVEVMTkVUX05BV1NfU0JfTEVOKQorCSAgICAgIHZ0eV9vdXQodnR5LCAiQnVnIGRldGVjdGVkOiBzaXplb2YodnR5LT5zYl9idWYpICVsdSA8ICVkLCAiCisJCSAgICAgICAidG9vIHNtYWxsIHRvIGhhbmRsZSB0aGUgdGVsbmV0IE5BV1Mgb3B0aW9uIiwKKwkJICAgICAgICh1X2xvbmcpc2l6ZW9mKHZ0eS0+c2JfYnVmKSwgVEVMTkVUX05BV1NfU0JfTEVOKTsKKwkgICAgZWxzZQorCSAgICAgIHsKKwkJdnR5LT53aWR0aCA9ICgodnR5LT5zYl9idWZbMV0gPDwgOCl8dnR5LT5zYl9idWZbMl0pOworCQl2dHktPmhlaWdodCA9ICgodnR5LT5zYl9idWZbM10gPDwgOCl8dnR5LT5zYl9idWZbNF0pOworI2lmZGVmIFRFTE5FVF9PUFRJT05fREVCVUcKKwkJdnR5X291dCh2dHksICJURUxORVQgTkFXUyB3aW5kb3cgc2l6ZSBuZWdvdGlhdGlvbiBjb21wbGV0ZWQ6ICIKKwkJCSAgICAgICJ3aWR0aCAlZCwgaGVpZ2h0ICVkJXMiLAorCQkJdnR5LT53aWR0aCwgdnR5LT5oZWlnaHQsIFZUWV9ORVdMSU5FKTsKKyNlbmRpZgorCSAgICAgIH0KKwkgICAgYnJlYWs7CisJICB9CisJdnR5LT5pYWNfc2JfaW5fcHJvZ3Jlc3MgPSAwOworCXJldHVybiAwOworCWJyZWFrOworICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisgIHJldHVybiAxOworfQorCisvKiBFeGVjdXRlIGN1cnJlbnQgY29tbWFuZCBsaW5lLiAqLworc3RhdGljIGludCB2dHlfZXhlY3V0ZShzdHJ1Y3QgdnR5ICp2dHkpCit7CisJaW50IHJldDsKKworCXJldCA9IENNRF9TVUNDRVNTOworCisJc3dpdGNoICh2dHktPm5vZGUpIHsKKwljYXNlIEFVVEhfTk9ERToKKwljYXNlIEFVVEhfRU5BQkxFX05PREU6CisJCXZ0eV9hdXRoKHZ0eSwgdnR5LT5idWYpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSB2dHlfY29tbWFuZCh2dHksIHZ0eS0+YnVmKTsKKwkJaWYgKHZ0eS0+dHlwZSA9PSBWVFlfVEVSTSkKKwkJCXZ0eV9oaXN0X2FkZCh2dHkpOworCQlicmVhazsKKwl9CisKKwkvKiBDbGVhciBjb21tYW5kIGxpbmUgYnVmZmVyLiAqLworCXZ0eS0+Y3AgPSB2dHktPmxlbmd0aCA9IDA7CisJdnR5X2NsZWFyX2J1Zih2dHkpOworCisJaWYgKHZ0eS0+c3RhdHVzICE9IFZUWV9DTE9TRSkKKwkJdnR5X3Byb21wdCh2dHkpOworCisJcmV0dXJuIHJldDsKK30KKworLyogU2VuZCBXSUxMIFRFTE9QVF9FQ0hPIHRvIHJlbW90ZSBzZXJ2ZXIuICovCitzdGF0aWMgdm9pZAordnR5X3dpbGxfZWNobyAoc3RydWN0IHZ0eSAqdnR5KQoreworCXVuc2lnbmVkIGNoYXIgY21kW10gPSB7IElBQywgV0lMTCwgVEVMT1BUX0VDSE8sICdcMCcgfTsKKwl2dHlfb3V0ICh2dHksICIlcyIsIGNtZCk7Cit9CisKKy8qIE1ha2Ugc3VwcHJlc3MgR28tQWhlYWQgdGVsbmV0IG9wdGlvbi4gKi8KK3N0YXRpYyB2b2lkCit2dHlfd2lsbF9zdXBwcmVzc19nb19haGVhZCAoc3RydWN0IHZ0eSAqdnR5KQoreworCXVuc2lnbmVkIGNoYXIgY21kW10gPSB7IElBQywgV0lMTCwgVEVMT1BUX1NHQSwgJ1wwJyB9OworCXZ0eV9vdXQgKHZ0eSwgIiVzIiwgY21kKTsKK30KKworLyogTWFrZSBkb24ndCB1c2UgbGluZW1vZGUgb3ZlciB0ZWxuZXQuICovCitzdGF0aWMgdm9pZAordnR5X2RvbnRfbGluZW1vZGUgKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwl1bnNpZ25lZCBjaGFyIGNtZFtdID0geyBJQUMsIERPTlQsIFRFTE9QVF9MSU5FTU9ERSwgJ1wwJyB9OworCXZ0eV9vdXQgKHZ0eSwgIiVzIiwgY21kKTsKK30KKworLyogVXNlIHdpbmRvdyBzaXplLiAqLworc3RhdGljIHZvaWQKK3Z0eV9kb193aW5kb3dfc2l6ZSAoc3RydWN0IHZ0eSAqdnR5KQoreworCXVuc2lnbmVkIGNoYXIgY21kW10gPSB7IElBQywgRE8sIFRFTE9QVF9OQVdTLCAnXDAnIH07CisJdnR5X291dCAodnR5LCAiJXMiLCBjbWQpOworfQorCitzdGF0aWMgdm9pZCB2dHlfa2lsbF9saW5lX2Zyb21fYmVnaW5uaW5nKHN0cnVjdCB2dHkgKik7CitzdGF0aWMgdm9pZCB2dHlfcmVkcmF3X2xpbmUoc3RydWN0IHZ0eSAqKTsKKworLyogUHJpbnQgY29tbWFuZCBsaW5lIGhpc3RvcnkuICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tCisgICB2dHlfbmV4dF9saW5lIGFuZCB2dHlfcHJldmlvdXNfbGluZS4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9oaXN0b3J5X3ByaW50KHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpbnQgbGVuZ3RoOworCisJdnR5X2tpbGxfbGluZV9mcm9tX2JlZ2lubmluZyh2dHkpOworCisJLyogR2V0IHByZXZpb3VzIGxpbmUgZnJvbSBoaXN0b3J5IGJ1ZmZlciAqLworCWxlbmd0aCA9IHN0cmxlbih2dHktPmhpc3RbdnR5LT5ocF0pOworCW1lbWNweSh2dHktPmJ1ZiwgdnR5LT5oaXN0W3Z0eS0+aHBdLCBsZW5ndGgpOworCXZ0eS0+Y3AgPSB2dHktPmxlbmd0aCA9IGxlbmd0aDsKKworCS8qIFJlZHJhdyBjdXJyZW50IGxpbmUgKi8KKwl2dHlfcmVkcmF3X2xpbmUodnR5KTsKK30KKworLyogU2hvdyBuZXh0IGNvbW1hbmQgbGluZSBoaXN0b3J5LiAqLworc3RhdGljIHZvaWQgdnR5X25leHRfbGluZShzdHJ1Y3QgdnR5ICp2dHkpCit7CisJaW50IHRyeV9pbmRleDsKKworCWlmICh2dHktPmhwID09IHZ0eS0+aGluZGV4KQorCQlyZXR1cm47CisKKwkvKiBUcnkgaXMgdGhlcmUgaGlzdG9yeSBleGlzdCBvciBub3QuICovCisJdHJ5X2luZGV4ID0gdnR5LT5ocDsKKwlpZiAodHJ5X2luZGV4ID09IChWVFlfTUFYSElTVCAtIDEpKQorCQl0cnlfaW5kZXggPSAwOworCWVsc2UKKwkJdHJ5X2luZGV4Kys7CisKKwkvKiBJZiB0aGVyZSBpcyBub3QgaGlzdG9yeSByZXR1cm4uICovCisJaWYgKHZ0eS0+aGlzdFt0cnlfaW5kZXhdID09IE5VTEwpCisJCXJldHVybjsKKwllbHNlCisJCXZ0eS0+aHAgPSB0cnlfaW5kZXg7CisKKwl2dHlfaGlzdG9yeV9wcmludCh2dHkpOworfQorCisvKiBTaG93IHByZXZpb3VzIGNvbW1hbmQgbGluZSBoaXN0b3J5LiAqLworc3RhdGljIHZvaWQgdnR5X3ByZXZpb3VzX2xpbmUoc3RydWN0IHZ0eSAqdnR5KQoreworCWludCB0cnlfaW5kZXg7CisKKwl0cnlfaW5kZXggPSB2dHktPmhwOworCWlmICh0cnlfaW5kZXggPT0gMCkKKwkJdHJ5X2luZGV4ID0gVlRZX01BWEhJU1QgLSAxOworCWVsc2UKKwkJdHJ5X2luZGV4LS07CisKKwlpZiAodnR5LT5oaXN0W3RyeV9pbmRleF0gPT0gTlVMTCkKKwkJcmV0dXJuOworCWVsc2UKKwkJdnR5LT5ocCA9IHRyeV9pbmRleDsKKworCXZ0eV9oaXN0b3J5X3ByaW50KHZ0eSk7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gcmVkcmF3IGFsbCBvZiB0aGUgY29tbWFuZCBsaW5lIGNoYXJhY3Rlci4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9yZWRyYXdfbGluZShzdHJ1Y3QgdnR5ICp2dHkpCit7CisJdnR5X3dyaXRlKHZ0eSwgdnR5LT5idWYsIHZ0eS0+bGVuZ3RoKTsKKwl2dHktPmNwID0gdnR5LT5sZW5ndGg7Cit9CisKKy8qIEZvcndhcmQgd29yZC4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9mb3J3YXJkX3dvcmQoc3RydWN0IHZ0eSAqdnR5KQoreworCXdoaWxlICh2dHktPmNwICE9IHZ0eS0+bGVuZ3RoICYmIHZ0eS0+YnVmW3Z0eS0+Y3BdICE9ICcgJykKKwkJdnR5X2ZvcndhcmRfY2hhcih2dHkpOworCisJd2hpbGUgKHZ0eS0+Y3AgIT0gdnR5LT5sZW5ndGggJiYgdnR5LT5idWZbdnR5LT5jcF0gPT0gJyAnKQorCQl2dHlfZm9yd2FyZF9jaGFyKHZ0eSk7Cit9CisKKy8qIEJhY2t3YXJkIHdvcmQgd2l0aG91dCBza2lwcGluZyB0cmFpbmluZyBzcGFjZS4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9iYWNrd2FyZF9wdXJlX3dvcmQoc3RydWN0IHZ0eSAqdnR5KQoreworCXdoaWxlICh2dHktPmNwID4gMCAmJiB2dHktPmJ1Zlt2dHktPmNwIC0gMV0gIT0gJyAnKQorCQl2dHlfYmFja3dhcmRfY2hhcih2dHkpOworfQorCisvKiBCYWNrd2FyZCB3b3JkLiAqLworc3RhdGljIHZvaWQgdnR5X2JhY2t3YXJkX3dvcmQoc3RydWN0IHZ0eSAqdnR5KQoreworCXdoaWxlICh2dHktPmNwID4gMCAmJiB2dHktPmJ1Zlt2dHktPmNwIC0gMV0gPT0gJyAnKQorCQl2dHlfYmFja3dhcmRfY2hhcih2dHkpOworCisJd2hpbGUgKHZ0eS0+Y3AgPiAwICYmIHZ0eS0+YnVmW3Z0eS0+Y3AgLSAxXSAhPSAnICcpCisJCXZ0eV9iYWNrd2FyZF9jaGFyKHZ0eSk7Cit9CisKKy8qIFdoZW4gJ15EJyBpcyB0eXBlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lIHdlIG1vdmUgdG8gdGhlIGRvd24KKyAgIGxldmVsLiAqLworc3RhdGljIHZvaWQgdnR5X2Rvd25fbGV2ZWwoc3RydWN0IHZ0eSAqdnR5KQoreworCXZ0eV9vdXQodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7CisJKCpjb25maWdfZXhpdF9jbWQuZnVuYykgKE5VTEwsIHZ0eSwgMCwgTlVMTCk7CisJdnR5X3Byb21wdCh2dHkpOworCXZ0eS0+Y3AgPSAwOworfQorCisvKiBXaGVuICdeWicgaXMgcmVjZWl2ZWQgZnJvbSB2dHksIG1vdmUgZG93biB0byB0aGUgZW5hYmxlIG1vZGUuICovCitzdGF0aWMgdm9pZCB2dHlfZW5kX2NvbmZpZyhzdHJ1Y3QgdnR5ICp2dHkpCit7CisJdnR5X291dCh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKKworCXN3aXRjaCAodnR5LT5ub2RlKSB7CisJY2FzZSBWSUVXX05PREU6CisJY2FzZSBFTkFCTEVfTk9ERToKKwkJLyogTm90aGluZyB0byBkby4gKi8KKwkJYnJlYWs7CisJY2FzZSBDT05GSUdfTk9ERToKKwljYXNlIFZUWV9OT0RFOgorCQl2dHlfY29uZmlnX3VubG9jayh2dHkpOworCQl2dHktPm5vZGUgPSBFTkFCTEVfTk9ERTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogVW5rbm93biBub2RlLCB3ZSBoYXZlIHRvIGlnbm9yZSBpdC4gKi8KKwkJYnJlYWs7CisJfQorCisJdnR5X3Byb21wdCh2dHkpOworCXZ0eS0+Y3AgPSAwOworfQorCisvKiBEZWxldGUgYSBjaGFyY3RlciBhdCB0aGUgY3VycmVudCBwb2ludC4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9kZWxldGVfY2hhcihzdHJ1Y3QgdnR5ICp2dHkpCit7CisJaW50IGk7CisJaW50IHNpemU7CisKKwlpZiAodnR5LT5ub2RlID09IEFVVEhfTk9ERSB8fCB2dHktPm5vZGUgPT0gQVVUSF9FTkFCTEVfTk9ERSkKKwkJcmV0dXJuOworCisJaWYgKHZ0eS0+bGVuZ3RoID09IDApIHsKKwkJdnR5X2Rvd25fbGV2ZWwodnR5KTsKKwkJcmV0dXJuOworCX0KKworCWlmICh2dHktPmNwID09IHZ0eS0+bGVuZ3RoKQorCQlyZXR1cm47CQkvKiBjb21wbGV0aW9uIG5lZWQgaGVyZT8gKi8KKworCXNpemUgPSB2dHktPmxlbmd0aCAtIHZ0eS0+Y3A7CisKKwl2dHktPmxlbmd0aC0tOworCW1lbW1vdmUoJnZ0eS0+YnVmW3Z0eS0+Y3BdLCAmdnR5LT5idWZbdnR5LT5jcCArIDFdLCBzaXplIC0gMSk7CisJdnR5LT5idWZbdnR5LT5sZW5ndGhdID0gJ1wwJzsKKworCXZ0eV93cml0ZSh2dHksICZ2dHktPmJ1Zlt2dHktPmNwXSwgc2l6ZSAtIDEpOworCXZ0eV93cml0ZSh2dHksICZ0ZWxuZXRfc3BhY2VfY2hhciwgMSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorCQl2dHlfd3JpdGUodnR5LCAmdGVsbmV0X2JhY2t3YXJkX2NoYXIsIDEpOworfQorCisvKiBEZWxldGUgYSBjaGFyYWN0ZXIgYmVmb3JlIHRoZSBwb2ludC4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9kZWxldGVfYmFja3dhcmRfY2hhcihzdHJ1Y3QgdnR5ICp2dHkpCit7CisJaWYgKHZ0eS0+Y3AgPT0gMCkKKwkJcmV0dXJuOworCisJdnR5X2JhY2t3YXJkX2NoYXIodnR5KTsKKwl2dHlfZGVsZXRlX2NoYXIodnR5KTsKK30KKworLyogS2lsbCByZXN0IG9mIGxpbmUgZnJvbSBjdXJyZW50IHBvaW50LiAqLworc3RhdGljIHZvaWQgdnR5X2tpbGxfbGluZShzdHJ1Y3QgdnR5ICp2dHkpCit7CisJaW50IGk7CisJaW50IHNpemU7CisKKwlzaXplID0gdnR5LT5sZW5ndGggLSB2dHktPmNwOworCisJaWYgKHNpemUgPT0gMCkKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKwkJdnR5X3dyaXRlKHZ0eSwgJnRlbG5ldF9zcGFjZV9jaGFyLCAxKTsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorCQl2dHlfd3JpdGUodnR5LCAmdGVsbmV0X2JhY2t3YXJkX2NoYXIsIDEpOworCisJbWVtc2V0KCZ2dHktPmJ1Zlt2dHktPmNwXSwgMCwgc2l6ZSk7CisJdnR5LT5sZW5ndGggPSB2dHktPmNwOworfQorCisvKiBLaWxsIGxpbmUgZnJvbSB0aGUgYmVnaW5uaW5nLiAqLworc3RhdGljIHZvaWQgdnR5X2tpbGxfbGluZV9mcm9tX2JlZ2lubmluZyhzdHJ1Y3QgdnR5ICp2dHkpCit7CisJdnR5X2JlZ2lubmluZ19vZl9saW5lKHZ0eSk7CisJdnR5X2tpbGxfbGluZSh2dHkpOworfQorCisvKiBEZWxldGUgYSB3b3JkIGJlZm9yZSB0aGUgcG9pbnQuICovCitzdGF0aWMgdm9pZCB2dHlfZm9yd2FyZF9raWxsX3dvcmQoc3RydWN0IHZ0eSAqdnR5KQoreworCXdoaWxlICh2dHktPmNwICE9IHZ0eS0+bGVuZ3RoICYmIHZ0eS0+YnVmW3Z0eS0+Y3BdID09ICcgJykKKwkJdnR5X2RlbGV0ZV9jaGFyKHZ0eSk7CisJd2hpbGUgKHZ0eS0+Y3AgIT0gdnR5LT5sZW5ndGggJiYgdnR5LT5idWZbdnR5LT5jcF0gIT0gJyAnKQorCQl2dHlfZGVsZXRlX2NoYXIodnR5KTsKK30KKworLyogRGVsZXRlIGEgd29yZCBiZWZvcmUgdGhlIHBvaW50LiAqLworc3RhdGljIHZvaWQgdnR5X2JhY2t3YXJkX2tpbGxfd29yZChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJd2hpbGUgKHZ0eS0+Y3AgPiAwICYmIHZ0eS0+YnVmW3Z0eS0+Y3AgLSAxXSA9PSAnICcpCisJCXZ0eV9kZWxldGVfYmFja3dhcmRfY2hhcih2dHkpOworCXdoaWxlICh2dHktPmNwID4gMCAmJiB2dHktPmJ1Zlt2dHktPmNwIC0gMV0gIT0gJyAnKQorCQl2dHlfZGVsZXRlX2JhY2t3YXJkX2NoYXIodnR5KTsKK30KKworLyogVHJhbnNwb3NlIGNoYXJzIGJlZm9yZSBvciBhdCB0aGUgcG9pbnQuICovCitzdGF0aWMgdm9pZCB2dHlfdHJhbnNwb3NlX2NoYXJzKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwljaGFyIGMxLCBjMjsKKworCS8qIElmIGxlbmd0aCBpcyBzaG9ydCBvciBwb2ludCBpcyBuZWFyIGJ5IHRoZSBiZWdpbm5pbmcgb2YgbGluZSB0aGVuCisJICAgcmV0dXJuLiAqLworCWlmICh2dHktPmxlbmd0aCA8IDIgfHwgdnR5LT5jcCA8IDEpCisJCXJldHVybjsKKworCS8qIEluIGNhc2Ugb2YgcG9pbnQgaXMgbG9jYXRlZCBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lLiAqLworCWlmICh2dHktPmNwID09IHZ0eS0+bGVuZ3RoKSB7CisJCWMxID0gdnR5LT5idWZbdnR5LT5jcCAtIDFdOworCQljMiA9IHZ0eS0+YnVmW3Z0eS0+Y3AgLSAyXTsKKworCQl2dHlfYmFja3dhcmRfY2hhcih2dHkpOworCQl2dHlfYmFja3dhcmRfY2hhcih2dHkpOworCQl2dHlfc2VsZl9pbnNlcnRfb3ZlcndyaXRlKHZ0eSwgYzEpOworCQl2dHlfc2VsZl9pbnNlcnRfb3ZlcndyaXRlKHZ0eSwgYzIpOworCX0gZWxzZSB7CisJCWMxID0gdnR5LT5idWZbdnR5LT5jcF07CisJCWMyID0gdnR5LT5idWZbdnR5LT5jcCAtIDFdOworCisJCXZ0eV9iYWNrd2FyZF9jaGFyKHZ0eSk7CisJCXZ0eV9zZWxmX2luc2VydF9vdmVyd3JpdGUodnR5LCBjMSk7CisJCXZ0eV9zZWxmX2luc2VydF9vdmVyd3JpdGUodnR5LCBjMik7CisJfQorfQorCisvKiBEbyBjb21wbGV0aW9uIGF0IHZ0eSBpbnRlcmZhY2UuICovCitzdGF0aWMgdm9pZCB2dHlfY29tcGxldGVfY29tbWFuZChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJaW50IGk7CisJaW50IHJldDsKKwljaGFyICoqbWF0Y2hlZCA9IE5VTEw7CisJdmVjdG9yIHZsaW5lOworCisJaWYgKHZ0eS0+bm9kZSA9PSBBVVRIX05PREUgfHwgdnR5LT5ub2RlID09IEFVVEhfRU5BQkxFX05PREUpCisJCXJldHVybjsKKworCXZsaW5lID0gY21kX21ha2Vfc3RydmVjKHZ0eS0+YnVmKTsKKwlpZiAodmxpbmUgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJLyogSW4gY2FzZSBvZiAnaGVscCBcdCcuICovCisJaWYgKGlzc3BhY2UoKGludCl2dHktPmJ1Zlt2dHktPmxlbmd0aCAtIDFdKSkKKwkJdmVjdG9yX3NldCh2bGluZSwgJ1wwJyk7CisKKwltYXRjaGVkID0gY21kX2NvbXBsZXRlX2NvbW1hbmQodmxpbmUsIHZ0eSwgJnJldCk7CisKKwljbWRfZnJlZV9zdHJ2ZWModmxpbmUpOworCisJdnR5X291dCh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKKwlzd2l0Y2ggKHJldCkgeworCWNhc2UgQ01EX0VSUl9BTUJJR1VPVVM6CisJCXZ0eV9vdXQodnR5LCAiJSUgQW1iaWd1b3VzIGNvbW1hbmQuJXMiLCBWVFlfTkVXTElORSk7CisJCXZ0eV9wcm9tcHQodnR5KTsKKwkJdnR5X3JlZHJhd19saW5lKHZ0eSk7CisJCWJyZWFrOworCWNhc2UgQ01EX0VSUl9OT19NQVRDSDoKKwkJLyogdnR5X291dCAodnR5LCAiJSUgVGhlcmUgaXMgbm8gbWF0Y2hlZCBjb21tYW5kLiVzIiwgVlRZX05FV0xJTkUpOyAqLworCQl2dHlfcHJvbXB0KHZ0eSk7CisJCXZ0eV9yZWRyYXdfbGluZSh2dHkpOworCQlicmVhazsKKwljYXNlIENNRF9DT01QTEVURV9GVUxMX01BVENIOgorCQl2dHlfcHJvbXB0KHZ0eSk7CisJCXZ0eV9yZWRyYXdfbGluZSh2dHkpOworCQl2dHlfYmFja3dhcmRfcHVyZV93b3JkKHZ0eSk7CisJCXZ0eV9pbnNlcnRfd29yZF9vdmVyd3JpdGUodnR5LCBtYXRjaGVkWzBdKTsKKwkJdnR5X3NlbGZfaW5zZXJ0KHZ0eSwgJyAnKTsKKwkJLy90YWxsb2NfZnJlZShtYXRjaGVkWzBdKTsKKwkJYnJlYWs7CisJY2FzZSBDTURfQ09NUExFVEVfTUFUQ0g6CisJCXZ0eV9wcm9tcHQodnR5KTsKKwkJdnR5X3JlZHJhd19saW5lKHZ0eSk7CisJCXZ0eV9iYWNrd2FyZF9wdXJlX3dvcmQodnR5KTsKKwkJdnR5X2luc2VydF93b3JkX292ZXJ3cml0ZSh2dHksIG1hdGNoZWRbMF0pOworCQl0YWxsb2NfZnJlZShtYXRjaGVkWzBdKTsKKwkJdmVjdG9yX29ubHlfaW5kZXhfZnJlZShtYXRjaGVkKTsKKwkJcmV0dXJuOworCQlicmVhazsKKwljYXNlIENNRF9DT01QTEVURV9MSVNUX01BVENIOgorCQlmb3IgKGkgPSAwOyBtYXRjaGVkW2ldICE9IE5VTEw7IGkrKykgeworCQkJaWYgKGkgIT0gMCAmJiAoKGkgJSA2KSA9PSAwKSkKKwkJCQl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOworCQkJdnR5X291dCh2dHksICIlLTEwcyAiLCBtYXRjaGVkW2ldKTsKKwkJCXRhbGxvY19mcmVlKG1hdGNoZWRbaV0pOworCQl9CisJCXZ0eV9vdXQodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7CisKKwkJdnR5X3Byb21wdCh2dHkpOworCQl2dHlfcmVkcmF3X2xpbmUodnR5KTsKKwkJYnJlYWs7CisJY2FzZSBDTURfRVJSX05PVEhJTkdfVE9ETzoKKwkJdnR5X3Byb21wdCh2dHkpOworCQl2dHlfcmVkcmF3X2xpbmUodnR5KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCWlmIChtYXRjaGVkKQorCQl2ZWN0b3Jfb25seV9pbmRleF9mcmVlKG1hdGNoZWQpOworfQorCitzdGF0aWMgdm9pZAordnR5X2Rlc2NyaWJlX2ZvbGQoc3RydWN0IHZ0eSAqdnR5LCBpbnQgY21kX3dpZHRoLAorCQkgIHVuc2lnbmVkIGludCBkZXNjX3dpZHRoLCBzdHJ1Y3QgZGVzYyAqZGVzYykKK3sKKwljaGFyICpidWY7CisJY29uc3QgY2hhciAqY21kLCAqcDsKKwlpbnQgcG9zOworCisJY21kID0gZGVzYy0+Y21kWzBdID09ICcuJyA/IGRlc2MtPmNtZCArIDEgOiBkZXNjLT5jbWQ7CisKKwlpZiAoZGVzY193aWR0aCA8PSAwKSB7CisJCXZ0eV9vdXQodnR5LCAiICAlLSpzICAlcyVzIiwgY21kX3dpZHRoLCBjbWQsIGRlc2MtPnN0ciwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuOworCX0KKworCWJ1ZiA9IF90YWxsb2NfemVybyh0YWxsX3Z0eV9jdHgsIHN0cmxlbihkZXNjLT5zdHIpICsgMSwgImRlc2NyaWJlX2ZvbGQiKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuOworCisJZm9yIChwID0gZGVzYy0+c3RyOyBzdHJsZW4ocCkgPiBkZXNjX3dpZHRoOyBwICs9IHBvcyArIDEpIHsKKwkJZm9yIChwb3MgPSBkZXNjX3dpZHRoOyBwb3MgPiAwOyBwb3MtLSkKKwkJCWlmICgqKHAgKyBwb3MpID09ICcgJykKKwkJCQlicmVhazsKKworCQlpZiAocG9zID09IDApCisJCQlicmVhazsKKworCQlzdHJuY3B5KGJ1ZiwgcCwgcG9zKTsKKwkJYnVmW3Bvc10gPSAnXDAnOworCQl2dHlfb3V0KHZ0eSwgIiAgJS0qcyAgJXMlcyIsIGNtZF93aWR0aCwgY21kLCBidWYsIFZUWV9ORVdMSU5FKTsKKworCQljbWQgPSAiIjsKKwl9CisKKwl2dHlfb3V0KHZ0eSwgIiAgJS0qcyAgJXMlcyIsIGNtZF93aWR0aCwgY21kLCBwLCBWVFlfTkVXTElORSk7CisKKwl0YWxsb2NfZnJlZShidWYpOworfQorCisvKiBEZXNjcmliZSBtYXRjaGVkIGNvbW1hbmQgZnVuY3Rpb24uICovCitzdGF0aWMgdm9pZCB2dHlfZGVzY3JpYmVfY29tbWFuZChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJaW50IHJldDsKKwl2ZWN0b3IgdmxpbmU7CisJdmVjdG9yIGRlc2NyaWJlOworCXVuc2lnbmVkIGludCBpLCB3aWR0aCwgZGVzY193aWR0aDsKKwlzdHJ1Y3QgZGVzYyAqZGVzYywgKmRlc2NfY3IgPSBOVUxMOworCisJdmxpbmUgPSBjbWRfbWFrZV9zdHJ2ZWModnR5LT5idWYpOworCisJLyogSW4gY2FzZSBvZiAnPiA/Jy4gKi8KKwlpZiAodmxpbmUgPT0gTlVMTCkgeworCQl2bGluZSA9IHZlY3Rvcl9pbml0KDEpOworCQl2ZWN0b3Jfc2V0KHZsaW5lLCAnXDAnKTsKKwl9IGVsc2UgaWYgKGlzc3BhY2UoKGludCl2dHktPmJ1Zlt2dHktPmxlbmd0aCAtIDFdKSkKKwkJdmVjdG9yX3NldCh2bGluZSwgJ1wwJyk7CisKKwlkZXNjcmliZSA9IGNtZF9kZXNjcmliZV9jb21tYW5kKHZsaW5lLCB2dHksICZyZXQpOworCisJdnR5X291dCh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKKworCS8qIEFtYmlndW91cyBlcnJvci4gKi8KKwlzd2l0Y2ggKHJldCkgeworCWNhc2UgQ01EX0VSUl9BTUJJR1VPVVM6CisJCWNtZF9mcmVlX3N0cnZlYyh2bGluZSk7CisJCXZ0eV9vdXQodnR5LCAiJSUgQW1iaWd1b3VzIGNvbW1hbmQuJXMiLCBWVFlfTkVXTElORSk7CisJCXZ0eV9wcm9tcHQodnR5KTsKKwkJdnR5X3JlZHJhd19saW5lKHZ0eSk7CisJCXJldHVybjsKKwkJYnJlYWs7CisJY2FzZSBDTURfRVJSX05PX01BVENIOgorCQljbWRfZnJlZV9zdHJ2ZWModmxpbmUpOworCQl2dHlfb3V0KHZ0eSwgIiUlIFRoZXJlIGlzIG5vIG1hdGNoZWQgY29tbWFuZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJdnR5X3Byb21wdCh2dHkpOworCQl2dHlfcmVkcmF3X2xpbmUodnR5KTsKKwkJcmV0dXJuOworCQlicmVhazsKKwl9CisKKwkvKiBHZXQgd2lkdGggb2YgY29tbWFuZCBzdHJpbmcuICovCisJd2lkdGggPSAwOworCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKGRlc2NyaWJlKTsgaSsrKQorCQlpZiAoKGRlc2MgPSB2ZWN0b3Jfc2xvdChkZXNjcmliZSwgaSkpICE9IE5VTEwpIHsKKwkJCXVuc2lnbmVkIGludCBsZW47CisKKwkJCWlmIChkZXNjLT5jbWRbMF0gPT0gJ1wwJykKKwkJCQljb250aW51ZTsKKworCQkJbGVuID0gc3RybGVuKGRlc2MtPmNtZCk7CisJCQlpZiAoZGVzYy0+Y21kWzBdID09ICcuJykKKwkJCQlsZW4tLTsKKworCQkJaWYgKHdpZHRoIDwgbGVuKQorCQkJCXdpZHRoID0gbGVuOworCQl9CisKKwkvKiBHZXQgd2lkdGggb2YgZGVzY3JpcHRpb24gc3RyaW5nLiAqLworCWRlc2Nfd2lkdGggPSB2dHktPndpZHRoIC0gKHdpZHRoICsgNik7CisKKwkvKiBQcmludCBvdXQgZGVzY3JpcHRpb24uICovCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUoZGVzY3JpYmUpOyBpKyspCisJCWlmICgoZGVzYyA9IHZlY3Rvcl9zbG90KGRlc2NyaWJlLCBpKSkgIT0gTlVMTCkgeworCQkJaWYgKGRlc2MtPmNtZFswXSA9PSAnXDAnKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoc3RyY21wKGRlc2MtPmNtZCwgIjxjcj4iKSA9PSAwKSB7CisJCQkJZGVzY19jciA9IGRlc2M7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmICghZGVzYy0+c3RyKQorCQkJCXZ0eV9vdXQodnR5LCAiICAlLXMlcyIsCisJCQkJCWRlc2MtPmNtZFswXSA9PQorCQkJCQknLicgPyBkZXNjLT5jbWQgKyAxIDogZGVzYy0+Y21kLAorCQkJCQlWVFlfTkVXTElORSk7CisJCQllbHNlIGlmIChkZXNjX3dpZHRoID49IHN0cmxlbihkZXNjLT5zdHIpKQorCQkJCXZ0eV9vdXQodnR5LCAiICAlLSpzICAlcyVzIiwgd2lkdGgsCisJCQkJCWRlc2MtPmNtZFswXSA9PQorCQkJCQknLicgPyBkZXNjLT5jbWQgKyAxIDogZGVzYy0+Y21kLAorCQkJCQlkZXNjLT5zdHIsIFZUWV9ORVdMSU5FKTsKKwkJCWVsc2UKKwkJCQl2dHlfZGVzY3JpYmVfZm9sZCh2dHksIHdpZHRoLCBkZXNjX3dpZHRoLCBkZXNjKTsKKworI2lmIDAKKwkJCXZ0eV9vdXQodnR5LCAiICAlLSpzICVzJXMiLCB3aWR0aAorCQkJCWRlc2MtPmNtZFswXSA9PSAnLicgPyBkZXNjLT5jbWQgKyAxIDogZGVzYy0+Y21kLAorCQkJCWRlc2MtPnN0ciA/IGRlc2MtPnN0ciA6ICIiLCBWVFlfTkVXTElORSk7CisjZW5kaWYJCQkJLyogMCAqLworCQl9CisKKwlpZiAoKGRlc2MgPSBkZXNjX2NyKSkgeworCQlpZiAoIWRlc2MtPnN0cikKKwkJCXZ0eV9vdXQodnR5LCAiICAlLXMlcyIsCisJCQkJZGVzYy0+Y21kWzBdID09ICcuJyA/IGRlc2MtPmNtZCArIDEgOiBkZXNjLT5jbWQsCisJCQkJVlRZX05FV0xJTkUpOworCQllbHNlIGlmIChkZXNjX3dpZHRoID49IHN0cmxlbihkZXNjLT5zdHIpKQorCQkJdnR5X291dCh2dHksICIgICUtKnMgICVzJXMiLCB3aWR0aCwKKwkJCQlkZXNjLT5jbWRbMF0gPT0gJy4nID8gZGVzYy0+Y21kICsgMSA6IGRlc2MtPmNtZCwKKwkJCQlkZXNjLT5zdHIsIFZUWV9ORVdMSU5FKTsKKwkJZWxzZQorCQkJdnR5X2Rlc2NyaWJlX2ZvbGQodnR5LCB3aWR0aCwgZGVzY193aWR0aCwgZGVzYyk7CisJfQorCisJY21kX2ZyZWVfc3RydmVjKHZsaW5lKTsKKwl2ZWN0b3JfZnJlZShkZXNjcmliZSk7CisKKwl2dHlfcHJvbXB0KHZ0eSk7CisJdnR5X3JlZHJhd19saW5lKHZ0eSk7Cit9CisKKy8qIF5DIHN0b3AgY3VycmVudCBpbnB1dCBhbmQgZG8gbm90IGFkZCBjb21tYW5kIGxpbmUgdG8gdGhlIGhpc3RvcnkuICovCitzdGF0aWMgdm9pZCB2dHlfc3RvcF9pbnB1dChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJdnR5LT5jcCA9IHZ0eS0+bGVuZ3RoID0gMDsKKwl2dHlfY2xlYXJfYnVmKHZ0eSk7CisJdnR5X291dCh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKKworCXN3aXRjaCAodnR5LT5ub2RlKSB7CisJY2FzZSBWSUVXX05PREU6CisJY2FzZSBFTkFCTEVfTk9ERToKKwkJLyogTm90aGluZyB0byBkby4gKi8KKwkJYnJlYWs7CisJY2FzZSBDT05GSUdfTk9ERToKKwljYXNlIFZUWV9OT0RFOgorCQl2dHlfY29uZmlnX3VubG9jayh2dHkpOworCQl2dHktPm5vZGUgPSBFTkFCTEVfTk9ERTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogVW5rbm93biBub2RlLCB3ZSBoYXZlIHRvIGlnbm9yZSBpdC4gKi8KKwkJYnJlYWs7CisJfQorCXZ0eV9wcm9tcHQodnR5KTsKKworCS8qIFNldCBoaXN0b3J5IHBvaW50ZXIgdG8gdGhlIGxhdGVzdCBvbmUuICovCisJdnR5LT5ocCA9IHZ0eS0+aGluZGV4OworfQorCisjZGVmaW5lIENPTlRST0woWCkgICgoWCkgLSAnQCcpCisjZGVmaW5lIFZUWV9OT1JNQUwgICAgIDAKKyNkZWZpbmUgVlRZX1BSRV9FU0NBUEUgMQorI2RlZmluZSBWVFlfRVNDQVBFICAgICAyCisKKy8qIEVzY2FwZSBjaGFyYWN0ZXIgY29tbWFuZCBtYXAuICovCitzdGF0aWMgdm9pZCB2dHlfZXNjYXBlX21hcCh1bnNpZ25lZCBjaGFyIGMsIHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlzd2l0Y2ggKGMpIHsKKwljYXNlICgnQScpOgorCQl2dHlfcHJldmlvdXNfbGluZSh2dHkpOworCQlicmVhazsKKwljYXNlICgnQicpOgorCQl2dHlfbmV4dF9saW5lKHZ0eSk7CisJCWJyZWFrOworCWNhc2UgKCdDJyk6CisJCXZ0eV9mb3J3YXJkX2NoYXIodnR5KTsKKwkJYnJlYWs7CisJY2FzZSAoJ0QnKToKKwkJdnR5X2JhY2t3YXJkX2NoYXIodnR5KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJLyogR28gYmFjayB0byBub3JtYWwgbW9kZS4gKi8KKwl2dHktPmVzY2FwZSA9IFZUWV9OT1JNQUw7Cit9CisKKy8qIFF1aXQgcHJpbnQgb3V0IHRvIHRoZSBidWZmZXIuICovCitzdGF0aWMgdm9pZCB2dHlfYnVmZmVyX3Jlc2V0KHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlidWZmZXJfcmVzZXQodnR5LT5vYnVmKTsKKwl2dHlfcHJvbXB0KHZ0eSk7CisJdnR5X3JlZHJhd19saW5lKHZ0eSk7Cit9CisKKy8qIFJlYWQgZGF0YSB2aWEgdnR5IHNvY2tldC4gKi8KK2ludCB2dHlfcmVhZChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJaW50IGk7CisJaW50IG5ieXRlczsKKwl1bnNpZ25lZCBjaGFyIGJ1ZltWVFlfUkVBRF9CVUZTSVpdOworCisJaW50IHZ0eV9zb2NrID0gdnR5LT5mZDsKKworCS8qIFJlYWQgcmF3IGRhdGEgZnJvbSBzb2NrZXQgKi8KKwlpZiAoKG5ieXRlcyA9IHJlYWQodnR5LT5mZCwgYnVmLCBWVFlfUkVBRF9CVUZTSVopKSA8PSAwKSB7CisJCWlmIChuYnl0ZXMgPCAwKSB7CisJCQlpZiAoRVJSTk9fSU9fUkVUUlkoZXJybm8pKSB7CisJCQkJdnR5X2V2ZW50KFZUWV9SRUFELCB2dHlfc29jaywgdnR5KTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCQlidWZmZXJfcmVzZXQodnR5LT5vYnVmKTsKKwkJdnR5LT5zdGF0dXMgPSBWVFlfQ0xPU0U7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG5ieXRlczsgaSsrKSB7CisJCWlmIChidWZbaV0gPT0gSUFDKSB7CisJCQlpZiAoIXZ0eS0+aWFjKSB7CisJCQkJdnR5LT5pYWMgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIHsKKwkJCQl2dHktPmlhYyA9IDA7CisJCQl9CisJCX0KKworCQlpZiAodnR5LT5pYWNfc2JfaW5fcHJvZ3Jlc3MgJiYgIXZ0eS0+aWFjKSB7CisJCQlpZiAodnR5LT5zYl9sZW4gPCBzaXplb2YodnR5LT5zYl9idWYpKQorCQkJCXZ0eS0+c2JfYnVmW3Z0eS0+c2JfbGVuXSA9IGJ1ZltpXTsKKwkJCXZ0eS0+c2JfbGVuKys7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICh2dHktPmlhYykgeworCQkJLyogSW4gY2FzZSBvZiB0ZWxuZXQgY29tbWFuZCAqLworCQkJaW50IHJldCA9IDA7CisJCQlyZXQgPSB2dHlfdGVsbmV0X29wdGlvbih2dHksIGJ1ZiArIGksIG5ieXRlcyAtIGkpOworCQkJdnR5LT5pYWMgPSAwOworCQkJaSArPSByZXQ7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICh2dHktPnN0YXR1cyA9PSBWVFlfTU9SRSkgeworCQkJc3dpdGNoIChidWZbaV0pIHsKKwkJCWNhc2UgQ09OVFJPTCgnQycpOgorCQkJY2FzZSAncSc6CisJCQljYXNlICdRJzoKKwkJCQl2dHlfYnVmZmVyX3Jlc2V0KHZ0eSk7CisJCQkJYnJlYWs7CisjaWYgMAkJCQkvKiBNb3JlIGxpbmUgZG9lcyBub3Qgd29yayBmb3IgInNob3cgaXAgYmdwIi4gICovCisJCQljYXNlICdcbic6CisJCQljYXNlICdccic6CisJCQkJdnR5LT5zdGF0dXMgPSBWVFlfTU9SRUxJTkU7CisJCQkJYnJlYWs7CisjZW5kaWYKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIEVzY2FwZSBjaGFyYWN0ZXIuICovCisJCWlmICh2dHktPmVzY2FwZSA9PSBWVFlfRVNDQVBFKSB7CisJCQl2dHlfZXNjYXBlX21hcChidWZbaV0sIHZ0eSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFByZS1lc2NhcGUgc3RhdHVzLiAqLworCQlpZiAodnR5LT5lc2NhcGUgPT0gVlRZX1BSRV9FU0NBUEUpIHsKKwkJCXN3aXRjaCAoYnVmW2ldKSB7CisJCQljYXNlICdbJzoKKwkJCQl2dHktPmVzY2FwZSA9IFZUWV9FU0NBUEU7CisJCQkJYnJlYWs7CisJCQljYXNlICdiJzoKKwkJCQl2dHlfYmFja3dhcmRfd29yZCh2dHkpOworCQkJCXZ0eS0+ZXNjYXBlID0gVlRZX05PUk1BTDsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2YnOgorCQkJCXZ0eV9mb3J3YXJkX3dvcmQodnR5KTsKKwkJCQl2dHktPmVzY2FwZSA9IFZUWV9OT1JNQUw7CisJCQkJYnJlYWs7CisJCQljYXNlICdkJzoKKwkJCQl2dHlfZm9yd2FyZF9raWxsX3dvcmQodnR5KTsKKwkJCQl2dHktPmVzY2FwZSA9IFZUWV9OT1JNQUw7CisJCQkJYnJlYWs7CisJCQljYXNlIENPTlRST0woJ0gnKToKKwkJCWNhc2UgMHg3ZjoKKwkJCQl2dHlfYmFja3dhcmRfa2lsbF93b3JkKHZ0eSk7CisJCQkJdnR5LT5lc2NhcGUgPSBWVFlfTk9STUFMOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQl2dHktPmVzY2FwZSA9IFZUWV9OT1JNQUw7CisJCQkJYnJlYWs7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCXN3aXRjaCAoYnVmW2ldKSB7CisJCWNhc2UgQ09OVFJPTCgnQScpOgorCQkJdnR5X2JlZ2lubmluZ19vZl9saW5lKHZ0eSk7CisJCQlicmVhazsKKwkJY2FzZSBDT05UUk9MKCdCJyk6CisJCQl2dHlfYmFja3dhcmRfY2hhcih2dHkpOworCQkJYnJlYWs7CisJCWNhc2UgQ09OVFJPTCgnQycpOgorCQkJdnR5X3N0b3BfaW5wdXQodnR5KTsKKwkJCWJyZWFrOworCQljYXNlIENPTlRST0woJ0QnKToKKwkJCXZ0eV9kZWxldGVfY2hhcih2dHkpOworCQkJYnJlYWs7CisJCWNhc2UgQ09OVFJPTCgnRScpOgorCQkJdnR5X2VuZF9vZl9saW5lKHZ0eSk7CisJCQlicmVhazsKKwkJY2FzZSBDT05UUk9MKCdGJyk6CisJCQl2dHlfZm9yd2FyZF9jaGFyKHZ0eSk7CisJCQlicmVhazsKKwkJY2FzZSBDT05UUk9MKCdIJyk6CisJCWNhc2UgMHg3ZjoKKwkJCXZ0eV9kZWxldGVfYmFja3dhcmRfY2hhcih2dHkpOworCQkJYnJlYWs7CisJCWNhc2UgQ09OVFJPTCgnSycpOgorCQkJdnR5X2tpbGxfbGluZSh2dHkpOworCQkJYnJlYWs7CisJCWNhc2UgQ09OVFJPTCgnTicpOgorCQkJdnR5X25leHRfbGluZSh2dHkpOworCQkJYnJlYWs7CisJCWNhc2UgQ09OVFJPTCgnUCcpOgorCQkJdnR5X3ByZXZpb3VzX2xpbmUodnR5KTsKKwkJCWJyZWFrOworCQljYXNlIENPTlRST0woJ1QnKToKKwkJCXZ0eV90cmFuc3Bvc2VfY2hhcnModnR5KTsKKwkJCWJyZWFrOworCQljYXNlIENPTlRST0woJ1UnKToKKwkJCXZ0eV9raWxsX2xpbmVfZnJvbV9iZWdpbm5pbmcodnR5KTsKKwkJCWJyZWFrOworCQljYXNlIENPTlRST0woJ1cnKToKKwkJCXZ0eV9iYWNrd2FyZF9raWxsX3dvcmQodnR5KTsKKwkJCWJyZWFrOworCQljYXNlIENPTlRST0woJ1onKToKKwkJCXZ0eV9lbmRfY29uZmlnKHZ0eSk7CisJCQlicmVhazsKKwkJY2FzZSAnXG4nOgorCQljYXNlICdccic6CisJCQl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOworCQkJdnR5X2V4ZWN1dGUodnR5KTsKKwkJCWJyZWFrOworCQljYXNlICdcdCc6CisJCQl2dHlfY29tcGxldGVfY29tbWFuZCh2dHkpOworCQkJYnJlYWs7CisJCWNhc2UgJz8nOgorCQkJaWYgKHZ0eS0+bm9kZSA9PSBBVVRIX05PREUKKwkJCSAgICB8fCB2dHktPm5vZGUgPT0gQVVUSF9FTkFCTEVfTk9ERSkKKwkJCQl2dHlfc2VsZl9pbnNlcnQodnR5LCBidWZbaV0pOworCQkJZWxzZQorCQkJCXZ0eV9kZXNjcmliZV9jb21tYW5kKHZ0eSk7CisJCQlicmVhazsKKwkJY2FzZSAnXDAzMyc6CisJCQlpZiAoaSArIDEgPCBuYnl0ZXMgJiYgYnVmW2kgKyAxXSA9PSAnWycpIHsKKwkJCQl2dHktPmVzY2FwZSA9IFZUWV9FU0NBUEU7CisJCQkJaSsrOworCQkJfSBlbHNlCisJCQkJdnR5LT5lc2NhcGUgPSBWVFlfUFJFX0VTQ0FQRTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaWYgKGJ1ZltpXSA+IDMxICYmIGJ1ZltpXSA8IDEyNykKKwkJCQl2dHlfc2VsZl9pbnNlcnQodnR5LCBidWZbaV0pOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBDaGVjayBzdGF0dXMuICovCisJaWYgKHZ0eS0+c3RhdHVzID09IFZUWV9DTE9TRSkKKwkJdnR5X2Nsb3NlKHZ0eSk7CisJZWxzZSB7CisJCXZ0eV9ldmVudChWVFlfV1JJVEUsIHZ0eV9zb2NrLCB2dHkpOworCQl2dHlfZXZlbnQoVlRZX1JFQUQsIHZ0eV9zb2NrLCB2dHkpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogUmVhZCB1cCBjb25maWd1cmF0aW9uIGZpbGUgKi8KK3N0YXRpYyBpbnQKK3Z0eV9yZWFkX2ZpbGUoRklMRSAqY29uZnApCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgdnR5ICp2dHk7CisKKwl2dHkgPSB2dHlfbmV3KCk7CisJdnR5LT5mZCA9IDA7CisJdnR5LT50eXBlID0gVlRZX0ZJTEU7CisJdnR5LT5ub2RlID0gQ09ORklHX05PREU7CisKKwlyZXQgPSBjb25maWdfZnJvbV9maWxlKHZ0eSwgY29uZnApOworCisJaWYgKHJldCAhPSBDTURfU1VDQ0VTUykgeworCQlzd2l0Y2ggKHJldCkgeworCQljYXNlIENNRF9FUlJfQU1CSUdVT1VTOgorCQkJZnByaW50ZihzdGRlcnIsICJBbWJpZ3VvdXMgY29tbWFuZC5cbiIpOworCQkJYnJlYWs7CisJCWNhc2UgQ01EX0VSUl9OT19NQVRDSDoKKwkJCWZwcmludGYoc3RkZXJyLCAiVGhlcmUgaXMgbm8gc3VjaCBjb21tYW5kLlxuIik7CisJCQlicmVhazsKKwkJfQorCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yIG9jY3VycmVkIGR1cmluZyByZWFkaW5nIGJlbG93ICIKKwkJCSJsaW5lOlxuJXNcbiIsIHZ0eS0+YnVmKTsKKwkJdnR5X2Nsb3NlKHZ0eSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXZ0eV9jbG9zZSh2dHkpOworCXJldHVybiAwOworfQorCisvKiBDcmVhdGUgbmV3IHZ0eSBzdHJ1Y3R1cmUuICovCitzdHJ1Y3QgdnR5ICoKK3Z0eV9jcmVhdGUgKGludCB2dHlfc29jaywgdm9pZCAqcHJpdikKK3sKKyAgc3RydWN0IHZ0eSAqdnR5OworCisJc3RydWN0IHRlcm1pb3MgdDsKKworCXRjZ2V0YXR0cih2dHlfc29jaywgJnQpOworCWNmbWFrZXJhdygmdCk7CisJdGNzZXRhdHRyKHZ0eV9zb2NrLCBUQ1NBTk9XLCAmdCk7CisKKyAgLyogQWxsb2NhdGUgbmV3IHZ0eSBzdHJ1Y3R1cmUgYW5kIHNldCB1cCBkZWZhdWx0IHZhbHVlcy4gKi8KKyAgdnR5ID0gdnR5X25ldyAoKTsKKyAgdnR5LT5mZCA9IHZ0eV9zb2NrOworICB2dHktPnByaXYgPSBwcml2OworICB2dHktPnR5cGUgPSBWVFlfVEVSTTsKKyAgaWYgKG5vX3Bhc3N3b3JkX2NoZWNrKQorICAgIHsKKyAgICAgIGlmIChob3N0LmFkdmFuY2VkKQorCXZ0eS0+bm9kZSA9IEVOQUJMRV9OT0RFOworICAgICAgZWxzZQorCXZ0eS0+bm9kZSA9IFZJRVdfTk9ERTsKKyAgICB9CisgIGVsc2UKKyAgICB2dHktPm5vZGUgPSBBVVRIX05PREU7CisgIHZ0eS0+ZmFpbCA9IDA7CisgIHZ0eS0+Y3AgPSAwOworICB2dHlfY2xlYXJfYnVmICh2dHkpOworICB2dHktPmxlbmd0aCA9IDA7CisgIG1lbXNldCAodnR5LT5oaXN0LCAwLCBzaXplb2YgKHZ0eS0+aGlzdCkpOworICB2dHktPmhwID0gMDsKKyAgdnR5LT5oaW5kZXggPSAwOworICB2ZWN0b3Jfc2V0X2luZGV4ICh2dHl2ZWMsIHZ0eV9zb2NrLCB2dHkpOworICB2dHktPnN0YXR1cyA9IFZUWV9OT1JNQUw7CisgIGlmIChob3N0LmxpbmVzID49IDApCisgICAgdnR5LT5saW5lcyA9IGhvc3QubGluZXM7CisgIGVsc2UKKyAgICB2dHktPmxpbmVzID0gLTE7CisKKyAgaWYgKCEgbm9fcGFzc3dvcmRfY2hlY2spCisgICAgeworICAgICAgLyogVnR5IGlzIG5vdCBhdmFpbGFibGUgaWYgcGFzc3dvcmQgaXNuJ3Qgc2V0LiAqLworICAgICAgaWYgKGhvc3QucGFzc3dvcmQgPT0gTlVMTCAmJiBob3N0LnBhc3N3b3JkX2VuY3J5cHQgPT0gTlVMTCkKKwl7CisJICB2dHlfb3V0ICh2dHksICJWdHkgcGFzc3dvcmQgaXMgbm90IHNldC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkgIHZ0eS0+c3RhdHVzID0gVlRZX0NMT1NFOworCSAgdnR5X2Nsb3NlICh2dHkpOworCSAgcmV0dXJuIE5VTEw7CisJfQorICAgIH0KKworICAvKiBTYXkgaGVsbG8gdG8gdGhlIHdvcmxkLiAqLworICB2dHlfaGVsbG8gKHZ0eSk7CisgIGlmICghIG5vX3Bhc3N3b3JkX2NoZWNrKQorICAgIHZ0eV9vdXQgKHZ0eSwgIiVzVXNlciBBY2Nlc3MgVmVyaWZpY2F0aW9uJXMlcyIsIFZUWV9ORVdMSU5FLCBWVFlfTkVXTElORSwgVlRZX05FV0xJTkUpOworCisgIC8qIFNldHRpbmcgdXAgdGVybWluYWwuICovCisgIHZ0eV93aWxsX2VjaG8gKHZ0eSk7CisgIHZ0eV93aWxsX3N1cHByZXNzX2dvX2FoZWFkICh2dHkpOworCisgIHZ0eV9kb250X2xpbmVtb2RlICh2dHkpOworICB2dHlfZG9fd2luZG93X3NpemUgKHZ0eSk7CisgIC8qIHZ0eV9kb250X2xmbG93X2FoZWFkICh2dHkpOyAqLworCisgIHZ0eV9wcm9tcHQgKHZ0eSk7CisKKyAgLyogQWRkIHJlYWQvd3JpdGUgdGhyZWFkLiAqLworICB2dHlfZXZlbnQgKFZUWV9XUklURSwgdnR5X3NvY2ssIHZ0eSk7CisgIHZ0eV9ldmVudCAoVlRZX1JFQUQsIHZ0eV9zb2NrLCB2dHkpOworCisgIHJldHVybiB2dHk7Cit9CisKK0RFRlVOKGNvbmZpZ193aG8sIGNvbmZpZ193aG9fY21kLCAid2hvIiwgIkRpc3BsYXkgd2hvIGlzIG9uIHZ0eVxuIikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgdnR5ICp2OworCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUodnR5dmVjKTsgaSsrKQorCQlpZiAoKHYgPSB2ZWN0b3Jfc2xvdCh2dHl2ZWMsIGkpKSAhPSBOVUxMKQorCQkJdnR5X291dCh2dHksICIlc3Z0eVslZF0gJXMiLAorCQkJCXYtPmNvbmZpZyA/ICIqIiA6ICIgIiwgaSwgVlRZX05FV0xJTkUpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogTW92ZSB0byB2dHkgY29uZmlndXJhdGlvbiBtb2RlLiAqLworREVGVU4obGluZV92dHksCisgICAgICBsaW5lX3Z0eV9jbWQsCisgICAgICAibGluZSB2dHkiLCAiQ29uZmlndXJlIGEgdGVybWluYWwgbGluZVxuIiAiVmlydHVhbCB0ZXJtaW5hbFxuIikKK3sKKwl2dHktPm5vZGUgPSBWVFlfTk9ERTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIHZ0eSBsb2dpbi4gKi8KK0RFRlVOKHZ0eV9sb2dpbiwgdnR5X2xvZ2luX2NtZCwgImxvZ2luIiwgIkVuYWJsZSBwYXNzd29yZCBjaGVja2luZ1xuIikKK3sKKwlub19wYXNzd29yZF9jaGVjayA9IDA7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihub192dHlfbG9naW4sCisgICAgICBub192dHlfbG9naW5fY21kLCAibm8gbG9naW4iLCBOT19TVFIgIkVuYWJsZSBwYXNzd29yZCBjaGVja2luZ1xuIikKK3sKKwlub19wYXNzd29yZF9jaGVjayA9IDE7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihzZXJ2aWNlX2FkdmFuY2VkX3Z0eSwKKyAgICAgIHNlcnZpY2VfYWR2YW5jZWRfdnR5X2NtZCwKKyAgICAgICJzZXJ2aWNlIGFkdmFuY2VkLXZ0eSIsCisgICAgICAiU2V0IHVwIG1pc2NlbGxhbmVvdXMgc2VydmljZVxuIiAiRW5hYmxlIGFkdmFuY2VkIG1vZGUgdnR5IGludGVyZmFjZVxuIikKK3sKKwlob3N0LmFkdmFuY2VkID0gMTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKG5vX3NlcnZpY2VfYWR2YW5jZWRfdnR5LAorICAgICAgbm9fc2VydmljZV9hZHZhbmNlZF92dHlfY21kLAorICAgICAgIm5vIHNlcnZpY2UgYWR2YW5jZWQtdnR5IiwKKyAgICAgIE5PX1NUUgorICAgICAgIlNldCB1cCBtaXNjZWxsYW5lb3VzIHNlcnZpY2VcbiIgIkVuYWJsZSBhZHZhbmNlZCBtb2RlIHZ0eSBpbnRlcmZhY2VcbiIpCit7CisJaG9zdC5hZHZhbmNlZCA9IDA7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTih0ZXJtaW5hbF9tb25pdG9yLAorICAgICAgdGVybWluYWxfbW9uaXRvcl9jbWQsCisgICAgICAidGVybWluYWwgbW9uaXRvciIsCisgICAgICAiU2V0IHRlcm1pbmFsIGxpbmUgcGFyYW1ldGVyc1xuIgorICAgICAgIkNvcHkgZGVidWcgb3V0cHV0IHRvIHRoZSBjdXJyZW50IHRlcm1pbmFsIGxpbmVcbiIpCit7CisJdnR5LT5tb25pdG9yID0gMTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKHRlcm1pbmFsX25vX21vbml0b3IsCisgICAgICB0ZXJtaW5hbF9ub19tb25pdG9yX2NtZCwKKyAgICAgICJ0ZXJtaW5hbCBubyBtb25pdG9yIiwKKyAgICAgICJTZXQgdGVybWluYWwgbGluZSBwYXJhbWV0ZXJzXG4iCisgICAgICBOT19TVFIgIkNvcHkgZGVidWcgb3V0cHV0IHRvIHRoZSBjdXJyZW50IHRlcm1pbmFsIGxpbmVcbiIpCit7CisJdnR5LT5tb25pdG9yID0gMDsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKHNob3dfaGlzdG9yeSwKKyAgICAgIHNob3dfaGlzdG9yeV9jbWQsCisgICAgICAic2hvdyBoaXN0b3J5IiwgU0hPV19TVFIgIkRpc3BsYXkgdGhlIHNlc3Npb24gY29tbWFuZCBoaXN0b3J5XG4iKQoreworCWludCBpbmRleDsKKworCWZvciAoaW5kZXggPSB2dHktPmhpbmRleCArIDE7IGluZGV4ICE9IHZ0eS0+aGluZGV4OykgeworCQlpZiAoaW5kZXggPT0gVlRZX01BWEhJU1QpIHsKKwkJCWluZGV4ID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHZ0eS0+aGlzdFtpbmRleF0gIT0gTlVMTCkKKwkJCXZ0eV9vdXQodnR5LCAiICAlcyVzIiwgdnR5LT5oaXN0W2luZGV4XSwgVlRZX05FV0xJTkUpOworCisJCWluZGV4Kys7CisJfQorCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiBEaXNwbGF5IGN1cnJlbnQgY29uZmlndXJhdGlvbi4gKi8KK3N0YXRpYyBpbnQgdnR5X2NvbmZpZ193cml0ZShzdHJ1Y3QgdnR5ICp2dHkpCit7CisJdnR5X291dCh2dHksICJsaW5lIHZ0eSVzIiwgVlRZX05FV0xJTkUpOworCisJLyogbG9naW4gKi8KKwlpZiAobm9fcGFzc3dvcmRfY2hlY2spCisJCXZ0eV9vdXQodnR5LCAiIG5vIGxvZ2luJXMiLCBWVFlfTkVXTElORSk7CisKKwl2dHlfb3V0KHZ0eSwgIiElcyIsIFZUWV9ORVdMSU5FKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworc3RydWN0IGNtZF9ub2RlIHZ0eV9ub2RlID0geworCVZUWV9OT0RFLAorCSIlcyhjb25maWctbGluZSkjICIsCisJMSwKK307CisKKy8qIFJlc2V0IGFsbCBWVFkgc3RhdHVzLiAqLwordm9pZCB2dHlfcmVzZXQoKQoreworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCB2dHkgKnZ0eTsKKwlzdHJ1Y3QgdGhyZWFkICp2dHlfc2Vydl90aHJlYWQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZSh2dHl2ZWMpOyBpKyspCisJCWlmICgodnR5ID0gdmVjdG9yX3Nsb3QodnR5dmVjLCBpKSkgIT0gTlVMTCkgeworCQkJYnVmZmVyX3Jlc2V0KHZ0eS0+b2J1Zik7CisJCQl2dHktPnN0YXR1cyA9IFZUWV9DTE9TRTsKKwkJCXZ0eV9jbG9zZSh2dHkpOworCQl9CisKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShWdnR5X3NlcnZfdGhyZWFkKTsgaSsrKQorCQlpZiAoKHZ0eV9zZXJ2X3RocmVhZCA9CisJCSAgICAgdmVjdG9yX3Nsb3QoVnZ0eV9zZXJ2X3RocmVhZCwgaSkpICE9IE5VTEwpIHsKKwkJCS8vdGhyZWFkX2NhbmNlbCAodnR5X3NlcnZfdGhyZWFkKTsKKwkJCXZlY3Rvcl9zbG90KFZ2dHlfc2Vydl90aHJlYWQsIGkpID0gTlVMTDsKKwkJCWNsb3NlKGkpOworCQl9Cit9CisKK3N0YXRpYyB2b2lkIHZ0eV9zYXZlX2N3ZCh2b2lkKQoreworCWNoYXIgY3dkW01BWFBBVEhMRU5dOworCWNoYXIgKmMgOworCisJYyA9IGdldGN3ZChjd2QsIE1BWFBBVEhMRU4pOworCisJaWYgKCFjKSB7CisJCWlmIChjaGRpcihTWVNDT05GRElSKSAhPSAwKQorCQkgICAgcGVycm9yKCJjaGRpciBmYWlsZWQiKTsKKwkJaWYgKGdldGN3ZChjd2QsIE1BWFBBVEhMRU4pID09IE5VTEwpCisJCSAgICBwZXJyb3IoImdldGN3ZCBmYWlsZWQiKTsKKwl9CisKKwl2dHlfY3dkID0gX3RhbGxvY196ZXJvKHRhbGxfdnR5X2N0eCwgc3RybGVuKGN3ZCkgKyAxLCAic2F2ZV9jd2QiKTsKKwlzdHJjcHkodnR5X2N3ZCwgY3dkKTsKK30KKworY2hhciAqdnR5X2dldF9jd2QoKQoreworCXJldHVybiB2dHlfY3dkOworfQorCitpbnQgdnR5X3NoZWxsX3NlcnYoc3RydWN0IHZ0eSAqdnR5KQoreworCXJldHVybiB2dHktPnR5cGUgPT0gVlRZX1NIRUxMX1NFUlYgPyAxIDogMDsKK30KKwordm9pZCB2dHlfaW5pdF92dHlzaCgpCit7CisJdnR5dmVjID0gdmVjdG9yX2luaXQoVkVDVE9SX01JTl9TSVpFKTsKK30KKworZXh0ZXJuIHZvaWQgKnRhbGxfYnNjX2N0eDsKKy8qIEluc3RhbGwgdnR5J3Mgb3duIGNvbW1hbmRzIGxpa2UgYHdobycgY29tbWFuZC4gKi8KK3ZvaWQgdnR5X2luaXQoKQoreworCXRhbGxfdnR5X2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdChOVUxMLCAwLCAidnR5Iik7CisJdGFsbF92dHlfdmVjX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX3Z0eV9jdHgsIDAsICJ2dHlfdmVjdG9yIik7CisJdGFsbF92dHlfY21kX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX3Z0eV9jdHgsIDAsICJ2dHlfY29tbWFuZCIpOworCisJLyogRm9yIGZ1cnRoZXIgY29uZmlndXJhdGlvbiByZWFkLCBwcmVzZXJ2ZSBjdXJyZW50IGRpcmVjdG9yeS4gKi8KKwl2dHlfc2F2ZV9jd2QoKTsKKworCXZ0eXZlYyA9IHZlY3Rvcl9pbml0KFZFQ1RPUl9NSU5fU0laRSk7CisKKwkvKiBJbnN0YWxsIGJncCB0b3Agbm9kZS4gKi8KKwlpbnN0YWxsX25vZGUoJnZ0eV9ub2RlLCB2dHlfY29uZmlnX3dyaXRlKTsKKworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZjb25maWdfd2hvX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnNob3dfaGlzdG9yeV9jbWQpOworCWluc3RhbGxfZWxlbWVudChFTkFCTEVfTk9ERSwgJmNvbmZpZ193aG9fY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZsaW5lX3Z0eV9jbWQpOworCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJnNlcnZpY2VfYWR2YW5jZWRfdnR5X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmbm9fc2VydmljZV9hZHZhbmNlZF92dHlfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZzaG93X2hpc3RvcnlfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoRU5BQkxFX05PREUsICZ0ZXJtaW5hbF9tb25pdG9yX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEVOQUJMRV9OT0RFLCAmdGVybWluYWxfbm9fbW9uaXRvcl9jbWQpOworCWluc3RhbGxfZWxlbWVudChFTkFCTEVfTk9ERSwgJnNob3dfaGlzdG9yeV9jbWQpOworCisJaW5zdGFsbF9kZWZhdWx0KFZUWV9OT0RFKTsKKwlpbnN0YWxsX2VsZW1lbnQoVlRZX05PREUsICZ2dHlfbG9naW5fY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVlRZX05PREUsICZub192dHlfbG9naW5fY21kKTsKK30KKworaW50IHZ0eV9yZWFkX2NvbmZpZ19maWxlKGNvbnN0IGNoYXIgKmZpbGVfbmFtZSkKK3sKKwlGSUxFICpjZmlsZTsKKwlpbnQgcmM7CisKKwljZmlsZSA9IGZvcGVuKGZpbGVfbmFtZSwgInIiKTsKKwlpZiAoIWNmaWxlKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCXJjID0gdnR5X3JlYWRfZmlsZShjZmlsZSk7CisJZmNsb3NlKGNmaWxlKTsKKworCWhvc3RfY29uZmlnX3NldChmaWxlX25hbWUpOworCisJcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvdnR5X2ludGVyZmFjZS5jIGIvb3BlbmJzYy9zcmMvdnR5X2ludGVyZmFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4OTQ4NjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy92dHlfaW50ZXJmYWNlLmMKQEAgLTAsMCArMSwyMDUxIEBACisvKiBPcGVuQlNDIGludGVyZmFjZSB0byBxdWFnZ2EgVlRZICovCisvKiAoQykgMjAwOS0yMDEwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8dnR5L2NvbW1hbmQuaD4KKyNpbmNsdWRlIDx2dHkvYnVmZmVyLmg+CisjaW5jbHVkZSA8dnR5L3Z0eS5oPgorCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9lMV9pbnB1dC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19ubS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2dzbV91dGlscy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvY2hhbl9hbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvbWVhc19yZXAuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RiLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy90ZWxuZXRfaW50ZXJmYWNlLmg+CisKK3N0YXRpYyBzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbW5ldDsKKworc3RydWN0IGNtZF9ub2RlIG5ldF9ub2RlID0geworCUdTTU5FVF9OT0RFLAorCSIlcyhuZXR3b3JrKSMiLAorCTEsCit9OworCitzdHJ1Y3QgY21kX25vZGUgYnRzX25vZGUgPSB7CisJQlRTX05PREUsCisJIiVzKGJ0cykjIiwKKwkxLAorfTsKKworc3RydWN0IGNtZF9ub2RlIHRyeF9ub2RlID0geworCVRSWF9OT0RFLAorCSIlcyh0cngpIyIsCisJMSwKK307CisKK3N0cnVjdCBjbWRfbm9kZSB0c19ub2RlID0geworCVRTX05PREUsCisJIiVzKHRzKSMiLAorCTEsCit9OworCitzdGF0aWMgaW50IGR1bW15X2NvbmZpZ193cml0ZShzdHJ1Y3QgdnR5ICp2KQoreworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgbmV0X2R1bXBfbm1zdGF0ZShzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBnc21fbm1fc3RhdGUgKm5tcykKK3sKKwl2dHlfb3V0KHZ0eSwiT3BlciAnJXMnLCBBZG1pbiAldSwgQXZhaWwgJyVzJyVzIiwKKwkJbm1fb3BzdGF0ZV9uYW1lKG5tcy0+b3BlcmF0aW9uYWwpLCBubXMtPmFkbWluaXN0cmF0aXZlLAorCQlubV9hdmFpbF9uYW1lKG5tcy0+YXZhaWxhYmlsaXR5KSwgVlRZX05FV0xJTkUpOworfQorCitzdGF0aWMgdm9pZCBkdW1wX3BjaGFuX2xvYWRfdnR5KHN0cnVjdCB2dHkgKnZ0eSwgY2hhciAqcHJlZml4LAorCQkJCWNvbnN0IHN0cnVjdCBwY2hhbl9sb2FkICpwbCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBsLT5wY2hhbik7IGkrKykgeworCQljb25zdCBzdHJ1Y3QgbG9hZF9jb3VudGVyICpsYyA9ICZwbC0+cGNoYW5baV07CisJCXVuc2lnbmVkIGludCBwZXJjZW50OworCisJCWlmIChsYy0+dG90YWwgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCXBlcmNlbnQgPSAobGMtPnVzZWQgKiAxMDApIC8gbGMtPnRvdGFsOworCisJCXZ0eV9vdXQodnR5LCAiJXMlMjBzOiAlM3UlJSAoJXUvJXUpJXMiLCBwcmVmaXgsCisJCQlnc21fcGNoYW5fbmFtZShpKSwgcGVyY2VudCwgbGMtPnVzZWQsIGxjLT50b3RhbCwKKwkJCVZUWV9ORVdMSU5FKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG5ldF9kdW1wX3Z0eShzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBnc21fbmV0d29yayAqbmV0KQoreworCXN0cnVjdCBwY2hhbl9sb2FkIHBsOworCisJdnR5X291dCh2dHksICJCU0MgaXMgb24gQ291bnRyeSBDb2RlICV1LCBOZXR3b3JrIENvZGUgJXUgIgorCQkiYW5kIGhhcyAldSBCVFMlcyIsIG5ldC0+Y291bnRyeV9jb2RlLCBuZXQtPm5ldHdvcmtfY29kZSwKKwkJbmV0LT5udW1fYnRzLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIExvbmcgbmV0d29yayBuYW1lOiAnJXMnJXMiLAorCQluZXQtPm5hbWVfbG9uZywgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBTaG9ydCBuZXR3b3JrIG5hbWU6ICclcyclcyIsCisJCW5ldC0+bmFtZV9zaG9ydCwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBBdXRoZW50aWNhdGlvbiBwb2xpY3k6ICVzJXMiLAorCQlnc21fYXV0aF9wb2xpY3lfbmFtZShuZXQtPmF1dGhfcG9saWN5KSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBMb2NhdGlvbiB1cGRhdGluZyByZWplY3QgY2F1c2U6ICV1JXMiLAorCQluZXQtPnJlamVjdF9jYXVzZSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBFbmNyeXB0aW9uOiBBNS8ldSVzIiwgbmV0LT5hNV9lbmNyeXB0aW9uLAorCQlWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIE5FQ0kgKFRDSC9IKTogJXUlcyIsIG5ldC0+bmVjaSwKKwkJVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBSUkxQIE1vZGU6ICVzJXMiLCBycmxwX21vZGVfbmFtZShuZXQtPnJybHAubW9kZSksCisJCVZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgTU0gSW5mbzogJXMlcyIsIG5ldC0+c2VuZF9tbV9pbmZvID8gIk9uIiA6ICJPZmYiLAorCQlWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIEhhbmRvdmVyOiAlcyVzIiwgbmV0LT5oYW5kb3Zlci5hY3RpdmUgPyAiT24iIDogIk9mZiIsCisJCVZUWV9ORVdMSU5FKTsKKwluZXR3b3JrX2NoYW5fbG9hZCgmcGwsIG5ldCk7CisJdnR5X291dCh2dHksICIgIEN1cnJlbnQgQ2hhbm5lbCBMb2FkOiVzIiwgVlRZX05FV0xJTkUpOworCWR1bXBfcGNoYW5fbG9hZF92dHkodnR5LCAiICAgICIsICZwbCk7Cit9CisKK0RFRlVOKHNob3dfbmV0LCBzaG93X25ldF9jbWQsICJzaG93IG5ldHdvcmsiLAorCVNIT1dfU1RSICJEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IGEgR1NNIE5FVFdPUktcbiIpCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBnc21uZXQ7CisJbmV0X2R1bXBfdnR5KHZ0eSwgbmV0KTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgZTFpc2xfZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICplMWwpCit7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmU7CisKKwlpZiAoIWUxbCkgeworCQl2dHlfb3V0KHZ0eSwgIiAgIE5vbmUlcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuOworCX0KKworCWxpbmUgPSBlMWwtPnRzLT5saW5lOworCisJdnR5X291dCh2dHksICIgICAgRTEgTGluZSAldSwgVHlwZSAlczogVGltZXNsb3QgJXUsIE1vZGUgJXMlcyIsCisJCWxpbmUtPm51bSwgbGluZS0+ZHJpdmVyLT5uYW1lLCBlMWwtPnRzLT5udW0sCisJCWUxaW5wX3NpZ250eXBlX25hbWUoZTFsLT50eXBlKSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICAgIEUxIFRFSSAldSwgU0FQSSAldSVzIiwKKwkJZTFsLT50ZWksIGUxbC0+c2FwaSwgVlRZX05FV0xJTkUpOworfQorCitzdGF0aWMgdm9pZCBidHNfZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBwY2hhbl9sb2FkIHBsOworCisJdnR5X291dCh2dHksICJCVFMgJXUgaXMgb2YgJXMgdHlwZSBpbiBiYW5kICVzLCBoYXMgQ0kgJXUgTEFDICV1LCAiCisJCSJCU0lDICV1LCBUU0MgJXUgYW5kICV1IFRSWCVzIiwKKwkJYnRzLT5uciwgYnRzdHlwZTJzdHIoYnRzLT50eXBlKSwgZ3NtX2JhbmRfbmFtZShidHMtPmJhbmQpLAorCQlidHMtPmNlbGxfaWRlbnRpdHksCisJCWJ0cy0+bG9jYXRpb25fYXJlYV9jb2RlLCBidHMtPmJzaWMsIGJ0cy0+dHNjLCAKKwkJYnRzLT5udW1fdHJ4LCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICJNUyBNYXggcG93ZXI6ICV1IGRCbSVzIiwgYnRzLT5tc19tYXhfcG93ZXIsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIk1pbmltdW0gUnggTGV2ZWwgZm9yIEFjY2VzczogJWkgZEJtJXMiLAorCQlyeGxldjJkYm0oYnRzLT5zaV9jb21tb24uY2VsbF9zZWxfcGFyLnJ4bGV2X2FjY19taW4pLAorCQlWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICJDZWxsIFJlc2VsZWN0aW9uIEh5c3RlcmVzaXM6ICV1IGRCbSVzIiwKKwkJYnRzLT5zaV9jb21tb24uY2VsbF9zZWxfcGFyLmNlbGxfcmVzZWxfaHlzdCoyLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICJSQUNIIFRYLUludGVnZXI6ICV1JXMiLCBidHMtPnNpX2NvbW1vbi5yYWNoX2NvbnRyb2wudHhfaW50ZWdlciwKKwkJVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiUkFDSCBNYXggdHJhbnNtaXNzaW9uczogJXUlcyIsCisJCXJhY2hfbWF4X3RyYW5zX3JhdzJ2YWwoYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sLm1heF90cmFucyksCisJCVZUWV9ORVdMSU5FKTsKKwlpZiAoYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sLmNlbGxfYmFyKQorCQl2dHlfb3V0KHZ0eSwgIiAgQ0VMTCBJUyBCQVJSRUQlcyIsIFZUWV9ORVdMSU5FKTsKKwlpZiAoaXNfaXBhY2Nlc3NfYnRzKGJ0cykpCisJCXZ0eV9vdXQodnR5LCAiICBVbml0IElEOiAldS8ldS8wLCBPTUwgU3RyZWFtIElEIDB4JTAyeCVzIiwKKwkJCWJ0cy0+aXBfYWNjZXNzLnNpdGVfaWQsIGJ0cy0+aXBfYWNjZXNzLmJ0c19pZCwKKwkJCWJ0cy0+b21sX3RlaSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBOTSBTdGF0ZTogIik7CisJbmV0X2R1bXBfbm1zdGF0ZSh2dHksICZidHMtPm5tX3N0YXRlKTsKKwl2dHlfb3V0KHZ0eSwgIiAgU2l0ZSBNZ3IgTk0gU3RhdGU6ICIpOworCW5ldF9kdW1wX25tc3RhdGUodnR5LCAmYnRzLT5zaXRlX21nci5ubV9zdGF0ZSk7CisJdnR5X291dCh2dHksICIgIFBhZ2luZzogRklYTUUgcGVuZGluZyByZXF1ZXN0cywgJXUgZnJlZSBzbG90cyVzIiwKKwkJYnRzLT5wYWdpbmcuYXZhaWxhYmxlX3Nsb3RzLCBWVFlfTkVXTElORSk7CisJaWYgKCFpc19pcGFjY2Vzc19idHMoYnRzKSkgeworCQl2dHlfb3V0KHZ0eSwgIiAgRTEgU2lnbmFsbGluZyBMaW5rOiVzIiwgVlRZX05FV0xJTkUpOworCQllMWlzbF9kdW1wX3Z0eSh2dHksIGJ0cy0+b21sX2xpbmspOworCX0KKwkvKiBGSVhNRTogb21sX2xpbmssIGNoYW5fZGVzYyAqLworCW1lbXNldCgmcGwsIDAsIHNpemVvZihwbCkpOworCWJ0c19jaGFuX2xvYWQoJnBsLCBidHMpOworCXZ0eV9vdXQodnR5LCAiICBDdXJyZW50IENoYW5uZWwgTG9hZDolcyIsIFZUWV9ORVdMSU5FKTsKKwlkdW1wX3BjaGFuX2xvYWRfdnR5KHZ0eSwgIiAgICAiLCAmcGwpOworfQorCitERUZVTihzaG93X2J0cywgc2hvd19idHNfY21kLCAic2hvdyBidHMgW251bWJlcl0iLAorCVNIT1dfU1RSICJEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IGEgQlRTXG4iCisJCSJCVFMgbnVtYmVyIikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IGdzbW5ldDsKKwlpbnQgYnRzX25yOworCisJaWYgKGFyZ2MgIT0gMCkgeworCQkvKiB1c2UgdGhlIEJUUyBudW1iZXIgdGhhdCB0aGUgdXNlciBoYXMgc3BlY2lmaWVkICovCisJCWJ0c19uciA9IGF0b2koYXJndlswXSk7CisJCWlmIChidHNfbnIgPiBuZXQtPm51bV9idHMpIHsKKwkJCXZ0eV9vdXQodnR5LCAiJSUgY2FuJ3QgZmluZCBCVFMgJyVzJyVzIiwgYXJndlswXSwKKwkJCQlWVFlfTkVXTElORSk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwkJYnRzX2R1bXBfdnR5KHZ0eSwgZ3NtX2J0c19udW0obmV0LCBidHNfbnIpKTsKKwkJcmV0dXJuIENNRF9TVUNDRVNTOworCX0KKwkvKiBwcmludCBhbGwgQlRTJ3MgKi8KKwlmb3IgKGJ0c19uciA9IDA7IGJ0c19uciA8IG5ldC0+bnVtX2J0czsgYnRzX25yKyspCisJCWJ0c19kdW1wX3Z0eSh2dHksIGdzbV9idHNfbnVtKG5ldCwgYnRzX25yKSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIHV0aWxpdHkgZnVuY3Rpb25zICovCitzdGF0aWMgdm9pZCBwYXJzZV9lMV9saW5rKHN0cnVjdCBnc21fZTFfc3Vic2xvdCAqZTFfbGluaywgY29uc3QgY2hhciAqbGluZSwKKwkJCSAgY29uc3QgY2hhciAqdHMsIGNvbnN0IGNoYXIgKnNzKQoreworCWUxX2xpbmstPmUxX25yID0gYXRvaShsaW5lKTsKKwllMV9saW5rLT5lMV90cyA9IGF0b2kodHMpOworCWlmICghc3RyY21wKHNzLCAiZnVsbCIpKQorCQllMV9saW5rLT5lMV90c19zcyA9IDI1NTsKKwllbHNlCisJCWUxX2xpbmstPmUxX3RzX3NzID0gYXRvaShzcyk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZpZ193cml0ZV9lMV9saW5rKHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9lMV9zdWJzbG90ICplMV9saW5rLAorCQkJCSBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJaWYgKCFlMV9saW5rLT5lMV90cykKKwkJcmV0dXJuOworCisJaWYgKGUxX2xpbmstPmUxX3RzX3NzID09IDI1NSkKKwkJdnR5X291dCh2dHksICIlc2UxIGxpbmUgJXUgdGltZXNsb3QgJXUgc3ViLXNsb3QgZnVsbCVzIiwKKwkJCXByZWZpeCwgZTFfbGluay0+ZTFfbnIsIGUxX2xpbmstPmUxX3RzLCBWVFlfTkVXTElORSk7CisJZWxzZQorCQl2dHlfb3V0KHZ0eSwgIiVzZTEgbGluZSAldSB0aW1lc2xvdCAldSBzdWItc2xvdCAldSVzIiwKKwkJCXByZWZpeCwgZTFfbGluay0+ZTFfbnIsIGUxX2xpbmstPmUxX3RzLAorCQkJZTFfbGluay0+ZTFfdHNfc3MsIFZUWV9ORVdMSU5FKTsKK30KKworCitzdGF0aWMgdm9pZCBjb25maWdfd3JpdGVfdHNfc2luZ2xlKHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cykKK3sKKwl2dHlfb3V0KHZ0eSwgIiAgICB0aW1lc2xvdCAldSVzIiwgdHMtPm5yLCBWVFlfTkVXTElORSk7CisJaWYgKHRzLT5wY2hhbiAhPSBHU01fUENIQU5fTk9ORSkKKwkJdnR5X291dCh2dHksICIgICAgIHBoeXNfY2hhbl9jb25maWcgJXMlcyIsCisJCQlnc21fcGNoYW5fbmFtZSh0cy0+cGNoYW4pLCBWVFlfTkVXTElORSk7CisJY29uZmlnX3dyaXRlX2UxX2xpbmsodnR5LCAmdHMtPmUxX2xpbmssICIgICAgICIpOworfQorCitzdGF0aWMgdm9pZCBjb25maWdfd3JpdGVfdHJ4X3NpbmdsZShzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4KQoreworCWludCBpOworCisJdnR5X291dCh2dHksICIgIHRyeCAldSVzIiwgdHJ4LT5uciwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICAgYXJmY24gJXUlcyIsIHRyeC0+YXJmY24sIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgIG5vbWluYWwgcG93ZXIgJXUlcyIsIHRyeC0+bm9taW5hbF9wb3dlciwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICAgbWF4X3Bvd2VyX3JlZCAldSVzIiwgdHJ4LT5tYXhfcG93ZXJfcmVkLCBWVFlfTkVXTElORSk7CisJY29uZmlnX3dyaXRlX2UxX2xpbmsodnR5LCAmdHJ4LT5yc2xfZTFfbGluaywgIiAgIHJzbCAiKTsKKwl2dHlfb3V0KHZ0eSwgIiAgIHJzbCBlMSB0ZWkgJXUlcyIsIHRyeC0+cnNsX3RlaSwgVlRZX05FV0xJTkUpOworCisJZm9yIChpID0gMDsgaSA8IFRSWF9OUl9UUzsgaSsrKQorCQljb25maWdfd3JpdGVfdHNfc2luZ2xlKHZ0eSwgJnRyeC0+dHNbaV0pOworfQorCitzdGF0aWMgdm9pZCBjb25maWdfd3JpdGVfYnRzX3NpbmdsZShzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisJaW50IGk7CisKKwl2dHlfb3V0KHZ0eSwgIiBidHMgJXUlcyIsIGJ0cy0+bnIsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgdHlwZSAlcyVzIiwgYnRzdHlwZTJzdHIoYnRzLT50eXBlKSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBiYW5kICVzJXMiLCBnc21fYmFuZF9uYW1lKGJ0cy0+YmFuZCksIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgY2VsbF9pZGVudGl0eSAldSVzIiwgYnRzLT5jZWxsX2lkZW50aXR5LCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIGxvY2F0aW9uX2FyZWFfY29kZSAldSVzIiwgYnRzLT5sb2NhdGlvbl9hcmVhX2NvZGUsCisJCVZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgdHJhaW5pbmdfc2VxdWVuY2VfY29kZSAldSVzIiwgYnRzLT50c2MsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgYmFzZV9zdGF0aW9uX2lkX2NvZGUgJXUlcyIsIGJ0cy0+YnNpYywgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBtcyBtYXggcG93ZXIgJXUlcyIsIGJ0cy0+bXNfbWF4X3Bvd2VyLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIGNlbGwgcmVzZWxlY3Rpb24gaHlzdGVyZXNpcyAldSVzIiwKKwkJYnRzLT5zaV9jb21tb24uY2VsbF9zZWxfcGFyLmNlbGxfcmVzZWxfaHlzdCoyLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIHJ4bGV2IGFjY2VzcyBtaW4gJXUlcyIsCisJCWJ0cy0+c2lfY29tbW9uLmNlbGxfc2VsX3Bhci5yeGxldl9hY2NfbWluLCBWVFlfTkVXTElORSk7CisJaWYgKGJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYy50MzIxMikKKwkJdnR5X291dCh2dHksICIgIHBlcmlvZGljIGxvY2F0aW9uIHVwZGF0ZSAldSVzIiwKKwkJCWJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYy50MzIxMiAqIDEwLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIGNoYW5uZWwgYWxsb2NhdG9yICVzJXMiLAorCQlidHMtPmNoYW5fYWxsb2NfcmV2ZXJzZSA/ICJkZXNjZW5kaW5nIiA6ICJhc2NlbmRpbmciLAorCQlWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIHJhY2ggdHggaW50ZWdlciAldSVzIiwKKwkJYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sLnR4X2ludGVnZXIsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgcmFjaCBtYXggdHJhbnNtaXNzaW9uICV1JXMiLAorCQlyYWNoX21heF90cmFuc19yYXcydmFsKGJ0cy0+c2lfY29tbW9uLnJhY2hfY29udHJvbC5tYXhfdHJhbnMpLAorCQlWVFlfTkVXTElORSk7CisJaWYgKGJ0cy0+c2lfY29tbW9uLnJhY2hfY29udHJvbC5jZWxsX2JhcikKKwkJdnR5X291dCh2dHksICIgIGNlbGwgYmFycmVkIDElcyIsIFZUWV9ORVdMSU5FKTsKKwlpZiAoaXNfaXBhY2Nlc3NfYnRzKGJ0cykpIHsKKwkJdnR5X291dCh2dHksICIgIGlwLmFjY2VzcyB1bml0X2lkICV1ICV1JXMiLAorCQkJYnRzLT5pcF9hY2Nlc3Muc2l0ZV9pZCwgYnRzLT5pcF9hY2Nlc3MuYnRzX2lkLCBWVFlfTkVXTElORSk7CisJCXZ0eV9vdXQodnR5LCAiICBvbWwgaXAuYWNjZXNzIHN0cmVhbV9pZCAldSVzIiwgYnRzLT5vbWxfdGVpLCBWVFlfTkVXTElORSk7CisJfSBlbHNlIHsKKwkJY29uZmlnX3dyaXRlX2UxX2xpbmsodnR5LCAmYnRzLT5vbWxfZTFfbGluaywgIiAgb21sICIpOworCQl2dHlfb3V0KHZ0eSwgIiAgb21sIGUxIHRlaSAldSVzIiwgYnRzLT5vbWxfdGVpLCBWVFlfTkVXTElORSk7CisJfQorCXZ0eV9vdXQodnR5LCAiICBncHJzIGVuYWJsZWQgJXUlcyIsIGJ0cy0+Z3Bycy5lbmFibGVkLCBWVFlfTkVXTElORSk7CisJaWYgKGJ0cy0+Z3Bycy5lbmFibGVkKSB7CisJCXZ0eV9vdXQodnR5LCAiICBncHJzIHJvdXRpbmcgYXJlYSAldSVzIiwgYnRzLT5ncHJzLnJhYywKKwkJCVZUWV9ORVdMSU5FKTsKKwkJdnR5X291dCh2dHksICIgIGdwcnMgY2VsbCBidmNpICV1JXMiLCBidHMtPmdwcnMuY2VsbC5idmNpLAorCQkJVlRZX05FV0xJTkUpOworCQl2dHlfb3V0KHZ0eSwgIiAgZ3BycyBuc2VpICV1JXMiLCBidHMtPmdwcnMubnNlLm5zZWksCisJCQlWVFlfTkVXTElORSk7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJ0cy0+Z3Bycy5uc3ZjKTsgaSsrKSB7CisJCQlzdHJ1Y3QgZ3NtX2J0c19ncHJzX25zdmMgKm5zdmMgPQorCQkJCQkJJmJ0cy0+Z3Bycy5uc3ZjW2ldOworCQkJc3RydWN0IGluX2FkZHIgaWE7CisKKwkJCWlhLnNfYWRkciA9IGh0b25sKG5zdmMtPnJlbW90ZV9pcCk7CisJCQl2dHlfb3V0KHZ0eSwgIiAgZ3BycyBuc3ZjICV1IG5zdmNpICV1JXMiLCBpLAorCQkJCW5zdmMtPm5zdmNpLCBWVFlfTkVXTElORSk7CisJCQl2dHlfb3V0KHZ0eSwgIiAgZ3BycyBuc3ZjICV1IGxvY2FsIHVkcCBwb3J0ICV1JXMiLCBpLAorCQkJCW5zdmMtPmxvY2FsX3BvcnQsIFZUWV9ORVdMSU5FKTsKKwkJCXZ0eV9vdXQodnR5LCAiICBncHJzIG5zdmMgJXUgcmVtb3RlIHVkcCBwb3J0ICV1JXMiLCBpLAorCQkJCW5zdmMtPnJlbW90ZV9wb3J0LCBWVFlfTkVXTElORSk7CisJCQl2dHlfb3V0KHZ0eSwgIiAgZ3BycyBuc3ZjICV1IHJlbW90ZSBpcCAlcyVzIiwgaSwKKwkJCQlpbmV0X250b2EoaWEpLCBWVFlfTkVXTElORSk7CisJCX0KKwl9CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0cngsICZidHMtPnRyeF9saXN0LCBsaXN0KQorCQljb25maWdfd3JpdGVfdHJ4X3NpbmdsZSh2dHksIHRyeCk7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX3dyaXRlX2J0cyhzdHJ1Y3QgdnR5ICp2KQoreworCXN0cnVjdCBnc21fYnRzICpidHM7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShidHMsICZnc21uZXQtPmJ0c19saXN0LCBsaXN0KQorCQljb25maWdfd3JpdGVfYnRzX3NpbmdsZSh2LCBidHMpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdGF0aWMgaW50IGNvbmZpZ193cml0ZV9uZXQoc3RydWN0IHZ0eSAqdnR5KQoreworCXZ0eV9vdXQodnR5LCAibmV0d29yayVzIiwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIG5ldHdvcmsgY291bnRyeSBjb2RlICV1JXMiLCBnc21uZXQtPmNvdW50cnlfY29kZSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIG1vYmlsZSBuZXR3b3JrIGNvZGUgJXUlcyIsIGdzbW5ldC0+bmV0d29ya19jb2RlLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgc2hvcnQgbmFtZSAlcyVzIiwgZ3NtbmV0LT5uYW1lX3Nob3J0LCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgbG9uZyBuYW1lICVzJXMiLCBnc21uZXQtPm5hbWVfbG9uZywgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIGF1dGggcG9saWN5ICVzJXMiLCBnc21fYXV0aF9wb2xpY3lfbmFtZShnc21uZXQtPmF1dGhfcG9saWN5KSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIGxvY2F0aW9uIHVwZGF0aW5nIHJlamVjdCBjYXVzZSAldSVzIiwKKwkJZ3NtbmV0LT5yZWplY3RfY2F1c2UsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiBlbmNyeXB0aW9uIGE1ICV1JXMiLCBnc21uZXQtPmE1X2VuY3J5cHRpb24sIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiBuZWNpICV1JXMiLCBnc21uZXQtPm5lY2ksIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiBycmxwIG1vZGUgJXMlcyIsIHJybHBfbW9kZV9uYW1lKGdzbW5ldC0+cnJscC5tb2RlKSwKKwkJVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIG1tIGluZm8gJXUlcyIsIGdzbW5ldC0+c2VuZF9tbV9pbmZvLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgaGFuZG92ZXIgJXUlcyIsIGdzbW5ldC0+aGFuZG92ZXIuYWN0aXZlLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgaGFuZG92ZXIgd2luZG93IHJ4bGV2IGF2ZXJhZ2luZyAldSVzIiwKKwkJZ3NtbmV0LT5oYW5kb3Zlci53aW5fcnhsZXZfYXZnLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgaGFuZG92ZXIgd2luZG93IHJ4cXVhbCBhdmVyYWdpbmcgJXUlcyIsCisJCWdzbW5ldC0+aGFuZG92ZXIud2luX3J4cXVhbF9hdmcsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiBoYW5kb3ZlciB3aW5kb3cgcnhsZXYgbmVpZ2hib3IgYXZlcmFnaW5nICV1JXMiLAorCQlnc21uZXQtPmhhbmRvdmVyLndpbl9yeGxldl9hdmdfbmVpZ2gsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiBoYW5kb3ZlciBwb3dlciBidWRnZXQgaW50ZXJ2YWwgJXUlcyIsCisJCWdzbW5ldC0+aGFuZG92ZXIucHdyX2ludGVydmFsLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgaGFuZG92ZXIgcG93ZXIgYnVkZ2V0IGh5c3RlcmVzaXMgJXUlcyIsCisJCWdzbW5ldC0+aGFuZG92ZXIucHdyX2h5c3RlcmVzaXMsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiBoYW5kb3ZlciBtYXhpbXVtIGRpc3RhbmNlICV1JXMiLAorCQlnc21uZXQtPmhhbmRvdmVyLm1heF9kaXN0YW5jZSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIHRpbWVyIHQzMTAxICV1JXMiLCBnc21uZXQtPlQzMTAxLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgdGltZXIgdDMxMDMgJXUlcyIsIGdzbW5ldC0+VDMxMDMsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiB0aW1lciB0MzEwNSAldSVzIiwgZ3NtbmV0LT5UMzEwNSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIHRpbWVyIHQzMTA3ICV1JXMiLCBnc21uZXQtPlQzMTA3LCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgdGltZXIgdDMxMDkgJXUlcyIsIGdzbW5ldC0+VDMxMDksIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiB0aW1lciB0MzExMSAldSVzIiwgZ3NtbmV0LT5UMzExMSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIHRpbWVyIHQzMTEzICV1JXMiLCBnc21uZXQtPlQzMTEzLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgdGltZXIgdDMxMTUgJXUlcyIsIGdzbW5ldC0+VDMxMTUsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiB0aW1lciB0MzExNyAldSVzIiwgZ3NtbmV0LT5UMzExNywgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIHRpbWVyIHQzMTE5ICV1JXMiLCBnc21uZXQtPlQzMTE5LCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgdGltZXIgdDMxNDEgJXUlcyIsIGdzbW5ldC0+VDMxNDEsIFZUWV9ORVdMSU5FKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgdHJ4X2R1bXBfdnR5KHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpCit7CisJdnR5X291dCh2dHksICJUUlggJXUgb2YgQlRTICV1IGlzIG9uIEFSRkNOICV1JXMiLAorCQl0cngtPm5yLCB0cngtPmJ0cy0+bnIsIHRyeC0+YXJmY24sIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgUkYgTm9taW5hbCBQb3dlcjogJWQgZEJtLCByZWR1Y2VkIGJ5ICV1IGRCLCAiCisJCSJyZXN1bHRpbmcgQlMgcG93ZXI6ICVkIGRCbSVzIiwKKwkJdHJ4LT5ub21pbmFsX3Bvd2VyLCB0cngtPm1heF9wb3dlcl9yZWQsCisJCXRyeC0+bm9taW5hbF9wb3dlciAtIHRyeC0+bWF4X3Bvd2VyX3JlZCwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBOTSBTdGF0ZTogIik7CisJbmV0X2R1bXBfbm1zdGF0ZSh2dHksICZ0cngtPm5tX3N0YXRlKTsKKwl2dHlfb3V0KHZ0eSwgIiAgQmFzZWJhbmQgVHJhbnNjZWl2ZXIgTk0gU3RhdGU6ICIpOworCW5ldF9kdW1wX25tc3RhdGUodnR5LCAmdHJ4LT5iYl90cmFuc2Mubm1fc3RhdGUpOworCWlmIChpc19pcGFjY2Vzc19idHModHJ4LT5idHMpKSB7CisJCXZ0eV9vdXQodnR5LCAiICBpcC5hY2Nlc3Mgc3RyZWFtIElEOiAweCUwMnglcyIsCisJCQl0cngtPnJzbF90ZWksIFZUWV9ORVdMSU5FKTsKKwl9IGVsc2UgeworCQl2dHlfb3V0KHZ0eSwgIiAgRTEgU2lnbmFsbGluZyBMaW5rOiVzIiwgVlRZX05FV0xJTkUpOworCQllMWlzbF9kdW1wX3Z0eSh2dHksIHRyeC0+cnNsX2xpbmspOworCX0KK30KKworREVGVU4oc2hvd190cngsCisgICAgICBzaG93X3RyeF9jbWQsCisgICAgICAic2hvdyB0cnggW2J0c19ucl0gW3RyeF9ucl0iLAorCVNIT1dfU1RSICJEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IGEgVFJYXG4iKQoreworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0ID0gZ3NtbmV0OworCXN0cnVjdCBnc21fYnRzICpidHMgPSBOVUxMOworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCWludCBidHNfbnIsIHRyeF9ucjsKKworCWlmIChhcmdjID49IDEpIHsKKwkJLyogdXNlIHRoZSBCVFMgbnVtYmVyIHRoYXQgdGhlIHVzZXIgaGFzIHNwZWNpZmllZCAqLworCQlidHNfbnIgPSBhdG9pKGFyZ3ZbMF0pOworCQlpZiAoYnRzX25yID49IG5ldC0+bnVtX2J0cykgeworCQkJdnR5X291dCh2dHksICIlJSBjYW4ndCBmaW5kIEJUUyAnJXMnJXMiLCBhcmd2WzBdLAorCQkJCVZUWV9ORVdMSU5FKTsKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJfQorCQlidHMgPSBnc21fYnRzX251bShuZXQsIGJ0c19ucik7CisJfQorCWlmIChhcmdjID49IDIpIHsKKwkJdHJ4X25yID0gYXRvaShhcmd2WzFdKTsKKwkJaWYgKHRyeF9uciA+PSBidHMtPm51bV90cngpIHsKKwkJCXZ0eV9vdXQodnR5LCAiJSUgY2FuJ3QgZmluZCBUUlggJyVzJyVzIiwgYXJndlsxXSwKKwkJCQlWVFlfTkVXTElORSk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwkJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgdHJ4X25yKTsKKwkJdHJ4X2R1bXBfdnR5KHZ0eSwgdHJ4KTsKKwkJcmV0dXJuIENNRF9TVUNDRVNTOworCX0KKwlpZiAoYnRzKSB7CisJCS8qIHByaW50IGFsbCBUUlggaW4gdGhpcyBCVFMgKi8KKwkJZm9yICh0cnhfbnIgPSAwOyB0cnhfbnIgPCBidHMtPm51bV90cng7IHRyeF9ucisrKSB7CisJCQl0cnggPSBnc21fYnRzX3RyeF9udW0oYnRzLCB0cnhfbnIpOworCQkJdHJ4X2R1bXBfdnR5KHZ0eSwgdHJ4KTsKKwkJfQorCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisJfQorCisJZm9yIChidHNfbnIgPSAwOyBidHNfbnIgPCBuZXQtPm51bV9idHM7IGJ0c19ucisrKSB7CisJCWJ0cyA9IGdzbV9idHNfbnVtKG5ldCwgYnRzX25yKTsKKwkJZm9yICh0cnhfbnIgPSAwOyB0cnhfbnIgPCBidHMtPm51bV90cng7IHRyeF9ucisrKSB7CisJCQl0cnggPSBnc21fYnRzX3RyeF9udW0oYnRzLCB0cnhfbnIpOworCQkJdHJ4X2R1bXBfdnR5KHZ0eSwgdHJ4KTsKKwkJfQorCX0KKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworCitzdGF0aWMgdm9pZCB0c19kdW1wX3Z0eShzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMpCit7CisJdnR5X291dCh2dHksICJUaW1lc2xvdCAldSBvZiBUUlggJXUgaW4gQlRTICV1LCBwaHlzIGNmZyAlcyVzIiwKKwkJdHMtPm5yLCB0cy0+dHJ4LT5uciwgdHMtPnRyeC0+YnRzLT5uciwKKwkJZ3NtX3BjaGFuX25hbWUodHMtPnBjaGFuKSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBOTSBTdGF0ZTogIik7CisJbmV0X2R1bXBfbm1zdGF0ZSh2dHksICZ0cy0+bm1fc3RhdGUpOworCWlmICghaXNfaXBhY2Nlc3NfYnRzKHRzLT50cngtPmJ0cykpCisJCXZ0eV9vdXQodnR5LCAiICBFMSBMaW5lICV1LCBUaW1lc2xvdCAldSwgU3Vic2xvdCAldSVzIiwKKwkJCXRzLT5lMV9saW5rLmUxX25yLCB0cy0+ZTFfbGluay5lMV90cywKKwkJCXRzLT5lMV9saW5rLmUxX3RzX3NzLCBWVFlfTkVXTElORSk7Cit9CisKK0RFRlVOKHNob3dfdHMsCisgICAgICBzaG93X3RzX2NtZCwKKyAgICAgICJzaG93IHRpbWVzbG90IFtidHNfbnJdIFt0cnhfbnJdIFt0c19ucl0iLAorCVNIT1dfU1RSICJEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IGEgVFNcbiIpCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBnc21uZXQ7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKwlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzOworCWludCBidHNfbnIsIHRyeF9uciwgdHNfbnI7CisKKwlpZiAoYXJnYyA+PSAxKSB7CisJCS8qIHVzZSB0aGUgQlRTIG51bWJlciB0aGF0IHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgKi8KKwkJYnRzX25yID0gYXRvaShhcmd2WzBdKTsKKwkJaWYgKGJ0c19uciA+PSBuZXQtPm51bV9idHMpIHsKKwkJCXZ0eV9vdXQodnR5LCAiJSUgY2FuJ3QgZmluZCBCVFMgJyVzJyVzIiwgYXJndlswXSwKKwkJCQlWVFlfTkVXTElORSk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwkJYnRzID0gZ3NtX2J0c19udW0obmV0LCBidHNfbnIpOworCX0KKwlpZiAoYXJnYyA+PSAyKSB7CisJCXRyeF9uciA9IGF0b2koYXJndlsxXSk7CisJCWlmICh0cnhfbnIgPj0gYnRzLT5udW1fdHJ4KSB7CisJCQl2dHlfb3V0KHZ0eSwgIiUlIGNhbid0IGZpbmQgVFJYICclcyclcyIsIGFyZ3ZbMV0sCisJCQkJVlRZX05FV0xJTkUpOworCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCQl9CisJCXRyeCA9IGdzbV9idHNfdHJ4X251bShidHMsIHRyeF9ucik7CisJfQorCWlmIChhcmdjID49IDMpIHsKKwkJdHNfbnIgPSBhdG9pKGFyZ3ZbMl0pOworCQlpZiAodHNfbnIgPj0gVFJYX05SX1RTKSB7CisJCQl2dHlfb3V0KHZ0eSwgIiUlIGNhbid0IGZpbmQgVFMgJyVzJyVzIiwgYXJndlsyXSwKKwkJCQlWVFlfTkVXTElORSk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwkJdHMgPSAmdHJ4LT50c1t0c19ucl07CisJCXRzX2R1bXBfdnR5KHZ0eSwgdHMpOworCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisJfQorCWZvciAoYnRzX25yID0gMDsgYnRzX25yIDwgbmV0LT5udW1fYnRzOyBidHNfbnIrKykgeworCQlidHMgPSBnc21fYnRzX251bShuZXQsIGJ0c19ucik7CisJCWZvciAodHJ4X25yID0gMDsgdHJ4X25yIDwgYnRzLT5udW1fdHJ4OyB0cnhfbnIrKykgeworCQkJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgdHJ4X25yKTsKKwkJCWZvciAodHNfbnIgPSAwOyB0c19uciA8IFRSWF9OUl9UUzsgdHNfbnIrKykgeworCQkJCXRzID0gJnRyeC0+dHNbdHNfbnJdOworCQkJCXRzX2R1bXBfdnR5KHZ0eSwgdHMpOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBzdWJzY3JfZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikKK3sKKwlpbnQgcmM7CisJc3RydWN0IGdzbV9hdXRoX2luZm8gYWluZm87CisJc3RydWN0IGdzbV9hdXRoX3R1cGxlIGF0dXBsZTsKKworCXZ0eV9vdXQodnR5LCAiICAgIElEOiAlbGx1LCBBdXRob3JpemVkOiAlZCVzIiwgc3Vic2NyLT5pZCwKKwkJc3Vic2NyLT5hdXRob3JpemVkLCBWVFlfTkVXTElORSk7CisJaWYgKHN1YnNjci0+bmFtZSkKKwkJdnR5X291dCh2dHksICIgICAgTmFtZTogJyVzJyVzIiwgc3Vic2NyLT5uYW1lLCBWVFlfTkVXTElORSk7CisJaWYgKHN1YnNjci0+ZXh0ZW5zaW9uKQorCQl2dHlfb3V0KHZ0eSwgIiAgICBFeHRlbnNpb246ICVzJXMiLCBzdWJzY3ItPmV4dGVuc2lvbiwKKwkJCVZUWV9ORVdMSU5FKTsKKwlpZiAoc3Vic2NyLT5pbXNpKQorCQl2dHlfb3V0KHZ0eSwgIiAgICBJTVNJOiAlcyVzIiwgc3Vic2NyLT5pbXNpLCBWVFlfTkVXTElORSk7CisJaWYgKHN1YnNjci0+dG1zaSAhPSBHU01fUkVTRVJWRURfVE1TSSkKKwkJdnR5X291dCh2dHksICIgICAgVE1TSTogJTA4WCVzIiwgc3Vic2NyLT50bXNpLAorCQkJVlRZX05FV0xJTkUpOworCisJdnR5X291dCh2dHksICIgICAgVXNlIGNvdW50OiAldSVzIiwgc3Vic2NyLT51c2VfY291bnQsIFZUWV9ORVdMSU5FKTsKK30KKworc3RhdGljIHZvaWQgbWVhc19yZXBfZHVtcF91bmlfdnR5KHN0cnVjdCB2dHkgKnZ0eSwKKwkJCQkgIHN0cnVjdCBnc21fbWVhc19yZXBfdW5pZGlyICptcnUsCisJCQkJICBjb25zdCBjaGFyICpwcmVmaXgsCisJCQkJICBjb25zdCBjaGFyICpkaXIpCit7CisJdnR5X291dCh2dHksICIlcyAgUlhMLUZVTEwtJXM6ICU0ZCBkQm0sIFJYTC1TVUItJXM6ICU0ZCBkQm0gIiwKKwkJcHJlZml4LCBkaXIsIHJ4bGV2MmRibShtcnUtPmZ1bGwucnhfbGV2KSwKKwkJCWRpciwgcnhsZXYyZGJtKG1ydS0+c3ViLnJ4X2xldikpOworCXZ0eV9vdXQodnR5LCAiUlhRLUZVTEwtJXM6ICVkLCBSWFEtU1VCLSVzOiAlZCVzIiwKKwkJZGlyLCBtcnUtPmZ1bGwucnhfcXVhbCwgZGlyLCBtcnUtPnN1Yi5yeF9xdWFsLAorCQlWVFlfTkVXTElORSk7Cit9CisKK3N0YXRpYyB2b2lkIG1lYXNfcmVwX2R1bXBfdnR5KHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9tZWFzX3JlcCAqbXIsCisJCQkgICAgICBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJdnR5X291dCh2dHksICIlc01lYXN1cmVtZW50IFJlcG9ydDolcyIsIHByZWZpeCwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiJXMgIEZsYWdzOiAlcyVzJXMlcyVzIiwgcHJlZml4LAorCQkJbXItPmZsYWdzICYgTUVBU19SRVBfRl9VTF9EVFggPyAiRFRYdSAiIDogIiIsCisJCQltci0+ZmxhZ3MgJiBNRUFTX1JFUF9GX0RMX0RUWCA/ICJEVFhkICIgOiAiIiwKKwkJCW1yLT5mbGFncyAmIE1FQVNfUkVQX0ZfRlBDID8gIkZQQyAiIDogIiIsCisJCQltci0+ZmxhZ3MgJiBNRUFTX1JFUF9GX0RMX1ZBTElEID8gIiAiIDogIkRMaW52YWwgIiwKKwkJCVZUWV9ORVdMSU5FKTsKKwlpZiAobXItPmZsYWdzICYgTUVBU19SRVBfRl9NU19UTykKKwkJdnR5X291dCh2dHksICIlcyAgTVMgVGltaW5nIE9mZnNldDogJXUlcyIsIHByZWZpeCwKKwkJCW1yLT5tc190aW1pbmdfb2Zmc2V0LCBWVFlfTkVXTElORSk7CisJaWYgKG1yLT5mbGFncyAmIE1FQVNfUkVQX0ZfTVNfTDEpCisJCXZ0eV9vdXQodnR5LCAiJXMgIEwxIE1TIFBvd2VyOiAldSBkQm0sIFRpbWluZyBBZHZhbmNlOiAldSVzIiwKKwkJCXByZWZpeCwgbXItPm1zX2wxLnB3ciwgbXItPm1zX2wxLnRhLCBWVFlfTkVXTElORSk7CisJaWYgKG1yLT5mbGFncyAmIE1FQVNfUkVQX0ZfRExfVkFMSUQpCisJCW1lYXNfcmVwX2R1bXBfdW5pX3Z0eSh2dHksICZtci0+ZGwsIHByZWZpeCwgImRsIik7CisJbWVhc19yZXBfZHVtcF91bmlfdnR5KHZ0eSwgJm1yLT51bCwgcHJlZml4LCAidWwiKTsKK30KKworc3RhdGljIHZvaWQgbGNoYW5fZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlpbnQgaWR4OworCisJdnR5X291dCh2dHksICJMY2hhbiAldSBpbiBUaW1lc2xvdCAldSBvZiBUUlggJXUgaW4gQlRTICV1LCBUeXBlICVzJXMiLAorCQlsY2hhbi0+bnIsIGxjaGFuLT50cy0+bnIsIGxjaGFuLT50cy0+dHJ4LT5uciwgCisJCWxjaGFuLT50cy0+dHJ4LT5idHMtPm5yLCBnc21fbGNoYW50X25hbWUobGNoYW4tPnR5cGUpLAorCQlWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIFVzZSBDb3VudDogJXUsIFN0YXRlOiAlcyVzIiwgbGNoYW4tPnVzZV9jb3VudCwKKwkJZ3NtX2xjaGFuc19uYW1lKGxjaGFuLT5zdGF0ZSksIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgQlMgUG93ZXI6ICV1IGRCbSwgTVMgUG93ZXI6ICV1IGRCbSVzIiwKKwkJbGNoYW4tPnRzLT50cngtPm5vbWluYWxfcG93ZXIgLSBsY2hhbi0+dHMtPnRyeC0+bWF4X3Bvd2VyX3JlZAorCQktIGxjaGFuLT5ic19wb3dlcioyLAorCQltc19wd3JfZGJtKGxjaGFuLT50cy0+dHJ4LT5idHMtPmJhbmQsIGxjaGFuLT5tc19wb3dlciksCisJCVZUWV9ORVdMSU5FKTsKKwlpZiAobGNoYW4tPnN1YnNjcikgeworCQl2dHlfb3V0KHZ0eSwgIiAgU3Vic2NyaWJlcjolcyIsIFZUWV9ORVdMSU5FKTsKKwkJc3Vic2NyX2R1bXBfdnR5KHZ0eSwgbGNoYW4tPnN1YnNjcik7CisJfSBlbHNlCisJCXZ0eV9vdXQodnR5LCAiICBObyBTdWJzY3JpYmVyJXMiLCBWVFlfTkVXTElORSk7CisJaWYgKGlzX2lwYWNjZXNzX2J0cyhsY2hhbi0+dHMtPnRyeC0+YnRzKSkgeworCQlzdHJ1Y3QgaW5fYWRkciBpYTsKKwkJaWEuc19hZGRyID0gbGNoYW4tPmFiaXNfaXAuYm91bmRfaXA7CisJCXZ0eV9vdXQodnR5LCAiICBCb3VuZCBJUDogJXMgUG9ydCAldSBSVFBfVFlQRTI9JXUgQ09OTl9JRD0ldSVzIiwKKwkJCWluZXRfbnRvYShpYSksIGxjaGFuLT5hYmlzX2lwLmJvdW5kX3BvcnQsCisJCQlsY2hhbi0+YWJpc19pcC5ydHBfcGF5bG9hZDIsIGxjaGFuLT5hYmlzX2lwLmNvbm5faWQsCisJCQlWVFlfTkVXTElORSk7CisJfQorCisJLyogd2Ugd2FudCB0byByZXBvcnQgdGhlIGxhc3QgbWVhc3VyZW1lbnQgcmVwb3J0ICovCisJaWR4ID0gY2FsY19pbml0aWFsX2lkeChBUlJBWV9TSVpFKGxjaGFuLT5tZWFzX3JlcCksCisJCQkgICAgICAgbGNoYW4tPm1lYXNfcmVwX2lkeCwgMSk7CisJbWVhc19yZXBfZHVtcF92dHkodnR5LCAmbGNoYW4tPm1lYXNfcmVwW2lkeF0sICIgICIpOworfQorCisjaWYgMAorVE9ETzogY2FsbHJlZiBhbmQgcmVtb3RlIGNhbGxyZWYgb2YgY2FsbCBtdXN0IGJlIHJlc29sdmVkIHRvIGdldCBnc21fdHJhbnMgb2JqZWN0CitzdGF0aWMgdm9pZCBjYWxsX2R1bXBfdnR5KHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9jYWxsICpjYWxsKQoreworCXZ0eV9vdXQodnR5LCAiQ2FsbCBUeXBlICV1LCBTdGF0ZSAldSwgVHJhbnNhY3Rpb24gSUQgJXUlcyIsCisJCWNhbGwtPnR5cGUsIGNhbGwtPnN0YXRlLCBjYWxsLT50cmFuc2FjdGlvbl9pZCwgVlRZX05FV0xJTkUpOworCisJaWYgKGNhbGwtPmxvY2FsX2xjaGFuKSB7CisJCXZ0eV9vdXQodnR5LCAiQ2FsbCBMb2NhbCBDaGFubmVsOiVzIiwgVlRZX05FV0xJTkUpOworCQlsY2hhbl9kdW1wX3Z0eSh2dHksIGNhbGwtPmxvY2FsX2xjaGFuKTsKKwl9IGVsc2UKKwkJdnR5X291dCh2dHksICJDYWxsIGhhcyBubyBMb2NhbCBDaGFubmVsJXMiLCBWVFlfTkVXTElORSk7CisKKwlpZiAoY2FsbC0+cmVtb3RlX2xjaGFuKSB7CisJCXZ0eV9vdXQodnR5LCAiQ2FsbCBSZW1vdGUgQ2hhbm5lbDolcyIsIFZUWV9ORVdMSU5FKTsKKwkJbGNoYW5fZHVtcF92dHkodnR5LCBjYWxsLT5yZW1vdGVfbGNoYW4pOworCX0gZWxzZQorCQl2dHlfb3V0KHZ0eSwgIkNhbGwgaGFzIG5vIFJlbW90ZSBDaGFubmVsJXMiLCBWVFlfTkVXTElORSk7CisKKwlpZiAoY2FsbC0+Y2FsbGVkX3N1YnNjcikgeworCQl2dHlfb3V0KHZ0eSwgIkNhbGxlZCBTdWJzY3JpYmVyOiVzIiwgVlRZX05FV0xJTkUpOworCQlzdWJzY3JfZHVtcF92dHkodnR5LCBjYWxsLT5jYWxsZWRfc3Vic2NyKTsKKwl9IGVsc2UKKwkJdnR5X291dCh2dHksICJDYWxsIGhhcyBubyBDYWxsZWQgU3Vic2NyaWJlciVzIiwgVlRZX05FV0xJTkUpOworfQorI2VuZGlmCisKK0RFRlVOKHNob3dfbGNoYW4sCisgICAgICBzaG93X2xjaGFuX2NtZCwKKyAgICAgICJzaG93IGxjaGFuIFtidHNfbnJdIFt0cnhfbnJdIFt0c19ucl0gW2xjaGFuX25yXSIsCisJU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgYSBsb2dpY2FsIGNoYW5uZWxcbiIpCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBnc21uZXQ7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKwlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzOworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuOworCWludCBidHNfbnIsIHRyeF9uciwgdHNfbnIsIGxjaGFuX25yOworCisJaWYgKGFyZ2MgPj0gMSkgeworCQkvKiB1c2UgdGhlIEJUUyBudW1iZXIgdGhhdCB0aGUgdXNlciBoYXMgc3BlY2lmaWVkICovCisJCWJ0c19uciA9IGF0b2koYXJndlswXSk7CisJCWlmIChidHNfbnIgPj0gbmV0LT5udW1fYnRzKSB7CisJCQl2dHlfb3V0KHZ0eSwgIiUlIGNhbid0IGZpbmQgQlRTICVzJXMiLCBhcmd2WzBdLAorCQkJCVZUWV9ORVdMSU5FKTsKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJfQorCQlidHMgPSBnc21fYnRzX251bShuZXQsIGJ0c19ucik7CisJfQorCWlmIChhcmdjID49IDIpIHsKKwkJdHJ4X25yID0gYXRvaShhcmd2WzFdKTsKKwkJaWYgKHRyeF9uciA+PSBidHMtPm51bV90cngpIHsKKwkJCXZ0eV9vdXQodnR5LCAiJSUgY2FuJ3QgZmluZCBUUlggJXMlcyIsIGFyZ3ZbMV0sCisJCQkJVlRZX05FV0xJTkUpOworCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCQl9CisJCXRyeCA9IGdzbV9idHNfdHJ4X251bShidHMsIHRyeF9ucik7CisJfQorCWlmIChhcmdjID49IDMpIHsKKwkJdHNfbnIgPSBhdG9pKGFyZ3ZbMl0pOworCQlpZiAodHNfbnIgPj0gVFJYX05SX1RTKSB7CisJCQl2dHlfb3V0KHZ0eSwgIiUlIGNhbid0IGZpbmQgVFMgJXMlcyIsIGFyZ3ZbMl0sCisJCQkJVlRZX05FV0xJTkUpOworCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCQl9CisJCXRzID0gJnRyeC0+dHNbdHNfbnJdOworCX0KKwlpZiAoYXJnYyA+PSA0KSB7CisJCWxjaGFuX25yID0gYXRvaShhcmd2WzNdKTsKKwkJaWYgKGxjaGFuX25yID49IFRTX01BWF9MQ0hBTikgeworCQkJdnR5X291dCh2dHksICIlJSBjYW4ndCBmaW5kIExDSEFOICVzJXMiLCBhcmd2WzNdLAorCQkJCVZUWV9ORVdMSU5FKTsKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJfQorCQlsY2hhbiA9ICZ0cy0+bGNoYW5bbGNoYW5fbnJdOworCQlsY2hhbl9kdW1wX3Z0eSh2dHksIGxjaGFuKTsKKwkJcmV0dXJuIENNRF9TVUNDRVNTOworCX0KKwlmb3IgKGJ0c19uciA9IDA7IGJ0c19uciA8IG5ldC0+bnVtX2J0czsgYnRzX25yKyspIHsKKwkJYnRzID0gZ3NtX2J0c19udW0obmV0LCBidHNfbnIpOworCQlmb3IgKHRyeF9uciA9IDA7IHRyeF9uciA8IGJ0cy0+bnVtX3RyeDsgdHJ4X25yKyspIHsKKwkJCXRyeCA9IGdzbV9idHNfdHJ4X251bShidHMsIHRyeF9ucik7CisJCQlmb3IgKHRzX25yID0gMDsgdHNfbnIgPCBUUlhfTlJfVFM7IHRzX25yKyspIHsKKwkJCQl0cyA9ICZ0cngtPnRzW3RzX25yXTsKKwkJCQlmb3IgKGxjaGFuX25yID0gMDsgbGNoYW5fbnIgPCBUU19NQVhfTENIQU47CisJCQkJICAgICBsY2hhbl9ucisrKSB7CisJCQkJCWxjaGFuID0gJnRzLT5sY2hhbltsY2hhbl9ucl07CisJCQkJCWlmIChsY2hhbi0+dHlwZSA9PSBHU01fTENIQU5fTk9ORSkKKwkJCQkJCWNvbnRpbnVlOworCQkJCQlsY2hhbl9kdW1wX3Z0eSh2dHksIGxjaGFuKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkIGUxZHJ2X2R1bXBfdnR5KHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGUxaW5wX2RyaXZlciAqZHJ2KQoreworCXZ0eV9vdXQodnR5LCAiRTEgSW5wdXQgRHJpdmVyICVzJXMiLCBkcnYtPm5hbWUsIFZUWV9ORVdMSU5FKTsKK30KKworREVGVU4oc2hvd19lMWRydiwKKyAgICAgIHNob3dfZTFkcnZfY21kLAorICAgICAgInNob3cgZTFfZHJpdmVyIiwKKwlTSE9XX1NUUiAiRGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCBhdmFpbGFibGUgRTEgZHJpdmVyc1xuIikKK3sKKwlzdHJ1Y3QgZTFpbnBfZHJpdmVyICpkcnY7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShkcnYsICZlMWlucF9kcml2ZXJfbGlzdCwgbGlzdCkKKwkJZTFkcnZfZHVtcF92dHkodnR5LCBkcnYpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBlMWxpbmVfZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSkKK3sKKwl2dHlfb3V0KHZ0eSwgIkUxIExpbmUgTnVtYmVyICV1LCBOYW1lICVzLCBEcml2ZXIgJXMlcyIsCisJCWxpbmUtPm51bSwgbGluZS0+bmFtZSA/IGxpbmUtPm5hbWUgOiAiIiwKKwkJbGluZS0+ZHJpdmVyLT5uYW1lLCBWVFlfTkVXTElORSk7Cit9CisKK0RFRlVOKHNob3dfZTFsaW5lLAorICAgICAgc2hvd19lMWxpbmVfY21kLAorICAgICAgInNob3cgZTFfbGluZSBbbGluZV9ucl0iLAorCVNIT1dfU1RSICJEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IGEgRTEgbGluZVxuIikKK3sKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZTsKKworCWlmIChhcmdjID49IDEpIHsKKwkJaW50IG51bSA9IGF0b2koYXJndlswXSk7CisJCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGxpbmUsICZlMWlucF9saW5lX2xpc3QsIGxpc3QpIHsKKwkJCWlmIChsaW5lLT5udW0gPT0gbnVtKSB7CisJCQkJZTFsaW5lX2R1bXBfdnR5KHZ0eSwgbGluZSk7CisJCQkJcmV0dXJuIENNRF9TVUNDRVNTOworCQkJfQorCQl9CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CQorCQorCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGxpbmUsICZlMWlucF9saW5lX2xpc3QsIGxpc3QpCisJCWUxbGluZV9kdW1wX3Z0eSh2dHksIGxpbmUpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBlMXRzX2R1bXBfdnR5KHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGUxaW5wX3RzICp0cykKK3sKKwlpZiAodHMtPnR5cGUgPT0gRTFJTlBfVFNfVFlQRV9OT05FKQorCQlyZXR1cm47CisJdnR5X291dCh2dHksICJFMSBUaW1lc2xvdCAlMnUgb2YgTGluZSAldSBpcyBUeXBlICVzJXMiLAorCQl0cy0+bnVtLCB0cy0+bGluZS0+bnVtLCBlMWlucF90c3R5cGVfbmFtZSh0cy0+dHlwZSksCisJCVZUWV9ORVdMSU5FKTsKK30KKworREVGVU4oc2hvd19lMXRzLAorICAgICAgc2hvd19lMXRzX2NtZCwKKyAgICAgICJzaG93IGUxX3RpbWVzbG90IFtsaW5lX25yXSBbdHNfbnJdIiwKKwlTSE9XX1NUUiAiRGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCBhIEUxIHRpbWVzbG90XG4iKQoreworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lID0gTlVMTDsKKwlzdHJ1Y3QgZTFpbnBfdHMgKnRzOworCWludCB0c19ucjsKKworCWlmIChhcmdjID09IDApIHsKKwkJbGxpc3RfZm9yX2VhY2hfZW50cnkobGluZSwgJmUxaW5wX2xpbmVfbGlzdCwgbGlzdCkgeworCQkJZm9yICh0c19uciA9IDA7IHRzX25yIDwgTlVNX0UxX1RTOyB0c19ucisrKSB7CisJCQkJdHMgPSAmbGluZS0+dHNbdHNfbnJdOworCQkJCWUxdHNfZHVtcF92dHkodnR5LCB0cyk7CisJCQl9CisJCX0KKwkJcmV0dXJuIENNRF9TVUNDRVNTOworCX0KKwlpZiAoYXJnYyA+PSAxKSB7CisJCWludCBudW0gPSBhdG9pKGFyZ3ZbMF0pOworCQlsbGlzdF9mb3JfZWFjaF9lbnRyeShsaW5lLCAmZTFpbnBfbGluZV9saXN0LCBsaXN0KSB7CisJCQlpZiAobGluZS0+bnVtID09IG51bSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoIWxpbmUgfHwgbGluZS0+bnVtICE9IG51bSkgeworCQkJdnR5X291dCh2dHksICJFMSBsaW5lICVzIGlzIGludmFsaWQlcyIsCisJCQkJYXJndlswXSwgVlRZX05FV0xJTkUpOworCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCQl9CisJfQkKKwlpZiAoYXJnYyA+PSAyKSB7CisJCXRzX25yID0gYXRvaShhcmd2WzFdKTsKKwkJaWYgKHRzX25yID4gTlVNX0UxX1RTKSB7CisJCQl2dHlfb3V0KHZ0eSwgIkUxIHRpbWVzbG90ICVzIGlzIGludmFsaWQlcyIsCisJCQkJYXJndlsxXSwgVlRZX05FV0xJTkUpOworCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCQl9CisJCXRzID0gJmxpbmUtPnRzW3RzX25yXTsKKwkJZTF0c19kdW1wX3Z0eSh2dHksIHRzKTsKKwkJcmV0dXJuIENNRF9TVUNDRVNTOworCX0gZWxzZSB7CisJCWZvciAodHNfbnIgPSAwOyB0c19uciA8IE5VTV9FMV9UUzsgdHNfbnIrKykgeworCQkJdHMgPSAmbGluZS0+dHNbdHNfbnJdOworCQkJZTF0c19kdW1wX3Z0eSh2dHksIHRzKTsKKwkJfQorCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisJfQorCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgcGFnaW5nX2R1bXBfdnR5KHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9wYWdpbmdfcmVxdWVzdCAqcGFnKQoreworCXZ0eV9vdXQodnR5LCAiUGFnaW5nIG9uIEJUUyAldSVzIiwgcGFnLT5idHMtPm5yLCBWVFlfTkVXTElORSk7CisJc3Vic2NyX2R1bXBfdnR5KHZ0eSwgcGFnLT5zdWJzY3IpOworfQorCitzdGF0aWMgdm9pZCBidHNfcGFnaW5nX2R1bXBfdnR5KHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlzdHJ1Y3QgZ3NtX3BhZ2luZ19yZXF1ZXN0ICpwYWc7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShwYWcsICZidHMtPnBhZ2luZy5wZW5kaW5nX3JlcXVlc3RzLCBlbnRyeSkKKwkJcGFnaW5nX2R1bXBfdnR5KHZ0eSwgcGFnKTsKK30KKworREVGVU4oc2hvd19wYWdpbmcsCisgICAgICBzaG93X3BhZ2luZ19jbWQsCisgICAgICAic2hvdyBwYWdpbmcgW2J0c19ucl0iLAorCVNIT1dfU1RSICJEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IHBhZ2luZyByZXVxZXN0cyBvZiBhIEJUU1xuIikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IGdzbW5ldDsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCWludCBidHNfbnI7CisKKwlpZiAoYXJnYyA+PSAxKSB7CisJCS8qIHVzZSB0aGUgQlRTIG51bWJlciB0aGF0IHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgKi8KKwkJYnRzX25yID0gYXRvaShhcmd2WzBdKTsKKwkJaWYgKGJ0c19uciA+PSBuZXQtPm51bV9idHMpIHsKKwkJCXZ0eV9vdXQodnR5LCAiJSUgY2FuJ3QgZmluZCBCVFMgJXMlcyIsIGFyZ3ZbMF0sCisJCQkJVlRZX05FV0xJTkUpOworCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCQl9CisJCWJ0cyA9IGdzbV9idHNfbnVtKG5ldCwgYnRzX25yKTsKKwkJYnRzX3BhZ2luZ19kdW1wX3Z0eSh2dHksIGJ0cyk7CisJCQorCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisJfQorCWZvciAoYnRzX25yID0gMDsgYnRzX25yIDwgbmV0LT5udW1fYnRzOyBidHNfbnIrKykgeworCQlidHMgPSBnc21fYnRzX251bShuZXQsIGJ0c19ucik7CisJCWJ0c19wYWdpbmdfZHVtcF92dHkodnR5LCBidHMpOworCX0KKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgX3Z0eV9vdXRwdXQoc3RydWN0IGRlYnVnX3RhcmdldCAqdGd0LCBjb25zdCBjaGFyICpsaW5lKQoreworCXN0cnVjdCB2dHkgKnZ0eSA9IHRndC0+dGd0X3Z0eS52dHk7CisJdnR5X291dCh2dHksICIlcyIsIGxpbmUpOworCS8qIFRoaXMgaXMgYW4gdWdseSBoYWNrLCBidXQgdGhlcmUgaXMgbm8gZWFzeSB3YXkuLi4gKi8KKwlpZiAoc3RyY2hyKGxpbmUsICdcbicpKQorCQl2dHlfb3V0KHZ0eSwgIlxyIik7Cit9CisKK3N0cnVjdCBkZWJ1Z190YXJnZXQgKmRlYnVnX3RhcmdldF9jcmVhdGVfdnR5KHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlzdHJ1Y3QgZGVidWdfdGFyZ2V0ICp0YXJnZXQ7CisKKwl0YXJnZXQgPSBkZWJ1Z190YXJnZXRfY3JlYXRlKCk7CisJaWYgKCF0YXJnZXQpCisJCXJldHVybiBOVUxMOworCisJdGFyZ2V0LT50Z3RfdnR5LnZ0eSA9IHZ0eTsKKwl0YXJnZXQtPm91dHB1dCA9IF92dHlfb3V0cHV0OworCXJldHVybiB0YXJnZXQ7Cit9CisKK0RFRlVOKGVuYWJsZV9sb2dnaW5nLAorICAgICAgZW5hYmxlX2xvZ2dpbmdfY21kLAorICAgICAgImxvZ2dpbmcgZW5hYmxlIiwKKyAgICAgICJFbmFibGVzIGxvZ2dpbmcgdG8gdGhpcyB2dHlcbiIpCit7CisJc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICpjb25uOworCisJY29ubiA9IChzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKikgdnR5LT5wcml2OworCWlmIChjb25uLT5kYmcpIHsKKwkJdnR5X291dCh2dHksICJMb2dnaW5nIGFscmVhZHkgZW5hYmxlZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWNvbm4tPmRiZyA9IGRlYnVnX3RhcmdldF9jcmVhdGVfdnR5KHZ0eSk7CisJaWYgKCFjb25uLT5kYmcpCisJCXJldHVybiBDTURfV0FSTklORzsKKworCWRlYnVnX2FkZF90YXJnZXQoY29ubi0+ZGJnKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGxvZ2dpbmdfZmx0cl9pbXNpLAorICAgICAgbG9nZ2luZ19mbHRyX2ltc2lfY21kLAorICAgICAgImxvZ2dpbmcgZmlsdGVyIGltc2kgSU1TSSIsCisgICAgICAiUHJpbnQgYWxsIG1lc3NhZ2VzIHJlbGF0ZWQgdG8gYSBJTVNJXG4iKQoreworCXN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqY29ubjsKKworCWNvbm4gPSAoc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICopIHZ0eS0+cHJpdjsKKwlpZiAoIWNvbm4tPmRiZykgeworCQl2dHlfb3V0KHZ0eSwgIkxvZ2dpbmcgd2FzIG5vdCBlbmFibGVkLiVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJZGVidWdfc2V0X2ltc2lfZmlsdGVyKGNvbm4tPmRiZywgYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihsb2dnaW5nX2ZsdHJfYWxsLAorICAgICAgbG9nZ2luZ19mbHRyX2FsbF9jbWQsCisgICAgICAibG9nZ2luZyBmaWx0ZXIgYWxsIDwwLTE+IiwKKyAgICAgICJQcmludCBhbGwgbWVzc2FnZXMgdG8gdGhlIGNvbnNvbGVcbiIpCit7CisJc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICpjb25uOworCisJY29ubiA9IChzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKikgdnR5LT5wcml2OworCWlmICghY29ubi0+ZGJnKSB7CisJCXZ0eV9vdXQodnR5LCAiTG9nZ2luZyB3YXMgbm90IGVuYWJsZWQuJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlkZWJ1Z19zZXRfYWxsX2ZpbHRlcihjb25uLT5kYmcsIGF0b2koYXJndlswXSkpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4obG9nZ2luZ191c2VfY2xyLAorICAgICAgbG9nZ2luZ191c2VfY2xyX2NtZCwKKyAgICAgICJsb2dnaW5nIGNvbG9yIDwwLTE+IiwKKyAgICAgICJVc2UgY29sb3IgZm9yIHByaW50aW5nIG1lc3NhZ2VzXG4iKQoreworCXN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqY29ubjsKKworCWNvbm4gPSAoc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICopIHZ0eS0+cHJpdjsKKwlpZiAoIWNvbm4tPmRiZykgeworCQl2dHlfb3V0KHZ0eSwgIkxvZ2dpbmcgd2FzIG5vdCBlbmFibGVkLiVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJZGVidWdfc2V0X3VzZV9jb2xvcihjb25uLT5kYmcsIGF0b2koYXJndlswXSkpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4obG9nZ2luZ19wcm50X3RpbWVzdGFtcCwKKyAgICAgIGxvZ2dpbmdfcHJudF90aW1lc3RhbXBfY21kLAorICAgICAgImxvZ2dpbmcgdGltZXN0YW1wIDwwLTE+IiwKKyAgICAgICJQcmludCB0aGUgdGltZXN0YW1wIG9mIGVhY2ggbWVzc2FnZVxuIikKK3sKKwlzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKmNvbm47CisKKwljb25uID0gKHN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqKSB2dHktPnByaXY7CisJaWYgKCFjb25uLT5kYmcpIHsKKwkJdnR5X291dCh2dHksICJMb2dnaW5nIHdhcyBub3QgZW5hYmxlZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWRlYnVnX3NldF9wcmludF90aW1lc3RhbXAoY29ubi0+ZGJnLCBhdG9pKGFyZ3ZbMF0pKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIEZJWE1FOiB0aG9zZSBoYXZlIHRvIGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBsb2cgbGV2ZWxzIGFuZCBjYXRlZ29yaWVzICovCisjZGVmaW5lIFZUWV9ERUJVR19DQVRFR09SSUVTICIocmxsfGNjfG1tfHJyfHJzbHxubXxzbXN8cGFnfG1uY2N8aW5wfG1pfG1pYnxtdXh8bWVhc3xzY2NwfG1zY3xtZ2NwfGhvfGRifHJlZikiCisjZGVmaW5lIFZUWV9ERUJVR19MRVZFTFMgIihldmVyeXRoaW5nfGRlYnVnfGluZm98bm90aWNlfGVycm9yfGZhdGFsKSIKK0RFRlVOKGxvZ2dpbmdfbGV2ZWwsCisgICAgICBsb2dnaW5nX2xldmVsX2NtZCwKKyAgICAgICJsb2dnaW5nIGxldmVsICIgVlRZX0RFQlVHX0NBVEVHT1JJRVMgIiAiIFZUWV9ERUJVR19MRVZFTFMsCisgICAgICAiU2V0IHRoZSBsb2cgbGV2ZWwgZm9yIGEgc3BlY2lmaWVkIGNhdGVnb3J5XG4iKQoreworCXN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqY29ubjsKKwlpbnQgY2F0ZWdvcnkgPSBkZWJ1Z19wYXJzZV9jYXRlZ29yeShhcmd2WzBdKTsKKwlpbnQgbGV2ZWwgPSBkZWJ1Z19wYXJzZV9sZXZlbChhcmd2WzFdKTsKKworCWNvbm4gPSAoc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICopIHZ0eS0+cHJpdjsKKwlpZiAoIWNvbm4tPmRiZykgeworCQl2dHlfb3V0KHZ0eSwgIkxvZ2dpbmcgd2FzIG5vdCBlbmFibGVkLiVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJaWYgKGNhdGVnb3J5IDwgMCkgeworCQl2dHlfb3V0KHZ0eSwgIkludmFsaWQgY2F0ZWdvcnkgYCVzJyVzIiwgYXJndlswXSwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJaWYgKGxldmVsIDwgMCkgeworCQl2dHlfb3V0KHZ0eSwgIkludmFsaWQgbGV2ZWwgYCVzJyVzIiwgYXJndlsxXSwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJY29ubi0+ZGJnLT5jYXRlZ29yaWVzW2NhdGVnb3J5XS5lbmFibGVkID0gMTsKKwljb25uLT5kYmctPmNhdGVnb3JpZXNbY2F0ZWdvcnldLmxvZ2xldmVsID0gbGV2ZWw7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGxvZ2dpbmdfc2V0X2NhdGVnb3J5X21hc2ssCisgICAgICBsb2dnaW5nX3NldF9jYXRlZ29yeV9tYXNrX2NtZCwKKyAgICAgICJsb2dnaW5nIHNldCBkZWJ1ZyBtYXNrIE1BU0siLAorICAgICAgIkRlY2lkZSB3aGljaCBjYXRlZ29yaWVzIHRvIG91dHB1dC5cbiIpCit7CisJc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICpjb25uOworCisJY29ubiA9IChzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKikgdnR5LT5wcml2OworCWlmICghY29ubi0+ZGJnKSB7CisJCXZ0eV9vdXQodnR5LCAiTG9nZ2luZyB3YXMgbm90IGVuYWJsZWQuJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlkZWJ1Z19wYXJzZV9jYXRlZ29yeV9tYXNrKGNvbm4tPmRiZywgYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihsb2dnaW5nX3NldF9sb2dfbGV2ZWwsCisgICAgICBsb2dnaW5nX3NldF9sb2dfbGV2ZWxfY21kLAorICAgICAgImxvZ2dpbmcgc2V0IGxvZyBsZXZlbCA8MC04PiIsCisgICAgICAiU2V0IHRoZSBnbG9iYWwgbG9nIGxldmVsLiBUaGUgdmFsdWUgMCBpbXBsaWVzIG5vIGZpbHRlcmluZy5cbiIpCit7CisJc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICpjb25uOworCisJY29ubiA9IChzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKikgdnR5LT5wcml2OworCWlmICghY29ubi0+ZGJnKSB7CisJCXZ0eV9vdXQodnR5LCAiTG9nZ2luZyB3YXMgbm90IGVuYWJsZWQuJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlkZWJ1Z19zZXRfbG9nX2xldmVsKGNvbm4tPmRiZywgYXRvaShhcmd2WzBdKSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihkaWFibGVfbG9nZ2luZywKKyAgICAgIGRpc2FibGVfbG9nZ2luZ19jbWQsCisgICAgICAibG9nZ2luZyBkaXNhYmxlIiwKKyAgICAgICJEaXNhYmxlcyBsb2dnaW5nIHRvIHRoaXMgdnR5XG4iKQoreworCXN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqY29ubjsKKworCWNvbm4gPSAoc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICopIHZ0eS0+cHJpdjsKKwlpZiAoIWNvbm4tPmRiZykgeworCQl2dHlfb3V0KHZ0eSwgIkxvZ2dpbmcgd2FzIG5vdCBlbmFibGVkLiVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJZGVidWdfZGVsX3RhcmdldChjb25uLT5kYmcpOworCXRhbGxvY19mcmVlKGNvbm4tPmRiZyk7CisJY29ubi0+ZGJnID0gTlVMTDsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKHNob3dfc3RhdHMsCisgICAgICBzaG93X3N0YXRzX2NtZCwKKyAgICAgICJzaG93IHN0YXRpc3RpY3MiLAorCVNIT1dfU1RSICJEaXNwbGF5IG5ldHdvcmsgc3RhdGlzdGljc1xuIikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IGdzbW5ldDsKKworCXZ0eV9vdXQodnR5LCAiQ2hhbm5lbCBSZXF1ZXN0cyAgICAgICAgOiAlbHUgdG90YWwsICVsdSBubyBjaGFubmVsJXMiLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmNocmVxLnRvdGFsKSwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5jaHJlcS5ub19jaGFubmVsKSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiTG9jYXRpb24gVXBkYXRlICAgICAgICAgOiAlbHUgYXR0YWNoLCAlbHUgbm9ybWFsLCAlbHUgcGVyaW9kaWMlcyIsCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMubG9jX3VwZF90eXBlLmF0dGFjaCksCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMubG9jX3VwZF90eXBlLm5vcm1hbCksCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMubG9jX3VwZF90eXBlLnBlcmlvZGljKSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiSU1TSSBEZXRhY2ggSW5kaWNhdGlvbnMgOiAlbHUlcyIsCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMubG9jX3VwZF90eXBlLmRldGFjaCksIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIkxvY2F0aW9uIFVwZGF0ZSBSZXNwb25zZTogJWx1IGFjY2VwdCwgJWx1IHJlamVjdCVzIiwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5sb2NfdXBkX3Jlc3AuYWNjZXB0KSwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5sb2NfdXBkX3Jlc3AucmVqZWN0KSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiUGFnaW5nICAgICAgICAgICAgICAgICAgOiAlbHUgYXR0ZW1wdGVkLCAlbHUgY29tcGxldGUsICVsdSBleHBpcmVkJXMiLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLnBhZ2luZy5hdHRlbXB0ZWQpLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLnBhZ2luZy5jb21wbGV0ZWQpLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLnBhZ2luZy5leHBpcmVkKSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiSGFuZG92ZXIgICAgICAgICAgICAgICAgOiAlbHUgYXR0ZW1wdGVkLCAlbHUgbm9fY2hhbm5lbCwgJWx1IHRpbWVvdXQsICIKKwkJIiVsdSBjb21wbGV0ZWQsICVsdSBmYWlsZWQlcyIsCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuaGFuZG92ZXIuYXR0ZW1wdGVkKSwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5oYW5kb3Zlci5ub19jaGFubmVsKSwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5oYW5kb3Zlci50aW1lb3V0KSwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5oYW5kb3Zlci5jb21wbGV0ZWQpLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmhhbmRvdmVyLmZhaWxlZCksIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIlNNUyBNTyAgICAgICAgICAgICAgICAgIDogJWx1IHN1Ym1pdHRlZCwgJWx1IG5vIHJlY2VpdmVyJXMiLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLnNtcy5zdWJtaXR0ZWQpLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLnNtcy5ub19yZWNlaXZlciksIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIlNNUyBNVCAgICAgICAgICAgICAgICAgIDogJWx1IGRlbGl2ZXJlZCwgJWx1IG5vIG1lbW9yeSwgJWx1IG90aGVyIGVycm9yJXMiLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLnNtcy5kZWxpdmVyZWQpLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLnNtcy5ycF9lcnJfbWVtKSwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5zbXMucnBfZXJyX290aGVyKSwgVlRZX05FV0xJTkUpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25ldCwKKyAgICAgIGNmZ19uZXRfY21kLAorICAgICAgIm5ldHdvcmsiLAorICAgICAgIkNvbmZpZ3VyZSB0aGUgR1NNIG5ldHdvcmsiKQoreworCXZ0eS0+aW5kZXggPSBnc21uZXQ7CisJdnR5LT5ub2RlID0gR1NNTkVUX05PREU7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKworREVGVU4oY2ZnX25ldF9uY2MsCisgICAgICBjZmdfbmV0X25jY19jbWQsCisgICAgICAibmV0d29yayBjb3VudHJ5IGNvZGUgPDEtOTk5PiIsCisgICAgICAiU2V0IHRoZSBHU00gbmV0d29yayBjb3VudHJ5IGNvZGUiKQoreworCWdzbW5ldC0+Y291bnRyeV9jb2RlID0gYXRvaShhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25ldF9tbmMsCisgICAgICBjZmdfbmV0X21uY19jbWQsCisgICAgICAibW9iaWxlIG5ldHdvcmsgY29kZSA8MS05OTk+IiwKKyAgICAgICJTZXQgdGhlIEdTTSBtb2JpbGUgbmV0d29yayBjb2RlIikKK3sKKwlnc21uZXQtPm5ldHdvcmtfY29kZSA9IGF0b2koYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uZXRfbmFtZV9zaG9ydCwKKyAgICAgIGNmZ19uZXRfbmFtZV9zaG9ydF9jbWQsCisgICAgICAic2hvcnQgbmFtZSBOQU1FIiwKKyAgICAgICJTZXQgdGhlIHNob3J0IEdTTSBuZXR3b3JrIG5hbWUiKQoreworCWlmIChnc21uZXQtPm5hbWVfc2hvcnQpCisJCXRhbGxvY19mcmVlKGdzbW5ldC0+bmFtZV9zaG9ydCk7CisKKwlnc21uZXQtPm5hbWVfc2hvcnQgPSB0YWxsb2Nfc3RyZHVwKGdzbW5ldCwgYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uZXRfbmFtZV9sb25nLAorICAgICAgY2ZnX25ldF9uYW1lX2xvbmdfY21kLAorICAgICAgImxvbmcgbmFtZSBOQU1FIiwKKyAgICAgICJTZXQgdGhlIGxvbmcgR1NNIG5ldHdvcmsgbmFtZSIpCit7CisJaWYgKGdzbW5ldC0+bmFtZV9sb25nKQorCQl0YWxsb2NfZnJlZShnc21uZXQtPm5hbWVfbG9uZyk7CisKKwlnc21uZXQtPm5hbWVfbG9uZyA9IHRhbGxvY19zdHJkdXAoZ3NtbmV0LCBhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25ldF9hdXRoX3BvbGljeSwKKyAgICAgIGNmZ19uZXRfYXV0aF9wb2xpY3lfY21kLAorICAgICAgImF1dGggcG9saWN5IChjbG9zZWR8YWNjZXB0LWFsbHx0b2tlbikiLAorICAgICAgIlNldCB0aGUgR1NNIG5ldHdvcmsgYXV0aGVudGljYXRpb24gcG9saWN5XG4iKQoreworCWVudW0gZ3NtX2F1dGhfcG9saWN5IHBvbGljeSA9IGdzbV9hdXRoX3BvbGljeV9wYXJzZShhcmd2WzBdKTsKKworCWdzbW5ldC0+YXV0aF9wb2xpY3kgPSBwb2xpY3k7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uZXRfcmVqZWN0X2NhdXNlLAorICAgICAgY2ZnX25ldF9yZWplY3RfY2F1c2VfY21kLAorICAgICAgImxvY2F0aW9uIHVwZGF0aW5nIHJlamVjdCBjYXVzZSA8Mi0xMTE+IiwKKyAgICAgICJTZXQgdGhlIHJlamVjdCBjYXVzZSBvZiBsb2NhdGlvbiB1cGRhdGluZyByZWplY3RcbiIpCit7CisJZ3NtbmV0LT5yZWplY3RfY2F1c2UgPSBhdG9pKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X2VuY3J5cHRpb24sCisgICAgICBjZmdfbmV0X2VuY3J5cHRpb25fY21kLAorICAgICAgImVuY3J5cHRpb24gYTUgKDB8MXwyKSIsCisgICAgICAiRW5hYmxlIG9yIGRpc2FibGUgZW5jcnlwdGlvbiAoQTUpIGZvciB0aGlzIG5ldHdvcmtcbiIpCit7CisJZ3NtbmV0LT5hNV9lbmNyeXB0aW9uPSBhdG9pKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X25lY2ksCisgICAgICBjZmdfbmV0X25lY2lfY21kLAorICAgICAgIm5lY2kgKDB8MSkiLAorICAgICAgIlNldCBpZiBORUNJIG9mIGNlbGwgc2VsZWN0aW9uIGlzIHRvIGJlIHNldCIpCit7CisJZ3NtbmV0LT5uZWNpID0gYXRvaShhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uZXRfcnJscF9tb2RlLCBjZmdfbmV0X3JybHBfbW9kZV9jbWQsCisgICAgICAicnJscCBtb2RlIChub25lfG1zLWJhc2VkfG1zLXByZWZlcnJlZHxhc3MtcHJlZmVycmVkKSIsCisJIlNldCB0aGUgUmFkaW8gUmVzb3VyY2UgTG9jYXRpb24gUHJvdG9jb2wgTW9kZSIpCit7CisJZ3NtbmV0LT5ycmxwLm1vZGUgPSBycmxwX21vZGVfcGFyc2UoYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uZXRfbW1faW5mbywgY2ZnX25ldF9tbV9pbmZvX2NtZCwKKyAgICAgICJtbSBpbmZvICgwfDEpIiwKKwkiV2hldGhlciB0byBzZW5kIE1NIElORk8gYWZ0ZXIgTE9DIFVQRCBBQ0NFUFQiKQoreworCWdzbW5ldC0+c2VuZF9tbV9pbmZvID0gYXRvaShhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25ldF9oYW5kb3ZlciwgY2ZnX25ldF9oYW5kb3Zlcl9jbWQsCisgICAgICAiaGFuZG92ZXIgKDB8MSkiLAorCSJXaGV0aGVyIG9yIG5vdCB0byB1c2UgaW4tY2FsbCBoYW5kb3ZlciIpCit7CisJaW50IGVuYWJsZSA9IGF0b2koYXJndlswXSk7CisKKwlpZiAoZW5hYmxlICYmIGlwYWNjX3J0cF9kaXJlY3QpIHsKKwkJdnR5X291dCh2dHksICIlJSBDYW5ub3QgZW5hYmxlIGhhbmRvdmVyIHVubGVzcyBSVFAgUHJveHkgbW9kZSAiCisJCQkiaXMgZW5hYmxlZCBieSB1c2luZyB0aGUgLVAgY29tbWFuZCBsaW5lIG9wdGlvbiVzIiwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKwlnc21uZXQtPmhhbmRvdmVyLmFjdGl2ZSA9IGVuYWJsZTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25ldF9ob193aW5fcnhsZXZfYXZnLCBjZmdfbmV0X2hvX3dpbl9yeGxldl9hdmdfY21kLAorICAgICAgImhhbmRvdmVyIHdpbmRvdyByeGxldiBhdmVyYWdpbmcgPDEtMTA+IiwKKwkiSG93IG1hbnkgUnhMZXYgbWVhc3VyZW1lbnRzIGFyZSB1c2VkIGZvciBhdmVyYWdpbmciKQoreworCWdzbW5ldC0+aGFuZG92ZXIud2luX3J4bGV2X2F2ZyA9IGF0b2koYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X2hvX3dpbl9yeHF1YWxfYXZnLCBjZmdfbmV0X2hvX3dpbl9yeHF1YWxfYXZnX2NtZCwKKyAgICAgICJoYW5kb3ZlciB3aW5kb3cgcnhxdWFsIGF2ZXJhZ2luZyA8MS0xMD4iLAorCSJIb3cgbWFueSBSeFF1YWwgbWVhc3VyZW1lbnRzIGFyZSB1c2VkIGZvciBhdmVyYWdpbmciKQoreworCWdzbW5ldC0+aGFuZG92ZXIud2luX3J4cXVhbF9hdmcgPSBhdG9pKGFyZ3ZbMF0pOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25ldF9ob193aW5fcnhsZXZfbmVpZ2hfYXZnLCBjZmdfbmV0X2hvX3dpbl9yeGxldl9hdmdfbmVpZ2hfY21kLAorICAgICAgImhhbmRvdmVyIHdpbmRvdyByeGxldiBuZWlnaGJvciBhdmVyYWdpbmcgPDEtMTA+IiwKKwkiSG93IG1hbnkgUnhRdWFsIG1lYXN1cmVtZW50cyBhcmUgdXNlZCBmb3IgYXZlcmFnaW5nIikKK3sKKwlnc21uZXQtPmhhbmRvdmVyLndpbl9yeGxldl9hdmdfbmVpZ2ggPSBhdG9pKGFyZ3ZbMF0pOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25ldF9ob19wd3JfaW50ZXJ2YWwsIGNmZ19uZXRfaG9fcHdyX2ludGVydmFsX2NtZCwKKyAgICAgICJoYW5kb3ZlciBwb3dlciBidWRnZXQgaW50ZXJ2YWwgPDEtOTk+IiwKKwkiSG93IG9mdGVuIHRvIGNoZWNrIGlmIHdlIGhhdmUgYSBiZXR0ZXIgY2VsbCAoU0FDQ0ggZnJhbWVzKSIpCit7CisJZ3NtbmV0LT5oYW5kb3Zlci5wd3JfaW50ZXJ2YWwgPSBhdG9pKGFyZ3ZbMF0pOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25ldF9ob19wd3JfaHlzdGVyZXNpcywgY2ZnX25ldF9ob19wd3JfaHlzdGVyZXNpc19jbWQsCisgICAgICAiaGFuZG92ZXIgcG93ZXIgYnVkZ2V0IGh5c3RlcmVzaXMgPDAtOTk5PiIsCisJIkhvdyBtYW55IGRCIGRvZXMgYSBuZWlnaGJvciB0byBiZSBzdHJvbmdlciB0byBiZWNvbWUgYSBITyBjYW5kaWRhdGUiKQoreworCWdzbW5ldC0+aGFuZG92ZXIucHdyX2h5c3RlcmVzaXMgPSBhdG9pKGFyZ3ZbMF0pOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25ldF9ob19tYXhfZGlzdGFuY2UsIGNmZ19uZXRfaG9fbWF4X2Rpc3RhbmNlX2NtZCwKKyAgICAgICJoYW5kb3ZlciBtYXhpbXVtIGRpc3RhbmNlIDwwLTk5OTk+IiwKKwkiSG93IGJpZyBpcyB0aGUgbWF4aW11bSB0aW1pbmcgYWR2YW5jZSBiZWZvcmUgSE8gaXMgZm9yY2VkIikKK3sKKwlnc21uZXQtPmhhbmRvdmVyLm1heF9kaXN0YW5jZSA9IGF0b2koYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisjZGVmaW5lIERFQ0xBUkVfVElNRVIobnVtYmVyLCBkb2MpIFwKKyAgICBERUZVTihjZmdfbmV0X1QjI251bWJlciwJCQkJCVwKKyAgICAgIGNmZ19uZXRfVCMjbnVtYmVyIyNfY21kLAkJCQkJXAorICAgICAgInRpbWVyIHQiICNudW1iZXIgICIgPDAtNjU1MzU+IiwJCQkJXAorICAgICAgZG9jKQkJCQkJCQlcCit7CQkJCQkJCQlcCisJaW50IHZhbHVlID0gYXRvaShhcmd2WzBdKTsJCQkJXAorCQkJCQkJCQlcCisJaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+IDY1NTM1KSB7CQkJXAorCQl2dHlfb3V0KHZ0eSwgIlRpbWVyIHZhbHVlICVzIG91dCBvZiByYW5nZS4lcyIsCVwKKwkJICAgICAgICBhcmd2WzBdLCBWVFlfTkVXTElORSk7CQkJXAorCQlyZXR1cm4gQ01EX1dBUk5JTkc7CQkJCVwKKwl9CQkJCQkJCVwKKwkJCQkJCQkJXAorCWdzbW5ldC0+VCMjbnVtYmVyID0gdmFsdWU7CQkJCVwKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7CQkJCQlcCit9CisKK0RFQ0xBUkVfVElNRVIoMzEwMSwgIlNldCB0aGUgdGltZW91dCB2YWx1ZSBmb3IgSU1NRURJQVRFIEFTU0lHTk1FTlQuIikKK0RFQ0xBUkVfVElNRVIoMzEwMywgIlNldCB0aGUgdGltZW91dCB2YWx1ZSBmb3IgSEFORE9WRVIuIikKK0RFQ0xBUkVfVElNRVIoMzEwNSwgIkN1cnJlbnRseSBub3QgdXNlZC4iKQorREVDTEFSRV9USU1FUigzMTA3LCAiQ3VycmVudGx5IG5vdCB1c2VkLiIpCitERUNMQVJFX1RJTUVSKDMxMDksICJDdXJyZW50bHkgbm90IHVzZWQuIikKK0RFQ0xBUkVfVElNRVIoMzExMSwgIkN1cnJlbnRseSBub3QgdXNlZC4iKQorREVDTEFSRV9USU1FUigzMTEzLCAiU2V0IHRoZSB0aW1lIHRvIHRyeSBwYWdpbmcgYSBzdWJzY3JpYmVyLiIpCitERUNMQVJFX1RJTUVSKDMxMTUsICJDdXJyZW50bHkgbm90IHVzZWQuIikKK0RFQ0xBUkVfVElNRVIoMzExNywgIkN1cnJlbnRseSBub3QgdXNlZC4iKQorREVDTEFSRV9USU1FUigzMTE5LCAiQ3VycmVudGx5IG5vdCB1c2VkLiIpCitERUNMQVJFX1RJTUVSKDMxNDEsICJDdXJyZW50bHkgbm90IHVzZWQuIikKKworCisvKiBwZXItQlRTIGNvbmZpZ3VyYXRpb24gKi8KK0RFRlVOKGNmZ19idHMsCisgICAgICBjZmdfYnRzX2NtZCwKKyAgICAgICJidHMgQlRTX05SIiwKKyAgICAgICJTZWxlY3QgYSBCVFMgdG8gY29uZmlndXJlXG4iKQoreworCWludCBidHNfbnIgPSBhdG9pKGFyZ3ZbMF0pOworCXN0cnVjdCBnc21fYnRzICpidHM7CisKKwlpZiAoYnRzX25yID4gZ3NtbmV0LT5udW1fYnRzKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgVGhlIG5leHQgdW51c2VkIEJUUyBudW1iZXIgaXMgJXUlcyIsCisJCQlnc21uZXQtPm51bV9idHMsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0gZWxzZSBpZiAoYnRzX25yID09IGdzbW5ldC0+bnVtX2J0cykgeworCQkvKiBhbGxvY2F0ZSBhIG5ldyBvbmUgKi8KKwkJYnRzID0gZ3NtX2J0c19hbGxvYyhnc21uZXQsIEdTTV9CVFNfVFlQRV9VTktOT1dOLAorCQkJCSAgICBIQVJEQ09ERURfVFNDLCBIQVJEQ09ERURfQlNJQyk7CisJfSBlbHNlIAorCQlidHMgPSBnc21fYnRzX251bShnc21uZXQsIGJ0c19ucik7CisKKwlpZiAoIWJ0cykgeworCQl2dHlfb3V0KHZ0eSwgIiUlIFVuYWJsZSB0byBhbGxvY2F0ZSBCVFMgJXUlcyIsCisJCQlnc21uZXQtPm51bV9idHMsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCXZ0eS0+aW5kZXggPSBidHM7CisJdnR5LT5ub2RlID0gQlRTX05PREU7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfdHlwZSwKKyAgICAgIGNmZ19idHNfdHlwZV9jbWQsCisgICAgICAidHlwZSBUWVBFIiwKKyAgICAgICJTZXQgdGhlIEJUUyB0eXBlXG4iKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCWludCByYzsKKworCXJjID0gZ3NtX3NldF9idHNfdHlwZShidHMsIHBhcnNlX2J0c3R5cGUoYXJndlswXSkpOworCWlmIChyYyA8IDApCisJCXJldHVybiBDTURfV0FSTklORzsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19iYW5kLAorICAgICAgY2ZnX2J0c19iYW5kX2NtZCwKKyAgICAgICJiYW5kIEJBTkQiLAorICAgICAgIlNldCB0aGUgZnJlcXVlbmN5IGJhbmQgb2YgdGhpcyBCVFNcbiIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJaW50IGJhbmQgPSBnc21fYmFuZF9wYXJzZShhcmd2WzBdKTsKKworCWlmIChiYW5kIDwgMCkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIEJBTkQgJWQgaXMgbm90IGEgdmFsaWQgR1NNIGJhbmQlcyIsCisJCQliYW5kLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlidHMtPmJhbmQgPSBiYW5kOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX2NpLAorICAgICAgY2ZnX2J0c19jaV9jbWQsCisgICAgICAiY2VsbF9pZGVudGl0eSA8MC02NTUzNT4iLAorICAgICAgIlNldCB0aGUgQ2VsbCBpZGVudGl0eSBvZiB0aGlzIEJUU1xuIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlpbnQgY2kgPSBhdG9pKGFyZ3ZbMF0pOworCisJaWYgKGNpIDwgMCB8fCBjaSA+IDB4ZmZmZikgeworCQl2dHlfb3V0KHZ0eSwgIiUlIENJICVkIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2UgKDAtNjU1MzUpJXMiLAorCQkJY2ksIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKwlidHMtPmNlbGxfaWRlbnRpdHkgPSBjaTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19sYWMsCisgICAgICBjZmdfYnRzX2xhY19jbWQsCisgICAgICAibG9jYXRpb25fYXJlYV9jb2RlIDwwLTY1NTM1PiIsCisgICAgICAiU2V0IHRoZSBMb2NhdGlvbiBBcmVhIENvZGUgKExBQykgb2YgdGhpcyBCVFNcbiIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJaW50IGxhYyA9IGF0b2koYXJndlswXSk7CisKKwlpZiAobGFjIDwgMCB8fCBsYWMgPiAweGZmZmYpIHsKKwkJdnR5X291dCh2dHksICIlJSBMQUMgJWQgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSAoMC02NTUzNSklcyIsCisJCQlsYWMsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWlmIChsYWMgPT0gR1NNX0xBQ19SRVNFUlZFRF9ERVRBQ0hFRCB8fCBsYWMgPT0gR1NNX0xBQ19SRVNFUlZFRF9BTExfQlRTKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgTEFDICVkIGlzIHJlc2VydmVkIGJ5IEdTTSAwNC4wOCVzIiwKKwkJCWxhYywgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJYnRzLT5sb2NhdGlvbl9hcmVhX2NvZGUgPSBsYWM7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKworREVGVU4oY2ZnX2J0c190c2MsCisgICAgICBjZmdfYnRzX3RzY19jbWQsCisgICAgICAidHJhaW5pbmdfc2VxdWVuY2VfY29kZSA8MC0yNTU+IiwKKyAgICAgICJTZXQgdGhlIFRyYWluaW5nIFNlcXVlbmNlIENvZGUgKFRTQykgb2YgdGhpcyBCVFNcbiIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJaW50IHRzYyA9IGF0b2koYXJndlswXSk7CisKKwlpZiAodHNjIDwgMCB8fCB0c2MgPiAweGZmKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgVFNDICVkIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2UgKDAtMjU1KSVzIiwKKwkJCXRzYywgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCWJ0cy0+dHNjID0gdHNjOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX2JzaWMsCisgICAgICBjZmdfYnRzX2JzaWNfY21kLAorICAgICAgImJhc2Vfc3RhdGlvbl9pZF9jb2RlIDwwLTYzPiIsCisgICAgICAiU2V0IHRoZSBCYXNlIFN0YXRpb24gSWRlbnRpdHkgQ29kZSAoQlNJQykgb2YgdGhpcyBCVFNcbiIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJaW50IGJzaWMgPSBhdG9pKGFyZ3ZbMF0pOworCisJaWYgKGJzaWMgPCAwIHx8IGJzaWMgPiAweDNmKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgQlNJQyAlZCBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlICgwLTI1NSklcyIsCisJCQlic2ljLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisJYnRzLT5ic2ljID0gYnNpYzsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworCitERUZVTihjZmdfYnRzX3VuaXRfaWQsCisgICAgICBjZmdfYnRzX3VuaXRfaWRfY21kLAorICAgICAgImlwLmFjY2VzcyB1bml0X2lkIDwwLTY1NTM0PiA8MC0yNTU+IiwKKyAgICAgICJTZXQgdGhlIGlwLmFjY2VzcyBCVFMgVW5pdCBJRCBvZiB0aGlzIEJUU1xuIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlpbnQgc2l0ZV9pZCA9IGF0b2koYXJndlswXSk7CisJaW50IGJ0c19pZCA9IGF0b2koYXJndlsxXSk7CisKKwlpZiAoIWlzX2lwYWNjZXNzX2J0cyhidHMpKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgQlRTIGlzIG5vdCBvZiBpcC5hY2Nlc3MgdHlwZSVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJYnRzLT5pcF9hY2Nlc3Muc2l0ZV9pZCA9IHNpdGVfaWQ7CisJYnRzLT5pcF9hY2Nlc3MuYnRzX2lkID0gYnRzX2lkOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX3N0cmVhbV9pZCwKKyAgICAgIGNmZ19idHNfc3RyZWFtX2lkX2NtZCwKKyAgICAgICJvbWwgaXAuYWNjZXNzIHN0cmVhbV9pZCA8MC0yNTU+IiwKKyAgICAgICJTZXQgdGhlIGlwLmFjY2VzcyBTdHJlYW0gSUQgb2YgdGhlIE9NTCBsaW5rIG9mIHRoaXMgQlRTXG4iKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCWludCBzdHJlYW1faWQgPSBhdG9pKGFyZ3ZbMF0pOworCisJaWYgKCFpc19pcGFjY2Vzc19idHMoYnRzKSkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIEJUUyBpcyBub3Qgb2YgaXAuYWNjZXNzIHR5cGUlcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWJ0cy0+b21sX3RlaSA9IHN0cmVhbV9pZDsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworCitERUZVTihjZmdfYnRzX29tbF9lMSwKKyAgICAgIGNmZ19idHNfb21sX2UxX2NtZCwKKyAgICAgICJvbWwgZTEgbGluZSBFMV9MSU5FIHRpbWVzbG90IDwxLTMxPiBzdWItc2xvdCAoMHwxfDJ8M3xmdWxsKSIsCisgICAgICAiRTEgaW50ZXJmYWNlIHRvIGJlIHVzZWQgZm9yIE9NTFxuIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKworCXBhcnNlX2UxX2xpbmsoJmJ0cy0+b21sX2UxX2xpbmssIGFyZ3ZbMF0sIGFyZ3ZbMV0sIGFyZ3ZbMl0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisKK0RFRlVOKGNmZ19idHNfb21sX2UxX3RlaSwKKyAgICAgIGNmZ19idHNfb21sX2UxX3RlaV9jbWQsCisgICAgICAib21sIGUxIHRlaSA8MC02Mz4iLAorICAgICAgIlNldCB0aGUgVEVJIHRvIGJlIHVzZWQgZm9yIE9NTCIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisKKwlidHMtPm9tbF90ZWkgPSBhdG9pKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX2NoYWxsb2MsIGNmZ19idHNfY2hhbGxvY19jbWQsCisgICAgICAiY2hhbm5lbCBhbGxvY2F0b3IgKGFzY2VuZGluZ3xkZXNjZW5kaW5nKSIsCisgICAgICAiU2hvdWxkIHRoZSBjaGFubmVsIGFsbG9jYXRvciBhbGxvY2F0ZSBpbiByZXZlcnNlIFRSWCBvcmRlcj8iKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCisJaWYgKCFzdHJjbXAoYXJndlswXSwgImFzY2VuZGluZyIpKQorCQlidHMtPmNoYW5fYWxsb2NfcmV2ZXJzZSA9IDA7CisJZWxzZQorCQlidHMtPmNoYW5fYWxsb2NfcmV2ZXJzZSA9IDE7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfcmFjaF90eF9pbnRlZ2VyLAorICAgICAgY2ZnX2J0c19yYWNoX3R4X2ludGVnZXJfY21kLAorICAgICAgInJhY2ggdHggaW50ZWdlciA8MC0xNT4iLAorICAgICAgIlNldCB0aGUgcmF3IHR4IGludGVnZXIgdmFsdWUgaW4gUkFDSCBDb250cm9sIHBhcmFtZXRlcnMgSUUiKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCWJ0cy0+c2lfY29tbW9uLnJhY2hfY29udHJvbC50eF9pbnRlZ2VyID0gYXRvaShhcmd2WzBdKSAmIDB4ZjsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfcmFjaF9tYXhfdHJhbnMsCisgICAgICBjZmdfYnRzX3JhY2hfbWF4X3RyYW5zX2NtZCwKKyAgICAgICJyYWNoIG1heCB0cmFuc21pc3Npb24gKDF8Mnw0fDcpIiwKKyAgICAgICJTZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIFJBQ0ggYnVyc3QgdHJhbnNtaXNzaW9ucyIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sLm1heF90cmFucyA9IHJhY2hfbWF4X3RyYW5zX3ZhbDJyYXcoYXRvaShhcmd2WzBdKSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX2NlbGxfYmFycmVkLCBjZmdfYnRzX2NlbGxfYmFycmVkX2NtZCwKKyAgICAgICJjZWxsIGJhcnJlZCAoMHwxKSIsCisgICAgICAiU2hvdWxkIHRoaXMgY2VsbCBiZSBiYXJyZWQgZnJvbSBhY2Nlc3M/IikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKworCWJ0cy0+c2lfY29tbW9uLnJhY2hfY29udHJvbC5jZWxsX2JhciA9IGF0b2koYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfbXNfbWF4X3Bvd2VyLCBjZmdfYnRzX21zX21heF9wb3dlcl9jbWQsCisgICAgICAibXMgbWF4IHBvd2VyIDwwLTQwPiIsCisgICAgICAiTWF4aW11bSB0cmFuc21pdCBwb3dlciBvZiB0aGUgTVMiKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCisJYnRzLT5tc19tYXhfcG93ZXIgPSBhdG9pKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX2NlbGxfcmVzZWxfaHlzdCwgY2ZnX2J0c19jZWxsX3Jlc2VsX2h5c3RfY21kLAorICAgICAgImNlbGwgcmVzZWxlY3Rpb24gaHlzdGVyZXNpcyA8MC0xND4iLAorICAgICAgIkNlbGwgUmUtU2VsZWN0aW9uIEh5c3RlcmVzaXMgaW4gZEIiKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCisJYnRzLT5zaV9jb21tb24uY2VsbF9zZWxfcGFyLmNlbGxfcmVzZWxfaHlzdCA9IGF0b2koYXJndlswXSkvMjsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19yeGxldl9hY2NfbWluLCBjZmdfYnRzX3J4bGV2X2FjY19taW5fY21kLAorICAgICAgInJ4bGV2IGFjY2VzcyBtaW4gPDAtNjM+IiwKKyAgICAgICJNaW5pbXVtIFJ4TGV2IG5lZWRlZCBmb3IgY2VsbCBhY2Nlc3MgKGJldHRlciB0aGFuIC0xMTBkQm0pIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKworCWJ0cy0+c2lfY29tbW9uLmNlbGxfc2VsX3Bhci5yeGxldl9hY2NfbWluID0gYXRvaShhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19wZXJfbG9jX3VwZCwgY2ZnX2J0c19wZXJfbG9jX3VwZF9jbWQsCisgICAgICAicGVyaW9kaWMgbG9jYXRpb24gdXBkYXRlIDwwLTE1MzA+IiwKKyAgICAgICJQZXJpb2RpYyBMb2NhdGlvbiBVcGRhdGluZyBJbnRlcnZhbCBpbiBNaW51dGVzIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKworCWJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYy50MzIxMiA9IGF0b2koYXJndlswXSkgLyAxMDsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19wcnNfYnZjaSwgY2ZnX2J0c19ncHJzX2J2Y2lfY21kLAorCSJncHJzIGNlbGwgYnZjaSA8MC02NTUzNT4iLAorCSJHUFJTIEJTU0dQIFZDIElkZW50aWZpZXIiKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCisJaWYgKCFidHMtPmdwcnMuZW5hYmxlZCkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIEdQUlMgbm90IGVuYWJsZWQgb24gdGhpcyBCVFMlcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWJ0cy0+Z3Bycy5jZWxsLmJ2Y2kgPSBhdG9pKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX2dwcnNfbnNlaSwgY2ZnX2J0c19ncHJzX25zZWlfY21kLAorCSJncHJzIG5zZWkgPDAtNjU1MzU+IiwKKwkiR1BSUyBOUyBFbnRpdHkgSWRlbnRpZmllciIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisKKwlpZiAoIWJ0cy0+Z3Bycy5lbmFibGVkKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgR1BSUyBub3QgZW5hYmxlZCBvbiB0aGlzIEJUUyVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJYnRzLT5ncHJzLm5zZS5uc2VpID0gYXRvaShhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworCitERUZVTihjZmdfYnRzX2dwcnNfbnN2Y2ksIGNmZ19idHNfZ3Byc19uc3ZjaV9jbWQsCisJImdwcnMgbnN2YyA8MC0xPiBuc3ZjaSA8MC02NTUzNT4iLAorCSJHUFJTIE5TIFZDIElkZW50aWZpZXIiKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCWludCBpZHggPSBhdG9pKGFyZ3ZbMF0pOworCisJaWYgKCFidHMtPmdwcnMuZW5hYmxlZCkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIEdQUlMgbm90IGVuYWJsZWQgb24gdGhpcyBCVFMlcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWJ0cy0+Z3Bycy5uc3ZjW2lkeF0ubnN2Y2kgPSBhdG9pKGFyZ3ZbMV0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX2dwcnNfbnN2Y19scG9ydCwgY2ZnX2J0c19ncHJzX25zdmNfbHBvcnRfY21kLAorCSJncHJzIG5zdmMgPDAtMT4gbG9jYWwgdWRwIHBvcnQgPDAtNjU1MzU+IiwKKwkiR1BSUyBOUyBMb2NhbCBVRFAgUG9ydCIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJaW50IGlkeCA9IGF0b2koYXJndlswXSk7CisKKwlpZiAoIWJ0cy0+Z3Bycy5lbmFibGVkKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgR1BSUyBub3QgZW5hYmxlZCBvbiB0aGlzIEJUUyVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJYnRzLT5ncHJzLm5zdmNbaWR4XS5sb2NhbF9wb3J0ID0gYXRvaShhcmd2WzFdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19ncHJzX25zdmNfcnBvcnQsIGNmZ19idHNfZ3Byc19uc3ZjX3Jwb3J0X2NtZCwKKwkiZ3BycyBuc3ZjIDwwLTE+IHJlbW90ZSB1ZHAgcG9ydCA8MC02NTUzNT4iLAorCSJHUFJTIE5TIFJlbW90ZSBVRFAgUG9ydCIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJaW50IGlkeCA9IGF0b2koYXJndlswXSk7CisKKwlpZiAoIWJ0cy0+Z3Bycy5lbmFibGVkKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgR1BSUyBub3QgZW5hYmxlZCBvbiB0aGlzIEJUUyVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJYnRzLT5ncHJzLm5zdmNbaWR4XS5yZW1vdGVfcG9ydCA9IGF0b2koYXJndlsxXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfZ3Byc19uc3ZjX3JpcCwgY2ZnX2J0c19ncHJzX25zdmNfcmlwX2NtZCwKKwkiZ3BycyBuc3ZjIDwwLTE+IHJlbW90ZSBpcCBBLkIuQy5EIiwKKwkiR1BSUyBOUyBSZW1vdGUgSVAgQWRkcmVzcyIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJaW50IGlkeCA9IGF0b2koYXJndlswXSk7CisJc3RydWN0IGluX2FkZHIgaWE7CisKKwlpZiAoIWJ0cy0+Z3Bycy5lbmFibGVkKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgR1BSUyBub3QgZW5hYmxlZCBvbiB0aGlzIEJUUyVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJaW5ldF9hdG9uKGFyZ3ZbMV0sICZpYSk7CisJYnRzLT5ncHJzLm5zdmNbaWR4XS5yZW1vdGVfaXAgPSBudG9obChpYS5zX2FkZHIpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX2dwcnNfcmFjLCBjZmdfYnRzX2dwcnNfcmFjX2NtZCwKKwkiZ3BycyByb3V0aW5nIGFyZWEgPDAtMjU1PiIsCisJIkdQUlMgUm91dGluZyBBcmVhIENvZGUiKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCisJaWYgKCFidHMtPmdwcnMuZW5hYmxlZCkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIEdQUlMgbm90IGVuYWJsZWQgb24gdGhpcyBCVFMlcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWJ0cy0+Z3Bycy5yYWMgPSBhdG9pKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX2dwcnNfZW5hYmxlZCwgY2ZnX2J0c19ncHJzX2VuYWJsZWRfY21kLAorCSJncHJzIGVuYWJsZWQgPDAtMT4iLAorCSJHUFJTIEVuYWJsZWQgb24gdGhpcyBCVFMiKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCisJYnRzLT5ncHJzLmVuYWJsZWQgPSBhdG9pKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisKKy8qIHBlciBUUlggY29uZmlndXJhdGlvbiAqLworREVGVU4oY2ZnX3RyeCwKKyAgICAgIGNmZ190cnhfY21kLAorICAgICAgInRyeCBUUlhfTlIiLAorICAgICAgIlNlbGVjdCBhIFRSWCB0byBjb25maWd1cmUiKQoreworCWludCB0cnhfbnIgPSBhdG9pKGFyZ3ZbMF0pOworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCisJaWYgKHRyeF9uciA+IGJ0cy0+bnVtX3RyeCkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIFRoZSBuZXh0IHVudXNlZCBUUlggbnVtYmVyIGluIHRoaXMgQlRTIGlzICV1JXMiLAorCQkJYnRzLT5udW1fdHJ4LCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9IGVsc2UgaWYgKHRyeF9uciA9PSBidHMtPm51bV90cngpIHsKKwkJLyogd2UgbmVlZCB0byBhbGxvY2F0ZSBhIG5ldyBvbmUgKi8KKwkJdHJ4ID0gZ3NtX2J0c190cnhfYWxsb2MoYnRzKTsKKwl9IGVsc2UgCisJCXRyeCA9IGdzbV9idHNfdHJ4X251bShidHMsIHRyeF9ucik7CisJCisJaWYgKCF0cngpCisJCXJldHVybiBDTURfV0FSTklORzsKKworCXZ0eS0+aW5kZXggPSB0cng7CisJdnR5LT5ub2RlID0gVFJYX05PREU7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ190cnhfYXJmY24sCisgICAgICBjZmdfdHJ4X2FyZmNuX2NtZCwKKyAgICAgICJhcmZjbiA8MS0xMDI0PiIsCisgICAgICAiU2V0IHRoZSBBUkZDTiBmb3IgdGhpcyBUUlhcbiIpCit7CisJaW50IGFyZmNuID0gYXRvaShhcmd2WzBdKTsKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCA9IHZ0eS0+aW5kZXg7CisKKwkvKiBGSVhNRTogY2hlY2sgaWYgdGhpcyBBUkZDTiBpcyBzdXBwb3J0ZWQgYnkgdGhpcyBUUlggKi8KKworCXRyeC0+YXJmY24gPSBhcmZjbjsKKworCS8qIEZJWE1FOiBwYXRjaCBBUkZDTiBpbnRvIFNZU1RFTSBJTkZPUk1BVElPTiAqLworCS8qIEZJWE1FOiB1c2UgT01MIGxheWVyIHRvIHVwZGF0ZSB0aGUgQVJGQ04gKi8KKwkvKiBGSVhNRTogdXNlIFJTTCBsYXllciB0byB1cGRhdGUgU1lTVEVNIElORk9STUFUSU9OICovCisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ190cnhfbm9taW5hbF9wb3dlciwKKyAgICAgIGNmZ190cnhfbm9taW5hbF9wb3dlcl9jbWQsCisgICAgICAibm9taW5hbCBwb3dlciA8MC0xMDA+IiwKKyAgICAgICJOb21pbmFsIFRSWCBSRiBQb3dlciBpbiBkQlxuIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCA9IHZ0eS0+aW5kZXg7CisKKwl0cngtPm5vbWluYWxfcG93ZXIgPSBhdG9pKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfdHJ4X21heF9wb3dlcl9yZWQsCisgICAgICBjZmdfdHJ4X21heF9wb3dlcl9yZWRfY21kLAorICAgICAgIm1heF9wb3dlcl9yZWQgPDAtMTAwPiIsCisgICAgICAiUmVkdWN0aW9uIG9mIG1heGltdW0gQlMgUkYgUG93ZXIgaW4gZEJcbiIpCit7CisJaW50IG1heHB3cl9yID0gYXRvaShhcmd2WzBdKTsKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCA9IHZ0eS0+aW5kZXg7CisJaW50IHVwcGVyX2xpbWl0ID0gMjQ7CS8qIGRlZmF1bHQgMTIuMjEgbWF4IHBvd2VyIHJlZC4gKi8KKworCS8qIEZJWE1FOiBjaGVjayBpZiBvdXIgQlRTIHR5cGUgc3VwcG9ydHMgbW9yZSB0aGFuIDEyICovCisJaWYgKG1heHB3cl9yIDwgMCB8fCBtYXhwd3JfciA+IHVwcGVyX2xpbWl0KSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgUG93ZXIgJWQgZEIgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSVzIiwKKwkJCW1heHB3cl9yLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisJaWYgKG1heHB3cl9yICYgMSkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIFBvd2VyICVkIGRCIGlzIG5vdCBhbiBldmVuIHZhbHVlJXMiLAorCQkJbWF4cHdyX3IsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCXRyeC0+bWF4X3Bvd2VyX3JlZCA9IG1heHB3cl9yOworCisJLyogRklYTUU6IG1ha2Ugc3VyZSB3ZSB1cGRhdGUgdGhpcyB1c2luZyBPTUwgKi8KKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX3RyeF9yc2xfZTEsCisgICAgICBjZmdfdHJ4X3JzbF9lMV9jbWQsCisgICAgICAicnNsIGUxIGxpbmUgRTFfTElORSB0aW1lc2xvdCA8MS0zMT4gc3ViLXNsb3QgKDB8MXwyfDN8ZnVsbCkiLAorICAgICAgIkUxIGludGVyZmFjZSB0byBiZSB1c2VkIGZvciBSU0xcbiIpCit7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cnggPSB2dHktPmluZGV4OworCisJcGFyc2VfZTFfbGluaygmdHJ4LT5yc2xfZTFfbGluaywgYXJndlswXSwgYXJndlsxXSwgYXJndlsyXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ190cnhfcnNsX2UxX3RlaSwKKyAgICAgIGNmZ190cnhfcnNsX2UxX3RlaV9jbWQsCisgICAgICAicnNsIGUxIHRlaSA8MC02Mz4iLAorICAgICAgIlNldCB0aGUgVEVJIHRvIGJlIHVzZWQgZm9yIFJTTCIpCit7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cnggPSB2dHktPmluZGV4OworCisJdHJ4LT5yc2xfdGVpID0gYXRvaShhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX3RyeF9yZl9sb2NrZWQsCisgICAgICBjZmdfdHJ4X3JmX2xvY2tlZF9jbWQsCisgICAgICAicmZfbG9ja2VkICgwfDEpIiwKKyAgICAgICJUdXJuIG9mZiBSRiBvZiB0aGUgVFJYLlxuIikKK3sKKwlpbnQgbG9ja2VkID0gYXRvaShhcmd2WzBdKTsKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCA9IHZ0eS0+aW5kZXg7CisKKwlnc21fdHJ4X2xvY2tfcmYodHJ4LCBsb2NrZWQpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogcGVyIFRTIGNvbmZpZ3VyYXRpb24gKi8KK0RFRlVOKGNmZ190cywKKyAgICAgIGNmZ190c19jbWQsCisgICAgICAidGltZXNsb3QgPDAtNz4iLAorICAgICAgIlNlbGVjdCBhIFRpbWVzbG90IHRvIGNvbmZpZ3VyZSIpCit7CisJaW50IHRzX25yID0gYXRvaShhcmd2WzBdKTsKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCA9IHZ0eS0+aW5kZXg7CisJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0czsKKworCWlmICh0c19uciA+PSBUUlhfTlJfVFMpIHsKKwkJdnR5X291dCh2dHksICIlJSBBIEdTTSBUUlggb25seSBoYXMgJXUgVGltZXNsb3RzIHBlciBUUlglcyIsCisJCQlUUlhfTlJfVFMsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCXRzID0gJnRyeC0+dHNbdHNfbnJdOworCisJdnR5LT5pbmRleCA9IHRzOworCXZ0eS0+bm9kZSA9IFRTX05PREU7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ190c19wY2hhbiwKKyAgICAgIGNmZ190c19wY2hhbl9jbWQsCisgICAgICAicGh5c19jaGFuX2NvbmZpZyBQQ0hBTiIsCisgICAgICAiUGh5c2ljYWwgQ2hhbm5lbCBjb25maWd1cmF0aW9uIChUQ0gvU0RDQ0gvLi4uKSIpCit7CisJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyA9IHZ0eS0+aW5kZXg7CisJaW50IHBjaGFuYzsKKworCXBjaGFuYyA9IGdzbV9wY2hhbl9wYXJzZShhcmd2WzBdKTsKKwlpZiAocGNoYW5jIDwgMCkKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCisJdHMtPnBjaGFuID0gcGNoYW5jOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfdHNfZTFfc3Vic2xvdCwKKyAgICAgIGNmZ190c19lMV9zdWJzbG90X2NtZCwKKyAgICAgICJlMSBsaW5lIEUxX0xJTkUgdGltZXNsb3QgPDEtMzE+IHN1Yi1zbG90ICgwfDF8MnwzfGZ1bGwpIiwKKyAgICAgICJFMSBzdWItc2xvdCBjb25uZWN0ZWQgdG8gdGhpcyBvbi1haXIgdGltZXNsb3QiKQoreworCXN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMgPSB2dHktPmluZGV4OworCisJcGFyc2VfZTFfbGluaygmdHMtPmUxX2xpbmssIGFyZ3ZbMF0sIGFyZ3ZbMV0sIGFyZ3ZbMl0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitpbnQgYnNjX3Z0eV9pbml0KHN0cnVjdCBnc21fbmV0d29yayAqbmV0KQoreworCWdzbW5ldCA9IG5ldDsKKworCWNtZF9pbml0KDEpOworCXZ0eV9pbml0KCk7CisKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmc2hvd19uZXRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmc2hvd19idHNfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmc2hvd190cnhfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmc2hvd190c19jbWQpOworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzaG93X2xjaGFuX2NtZCk7CisKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmc2hvd19lMWRydl9jbWQpOworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzaG93X2UxbGluZV9jbWQpOworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzaG93X2UxdHNfY21kKTsKKworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzaG93X3BhZ2luZ19jbWQpOworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzaG93X3N0YXRzX2NtZCk7CisKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmZW5hYmxlX2xvZ2dpbmdfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmZGlzYWJsZV9sb2dnaW5nX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJmxvZ2dpbmdfZmx0cl9pbXNpX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJmxvZ2dpbmdfZmx0cl9hbGxfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmbG9nZ2luZ191c2VfY2xyX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJmxvZ2dpbmdfcHJudF90aW1lc3RhbXBfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmbG9nZ2luZ19zZXRfY2F0ZWdvcnlfbWFza19jbWQpOworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZsb2dnaW5nX2xldmVsX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJmxvZ2dpbmdfc2V0X2xvZ19sZXZlbF9jbWQpOworCisJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmY2ZnX25ldF9jbWQpOworCWluc3RhbGxfbm9kZSgmbmV0X25vZGUsIGNvbmZpZ193cml0ZV9uZXQpOworCWluc3RhbGxfZGVmYXVsdChHU01ORVRfTk9ERSk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9uY2NfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X21uY19jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfbmFtZV9zaG9ydF9jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfbmFtZV9sb25nX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9hdXRoX3BvbGljeV9jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfcmVqZWN0X2NhdXNlX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9lbmNyeXB0aW9uX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9uZWNpX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9ycmxwX21vZGVfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X21tX2luZm9fY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X2hhbmRvdmVyX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9ob193aW5fcnhsZXZfYXZnX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9ob193aW5fcnhxdWFsX2F2Z19jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfaG9fd2luX3J4bGV2X2F2Z19uZWlnaF9jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfaG9fcHdyX2ludGVydmFsX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9ob19wd3JfaHlzdGVyZXNpc19jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfaG9fbWF4X2Rpc3RhbmNlX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9UMzEwMV9jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfVDMxMDNfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X1QzMTA1X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9UMzEwN19jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfVDMxMDlfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X1QzMTExX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9UMzExM19jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfVDMxMTVfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X1QzMTE3X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9UMzExOV9jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfVDMxNDFfY21kKTsKKworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19idHNfY21kKTsKKwlpbnN0YWxsX25vZGUoJmJ0c19ub2RlLCBjb25maWdfd3JpdGVfYnRzKTsKKwlpbnN0YWxsX2RlZmF1bHQoQlRTX05PREUpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfdHlwZV9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfYmFuZF9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfY2lfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2xhY19jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfdHNjX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19ic2ljX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c191bml0X2lkX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19zdHJlYW1faWRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX29tbF9lMV9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfb21sX2UxX3RlaV9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfY2hhbGxvY19jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfcmFjaF90eF9pbnRlZ2VyX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19yYWNoX21heF90cmFuc19jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfY2VsbF9iYXJyZWRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX21zX21heF9wb3dlcl9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfcGVyX2xvY191cGRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2NlbGxfcmVzZWxfaHlzdF9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfcnhsZXZfYWNjX21pbl9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfZ3Byc19lbmFibGVkX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19ncHJzX3JhY19jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfZ3Byc19idmNpX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19ncHJzX25zZWlfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2dwcnNfbnN2Y2lfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2dwcnNfbnN2Y19scG9ydF9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfZ3Byc19uc3ZjX3Jwb3J0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19ncHJzX25zdmNfcmlwX2NtZCk7CisKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfdHJ4X2NtZCk7CisJaW5zdGFsbF9ub2RlKCZ0cnhfbm9kZSwgZHVtbXlfY29uZmlnX3dyaXRlKTsKKwlpbnN0YWxsX2RlZmF1bHQoVFJYX05PREUpOworCWluc3RhbGxfZWxlbWVudChUUlhfTk9ERSwgJmNmZ190cnhfYXJmY25fY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVFJYX05PREUsICZjZmdfdHJ4X25vbWluYWxfcG93ZXJfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVFJYX05PREUsICZjZmdfdHJ4X21heF9wb3dlcl9yZWRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVFJYX05PREUsICZjZmdfdHJ4X3JzbF9lMV9jbWQpOworCWluc3RhbGxfZWxlbWVudChUUlhfTk9ERSwgJmNmZ190cnhfcnNsX2UxX3RlaV9jbWQpOworCWluc3RhbGxfZWxlbWVudChUUlhfTk9ERSwgJmNmZ190cnhfcmZfbG9ja2VkX2NtZCk7CisKKwlpbnN0YWxsX2VsZW1lbnQoVFJYX05PREUsICZjZmdfdHNfY21kKTsKKwlpbnN0YWxsX25vZGUoJnRzX25vZGUsIGR1bW15X2NvbmZpZ193cml0ZSk7CisJaW5zdGFsbF9kZWZhdWx0KFRTX05PREUpOworCWluc3RhbGxfZWxlbWVudChUU19OT0RFLCAmY2ZnX3RzX3BjaGFuX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFRTX05PREUsICZjZmdfdHNfZTFfc3Vic2xvdF9jbWQpOworCisJYnNjX3Z0eV9pbml0X2V4dHJhKG5ldCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3Z0eV9pbnRlcmZhY2VfbGF5ZXIzLmMgYi9vcGVuYnNjL3NyYy92dHlfaW50ZXJmYWNlX2xheWVyMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MjRjM2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy92dHlfaW50ZXJmYWNlX2xheWVyMy5jCkBAIC0wLDAgKzEsNTMxIEBACisvKiBPcGVuQlNDIGludGVyZmFjZSB0byBxdWFnZ2EgVlRZICovCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDx2dHkvY29tbWFuZC5oPgorI2luY2x1ZGUgPHZ0eS9idWZmZXIuaD4KKyNpbmNsdWRlIDx2dHkvdnR5Lmg+CisKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL2xpbnV4bGlzdC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9zdWJzY3JpYmVyLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWxlbnRfY2FsbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzExLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9lMV9pbnB1dC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19ubS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2dzbV91dGlscy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGIuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKworc3RhdGljIHN0cnVjdCBnc21fbmV0d29yayAqZ3NtbmV0OworCitzdHJ1Y3QgY21kX25vZGUgc3Vic2NyX25vZGUgPSB7CisJU1VCU0NSX05PREUsCisJIiVzKHN1YnNjcmliZXIpIyIsCisJMSwKK307CisKK3N0YXRpYyBpbnQgZHVtbXlfY29uZmlnX3dyaXRlKHN0cnVjdCB2dHkgKnYpCit7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdGF0aWMgc3RydWN0IGJ1ZmZlciAqYXJndl90b19idWZmZXIoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSwgaW50IGJhc2UpCit7CisJc3RydWN0IGJ1ZmZlciAqYiA9IGJ1ZmZlcl9uZXcoMTAyNCk7CisJaW50IGk7CisKKwlpZiAoIWIpCisJCXJldHVybiBOVUxMOworCisJZm9yIChpID0gYmFzZTsgaSA8IGFyZ2M7IGkrKykgeworCQlidWZmZXJfcHV0c3RyKGIsIGFyZ3ZbaV0pOworCQlidWZmZXJfcHV0YyhiLCAnICcpOworCX0KKwlidWZmZXJfcHV0YyhiLCAnXDAnKTsKKworCXJldHVybiBiOworfQorCitzdGF0aWMgaW50IGhleHBhcnNlKGNvbnN0IGNoYXIgKnN0ciwgdV9pbnQ4X3QgKmIsIGludCBtYXhfbGVuKQorCit7CisJaW50IGksIGwsIHY7CisKKwlsID0gc3RybGVuKHN0cik7CisJaWYgKChsJjEpIHx8ICgobD4+MSkgPiBtYXhfbGVuKSkKKwkJcmV0dXJuIC0xOworCisJbWVtc2V0KGIsIDB4MDAsIG1heF9sZW4pOworCisJZm9yIChpPTA7IGk8bDsgaSsrKSB7CisJCWNoYXIgYyA9IHN0cltpXTsKKwkJaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQorCQkJdiA9IGMgLSAnMCc7CisJCWVsc2UgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKQorCQkJdiA9IDEwICsgKGMgLSAnYScpOworCQllbHNlIGlmIChjID49ICdBJyAmJiBjIDw9ICdGJykKKwkJCXYgPSAxMCArIChjIC0gJ2EnKTsKKwkJZWxzZQorCQkJcmV0dXJuIC0xOworCQliW2k+PjFdIHw9IHYgPDwgKGkmMSA/IDAgOiA0KTsKKwl9CisKKwlyZXR1cm4gaT4+MTsKK30KKworLyogcGVyLXN1YnNjcmliZXIgY29uZmlndXJhdGlvbiAqLworREVGVU4oY2ZnX3N1YnNjciwKKyAgICAgIGNmZ19zdWJzY3JfY21kLAorICAgICAgInN1YnNjcmliZXIgSU1TSSIsCisgICAgICAiU2VsZWN0IGEgU3Vic2NyaWJlciB0byBjb25maWd1cmVcbiIpCit7CisJY29uc3QgY2hhciAqaW1zaSA9IGFyZ3ZbMF07CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisKKwlzdWJzY3IgPSBzdWJzY3JfZ2V0X2J5X2ltc2koZ3NtbmV0LCBpbXNpKTsKKwlpZiAoIXN1YnNjcikgeworCQl2dHlfb3V0KHZ0eSwgIiUlIE5vIHN1YnNjcmliZXIgZm9yIElNU0kgJXMlcyIsCisJCQlpbXNpLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwkvKiB2dHlfZ29fcGFyZW50IHNob3VsZCBwdXQgdGhpcyBzdWJzY3JpYmVyICovCisJdnR5LT5pbmRleCA9IHN1YnNjcjsKKwl2dHktPm5vZGUgPSBTVUJTQ1JfTk9ERTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgc3Vic2NyX2R1bXBfZnVsbF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikKK3sKKwlpbnQgcmM7CisJc3RydWN0IGdzbV9hdXRoX2luZm8gYWluZm87CisJc3RydWN0IGdzbV9hdXRoX3R1cGxlIGF0dXBsZTsKKworCXZ0eV9vdXQodnR5LCAiICAgIElEOiAlbGx1LCBBdXRob3JpemVkOiAlZCVzIiwgc3Vic2NyLT5pZCwKKwkJc3Vic2NyLT5hdXRob3JpemVkLCBWVFlfTkVXTElORSk7CisJaWYgKHN1YnNjci0+bmFtZSkKKwkJdnR5X291dCh2dHksICIgICAgTmFtZTogJyVzJyVzIiwgc3Vic2NyLT5uYW1lLCBWVFlfTkVXTElORSk7CisJaWYgKHN1YnNjci0+ZXh0ZW5zaW9uKQorCQl2dHlfb3V0KHZ0eSwgIiAgICBFeHRlbnNpb246ICVzJXMiLCBzdWJzY3ItPmV4dGVuc2lvbiwKKwkJCVZUWV9ORVdMSU5FKTsKKwlpZiAoc3Vic2NyLT5pbXNpKQorCQl2dHlfb3V0KHZ0eSwgIiAgICBJTVNJOiAlcyVzIiwgc3Vic2NyLT5pbXNpLCBWVFlfTkVXTElORSk7CisJaWYgKHN1YnNjci0+dG1zaSAhPSBHU01fUkVTRVJWRURfVE1TSSkKKwkJdnR5X291dCh2dHksICIgICAgVE1TSTogJTA4WCVzIiwgc3Vic2NyLT50bXNpLAorCQkJVlRZX05FV0xJTkUpOworCisJcmMgPSBnZXRfYXV0aGluZm9fYnlfc3Vic2NyKCZhaW5mbywgc3Vic2NyKTsKKwlpZiAoIXJjKSB7CisJCXZ0eV9vdXQodnR5LCAiICAgIEEzQTggYWxnb3JpdGhtIGlkOiAlZCVzIiwKKwkJCWFpbmZvLmF1dGhfYWxnbywgVlRZX05FV0xJTkUpOworCQl2dHlfb3V0KHZ0eSwgIiAgICBBM0E4IEtpOiAlcyVzIiwKKwkJCWhleGR1bXAoYWluZm8uYTNhOF9raSwgYWluZm8uYTNhOF9raV9sZW4pLAorCQkJVlRZX05FV0xJTkUpOworCX0KKworCXJjID0gZ2V0X2F1dGh0dXBsZV9ieV9zdWJzY3IoJmF0dXBsZSwgc3Vic2NyKTsKKwlpZiAoIXJjKSB7CisJCXZ0eV9vdXQodnR5LCAiICAgIEEzQTggbGFzdCB0dXBsZSAodXNlZCAlZCB0aW1lcyk6JXMiLAorCQkJYXR1cGxlLnVzZV9jb3VudCwgVlRZX05FV0xJTkUpOworCQl2dHlfb3V0KHZ0eSwgIiAgICAgc2VxICMgOiAlZCVzIiwKKwkJCWF0dXBsZS5rZXlfc2VxLCBWVFlfTkVXTElORSk7CisJCXZ0eV9vdXQodnR5LCAiICAgICBSQU5EICA6ICVzJXMiLAorCQkJaGV4ZHVtcChhdHVwbGUucmFuZCwgc2l6ZW9mKGF0dXBsZS5yYW5kKSksCisJCQlWVFlfTkVXTElORSk7CisJCXZ0eV9vdXQodnR5LCAiICAgICBTUkVTICA6ICVzJXMiLAorCQkJaGV4ZHVtcChhdHVwbGUuc3Jlcywgc2l6ZW9mKGF0dXBsZS5zcmVzKSksCisJCQlWVFlfTkVXTElORSk7CisJCXZ0eV9vdXQodnR5LCAiICAgICBLYyAgICA6ICVzJXMiLAorCQkJaGV4ZHVtcChhdHVwbGUua2MsIHNpemVvZihhdHVwbGUua2MpKSwKKwkJCVZUWV9ORVdMSU5FKTsKKwl9CisKKwl2dHlfb3V0KHZ0eSwgIiAgICBVc2UgY291bnQ6ICV1JXMiLCBzdWJzY3ItPnVzZV9jb3VudCwgVlRZX05FV0xJTkUpOworfQorCisKKy8qIFN1YnNjcmliZXIgKi8KK0RFRlVOKHNob3dfc3Vic2NyLAorICAgICAgc2hvd19zdWJzY3JfY21kLAorICAgICAgInNob3cgc3Vic2NyaWJlciBbSU1TSV0iLAorCVNIT1dfU1RSICJEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IGEgc3Vic2NyaWJlclxuIikKK3sKKwljb25zdCBjaGFyICppbXNpOworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyOworCisJaWYgKGFyZ2MgPj0gMSkgeworCQlpbXNpID0gYXJndlswXTsKKwkJc3Vic2NyID0gc3Vic2NyX2dldF9ieV9pbXNpKGdzbW5ldCwgaW1zaSk7CisJCWlmICghc3Vic2NyKSB7CisJCQl2dHlfb3V0KHZ0eSwgIiUlIHVua25vd24gc3Vic2NyaWJlciVzIiwKKwkJCQlWVFlfTkVXTElORSk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwkJc3Vic2NyX2R1bXBfZnVsbF92dHkodnR5LCBzdWJzY3IpOworCQlzdWJzY3JfcHV0KHN1YnNjcik7CisKKwkJcmV0dXJuIENNRF9TVUNDRVNTOworCX0KKworCS8qIEZJWE1FOiBpdGVyYXRlIG92ZXIgYWxsIHN1YnNjcmliZXJzID8gKi8KKwlyZXR1cm4gQ01EX1dBUk5JTkc7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKHNob3dfc3Vic2NyX2NhY2hlLAorICAgICAgc2hvd19zdWJzY3JfY2FjaGVfY21kLAorICAgICAgInNob3cgc3Vic2NyaWJlciBjYWNoZSIsCisJU0hPV19TVFIgIkRpc3BsYXkgY29udGVudHMgb2Ygc3Vic2NyaWJlciBjYWNoZVxuIikKK3sKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHN1YnNjciwgJmFjdGl2ZV9zdWJzY3JpYmVycywgZW50cnkpIHsKKwkJdnR5X291dCh2dHksICIgIFN1YnNjcmliZXI6JXMiLCBWVFlfTkVXTElORSk7CisJCXN1YnNjcl9kdW1wX2Z1bGxfdnR5KHZ0eSwgc3Vic2NyKTsKKwl9CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKHNtc19zZW5kX3BlbmQsCisgICAgICBzbXNfc2VuZF9wZW5kX2NtZCwKKyAgICAgICJzbXMgc2VuZCBwZW5kaW5nIiwKKyAgICAgICJTZW5kIGFsbCBwZW5kaW5nIFNNUyIpCit7CisJc3RydWN0IGdzbV9zbXMgKnNtczsKKwlpbnQgaWQgPSAwOworCisJd2hpbGUgKDEpIHsKKwkJc21zID0gZGJfc21zX2dldF91bnNlbnRfYnlfc3Vic2NyKGdzbW5ldCwgaWQpOworCQlpZiAoIXNtcykKKwkJCWJyZWFrOworCisJCWdzbTQxMV9zZW5kX3Ntc19zdWJzY3Ioc21zLT5yZWNlaXZlciwgc21zKTsKKworCQlpZCA9IHNtcy0+cmVjZWl2ZXItPmlkICsgMTsKKwl9CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK3N0cnVjdCBnc21fc21zICpzbXNfZnJvbV90ZXh0KHN0cnVjdCBnc21fc3Vic2NyaWJlciAqcmVjZWl2ZXIsIGNvbnN0IGNoYXIgKnRleHQpCit7CisJc3RydWN0IGdzbV9zbXMgKnNtcyA9IHNtc19hbGxvYygpOworCisJaWYgKCFzbXMpCisJCXJldHVybiBOVUxMOworCisJaWYgKCFyZWNlaXZlci0+bGFjKSB7CisJCS8qIHN1YnNjcmliZXIgY3VycmVudGx5IG5vdCBhdHRhY2hlZCwgc3RvcmUgaW4gZGF0YWJhc2U/ICovCisJCXJldHVybiBOVUxMOworCX0KKworCXNtcy0+cmVjZWl2ZXIgPSBzdWJzY3JfZ2V0KHJlY2VpdmVyKTsKKwlzdHJuY3B5KHNtcy0+dGV4dCwgdGV4dCwgc2l6ZW9mKHNtcy0+dGV4dCktMSk7CisKKwkvKiBGSVhNRTogZG9uJ3QgdXNlIElEIDEgc3RhdGljICovCisJc21zLT5zZW5kZXIgPSBzdWJzY3JfZ2V0X2J5X2lkKGdzbW5ldCwgMSk7CisJc21zLT5yZXBseV9wYXRoX3JlcSA9IDA7CisJc21zLT5zdGF0dXNfcmVwX3JlcSA9IDA7CisJc21zLT51ZF9oZHJfaW5kID0gMDsKKwlzbXMtPnByb3RvY29sX2lkID0gMDsgLyogaW1wbGljaXQgKi8KKwlzbXMtPmRhdGFfY29kaW5nX3NjaGVtZSA9IDA7IC8qIGRlZmF1bHQgN2JpdCAqLworCXN0cm5jcHkoc21zLT5kZXN0X2FkZHIsIHJlY2VpdmVyLT5leHRlbnNpb24sIHNpemVvZihzbXMtPmRlc3RfYWRkciktMSk7CisJLyogR2VuZXJhdGUgdXNlcl9kYXRhICovCisJc21zLT51c2VyX2RhdGFfbGVuID0gZ3NtXzdiaXRfZW5jb2RlKHNtcy0+dXNlcl9kYXRhLCBzbXMtPnRleHQpOworCisJcmV0dXJuIHNtczsKK30KKworc3RhdGljIGludCBfc2VuZF9zbXNfYnVmZmVyKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqcmVjZWl2ZXIsCisJCQkgICAgIHN0cnVjdCBidWZmZXIgKmIsIHVfaW50OF90IHRwX3BpZCkKK3sKKwlzdHJ1Y3QgZ3NtX3NtcyAqc21zOworCisJc21zID0gc21zX2Zyb21fdGV4dChyZWNlaXZlciwgYnVmZmVyX2dldHN0cihiKSk7CisJc21zLT5wcm90b2NvbF9pZCA9IHRwX3BpZDsKKwlnc200MTFfc2VuZF9zbXNfc3Vic2NyKHJlY2VpdmVyLCBzbXMpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdGF0aWMgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpnZXRfc3Vic2NyX2J5X2FyZ3YoY29uc3QgY2hhciAqdHlwZSwKKwkJCQkJCSBjb25zdCBjaGFyICppZCkKK3sKKwlpZiAoIXN0cmNtcCh0eXBlLCAiZXh0ZW5zaW9uIikpCisJCXJldHVybiBzdWJzY3JfZ2V0X2J5X2V4dGVuc2lvbihnc21uZXQsIGlkKTsKKwllbHNlIGlmICghc3RyY21wKHR5cGUsICJpbXNpIikpCisJCXJldHVybiBzdWJzY3JfZ2V0X2J5X2ltc2koZ3NtbmV0LCBpZCk7CisJZWxzZSBpZiAoIXN0cmNtcCh0eXBlLCAidG1zaSIpKQorCQlyZXR1cm4gc3Vic2NyX2dldF9ieV90bXNpKGdzbW5ldCwgYXRvaShpZCkpOworCWVsc2UgaWYgKCFzdHJjbXAodHlwZSwgImlkIikpCisJCXJldHVybiBzdWJzY3JfZ2V0X2J5X2lkKGdzbW5ldCwgYXRvaShpZCkpOworCisJcmV0dXJuIE5VTEw7Cit9CisjZGVmaW5lIFNVQlNDUl9UWVBFUyAiKGV4dGVuc2lvbnxpbXNpfHRtc2l8aWQpIgorCitERUZVTihzdWJzY3JpYmVyX3NlbmRfc21zLAorICAgICAgc3Vic2NyaWJlcl9zZW5kX3Ntc19jbWQsCisgICAgICAic3Vic2NyaWJlciAiIFNVQlNDUl9UWVBFUyAiIEVYVEVOIHNtcyBzZW5kIC5MSU5FIiwKKyAgICAgICJTZWxlY3Qgc3Vic2NyaWJlciBiYXNlZCBvbiBleHRlbnNpb24iKQoreworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gZ2V0X3N1YnNjcl9ieV9hcmd2KGFyZ3ZbMF0sIGFyZ3ZbMV0pOworCXN0cnVjdCBidWZmZXIgKmI7CisJaW50IHJjOworCisJaWYgKCFzdWJzY3IpIHsKKwkJdnR5X291dCh2dHksICIlJSBObyBzdWJzY3JpYmVyIGZvdW5kIGZvciAlcyAlcyVzIiwKKwkJCWFyZ3ZbMF0sIGFyZ3ZbMV0sIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKwliID0gYXJndl90b19idWZmZXIoYXJnYywgYXJndiwgMik7CisJcmMgPSBfc2VuZF9zbXNfYnVmZmVyKHN1YnNjciwgYiwgMCk7CisJYnVmZmVyX2ZyZWUoYik7CisKKwlzdWJzY3JfcHV0KHN1YnNjcik7CisKKwlyZXR1cm4gcmM7Cit9CisKK0RFRlVOKHN1YnNjcmliZXJfc2lsZW50X3NtcywKKyAgICAgIHN1YnNjcmliZXJfc2lsZW50X3Ntc19jbWQsCisgICAgICAic3Vic2NyaWJlciAiIFNVQlNDUl9UWVBFUyAiIEVYVEVOIHNpbGVudCBzbXMgc2VuZCAuTElORSIsCisgICAgICAiU2VsZWN0IHN1YnNjcmliZXIgYmFzZWQgb24gZXh0ZW5zaW9uIikKK3sKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IGdldF9zdWJzY3JfYnlfYXJndihhcmd2WzBdLCBhcmd2WzFdKTsKKwlzdHJ1Y3QgYnVmZmVyICpiOworCWludCByYzsKKworCWlmICghc3Vic2NyKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgTm8gc3Vic2NyaWJlciBmb3VuZCBmb3IgJXMgJXMlcyIsCisJCQlhcmd2WzBdLCBhcmd2WzFdLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwliID0gYXJndl90b19idWZmZXIoYXJnYywgYXJndiwgMik7CisJcmMgPSBfc2VuZF9zbXNfYnVmZmVyKHN1YnNjciwgYiwgNjQpOworCWJ1ZmZlcl9mcmVlKGIpOworCisJc3Vic2NyX3B1dChzdWJzY3IpOworCisJcmV0dXJuIHJjOworfQorCitERUZVTihzdWJzY3JpYmVyX3NpbGVudF9jYWxsX3N0YXJ0LAorICAgICAgc3Vic2NyaWJlcl9zaWxlbnRfY2FsbF9zdGFydF9jbWQsCisgICAgICAic3Vic2NyaWJlciAiIFNVQlNDUl9UWVBFUyAiIEVYVEVOIHNpbGVudCBjYWxsIHN0YXJ0IChhbnl8dGNoL2Z8dGNoL2FueXxzZGNjaCkiLAorICAgICAgIlN0YXJ0IGEgc2lsZW50IGNhbGwgdG8gYSBzdWJzY3JpYmVyIikKK3sKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IGdldF9zdWJzY3JfYnlfYXJndihhcmd2WzBdLCBhcmd2WzFdKTsKKwlpbnQgcmMsIHR5cGU7CisKKwlpZiAoIXN1YnNjcikgeworCQl2dHlfb3V0KHZ0eSwgIiUlIE5vIHN1YnNjcmliZXIgZm91bmQgZm9yICVzICVzJXMiLAorCQkJYXJndlswXSwgYXJndlsxXSwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJaWYgKCFzdHJjbXAoYXJndlsyXSwgInRjaC9mIikpCisJCXR5cGUgPSBSU0xfQ0hBTk5FRURfVENIX0Y7CisJZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAidGNoL2FueSIpKQorCQl0eXBlID0gUlNMX0NIQU5ORUVEX1RDSF9Gb3JIOworCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgInNkY2NoIikpCisJCXR5cGUgPSBSU0xfQ0hBTk5FRURfU0RDQ0g7CisJZWxzZQorCQl0eXBlID0gUlNMX0NIQU5ORUVEX0FOWTsJLyogRGVmYXVsdHMgdG8gQU5ZICovCisKKwlyYyA9IGdzbV9zaWxlbnRfY2FsbF9zdGFydChzdWJzY3IsIHZ0eSwgdHlwZSk7CisJaWYgKHJjIDw9IDApIHsKKwkJdnR5X291dCh2dHksICIlJSBTdWJzY3JpYmVyIG5vdCBhdHRhY2hlZCVzIiwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJc3Vic2NyX3B1dChzdWJzY3IpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJc3Vic2NyX3B1dChzdWJzY3IpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihzdWJzY3JpYmVyX3NpbGVudF9jYWxsX3N0b3AsCisgICAgICBzdWJzY3JpYmVyX3NpbGVudF9jYWxsX3N0b3BfY21kLAorICAgICAgInN1YnNjcmliZXIgIiBTVUJTQ1JfVFlQRVMgIiBFWFRFTiBzaWxlbnQgY2FsbCBzdG9wIiwKKyAgICAgICJTdG9wIGEgc2lsZW50IGNhbGwgdG8gYSBzdWJzY3JpYmVyIikKK3sKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IGdldF9zdWJzY3JfYnlfYXJndihhcmd2WzBdLCBhcmd2WzFdKTsKKwlpbnQgcmM7CisKKwlpZiAoIXN1YnNjcikgeworCQl2dHlfb3V0KHZ0eSwgIiUlIE5vIHN1YnNjcmliZXIgZm91bmQgZm9yICVzICVzJXMiLAorCQkJYXJndlswXSwgYXJndlsxXSwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJcmMgPSBnc21fc2lsZW50X2NhbGxfc3RvcChzdWJzY3IpOworCWlmIChyYyA8IDApIHsKKwkJc3Vic2NyX3B1dChzdWJzY3IpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJc3Vic2NyX3B1dChzdWJzY3IpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfc3Vic2NyX25hbWUsCisgICAgICBjZmdfc3Vic2NyX25hbWVfY21kLAorICAgICAgIm5hbWUgTkFNRSIsCisgICAgICAiU2V0IHRoZSBuYW1lIG9mIHRoZSBzdWJzY3JpYmVyIikKK3sKKwljb25zdCBjaGFyICpuYW1lID0gYXJndlswXTsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IHZ0eS0+aW5kZXg7CisKKwlzdHJuY3B5KHN1YnNjci0+bmFtZSwgbmFtZSwgc2l6ZW9mKHN1YnNjci0+bmFtZSkpOworCisJZGJfc3luY19zdWJzY3JpYmVyKHN1YnNjcik7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19zdWJzY3JfZXh0ZW5zaW9uLAorICAgICAgY2ZnX3N1YnNjcl9leHRlbnNpb25fY21kLAorICAgICAgImV4dGVuc2lvbiBFWFRFTlNJT04iLAorICAgICAgIlNldCB0aGUgZXh0ZW5zaW9uIG9mIHRoZSBzdWJzY3JpYmVyIikKK3sKKwljb25zdCBjaGFyICpuYW1lID0gYXJndlswXTsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IHZ0eS0+aW5kZXg7CisKKwlzdHJuY3B5KHN1YnNjci0+ZXh0ZW5zaW9uLCBuYW1lLCBzaXplb2Yoc3Vic2NyLT5leHRlbnNpb24pKTsKKworCWRiX3N5bmNfc3Vic2NyaWJlcihzdWJzY3IpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfc3Vic2NyX2F1dGhvcml6ZWQsCisgICAgICBjZmdfc3Vic2NyX2F1dGhvcml6ZWRfY21kLAorICAgICAgImF1dGggPDAtMT4iLAorICAgICAgIlNldCB0aGUgYXV0aG9yaXphdGlvbiBzdGF0dXMgb2YgdGhlIHN1YnNjcmliZXIiKQoreworCWludCBhdXRoID0gYXRvaShhcmd2WzBdKTsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IHZ0eS0+aW5kZXg7CisKKwlpZiAoYXV0aCkKKwkJc3Vic2NyLT5hdXRob3JpemVkID0gMTsKKwllbHNlCisJCXN1YnNjci0+YXV0aG9yaXplZCA9IDA7CisKKwlkYl9zeW5jX3N1YnNjcmliZXIoc3Vic2NyKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworI2RlZmluZSBBM0E4X0FMR19UWVBFUyAiKG5vbmV8Y29tcDEyOHYxKSIKKworREVGVU4oY2ZnX3N1YnNjcl9hM2E4LAorICAgICAgY2ZnX3N1YnNjcl9hM2E4X2NtZCwKKyAgICAgICJhM2E4ICIgQTNBOF9BTEdfVFlQRVMgIiBbS0ldIiwKKyAgICAgICJTZXQgYTNhOCBwYXJhbWV0ZXJzIGZvciB0aGUgc3Vic2NyaWJlciIpCit7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IgPSB2dHktPmluZGV4OworCWNvbnN0IGNoYXIgKmFsZ19zdHIgPSBhcmd2WzBdOworCWNvbnN0IGNoYXIgKmtpX3N0ciA9IGFyZ3ZbMV07CisJc3RydWN0IGdzbV9hdXRoX2luZm8gYWluZm87CisJaW50IHJjOworCisJaWYgKCFzdHJjYXNlY21wKGFsZ19zdHIsICJub25lIikpIHsKKwkJLyogSnVzdCBlcmFzZSAqLworCQlyYyA9IHNldF9hdXRoaW5mb19mb3Jfc3Vic2NyKE5VTEwsIHN1YnNjcik7CisJfSBlbHNlIGlmICghc3RyY2FzZWNtcChhbGdfc3RyLCAiY29tcDEyOHYxIikpIHsKKwkJLyogUGFyc2UgaGV4IHN0cmluZyBLaSAqLworCQlyYyA9IGhleHBhcnNlKGtpX3N0ciwgYWluZm8uYTNhOF9raSwgc2l6ZW9mKGFpbmZvLmEzYThfa2kpKTsKKwkJaWYgKHJjICE9IDE2KQorCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCisJCS8qIFNldCB0aGUgaW5mb3MgKi8KKwkJYWluZm8uYXV0aF9hbGdvID0gQVVUSF9BTEdPX0NPTVAxMjh2MTsKKwkJYWluZm8uYTNhOF9raV9sZW4gPSByYzsKKwkJcmMgPSBzZXRfYXV0aGluZm9fZm9yX3N1YnNjcigmYWluZm8sIHN1YnNjcik7CisJfSBlbHNlIHsKKwkJLyogVW5rbm93biBtZXRob2QgKi8KKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCXJldHVybiByYyA/IENNRF9XQVJOSU5HIDogQ01EX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgc2NhbGxfY2Jmbih1bnNpZ25lZCBpbnQgc3Vic3lzLCB1bnNpZ25lZCBpbnQgc2lnbmFsLAorCQkJdm9pZCAqaGFuZGxlcl9kYXRhLCB2b2lkICpzaWduYWxfZGF0YSkKK3sKKwlzdHJ1Y3Qgc2NhbGxfc2lnbmFsX2RhdGEgKnNpZ2RhdGEgPSBzaWduYWxfZGF0YTsKKwlzdHJ1Y3QgdnR5ICp2dHkgPSBzaWdkYXRhLT5kYXRhOworCisJc3dpdGNoIChzaWduYWwpIHsKKwljYXNlIFNfU0NBTExfU1VDQ0VTUzoKKwkJdnR5X291dCh2dHksICIlJSBzaWxlbnQgY2FsbCBvbiBBUkZDTiAldSB0aW1lc2xvdCAldSVzIiwKKwkJCXNpZ2RhdGEtPmxjaGFuLT50cy0+dHJ4LT5hcmZjbiwgc2lnZGF0YS0+bGNoYW4tPnRzLT5uciwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJYnJlYWs7CisJY2FzZSBTX1NDQUxMX0VYUElSRUQ6CisJCXZ0eV9vdXQodnR5LCAiJSUgc2lsZW50IGNhbGwgZXhwaXJlZCBwYWdpbmclcyIsIFZUWV9ORVdMSU5FKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitpbnQgYnNjX3Z0eV9pbml0X2V4dHJhKHN0cnVjdCBnc21fbmV0d29yayAqbmV0KQoreworCWdzbW5ldCA9IG5ldDsKKworCXJlZ2lzdGVyX3NpZ25hbF9oYW5kbGVyKFNTX1NDQUxMLCBzY2FsbF9jYmZuLCBOVUxMKTsKKworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzaG93X3N1YnNjcl9jbWQpOworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzaG93X3N1YnNjcl9jYWNoZV9jbWQpOworCisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnNtc19zZW5kX3BlbmRfY21kKTsKKworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzdWJzY3JpYmVyX3NlbmRfc21zX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnN1YnNjcmliZXJfc2lsZW50X3Ntc19jbWQpOworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzdWJzY3JpYmVyX3NpbGVudF9jYWxsX3N0YXJ0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnN1YnNjcmliZXJfc2lsZW50X2NhbGxfc3RvcF9jbWQpOworCisJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmY2ZnX3N1YnNjcl9jbWQpOworCWluc3RhbGxfbm9kZSgmc3Vic2NyX25vZGUsIGR1bW15X2NvbmZpZ193cml0ZSk7CisKKwlpbnN0YWxsX2RlZmF1bHQoU1VCU0NSX05PREUpOworCWluc3RhbGxfZWxlbWVudChTVUJTQ1JfTk9ERSwgJmNmZ19zdWJzY3JfbmFtZV9jbWQpOworCWluc3RhbGxfZWxlbWVudChTVUJTQ1JfTk9ERSwgJmNmZ19zdWJzY3JfZXh0ZW5zaW9uX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFNVQlNDUl9OT0RFLCAmY2ZnX3N1YnNjcl9hdXRob3JpemVkX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFNVQlNDUl9OT0RFLCAmY2ZnX3N1YnNjcl9hM2E4X2NtZCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2MvdGVzdHMvTWFrZWZpbGUuYW0gYi9vcGVuYnNjL3Rlc3RzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMWI5MzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3Rlc3RzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEgQEAKK1NVQkRJUlMgPSBkZWJ1ZyBnc20wNDA4IGRiIGNoYW5uZWwgc2NjcApkaWZmIC0tZ2l0IGEvb3BlbmJzYy90ZXN0cy9jaGFubmVsL01ha2VmaWxlLmFtIGIvb3BlbmJzYy90ZXN0cy9jaGFubmVsL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3Mjk2NTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3Rlc3RzL2NoYW5uZWwvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxNSBAQAorSU5DTFVERVMgPSAkKGFsbF9pbmNsdWRlcykgLUkkKHRvcF9zcmNkaXIpL2luY2x1ZGUKK0FNX0NGTEFHUz0tV2FsbCAtZ2dkYjMgJChMSUJPU01PQ09SRV9DRkxBR1MpCisKK25vaW5zdF9QUk9HUkFNUyA9IGNoYW5uZWxfdGVzdAorCitjaGFubmVsX3Rlc3RfU09VUkNFUyA9IGNoYW5uZWxfdGVzdC5jIFwKKwkkKHRvcF9zcmNkaXIpL3NyYy9kYi5jIFwKKwkkKHRvcF9zcmNkaXIpL3NyYy9nc21fc3Vic2NyaWJlcl9iYXNlLmMgXAorCSQodG9wX3NyY2Rpcikvc3JjL2dzbV9zdWJzY3JpYmVyLmMgXAorCSQodG9wX3NyY2Rpcikvc3JjL2RlYnVnLmMgXAorCSQodG9wX3NyY2Rpcikvc3JjL2dzbV9kYXRhLmMgXAorCSQodG9wX3NyY2Rpcikvc3JjL2J0c19pcGFjY2Vzc19uYW5vYnRzLmMgXAorCSQodG9wX3NyY2Rpcikvc3JjL2J0c19zaWVtZW5zX2JzMTEuYworY2hhbm5lbF90ZXN0X0xEQUREID0gLWxkbCAtbGRiaSAkKExJQk9TTU9DT1JFX0xJQlMpCisKZGlmZiAtLWdpdCBhL29wZW5ic2MvdGVzdHMvY2hhbm5lbC9jaGFubmVsX3Rlc3QuYyBiL29wZW5ic2MvdGVzdHMvY2hhbm5lbC9jaGFubmVsX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTkwMDFjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy90ZXN0cy9jaGFubmVsL2NoYW5uZWxfdGVzdC5jCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfcnNsLmg+CisKKy8qIG91ciBoYW5kbGVyICovCitzdGF0aWMgaW50IHN1YnNjcl9jYih1bnNpZ25lZCBpbnQgaG9vaywgdW5zaWduZWQgaW50IGV2ZW50LCBzdHJ1Y3QgbXNnYiAqbXNnLCB2b2lkICpkYXRhLCB2b2lkICpwYXJhbSkKK3sKKwlhc3NlcnQoaG9vayA9PSAxMDEpOworCWFzc2VydChldmVudCA9PSAyMDApOworCWFzc2VydChtc2cgPT0gKHZvaWQqKTB4MTMyM0wpOworCWFzc2VydChkYXRhID09ICh2b2lkKikweDQyNDJMKTsKKwlhc3NlcnQocGFyYW0gPT0gKHZvaWQqKTB4MjM0MkwpOworCXByaW50ZigiUmVhY2hlZCwgZGlkbid0IGNyYXNoLCB0ZXN0IHBhc3NlZFxuIik7CisJcmV0dXJuIDA7Cit9CisKKy8qIG1vY2sgb2JqZWN0IGZvciB0ZXN0aW5nLCBkaXJlY3RseSBpbnZva2UgdGhlIGNiLi4uIG1heWJlIGxhdGVyIHRocm91Z2ggdGhlIHRpbWVyICovCit2b2lkIHBhZ2luZ19yZXF1ZXN0KHN0cnVjdCBnc21fYnRzICpidHMsIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyaWJlciwgaW50IHR5cGUsIGdzbV9jYmZuICpjYmZuLCB2b2lkICpkYXRhKQoreworCWNiZm4oMTAxLCAyMDAsICh2b2lkKikweDEzMjNMLCAodm9pZCopMHg0MjQyTCwgZGF0YSk7Cit9CisKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0d29yazsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCisJcHJpbnRmKCJUZXN0aW5nIHRoZSBnc21fc3Vic2NyaWJlciBjaGFuIGxvZ2ljXG4iKTsKKworCS8qIENyZWF0ZSBhIGR1bW15IG5ldHdvcmsgKi8KKwluZXR3b3JrID0gZ3NtX25ldHdvcmtfaW5pdCgxLCAxLCBOVUxMKTsKKwlpZiAoIW5ldHdvcmspCisJCWV4aXQoMSk7CisJYnRzID0gZ3NtX2J0c19hbGxvYyhuZXR3b3JrLCBHU01fQlRTX1RZUEVfQlMxMSwgMCwgMCk7CisJYnRzLT5sb2NhdGlvbl9hcmVhX2NvZGUgPSAyMzsKKworCS8qIENyZWF0ZSBhIGR1bW15IHN1YnNjcmliZXIgKi8KKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IHN1YnNjcl9hbGxvYygpOworCXN1YnNjci0+bGFjID0gMjM7CisJc3Vic2NyLT5uZXQgPSBuZXR3b3JrOworCisJLyogQXNrIGZvciBhIGNoYW5uZWwuLi4gKi8KKwlzdWJzY3JfZ2V0X2NoYW5uZWwoc3Vic2NyLCBSU0xfQ0hBTk5FRURfVENIX0YsIHN1YnNjcl9jYiwgKHZvaWQqKTB4MjM0MkwpOworCisJd2hpbGUgKDEpIHsKKwkJYnNjX3NlbGVjdF9tYWluKDApOworCX0KK30KKwordm9pZCBubV9zdGF0ZV9ldmVudCgpIHt9Cit2b2lkIGlucHV0X2V2ZW50KCkge30KK3ZvaWQgc21zX2FsbG9jKCkge30KKworc3RydWN0IHRsdl9kZWZpbml0aW9uIG5tX2F0dF90bHZkZWY7CisKZGlmZiAtLWdpdCBhL29wZW5ic2MvdGVzdHMvZGIvTWFrZWZpbGUuYW0gYi9vcGVuYnNjL3Rlc3RzL2RiL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYjkxODAKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3Rlc3RzL2RiL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsOCBAQAorSU5DTFVERVMgPSAkKGFsbF9pbmNsdWRlcykgLUkkKHRvcF9zcmNkaXIpL2luY2x1ZGUKK0FNX0NGTEFHUz0tV2FsbCAtZ2dkYjMgJChMSUJPU01PQ09SRV9DRkxBR1MpCisKK25vaW5zdF9QUk9HUkFNUyA9IGRiX3Rlc3QKKworZGJfdGVzdF9TT1VSQ0VTID0gZGJfdGVzdC5jCitkYl90ZXN0X0xEQUREID0gJCh0b3BfYnVpbGRkaXIpL3NyYy9saWJic2MuYSAkKHRvcF9idWlsZGRpcikvc3JjL2xpYm1zYy5hICQodG9wX2J1aWxkZGlyKS9zcmMvbGliYnNjLmEgJChMSUJPU01PQ09SRV9MSUJTKSAtbGRsIC1sZGJpCisKZGlmZiAtLWdpdCBhL29wZW5ic2MvdGVzdHMvZGIvZGJfdGVzdC5jIGIvb3BlbmJzYy90ZXN0cy9kYi9kYl90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE2OGFjYgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvdGVzdHMvZGIvZGJfdGVzdC5jCkBAIC0wLDAgKzEsMTA2IEBACisvKiAoQykgMjAwOCBieSBKYW4gTHVlYmJlIDxqbHVlYmJlQGRlYmlhbi5vcmc+CisgKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPG9wZW5ic2MvZGIuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNkZWZpbmUgQ09NUEFSRShvcmlnaW5hbCwgY29weSkgXAorCWlmIChvcmlnaW5hbC0+aWQgIT0gY29weS0+aWQpIFwKKwkJZnByaW50ZihzdGRlcnIsICJJZHMgZG8gbm90IG1hdGNoIGluICVzOiVkICVsbHUgJWxsdVxuIiwgXAorCQkJX19GVU5DVElPTl9fLCBfX0xJTkVfXywgb3JpZ2luYWwtPmlkLCBjb3B5LT5pZCk7IFwKKwlpZiAob3JpZ2luYWwtPmxhYyAhPSBjb3B5LT5sYWMpIFwKKwkJZnByaW50ZihzdGRlcnIsICJMQUMgZG8gbm90IG1hdGNoIGluICVzOiVkICVkICVkXG4iLCBcCisJCQlfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBvcmlnaW5hbC0+bGFjLCBjb3B5LT5sYWMpOyBcCisJaWYgKG9yaWdpbmFsLT5hdXRob3JpemVkICE9IGNvcHktPmF1dGhvcml6ZWQpIFwKKwkJZnByaW50ZihzdGRlcnIsICJBdXRob3JpemUgZG8gbm90IG1hdGNoIGluICVzOiVkICVkICVkXG4iLCBcCisJCQlfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBvcmlnaW5hbC0+YXV0aG9yaXplZCwgXAorCQkJY29weS0+YXV0aG9yaXplZCk7IFwKKwlpZiAoc3RyY21wKG9yaWdpbmFsLT5pbXNpLCBjb3B5LT5pbXNpKSAhPSAwKSBcCisJCWZwcmludGYoc3RkZXJyLCAiSU1TSXMgZG8gbm90IG1hdGNoIGluICVzOiVkICclcycgJyVzJ1xuIiwgXAorCQkJX19GVU5DVElPTl9fLCBfX0xJTkVfXywgb3JpZ2luYWwtPmltc2ksIGNvcHktPmltc2kpOyBcCisJaWYgKG9yaWdpbmFsLT50bXNpICE9IGNvcHktPnRtc2kpIFwKKwkJZnByaW50ZihzdGRlcnIsICJUTVNJcyBkbyBub3QgbWF0Y2ggaW4gJXM6JWQgJyV1JyAnJXUnXG4iLCBcCisJCQlfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBvcmlnaW5hbC0+dG1zaSwgY29weS0+dG1zaSk7IFwKKwlpZiAoc3RyY21wKG9yaWdpbmFsLT5uYW1lLCBjb3B5LT5uYW1lKSAhPSAwKSBcCisJCWZwcmludGYoc3RkZXJyLCAibmFtZXMgZG8gbm90IG1hdGNoIGluICVzOiVkICclcycgJyVzJ1xuIiwgXAorCQkJX19GVU5DVElPTl9fLCBfX0xJTkVfXywgb3JpZ2luYWwtPm5hbWUsIGNvcHktPm5hbWUpOyBcCisJaWYgKHN0cmNtcChvcmlnaW5hbC0+ZXh0ZW5zaW9uLCBjb3B5LT5leHRlbnNpb24pICE9IDApIFwKKwkJZnByaW50ZihzdGRlcnIsICJuYW1lcyBkbyBub3QgbWF0Y2ggaW4gJXM6JWQgJyVzJyAnJXMnXG4iLCBcCisJCQlfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBvcmlnaW5hbC0+ZXh0ZW5zaW9uLCBjb3B5LT5leHRlbnNpb24pOyBcCisKK2ludCBtYWluKCkgeworCisJaWYgKGRiX2luaXQoImhsci5zcWxpdGUzIikpIHsKKwkJcHJpbnRmKCJEQjogRmFpbGVkIHRvIGluaXQgZGF0YWJhc2UuIFBsZWFzZSBjaGVjayB0aGUgb3B0aW9uIHNldHRpbmdzLlxuIik7CisJCXJldHVybiAxOworCX0JIAorCXByaW50ZigiREI6IERhdGFiYXNlIGluaXRpYWxpemVkLlxuIik7CisKKwlpZiAoZGJfcHJlcGFyZSgpKSB7CisJCXByaW50ZigiREI6IEZhaWxlZCB0byBwcmVwYXJlIGRhdGFiYXNlLlxuIik7CisJCXJldHVybiAxOworCX0KKwlwcmludGYoIkRCOiBEYXRhYmFzZSBwcmVwYXJlZC5cbiIpOworCisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICphbGljZSA9IE5VTEw7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICphbGljZV9kYjsKKworCWNoYXIgKmFsaWNlX2ltc2kgPSAiMzI0MzI0NTQzMjM0NSI7CisJYWxpY2UgPSBkYl9jcmVhdGVfc3Vic2NyaWJlcihOVUxMLCBhbGljZV9pbXNpKTsKKwlkYl9zeW5jX3N1YnNjcmliZXIoYWxpY2UpOworCWFsaWNlX2RiID0gZGJfZ2V0X3N1YnNjcmliZXIoTlVMTCwgR1NNX1NVQlNDUklCRVJfSU1TSSwgYWxpY2UtPmltc2kpOworCUNPTVBBUkUoYWxpY2UsIGFsaWNlX2RiKTsKKwlzdWJzY3JfcHV0KGFsaWNlX2RiKTsKKwlzdWJzY3JfcHV0KGFsaWNlKTsKKworCWFsaWNlX2ltc2kgPSAiMzY5MzI0NTQyMzQ0NSI7CisJYWxpY2UgPSBkYl9jcmVhdGVfc3Vic2NyaWJlcihOVUxMLCBhbGljZV9pbXNpKTsKKwlkYl9zdWJzY3JpYmVyX2Fzc29jX2ltZWkoYWxpY2UsICIxMjM0NTY3ODkwIik7CisJZGJfc3Vic2NyaWJlcl9hbGxvY190bXNpKGFsaWNlKTsKKwlhbGljZS0+bGFjPTQyOworCWRiX3N5bmNfc3Vic2NyaWJlcihhbGljZSk7CisJYWxpY2VfZGIgPSBkYl9nZXRfc3Vic2NyaWJlcihOVUxMLCBHU01fU1VCU0NSSUJFUl9JTVNJLCBhbGljZV9pbXNpKTsKKwlDT01QQVJFKGFsaWNlLCBhbGljZV9kYik7CisJc3Vic2NyX3B1dChhbGljZSk7CisJc3Vic2NyX3B1dChhbGljZV9kYik7CisKKwlhbGljZV9pbXNpID0gIjk5OTMyNDU0MjM0NDUiOworCWFsaWNlID0gZGJfY3JlYXRlX3N1YnNjcmliZXIoTlVMTCwgYWxpY2VfaW1zaSk7CisJZGJfc3Vic2NyaWJlcl9hbGxvY190bXNpKGFsaWNlKTsKKwlhbGljZS0+bGFjPTQyOworCWRiX3N5bmNfc3Vic2NyaWJlcihhbGljZSk7CisJZGJfc3Vic2NyaWJlcl9hc3NvY19pbWVpKGFsaWNlLCAiMTIzNDU2Nzg5MCIpOworCWRiX3N1YnNjcmliZXJfYXNzb2NfaW1laShhbGljZSwgIjY1NDM1NjA5MjAiKTsKKwlhbGljZV9kYiA9IGRiX2dldF9zdWJzY3JpYmVyKE5VTEwsIEdTTV9TVUJTQ1JJQkVSX0lNU0ksIGFsaWNlX2ltc2kpOworCUNPTVBBUkUoYWxpY2UsIGFsaWNlX2RiKTsKKwlzdWJzY3JfcHV0KGFsaWNlKTsKKwlzdWJzY3JfcHV0KGFsaWNlX2RiKTsKKworCWRiX2ZpbmkoKTsKKworCXJldHVybiAwOworfQorCisvKiBzdHVicyAqLwordm9pZCBpbnB1dF9ldmVudCh2b2lkKSB7fQordm9pZCBubV9zdGF0ZV9ldmVudCh2b2lkKSB7fQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy90ZXN0cy9kZWJ1Zy9NYWtlZmlsZS5hbSBiL29wZW5ic2MvdGVzdHMvZGVidWcvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQyM2ZkMQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvdGVzdHMvZGVidWcvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw2IEBACitJTkNMVURFUyA9ICQoYWxsX2luY2x1ZGVzKSAtSSQodG9wX3NyY2RpcikvaW5jbHVkZQorQU1fQ0ZMQUdTPS1XYWxsICQoTElCT1NNT0NPUkVfQ0ZMQUdTKQorbm9pbnN0X1BST0dSQU1TID0gZGVidWdfdGVzdAorCitkZWJ1Z190ZXN0X1NPVVJDRVMgPSBkZWJ1Z190ZXN0LmMgJCh0b3Bfc3JjZGlyKS9zcmMvZGVidWcuYyAKK2RlYnVnX3Rlc3RfTERBREQgPSAkKExJQk9TTU9DT1JFX0xJQlMpCmRpZmYgLS1naXQgYS9vcGVuYnNjL3Rlc3RzL2RlYnVnL2RlYnVnX3Rlc3QuYyBiL29wZW5ic2MvdGVzdHMvZGVidWcvZGVidWdfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMGMyODQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3Rlc3RzL2RlYnVnL2RlYnVnX3Rlc3QuYwpAQCAtMCwwICsxLDQxIEBACisvKiBzaW1wbGUgdGVzdCBmb3IgdGhlIGRlYnVnIGludGVyZmFjZSAqLworLyoKKyAqIChDKSAyMDA4LCAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKwlzdHJ1Y3QgZGVidWdfdGFyZ2V0ICpzdGRlcnJfdGFyZ2V0OworCisJZGVidWdfaW5pdCgpOworCXN0ZGVycl90YXJnZXQgPSBkZWJ1Z190YXJnZXRfY3JlYXRlX3N0ZGVycigpOworCWRlYnVnX2FkZF90YXJnZXQoc3RkZXJyX3RhcmdldCk7CisJZGVidWdfc2V0X2FsbF9maWx0ZXIoc3RkZXJyX3RhcmdldCwgMSk7CisKKwlkZWJ1Z19wYXJzZV9jYXRlZ29yeV9tYXNrKHN0ZGVycl90YXJnZXQsICJEUkxMIik7CisJREVCVUdQKERDQywgIllvdSBzaG91bGQgbm90IHNlZSB0aGlzXG4iKTsKKworCWRlYnVnX3BhcnNlX2NhdGVnb3J5X21hc2soc3RkZXJyX3RhcmdldCwgIkRSTEw6RENDIik7CisJREVCVUdQKERSTEwsICJZb3Ugc2hvdWxkIHNlZSB0aGlzXG4iKTsKKwlERUJVR1AoRENDLCAiWW91IHNob3VsZCBzZWUgdGhpc1xuIik7CisJREVCVUdQKERNTSwgIllvdSBzaG91bGQgbm90IHNlZSB0aGlzXG4iKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2MvdGVzdHMvZ3NtMDQwOC9NYWtlZmlsZS5hbSBiL29wZW5ic2MvdGVzdHMvZ3NtMDQwOC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOThjNjczCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy90ZXN0cy9nc20wNDA4L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNiBAQAorSU5DTFVERVMgPSAkKGFsbF9pbmNsdWRlcykgLUkkKHRvcF9zcmNkaXIpL2luY2x1ZGUKK0FNX0NGTEFHUz0tV2FsbCAkKExJQk9TTU9DT1JFX0NGTEFHUykKK25vaW5zdF9QUk9HUkFNUyA9IGdzbTA0MDhfdGVzdAorCitnc20wNDA4X3Rlc3RfU09VUkNFUyA9IGdzbTA0MDhfdGVzdC5jCitnc20wNDA4X3Rlc3RfTERBREQgPSAkKHRvcF9idWlsZGRpcikvc3JjL2xpYmJzYy5hICQodG9wX2J1aWxkZGlyKS9zcmMvbGlibXNjLmEgJCh0b3BfYnVpbGRkaXIpL3NyYy9saWJic2MuYSAkKExJQk9TTU9DT1JFX0xJQlMpIC1sZGJpCmRpZmYgLS1naXQgYS9vcGVuYnNjL3Rlc3RzL2dzbTA0MDgvZ3NtMDQwOF90ZXN0LmMgYi9vcGVuYnNjL3Rlc3RzL2dzbTA0MDgvZ3NtMDQwOF90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg3ZDRlZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvdGVzdHMvZ3NtMDQwOC9nc20wNDA4X3Rlc3QuYwpAQCAtMCwwICsxLDExMiBAQAorLyogc2ltcGxlIHRlc3QgZm9yIHRoZSBnc20wNDA4IGZvcm1hdHRpbmcgZnVuY3Rpb25zICovCisvKgorICogKEMpIDIwMDggYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8wOC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisKKyNkZWZpbmUgQ09NUEFSRShyZXN1bHQsIG9wLCB2YWx1ZSkgXAorICAgIGlmICghKChyZXN1bHQpIG9wICh2YWx1ZSkpKSB7XAorCWZwcmludGYoc3RkZXJyLCAiQ29tcGFyZSBmYWlsZWQuIFdhcyAleCBzaG91bGQgYmUgJXggaW4gJXM6JWRcbiIscmVzdWx0LCB2YWx1ZSwgX19GSUxFX18sIF9fTElORV9fKTsgXAorCWV4aXQoLTEpOyBcCisgICAgfQorCisjZGVmaW5lIENPTVBBUkVfU1RSKHJlc3VsdCwgdmFsdWUpIFwKKwlpZiAoc3RyY21wKHJlc3VsdCwgdmFsdWUpICE9IDApIHsgXAorCQlmcHJpbnRmKHN0ZGVyciwgIkNvbXBhcmUgZmFpbGVkLiBXYXMgJXMgc2hvdWxkIGJlICVzIGluICVzOiVkXG4iLHJlc3VsdCwgdmFsdWUsIF9fRklMRV9fLCBfX0xJTkVfXyk7IFwKKwkJZXhpdCgtMSk7IFwKKwl9CisKKy8qCisgKiBUZXN0IExvY2F0aW9uIEFyZWEgSWRlbnRpZmllciBmb3JtYXR0aW5nLiBUYWJsZSAxMC41LjMgb2YgMDQuMDgKKyAqLworc3RhdGljIHZvaWQgdGVzdF9sb2NhdGlvbl9hcmVhX2lkZW50aWZpZXIodm9pZCkKK3sKKyAgICBzdHJ1Y3QgZ3NtNDhfbG9jX2FyZWFfaWQgbGFpNDg7CisKKyAgICBwcmludGYoIlRlc3RpbmcgdGVzdCBsb2NhdGlvbiBhcmVhIGlkZW50aWZpZXJcbiIpOworCisgICAgLyoKKyAgICAgKiBUZXN0IHRoZSBkZWZhdWx0L3Rlc3Qgc2V0dXAuIENvbWluZyBmcm9tCisgICAgICogYnNjX2hhY2suYyBkdW1wcworICAgICAqLworICAgIGdzbTQ4X2dlbmVyYXRlX2xhaSgmbGFpNDgsIDEsIDEsIDEpOworICAgIENPTVBBUkUobGFpNDguZGlnaXRzWzBdLCA9PSwgMHgwMCk7CisgICAgQ09NUEFSRShsYWk0OC5kaWdpdHNbMV0sID09LCAweEYxKTsKKyAgICBDT01QQVJFKGxhaTQ4LmRpZ2l0c1syXSwgPT0sIDB4MTApOworICAgIENPTVBBUkUobGFpNDgubGFjLCA9PSwgaHRvbnMoMHgwMDAxKSk7CisKKyAgICBnc200OF9nZW5lcmF0ZV9sYWkoJmxhaTQ4LCA2MDIsIDEsIDE1KTsKKyAgICBDT01QQVJFKGxhaTQ4LmRpZ2l0c1swXSwgPT0sIDB4MDYpOworICAgIENPTVBBUkUobGFpNDguZGlnaXRzWzFdLCA9PSwgMHhGMik7CisgICAgQ09NUEFSRShsYWk0OC5kaWdpdHNbMl0sID09LCAweDEwKTsKKyAgICBDT01QQVJFKGxhaTQ4LmxhYywgPT0sIGh0b25zKDB4MDAwZikpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X21pX2Z1bmN0aW9uYWxpdHkodm9pZCkKK3sKKwljb25zdCBjaGFyICppbXNpX29kZCAgPSAiOTg3NjU0MzIxMDk4NzYzIjsKKwljb25zdCBjaGFyICppbXNpX2V2ZW4gPSAiOTg3NjU0MzIxMDk4NzY1NCI7CisJY29uc3QgdV9pbnQzMl90IHRtc2kgPSAweGZhYmVhY2QwOworCXVfaW50OF90IG1pWzEyOF07CisJdW5zaWduZWQgaW50IG1pX2xlbjsKKwljaGFyIG1pX3BhcnNlZFtHU000OF9NSV9TSVpFXTsKKworCXByaW50ZigiVGVzdGluZyBwYXJzaW5nIGFuZCBnZW5lcmF0aW5nIFRNU0kvSU1TSVxuIik7CisKKwkvKiB0bXNpIGNvZGUgKi8KKwltaV9sZW4gPSBnc200OF9nZW5lcmF0ZV9taWRfZnJvbV90bXNpKG1pLCB0bXNpKTsKKwlnc200OF9taV90b19zdHJpbmcobWlfcGFyc2VkLCBzaXplb2YobWlfcGFyc2VkKSwgbWkgKyAyLCBtaV9sZW4gLSAyKTsKKwlDT01QQVJFKCh1X2ludDMyX3Qpc3RydG91bChtaV9wYXJzZWQsIE5VTEwsIDEwKSwgPT0sIHRtc2kpOworCisJLyogaW1zaSBjb2RlICovCisJbWlfbGVuID0gZ3NtNDhfZ2VuZXJhdGVfbWlkX2Zyb21faW1zaShtaSwgaW1zaV9vZGQpOworCWdzbTQ4X21pX3RvX3N0cmluZyhtaV9wYXJzZWQsIHNpemVvZihtaV9wYXJzZWQpLCBtaSArIDIsIG1pX2xlbiAtMik7CisJcHJpbnRmKCJoZXg6ICVzXG4iLCBoZXhkdW1wKG1pLCBtaV9sZW4pKTsKKwlDT01QQVJFX1NUUihtaV9wYXJzZWQsIGltc2lfb2RkKTsKKworCW1pX2xlbiA9IGdzbTQ4X2dlbmVyYXRlX21pZF9mcm9tX2ltc2kobWksIGltc2lfZXZlbik7CisJZ3NtNDhfbWlfdG9fc3RyaW5nKG1pX3BhcnNlZCwgc2l6ZW9mKG1pX3BhcnNlZCksIG1pICsgMiwgbWlfbGVuIC0yKTsKKwlwcmludGYoImhleDogJXNcbiIsIGhleGR1bXAobWksIG1pX2xlbikpOworCUNPTVBBUkVfU1RSKG1pX3BhcnNlZCwgaW1zaV9ldmVuKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworCXRlc3RfbG9jYXRpb25fYXJlYV9pZGVudGlmaWVyKCk7CisJdGVzdF9taV9mdW5jdGlvbmFsaXR5KCk7CisKKwlleGl0KDApOworfQorCisKKworLyoKKyAqIFN0dWJzIHRvIGNvbXBpbGUgYW5kIGxpbmsKKyAqLwordm9pZCBpbnB1dF9ldmVudCh2b2lkKSB7fQordm9pZCBubV9zdGF0ZV9ldmVudCh2b2lkKSB7fQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy90ZXN0cy9zY2NwL01ha2VmaWxlLmFtIGIvb3BlbmJzYy90ZXN0cy9zY2NwL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNTY5M2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3Rlc3RzL3NjY3AvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw4IEBACitJTkNMVURFUyA9ICQoYWxsX2luY2x1ZGVzKSAtSSQodG9wX3NyY2RpcikvaW5jbHVkZQorQU1fQ0ZMQUdTPS1XYWxsIC1nZ2RiMyAkKExJQk9TTU9DT1JFX0NGTEFHUykKKworbm9pbnN0X1BST0dSQU1TID0gc2NjcF90ZXN0CisKK3NjY3BfdGVzdF9TT1VSQ0VTID0gc2NjcF90ZXN0LmMKK3NjY3BfdGVzdF9MREFERCA9ICQodG9wX2J1aWxkZGlyKS9zcmMvbGlic2NjcC5hICQodG9wX2J1aWxkZGlyKS9zcmMvbGliYnNjLmEgJChMSUJPU01PQ09SRV9MSUJTKQorCmRpZmYgLS1naXQgYS9vcGVuYnNjL3Rlc3RzL3NjY3Avc2NjcF90ZXN0LmMgYi9vcGVuYnNjL3Rlc3RzL3NjY3Avc2NjcF90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI0MWQzZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvdGVzdHMvc2NjcC9zY2NwX3Rlc3QuYwpAQCAtMCwwICsxLDgyOCBAQAorLyoKKyAqIFNDQ1AgdGVzdGluZyBjb2RlCisgKgorICogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogKEMpIDIwMDkgYnkgT24tV2F2ZXMKKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorCisjaW5jbHVkZSA8c2NjcC9zY2NwLmg+CisKKyNkZWZpbmUgTUlOKHgsIHkpICgoeCkgPCAoeSkgPyAoeCkgOiAoeSkpCisKKy8qIEJTQyAtPiBNU0MgKi8KK3N0YXRpYyBjb25zdCB1X2ludDhfdCBic3NtYXBfcmVzZXRbXSA9IHsKKwkweDA5LCAweDAwLCAweDAzLCAweDA1LCAweDA3LCAweDAyLCAweDQyLCAweGZlLAorCTB4MDIsIDB4NDIsIDB4ZmUsIDB4MDYsIDB4MDAsIDB4MDQsIDB4MzAsIDB4MDQsCisJMHgwMSwgMHgyMCwKK307CisKKy8qIE1TQyAtPiBCU0MgcmVzZXQgYWNrICovCitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgYnNzbWFwX3Jlc2V0X2Fja1tdID0geworCTB4MDksIDB4MDAsIDB4MDMsIDB4MDcsIDB4MGIsIDB4MDQsIDB4NDMsIDB4MDEsCisJMHgwMCwgMHhmZSwgMHgwNCwgMHg0MywgMHg1YywgMHgwMCwgMHhmZSwgMHgwMywKKwkweDAwLCAweDAxLCAweDMxLAorfTsKKworLyogTVNDIC0+IEJTQyBwYWdpbmcsIGNvbm5lY3Rpb24gbGVzcyAqLworc3RhdGljIGNvbnN0IHVfaW50OF90IGJzc21hcF9wYWdpbmdbXSA9IHsKKwkweDA5LCAweDAwLCAweDAzLCAweDA3LCAweDBiLCAweDA0LCAweDQzLCAweDAxLAorCTB4MDAsIDB4ZmUsIDB4MDQsIDB4NDMsIDB4NWMsIDB4MDAsIDB4ZmUsIDB4MTAsCisJMHgwMCwgMHgwZSwgMHg1MiwgMHgwOCwgMHgwOCwgMHgyOSwgMHg0NywgMHgxMCwKKwkweDAyLCAweDAxLCAweDMxLCAweDk3LCAweDYxLCAweDFhLCAweDAxLCAweDA2LAorfTsKKworLyogTVNDIC0+IEJTQyBwYWdpbmcsIFVEVCB3aXRob3V0IFBDICAqLworc3RhdGljIGNvbnN0IHVfaW50OF90IGJzc21hcF91ZHRbXSA9IHsKKwkweDA5LCAweDAwLCAweDAzLCAweDA1LCAweDA3LCAweDAyLCAweDQyLCAweGZlLAorCTB4MDIsIDB4NDIsIDB4ZmUsIDB4MTAsIDB4MDAsIDB4MGUsIDB4NTIsIDB4MDgsCisJMHgwOCwgMHgyOSwgMHg0NywgMHgxMCwgMHgwMiwgMHgwMSwgMHgzMSwgMHg5NywKKwkweDYxLCAweDFhLCAweDAxLCAweDA2LAorfTsKKworLyogQlNDIC0+IE1TQyBjb25uZWN0aW9uIG9wZW4gKi8KK3N0YXRpYyBjb25zdCB1X2ludDhfdCBic3NtYXBfY3JbXSA9IHsKKwkweDAxLCAweDAxLCAweDAyLCAweDAzLCAweDAyLCAweDAyLCAweDA0LCAweDAyLAorCTB4NDIsIDB4ZmUsIDB4MGYsIDB4MWYsIDB4MDAsIDB4MWQsIDB4NTcsIDB4MDUsCisJMHgwOCwgMHgwMCwgMHg3MiwgMHhmNCwgMHg4MCwgMHgyMCwgMHgxMiwgMHhjMywKKwkweDUwLCAweDE3LCAweDEwLCAweDA1LCAweDI0LCAweDExLCAweDAzLCAweDMzLAorCTB4MTksIDB4YTIsIDB4MDgsIDB4MjksIDB4NDcsIDB4MTAsIDB4MDIsIDB4MDEsCisJMHgzMSwgMHg5NywgMHg2MSwgMHgwMAorfTsKKworLyogTVNDIC0+IEJTQyBjb25uZWN0aW9uIGNvbmZpcm0gKi8KK3N0YXRpYyBjb25zdCB1X2ludDhfdCBic3NtYXBfY2NbXSA9IHsKKwkweDAyLCAweDAxLCAweDAyLCAweDAzLCAweDAwLCAweDAwLCAweDAzLCAweDAyLCAweDAxLCAweDAwLAorfTsKKworLyogTVNDIC0+IEJTQyBEVEFQCisgKgorICogd2UgZmFrZSBhIGJpdCBhbmQgbWFrZSBpdCBCU0MgLT4gTVNDLi4uIHNvIHRoZQorICogcGF5bG9hZCBkb2VzIG5vdCBtYWtlIGFueSBzZW5zZS4uCisgKi8KK3N0YXRpYyBjb25zdCB1X2ludDhfdCBic3NtYXBfZHRhcFtdID0geworCTB4MDYsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDEsIDB4MGYsIDB4MDEsIDB4MDAsIDB4MGMsCisJMHgwMywgMHgwNSwgMHg1YywgMHgwOCwgMHgxMSwgMHg4MSwgMHgzMywgMHg2NiwgMHgwMiwgMHgxMywKKwkweDQ1LCAweGY0LAorfTsKKworLyogTVNDIC0+IEJTQyBjbGVhciBjb21tYW5kICovCitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgYnNzbWFwX2NsZWFyW10gPSB7CisJMHgwNiwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMSwgMHgwNiwgMHgwMCwgMHgwNCwgMHgyMCwKKwkweDA0LCAweDAxLCAweDA5LAorfTsKKworLyogTVNDIC0+IEJTQyByZWxlYXNlZCAqLworc3RhdGljIGNvbnN0IHVfaW50OF90IGJzc21hcF9yZWxlYXNlZFtdID0geworCTB4MDQsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDAsIDB4MDEsIDB4MGYsCisJMHgwMiwgMHgyMywgMHg0MiwgMHgwMCwKK307CisKKy8qIEJTQyAtPiBNU0MgcmVsZWFzZWQgKi8KK3N0YXRpYyBjb25zdCB1X2ludDhfdCBic3NtYXBfcmVsZWFzZV9jb21wbGV0ZVtdID0geworCTB4MDUsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDMKK307CisKK3N0cnVjdCB0ZXN0X2RhdGEgeworCWludCBsZW5ndGg7CisJY29uc3QgdV9pbnQ4X3QgKmRhdGE7CisJaW50IHBheWxvYWRfc3RhcnQ7CisJaW50IHBheWxvYWRfbGVuZ3RoOworCXVfaW50OF90IGZpcnN0X2J5dGU7CisKKyAgICAgICAgLyogaW4gY2FzZSBpdCBzaG91bGQgdHJpZ2dlciBhIHNjY3AgcmVzcG9uc2UgKi8KKwlpbnQgd3JpdGU7CisJY29uc3QgdV9pbnQ4X3QgICpyZXNwb25zZTsKKwlpbnQgcmVzcG9uc2VfbGVuZ3RoOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0ZXN0X2RhdGEgdGVzdF9kYXRhW10gPSB7CisJeworCQkubGVuZ3RoCQk9IEFSUkFZX1NJWkUoYnNzbWFwX3Jlc2V0KSwKKwkJLmRhdGEJCT0gJmJzc21hcF9yZXNldFswXSwKKwkJLnBheWxvYWRfc3RhcnQJPSAxMiwKKwkJLnBheWxvYWRfbGVuZ3RoID0gQVJSQVlfU0laRShic3NtYXBfcmVzZXQpIC0gMTIsCisJCS5maXJzdF9ieXRlCT0gMHgwLAorCX0sCisJeworCQkubGVuZ3RoCQk9IEFSUkFZX1NJWkUoYnNzbWFwX3Jlc2V0X2FjayksCisJCS5kYXRhCQk9ICZic3NtYXBfcmVzZXRfYWNrWzBdLAorCQkucGF5bG9hZF9zdGFydAk9IDE2LAorCQkucGF5bG9hZF9sZW5ndGggPSBBUlJBWV9TSVpFKGJzc21hcF9yZXNldF9hY2spIC0gMTYsCisJCS5maXJzdF9ieXRlCT0gMHgwLAorCX0sCisJeworCQkubGVuZ3RoCQk9IEFSUkFZX1NJWkUoYnNzbWFwX3BhZ2luZyksCisJCS5kYXRhCQk9ICZic3NtYXBfcGFnaW5nWzBdLAorCQkucGF5bG9hZF9zdGFydAk9IDE2LAorCQkucGF5bG9hZF9sZW5ndGggPSBBUlJBWV9TSVpFKGJzc21hcF9wYWdpbmcpIC0gMTYsCisJCS5maXJzdF9ieXRlCT0gMHgwLAorCX0sCisJeworCQkubGVuZ3RoCQk9IEFSUkFZX1NJWkUoYnNzbWFwX2NyKSwKKwkJLmRhdGEJCT0gJmJzc21hcF9jclswXSwKKwkJLnBheWxvYWRfc3RhcnQJPSAxMiwKKwkJLyogMHgwMCBpcyBlbmQgb2Ygb3B0aW9uYWwgZGF0YSwgc3VidHJhY3QgdGhpcyBieXRlICovCisJCS5wYXlsb2FkX2xlbmd0aCA9IDMxLAorCQkuZmlyc3RfYnl0ZQk9IDB4MCwKKworCQkvKiB0aGUgY29ubmVjdGlvbiByZXF1ZXN0IHNob3VsZCB0cmlnZ2VyIGEgY29ubmVjdGlvbiBjb25maXJtICovCisJCS53cml0ZQkJPSAxLAorCQkucmVzcG9uc2UJPSAmYnNzbWFwX2NjWzBdLAorCQkucmVzcG9uc2VfbGVuZ3RoPSBBUlJBWV9TSVpFKGJzc21hcF9jYyksCisJfSwKKwl7CisJCS5sZW5ndGgJCT0gQVJSQVlfU0laRShic3NtYXBfZHRhcCksCisJCS5kYXRhCQk9ICZic3NtYXBfZHRhcFswXSwKKwkJLnBheWxvYWRfc3RhcnQJPSA3LAorCQkucGF5bG9hZF9sZW5ndGggPSAxNSwKKwkJLmZpcnN0X2J5dGUJPSAweDAxLAorCX0sCisJeworCQkubGVuZ3RoCQk9IEFSUkFZX1NJWkUoYnNzbWFwX2NsZWFyKSwKKwkJLmRhdGEJCT0gJmJzc21hcF9jbGVhclswXSwKKwkJLnBheWxvYWRfc3RhcnQJPSA3LAorCQkucGF5bG9hZF9sZW5ndGggPSA2LAorCQkuZmlyc3RfYnl0ZQk9IDB4MDAsCisJfSwKKwl7CisJCS5sZW5ndGgJCT0gQVJSQVlfU0laRShic3NtYXBfcmVsZWFzZWQpLAorCQkuZGF0YQkJPSAmYnNzbWFwX3JlbGVhc2VkWzBdLAorCQkucGF5bG9hZF9sZW5ndGggPSAyLAorCQkucGF5bG9hZF9zdGFydCAgPSAxMSwKKwkJLmZpcnN0X2J5dGUJPSAweDIzLAorCisJCS53cml0ZQkJPSAxLAorCQkucmVzcG9uc2UJPSAmYnNzbWFwX3JlbGVhc2VfY29tcGxldGVbMF0sCisJCS5yZXNwb25zZV9sZW5ndGg9IEFSUkFZX1NJWkUoYnNzbWFwX3JlbGVhc2VfY29tcGxldGUpLAorCX0sCit9OworCisvKiB3ZSB3aWxsIHNlbmQgVURUcyBhbmQgdmVyaWZ5IHRoZXkgbG9vayBsaWtlIHRoaXMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdGVzdF9kYXRhIHNlbmRfZGF0YVtdID0geworCXsKKwkJLmxlbmd0aAkJPSBBUlJBWV9TSVpFKGJzc21hcF91ZHQpLAorCQkuZGF0YQkJPSAmYnNzbWFwX3VkdFswXSwKKwkJLnBheWxvYWRfc3RhcnQJPSAxMiwKKwkJLnBheWxvYWRfbGVuZ3RoID0gQVJSQVlfU0laRShic3NtYXBfdWR0KSAtIDEyLAorCQkuZmlyc3RfYnl0ZQk9IDB4MCwKKwl9LAorCXsKKwkJLmxlbmd0aAkJPSBBUlJBWV9TSVpFKGJzc21hcF9yZXNldCksCisJCS5kYXRhCQk9ICZic3NtYXBfcmVzZXRbMF0sCisJCS5wYXlsb2FkX3N0YXJ0CT0gMTIsCisJCS5wYXlsb2FkX2xlbmd0aCA9IEFSUkFZX1NJWkUoYnNzbWFwX3Jlc2V0KSAtIDEyLAorCQkuZmlyc3RfYnl0ZQk9IDB4MCwKKwl9LAorfTsKKworc3RydWN0IGNvbm5lY3Rpb25fdGVzdCB7CisJLyogc2hvdWxkIHRoZSBjb25uZWN0aW9uIGJlIHJlZnVzZWQ/ICovCisJaW50IHJlZnVzZTsKKworCWludCB3aXRoX2RhdGE7CisKKwkvKiBvbiB3aGljaCBzaWRlIHRvIGNsb3NlIHRoZSBjb25uZWN0aW9uPyAqLworCWludCBjbG9zZV9zaWRlOworCWludCBjbG9zZV9jYXVzZTsKK307CisKKy8qIHNjY3AgY29ubmVjdGlvbiBoYW5kbGluZyB3ZSB3YW50IHRvIHRlc3QgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29ubmVjdGlvbl90ZXN0IGNvbm5lY3Rpb25fdGVzdHNbXSA9IHsKKwl7CisJCS5yZWZ1c2UJPSAxLAorCX0sCisJeworCQkucmVmdXNlCT0gMSwKKwkJLndpdGhfZGF0YSA9IDEsCisJfSwKKwl7CisJCS5yZWZ1c2UgPSAwLAorCQkuY2xvc2Vfc2lkZSA9IDAsCisJCS5jbG9zZV9jYXVzZSA9IDUsCisJfSwKKwl7CisJCS5yZWZ1c2UgPSAwLAorCQkuY2xvc2Vfc2lkZSA9IDAsCisJCS5jbG9zZV9jYXVzZSA9IDUsCisJCS53aXRoX2RhdGEgPSAxLAorCX0sCisJeworCQkucmVmdXNlID0gMCwKKwkJLmNsb3NlX3NpZGUgPSAxLAorCQkuY2xvc2VfY2F1c2UgPSA1LAorCX0sCisJeworCQkucmVmdXNlID0gMCwKKwkJLmNsb3NlX3NpZGUgPSAxLAorCQkuY2xvc2VfY2F1c2UgPSA1LAorCQkud2l0aF9kYXRhID0gMSwKKwl9LAorfTsKKworc3RydWN0IHNjY3BfcGFyc2VfaGVhZGVyX3Jlc3VsdCB7CisJLyogcmVzdWx0cyAqLworCWludCBtc2dfdHlwZTsKKwlpbnQgd2FudGVkX2xlbjsKKwlpbnQgc3JjX3NzbjsKKwlpbnQgZHN0X3NzbjsKKworCWludCBoYXNfc3JjX3JlZiwgaGFzX2RzdF9yZWY7CisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSBzcmNfcmVmOworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UgZHN0X3JlZjsKKworCS8qIHRoZSBpbnB1dCAqLworCWNvbnN0IHVfaW50OF90ICppbnB1dDsKKwlpbnQgaW5wdXRfbGVuOworfTsKKworc3RhdGljIGNvbnN0IHVfaW50OF90IGl0X3Rlc3RbXSA9IHsKKzB4MTAsIDB4MDEsIDB4MDcsIAorMHg5NCwgMHgwMSwgMHgwNCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCB9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNjY3BfcGFyc2VfaGVhZGVyX3Jlc3VsdCBwYXJzZV9yZXN1bHRbXSA9IHsKKwl7CisJCS5tc2dfdHlwZQk9IFNDQ1BfTVNHX1RZUEVfSVQsCisJCS53YW50ZWRfbGVuCT0gMCwKKwkJLnNyY19zc24JPSAtMSwKKwkJLmRzdF9zc24JPSAtMSwKKwkJLmhhc19zcmNfcmVmCT0gMSwKKwkJLmhhc19kc3RfcmVmCT0gMSwKKworCQkuc3JjX3JlZgk9IHsKKwkJCS5vY3RldDEgPSAweDAxLAorCQkJLm9jdGV0MiA9IDB4MDQsCisJCQkub2N0ZXQzID0gMHgwMAorCQl9LAorCQkuZHN0X3JlZgk9IHsKKwkJCS5vY3RldDEgPSAweDAxLAorCQkJLm9jdGV0MiA9IDB4MDcsCisJCQkub2N0ZXQzID0gMHg5NCwKKwkJfSwKKworCQkuaW5wdXQJCT0gaXRfdGVzdCwKKwkJLmlucHV0X2xlbgk9IHNpemVvZihpdF90ZXN0KSwKKwl9LAorfTsKKworCisvKiB0ZXN0aW5nIHByb2NlZHVyZToKKyAqCS0gd2Ugd2lsbCB1c2Ugc2NjcF93cml0ZSBhbmQgc2VlIHdoYXQgd2lsbCBiZSBzZXQgaW4gdGhlCisgKgkgIG91dGdvaW5nIGNhbGxiYWNrCisgKgktIHdlIHdpbGwgY2FsbCBzY2NwX3N5c3RlbV9pbmNvbWluZyBhbmQgc2VlIHdoaWNoIGNhbGxzCisgKgkgIGFyZSBtYWRlLiBBbmQgdGhlbiBjb21wYXJlIGl0IHRvIHRoZSBvbmVzIHdlIGV4cGVjdC4gV2UKKyAqCSAgd2FudCB0aGUgcGF5bG9hZCB0byBhcnJpdmUsIG9yIGNhbGxiYWNrcyB0byBiZSBjYWxsZWQuCisgKgktIHdlIHdpbGwgdXNlIHNjY3BfY29ubmVjdGlvbl9zb2NrZXQgYW5kIHNjY3BfY29ubmVjdGlvbl93cml0ZQorICoJICBhbmQgdmVyaWZ5IHN0YXRlIGhhbmRsaW5nIG9mIGNvbm5lY3Rpb25zCisgKi8KKworc3RhdGljIGludCBjdXJyZW50X3Rlc3Q7CisKKy8qCisgKiB0ZXN0IHN0YXRlLi4uCisgKi8KK3N0YXRpYyBpbnQgY2FsbGVkICA9IDA7CitzdGF0aWMgaW50IG1hdGNoZWQgPSAwOworc3RhdGljIGludCB3cml0ZV9jYWxsZWQgPSAwOworCisjZGVmaW5lIEZBSUwoeCwgYXJncy4uLikgcHJpbnRmKCJGQUlMVVJFIGluICVzOiVkOiAiIHgsIF9fRklMRV9fLCBfX0xJTkVfXywgIyMgYXJncykKKworLyoKKyAqIHdyaXRpbmcgdGhlc2UgcGFja2V0cyBhbmQgZXhwZWN0aW5nIGEgcmVzdWx0CisgKi8KK2ludCBzY2NwX3JlYWRfY2Ioc3RydWN0IG1zZ2IgKmRhdGEsIHVuc2lnbmVkIGxlbiwgdm9pZCAqY29udGV4dCkKK3sKKwl1X2ludDE2X3QgcGF5bG9hZF9sZW5ndGggPSB0ZXN0X2RhdGFbY3VycmVudF90ZXN0XS5wYXlsb2FkX2xlbmd0aDsKKwljb25zdCB1X2ludDhfdCAqZ290LCAqd2FudGVkOworCWludCBpOworCisJY2FsbGVkID0gMTsKKworCWlmIChtc2diX2wzbGVuKGRhdGEpIDwgbGVuKSB7CisJCS8qIHRoaXMgc2hvdWxkIG5ldmVyIGJlIHJlYWNoZWQgKi8KKwkJRkFJTCgiU29tZXRoaW5nIGhvcnJpYmxlIGhhcHBlbmVkLi4gaW52YWxpZCBwYWNrZXQuLlxuIik7CisJCWV4aXQoLTEpOworCX0KKworCWlmIChsZW4gPT0gMCB8fCBsZW4gIT0gcGF5bG9hZF9sZW5ndGgpIHsKKwkJRkFJTCgibGVuZ3RoIG1pc21hdGNoOiBnb3Q6ICVkIHdhbnRlZDogJWRcbiIsIG1zZ2JfbDNsZW4oZGF0YSksIHBheWxvYWRfbGVuZ3RoKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChkYXRhLT5sM2hbMF0gIT0gIHRlc3RfZGF0YVtjdXJyZW50X3Rlc3RdLmZpcnN0X2J5dGUpIHsKKwkJRkFJTCgiVGhlIGZpcnN0IGJ5dGVzIG9mIGwzIGRvIG5vdCBtYXRjaDogMHgleCAweCV4XG4iLAorCQkJZGF0YS0+bDNoWzBdLCB0ZXN0X2RhdGFbY3VycmVudF90ZXN0XS5maXJzdF9ieXRlKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWdvdCA9ICZkYXRhLT5sM2hbMF07CisJd2FudGVkID0gdGVzdF9kYXRhW2N1cnJlbnRfdGVzdF0uZGF0YSArIHRlc3RfZGF0YVtjdXJyZW50X3Rlc3RdLnBheWxvYWRfc3RhcnQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKwkJaWYgKGdvdFtpXSAhPSB3YW50ZWRbaV0pIHsKKwkJCUZBSUwoIkZhaWxlZCB0byBjb21wYXJlIGJ5dGUuIEdvdDogMHgleCBXYW50ZWQ6IDB4JXggYXQgJWRcbiIsCisJCQkgICAgIGdvdFtpXSwgd2FudGVkW2ldLCBpKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCW1hdGNoZWQgPSAxOworCXJldHVybiAwOworfQorCitpbnQgc2NjcF93cml0ZV9jYihzdHJ1Y3QgbXNnYiAqZGF0YSwgdm9pZCAqY3R4KQoreworCWludCBpID0gMDsKKwljb25zdCB1X2ludDhfdCAqZ290LCAqd2FudGVkOworCisJaWYgKHRlc3RfZGF0YVtjdXJyZW50X3Rlc3RdLnJlc3BvbnNlID09IE5VTEwpIHsKKwkJRkFJTCgiRGlkbid0IGV4cGVjdCB3cml0ZSBjYWxsYmFja1xuIik7CisJCXJldHVybiAtMTsKKwl9IGVsc2UgaWYgKHRlc3RfZGF0YVtjdXJyZW50X3Rlc3RdLnJlc3BvbnNlX2xlbmd0aCAhPSBtc2diX2wybGVuKGRhdGEpKSB7CisJCUZBSUwoIlNpemUgZG9lcyBub3QgbWF0Y2guIEdvdDogJWQgV2FudGVkOiAlZFxuIiwKKwkJICAgICBtc2diX2wybGVuKGRhdGEpLCB0ZXN0X2RhdGFbY3VycmVudF90ZXN0XS5yZXNwb25zZV9sZW5ndGgpOworCX0KKworCWdvdCA9ICZkYXRhLT5sMmhbMF07CisJd2FudGVkID0gdGVzdF9kYXRhW2N1cnJlbnRfdGVzdF0ucmVzcG9uc2U7CisKKwlmb3IgKGkgPSAwOyBpIDwgbXNnYl9sMmxlbihkYXRhKTsgKytpKSB7CisJCWlmIChnb3RbaV0gIT0gd2FudGVkW2ldKSB7CisJCQlGQUlMKCJGYWlsZWQgdG8gY29tcGFyZSBieXRlLiBHb3Q6IDB4JXggV2FudGVkOiAweCV4IGF0ICVkXG4iLAorCQkJICAgICBnb3RbaV0sIHdhbnRlZFtpXSwgaSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwl3cml0ZV9jYWxsZWQgPSAxOworCXJldHVybiAwOworfQorCit2b2lkIHNjY3BfY19yZWFkKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHN0cnVjdCBtc2diICptc2diLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXNjY3BfcmVhZF9jYihtc2diLCBsZW4sIGNvbm5lY3Rpb24tPmRhdGFfY3R4KTsKK30KKwordm9pZCBzY2NwX2Nfc3RhdGUoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgaW50IG9sZF9zdGF0ZSkKK3sKKwlpZiAoY29ubmVjdGlvbi0+Y29ubmVjdGlvbl9zdGF0ZSA+PSBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfUkVMRUFTRV9DT01QTEVURSkKKwkJc2NjcF9jb25uZWN0aW9uX2ZyZWUoY29ubmVjdGlvbik7Cit9CisKK2ludCBzY2NwX2FjY2VwdF9jYihzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCB2b2lkICp1c2VyX2RhdGEpCit7CisJY2FsbGVkID0gMTsKKwl1bnNpZ25lZCBpbnQgcmVmID0gMDsKKwlyZWYgfD0gY29ubmVjdGlvbi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLm9jdGV0MSA8PCAyNDsKKwlyZWYgfD0gY29ubmVjdGlvbi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLm9jdGV0MiA8PCAxNjsKKwlyZWYgfD0gY29ubmVjdGlvbi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLm9jdGV0MyA8PCAgODsKKwlyZWYgPSBudG9obChyZWYpOworCisJY29ubmVjdGlvbi0+ZGF0YV9jYiA9IHNjY3BfY19yZWFkOworCWNvbm5lY3Rpb24tPnN0YXRlX2NiID0gc2NjcF9jX3N0YXRlOworCisJLyogYWNjZXB0IHRoaXMgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzY2NwX3VkdF93cml0ZV9jYihzdHJ1Y3QgbXNnYiAqZGF0YSwgdm9pZCAqY29udGV4dCkKK3sKKwljb25zdCB1X2ludDhfdCAqZ290LCAqd2FudGVkOworCWludCBpOworCisJd3JpdGVfY2FsbGVkID0gMTsKKworCWlmIChzZW5kX2RhdGFbY3VycmVudF90ZXN0XS5sZW5ndGggIT0gbXNnYl9sMmxlbihkYXRhKSkgeworCQlGQUlMKCJTaXplIGRvZXMgbm90IG1hdGNoLiBHb3Q6ICVkIFdhbnRlZDogJWRcbiIsCisJCSAgICAgbXNnYl9sMmxlbihkYXRhKSwgc2VuZF9kYXRhW2N1cnJlbnRfdGVzdF0ubGVuZ3RoKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWdvdCA9ICZkYXRhLT5sMmhbMF07CisJd2FudGVkID0gc2VuZF9kYXRhW2N1cnJlbnRfdGVzdF0uZGF0YTsKKworCWZvciAoaSA9IDA7IGkgPCBtc2diX2wybGVuKGRhdGEpOyArK2kpIHsKKwkJaWYgKGdvdFtpXSAhPSB3YW50ZWRbaV0pIHsKKwkJCUZBSUwoIkZhaWxlZCB0byBjb21wYXJlIGJ5dGUuIEdvdDogMHgleCBXYW50ZWQ6IDB4JXggYXQgJWRcbiIsCisJCQkgICAgIGdvdFtpXSwgd2FudGVkW2ldLCBpKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCW1hdGNoZWQgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X3NjY3Bfc3lzdGVtKHZvaWQpCit7CisJc2NjcF9zeXN0ZW1faW5pdChzY2NwX3dyaXRlX2NiLCBOVUxMKTsKKwlzY2NwX3NldF9yZWFkKCZzY2NwX3Nzbl9ic3NhcCwgc2NjcF9yZWFkX2NiLCBOVUxMKTsKKwlzY2NwX2Nvbm5lY3Rpb25fc2V0X2luY29taW5nKCZzY2NwX3Nzbl9ic3NhcCwgc2NjcF9hY2NlcHRfY2IsIE5VTEwpOworCisJZm9yIChjdXJyZW50X3Rlc3QgPSAwOyBjdXJyZW50X3Rlc3QgPCBBUlJBWV9TSVpFKHRlc3RfZGF0YSk7ICsrY3VycmVudF90ZXN0KSB7CisJCXVuc2lnbmVkIGludCBsZW5ndGggPSB0ZXN0X2RhdGFbY3VycmVudF90ZXN0XS5sZW5ndGg7CisJCXN0cnVjdCBtc2diICptc2cgPSBtc2diX2FsbG9jX2hlYWRyb29tKGxlbmd0aCArIDIsIDIsIF9fZnVuY19fKTsKKwkJbXNnLT5sMmggPSBtc2diX3B1dChtc2csIGxlbmd0aCk7CisJCW1lbWNweShtc2ctPmwyaCwgdGVzdF9kYXRhW2N1cnJlbnRfdGVzdF0uZGF0YSwgbGVuZ3RoKTsKKworCQljYWxsZWQgPSBtYXRjaGVkID0gd3JpdGVfY2FsbGVkID0gMDsKKwkJcHJpbnRmKCJUZXN0aW5nIHBhY2tldDogJWRcbiIsIGN1cnJlbnRfdGVzdCk7CisJCXNjY3Bfc3lzdGVtX2luY29taW5nKG1zZyk7CisKKwkJaWYgKCFjYWxsZWQgfHwgIW1hdGNoZWQgfHwgKHRlc3RfZGF0YVtjdXJyZW50X3Rlc3RdLndyaXRlICE9IHdyaXRlX2NhbGxlZCkpCisJCQlGQUlMKCJjdXJyZW50IHRlc3Q6ICVkIGNhbGxlZDogJWQgbWF0Y2hlZDogJWQgd3JpdGU6ICVkXG4iLAorCQkJICAgICBjdXJyZW50X3Rlc3QsIGNhbGxlZCwgbWF0Y2hlZCwgd3JpdGVfY2FsbGVkKTsKKworCQltc2diX2ZyZWUobXNnKTsKKwl9Cit9CisKKy8qIHRlc3Qgc2VuZGluZyBvZiB1ZHQgKi8KK3N0YXRpYyB2b2lkIHRlc3Rfc2NjcF9zZW5kX3VkdCh2b2lkKQoreworCXNjY3Bfc3lzdGVtX2luaXQoc2NjcF91ZHRfd3JpdGVfY2IsIE5VTEwpOworCXNjY3Bfc2V0X3JlYWQoTlVMTCwgTlVMTCwgTlVMTCk7CisJc2NjcF9jb25uZWN0aW9uX3NldF9pbmNvbWluZyhOVUxMLCBOVUxMLCBOVUxMKTsKKworCWZvciAoY3VycmVudF90ZXN0ID0gMDsgY3VycmVudF90ZXN0IDwgQVJSQVlfU0laRShzZW5kX2RhdGEpOyArK2N1cnJlbnRfdGVzdCkgeworCQljb25zdCBzdHJ1Y3QgdGVzdF9kYXRhICp0ZXN0ID0gJnNlbmRfZGF0YVtjdXJyZW50X3Rlc3RdOworCisJCXN0cnVjdCBtc2diICptc2cgPSBtc2diX2FsbG9jKHRlc3QtPnBheWxvYWRfbGVuZ3RoLCBfX2Z1bmNfXyk7CisJCW1zZy0+bDNoID0gbXNnYl9wdXQobXNnLCB0ZXN0LT5wYXlsb2FkX2xlbmd0aCk7CisJCW1lbWNweShtc2ctPmwzaCwgdGVzdC0+ZGF0YSArIHRlc3QtPnBheWxvYWRfc3RhcnQsIHRlc3QtPnBheWxvYWRfbGVuZ3RoKTsKKworCQltYXRjaGVkID0gd3JpdGVfY2FsbGVkID0gMDsKKwkJcHJpbnRmKCJUZXN0aW5nIHBhY2tldDogJWRcbiIsIGN1cnJlbnRfdGVzdCk7CisJCXNjY3Bfd3JpdGUobXNnLCAmc2NjcF9zc25fYnNzYXAsICZzY2NwX3Nzbl9ic3NhcCwgMCk7CisKKwkJaWYgKCFtYXRjaGVkIHx8ICF3cml0ZV9jYWxsZWQpCisJCQlGQUlMKCJjdXJyZW50IHRlc3Q6ICVkIG1hdGNoZWQ6ICVkIHdyaXRlOiAlZFxuIiwKKwkJCSAgICAgY3VycmVudF90ZXN0LCBtYXRjaGVkLCB3cml0ZV9jYWxsZWQpOworCisJCW1zZ2JfZnJlZShtc2cpOworCX0KK30KKworLyogc2VuZCB1ZHQgZnJvbSBvbmUgZW5kIHRvIGFub3RoZXIgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdGVzdF92YWx1ZSA9IDB4MjQ0MjsKK3N0YXRpYyBpbnQgc2NjcF91ZHRfcmVhZChzdHJ1Y3QgbXNnYiAqZGF0YSwgdW5zaWduZWQgaW50IGxlbiwgdm9pZCAqY29udGV4dCkKK3sKKwl1bnNpZ25lZCBpbnQgKnZhbDsKKworCWlmIChsZW4gIT0gNCkgeworCQlGQUlMKCJXcm9uZyBzaXplOiAlZFxuIiwgbXNnYl9sM2xlbihkYXRhKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwl2YWwgPSAodW5zaWduZWQgaW50KilkYXRhLT5sM2g7CisJbWF0Y2hlZCA9IHRlc3RfdmFsdWUgPT0gKnZhbDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNjY3Bfd3JpdGVfbG9vcChzdHJ1Y3QgbXNnYiAqZGF0YSwgdm9pZCAqY29udGV4dCkKK3sKKwkvKiBzZW5kIGl0IGJhY2sgdG8gdXMgKi8KKwlzY2NwX3N5c3RlbV9pbmNvbWluZyhkYXRhKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdGVzdF9zY2NwX3VkdF9jb21tdW5pY2F0aW9uKHZvaWQpCit7CisJc3RydWN0IG1zZ2IgKmRhdGE7CisJdW5zaWduZWQgaW50ICp2YWw7CisKKwlzY2NwX3N5c3RlbV9pbml0KHNjY3Bfd3JpdGVfbG9vcCwgTlVMTCk7CisJc2NjcF9zZXRfcmVhZCgmc2NjcF9zc25fYnNzYXAsIHNjY3BfdWR0X3JlYWQsIE5VTEwpOworCXNjY3BfY29ubmVjdGlvbl9zZXRfaW5jb21pbmcoTlVMTCwgTlVMTCwgTlVMTCk7CisKKworCWRhdGEgPSBtc2diX2FsbG9jKDQsICJ0ZXN0IGRhdGEiKTsKKwlkYXRhLT5sM2ggPSAmZGF0YS0+ZGF0YVswXTsKKwl2YWwgPSAodW5zaWduZWQgaW50ICopbXNnYl9wdXQoZGF0YSwgNCk7CisJKnZhbCA9IHRlc3RfdmFsdWU7CisKKwltYXRjaGVkID0gMDsKKwlzY2NwX3dyaXRlKGRhdGEsICZzY2NwX3Nzbl9ic3NhcCwgJnNjY3Bfc3NuX2Jzc2FwLCAwKTsKKworCWlmICghbWF0Y2hlZCkKKwkgICAgRkFJTCgiVGFsa2luZyB3aXRoIHVzIGRpZG4ndCB3b3JrXG4iKTsKKworCW1zZ2JfZnJlZShkYXRhKTsKK30KKworCisvKiBjb25uZWN0aW9uIHRlc3RpbmcuLi4gb3Blbiwgc2VuZCwgY2xvc2UgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29ubmVjdGlvbl90ZXN0ICpjdXJyZW50X2Nvbl90ZXN0Oworc3RhdGljIHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKm91dGdvaW5nX2NvbjsKK3N0YXRpYyBzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICppbmNvbWluZ19jb247CitzdGF0aWMgaW50IG91dGdvaW5nX2RhdGEsIGluY29taW5nX2RhdGEsIGluY29taW5nX3N0YXRlLCBvdXRnb2luZ19zdGF0ZTsKKworc3RhdGljIHN0cnVjdCBtc2diICp0ZXN0X2RhdGExLCAqdGVzdF9kYXRhMiwgKnRlc3RfZGF0YTM7CisKK3N0YXRpYyB2b2lkIHNjY3BfY29ubl9pbl9zdGF0ZShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uLCBpbnQgb2xkX3N0YXRlKQoreworCXByaW50ZigiXHRpbmNvbWU6ICVkIC0+ICVkXG4iLCBvbGRfc3RhdGUsIGNvbm4tPmNvbm5lY3Rpb25fc3RhdGUpOworCWlmIChjb25uLT5jb25uZWN0aW9uX3N0YXRlID49IFNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRUxFQVNFX0NPTVBMRVRFKSB7CisJCWlmIChjb25uID09IGluY29taW5nX2NvbikgeworCQkJc2NjcF9jb25uZWN0aW9uX2ZyZWUoY29ubik7CisJCQlpbmNvbWluZ19jb24gPSBOVUxMOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBzY2NwX2Nvbm5faW5fZGF0YShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uLCBzdHJ1Y3QgbXNnYiAqbXNnLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCS8qIGNvbXBhcmUgdGhlIGRhdGEgKi8KKwkrK2luY29taW5nX2RhdGE7CisJcHJpbnRmKCJcdGluY29taW5nIGRhdGE6ICVkXG4iLCBsZW4pOworCisJLyogY29tcGFyZSB0aGUgZGF0YSAqLworCWlmIChsZW4gIT0gNCkgeworCQlGQUlMKCJMZW5ndGggb2YgcGFja2V0IGlzIHdyb25nOiAldSAldVxuIiwgbXNnYl9sM2xlbihtc2cpLCBsZW4pOworCQlyZXR1cm47CisJfQorCisJaWYgKGluY29taW5nX2RhdGEgPT0gMSkgeworCQlpZiAobWVtY21wKG1zZy0+bDNoLCB0ZXN0X2RhdGExLT5sM2gsIGxlbikgIT0gMCkgeworCQkJRkFJTCgiQ29tcGFyaW5nIHRoZSBkYXRhIGZhaWxlZDogJWRcbiIsIGluY29taW5nX2RhdGEpOworCQkJaW5jb21pbmdfc3RhdGUgPSAwOworCQkJcHJpbnRmKCJHb3Q6ICAgICVzXG4iLCBoZXhkdW1wKG1zZy0+bDNoLCBsZW4pKTsKKwkJCXByaW50ZigiV2FudGVkOiAlc1xuIiwgaGV4ZHVtcCh0ZXN0X2RhdGExLT5sM2gsIGxlbikpOworCisJCX0KKwl9IGVsc2UgaWYgKGluY29taW5nX2RhdGEgPT0gMikgeworCQlpZiAobWVtY21wKG1zZy0+bDNoLCB0ZXN0X2RhdGEyLT5sM2gsIGxlbikgIT0gMCkgeworCQkJRkFJTCgiQ29tcGFyaW5nIHRoZSBkYXRhIGZhaWxlZDogJWRcbiIsIGluY29taW5nX2RhdGEpOworCQkJaW5jb21pbmdfc3RhdGUgPSAwOworCQkJcHJpbnRmKCJHb3Q6ICAgICVzXG4iLCBoZXhkdW1wKG1zZy0+bDNoLCBsZW4pKTsKKwkJCXByaW50ZigiV2FudGVkOiAlc1xuIiwgaGV4ZHVtcCh0ZXN0X2RhdGEyLT5sM2gsIGxlbikpOworCQl9CisJfQorCisJLyogc2VuZGluZyBvdXQgZGF0YSAqLworCWlmIChpbmNvbWluZ19kYXRhID09IDIpIHsKKwkJcHJpbnRmKCJcdFJldHVybmluZyBkYXRhM1xuIik7CisJCXNjY3BfY29ubmVjdGlvbl93cml0ZShjb25uLCB0ZXN0X2RhdGEzKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc2NjcF9jb25uX2FjY2VwdChzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uLCB2b2lkICpjdHgpCit7CisJcHJpbnRmKCJcdGFjY2VwdDogJXBcbiIsIGNvbm4pOworCWNvbm4tPnN0YXRlX2NiID0gc2NjcF9jb25uX2luX3N0YXRlOworCWNvbm4tPmRhdGFfY2IgPSBzY2NwX2Nvbm5faW5fZGF0YTsKKworCWlmIChjdXJyZW50X2Nvbl90ZXN0LT5yZWZ1c2UpCisJCXJldHVybiAtMTsKKworCWluY29taW5nX2NvbiA9IGNvbm47CisJcmV0dXJuIDA7Cit9CisKKy8qIGNhbGxiYWNrcyBmb3IgdGhlIG91dGdvaW5nIHNpZGUgKi8KK3N0YXRpYyB2b2lkIHNjY3BfY29ubl9vdXRfc3RhdGUoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubiwgaW50IG9sZF9zdGF0ZSkKK3sKKwlwcmludGYoIlx0b3V0Z29pbmc6ICVwICVkIC0+ICVkXG4iLCBjb25uLCBvbGRfc3RhdGUsIGNvbm4tPmNvbm5lY3Rpb25fc3RhdGUpOworCisJaWYgKGNvbm4tPmNvbm5lY3Rpb25fc3RhdGUgPj0gU0NDUF9DT05ORUNUSU9OX1NUQVRFX1JFTEVBU0VfQ09NUExFVEUpIHsKKwkJaWYgKGNvbm4gPT0gb3V0Z29pbmdfY29uKSB7CisJCQlzY2NwX2Nvbm5lY3Rpb25fZnJlZShjb25uKTsKKwkJCW91dGdvaW5nX2NvbiA9IE5VTEw7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNjY3BfY29ubl9vdXRfZGF0YShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uLCBzdHJ1Y3QgbXNnYiAqbXNnLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCSsrb3V0Z29pbmdfZGF0YTsKKwlwcmludGYoIlx0b3V0Z29pbmcgZGF0YTogJXAgJWRcbiIsIGNvbm4sIGxlbik7CisKKwlpZiAobGVuICE9IDQpCisJCUZBSUwoIkxlbmd0aCBvZiBwYWNrZXQgaXMgd3Jvbmc6ICV1ICV1XG4iLCBtc2diX2wzbGVuKG1zZyksIGxlbik7CisKKwlpZiAob3V0Z29pbmdfZGF0YSA9PSAxKSB7CisJCWlmIChtZW1jbXAobXNnLT5sM2gsIHRlc3RfZGF0YTMtPmwzaCwgbGVuKSAhPSAwKSB7CisJCQlGQUlMKCJDb21wYXJpbmcgdGhlIGRhdGEgZmFpbGVkXG4iKTsKKwkJCW91dGdvaW5nX3N0YXRlID0gMDsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZG9fdGVzdF9zY2NwX2Nvbm5lY3Rpb24oY29uc3Qgc3RydWN0IGNvbm5lY3Rpb25fdGVzdCAqdGVzdCkKK3sKKwlpbnQgcmV0OworCisJY3VycmVudF9jb25fdGVzdCA9IHRlc3Q7CisJb3V0Z29pbmdfY29uID0gaW5jb21pbmdfY29uID0gMDsKKworCW91dGdvaW5nX2NvbiA9IHNjY3BfY29ubmVjdGlvbl9zb2NrZXQoKTsKKwlpZiAoIW91dGdvaW5nX2NvbikgeworCQlGQUlMKCJDb25uZWN0aW9uIGlzIE5VTExcbiIpOworCQlyZXR1cm47CisJfQorCisJb3V0Z29pbmdfY29uLT5zdGF0ZV9jYiA9IHNjY3BfY29ubl9vdXRfc3RhdGU7CisJb3V0Z29pbmdfY29uLT5kYXRhX2NiID0gc2NjcF9jb25uX291dF9kYXRhOworCW91dGdvaW5nX2RhdGEgPSBpbmNvbWluZ19kYXRhID0gMDsKKwlpbmNvbWluZ19zdGF0ZSA9IG91dGdvaW5nX3N0YXRlID0gMTsKKworCS8qIHN0YXJ0IHRlc3RpbmcgKi8KKwlpZiAodGVzdC0+d2l0aF9kYXRhKSB7CisJCWlmIChzY2NwX2Nvbm5lY3Rpb25fY29ubmVjdChvdXRnb2luZ19jb24sICZzY2NwX3Nzbl9ic3NhcCwgdGVzdF9kYXRhMSkgIT0gMCkKKwkJCUZBSUwoIkJpbmRpbmcgZmFpbGVkXG4iKTsKKwl9IGVsc2UgeworCQkrK2luY29taW5nX2RhdGE7CisJCWlmIChzY2NwX2Nvbm5lY3Rpb25fY29ubmVjdChvdXRnb2luZ19jb24sICZzY2NwX3Nzbl9ic3NhcCwgTlVMTCkgIT0gMCkKKwkJCUZBSUwoIkJpbmRpbmcgZmFpbGVkXG4iKTsKKwl9CisKKwlpZiAodGVzdC0+cmVmdXNlKSB7CisJCWlmIChvdXRnb2luZ19jb24pCisJCQlGQUlMKCJPdXRnb2luZyBjb25uZWN0aW9uIHNob3VsZCBoYXZlIGJlZW4gcmVmdXNlZC5cbiIpOworCX0gZWxzZSB7CisJCWlmICghaW5jb21pbmdfY29uKQorCQkJRkFJTCgiQ3JlYXRpbmcgaW5jb21pbmcgZGlkbid0IHdvcmsuXG4iKTsKKworCQlwcmludGYoIlx0V3JpdGluZyB0ZXN0IGRhdGEyXG4iKTsKKwkJc2NjcF9jb25uZWN0aW9uX3dyaXRlKG91dGdvaW5nX2NvbiwgdGVzdF9kYXRhMik7CisJCXNjY3BfY29ubmVjdGlvbl9zZW5kX2l0KG91dGdvaW5nX2Nvbik7CisKKwkJLyogY2xvc2luZyBjb25uZWN0aW9uICovCisJCWlmICh0ZXN0LT5jbG9zZV9zaWRlID09IDApCisJCQlyZXQgPSBzY2NwX2Nvbm5lY3Rpb25fY2xvc2Uob3V0Z29pbmdfY29uLCAwKTsKKwkJZWxzZQorCQkJcmV0ID0gc2NjcF9jb25uZWN0aW9uX2Nsb3NlKGluY29taW5nX2NvbiwgMCk7CisKKwkJaWYgKHJldCAhPSAwKQorCQkJRkFJTCgiQ2xvc2luZyB0aGUgY29ubmVjdGlvbiBmYWlsZWRcbiIpOworCX0KKworCS8qIG91dGdvaW5nIHNob3VsZCBiZSBnb25lIG5vdyAqLworCWlmIChvdXRnb2luZ19jb24pCisJCUZBSUwoIk91dGdvaW5nIGNvbm5lY3Rpb24gd2FzIG5vdCBwcm9wZXJseSBjbG9zZWRcbiIpOworCisJaWYgKGluY29taW5nX2NvbikKKwkJRkFJTCgiSW5jb21pbmcgY29ubmVjdGlvbiB3YXMgbm90IHByb3BlcnkgY2xvc2VkLlxuIik7CisKKwlpZiAodGVzdC0+cmVmdXNlID09IDApIHsKKwkJaWYgKG91dGdvaW5nX2RhdGEgIT0gMSB8fCBpbmNvbWluZ19kYXRhICE9IDIpIHsKKwkJCUZBSUwoIkRhdGEgc2VuZGluZyBmYWlsZWQ6ICVkLyVkICVkLyVkXG4iLAorCQkJICAgICBvdXRnb2luZ19kYXRhLCAxLAorCQkJICAgICBpbmNvbWluZ19kYXRhLCAyKTsKKwkJfQorCX0KKworCWlmICghaW5jb21pbmdfc3RhdGUgfHwgIW91dGdvaW5nX3N0YXRlKQorCQlGQUlMKCJGYWlsdXJlIHdpdGggdGhlIHN0YXRlIHRyYW5zaXRpb24uICVkICVkXG4iLAorCQkgICAgIG91dGdvaW5nX3N0YXRlLCBpbmNvbWluZ19zdGF0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3Rfc2NjcF9jb25uZWN0aW9uKHZvaWQpCit7CisJc2NjcF9zeXN0ZW1faW5pdChzY2NwX3dyaXRlX2xvb3AsIE5VTEwpOworCXNjY3Bfc2V0X3JlYWQoTlVMTCwgTlVMTCwgTlVMTCk7CisJc2NjcF9jb25uZWN0aW9uX3NldF9pbmNvbWluZygmc2NjcF9zc25fYnNzYXAsIHNjY3BfY29ubl9hY2NlcHQsIE5VTEwpOworCisJdGVzdF9kYXRhMSA9IG1zZ2JfYWxsb2MoNCwgImRhdGExIik7CisJdGVzdF9kYXRhMS0+bDNoID0gbXNnYl9wdXQodGVzdF9kYXRhMSwgNCk7CisJKigodW5zaWduZWQgaW50Kil0ZXN0X2RhdGExLT5sM2gpID0gMHgyMzQyMTEyMjsKKworCXRlc3RfZGF0YTIgPSBtc2diX2FsbG9jKDQsICJkYXRhMiIpOworCXRlc3RfZGF0YTItPmwzaCA9IG1zZ2JfcHV0KHRlc3RfZGF0YTIsIDQpOworCSooKHVuc2lnbmVkIGludCopdGVzdF9kYXRhMi0+bDNoKSA9IDB4NDIyMzIyMTE7CisKKwl0ZXN0X2RhdGEzID0gbXNnYl9hbGxvYyg0LCAiZGF0YTMiKTsKKwl0ZXN0X2RhdGEzLT5sM2ggPSBtc2diX3B1dCh0ZXN0X2RhdGEzLCA0KTsKKwkqKCh1bnNpZ25lZCBpbnQqKXRlc3RfZGF0YTMtPmwzaCkgPSAweDIzMjNmZjU1OworCisKKwlmb3IgKGN1cnJlbnRfdGVzdCA9IDA7IGN1cnJlbnRfdGVzdCA8IEFSUkFZX1NJWkUoY29ubmVjdGlvbl90ZXN0cyk7ICsrY3VycmVudF90ZXN0KSB7CisJCXByaW50ZigiVGVzdGluZyAlZCByZWZ1c2U6ICVkIHdpdGhfZGF0YTogJWRcbiIsCisJCQljdXJyZW50X3Rlc3QsIGNvbm5lY3Rpb25fdGVzdHNbY3VycmVudF90ZXN0XS5yZWZ1c2UsCisJCQljb25uZWN0aW9uX3Rlc3RzW2N1cnJlbnRfdGVzdF0ud2l0aF9kYXRhKTsKKwkJZG9fdGVzdF9zY2NwX2Nvbm5lY3Rpb24oJmNvbm5lY3Rpb25fdGVzdHNbY3VycmVudF90ZXN0XSk7CisJfQorCisJbXNnYl9mcmVlKHRlc3RfZGF0YTEpOworCW1zZ2JfZnJlZSh0ZXN0X2RhdGEyKTsKKwltc2diX2ZyZWUodGVzdF9kYXRhMyk7Cit9CisKKy8qIGludmFsaWQgaW5wdXQgKi8KK3N0YXRpYyB2b2lkIHRlc3Rfc2NjcF9zeXN0ZW1fY3Jhc2godm9pZCkKK3sKKwlwcmludGYoInRyeWluZyB0byBwcm92b2tlIGEgY3Jhc2ggd2l0aCBpbnZhbGlkIGlucHV0XG4iKTsKKwlzY2NwX3NldF9yZWFkKCZzY2NwX3Nzbl9ic3NhcCwgc2NjcF9yZWFkX2NiLCBOVUxMKTsKKwlzY2NwX2Nvbm5lY3Rpb25fc2V0X2luY29taW5nKCZzY2NwX3Nzbl9ic3NhcCwgc2NjcF9hY2NlcHRfY2IsIE5VTEwpOworCisJZm9yIChjdXJyZW50X3Rlc3QgPSAwOyBjdXJyZW50X3Rlc3QgPCBBUlJBWV9TSVpFKHRlc3RfZGF0YSk7ICsrY3VycmVudF90ZXN0KSB7CisJCWludCBvcmlnaW5hbF9sZW5ndGggPSB0ZXN0X2RhdGFbY3VycmVudF90ZXN0XS5sZW5ndGg7CisJCWludCBsZW5ndGggPSBvcmlnaW5hbF9sZW5ndGggKyAyOworCQlpbnQgaTsKKworCQlwcmludGYoIlRlc3RpbmcgcGFja2V0OiAlZFxuIiwgY3VycmVudF90ZXN0KTsKKworCQlmb3IgKGkgPSBsZW5ndGg7IGkgPj0gMDsgLS1pKSB7CisJCQl1bnNpZ25lZCBpbnQgbGVuZ3RoID0gTUlOKHRlc3RfZGF0YVtjdXJyZW50X3Rlc3RdLmxlbmd0aCwgaSk7CisJCQlzdHJ1Y3QgbXNnYiAqbXNnID0gbXNnYl9hbGxvY19oZWFkcm9vbShsZW5ndGggKyAyLCAyLCBfX2Z1bmNfXyk7CisJCQltc2ctPmwyaCA9IG1zZ2JfcHV0KG1zZywgbGVuZ3RoKTsKKwkJCW1lbWNweShtc2ctPmwyaCwgdGVzdF9kYXRhW2N1cnJlbnRfdGVzdF0uZGF0YSwgbGVuZ3RoKTsKKwkJCXNjY3Bfc3lzdGVtX2luY29taW5nKG1zZyk7CisJCQltc2diX2ZyZWUobXNnKTsKKwkJfQorCX0KKworCXByaW50Zigic3Vydml2ZWRcbiIpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X3NjY3BfcGFyc2luZyh2b2lkKQoreworCWZvciAoY3VycmVudF90ZXN0ID0gMDsgY3VycmVudF90ZXN0IDwgQVJSQVlfU0laRShwYXJzZV9yZXN1bHQpOyArK2N1cnJlbnRfdGVzdCkgeworCQlzdHJ1Y3QgbXNnYiAqbXNnOworCQlzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgcmVzdWx0OworCisJCW1zZyA9IG1zZ2JfYWxsb2NfaGVhZHJvb20oMTAyNCwgMTI4LCAicGFyc2UtdGVzdCIpOworCQltc2diX3B1dChtc2csIDEpOworCQltc2ctPmwyaCA9IG1zZ2JfcHV0KG1zZywgcGFyc2VfcmVzdWx0W2N1cnJlbnRfdGVzdF0uaW5wdXRfbGVuKTsKKwkJbWVtY3B5KG1zZy0+bDJoLCBwYXJzZV9yZXN1bHRbY3VycmVudF90ZXN0XS5pbnB1dCwgbXNnYl9sMmxlbihtc2cpKTsKKworCQltZW1zZXQoJnJlc3VsdCwgMCwgc2l6ZW9mKHJlc3VsdCkpOworCQlpZiAoc2NjcF9wYXJzZV9oZWFkZXIobXNnLCAmcmVzdWx0KSAhPSAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBwYXJzZSB0ZXN0OiAlZFxuIiwgY3VycmVudF90ZXN0KTsKKwkJfSBlbHNlIHsKKwkJCWlmIChwYXJzZV9yZXN1bHRbY3VycmVudF90ZXN0XS53YW50ZWRfbGVuICE9IHJlc3VsdC5kYXRhX2xlbikgeworCQkJCWZwcmludGYoc3RkZXJyLCAiVW5leHBlY3RlZCBkYXRhIGxlbmd0aC5cbiIpOworCQkJCWFib3J0KCk7CisJCQl9CisKKwkJCWlmIChwYXJzZV9yZXN1bHRbY3VycmVudF90ZXN0XS5oYXNfc3JjX3JlZikgeworCQkJCWlmIChtZW1jbXAocmVzdWx0LnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsCisJCQkJCSAgICZwYXJzZV9yZXN1bHRbY3VycmVudF90ZXN0XS5zcmNfcmVmLAorCQkJCQkgICBzaXplb2Yoc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSkpICE9IDApIHsKKwkJCQkJZnByaW50ZihzdGRlcnIsICJTUkMgUkVGIGRpZCBub3QgbWF0Y2hcbiIpOworCQkJCQlhYm9ydCgpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKHBhcnNlX3Jlc3VsdFtjdXJyZW50X3Rlc3RdLmhhc19kc3RfcmVmKSB7CisJCQkJaWYgKG1lbWNtcChyZXN1bHQuZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLAorCQkJCQkgICAmcGFyc2VfcmVzdWx0W2N1cnJlbnRfdGVzdF0uZHN0X3JlZiwKKwkJCQkJICAgc2l6ZW9mKHN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UpKSAhPSAwKSB7CisJCQkJCWZwcmludGYoc3RkZXJyLCAiRFNUIFJFRiBkaWQgbm90IG1hdGNoXG4iKTsKKwkJCQkJYWJvcnQoKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChwYXJzZV9yZXN1bHRbY3VycmVudF90ZXN0XS5zcmNfc3NuICE9IC0xKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJOb3QgaW1wbGVtZW50ZWQuXG4iKTsKKwkJCQlhYm9ydCgpOworCQkJfQorCisJCQlpZiAocGFyc2VfcmVzdWx0W2N1cnJlbnRfdGVzdF0uZHN0X3NzbiAhPSAtMSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiTm90IGltcGxlbWVudGVkLlxuIik7CisJCQkJYWJvcnQoKTsKKwkJCX0KKwkJfQorCisJCW1zZ2JfZnJlZShtc2cpOworCX0KK30KKworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJdGVzdF9zY2NwX3N5c3RlbSgpOworCXRlc3Rfc2NjcF9zZW5kX3VkdCgpOworCXRlc3Rfc2NjcF91ZHRfY29tbXVuaWNhdGlvbigpOworCXRlc3Rfc2NjcF9jb25uZWN0aW9uKCk7CisJdGVzdF9zY2NwX3N5c3RlbV9jcmFzaCgpOworCXRlc3Rfc2NjcF9wYXJzaW5nKCk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZGJfc3RvcmVfY291bnRlcigpIHt9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3Rlc3RzL3Ntcy50eHQgYi9vcGVuYnNjL3Rlc3RzL3Ntcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZjODg1YgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvdGVzdHMvc21zLnR4dApAQCAtMCwwICsxLDUwIEBACiswMyAwMiAwMSAwYSAwMiA0MyAwYiAwMCAxZCAzOSAwMSAxYSAwMCAwMSAwMCAwNyA5MSA1NSAxMSAxOCAzMSAyOCAwMCAwZSAzMSAyMCAwNCA4MSAyMSA0MyAwMCAwMCBmZiAwNCBkNCBmMiA5YyAwZQorCiswMyAwMiAwMSAwYSAwMiA0MyAwYiAwMCAxZCAtCiszOSAtIFRyYW5zYWN0aW9uSUQgMywgU01TIG1lc3NhZ2VzCTo6IGdoLT5wcm90b19kaXNjcgorMDEgLSBDUC1EQVRBCQkJCTo6IGdoLT5tc2dfdHlwZQorMWEgLSBMZW5ndGg6IDI2CQkJCTo6IGdoLT5kYXRhWzBdCiswMCAtIE1USSAwIFJQLURBVEEgKG1zLT5uKQorMDEgLSBNUiAxCiswMCAtIFJQLU9BCiswNyAtIFJQLURBIChTTVNDIExlbmd0aCkKKzkxIC0gSW50ZXJuYXRpb25hbCBObywgTnVtYmVyaW5nIFBsYW4KKzU1IDExIDE4IDMxIDI4IDAwIC0gNTUxMTgxMTM4MjAwCiswZSAtIFJQLVVEIGxlbiAoMTQpCisKK1RQRFUgKDE0IGJ5dGUpOgorMzEgLSBNVEkoMDEpLCBWUEYoMjpyZWxhdGl2ZSksIE1NUygwKSwgU1JJKDEpLCBVREhJKDApLCBSUCgwKQorMjAgLSBNZXNzYWdlIFJlZmVyZW5jZQorMDQgLSBEQSBsZW5ndGgKKzgxIC0gTnVtYmVyaW5nIFBsYW4sIE5hdGlvbmFsIG51bWJlcgorMjEgNDMgLSBEQSAxMjM0CiswMCAtIFBJRAorMDAgLSBEQ1MKK2ZmIC0gVmFsaWRpdHkgcGVyaW9kCiswNCAtIFVzZXIgRGF0YSBsZW5ndGggKDA0KQorZDQgZjIgOWMgMGUgLSBnc21fZGVmYXVsdCA3Yml0IGVuY29kZWQgIlRlc3QiICg0IGJ5dGUpCisKKzAzIDAyIDAxIDBhIDAyIDQzIDBiIDAwIDlmIDA5IDAxIDljIDAwIGRhIDAwIDA3IDkxIDg4IDk2IDEzIDAwIDAwIDk5IDkwIDExIDdiIDA0IDgxIDIyIDIyIDAwIDA4IGZmIDg2IDZjIDM4IDhjIDUwIDkyIDgwIDg4IDRjIDAwIDRkIDAwIDRkIDAwIDQxIDZhIDE5IDY3IDAzIDc0IDA2IDhjIGExIDdkIGIyIDAwIDIwIDAwIDIwIDUxIDY4IDc0IDAzIDk5IDk2IDUyIDc1IDdkIGIyIDhkIGVmIDZhIDE5IDY3IDAzIGZmIDBjIDZhIDE5IDY3IDAzIDk2IGY2IDk4IGE4IDk2IGFhIGZmIDAxIDhiIDkzIDYwIGE4IDgwIDcwIDY2IDBlIDUxIDMyIDg0IGM0IGZmIDBjIDk3IDQ4IDZkIDNiIDYyIDk1IDhjIGM3IGZmIDAxIDczIGZlIDU3IDI4IDUyIGEwIDUxIDY1IDkwIDAxIDk2IDUwIDkxIGNmIDU5IDI3IDgwIDZmIDc2IGRmIDZkIDBiIDU3IGZhIDk2IDhhIDkxIDc3IDVlIDYzIDUzIDYxIGZmIDBjIDhhIGNiIDRlIDBhIDdkIGIyIDY0IDFjIDVjIDBiIDMwIDBjIDZhIDE5IDY3IDAzIDMwIDBkCisKKzAzIDAyIDAxIDBhIDAyIDQzIDBiIDAwIDlmIC0gbG93ZXIgbGV2ZWxzCiswOSAtIFRyYW5zYWN0aW9uSUQgMCwgU01TIG1lc3NhZ2VzCiswMSAtIENQLURBVEEKKzljIC0gTGVuZ3RoOiAoMTU2KQorMDAgLSBNVEkgMCBSUC1EQVRBIChtcy0+bikKK2RhIC0gTVIgKD8pCiswMCAtIFJQLU9BCiswNyAtIFJQLURBIChTTVNDIExlbmd0aCkKKzkxIC0gSW50ZXJuYXRpb25hbCBOby4KKzg4IDk2IDEzIDAwIDAwIDk5Cis5MCAtIFJQLVVEIGxlbiAoMTQ0KQorMTEgLQorN2IgLSBNZXNzYWdlIFJlZmVyZW5jZQorMDQgLSBEQSBsZW5ndGgKKzgxIC0gTnVtYmVyaW5nIFBsYW4KKzIyIDIyIC0gQWRkcmVzcyAyMjIyCiswMCAtIFBJRAorMDggLSBEQ1MgKFVDUzIgY2hhcnNldCkKK2ZmIC0gVmFsaWRpdHkgcGVyaW9kCis4NiAtIFVzZXIgRGF0YSBsZW5ndGggKDEzNCkKKzZjIDM4IDhjIDUwIDkyIDgwIDg4IDRjIDAwIDRkIDAwIDRkIDAwIDQxIDZhIDE5IDY3IDAzIDc0IDA2IDhjIGExIDdkIGIyIDAwIDIwIDAwIDIwIDUxIDY4IDc0IDAzIDk5IDk2IDUyIDc1IDdkIGIyIDhkIGVmIDZhIDE5IDY3IDAzIGZmIDBjIDZhIDE5IDY3IDAzIDk2IGY2IDk4IGE4IDk2IGFhIGZmIDAxIDhiIDkzIDYwIGE4IDgwIDcwIDY2IDBlIDUxIDMyIDg0IGM0IGZmIDBjIDk3IDQ4IDZkIDNiIDYyIDk1IDhjIGM3IGZmIDAxIDczIGZlIDU3IDI4IDUyIGEwIDUxIDY1IDkwIDAxIDk2IDUwIDkxIGNmIDU5IDI3IDgwIDZmIDc2IGRmIDZkIDBiIDU3IGZhIDk2IDhhIDkxIDc3IDVlIDYzIDUzIDYxIGZmIDBjIDhhIGNiIDRlIDBhIDdkIGIyIDY0IDFjIDVjIDBiIDMwIDBjIDZhIDE5IDY3IDAzIDMwIDBkCisKZGlmZiAtLWdpdCBhL29wZW5ic2MvdG9vbHMvaGxyc3RhdC5wbCBiL29wZW5ic2MvdG9vbHMvaGxyc3RhdC5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42NjhmYzlhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy90b29scy9obHJzdGF0LnBsCkBAIC0wLDAgKzEsNzMgQEAKKyMhL3Vzci9iaW4vcGVybAorCit1c2Ugc3RyaWN0OwordXNlIERCSTsKK215ICRkYmggPSBEQkktPmNvbm5lY3QoImRiaTpTUUxpdGU6ZGJuYW1lPWhsci5zcWxpdGUzIiwiIiwiIik7CisKKworbXkgJW1jY19uYW1lczsKK215ICVtY2NfbW5jX25hbWVzOworCitzdWIgZ2V0X21jY19tbmNfbmFtZSgkKQoreworCW15ICRtY2NfbW5jID0gc2hpZnQ7CisJbXkgJHJldCA9ICRtY2NfbW5jOworCisJaWYgKCRtY2NfbW5jX25hbWVzeyRtY2NfbW5jfSBuZSAnJykgeworCQkkcmV0ID0gJG1jY19tbmNfbmFtZXN7JG1jY19tbmN9OworCX0KKworCXJldHVybiAkcmV0OworfQorCitzdWIgcmVhZF9uZXR3b3JrcygkKQoreworCW15ICRmaWxlbmFtZSA9IHNoaWZ0OworCW15ICRjdXJfbmFtZTsKKworCW9wZW4oSU5GSUxFLCAkZmlsZW5hbWUpOworCXdoaWxlIChteSAkbCA9IDxJTkZJTEU+KSB7CisJCWNob21wKCRsKTsKKwkJaWYgKCRsID1+IC9eIy8pIHsKKwkJCW5leHQ7CisJCX0KKwkJaWYgKCRsID1+IC9eXHQvKSB7CisJCQlteSAoJG1jYywgJG1uYywgJGJyYW5kLCAkcikgPSBzcGxpdCgnICcsICRsLCA0KTsKKwkJCSNwcmludGYoIiVzfCVzfCVzXG4iLCAkbWNjLCAkbW5jLCAkYnJhbmQpOworCQkJJG1jY19tbmNfbmFtZXN7IiRtY2MtJG1uYyJ9ID0gJGJyYW5kOworCQkJJG1jY19uYW1lc3skbWNjfSA9ICRjdXJfbmFtZTsKKwkJfSBlbHNpZiAoJGwgPX4gL14oXHdcdylcdCguKikvKSB7CisJCQkjcHJpbnRmKCIlc3wlc1xuIiwgJDEsICQyKTsKKwkJCSRjdXJfbmFtZSA9ICQyOworCQl9CisJfQorCWNsb3NlKElORklMRSk7Cit9CisKK3JlYWRfbmV0d29ya3MoIm5ldHdvcmtzLnRhYiIpOworCitteSAlb3Blcl9jb3VudDsKK215ICVjb3VudHJ5X2NvdW50OworCisjbXkgJHN0aCA9ICRkYmgtPnByZXBhcmUoIlNFTEVDVCBpbXNpIEZST00gc3Vic2NyaWJlciB3aGVyZSBhdXRob3JpemVkPTEiKTsKK215ICRzdGggPSAkZGJoLT5wcmVwYXJlKCJTRUxFQ1QgaW1zaSBGUk9NIHN1YnNjcmliZXIiKTsKKworJHN0aC0+ZXhlY3V0ZSgpOworCit3aGlsZSAobXkgJGhyZWYgPSAkc3RoLT5mZXRjaHJvd19oYXNocmVmKSB7CisJbXkgKCRtY2MsICRtbmMpID0gJCRocmVme2ltc2l9ID1+IC8oXGR7M30pKFxkezJ9KS4qLzsKKwkjcHJpbnRmKCIlcyAlcy0lcyBcbiIsICQkaHJlZntpbXNpfSwgJG1jYywgJG1uYyk7CisJJG9wZXJfY291bnR7IiRtY2MtJG1uYyJ9Kys7CisJJGNvdW50cnlfY291bnR7JG1jY30rKzsKK30KKworCitmb3JlYWNoIG15ICRjIChzb3J0eyRjb3VudHJ5X2NvdW50eyRifSA8PT4gJGNvdW50cnlfY291bnR7JGF9fSBrZXlzICVjb3VudHJ5X2NvdW50KSB7CisJcHJpbnRmKCIlczogJWRcbiIsICRtY2NfbmFtZXN7JGN9LCAkY291bnRyeV9jb3VudHskY30pOworCisJZm9yZWFjaCBteSAkayAoc29ydHskb3Blcl9jb3VudHskYn0gPD0+ICRvcGVyX2NvdW50eyRhfX0ga2V5cyAlb3Blcl9jb3VudCkgeworCQlpZiAoJGsgPX4gL14kYy0vKSB7CisJCQlwcmludGYoIlx0JXM6ICVkXG4iLCBnZXRfbWNjX21uY19uYW1lKCRrKSwgJG9wZXJfY291bnR7JGt9KTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzLy5naXRpZ25vcmUgYi9ycmxwLWVwaGVtZXJpcy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YjQ1ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsNCBAQAorYXNuMV9nZW4vKgorKi5vCisqLmEKK3JybHAtdGVzdApkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvQ09QWUlORyBiL3JybHAtZXBoZW1lcmlzL0NPUFlJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ3MDg4ZQotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL0NPUFlJTkcKQEAgLTAsMCArMSwyIEBACitTZWUgdGhlIGluY2x1ZGVkIGdwbC0yLjAudHh0IG9yIGdwbC0zLjAudHh0IGRlcGVuZGluZyBvbiB5b3VyCitwcmVmZXJlbmNlcy4KZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL01ha2VmaWxlIGIvcnJscC1lcGhlbWVyaXMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQyY2FjNwotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL01ha2VmaWxlCkBAIC0wLDAgKzEsNDQgQEAKKworQVNOMUM9Li4vLi4vLi4vdG1wL3JybHAvYXNuMWMvYXNuMWMvYXNuMWMKK0FTTjFfSU5DTFVERT0vaG9tZS90bnQvdG1wL3JybHAvYXNuMWMvc2tlbGV0b25zCitDQz1nY2MKK0NGTEFHUz0tSSQoQVNOMV9JTkNMVURFKSAtSWFzbjFfZ2VuIC1PMyAtV2FsbAorCitBU04xX0ZJTEVTPSQod2lsZGNhcmQgYXNuMS8qLmFzbikKKworCithbGw6IHJybHAtdGVzdAorCisKK3JybHAtdGVzdDogbGliZ3NtLWFzbjEuYSBncHMubyB1YngubyB1YngtcGFyc2UubyBycmxwLm8gbWFpbi5vCisJJChDQykgLW8gJEAgZ3BzLm8gdWJ4Lm8gdWJ4LXBhcnNlLm8gcnJscC5vIG1haW4ubyAtTC4gLWxnc20tYXNuMSAtbG0KKworCisjCisjIEFTTjEgZmlsZSBhdXRvZ2VuZXJhdGlvbiAobmVlZCByZWN1cnNpdmUgbWFrZWZpbGUgY2FsbCkKKyMKKworQVNOMV9TT1VSQ0VTID0gJCh3aWxkY2FyZCBhc24xX2dlbi8qLmMpCitBU04xX09CSkVDVFMgPSAkKEFTTjFfU09VUkNFUzouYz0ubykKKworbGliZ3NtLWFzbjEuYTogJChBU04xX0ZJTEVTKQorCW1rZGlyIC1wIGFzbjFfZ2VuICYmIFwKKwljZCBhc24xX2dlbiAmJiBcCisJJChBU04xQykgLWZza2VsZXRvbnMtY29weSAtZm5hdGl2ZS10eXBlcyAtZ2VuLVBFUiAkKGFkZHByZWZpeCAuLi8sJF4pCisJQHJtIGFzbjFfZ2VuL2NvbnZlcnRlci1zYW1wbGUuYyBhc24xX2dlbi9NYWtlZmlsZS5hbS5zYW1wbGUKKwlAJChNQUtFKSBsaWJnc20tYXNuMS5hLnN1Ym1ha2UKKworbGliZ3NtLWFzbjEuYS5zdWJtYWtlOiAkKEFTTjFfT0JKRUNUUykKKwkkKEFSKSByY3MgbGliZ3NtLWFzbjEuYSAkXgorCisuUEhPTlk6IGxpYmdzbS1hc24xLmEuc3VibWFrZQorCisKKyMKKyMgQ2xlYW4KKyMKKworY2xlYW46CisJcm0gLVJmIGFzbjFfZ2VuCisJcm0gLWYgbGliZ3NtLWFzbjEuYSAqLm8gcnJscC10ZXN0CisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLUJTLUNvZGUuYXNuIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtQlMtQ29kZS5hc24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQyNTM2NgotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLUJTLUNvZGUuYXNuCkBAIC0wLDAgKzEsMTMxIEBACistLSAkSWQ6IE1BUC1CUy1Db2RlLmFzbiAyODE0OSAyMDA5LTA0LTI1IDE3OjQ1OjM0WiBldHhyYWIgJAorLS0gM0dQUCBUUyAyOS4wMDIgVjguOS4wICgyMDA5LTA0KSAKKy0tIDE3LjcuMTAJQmVhcmVyIFNlcnZpY2UgQ29kZXMKKyAKK01BUC1CUy1Db2RlIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUJTLUNvZGUgKDIwKSB2ZXJzaW9uMTEgKDExKX0KKworREVGSU5JVElPTlMKKworOjo9CisKK0JFR0lOCisKK0JlYXJlclNlcnZpY2VDb2RlIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCS0tIFRoaXMgdHlwZSBpcyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgY29kZSBpZGVudGlmeWluZyBhIHNpbmdsZQorCS0tIGJlYXJlciBzZXJ2aWNlLCBhIGdyb3VwIG9mIGJlYXJlciBzZXJ2aWNlcywgb3IgYWxsIGJlYXJlcgorCS0tIHNlcnZpY2VzLiBUaGUgc2VydmljZXMgYXJlIGRlZmluZWQgaW4gVFMgM0dQUCBUUyAyMi4wMDIgWzNdLgorCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgorCS0tCisJLS0gcGxtbi1zcGVjaWZpYyBiZWFyZXIgc2VydmljZXM6CisJLS0gYml0cyA4NzY1NDMyMTogZGVmaW5lZCBieSB0aGUgSFBMTU4gb3BlcmF0b3IKKworCS0tIHJlc3Qgb2YgYmVhcmVyIHNlcnZpY2VzOgorCS0tIGJpdCA4OiAwICh1bnVzZWQpCisJLS0gYml0cyA3NjU0MzIxOiBncm91cCAoYml0cyA3NjU0KSwgYW5kIHJhdGUsIGlmIGFwcGxpY2FibGUKKwktLSAoYml0cyAzMjEpCisKK0V4dC1CZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi41KSkKKwktLSBUaGlzIHR5cGUgaXMgdXNlZCB0byByZXByZXNlbnQgdGhlIGNvZGUgaWRlbnRpZnlpbmcgYSBzaW5nbGUKKwktLSBiZWFyZXIgc2VydmljZSwgYSBncm91cCBvZiBiZWFyZXIgc2VydmljZXMsIG9yIGFsbCBiZWFyZXIKKwktLSBzZXJ2aWNlcy4gVGhlIHNlcnZpY2VzIGFyZSBkZWZpbmVkIGluIFRTIDNHUFAgVFMgMjIuMDAyIFszXS4KKwktLSBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlZmluZWQgYXMgZm9sbG93czoKKwktLQorCS0tIE9DVEVUIDE6CisJLS0gcGxtbi1zcGVjaWZpYyBiZWFyZXIgc2VydmljZXM6CisJLS0gYml0cyA4NzY1NDMyMTogZGVmaW5lZCBieSB0aGUgSFBMTU4gb3BlcmF0b3IKKwktLQorCS0tIHJlc3Qgb2YgYmVhcmVyIHNlcnZpY2VzOgorCS0tIGJpdCA4OiAwICh1bnVzZWQpCisJLS0gYml0cyA3NjU0MzIxOiBncm91cCAoYml0cyA3NjU0KSwgYW5kIHJhdGUsIGlmIGFwcGxpY2FibGUKKwktLSAoYml0cyAzMjEpCisKKwktLSBPQ1RFVFMgMi01OiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4gSWYgcmVjZWl2ZWQgdGhlCisgICAgLS0gRXh0LVRlbGVzZXJ2aWNlQ29kZSBzaGFsbCBiZQorCS0tIHRyZWF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBleGNlcHRpb24gaGFuZGxpbmcgZGVmaW5lZCBmb3IgdGhlCisJLS0gb3BlcmF0aW9uIHRoYXQgdXNlcyB0aGlzIHR5cGUuIAorCisKKwktLSBFeHQtQmVhcmVyU2VydmljZUNvZGUgaW5jbHVkZXMgYWxsIHZhbHVlcyBkZWZpbmVkIGZvciBCZWFyZXJTZXJ2aWNlQ29kZS4KKworYWxsQmVhcmVyU2VydmljZXMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAwMDAwMCdCCisKK2FsbERhdGFDREEtU2VydmljZXMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMDAwMCdCCitkYXRhQ0RBLTMwMGJwcwkJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMDAwMSdCCitkYXRhQ0RBLTEyMDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMDAxMCdCCitkYXRhQ0RBLTEyMDAtNzVicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMDAxMSdCCitkYXRhQ0RBLTI0MDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMDEwMCdCCitkYXRhQ0RBLTQ4MDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMDEwMSdCCitkYXRhQ0RBLTk2MDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMDExMCdCCitnZW5lcmFsLWRhdGFDREEJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMDExMSdCCisKK2FsbERhdGFDRFMtU2VydmljZXMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMTAwMCdCCitkYXRhQ0RTLTEyMDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMTAxMCdCCitkYXRhQ0RTLTI0MDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMTEwMCdCCitkYXRhQ0RTLTQ4MDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMTEwMSdCCitkYXRhQ0RTLTk2MDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMTExMCdCCitnZW5lcmFsLWRhdGFDRFMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMTExMSdCCisKK2FsbFBhZEFjY2Vzc0NBLVNlcnZpY2VzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMDAwMDAnQgorcGFkQWNjZXNzQ0EtMzAwYnBzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMDAwMDEnQgorcGFkQWNjZXNzQ0EtMTIwMGJwcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMTAwMDEwJ0IKK3BhZEFjY2Vzc0NBLTEyMDAtNzVicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDEwMDAxMSdCCitwYWRBY2Nlc3NDQS0yNDAwYnBzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMDAxMDAnQgorcGFkQWNjZXNzQ0EtNDgwMGJwcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMTAwMTAxJ0IKK3BhZEFjY2Vzc0NBLTk2MDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDEwMDExMCdCCitnZW5lcmFsLXBhZEFjY2Vzc0NBCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMDAxMTEnQgorCithbGxEYXRhUERTLVNlcnZpY2VzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMDEwMDAnQgorZGF0YVBEUy0yNDAwYnBzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMDExMDAnQgorZGF0YVBEUy00ODAwYnBzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMDExMDEnQgorZGF0YVBEUy05NjAwYnBzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMDExMTAnQgorZ2VuZXJhbC1kYXRhUERTCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMDExMTEnQgorCithbGxBbHRlcm5hdGVTcGVlY2gtRGF0YUNEQQlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMTEwMDAwJ0IKKworYWxsQWx0ZXJuYXRlU3BlZWNoLURhdGFDRFMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDExMTAwMCdCCisKK2FsbFNwZWVjaEZvbGxvd2VkQnlEYXRhQ0RBCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDEwMDAwMDAnQgorCithbGxTcGVlY2hGb2xsb3dlZEJ5RGF0YUNEUwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAxMDAxMDAwJ0IKKworLS0gVGhlIGZvbGxvd2luZyBub24taGllcmFyY2hpY2FsIENvbXBvdW5kIEJlYXJlciBTZXJ2aWNlCistLSBHcm91cHMgYXJlIGRlZmluZWQgaW4gVFMgM0dQUCBUUyAyMi4wMzA6CithbGxEYXRhQ2lyY3VpdEFzeW5jaHJvbm91cwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAxMDEwMDAwJ0IKKwktLSBjb3ZlcnMgImFsbERhdGFDREEtU2VydmljZXMiLCAiYWxsQWx0ZXJuYXRlU3BlZWNoLURhdGFDREEiIGFuZAorCS0tICJhbGxTcGVlY2hGb2xsb3dlZEJ5RGF0YUNEQSIKK2FsbEFzeW5jaHJvbm91c1NlcnZpY2VzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDExMDAwMDAnQgorCS0tIGNvdmVycyAiYWxsRGF0YUNEQS1TZXJ2aWNlcyIsICJhbGxBbHRlcm5hdGVTcGVlY2gtRGF0YUNEQSIsCisJLS0gImFsbFNwZWVjaEZvbGxvd2VkQnlEYXRhQ0RBIiBhbmQgImFsbFBhZEFjY2Vzc0NEQS1TZXJ2aWNlcyIKK2FsbERhdGFDaXJjdWl0U3luY2hyb25vdXMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMTAxMTAwMCdCCisJLS0gY292ZXJzICJhbGxEYXRhQ0RTLVNlcnZpY2VzIiwgImFsbEFsdGVybmF0ZVNwZWVjaC1EYXRhQ0RTIiBhbmQKKwktLSAiYWxsU3BlZWNoRm9sbG93ZWRCeURhdGFDRFMiCithbGxTeW5jaHJvbm91c1NlcnZpY2VzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDExMDEwMDAnQgorCS0tIGNvdmVycyAiYWxsRGF0YUNEUy1TZXJ2aWNlcyIsICJhbGxBbHRlcm5hdGVTcGVlY2gtRGF0YUNEUyIsCisJLS0gImFsbFNwZWVjaEZvbGxvd2VkQnlEYXRhQ0RTIiBhbmQgImFsbERhdGFQRFMtU2VydmljZXMiCistLQorLS0gQ29tcG91bmQgQmVhcmVyIFNlcnZpY2UgR3JvdXAgQ29kZXMgYXJlIG9ubHkgdXNlZCBpbiBjYWxsCistLSBpbmRlcGVuZGVudCBzdXBwbGVtZW50YXJ5IHNlcnZpY2Ugb3BlcmF0aW9ucywgaS5lLiB0aGV5CistLSBhcmUgbm90IHVzZWQgaW4gSW5zZXJ0U3Vic2NyaWJlckRhdGEgb3IgaW4KKy0tIERlbGV0ZVN1YnNjcmliZXJEYXRhIG1lc3NhZ2VzLgorCithbGxQTE1OLXNwZWNpZmljQlMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcxMTAxMDAwMCdCCitwbG1uLXNwZWNpZmljQlMtMQlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMDAxJ0IKK3BsbW4tc3BlY2lmaWNCUy0yCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMTEwMTAwMTAnQgorcGxtbi1zcGVjaWZpY0JTLTMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcxMTAxMDAxMSdCCitwbG1uLXNwZWNpZmljQlMtNAlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMTAwJ0IKK3BsbW4tc3BlY2lmaWNCUy01CUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMTEwMTAxMDEnQgorcGxtbi1zcGVjaWZpY0JTLTYJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcxMTAxMDExMCdCCitwbG1uLXNwZWNpZmljQlMtNwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMTExJ0IKK3BsbW4tc3BlY2lmaWNCUy04CUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMTEwMTEwMDAnQgorcGxtbi1zcGVjaWZpY0JTLTkJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcxMTAxMTAwMSdCCitwbG1uLXNwZWNpZmljQlMtQQlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzExMDExMDEwJ0IKK3BsbW4tc3BlY2lmaWNCUy1CCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMTEwMTEwMTEnQgorcGxtbi1zcGVjaWZpY0JTLUMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcxMTAxMTEwMCdCCitwbG1uLXNwZWNpZmljQlMtRAlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzExMDExMTAxJ0IKK3BsbW4tc3BlY2lmaWNCUy1FCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMTEwMTExMTAnQgorcGxtbi1zcGVjaWZpY0JTLUYJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcxMTAxMTExMSdCCisKK0VORAorCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1Db21tb25EYXRhVHlwZXMuYXNuIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtQ29tbW9uRGF0YVR5cGVzLmFzbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2QyMDJlCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtQ29tbW9uRGF0YVR5cGVzLmFzbgpAQCAtMCwwICsxLDYzMyBAQAorLS0gJElkOiBNQVAtQ29tbW9uRGF0YVR5cGVzLmFzbiAzMDQ3MCAyMDA5LTEwLTEwIDEyOjM3OjU2WiBrcmogJAorLS0gM0dQUCBUUyAyOS4wMDIgVjguOS4wICgyMDA5LTA0KQorLS0gMTcuNy44CUNvbW1vbiBkYXRhIHR5cGVzCisKK01BUC1Db21tb25EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtQ29tbW9uRGF0YVR5cGVzICgxOCkgdmVyc2lvbjExICgxMSl9CisKK0RFRklOSVRJT05TCisKK0lNUExJQ0lUIFRBR1MKKworOjo9CisKK0JFR0lOCisKK0VYUE9SVFMKKworCS0tIGdlbmVyYWwgZGF0YSB0eXBlcyBhbmQgdmFsdWVzCisJQWRkcmVzc1N0cmluZywKKwlJU0ROLUFkZHJlc3NTdHJpbmcsCisJbWF4SVNETi1BZGRyZXNzTGVuZ3RoLAorCUZUTi1BZGRyZXNzU3RyaW5nLAorCUlTRE4tU3ViYWRkcmVzc1N0cmluZywKKwlFeHRlcm5hbFNpZ25hbEluZm8sIAorCUV4dC1FeHRlcm5hbFNpZ25hbEluZm8sIAorQWNjZXNzTmV0d29ya1NpZ25hbEluZm8sCisJU2lnbmFsSW5mbywKKwltYXhTaWduYWxJbmZvTGVuZ3RoLAorCUFsZXJ0aW5nUGF0dGVybiwKKwlUQkNELVNUUklORywKKworCS0tIGRhdGEgdHlwZXMgZm9yIG51bWJlcmluZyBhbmQgaWRlbnRpZmljYXRpb24KKwlJTVNJLAorCVRNU0ksIAorCUlkZW50aXR5LAorCVN1YnNjcmliZXJJZCwKKwlJTUVJLAorCUhMUi1MaXN0LAorCUxNU0ksCisJR2xvYmFsQ2VsbElkLAorCU5ldHdvcmtSZXNvdXJjZSwKKwlBZGRpdGlvbmFsTmV0d29ya1Jlc291cmNlLAorCU5BRUEtUHJlZmVycmVkQ0ksIAorCU5BRUEtQ0lDLCAKKwlBU0NJLUNhbGxSZWZlcmVuY2UsCisJU3Vic2NyaWJlcklkZW50aXR5LAorCVBMTU4tSWQsCisKKwktLSBkYXRhIHR5cGVzIGZvciBDQU1FTAorCUNlbGxHbG9iYWxJZE9yU2VydmljZUFyZWFJZE9yTEFJLCAKKwlDZWxsR2xvYmFsSWRPclNlcnZpY2VBcmVhSWRGaXhlZExlbmd0aCwKKwlMQUlGaXhlZExlbmd0aCwKKworCS0tIGRhdGEgdHlwZXMgZm9yIHN1YnNjcmliZXIgbWFuYWdlbWVudAorCUJhc2ljU2VydmljZUNvZGUsCisJRXh0LUJhc2ljU2VydmljZUNvZGUsCisJRU1MUFAtSW5mbywKKwlFTUxQUC1Qcmlvcml0eSwgCisJTUMtU1MtSW5mbywKKwlNYXhNQy1CZWFyZXJzLAorCU1DLUJlYXJlcnMsCisJRXh0LVNTLVN0YXR1cywKKworCS0tIGRhdGEgdHlwZXMgZm9yIGdlb2dyYXBoaWMgbG9jYXRpb24KKwlBZ2VPZkxvY2F0aW9uSW5mb3JtYXRpb24sCisJTENTQ2xpZW50RXh0ZXJuYWxJRCwKKwlMQ1NDbGllbnRJbnRlcm5hbElELAorCUxDU1NlcnZpY2VUeXBlSUQsCistLS0gV1MgYWRkZWQgZXhwb3J0cyBuZWVkZWQgYnkgZ3NtX21hcC5hc24gKGV4dHJhIGFzbjEgZmlsZSB0byBoYW5kbGUgb2xkZXIgcHJvdC4gdmVyLikKKwlQcm90b2NvbElkLAorCUxDU1NlcnZpY2VUeXBlSUQJCis7CisKK0lNUE9SVFMKKwlUZWxlc2VydmljZUNvZGUsCisJRXh0LVRlbGVzZXJ2aWNlQ29kZQorRlJPTSBNQVAtVFMtQ29kZSB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1UUy1Db2RlICgxOSkgdmVyc2lvbjExICgxMSl9CisKKwlCZWFyZXJTZXJ2aWNlQ29kZSwKKwlFeHQtQmVhcmVyU2VydmljZUNvZGUKK0ZST00gTUFQLUJTLUNvZGUgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtQlMtQ29kZSAoMjApIHZlcnNpb24xMSAoMTEpfQorCisJU1MtQ29kZQorRlJPTSBNQVAtU1MtQ29kZSB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1TUy1Db2RlICgxNSkgdmVyc2lvbjExICgxMSl9CisKKwlFeHRlbnNpb25Db250YWluZXIKK0ZST00gTUFQLUV4dGVuc2lvbkRhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1FeHRlbnNpb25EYXRhVHlwZXMgKDIxKSB2ZXJzaW9uMTEgKDExKX0KKzsKKworCistLSBnZW5lcmFsIGRhdGEgdHlwZXMKKworVEJDRC1TVFJJTkcgOjo9IE9DVEVUIFNUUklORworCS0tIFRoaXMgdHlwZSAoVGVsZXBob255IEJpbmFyeSBDb2RlZCBEZWNpbWFsIFN0cmluZykgaXMgdXNlZCB0bworCS0tIHJlcHJlc2VudCBzZXZlcmFsIGRpZ2l0cyBmcm9tIDAgdGhyb3VnaCA5LCAqLCAjLCBhLCBiLCBjLCB0d28KKwktLSBkaWdpdHMgcGVyIG9jdGV0LCBlYWNoIGRpZ2l0IGVuY29kZWQgMDAwMCB0byAxMDAxICgwIHRvIDkpLAorCS0tIDEwMTAgKCopLCAxMDExICgjKSwgMTEwMCAoYSksIDExMDEgKGIpIG9yIDExMTAgKGMpOyAxMTExIHVzZWQKKwktLSBhcyBmaWxsZXIgd2hlbiB0aGVyZSBpcyBhbiBvZGQgbnVtYmVyIG9mIGRpZ2l0cy4KKworCS0tIGJpdHMgODc2NSBvZiBvY3RldCBuIGVuY29kaW5nIGRpZ2l0IDJuCisJLS0gYml0cyA0MzIxIG9mIG9jdGV0IG4gZW5jb2RpbmcgZGlnaXQgMihuLTEpICsxCisKK0FkZHJlc3NTdHJpbmcgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4ubWF4QWRkcmVzc0xlbmd0aCkpCisJLS0gVGhpcyB0eXBlIGlzIHVzZWQgdG8gcmVwcmVzZW50IGEgbnVtYmVyIGZvciBhZGRyZXNzaW5nCisJLS0gcHVycG9zZXMuIEl0IGlzIGNvbXBvc2VkIG9mCisJLS0JYSkJb25lIG9jdGV0IGZvciBuYXR1cmUgb2YgYWRkcmVzcywgYW5kIG51bWJlcmluZyBwbGFuCisJLS0JCWluZGljYXRvci4KKwktLQliKQlkaWdpdHMgb2YgYW4gYWRkcmVzcyBlbmNvZGVkIGFzIFRCQ0QtU3RyaW5nLgorCisJLS0gYSkJVGhlIGZpcnN0IG9jdGV0IGluY2x1ZGVzIGEgb25lIGJpdCBleHRlbnNpb24gaW5kaWNhdG9yLCBhCisJLS0JCTMgYml0cyBuYXR1cmUgb2YgYWRkcmVzcyBpbmRpY2F0b3IgYW5kIGEgNCBiaXRzIG51bWJlcmluZworCS0tCQlwbGFuIGluZGljYXRvciwgZW5jb2RlZCBhcyBmb2xsb3dzOgorCisJLS0gYml0IDg6IDEgIChubyBleHRlbnNpb24pCisKKwktLSBiaXRzIDc2NTogbmF0dXJlIG9mIGFkZHJlc3MgaW5kaWNhdG9yCisJLS0JMDAwICB1bmtub3duCisJLS0JMDAxICBpbnRlcm5hdGlvbmFsIG51bWJlcgorCS0tCTAxMCAgbmF0aW9uYWwgc2lnbmlmaWNhbnQgbnVtYmVyCisJLS0JMDExICBuZXR3b3JrIHNwZWNpZmljIG51bWJlcgorCS0tCTEwMCAgc3Vic2NyaWJlciBudW1iZXIKKwktLQkxMDEgIHJlc2VydmVkCisJLS0JMTEwICBhYmJyZXZpYXRlZCBudW1iZXIKKwktLQkxMTEgIHJlc2VydmVkIGZvciBleHRlbnNpb24KKworCS0tIGJpdHMgNDMyMTogbnVtYmVyaW5nIHBsYW4gaW5kaWNhdG9yCisJLS0JMDAwMCAgdW5rbm93bgorCS0tCTAwMDEgIElTRE4vVGVsZXBob255IE51bWJlcmluZyBQbGFuIChSZWMgSVRVLVQgRS4xNjQpCisJLS0JMDAxMCAgc3BhcmUKKwktLQkwMDExICBkYXRhIG51bWJlcmluZyBwbGFuIChJVFUtVCBSZWMgWC4xMjEpCisJLS0JMDEwMCAgdGVsZXggbnVtYmVyaW5nIHBsYW4gKElUVS1UIFJlYyBGLjY5KQorCS0tCTAxMDEgIHNwYXJlCisJLS0JMDExMCAgbGFuZCBtb2JpbGUgbnVtYmVyaW5nIHBsYW4gKElUVS1UIFJlYyBFLjIxMikKKwktLQkwMTExICBzcGFyZQorCS0tCTEwMDAgIG5hdGlvbmFsIG51bWJlcmluZyBwbGFuCisJLS0JMTAwMSAgcHJpdmF0ZSBudW1iZXJpbmcgcGxhbgorCS0tCTExMTEgIHJlc2VydmVkIGZvciBleHRlbnNpb24KKworCS0tCWFsbCBvdGhlciB2YWx1ZXMgYXJlIHJlc2VydmVkLgorCisJLS0gYikJVGhlIGZvbGxvd2luZyBvY3RldHMgcmVwcmVzZW50aW5nIGRpZ2l0cyBvZiBhbiBhZGRyZXNzCisJLS0JCWVuY29kZWQgYXMgYSBUQkNELVNUUklORy4KKworbWF4QWRkcmVzc0xlbmd0aCAgSU5URUdFUiA6Oj0gMjAKKworSVNETi1BZGRyZXNzU3RyaW5nIDo6PSAKKwkJCUFkZHJlc3NTdHJpbmcgKFNJWkUgKDEuLm1heElTRE4tQWRkcmVzc0xlbmd0aCkpCisJLS0gVGhpcyB0eXBlIGlzIHVzZWQgdG8gcmVwcmVzZW50IElTRE4gbnVtYmVycy4KKworbWF4SVNETi1BZGRyZXNzTGVuZ3RoICBJTlRFR0VSIDo6PSA5CisKK0ZUTi1BZGRyZXNzU3RyaW5nIDo6PSAKKwkJCUFkZHJlc3NTdHJpbmcgKFNJWkUgKDEuLm1heEZUTi1BZGRyZXNzTGVuZ3RoKSkKKwktLSBUaGlzIHR5cGUgaXMgdXNlZCB0byByZXByZXNlbnQgZm9yd2FyZGVkLXRvIG51bWJlcnMuIAorCS0tIElmIE5BSSA9IGludGVybmF0aW9uYWwgdGhlIGZpcnN0IGRpZ2l0cyByZXByZXNlbnQgdGhlIGNvdW50cnkgY29kZSAoQ0MpCisJLS0gYW5kIHRoZSBuZXR3b3JrIGRlc3RpbmF0aW9uIGNvZGUgKE5EQykgYXMgZm9yIEUuMTY0LgorCittYXhGVE4tQWRkcmVzc0xlbmd0aCAgSU5URUdFUiA6Oj0gMTUKKworSVNETi1TdWJhZGRyZXNzU3RyaW5nIDo6PSAKKwkJCU9DVEVUIFNUUklORyAoU0laRSAoMS4ubWF4SVNETi1TdWJhZGRyZXNzTGVuZ3RoKSkKKwktLSBUaGlzIHR5cGUgaXMgdXNlZCB0byByZXByZXNlbnQgSVNETiBzdWJhZGRyZXNzZXMuCisJLS0gSXQgaXMgY29tcG9zZWQgb2YKKwktLQlhKQlvbmUgb2N0ZXQgZm9yIHR5cGUgb2Ygc3ViYWRkcmVzcyBhbmQgb2RkL2V2ZW4gaW5kaWNhdG9yLgorCS0tCWIpCTIwIG9jdGV0cyBmb3Igc3ViYWRkcmVzcyBpbmZvcm1hdGlvbi4KKworCS0tCWEpCVRoZSBmaXJzdCBvY3RldCBpbmNsdWRlcyBhIG9uZSBiaXQgZXh0ZW5zaW9uIGluZGljYXRvciwgYQorCS0tCQkzIGJpdHMgdHlwZSBvZiBzdWJhZGRyZXNzIGFuZCBhIG9uZSBiaXQgb2RkL2V2ZW4gaW5kaWNhdG9yLAorCS0tCQllbmNvZGVkIGFzIGZvbGxvd3M6CisKKwktLQliaXQgODogMSAgKG5vIGV4dGVuc2lvbikKKworCS0tCWJpdHMgNzY1OiB0eXBlIG9mIHN1YmFkZHJlc3MKKwktLQkJMDAwICBOU0FQIChYLjIxMy9JU08gODM0OCBBRDIpCisJLS0JCTAxMCAgVXNlciBTcGVjaWZpZWQKKwktLQkJQWxsIG90aGVyIHZhbHVlcyBhcmUgcmVzZXJ2ZWQKKworCS0tCWJpdCA0OiBvZGQvZXZlbiBpbmRpY2F0b3IKKwktLQkJMCAgZXZlbiBudW1iZXIgb2YgYWRkcmVzcyBzaWduYWxzCisJLS0JCTEgIG9kZCBudW1iZXIgb2YgYWRkcmVzcyBzaWduYWxzCisJLS0JCVRoZSBvZGQvZXZlbiBpbmRpY2F0b3IgaXMgdXNlZCB3aGVuIHRoZSB0eXBlIG9mIHN1YmFkZHJlc3MKKwktLQkJaXMgInVzZXIgc3BlY2lmaWVkIiBhbmQgdGhlIGNvZGluZyBpcyBCQ0QuCisKKwktLQliaXRzIDMyMTogMDAwICh1bnVzZWQpCisKKwktLQliKSBTdWJhZGRyZXNzIGluZm9ybWF0aW9uLgorCS0tCVRoZSBOU0FQIFguMjEzL0lTTzgzNDhBRDIgYWRkcmVzcyBzaGFsbCBiZSBmb3JtYXR0ZWQgYXMgc3BlY2lmaWVkCisJLS0JYnkgb2N0ZXQgNCB3aGljaCBjb250YWlucyB0aGUgQXV0aG9yaXR5IGFuZCBGb3JtYXQgSWRlbnRpZmllcgorCS0tCShBRkkpLiBUaGUgZW5jb2RpbmcgaXMgbWFkZSBhY2NvcmRpbmcgdG8gdGhlICJwcmVmZXJyZWQgYmluYXJ5CisJLS0JZW5jb2RpbmciIGFzIGRlZmluZWQgaW4gWC4yMTMvSVNPODM0QUQyLiBGb3IgdGhlIGRlZmluaXRpb24KKwktLQlvZiB0aGlzIHR5cGUgb2Ygc3ViYWRkcmVzcywgc2VlIElUVS1UIFJlYyBJLjMzNC4KKworCS0tCUZvciBVc2VyLXNwZWNpZmljIHN1YmFkZHJlc3MsIHRoaXMgZmllbGQgaXMgZW5jb2RlZCBhY2NvcmRpbmcKKwktLQl0byB0aGUgdXNlciBzcGVjaWZpY2F0aW9uLCBzdWJqZWN0IHRvIGEgbWF4aW11bSBsZW5ndGggb2YgMjAKKwktLQlvY3RldHMuIFdoZW4gaW50ZXJ3b3JraW5nIHdpdGggWC4yNSBuZXR3b3JrcyBCQ0QgY29kaW5nIHNob3VsZAorCS0tCWJlIGFwcGxpZWQuCisKK21heElTRE4tU3ViYWRkcmVzc0xlbmd0aCAgSU5URUdFUiA6Oj0gMjEKKworRXh0ZXJuYWxTaWduYWxJbmZvIDo6PSBTRVFVRU5DRSB7CisJcHJvdG9jb2xJZAlQcm90b2NvbElkLAorCXNpZ25hbEluZm8JU2lnbmFsSW5mbywKKwktLSBJbmZvcm1hdGlvbiBhYm91dCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGdpdmVuIGluCisJLS0gY2xhdXNlIDcuNi45LgorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLS0gZXh0ZW5zaW9uQ29udGFpbmVyIG11c3Qgbm90IGJlIHVzZWQgaW4gdmVyc2lvbiAyCisJLi4ufQorCitTaWduYWxJbmZvIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLm1heFNpZ25hbEluZm9MZW5ndGgpKQorCittYXhTaWduYWxJbmZvTGVuZ3RoICBJTlRFR0VSIDo6PSAyMDAKKwktLSBUaGlzIE5hbWVkVmFsdWUgcmVwcmVzZW50cyB0aGUgdGhlb3JldGljYWwgbWF4aW11bSBudW1iZXIgb2Ygb2N0ZXRzIHdoaWNoIGlzCisJLS0gYXZhaWxhYmxlIHRvIGNhcnJ5IGEgc2luZ2xlIGluc3RhbmNlIG9mIHRoZSBTaWduYWxJbmZvIGRhdGEgdHlwZSwKKwktLSB3aXRob3V0IHJlcXVpcmluZyBzZWdtZW50YXRpb24gdG8gY29wZSB3aXRoIHRoZSBuZXR3b3JrIGxheWVyIHNlcnZpY2UuCisJLS0gSG93ZXZlciwgdGhlIGFjdHVhbCBtYXhpbXVtIHNpemUgYXZhaWxhYmxlIGZvciBhbiBpbnN0YW5jZSBvZiB0aGUgZGF0YQorCS0tIHR5cGUgbWF5IGJlIGxvd2VyLCBlc3BlY2lhbGx5IHdoZW4gb3RoZXIgaW5mb3JtYXRpb24gZWxlbWVudHMKKwktLSBoYXZlIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBzYW1lIGNvbXBvbmVudC4KKworUHJvdG9jb2xJZCA6Oj0gRU5VTUVSQVRFRCB7CisJZ3NtLTA0MDggICgxKSwKKwlnc20tMDgwNiAgKDIpLAorCWdzbS1CU1NNQVAgICgzKSwKKwktLSBWYWx1ZSAzIGlzIHJlc2VydmVkIGFuZCBtdXN0IG5vdCBiZSB1c2VkCisJZXRzLTMwMDEwMi0xICAoNCl9CisKK0V4dC1FeHRlcm5hbFNpZ25hbEluZm8gOjo9IFNFUVVFTkNFIHsKKwlleHQtUHJvdG9jb2xJZAlFeHQtUHJvdG9jb2xJZCwKKwlzaWduYWxJbmZvCVNpZ25hbEluZm8sCisJLS0gSW5mb3JtYXRpb24gYWJvdXQgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBnaXZlbiBpbgorCS0tIGNsYXVzZSA3LjYuOS4xMAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitFeHQtUHJvdG9jb2xJZCA6Oj0gRU5VTUVSQVRFRCB7CisJZXRzLTMwMDM1NiAgKDEpLAorCS4uLiAKKwkgfQorLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0gRm9yIEV4dC1FeHRlcm5hbFNpZ25hbEluZm8gc2VxdWVuY2VzIGNvbnRhaW5pbmcgdGhpcyBwYXJhbWV0ZXIgd2l0aCBhbnkKKy0tIG90aGVyIHZhbHVlIHRoYW4gdGhlIG9uZXMgbGlzdGVkIHRoZSByZWNlaXZlciBzaGFsbCBpZ25vcmUgdGhlIHdob2xlIAorLS0gRXh0LUV4dGVybmFsU2lnbmFsSW5mbyBzZXF1ZW5jZS4KKworQWNjZXNzTmV0d29ya1NpZ25hbEluZm8gOjo9IFNFUVVFTkNFIHsKKwlhY2Nlc3NOZXR3b3JrUHJvdG9jb2xJZAlBY2Nlc3NOZXR3b3JrUHJvdG9jb2xJZCwKKwlzaWduYWxJbmZvCUxvbmdTaWduYWxJbmZvLAorCS0tIEluZm9ybWF0aW9uIGFib3V0IHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZ2l2ZW4gaW4gY2xhdXNlIDcuNi45LjEKKwkKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTG9uZ1NpZ25hbEluZm8gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4ubWF4TG9uZ1NpZ25hbEluZm9MZW5ndGgpKQorCittYXhMb25nU2lnbmFsSW5mb0xlbmd0aCAgSU5URUdFUiA6Oj0gMjU2MAorCS0tIFRoaXMgTmFtZWQgVmFsdWUgcmVwcmVzZW50cyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygb2N0ZXRzIHdoaWNoIGlzIGF2YWlsYWJsZQorCS0tIHRvIGNhcnJ5IGEgc2luZ2xlIGluc3RhbmNlIG9mIHRoZSBMb25nU2lnbmFsSW5mbyBkYXRhIHR5cGUgdXNpbmcKKwktLSBXaGl0ZSBCb29rIFNDQ1Agd2l0aCB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2VnbWVudHMuCisJLS0gSXQgdGFrZXMgYWNjb3VudCBvZiB0aGUgb2N0ZXRzIHVzZWQgYnkgdGhlIGxvd2VyIGxheWVycyBvZiB0aGUgcHJvdG9jb2wsIGFuZAorCS0tIG90aGVyIGluZm9ybWF0aW9uIGVsZW1lbnRzIHdoaWNoIG1heSBiZSBpbmNsdWRlZCBpbiB0aGUgc2FtZSBjb21wb25lbnQuCisKK0FjY2Vzc05ldHdvcmtQcm90b2NvbElkIDo6PSBFTlVNRVJBVEVEIHsKKwl0czNHLTQ4MDA2ICAgKDEpLAorCXRzM0ctMjU0MTMgKDIpLAorCS4uLn0KKwktLSBleGNlcHRpb24gaGFuZGxpbmc6CisJLS0gRm9yIEFjY2Vzc05ldHdvcmtTaWduYWxJbmZvIHNlcXVlbmNlcyBjb250YWluaW5nIHRoaXMgcGFyYW1ldGVyIHdpdGggYW55CisJLS0gb3RoZXIgdmFsdWUgdGhhbiB0aGUgb25lcyBsaXN0ZWQgdGhlIHJlY2VpdmVyIHNoYWxsIGlnbm9yZSB0aGUgd2hvbGUgCisJLS0gQWNjZXNzTmV0d29ya1NpZ25hbEluZm8gc2VxdWVuY2UuCisKK0FsZXJ0aW5nUGF0dGVybiA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSApCisJLS0gVGhpcyB0eXBlIGlzIHVzZWQgdG8gcmVwcmVzZW50IEFsZXJ0aW5nIFBhdHRlcm4KKworCS0tCWJpdHMgODc2NSA6IDAwMDAgKHVudXNlZCkKKworCS0tCWJpdHMgNDMgOiB0eXBlIG9mIFBhdHRlcm4KKwktLQkJMDAgbGV2ZWwKKwktLQkJMDEgY2F0ZWdvcnkKKwktLQkJMTAgY2F0ZWdvcnkKKwktLQkJYWxsIG90aGVyIHZhbHVlcyBhcmUgcmVzZXJ2ZWQuCisKKwktLQliaXRzIDIxIDogdHlwZSBvZiBhbGVydGluZworCithbGVydGluZ0xldmVsLTAgICBBbGVydGluZ1BhdHRlcm4gOjo9ICcwMDAwMDAwMCdCCithbGVydGluZ0xldmVsLTEgICBBbGVydGluZ1BhdHRlcm4gOjo9ICcwMDAwMDAwMSdCCithbGVydGluZ0xldmVsLTIgICBBbGVydGluZ1BhdHRlcm4gOjo9ICcwMDAwMDAxMCdCCisJLS0gYWxsIG90aGVyIHZhbHVlcyBvZiBBbGVydGluZyBsZXZlbCBhcmUgcmVzZXJ2ZWQKKwktLSBBbGVydGluZyBMZXZlbHMgYXJlIGRlZmluZWQgaW4gR1NNIDAyLjA3CisJCithbGVydGluZ0NhdGVnb3J5LTEgICBBbGVydGluZ1BhdHRlcm4gOjo9ICcwMDAwMDEwMCdCCithbGVydGluZ0NhdGVnb3J5LTIgICBBbGVydGluZ1BhdHRlcm4gOjo9ICcwMDAwMDEwMSdCCithbGVydGluZ0NhdGVnb3J5LTMgICBBbGVydGluZ1BhdHRlcm4gOjo9ICcwMDAwMDExMCdCCithbGVydGluZ0NhdGVnb3J5LTQgICBBbGVydGluZ1BhdHRlcm4gOjo9ICcwMDAwMDExMSdCCithbGVydGluZ0NhdGVnb3J5LTUgICBBbGVydGluZ1BhdHRlcm4gOjo9ICcwMDAwMTAwMCdCCisJLS0gYWxsIG90aGVyIHZhbHVlcyBvZiBBbGVydGluZyBDYXRlZ29yeSBhcmUgcmVzZXJ2ZWQKKwktLSBBbGVydGluZyBjYXRlZ29yaWVzIGFyZSBkZWZpbmVkIGluIEdTTSAwMi4wNworCistLSBkYXRhIHR5cGVzIGZvciBudW1iZXJpbmcgYW5kIGlkZW50aWZpY2F0aW9uCisKK0lNU0kgOjo9IFRCQ0QtU1RSSU5HIChTSVpFICgzLi44KSkKKwktLSBkaWdpdHMgb2YgTUNDLCBNTkMsIE1TSU4gYXJlIGNvbmNhdGVuYXRlZCBpbiB0aGlzIG9yZGVyLgorCitJZGVudGl0eSA6Oj0gQ0hPSUNFIHsKKwlpbXNpCQkJSU1TSSwKKwlpbXNpLVdpdGhMTVNJCUlNU0ktV2l0aExNU0l9CisKK0lNU0ktV2l0aExNU0kgOjo9IFNFUVVFTkNFIHsKKwlpbXNpCQkJSU1TSSwKKwlsbXNpCQkJTE1TSSwKKwktLSBhIHNwZWNpYWwgdmFsdWUgMDAwMDAwMDAgaW5kaWNhdGVzIHRoYXQgdGhlIExNU0kgaXMgbm90IGluIHVzZQorCS4uLn0KKworQVNDSS1DYWxsUmVmZXJlbmNlIDo6PSBUQkNELVNUUklORyAoU0laRSAoMS4uOCkpCisJLS0gZGlnaXRzIG9mIFZHQ1MvVkJTLWFyZWEsR3JvdXAtSUQgYXJlIGNvbmNhdGVuYXRlZCBpbiB0aGlzIG9yZGVyIGlmIHRoZXJlIGlzIGEKKwktLSBWR0NTL1ZCUy1hcmVhLgorCitUTVNJIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLjQpKQorCitTdWJzY3JpYmVySWQgOjo9IENIT0lDRSB7CisJaW1zaQkJCVswXSBJTVNJLAorCXRtc2kJCQlbMV0gVE1TSX0KKworSU1FSSA6Oj0gVEJDRC1TVFJJTkcgKFNJWkUgKDgpKQorCS0tCVJlZmVycyB0byBJbnRlcm5hdGlvbmFsIE1vYmlsZSBTdGF0aW9uIEVxdWlwbWVudCBJZGVudGl0eQorCS0tCWFuZCBTb2Z0d2FyZSBWZXJzaW9uIE51bWJlciAoU1ZOKSBkZWZpbmVkIGluIFRTIDNHUFAgVFMgMjMuMDAzIFsxN10uCisJLS0JSWYgdGhlIFNWTiBpcyBub3QgcHJlc2VudCB0aGUgbGFzdCBvY3RldCBzaGFsbCBjb250YWluIHRoZQorCS0tCWRpZ2l0IDAgYW5kIGEgZmlsbGVyLgorCS0tCUlmIHByZXNlbnQgdGhlIFNWTiBzaGFsbCBiZSBpbmNsdWRlZCBpbiB0aGUgbGFzdCBvY3RldC4KKworSExSLUlkIDo6PSBJTVNJCisJLS0gbGVhZGluZyBkaWdpdHMgb2YgSU1TSSwgaS5lLiAoTUNDLCBNTkMsIGxlYWRpbmcgZGlnaXRzIG9mCisJLS0gTVNJTikgZm9ybWluZyBITFIgSWQgZGVmaW5lZCBpbiBUUyAzR1BQIFRTIDIzLjAwMyBbMTddLgorCitITFItTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZITFItSWQpIE9GCisJCQkJSExSLUlkCisKK21heE51bU9mSExSLUlkICBJTlRFR0VSIDo6PSA1MAorCitMTVNJIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDQpKQorCitHbG9iYWxDZWxsSWQgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoNS4uNykpCisJLS0gUmVmZXJzIHRvIENlbGwgR2xvYmFsIElkZW50aWZpY2F0aW9uIGRlZmluZWQgaW4gVFMgM0dQUCBUUyAyMy4wMDMgWzE3XS4KKwktLSBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlZmluZWQgYXMgZm9sbG93czoKKwktLSBvY3RldCAxIGJpdHMgNDMyMQlNb2JpbGUgQ291bnRyeSBDb2RlIDFzdCBkaWdpdAorCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBDb3VudHJ5IENvZGUgMm5kIGRpZ2l0CisJLS0gb2N0ZXQgMiBiaXRzIDQzMjEJTW9iaWxlIENvdW50cnkgQ29kZSAzcmQgZGlnaXQKKwktLSAgICAgICAgIGJpdHMgODc2NQlNb2JpbGUgTmV0d29yayBDb2RlIDNyZCBkaWdpdAorCS0tCQkJb3IgZmlsbGVyICgxMTExKSBmb3IgMiBkaWdpdCBNTkNzCisJLS0gb2N0ZXQgMyBiaXRzIDQzMjEJTW9iaWxlIE5ldHdvcmsgQ29kZSAxc3QgZGlnaXQKKwktLSAgICAgICAgIGJpdHMgODc2NQlNb2JpbGUgTmV0d29yayBDb2RlIDJuZCBkaWdpdAorCS0tIG9jdGV0cyA0IGFuZCA1CUxvY2F0aW9uIEFyZWEgQ29kZSBhY2NvcmRpbmcgdG8gVFMgM0dQUCBUUyAyNC4wMDggWzM1XQorCS0tIG9jdGV0cyA2IGFuZCA3CUNlbGwgSWRlbnRpdHkgKENJKSBhY2NvcmRpbmcgdG8gVFMgM0dQUCBUUyAyNC4wMDggWzM1XQorCitOZXR3b3JrUmVzb3VyY2UgOjo9IEVOVU1FUkFURUQgeworCXBsbW4gICgwKSwKKwlobHIgICgxKSwKKwl2bHIgICgyKSwKKwlwdmxyICAoMyksCisJY29udHJvbGxpbmdNU0MgICg0KSwKKwl2bXNjICAoNSksCisJZWlyICAoNiksCisJcnNzICAoNyl9CisKK0FkZGl0aW9uYWxOZXR3b3JrUmVzb3VyY2UgOjo9IEVOVU1FUkFURUQgeworCXNnc24gKDApLAorCWdnc24gKDEpLAorCWdtbGMgKDIpLAorCWdzbVNDRiAoMyksCisJbnBsciAoNCksCisJYXVjICg1KSwKKwkuLi4gLAorCXVlICg2KSwKKwltbWUgKDcpfQorCS0tIGlmIHVua25vd24gdmFsdWUgaXMgcmVjZWl2ZWQgaW4gQWRkaXRpb25hbE5ldHdvcmtSZXNvdXJjZQorCS0tIGl0IHNoYWxsIGJlIGlnbm9yZWQuCisKKworTkFFQS1QcmVmZXJyZWRDSSA6Oj0gU0VRVUVOQ0UgeworCW5hZWEtUHJlZmVycmVkQ0lDCVswXSBOQUVBLUNJQywKKwlleHRlbnNpb25Db250YWluZXIJWzFdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK05BRUEtQ0lDIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDMpKQorCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBieSB0aGUgQ2FycmllciBJZGVudGlmaWNhdGlvbgorCS0tIHBhcmFtZXRlciBpbiBBTlNJIFQxLjExMy4zLiBDYXJyaWVyIGNvZGVzIGJldHdlZW4gIjAwMCIgYW5kICI5OTkiIG1heQorCS0tIGJlIGVuY29kZWQgYXMgMyBkaWdpdHMgdXNpbmcgIjAwMCIgdG8gIjk5OSIgb3IgYXMgNCBkaWdpdHMgdXNpbmcgCisJLS0gIjAwMDAiIHRvICIwOTk5Ii4gQ2FycmllciBjb2RlcyBiZXR3ZWVuICIxMDAwIiBhbmQgIjk5OTkiIGFyZSBlbmNvZGVkCisJLS0gdXNpbmcgNCBkaWdpdHMuCisKK1N1YnNjcmliZXJJZGVudGl0eSA6Oj0gQ0hPSUNFIHsKKwlpbXNpCQkJWzBdIElNU0ksCisJbXNpc2RuCQlbMV0gSVNETi1BZGRyZXNzU3RyaW5nCisJfQorCitMQ1NDbGllbnRFeHRlcm5hbElEIDo6PSBTRVFVRU5DRSB7CisJZXh0ZXJuYWxBZGRyZXNzCVswXSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsxXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uIH0KKworTENTQ2xpZW50SW50ZXJuYWxJRCA6Oj0gRU5VTUVSQVRFRCB7CisJYnJvYWRjYXN0U2VydmljZQkoMCksCisJby1hbmRNLUhQTE1OCSgxKSwKKwlvLWFuZE0tVlBMTU4JKDIpLAorCWFub255bW91c0xvY2F0aW9uCSgzKSwKKwl0YXJnZXRNU3N1YnNjcmliZWRTZXJ2aWNlCSg0KSwKKwkuLi4gfQorLS0gZm9yIGEgQ0FNRUwgcGhhc2UgMyBQTE1OIG9wZXJhdG9yIGNsaWVudCwgdGhlIHZhbHVlIHRhcmdldE1Tc3Vic2NyaWJlZFNlcnZpY2Ugc2hhbGwgYmUgdXNlZAorCitMQ1NTZXJ2aWNlVHlwZUlEIDo6PSBJTlRFR0VSICgwLi4xMjcpCisJLS0gdGhlIGludGVnZXIgdmFsdWVzIDAtNjMgYXJlIHJlc2VydmVkIGZvciBTdGFuZGFyZCBMQ1Mgc2VydmljZSB0eXBlcworCS0tIHRoZSBpbnRlZ2VyIHZhbHVlcyA2NC0xMjcgYXJlIHJlc2VydmVkIGZvciBOb24gU3RhbmRhcmQgTENTIHNlcnZpY2UgdHlwZXMKKworLS0gU3RhbmRhcmQgTENTIFNlcnZpY2UgVHlwZXMKK2VtZXJnZW5jeVNlcnZpY2VzCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAwCitlbWVyZ2VuY3lBbGVydFNlcnZpY2VzCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxCitwZXJzb25UcmFja2luZwkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDIKK2ZsZWV0TWFuYWdlbWVudAkJTENTU2VydmljZVR5cGVJRCA6Oj0gMworYXNzZXRNYW5hZ2VtZW50CQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA0Cit0cmFmZmljQ29uZ2VzdGlvblJlcG9ydGluZwkJTENTU2VydmljZVR5cGVJRCA6Oj0gNQorcm9hZHNpZGVBc3Npc3RhbmNlCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA2Cityb3V0aW5nVG9OZWFyZXN0Q29tbWVyY2lhbEVudGVycHJpc2UJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDcKK25hdmlnYXRpb24JCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA4CisJLS10aGlzIHNlcnZpY2UgdHlwZSBpcyByZXNlcnZlZCBmb3IgdXNlIGluIHByZXZpb3VzIHJlbGVhc2VzCitjaXR5U2lnaHRzZWVpbmcJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDkKK2xvY2FsaXplZEFkdmVydGlzaW5nCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMAorbW9iaWxlWWVsbG93UGFnZXMJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDExIAordHJhZmZpY0FuZFB1YmxpY1RyYW5zcG9ydGF0aW9uSW5mbwkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTIKK3dlYXRoZXIJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTMKK2Fzc2V0QW5kU2VydmljZUZpbmRpbmcJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDE0CitnYW1pbmcJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTUKK2ZpbmRZb3VyRnJpZW5kCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTYKK2RhdGluZwkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxNworY2hhdHRpbmcJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTgKK3JvdXRlRmluZGluZwkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDE5Cit3aGVyZUFtSQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAyMAorCistLSBUaGUgdmFsdWVzIG9mIExDU1NlcnZpY2VUeXBlSUQgYXJlIGRlZmluZWQgYWNjb3JkaW5nIHRvIDNHUFAgVFMgMjIuMDcxLgorCistLSBOb24gU3RhbmRhcmQgTENTIFNlcnZpY2UgVHlwZXMKK3NlcnY2NAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA2NAorc2VydjY1CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDY1CitzZXJ2NjYJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNjYKK3NlcnY2NwkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA2Nworc2VydjY4CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDY4CitzZXJ2NjkJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNjkKK3NlcnY3MAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA3MAorc2VydjcxCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDcxCitzZXJ2NzIJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNzIKK3NlcnY3MwkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA3Mworc2Vydjc0CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDc0CitzZXJ2NzUJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNzUKK3NlcnY3NgkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA3Ngorc2Vydjc3CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDc3CitzZXJ2NzgJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNzgKK3NlcnY3OQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA3OQorc2VydjgwCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDgwCitzZXJ2ODEJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gODEKK3NlcnY4MgkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA4Mgorc2VydjgzCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDgzCitzZXJ2ODQJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gODQKK3NlcnY4NQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA4NQorc2Vydjg2CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDg2CitzZXJ2ODcJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gODcKK3NlcnY4OAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA4OAorc2Vydjg5CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDg5CitzZXJ2OTAJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gOTAKK3NlcnY5MQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA5MQorc2VydjkyCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDkyCitzZXJ2OTMJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gOTMKK3NlcnY5NAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA5NAorc2Vydjk1CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDk1CitzZXJ2OTYJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gOTYKK3NlcnY5NwkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA5Nworc2Vydjk4CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDk4CitzZXJ2OTkJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gOTkKK3NlcnYxMDAJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTAwCitzZXJ2MTAxCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEwMQorc2VydjEwMgkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMDIKK3NlcnYxMDMJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTAzCitzZXJ2MTA0CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEwNAorc2VydjEwNQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMDUKK3NlcnYxMDYJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTA2CitzZXJ2MTA3CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEwNworc2VydjEwOAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMDgKK3NlcnYxMDkJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTA5CitzZXJ2MTEwCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDExMAorc2VydjExMQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMTEKK3NlcnYxMTIJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTEyCitzZXJ2MTEzCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDExMworc2VydjExNAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMTQKK3NlcnYxMTUJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTE1CitzZXJ2MTE2CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDExNgorc2VydjExNwkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMTcKK3NlcnYxMTgJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTE4CitzZXJ2MTE5CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDExOQorc2VydjEyMAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMjAKK3NlcnYxMjEJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTIxCitzZXJ2MTIyCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEyMgorc2VydjEyMwkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMjMKK3NlcnYxMjQJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTI0CitzZXJ2MTI1CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEyNQorc2VydjEyNgkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMjYKK3NlcnYxMjcJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTI3CisKK1BMTU4tSWQgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMykpCisJLS0gVGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6CisJLS0gb2N0ZXQgMSBiaXRzIDQzMjEJTW9iaWxlIENvdW50cnkgQ29kZSAxc3QgZGlnaXQKKwktLSAgICAgICAgIGJpdHMgODc2NQlNb2JpbGUgQ291bnRyeSBDb2RlIDJuZCBkaWdpdAorCS0tIG9jdGV0IDIgYml0cyA0MzIxCU1vYmlsZSBDb3VudHJ5IENvZGUgM3JkIGRpZ2l0CisJLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIE5ldHdvcmsgQ29kZSAzcmQgZGlnaXQKKwktLQkJCW9yIGZpbGxlciAoMTExMSkgZm9yIDIgZGlnaXQgTU5DcworCS0tIG9jdGV0IDMgYml0cyA0MzIxCU1vYmlsZSBOZXR3b3JrIENvZGUgMXN0IGRpZ2l0CisJLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIE5ldHdvcmsgQ29kZSAybmQgZGlnaXQKKworLS0gZGF0YSB0eXBlcyBmb3IgQ0FNRUwKKworQ2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkT3JMQUkgOjo9IENIT0lDRSB7CisJY2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkRml4ZWRMZW5ndGgJWzBdIENlbGxHbG9iYWxJZE9yU2VydmljZUFyZWFJZEZpeGVkTGVuZ3RoLAorCWxhaUZpeGVkTGVuZ3RoCVsxXSBMQUlGaXhlZExlbmd0aH0KKworQ2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkRml4ZWRMZW5ndGggOjo9IE9DVEVUIFNUUklORyAoU0laRSAoNykpCisJLS0gUmVmZXJzIHRvIENlbGwgR2xvYmFsIElkZW50aWZpY2F0aW9uIG9yIFNlcnZpY2UgQXJlIElkZW50aWZpY2F0aW9uCisJLS0gZGVmaW5lZCBpbiAzR1BQIFRTIDIzLjAwMy4KKwktLSBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlZmluZWQgYXMgZm9sbG93czoKKwktLSBvY3RldCAxIGJpdHMgNDMyMQlNb2JpbGUgQ291bnRyeSBDb2RlIDFzdCBkaWdpdAorCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBDb3VudHJ5IENvZGUgMm5kIGRpZ2l0CisJLS0gb2N0ZXQgMiBiaXRzIDQzMjEJTW9iaWxlIENvdW50cnkgQ29kZSAzcmQgZGlnaXQKKwktLSAgICAgICAgIGJpdHMgODc2NQlNb2JpbGUgTmV0d29yayBDb2RlIDNyZCBkaWdpdAorCS0tCQkJb3IgZmlsbGVyICgxMTExKSBmb3IgMiBkaWdpdCBNTkNzCisJLS0gb2N0ZXQgMyBiaXRzIDQzMjEJTW9iaWxlIE5ldHdvcmsgQ29kZSAxc3QgZGlnaXQKKwktLSAgICAgICAgIGJpdHMgODc2NQlNb2JpbGUgTmV0d29yayBDb2RlIDJuZCBkaWdpdAorCS0tIG9jdGV0cyA0IGFuZCA1CUxvY2F0aW9uIEFyZWEgQ29kZSBhY2NvcmRpbmcgdG8gM0dQUCBUUyAyNC4wMDgKKwktLSBvY3RldHMgNiBhbmQgNwlDZWxsIElkZW50aXR5IChDSSkgdmFsdWUgb3IgCisJLS0gCQkJU2VydmljZSBBcmVhIENvZGUgKFNBQykgdmFsdWUgCisJLS0JCQlhY2NvcmRpbmcgdG8gM0dQUCBUUyAyMy4wMDMKKworTEFJRml4ZWRMZW5ndGggOjo9IE9DVEVUIFNUUklORyAoU0laRSAoNSkpCisJLS0gUmVmZXJzIHRvIExvY2F0aW9uIEFyZWEgSWRlbnRpZmljYXRpb24gZGVmaW5lZCBpbiAzR1BQIFRTIDIzLjAwMyBbMTddLgorCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgorCS0tIG9jdGV0IDEgYml0cyA0MzIxCU1vYmlsZSBDb3VudHJ5IENvZGUgMXN0IGRpZ2l0CisJLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIENvdW50cnkgQ29kZSAybmQgZGlnaXQKKwktLSBvY3RldCAyIGJpdHMgNDMyMQlNb2JpbGUgQ291bnRyeSBDb2RlIDNyZCBkaWdpdAorCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBOZXR3b3JrIENvZGUgM3JkIGRpZ2l0CisJLS0JCQlvciBmaWxsZXIgKDExMTEpIGZvciAyIGRpZ2l0IE1OQ3MKKwktLSBvY3RldCAzIGJpdHMgNDMyMQlNb2JpbGUgTmV0d29yayBDb2RlIDFzdCBkaWdpdAorCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBOZXR3b3JrIENvZGUgMm5kIGRpZ2l0CisJLS0gb2N0ZXRzIDQgYW5kIDUJTG9jYXRpb24gQXJlYSBDb2RlIGFjY29yZGluZyB0byAzR1BQIFRTIDI0LjAwOCBbMzVdCisKKy0tIGRhdGEgdHlwZXMgZm9yIHN1YnNjcmliZXIgbWFuYWdlbWVudAorCitCYXNpY1NlcnZpY2VDb2RlIDo6PSBDSE9JQ0UgeworCWJlYXJlclNlcnZpY2UJWzJdIEJlYXJlclNlcnZpY2VDb2RlLAorCXRlbGVzZXJ2aWNlCVszXSBUZWxlc2VydmljZUNvZGV9CisKK0V4dC1CYXNpY1NlcnZpY2VDb2RlIDo6PSBDSE9JQ0UgeworCWV4dC1CZWFyZXJTZXJ2aWNlCVsyXSBFeHQtQmVhcmVyU2VydmljZUNvZGUsCisJZXh0LVRlbGVzZXJ2aWNlCVszXSBFeHQtVGVsZXNlcnZpY2VDb2RlfQorCitFTUxQUC1JbmZvIDo6PSBTRVFVRU5DRSB7CisJbWF4aW11bWVudGl0bGVkUHJpb3JpdHkJRU1MUFAtUHJpb3JpdHksCisJZGVmYXVsdFByaW9yaXR5CUVNTFBQLVByaW9yaXR5LAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitFTUxQUC1Qcmlvcml0eSA6Oj0gSU5URUdFUiAoMC4uMTUpCisJLS0gVGhlIG1hcHBpbmcgZnJvbSB0aGUgdmFsdWVzIEEsQiwwLDEsMiwzLDQgdG8gdGhlIGludGVnZXItdmFsdWUgaXMKKwktLSBzcGVjaWZpZWQgYXMgZm9sbG93cyB3aGVyZSBBIGlzIHRoZSBoaWdoZXN0IGFuZCA0IGlzIHRoZSBsb3dlc3QKKwktLSBwcmlvcml0eSBsZXZlbAorCS0tIHRoZSBpbnRlZ2VyIHZhbHVlcyA3LTE1IGFyZSBzcGFyZSBhbmQgc2hhbGwgYmUgbWFwcGVkIHRvIHZhbHVlIDQKKworcHJpb3JpdHlMZXZlbEEJCUVNTFBQLVByaW9yaXR5IDo6PSA2Citwcmlvcml0eUxldmVsQgkJRU1MUFAtUHJpb3JpdHkgOjo9IDUKK3ByaW9yaXR5TGV2ZWwwCQlFTUxQUC1Qcmlvcml0eSA6Oj0gMAorcHJpb3JpdHlMZXZlbDEJCUVNTFBQLVByaW9yaXR5IDo6PSAxCitwcmlvcml0eUxldmVsMgkJRU1MUFAtUHJpb3JpdHkgOjo9IDIKK3ByaW9yaXR5TGV2ZWwzCQlFTUxQUC1Qcmlvcml0eSA6Oj0gMworcHJpb3JpdHlMZXZlbDQJCUVNTFBQLVByaW9yaXR5IDo6PSA0CisKK01DLVNTLUluZm8gOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlbMF0gU1MtQ29kZSwKKwlzcy1TdGF0dXMJCVsxXSBFeHQtU1MtU3RhdHVzLAorCW5iclNCCQlbMl0gTWF4TUMtQmVhcmVycywKKwluYnJVc2VyCQlbM10gTUMtQmVhcmVycywKKwlleHRlbnNpb25Db250YWluZXIJWzRdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK01heE1DLUJlYXJlcnMgOjo9IElOVEVHRVIgKDIuLm1heE51bU9mTUMtQmVhcmVycykKKworTUMtQmVhcmVycyA6Oj0gSU5URUdFUiAoMS4ubWF4TnVtT2ZNQy1CZWFyZXJzKQorCittYXhOdW1PZk1DLUJlYXJlcnMgIElOVEVHRVIgOjo9IDcKKworRXh0LVNTLVN0YXR1cyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi41KSkKKworCS0tIE9DVEVUIDE6CisJLS0KKwktLSBiaXRzIDg3NjU6IDAwMDAgKHVudXNlZCkKKwktLSBiaXRzIDQzMjE6IFVzZWQgdG8gY29udmV5IHRoZSAiUCBiaXQiLCJSIGJpdCIsIkEgYml0IiBhbmQgIlEgYml0IiwKKwktLQkJICAgIHJlcHJlc2VudGluZyBzdXBwbGVtZW50YXJ5IHNlcnZpY2Ugc3RhdGUgaW5mb3JtYXRpb24KKwktLQkJICAgIGFzIGRlZmluZWQgaW4gVFMgM0dQUCBUUyAyMy4wMTEgWzIyXQorCisJLS0gYml0IDQ6ICJRIGJpdCIKKworCS0tIGJpdCAzOiAiUCBiaXQiCisKKwktLSBiaXQgMjogIlIgYml0IgorCisJLS0gYml0IDE6ICJBIGJpdCIKKworCS0tIE9DVEVUUyAyLTU6IHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiBUaGV5IHNoYWxsIGJlIGRpc2NhcmRlZCBpZgorCS0tIHJlY2VpdmVkIGFuZCBub3QgdW5kZXJzdG9vZC4KKworCisJLS0gZGF0YSB0eXBlcyBmb3IgZ2VvZ3JhcGhpYyBsb2NhdGlvbgorCitBZ2VPZkxvY2F0aW9uSW5mb3JtYXRpb24gOjo9IElOVEVHRVIgKDAuLjMyNzY3KQorLS0gdGhlIHZhbHVlIHJlcHJlc2VudHMgdGhlIGVsYXBzZWQgdGltZSBpbiBtaW51dGVzIHNpbmNlIHRoZSBsYXN0CistLSBuZXR3b3JrIGNvbnRhY3Qgb2YgdGhlIG1vYmlsZSBzdGF0aW9uIChpLmUuIHRoZSBhY3R1YWxpdHkgb2YgdGhlCistLSBsb2NhdGlvbiBpbmZvcm1hdGlvbikuCistLSB2YWx1ZSAiMCIgaW5kaWNhdGVzIHRoYXQgdGhlIE1TIGlzIGN1cnJlbnRseSBpbiBjb250YWN0IHdpdGggdGhlCistLSAgICAgICAgICAgbmV0d29yaworLS0gdmFsdWUgIjMyNzY3IiBpbmRpY2F0ZXMgdGhhdCB0aGUgbG9jYXRpb24gaW5mb3JtYXRpb24gaXMgYXQgbGVhc3QKKy0tICAgICAgICAgICAgICAgMzI3NjcgbWludXRlcyBvbGQKKworRU5ECisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLUVSLURhdGFUeXBlcy5hc24gYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1FUi1EYXRhVHlwZXMuYXNuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYjkwZmMKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1FUi1EYXRhVHlwZXMuYXNuCkBAIC0wLDAgKzEsNDE1IEBACistLSAkSWQ6IE1BUC1FUi1EYXRhVHlwZXMuYXNuIDI4MTQ5IDIwMDktMDQtMjUgMTc6NDU6MzRaIGV0eHJhYiAkCistLSAzR1BQIFRTIDI5LjAwMiBWOC45LjAgKDIwMDktMDQpIAorLS0gMTcuNy43CUVycm9yIGRhdGEgdHlwZXMKKworTUFQLUVSLURhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1FUi1EYXRhVHlwZXMgKDE3KSB2ZXJzaW9uMTEgKDExKX0KKworREVGSU5JVElPTlMKKworSU1QTElDSVQgVEFHUworCis6Oj0KKworQkVHSU4KKworRVhQT1JUUworCVJvYW1pbmdOb3RBbGxvd2VkUGFyYW0sCisJQ2FsbEJhcnJlZFBhcmFtLAorCUNVRy1SZWplY3RQYXJhbSwKKwlTUy1JbmNvbXBhdGliaWxpdHlDYXVzZSwKKwlQVy1SZWdpc3RyYXRpb25GYWlsdXJlQ2F1c2UsCisJU00tRGVsaXZlcnlGYWlsdXJlQ2F1c2UsCisJU3lzdGVtRmFpbHVyZVBhcmFtLAorCURhdGFNaXNzaW5nUGFyYW0sCisJVW5leHBlY3RlZERhdGFQYXJhbSwKKwlGYWNpbGl0eU5vdFN1cFBhcmFtLAorCU9SLU5vdEFsbG93ZWRQYXJhbSwKKwlVbmtub3duU3Vic2NyaWJlclBhcmFtLAorCU51bWJlckNoYW5nZWRQYXJhbSwKKwlVbmlkZW50aWZpZWRTdWJQYXJhbSwKKwlJbGxlZ2FsU3Vic2NyaWJlclBhcmFtLAorCUlsbGVnYWxFcXVpcG1lbnRQYXJhbSwKKwlCZWFyZXJTZXJ2Tm90UHJvdlBhcmFtLAorCVRlbGVzZXJ2Tm90UHJvdlBhcmFtLAorCVRyYWNpbmdCdWZmZXJGdWxsUGFyYW0sCisJTm9Sb2FtaW5nTmJQYXJhbSwKKwlBYnNlbnRTdWJzY3JpYmVyUGFyYW0sCisJQnVzeVN1YnNjcmliZXJQYXJhbSwKKwlOb1N1YnNjcmliZXJSZXBseVBhcmFtLAorCUZvcndhcmRpbmdWaW9sYXRpb25QYXJhbSwKKwlGb3J3YXJkaW5nRmFpbGVkUGFyYW0sIAorCUFUSS1Ob3RBbGxvd2VkUGFyYW0sCisJU3ViQnVzeUZvck1ULVNNUy1QYXJhbSwKKwlNZXNzYWdlV2FpdExpc3RGdWxsUGFyYW0sCisJQWJzZW50U3Vic2NyaWJlclNNLVBhcmFtLAorCUFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00sCisJUmVzb3VyY2VMaW1pdGF0aW9uUGFyYW0sCisJTm9Hcm91cENhbGxOYlBhcmFtLAorCUluY29tcGF0aWJsZVRlcm1pbmFsUGFyYW0sCisJU2hvcnRUZXJtRGVuaWFsUGFyYW0sCisJTG9uZ1Rlcm1EZW5pYWxQYXJhbSwKKwlVbmF1dGhvcml6ZWRSZXF1ZXN0aW5nTmV0d29yay1QYXJhbSwKKwlVbmF1dGhvcml6ZWRMQ1NDbGllbnQtUGFyYW0sCisJUG9zaXRpb25NZXRob2RGYWlsdXJlLVBhcmFtLAorVW5rbm93bk9yVW5yZWFjaGFibGVMQ1NDbGllbnQtUGFyYW0sCisJTU0tRXZlbnROb3RTdXBwb3J0ZWQtUGFyYW0sCitBVFNJLU5vdEFsbG93ZWRQYXJhbSwKK0FUTS1Ob3RBbGxvd2VkUGFyYW0sCitJbGxlZ2FsU1MtT3BlcmF0aW9uUGFyYW0sCitTUy1Ob3RBdmFpbGFibGVQYXJhbSwKK1NTLVN1YnNjcmlwdGlvblZpb2xhdGlvblBhcmFtLAorSW5mb3JtYXRpb25Ob3RBdmFpbGFibGVQYXJhbSwKK1RhcmdldENlbGxPdXRzaWRlR0NBLVBhcmFtLAorT25nb2luZ0dyb3VwQ2FsbFBhcmFtCisKKzsKKworSU1QT1JUUworCVNTLVN0YXR1cworRlJPTSBNQVAtU1MtRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLVNTLURhdGFUeXBlcyAoMTQpIHZlcnNpb24xMSAoMTEpfQorCisJU2lnbmFsSW5mbywKKwlCYXNpY1NlcnZpY2VDb2RlLAorCU5ldHdvcmtSZXNvdXJjZSwKKwlBZGRpdGlvbmFsTmV0d29ya1Jlc291cmNlCitGUk9NIE1BUC1Db21tb25EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtQ29tbW9uRGF0YVR5cGVzICgxOCkgdmVyc2lvbjExICgxMSl9CisKKworCVNTLUNvZGUKK0ZST00gTUFQLVNTLUNvZGUgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtU1MtQ29kZSAoMTUpIHZlcnNpb24xMSAoMTEpfQorCisJRXh0ZW5zaW9uQ29udGFpbmVyCitGUk9NIE1BUC1FeHRlbnNpb25EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtRXh0ZW5zaW9uRGF0YVR5cGVzICgyMSkgdmVyc2lvbjExICgxMSl9Cis7CisKK1JvYW1pbmdOb3RBbGxvd2VkUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlyb2FtaW5nTm90QWxsb3dlZENhdXNlCVJvYW1pbmdOb3RBbGxvd2VkQ2F1c2UsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJYWRkaXRpb25hbFJvYW1pbmdOb3RBbGxvd2VkQ2F1c2UJWzBdIEFkZGl0aW9uYWxSb2FtaW5nTm90QWxsb3dlZENhdXNlIE9QVElPTkFMIH0KKworLS0JaWYgdGhlIGFkZGl0aW9uYWxSb2FtaW5nTm90YWxsb3dlZENhdXNlIGlzIHJlY2VpdmVkIGJ5IHRoZSBNU0MvVkxSIG9yIFNHU04gdGhlbiB0aGUgCistLQlyb2FtaW5nTm90QWxsb3dlZENhdXNlIHNoYWxsIGJlIGRpc2NhcmRlZC4KKworQWRkaXRpb25hbFJvYW1pbmdOb3RBbGxvd2VkQ2F1c2UgOjo9IEVOVU1FUkFURUQgeworCXN1cHBvcnRlZFJBVC1UeXBlc05vdEFsbG93ZWQgKDApLAorCS4uLn0KKworUm9hbWluZ05vdEFsbG93ZWRDYXVzZSA6Oj0gRU5VTUVSQVRFRCB7CisJcGxtblJvYW1pbmdOb3RBbGxvd2VkICAoMCksCisJb3BlcmF0b3JEZXRlcm1pbmVkQmFycmluZyAgKDMpfQorCitDYWxsQmFycmVkUGFyYW0gOjo9IENIT0lDRSB7CisJY2FsbEJhcnJpbmdDYXVzZQlDYWxsQmFycmluZ0NhdXNlLAorCS0tIGNhbGwgQmFycmluZ0NhdXNlIG11c3Qgbm90IGJlIHVzZWQgaW4gdmVyc2lvbiAzIGFuZCBoaWdoZXIKKwlleHRlbnNpYmxlQ2FsbEJhcnJlZFBhcmFtCUV4dGVuc2libGVDYWxsQmFycmVkUGFyYW0KKwktLSBleHRlbnNpYmxlQ2FsbEJhcnJlZFBhcmFtIG11c3Qgbm90IGJlIHVzZWQgaW4gdmVyc2lvbiA8MworCX0KKworQ2FsbEJhcnJpbmdDYXVzZSA6Oj0gRU5VTUVSQVRFRCB7CisJYmFycmluZ1NlcnZpY2VBY3RpdmUgICgwKSwKKwlvcGVyYXRvckJhcnJpbmcgICgxKX0KKworRXh0ZW5zaWJsZUNhbGxCYXJyZWRQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWNhbGxCYXJyaW5nQ2F1c2UJQ2FsbEJhcnJpbmdDYXVzZQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiAsCisJdW5hdXRob3Jpc2VkTWVzc2FnZU9yaWdpbmF0b3IJWzFdIE5VTEwJCU9QVElPTkFMIH0KKworQ1VHLVJlamVjdFBhcmFtIDo6PSBTRVFVRU5DRSB7CisJY3VnLVJlamVjdENhdXNlCUNVRy1SZWplY3RDYXVzZQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworQ1VHLVJlamVjdENhdXNlIDo6PSBFTlVNRVJBVEVEIHsKKwlpbmNvbWluZ0NhbGxzQmFycmVkV2l0aGluQ1VHICAoMCksCisJc3Vic2NyaWJlck5vdE1lbWJlck9mQ1VHICAoMSksCisJcmVxdWVzdGVkQmFzaWNTZXJ2aWNlVmlvbGF0ZXNDVUctQ29uc3RyYWludHMgICg1KSwKKwljYWxsZWRQYXJ0eVNTLUludGVyYWN0aW9uVmlvbGF0aW9uICAoNyl9CisKK1NTLUluY29tcGF0aWJpbGl0eUNhdXNlIDo6PSBTRVFVRU5DRSB7CisJc3MtQ29kZQkJWzFdIFNTLUNvZGUJT1BUSU9OQUwsCisJYmFzaWNTZXJ2aWNlCUJhc2ljU2VydmljZUNvZGUJT1BUSU9OQUwsCisJc3MtU3RhdHVzCQlbNF0gU1MtU3RhdHVzCU9QVElPTkFMLAorCS4uLn0KKworUFctUmVnaXN0cmF0aW9uRmFpbHVyZUNhdXNlIDo6PSBFTlVNRVJBVEVEIHsKKwl1bmRldGVybWluZWQgICgwKSwKKwlpbnZhbGlkRm9ybWF0ICAoMSksCisJbmV3UGFzc3dvcmRzTWlzbWF0Y2ggICgyKX0KKworU00tRW51bWVyYXRlZERlbGl2ZXJ5RmFpbHVyZUNhdXNlIDo6PSBFTlVNRVJBVEVEIHsKKwltZW1vcnlDYXBhY2l0eUV4Y2VlZGVkICAoMCksCisJZXF1aXBtZW50UHJvdG9jb2xFcnJvciAgKDEpLAorCWVxdWlwbWVudE5vdFNNLUVxdWlwcGVkICAoMiksCisJdW5rbm93blNlcnZpY2VDZW50cmUgICgzKSwKKwlzYy1Db25nZXN0aW9uICAoNCksCisJaW52YWxpZFNNRS1BZGRyZXNzICAoNSksCisJc3Vic2NyaWJlck5vdFNDLVN1YnNjcmliZXIgICg2KX0KKworU00tRGVsaXZlcnlGYWlsdXJlQ2F1c2UgOjo9IFNFUVVFTkNFIHsKKwlzbS1FbnVtZXJhdGVkRGVsaXZlcnlGYWlsdXJlQ2F1c2UJU00tRW51bWVyYXRlZERlbGl2ZXJ5RmFpbHVyZUNhdXNlLAorCWRpYWdub3N0aWNJbmZvCVNpZ25hbEluZm8JT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0Fic2VudFN1YnNjcmliZXJTTS1QYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00JQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTQlPUFRJT05BTCwKKwktLSBBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNIGNhbiBiZSBlaXRoZXIgZm9yIG5vbi1HUFJTIAorCS0tIG9yIGZvciBHUFJTCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJYWRkaXRpb25hbEFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00gIAlbMF0gCUFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00JT1BUSU9OQUwgfQorCS0tIGlmIHJlY2VpdmVkLCBhZGRpdGlvbmFsQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTSAKKwktLSBpcyBmb3IgR1BSUyBhbmQgYWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTSBpcyAKKwktLSBmb3Igbm9uLUdQUlMKKworQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTSA6Oj0gSU5URUdFUiAoMC4uMjU1KQorCS0tIEFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00gdmFsdWVzIGFyZSBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDQwCisKK1N5c3RlbUZhaWx1cmVQYXJhbSA6Oj0gQ0hPSUNFIHsKKwluZXR3b3JrUmVzb3VyY2UJTmV0d29ya1Jlc291cmNlLAorCS0tIG5ldHdvcmtSZXNvdXJjZSBtdXN0IG5vdCBiZSB1c2VkIGluIHZlcnNpb24gMworCWV4dGVuc2libGVTeXN0ZW1GYWlsdXJlUGFyYW0JRXh0ZW5zaWJsZVN5c3RlbUZhaWx1cmVQYXJhbQorCS0tIGV4dGVuc2libGVTeXN0ZW1GYWlsdXJlUGFyYW0gbXVzdCBub3QgYmUgdXNlZCBpbiB2ZXJzaW9uIDwzCisJfQorCitFeHRlbnNpYmxlU3lzdGVtRmFpbHVyZVBhcmFtIDo6PSBTRVFVRU5DRSB7CisJbmV0d29ya1Jlc291cmNlCU5ldHdvcmtSZXNvdXJjZQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlhZGRpdGlvbmFsTmV0d29ya1Jlc291cmNlCVswXSBBZGRpdGlvbmFsTmV0d29ya1Jlc291cmNlCU9QVElPTkFMLAorCWZhaWx1cmVDYXVzZVBhcmFtCVsxXSBGYWlsdXJlQ2F1c2VQYXJhbQlPUFRJT05BTCB9CisKK0ZhaWx1cmVDYXVzZVBhcmFtIDo6PSBFTlVNRVJBVEVEIHsKKwlsaW1pdFJlYWNoZWRPbk51bWJlck9mQ29uY3VycmVudExvY2F0aW9uUmVxdWVzdHMgKDApLAorCS4uLiB9CisJLS0gaWYgdW5rbm93biB2YWx1ZSBpcyByZWNlaXZlZCBpbiBGYWlsdXJlQ2F1c2VQYXJhbSBpdCBzaGFsbCBiZSBpZ25vcmVkCisKKworRGF0YU1pc3NpbmdQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitVbmV4cGVjdGVkRGF0YVBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0ZhY2lsaXR5Tm90U3VwUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlzaGFwZU9mTG9jYXRpb25Fc3RpbWF0ZU5vdFN1cHBvcnRlZCBbMF0JTlVMTAkJT1BUSU9OQUwsCisJbmVlZGVkTGNzQ2FwYWJpbGl0eU5vdFN1cHBvcnRlZEluU2VydmluZ05vZGUgWzFdIE5VTEwJT1BUSU9OQUwgfQorCitPUi1Ob3RBbGxvd2VkUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworVW5rbm93blN1YnNjcmliZXJQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCXVua25vd25TdWJzY3JpYmVyRGlhZ25vc3RpYwlVbmtub3duU3Vic2NyaWJlckRpYWdub3N0aWMJT1BUSU9OQUx9CisKK1Vua25vd25TdWJzY3JpYmVyRGlhZ25vc3RpYyA6Oj0gRU5VTUVSQVRFRCB7CisJaW1zaVVua25vd24gICgwKSwKKwlncHJzLWVwcy1TdWJzY3JpcHRpb25Vbmtub3duICAoMSksCisJLi4uLAorCW5wZGJNaXNtYXRjaCAgKDIpfQorCS0tIGlmIHVua25vd24gdmFsdWVzIGFyZSByZWNlaXZlZCBpbiAJCisJLS0gVW5rbm93blN1YnNjcmliZXJEaWFnbm9zdGljIHRoZXkgc2hhbGwgYmUgZGlzY2FyZGVkCisKK051bWJlckNoYW5nZWRQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitVbmlkZW50aWZpZWRTdWJQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitJbGxlZ2FsU3Vic2NyaWJlclBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0lsbGVnYWxFcXVpcG1lbnRQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitCZWFyZXJTZXJ2Tm90UHJvdlBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1RlbGVzZXJ2Tm90UHJvdlBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1RyYWNpbmdCdWZmZXJGdWxsUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTm9Sb2FtaW5nTmJQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitBYnNlbnRTdWJzY3JpYmVyUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlhYnNlbnRTdWJzY3JpYmVyUmVhc29uCVswXSBBYnNlbnRTdWJzY3JpYmVyUmVhc29uCU9QVElPTkFMfQorCitBYnNlbnRTdWJzY3JpYmVyUmVhc29uIDo6PSBFTlVNRVJBVEVEIHsKKwlpbXNpRGV0YWNoICgwKSwKKwlyZXN0cmljdGVkQXJlYSAoMSksCisJbm9QYWdlUmVzcG9uc2UgKDIpLAorCS4uLiAsCisJcHVyZ2VkTVMgKDMpfQorLS0gZXhjZXB0aW9uIGhhbmRsaW5nOiBhdCByZWNlcHRpb24gb2Ygb3RoZXIgdmFsdWVzIHRoYW4gdGhlIG9uZXMgbGlzdGVkIHRoZSAKKy0tIEFic2VudFN1YnNjcmliZXJSZWFzb24gc2hhbGwgYmUgaWdub3JlZC4gCistLSBUaGUgQWJzZW50U3Vic2NyaWJlclJlYXNvbjogcHVyZ2VkTVMgaXMgZGVmaW5lZCBmb3IgdGhlIFN1cGVyLUNoYXJnZXIgZmVhdHVyZSAKKy0tIChzZWUgVFMgMjMuMTE2KS4gSWYgdGhpcyB2YWx1ZSBpcyByZWNlaXZlZCBpbiBhIFByb3ZpZGUgUm9hbWluZyBOdW1iZXIgcmVzcG9uc2UKKy0tIGl0IHNoYWxsIGJlIG1hcHBlZCB0byB0aGUgQWJzZW50U3Vic2NyaWJlclJlYXNvbjogaW1zaURldGFjaCBpbiB0aGUgU2VuZCBSb3V0ZWluZworLS0gSW5mb3JtYXRpb24gcmVzcG9uc2UKKworQnVzeVN1YnNjcmliZXJQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWNjYnMtUG9zc2libGUJWzBdIE5VTEwJCU9QVElPTkFMLAorCWNjYnMtQnVzeQkJWzFdIE5VTEwJCU9QVElPTkFMfQorCitOb1N1YnNjcmliZXJSZXBseVBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0ZvcndhcmRpbmdWaW9sYXRpb25QYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitGb3J3YXJkaW5nRmFpbGVkUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworQVRJLU5vdEFsbG93ZWRQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitBVFNJLU5vdEFsbG93ZWRQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitBVE0tTm90QWxsb3dlZFBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0lsbGVnYWxTUy1PcGVyYXRpb25QYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitTUy1Ob3RBdmFpbGFibGVQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitTUy1TdWJzY3JpcHRpb25WaW9sYXRpb25QYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitJbmZvcm1hdGlvbk5vdEF2YWlsYWJsZVBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1N1YkJ1c3lGb3JNVC1TTVMtUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiAsCisJZ3Byc0Nvbm5lY3Rpb25TdXNwZW5kZWQJTlVMTAkJCU9QVElPTkFMIH0KKwktLSBJZiBHcHJzQ29ubmVjdGlvblN1c3BlbmRlZCBpcyBub3QgdW5kZXJzdG9vZCBpdCBzaGFsbCAKKwktLSBiZSBkaXNjYXJkZWQKKworTWVzc2FnZVdhaXRMaXN0RnVsbFBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1Jlc291cmNlTGltaXRhdGlvblBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK05vR3JvdXBDYWxsTmJQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitJbmNvbXBhdGlibGVUZXJtaW5hbFBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1Nob3J0VGVybURlbmlhbFBhcmFtIDo6PSBTRVFVRU5DRSB7CisJLi4ufQorCitMb25nVGVybURlbmlhbFBhcmFtIDo6PSBTRVFVRU5DRSB7CisJLi4ufQorCitVbmF1dGhvcml6ZWRSZXF1ZXN0aW5nTmV0d29yay1QYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitVbmF1dGhvcml6ZWRMQ1NDbGllbnQtUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwl1bmF1dGhvcml6ZWRMQ1NDbGllbnQtRGlhZ25vc3RpYwlbMF0gVW5hdXRob3JpemVkTENTQ2xpZW50LURpYWdub3N0aWMJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsxXSBFeHRlbnNpb25Db250YWluZXIJCQlPUFRJT05BTCwKKwkuLi4gfQorCitVbmF1dGhvcml6ZWRMQ1NDbGllbnQtRGlhZ25vc3RpYyA6Oj0gRU5VTUVSQVRFRCB7CisJbm9BZGRpdGlvbmFsSW5mb3JtYXRpb24gKDApLAorCWNsaWVudE5vdEluTVNQcml2YWN5RXhjZXB0aW9uTGlzdCAoMSksCisJY2FsbFRvQ2xpZW50Tm90U2V0dXAgKDIpLAorCXByaXZhY3lPdmVycmlkZU5vdEFwcGxpY2FibGUgKDMpLAorCWRpc2FsbG93ZWRCeUxvY2FsUmVndWxhdG9yeVJlcXVpcmVtZW50cyAoNCksCisJLi4uLAorCXVuYXV0aG9yaXplZFByaXZhY3lDbGFzcyAoNSksCisJdW5hdXRob3JpemVkQ2FsbFNlc3Npb25VbnJlbGF0ZWRFeHRlcm5hbENsaWVudCAoNiksCisJdW5hdXRob3JpemVkQ2FsbFNlc3Npb25SZWxhdGVkRXh0ZXJuYWxDbGllbnQgKDcpIH0KKy0tCWV4Y2VwdGlvbiBoYW5kbGluZzoKKy0tCWFueSB1bnJlY29nbml6ZWQgdmFsdWUgc2hhbGwgYmUgaWdub3JlZAorCitQb3NpdGlvbk1ldGhvZEZhaWx1cmUtUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlwb3NpdGlvbk1ldGhvZEZhaWx1cmUtRGlhZ25vc3RpYwlbMF0gUG9zaXRpb25NZXRob2RGYWlsdXJlLURpYWdub3N0aWMJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsxXSBFeHRlbnNpb25Db250YWluZXIJCQlPUFRJT05BTCwKKwkuLi4gfQorCitQb3NpdGlvbk1ldGhvZEZhaWx1cmUtRGlhZ25vc3RpYyA6Oj0gRU5VTUVSQVRFRCB7CisJY29uZ2VzdGlvbiAgKDApLAorCWluc3VmZmljaWVudFJlc291cmNlcyAgKDEpLAorCWluc3VmZmljaWVudE1lYXN1cmVtZW50RGF0YSAgKDIpLAorCWluY29uc2lzdGVudE1lYXN1cmVtZW50RGF0YSAgKDMpLAorCWxvY2F0aW9uUHJvY2VkdXJlTm90Q29tcGxldGVkICAoNCksCisJbG9jYXRpb25Qcm9jZWR1cmVOb3RTdXBwb3J0ZWRCeVRhcmdldE1TICAoNSksCisJcW9TTm90QXR0YWluYWJsZSAgKDYpLAorCXBvc2l0aW9uTWV0aG9kTm90QXZhaWxhYmxlSW5OZXR3b3JrCSg3KSwKKwlwb3NpdGlvbk1ldGhvZE5vdEF2YWlsYWJsZUluTG9jYXRpb25BcmVhCSg4KSwKKwkuLi4gfQorLS0JZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0JYW55IHVucmVjb2duaXplZCB2YWx1ZSBzaGFsbCBiZSBpZ25vcmVkCisKK1Vua25vd25PclVucmVhY2hhYmxlTENTQ2xpZW50LVBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK01NLUV2ZW50Tm90U3VwcG9ydGVkLVBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1RhcmdldENlbGxPdXRzaWRlR0NBLVBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK09uZ29pbmdHcm91cENhbGxQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCisKK0VORAorCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1FeHRlbnNpb25EYXRhVHlwZXMuYXNuIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtRXh0ZW5zaW9uRGF0YVR5cGVzLmFzbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTRjMDU3Ci0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtRXh0ZW5zaW9uRGF0YVR5cGVzLmFzbgpAQCAtMCwwICsxLDc0IEBACistLSAkSWQ6IE1BUC1FeHRlbnNpb25EYXRhVHlwZXMuYXNuIDI4MTQ5IDIwMDktMDQtMjUgMTc6NDU6MzRaIGV0eHJhYiAkCistLSBNQVAtRXh0ZW5zaW9uRGF0YVR5cGVzLmFzbgorLS0KKy0tIFRha2VuIGZyb20gM0dQUCBUUyAyOS4wMDIgVjguOS4wICgyMDA5LTA0KQorLS0KKy0tIDE3LjcuMTEgRXh0ZW5zaW9uIGRhdGEgdHlwZXMKKy0tCisKK01BUC1FeHRlbnNpb25EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtRXh0ZW5zaW9uRGF0YVR5cGVzICgyMSkgdmVyc2lvbjExICgxMSl9CisKK0RFRklOSVRJT05TCisKK0lNUExJQ0lUIFRBR1MKKworOjo9CisKK0JFR0lOCisKK0VYUE9SVFMKKworCVByaXZhdGVFeHRlbnNpb24sCisJRXh0ZW5zaW9uQ29udGFpbmVyLAorCVNMUi1BcmdFeHRlbnNpb25Db250YWluZXI7CisKKworLS0gSU9DIGZvciBwcml2YXRlIE1BUCBleHRlbnNpb25zCisKKworTUFQLUVYVEVOU0lPTiAgOjo9IENMQVNTIHsKKwkmRXh0ZW5zaW9uVHlwZQkJCQlPUFRJT05BTCwKKwkmZXh0ZW5zaW9uSWQgCU9CSkVDVCBJREVOVElGSUVSIH0KKwktLSBUaGUgbGVuZ3RoIG9mIHRoZSBPYmplY3QgSWRlbnRpZmllciBzaGFsbCBub3QgZXhjZWVkIDE2IG9jdGV0cyBhbmQgdGhlCisJLS0gbnVtYmVyIG9mIGNvbXBvbmVudHMgb2YgdGhlIE9iamVjdCBJZGVudGlmaWVyIHNoYWxsIG5vdCBleGNlZWQgMTYKKworLS0gZGF0YSB0eXBlcworCitFeHRlbnNpb25Db250YWluZXIgOjo9IFNFUVVFTkNFIHsKKwlwcml2YXRlRXh0ZW5zaW9uTGlzdAlbMF1Qcml2YXRlRXh0ZW5zaW9uTGlzdAlPUFRJT05BTCwgCisJcGNzLUV4dGVuc2lvbnMJWzFdUENTLUV4dGVuc2lvbnMJT1BUSU9OQUwsCisJLi4ufQorCitTTFItQXJnRXh0ZW5zaW9uQ29udGFpbmVyIDo6PSBTRVFVRU5DRSB7CisJcHJpdmF0ZUV4dGVuc2lvbkxpc3QJWzBdUHJpdmF0ZUV4dGVuc2lvbkxpc3QJT1BUSU9OQUwsIAorCXNsci1BcmctUENTLUV4dGVuc2lvbnMJWzFdU0xSLUFyZy1QQ1MtRXh0ZW5zaW9ucwlPUFRJT05BTCwKKwkuLi59CisKK1ByaXZhdGVFeHRlbnNpb25MaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZlByaXZhdGVFeHRlbnNpb25zKSBPRgorCQkJCVByaXZhdGVFeHRlbnNpb24KKworUHJpdmF0ZUV4dGVuc2lvbiA6Oj0gU0VRVUVOQ0UgeworCWV4dElkCQlNQVAtRVhURU5TSU9OLiZleHRlbnNpb25JZAorCQkJCSh7RXh0ZW5zaW9uU2V0fSksCisJZXh0VHlwZQkJTUFQLUVYVEVOU0lPTi4mRXh0ZW5zaW9uVHlwZQorCQkJCSh7RXh0ZW5zaW9uU2V0fXtAZXh0SWR9KQlPUFRJT05BTH0KKworbWF4TnVtT2ZQcml2YXRlRXh0ZW5zaW9ucyAgSU5URUdFUiA6Oj0gMTAKKworRXh0ZW5zaW9uU2V0CQlNQVAtRVhURU5TSU9OIDo6PQorCQl7Li4uCisJCSAtLSBFeHRlbnNpb25TZXQgaXMgdGhlIHNldCBvZiBhbGwgZGVmaW5lZCBwcml2YXRlIGV4dGVuc2lvbnMKKwl9CisJLS0gVW5zdXBwb3J0ZWQgcHJpdmF0ZSBleHRlbnNpb25zIHNoYWxsIGJlIGRpc2NhcmRlZCBpZiByZWNlaXZlZC4KKworUENTLUV4dGVuc2lvbnMgOjo9IFNFUVVFTkNFIHsKKwkuLi59CisKK1NMUi1BcmctUENTLUV4dGVuc2lvbnMgOjo9IFNFUVVFTkNFIHsKKwkuLi4sCisJbmEtRVNSSy1SZXF1ZXN0CVswXQlOVUxMCQlPUFRJT05BTCB9CisKK0VORAorCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1MQ1MtRGF0YVR5cGVzLmFzbiBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLUxDUy1EYXRhVHlwZXMuYXNuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MzRiODkKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1MQ1MtRGF0YVR5cGVzLmFzbgpAQCAtMCwwICsxLDY1NyBAQAorLS0gJElkOiBNQVAtTENTLURhdGFUeXBlcy5hc24gMjgxNDkgMjAwOS0wNC0yNSAxNzo0NTozNFogZXR4cmFiICQKKy0tIE1BUC1MQ1MtRGF0YVR5cGVzLmFzbgorLS0KKy0tIFRha2VuIGZyb20gM0dQUCBUUyAyOS4wMDIgIFY4LjkuMCAoMjAwOS0wNCkKKy0tCistLSAxNy43LjEzIExvY2F0aW9uIHNlcnZpY2UgZGF0YSB0eXBlcworLS0KKworTUFQLUxDUy1EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtTENTLURhdGFUeXBlcyAoMjUpIHZlcnNpb24xMSAoMTEpfQorCitERUZJTklUSU9OUworSU1QTElDSVQgVEFHUworOjo9CitCRUdJTgorCitFWFBPUlRTCisJUm91dGluZ0luZm9Gb3JMQ1MtQXJnLAorCVJvdXRpbmdJbmZvRm9yTENTLVJlcywKKwlQcm92aWRlU3Vic2NyaWJlckxvY2F0aW9uLUFyZywKKwlQcm92aWRlU3Vic2NyaWJlckxvY2F0aW9uLVJlcywKKwlTdWJzY3JpYmVyTG9jYXRpb25SZXBvcnQtQXJnLAorCVN1YnNjcmliZXJMb2NhdGlvblJlcG9ydC1SZXMsCitMb2NhdGlvblR5cGUsIAorRGVmZXJyZWRMb2NhdGlvbkV2ZW50VHlwZSwKK0xDU0NsaWVudE5hbWUsCitMQ1MtUW9TLAorSG9yaXpvbnRhbC1BY2N1cmFjeSwKK1Jlc3BvbnNlVGltZSwKK0V4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiwgCitWZWxvY2l0eUVzdGltYXRlLAorU3VwcG9ydGVkR0FEU2hhcGVzLAorQWRkLUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uLAorTENTUmVxdWVzdG9ySUQsIAorTENTLVJlZmVyZW5jZU51bWJlciwKK0xDU0NvZGV3b3JkLAorQXJlYUV2ZW50SW5mbywKK1JlcG9ydGluZ1BMTU5MaXN0LAorUGVyaW9kaWNMRFJJbmZvLAorU2VxdWVuY2VOdW1iZXIKKzsKKworSU1QT1JUUworCUFkZHJlc3NTdHJpbmcsCisJSVNETi1BZGRyZXNzU3RyaW5nLAorCUlNRUksCisJSU1TSSwKKwlMTVNJLAorCVN1YnNjcmliZXJJZGVudGl0eSwKKwlBZ2VPZkxvY2F0aW9uSW5mb3JtYXRpb24sCisJTENTQ2xpZW50RXh0ZXJuYWxJRCwKKwlMQ1NDbGllbnRJbnRlcm5hbElELAorTENTU2VydmljZVR5cGVJRCwKK0NlbGxHbG9iYWxJZE9yU2VydmljZUFyZWFJZE9yTEFJLAorUExNTi1JZAorRlJPTSBNQVAtQ29tbW9uRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUNvbW1vbkRhdGFUeXBlcyAoMTgpIHZlcnNpb24xMSAoMTEpfQorCisJRXh0ZW5zaW9uQ29udGFpbmVyLAorCVNMUi1BcmdFeHRlbnNpb25Db250YWluZXIKK0ZST00gTUFQLUV4dGVuc2lvbkRhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1FeHRlbnNpb25EYXRhVHlwZXMgKDIxKSB2ZXJzaW9uMTEgKDExKX0KKworCVVTU0QtRGF0YUNvZGluZ1NjaGVtZSwKK1VTU0QtU3RyaW5nCitGUk9NIE1BUC1TUy1EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpCisgICBtYXAtU1MtRGF0YVR5cGVzICgxNCkgdmVyc2lvbjExICgxMSl9CisKKwlBUE4sCisJR1NOLUFkZHJlc3MsCisJU3VwcG9ydGVkTENTLUNhcGFiaWxpdHlTZXRzCitGUk9NIE1BUC1NUy1EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtTVMtRGF0YVR5cGVzICgxMSkgdmVyc2lvbjExICgxMSl9CisKKwlBZGRpdGlvbmFsLU51bWJlcgorRlJPTSBNQVAtU00tRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLVNNLURhdGFUeXBlcyAoMTYpIHZlcnNpb24xMSAoMTEpfQorOworCisKK1JvdXRpbmdJbmZvRm9yTENTLUFyZyA6Oj0gU0VRVUVOQ0UgeworCW1sY051bWJlcgkJWzBdIElTRE4tQWRkcmVzc1N0cmluZywKKwl0YXJnZXRNUwkJWzFdIFN1YnNjcmliZXJJZGVudGl0eSwKKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1JvdXRpbmdJbmZvRm9yTENTLVJlcyA6Oj0gU0VRVUVOQ0UgeworCXRhcmdldE1TCQlbMF0gU3Vic2NyaWJlcklkZW50aXR5LAorCWxjc0xvY2F0aW9uSW5mbwlbMV0gTENTTG9jYXRpb25JbmZvLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwl2LWdtbGMtQWRkcmVzcwlbM10JR1NOLUFkZHJlc3MJT1BUSU9OQUwsCisJaC1nbWxjLUFkZHJlc3MJWzRdCUdTTi1BZGRyZXNzCU9QVElPTkFMLAorCXBwci1BZGRyZXNzCVs1XQlHU04tQWRkcmVzcwlPUFRJT05BTCwKKwlhZGRpdGlvbmFsLXYtZ21sYy1BZGRyZXNzCVs2XQlHU04tQWRkcmVzcwlPUFRJT05BTCB9CisKK0xDU0xvY2F0aW9uSW5mbyA6Oj0gU0VRVUVOQ0UgeworCW5ldHdvcmtOb2RlLU51bWJlcglJU0ROLUFkZHJlc3NTdHJpbmcsCisJLS0gTmV0d29ya05vZGUtbnVtYmVyIGNhbiBiZSBlaXRoZXIgbXNjLW51bWJlciBvciBzZ3NuLW51bWJlcgorCWxtc2kJCQlbMF0gTE1TSQkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsxXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwlncHJzTm9kZUluZGljYXRvciAJWzJdIE5VTEwJCU9QVElPTkFMLAorCS0tIGdwcnNOb2RlSW5kaWNhdG9yIGlzIHNldCBvbmx5IGlmIHRoZSBTR1NOIG51bWJlciBpcyBzZW50IGFzIHRoZSBOZXR3b3JrIE5vZGUgTnVtYmVyCisJYWRkaXRpb25hbC1OdW1iZXIJWzNdIEFkZGl0aW9uYWwtTnVtYmVyCU9QVElPTkFMLAorCXN1cHBvcnRlZExDUy1DYXBhYmlsaXR5U2V0cwlbNF0JU3VwcG9ydGVkTENTLUNhcGFiaWxpdHlTZXRzCU9QVElPTkFMLAorCWFkZGl0aW9uYWwtTENTLUNhcGFiaWxpdHlTZXRzCVs1XQlTdXBwb3J0ZWRMQ1MtQ2FwYWJpbGl0eVNldHMJT1BUSU9OQUwKKwl9CisKK1Byb3ZpZGVTdWJzY3JpYmVyTG9jYXRpb24tQXJnIDo6PSBTRVFVRU5DRSB7CisJbG9jYXRpb25UeXBlCUxvY2F0aW9uVHlwZSwKKwltbGMtTnVtYmVyCUlTRE4tQWRkcmVzc1N0cmluZywKKwlsY3MtQ2xpZW50SUQJWzBdIExDUy1DbGllbnRJRAlPUFRJT05BTCwKKwlwcml2YWN5T3ZlcnJpZGUJWzFdIE5VTEwJCU9QVElPTkFMLAorCWltc2kJCQlbMl0gSU1TSQkJT1BUSU9OQUwsCisJbXNpc2RuCQlbM10gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCWxtc2kJCQlbNF0gTE1TSQkJT1BUSU9OQUwsCisJaW1laQkJCVs1XSBJTUVJCQlPUFRJT05BTCwKKwlsY3MtUHJpb3JpdHkJWzZdIExDUy1Qcmlvcml0eQlPUFRJT05BTCwKKwlsY3MtUW9TCQlbN10gTENTLVFvUwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzhdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCXN1cHBvcnRlZEdBRFNoYXBlcwlbOV0JU3VwcG9ydGVkR0FEU2hhcGVzCU9QVElPTkFMLAorCWxjcy1SZWZlcmVuY2VOdW1iZXIJWzEwXQlMQ1MtUmVmZXJlbmNlTnVtYmVyCU9QVElPTkFMLAorCWxjc1NlcnZpY2VUeXBlSUQJWzExXQlMQ1NTZXJ2aWNlVHlwZUlECU9QVElPTkFMLAorCWxjc0NvZGV3b3JkCVsxMl0JTENTQ29kZXdvcmQJT1BUSU9OQUwsCisJbGNzLVByaXZhY3lDaGVjawlbMTNdCUxDUy1Qcml2YWN5Q2hlY2sJT1BUSU9OQUwsCisJYXJlYUV2ZW50SW5mbwlbMTRdCUFyZWFFdmVudEluZm8JT1BUSU9OQUwsCisJaC1nbWxjLUFkZHJlc3MJWzE1XQlHU04tQWRkcmVzcwlPUFRJT05BTCwKKwltby1sclNob3J0Q2lyY3VpdEluZGljYXRvcglbMTZdIE5VTEwJCU9QVElPTkFMLAorCXBlcmlvZGljTERSSW5mbwlbMTddIFBlcmlvZGljTERSSW5mbwlPUFRJT05BTCwKKwlyZXBvcnRpbmdQTE1OTGlzdAlbMThdIFJlcG9ydGluZ1BMTU5MaXN0CU9QVElPTkFMIH0KKworCS0tIG9uZSBvZiBpbXNpIG9yIG1zaXNkbiBpcyBtYW5kYXRvcnkKKwktLSBJZiBhIGxvY2F0aW9uIGVzdGltYXRlIHR5cGUgaW5kaWNhdGVzIGFjdGl2YXRlIGRlZmVycmVkIGxvY2F0aW9uIG9yIGNhbmNlbCBkZWZlcnJlZCAKKwktLSBsb2NhdGlvbiwgYSBsY3MtUmVmZXJlbmNlIG51bWJlciBzaGFsbCBiZSBpbmNsdWRlZC4KKworTG9jYXRpb25UeXBlIDo6PSBTRVFVRU5DRSB7CisJbG9jYXRpb25Fc3RpbWF0ZVR5cGUJWzBdIExvY2F0aW9uRXN0aW1hdGVUeXBlLAorCS4uLiwKKwlkZWZlcnJlZExvY2F0aW9uRXZlbnRUeXBlCVsxXSBEZWZlcnJlZExvY2F0aW9uRXZlbnRUeXBlCU9QVElPTkFMIH0KKworTG9jYXRpb25Fc3RpbWF0ZVR5cGUgOjo9IEVOVU1FUkFURUQgeworCWN1cnJlbnRMb2NhdGlvbgkoMCksCisJY3VycmVudE9yTGFzdEtub3duTG9jYXRpb24JKDEpLAorCWluaXRpYWxMb2NhdGlvbgkoMiksCisJLi4uLAorCWFjdGl2YXRlRGVmZXJyZWRMb2NhdGlvbgkoMyksCisJY2FuY2VsRGVmZXJyZWRMb2NhdGlvbgkoNCkgLAorCW5vdGlmaWNhdGlvblZlcmlmaWNhdGlvbk9ubHkJKDUpIH0KKy0tCWV4Y2VwdGlvbiBoYW5kbGluZzoKKy0tCWEgUHJvdmlkZVN1YnNjcmliZXJMb2NhdGlvbi1BcmcgY29udGFpbmluZyBhbiB1bnJlY29nbml6ZWQgTG9jYXRpb25Fc3RpbWF0ZVR5cGUKKy0tCXNoYWxsIGJlIHJlamVjdGVkIGJ5IHRoZSByZWNlaXZlciB3aXRoIGEgcmV0dXJuIGVycm9yIGNhdXNlIG9mIHVuZXhwZWN0ZWQgZGF0YSB2YWx1ZQorCitEZWZlcnJlZExvY2F0aW9uRXZlbnRUeXBlIDo6PSBCSVQgU1RSSU5HIHsKKwltc0F2YWlsYWJsZQkoMCkgLAorCWVudGVyaW5nSW50b0FyZWEJKDEpLAorCWxlYXZpbmdGcm9tQXJlYQkoMiksCisJYmVpbmdJbnNpZGVBcmVhCSgzKSAsCisJcGVyaW9kaWNMRFIJKDQpICB9IChTSVpFICgxLi4xNikpIAorLS0gYmVpbmdJbnNpZGVBcmVhIGlzIGFsd2F5cyB0cmVhdGVkIGFzIG9uZVRpbWVFdmVudCByZWdhcmRsZXNzIG9mIHRoZSBwb3NzaWJsZSB2YWx1ZQorLS0gb2Ygb2NjdXJyZW5jZUluZm8gaW5zaWRlIGFyZWFFdmVudEluZm8uCistLSBleGNlcHRpb24gaGFuZGxpbmc6CistLSBhIFByb3ZpZGVTdWJzY3JpYmVyTG9jYXRpb24tQXJnIGNvbnRhaW5pbmcgb3RoZXIgdmFsdWVzIHRoYW4gbGlzdGVkIGFib3ZlIGluIAorLS0gRGVmZXJyZWRMb2NhdGlvbkV2ZW50VHlwZSBzaGFsbCBiZSByZWplY3RlZCBieSB0aGUgcmVjZWl2ZXIgd2l0aCBhIHJldHVybiBlcnJvciBjYXVzZSBvZiAKKy0tIHVuZXhwZWN0ZWQgZGF0YSB2YWx1ZS4KKworTENTLUNsaWVudElEIDo6PSBTRVFVRU5DRSB7CisJbGNzQ2xpZW50VHlwZQlbMF0gTENTQ2xpZW50VHlwZSwKKwlsY3NDbGllbnRFeHRlcm5hbElECVsxXSBMQ1NDbGllbnRFeHRlcm5hbElECU9QVElPTkFMLAorCWxjc0NsaWVudERpYWxlZEJ5TVMJWzJdIEFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJbGNzQ2xpZW50SW50ZXJuYWxJRAlbM10gTENTQ2xpZW50SW50ZXJuYWxJRAlPUFRJT05BTCwKKwlsY3NDbGllbnROYW1lCVs0XSBMQ1NDbGllbnROYW1lCU9QVElPTkFMLAorCS4uLiwKKwlsY3NBUE4JCVs1XSBBUE4JCU9QVElPTkFMLAorCWxjc1JlcXVlc3RvcklECVs2XSBMQ1NSZXF1ZXN0b3JJRAlPUFRJT05BTCB9CisKK0xDU0NsaWVudFR5cGUgOjo9IEVOVU1FUkFURUQgeworCWVtZXJnZW5jeVNlcnZpY2VzCSgwKSwKKwl2YWx1ZUFkZGVkU2VydmljZXMJKDEpLAorCXBsbW5PcGVyYXRvclNlcnZpY2VzCSgyKSwKKwlsYXdmdWxJbnRlcmNlcHRTZXJ2aWNlcwkoMyksCisJLi4uIH0KKwktLQlleGNlcHRpb24gaGFuZGxpbmc6CisJLS0JdW5yZWNvZ25pemVkIHZhbHVlcyBtYXkgYmUgaWdub3JlZCBpZiB0aGUgTENTIGNsaWVudCB1c2VzIHRoZSBwcml2YWN5IG92ZXJyaWRlCisJLS0Jb3RoZXJ3aXNlLCBhbiB1bnJlY29nbml6ZWQgdmFsdWUgc2hhbGwgYmUgdHJlYXRlZCBhcyB1bmV4cGVjdGVkIGRhdGEgYnkgYSByZWNlaXZlcgorCS0tCWEgcmV0dXJuIGVycm9yIHNoYWxsIHRoZW4gYmUgcmV0dXJuZWQgaWYgcmVjZWl2ZWQgaW4gYSBNQVAgaW52b2tlIAorCitMQ1NDbGllbnROYW1lIDo6PSBTRVFVRU5DRSB7CisJZGF0YUNvZGluZ1NjaGVtZQlbMF0gVVNTRC1EYXRhQ29kaW5nU2NoZW1lLAorCW5hbWVTdHJpbmcJWzJdIE5hbWVTdHJpbmcsCisJLi4uLAorCWxjcy1Gb3JtYXRJbmRpY2F0b3IJWzNdIExDUy1Gb3JtYXRJbmRpY2F0b3IJT1BUSU9OQUwgfQorCistLSBUaGUgVVNTRC1EYXRhQ29kaW5nU2NoZW1lIHNoYWxsIGluZGljYXRlIHVzZSBvZiB0aGUgZGVmYXVsdCBhbHBoYWJldCB0aHJvdWdoIHRoZQorLS0gZm9sbG93aW5nIGVuY29kaW5nCistLQliaXQJNyA2IDUgNCAzIDIgMSAwCistLQkJMCAwIDAgMCAxIDEgMSAxCisKK05hbWVTdHJpbmcgOjo9IFVTU0QtU3RyaW5nIChTSVpFICgxLi5tYXhOYW1lU3RyaW5nTGVuZ3RoKSkKKworbWF4TmFtZVN0cmluZ0xlbmd0aCAgSU5URUdFUiA6Oj0gNjMKKworTENTUmVxdWVzdG9ySUQgOjo9IFNFUVVFTkNFIHsKKwlkYXRhQ29kaW5nU2NoZW1lCVswXSBVU1NELURhdGFDb2RpbmdTY2hlbWUsCisJcmVxdWVzdG9ySURTdHJpbmcJWzFdIFJlcXVlc3RvcklEU3RyaW5nLAorCS4uLiwKKwlsY3MtRm9ybWF0SW5kaWNhdG9yCVsyXSBMQ1MtRm9ybWF0SW5kaWNhdG9yCU9QVElPTkFMIH0KKworUmVxdWVzdG9ySURTdHJpbmcgOjo9IFVTU0QtU3RyaW5nIChTSVpFICgxLi5tYXhSZXF1ZXN0b3JJRFN0cmluZ0xlbmd0aCkpCisKK21heFJlcXVlc3RvcklEU3RyaW5nTGVuZ3RoICBJTlRFR0VSIDo6PSA2MworCitMQ1MtRm9ybWF0SW5kaWNhdG9yIDo6PSBFTlVNRVJBVEVEIHsKKwlsb2dpY2FsTmFtZQkoMCksCisJZS1tYWlsQWRkcmVzcwkoMSksCisJbXNpc2RuCQkoMiksCisJdXJsCQkJKDMpLAorCXNpcFVybAkJKDQpLAorCS4uLiB9CisKK0xDUy1Qcmlvcml0eSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSAwID0gaGlnaGVzdCBwcmlvcml0eQorCS0tIDEgPSBub3JtYWwgcHJpb3JpdHkKKwktLSBhbGwgb3RoZXIgdmFsdWVzIHRyZWF0ZWQgYXMgMSAKKworTENTLVFvUyA6Oj0gU0VRVUVOQ0UgeworCWhvcml6b250YWwtYWNjdXJhY3kJWzBdIEhvcml6b250YWwtQWNjdXJhY3kJT1BUSU9OQUwsCisJdmVydGljYWxDb29yZGluYXRlUmVxdWVzdAlbMV0gTlVMTAkJT1BUSU9OQUwsCisJdmVydGljYWwtYWNjdXJhY3kJWzJdIFZlcnRpY2FsLUFjY3VyYWN5CU9QVElPTkFMLAlyZXNwb25zZVRpbWUJWzNdIFJlc3BvbnNlVGltZQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzRdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJdmVsb2NpdHlSZXF1ZXN0CVs1XSBOVUxMCQlPUFRJT05BTAorfQorCitIb3Jpem9udGFsLUFjY3VyYWN5IDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCS0tIGJpdCA4ID0gMAorCS0tIGJpdHMgNy0xID0gNyBiaXQgVW5jZXJ0YWludHkgQ29kZSBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDMyLiBUaGUgaG9yaXpvbnRhbCBsb2NhdGlvbiAKKwktLSBlcnJvciBzaG91bGQgYmUgbGVzcyB0aGFuIHRoZSBlcnJvciBpbmRpY2F0ZWQgYnkgdGhlIHVuY2VydGFpbnR5IGNvZGUgd2l0aCA2NyUKKwktLSBjb25maWRlbmNlLgorCitWZXJ0aWNhbC1BY2N1cmFjeSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBiaXQgOCA9IDAKKwktLSBiaXRzIDctMSA9IDcgYml0IFZlcnRpY2FsIFVuY2VydGFpbnR5IENvZGUgZGVmaW5lZCBpbiAzR1BQIFRTIDIzLjAzMi4gCisJLS0gVGhlIHZlcnRpY2FsIGxvY2F0aW9uIGVycm9yIHNob3VsZCBiZSBsZXNzIHRoYW4gdGhlIGVycm9yIGluZGljYXRlZCAKKwktLSBieSB0aGUgdW5jZXJ0YWludHkgY29kZSB3aXRoIDY3JSBjb25maWRlbmNlLgorCitSZXNwb25zZVRpbWUgOjo9IFNFUVVFTkNFIHsKKwlyZXNwb25zZVRpbWVDYXRlZ29yeQlSZXNwb25zZVRpbWVDYXRlZ29yeSwKKwkuLi59CistLQlub3RlOiBhbiBleHBhbmRhYmxlIFNFUVVFTkNFIHNpbXBsaWZpZXMgbGF0ZXIgYWRkaXRpb24gb2YgYSBudW1lcmljIHJlc3BvbnNlIHRpbWUuCisKK1Jlc3BvbnNlVGltZUNhdGVnb3J5IDo6PSBFTlVNRVJBVEVEIHsKKwlsb3dkZWxheSAgKDApLAorCWRlbGF5dG9sZXJhbnQgICgxKSwKKwkuLi4gfQorLS0JZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0JYW4gdW5yZWNvZ25pemVkIHZhbHVlIHNoYWxsIGJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgdmFsdWUgMSAoZGVsYXl0b2xlcmFudCkKKworU3VwcG9ydGVkR0FEU2hhcGVzIDo6PSBCSVQgU1RSSU5HIHsKKwllbGxpcHNvaWRQb2ludCAgKDApLAorCWVsbGlwc29pZFBvaW50V2l0aFVuY2VydGFpbnR5Q2lyY2xlICgxKSwKKwllbGxpcHNvaWRQb2ludFdpdGhVbmNlcnRhaW50eUVsbGlwc2UgKDIpLAorCXBvbHlnb24gKDMpLAorCWVsbGlwc29pZFBvaW50V2l0aEFsdGl0dWRlICg0KSwKKwllbGxpcHNvaWRQb2ludFdpdGhBbHRpdHVkZUFuZFVuY2VydGFpbnR5RWxpcHNvaWQgKDUpLAorCWVsbGlwc29pZEFyYyAgKDYpIH0gKFNJWkUgKDcuLjE2KSkKKy0tIEEgbm9kZSBzaGFsbCBtYXJrIGluIHRoZSBCSVQgU1RSSU5HIGFsbCBTaGFwZXMgZGVmaW5lZCBpbiAzR1BQIFRTIDIzLjAzMiBpdCBzdXBwb3J0cy4KKy0tIGV4Y2VwdGlvbiBoYW5kbGluZzogYml0cyA3IHRvIDE1IHNoYWxsIGJlIGlnbm9yZWQgaWYgcmVjZWl2ZWQuCisKK0xDUy1SZWZlcmVuY2VOdW1iZXI6Oj0gT0NURVQgU1RSSU5HIChTSVpFKDEpKQorCitMQ1NDb2Rld29yZCA6Oj0gU0VRVUVOQ0UgeworCWRhdGFDb2RpbmdTY2hlbWUJWzBdIFVTU0QtRGF0YUNvZGluZ1NjaGVtZSwKKwlsY3NDb2Rld29yZFN0cmluZwlbMV0gTENTQ29kZXdvcmRTdHJpbmcsCisJLi4ufQorCitMQ1NDb2Rld29yZFN0cmluZyA6Oj0gVVNTRC1TdHJpbmcgKFNJWkUgKDEuLm1heExDU0NvZGV3b3JkU3RyaW5nTGVuZ3RoKSkKKworbWF4TENTQ29kZXdvcmRTdHJpbmdMZW5ndGggIElOVEVHRVIgOjo9IDIwCisKK0xDUy1Qcml2YWN5Q2hlY2sgOjo9IFNFUVVFTkNFIHsKKwljYWxsU2Vzc2lvblVucmVsYXRlZAlbMF0gUHJpdmFjeUNoZWNrUmVsYXRlZEFjdGlvbiwKKwljYWxsU2Vzc2lvblJlbGF0ZWQJWzFdIFByaXZhY3lDaGVja1JlbGF0ZWRBY3Rpb24JT1BUSU9OQUwsCisJLi4ufQorCitQcml2YWN5Q2hlY2tSZWxhdGVkQWN0aW9uIDo6PSBFTlVNRVJBVEVEIHsKKwlhbGxvd2VkV2l0aG91dE5vdGlmaWNhdGlvbiAoMCksCisJYWxsb3dlZFdpdGhOb3RpZmljYXRpb24gKDEpLAorCWFsbG93ZWRJZk5vUmVzcG9uc2UgKDIpLAorCXJlc3RyaWN0ZWRJZk5vUmVzcG9uc2UgKDMpLAorCW5vdEFsbG93ZWQgKDQpLAorCS4uLn0KKy0tCWV4Y2VwdGlvbiBoYW5kbGluZzoKKy0tCWEgUHJvdmlkZVN1YnNjcmliZXJMb2NhdGlvbi1BcmcgY29udGFpbmluZyBhbiB1bnJlY29nbml6ZWQgUHJpdmFjeUNoZWNrUmVsYXRlZEFjdGlvbgorLS0Jc2hhbGwgYmUgcmVqZWN0ZWQgYnkgdGhlIHJlY2VpdmVyIHdpdGggYSByZXR1cm4gZXJyb3IgY2F1c2Ugb2YgdW5leHBlY3RlZCBkYXRhIHZhbHVlCisKK0FyZWFFdmVudEluZm8gOjo9IFNFUVVFTkNFIHsKKwlhcmVhRGVmaW5pdGlvbglbMF0JQXJlYURlZmluaXRpb24sCisJb2NjdXJyZW5jZUluZm8JWzFdCU9jY3VycmVuY2VJbmZvCU9QVElPTkFMLAorCWludGVydmFsVGltZQlbMl0JSW50ZXJ2YWxUaW1lCU9QVElPTkFMLAorCS4uLn0KKworQXJlYURlZmluaXRpb24gOjo9IFNFUVVFTkNFIHsKKwlhcmVhTGlzdAkJWzBdCUFyZWFMaXN0LAorCS4uLn0KKworQXJlYUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mQXJlYXMpIE9GIEFyZWEKKworbWF4TnVtT2ZBcmVhcyAgSU5URUdFUiA6Oj0gMTAKKworQXJlYSA6Oj0gU0VRVUVOQ0UgeworCWFyZWFUeXBlCQlbMF0JQXJlYVR5cGUsCisJYXJlYUlkZW50aWZpY2F0aW9uCVsxXQlBcmVhSWRlbnRpZmljYXRpb24sCisJLi4ufQorCitBcmVhVHlwZSA6Oj0gRU5VTUVSQVRFRCB7CisJY291bnRyeUNvZGUJKDApLAorCXBsbW5JZAkJKDEpLAorCWxvY2F0aW9uQXJlYUlkCSgyKSwKKwlyb3V0aW5nQXJlYUlkCSgzKSwKKwljZWxsR2xvYmFsSWQJKDQpLAorCS4uLiwKKwl1dHJhbkNlbGxJZAkoNSkgfQorCitBcmVhSWRlbnRpZmljYXRpb24gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMi4uNykpCisJLS0gVGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6CisJLS0gb2N0ZXQgMSBiaXRzIDQzMjEJTW9iaWxlIENvdW50cnkgQ29kZSAxc3QgZGlnaXQKKwktLSAgICAgICAgIGJpdHMgODc2NQlNb2JpbGUgQ291bnRyeSBDb2RlIDJuZCBkaWdpdAorCS0tIG9jdGV0IDIgYml0cyA0MzIxCU1vYmlsZSBDb3VudHJ5IENvZGUgM3JkIGRpZ2l0CisJLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIE5ldHdvcmsgQ29kZSAzcmQgZGlnaXQgaWYgMyBkaWdpdCBNTkMgaW5jbHVkZWQKKwktLQkJCW9yIGZpbGxlciAoMTExMSkKKwktLSBvY3RldCAzIGJpdHMgNDMyMQlNb2JpbGUgTmV0d29yayBDb2RlIDFzdCBkaWdpdAorCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBOZXR3b3JrIENvZGUgMm5kIGRpZ2l0CisJLS0gb2N0ZXRzIDQgYW5kIDUJTG9jYXRpb24gQXJlYSBDb2RlIChMQUMpIGZvciBMb2NhbCBBcmVhIElkLAorCS0tCQkJUm91dGluZyBBcmVhIElkIGFuZCBDZWxsIEdsb2JhbCBJZAorCS0tIG9jdGV0IDYJUm91dGluZyBBcmVhIENvZGUgKFJBQykgZm9yIFJvdXRpbmcgQXJlYSBJZAorCS0tIG9jdGV0cyA2IGFuZCA3CUNlbGwgSWRlbnRpdHkgKENJKSBmb3IgQ2VsbCBHbG9iYWwgSWQKKwktLSBvY3RldHMgNCB1bnRpbCA3CVV0cmFuIENlbGwgSWRlbnRpdHkgKFVDLUlkKSBmb3IgVXRyYW4gQ2VsbCBJZAorCitPY2N1cnJlbmNlSW5mbyA6Oj0gRU5VTUVSQVRFRCB7CisJb25lVGltZUV2ZW50CSgwKSwKKwltdWx0aXBsZVRpbWVFdmVudAkoMSksCisJLi4ufQorCitJbnRlcnZhbFRpbWUgOjo9IElOVEVHRVIgKDEuLjMyNzY3KQorCS0tIG1pbmltdW0gaW50ZXJ2YWwgdGltZSBiZXR3ZWVuIGFyZWEgcmVwb3J0cyBpbiBzZWNvbmRzCisKK1BlcmlvZGljTERSSW5mbyA6Oj0gU0VRVUVOQ0UgeworCXJlcG9ydGluZ0Ftb3VudAkJUmVwb3J0aW5nQW1vdW50LAorCXJlcG9ydGluZ0ludGVydmFsCVJlcG9ydGluZ0ludGVydmFsLAorCS4uLn0KKy0tIHJlcG9ydGluZ0ludGVydmFsIHggcmVwb3J0aW5nQW1vdW50IHNoYWxsIG5vdCBleGNlZWQgODYzOTk5OSAoOTkgZGF5cywgMjMgaG91cnMsCistLSA1OSBtaW51dGVzIGFuZCA1OSBzZWNvbmRzKSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIE9NQSBNTFAgYW5kIFJMUAorCitSZXBvcnRpbmdBbW91bnQgOjo9IElOVEVHRVIgKDEuLm1heFJlcG9ydGluZ0Ftb3VudCkKKworbWF4UmVwb3J0aW5nQW1vdW50IElOVEVHRVIgOjo9IDg2Mzk5OTkKKworUmVwb3J0aW5nSW50ZXJ2YWwgOjo9IElOVEVHRVIgKDEuLm1heFJlcG9ydGluZ0ludGVydmFsKQorLS0gUmVwb3J0aW5nSW50ZXJ2YWwgaXMgaW4gc2Vjb25kcworCittYXhSZXBvcnRpbmdJbnRlcnZhbCBJTlRFR0VSIDo6PSA4NjM5OTk5CisKK1JlcG9ydGluZ1BMTU5MaXN0Ojo9IFNFUVVFTkNFIHsKKwlwbG1uLUxpc3RQcmlvcml0aXplZAkJCVswXSBOVUxMCQkJCQlPUFRJT05BTCwKKwlwbG1uLUxpc3QgCQkJCQkJWzFdIFBMTU5MaXN0LAorCS4uLn0KKworUExNTkxpc3Q6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZSZXBvcnRpbmdQTE1OKSBPRgorCQkJCVJlcG9ydGluZ1BMTU4KKworbWF4TnVtT2ZSZXBvcnRpbmdQTE1OIElOVEVHRVIgOjo9IDIwCisKK1JlcG9ydGluZ1BMTU46Oj0gU0VRVUVOQ0UgeworCXBsbW4tSWQgCQkJCQkJWzBdIFBMTU4tSWQsCisJcmFuLVRlY2hub2xvZ3kgCQkJCQlbMV0gUkFOLVRlY2hub2xvZ3kJCQlPUFRJT05BTCwKKwlyYW4tUGVyaW9kaWNMb2NhdGlvblN1cHBvcnQJCVsyXSBOVUxMCQkJCQlPUFRJT05BTCwKKwkuLi59CisKK1JBTi1UZWNobm9sb2d5IDo6PSBFTlVNRVJBVEVEIHsKKwlnc20JCQkoMCksCisJdW10cwkJKDEpLAorCS4uLn0KKworUHJvdmlkZVN1YnNjcmliZXJMb2NhdGlvbi1SZXMgOjo9IFNFUVVFTkNFIHsKKwlsb2NhdGlvbkVzdGltYXRlCUV4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiwKKwlhZ2VPZkxvY2F0aW9uRXN0aW1hdGUJWzBdIEFnZU9mTG9jYXRpb25JbmZvcm1hdGlvbglPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzFdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCWFkZC1Mb2NhdGlvbkVzdGltYXRlCVsyXSBBZGQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24gCU9QVElPTkFMLAorCWRlZmVycmVkbXQtbHJSZXNwb25zZUluZGljYXRvcglbM10gTlVMTAkJT1BUSU9OQUwsCisJZ2VyYW5Qb3NpdGlvbmluZ0RhdGEJWzRdIFBvc2l0aW9uaW5nRGF0YUluZm9ybWF0aW9uCU9QVElPTkFMLAorCXV0cmFuUG9zaXRpb25pbmdEYXRhCVs1XSBVdHJhblBvc2l0aW9uaW5nRGF0YUluZm8JT1BUSU9OQUwsCisJY2VsbElkT3JTYWkJWzZdIENlbGxHbG9iYWxJZE9yU2VydmljZUFyZWFJZE9yTEFJCU9QVElPTkFMLAorCXNhaS1QcmVzZW50CVs3XSBOVUxMCQlPUFRJT05BTCwKKwlhY2N1cmFjeUZ1bGZpbG1lbnRJbmRpY2F0b3IJWzhdIEFjY3VyYWN5RnVsZmlsbWVudEluZGljYXRvcgkJT1BUSU9OQUwsCisJdmVsb2NpdHlFc3RpbWF0ZQlbOV0gVmVsb2NpdHlFc3RpbWF0ZQlPUFRJT05BTCwKKwltby1sclNob3J0Q2lyY3VpdEluZGljYXRvcglbMTBdIE5VTEwJCU9QVElPTkFMIH0KKworLS0JaWYgZGVmZXJyZWRtdC1sclJlc3BvbnNlSW5kaWNhdG9yIGlzIHNldCwgbG9jYXRpb25Fc3RpbWF0ZSBpcyBpZ25vcmVkLgorCistLSB0aGUgYWRkLUxvY2F0aW9uRXN0aW1hdGUgcGFyYW1ldGVyIHNoYWxsIG5vdCBiZSBzZW50IHRvIGEgbm9kZSB0aGF0IGRpZCBub3QgaW5kaWNhdGUgdGhlCistLSBnZW9ncmFwaGljIHNoYXBlcyBzdXBwb3J0ZWQgaW4gdGhlIFByb3ZpZGVTdWJzY3JpYmVyTG9jYXRpb24tQXJnCistLSBUaGUgbG9jYXRpb25Fc3RpbWF0ZSBhbmQgdGhlIGFkZC1sb2NhdGlvbkVzdGltYXRlIHBhcmFtZXRlcnMgc2hhbGwgbm90IGJlIHNlbnQgaWYKKy0tIHRoZSBzdXBwb3J0ZWRHQURTaGFwZXMgcGFyYW1ldGVyIGhhcyBiZWVuIHJlY2VpdmVkIGluIFByb3ZpZGVTdWJzY3JpYmVyTG9jYXRpb24tQXJnCistLSBhbmQgdGhlIHNoYXBlIGVuY29kZWQgaW4gbG9jYXRpb25Fc3RpbWF0ZSBvciBhZGQtTG9jYXRpb25Fc3RpbWF0ZSBpcyBub3QgbWFya2VkCistLSBhcyBzdXBwb3J0ZWQgaW4gc3VwcG9ydGVkR0FEU2hhcGVzLiBJbiBzdWNoIGEgY2FzZSBQcm92aWRlU3Vic2NyaWJlckxvY2F0aW9uCistLSBzaGFsbCBiZSByZWplY3RlZCB3aXRoIGVycm9yIEZhY2lsaXR5Tm90U3VwcG9ydGVkIHdpdGggYWRkaXRpb25hbCBpbmRpY2F0aW9uCistLSBzaGFwZU9mTG9jYXRpb25Fc3RpbWF0ZU5vdFN1cHBvcnRlZC4KKy0tIHNhaS1QcmVzZW50IGluZGljYXRlcyB0aGF0IHRoZSBjZWxsSWRPclNhaSBwYXJhbWV0ZXIgY29udGFpbnMgYSBTZXJ2aWNlIEFyZWEgSWRlbnRpdHkuCisKK0FjY3VyYWN5RnVsZmlsbWVudEluZGljYXRvciA6Oj0gRU5VTUVSQVRFRCB7CisJcmVxdWVzdGVkQWNjdXJhY3lGdWxmaWxsZWQgICgwKSwKKwlyZXF1ZXN0ZWRBY2N1cmFjeU5vdEZ1bGZpbGxlZCAgKDEpLAorCS4uLgl9CisKK0V4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi5tYXhFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24pKQorCS0tIFJlZmVycyB0byBnZW9ncmFwaGljYWwgSW5mb3JtYXRpb24gZGVmaW5lZCBpbiAzR1BQIFRTIDIzLjAzMi4KKwktLSBUaGlzIGlzIGNvbXBvc2VkIG9mIDEgb3IgbW9yZSBvY3RldHMgd2l0aCBhbiBpbnRlcm5hbCBzdHJ1Y3R1cmUgYWNjb3JkaW5nIHRvCisJLS0gM0dQUCBUUyAyMy4wMzIKKwktLSBPY3RldCAxOiBUeXBlIG9mIHNoYXBlLCBvbmx5IHRoZSBmb2xsb3dpbmcgc2hhcGVzIGluIDNHUFAgVFMgMjMuMDMyIGFyZSBhbGxvd2VkOgorCS0tCQkoYSkgRWxsaXBzb2lkIHBvaW50IHdpdGggdW5jZXJ0YWludHkgY2lyY2xlCisJLS0JCShiKSBFbGxpcHNvaWQgcG9pbnQgd2l0aCB1bmNlcnRhaW50eSBlbGxpcHNlCisJLS0JCShjKSBFbGxpcHNvaWQgcG9pbnQgd2l0aCBhbHRpdHVkZSBhbmQgdW5jZXJ0YWludHkgZWxsaXBzb2lkCisJLS0JCShkKSBFbGxpcHNvaWQgQXJjCisJLS0JCShlKSBFbGxpcHNvaWQgUG9pbnQKKwktLSBBbnkgb3RoZXIgdmFsdWUgaW4gb2N0ZXQgMSBzaGFsbCBiZSB0cmVhdGVkIGFzIGludmFsaWQKKwktLSBPY3RldHMgMiB0byA4IGZvciBjYXNlIChhKSCWIEVsbGlwc29pZCBwb2ludCB3aXRoIHVuY2VydGFpbnR5IGNpcmNsZQorCS0tCQlEZWdyZWVzIG9mIExhdGl0dWRlCQkJCTMgb2N0ZXRzCisJLS0JCURlZ3JlZXMgb2YgTG9uZ2l0dWRlCQkJCTMgb2N0ZXRzCisJLS0JCVVuY2VydGFpbnR5IGNvZGUJCQkJMSBvY3RldAorCS0tIE9jdGV0cyAyIHRvIDExIGZvciBjYXNlIChiKSCWIEVsbGlwc29pZCBwb2ludCB3aXRoIHVuY2VydGFpbnR5IGVsbGlwc2U6CisJLS0JCURlZ3JlZXMgb2YgTGF0aXR1ZGUJCQkJMyBvY3RldHMKKwktLQkJRGVncmVlcyBvZiBMb25naXR1ZGUJCQkJMyBvY3RldHMKKwktLQkJVW5jZXJ0YWludHkgc2VtaS1tYWpvciBheGlzCQkJCTEgb2N0ZXQKKwktLQkJVW5jZXJ0YWludHkgc2VtaS1taW5vciBheGlzCQkJCTEgb2N0ZXQKKwktLQkJQW5nbGUgb2YgbWFqb3IgYXhpcwkJCQkxIG9jdGV0CisJLS0JCUNvbmZpZGVuY2UJCQkJMSBvY3RldAorCS0tIE9jdGV0cyAyIHRvIDE0IGZvciBjYXNlIChjKSCWIEVsbGlwc29pZCBwb2ludCB3aXRoIGFsdGl0dWRlIGFuZCB1bmNlcnRhaW50eSBlbGxpcHNvaWQKKwktLQkJRGVncmVlcyBvZiBMYXRpdHVkZQkJCQkzIG9jdGV0cworCS0tCQlEZWdyZWVzIG9mIExvbmdpdHVkZQkJCQkzIG9jdGV0cworCS0tCQlBbHRpdHVkZQkJCQkyIG9jdGV0cworCS0tCQlVbmNlcnRhaW50eSBzZW1pLW1ham9yIGF4aXMJCQkJMSBvY3RldAorCS0tCQlVbmNlcnRhaW50eSBzZW1pLW1pbm9yIGF4aXMJCQkJMSBvY3RldAorCS0tCQlBbmdsZSBvZiBtYWpvciBheGlzCQkJCTEgb2N0ZXQKKwktLQkJVW5jZXJ0YWludHkgYWx0aXR1ZGUJCQkJMSBvY3RldAorCS0tCQlDb25maWRlbmNlCQkJCTEgb2N0ZXQKKwktLSBPY3RldHMgMiB0byAxMyBmb3IgY2FzZSAoZCkgliBFbGxpcHNvaWQgQXJjCisJLS0JCURlZ3JlZXMgb2YgTGF0aXR1ZGUJCQkJMyBvY3RldHMKKwktLQkJRGVncmVlcyBvZiBMb25naXR1ZGUJCQkJMyBvY3RldHMKKwktLQkJSW5uZXIgcmFkaXVzCQkJCTIgb2N0ZXRzCisJLS0JCVVuY2VydGFpbnR5IHJhZGl1cwkJCQkxIG9jdGV0CisJLS0JCU9mZnNldCBhbmdsZQkJCQkxIG9jdGV0CisJLS0JCUluY2x1ZGVkIGFuZ2xlCQkJCTEgb2N0ZXQKKwktLQkJQ29uZmlkZW5jZQkJCQkxIG9jdGV0CisJLS0gT2N0ZXRzIDIgdG8gNyBmb3IgY2FzZSAoZSkgliBFbGxpcHNvaWQgUG9pbnQKKwktLQkJRGVncmVlcyBvZiBMYXRpdHVkZQkJCQkzIG9jdGV0cworCS0tCQlEZWdyZWVzIG9mIExvbmdpdHVkZQkJCQkzIG9jdGV0cworCisJLS0KKwktLSBBbiBFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24gcGFyYW1ldGVyIGNvbXByaXNpbmcgbW9yZSB0aGFuIG9uZSBvY3RldCBhbmQKKwktLSBjb250YWluaW5nIGFueSBvdGhlciBzaGFwZSBvciBhbiBpbmNvcnJlY3QgbnVtYmVyIG9mIG9jdGV0cyBvciBjb2RpbmcgYWNjb3JkaW5nCisJLS0gdG8gM0dQUCBUUyAyMy4wMzIgc2hhbGwgYmUgdHJlYXRlZCBhcyBpbnZhbGlkIGRhdGEgYnkgYSByZWNlaXZlci4KKwktLQorCS0tIEFuIEV4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiBwYXJhbWV0ZXIgY29tcHJpc2luZyBvbmUgb2N0ZXQgc2hhbGwgYmUgZGlzY2FyZGVkCisJLS0gYnkgdGhlIHJlY2VpdmVyIGlmIGFuIEFkZC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiBwYXJhbWV0ZXIgaXMgcmVjZWl2ZWQgCisJLS0gaW4gdGhlIHNhbWUgbWVzc2FnZS4KKwktLQorCS0tIEFuIEV4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiBwYXJhbWV0ZXIgY29tcHJpc2luZyBvbmUgb2N0ZXQgc2hhbGwgYmUgdHJlYXRlZCBhcworCS0tIGludmFsaWQgZGF0YSBieSB0aGUgcmVjZWl2ZXIgaWYgYW4gQWRkLUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uIHBhcmFtZXRlciBpcyBub3QKKwktLSByZWNlaXZlZCBpbiB0aGUgc2FtZSBtZXNzYWdlLgorCittYXhFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24gIElOVEVHRVIgOjo9IDIwCisJLS0gdGhlIG1heGltdW0gbGVuZ3RoIGFsbG93cyBmb3IgZnVydGhlciBzaGFwZXMgaW4gM0dQUCBUUyAyMy4wMzIgdG8gYmUgaW5jbHVkZWQgaW4gbGF0ZXIgCisJLS0gdmVyc2lvbnMgb2YgM0dQUCBUUyAyOS4wMDIKKworVmVsb2NpdHlFc3RpbWF0ZSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICg0Li43KSkKKwktLSBSZWZlcnMgdG8gVmVsb2NpdHkgZGVzY3JpcHRpb24gZGVmaW5lZCBpbiAzR1BQIFRTIDIzLjAzMi4KKwktLSBUaGlzIGlzIGNvbXBvc2VkIG9mIDQgb3IgbW9yZSBvY3RldHMgd2l0aCBhbiBpbnRlcm5hbCBzdHJ1Y3R1cmUgYWNjb3JkaW5nIHRvCisJLS0gM0dQUCBUUyAyMy4wMzIKKwktLSBPY3RldCAxOiBUeXBlIG9mIHZlbG9jaXR5LCBvbmx5IHRoZSBmb2xsb3dpbmcgdHlwZXMgaW4gM0dQUCBUUyAyMy4wMzIgYXJlIGFsbG93ZWQ6CisJLS0JCShhKSBIb3Jpem9udGFsIFZlbG9jaXR5CisJLS0JCShiKSBIb3Jpem9udGFsIHdpdGggVmVydGljYWwgVmVsb2NpdHkKKwktLQkJKGMpIEhvcml6b250YWwgVmVsb2NpdHkgd2l0aCBVbmNlcnRhaW50eQorCS0tCQkoZCkgSG9yaXpvbnRhbCB3aXRoIFZlcnRpY2FsIFZlbG9jaXR5IGFuZCBVbmNlcnRhaW50eQorCS0tIEZvciB0eXBlcyBIb3Jpem9udGFsIHdpdGggVmVydGljYWwgVmVsb2NpdHkgYW5kIEhvcml6b250YWwgd2l0aCBWZXJ0aWNhbCBWZWxvY2l0eQorCS0tIGFuZCBVbmNlcnRhaW50eSwgdGhlIGRpcmVjdGlvbiBvZiB0aGUgVmVydGljYWwgU3BlZWQgaXMgYWxzbyBpbmNsdWRlZCBpbiBPY3RldCAxCisJLS0gQW55IG90aGVyIHZhbHVlIGluIG9jdGV0IDEgc2hhbGwgYmUgdHJlYXRlZCBhcyBpbnZhbGlkCisJLS0gT2N0ZXRzIDIgdG8gNCBmb3IgY2FzZSAoYSkgSG9yaXpvbnRhbCB2ZWxvY2l0eToKKwktLQkJQmVhcmluZwkJCQkxIG9jdGV0CisJLS0JCUhvcml6b250YWwgU3BlZWQJCQkJMiBvY3RldHMKKwktLSBPY3RldHMgMiB0byA1IGZvciBjYXNlIChiKSCWIEhvcml6b250YWwgd2l0aCBWZXJ0aWNhbCBWZWxvY2l0eToKKwktLQkJQmVhcmluZwkJCQkxIG9jdGV0CisJLS0JCUhvcml6b250YWwgU3BlZWQJCQkJMiBvY3RldHMKKwktLQkJVmVydGljYWwgU3BlZWQJCQkJMSBvY3RldAorCS0tIE9jdGV0cyAyIHRvIDUgZm9yIGNhc2UgKGMpIJYgSG9yaXpvbnRhbCB2ZWxvY2l0eSB3aXRoIFVuY2VydGFpbnR5OgorCS0tCQlCZWFyaW5nCQkJCTEgb2N0ZXQKKwktLQkJSG9yaXpvbnRhbCBTcGVlZAkJCQkyIG9jdGV0cworCS0tCQlVbmNlcnRhaW50eSBTcGVlZAkJCQkxIG9jdGV0CisJLS0gT2N0ZXRzIDIgdG8gNyBmb3IgY2FzZSAoZCkgliBIb3Jpem9udGFsIHdpdGggVmVydGljYWwgVmVsb2NpdHkgYW5kIFVuY2VydGFpbnR5OgorCS0tCQlCZWFyaW5nCQkJCTEgb2N0ZXQKKwktLQkJSG9yaXpvbnRhbCBTcGVlZAkJCQkyIG9jdGV0cworCS0tCQlWZXJ0aWNhbCBTcGVlZAkJCQkxIG9jdGV0CisJLS0JCUhvcml6b250YWwgVW5jZXJ0YWludHkgU3BlZWQJCQkxIG9jdGV0CisJLS0JCVZlcnRpY2FsIFVuY2VydGFpbnR5IFNwZWVkCQkJCTEgb2N0ZXQKKworUG9zaXRpb25pbmdEYXRhSW5mb3JtYXRpb24gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMi4ubWF4UG9zaXRpb25pbmdEYXRhSW5mb3JtYXRpb24pKQorCS0tIFJlZmVycyB0byB0aGUgUG9zaXRpb25pbmcgRGF0YSBkZWZpbmVkIGluIDNHUFAgVFMgNDkuMDMxLgorCS0tIFRoaXMgaXMgY29tcG9zZWQgb2YgMiBvciBtb3JlIG9jdGV0cyB3aXRoIGFuIGludGVybmFsIHN0cnVjdHVyZSBhY2NvcmRpbmcgdG8KKwktLSAzR1BQIFRTIDQ5LjAzMS4gCisKK21heFBvc2l0aW9uaW5nRGF0YUluZm9ybWF0aW9uIElOVEVHRVIgOjo9IDEwCisJLS0gCisKK1V0cmFuUG9zaXRpb25pbmdEYXRhSW5mbyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgzLi5tYXhVdHJhblBvc2l0aW9uaW5nRGF0YUluZm8pKQorCS0tIFJlZmVycyB0byB0aGUgUG9zaXRpb24gRGF0YSBkZWZpbmVkIGluIDNHUFAgVFMgMjUuNDEzLgorCS0tIFRoaXMgaXMgY29tcG9zZWQgb2YgdGhlIHBvc2l0aW9uaW5nRGF0YURpc2NyaW1pbmF0b3IgYW5kIHRoZSBwb3NpdGlvbmluZ0RhdGFTZXQKKwktLSBpbmNsdWRlZCBpbiBwb3NpdGlvbkRhdGEgYXMgZGVmaW5lZCBpbiAzR1BQIFRTIDI1LjQxMy4KKworbWF4VXRyYW5Qb3NpdGlvbmluZ0RhdGFJbmZvIElOVEVHRVIgOjo9IDExCisJLS0gCisKK0FkZC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi5tYXhBZGQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24pKQorCS0tIFJlZmVycyB0byBnZW9ncmFwaGljYWwgSW5mb3JtYXRpb24gZGVmaW5lZCBpbiAzR1BQIFRTIDIzLjAzMi4KKwktLSBUaGlzIGlzIGNvbXBvc2VkIG9mIDEgb3IgbW9yZSBvY3RldHMgd2l0aCBhbiBpbnRlcm5hbCBzdHJ1Y3R1cmUgYWNjb3JkaW5nIHRvIAorCS0tIDNHUFAgVFMgMjMuMDMyCisJLS0gT2N0ZXQgMTogVHlwZSBvZiBzaGFwZSwgYWxsIHRoZSBzaGFwZXMgZGVmaW5lZCBpbiAzR1BQIFRTIDIzLjAzMiBhcmUgYWxsb3dlZDoKKwktLSBPY3RldHMgMiB0byBuICh3aGVyZSBuIGlzIHRoZSB0b3RhbCBudW1iZXIgb2Ygb2N0ZXRzIG5lY2Vzc2FyeSB0byBlbmNvZGUgdGhlIHNoYXBlCisJLS0gYWNjb3JkaW5nIHRvIDNHUFAgVFMgMjMuMDMyKSBhcmUgdXNlZCB0byBlbmNvZGUgdGhlIHNoYXBlIGl0c2VsZiBpbiBhY2NvcmRhbmNlIHdpdGggdGhlCisJLS0gZW5jb2RpbmcgZGVmaW5lZCBpbiAzR1BQIFRTIDIzLjAzMgorCS0tCisJLS0gQW4gQWRkLUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uIHBhcmFtZXRlciwgd2hldGhlciB2YWxpZCBvciBpbnZhbGlkLCByZWNlaXZlZCAKKwktLSB0b2dldGhlciB3aXRoIGEgdmFsaWQgRXh0LUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uIHBhcmFtZXRlciBpbiB0aGUgc2FtZSBtZXNzYWdlIAorCS0tIHNoYWxsIGJlIGRpc2NhcmRlZC4KKwktLQorCS0tIEFuIEFkZC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiBwYXJhbWV0ZXIgY29udGFpbmluZyBhbnkgc2hhcGUgbm90IGRlZmluZWQgaW4gCisJLS0gM0dQUCBUUyAyMy4wMzIgb3IgYW4gaW5jb3JyZWN0IG51bWJlciBvZiBvY3RldHMgb3IgY29kaW5nIGFjY29yZGluZyB0byAKKwktLSAzR1BQIFRTIDIzLjAzMiBzaGFsbCBiZSB0cmVhdGVkIGFzIGludmFsaWQgZGF0YSBieSBhIHJlY2VpdmVyIGlmIG5vdCByZWNlaXZlZCAKKwktLSB0b2dldGhlciB3aXRoIGEgdmFsaWQgRXh0LUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uIHBhcmFtZXRlciBpbiB0aGUgc2FtZSBtZXNzYWdlLgorCittYXhBZGQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24gIElOVEVHRVIgOjo9IDkxCisJLS0gdGhlIG1heGltdW0gbGVuZ3RoIGFsbG93cyBzdXBwb3J0IGZvciBhbGwgdGhlIHNoYXBlcyBjdXJyZW50bHkgZGVmaW5lZCBpbiAzR1BQIFRTIDIzLjAzMgorCitTdWJzY3JpYmVyTG9jYXRpb25SZXBvcnQtQXJnIDo6PSBTRVFVRU5DRSB7CisJbGNzLUV2ZW50CQlMQ1MtRXZlbnQsCisJbGNzLUNsaWVudElECUxDUy1DbGllbnRJRCwgCisJbGNzTG9jYXRpb25JbmZvCUxDU0xvY2F0aW9uSW5mbywKKwltc2lzZG4JCVswXSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJaW1zaQkJCVsxXSBJTVNJCQlPUFRJT05BTCwKKwlpbWVpCQkJWzJdIElNRUkJCU9QVElPTkFMLAorCW5hLUVTUkQJCVszXSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJbmEtRVNSSwkJWzRdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlsb2NhdGlvbkVzdGltYXRlCVs1XSBFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24JT1BUSU9OQUwsCisJYWdlT2ZMb2NhdGlvbkVzdGltYXRlCVs2XSBBZ2VPZkxvY2F0aW9uSW5mb3JtYXRpb24JT1BUSU9OQUwsCisJc2xyLUFyZ0V4dGVuc2lvbkNvbnRhaW5lcglbN10gU0xSLUFyZ0V4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCWFkZC1Mb2NhdGlvbkVzdGltYXRlCVs4XSBBZGQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24JT1BUSU9OQUwsCisJZGVmZXJyZWRtdC1sckRhdGEJWzldIERlZmVycmVkbXQtbHJEYXRhCU9QVElPTkFMLCAKKwlsY3MtUmVmZXJlbmNlTnVtYmVyCVsxMF0gTENTLVJlZmVyZW5jZU51bWJlcglPUFRJT05BTCwKKwlnZXJhblBvc2l0aW9uaW5nRGF0YQlbMTFdIFBvc2l0aW9uaW5nRGF0YUluZm9ybWF0aW9uCU9QVElPTkFMLAorCXV0cmFuUG9zaXRpb25pbmdEYXRhCVsxMl0gVXRyYW5Qb3NpdGlvbmluZ0RhdGFJbmZvCU9QVElPTkFMLAorCWNlbGxJZE9yU2FpCVsxM10JQ2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkT3JMQUkJT1BUSU9OQUwsCisJaC1nbWxjLUFkZHJlc3MJWzE0XQlHU04tQWRkcmVzcwlPUFRJT05BTCwKKwlsY3NTZXJ2aWNlVHlwZUlECVsxNV0JTENTU2VydmljZVR5cGVJRAlPUFRJT05BTCwKKwlzYWktUHJlc2VudAlbMTddIE5VTEwJCU9QVElPTkFMLAorCXBzZXVkb255bUluZGljYXRvcglbMThdIE5VTEwJCU9QVElPTkFMLAorCWFjY3VyYWN5RnVsZmlsbWVudEluZGljYXRvcglbMTldIEFjY3VyYWN5RnVsZmlsbWVudEluZGljYXRvcglPUFRJT05BTCwKKwl2ZWxvY2l0eUVzdGltYXRlCVsyMF0gVmVsb2NpdHlFc3RpbWF0ZQlPUFRJT05BTCwKKwlzZXF1ZW5jZU51bWJlcglbMjFdIFNlcXVlbmNlTnVtYmVyCU9QVElPTkFMLAorCXBlcmlvZGljTERSSW5mbwlbMjJdIFBlcmlvZGljTERSSW5mbwlPUFRJT05BTCwKKwltby1sclNob3J0Q2lyY3VpdEluZGljYXRvcglbMjNdIE5VTEwJCU9QVElPTkFMIH0KKworCS0tIG9uZSBvZiBtc2lzZG4gb3IgaW1zaSBpcyBtYW5kYXRvcnkKKwktLSBhIGxvY2F0aW9uIGVzdGltYXRlIHRoYXQgaXMgdmFsaWQgZm9yIHRoZSBsb2NhdGlvbkVzdGltYXRlIHBhcmFtZXRlciBzaG91bGQgCisJLS0gYmUgdHJhbnNmZXJyZWQgaW4gdGhpcyBwYXJhbWV0ZXIgaW4gcHJlZmVyZW5jZSB0byB0aGUgYWRkLUxvY2F0aW9uRXN0aW1hdGUuCisJLS0gdGhlIGRlZmVycmVkbXQtbHJEYXRhIHBhcmFtZXRlciBzaGFsbCBiZSBpbmNsdWRlZCBpZiBhbmQgb25seSBpZiB0aGUgbGNzLUV2ZW50CisJLS0gaW5kaWNhdGVzIGEgZGVmZXJyZWRtdC1sclJlc3BvbnNlLgorCS0tIGlmIHRoZSBsY3MtRXZlbnQgaW5kaWNhdGVzIGEgZGVmZXJyZWRtdC1sclJlc3BvbnNlIHRoZW4gdGhlIGxvY2F0aW9uRXN0aW1hdGUgCisJLS0gYW5kIHRoZSBhZGQtbG9jYXRpb25Fc3RpbWF0ZSBwYXJhbWV0ZXJzIHNoYWxsIG5vdCBiZSBzZW50IGlmIHRoZSAKKwktLSBzdXBwb3J0ZWRHQURTaGFwZXMgcGFyYW1ldGVyIGhhZCBiZWVuIHJlY2VpdmVkIGluIFByb3ZpZGVTdWJzY3JpYmVyTG9jYXRpb24tQXJnCisJLS0gYW5kIHRoZSBzaGFwZSBlbmNvZGVkIGluIGxvY2F0aW9uRXN0aW1hdGUgb3IgYWRkLUxvY2F0aW9uRXN0aW1hdGUgd2FzIG5vdCBtYXJrZWQKKwktLSBhcyBzdXBwb3J0ZWQgaW4gc3VwcG9ydGVkR0FEU2hhcGVzLiBJbiBzdWNoIGEgY2FzZSB0ZXJtaW5hdGlvbkNhdXNlIAorCS0tIGluIGRlZmVycmVkbXQtbHJEYXRhIHNoYWxsIGJlIHByZXNlbnQgd2l0aCB2YWx1ZSAKKwktLSBzaGFwZU9mTG9jYXRpb25Fc3RpbWF0ZU5vdFN1cHBvcnRlZC4gCisJLS0gSWYgYSBsY3MgZXZlbnQgaW5kaWNhdGVzIGRlZmVycmVkIG10LWxyIHJlc3BvbnNlLCB0aGUgbGNzLVJlZmVyZW5jZSBudW1iZXIgc2hhbGwgYmUgCisJLS0gaW5jbHVkZWQuIAorCS0tIHNhaS1QcmVzZW50IGluZGljYXRlcyB0aGF0IHRoZSBjZWxsSWRPclNhaSBwYXJhbWV0ZXIgY29udGFpbnMgYSBTZXJ2aWNlIEFyZWEgSWRlbnRpdHkuCisKK0RlZmVycmVkbXQtbHJEYXRhIDo6PSBTRVFVRU5DRSB7CisJZGVmZXJyZWRMb2NhdGlvbkV2ZW50VHlwZQlEZWZlcnJlZExvY2F0aW9uRXZlbnRUeXBlLAorCXRlcm1pbmF0aW9uQ2F1c2UJWzBdIFRlcm1pbmF0aW9uQ2F1c2UJT1BUSU9OQUwsCisJbGNzTG9jYXRpb25JbmZvCVsxXSBMQ1NMb2NhdGlvbkluZm8JT1BUSU9OQUwsCisJLi4ufQorCS0tIGxjc0xvY2F0aW9uSW5mbyBtYXkgYmUgaW5jbHVkZWQgb25seSBpZiBhIHRlcm1pbmF0aW9uQ2F1c2UgaXMgcHJlc2VudCAKKwktLSBpbmRpY2F0aW5nIG10LWxyUmVzdGFydC4KKworTENTLUV2ZW50IDo6PSBFTlVNRVJBVEVEIHsKKwllbWVyZ2VuY3lDYWxsT3JpZ2luYXRpb24gICgwKSwKKwllbWVyZ2VuY3lDYWxsUmVsZWFzZSAgKDEpLCAKKwltby1sciAgKDIpLAorCS4uLiwKKwlkZWZlcnJlZG10LWxyUmVzcG9uc2UgICgzKSAsCisJZGVmZXJyZWRtby1sclRUVFBJbml0aWF0aW9uICAoNCkgIH0KKwktLQlkZWZlcnJlZG10LWxyUmVzcG9uc2UgaXMgYXBwbGljYWJsZSB0byB0aGUgZGVsaXZlcnkgb2YgYSBsb2NhdGlvbiBlc3RpbWF0ZSAKKwktLQlmb3IgYW4gTERSIGluaXRpYXRlZCBlYXJsaWVyIGJ5IGVpdGhlciB0aGUgbmV0d29yayAodmlhIGFuIE1ULUxSIGFjdGl2YXRlIGRlZmVycmVkIAorCS0tCWxvY2F0aW9uKSBvciB0aGUgVUUgKHZpYSBhIGRlZmVycmVkIE1PLUxSIFRUVFAgaW5pdGlhdGlvbikKKwktLQlleGNlcHRpb24gaGFuZGxpbmc6CisJLS0JYSBTdWJzY3JpYmVyTG9jYXRpb25SZXBvcnQtQXJnIGNvbnRhaW5pbmcgYW4gdW5yZWNvZ25pemVkIExDUy1FdmVudAorCS0tCXNoYWxsIGJlIHJlamVjdGVkIGJ5IGEgcmVjZWl2ZXIgd2l0aCBhIHJldHVybiBlcnJvciBjYXVzZSBvZiB1bmV4cGVjdGVkIGRhdGEgdmFsdWUKKworVGVybWluYXRpb25DYXVzZSA6Oj0gRU5VTUVSQVRFRCB7CisJbm9ybWFsICAoMCksCisJZXJyb3J1bmRlZmluZWQgICgxKSwKKwlpbnRlcm5hbFRpbWVvdXQgICgyKSwKKwljb25nZXN0aW9uICAoMyksCisJbXQtbHJSZXN0YXJ0ICAoNCksCisJcHJpdmFjeVZpb2xhdGlvbiAgKDUpLAorCS4uLiwKKwlzaGFwZU9mTG9jYXRpb25Fc3RpbWF0ZU5vdFN1cHBvcnRlZCAoNikgLAorCXN1YnNjcmliZXJUZXJtaW5hdGlvbiAoNyksCisJdUVUZXJtaW5hdGlvbiAoOCksCisJbmV0d29ya1Rlcm1pbmF0aW9uICg5KSAgfSAKKy0tIG10LWxyUmVzdGFydCBzaGFsbCBiZSB1c2VkIHRvIHRyaWdnZXIgdGhlIEdNTEMgdG8gcmVzdGFydCB0aGUgbG9jYXRpb24gcHJvY2VkdXJlLCAKKy0tIGVpdGhlciBiZWNhdXNlIHRoZSBzZW5kaW5nIG5vZGUga25vd3MgdGhhdCB0aGUgdGVybWluYWwgaGFzIG1vdmVkIHVuZGVyIGNvdmVyYWdlIAorLS0gb2YgYW5vdGhlciBNU0Mgb3IgU0dTTiAoZS5nLiBTZW5kIElkZW50aWZpY2F0aW9uIHJlY2VpdmVkKSwgb3IgYmVjYXVzZSB0aGUgc3Vic2NyaWJlcgorLS0gaGFzIGJlZW4gZGVyZWdpc3RlcmVkIGR1ZSB0byBhIENhbmNlbCBMb2NhdGlvbiByZWNlaXZlZCBmcm9tIEhMUi4KKy0tCistLSBleGNlcHRpb24gaGFuZGxpbmcKKy0tIGFuIHVucmVjb2duaXplZCB2YWx1ZSBzaGFsbCBiZSB0cmVhdGVkIHRoZSBzYW1lIGFzIHZhbHVlIDEgKGVycm9ydW5kZWZpbmVkKSAKKworU2VxdWVuY2VOdW1iZXIgOjo9IElOVEVHRVIgKDEuLm1heFJlcG9ydGluZ0Ftb3VudCkKKworU3Vic2NyaWJlckxvY2F0aW9uUmVwb3J0LVJlcyA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsIAorCS4uLiwgCisJbmEtRVNSSwkJWzBdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwluYS1FU1JECQlbMV0gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCWgtZ21sYy1BZGRyZXNzCVsyXQlHU04tQWRkcmVzcwlPUFRJT05BTCwKKwltby1sclNob3J0Q2lyY3VpdEluZGljYXRvcglbM10gTlVMTAkJT1BUSU9OQUwsCisJcmVwb3J0aW5nUExNTkxpc3QJWzRdIFJlcG9ydGluZ1BMTU5MaXN0CU9QVElPTkFMLAorCWxjcy1SZWZlcmVuY2VOdW1iZXIJWzVdCUxDUy1SZWZlcmVuY2VOdW1iZXIJT1BUSU9OQUwgfQorCistLSBuYS1FU1JLIGFuZCBuYS1FU1JEIGFyZSBtdXR1YWxseSBleGNsdXNpdmUKKy0tCistLSBleGNlcHRpb24gaGFuZGxpbmcKKy0tIHJlY2VpcHQgb2YgYm90aCBuYS1FU1JLIGFuZCBuYS1FU1JEIHNoYWxsIGJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgYSByZXR1cm4gZXJyb3IKKworCitFTkQKKwpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtTVMtRGF0YVR5cGVzLmFzbiBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLU1TLURhdGFUeXBlcy5hc24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMxMmEwMgotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLU1TLURhdGFUeXBlcy5hc24KQEAgLTAsMCArMSwyNzgwIEBACistLSAkSWQ6IE1BUC1NUy1EYXRhVHlwZXMuYXNuIDI4MTQ5IDIwMDktMDQtMjUgMTc6NDU6MzRaIGV0eHJhYiAkCistLSAzR1BQIFRTIDI5LjAwMiBWOC45LjAgKDIwMDktMDQpIAorLS0gMTcuNy4xCU1vYmlsZSBTZXJ2aWNlIGRhdGEgdHlwZXMKKworTUFQLU1TLURhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1NUy1EYXRhVHlwZXMgKDExKSB2ZXJzaW9uMTEgKDExKX0KKworREVGSU5JVElPTlMKKworSU1QTElDSVQgVEFHUworCis6Oj0KKworQkVHSU4KKworRVhQT1JUUworCisJLS0gbG9jYXRpb24gcmVnaXN0cmF0aW9uIHR5cGVzCisJVXBkYXRlTG9jYXRpb25BcmcsCisJVXBkYXRlTG9jYXRpb25SZXMsCisJQ2FuY2VsTG9jYXRpb25BcmcsCisJQ2FuY2VsTG9jYXRpb25SZXMsIAorCVB1cmdlTVMtQXJnLCAKKwlQdXJnZU1TLVJlcywKKwlTZW5kSWRlbnRpZmljYXRpb25BcmcsCisJU2VuZElkZW50aWZpY2F0aW9uUmVzLCAKKwlVcGRhdGVHcHJzTG9jYXRpb25BcmcsCisJVXBkYXRlR3Byc0xvY2F0aW9uUmVzLAorCUlTVC1TdXBwb3J0SW5kaWNhdG9yLCAKKwlTdXBwb3J0ZWRMQ1MtQ2FwYWJpbGl0eVNldHMsCisKKwktLSBncHJzIGxvY2F0aW9uIHJlZ2lzdHJhdGlvbiB0eXBlcworCUdTTi1BZGRyZXNzLAorCisJLS0gaGFuZG92ZXIgdHlwZXMKKwlGb3J3YXJkQWNjZXNzU2lnbmFsbGluZy1BcmcsCisJUHJlcGFyZUhPLUFyZywKKwlQcmVwYXJlSE8tUmVzLAorCVByZXBhcmVTdWJzZXF1ZW50SE8tQXJnLCAKKwlQcmVwYXJlU3Vic2VxdWVudEhPLVJlcywKKwlQcm9jZXNzQWNjZXNzU2lnbmFsbGluZy1BcmcsCisJU2VuZEVuZFNpZ25hbC1BcmcsCisJU2VuZEVuZFNpZ25hbC1SZXMsCisKKwktLSBhdXRoZW50aWNhdGlvbiBtYW5hZ2VtZW50IHR5cGVzCisJU2VuZEF1dGhlbnRpY2F0aW9uSW5mb0FyZywKKwlTZW5kQXV0aGVudGljYXRpb25JbmZvUmVzLCAKKwlBdXRoZW50aWNhdGlvbkZhaWx1cmVSZXBvcnRBcmcsCitBdXRoZW50aWNhdGlvbkZhaWx1cmVSZXBvcnRSZXMsCisKKwktLSBzZWN1cml0eSBtYW5hZ2VtZW50IHR5cGVzCisJS2MsIAorCUNrc24sCisKKwktLSBlcXVpcG1lbnQgbWFuYWdlbWVudCB0eXBlcworCUNoZWNrSU1FSS1BcmcsCisJQ2hlY2tJTUVJLVJlcywKKworCS0tIHN1YnNjcmliZXIgbWFuYWdlbWVudCB0eXBlcworCUluc2VydFN1YnNjcmliZXJEYXRhQXJnLAorCUluc2VydFN1YnNjcmliZXJEYXRhUmVzLCAKKwlMU0FJZGVudGl0eSwKKwlEZWxldGVTdWJzY3JpYmVyRGF0YUFyZywKKwlEZWxldGVTdWJzY3JpYmVyRGF0YVJlcywKKwlFeHQtUW9TLVN1YnNjcmliZWQsCisJRXh0Mi1Rb1MtU3Vic2NyaWJlZCwgCisJRXh0My1Rb1MtU3Vic2NyaWJlZCwKKwlTdWJzY3JpYmVyRGF0YSwKKwlPREItRGF0YSwKKwlTdWJzY3JpYmVyU3RhdHVzLAorCVpvbmVDb2RlTGlzdCwKKwltYXhOdW1PZlpvbmVDb2RlcywgCisJTy1DU0ksIAorRC1DU0ksCisJTy1CY3NtQ2FtZWxURFBDcml0ZXJpYUxpc3QsIAorCVQtQkNTTS1DQU1FTC1URFAtQ3JpdGVyaWFMaXN0LAorCVNTLUNTSSwKKwlTZXJ2aWNlS2V5LAorCURlZmF1bHRDYWxsSGFuZGxpbmcsCisJQ2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcsCisJQmFzaWNTZXJ2aWNlQ3JpdGVyaWEsCisJU3VwcG9ydGVkQ2FtZWxQaGFzZXMsCisJT2ZmZXJlZENhbWVsNENTSXMsCisJT2ZmZXJlZENhbWVsNEZ1bmN0aW9uYWxpdGllcywKKwltYXhOdW1PZkNhbWVsVERQRGF0YSwKKwlDVUctSW5kZXgsIAorCUNVRy1JbmZvLAorCUNVRy1JbnRlcmxvY2ssCisJSW50ZXJDVUctUmVzdHJpY3Rpb25zLAorCUludHJhQ1VHLU9wdGlvbnMsCisJTm90aWZpY2F0aW9uVG9NU1VzZXIsIAorCVFvUy1TdWJzY3JpYmVkLAorSVNULUFsZXJ0VGltZXJWYWx1ZSwKKwlULUNTSSwKKwlULUJjc21UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQsCitBUE4sCitBZGRpdGlvbmFsSW5mbywKKworCS0tIGZhdWx0IHJlY292ZXJ5IHR5cGVzCisJUmVzZXRBcmcsCisJUmVzdG9yZURhdGFBcmcsCisJUmVzdG9yZURhdGFSZXMsCisKKy0tIHByb3ZpZGUgc3Vic2NyaWJlciBpbmZvIHR5cGVzIAorR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24sIAorTVMtQ2xhc3NtYXJrMiwKK0dQUlNNU0NsYXNzLAorCisJLS0gc3Vic2NyaWJlciBpbmZvcm1hdGlvbiBlbnF1aXJ5IHR5cGVzCisJUHJvdmlkZVN1YnNjcmliZXJJbmZvQXJnLAorCVByb3ZpZGVTdWJzY3JpYmVySW5mb1JlcywKKwlTdWJzY3JpYmVySW5mbywKKwlMb2NhdGlvbkluZm9ybWF0aW9uLAorCUxvY2F0aW9uSW5mb3JtYXRpb25HUFJTLAorCVJBSWRlbnRpdHksCisJU3Vic2NyaWJlclN0YXRlLAorCUdQUlNDaGFyZ2luZ0lELCAKK01OUEluZm9SZXMsCisJUm91dGVpbmdOdW1iZXIsCisKKwktLSBhbnkgdGltZSBpbmZvcm1hdGlvbiBlbnF1aXJ5IHR5cGVzCisJQW55VGltZUludGVycm9nYXRpb25BcmcsCisJQW55VGltZUludGVycm9nYXRpb25SZXMsCisKKwktLSBhbnkgdGltZSBpbmZvcm1hdGlvbiBoYW5kbGluZyB0eXBlcworCUFueVRpbWVTdWJzY3JpcHRpb25JbnRlcnJvZ2F0aW9uQXJnLAorCUFueVRpbWVTdWJzY3JpcHRpb25JbnRlcnJvZ2F0aW9uUmVzLAorCUFueVRpbWVNb2RpZmljYXRpb25BcmcsCisJQW55VGltZU1vZGlmaWNhdGlvblJlcywKKworCS0tIHN1YnNjcmliZXIgZGF0YSBtb2RpZmljYXRpb24gbm90aWZpY2F0aW9uIHR5cGVzCisJTm90ZVN1YnNjcmliZXJEYXRhTW9kaWZpZWRBcmcsCisJTm90ZVN1YnNjcmliZXJEYXRhTW9kaWZpZWRSZXMsCisKKwktLSBncHJzIGxvY2F0aW9uIGluZm9ybWF0aW9uIHJldHJpZXZhbCB0eXBlcworCVNlbmRSb3V0aW5nSW5mb0ZvckdwcnNBcmcsCisJU2VuZFJvdXRpbmdJbmZvRm9yR3Byc1JlcywKKworCS0tIGZhaWx1cmUgcmVwb3J0aW5nIHR5cGVzCisJRmFpbHVyZVJlcG9ydEFyZywKKwlGYWlsdXJlUmVwb3J0UmVzLAorCisJLS0gZ3BycyBub3RpZmljYXRpb24gdHlwZXMKKwlOb3RlTXNQcmVzZW50Rm9yR3Byc0FyZywKKwlOb3RlTXNQcmVzZW50Rm9yR3Byc1JlcywKKworCS0tIE1vYmlsaXR5IE1hbmFnZW1lbnQgdHlwZXMKK05vdGVNTS1FdmVudEFyZywKKwlOb3RlTU0tRXZlbnRSZXMsCisJTnVtYmVyUG9ydGFiaWxpdHlTdGF0dXMsCisJUGFnaW5nQXJlYSwKKworCS0tIFZHQ1MgLyBWQlMgdHlwZXMgdHlwZXMKK0dyb3VwSWQsIAorTG9uZy1Hcm91cElkLAorQWRkaXRpb25hbFN1YnNjcmlwdGlvbnMKKworOworCitJTVBPUlRTCisJbWF4TnVtT2ZTUywKKwlTUy1TdWJzY3JpcHRpb25PcHRpb24sCisJU1MtTGlzdCwKKwlTUy1Gb3JCUy1Db2RlLAorCVBhc3N3b3JkCitGUk9NIE1BUC1TUy1EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtU1MtRGF0YVR5cGVzICgxNCkgdmVyc2lvbjExICgxMSl9CisKKwlTUy1Db2RlCitGUk9NIE1BUC1TUy1Db2RlIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLVNTLUNvZGUgKDE1KSB2ZXJzaW9uMTEgKDExKX0KKworCUV4dC1CZWFyZXJTZXJ2aWNlQ29kZQorRlJPTSBNQVAtQlMtQ29kZSB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1CUy1Db2RlICgyMCkgdmVyc2lvbjExICgxMSl9CisKKwlFeHQtVGVsZXNlcnZpY2VDb2RlCitGUk9NIE1BUC1UUy1Db2RlIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLVRTLUNvZGUgKDE5KSB2ZXJzaW9uMTEgKDExKX0KKworCUFkZHJlc3NTdHJpbmcsCitJU0ROLUFkZHJlc3NTdHJpbmcsIAorCUlTRE4tU3ViYWRkcmVzc1N0cmluZywgCisJRlROLUFkZHJlc3NTdHJpbmcsCisJQWNjZXNzTmV0d29ya1NpZ25hbEluZm8sCisJSU1TSSwgCisJSU1FSSwKKwlUTVNJLAorCUhMUi1MaXN0LAorCUxNU0ksCisJSWRlbnRpdHksCisJR2xvYmFsQ2VsbElkLAorCUNlbGxHbG9iYWxJZE9yU2VydmljZUFyZWFJZE9yTEFJLAorCUV4dC1CYXNpY1NlcnZpY2VDb2RlLAorCU5BRUEtUHJlZmVycmVkQ0ksCisJRU1MUFAtSW5mbywgCisJTUMtU1MtSW5mbywKKwlTdWJzY3JpYmVySWRlbnRpdHksCisJQWdlT2ZMb2NhdGlvbkluZm9ybWF0aW9uLAorCUxDU0NsaWVudEV4dGVybmFsSUQsCisJTENTQ2xpZW50SW50ZXJuYWxJRCwKKwlFeHQtU1MtU3RhdHVzLAorCUxDU1NlcnZpY2VUeXBlSUQsCisJQVNDSS1DYWxsUmVmZXJlbmNlLAorCVRCQ0QtU1RSSU5HLAorCUxBSUZpeGVkTGVuZ3RoLAorCVBMTU4tSWQsCitFTUxQUC1Qcmlvcml0eQorRlJPTSBNQVAtQ29tbW9uRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUNvbW1vbkRhdGFUeXBlcyAoMTgpIHZlcnNpb24xMSAoMTEpfQorCisJRXh0ZW5zaW9uQ29udGFpbmVyCitGUk9NIE1BUC1FeHRlbnNpb25EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtRXh0ZW5zaW9uRGF0YVR5cGVzICgyMSkgdmVyc2lvbjExICgxMSl9CisKKwlBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNCitGUk9NIE1BUC1FUi1EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtRVItRGF0YVR5cGVzICgxNykgdmVyc2lvbjExICgxMSl9CisKKwlUcmFjZVByb3BhZ2F0aW9uTGlzdAorRlJPTSBNQVAtT00tRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLU9NLURhdGFUeXBlcyAoMTIpIHZlcnNpb24xMSAoMTEpfQorCis7CisKKy0tIGxvY2F0aW9uIHJlZ2lzdHJhdGlvbiB0eXBlcworCitVcGRhdGVMb2NhdGlvbkFyZyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQlJTVNJLAorCW1zYy1OdW1iZXIJWzFdIElTRE4tQWRkcmVzc1N0cmluZywKKwl2bHItTnVtYmVyCUlTRE4tQWRkcmVzc1N0cmluZywKKwlsbXNpCQkJWzEwXSBMTVNJCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiAsCisJdmxyLUNhcGFiaWxpdHkJWzZdIFZMUi1DYXBhYmlsaXR5CU9QVElPTkFMLAorCWluZm9ybVByZXZpb3VzTmV0d29ya0VudGl0eQlbMTFdCU5VTEwJCU9QVElPTkFMLAorCWNzLUxDUy1Ob3RTdXBwb3J0ZWRCeVVFCVsxMl0JTlVMTAkJT1BUSU9OQUwsCisJdi1nbWxjLUFkZHJlc3MJWzJdCUdTTi1BZGRyZXNzCU9QVElPTkFMLAorCWFkZC1pbmZvCQlbMTNdIEFERC1JbmZvCU9QVElPTkFMLAorCXBhZ2luZ0FyZWEJWzE0XSBQYWdpbmdBcmVhCU9QVElPTkFMLAorCXNraXBTdWJzY3JpYmVyRGF0YVVwZGF0ZQlbMTVdIE5VTEwJCU9QVElPTkFMIAorCS0tIFRoZSBza2lwU3Vic2NyaWJlckRhdGFVcGRhdGUgcGFyYW1ldGVyIGluIHRoZSBVcGRhdGVMb2NhdGlvbkFyZyBhbmQgdGhlIEFERC1JbmZvCisJLS0gc3RydWN0dXJlcyBjYXJyeSB0aGUgc2FtZSBzZW1hbnRpYy4KKwkgfQorCitWTFItQ2FwYWJpbGl0eSA6Oj0gU0VRVUVOQ0V7CisJc3VwcG9ydGVkQ2FtZWxQaGFzZXMgIAlbMF0gU3VwcG9ydGVkQ2FtZWxQaGFzZXMJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCXNvbHNhU3VwcG9ydEluZGljYXRvcglbMl0gTlVMTAkJT1BUSU9OQUwsCisJaXN0U3VwcG9ydEluZGljYXRvcglbMV0gSVNULVN1cHBvcnRJbmRpY2F0b3IJT1BUSU9OQUwsCisJc3VwZXJDaGFyZ2VyU3VwcG9ydGVkSW5TZXJ2aW5nTmV0d29ya0VudGl0eQlbM10gU3VwZXJDaGFyZ2VySW5mbwlPUFRJT05BTCwKKwlsb25nRlROLVN1cHBvcnRlZAlbNF0JTlVMTAkJT1BUSU9OQUwsCisJc3VwcG9ydGVkTENTLUNhcGFiaWxpdHlTZXRzCVs1XQlTdXBwb3J0ZWRMQ1MtQ2FwYWJpbGl0eVNldHMJT1BUSU9OQUwsCisJb2ZmZXJlZENhbWVsNENTSXMJWzZdIE9mZmVyZWRDYW1lbDRDU0lzCU9QVElPTkFMLAorCXN1cHBvcnRlZFJBVC1UeXBlc0luZGljYXRvcglbN10JU3VwcG9ydGVkUkFULVR5cGVzCU9QVElPTkFMLAorCWxvbmdHcm91cElELVN1cHBvcnRlZAlbOF0JTlVMTAkJT1BUSU9OQUwgfQorCitTdXBwb3J0ZWRSQVQtVHlwZXM6Oj0gQklUIFNUUklORyB7CisJdXRyYW4gICgwKSwKKwlnZXJhbiAgKDEpLAorCWdhbiAgICAoMiksCisJaS1oc3BhLWV2b2x1dGlvbiAoMyksCisJZS11dHJhbgkoNCl9IChTSVpFICgyLi44KSkKKwktLSBleGNlcHRpb24gaGFuZGxpbmc6IGJpdHMgNSB0byA3IHNoYWxsIGJlIGlnbm9yZWQgaWYgcmVjZWl2ZWQgYW5kIG5vdCB1bmRlcnN0b29kCisJIAorCisKK1N1cGVyQ2hhcmdlckluZm8gOjo9IENIT0lDRSB7CisJc2VuZFN1YnNjcmliZXJEYXRhCVswXSBOVUxMLAorCXN1YnNjcmliZXJEYXRhU3RvcmVkCVsxXSBBZ2VJbmRpY2F0b3IgfQorCitBZ2VJbmRpY2F0b3IgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4uNikpCisJLS0gVGhlIGludGVybmFsIHN0cnVjdHVyZSBvZiB0aGlzIHBhcmFtZXRlciBpcyBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYy4KKworSVNULVN1cHBvcnRJbmRpY2F0b3IgOjo9ICBFTlVNRVJBVEVEIHsKKwliYXNpY0lTVFN1cHBvcnRlZAkoMCksCisJaXN0Q29tbWFuZFN1cHBvcnRlZAkoMSksCisJLi4ufQorLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0gcmVjZXB0aW9uIG9mIHZhbHVlcyA+IDEgc2hhbGwgYmUgbWFwcGVkIHRvICcgaXN0Q29tbWFuZFN1cHBvcnRlZCAnCisKK1N1cHBvcnRlZExDUy1DYXBhYmlsaXR5U2V0cyA6Oj0gQklUIFNUUklORyB7CisJbGNzQ2FwYWJpbGl0eVNldDEgKDApLAorCWxjc0NhcGFiaWxpdHlTZXQyICgxKSwKKwlsY3NDYXBhYmlsaXR5U2V0MyAoMiksCisJbGNzQ2FwYWJpbGl0eVNldDQgKDMpICwKKwlsY3NDYXBhYmlsaXR5U2V0NSAoNCkgfSAoU0laRSAoMi4uMTYpKSAKKy0tIENvcmUgbmV0d29yayBzaWduYWxsaW5nIGNhcGFiaWxpdHkgc2V0MSBpbmRpY2F0ZXMgTENTIFJlbGVhc2U5OCBvciBSZWxlYXNlOTkgdmVyc2lvbi4KKy0tIENvcmUgbmV0d29yayBzaWduYWxsaW5nIGNhcGFiaWxpdHkgc2V0MiBpbmRpY2F0ZXMgTENTIFJlbGVhc2U0LgorLS0gQ29yZSBuZXR3b3JrIHNpZ25hbGxpbmcgY2FwYWJpbGl0eSBzZXQzIGluZGljYXRlcyBMQ1MgUmVsZWFzZTUuCistLSBDb3JlIG5ldHdvcmsgc2lnbmFsbGluZyBjYXBhYmlsaXR5IHNldDQgaW5kaWNhdGVzIExDUyBSZWxlYXNlNi4KKy0tIENvcmUgbmV0d29yayBzaWduYWxsaW5nIGNhcGFiaWxpdHkgc2V0NSBpbmRpY2F0ZXMgTENTIFJlbGVhc2U3IG9yIGxhdGVyIHZlcnNpb24uCistLSBBIG5vZGUgc2hhbGwgbWFyayBpbiB0aGUgQklUIFNUUklORyBhbGwgTENTIGNhcGFiaWxpdHkgc2V0cyBpdCBzdXBwb3J0cy4gCistLSBJZiBubyBiaXQgaXMgc2V0IHRoZW4gdGhlIHNlbmRpbmcgbm9kZSBkb2VzIG5vdCBzdXBwb3J0IExDUy4KKy0tIElmIHRoZSBwYXJhbWV0ZXIgaXMgbm90IHNlbnQgYnkgYW4gVkxSIHRoZW4gdGhlIFZMUiBtYXkgc3VwcG9ydCBhdCBtb3N0IGNhcGFiaWxpdHkgc2V0MS4KKy0tIElmIHRoZSBwYXJhbWV0ZXIgaXMgbm90IHNlbnQgYnkgYW4gU0dTTiB0aGVuIG5vIHN1cHBvcnQgZm9yIExDUyBpcyBhc3N1bWVkLgorLS0gQW4gU0dTTiBpcyBub3QgYWxsb3dlZCB0byBpbmRpY2F0ZSBzdXBwb3J0IG9mIGNhcGFiaWxpdHkgc2V0MS4KKy0tIE90aGVyIGJpdHMgdGhhbiBsaXN0ZWQgYWJvdmUgc2hhbGwgYmUgZGlzY2FyZGVkLgorCitVcGRhdGVMb2NhdGlvblJlcyA6Oj0gU0VRVUVOQ0UgeworCWhsci1OdW1iZXIJSVNETi1BZGRyZXNzU3RyaW5nLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWFkZC1DYXBhYmlsaXR5CU5VTEwJCQlPUFRJT05BTCwKKwlwYWdpbmdBcmVhLUNhcGFiaWxpdHkJWzBdTlVMTAkJCU9QVElPTkFMIH0KKworQURELUluZm8gOjo9IFNFUVVFTkNFIHsKKwlpbWVpc3YJCVswXSBJTUVJLAorCXNraXBTdWJzY3JpYmVyRGF0YVVwZGF0ZQlbMV0gTlVMTAkJT1BUSU9OQUwsCisJLS0gVGhlIHNraXBTdWJzY3JpYmVyRGF0YVVwZGF0ZSBwYXJhbWV0ZXIgaW4gdGhlIFVwZGF0ZUxvY2F0aW9uQXJnIGFuZCB0aGUgQURELUluZm8KKwktLSBzdHJ1Y3R1cmVzIGNhcnJ5IHRoZSBzYW1lIHNlbWFudGljLgorCS4uLn0KKworCitQYWdpbmdBcmVhIDo6PSBTRVFVRU5DRSBTSVpFICgxLi41KSBPRiBMb2NhdGlvbkFyZWEgCisKKworTG9jYXRpb25BcmVhIDo6PSBDSE9JQ0UgeworCWxhaUZpeGVkTGVuZ3RoCVswXSBMQUlGaXhlZExlbmd0aCwKKwlsYWMJCQlbMV0gTEFDfQorCisKK0xBQyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgyKSkKKwktLSBSZWZlcnMgdG8gTG9jYXRpb24gQXJlYSBDb2RlIG9mIHRoZSBMb2NhdGlvbiBBcmVhIElkZW50aWZpY2F0aW9uIGRlZmluZWQgaW4gCisgICAgIC0tIDNHUFAgVFMgMjMuMDAzIFsxN10uCisJLS0gTG9jYXRpb24gQXJlYSBDb2RlIGFjY29yZGluZyB0byAzR1BQIFRTIDI0LjAwOCBbMzVdCisKK0NhbmNlbExvY2F0aW9uQXJnIDo6PSBbM10gU0VRVUVOQ0UgeworCWlkZW50aXR5CQlJZGVudGl0eSwKKwljYW5jZWxsYXRpb25UeXBlCUNhbmNlbGxhdGlvblR5cGUJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJdHlwZU9mVXBkYXRlCVswXSBUeXBlT2ZVcGRhdGUJT1BUSU9OQUwgfQorCitUeXBlT2ZVcGRhdGUgOjo9IEVOVU1FUkFURUQgeworCXNnc24tY2hhbmdlICgwKSwKKwltbWUtY2hhbmdlICgxKSwKKwkuLi59CisJLS0gVHlwZU9mVXBkYXRlIHNoYWxsIGJlIGFic2VudCBpZiBDYW5jZWxsYXRpb25UeXBlIGlzIGRpZmZlcmVudCBmcm9tIHVwZGF0ZVByb2NlZHVyZQorCitDYW5jZWxsYXRpb25UeXBlIDo6PSBFTlVNRVJBVEVEIHsKKwl1cGRhdGVQcm9jZWR1cmUJKDApLAorCXN1YnNjcmlwdGlvbldpdGhkcmF3CSgxKSwKKwkuLi59CisJLS0gVGhlIEhMUiBzaGFsbCBub3Qgc2VuZCB2YWx1ZXMgb3RoZXIgdGhhbiBsaXN0ZWQgYWJvdmUKKworQ2FuY2VsTG9jYXRpb25SZXMgOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworUHVyZ2VNUy1BcmcgOjo9IFszXSBTRVFVRU5DRSB7CisJaW1zaQkJCUlNU0ksCisJdmxyLU51bWJlcglbMF0gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCXNnc24tTnVtYmVyCVsxXQlJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1B1cmdlTVMtUmVzIDo6PSBTRVFVRU5DRSB7CisJZnJlZXplVE1TSQlbMF0JTlVMTAkJT1BUSU9OQUwsCisJZnJlZXplUC1UTVNJCVsxXQlOVUxMCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlmcmVlemVNLVRNU0kJWzJdCU5VTEwJCU9QVElPTkFMIH0KKworU2VuZElkZW50aWZpY2F0aW9uQXJnIDo6PSBTRVFVRU5DRSB7CisJdG1zaQkJCVRNU0ksCisJbnVtYmVyT2ZSZXF1ZXN0ZWRWZWN0b3JzCU51bWJlck9mUmVxdWVzdGVkVmVjdG9ycyAJT1BUSU9OQUwsCisJLS0gd2l0aGluIGEgZGlhbG9ndWUgbnVtYmVyT2ZSZXF1ZXN0ZWRWZWN0b3JzIHNoYWxsIGJlIHByZXNlbnQgaW4gCisJLS0gdGhlIGZpcnN0IHNlcnZpY2UgcmVxdWVzdCBhbmQgc2hhbGwgbm90IGJlIHByZXNlbnQgaW4gc3Vic2VxdWVudCBzZXJ2aWNlIHJlcXVlc3RzLiAKKwktLSBJZiByZWNlaXZlZCBpbiBhIHN1YnNlcXVlbnQgc2VydmljZSByZXF1ZXN0IGl0IHNoYWxsIGJlIGRpc2NhcmRlZC4gCisJc2VnbWVudGF0aW9uUHJvaGliaXRlZAlOVUxMCQkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJbXNjLU51bWJlcglJU0ROLUFkZHJlc3NTdHJpbmcgCU9QVElPTkFMLAorCXByZXZpb3VzLUxBSQlbMF0gTEFJRml4ZWRMZW5ndGgJT1BUSU9OQUwsCisJaG9wQ291bnRlcglbMV0gSG9wQ291bnRlcglPUFRJT05BTCB9CisKK0hvcENvdW50ZXIgOjo9IElOVEVHRVIgKDAuLjMpCisKK1NlbmRJZGVudGlmaWNhdGlvblJlcyA6Oj0gWzNdIFNFUVVFTkNFIHsKKwlpbXNpCQkJSU1TSQkJCU9QVElPTkFMLAorCS0tIElNU0kgc2hhbGwgYmUgcHJlc2VudCBpbiB0aGUgZmlyc3QgKG9yIG9ubHkpIHNlcnZpY2UgcmVzcG9uc2Ugb2YgYSBkaWFsb2d1ZS4KKwktLSBJZiBtdWx0aXBsZSBzZXJ2aWNlIHJlcXVlc3RzIGFyZSBwcmVzZW50IGluIGEgZGlhbG9ndWUgdGhlbiBJTVNJCisJLS0gc2hhbGwgbm90IGJlIHByZXNlbnQgaW4gYW55IHNlcnZpY2UgcmVzcG9uc2Ugb3RoZXIgdGhhbiB0aGUgZmlyc3Qgb25lLgorCWF1dGhlbnRpY2F0aW9uU2V0TGlzdAlBdXRoZW50aWNhdGlvblNldExpc3QJT1BUSU9OQUwsCisJY3VycmVudFNlY3VyaXR5Q29udGV4dAlbMl1DdXJyZW50U2VjdXJpdHlDb250ZXh0CU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbM10gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworLS0gYXV0aGVudGljYXRpb24gbWFuYWdlbWVudCB0eXBlcworCitBdXRoZW50aWNhdGlvblNldExpc3QgOjo9IENIT0lDRSB7CisJdHJpcGxldExpc3QJWzBdIFRyaXBsZXRMaXN0LAorCXF1aW50dXBsZXRMaXN0CVsxXSBRdWludHVwbGV0TGlzdCB9CisKK1RyaXBsZXRMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi41KSBPRgorCQkJCUF1dGhlbnRpY2F0aW9uVHJpcGxldAorCitRdWludHVwbGV0TGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4uNSkgT0YKKwkJCQlBdXRoZW50aWNhdGlvblF1aW50dXBsZXQKKworQXV0aGVudGljYXRpb25UcmlwbGV0IDo6PSBTRVFVRU5DRSB7CisJcmFuZAkJCVJBTkQsCisJc3JlcwkJCVNSRVMsCisJa2MJCQlLYywKKwkuLi59CisKK0F1dGhlbnRpY2F0aW9uUXVpbnR1cGxldCA6Oj0gU0VRVUVOQ0UgeworCXJhbmQJCQlSQU5ELAorCXhyZXMJCQlYUkVTLAorCWNrCQkJQ0ssCisJaWsJCQlJSywKKwlhdXRuCQkJQVVUTiwKKwkuLi59CisKK0N1cnJlbnRTZWN1cml0eUNvbnRleHQgOjo9IENIT0lDRSB7CisJZ3NtLVNlY3VyaXR5Q29udGV4dERhdGEJWzBdIEdTTS1TZWN1cml0eUNvbnRleHREYXRhLAorCXVtdHMtU2VjdXJpdHlDb250ZXh0RGF0YQlbMV0gVU1UUy1TZWN1cml0eUNvbnRleHREYXRhIH0KKworR1NNLVNlY3VyaXR5Q29udGV4dERhdGEgOjo9IFNFUVVFTkNFIHsKKwlrYwkJCUtjLAorCWNrc24JCQlDa3NuLAorCS4uLiB9CisKK1VNVFMtU2VjdXJpdHlDb250ZXh0RGF0YSA6Oj0gU0VRVUVOQ0UgeworCWNrCQkJQ0ssCisJaWsJCQlJSywKKwlrc2kJCQlLU0ksCisJLi4uIH0KKworUkFORCA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxNikpCisKK1NSRVMgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoNCkpCisKK0tjIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDgpKQorCitYUkVTIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDQuLjE2KSkKKworQ0sgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMTYpKQorCitJSyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxNikpCisKK0FVVE4gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMTYpKQorCitBVVRTIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDE0KSkKKworQ2tzbiA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlZmluZWQgaW4gM0dQUCBUUyAyNC4wMDgKKworS1NJIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBpbiAzR1BQIFRTIDI0LjAwOAorCitBdXRoZW50aWNhdGlvbkZhaWx1cmVSZXBvcnRBcmcgOjo9IFNFUVVFTkNFIHsKKwlpbXNpCQkJSU1TSSwKKwlmYWlsdXJlQ2F1c2UJRmFpbHVyZUNhdXNlLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwlyZS1hdHRlbXB0CUJPT0xFQU4JCU9QVElPTkFMLAorCWFjY2Vzc1R5cGUJQWNjZXNzVHlwZQlPUFRJT05BTCwKKwlyYW5kCQkJUkFORAkJCU9QVElPTkFMLAorCXZsci1OdW1iZXIJWzBdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlzZ3NuLU51bWJlcglbMV0gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMIH0KKworQWNjZXNzVHlwZSA6Oj0gRU5VTUVSQVRFRCB7CisJY2FsbCAoMCksCisJZW1lcmdlbmN5Q2FsbCAoMSksCisJbG9jYXRpb25VcGRhdGluZyAoMiksCisJc3VwcGxlbWVudGFyeVNlcnZpY2UgKDMpLAorCXNob3J0TWVzc2FnZSAoNCksCisJZ3Byc0F0dGFjaCAoNSksCisJcm91dGluZ0FyZWFVcGRhdGluZyAoNiksCisJc2VydmljZVJlcXVlc3QgKDcpLAorCXBkcENvbnRleHRBY3RpdmF0aW9uICg4KSwKKwlwZHBDb250ZXh0RGVhY3RpdmF0aW9uICg5KSwKKwkuLi4sCisJZ3Byc0RldGFjaCAoMTApfQorCS0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKKwktLSByZWNlaXZlZCB2YWx1ZXMgZ3JlYXRlciB0aGFuIDEwIHNoYWxsIGJlIGlnbm9yZWQuCisKK0F1dGhlbnRpY2F0aW9uRmFpbHVyZVJlcG9ydFJlcyA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitGYWlsdXJlQ2F1c2UgOjo9IEVOVU1FUkFURUQgeworCXdyb25nVXNlclJlc3BvbnNlICAoMCksCisJd3JvbmdOZXR3b3JrU2lnbmF0dXJlICAoMSl9CisKKy0tIGdwcnMgbG9jYXRpb24gcmVnaXN0cmF0aW9uIHR5cGVzCisKK1VwZGF0ZUdwcnNMb2NhdGlvbkFyZyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQlJTVNJLAorCXNnc24tTnVtYmVyCUlTRE4tQWRkcmVzc1N0cmluZywJCisJc2dzbi1BZGRyZXNzCUdTTi1BZGRyZXNzLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwlzZ3NuLUNhcGFiaWxpdHkJWzBdIFNHU04tQ2FwYWJpbGl0eQlPUFRJT05BTCwKKwlpbmZvcm1QcmV2aW91c05ldHdvcmtFbnRpdHkJWzFdCU5VTEwJCU9QVElPTkFMLAorCXBzLUxDUy1Ob3RTdXBwb3J0ZWRCeVVFCVsyXQlOVUxMCQlPUFRJT05BTCwKKwl2LWdtbGMtQWRkcmVzcwlbM10JR1NOLUFkZHJlc3MJT1BUSU9OQUwsCisJYWRkLWluZm8JCVs0XSAgQURELUluZm8JT1BUSU9OQUwsCisJZXBzLWluZm8JCVs1XQlFUFMtSW5mbwlPUFRJT05BTCwKKwlzZXJ2aW5nTm9kZVR5cGVJbmRpY2F0b3IJWzZdCU5VTEwJCU9QVElPTkFMLAorCXNraXBTdWJzY3JpYmVyRGF0YVVwZGF0ZQlbN10gTlVMTAkJT1BUSU9OQUwsCisJdXNlZFJBVC1UeXBlCVs4XSBVc2VkLVJBVC1UeXBlCU9QVElPTkFMIAorCSB9CisKK1VzZWQtUkFULVR5cGU6Oj0gRU5VTUVSQVRFRCB7CisJdXRyYW4gICgwKSwKKwlnZXJhbiAgKDEpLAorCWdhbiAgICAoMiksCisJaS1oc3BhLWV2b2x1dGlvbiAoMyksCisJZS11dHJhbgkoNCksCisJLi4ufQorCitFUFMtSW5mbyA6Oj0gQ0hPSUNFeworCXBkbi1ndy11cGRhdGUJWzBdIFBETi1HVy1VcGRhdGUsCisJaXNyLUluZm9ybWF0aW9uCVsxXSBJU1ItSW5mb3JtYXRpb24gfQorCitQRE4tR1ctVXBkYXRlIDo6PSBTRVFVRU5DRXsKKwlhcG4JCQlbMF0gQVBOCQlPUFRJT05BTCwKKwlwZG4tZ3ctSWRlbnRpdHkJWzFdIFBETi1HVy1JZGVudGl0eQlPUFRJT05BTCwKKwljb250ZXh0SWQJCVsyXSBDb250ZXh0SWQgICAgICAgICAgICAgICAgICAgICBPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzNdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gfQorCitJU1ItSW5mb3JtYXRpb246Oj0gQklUIFNUUklORyB7CisJdXBkYXRlTU1FICAoMCksCisJY2FuY2VsU0dTTiAgKDEpfSAoU0laRSAoMi4uOCkpCisJLS0gZXhjZXB0aW9uIGhhbmRsaW5nOiByZWNlcHRpb24gb2YgdW5rbm93biBiaXQgYXNzaWdubWVudHMgaW4gdGhlCisJLS0gSVNSLUluZm9ybWF0aW9uIGRhdGEgdHlwZSBzaGFsbCBiZSBkaXNjYXJkZWQgYnkgdGhlIHJlY2VpdmVyIAorCitTR1NOLUNhcGFiaWxpdHkgOjo9IFNFUVVFTkNFeworCXNvbHNhU3VwcG9ydEluZGljYXRvcglOVUxMCQkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsxXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwlzdXBlckNoYXJnZXJTdXBwb3J0ZWRJblNlcnZpbmdOZXR3b3JrRW50aXR5CVsyXSBTdXBlckNoYXJnZXJJbmZvCU9QVElPTkFMICwKKwlncHJzRW5oYW5jZW1lbnRzU3VwcG9ydEluZGljYXRvciAJWzNdIE5VTEwJCU9QVElPTkFMLAorCXN1cHBvcnRlZENhbWVsUGhhc2VzICAJWzRdIFN1cHBvcnRlZENhbWVsUGhhc2VzCU9QVElPTkFMLAorCXN1cHBvcnRlZExDUy1DYXBhYmlsaXR5U2V0cwlbNV0gIFN1cHBvcnRlZExDUy1DYXBhYmlsaXR5U2V0cwlPUFRJT05BTCwKKwlvZmZlcmVkQ2FtZWw0Q1NJcwlbNl0gT2ZmZXJlZENhbWVsNENTSXMJT1BUSU9OQUwsCisJc21zQ2FsbEJhcnJpbmdTdXBwb3J0SW5kaWNhdG9yCVs3XQlOVUxMCQlPUFRJT05BTCwJc3VwcG9ydGVkUkFULVR5cGVzSW5kaWNhdG9yCVs4XQlTdXBwb3J0ZWRSQVQtVHlwZXMJT1BUSU9OQUwsCisJc3VwcG9ydGVkRmVhdHVyZXMJWzldIFN1cHBvcnRlZEZlYXR1cmVzCU9QVElPTkFMIH0KKworU3VwcG9ydGVkRmVhdHVyZXM6Oj0gQklUIFNUUklORyB7CisJb2RiLWFsbCAoMCksCisJb2RiLUhQTE1OLUFQTiAoMSksCisJb2RiLVZQTE1OLUFQTiAoMiksCisJcmVnU3ViICgzKX0gKFNJWkUgKDQuLjgpKQorCitHU04tQWRkcmVzcyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICg1Li4xNykpCisJLS0gT2N0ZXRzIGFyZSBjb2RlZCBhY2NvcmRpbmcgdG8gVFMgM0dQUCBUUyAyMy4wMDMgWzE3XQorCitVcGRhdGVHcHJzTG9jYXRpb25SZXMgOjo9IFNFUVVFTkNFIHsKKwlobHItTnVtYmVyCUlTRE4tQWRkcmVzc1N0cmluZywKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlhZGQtQ2FwYWJpbGl0eQlOVUxMCQkJT1BUSU9OQUwsCisJc2dzbi1tbWVTZXBhcmF0aW9uU3VwcG9ydGVkCVswXSBOVUxMCQlPUFRJT05BTCB9CisKKy0tIGhhbmRvdmVyIHR5cGVzCisKK0ZvcndhcmRBY2Nlc3NTaWduYWxsaW5nLUFyZyA6Oj0gWzNdIFNFUVVFTkNFIHsKKwlhbi1BUERVCQlBY2Nlc3NOZXR3b3JrU2lnbmFsSW5mbywKKwlpbnRlZ3JpdHlQcm90ZWN0aW9uSW5mbwlbMF0gSW50ZWdyaXR5UHJvdGVjdGlvbkluZm9ybWF0aW9uCQlPUFRJT05BTCwKKwllbmNyeXB0aW9uSW5mbwlbMV0gRW5jcnlwdGlvbkluZm9ybWF0aW9uCQlPUFRJT05BTCwKKwlrZXlTdGF0dXMJCVsyXQlLZXlTdGF0dXMJT1BUSU9OQUwsCisJYWxsb3dlZEdTTS1BbGdvcml0aG1zCVs0XQlBbGxvd2VkR1NNLUFsZ29yaXRobXMJT1BUSU9OQUwsCisJYWxsb3dlZFVNVFMtQWxnb3JpdGhtcwlbNV0JQWxsb3dlZFVNVFMtQWxnb3JpdGhtcwlPUFRJT05BTCwKKwlyYWRpb1Jlc291cmNlSW5mb3JtYXRpb24JWzZdIFJhZGlvUmVzb3VyY2VJbmZvcm1hdGlvbglPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzNdCUV4dGVuc2lvbkNvbnRhaW5lciAJT1BUSU9OQUwsCisJLi4uLAorCXJhZGlvUmVzb3VyY2VMaXN0CVs3XQlSYWRpb1Jlc291cmNlTGlzdAlPUFRJT05BTCwKKwlic3NtYXAtU2VydmljZUhhbmRvdmVyCVs5XQlCU1NNQVAtU2VydmljZUhhbmRvdmVyCU9QVElPTkFMLAorCXJhbmFwLVNlcnZpY2VIYW5kb3ZlcglbOF0JUkFOQVAtU2VydmljZUhhbmRvdmVyCU9QVElPTkFMLAorCWJzc21hcC1TZXJ2aWNlSGFuZG92ZXJMaXN0CVsxMF0JQlNTTUFQLVNlcnZpY2VIYW5kb3Zlckxpc3QJT1BUSU9OQUwsCisJY3VycmVudGx5VXNlZENvZGVjCVsxMV0gQ29kZWMJT1BUSU9OQUwsCisJaXVTdXBwb3J0ZWRDb2RlY3NMaXN0CVsxMl0gU3VwcG9ydGVkQ29kZWNzTGlzdAlPUFRJT05BTCwKKwlyYWItQ29uZmlndXJhdGlvbkluZGljYXRvcglbMTNdIE5VTEwJCU9QVElPTkFMLAorCWl1U2VsZWN0ZWRDb2RlYwlbMTRdCUNvZGVjCU9QVElPTkFMLAorCWFsdGVybmF0aXZlQ2hhbm5lbFR5cGUJWzE1XQlSYWRpb1Jlc291cmNlSW5mb3JtYXRpb24JT1BUSU9OQUwsCisJdHJhY2VQcm9wYWdhdGlvbkxpc3QJWzE3XQlUcmFjZVByb3BhZ2F0aW9uTGlzdAlPUFRJT05BTCB9CisKK0FsbG93ZWRHU00tQWxnb3JpdGhtcyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgY29kZWQgYXMgQWxnb3JpdGhtIGlkZW50aWZpZXIgb2N0ZXQgZnJvbQorCS0tIFBlcm1pdHRlZCBBbGdvcml0aG1zIGRlZmluZWQgaW4gM0dQUCBUUyA0OC4wMDgKKwktLSBBIG5vZGUgc2hhbGwgbWFyayBhbGwgR1NNIGFsZ29yaXRobXMgdGhhdCBhcmUgYWxsb3dlZCBpbiBNU0MtQgorCitBbGxvd2VkVU1UUy1BbGdvcml0aG1zIDo6PSBTRVFVRU5DRSB7CisJaW50ZWdyaXR5UHJvdGVjdGlvbkFsZ29yaXRobXMJWzBdIAlQZXJtaXR0ZWRJbnRlZ3JpdHlQcm90ZWN0aW9uQWxnb3JpdGhtcwlPUFRJT05BTCwKKwllbmNyeXB0aW9uQWxnb3JpdGhtcwlbMV0gCVBlcm1pdHRlZEVuY3J5cHRpb25BbGdvcml0aG1zCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzJdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1Blcm1pdHRlZEludGVncml0eVByb3RlY3Rpb25BbGdvcml0aG1zIDo6PQorCQlPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLm1heFBlcm1pdHRlZEludGVncml0eVByb3RlY3Rpb25BbGdvcml0aG1zTGVuZ3RoKSkKKwktLSBPY3RldHMgY29udGFpbiBhIGNvbXBsZXRlIFBlcm1pdHRlZEludGVncml0eVByb3RlY3Rpb25BbGdvcml0aG1zIGRhdGEgdHlwZSAKKwktLSBhcyBkZWZpbmVkIGluIDNHUFAgVFMgMjUuNDEzLCBlbmNvZGVkIGFjY29yZGluZyB0byB0aGUgZW5jb2Rpbmcgc2NoZW1lIAorCS0tIG1hbmRhdGVkIGJ5IDNHUFAgVFMgMjUuNDEzLiAKKwktLSBQYWRkaW5nIGJpdHMgYXJlIGluY2x1ZGVkLCBpZiBuZWVkZWQsIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSAKKwktLSBsYXN0IG9jdGV0IG9mIHRoZSBvY3RldCBzdHJpbmcuIAorCisKK21heFBlcm1pdHRlZEludGVncml0eVByb3RlY3Rpb25BbGdvcml0aG1zTGVuZ3RoIElOVEVHRVIgOjo9IDkKKworUGVybWl0dGVkRW5jcnlwdGlvbkFsZ29yaXRobXMgOjo9CisJCU9DVEVUIFNUUklORyAoU0laRSAoMS4ubWF4UGVybWl0dGVkRW5jcnlwdGlvbkFsZ29yaXRobXNMZW5ndGgpKQorCS0tIE9jdGV0cyBjb250YWluIGEgY29tcGxldGUgUGVybWl0dGVkRW5jcnlwdGlvbkFsZ29yaXRobXMgZGF0YSB0eXBlIAorCS0tIGFzIGRlZmluZWQgaW4gM0dQUCBUUyAyNS40MTMsIGVuY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGluZyBzY2hlbWUgCisJLS0gbWFuZGF0ZWQgYnkgM0dQUCBUUyAyNS40MTMKKwktLSBQYWRkaW5nIGJpdHMgYXJlIGluY2x1ZGVkLCBpZiBuZWVkZWQsIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSAKKwktLSBsYXN0IG9jdGV0IG9mIHRoZSBvY3RldCBzdHJpbmcuIAorCisKK21heFBlcm1pdHRlZEVuY3J5cHRpb25BbGdvcml0aG1zTGVuZ3RoIElOVEVHRVIgOjo9IDkKKworS2V5U3RhdHVzIDo6PSBFTlVNRVJBVEVEIHsKKwlvbGQgICgwKSwKKwluZXcgICgxKSwKKwkuLi59CisJLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgorCS0tIHJlY2VpdmVkIHZhbHVlcyBpbiByYW5nZSAyLTMxIHNoYWxsIGJlIHRyZWF0ZWQgYXMgIm9sZCIKKwktLSByZWNlaXZlZCB2YWx1ZXMgZ3JlYXRlciB0aGFuIDMxIHNoYWxsIGJlIHRyZWF0ZWQgYXMgIm5ldyIKKworUHJlcGFyZUhPLUFyZyA6Oj0gWzNdIFNFUVVFTkNFIHsKKwl0YXJnZXRDZWxsSWQJWzBdIEdsb2JhbENlbGxJZAlPUFRJT05BTCwKKwloby1OdW1iZXJOb3RSZXF1aXJlZAlOVUxMCQkJT1BUSU9OQUwsIAorCXRhcmdldFJOQ0lkCVsxXSBSTkNJZAkJT1BUSU9OQUwsCisJYW4tQVBEVQkJWzJdIEFjY2Vzc05ldHdvcmtTaWduYWxJbmZvCU9QVElPTkFMLAorCW11bHRpcGxlQmVhcmVyUmVxdWVzdGVkCVszXSBOVUxMCQlPUFRJT05BTCwKKwlpbXNpCQkJWzRdIElNU0kJCU9QVElPTkFMLAorCWludGVncml0eVByb3RlY3Rpb25JbmZvCVs1XSBJbnRlZ3JpdHlQcm90ZWN0aW9uSW5mb3JtYXRpb24JCU9QVElPTkFMLAorCWVuY3J5cHRpb25JbmZvCVs2XSBFbmNyeXB0aW9uSW5mb3JtYXRpb24JCU9QVElPTkFMLAorCXJhZGlvUmVzb3VyY2VJbmZvcm1hdGlvbglbN10gUmFkaW9SZXNvdXJjZUluZm9ybWF0aW9uCU9QVElPTkFMLAorCWFsbG93ZWRHU00tQWxnb3JpdGhtcwlbOV0JQWxsb3dlZEdTTS1BbGdvcml0aG1zCU9QVElPTkFMLAorCWFsbG93ZWRVTVRTLUFsZ29yaXRobXMJWzEwXQlBbGxvd2VkVU1UUy1BbGdvcml0aG1zCU9QVElPTkFMLAorCXJhZGlvUmVzb3VyY2VMaXN0CVsxMV0gUmFkaW9SZXNvdXJjZUxpc3QJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs4XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwlyYWItSWQJCVsxMl0gUkFCLUlkCU9QVElPTkFMLAorCWJzc21hcC1TZXJ2aWNlSGFuZG92ZXIJWzEzXQlCU1NNQVAtU2VydmljZUhhbmRvdmVyCU9QVElPTkFMLAorCXJhbmFwLVNlcnZpY2VIYW5kb3ZlcglbMTRdCVJBTkFQLVNlcnZpY2VIYW5kb3ZlcglPUFRJT05BTCwgCisJYnNzbWFwLVNlcnZpY2VIYW5kb3Zlckxpc3QJWzE1XQlCU1NNQVAtU2VydmljZUhhbmRvdmVyTGlzdAlPUFRJT05BTCwKKwlhc2NpQ2FsbFJlZmVyZW5jZQlbMjBdCUFTQ0ktQ2FsbFJlZmVyZW5jZQlPUFRJT05BTCwKKwlnZXJhbi1jbGFzc21hcmsJWzE2XSBHRVJBTi1DbGFzc21hcmsJT1BUSU9OQUwsCisJaXVDdXJyZW50bHlVc2VkQ29kZWMJWzE3XSBDb2RlYwlPUFRJT05BTCwKKwlpdVN1cHBvcnRlZENvZGVjc0xpc3QJWzE4XSBTdXBwb3J0ZWRDb2RlY3NMaXN0CU9QVElPTkFMLAorCXJhYi1Db25maWd1cmF0aW9uSW5kaWNhdG9yCVsxOV0gTlVMTAkJT1BUSU9OQUwsCisJdWVzYmktSXUJCVsyMV0JVUVTQkktSXUJT1BUSU9OQUwsCisJaW1laXN2CQlbMjJdCUlNRUkJCU9QVElPTkFMLAorCWFsdGVybmF0aXZlQ2hhbm5lbFR5cGUJWzIzXQlSYWRpb1Jlc291cmNlSW5mb3JtYXRpb24JT1BUSU9OQUwsCisJdHJhY2VQcm9wYWdhdGlvbkxpc3QJWzI1XQlUcmFjZVByb3BhZ2F0aW9uTGlzdAlPUFRJT05BTAkgfQorCitCU1NNQVAtU2VydmljZUhhbmRvdmVyTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4uIG1heE51bU9mU2VydmljZUhhbmRvdmVycykgT0YKKwkJCQlCU1NNQVAtU2VydmljZUhhbmRvdmVySW5mbworCitCU1NNQVAtU2VydmljZUhhbmRvdmVySW5mbyA6Oj0gU0VRVUVOQ0UgeworCWJzc21hcC1TZXJ2aWNlSGFuZG92ZXIJQlNTTUFQLVNlcnZpY2VIYW5kb3ZlciwKKwlyYWItSWQJCVJBQi1JZCwKKwktLSBSQUIgSWRlbnRpdHkgaXMgbmVlZGVkIHRvIHJlbGF0ZSB0aGUgc2VydmljZSBoYW5kb3ZlcnMgd2l0aCB0aGUgcmFkaW8gYWNjZXNzIGJlYXJlcnMuIAorCS4uLn0KKworbWF4TnVtT2ZTZXJ2aWNlSGFuZG92ZXJzICBJTlRFR0VSIDo6PSA3CisKK0JTU01BUC1TZXJ2aWNlSGFuZG92ZXIgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisJLS0gT2N0ZXRzIGFyZSBjb2RlZCBhY2NvcmRpbmcgdGhlIFNlcnZpY2UgSGFuZG92ZXIgaW5mb3JtYXRpb24gZWxlbWVudCBpbgorCS0tIDNHUFAgVFMgNDguMDA4LgorCitSQU5BUC1TZXJ2aWNlSGFuZG92ZXIgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisJLS0gT2N0ZXQgY29udGFpbnMgYSBjb21wbGV0ZSBTZXJ2aWNlLUhhbmRvdmVyIGRhdGEgdHlwZSAKKwktLSBhcyBkZWZpbmVkIGluIDNHUFAgVFMgMjUuNDEzLCBlbmNvZGVkIGFjY29yZGluZyB0byB0aGUgZW5jb2Rpbmcgc2NoZW1lIAorCS0tIG1hbmRhdGVkIGJ5IDNHUFAgVFMgMjUuNDEzCisJLS0gUGFkZGluZyBiaXRzIGFyZSBpbmNsdWRlZCBpbiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cy4gCisKKworUmFkaW9SZXNvdXJjZUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLiBtYXhOdW1PZlJhZGlvUmVzb3VyY2VzKSBPRgorCQkJCVJhZGlvUmVzb3VyY2UKKworUmFkaW9SZXNvdXJjZSA6Oj0gU0VRVUVOQ0UgeworCXJhZGlvUmVzb3VyY2VJbmZvcm1hdGlvbglSYWRpb1Jlc291cmNlSW5mb3JtYXRpb24sCisJcmFiLUlkCQlSQUItSWQsCisJLS0gUkFCIElkZW50aXR5IGlzIG5lZWRlZCB0byByZWxhdGUgdGhlIHJhZGlvIHJlc291cmNlcyB3aXRoIHRoZSByYWRpbyBhY2Nlc3MgYmVhcmVycy4gCisJLi4ufQorCittYXhOdW1PZlJhZGlvUmVzb3VyY2VzICBJTlRFR0VSIDo6PSA3CisKK1ByZXBhcmVITy1SZXMgOjo9IFszXSBTRVFVRU5DRSB7CisJaGFuZG92ZXJOdW1iZXIJWzBdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlyZWxvY2F0aW9uTnVtYmVyTGlzdAlbMV0JUmVsb2NhdGlvbk51bWJlckxpc3QJT1BUSU9OQUwsCisJYW4tQVBEVQkJWzJdCUFjY2Vzc05ldHdvcmtTaWduYWxJbmZvCU9QVElPTkFMLAorCW11bHRpY2FsbEJlYXJlckluZm8JWzNdCU11bHRpY2FsbEJlYXJlckluZm8JT1BUSU9OQUwsCisJbXVsdGlwbGVCZWFyZXJOb3RTdXBwb3J0ZWQJTlVMTAkJCU9QVElPTkFMLAorCXNlbGVjdGVkVU1UUy1BbGdvcml0aG1zCVs1XQlTZWxlY3RlZFVNVFMtQWxnb3JpdGhtcwlPUFRJT05BTCwKKwljaG9zZW5SYWRpb1Jlc291cmNlSW5mb3JtYXRpb24JWzZdIENob3NlblJhZGlvUmVzb3VyY2VJbmZvcm1hdGlvbgkgT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs0XQlFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWl1U2VsZWN0ZWRDb2RlYwlbN10gQ29kZWMJCU9QVElPTkFMLAorCWl1QXZhaWxhYmxlQ29kZWNzTGlzdAlbOF0gQ29kZWNMaXN0CU9QVElPTkFMIH0KKworU2VsZWN0ZWRVTVRTLUFsZ29yaXRobXMgOjo9IFNFUVVFTkNFIHsKKwlpbnRlZ3JpdHlQcm90ZWN0aW9uQWxnb3JpdGhtCVswXSAJQ2hvc2VuSW50ZWdyaXR5UHJvdGVjdGlvbkFsZ29yaXRobQlPUFRJT05BTCwKKwllbmNyeXB0aW9uQWxnb3JpdGhtCVsxXSAJQ2hvc2VuRW5jcnlwdGlvbkFsZ29yaXRobQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzJdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0Nob3NlbkludGVncml0eVByb3RlY3Rpb25BbGdvcml0aG0gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisJLS0gT2N0ZXQgY29udGFpbnMgYSBjb21wbGV0ZSBJbnRlZ3JpdHlQcm90ZWN0aW9uQWxnb3JpdGhtIGRhdGEgdHlwZSAKKwktLSBhcyBkZWZpbmVkIGluIDNHUFAgVFMgMjUuNDEzLCBlbmNvZGVkIGFjY29yZGluZyB0byB0aGUgZW5jb2Rpbmcgc2NoZW1lIAorCS0tIG1hbmRhdGVkIGJ5IDNHUFAgVFMgMjUuNDEzCisJLS0gUGFkZGluZyBiaXRzIGFyZSBpbmNsdWRlZCBpbiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cy4gCisKK0Nob3NlbkVuY3J5cHRpb25BbGdvcml0aG0gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisJLS0gT2N0ZXQgY29udGFpbnMgYSBjb21wbGV0ZSBFbmNyeXB0aW9uQWxnb3JpdGhtIGRhdGEgdHlwZSAKKwktLSBhcyBkZWZpbmVkIGluIDNHUFAgVFMgMjUuNDEzLCBlbmNvZGVkIGFjY29yZGluZyB0byB0aGUgZW5jb2Rpbmcgc2NoZW1lIAorCS0tIG1hbmRhdGVkIGJ5IDNHUFAgVFMgMjUuNDEzCisJLS0gUGFkZGluZyBiaXRzIGFyZSBpbmNsdWRlZCBpbiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cy4gCisKK0Nob3NlblJhZGlvUmVzb3VyY2VJbmZvcm1hdGlvbiA6Oj0gU0VRVUVOQ0UgeworCWNob3NlbkNoYW5uZWxJbmZvCVswXSBDaG9zZW5DaGFubmVsSW5mbwlPUFRJT05BTCwKKwljaG9zZW5TcGVlY2hWZXJzaW9uCVsxXSBDaG9zZW5TcGVlY2hWZXJzaW9uCU9QVElPTkFMLAorCS4uLn0KKworQ2hvc2VuQ2hhbm5lbEluZm8gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisJLS0gT2N0ZXRzIGFyZSBjb2RlZCBhY2NvcmRpbmcgdGhlIENob3NlbiBDaGFubmVsIGluZm9ybWF0aW9uIGVsZW1lbnQgaW4gM0dQUCBUUyA0OC4wMDgKKworQ2hvc2VuU3BlZWNoVmVyc2lvbiA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBPY3RldHMgYXJlIGNvZGVkIGFjY29yZGluZyB0aGUgU3BlZWNoIFZlcnNpb24gKGNob3NlbikgaW5mb3JtYXRpb24gZWxlbWVudCBpbiAzR1BQIFRTCisJLS0gNDguMDA4IAorCitQcmVwYXJlU3Vic2VxdWVudEhPLUFyZyA6Oj0gWzNdIFNFUVVFTkNFIHsKKwl0YXJnZXRDZWxsSWQJWzBdIEdsb2JhbENlbGxJZAlPUFRJT05BTCwKKwl0YXJnZXRNU0MtTnVtYmVyCVsxXSBJU0ROLUFkZHJlc3NTdHJpbmcsCisJdGFyZ2V0Uk5DSWQJWzJdIFJOQ0lkCQlPUFRJT05BTCwKKwlhbi1BUERVCQlbM10JQWNjZXNzTmV0d29ya1NpZ25hbEluZm8JT1BUSU9OQUwsCisJc2VsZWN0ZWRSYWItSWQJWzRdCVJBQi1JZAlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzVdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJZ2VyYW4tY2xhc3NtYXJrCVs2XSBHRVJBTi1DbGFzc21hcmsJT1BUSU9OQUwsCisJcmFiLUNvbmZpZ3VyYXRpb25JbmRpY2F0b3IJWzddIE5VTEwJCU9QVElPTkFMIH0KKworUHJlcGFyZVN1YnNlcXVlbnRITy1SZXMgOjo9IFszXSBTRVFVRU5DRSB7CisJYW4tQVBEVQkJQWNjZXNzTmV0d29ya1NpZ25hbEluZm8sCisJZXh0ZW5zaW9uQ29udGFpbmVyCVswXQlFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitQcm9jZXNzQWNjZXNzU2lnbmFsbGluZy1BcmcgOjo9IFszXSBTRVFVRU5DRSB7CisJYW4tQVBEVQkJQWNjZXNzTmV0d29ya1NpZ25hbEluZm8sCisJc2VsZWN0ZWRVTVRTLUFsZ29yaXRobXMJWzFdCVNlbGVjdGVkVU1UUy1BbGdvcml0aG1zCU9QVElPTkFMLAorCXNlbGVjdGVkR1NNLUFsZ29yaXRobQlbMl0JU2VsZWN0ZWRHU00tQWxnb3JpdGhtCU9QVElPTkFMLAorCWNob3NlblJhZGlvUmVzb3VyY2VJbmZvcm1hdGlvbglbM10gQ2hvc2VuUmFkaW9SZXNvdXJjZUluZm9ybWF0aW9uIE9QVElPTkFMLAorCXNlbGVjdGVkUmFiLUlkCVs0XSBSQUItSWQJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVswXQlFeHRlbnNpb25Db250YWluZXIgCU9QVElPTkFMLAorCS4uLiwKKwlpVVNlbGVjdGVkQ29kZWMJWzVdIENvZGVjCQlPUFRJT05BTCwKKwlpdUF2YWlsYWJsZUNvZGVjc0xpc3QJWzZdIENvZGVjTGlzdAlPUFRJT05BTCB9CisKK1N1cHBvcnRlZENvZGVjc0xpc3QgOjo9IFNFUVVFTkNFIHsKKwl1dHJhbkNvZGVjTGlzdAlbMF0gQ29kZWNMaXN0CU9QVElPTkFMLAorCWdlcmFuQ29kZWNMaXN0CVsxXSBDb2RlY0xpc3QJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitDb2RlY0xpc3QgOjo9IFNFUVVFTkNFIHsKKwljb2RlYzEJCVsxXSBDb2RlYywKKwljb2RlYzIJCVsyXSBDb2RlYwkJT1BUSU9OQUwsCisJY29kZWMzCQlbM10gQ29kZWMJCU9QVElPTkFMLAorCWNvZGVjNAkJWzRdIENvZGVjCQlPUFRJT05BTCwKKwljb2RlYzUJCVs1XSBDb2RlYwkJT1BUSU9OQUwsCisJY29kZWM2CQlbNl0gQ29kZWMJCU9QVElPTkFMLAorCWNvZGVjNwkJWzddIENvZGVjCQlPUFRJT05BTCwKKwljb2RlYzgJCVs4XSBDb2RlYwkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs5XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCS0tIENvZGVjcyBhcmUgc2VudCBpbiBwcmlvcml0eSBvcmRlciB3aGVyZSBjb2RlYzEgaGFzIGhpZ2hlc3QgcHJpb3JpdHkKKworQ29kZWMgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4uNCkpCisKKwktLSBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlZmluZWQgYXMgZm9sbG93czoKKwktLSBvY3RldCAxCUNvZGVkIGFzIENvZGVjIElkZW50aWZpY2F0aW9uIGNvZGUgaW4gM0dQUCBUUyAyNi4xMDMKKwktLSBvY3RldHMgMiwzLDQJUGFyYW1ldGVycyBmb3IgdGhlIENvZGVjIGFzIGRlZmluZWQgaW4gM0dQUCBUUworCS0tCQkJMjYuMTAzLCBpZiBhdmFpbGFibGUsIGxlbmd0aCBkZXBlbmRpbmcgb24gdGhlIGNvZGVjCisKK0dFUkFOLUNsYXNzbWFyayA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgyLi44NykpCisJLS0gT2N0ZXRzIGFyZSBjb2RlZCBhY2NvcmRpbmcgdGhlIEdFUkFOIENsYXNzbWFyayBpbmZvcm1hdGlvbiBlbGVtZW50IGluIDNHUFAgVFMgNDguMDA4CisKK1NlbGVjdGVkR1NNLUFsZ29yaXRobSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgY29kZWQgYXMgQWxnb3JpdGhtIGlkZW50aWZpZXIgb2N0ZXQgZnJvbSBDaG9zZW4gRW5jcnlwdGlvbgorCS0tIEFsZ29yaXRobSBkZWZpbmVkIGluIDNHUFAgVFMgNDguMDA4CisJLS0gQSBub2RlIHNoYWxsIG1hcmsgb25seSB0aGUgc2VsZWN0ZWQgR1NNIGFsZ29yaXRobQorCitTZW5kRW5kU2lnbmFsLUFyZyA6Oj0gWzNdIFNFUVVFTkNFIHsKKwlhbi1BUERVCQlBY2Nlc3NOZXR3b3JrU2lnbmFsSW5mbywKKwlleHRlbnNpb25Db250YWluZXIJWzBdCUV4dGVuc2lvbkNvbnRhaW5lciAJT1BUSU9OQUwsCisJLi4ufQorCitTZW5kRW5kU2lnbmFsLVJlcyA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglbMF0JRXh0ZW5zaW9uQ29udGFpbmVyIAlPUFRJT05BTCwKKwkuLi59CisKK1JOQ0lkIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDcpKQorCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgorCS0tIG9jdGV0IDEgYml0cyA0MzIxCU1vYmlsZSBDb3VudHJ5IENvZGUgMXN0IGRpZ2l0CisJLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIENvdW50cnkgQ29kZSAybmQgZGlnaXQKKwktLSBvY3RldCAyIGJpdHMgNDMyMQlNb2JpbGUgQ291bnRyeSBDb2RlIDNyZCBkaWdpdAorCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBOZXR3b3JrIENvZGUgM3JkIGRpZ2l0CisJLS0JCQlvciBmaWxsZXIgKDExMTEpIGZvciAyIGRpZ2l0IE1OQ3MKKwktLSBvY3RldCAzIGJpdHMgNDMyMQlNb2JpbGUgTmV0d29yayBDb2RlIDFzdCBkaWdpdAorCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBOZXR3b3JrIENvZGUgMm5kIGRpZ2l0CisJLS0gb2N0ZXRzIDQgYW5kIDUJTG9jYXRpb24gQXJlYSBDb2RlIGFjY29yZGluZyB0byAzR1BQIFRTIDI0LjAwOAorCS0tIG9jdGV0cyA2IGFuZCA3CVJOQyBJZCB2YWx1ZSBhY2NvcmRpbmcgdG8gM0dQUCBUUyAyNS40MTMKKworUmVsb2NhdGlvbk51bWJlckxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mUmVsb2NhdGlvbk51bWJlcikgT0YKKwkJCQlSZWxvY2F0aW9uTnVtYmVyCisKK011bHRpY2FsbEJlYXJlckluZm8gOjo9IElOVEVHRVIgKDEuLm1heE51bU9mUmVsb2NhdGlvbk51bWJlcikKKworUmVsb2NhdGlvbk51bWJlciA6Oj0gU0VRVUVOQ0UgeworCWhhbmRvdmVyTnVtYmVyCUlTRE4tQWRkcmVzc1N0cmluZywKKwlyYWItSWQJCVJBQi1JZCwKKwktLSBSQUIgSWRlbnRpdHkgaXMgbmVlZGVkIHRvIHJlbGF0ZSB0aGUgY2FsbHMgd2l0aCB0aGUgcmFkaW8gYWNjZXNzIGJlYXJlcnMuIAorCS4uLn0KKworUkFCLUlkIDo6PSBJTlRFR0VSICgxLi5tYXhOck9mUkFCcykKKworbWF4TnJPZlJBQnMgSU5URUdFUiA6Oj0gMjU1CisKK21heE51bU9mUmVsb2NhdGlvbk51bWJlciAgSU5URUdFUiA6Oj0gNworCitSYWRpb1Jlc291cmNlSW5mb3JtYXRpb24gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMy4uMTMpKQorCS0tIE9jdGV0cyBhcmUgY29kZWQgYWNjb3JkaW5nIHRoZSBDaGFubmVsIFR5cGUgaW5mb3JtYXRpb24gZWxlbWVudCBpbiAzR1BQIFRTIDQ4LjAwOAorCitJbnRlZ3JpdHlQcm90ZWN0aW9uSW5mb3JtYXRpb24gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMTguLm1heE51bU9mSW50ZWdyaXR5SW5mbykpCisJLS0gT2N0ZXRzIGNvbnRhaW4gYSBjb21wbGV0ZSBJbnRlZ3JpdHlQcm90ZWN0aW9uSW5mb3JtYXRpb24gZGF0YSB0eXBlIAorCS0tIGFzIGRlZmluZWQgaW4gM0dQUCBUUyAyNS40MTMsIGVuY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGluZyBzY2hlbWUgCisJLS0gbWFuZGF0ZWQgYnkgM0dQUCBUUyAyNS40MTMKKwktLSBQYWRkaW5nIGJpdHMgYXJlIGluY2x1ZGVkLCBpZiBuZWVkZWQsIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSAKKwktLSBsYXN0IG9jdGV0IG9mIHRoZSBvY3RldCBzdHJpbmcuIAorCittYXhOdW1PZkludGVncml0eUluZm8gSU5URUdFUiA6Oj0gMTAwCisKK0VuY3J5cHRpb25JbmZvcm1hdGlvbiA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxOC4ubWF4TnVtT2ZFbmNyeXB0aW9uSW5mbykpCisJLS0gT2N0ZXRzIGNvbnRhaW4gYSBjb21wbGV0ZSBFbmNyeXB0aW9uSW5mb3JtYXRpb24gZGF0YSB0eXBlIAorCS0tIGFzIGRlZmluZWQgaW4gM0dQUCBUUyAyNS40MTMsIGVuY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGluZyBzY2hlbWUgCisJLS0gbWFuZGF0ZWQgYnkgM0dQUCBUUyAyNS40MTMKKwktLSBQYWRkaW5nIGJpdHMgYXJlIGluY2x1ZGVkLCBpZiBuZWVkZWQsIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSAKKwktLSBsYXN0IG9jdGV0IG9mIHRoZSBvY3RldCBzdHJpbmcuIAorCittYXhOdW1PZkVuY3J5cHRpb25JbmZvIElOVEVHRVIgOjo9IDEwMAorCistLSBhdXRoZW50aWNhdGlvbiBtYW5hZ2VtZW50IHR5cGVzCisKK1NlbmRBdXRoZW50aWNhdGlvbkluZm9BcmcgOjo9IFNFUVVFTkNFIHsKKwlpbXNpCQkJWzBdIElNU0ksCisJbnVtYmVyT2ZSZXF1ZXN0ZWRWZWN0b3JzCU51bWJlck9mUmVxdWVzdGVkVmVjdG9ycywKKwlzZWdtZW50YXRpb25Qcm9oaWJpdGVkCU5VTEwJCQlPUFRJT05BTCwKKwlpbW1lZGlhdGVSZXNwb25zZVByZWZlcnJlZAlbMV0gTlVMTAkJCU9QVElPTkFMLAorCXJlLXN5bmNocm9uaXNhdGlvbkluZm8JUmUtc3luY2hyb25pc2F0aW9uSW5mbwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJcmVxdWVzdGluZ05vZGVUeXBlCVszXSBSZXF1ZXN0aW5nTm9kZVR5cGUJT1BUSU9OQUwsCisJcmVxdWVzdGluZ1BMTU4tSWQJWzRdIFBMTU4tSWQJT1BUSU9OQUwsCisJbnVtYmVyT2ZSZXF1ZXN0ZWRBZGRpdGlvbmFsLVZlY3RvcnMJWzVdIE51bWJlck9mUmVxdWVzdGVkVmVjdG9ycwlPUFRJT05BTCwKKwlhZGRpdGlvbmFsVmVjdG9yc0FyZUZvckVQUwlbNl0gTlVMTAkJT1BUSU9OQUwgfQkKKworCitOdW1iZXJPZlJlcXVlc3RlZFZlY3RvcnMgOjo9IElOVEVHRVIgKDEuLjUpCisKK1JlLXN5bmNocm9uaXNhdGlvbkluZm8gOjo9IFNFUVVFTkNFIHsKKwlyYW5kCQkJUkFORCwKKwlhdXRzCQkJQVVUUywKKwkuLi59CisKK1NlbmRBdXRoZW50aWNhdGlvbkluZm9SZXMgOjo9IFszXSBTRVFVRU5DRSB7CisJYXV0aGVudGljYXRpb25TZXRMaXN0CUF1dGhlbnRpY2F0aW9uU2V0TGlzdCAJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJZXBzLUF1dGhlbnRpY2F0aW9uU2V0TGlzdAlbMl0gRVBTLUF1dGhlbnRpY2F0aW9uU2V0TGlzdAlPUFRJT05BTCB9CisKK0VQUy1BdXRoZW50aWNhdGlvblNldExpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLjUpIE9GCisJCQkJRVBDLUFWCisKK0VQQy1BViA6Oj0gU0VRVUVOQ0UgeworCXJhbmQJCQlSQU5ELAorCXhyZXMJCQlYUkVTLAorCWF1dG4JCQlBVVROLAorCWthc21lCQlLQVNNRSwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworS0FTTUUgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMTYpKQorCitSZXF1ZXN0aW5nTm9kZVR5cGUgOjo9IEVOVU1FUkFURUQgeworCXZsciAgKDApLAorCXNnc24gICgxKSwKKwkuLi4sCisJcy1jc2NmICAoMiksCisJYnNmICAoMyksCisJZ2FuLWFhYS1zZXJ2ZXIgICg0KSwKKwl3bGFuLWFhYS1zZXJ2ZXIgICg1KSwKKwltbWUJCSgxNiksCisJbW1lLXNnc24JKDE3KQorCX0KKwktLSB0aGUgdmFsdWVzIDIsIDMsIDQgYW5kIDUgc2hhbGwgbm90IGJlIHVzZWQgb24gdGhlIE1BUC1EIG9yIEdyIGludGVyZmFjZXMKKwktLSBleGNlcHRpb24gaGFuZGxpbmc6CisJLS0gcmVjZWl2ZWQgdmFsdWVzIGluIHRoZSByYW5nZSAoNi0xNSkgc2hhbGwgYmUgdHJlYXRlZCBhcyAidmxyIgorCS0tIHJlY2VpdmVkIHZhbHVlcyBncmVhdGVyIHRoYW4gMTcgc2hhbGwgYmUgdHJlYXRlZCBhcyAic2dzbiIKKworLS0gZXF1aXBtZW50IG1hbmFnZW1lbnQgdHlwZXMKKworQ2hlY2tJTUVJLUFyZyA6Oj0gU0VRVUVOQ0UgeworCWltZWkJCQlJTUVJLAorCXJlcXVlc3RlZEVxdWlwbWVudEluZm8JUmVxdWVzdGVkRXF1aXBtZW50SW5mbywKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworQ2hlY2tJTUVJLVJlcyA6Oj0gU0VRVUVOQ0UgeworCWVxdWlwbWVudFN0YXR1cwlFcXVpcG1lbnRTdGF0dXMJT1BUSU9OQUwsCisJYm11ZWYJCVVFU0JJLUl1CQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzBdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1JlcXVlc3RlZEVxdWlwbWVudEluZm86Oj0gQklUIFNUUklORyB7CisJZXF1aXBtZW50U3RhdHVzICAoMCksCisJYm11ZWYgICgxKX0gKFNJWkUgKDIuLjgpKQorCS0tIGV4Y2VwdGlvbiBoYW5kbGluZzogcmVjZXB0aW9uIG9mIHVua25vd24gYml0IGFzc2lnbm1lbnRzIGluIHRoZQorCS0tIFJlcXVlc3RlZEVxdWlwbWVudEluZm8gZGF0YSB0eXBlIHNoYWxsIGJlIGRpc2NhcmRlZCBieSB0aGUgcmVjZWl2ZXIgCisKK1VFU0JJLUl1IDo6PSBTRVFVRU5DRSB7CisJdWVzYmktSXVBCVswXSBVRVNCSS1JdUEJCQkJT1BUSU9OQUwsCisJdWVzYmktSXVCCVsxXSBVRVNCSS1JdUIJCQkJT1BUSU9OQUwsCisJLi4ufQorCitVRVNCSS1JdUEJCQkJOjo9IEJJVCBTVFJJTkcgKFNJWkUoMS4uMTI4KSkKKy0tIFNlZSAzR1BQIFRTIDI1LjQxMworCitVRVNCSS1JdUIJCQkJOjo9IEJJVCBTVFJJTkcgKFNJWkUoMS4uMTI4KSkKKy0tIFNlZSAzR1BQIFRTIDI1LjQxMworCitFcXVpcG1lbnRTdGF0dXMgOjo9IEVOVU1FUkFURUQgeworCXdoaXRlTGlzdGVkICAoMCksCisJYmxhY2tMaXN0ZWQgICgxKSwKKwlncmV5TGlzdGVkICAoMil9CisKKy0tIHN1YnNjcmliZXIgbWFuYWdlbWVudCB0eXBlcworCitJbnNlcnRTdWJzY3JpYmVyRGF0YUFyZyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQlbMF0gSU1TSQkJT1BUSU9OQUwsCisJQ09NUE9ORU5UUyBPRglTdWJzY3JpYmVyRGF0YSwKKwlleHRlbnNpb25Db250YWluZXIJWzE0XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwJCisJbmFlYS1QcmVmZXJyZWRDSQlbMTVdIE5BRUEtUHJlZmVycmVkQ0kJT1BUSU9OQUwsCisJLS0gbmFlYS1QcmVmZXJyZWRDSSBpcyBpbmNsdWRlZCBhdCB0aGUgZGlzY3JldGlvbiBvZiB0aGUgSExSIG9wZXJhdG9yLgorCWdwcnNTdWJzY3JpcHRpb25EYXRhCVsxNl0gR1BSU1N1YnNjcmlwdGlvbkRhdGEJT1BUSU9OQUwsCisJcm9hbWluZ1Jlc3RyaWN0ZWRJblNnc25EdWVUb1Vuc3VwcG9ydGVkRmVhdHVyZSBbMjNdIAlOVUxMCQorCQkJCQkJCU9QVElPTkFMLCAKKwluZXR3b3JrQWNjZXNzTW9kZQlbMjRdIE5ldHdvcmtBY2Nlc3NNb2RlCU9QVElPTkFMLAorCWxzYUluZm9ybWF0aW9uCVsyNV0gTFNBSW5mb3JtYXRpb24JT1BUSU9OQUwsCisJbG11LUluZGljYXRvcglbMjFdCU5VTEwJCU9QVElPTkFMLAorCWxjc0luZm9ybWF0aW9uCVsyMl0JTENTSW5mb3JtYXRpb24JT1BUSU9OQUwsCisJaXN0QWxlcnRUaW1lcglbMjZdIElTVC1BbGVydFRpbWVyVmFsdWUJT1BUSU9OQUwsCisJc3VwZXJDaGFyZ2VyU3VwcG9ydGVkSW5ITFIJWzI3XSBBZ2VJbmRpY2F0b3IJT1BUSU9OQUwsCisJbWMtU1MtSW5mbwlbMjhdIE1DLVNTLUluZm8JT1BUSU9OQUwsCisJY3MtQWxsb2NhdGlvblJldGVudGlvblByaW9yaXR5CVsyOV0gQ1MtQWxsb2NhdGlvblJldGVudGlvblByaW9yaXR5CQlPUFRJT05BTCwKKwlzZ3NuLUNBTUVMLVN1YnNjcmlwdGlvbkluZm8JWzE3XSBTR1NOLUNBTUVMLVN1YnNjcmlwdGlvbkluZm8JT1BUSU9OQUwsCisJY2hhcmdpbmdDaGFyYWN0ZXJpc3RpY3MgCVsxOF0JQ2hhcmdpbmdDaGFyYWN0ZXJpc3RpY3MgCU9QVElPTkFMLAorCWFjY2Vzc1Jlc3RyaWN0aW9uRGF0YQlbMTldIEFjY2Vzc1Jlc3RyaWN0aW9uRGF0YQlPUFRJT05BTCwKKwlpY3MtSW5kaWNhdG9yCVsyMF0JQk9PTEVBTglPUFRJT05BTCwKKwllcHMtU3Vic2NyaXB0aW9uRGF0YQlbMzFdCUVQUy1TdWJzY3JpcHRpb25EYXRhCU9QVElPTkFMLAorCWNzZy1TdWJzY3JpcHRpb25EYXRhTGlzdAlbMzJdIENTRy1TdWJzY3JpcHRpb25EYXRhTGlzdAlPUFRJT05BTCB9CisJLS0gSWYgdGhlIE5ldHdvcmsgQWNjZXNzIE1vZGUgcGFyYW1ldGVyIGlzIHNlbnQsIGl0IHNoYWxsIGJlIHByZXNlbnQgb25seSBpbiAKKwktLSB0aGUgZmlyc3Qgc2VxdWVuY2UgaWYgc2VxbWVudGF0aW9uIGlzIHVzZWQKKworQ1NHLVN1YnNjcmlwdGlvbkRhdGFMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi41MCkgT0YKKwkJCQlDU0ctU3Vic2NyaXB0aW9uRGF0YQorCitDU0ctU3Vic2NyaXB0aW9uRGF0YSA6Oj0gU0VRVUVOQ0UgeworCWNzZy1JZAkgCQlDU0ctSWQsCisJZXhwaXJhdGlvbkRhdGUJCVRpbWUJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcgkJRXh0ZW5zaW9uQ29udGFpbmVyIAlPUFRJT05BTCwKKwkuLi59CisKK0NTRy1JZCA6Oj0gQklUIFNUUklORyAoU0laRSAoMjcpKQorCS0tIGNvZGVkIGFjY29yZGluZyB0byAzR1BQIFRTIDIzLjAwMyBbMTddLgorCitUaW1lIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDQpKQorCS0tIE9jdGV0cyBhcmUgY29kZWQgYWNjb3JkaW5nIHRvIElFVEYgUkZDIDM1ODggWzEzOV0KKworCitFUFMtU3Vic2NyaXB0aW9uRGF0YSA6Oj0gU0VRVUVOQ0UgeworCWFwbi1vaS1SZXBsYWNlbWVudAlbMF0JQVBOLU9JLVJlcGxhY2VtZW50CU9QVElPTkFMLAorCXJmc3AtaWQJCVsyXQlSRlNQLUlECQlPUFRJT05BTCwKKwlhbWJyCQkJWzNdCUFNQlIJCU9QVElPTkFMLAorCWFwbi1Db25maWd1cmF0aW9uUHJvZmlsZQlbNF0JQVBOLUNvbmZpZ3VyYXRpb25Qcm9maWxlCU9QVElPTkFMLAorCXN0bi1zcgkJWzZdCUlTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzVdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gfQorCitBUE4tT0ktUmVwbGFjZW1lbnQgOjo9ICBPQ1RFVCBTVFJJTkcgKFNJWkUgKDkuLjEwMCkpCisJLS0gT2N0ZXRzIGFyZSBjb2RlZCBhcyBBUE4gT3BlcmF0b3IgSWRlbnRpZmllciBhY2NvcmRpbmcgdG8gVFMgM0dQUCBUUyAyMy4wMDMgWzE3XSAKKworUkZTUC1JRCA6Oj0gIElOVEVHRVIgKDEuLjI1NikKKworQVBOLUNvbmZpZ3VyYXRpb25Qcm9maWxlIDo6PSBTRVFVRU5DRSB7CisJZGVmYXVsdENvbnRleHQJQ29udGV4dElkLAorCWNvbXBsZXRlRGF0YUxpc3RJbmNsdWRlZAlOVUxMCQkJT1BUSU9OQUwsCisJCS0tIElmIHNlZ21lbnRhdGlvbiBpcyB1c2VkLCBjb21wbGV0ZURhdGFMaXN0SW5jbHVkZWQgbWF5IG9ubHkgYmUgcHJlc2VudCBpbiB0aGUKKwkJLS0gZmlyc3Qgc2VnbWVudCBvZiBBUE4tQ29uZmlndXJhdGlvblByb2ZpbGUuCisJZXBzRGF0YUxpc3QJWzFdCUVQUy1EYXRhTGlzdCwKKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gfQorCitFUFMtRGF0YUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mQVBOLUNvbmZpZ3VyYXRpb25zKSBPRgorCQkJCUFQTi1Db25maWd1cmF0aW9uCisKKworbWF4TnVtT2ZBUE4tQ29uZmlndXJhdGlvbnMgIElOVEVHRVIgOjo9IDUwCisKKworQVBOLUNvbmZpZ3VyYXRpb24gOjo9IFNFUVVFTkNFIHsKKwljb250ZXh0SWQJCVswXSBDb250ZXh0SWQsCisJc2VydmVkUGFydHlJUC1BZGRyZXNzCVsxXSBQRFAtQWRkcmVzcwlPUFRJT05BTCwKKwlhcG4JCQlbMl0gQVBOLAorCWVwcy1xb3MtU3Vic2NyaWJlZAlbM10gRVBTLVFvUy1TdWJzY3JpYmVkLAorCXBkbi1ndy1JZGVudGl0eQlbNF0gUEROLUdXLUlkZW50aXR5CU9QVElPTkFMLAorCXBkbi1ndy1BbGxvY2F0aW9uVHlwZQlbNV0gUEROLUdXLUFsbG9jYXRpb25UeXBlCU9QVElPTkFMLAorCXZwbG1uQWRkcmVzc0FsbG93ZWQJWzZdIE5VTEwJCU9QVElPTkFMLAorCWNoYXJnaW5nQ2hhcmFjdGVyaXN0aWNzCVs3XSBDaGFyZ2luZ0NoYXJhY3RlcmlzdGljcwlPUFRJT05BTCwKKwlhbWJyCQkJWzhdIEFNQlIJCU9QVElPTkFMLAorCXNwZWNpZmljQVBOSW5mb0xpc3QJWzldIFNwZWNpZmljQVBOSW5mb0xpc3QJT1BUSU9OQUwsCWV4dGVuc2lvbkNvbnRhaW5lcglbMTBdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gfQorCitFUFMtUW9TLVN1YnNjcmliZWQgOjo9IFNFUVVFTkNFIHsKKwlxb3MtQ2xhc3MtSWRlbnRpZmllcglbMF0gUW9TLUNsYXNzLUlkZW50aWZpZXIsCisJYWxsb2NhdGlvbi1SZXRlbnRpb24tUHJpb3JpdHkJWzFdIEFsbG9jYXRpb24tUmV0ZW50aW9uLVByaW9yaXR5LAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiB9CisKK0FNQlIgOjo9IFNFUVVFTkNFIHsKKwltYXgtUmVxdWVzdGVkQmFuZHdpZHRoLVVMCVswXSBCYW5kd2lkdGgsCisJbWF4LVJlcXVlc3RlZEJhbmR3aWR0aC1ETAlbMV0gQmFuZHdpZHRoLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiB9CisKKworU3BlY2lmaWNBUE5JbmZvTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZTcGVjaWZpY0FQTkluZm9zKSBPRgorCQkJCVNwZWNpZmljQVBOSW5mbworCittYXhOdW1PZlNwZWNpZmljQVBOSW5mb3MgIElOVEVHRVIgOjo9IDUwCisKK1NwZWNpZmljQVBOSW5mbyA6Oj0gU0VRVUVOQ0UgeworCWFwbgkJCVswXSBBUE4sCisJcGRuLWd3LUlkZW50aXR5CVsxXSBQRE4tR1ctSWRlbnRpdHksCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uIH0KKworQmFuZHdpZHRoIDo6PSBJTlRFR0VSIAorCS0tIGJpdHMgcGVyIHNlY29uZAorCitRb1MtQ2xhc3MtSWRlbnRpZmllciA6Oj0gSU5URUdFUiAoMS4uOSkKKwktLSB2YWx1ZXMgYXJlIGRlZmluZWQgaW4gIDNHUFAgVFMgMjkuMjEyCisKKworCitBbGxvY2F0aW9uLVJldGVudGlvbi1Qcmlvcml0eSA6Oj0gU0VRVUVOQ0UgeworCXByaW9yaXR5LWxldmVsCVswXSBJTlRFR0VSLAorCXByZS1lbXB0aW9uLWNhcGFiaWxpdHkJWzFdIEJPT0xFQU4JT1BUSU9OQUwsCisJcHJlLWVtcHRpb24tdnVsbmVyYWJpbGl0eQlbMl0gQk9PTEVBTglPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzNdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gfQorCitQRE4tR1ctSWRlbnRpdHkgOjo9IFNFUVVFTkNFIHsKKwlwZG4tZ3ctaXB2NC1BZGRyZXNzCVswXSBQRFAtQWRkcmVzcwlPUFRJT05BTCwKKwlwZG4tZ3ctaXB2Ni1BZGRyZXNzCVsxXSBQRFAtQWRkcmVzcwlPUFRJT05BTCwKKwlwZG4tZ3ctbmFtZQlbMl0gRlFETgkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVszXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uIH0KKworRlFETiA6Oj0gIE9DVEVUIFNUUklORyAoU0laRSAoOS4uMTAwKSkKKworCitQRE4tR1ctQWxsb2NhdGlvblR5cGUgOjo9IEVOVU1FUkFURUQgeworCXN0YXRpYwkoMCksCisJZHluYW1pYwkoMSl9CisKKworQWNjZXNzUmVzdHJpY3Rpb25EYXRhIDo6PSBCSVQgU1RSSU5HIHsKKwl1dHJhbk5vdEFsbG93ZWQgKDApLAorCWdlcmFuTm90QWxsb3dlZCAoMSksCisJZ2FuTm90QWxsb3dlZCAgICgyKSwKKwlpLWhzcGEtZXZvbHV0aW9uTm90QWxsb3dlZCAoMyksCisJZS11dHJhbk5vdEFsbG93ZWQgKDQpLAorCWhvLXRvTm9uM0dQUC1BY2Nlc3NOb3RBbGxvd2VkICg1KSB9IChTSVpFICgyLi44KSkKKwktLSBleGNlcHRpb24gaGFuZGxpbmc6IAorCS0tIGFjY2VzcyByZXN0cmljdGlvbiBkYXRhIHJlbGF0ZWQgdG8gYW4gYWNjZXNzIHR5cGUgbm90IHN1cHBvcnRlZCBieSBhIG5vZGUKKwktLSBzaGFsbCBiZSBpZ25vcmVkCisJLS0gYml0cyA2IHRvIDcgc2hhbGwgYmUgaWdub3JlZCBpZiByZWNlaXZlZCBhbmQgbm90IHVuZGVyc3Rvb2QKKwkKKworQ1MtQWxsb2NhdGlvblJldGVudGlvblByaW9yaXR5IDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCS0tIFRoaXMgZGF0YSB0eXBlIGVuY29kZXMgZWFjaCBwcmlvcml0eSBsZXZlbCBkZWZpbmVkIGluIFRTIDIzLjEwNyBhcyB0aGUgYmluYXJ5IHZhbHVlCisJLS0gb2YgdGhlIHByaW9yaXR5IGxldmVsLgorCitJU1QtQWxlcnRUaW1lclZhbHVlIDo6PSBJTlRFR0VSICgxNS4uMjU1KQorCitMQ1NJbmZvcm1hdGlvbiA6Oj0gU0VRVUVOQ0UgeworCWdtbGMtTGlzdAlbMF0JR01MQy1MaXN0CU9QVElPTkFMLAorCWxjcy1Qcml2YWN5RXhjZXB0aW9uTGlzdAlbMV0JTENTLVByaXZhY3lFeGNlcHRpb25MaXN0CU9QVElPTkFMLAorCW1vbHItTGlzdAkJWzJdCU1PTFItTGlzdAlPUFRJT05BTCwKKwkuLi4sCisJYWRkLWxjcy1Qcml2YWN5RXhjZXB0aW9uTGlzdAlbM10JTENTLVByaXZhY3lFeGNlcHRpb25MaXN0CU9QVElPTkFMIH0KKwktLSBhZGQtbGNzLVByaXZhY3lFeGNlcHRpb25MaXN0IG1heSBiZSBzZW50IG9ubHkgaWYgbGNzLVByaXZhY3lFeGNlcHRpb25MaXN0IGlzCisJLS0gcHJlc2VudCBhbmQgY29udGFpbnMgZm91ciBpbnN0YW5jZXMgb2YgTENTLVByaXZhY3lDbGFzcy4gSWYgdGhlIG1lbnRpb25lZCBjb25kaXRpb24KKwktLSBpcyBub3Qgc2F0aXNmaWVkIHRoZSByZWNlaXZpbmcgbm9kZSBzaGFsbCBkaXNjYXJkIGFkZC1sY3MtUHJpdmFjeUV4Y2VwdGlvbkxpc3QuCisJLS0gSWYgYW4gTENTLVByaXZhY3lDbGFzcyBpcyByZWNlaXZlZCBib3RoIGluIGxjcy1Qcml2YWN5RXhjZXB0aW9uTGlzdCBhbmQgaW4KKwktLSBhZGQtbGNzLVByaXZhY3lFeGNlcHRpb25MaXN0IHdpdGggdGhlIHNhbWUgU1MtQ29kZSwgdGhlbiB0aGUgZXJyb3IgdW5leHBlY3RlZCAKKwktLSBkYXRhIHZhbHVlIHNoYWxsIGJlIHJldHVybmVkLgorCitHTUxDLUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mR01MQykgT0YKKwkJCQlJU0ROLUFkZHJlc3NTdHJpbmcKKwktLSBpZiBzZWdtZW50YXRpb24gaXMgdXNlZCwgdGhlIGNvbXBsZXRlIEdNTEMtTGlzdCBzaGFsbCBiZSBzZW50IGluIG9uZSBzZWdtZW50CisKK21heE51bU9mR01MQyAgSU5URUdFUiA6Oj0gNQorCitOZXR3b3JrQWNjZXNzTW9kZSA6Oj0gRU5VTUVSQVRFRCB7CisJcGFja2V0QW5kQ2lyY3VpdAkoMCksCisJb25seUNpcmN1aXQJCSgxKSwKKwlvbmx5UGFja2V0CQkoMiksCisJLi4ufQorCS0tIGlmIHVua25vd24gdmFsdWVzIGFyZSByZWNlaXZlZCBpbiBOZXR3b3JrQWNjZXNzTW9kZQorCS0tIHRoZXkgc2hhbGwgYmUgZGlzY2FyZGVkLgorCitHUFJTRGF0YUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mUERQLUNvbnRleHRzKSBPRgorCQkJCVBEUC1Db250ZXh0CisKK21heE51bU9mUERQLUNvbnRleHRzICBJTlRFR0VSIDo6PSA1MAorCitQRFAtQ29udGV4dCA6Oj0gU0VRVUVOQ0UgeworCXBkcC1Db250ZXh0SWQJQ29udGV4dElkLAorCXBkcC1UeXBlCQlbMTZdIFBEUC1UeXBlLAorCXBkcC1BZGRyZXNzCVsxN10gUERQLUFkZHJlc3MJT1BUSU9OQUwsCisJcW9zLVN1YnNjcmliZWQJWzE4XSBRb1MtU3Vic2NyaWJlZCwKKwl2cGxtbkFkZHJlc3NBbGxvd2VkCVsxOV0gTlVMTAlPUFRJT05BTCwKKwlhcG4JCQlbMjBdIEFQTiwKKwlleHRlbnNpb25Db250YWluZXIJWzIxXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwlleHQtUW9TLVN1YnNjcmliZWQJWzBdIEV4dC1Rb1MtU3Vic2NyaWJlZAlPUFRJT05BTCwgCisJcGRwLUNoYXJnaW5nQ2hhcmFjdGVyaXN0aWNzCVsxXSBDaGFyZ2luZ0NoYXJhY3RlcmlzdGljcwlPUFRJT05BTCwKKwlleHQyLVFvUy1TdWJzY3JpYmVkCVsyXSBFeHQyLVFvUy1TdWJzY3JpYmVkCU9QVElPTkFMLAorCS0tIGV4dDItUW9TLVN1YnNjcmliZWQgbWF5IGJlIHByZXNlbnQgb25seSBpZiBleHQtUW9TLVN1YnNjcmliZWQgaXMgcHJlc2VudC4KKwlleHQzLVFvUy1TdWJzY3JpYmVkCVszXSBFeHQzLVFvUy1TdWJzY3JpYmVkCU9QVElPTkFMCisJLS0gZXh0My1Rb1MtU3Vic2NyaWJlZCBtYXkgYmUgcHJlc2VudCBvbmx5IGlmIGV4dDItUW9TLVN1YnNjcmliZWQgaXMgcHJlc2VudC4KKwkgfQorCitDb250ZXh0SWQgOjo9IElOVEVHRVIgKDEuLm1heE51bU9mUERQLUNvbnRleHRzKQorCitHUFJTU3Vic2NyaXB0aW9uRGF0YSA6Oj0gU0VRVUVOQ0UgeworCWNvbXBsZXRlRGF0YUxpc3RJbmNsdWRlZAlOVUxMCQkJT1BUSU9OQUwsCisJCS0tIElmIHNlZ21lbnRhdGlvbiBpcyB1c2VkLCBjb21wbGV0ZURhdGFMaXN0SW5jbHVkZWQgbWF5IG9ubHkgYmUgcHJlc2VudCBpbiB0aGUKKwkJLS0gZmlyc3Qgc2VnbWVudCBvZiBHUFJTU3Vic2NyaXB0aW9uRGF0YS4KKwlncHJzRGF0YUxpc3QJWzFdCUdQUlNEYXRhTGlzdCwKKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gfQorCitTR1NOLUNBTUVMLVN1YnNjcmlwdGlvbkluZm8gOjo9IFNFUVVFTkNFIHsKKwlncHJzLUNTSQkJWzBdCUdQUlMtQ1NJCU9QVElPTkFMLAorCW1vLXNtcy1DU0kJWzFdCVNNUy1DU0kJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXQlFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCW10LXNtcy1DU0kJWzNdCVNNUy1DU0kJT1BUSU9OQUwsCisJbXQtc21zQ0FNRUxURFAtQ3JpdGVyaWFMaXN0CVs0XQlNVC1zbXNDQU1FTFREUC1Dcml0ZXJpYUxpc3QJT1BUSU9OQUwsCisJbWctY3NpCQlbNV0JTUctQ1NJCU9QVElPTkFMCisJfQorCitHUFJTLUNTSSA6Oj0gU0VRVUVOQ0UgeworCWdwcnMtQ2FtZWxURFBEYXRhTGlzdAlbMF0gR1BSUy1DYW1lbFREUERhdGFMaXN0CU9QVElPTkFMLAorCWNhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nCVsxXSBDYW1lbENhcGFiaWxpdHlIYW5kbGluZwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwlub3RpZmljYXRpb25Ub0NTRQlbM10JTlVMTAkJT1BUSU9OQUwsCisJY3NpLUFjdGl2ZQlbNF0JTlVMTAkJT1BUSU9OQUwsCisJLi4ufQorLS0Jbm90aWZpY2F0aW9uVG9DU0UgYW5kIGNzaS1BY3RpdmUgc2hhbGwgbm90IGJlIHByZXNlbnQgd2hlbiBHUFJTLUNTSSBpcyBzZW50IHRvIFNHU04uCistLQlUaGV5IG1heSBvbmx5IGJlIGluY2x1ZGVkIGluIEFUU0kvQVRNIGFjay9OU0RDIG1lc3NhZ2UuIAorLS0JR1BSUy1DYW1lbFREUERhdGEgYW5kICBjYW1lbENhcGFiaWxpdHlIYW5kbGluZyBzaGFsbCBiZSBwcmVzZW50IGluIAorLS0JdGhlIEdQUlMtQ1NJIHNlcXVlbmNlLgorLS0JSWYgR1BSUy1DU0kgaXMgc2VnbWVudGVkLCBncHJzLUNhbWVsVERQRGF0YUxpc3QgYW5kIGNhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nIHNoYWxsIGJlIAorLS0JcHJlc2VudCBpbiB0aGUgZmlyc3Qgc2VnbWVudAorCitHUFJTLUNhbWVsVERQRGF0YUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mQ2FtZWxURFBEYXRhKSBPRgorCUdQUlMtQ2FtZWxURFBEYXRhCistLQlHUFJTLUNhbWVsVERQRGF0YUxpc3Qgc2hhbGwgbm90IGNvbnRhaW4gbW9yZSB0aGFuIG9uZSBpbnN0YW5jZSBvZgorLS0JR1BSUy1DYW1lbFREUERhdGEgY29udGFpbmluZyB0aGUgc2FtZSB2YWx1ZSBmb3IgZ3Bycy1UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQuCisKK0dQUlMtQ2FtZWxURFBEYXRhIDo6PSBTRVFVRU5DRSB7CisJZ3Bycy1UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQJWzBdIEdQUlMtVHJpZ2dlckRldGVjdGlvblBvaW50LAorCXNlcnZpY2VLZXkJWzFdIFNlcnZpY2VLZXksCisJZ3NtU0NGLUFkZHJlc3MJWzJdIElTRE4tQWRkcmVzc1N0cmluZywKKwlkZWZhdWx0U2Vzc2lvbkhhbmRsaW5nCVszXSBEZWZhdWx0R1BSUy1IYW5kbGluZywKKwlleHRlbnNpb25Db250YWluZXIJWzRdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4KKwl9CisKK0RlZmF1bHRHUFJTLUhhbmRsaW5nIDo6PSBFTlVNRVJBVEVEIHsKKwljb250aW51ZVRyYW5zYWN0aW9uICgwKSAsCisJcmVsZWFzZVRyYW5zYWN0aW9uICgxKSAsCisJLi4ufQorLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0gcmVjZXB0aW9uIG9mIHZhbHVlcyBpbiByYW5nZSAyLTMxIHNoYWxsIGJlIHRyZWF0ZWQgYXMgImNvbnRpbnVlVHJhbnNhY3Rpb24iCistLSByZWNlcHRpb24gb2YgdmFsdWVzIGdyZWF0ZXIgdGhhbiAzMSBzaGFsbCBiZSB0cmVhdGVkIGFzICJyZWxlYXNlVHJhbnNhY3Rpb24iCisKK0dQUlMtVHJpZ2dlckRldGVjdGlvblBvaW50IDo6PSBFTlVNRVJBVEVEIHsKKwlhdHRhY2ggCQkJKDEpLAorCWF0dGFjaENoYW5nZU9mUG9zaXRpb24gCQkoMiksCisJcGRwLUNvbnRleHRFc3RhYmxpc2htZW50IAkJKDExKSwKKwlwZHAtQ29udGV4dEVzdGFibGlzaG1lbnRBY2tub3dsZWRnZW1lbnQJKDEyKSwKKwlwZHAtQ29udGV4dENoYW5nZU9mUG9zaXRpb24gCQkoMTQpLAorCS4uLiB9CistLSBleGNlcHRpb24gaGFuZGxpbmc6CistLSBGb3IgR1BSUy1DYW1lbFREUERhdGEgc2VxdWVuY2VzIGNvbnRhaW5pbmcgdGhpcyBwYXJhbWV0ZXIgd2l0aCBhbnkKKy0tIG90aGVyIHZhbHVlIHRoYW4gdGhlIG9uZXMgbGlzdGVkIHRoZSByZWNlaXZlciBzaGFsbCBpZ25vcmUgdGhlIHdob2xlIAorLS0gR1BSUy1DYW1lbFREUERhdGFzZXF1ZW5jZS4KKworQVBOIDo6PSAgT0NURVQgU1RSSU5HIChTSVpFICgyLi42MykpCisJLS0gT2N0ZXRzIGFyZSBjb2RlZCBhY2NvcmRpbmcgdG8gVFMgM0dQUCBUUyAyMy4wMDMgWzE3XSAKKworUERQLVR5cGUgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMikpCisJLS0gT2N0ZXRzIGFyZSBjb2RlZCBhY2NvcmRpbmcgdG8gVFMgM0dQUCBUUyAyOS4wNjAgWzEwNV0KKworUERQLUFkZHJlc3MgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4uMTYpKQorCS0tIE9jdGV0cyBhcmUgY29kZWQgYWNjb3JkaW5nIHRvIFRTIDNHUFAgVFMgMjkuMDYwIFsxMDVdCisKKwktLSBUaGUgcG9zc2libGUgc2l6ZSB2YWx1ZXMgYXJlOgorCS0tIDEtNyBvY3RldHMgIFguMjUgYWRkcmVzcyB0eXBlCisJLS0gIDQgIG9jdGV0cyAgSVB2NCBhZGRyZXNzIHR5cGUKKwktLSAxNiAgb2N0ZXRzICBJcHY2IGFkZHJlc3MgdHlwZQorCitRb1MtU3Vic2NyaWJlZCA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgzKSkKKwktLSBPY3RldHMgYXJlIGNvZGVkIGFjY29yZGluZyB0byBUUyAzR1BQIFRTIDI0LjAwOCBbMzVdIFF1YWxpdHkgb2YgU2VydmljZSBPY3RldHMgCisJLS0gMy01LgorCitFeHQtUW9TLVN1YnNjcmliZWQgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4uOSkpCisJLS0gT0NURVQgMTogCisJLS0gIEFsbG9jYXRpb24vUmV0ZW50aW9uIFByaW9yaXR5IChUaGlzIG9jdGV0IGVuY29kZXMgZWFjaCBwcmlvcml0eSBsZXZlbCBkZWZpbmVkIGluCisJLS0gICAgIDIzLjEwNyBhcyB0aGUgYmluYXJ5IHZhbHVlIG9mIHRoZSBwcmlvcml0eSBsZXZlbCwgZGVjbGFyYXRpb24gaW4gMjkuMDYwKQorCS0tIE9jdGV0cyAyLTkgYXJlIGNvZGVkIGFjY29yZGluZyB0byAzR1BQIFRTIDI0LjAwOCBbMzVdIFF1YWxpdHkgb2YgU2VydmljZSBPY3RldHMgCisJLS0gNi0xMy4KKworRXh0Mi1Rb1MtU3Vic2NyaWJlZCA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi4zKSkKKwktLSBPY3RldHMgMS0zIGFyZSBjb2RlZCBhY2NvcmRpbmcgdG8gM0dQUCBUUyAyNC4wMDggWzM1XSBRdWFsaXR5IG9mIFNlcnZpY2UgT2N0ZXRzIDE0LTE2LgorCS0tIElmIFF1YWxpdHkgb2YgU2VydmljZSBpbmZvcm1hdGlvbiBpcyBzdHJ1Y3R1cmVkIHdpdGggMTQgb2N0ZXQgbGVuZ3RoLCB0aGVuCisJLS0gT2N0ZXQgMSBpcyBjb2RlZCBhY2NvcmRpbmcgdG8gM0dQUCBUUyAyNC4wMDggWzM1XSBRdWFsaXR5IG9mIFNlcnZpY2UgT2N0ZXQgMTQuCisKK0V4dDMtUW9TLVN1YnNjcmliZWQgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4uMikpCisJLS0gT2N0ZXRzIDEtMiBhcmUgY29kZWQgYWNjb3JkaW5nIHRvIDNHUFAgVFMgMjQuMDA4IFszNV0gUXVhbGl0eSBvZiBTZXJ2aWNlIE9jdGV0cyAxNy0xOC4KKworQ2hhcmdpbmdDaGFyYWN0ZXJpc3RpY3MgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMikpCisJLS0gT2N0ZXRzIGFyZSBjb2RlZCBhY2NvcmRpbmcgdG8gM0dQUCBUUyAzMi4yMTUuCisKK0xTQU9ubHlBY2Nlc3NJbmRpY2F0b3IgOjo9IEVOVU1FUkFURUQgeworCWFjY2Vzc091dHNpZGVMU0FzQWxsb3dlZCAgKDApLAorCWFjY2Vzc091dHNpZGVMU0FzUmVzdHJpY3RlZCAoMSl9CisKK0xTQURhdGFMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkxTQXMpIE9GCisJCQkJTFNBRGF0YQorCittYXhOdW1PZkxTQXMgIElOVEVHRVIgOjo9IDIwCisKK0xTQURhdGEgOjo9IFNFUVVFTkNFIHsKKwlsc2FJZGVudGl0eQlbMF0gTFNBSWRlbnRpdHksCisJbHNhQXR0cmlidXRlcwlbMV0gTFNBQXR0cmlidXRlcywKKwlsc2FBY3RpdmVNb2RlSW5kaWNhdG9yCVsyXSBOVUxMCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzNdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0xTQUluZm9ybWF0aW9uIDo6PSBTRVFVRU5DRSB7CisJY29tcGxldGVEYXRhTGlzdEluY2x1ZGVkCU5VTEwJCQlPUFRJT05BTCwKKworCQktLSBJZiBzZWdtZW50YXRpb24gaXMgdXNlZCwgY29tcGxldGVEYXRhTGlzdEluY2x1ZGVkIG1heSBvbmx5IGJlIHByZXNlbnQgaW4gdGhlCisJCS0tIGZpcnN0IHNlZ21lbnQuCisJbHNhT25seUFjY2Vzc0luZGljYXRvcglbMV0JTFNBT25seUFjY2Vzc0luZGljYXRvcglPUFRJT05BTCwKKwlsc2FEYXRhTGlzdAlbMl0JTFNBRGF0YUxpc3QJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVszXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitMU0FJZGVudGl0eSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgzKSkKKwktLSBPY3RldHMgYXJlIGNvZGVkIGFjY29yZGluZyB0byBUUyAzR1BQIFRTIDIzLjAwMyBbMTddCisKK0xTQUF0dHJpYnV0ZXMgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisJLS0gT2N0ZXRzIGFyZSBjb2RlZCBhY2NvcmRpbmcgdG8gVFMgM0dQUCBUUyA0OC4wMDggWzQ5XQorCitTdWJzY3JpYmVyRGF0YSA6Oj0gU0VRVUVOQ0UgeworCW1zaXNkbgkJWzFdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwljYXRlZ29yeQkJWzJdIENhdGVnb3J5CU9QVElPTkFMLAorCXN1YnNjcmliZXJTdGF0dXMJWzNdIFN1YnNjcmliZXJTdGF0dXMJT1BUSU9OQUwsCisJYmVhcmVyU2VydmljZUxpc3QJWzRdIEJlYXJlclNlcnZpY2VMaXN0CU9QVElPTkFMLAorCS0tIFRoZSBleGNlcHRpb24gaGFuZGxpbmcgZm9yIHJlY2VwdGlvbiBvZiB1bnN1cHBvcnRlZCAvIG5vdCBhbGxvY2F0ZWQKKwktLSBiZWFyZXJTZXJ2aWNlQ29kZXMgaXMgZGVmaW5lZCBpbiBzZWN0aW9uIDguOC4xCisJdGVsZXNlcnZpY2VMaXN0CVs2XSBUZWxlc2VydmljZUxpc3QJT1BUSU9OQUwsCisJLS0gVGhlIGV4Y2VwdGlvbiBoYW5kbGluZyBmb3IgcmVjZXB0aW9uIG9mIHVuc3VwcG9ydGVkIC8gbm90IGFsbG9jYXRlZAorCS0tIHRlbGVzZXJ2aWNlQ29kZXMgaXMgZGVmaW5lZCBpbiBzZWN0aW9uIDguOC4xCisJcHJvdmlzaW9uZWRTUwlbN10gRXh0LVNTLUluZm9MaXN0CU9QVElPTkFMLAorCW9kYi1EYXRhCQlbOF0gT0RCLURhdGEJT1BUSU9OQUwsCisJcm9hbWluZ1Jlc3RyaWN0aW9uRHVlVG9VbnN1cHBvcnRlZEZlYXR1cmUgIFs5XSBOVUxMCU9QVElPTkFMLAorCXJlZ2lvbmFsU3Vic2NyaXB0aW9uRGF0YQlbMTBdIFpvbmVDb2RlTGlzdAlPUFRJT05BTCwKKwl2YnNTdWJzY3JpcHRpb25EYXRhCVsxMV0gVkJTRGF0YUxpc3QJT1BUSU9OQUwsCisJdmdjc1N1YnNjcmlwdGlvbkRhdGEJWzEyXSBWR0NTRGF0YUxpc3QJT1BUSU9OQUwsCisJdmxyQ2FtZWxTdWJzY3JpcHRpb25JbmZvCVsxM10gVmxyQ2FtZWxTdWJzY3JpcHRpb25JbmZvCU9QVElPTkFMCisJfQorCitDYXRlZ29yeSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlZmluZWQgaW4gSVRVLVQgUmVjIFEuNzYzLgorCitTdWJzY3JpYmVyU3RhdHVzIDo6PSBFTlVNRVJBVEVEIHsKKwlzZXJ2aWNlR3JhbnRlZCAgKDApLAorCW9wZXJhdG9yRGV0ZXJtaW5lZEJhcnJpbmcgICgxKX0KKworQmVhcmVyU2VydmljZUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mQmVhcmVyU2VydmljZXMpIE9GCisJCQkJRXh0LUJlYXJlclNlcnZpY2VDb2RlCisKK21heE51bU9mQmVhcmVyU2VydmljZXMgIElOVEVHRVIgOjo9IDUwCisKK1RlbGVzZXJ2aWNlTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZUZWxlc2VydmljZXMpIE9GCisJCQkJRXh0LVRlbGVzZXJ2aWNlQ29kZQorCittYXhOdW1PZlRlbGVzZXJ2aWNlcyAgSU5URUdFUiA6Oj0gMjAKKworT0RCLURhdGEgOjo9IFNFUVVFTkNFIHsKKwlvZGItR2VuZXJhbERhdGEJT0RCLUdlbmVyYWxEYXRhLAorCW9kYi1IUExNTi1EYXRhCU9EQi1IUExNTi1EYXRhCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitPREItR2VuZXJhbERhdGEgOjo9IEJJVCBTVFJJTkcgeworCWFsbE9HLUNhbGxzQmFycmVkICAoMCksCisJaW50ZXJuYXRpb25hbE9HQ2FsbHNCYXJyZWQgICgxKSwKKwlpbnRlcm5hdGlvbmFsT0dDYWxsc05vdFRvSFBMTU4tQ291bnRyeUJhcnJlZCAgKDIpLAorCWludGVyem9uYWxPR0NhbGxzQmFycmVkICg2KSwKKwlpbnRlcnpvbmFsT0dDYWxsc05vdFRvSFBMTU4tQ291bnRyeUJhcnJlZCAoNyksCisJaW50ZXJ6b25hbE9HQ2FsbHNBbmRJbnRlcm5hdGlvbmFsT0dDYWxsc05vdFRvSFBMTU4tQ291bnRyeUJhcnJlZCAoOCksCisJcHJlbWl1bVJhdGVJbmZvcm1hdGlvbk9HQ2FsbHNCYXJyZWQgICgzKSwKKwlwcmVtaXVtUmF0ZUVudGVydGFpbmVtZW50T0dDYWxsc0JhcnJlZCAgKDQpLAorCXNzLUFjY2Vzc0JhcnJlZCAgKDUpLAorCWFsbEVDVC1CYXJyZWQgKDkpLAorCWNoYXJnZWFibGVFQ1QtQmFycmVkICgxMCksCisJaW50ZXJuYXRpb25hbEVDVC1CYXJyZWQgKDExKSwKKwlpbnRlcnpvbmFsRUNULUJhcnJlZCAoMTIpLAorCWRvdWJseUNoYXJnZWFibGVFQ1QtQmFycmVkICgxMyksCisJbXVsdGlwbGVFQ1QtQmFycmVkICgxNCksCisJYWxsUGFja2V0T3JpZW50ZWRTZXJ2aWNlc0JhcnJlZCAoMTUpLAorCXJvYW1lckFjY2Vzc1RvSFBMTU4tQVAtQmFycmVkICAoMTYpLAorCXJvYW1lckFjY2Vzc1RvVlBMTU4tQVAtQmFycmVkICAoMTcpLAorCXJvYW1pbmdPdXRzaWRlUExNTk9HLUNhbGxzQmFycmVkICAoMTgpLAorCWFsbElDLUNhbGxzQmFycmVkICAoMTkpLAorCXJvYW1pbmdPdXRzaWRlUExNTklDLUNhbGxzQmFycmVkICAoMjApLAorCXJvYW1pbmdPdXRzaWRlUExNTklDb3VudHJ5SUMtQ2FsbHNCYXJyZWQgICgyMSksCisJcm9hbWluZ091dHNpZGVQTE1OLUJhcnJlZCAgKDIyKSwKKwlyb2FtaW5nT3V0c2lkZVBMTU4tQ291bnRyeUJhcnJlZCAgKDIzKSwKKwlyZWdpc3RyYXRpb25BbGxDRi1CYXJyZWQgICgyNCksCisJcmVnaXN0cmF0aW9uQ0ZOb3RUb0hQTE1OLUJhcnJlZCAgKDI1KSwKKwlyZWdpc3RyYXRpb25JbnRlcnpvbmFsQ0YtQmFycmVkICAoMjYpLAorCXJlZ2lzdHJhdGlvbkludGVyem9uYWxDRk5vdFRvSFBMTU4tQmFycmVkICAoMjcpLAorCXJlZ2lzdHJhdGlvbkludGVybmF0aW9uYWxDRi1CYXJyZWQgICgyOCl9IChTSVpFICgxNS4uMzIpKQorCS0tIGV4Y2VwdGlvbiBoYW5kbGluZzogcmVjZXB0aW9uIG9mIHVua25vd24gYml0IGFzc2lnbm1lbnRzIGluIHRoZQorCS0tIE9EQi1HZW5lcmFsRGF0YSB0eXBlIHNoYWxsIGJlIHRyZWF0ZWQgbGlrZSB1bnN1cHBvcnRlZCBPREItR2VuZXJhbERhdGEKKwktLSBXaGVuIHRoZSBPREItR2VuZXJhbERhdGEgdHlwZSBpcyByZW1vdmVkIGZyb20gdGhlIEhMUiBmb3IgYSBnaXZlbiBzdWJzY3JpYmVyLCAKKwktLSBpbiBOb3RlU3Vic2NyaWJlckRhdGFNb2RpZmllZCBvcGVyYXRpb24gc2VudCB0b3dhcmQgdGhlIGdzbVNDRiAKKwktLSBhbGwgYml0cyBzaGFsbCBiZSBzZXQgdG8gIk8iLgorCitPREItSFBMTU4tRGF0YSA6Oj0gQklUIFNUUklORyB7CisJcGxtbi1TcGVjaWZpY0JhcnJpbmdUeXBlMSAgKDApLAorCXBsbW4tU3BlY2lmaWNCYXJyaW5nVHlwZTIgICgxKSwKKwlwbG1uLVNwZWNpZmljQmFycmluZ1R5cGUzICAoMiksCisJcGxtbi1TcGVjaWZpY0JhcnJpbmdUeXBlNCAgKDMpfSAoU0laRSAoNC4uMzIpKQorCS0tIGV4Y2VwdGlvbiBoYW5kbGluZzogcmVjZXB0aW9uIG9mIHVua25vd24gYml0IGFzc2lnbm1lbnRzIGluIHRoZQorCS0tIE9EQi1IUExNTi1EYXRhIHR5cGUgc2hhbGwgYmUgdHJlYXRlZCBsaWtlIHVuc3VwcG9ydGVkIE9EQi1IUExNTi1EYXRhIAorCS0tIFdoZW4gdGhlIE9EQi1IUExNTi1EYXRhIHR5cGUgaXMgcmVtb3ZlZCBmcm9tIHRoZSBITFIgZm9yIGEgZ2l2ZW4gc3Vic2NyaWJlciwgCisJLS0gaW4gTm90ZVN1YnNjcmliZXJEYXRhTW9kaWZpZWQgb3BlcmF0aW9uIHNlbnQgdG93YXJkIHRoZSBnc21TQ0YKKwktLSBhbGwgYml0cyBzaGFsbCBiZSBzZXQgdG8gIk8iLgorCitFeHQtU1MtSW5mb0xpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mU1MpIE9GCisJCQkJRXh0LVNTLUluZm8KKworRXh0LVNTLUluZm8gOjo9IENIT0lDRSB7CisJZm9yd2FyZGluZ0luZm8JWzBdIEV4dC1Gb3J3SW5mbywKKwljYWxsQmFycmluZ0luZm8JWzFdIEV4dC1DYWxsQmFySW5mbywKKwljdWctSW5mbwkJWzJdIENVRy1JbmZvLAorCXNzLURhdGEJCVszXSBFeHQtU1MtRGF0YSwKKwllbWxwcC1JbmZvCVs0XSBFTUxQUC1JbmZvfQorCitFeHQtRm9yd0luZm8gOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlTUy1Db2RlLAorCWZvcndhcmRpbmdGZWF0dXJlTGlzdAlFeHQtRm9yd0ZlYXR1cmVMaXN0LAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworRXh0LUZvcndGZWF0dXJlTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZFeHQtQmFzaWNTZXJ2aWNlR3JvdXBzKSBPRgorCQkJCUV4dC1Gb3J3RmVhdHVyZQorCitFeHQtRm9yd0ZlYXR1cmUgOjo9IFNFUVVFTkNFIHsKKwliYXNpY1NlcnZpY2UJRXh0LUJhc2ljU2VydmljZUNvZGUJT1BUSU9OQUwsCisJc3MtU3RhdHVzCQlbNF0gRXh0LVNTLVN0YXR1cywKKwlmb3J3YXJkZWRUb051bWJlcglbNV0gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCS0tIFdoZW4gdGhpcyBkYXRhIHR5cGUgaXMgc2VudCBmcm9tIGFuIEhMUiB3aGljaCBzdXBwb3J0cyBDQU1FTCBQaGFzZSAyCisJLS0gdG8gYSBWTFIgdGhhdCBzdXBwb3J0cyBDQU1FTCBQaGFzZSAyIHRoZSBWTFIgc2hhbGwgbm90IGNoZWNrIHRoZQorCS0tIGZvcm1hdCBvZiB0aGUgbnVtYmVyCisJZm9yd2FyZGVkVG9TdWJhZGRyZXNzCVs4XSBJU0ROLVN1YmFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJZm9yd2FyZGluZ09wdGlvbnMJWzZdIEV4dC1Gb3J3T3B0aW9ucwlPUFRJT05BTCwKKwlub1JlcGx5Q29uZGl0aW9uVGltZQlbN10gRXh0LU5vUmVwQ29uZFRpbWUJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs5XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWxvbmdGb3J3YXJkZWRUb051bWJlcglbMTBdIEZUTi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMIH0KKworRXh0LUZvcndPcHRpb25zIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLjUpKQorCisJLS0gT0NURVQgMToKKworCS0tICBiaXQgODogbm90aWZpY2F0aW9uIHRvIGZvcndhcmRpbmcgcGFydHkKKwktLQkwICBubyBub3RpZmljYXRpb24KKwktLQkxICBub3RpZmljYXRpb24KKworCS0tICBiaXQgNzogcmVkaXJlY3RpbmcgcHJlc2VudGF0aW9uCisJLS0JMCBubyBwcmVzZW50YXRpb24gIAorCS0tCTEgIHByZXNlbnRhdGlvbgorCisJLS0gIGJpdCA2OiBub3RpZmljYXRpb24gdG8gY2FsbGluZyBwYXJ0eQorCS0tCTAgIG5vIG5vdGlmaWNhdGlvbgorCS0tCTEgIG5vdGlmaWNhdGlvbgorCisJLS0gIGJpdCA1OiAwICh1bnVzZWQpCisKKwktLSAgYml0cyA0MzogZm9yd2FyZGluZyByZWFzb24KKwktLQkwMCAgbXMgbm90IHJlYWNoYWJsZQorCS0tCTAxICBtcyBidXN5CisJLS0JMTAgIG5vIHJlcGx5CisJLS0JMTEgIHVuY29uZGl0aW9uYWwKKworCS0tIGJpdHMgMjE6IDAwICh1bnVzZWQpCisKKwktLSBPQ1RFVFMgMi01OiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4gVGhleSBzaGFsbCBiZSBkaXNjYXJkZWQgaWYKKwktLSByZWNlaXZlZCBhbmQgbm90IHVuZGVyc3Rvb2QuCisKK0V4dC1Ob1JlcENvbmRUaW1lIDo6PSBJTlRFR0VSICgxLi4xMDApCisJLS0gT25seSB2YWx1ZXMgNS0zMCBhcmUgdXNlZC4KKwktLSBWYWx1ZXMgaW4gdGhlIHJhbmdlcyAxLTQgYW5kIDMxLTEwMCBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UKKwktLSBJZiByZWNlaXZlZDoKKwktLQkJdmFsdWVzIDEtNCBzaGFsbCBiZSBtYXBwZWQgb24gdG8gdmFsdWUgNQorCS0tCQl2YWx1ZXMgMzEtMTAwIHNoYWxsIGJlIG1hcHBlZCBvbiB0byB2YWx1ZSAzMAorCitFeHQtQ2FsbEJhckluZm8gOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlTUy1Db2RlLAorCWNhbGxCYXJyaW5nRmVhdHVyZUxpc3QJRXh0LUNhbGxCYXJGZWF0dXJlTGlzdCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworRXh0LUNhbGxCYXJGZWF0dXJlTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZFeHQtQmFzaWNTZXJ2aWNlR3JvdXBzKSBPRgorCQkJCUV4dC1DYWxsQmFycmluZ0ZlYXR1cmUKKworRXh0LUNhbGxCYXJyaW5nRmVhdHVyZSA6Oj0gU0VRVUVOQ0UgeworCWJhc2ljU2VydmljZQlFeHQtQmFzaWNTZXJ2aWNlQ29kZQlPUFRJT05BTCwKKwlzcy1TdGF0dXMJCVs0XSBFeHQtU1MtU3RhdHVzLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitDVUctSW5mbyA6Oj0gU0VRVUVOQ0UgeworCWN1Zy1TdWJzY3JpcHRpb25MaXN0CUNVRy1TdWJzY3JpcHRpb25MaXN0LAorCWN1Zy1GZWF0dXJlTGlzdAlDVUctRmVhdHVyZUxpc3QJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVswXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitDVUctU3Vic2NyaXB0aW9uTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMC4ubWF4TnVtT2ZDVUcpIE9GCisJCQkJQ1VHLVN1YnNjcmlwdGlvbgorCitDVUctU3Vic2NyaXB0aW9uIDo6PSBTRVFVRU5DRSB7CisJY3VnLUluZGV4CUNVRy1JbmRleCwKKwljdWctSW50ZXJsb2NrCUNVRy1JbnRlcmxvY2ssCisJaW50cmFDVUctT3B0aW9ucwlJbnRyYUNVRy1PcHRpb25zLAorCWJhc2ljU2VydmljZUdyb3VwTGlzdAlFeHQtQmFzaWNTZXJ2aWNlR3JvdXBMaXN0CU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworQ1VHLUluZGV4IDo6PSBJTlRFR0VSICgwLi4zMjc2NykKKwktLSBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlZmluZWQgaW4gRVRTIDMwMCAxMzguCisKK0NVRy1JbnRlcmxvY2sgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoNCkpCisKK0ludHJhQ1VHLU9wdGlvbnMgOjo9IEVOVU1FUkFURUQgeworCW5vQ1VHLVJlc3RyaWN0aW9ucyAgKDApLAorCWN1Z0lDLUNhbGxCYXJyZWQgICgxKSwKKwljdWdPRy1DYWxsQmFycmVkICAoMil9CisKK21heE51bU9mQ1VHICBJTlRFR0VSIDo6PSAxMAorCitDVUctRmVhdHVyZUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mRXh0LUJhc2ljU2VydmljZUdyb3VwcykgT0YKKwkJCQlDVUctRmVhdHVyZQorCitFeHQtQmFzaWNTZXJ2aWNlR3JvdXBMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkV4dC1CYXNpY1NlcnZpY2VHcm91cHMpIE9GCisJCQkJRXh0LUJhc2ljU2VydmljZUNvZGUKKworbWF4TnVtT2ZFeHQtQmFzaWNTZXJ2aWNlR3JvdXBzICBJTlRFR0VSIDo6PSAzMgorCitDVUctRmVhdHVyZSA6Oj0gU0VRVUVOQ0UgeworCWJhc2ljU2VydmljZQlFeHQtQmFzaWNTZXJ2aWNlQ29kZQlPUFRJT05BTCwKKwlwcmVmZXJlbnRpYWxDVUctSW5kaWNhdG9yCUNVRy1JbmRleAlPUFRJT05BTCwKKwlpbnRlckNVRy1SZXN0cmljdGlvbnMJSW50ZXJDVUctUmVzdHJpY3Rpb25zLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitJbnRlckNVRy1SZXN0cmljdGlvbnMgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisKKwktLSBiaXRzIDg3NjU0MzogMDAwMDAwICh1bnVzZWQpCisJLS0gRXhjZXB0aW9uIGhhbmRsaW5nOgorCS0tIGJpdHMgODc2NTQzIHNoYWxsIGJlIGlnbm9yZWQgaWYgcmVjZWl2ZWQgYW5kIG5vdCB1bmRlcnN0b29kCisKKwktLSBiaXRzIDIxCisJLS0JMDAgIENVRyBvbmx5IGZhY2lsaXRpZXMKKwktLQkwMSAgQ1VHIHdpdGggb3V0Z29pbmcgYWNjZXNzCisJLS0JMTAgIENVRyB3aXRoIGluY29taW5nIGFjY2VzcworCS0tCTExICBDVUcgd2l0aCBib3RoIG91dGdvaW5nIGFuZCBpbmNvbWluZyBhY2Nlc3MKKworRXh0LVNTLURhdGEgOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlTUy1Db2RlLAorCXNzLVN0YXR1cwlbNF0gRXh0LVNTLVN0YXR1cywKKwlzcy1TdWJzY3JpcHRpb25PcHRpb24JU1MtU3Vic2NyaXB0aW9uT3B0aW9uCU9QVElPTkFMLAorCWJhc2ljU2VydmljZUdyb3VwTGlzdAlFeHQtQmFzaWNTZXJ2aWNlR3JvdXBMaXN0CU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNV0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTENTLVByaXZhY3lFeGNlcHRpb25MaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZlByaXZhY3lDbGFzcykgT0YKKwkJCQlMQ1MtUHJpdmFjeUNsYXNzCisKK21heE51bU9mUHJpdmFjeUNsYXNzICBJTlRFR0VSIDo6PSA0CisKK0xDUy1Qcml2YWN5Q2xhc3MgOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlTUy1Db2RlLAorCXNzLVN0YXR1cwkJRXh0LVNTLVN0YXR1cywKKwlub3RpZmljYXRpb25Ub01TVXNlcglbMF0gTm90aWZpY2F0aW9uVG9NU1VzZXIJT1BUSU9OQUwsCisJLS0gbm90aWZpY2F0aW9uVG9NU1VzZXIgbWF5IGJlIHNlbnQgb25seSBmb3IgU1MtY29kZXMgY2FsbFNlc3Npb25SZWxhdGVkCisJLS0gYW5kIGNhbGxTZXNzaW9uVW5yZWxhdGVkLiBJZiBub3QgcmVjZWl2ZWQgZm9yIFNTLWNvZGVzIGNhbGxTZXNzaW9uUmVsYXRlZAorCS0tIGFuZCBjYWxsU2Vzc2lvblVucmVsYXRlZCwKKwktLSB0aGUgZGVmYXVsdCB2YWx1ZXMgYWNjb3JkaW5nIHRvIDNHUFAgVFMgMjMuMjcxIHNoYWxsIGJlIGFzc3VtZWQuCisJZXh0ZXJuYWxDbGllbnRMaXN0CVsxXSBFeHRlcm5hbENsaWVudExpc3QJT1BUSU9OQUwsCisJLS0gZXh0ZXJuYWxDbGllbnRMaXN0IG1heSBiZSBzZW50IG9ubHkgZm9yIFNTLWNvZGUgY2FsbFNlc3Npb25VbnJlbGF0ZWQgdG8gYQorCS0tIHZpc2l0ZWQgbm9kZSB0aGF0IGRvZXMgbm90IHN1cHBvcnQgTENTIFJlbGVhc2UgNCBvciBsYXRlciB2ZXJzaW9ucy4KKwktLSBleHRlcm5hbENsaWVudExpc3QgbWF5IGJlIHNlbnQgb25seSBmb3IgU1MtY29kZXMgY2FsbFNlc3Npb25VbnJlbGF0ZWQgYW5kCisJLS0gY2FsbFNlc3Npb25SZWxhdGVkIHRvIGEgdmlzaXRlZCBub2RlIHRoYXQgc3VwcG9ydHMgTENTIFJlbGVhc2UgNCBvciBsYXRlciB2ZXJzaW9ucy4KKwlwbG1uQ2xpZW50TGlzdAlbMl0gUExNTkNsaWVudExpc3QJT1BUSU9OQUwsCisJLS0gcGxtbkNsaWVudExpc3QgbWF5IGJlIHNlbnQgb25seSBmb3IgU1MtY29kZSBwbG1ub3BlcmF0b3IuCisJZXh0ZW5zaW9uQ29udGFpbmVyCVszXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWV4dC1leHRlcm5hbENsaWVudExpc3QJWzRdIEV4dC1FeHRlcm5hbENsaWVudExpc3QJT1BUSU9OQUwsCisJLS0gRXh0LWV4dGVybmFsQ2xpZW50TGlzdCBtYXkgYmUgc2VudCBvbmx5IGlmIHRoZSB2aXNpdGVkIG5vZGUgc3VwcG9ydHMgTENTIFJlbGVhc2UgNCBvcgorCS0tIGxhdGVyIHZlcnNpb25zLCB0aGUgdXNlciBkaWQgc3BlY2lmeSBtb3JlIHRoYW4gNSBjbGllbnRzLCBhbmQgV2hpdGUgQm9vayBTQ0NQIGlzIHVzZWQuCisJc2VydmljZVR5cGVMaXN0CVs1XQlTZXJ2aWNlVHlwZUxpc3QJT1BUSU9OQUwKKwktLSBzZXJ2aWNlVHlwZUxpc3QgbWF5IGJlIHNlbnQgb25seSBmb3IgU1MtY29kZSBzZXJ2aWNlVHlwZSBhbmQgaWYgdGhlIHZpc2l0ZWQgbm9kZQorCS0tIHN1cHBvcnRzIExDUyBSZWxlYXNlIDUgb3IgbGF0ZXIgdmVyc2lvbnMuCisJLS0gCisJLS0gaWYgc2VnbWVudGF0aW9uIGlzIHVzZWQsIHRoZSBjb21wbGV0ZSBMQ1MtUHJpdmFjeUNsYXNzIHNoYWxsIGJlIHNlbnQgaW4gb25lIHNlZ21lbnQKK30KKworRXh0ZXJuYWxDbGllbnRMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgwLi5tYXhOdW1PZkV4dGVybmFsQ2xpZW50KSBPRgorCQkJCUV4dGVybmFsQ2xpZW50CisKK21heE51bU9mRXh0ZXJuYWxDbGllbnQgIElOVEVHRVIgOjo9IDUKKworUExNTkNsaWVudExpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mUExNTkNsaWVudCkgT0YKKwkJCQlMQ1NDbGllbnRJbnRlcm5hbElECisKK21heE51bU9mUExNTkNsaWVudCAgSU5URUdFUiA6Oj0gNQorCitFeHQtRXh0ZXJuYWxDbGllbnRMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkV4dC1FeHRlcm5hbENsaWVudCkgT0YKKwkJCQlFeHRlcm5hbENsaWVudAorCittYXhOdW1PZkV4dC1FeHRlcm5hbENsaWVudCAgSU5URUdFUiA6Oj0gMzUKKworRXh0ZXJuYWxDbGllbnQgOjo9IFNFUVVFTkNFIHsKKwljbGllbnRJZGVudGl0eQlMQ1NDbGllbnRFeHRlcm5hbElELAorCWdtbGMtUmVzdHJpY3Rpb24JWzBdIEdNTEMtUmVzdHJpY3Rpb24JT1BUSU9OQUwsCisJbm90aWZpY2F0aW9uVG9NU1VzZXIJWzFdIE5vdGlmaWNhdGlvblRvTVNVc2VyCU9QVElPTkFMLAorCS0tIElmIG5vdGlmaWNhdGlvblRvTVNVc2VyIGlzIG5vdCByZWNlaXZlZCwgdGhlIGRlZmF1bHQgdmFsdWUgYWNjb3JkaW5nIHRvIAorCS0tIDNHUFAgVFMgMjMuMjcxIHNoYWxsIGJlIGFzc3VtZWQuCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uIH0KKworR01MQy1SZXN0cmljdGlvbiA6Oj0gRU5VTUVSQVRFRCB7CisJZ21sYy1MaXN0CQkoMCksCisJaG9tZS1Db3VudHJ5CSgxKSAsCisJLi4uIH0KKy0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKKy0tIEF0IHJlY2VwdGlvbiBvZiBhbnkgb3RoZXIgdmFsdWUgdGhhbiB0aGUgb25lcyBsaXN0ZWQgdGhlIHJlY2VpdmVyIHNoYWxsIGlnbm9yZQorLS0gR01MQy1SZXN0cmljdGlvbi4KKworTm90aWZpY2F0aW9uVG9NU1VzZXIgOjo9IEVOVU1FUkFURUQgeworCW5vdGlmeUxvY2F0aW9uQWxsb3dlZAkoMCksCisJbm90aWZ5QW5kVmVyaWZ5LUxvY2F0aW9uQWxsb3dlZElmTm9SZXNwb25zZQkoMSksCisJbm90aWZ5QW5kVmVyaWZ5LUxvY2F0aW9uTm90QWxsb3dlZElmTm9SZXNwb25zZQkoMiksCisJLi4uLAorCWxvY2F0aW9uTm90QWxsb3dlZCAoMykgfQorLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0gQXQgcmVjZXB0aW9uIG9mIGFueSBvdGhlciB2YWx1ZSB0aGFuIHRoZSBvbmVzIGxpc3RlZCB0aGUgcmVjZWl2ZXIgc2hhbGwgaWdub3JlCistLSBOb3RpZmljYXRpb25Ub01TVXNlci4KKworU2VydmljZVR5cGVMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZlNlcnZpY2VUeXBlKSBPRgorCQkJCVNlcnZpY2VUeXBlCisKK21heE51bU9mU2VydmljZVR5cGUgIElOVEVHRVIgOjo9IDMyCisKK1NlcnZpY2VUeXBlIDo6PSBTRVFVRU5DRSB7CisJc2VydmljZVR5cGVJZGVudGl0eQlMQ1NTZXJ2aWNlVHlwZUlELAorCWdtbGMtUmVzdHJpY3Rpb24JWzBdIEdNTEMtUmVzdHJpY3Rpb24JT1BUSU9OQUwsCisJbm90aWZpY2F0aW9uVG9NU1VzZXIJWzFdIE5vdGlmaWNhdGlvblRvTVNVc2VyCU9QVElPTkFMLAorCS0tIElmIG5vdGlmaWNhdGlvblRvTVNVc2VyIGlzIG5vdCByZWNlaXZlZCwgdGhlIGRlZmF1bHQgdmFsdWUgYWNjb3JkaW5nIHRvIAorCS0tIDNHUFAgVFMgMjMuMjcxIHNoYWxsIGJlIGFzc3VtZWQuCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uIH0KKworTU9MUi1MaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZk1PTFItQ2xhc3MpIE9GCisJCQkJTU9MUi1DbGFzcworCittYXhOdW1PZk1PTFItQ2xhc3MgIElOVEVHRVIgOjo9IDMKKworTU9MUi1DbGFzcyA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVNTLUNvZGUsCisJc3MtU3RhdHVzCQlFeHQtU1MtU3RhdHVzLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworWm9uZUNvZGVMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZlpvbmVDb2RlcykKKwkJCQlPRiBab25lQ29kZQorCitab25lQ29kZSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgyKSkKKwktLSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBpbiBUUyAzR1BQIFRTIDIzLjAwMyBbMTddCisKK21heE51bU9mWm9uZUNvZGVzICBJTlRFR0VSIDo6PSAxMAorCitJbnNlcnRTdWJzY3JpYmVyRGF0YVJlcyA6Oj0gU0VRVUVOQ0UgeworCXRlbGVzZXJ2aWNlTGlzdAlbMV0gVGVsZXNlcnZpY2VMaXN0CU9QVElPTkFMLAorCWJlYXJlclNlcnZpY2VMaXN0CVsyXSBCZWFyZXJTZXJ2aWNlTGlzdAlPUFRJT05BTCwKKwlzcy1MaXN0CQlbM10gU1MtTGlzdAlPUFRJT05BTCwKKwlvZGItR2VuZXJhbERhdGEJWzRdIE9EQi1HZW5lcmFsRGF0YQlPUFRJT05BTCwKKwlyZWdpb25hbFN1YnNjcmlwdGlvblJlc3BvbnNlCVs1XSBSZWdpb25hbFN1YnNjcmlwdGlvblJlc3BvbnNlCU9QVElPTkFMLAorCXN1cHBvcnRlZENhbWVsUGhhc2VzCVs2XSBTdXBwb3J0ZWRDYW1lbFBoYXNlcwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzddIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCW9mZmVyZWRDYW1lbDRDU0lzCVs4XSBPZmZlcmVkQ2FtZWw0Q1NJcwlPUFRJT05BTCwKKwlzdXBwb3J0ZWRGZWF0dXJlcwlbOV0gU3VwcG9ydGVkRmVhdHVyZXMJT1BUSU9OQUwgfQorCitSZWdpb25hbFN1YnNjcmlwdGlvblJlc3BvbnNlIDo6PSBFTlVNRVJBVEVEIHsKKwluZXR3b3JrTm9kZS1BcmVhUmVzdHJpY3RlZAkoMCksCisJdG9vTWFueVpvbmVDb2RlcwkoMSksCisJem9uZUNvZGVzQ29uZmxpY3QJKDIpLAorCXJlZ2lvbmFsU3Vic2NOb3RTdXBwb3J0ZWQJKDMpfQorCitEZWxldGVTdWJzY3JpYmVyRGF0YUFyZyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQlbMF0gSU1TSSwKKwliYXNpY1NlcnZpY2VMaXN0CVsxXSBCYXNpY1NlcnZpY2VMaXN0CU9QVElPTkFMLAorCS0tIFRoZSBleGNlcHRpb24gaGFuZGxpbmcgZm9yIHJlY2VwdGlvbiBvZiB1bnN1cHBvcnRlZC9ub3QgYWxsb2NhdGVkCisJLS0gYmFzaWNTZXJ2aWNlQ29kZXMgaXMgZGVmaW5lZCBpbiBzZWN0aW9uIDYuOC4yCisJc3MtTGlzdAkJWzJdIFNTLUxpc3QJT1BUSU9OQUwsCisJcm9hbWluZ1Jlc3RyaWN0aW9uRHVlVG9VbnN1cHBvcnRlZEZlYXR1cmUgWzRdIE5VTEwJT1BUSU9OQUwsCisJcmVnaW9uYWxTdWJzY3JpcHRpb25JZGVudGlmaWVyCVs1XSBab25lQ29kZQlPUFRJT05BTCwKKwl2YnNHcm91cEluZGljYXRpb24JWzddIE5VTEwJCU9QVElPTkFMLAorCXZnY3NHcm91cEluZGljYXRpb24JWzhdIE5VTEwJIAlPUFRJT05BTCwKKwljYW1lbFN1YnNjcmlwdGlvbkluZm9XaXRoZHJhdwlbOV0gTlVMTAkgCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNl0gRXh0ZW5zaW9uQ29udGFpbmVyIAlPUFRJT05BTCwKKwkuLi4sCisJZ3Byc1N1YnNjcmlwdGlvbkRhdGFXaXRoZHJhdwlbMTBdIEdQUlNTdWJzY3JpcHRpb25EYXRhV2l0aGRyYXcJT1BUSU9OQUwsCisJcm9hbWluZ1Jlc3RyaWN0ZWRJblNnc25EdWVUb1Vuc3VwcHBvcnRlZEZlYXR1cmUgWzExXSBOVUxMCU9QVElPTkFMLAorCWxzYUluZm9ybWF0aW9uV2l0aGRyYXcJWzEyXSBMU0FJbmZvcm1hdGlvbldpdGhkcmF3CU9QVElPTkFMLAorCWdtbGMtTGlzdFdpdGhkcmF3IAlbMTNdCU5VTEwJCU9QVElPTkFMLAorCWlzdEluZm9ybWF0aW9uV2l0aGRyYXcJWzE0XSBOVUxMCQlPUFRJT05BTCwKKwlzcGVjaWZpY0NTSS1XaXRoZHJhdwlbMTVdIFNwZWNpZmljQ1NJLVdpdGhkcmF3CU9QVElPTkFMLAorCWNoYXJnaW5nQ2hhcmFjdGVyaXN0aWNzV2l0aGRyYXcJWzE2XSBOVUxMCQlPUFRJT05BTCwKKwlzdG4tc3JXaXRoZHJhdwlbMTddIE5VTEwJCU9QVElPTkFMLAorCWVwc1N1YnNjcmlwdGlvbkRhdGFXaXRoZHJhdwlbMThdIEVQUy1TdWJzY3JpcHRpb25EYXRhV2l0aGRyYXcJT1BUSU9OQUwsCisJYXBuLW9pLXJlcGxhY2VtZW50V2l0aGRyYXcJWzE5XSBOVUxMCQlPUFRJT05BTCwKKwljc2ctU3Vic2NyaXB0aW9uRGVsZXRlZAlbMjBdCU5VTEwJCU9QVElPTkFMIH0KKworU3BlY2lmaWNDU0ktV2l0aGRyYXcgOjo9IEJJVCBTVFJJTkcgeworCW8tY3NpICgwKSwKKwlzcy1jc2kgKDEpLAorCXRpZi1jc2kgKDIpLAorCWQtY3NpICgzKSwKKwl2dC1jc2kgKDQpLAorCW1vLXNtcy1jc2kgKDUpLAorCW0tY3NpICg2KSwKKwlncHJzLWNzaSAoNyksCisJdC1jc2kgKDgpLAorCW10LXNtcy1jc2kgKDkpLAorCW1nLWNzaSAoMTApLAorCW8tSU0tQ1NJICgxMSksIAorCWQtSU0tQ1NJICgxMiksCisJdnQtSU0tQ1NJICgxMykgfSAoU0laRSg4Li4zMikpIAorLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0gYml0cyAxMSB0byAzMSBzaGFsbCBiZSBpZ25vcmVkIGlmIHJlY2VpdmVkIGJ5IGEgbm9uLUlQIE11bHRpbWVkaWEgQ29yZSBOZXR3b3JrIGVudGl0eS4KKy0tIGJpdHMgMC0xMCBhbmQgMTQtMzEgc2hhbGwgYmUgaWdub3JlZCBpZiByZWNlaXZlZCBieSBhbiBJUCBNdWx0aW1lZGlhIENvcmUgTmV0d29yayBlbnRpdHkuCistLSBiaXRzIDExLTEzIGFyZSBvbmx5IGFwcGxpY2FibGUgaW4gYW4gSVAgTXVsdGltZWRpYSBDb3JlIE5ldHdvcmsuCistLSBCaXQgOCBhbmQgYml0cyAxMS0xMyBhcmUgb25seSBhcHBsaWNhYmxlIGZvciB0aGUgTm90ZVN1YnNjcmliZXJEYXRhTW9kaWZpZWQgb3BlcmF0aW9uLgorCitHUFJTU3Vic2NyaXB0aW9uRGF0YVdpdGhkcmF3IDo6PSBDSE9JQ0UgeworCWFsbEdQUlNEYXRhCU5VTEwsCisJY29udGV4dElkTGlzdAlDb250ZXh0SWRMaXN0fQorCitFUFMtU3Vic2NyaXB0aW9uRGF0YVdpdGhkcmF3IDo6PSBDSE9JQ0UgeworCWFsbEVQUy1EYXRhCU5VTEwsCisJY29udGV4dElkTGlzdAlDb250ZXh0SWRMaXN0fQorCitDb250ZXh0SWRMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZlBEUC1Db250ZXh0cykgT0YKKwkJCQlDb250ZXh0SWQKKworTFNBSW5mb3JtYXRpb25XaXRoZHJhdyA6Oj0gQ0hPSUNFIHsKKwlhbGxMU0FEYXRhCU5VTEwsCisJbHNhSWRlbnRpdHlMaXN0CUxTQUlkZW50aXR5TGlzdCB9CisKK0xTQUlkZW50aXR5TGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZMU0FzKSBPRgorCQkJCUxTQUlkZW50aXR5CisKK0Jhc2ljU2VydmljZUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mQmFzaWNTZXJ2aWNlcykgT0YKKwkJCQlFeHQtQmFzaWNTZXJ2aWNlQ29kZQorCittYXhOdW1PZkJhc2ljU2VydmljZXMgIElOVEVHRVIgOjo9IDcwCisKK0RlbGV0ZVN1YnNjcmliZXJEYXRhUmVzIDo6PSBTRVFVRU5DRSB7CisJcmVnaW9uYWxTdWJzY3JpcHRpb25SZXNwb25zZQlbMF0gUmVnaW9uYWxTdWJzY3JpcHRpb25SZXNwb25zZQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworVmxyQ2FtZWxTdWJzY3JpcHRpb25JbmZvIDo6PSBTRVFVRU5DRSB7CisJby1DU0kJCVswXSBPLUNTSQkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsxXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCXNzLUNTSQkJWzJdIFNTLUNTSQlPUFRJT05BTCwKKwlvLUJjc21DYW1lbFREUC1Dcml0ZXJpYUxpc3QJWzRdIE8tQmNzbUNhbWVsVERQQ3JpdGVyaWFMaXN0CU9QVElPTkFMLAorCXRpZi1DU0kJCVszXSBOVUxMCU9QVElPTkFMLAorCW0tQ1NJCQlbNV0gTS1DU0kJT1BUSU9OQUwsCisJbW8tc21zLUNTSQlbNl0gU01TLUNTSQlPUFRJT05BTCwKKwl2dC1DU0kJCVs3XSBULUNTSQlPUFRJT05BTCwKKwl0LUJDU00tQ0FNRUwtVERQLUNyaXRlcmlhTGlzdAlbOF0gVC1CQ1NNLUNBTUVMLVREUC1Dcml0ZXJpYUxpc3QJT1BUSU9OQUwsCisJZC1DU0kJCVs5XSBELUNTSQlPUFRJT05BTCwKKwltdC1zbXMtQ1NJCVsxMF0gU01TLUNTSQlPUFRJT05BTCwKKwltdC1zbXNDQU1FTFREUC1Dcml0ZXJpYUxpc3QJWzExXQlNVC1zbXNDQU1FTFREUC1Dcml0ZXJpYUxpc3QJT1BUSU9OQUwKKwl9CisKK01ULXNtc0NBTUVMVERQLUNyaXRlcmlhTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4uIG1heE51bU9mQ2FtZWxURFBEYXRhKSBPRgorCU1ULXNtc0NBTUVMVERQLUNyaXRlcmlhCisKK01ULXNtc0NBTUVMVERQLUNyaXRlcmlhIDo6PSBTRVFVRU5DRSB7CisJc21zLVRyaWdnZXJEZXRlY3Rpb25Qb2ludAlTTVMtVHJpZ2dlckRldGVjdGlvblBvaW50LAorCXRwZHUtVHlwZUNyaXRlcmlvbglbMF0JVFBEVS1UeXBlQ3JpdGVyaW9uCQlPUFRJT05BTCwKKwkuLi4gfQorCitUUERVLVR5cGVDcml0ZXJpb24gOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mVFBEVVR5cGVzKSBPRgorCU1ULVNNUy1UUERVLVR5cGUKKworCittYXhOdW1PZlRQRFVUeXBlcyBJTlRFR0VSIDo6PSA1CisKK01ULVNNUy1UUERVLVR5cGUgOjo9IEVOVU1FUkFURUQgeworCXNtcy1ERUxJVkVSIAkoMCksCisJc21zLVNVQk1JVC1SRVBPUlQgCSgxKSwKKwlzbXMtU1RBVFVTLVJFUE9SVCAJKDIpLAorCS4uLiB9CisKKy0tCWV4Y2VwdGlvbiBoYW5kbGluZzoKKy0tCUZvciBUUERVLVR5cGVDcml0ZXJpb24gc2VxdWVuY2VzIGNvbnRhaW5pbmcgdGhpcyBwYXJhbWV0ZXIgd2l0aCBhbnkKKy0tCW90aGVyIHZhbHVlIHRoYW4gdGhlIG9uZXMgbGlzdGVkIGFib3ZlIHRoZSByZWNlaXZlciBzaGFsbCBpZ25vcmUgCistLQl0aGUgd2hvbGUgVFBEVS1UeXBlQ3JpdGVyaW9uIHNlcXVlbmNlLgorLS0JSW4gQ0FNRUwgcGhhc2UgNCwgc21zLVNVQk1JVC1SRVBPUlQgc2hhbGwgbm90IGJlIHVzZWQgYW5kIGEgcmVjZWl2ZWQgVFBEVS1UeXBlQ3JpdGVyaW9uCistLQlzZXF1ZW5jZSBjb250YWluaW5nIHNtcy1TVUJNSVQtUkVQT1JUIHNoYWxsIGJlIHdob2xseSBpZ25vcmVkLgorCitELUNTSSA6Oj0gU0VRVUVOQ0UgeworCWRwLUFuYWx5c2VkSW5mb0NyaXRlcmlhTGlzdAlbMF0gRFAtQW5hbHlzZWRJbmZvQ3JpdGVyaWFMaXN0CU9QVElPTkFMLAorCWNhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nCVsxXSBDYW1lbENhcGFiaWxpdHlIYW5kbGluZwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwlub3RpZmljYXRpb25Ub0NTRQlbM10JTlVMTAkJT1BUSU9OQUwsCisJY3NpLUFjdGl2ZQlbNF0JTlVMTAkJT1BUSU9OQUwsCisJLi4ufSAKKy0tCW5vdGlmaWNhdGlvblRvQ1NFIGFuZCBjc2ktQWN0aXZlIHNoYWxsIG5vdCBiZSBwcmVzZW50IHdoZW4gRC1DU0kgaXMgc2VudCB0byBWTFIvR01TQy4KKy0tCVRoZXkgbWF5IG9ubHkgYmUgaW5jbHVkZWQgaW4gQVRTSS9BVE0gYWNrL05TREMgbWVzc2FnZS4KKy0tCURQLUFuYWx5c2VkSW5mb0NyaXRlcmlhIGFuZCAgY2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcgc2hhbGwgYmUgcHJlc2VudCBpbiAKKy0tCXRoZSBELUNTSSBzZXF1ZW5jZS4KKy0tCUlmIEQtQ1NJIGlzIHNlZ21lbnRlZCwgdGhlbiB0aGUgZmlyc3Qgc2VnbWVudCBzaGFsbCBjb250YWluIGRwLUFuYWx5c2VkSW5mb0NyaXRlcmlhTGlzdAorLS0JYW5kIGNhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nLiBTdWJzZXF1ZW50IHNlZ21lbnRzIHNoYWxsIG5vdCBjb250YWluCistLQljYW1lbENhcGFiaWxpdHlIYW5kbGluZywgYnV0IG1heSBjb250YWluIGRwLUFuYWx5c2VkSW5mb0NyaXRlcmlhTGlzdC4KKworRFAtQW5hbHlzZWRJbmZvQ3JpdGVyaWFMaXN0ICA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZEUC1BbmFseXNlZEluZm9Dcml0ZXJpYSkgT0YKKwkJCQlEUC1BbmFseXNlZEluZm9Dcml0ZXJpdW0KKworbWF4TnVtT2ZEUC1BbmFseXNlZEluZm9Dcml0ZXJpYSBJTlRFR0VSIDo6PSAxMAorCitEUC1BbmFseXNlZEluZm9Dcml0ZXJpdW0gOjo9IFNFUVVFTkNFIHsKKwlkaWFsbGVkTnVtYmVyCUlTRE4tQWRkcmVzc1N0cmluZywKKwlzZXJ2aWNlS2V5CVNlcnZpY2VLZXksCisJZ3NtU0NGLUFkZHJlc3MJSVNETi1BZGRyZXNzU3RyaW5nLAorCWRlZmF1bHRDYWxsSGFuZGxpbmcJRGVmYXVsdENhbGxIYW5kbGluZywKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworU1MtQ1NJIDo6PSBTRVFVRU5DRSB7CisJc3MtQ2FtZWxEYXRhCVNTLUNhbWVsRGF0YSwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlub3RpZmljYXRpb25Ub0NTRQlbMF0JTlVMTAkJT1BUSU9OQUwsCisJY3NpLUFjdGl2ZQlbMV0JTlVMTAkJT1BUSU9OQUwKKy0tCW5vdGlmaWNhdGlvblRvQ1NFIGFuZCBjc2ktQWN0aXZlIHNoYWxsIG5vdCBiZSBwcmVzZW50IHdoZW4gU1MtQ1NJIGlzIHNlbnQgdG8gVkxSLgorLS0JVGhleSBtYXkgb25seSBiZSBpbmNsdWRlZCBpbiBBVFNJL0FUTSBhY2svTlNEQyBtZXNzYWdlLgorfQorCitTUy1DYW1lbERhdGEgIDo6PSBTRVFVRU5DRSB7CisJc3MtRXZlbnRMaXN0CVNTLUV2ZW50TGlzdCwKKwlnc21TQ0YtQWRkcmVzcwlJU0ROLUFkZHJlc3NTdHJpbmcsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVswXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsIAorCS4uLn0KKworU1MtRXZlbnRMaXN0ICA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZDYW1lbFNTRXZlbnRzKSBPRiBTUy1Db2RlCisJLS0gQWN0aW9ucyBmb3IgdGhlIGZvbGxvd2luZyBTUy1Db2RlIHZhbHVlcyBhcmUgZGVmaW5lZCBpbiBDQU1FTCBQaGFzZSAzOgorCS0tIGVjdAkJU1MtQ29kZSA6Oj0gJzAwMTEwMDAxJ0IKKwktLSBtdWx0aVBUWQlTUy1Db2RlIDo6PSAnMDEwMTAwMDEnQgorCS0tIGNkCQlTUy1Db2RlIDo6PSAnMDAxMDAxMDAnQgorCS0tIGNjYnMJCVNTLUNvZGUgOjo9ICcwMTAwMDEwMCdCCisJLS0gYWxsIG90aGVyIFNTIGNvZGVzIHNoYWxsIGJlIGlnbm9yZWQKKwktLSBXaGVuIFNTLUNTSSBpcyBzZW50IHRvIHRoZSBWTFIsIGl0IHNoYWxsIG5vdCBjb250YWluIGEgbWFya2luZyBmb3IgY2Nicy4KKwktLSBJZiB0aGUgVkxSIHJlY2VpdmVzIFNTLUNTSSBjb250YWluaW5nIGEgbWFya2luZyBmb3IgY2NicywgdGhlIFZMUiBzaGFsbCBkaXNjYXJkIHRoZQorCS0tIGNjYnMgbWFya2luZyBpbiBTUy1DU0kuCisKK21heE51bU9mQ2FtZWxTU0V2ZW50cyBJTlRFR0VSIDo6PSAxMAorCitPLUNTSSA6Oj0gU0VRVUVOQ0UgeworCW8tQmNzbUNhbWVsVERQRGF0YUxpc3QJTy1CY3NtQ2FtZWxURFBEYXRhTGlzdCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwljYW1lbENhcGFiaWxpdHlIYW5kbGluZwlbMF0gQ2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcJT1BUSU9OQUwsCisJbm90aWZpY2F0aW9uVG9DU0UJWzFdCU5VTEwJCU9QVElPTkFMLAorCWNzaUFjdGl2ZQkJWzJdCU5VTEwJCU9QVElPTkFMfQorLS0Jbm90aWZpY2F0aW9udG9DU0UgYW5kIGNzaUFjdGl2ZSBzaGFsbCBub3QgYmUgcHJlc2VudCB3aGVuIE8tQ1NJIGlzIHNlbnQgdG8gVkxSL0dNU0MuCistLQlUaGV5IG1heSBvbmx5IGJlIGluY2x1ZGVkIGluIEFUU0kvQVRNIGFjay9OU0RDIG1lc3NhZ2UuCistLQlPLUNTSSBzaGFsbCBub3QgYmUgc2VnbWVudGVkLgorCitPLUJjc21DYW1lbFREUERhdGFMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkNhbWVsVERQRGF0YSkgT0YKKwlPLUJjc21DYW1lbFREUERhdGEKKwktLSBPLUJjc21DYW1lbFREUERhdGFMaXN0IHNoYWxsIG5vdCBjb250YWluIG1vcmUgdGhhbiBvbmUgaW5zdGFuY2Ugb2YKKwktLSBPLUJjc21DYW1lbFREUERhdGEgY29udGFpbmluZyB0aGUgc2FtZSB2YWx1ZSBmb3Igby1CY3NtVHJpZ2dlckRldGVjdGlvblBvaW50LgorCS0tIEZvciBDQU1FTCBQaGFzZSAyLCB0aGlzIG1lYW5zIHRoYXQgb25seSBvbmUgaW5zdGFuY2Ugb2YgTy1CY3NtQ2FtZWxURFBEYXRhIGlzIGFsbG93ZWQKKwktLSB3aXRoIG8tQmNzbVRyaWdnZXJEZXRlY3Rpb25Qb2ludCBiZWluZyBlcXVhbCB0byBEUDIuCisKK21heE51bU9mQ2FtZWxURFBEYXRhICBJTlRFR0VSIDo6PSAxMAorCitPLUJjc21DYW1lbFREUERhdGEgOjo9IFNFUVVFTkNFIHsKKwlvLUJjc21UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQJTy1CY3NtVHJpZ2dlckRldGVjdGlvblBvaW50LAorCXNlcnZpY2VLZXkJU2VydmljZUtleSwKKwlnc21TQ0YtQWRkcmVzcwlbMF0gSVNETi1BZGRyZXNzU3RyaW5nLAorCWRlZmF1bHRDYWxsSGFuZGxpbmcJWzFdIERlZmF1bHRDYWxsSGFuZGxpbmcsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uCisJfQorCitTZXJ2aWNlS2V5IDo6PSBJTlRFR0VSICgwLi4yMTQ3NDgzNjQ3KQorCitPLUJjc21UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQgOjo9IEVOVU1FUkFURUQgeworCWNvbGxlY3RlZEluZm8gKDIpLAorCS4uLiwKKwlyb3V0ZVNlbGVjdEZhaWx1cmUgKDQpIH0KKwktLSBleGNlcHRpb24gaGFuZGxpbmc6CisJLS0gRm9yIE8tQmNzbUNhbWVsVERQRGF0YSBzZXF1ZW5jZXMgY29udGFpbmluZyB0aGlzIHBhcmFtZXRlciB3aXRoIGFueQorCS0tIG90aGVyIHZhbHVlIHRoYW4gdGhlIG9uZXMgbGlzdGVkIHRoZSByZWNlaXZlciBzaGFsbCBpZ25vcmUgdGhlIHdob2xlIAorCS0tIE8tQmNzbUNhbWVsVERQRGF0YXNlcXVlbmNlLiAKKwktLSBGb3IgTy1CY3NtQ2FtZWxURFAtQ3JpdGVyaWEgc2VxdWVuY2VzIGNvbnRhaW5pbmcgdGhpcyBwYXJhbWV0ZXIgd2l0aCBhbnkKKwktLSBvdGhlciB2YWx1ZSB0aGFuIHRoZSBvbmVzIGxpc3RlZCB0aGUgcmVjZWl2ZXIgc2hhbGwgaWdub3JlIHRoZSB3aG9sZQorCS0tIE8tQmNzbUNhbWVsVERQLUNyaXRlcmlhIHNlcXVlbmNlLgorCitPLUJjc21DYW1lbFREUENyaXRlcmlhTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZDYW1lbFREUERhdGEpIE9GCisJTy1CY3NtQ2FtZWxURFAtQ3JpdGVyaWEgCisKK1QtQkNTTS1DQU1FTC1URFAtQ3JpdGVyaWFMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkNhbWVsVERQRGF0YSkgT0YKKwlULUJDU00tQ0FNRUwtVERQLUNyaXRlcmlhIAorCitPLUJjc21DYW1lbFREUC1Dcml0ZXJpYSA6Oj0gU0VRVUVOQ0UgeworCW8tQmNzbVRyaWdnZXJEZXRlY3Rpb25Qb2ludAlPLUJjc21UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQsCQorCWRlc3RpbmF0aW9uTnVtYmVyQ3JpdGVyaWEgCVswXSBEZXN0aW5hdGlvbk51bWJlckNyaXRlcmlhCU9QVElPTkFMLAorCWJhc2ljU2VydmljZUNyaXRlcmlhCVsxXSBCYXNpY1NlcnZpY2VDcml0ZXJpYQlPUFRJT05BTCwKKwljYWxsVHlwZUNyaXRlcmlhCVsyXSBDYWxsVHlwZUNyaXRlcmlhCU9QVElPTkFMLAorCS4uLiwKKwlvLUNhdXNlVmFsdWVDcml0ZXJpYQlbM10gTy1DYXVzZVZhbHVlQ3JpdGVyaWEJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs0XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwgfQorCitULUJDU00tQ0FNRUwtVERQLUNyaXRlcmlhIDo6PSBTRVFVRU5DRSB7CisJdC1CQ1NNLVRyaWdnZXJEZXRlY3Rpb25Qb2ludAlULUJjc21UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQsCQorCWJhc2ljU2VydmljZUNyaXRlcmlhCVswXSBCYXNpY1NlcnZpY2VDcml0ZXJpYQlPUFRJT05BTCwKKwl0LUNhdXNlVmFsdWVDcml0ZXJpYQlbMV0gVC1DYXVzZVZhbHVlQ3JpdGVyaWEJT1BUSU9OQUwsCisJLi4uIH0KKworRGVzdGluYXRpb25OdW1iZXJDcml0ZXJpYSAgOjo9IFNFUVVFTkNFIHsKKwltYXRjaFR5cGUJCVswXSBNYXRjaFR5cGUsCisJZGVzdGluYXRpb25OdW1iZXJMaXN0IAlbMV0gRGVzdGluYXRpb25OdW1iZXJMaXN0CU9QVElPTkFMLAorCWRlc3RpbmF0aW9uTnVtYmVyTGVuZ3RoTGlzdAlbMl0gRGVzdGluYXRpb25OdW1iZXJMZW5ndGhMaXN0CU9QVElPTkFMLAorCS0tIG9uZSBvciBib3RoIG9mIGRlc3RpbmF0aW9uTnVtYmVyTGlzdCBhbmQgZGVzdGluYXRpb25OdW1iZXJMZW5ndGhMaXN0IAorCS0tIHNoYWxsIGJlIHByZXNlbnQKKwkuLi59CisKK0Rlc3RpbmF0aW9uTnVtYmVyTGlzdCAgOjo9IFNFUVVFTkNFIFNJWkUJKDEuLm1heE51bU9mQ2FtZWxEZXN0aW5hdGlvbk51bWJlcnMpIE9GCisJCQkJSVNETi1BZGRyZXNzU3RyaW5nCisJLS0gVGhlIHJlY2VpdmluZyBlbnRpdHkgc2hhbGwgbm90IGNoZWNrIHRoZSBmb3JtYXQgb2YgYSBudW1iZXIgaW4KKwktLSB0aGUgZGlhbGxlZCBudW1iZXIgbGlzdAorCitEZXN0aW5hdGlvbk51bWJlckxlbmd0aExpc3QgIDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkNhbWVsRGVzdGluYXRpb25OdW1iZXJMZW5ndGhzKSBPRiAKKwkJCQkJSU5URUdFUigxLi5tYXhOdW1PZklTRE4tQWRkcmVzc0RpZ2l0cykKKworQmFzaWNTZXJ2aWNlQ3JpdGVyaWEgICA6Oj0gU0VRVUVOQ0UgU0laRSgxLi5tYXhOdW1PZkNhbWVsQmFzaWNTZXJ2aWNlQ3JpdGVyaWEpIE9GCisJRXh0LUJhc2ljU2VydmljZUNvZGUKKworbWF4TnVtT2ZJU0ROLUFkZHJlc3NEaWdpdHMgIElOVEVHRVIgOjo9IDE1CisKK21heE51bU9mQ2FtZWxEZXN0aW5hdGlvbk51bWJlcnMgIElOVEVHRVIgOjo9IDEwCisKK21heE51bU9mQ2FtZWxEZXN0aW5hdGlvbk51bWJlckxlbmd0aHMgIElOVEVHRVIgOjo9IDMKKworbWF4TnVtT2ZDYW1lbEJhc2ljU2VydmljZUNyaXRlcmlhICBJTlRFR0VSIDo6PSA1CisKK0NhbGxUeXBlQ3JpdGVyaWEgICAgICAgOjo9IEVOVU1FUkFURUQgeworCWZvcndhcmRlZCAJKDApLAorCW5vdEZvcndhcmRlZAkoMSl9CisKK01hdGNoVHlwZSAgICAgICA6Oj0gRU5VTUVSQVRFRCB7CisJaW5oaWJpdGluZyAJKDApLAorCWVuYWJsaW5nCQkoMSl9CisKK08tQ2F1c2VWYWx1ZUNyaXRlcmlhICAgOjo9IFNFUVVFTkNFIFNJWkUoMS4ubWF4TnVtT2ZDQU1FTC1PLUNhdXNlVmFsdWVDcml0ZXJpYSkgT0YKKwlDYXVzZVZhbHVlCisKK1QtQ2F1c2VWYWx1ZUNyaXRlcmlhICAgOjo9IFNFUVVFTkNFIFNJWkUoMS4ubWF4TnVtT2ZDQU1FTC1ULUNhdXNlVmFsdWVDcml0ZXJpYSkgT0YKKwlDYXVzZVZhbHVlCisKK21heE51bU9mQ0FNRUwtTy1DYXVzZVZhbHVlQ3JpdGVyaWEgIElOVEVHRVIgOjo9IDUKKworbWF4TnVtT2ZDQU1FTC1ULUNhdXNlVmFsdWVDcml0ZXJpYSAgSU5URUdFUiA6Oj0gNQorCitDYXVzZVZhbHVlIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUoMSkpCistLSBUeXBlIGV4dHJhY3RlZCBmcm9tIENhdXNlIHBhcmFtZXRlciBpbiBJVFUtVCBSZWNvbW1lbmRhdGlvbiBRLjc2My4KKy0tIEZvciB0aGUgdXNlIG9mIGNhdXNlIHZhbHVlIHJlZmVyIHRvIElUVS1UIFJlY29tbWVuZGF0aW9uIFEuODUwLgorCitEZWZhdWx0Q2FsbEhhbmRsaW5nIDo6PSBFTlVNRVJBVEVEIHsKKwljb250aW51ZUNhbGwgKDApICwKKwlyZWxlYXNlQ2FsbCAoMSkgLAorCS4uLn0KKwktLSBleGNlcHRpb24gaGFuZGxpbmc6CisJLS0gcmVjZXB0aW9uIG9mIHZhbHVlcyBpbiByYW5nZSAyLTMxIHNoYWxsIGJlIHRyZWF0ZWQgYXMgImNvbnRpbnVlQ2FsbCIKKwktLSByZWNlcHRpb24gb2YgdmFsdWVzIGdyZWF0ZXIgdGhhbiAzMSBzaGFsbCBiZSB0cmVhdGVkIGFzICJyZWxlYXNlQ2FsbCIKKworQ2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcgOjo9IElOVEVHRVIoMS4uMTYpIAorCS0tIHZhbHVlIDEgPSBDQU1FTCBwaGFzZSAxLAorCS0tIHZhbHVlIDIgPSBDQU1FTCBwaGFzZSAyLAorCS0tIHZhbHVlIDMgPSBDQU1FTCBQaGFzZSAzLAorCS0tIHZhbHVlIDQgPSBDQU1FTCBwaGFzZSA0OgorCS0tIHJlY2VwdGlvbiBvZiB2YWx1ZXMgZ3JlYXRlciB0aGFuIDQgc2hhbGwgYmUgdHJlYXRlZCBhcyBDQU1FTCBwaGFzZSA0LgorCitTdXBwb3J0ZWRDYW1lbFBoYXNlcyA6Oj0gQklUIFNUUklORyB7CisJcGhhc2UxICgwKSwKKwlwaGFzZTIgKDEpLAorCXBoYXNlMyAoMiksCisJcGhhc2U0ICgzKX0gKFNJWkUgKDEuLjE2KSkgCistLSBBIG5vZGUgc2hhbGwgbWFyayBpbiB0aGUgQklUIFNUUklORyBhbGwgQ0FNRUwgUGhhc2VzIGl0IHN1cHBvcnRzLgorLS0gT3RoZXIgdmFsdWVzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KKworT2ZmZXJlZENhbWVsNENTSXMgOjo9IEJJVCBTVFJJTkcgeyAJCisJby1jc2kJCSgwKSwKKwlkLWNzaQkJKDEpLAorCXZ0LWNzaQkJKDIpLAorCXQtY3NpCQkoMyksCisJbXQtc21zLWNzaQkoNCksCisJbWctY3NpCQkoNSksCisJcHNpLWVuaGFuY2VtZW50cwkoNikgCit9IChTSVpFICg3Li4xNikpCistLSBBIG5vZGUgc3VwcG9ydGluZyBDYW1lbCBwaGFzZSA0IHNoYWxsIG1hcmsgaW4gdGhlIEJJVCBTVFJJTkcgYWxsIENhbWVsNCBDU0lzIAorLS0gaXQgb2ZmZXJzLgorLS0gT3RoZXIgdmFsdWVzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KKworT2ZmZXJlZENhbWVsNEZ1bmN0aW9uYWxpdGllcyA6Oj0gQklUIFNUUklORyB7IAkKKwlpbml0aWF0ZUNhbGxBdHRlbXB0CSgwKSwKKwlzcGxpdExlZwkJKDEpLAorCW1vdmVMZWcJCSgyKSwKKwlkaXNjb25uZWN0TGVnCSgzKSwKKwllbnRpdHlSZWxlYXNlZAkoNCksCisJZGZjLVdpdGhBcmd1bWVudAkoNSksCisJcGxheVRvbmUJCSg2KSwKKwlkdG1mLU1pZENhbGwJKDcpLAorCWNoYXJnaW5nSW5kaWNhdG9yCSg4KSwKKwlhbGVydGluZ0RQCSg5KSwKKwlsb2NhdGlvbkF0QWxlcnRpbmcJKDEwKSwKKwljaGFuZ2VPZlBvc2l0aW9uRFAJKDExKSwKKwlvci1JbnRlcmFjdGlvbnMJKDEyKSwKKwl3YXJuaW5nVG9uZUVuaGFuY2VtZW50cwkoMTMpLAorCWNmLUVuaGFuY2VtZW50cwkoMTQpLAorCXN1YnNjcmliZWRFbmhhbmNlZERpYWxsZWRTZXJ2aWNlcyAJKDE1KSwKKwlzZXJ2aW5nTmV0d29ya0VuaGFuY2VkRGlhbGxlZFNlcnZpY2VzICgxNiksCisJY3JpdGVyaWFGb3JDaGFuZ2VPZlBvc2l0aW9uRFAJKDE3KSwKKwlzZXJ2aWNlQ2hhbmdlRFAJKDE4KSwKKwljb2xsZWN0SW5mb3JtYXRpb24JKDE5KQorfSAoU0laRSAoMTUuLjY0KSkKKy0tIEEgbm9kZSBzdXBwb3J0aW5nIENhbWVsIHBoYXNlIDQgc2hhbGwgbWFyayBpbiB0aGUgQklUIFNUUklORyBhbGwgQ0FNRUw0IAorLS0gZnVuY3Rpb25hbGl0aWVzIGl0IG9mZmVycy4KKy0tIE90aGVyIHZhbHVlcyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCisKK1NNUy1DU0kgOjo9IFNFUVVFTkNFIHsKKwlzbXMtQ0FNRUwtVERQLURhdGFMaXN0CVswXSBTTVMtQ0FNRUwtVERQLURhdGFMaXN0CU9QVElPTkFMLAorCWNhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nCVsxXSBDYW1lbENhcGFiaWxpdHlIYW5kbGluZwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwlub3RpZmljYXRpb25Ub0NTRQlbM10gTlVMTAkJT1BUSU9OQUwsCisJY3NpLUFjdGl2ZQlbNF0gTlVMTAkJT1BUSU9OQUwsCisJLi4ufQorLS0Jbm90aWZpY2F0aW9uVG9DU0UgYW5kIGNzaS1BY3RpdmUgc2hhbGwgbm90IGJlIHByZXNlbnQKKy0tCXdoZW4gTU8tU01TLUNTSSBvciBNVC1TTVMtQ1NJIGlzIHNlbnQgdG8gVkxSIG9yIFNHU04uCistLQlUaGV5IG1heSBvbmx5IGJlIGluY2x1ZGVkIGluIEFUU0kvQVRNIGFjay9OU0RDIG1lc3NhZ2UuCistLQlTTVMtQ0FNRUwtVERQLURhdGEgYW5kICBjYW1lbENhcGFiaWxpdHlIYW5kbGluZyBzaGFsbCBiZSBwcmVzZW50IGluIAorLS0JdGhlIFNNUy1DU0kgc2VxdWVuY2UuCistLQlJZiBTTVMtQ1NJIGlzIHNlZ21lbnRlZCwgc21zLUNBTUVMLVREUC1EYXRhTGlzdCBhbmQgY2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcgc2hhbGwgYmUgCistLQlwcmVzZW50IGluIHRoZSBmaXJzdCBzZWdtZW50CisKK1NNUy1DQU1FTC1URFAtRGF0YUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mQ2FtZWxURFBEYXRhKSBPRgorCVNNUy1DQU1FTC1URFAtRGF0YQorLS0JU01TLUNBTUVMLVREUC1EYXRhTGlzdCBzaGFsbCBub3QgY29udGFpbiBtb3JlIHRoYW4gb25lIGluc3RhbmNlIG9mCistLQlTTVMtQ0FNRUwtVERQLURhdGEgY29udGFpbmluZyB0aGUgc2FtZSB2YWx1ZSBmb3Igc21zLVRyaWdnZXJEZXRlY3Rpb25Qb2ludC4KKworU01TLUNBTUVMLVREUC1EYXRhIDo6PSBTRVFVRU5DRSB7CisJc21zLVRyaWdnZXJEZXRlY3Rpb25Qb2ludAlbMF0gU01TLVRyaWdnZXJEZXRlY3Rpb25Qb2ludCwKKwlzZXJ2aWNlS2V5CVsxXSBTZXJ2aWNlS2V5LAorCWdzbVNDRi1BZGRyZXNzCVsyXSBJU0ROLUFkZHJlc3NTdHJpbmcsCisJZGVmYXVsdFNNUy1IYW5kbGluZwlbM10gRGVmYXVsdFNNUy1IYW5kbGluZywKKwlleHRlbnNpb25Db250YWluZXIJWzRdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4KKwl9CisKK1NNUy1UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQgOjo9IEVOVU1FUkFURUQgeworCXNtcy1Db2xsZWN0ZWRJbmZvICgxKSwKKwkuLi4sCisJc21zLURlbGl2ZXJ5UmVxdWVzdCAoMikKKwl9CistLQlleGNlcHRpb24gaGFuZGxpbmc6CistLQlGb3IgU01TLUNBTUVMLVREUC1EYXRhIGFuZCBNVC1zbXNDQU1FTFREUC1Dcml0ZXJpYSBzZXF1ZW5jZXMgY29udGFpbmluZyB0aGlzIAorLS0JcGFyYW1ldGVyIHdpdGggYW55IG90aGVyIHZhbHVlIHRoYW4gdGhlIG9uZXMgbGlzdGVkIHRoZSByZWNlaXZlciBzaGFsbCBpZ25vcmUKKy0tCXRoZSB3aG9sZSBzZXF1ZW5jZS4KKy0tCistLQlJZiB0aGlzIHBhcmFtZXRlciBpcyByZWNlaXZlZCB3aXRoIGFueSBvdGhlciB2YWx1ZSB0aGFuIHNtcy1Db2xsZWN0ZWRJbmZvCistLQlpbiBhbiBTTVMtQ0FNRUwtVERQLURhdGEgc2VxdWVuY2UgY29udGFpbmVkIGluIG1vLXNtcy1DU0ksIHRoZW4gdGhlIHJlY2VpdmVyIHNoYWxsCistLQlpZ25vcmUgdGhlIHdob2xlIFNNUy1DQU1FTC1URFAtRGF0YSBzZXF1ZW5jZS4KKy0tCistLQlJZiB0aGlzIHBhcmFtZXRlciBpcyByZWNlaXZlZCB3aXRoIGFueSBvdGhlciB2YWx1ZSB0aGFuIHNtcy1EZWxpdmVyeVJlcXVlc3QKKy0tCWluIGFuIFNNUy1DQU1FTC1URFAtRGF0YSBzZXF1ZW5jZSBjb250YWluZWQgaW4gbXQtc21zLUNTSSB0aGVuIHRoZSByZWNlaXZlciBzaGFsbAorLS0JaWdub3JlIHRoZSB3aG9sZSBTTVMtQ0FNRUwtVERQLURhdGEgc2VxdWVuY2UuCistLQorLS0JSWYgdGhpcyBwYXJhbWV0ZXIgaXMgcmVjZWl2ZWQgd2l0aCBhbnkgb3RoZXIgdmFsdWUgdGhhbiBzbXMtRGVsaXZlcnlSZXF1ZXN0CistLQlpbiBhbiBNVC1zbXNDQU1FTFREUC1Dcml0ZXJpYSBzZXF1ZW5jZSB0aGVuIHRoZSByZWNlaXZlciBzaGFsbAorLS0JaWdub3JlIHRoZSB3aG9sZSBNVC1zbXNDQU1FTFREUC1Dcml0ZXJpYSBzZXF1ZW5jZS4KKworRGVmYXVsdFNNUy1IYW5kbGluZyA6Oj0gRU5VTUVSQVRFRCB7CisJY29udGludWVUcmFuc2FjdGlvbiAoMCkgLAorCXJlbGVhc2VUcmFuc2FjdGlvbiAoMSkgLAorCS4uLn0KKy0tCWV4Y2VwdGlvbiBoYW5kbGluZzoKKy0tCXJlY2VwdGlvbiBvZiB2YWx1ZXMgaW4gcmFuZ2UgMi0zMSBzaGFsbCBiZSB0cmVhdGVkIGFzICJjb250aW51ZVRyYW5zYWN0aW9uIgorLS0JcmVjZXB0aW9uIG9mIHZhbHVlcyBncmVhdGVyIHRoYW4gMzEgc2hhbGwgYmUgdHJlYXRlZCBhcyAicmVsZWFzZVRyYW5zYWN0aW9uIgorCitNLUNTSSA6Oj0gU0VRVUVOQ0UgeworCW1vYmlsaXR5VHJpZ2dlcnMJTW9iaWxpdHlUcmlnZ2VycywKKwlzZXJ2aWNlS2V5CVNlcnZpY2VLZXksCisJZ3NtU0NGLUFkZHJlc3MJWzBdCUlTRE4tQWRkcmVzc1N0cmluZywKKwlleHRlbnNpb25Db250YWluZXIJWzFdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwlub3RpZmljYXRpb25Ub0NTRQlbMl0gTlVMTAkJT1BUSU9OQUwsCisJY3NpLUFjdGl2ZQlbM10gTlVMTAkJT1BUSU9OQUwsCisJLi4ufQorLS0Jbm90aWZpY2F0aW9uVG9DU0UgYW5kIGNzaS1BY3RpdmUgc2hhbGwgbm90IGJlIHByZXNlbnQgd2hlbiBNLUNTSSBpcyBzZW50IHRvIFZMUi4KKy0tCVRoZXkgbWF5IG9ubHkgYmUgaW5jbHVkZWQgaW4gQVRTSS9BVE0gYWNrL05TREMgbWVzc2FnZS4KKworTUctQ1NJIDo6PSBTRVFVRU5DRSB7CisJbW9iaWxpdHlUcmlnZ2VycwlNb2JpbGl0eVRyaWdnZXJzLAorCXNlcnZpY2VLZXkJU2VydmljZUtleSwKKwlnc21TQ0YtQWRkcmVzcwlbMF0JSVNETi1BZGRyZXNzU3RyaW5nLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMV0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCW5vdGlmaWNhdGlvblRvQ1NFCVsyXSBOVUxMCQlPUFRJT05BTCwKKwljc2ktQWN0aXZlCVszXSBOVUxMCQlPUFRJT05BTCwKKwkuLi59CistLQlub3RpZmljYXRpb25Ub0NTRSBhbmQgY3NpLUFjdGl2ZSBzaGFsbCBub3QgYmUgcHJlc2VudCB3aGVuIE1HLUNTSSBpcyBzZW50IHRvIFNHU04uCistLQlUaGV5IG1heSBvbmx5IGJlIGluY2x1ZGVkIGluIEFUU0kvQVRNIGFjay9OU0RDIG1lc3NhZ2UuCisKK01vYmlsaXR5VHJpZ2dlcnMgIDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZk1vYmlsaXR5VHJpZ2dlcnMpIE9GCisJTU0tQ29kZQorCittYXhOdW1PZk1vYmlsaXR5VHJpZ2dlcnMgSU5URUdFUiA6Oj0gMTAKKworTU0tQ29kZSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKy0tCVRoaXMgdHlwZSBpcyB1c2VkIHRvIGluZGljYXRlIGEgTW9iaWxpdHkgTWFuYWdlbWVudCBldmVudC4KKy0tCUFjdGlvbnMgZm9yIHRoZSBmb2xsb3dpbmcgTU0tQ29kZSB2YWx1ZXMgYXJlIGRlZmluZWQgaW4gQ0FNRUwgUGhhc2UgNDoKKy0tCistLQlDUyBkb21haW4gTU0gZXZlbnRzOgorLS0JTG9jYXRpb24tdXBkYXRlLWluLXNhbWUtVkxSCU1NLUNvZGUgOjo9ICcwMDAwMDAwMCdCCistLQlMb2NhdGlvbi11cGRhdGUtdG8tb3RoZXItVkxSCU1NLUNvZGUgOjo9ICcwMDAwMDAwMSdCCistLQlJTVNJLUF0dGFjaAlNTS1Db2RlIDo6PSAnMDAwMDAwMTAnQgorLS0JTVMtaW5pdGlhdGVkLUlNU0ktRGV0YWNoCU1NLUNvZGUgOjo9ICcwMDAwMDAxMSdCCistLQlOZXR3b3JrLWluaXRpYXRlZC1JTVNJLURldGFjaAlNTS1Db2RlIDo6PSAnMDAwMDAxMDAnQgorLS0KKy0tCVBTIGRvbWFpbiBNTSBldmVudHM6CistLQlSb3V0ZWluZy1BcmVhLXVwZGF0ZS1pbi1zYW1lLVNHU04JTU0tQ29kZSA6Oj0gJzEwMDAwMDAwJ0IKKy0tCVJvdXRlaW5nLUFyZWEtdXBkYXRlLXRvLW90aGVyLVNHU04tdXBkYXRlLWZyb20tbmV3LVNHU04KKy0tCQkJCU1NLUNvZGUgOjo9ICcxMDAwMDAwMSdCCistLQlSb3V0ZWluZy1BcmVhLXVwZGF0ZS10by1vdGhlci1TR1NOLWRpc2Nvbm5lY3QtYnktZGV0YWNoCistLQkJCQlNTS1Db2RlIDo6PSAnMTAwMDAwMTAnQgorLS0JR1BSUy1BdHRhY2gJTU0tQ29kZSA6Oj0gJzEwMDAwMDExJ0IKKy0tCU1TLWluaXRpYXRlZC1HUFJTLURldGFjaAlNTS1Db2RlIDo6PSAnMTAwMDAxMDAnQgorLS0JTmV0d29yay1pbml0aWF0ZWQtR1BSUy1EZXRhY2gJTU0tQ29kZSA6Oj0gJzEwMDAwMTAxJ0IgCistLQlOZXR3b3JrLWluaXRpYXRlZC10cmFuc2Zlci10by1NUy1ub3QtcmVhY2hhYmxlLWZvci1wYWdpbmcKKy0tCQkJCU1NLUNvZGUgOjo9ICcxMDAwMDExMCdCCistLQorLS0JSWYgdGhlIE1TQyByZWNlaXZlcyBhbnkgb3RoZXIgTU0tY29kZSB0aGFuIHRoZSBvbmVzIGxpc3RlZCBhYm92ZSBmb3IgdGhlCistLQlDUyBkb21haW4sIHRoZW4gdGhlIE1TQyBzaGFsbCBpZ25vcmUgdGhhdCBNTS1jb2RlLgorLS0JSWYgdGhlIFNHU04gcmVjZWl2ZXMgYW55IG90aGVyIE1NLWNvZGUgdGhhbiB0aGUgb25lcyBsaXN0ZWQgYWJvdmUgZm9yIHRoZQorLS0JUFMgZG9tYWluLCB0aGVuIHRoZSBTR1NOIHNoYWxsIGlnbm9yZSB0aGF0IE1NLWNvZGUuCisKK1QtQ1NJIDo6PSBTRVFVRU5DRSB7CisJdC1CY3NtQ2FtZWxURFBEYXRhTGlzdAlULUJjc21DYW1lbFREUERhdGFMaXN0LAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWNhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nCVswXSBDYW1lbENhcGFiaWxpdHlIYW5kbGluZwlPUFRJT05BTCwKKwlub3RpZmljYXRpb25Ub0NTRQlbMV0gTlVMTAkJT1BUSU9OQUwsCisJY3NpLUFjdGl2ZQlbMl0gTlVMTAkJT1BUSU9OQUx9CistLQlub3RpZmljYXRpb25Ub0NTRSBhbmQgY3NpLUFjdGl2ZSBzaGFsbCBub3QgYmUgcHJlc2VudCB3aGVuIFZULUNTSS9ULUNTSSBpcyBzZW50CistLQl0byBWTFIvR01TQy4KKy0tCVRoZXkgbWF5IG9ubHkgYmUgaW5jbHVkZWQgaW4gQVRTSS9BVE0gYWNrL05TREMgbWVzc2FnZS4KKy0tCVQtQ1NJIHNoYWxsIG5vdCBiZSBzZWdtZW50ZWQuCisKK1QtQmNzbUNhbWVsVERQRGF0YUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mQ2FtZWxURFBEYXRhKSBPRgorCVQtQmNzbUNhbWVsVERQRGF0YQorCS0tLSBULUJjc21DYW1lbFREUERhdGFMaXN0IHNoYWxsIG5vdCBjb250YWluIG1vcmUgdGhhbiBvbmUgaW5zdGFuY2Ugb2YKKwktLS0gVC1CY3NtQ2FtZWxURFBEYXRhIGNvbnRhaW5pbmcgdGhlIHNhbWUgdmFsdWUgZm9yIHQtQmNzbVRyaWdnZXJEZXRlY3Rpb25Qb2ludC4KKwktLS0gRm9yIENBTUVMIFBoYXNlIDIsIHRoaXMgbWVhbnMgdGhhdCBvbmx5IG9uZSBpbnN0YW5jZSBvZiBULUJjc21DYW1lbFREUERhdGEgaXMgYWxsb3dlZAorCS0tLSB3aXRoIHQtQmNzbVRyaWdnZXJEZXRlY3Rpb25Qb2ludCBiZWluZyBlcXVhbCB0byBEUDEyLiAKKwktLS0gRm9yIENBTUVMIFBoYXNlIDMsIG1vcmUgVERQknMgYXJlIGFsbG93ZWQuCisKK1QtQmNzbUNhbWVsVERQRGF0YSA6Oj0gU0VRVUVOQ0UgeworCXQtQmNzbVRyaWdnZXJEZXRlY3Rpb25Qb2ludAlULUJjc21UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQsCisJc2VydmljZUtleQlTZXJ2aWNlS2V5LAorCWdzbVNDRi1BZGRyZXNzCVswXSBJU0ROLUFkZHJlc3NTdHJpbmcsCisJZGVmYXVsdENhbGxIYW5kbGluZwlbMV0gRGVmYXVsdENhbGxIYW5kbGluZywKKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1QtQmNzbVRyaWdnZXJEZXRlY3Rpb25Qb2ludCA6Oj0gRU5VTUVSQVRFRCB7CisJdGVybUF0dGVtcHRBdXRob3JpemVkICgxMiksCisJLi4uICwKKwl0QnVzeSAoMTMpLAorCXROb0Fuc3dlciAoMTQpfQorCS0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKKwktLSBGb3IgVC1CY3NtQ2FtZWxURFBEYXRhIHNlcXVlbmNlcyBjb250YWluaW5nIHRoaXMgcGFyYW1ldGVyIHdpdGggYW55IG90aGVyCisJLS0gdmFsdWUgdGhhbiB0aGUgb25lcyBsaXN0ZWQgYWJvdmUsIHRoZSByZWNlaXZlciBzaGFsbCBpZ25vcmUgdGhlIHdob2xlCisJLS0gVC1CY3NtQ2FtZWxURFBEYXRhIHNlcXVlbmNlLgorCistLSBncHJzIGxvY2F0aW9uIGluZm9ybWF0aW9uIHJldHJpZXZhbCB0eXBlcworCitTZW5kUm91dGluZ0luZm9Gb3JHcHJzQXJnIDo6PSBTRVFVRU5DRSB7CisJaW1zaQkJCQlbMF0gSU1TSSwKKwlnZ3NuLUFkZHJlc3MJCVsxXSBHU04tQWRkcmVzcwlPUFRJT05BTCwgCisJZ2dzbi1OdW1iZXIJCVsyXQlJU0ROLUFkZHJlc3NTdHJpbmcsCisJZXh0ZW5zaW9uQ29udGFpbmVyCQlbM10gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworU2VuZFJvdXRpbmdJbmZvRm9yR3Byc1JlcyA6Oj0gU0VRVUVOQ0UgeworCXNnc24tQWRkcmVzcwkJWzBdIEdTTi1BZGRyZXNzLAorCWdnc24tQWRkcmVzcwkJWzFdCUdTTi1BZGRyZXNzCU9QVElPTkFMLAorCW1vYmlsZU5vdFJlYWNoYWJsZVJlYXNvbgkJWzJdCUFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00JCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcgkJWzNdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKKy0tIGZhaWx1cmUgcmVwb3J0IHR5cGVzCisKK0ZhaWx1cmVSZXBvcnRBcmcgOjo9IFNFUVVFTkNFIHsKKwlpbXNpCQkJCVswXSBJTVNJLAorCWdnc24tTnVtYmVyCQlbMV0gSVNETi1BZGRyZXNzU3RyaW5nCSwKKwlnZ3NuLUFkZHJlc3MJCVsyXSBHU04tQWRkcmVzcwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJCVszXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitGYWlsdXJlUmVwb3J0UmVzIDo6PSBTRVFVRU5DRSB7CisJZ2dzbi1BZGRyZXNzCQlbMF0gR1NOLUFkZHJlc3MJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCQlbMV0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworLS0gZ3BycyBub3RpZmljYXRpb24gdHlwZXMKKworTm90ZU1zUHJlc2VudEZvckdwcnNBcmcgOjo9IFNFUVVFTkNFIHsKKwlpbXNpCQkJCVswXSBJTVNJLAorCXNnc24tQWRkcmVzcwkJWzFdIEdTTi1BZGRyZXNzLAorCWdnc24tQWRkcmVzcwkJWzJdIEdTTi1BZGRyZXNzCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcgkJWzNdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK05vdGVNc1ByZXNlbnRGb3JHcHJzUmVzIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCQlbMF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworLS0gZmF1bHQgcmVjb3ZlcnkgdHlwZXMKKworUmVzZXRBcmcgOjo9IFNFUVVFTkNFIHsKKwlobHItTnVtYmVyCUlTRE4tQWRkcmVzc1N0cmluZywKKwlobHItTGlzdAkJSExSLUxpc3QJCU9QVElPTkFMLAorCS4uLn0KKworUmVzdG9yZURhdGFBcmcgOjo9IFNFUVVFTkNFIHsKKwlpbXNpCQkJSU1TSSwKKwlsbXNpCQkJTE1TSQkJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwl2bHItQ2FwYWJpbGl0eQlbNl0gVkxSLUNhcGFiaWxpdHkJT1BUSU9OQUwgfQorCitSZXN0b3JlRGF0YVJlcyA6Oj0gU0VRVUVOQ0UgeworCWhsci1OdW1iZXIJSVNETi1BZGRyZXNzU3RyaW5nLAorCW1zTm90UmVhY2hhYmxlCU5VTEwJCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworLS0gVkJTL1ZHQ1MgdHlwZXMKK1ZCU0RhdGFMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZlZCU0dyb3VwSWRzKSBPRgorCQkJCVZvaWNlQnJvYWRjYXN0RGF0YQorCitWR0NTRGF0YUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mVkdDU0dyb3VwSWRzKSBPRgorCQkJCVZvaWNlR3JvdXBDYWxsRGF0YQorCittYXhOdW1PZlZCU0dyb3VwSWRzICBJTlRFR0VSIDo6PSA1MAorCittYXhOdW1PZlZHQ1NHcm91cElkcyAgSU5URUdFUiA6Oj0gNTAKKworVm9pY2VHcm91cENhbGxEYXRhICA6Oj0gU0VRVUVOQ0UgeworCWdyb3VwSWQJCUdyb3VwSWQsIAorCS0tIGdyb3VwSWQgc2hhbGwgYmUgZmlsbGVkIHdpdGggc2l4IFRCQ0QgZmlsbGVycyAoMTExMSlpZiB0aGUgbG9uZ0dyb3VwSWQgaXMgcHJlc2VudCAgCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJYWRkaXRpb25hbFN1YnNjcmlwdGlvbnMJQWRkaXRpb25hbFN1YnNjcmlwdGlvbnMJT1BUSU9OQUwsCisJYWRkaXRpb25hbEluZm8JWzBdIEFkZGl0aW9uYWxJbmZvCU9QVElPTkFMLAorCWxvbmdHcm91cElkCVsxXSBMb25nLUdyb3VwSWQJT1BUSU9OQUwgfQorCisJLS0gVm9pY2VHcm91cENhbGxEYXRhIGNvbnRhaW5pbmcgYSBsb25nR3JvdXBJZCBzaGFsbCBub3QgYmUgc2VudCB0byBWTFJzIHRoYXQgZGlkIG5vdAorCS0tIGluZGljYXRlIHN1cHBvcnQgb2YgbG9uZyBHcm91cCBJRHMgd2l0aGluIHRoZSBVcGRhdGUgTG9jYXRpb24gb3IgUmVzdG9yZSBEYXRhIAorCS0tIHJlcXVlc3QgbWVzc2FnZQorCitBZGRpdGlvbmFsSW5mbyA6Oj0gQklUIFNUUklORyAoU0laRSAoMS4uMTM2KSkKKy0tCSBSZWZlcnMgdG8gQWRkaXRpb25hbCBJbmZvIGFzIHNwZWNpZmllZCBpbiAzR1BQIFRTIDQzLjA2OCAKKworQWRkaXRpb25hbFN1YnNjcmlwdGlvbnMgOjo9IEJJVCBTVFJJTkcgeworCXByaXZpbGVnZWRVcGxpbmtSZXF1ZXN0ICgwKSwKKwllbWVyZ2VuY3lVcGxpbmtSZXF1ZXN0ICgxKSwKKwllbWVyZ2VuY3lSZXNldCAoMil9IChTSVpFICgzLi44KSkKKy0tIE90aGVyIGJpdHMgdGhhbiBsaXN0ZWQgYWJvdmUgc2hhbGwgYmUgZGlzY2FyZGVkLgorCitWb2ljZUJyb2FkY2FzdERhdGEgOjo9IFNFUVVFTkNFIHsKKwlncm91cGlkCQlHcm91cElkLCAKKwktLSBncm91cElkIHNoYWxsIGJlIGZpbGxlZCB3aXRoIHNpeCBUQkNEIGZpbGxlcnMgKDExMTEpaWYgdGhlIGxvbmdHcm91cElkIGlzIHByZXNlbnQKKwlicm9hZGNhc3RJbml0RW50aXRsZW1lbnQJTlVMTAkJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWxvbmdHcm91cElkCVswXSBMb25nLUdyb3VwSWQJT1BUSU9OQUwgfQorCQorLS0gVm9pY2VCcm9hZGNhc3REYXRhIGNvbnRhaW5pbmcgYSBsb25nR3JvdXBJZCBzaGFsbCBub3QgYmUgc2VudCB0byBWTFJzIHRoYXQgZGlkIG5vdAorLS0gaW5kaWNhdGUgc3VwcG9ydCBvZiBsb25nIEdyb3VwIElEcyB3aXRoaW4gdGhlIFVwZGF0ZSBMb2NhdGlvbiBvciBSZXN0b3JlIERhdGEgCisJLS0gcmVxdWVzdCBtZXNzYWdlCisKK0dyb3VwSWQgIDo6PSBUQkNELVNUUklORyAoU0laRSAoMykpCisJLS0gV2hlbiBHcm91cC1JZCBpcyBsZXNzIHRoYW4gc2l4IGNoYXJhY3RlcnMgaW4gbGVuZ3RoLCB0aGUgVEJDRCBmaWxsZXIgKDExMTEpCisJLS0gaXMgdXNlZCB0byBmaWxsIHVudXNlZCBoYWxmIG9jdGV0cy4KKwktLSBSZWZlcnMgdG8gdGhlIEdyb3VwIElkZW50aWZpY2F0aW9uIGFzIHNwZWNpZmllZCBpbiAzR1BQIFRTIDIzLjAwMyAKKwktLSBhbmQgM0dQUCBUUyA0My4wNjgvIDQzLjA2OQorCitMb25nLUdyb3VwSWQgIDo6PSBUQkNELVNUUklORyAoU0laRSAoNCkpCisJLS0gV2hlbiBMb25nLUdyb3VwLUlkIGlzIGxlc3MgdGhhbiBlaWdodCBjaGFyYWN0ZXJzIGluIGxlbmd0aCwgdGhlIFRCQ0QgZmlsbGVyICgxMTExKQorCS0tIGlzIHVzZWQgdG8gZmlsbCB1bnVzZWQgaGFsZiBvY3RldHMuCisJLS0gUmVmZXJzIHRvIHRoZSBHcm91cCBJZGVudGlmaWNhdGlvbiBhcyBzcGVjaWZpZWQgaW4gM0dQUCBUUyAyMy4wMDMgCisJLS0gYW5kIDNHUFAgVFMgNDMuMDY4LyA0My4wNjkKKworCistLSBwcm92aWRlIHN1YnNjcmliZXIgaW5mbyB0eXBlcworCitQcm92aWRlU3Vic2NyaWJlckluZm9BcmcgOjo9IFNFUVVFTkNFIHsKKwlpbXNpCQlbMF0gSU1TSSwKKwlsbXNpCQlbMV0gTE1TSQlPUFRJT05BTCwKKwlyZXF1ZXN0ZWRJbmZvCVsyXSBSZXF1ZXN0ZWRJbmZvLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbM10gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwljYWxsUHJpb3JpdHkJWzRdCUVNTFBQLVByaW9yaXR5CU9QVElPTkFMCisJfQorCitQcm92aWRlU3Vic2NyaWJlckluZm9SZXMgOjo9IFNFUVVFTkNFIHsKKwlzdWJzY3JpYmVySW5mbwlTdWJzY3JpYmVySW5mbywKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworU3Vic2NyaWJlckluZm8gOjo9IFNFUVVFTkNFIHsKKwlsb2NhdGlvbkluZm9ybWF0aW9uCVswXSBMb2NhdGlvbkluZm9ybWF0aW9uCU9QVElPTkFMLAorCXN1YnNjcmliZXJTdGF0ZQlbMV0gU3Vic2NyaWJlclN0YXRlCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiAsCisJbG9jYXRpb25JbmZvcm1hdGlvbkdQUlMJWzNdIExvY2F0aW9uSW5mb3JtYXRpb25HUFJTCU9QVElPTkFMLAorCXBzLVN1YnNjcmliZXJTdGF0ZQlbNF0gUFMtU3Vic2NyaWJlclN0YXRlCU9QVElPTkFMLAorCWltZWkJCQlbNV0gSU1FSQkJT1BUSU9OQUwsCisJbXMtQ2xhc3NtYXJrMglbNl0gTVMtQ2xhc3NtYXJrMglPUFRJT05BTCwKKwlncHJzLU1TLUNsYXNzCVs3XSBHUFJTTVNDbGFzcwlPUFRJT05BTCwKKwltbnBJbmZvUmVzCVs4XSBNTlBJbmZvUmVzCU9QVElPTkFMIH0KKworLS0JSWYgdGhlIEhMUiByZWNlaXZlcyBsb2NhdGlvbkluZm9ybWF0aW9uLCBzdWJzY3JpYmVyU3RhdGUgb3IgbXMtQ2xhc3NtYXJrMiBmcm9tIGFuIFNHU04KKy0tCWl0IHNoYWxsIGRpc2NhcmQgdGhlbS4KKy0tCUlmIHRoZSBITFIgcmVjZWl2ZXMgbG9jYXRpb25JbmZvcm1hdGlvbkdQUlMsIHBzLVN1YnNjcmliZXJTdGF0ZSBvciBncHJzLU1TLUNsYXNzIGZyb20KKy0tCWEgVkxSIGl0IHNoYWxsIGRpc2NhcmQgdGhlbS4KKy0tCUlmIHRoZSBITFIgcmVjZWl2ZXMgcGFyYW1ldGVycyB3aGljaCBpdCBoYXMgbm90IHJlcXVlc3RlZCwgaXQgc2hhbGwgZGlzY2FyZCB0aGVtLgorCitNTlBJbmZvUmVzIDo6PSBTRVFVRU5DRSB7CisJcm91dGVpbmdOdW1iZXIJWzBdIFJvdXRlaW5nTnVtYmVyIAlPUFRJT05BTCwKKwlpbXNpCQkJWzFdIElNU0kJCU9QVElPTkFMLAorCW1zaXNkbgkJWzJdIElTRE4tQWRkcmVzc1N0cmluZyAJT1BUSU9OQUwsCisJbnVtYmVyUG9ydGFiaWxpdHlTdGF0dXMJWzNdIE51bWJlclBvcnRhYmlsaXR5U3RhdHVzCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiB9CistLQlUaGUgSU1TSSBwYXJhbWV0ZXIgY29udGFpbnMgYSBnZW5lcmljIElNU0ksIGkuZS4gaXQgaXMgbm90IHRpZWQgbmVjZXNzYXJpbHkgdG8gdGhlIAorLS0JU3Vic2NyaWJlci4gTUNDIGFuZCBNTkMgdmFsdWVzIGluIHRoaXMgSU1TSSBzaGFsbCBwb2ludCB0byB0aGUgU3Vic2NyaXB0aW9uIE5ldHdvcmsgb2YgCistLQl0aGUgU3Vic2NyaWJlci4gU2VlIDNHUFAgVFMgMjMuMDY2IFsxMDhdLgorCitSb3V0ZWluZ051bWJlciA6Oj0gVEJDRC1TVFJJTkcgKFNJWkUgKDEuLjUpKQorCisKK051bWJlclBvcnRhYmlsaXR5U3RhdHVzIDo6PSBFTlVNRVJBVEVEIHsKKwlub3RLbm93blRvQmVQb3J0ZWQJKDApLAorCW93bk51bWJlclBvcnRlZE91dAkoMSksCisJZm9yZWlnbk51bWJlclBvcnRlZFRvRm9yZWlnbk5ldHdvcmsJKDIpLAorCS4uLiwKKwlvd25OdW1iZXJOb3RQb3J0ZWRPdXQJKDQpLAorCWZvcmVpZ25OdW1iZXJQb3J0ZWRJbgkoNSkKKwl9CisJLS0JZXhjZXB0aW9uIGhhbmRsaW5nOiAKKwktLSAgcmVjZXB0aW9uIG9mIG90aGVyIHZhbHVlcyB0aGFuIHRoZSBvbmVzIGxpc3RlZCB0aGUgcmVjZWl2ZXIgc2hhbGwgaWdub3JlIHRoZSAKKwktLSAgd2hvbGUgTnVtYmVyUG9ydGFiaWxpdHlTdGF0dXM7CisJLS0gIG93bk51bWJlck5vdFBvcnRlZE91dCBvciBmb3JlaWduTnVtYmVyUG9ydGVkSW4gbWF5IG9ubHkgYmUgaW5jbHVkZWQgaW4gQW55IFRpbWUgCisJLS0gIEludGVycm9nYXRpb24gbWVzc2FnZS4KKworTVMtQ2xhc3NtYXJrMiA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgzKSkKKwktLSBUaGlzIHBhcmFtZXRlciBjYXJyaWVzIHRoZSB2YWx1ZSBwYXJ0IG9mIHRoZSBNUyBDbGFzc21hcmsgMiBJRSBkZWZpbmVkIGluIAorCS0tIDNHUFAgVFMgMjQuMDA4IFszNV0uCisKK0dQUlNNU0NsYXNzIDo6PSBTRVFVRU5DRSB7CisJbVNOZXR3b3JrQ2FwYWJpbGl0eQlbMF0gTVNOZXR3b3JrQ2FwYWJpbGl0eSwKKwltU1JhZGlvQWNjZXNzQ2FwYWJpbGl0eQlbMV0gTVNSYWRpb0FjY2Vzc0NhcGFiaWxpdHkJT1BUSU9OQUwKKwl9CisKK01TTmV0d29ya0NhcGFiaWxpdHkgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4uOCkpCisJLS0gVGhpcyBwYXJhbWV0ZXIgY2FycmllcyB0aGUgdmFsdWUgcGFydCBvZiB0aGUgTVMgTmV0d29yayBDYXBhYmlsaXR5IElFIGRlZmluZWQgaW4gCisJLS0gM0dQUCBUUyAyNC4wMDggWzM1XS4KKwkKK01TUmFkaW9BY2Nlc3NDYXBhYmlsaXR5IDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLjUwKSkKKwktLSBUaGlzIHBhcmFtZXRlciBjYXJyaWVzIHRoZSB2YWx1ZSBwYXJ0IG9mIHRoZSBNUyBSYWRpbyBBY2Nlc3MgQ2FwYWJpbGl0eSBJRSBkZWZpbmVkIGluCisJLS0gM0dQUCBUUyAyNC4wMDggWzM1XS4KKworUmVxdWVzdGVkSW5mbyA6Oj0gU0VRVUVOQ0UgeworCWxvY2F0aW9uSW5mb3JtYXRpb24JWzBdIE5VTEwJCU9QVElPTkFMLAorCXN1YnNjcmliZXJTdGF0ZQlbMV0gTlVMTAkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLCAKKwljdXJyZW50TG9jYXRpb24JWzNdIE5VTEwJCU9QVElPTkFMLAorCXJlcXVlc3RlZERvbWFpbglbNF0gRG9tYWluVHlwZQlPUFRJT05BTCwKKwlpbWVpCQkJWzZdIE5VTEwJCU9QVElPTkFMLAorCW1zLWNsYXNzbWFyawlbNV0gTlVMTAkJT1BUSU9OQUwsCisJbW5wUmVxdWVzdGVkSW5mbwlbN10gTlVMTCAJCU9QVElPTkFMIH0KKworLS0JY3VycmVudExvY2F0aW9uIHNoYWxsIGJlIGFic2VudCBpZiBsb2NhdGlvbkluZm9ybWF0aW9uIGlzIGFic2VudAorCitEb21haW5UeXBlIDo6PSAgRU5VTUVSQVRFRCB7CisJY3MtRG9tYWluCQkoMCksCisJcHMtRG9tYWluCQkoMSksCisJLi4ufQorLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0gcmVjZXB0aW9uIG9mIHZhbHVlcyA+IDEgc2hhbGwgYmUgbWFwcGVkIHRvICdjcy1Eb21haW4nCisKK0xvY2F0aW9uSW5mb3JtYXRpb24gOjo9IFNFUVVFTkNFIHsKKwlhZ2VPZkxvY2F0aW9uSW5mb3JtYXRpb24JQWdlT2ZMb2NhdGlvbkluZm9ybWF0aW9uCU9QVElPTkFMLAorCWdlb2dyYXBoaWNhbEluZm9ybWF0aW9uCVswXSBHZW9ncmFwaGljYWxJbmZvcm1hdGlvbglPUFRJT05BTCwKKwl2bHItbnVtYmVyCVsxXSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJbG9jYXRpb25OdW1iZXIJWzJdIExvY2F0aW9uTnVtYmVyCU9QVElPTkFMLAorCWNlbGxHbG9iYWxJZE9yU2VydmljZUFyZWFJZE9yTEFJCVszXSBDZWxsR2xvYmFsSWRPclNlcnZpY2VBcmVhSWRPckxBSQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzRdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCXNlbGVjdGVkTFNBLUlkCVs1XSBMU0FJZGVudGl0eQlPUFRJT05BTCwKKwltc2MtTnVtYmVyCVs2XSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJZ2VvZGV0aWNJbmZvcm1hdGlvbglbN10gR2VvZGV0aWNJbmZvcm1hdGlvbglPUFRJT05BTCwgCisJY3VycmVudExvY2F0aW9uUmV0cmlldmVkCVs4XSBOVUxMCQlPUFRJT05BTCwKKwlzYWktUHJlc2VudAlbOV0gTlVMTAkJT1BUSU9OQUwgfQorLS0gc2FpLVByZXNlbnQgaW5kaWNhdGVzIHRoYXQgdGhlIGNlbGxHbG9iYWxJZE9yU2VydmljZUFyZWFJZE9yTEFJIHBhcmFtZXRlciBjb250YWlucworLS0gYSBTZXJ2aWNlIEFyZWEgSWRlbnRpdHkuCistLSBjdXJyZW50TG9jYXRpb25SZXRyaWV2ZWQgc2hhbGwgYmUgcHJlc2VudCAKKy0tIGlmIHRoZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiB3ZXJlIHJldHJpZXZlZCBhZnRlciBhIHN1Y2Nlc3NmdWxsIHBhZ2luZy4KKworTG9jYXRpb25JbmZvcm1hdGlvbkdQUlMgOjo9IFNFUVVFTkNFIHsKKwljZWxsR2xvYmFsSWRPclNlcnZpY2VBcmVhSWRPckxBSQlbMF0gQ2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkT3JMQUkgT1BUSU9OQUwsCisJcm91dGVpbmdBcmVhSWRlbnRpdHkJWzFdIFJBSWRlbnRpdHkJT1BUSU9OQUwsCisJZ2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24JWzJdIEdlb2dyYXBoaWNhbEluZm9ybWF0aW9uCU9QVElPTkFMLAorCXNnc24tTnVtYmVyCVszXSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJc2VsZWN0ZWRMU0FJZGVudGl0eQlbNF0gTFNBSWRlbnRpdHkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs1XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCXNhaS1QcmVzZW50CVs2XSBOVUxMCQlPUFRJT05BTCwKKwlnZW9kZXRpY0luZm9ybWF0aW9uCVs3XSBHZW9kZXRpY0luZm9ybWF0aW9uCU9QVElPTkFMLAorCWN1cnJlbnRMb2NhdGlvblJldHJpZXZlZAlbOF0gTlVMTAkJT1BUSU9OQUwsCisJYWdlT2ZMb2NhdGlvbkluZm9ybWF0aW9uCVs5XSBBZ2VPZkxvY2F0aW9uSW5mb3JtYXRpb24JT1BUSU9OQUwgfQorLS0gc2FpLVByZXNlbnQgaW5kaWNhdGVzIHRoYXQgdGhlIGNlbGxHbG9iYWxJZE9yU2VydmljZUFyZWFJZE9yTEFJIHBhcmFtZXRlciBjb250YWlucworLS0gYSBTZXJ2aWNlIEFyZWEgSWRlbnRpdHkuCistLSBjdXJyZW50TG9jYXRpb25SZXRyaWV2ZWQgc2hhbGwgYmUgcHJlc2VudCBpZiB0aGUgbG9jYXRpb24gaW5mb3JtYXRpb24KKy0tIHdhcyByZXRyaWV2ZWQgYWZ0ZXIgc3VjY2Vzc2Z1bCBwYWdpbmcuCisKK1JBSWRlbnRpdHkgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoNikpCistLSBSb3V0aW5nIEFyZWEgSWRlbnRpdHkgaXMgY29kZWQgaW4gYWNjb3JkYW5jZSB3aXRoIDNHUFAgVFMgMjkuMDYwIFsxMDVdLgorLS0gSXQgc2hhbGwgY29udGFpbiB0aGUgdmFsdWUgcGFydCBkZWZpbmVkIGluIDNHUFAgVFMgMjkuMDYwIG9ubHkuIEkuZS4gdGhlIDNHUFAgVFMgMjkuMDYwCistLSB0eXBlIGlkZW50aWZpZXIgb2N0ZXQgc2hhbGwgbm90IGJlIGluY2x1ZGVkLgorCisKK0dlb2dyYXBoaWNhbEluZm9ybWF0aW9uIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDgpKQorLS0JUmVmZXJzIHRvIGdlb2dyYXBoaWNhbCBJbmZvcm1hdGlvbiBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDMyLgorLS0JT25seSB0aGUgZGVzY3JpcHRpb24gb2YgYW4gZWxsaXBzb2lkIHBvaW50IHdpdGggdW5jZXJ0YWludHkgY2lyY2xlCistLQlhcyBzcGVjaWZpZWQgaW4gM0dQUCBUUyAyMy4wMzIgaXMgYWxsb3dlZCB0byBiZSB1c2VkCistLQlUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGFjY29yZGluZyB0byAzR1BQIFRTIDIzLjAzMiBpcyBhcyBmb2xsb3dzOgorLS0JCVR5cGUgb2Ygc2hhcGUgKGVsbGlwc29pZCBwb2ludCB3aXRoIHVuY2VydGFpbnR5IGNpcmNsZSkJMSBvY3RldAorLS0JCURlZ3JlZXMgb2YgTGF0aXR1ZGUJCQkJMyBvY3RldHMKKy0tCQlEZWdyZWVzIG9mIExvbmdpdHVkZQkJCQkzIG9jdGV0cworLS0JCVVuY2VydGFpbnR5IGNvZGUJCQkJMSBvY3RldAorCitHZW9kZXRpY0luZm9ybWF0aW9uIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEwKSkKKy0tCVJlZmVycyB0byBDYWxsaW5nIEdlb2RldGljIExvY2F0aW9uIGRlZmluZWQgaW4gUS43NjMgKDE5OTkpLgorLS0JT25seSB0aGUgZGVzY3JpcHRpb24gb2YgYW4gZWxsaXBzb2lkIHBvaW50IHdpdGggdW5jZXJ0YWludHkgY2lyY2xlCistLQlhcyBzcGVjaWZpZWQgaW4gUS43NjMgKDE5OTkpIGlzIGFsbG93ZWQgdG8gYmUgdXNlZAorLS0JVGhlIGludGVybmFsIHN0cnVjdHVyZSBhY2NvcmRpbmcgdG8gUS43NjMgKDE5OTkpIGlzIGFzIGZvbGxvd3M6CistLQkJU2NyZWVuaW5nIGFuZCBwcmVzZW50YXRpb24gaW5kaWNhdG9ycwkJMSBvY3RldAorLS0JCVR5cGUgb2Ygc2hhcGUgKGVsbGlwc29pZCBwb2ludCB3aXRoIHVuY2VydGFpbnR5IGNpcmNsZSkJMSBvY3RldAorLS0JCURlZ3JlZXMgb2YgTGF0aXR1ZGUJCQkJMyBvY3RldHMKKy0tCQlEZWdyZWVzIG9mIExvbmdpdHVkZQkJCQkzIG9jdGV0cworLS0JCVVuY2VydGFpbnR5IGNvZGUJCQkJMSBvY3RldAorLS0JCUNvbmZpZGVuY2UJCQkJMSBvY3RldAorCitMb2NhdGlvbk51bWJlciA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgyLi4xMCkpCisJLS0gdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGluIElUVS1UIFJlYyBRLjc2MworCitTdWJzY3JpYmVyU3RhdGUgOjo9IENIT0lDRSB7CisJYXNzdW1lZElkbGUJWzBdIE5VTEwsCisJY2FtZWxCdXN5CQlbMV0gTlVMTCwKKwluZXREZXROb3RSZWFjaGFibGUJTm90UmVhY2hhYmxlUmVhc29uLAorCW5vdFByb3ZpZGVkRnJvbVZMUglbMl0gTlVMTH0KKworUFMtU3Vic2NyaWJlclN0YXRlIDo6PSBDSE9JQ0UgeworCW5vdFByb3ZpZGVkRnJvbVNHU04JWzBdIE5VTEwsCisJcHMtRGV0YWNoZWQJWzFdIE5VTEwsCisJcHMtQXR0YWNoZWROb3RSZWFjaGFibGVGb3JQYWdpbmcJWzJdIE5VTEwsCisJcHMtQXR0YWNoZWRSZWFjaGFibGVGb3JQYWdpbmcJWzNdIE5VTEwsCisJcHMtUERQLUFjdGl2ZU5vdFJlYWNoYWJsZUZvclBhZ2luZwlbNF0gUERQLUNvbnRleHRJbmZvTGlzdCwKKwlwcy1QRFAtQWN0aXZlUmVhY2hhYmxlRm9yUGFnaW5nCVs1XSBQRFAtQ29udGV4dEluZm9MaXN0LAorCW5ldERldE5vdFJlYWNoYWJsZQlOb3RSZWFjaGFibGVSZWFzb24gfQorCitQRFAtQ29udGV4dEluZm9MaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZlBEUC1Db250ZXh0cykgT0YKKwkJCQlQRFAtQ29udGV4dEluZm8KKworUERQLUNvbnRleHRJbmZvIDo6PSBTRVFVRU5DRSB7CisJcGRwLUNvbnRleHRJZGVudGlmaWVyCVswXSBDb250ZXh0SWQsCisJcGRwLUNvbnRleHRBY3RpdmUJWzFdIE5VTEwJCU9QVElPTkFMLAorCXBkcC1UeXBlCQlbMl0gUERQLVR5cGUsCisJcGRwLUFkZHJlc3MJWzNdIFBEUC1BZGRyZXNzCU9QVElPTkFMLAorCWFwbi1TdWJzY3JpYmVkCVs0XSBBUE4JCU9QVElPTkFMLAorCWFwbi1JblVzZQkJWzVdIEFQTgkJT1BUSU9OQUwsCisJbnNhcGkJCVs2XSBOU0FQSQkJT1BUSU9OQUwsCisJdHJhbnNhY3Rpb25JZAlbN10gVHJhbnNhY3Rpb25JZAlPUFRJT05BTCwKKwl0ZWlkLUZvckduQW5kR3AJWzhdIFRFSUQJCU9QVElPTkFMLAorCXRlaWQtRm9ySXUJWzldIFRFSUQJCU9QVElPTkFMLAorCWdnc24tQWRkcmVzcwlbMTBdIEdTTi1BZGRyZXNzIAlPUFRJT05BTCwKKwlxb3MtU3Vic2NyaWJlZAlbMTFdIEV4dC1Rb1MtU3Vic2NyaWJlZAlPUFRJT05BTCwKKwlxb3MtUmVxdWVzdGVkCVsxMl0gRXh0LVFvUy1TdWJzY3JpYmVkCU9QVElPTkFMLAorCXFvcy1OZWdvdGlhdGVkCVsxM10gRXh0LVFvUy1TdWJzY3JpYmVkCU9QVElPTkFMLAorCWNoYXJnaW5nSWQJWzE0XSBHUFJTQ2hhcmdpbmdJRAlPUFRJT05BTCwKKwljaGFyZ2luZ0NoYXJhY3RlcmlzdGljcwlbMTVdIENoYXJnaW5nQ2hhcmFjdGVyaXN0aWNzCU9QVElPTkFMLAorCXJuYy1BZGRyZXNzCVsxNl0gR1NOLUFkZHJlc3MJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsxN10gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlxb3MyLVN1YnNjcmliZWQJWzE4XSBFeHQyLVFvUy1TdWJzY3JpYmVkCU9QVElPTkFMLAorCS0tIHFvczItU3Vic2NyaWJlZCBtYXkgYmUgcHJlc2VudCBvbmx5IGlmIHFvcy1TdWJzY3JpYmVkIGlzIHByZXNlbnQuCisJcW9zMi1SZXF1ZXN0ZWQJWzE5XSBFeHQyLVFvUy1TdWJzY3JpYmVkCU9QVElPTkFMLAorCS0tIHFvczItUmVxdWVzdGVkIG1heSBiZSBwcmVzZW50IG9ubHkgaWYgcW9zLVJlcXVlc3RlZCBpcyBwcmVzZW50LgorCXFvczItTmVnb3RpYXRlZAlbMjBdIEV4dDItUW9TLVN1YnNjcmliZWQJT1BUSU9OQUwsCisJLS0gcW9zMi1OZWdvdGlhdGVkIG1heSBiZSBwcmVzZW50IG9ubHkgaWYgcW9zLU5lZ290aWF0ZWQgaXMgcHJlc2VudC4KKwkJcW9zMy1TdWJzY3JpYmVkCVsyMV0gRXh0My1Rb1MtU3Vic2NyaWJlZAlPUFRJT05BTCwKKwktLSBxb3MzLVN1YnNjcmliZWQgbWF5IGJlIHByZXNlbnQgb25seSBpZiBxb3MyLVN1YnNjcmliZWQgaXMgcHJlc2VudC4KKwlxb3MzLVJlcXVlc3RlZAlbMjJdIEV4dDMtUW9TLVN1YnNjcmliZWQJT1BUSU9OQUwsCisJLS0gcW9zMy1SZXF1ZXN0ZWQgbWF5IGJlIHByZXNlbnQgb25seSBpZiBxb3MyLVJlcXVlc3RlZCBpcyBwcmVzZW50LgorCXFvczMtTmVnb3RpYXRlZAlbMjNdIEV4dDMtUW9TLVN1YnNjcmliZWQJT1BUSU9OQUwKKwktLSBxb3MzLU5lZ290aWF0ZWQgbWF5IGJlIHByZXNlbnQgb25seSBpZiBxb3MyLU5lZ290aWF0ZWQgaXMgcHJlc2VudC4KK30KKworTlNBUEkgOjo9IElOVEVHRVIgKDAuLjE1KQorLS0JVGhpcyB0eXBlIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhlIE5ldHdvcmsgbGF5ZXIgU2VydmljZSBBY2Nlc3MgUG9pbnQKKworVHJhbnNhY3Rpb25JZCA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi4yKSkKKy0tCVRoaXMgdHlwZSBjYXJyaWVzIHRoZSB2YWx1ZSBwYXJ0IG9mIHRoZSB0cmFuc2FjdGlvbiBpZGVudGlmaWVyIHdoaWNoIGlzIHVzZWQgaW4gdGhlIAorLS0Jc2Vzc2lvbiBtYW5hZ2VtZW50IG1lc3NhZ2VzIG9uIHRoZSBhY2Nlc3MgaW50ZXJmYWNlLiBUaGUgZW5jb2RpbmcgaXMgZGVmaW5lZCBpbiAKKy0tCTNHUFAgVFMgMjQuMDA4CisKK1RFSUQgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoNCkpCistLQlUaGlzIHR5cGUgY2FycmllcyB0aGUgdmFsdWUgcGFydCBvZiB0aGUgVHVubmVsIEVuZHBvaW50IElkZW50aWZpZXIgd2hpY2ggaXMgdXNlZCB0byAKKy0tCWRpc3Rpbmd1aXNoIGJldHdlZW4gZGlmZmVyZW50IHR1bm5lbHMgYmV0d2VlbiB0aGUgc2FtZSBwYWlyIG9mIGVudGl0aWVzIHdoaWNoIGNvbW11bmljYXRlIAorLS0JdXNpbmcgdGhlIEdQUlMgVHVubmVsbGluZyBQcm90b2NvbCBUaGUgZW5jb2RpbmcgaXMgZGVmaW5lZCBpbiAzR1BQIFRTIDI5LjA2MC4KKworR1BSU0NoYXJnaW5nSUQgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoNCkpCistLQlUaGUgQ2hhcmdpbmcgSUQgaXMgYSB1bmlxdWUgZm91ciBvY3RldCB2YWx1ZSBnZW5lcmF0ZWQgYnkgdGhlIEdHU04gd2hlbiAKKy0tCWEgUERQIENvbnRleHQgaXMgYWN0aXZhdGVkLiBBIENoYXJnaW5nIElEIGlzIGdlbmVyYXRlZCBmb3IgZWFjaCBhY3RpdmF0ZWQgY29udGV4dC4KKy0tCVRoZSBlbmNvZGluZyBpcyBkZWZpbmVkIGluIDNHUFAgVFMgMjkuMDYwLgorCitOb3RSZWFjaGFibGVSZWFzb24gOjo9IEVOVU1FUkFURUQgeworCW1zUHVyZ2VkICgwKSwKKwlpbXNpRGV0YWNoZWQgKDEpLAorCXJlc3RyaWN0ZWRBcmVhICgyKSwKKwlub3RSZWdpc3RlcmVkICgzKX0KKworLS0gYW55IHRpbWUgaW50ZXJyb2dhdGlvbiBpbmZvIHR5cGVzCisKK0FueVRpbWVJbnRlcnJvZ2F0aW9uQXJnIDo6PSBTRVFVRU5DRSB7CisJc3Vic2NyaWJlcklkZW50aXR5CVswXSBTdWJzY3JpYmVySWRlbnRpdHksCisJcmVxdWVzdGVkSW5mbwlbMV0gUmVxdWVzdGVkSW5mbywKKwlnc21TQ0YtQWRkcmVzcwlbM10gSVNETi1BZGRyZXNzU3RyaW5nLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworQW55VGltZUludGVycm9nYXRpb25SZXMgOjo9IFNFUVVFTkNFIHsKKwlzdWJzY3JpYmVySW5mbwlTdWJzY3JpYmVySW5mbywKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworLS0gYW55IHRpbWUgaW5mb3JtYXRpb24gaGFuZGxpbmcgdHlwZXMKKworQW55VGltZVN1YnNjcmlwdGlvbkludGVycm9nYXRpb25BcmcgOjo9IFNFUVVFTkNFIHsKKwlzdWJzY3JpYmVySWRlbnRpdHkJWzBdIFN1YnNjcmliZXJJZGVudGl0eSwKKwlyZXF1ZXN0ZWRTdWJzY3JpcHRpb25JbmZvCVsxXSBSZXF1ZXN0ZWRTdWJzY3JpcHRpb25JbmZvLAorCWdzbVNDRi1BZGRyZXNzCVsyXSBJU0ROLUFkZHJlc3NTdHJpbmcsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVszXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJbG9uZ0ZUTi1TdXBwb3J0ZWQJWzRdCU5VTEwJCU9QVElPTkFMLAorCS4uLn0KKworQW55VGltZVN1YnNjcmlwdGlvbkludGVycm9nYXRpb25SZXMgOjo9IFNFUVVFTkNFIHsKKwljYWxsRm9yd2FyZGluZ0RhdGEJWzFdIENhbGxGb3J3YXJkaW5nRGF0YQlPUFRJT05BTCwKKwljYWxsQmFycmluZ0RhdGEJWzJdIENhbGxCYXJyaW5nRGF0YQlPUFRJT05BTCwKKwlvZGItSW5mbwkJWzNdIE9EQi1JbmZvCU9QVElPTkFMLAorCWNhbWVsLVN1YnNjcmlwdGlvbkluZm8JWzRdIENBTUVMLVN1YnNjcmlwdGlvbkluZm8JT1BUSU9OQUwsCisJc3VwcG9ydGVkVkxSLUNBTUVMLVBoYXNlcwlbNV0gU3VwcG9ydGVkQ2FtZWxQaGFzZXMJT1BUSU9OQUwsCisJc3VwcG9ydGVkU0dTTi1DQU1FTC1QaGFzZXMJWzZdIFN1cHBvcnRlZENhbWVsUGhhc2VzCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbN10gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiAsCisJb2ZmZXJlZENhbWVsNENTSXNJblZMUglbOF0gT2ZmZXJlZENhbWVsNENTSXMJT1BUSU9OQUwsCisJb2ZmZXJlZENhbWVsNENTSXNJblNHU04JWzldIE9mZmVyZWRDYW1lbDRDU0lzCU9QVElPTkFMLAorCW1zaXNkbi1CUy1MaXN0CVsxMF0gTVNJU0ROLUJTLUxpc3QJT1BUSU9OQUwgfQorCitSZXF1ZXN0ZWRTdWJzY3JpcHRpb25JbmZvIDo6PSBTRVFVRU5DRSB7CisJcmVxdWVzdGVkU1MtSW5mbwlbMV0gU1MtRm9yQlMtQ29kZQlPUFRJT05BTCwKKwlvZGIJCQlbMl0gTlVMTAkJT1BUSU9OQUwsCisJcmVxdWVzdGVkQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbwlbM10gUmVxdWVzdGVkQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbwkJT1BUSU9OQUwsCisJc3VwcG9ydGVkVkxSLUNBTUVMLVBoYXNlcwlbNF0gTlVMTAkJT1BUSU9OQUwsCisJc3VwcG9ydGVkU0dTTi1DQU1FTC1QaGFzZXMJWzVdIE5VTEwJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlhZGRpdGlvbmFsUmVxdWVzdGVkQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbworCQkJCVs3XSBBZGRpdGlvbmFsUmVxdWVzdGVkQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbworCQkJCQkJCU9QVElPTkFMLAorCW1zaXNkbi1CUy1MaXN0CVs4XSBOVUxMCQlPUFRJT05BTCB9CisKK01TSVNETi1CUy1MaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZk1TSVNETikgT0YKKwkJCQlNU0lTRE4tQlMKKworbWF4TnVtT2ZNU0lTRE4gIElOVEVHRVIgOjo9IDUwCisKKworTVNJU0ROLUJTIDo6PSBTRVFVRU5DRSB7CisJbXNpc2RuCQkJSVNETi1BZGRyZXNzU3RyaW5nLAkKKwliYXNpY1NlcnZpY2VMaXN0CVswXQlCYXNpY1NlcnZpY2VMaXN0CU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMV0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworUmVxdWVzdGVkQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbyA6Oj0gRU5VTUVSQVRFRCB7CisJby1DU0kJCSgwKSwKKwl0LUNTSQkJKDEpLAorCXZ0LUNTSQkJKDIpLAorCXRpZi1DU0kJCSgzKSwKKwlncHJzLUNTSQkJKDQpLAorCW1vLXNtcy1DU0kJKDUpLAorCXNzLUNTSQkJKDYpLAorCW0tQ1NJCQkoNyksCisJZC1jc2kJCSg4KX0KKworQWRkaXRpb25hbFJlcXVlc3RlZENBTUVMLVN1YnNjcmlwdGlvbkluZm8gOjo9IEVOVU1FUkFURUQgeworCW10LXNtcy1DU0kJKDApLAorCW1nLWNzaQkJKDEpLAorCW8tSU0tQ1NJIAkJKDIpLAorCWQtSU0tQ1NJCQkoMyksCisJdnQtSU0tQ1NJCSAJKDQpLAorCS4uLn0KKy0tCWV4Y2VwdGlvbiBoYW5kbGluZzogdW5rbm93biB2YWx1ZXMgc2hhbGwgYmUgZGlzY2FyZGVkIGJ5IHRoZSByZWNlaXZlci4KKworQ2FsbEZvcndhcmRpbmdEYXRhIDo6PSBTRVFVRU5DRSB7CisJZm9yd2FyZGluZ0ZlYXR1cmVMaXN0CUV4dC1Gb3J3RmVhdHVyZUxpc3QsCisJbm90aWZpY2F0aW9uVG9DU0UJTlVMTAkJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworQ2FsbEJhcnJpbmdEYXRhIDo6PSBTRVFVRU5DRSB7CisJY2FsbEJhcnJpbmdGZWF0dXJlTGlzdAlFeHQtQ2FsbEJhckZlYXR1cmVMaXN0LAorCXBhc3N3b3JkCQlQYXNzd29yZAkJT1BUSU9OQUwsCisJd3JvbmdQYXNzd29yZEF0dGVtcHRzQ291bnRlcglXcm9uZ1Bhc3N3b3JkQXR0ZW1wdHNDb3VudGVyCU9QVElPTkFMLAorCW5vdGlmaWNhdGlvblRvQ1NFCU5VTEwJCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworV3JvbmdQYXNzd29yZEF0dGVtcHRzQ291bnRlciA6Oj0gSU5URUdFUiAoMC4uNCkKKworT0RCLUluZm8gOjo9IFNFUVVFTkNFIHsKKwlvZGItRGF0YQkJT0RCLURhdGEsCisJbm90aWZpY2F0aW9uVG9DU0UJTlVMTAkJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitDQU1FTC1TdWJzY3JpcHRpb25JbmZvIDo6PSBTRVFVRU5DRSB7CisJby1DU0kJCVswXQlPLUNTSQlPUFRJT05BTCwKKwlvLUJjc21DYW1lbFREUC1Dcml0ZXJpYUxpc3QJWzFdCU8tQmNzbUNhbWVsVERQQ3JpdGVyaWFMaXN0CU9QVElPTkFMLCAKKwlkLUNTSQkJWzJdCUQtQ1NJCU9QVElPTkFMLAorCXQtQ1NJCQlbM10JVC1DU0kJT1BUSU9OQUwsCisJdC1CQ1NNLUNBTUVMLVREUC1Dcml0ZXJpYUxpc3QJWzRdCVQtQkNTTS1DQU1FTC1URFAtQ3JpdGVyaWFMaXN0CU9QVElPTkFMLAorCXZ0LUNTSQkJWzVdCVQtQ1NJCU9QVElPTkFMLAorCXZ0LUJDU00tQ0FNRUwtVERQLUNyaXRlcmlhTGlzdAlbNl0JVC1CQ1NNLUNBTUVMLVREUC1Dcml0ZXJpYUxpc3QJT1BUSU9OQUwsCisJdGlmLUNTSQkJWzddCU5VTEwJCU9QVElPTkFMLAorCXRpZi1DU0ktTm90aWZpY2F0aW9uVG9DU0UJWzhdCU5VTEwJCU9QVElPTkFMLAorCWdwcnMtQ1NJCQlbOV0JR1BSUy1DU0kJT1BUSU9OQUwsCisJbW8tc21zLUNTSQlbMTBdCVNNUy1DU0kJT1BUSU9OQUwsCisJc3MtQ1NJCQlbMTFdCVNTLUNTSQlPUFRJT05BTCwKKwltLUNTSQkJWzEyXQlNLUNTSQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzEzXQlFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCXNwZWNpZmljQ1NJRGVsZXRlZExpc3QJWzE0XQlTcGVjaWZpY0NTSS1XaXRoZHJhdwlPUFRJT05BTCwKKwltdC1zbXMtQ1NJCVsxNV0JU01TLUNTSQlPUFRJT05BTCwKKwltdC1zbXNDQU1FTFREUC1Dcml0ZXJpYUxpc3QJWzE2XQlNVC1zbXNDQU1FTFREUC1Dcml0ZXJpYUxpc3QJT1BUSU9OQUwsCisJbWctY3NpCQlbMTddCU1HLUNTSQlPUFRJT05BTCwKKwlvLUlNLUNTSQkJWzE4XSBPLUNTSQlPUFRJT05BTCwKKwlvLUlNLUJjc21DYW1lbFREUC1Dcml0ZXJpYUxpc3QJWzE5XSBPLUJjc21DYW1lbFREUENyaXRlcmlhTGlzdAlPUFRJT05BTCwKKwlkLUlNLUNTSQkJWzIwXSBELUNTSQlPUFRJT05BTCwKKwl2dC1JTS1DU0kJCVsyMV0gVC1DU0kJT1BUSU9OQUwsCisJdnQtSU0tQkNTTS1DQU1FTC1URFAtQ3JpdGVyaWFMaXN0CVsyMl0JVC1CQ1NNLUNBTUVMLVREUC1Dcml0ZXJpYUxpc3QJT1BUSU9OQUwKKwl9CisKK0FueVRpbWVNb2RpZmljYXRpb25BcmcgOjo9IFNFUVVFTkNFIHsKKwlzdWJzY3JpYmVySWRlbnRpdHkJWzBdCVN1YnNjcmliZXJJZGVudGl0eSwKKwlnc21TQ0YtQWRkcmVzcwlbMV0JSVNETi1BZGRyZXNzU3RyaW5nLAorCW1vZGlmaWNhdGlvblJlcXVlc3RGb3ItQ0YtSW5mbwlbMl0JTW9kaWZpY2F0aW9uUmVxdWVzdEZvci1DRi1JbmZvIE9QVElPTkFMLAorCW1vZGlmaWNhdGlvblJlcXVlc3RGb3ItQ0ItSW5mbwlbM10JTW9kaWZpY2F0aW9uUmVxdWVzdEZvci1DQi1JbmZvIE9QVElPTkFMLAorCW1vZGlmaWNhdGlvblJlcXVlc3RGb3ItQ1NJCVs0XQlNb2RpZmljYXRpb25SZXF1ZXN0Rm9yLUNTSQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzVdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwlsb25nRlROLVN1cHBvcnRlZAlbNl0JTlVMTAkJT1BUSU9OQUwsCisJLi4uLAorCW1vZGlmaWNhdGlvblJlcXVlc3RGb3ItT0RCLWRhdGEJWzddCU1vZGlmaWNhdGlvblJlcXVlc3RGb3ItT0RCLWRhdGEgT1BUSU9OQUwsCisJbW9kaWZpY2F0aW9uUmVxdWVzdEZvci1JUC1TTS1HVy1EYXRhCVs4XQlNb2RpZmljYXRpb25SZXF1ZXN0Rm9yLUlQLVNNLUdXLURhdGEgT1BUSU9OQUwgfQorCitBbnlUaW1lTW9kaWZpY2F0aW9uUmVzIDo6PSBTRVFVRU5DRSB7CisJc3MtSW5mb0Zvci1DU0UJWzBdCUV4dC1TUy1JbmZvRm9yLUNTRQlPUFRJT05BTCwKKwljYW1lbC1TdWJzY3JpcHRpb25JbmZvCVsxXQlDQU1FTC1TdWJzY3JpcHRpb25JbmZvCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlvZGItSW5mbwkJWzNdCU9EQi1JbmZvCU9QVElPTkFMIH0KKworTW9kaWZpY2F0aW9uUmVxdWVzdEZvci1DRi1JbmZvIDo6PSBTRVFVRU5DRSB7CisJc3MtQ29kZQkJWzBdCVNTLUNvZGUsCisJYmFzaWNTZXJ2aWNlCVsxXQlFeHQtQmFzaWNTZXJ2aWNlQ29kZQlPUFRJT05BTCwKKwlzcy1TdGF0dXMJCVsyXQlFeHQtU1MtU3RhdHVzCU9QVElPTkFMLAorCWZvcndhcmRlZFRvTnVtYmVyCVszXQlBZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCWZvcndhcmRlZFRvU3ViYWRkcmVzcwlbNF0JSVNETi1TdWJhZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCW5vUmVwbHlDb25kaXRpb25UaW1lCVs1XQlFeHQtTm9SZXBDb25kVGltZQlPUFRJT05BTCwKKwltb2RpZnlOb3RpZmljYXRpb25Ub0NTRQlbNl0JTW9kaWZpY2F0aW9uSW5zdHJ1Y3Rpb24JT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs3XQlFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitNb2RpZmljYXRpb25SZXF1ZXN0Rm9yLUNCLUluZm8gOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlbMF0JU1MtQ29kZSwKKwliYXNpY1NlcnZpY2UJWzFdCUV4dC1CYXNpY1NlcnZpY2VDb2RlCU9QVElPTkFMLAorCXNzLVN0YXR1cwkJWzJdCUV4dC1TUy1TdGF0dXMJT1BUSU9OQUwsCisJcGFzc3dvcmQJCVszXQlQYXNzd29yZAlPUFRJT05BTCwKKwl3cm9uZ1Bhc3N3b3JkQXR0ZW1wdHNDb3VudGVyCVs0XQlXcm9uZ1Bhc3N3b3JkQXR0ZW1wdHNDb3VudGVyCU9QVElPTkFMLAorCW1vZGlmeU5vdGlmaWNhdGlvblRvQ1NFCVs1XQlNb2RpZmljYXRpb25JbnN0cnVjdGlvbglPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzZdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK01vZGlmaWNhdGlvblJlcXVlc3RGb3ItT0RCLWRhdGEgOjo9IFNFUVVFTkNFIHsKKwlvZGItZGF0YQkJWzBdCU9EQi1EYXRhCU9QVElPTkFMLAorCW1vZGlmeU5vdGlmaWNhdGlvblRvQ1NFCVsxXQlNb2RpZmljYXRpb25JbnN0cnVjdGlvbglPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzJdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK01vZGlmaWNhdGlvblJlcXVlc3RGb3ItQ1NJIDo6PSBTRVFVRU5DRSB7CisJcmVxdWVzdGVkQ2FtZWwtU3Vic2NyaXB0aW9uSW5mbwlbMF0JUmVxdWVzdGVkQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbywKKwltb2RpZnlOb3RpZmljYXRpb25Ub0NTRQlbMV0JTW9kaWZpY2F0aW9uSW5zdHJ1Y3Rpb24JT1BUSU9OQUwsCisJbW9kaWZ5Q1NJLVN0YXRlCVsyXQlNb2RpZmljYXRpb25JbnN0cnVjdGlvbglPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzNdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJYWRkaXRpb25hbFJlcXVlc3RlZENBTUVMLVN1YnNjcmlwdGlvbkluZm8KKwkJCQlbNF0gQWRkaXRpb25hbFJlcXVlc3RlZENBTUVMLVN1YnNjcmlwdGlvbkluZm8KKwkJCQkJCQlPUFRJT05BTCB9CistLSByZXF1ZXN0ZWRDYW1lbC1TdWJzY3JpcHRpb25JbmZvIHNoYWxsIGJlIGRpc2NhcmRlZCBpZgorLS0gYWRkaXRpb25hbFJlcXVlc3RlZENBTUVMLVN1YnNjcmlwdGlvbkluZm8gaXMgcmVjZWl2ZWQKKworTW9kaWZpY2F0aW9uUmVxdWVzdEZvci1JUC1TTS1HVy1EYXRhIDo6PSBTRVFVRU5DRSB7CisJbW9kaWZ5UmVnaXN0cmF0aW9uU3RhdHVzCVswXQlNb2RpZmljYXRpb25JbnN0cnVjdGlvbglPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzFdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK01vZGlmaWNhdGlvbkluc3RydWN0aW9uIDo6PSBFTlVNRVJBVEVEIHsKKwlkZWFjdGl2YXRlCSgwKSwKKwlhY3RpdmF0ZQkJKDEpfQorCistLSBzdWJzY3JpYmVyIGRhdGEgbW9kaWZpY2F0aW9uIG5vdGlmaWNhdGlvbiB0eXBlcworCitOb3RlU3Vic2NyaWJlckRhdGFNb2RpZmllZEFyZyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQlJTVNJLAorCW1zaXNkbgkJSVNETi1BZGRyZXNzU3RyaW5nLAorCWZvcndhcmRpbmdJbmZvRm9yLUNTRQlbMF0gRXh0LUZvcndhcmRpbmdJbmZvRm9yLUNTRQlPUFRJT05BTCwKKwljYWxsQmFycmluZ0luZm9Gb3ItQ1NFCVsxXSBFeHQtQ2FsbEJhcnJpbmdJbmZvRm9yLUNTRQlPUFRJT05BTCwKKwlvZGItSW5mbwkJWzJdIE9EQi1JbmZvCU9QVElPTkFMLAorCWNhbWVsLVN1YnNjcmlwdGlvbkluZm8JWzNdIENBTUVMLVN1YnNjcmlwdGlvbkluZm8JT1BUSU9OQUwsCisJYWxsSW5mb3JtYXRpb25TZW50CVs0XSBOVUxMCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTm90ZVN1YnNjcmliZXJEYXRhTW9kaWZpZWRSZXMgOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworLS0gbW9iaWxpdHkgbWFuYWdlbWVudCBldmVudCBub3RpZmljYXRpb29uIGluZm8gdHlwZXMKKworTm90ZU1NLUV2ZW50QXJnOjo9IFNFUVVFTkNFIHsKKwlzZXJ2aWNlS2V5CVNlcnZpY2VLZXksCisJZXZlbnRNZXQJCVswXQlNTS1Db2RlLAorCWltc2kJCQlbMV0JSU1TSSwKKwltc2lzZG4JCVsyXQlJU0ROLUFkZHJlc3NTdHJpbmcsCisJbG9jYXRpb25JbmZvcm1hdGlvbglbM10JTG9jYXRpb25JbmZvcm1hdGlvbglPUFRJT05BTCwKKwlzdXBwb3J0ZWRDQU1FTFBoYXNlcwlbNV0JU3VwcG9ydGVkQ2FtZWxQaGFzZXMJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs2XQlFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWxvY2F0aW9uSW5mb3JtYXRpb25HUFJTCVs3XQlMb2NhdGlvbkluZm9ybWF0aW9uR1BSUwlPUFRJT05BTCwKKwlvZmZlcmVkQ2FtZWw0RnVuY3Rpb25hbGl0aWVzCVs4XSBPZmZlcmVkQ2FtZWw0RnVuY3Rpb25hbGl0aWVzCU9QVElPTkFMCit9CisKK05vdGVNTS1FdmVudFJlcyA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIgCU9QVElPTkFMLAorCS4uLn0KKworRXh0LVNTLUluZm9Gb3ItQ1NFIDo6PSBDSE9JQ0UgeworCWZvcndhcmRpbmdJbmZvRm9yLUNTRQlbMF0gRXh0LUZvcndhcmRpbmdJbmZvRm9yLUNTRSwKKwljYWxsQmFycmluZ0luZm9Gb3ItQ1NFCVsxXSBFeHQtQ2FsbEJhcnJpbmdJbmZvRm9yLUNTRQorCX0KKworRXh0LUZvcndhcmRpbmdJbmZvRm9yLUNTRSA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVswXQlTUy1Db2RlLAorCWZvcndhcmRpbmdGZWF0dXJlTGlzdAlbMV0JRXh0LUZvcndGZWF0dXJlTGlzdCwKKwlub3RpZmljYXRpb25Ub0NTRQlbMl0JTlVMTAkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVszXQlFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitFeHQtQ2FsbEJhcnJpbmdJbmZvRm9yLUNTRSA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVswXQlTUy1Db2RlLAorCWNhbGxCYXJyaW5nRmVhdHVyZUxpc3QJWzFdCUV4dC1DYWxsQmFyRmVhdHVyZUxpc3QsCisJcGFzc3dvcmQJCVsyXQlQYXNzd29yZAlPUFRJT05BTCwKKwl3cm9uZ1Bhc3N3b3JkQXR0ZW1wdHNDb3VudGVyCVszXQlXcm9uZ1Bhc3N3b3JkQXR0ZW1wdHNDb3VudGVyCU9QVElPTkFMLAorCW5vdGlmaWNhdGlvblRvQ1NFCVs0XQlOVUxMCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzVdCUV4dGVuc2lvbkNvbnRhaW5lciAJT1BUSU9OQUwsCisJLi4ufQorCitFTkQKKwpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtT00tRGF0YVR5cGVzLmFzbiBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLU9NLURhdGFUeXBlcy5hc24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI0ZGQ2ZgotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLU9NLURhdGFUeXBlcy5hc24KQEAgLTAsMCArMSwyMTYgQEAKKy0tICRJZDogTUFQLU9NLURhdGFUeXBlcy5hc24gMjgxNDkgMjAwOS0wNC0yNSAxNzo0NTozNFogZXR4cmFiICQKKy0tIDE3LjcuMglPcGVyYXRpb24gYW5kIG1haW50ZW5hbmNlIGRhdGEgdHlwZXMKKy0tIDNHUFAgVFMgMjkuMDAyIFY4LjkuMCAoMjAwOS0wNCkKKyAKK01BUC1PTS1EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtT00tRGF0YVR5cGVzICgxMikgdmVyc2lvbjExICgxMSl9CisKK0RFRklOSVRJT05TCisKK0lNUExJQ0lUIFRBR1MKKworOjo9CisKK0JFR0lOCisKK0VYUE9SVFMKKwlBY3RpdmF0ZVRyYWNlTW9kZUFyZywKKwlBY3RpdmF0ZVRyYWNlTW9kZVJlcywKKwlEZWFjdGl2YXRlVHJhY2VNb2RlQXJnLAorCURlYWN0aXZhdGVUcmFjZU1vZGVSZXMsCisJVHJhY2VQcm9wYWdhdGlvbkxpc3QKKzsKKworSU1QT1JUUworCUFkZHJlc3NTdHJpbmcsCisJSU1TSQorRlJPTSBNQVAtQ29tbW9uRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUNvbW1vbkRhdGFUeXBlcyAoMTgpIHZlcnNpb24xMSAoMTEpfQorCisJRXh0ZW5zaW9uQ29udGFpbmVyCitGUk9NIE1BUC1FeHRlbnNpb25EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtRXh0ZW5zaW9uRGF0YVR5cGVzICgyMSkgdmVyc2lvbjExICgxMSl9CisKKzsKKworQWN0aXZhdGVUcmFjZU1vZGVBcmcgOjo9IFNFUVVFTkNFIHsKKwlpbXNpCQkJWzBdIElNU0kJCU9QVElPTkFMLAorCXRyYWNlUmVmZXJlbmNlCVsxXSBUcmFjZVJlZmVyZW5jZSwKKwl0cmFjZVR5cGUJCVsyXSBUcmFjZVR5cGUsCisJb21jLUlkCQlbM10gQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzRdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJdHJhY2VSZWZlcmVuY2UyCVs1XSBUcmFjZVJlZmVyZW5jZTIJT1BUSU9OQUwsCisJdHJhY2VEZXB0aExpc3QJWzZdIFRyYWNlRGVwdGhMaXN0CU9QVElPTkFMLAorCXRyYWNlTkUtVHlwZUxpc3QJWzddIFRyYWNlTkUtVHlwZUxpc3QJT1BUSU9OQUwsCisJdHJhY2VJbnRlcmZhY2VMaXN0CVs4XSBUcmFjZUludGVyZmFjZUxpc3QJT1BUSU9OQUwsCisJdHJhY2VFdmVudExpc3QJWzldIFRyYWNlRXZlbnRMaXN0CU9QVElPTkFMCisJfQorCitUcmFjZVJlZmVyZW5jZSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi4yKSkKKworVHJhY2VSZWZlcmVuY2UyIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDMpKQorCitUcmFjZVJlY29yZGluZ1Nlc3Npb25SZWZlcmVuY2UgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMikpCisKK1RyYWNlVHlwZSA6Oj0gSU5URUdFUgorCSgwLi4yNTUpCisJLS0gVHJhY2UgdHlwZXMgYXJlIGZ1bGx5IGRlZmluZWQgaW4gIDNHUFAgVFMgNTIuMDA4LiBbNjFdCisKK1RyYWNlRGVwdGhMaXN0IDo6PSBTRVFVRU5DRSB7CisJbXNjLXMtVHJhY2VEZXB0aAlbMF0gVHJhY2VEZXB0aAlPUFRJT05BTCwKKwltZ3ctVHJhY2VEZXB0aAlbMV0gVHJhY2VEZXB0aAlPUFRJT05BTCwKKwlzZ3NuLVRyYWNlRGVwdGgJWzJdIFRyYWNlRGVwdGgJT1BUSU9OQUwsCisJZ2dzbi1UcmFjZURlcHRoCVszXSBUcmFjZURlcHRoCU9QVElPTkFMLAorCXJuYy1UcmFjZURlcHRoCVs0XSBUcmFjZURlcHRoCU9QVElPTkFMLAorCWJtc2MtVHJhY2VEZXB0aAlbNV0gVHJhY2VEZXB0aAlPUFRJT05BTCwKKwkuLi59CisKK1RyYWNlRGVwdGggOjo9IEVOVU1FUkFURUQgeworCW1pbmltdW0gKDApLAorCW1lZGl1bSAoMSksCisJbWF4aW11bSAoMiksCisJLi4ufQorLS0gVGhlIHZhbHVlIG1lZGl1bSBpcyBhcHBsaWNhYmxlIG9ubHkgZm9yIFJOQy4gRm9yIG90aGVyIG5ldHdvcmsgZWxlbWVudHMsIGlmIHZhbHVlIG1lZGl1bQorLS0gaXMgcmVjZWl2ZWQsIHZhbHVlIG1pbmltdW0gc2hhbGwgYmUgYXBwbGllZC4KKworVHJhY2VORS1UeXBlTGlzdCA6Oj0gQklUIFNUUklORyB7CisJbXNjLXMgKDApLAorCW1ndyAoMSksCisJc2dzbiAoMiksCisJZ2dzbiAoMyksCisJcm5jICg0KSwKKwlibS1zYyAoNSl9IChTSVpFICg2Li4xNikpCistLSBPdGhlciBiaXRzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KKworVHJhY2VJbnRlcmZhY2VMaXN0IDo6PSBTRVFVRU5DRSB7CisJbXNjLXMtTGlzdAlbMF0gTVNDLVMtSW50ZXJmYWNlTGlzdAlPUFRJT05BTCwKKwltZ3ctTGlzdAkJWzFdIE1HVy1JbnRlcmZhY2VMaXN0CU9QVElPTkFMLAorCXNnc24tTGlzdAkJWzJdIFNHU04tSW50ZXJmYWNlTGlzdAlPUFRJT05BTCwKKwlnZ3NuLUxpc3QJCVszXSBHR1NOLUludGVyZmFjZUxpc3QJT1BUSU9OQUwsCisJcm5jLUxpc3QJCVs0XSBSTkMtSW50ZXJmYWNlTGlzdAlPUFRJT05BTCwKKwlibXNjLUxpc3QJCVs1XSBCTVNDLUludGVyZmFjZUxpc3QJT1BUSU9OQUwsCisJLi4ufQorCitNU0MtUy1JbnRlcmZhY2VMaXN0IDo6PSBCSVQgU1RSSU5HIHsKKwlhICgwKSwKKwlpdSAoMSksCisJbWMgKDIpLAorCW1hcC1nICgzKSwKKwltYXAtYiAoNCksCisJbWFwLWUgKDUpLAorCW1hcC1mICg2KSwKKwljYXAgKDcpLAorCW1hcC1kICg4KSwKKwltYXAtYyAoOSl9IChTSVpFICgxMC4uMTYpKQorLS0gT3RoZXIgYml0cyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCisKK01HVy1JbnRlcmZhY2VMaXN0IDo6PSBCSVQgU1RSSU5HIHsKKwltYyAoMCksCisJbmItdXAgKDEpLAorCWl1LXVwICgyKX0gKFNJWkUgKDMuLjgpKQorLS0gT3RoZXIgYml0cyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCisKK1NHU04tSW50ZXJmYWNlTGlzdCA6Oj0gQklUIFNUUklORyB7CisJZ2IgKDApLAorCWl1ICgxKSwKKwlnbiAoMiksCisJbWFwLWdyICgzKSwKKwltYXAtZ2QgKDQpLAorCW1hcC1nZiAoNSksCisJZ3MgKDYpLAorCWdlICg3KX0gKFNJWkUgKDguLjE2KSkKKy0tIE90aGVyIGJpdHMgdGhhbiBsaXN0ZWQgYWJvdmUgc2hhbGwgYmUgZGlzY2FyZGVkLgorCitHR1NOLUludGVyZmFjZUxpc3QgOjo9IEJJVCBTVFJJTkcgeworCWduICgwKSwKKwlnaSAoMSksCisJZ21iICgyKX0gKFNJWkUgKDMuLjgpKQorLS0gT3RoZXIgYml0cyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCisKK1JOQy1JbnRlcmZhY2VMaXN0IDo6PSBCSVQgU1RSSU5HIHsKKwlpdSAoMCksCisJaXVyICgxKSwKKwlpdWIgKDIpLAorCXV1ICgzKX0gKFNJWkUgKDQuLjgpKQorLS0gT3RoZXIgYml0cyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCisKK0JNU0MtSW50ZXJmYWNlTGlzdCA6Oj0gQklUIFNUUklORyB7CisJZ21iICgwKX0gKFNJWkUgKDEuLjgpKQorLS0gT3RoZXIgYml0cyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCisKK1RyYWNlRXZlbnRMaXN0IDo6PSBTRVFVRU5DRSB7CisJbXNjLXMtTGlzdAlbMF0gTVNDLVMtRXZlbnRMaXN0CU9QVElPTkFMLAorCW1ndy1MaXN0CQlbMV0gTUdXLUV2ZW50TGlzdAlPUFRJT05BTCwKKwlzZ3NuLUxpc3QJCVsyXSBTR1NOLUV2ZW50TGlzdAlPUFRJT05BTCwKKwlnZ3NuLUxpc3QJCVszXSBHR1NOLUV2ZW50TGlzdAlPUFRJT05BTCwKKwlibXNjLUxpc3QJCVs0XSBCTVNDLUV2ZW50TGlzdAlPUFRJT05BTCwKKwkuLi59CisKK01TQy1TLUV2ZW50TGlzdCA6Oj0gQklUIFNUUklORyB7CisJbW8tbXRDYWxsICgwKSwKKwltby1tdC1zbXMgKDEpLAorCWx1LWltc2lBdHRhY2gtaW1zaURldGFjaCAoMiksCisJaGFuZG92ZXJzICgzKSwKKwlzcyAoNCl9IChTSVpFICg1Li4xNikpCistLSBPdGhlciBiaXRzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KKworTUdXLUV2ZW50TGlzdCA6Oj0gQklUIFNUUklORyB7CisJY29udGV4dCAoMCl9IChTSVpFICgxLi44KSkKKy0tIE90aGVyIGJpdHMgdGhhbiBsaXN0ZWQgYWJvdmUgc2hhbGwgYmUgZGlzY2FyZGVkLgorCitTR1NOLUV2ZW50TGlzdCA6Oj0gQklUIFNUUklORyB7CisJcGRwQ29udGV4dCAoMCksCisJbW8tbXQtc21zICgxKSwKKwlyYXUtZ3Byc0F0dGFjaC1ncHJzRGV0YWNoICgyKSwKKwltYm1zQ29udGV4dCAoMyl9IChTSVpFICg0Li4xNikpCistLSBPdGhlciBiaXRzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KKworR0dTTi1FdmVudExpc3QgOjo9IEJJVCBTVFJJTkcgeworCXBkcENvbnRleHQgKDApLAorCW1ibXNDb250ZXh0ICgxKX0gKFNJWkUgKDIuLjgpKQorLS0gT3RoZXIgYml0cyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCisKK0JNU0MtRXZlbnRMaXN0IDo6PSBCSVQgU1RSSU5HIHsKKwltYm1zTXVsdGljYXN0U2VydmljZUFjdGl2YXRpb24gKDApfSAoU0laRSAoMS4uOCkpCistLSBPdGhlciBiaXRzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KKworCitUcmFjZVByb3BhZ2F0aW9uTGlzdCA6Oj0gU0VRVUVOQ0UgeworCXRyYWNlUmVmZXJlbmNlCVswXSBUcmFjZVJlZmVyZW5jZQlPUFRJT05BTCwKKwl0cmFjZVR5cGUJCVsxXSBUcmFjZVR5cGUJT1BUSU9OQUwsCisJdHJhY2VSZWZlcmVuY2UyCVsyXSBUcmFjZVJlZmVyZW5jZTIJT1BUSU9OQUwsCisJdHJhY2VSZWNvcmRpbmdTZXNzaW9uUmVmZXJlbmNlCVszXSBUcmFjZVJlY29yZGluZ1Nlc3Npb25SZWZlcmVuY2UgT1BUSU9OQUwsCisJcm5jLVRyYWNlRGVwdGgJWzRdIFRyYWNlRGVwdGgJT1BUSU9OQUwsCisJcm5jLUludGVyZmFjZUxpc3QJWzVdIFJOQy1JbnRlcmZhY2VMaXN0CU9QVElPTkFMLAorCW1zYy1zLVRyYWNlRGVwdGgJWzZdIFRyYWNlRGVwdGgJT1BUSU9OQUwsCisJbXNjLXMtSW50ZXJmYWNlTGlzdAlbN10gTVNDLVMtSW50ZXJmYWNlTGlzdAlPUFRJT05BTCwKKwltc2Mtcy1FdmVudExpc3QJWzhdIE1TQy1TLUV2ZW50TGlzdAlPUFRJT05BTCwKKwltZ3ctVHJhY2VEZXB0aAlbOV0gVHJhY2VEZXB0aAlPUFRJT05BTCwKKwltZ3ctSW50ZXJmYWNlTGlzdAlbMTBdIE1HVy1JbnRlcmZhY2VMaXN0CU9QVElPTkFMLAorCW1ndy1FdmVudExpc3QJWzExXSBNR1ctRXZlbnRMaXN0CU9QVElPTkFMLAorCS4uLn0KKworQWN0aXZhdGVUcmFjZU1vZGVSZXMgOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJWzBdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJdHJhY2VTdXBwb3J0SW5kaWNhdG9yCVsxXQlOVUxMCQlPUFRJT05BTAorCX0KKworRGVhY3RpdmF0ZVRyYWNlTW9kZUFyZyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQlbMF0gSU1TSQkJT1BUSU9OQUwsCisJdHJhY2VSZWZlcmVuY2UJWzFdIFRyYWNlUmVmZXJlbmNlLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwl0cmFjZVJlZmVyZW5jZTIJWzNdIFRyYWNlUmVmZXJlbmNlMglPUFRJT05BTAorCX0KKworRGVhY3RpdmF0ZVRyYWNlTW9kZVJlcyA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglbMF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworRU5ECisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLVNNLURhdGFUeXBlcy5hc24gYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1TTS1EYXRhVHlwZXMuYXNuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZjk0MWYKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1TTS1EYXRhVHlwZXMuYXNuCkBAIC0wLDAgKzEsMjcwIEBACistLSAkSWQ6IE1BUC1TTS1EYXRhVHlwZXMuYXNuIDI4MTQ5IDIwMDktMDQtMjUgMTc6NDU6MzRaIGV0eHJhYiAkCistLSAzR1BQIFRTIDI5LjAwMiAgVjguOS4wICgyMDA5LTA0KSAgCistLSAxNy43LjYJU2hvcnQgbWVzc2FnZSBkYXRhIHR5cGVzCisKK01BUC1TTS1EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtU00tRGF0YVR5cGVzICgxNikgdmVyc2lvbjExICgxMSl9CisKK0RFRklOSVRJT05TCisKK0lNUExJQ0lUIFRBR1MKKworOjo9CisKK0JFR0lOCisKK0VYUE9SVFMKKwlSb3V0aW5nSW5mb0ZvclNNLUFyZywKKwlSb3V0aW5nSW5mb0ZvclNNLVJlcywKKwlNTy1Gb3J3YXJkU00tQXJnLAorCU1PLUZvcndhcmRTTS1SZXMsCisJTVQtRm9yd2FyZFNNLUFyZywKKwlNVC1Gb3J3YXJkU00tUmVzLAorCVJlcG9ydFNNLURlbGl2ZXJ5U3RhdHVzQXJnLAorCVJlcG9ydFNNLURlbGl2ZXJ5U3RhdHVzUmVzLAorCUFsZXJ0U2VydmljZUNlbnRyZUFyZywKKwlJbmZvcm1TZXJ2aWNlQ2VudHJlQXJnLAorCVJlYWR5Rm9yU00tQXJnLCAKKwlSZWFkeUZvclNNLVJlcywKKwlTTS1EZWxpdmVyeU91dGNvbWUsCisJQWxlcnRSZWFzb24sCisJQWRkaXRpb25hbC1OdW1iZXIsCisJTVQtRm9yd2FyZFNNLVZHQ1MtQXJnLAorCU1ULUZvcndhcmRTTS1WR0NTLVJlcworOworCitJTVBPUlRTCisJQWRkcmVzc1N0cmluZywKKwlJU0ROLUFkZHJlc3NTdHJpbmcsCisJU2lnbmFsSW5mbywKKwlJTVNJLAorCUxNU0ksCisJQVNDSS1DYWxsUmVmZXJlbmNlCisKK0ZST00gTUFQLUNvbW1vbkRhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1Db21tb25EYXRhVHlwZXMgKDE4KSB2ZXJzaW9uMTEgKDExKX0KKworCUFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00KK0ZST00gTUFQLUVSLURhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1FUi1EYXRhVHlwZXMgKDE3KSB2ZXJzaW9uMTEgKDExKX0KKworCUV4dGVuc2lvbkNvbnRhaW5lcgorRlJPTSBNQVAtRXh0ZW5zaW9uRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUV4dGVuc2lvbkRhdGFUeXBlcyAoMjEpIHZlcnNpb24xMSAoMTEpfQorOworCisKK1JvdXRpbmdJbmZvRm9yU00tQXJnIDo6PSBTRVFVRU5DRSB7CisJbXNpc2RuCQlbMF0gSVNETi1BZGRyZXNzU3RyaW5nLAorCXNtLVJQLVBSSQkJWzFdIEJPT0xFQU4sCisJc2VydmljZUNlbnRyZUFkZHJlc3MJWzJdIEFkZHJlc3NTdHJpbmcsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs2XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwlncHJzU3VwcG9ydEluZGljYXRvcglbN10JTlVMTAkJT1BUSU9OQUwsCisJLS0gZ3Byc1N1cHBvcnRJbmRpY2F0b3IgaXMgc2V0IG9ubHkgaWYgdGhlIFNNUy1HTVNDIHN1cHBvcnRzCisJLS0gcmVjZWl2aW5nIG9mIHR3byBudW1iZXJzIGZyb20gdGhlIEhMUgorCXNtLVJQLU1USQkJWzhdIFNNLVJQLU1USQlPUFRJT05BTCwKKwlzbS1SUC1TTUVBCVs5XSBTTS1SUC1TTUVBCU9QVElPTkFMLAorCXNtLWRlbGl2ZXJ5Tm90SW50ZW5kZWQJWzEwXSBTTS1EZWxpdmVyeU5vdEludGVuZGVkCU9QVElPTkFMIH0KKworU00tRGVsaXZlcnlOb3RJbnRlbmRlZCA6Oj0gRU5VTUVSQVRFRCB7CisJb25seUlNU0ktcmVxdWVzdGVkICAoMCksCisJb25seU1DQy1NTkMtcmVxdWVzdGVkICAoMSksCisJLi4ufQorCitTTS1SUC1NVEkgOjo9IElOVEVHRVIgKDAuLjEwKQorCS0tIDAgU01TIERlbGl2ZXIgCisJLS0gMSBTTVMgU3RhdHVzIFJlcG9ydAorCS0tIG90aGVyIHZhbHVlcyBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgYW5kIHNoYWxsIGJlIGRpc2NhcmRlZCBpZgorCS0tIHJlY2VpdmVkCisKK1NNLVJQLVNNRUEgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4uMTIpKQorCS0tIHRoaXMgcGFyYW1ldGVyIGNvbnRhaW5zIGFuIGFkZHJlc3MgZmllbGQgd2hpY2ggaXMgZW5jb2RlZCAKKwktLSBhcyBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDQwLiBBbiBhZGRyZXNzIGZpZWxkIGNvbnRhaW5zIDMgZWxlbWVudHMgOgorCS0tIAkJYWRkcmVzcy1sZW5ndGgKKwktLSAJCXR5cGUtb2YtYWRkcmVzcworCS0tIAkJYWRkcmVzcy12YWx1ZQorCitSb3V0aW5nSW5mb0ZvclNNLVJlcyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQlJTVNJLAorCWxvY2F0aW9uSW5mb1dpdGhMTVNJCVswXSBMb2NhdGlvbkluZm9XaXRoTE1TSSwKKwlleHRlbnNpb25Db250YWluZXIJWzRdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0xvY2F0aW9uSW5mb1dpdGhMTVNJIDo6PSBTRVFVRU5DRSB7CisJbmV0d29ya05vZGUtTnVtYmVyCVsxXSBJU0ROLUFkZHJlc3NTdHJpbmcsCisJbG1zaQkJCUxNU0kJCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlncHJzTm9kZUluZGljYXRvcglbNV0JTlVMTAkJT1BUSU9OQUwsCisJLS0gZ3Byc05vZGVJbmRpY2F0b3IgaXMgc2V0IG9ubHkgaWYgdGhlIFNHU04gbnVtYmVyIGlzIHNlbnQgYXMgdGhlIAorCS0tIE5ldHdvcmsgTm9kZSBOdW1iZXIKKwlhZGRpdGlvbmFsLU51bWJlcglbNl0gQWRkaXRpb25hbC1OdW1iZXIJT1BUSU9OQUwgCisJLS0gTmV0d29ya05vZGUtbnVtYmVyIGNhbiBiZSBlaXRoZXIgbXNjLW51bWJlciBvciBzZ3NuLW51bWJlciBvciBJUC1TTS1HVworCS0tIG51bWJlciBvciBTTVMgUm91dGVyIG51bWJlcgorCX0KKworQWRkaXRpb25hbC1OdW1iZXIgOjo9IENIT0lDRSB7CisJbXNjLU51bWJlcglbMF0gSVNETi1BZGRyZXNzU3RyaW5nLAorCXNnc24tTnVtYmVyCVsxXSBJU0ROLUFkZHJlc3NTdHJpbmd9CisJLS0gYWRkaXRpb25hbC1udW1iZXIgY2FuIGJlIGVpdGhlciBtc2MtbnVtYmVyIG9yIHNnc24tbnVtYmVyCisJLS0gaWYgcmVjZWl2ZWQgbmV0d29ya05vZGUtbnVtYmVyIGlzIG1zYy1udW1iZXIgdGhlbiB0aGUgCQorCS0tIGFkZGl0aW9uYWwgbnVtYmVyIGlzIHNnc24tbnVtYmVyIAorCS0tIGlmIHJlY2VpdmVkIG5ldHdvcmtOb2RlLW51bWJlciBpcyBzZ3NuLW51bWJlciB0aGVuIHRoZSAKKwktLSBhZGRpdGlvbmFsIG51bWJlciBpcyBtc2MtbnVtYmVyIAorCitNTy1Gb3J3YXJkU00tQXJnIDo6PSBTRVFVRU5DRSB7CisJc20tUlAtREEJCVNNLVJQLURBLAorCXNtLVJQLU9BCQlTTS1SUC1PQSwKKwlzbS1SUC1VSQkJU2lnbmFsSW5mbywKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiAsCisJaW1zaQkJCUlNU0kgCQlPUFRJT05BTCB9CisKK01PLUZvcndhcmRTTS1SZXMgOjo9IFNFUVVFTkNFIHsKKwlzbS1SUC1VSQkJU2lnbmFsSW5mbyAJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK01ULUZvcndhcmRTTS1BcmcgOjo9IFNFUVVFTkNFIHsKKwlzbS1SUC1EQQkJU00tUlAtREEsCisJc20tUlAtT0EJCVNNLVJQLU9BLAorCXNtLVJQLVVJCQlTaWduYWxJbmZvLAorCW1vcmVNZXNzYWdlc1RvU2VuZAlOVUxMCQkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK01ULUZvcndhcmRTTS1SZXMgOjo9IFNFUVVFTkNFIHsKKwlzbS1SUC1VSQkJU2lnbmFsSW5mbwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworU00tUlAtREEgOjo9IENIT0lDRSB7CisJaW1zaQkJCVswXSBJTVNJLAorCWxtc2kJCQlbMV0gTE1TSSwKKwlzZXJ2aWNlQ2VudHJlQWRkcmVzc0RBCVs0XSBBZGRyZXNzU3RyaW5nLAorCW5vU00tUlAtREEJWzVdIE5VTEx9CisKK1NNLVJQLU9BIDo6PSBDSE9JQ0UgeworCW1zaXNkbgkJWzJdIElTRE4tQWRkcmVzc1N0cmluZywKKwlzZXJ2aWNlQ2VudHJlQWRkcmVzc09BCVs0XSBBZGRyZXNzU3RyaW5nLAorCW5vU00tUlAtT0EJWzVdIE5VTEx9CisKK1JlcG9ydFNNLURlbGl2ZXJ5U3RhdHVzQXJnIDo6PSBTRVFVRU5DRSB7CisJbXNpc2RuCQlJU0ROLUFkZHJlc3NTdHJpbmcsCisJc2VydmljZUNlbnRyZUFkZHJlc3MJQWRkcmVzc1N0cmluZywKKwlzbS1EZWxpdmVyeU91dGNvbWUJU00tRGVsaXZlcnlPdXRjb21lLAorCWFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00JWzBdIEFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00KKwkJCQkJCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzFdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJZ3Byc1N1cHBvcnRJbmRpY2F0b3IJWzJdCU5VTEwJCU9QVElPTkFMLAorCS0tIGdwcnNTdXBwb3J0SW5kaWNhdG9yIGlzIHNldCBvbmx5IGlmIHRoZSBTTVMtR01TQyBzdXBwb3J0cyAKKwktLSBoYW5kbGluZyBvZiB0d28gZGVsaXZlcnkgb3V0Y29tZXMKKwlkZWxpdmVyeU91dGNvbWVJbmRpY2F0b3IJWzNdIAlOVUxMCQlPUFRJT05BTCwKKwktLSBEZWxpdmVyeU91dGNvbWVJbmRpY2F0b3IgaXMgc2V0IHdoZW4gdGhlIFNNLURlbGl2ZXJ5T3V0Y29tZQorCS0tIGlzIGZvciBHUFJTCisJYWRkaXRpb25hbFNNLURlbGl2ZXJ5T3V0Y29tZQlbNF0gCVNNLURlbGl2ZXJ5T3V0Y29tZSAJT1BUSU9OQUwsCisJLS0gSWYgcmVjZWl2ZWQsIGFkZGl0aW9uYWxTTS1EZWxpdmVyeU91dGNvbWUgaXMgZm9yIEdQUlMKKwktLSBJZiBEZWxpdmVyeU91dGNvbWVJbmRpY2F0b3IgaXMgc2V0LCB0aGVuIEFkZGl0aW9uYWxTTS1EZWxpdmVyeU91dGNvbWUgc2hhbGwgYmUgYWJzZW50CisJYWRkaXRpb25hbEFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00JWzVdIAlBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNIE9QVElPTkFMLAorCS0tIElmIHJlY2VpdmVkIGFkZGl0aW9uYWxBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNIGlzIGZvciBHUFJTCisJLS0gSWYgRGVsaXZlcnlPdXRjb21lSW5kaWNhdG9yIGlzIHNldCwgdGhlbiBBZGRpdGlvbmFsQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTSAKKwktLSBzaGFsbCBiZSBhYnNlbnQKKwlpcC1zbS1ndy1JbmRpY2F0b3IJWzZdIAlOVUxMCQlPUFRJT05BTCwKKwktLSB0aGUgaXAtc20tZ3cgaW5kaWNhdG9yIGluZGljYXRlcyBieSBpdHMgcHJlc2VuY2UgdGhhdCBzbS1kZWxpdmVyeU91dGNvbWUKKwktLSBpcyBmb3IgZGVsaXZlcnkgdmlhIElNUworCS0tIElmIHByZXNlbnQsIGRlbGl2ZXJ5T3V0Y29tZUluZGljYXRvciBzaGFsbCBiZSBhYnNlbnQuCisJaXAtc20tZ3ctc20tZGVsaXZlcnlPdXRjb21lCVs3XSAJU00tRGVsaXZlcnlPdXRjb21lCU9QVElPTkFMLCAKKwktLSBJZiByZWNlaXZlZCBpcC1zbS1ndy1zbS1kZWxpdmVyeU91dGNvbWUgaXMgZm9yIGRlbGl2ZXJ5IHZpYSBJTVMKKwktLSBJZiBpcC1zbS1ndy1JbmRpY2F0b3IgaXMgc2V0LCB0aGVuIGlwLXNtLWd3LXNtLWRlbGl2ZXJ5T3V0Y29tZSBzaGFsbCBiZSBhYnNlbnQKKwlpcC1zbS1ndy1hYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNCVs4XQlBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNCU9QVElPTkFMCisJLS0gSWYgcmVjZWl2ZWQgaXAtc20tZ3ctc20tYWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTSBpcyBmb3IgZGVsaXZlcnkgdmlhIElNUworCS0tIElmIGlwLXNtLWd3LUluZGljYXRvciBpcyBzZXQsIHRoZW4gaXAtc20tZ3ctc20tYWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTSAKKwktLSBzaGFsbCBiZSBhYnNlbnQKK30KKworU00tRGVsaXZlcnlPdXRjb21lIDo6PSBFTlVNRVJBVEVEIHsKKwltZW1vcnlDYXBhY2l0eUV4Y2VlZGVkICAoMCksCisJYWJzZW50U3Vic2NyaWJlciAgKDEpLAorCXN1Y2Nlc3NmdWxUcmFuc2ZlciAgKDIpfQorCitSZXBvcnRTTS1EZWxpdmVyeVN0YXR1c1JlcyA6Oj0gU0VRVUVOQ0UgeworCXN0b3JlZE1TSVNETglJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0FsZXJ0U2VydmljZUNlbnRyZUFyZyA6Oj0gU0VRVUVOQ0UgeworCW1zaXNkbgkJSVNETi1BZGRyZXNzU3RyaW5nLAorCXNlcnZpY2VDZW50cmVBZGRyZXNzCUFkZHJlc3NTdHJpbmcsCisJLi4ufQorCitJbmZvcm1TZXJ2aWNlQ2VudHJlQXJnIDo6PSBTRVFVRU5DRSB7CisJc3RvcmVkTVNJU0ROCUlTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwltdy1TdGF0dXMJTVctU3RhdHVzCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwlhYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNCUFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00JT1BUSU9OQUwsCisJYWRkaXRpb25hbEFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00JWzBdCUFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00JT1BUSU9OQUwgfQorCS0tIGFkZGl0aW9uYWxBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNIG1heSBiZSBwcmVzZW50IG9ubHkgaWYgCisJLS0gYWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTSBpcyBwcmVzZW50LgorCS0tIGlmIGluY2x1ZGVkLCBhZGRpdGlvbmFsQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTSBpcyBmb3IgR1BSUyBhbmQKKwktLSBhYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNIGlzIGZvciBub24tR1BSUworCitNVy1TdGF0dXMgOjo9IEJJVCBTVFJJTkcgeworCXNjLUFkZHJlc3NOb3RJbmNsdWRlZCAgKDApLAorCW1ucmYtU2V0ICAoMSksCisJbWNlZi1TZXQgICgyKSAsCisJbW5yZy1TZXQJICAoMyl9IChTSVpFICg2Li4xNikpCisJLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgorCS0tIGJpdHMgNCB0byAxNSBzaGFsbCBiZSBpZ25vcmVkIGlmIHJlY2VpdmVkIGFuZCBub3QgdW5kZXJzdG9vZAorCitSZWFkeUZvclNNLUFyZyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQlbMF0gSU1TSSwKKwlhbGVydFJlYXNvbglBbGVydFJlYXNvbiwKKwlhbGVydFJlYXNvbkluZGljYXRvcglOVUxMCQkJT1BUSU9OQUwsCisJLS0gYWxlcnRSZWFzb25JbmRpY2F0b3IgaXMgc2V0IG9ubHkgd2hlbiB0aGUgYWxlcnRSZWFzb24gCisJLS0gc2VudCB0byBITFIgaXMgZm9yIEdQUlMKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlhZGRpdGlvbmFsQWxlcnRSZWFzb25JbmRpY2F0b3IJWzFdIE5VTEwJCU9QVElPTkFMCisJLS0gYWRkaXRpb25hbEFsZXJ0UmVhc29uSW5kaWNhdG9yIGlzIHNldCBvbmx5IHdoZW4gdGhlIGFsZXJ0UmVhc29uCisJLS0gc2VudCB0byBITFIgaXMgZm9yIElQLVNNLUdXCisJfQorCitSZWFkeUZvclNNLVJlcyA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitBbGVydFJlYXNvbiA6Oj0gRU5VTUVSQVRFRCB7CisJbXMtUHJlc2VudCAgKDApLAorCW1lbW9yeUF2YWlsYWJsZSAgKDEpfQorCitNVC1Gb3J3YXJkU00tVkdDUy1BcmcgOjo9IFNFUVVFTkNFIHsKKwlhc2NpQ2FsbFJlZmVyZW5jZQlBU0NJLUNhbGxSZWZlcmVuY2UsCisJc20tUlAtT0EJCVNNLVJQLU9BLAorCXNtLVJQLVVJCQlTaWduYWxJbmZvLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitNVC1Gb3J3YXJkU00tVkdDUy1SZXMgOjo9IFNFUVVFTkNFIHsKKwlzbS1SUC1VSQkJWzBdIFNpZ25hbEluZm8JT1BUSU9OQUwsCisJZGlzcGF0Y2hlckxpc3QJWzFdIERpc3BhdGNoZXJMaXN0CU9QVElPTkFMLAorCW9uZ29pbmdDYWxsCU5VTEwJCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0Rpc3BhdGNoZXJMaXN0IDo6PSAKKwlTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkRpc3BhdGNoZXJzKSBPRgorCQkJCUlTRE4tQWRkcmVzc1N0cmluZworCittYXhOdW1PZkRpc3BhdGNoZXJzICBJTlRFR0VSIDo6PSA1CisKKworCitFTkQKKwpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtU1MtQ29kZS5hc24gYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1TUy1Db2RlLmFzbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjNmMmRjCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtU1MtQ29kZS5hc24KQEAgLTAsMCArMSwxOTAgQEAKKy0tICRJZDogTUFQLVNTLUNvZGUuYXNuIDI4MTQ5IDIwMDktMDQtMjUgMTc6NDU6MzRaIGV0eHJhYiAkCistLSAzR1BQIFRTIDI5LjAwMiBWOC45LjAgKDIwMDktMDQpCistLSAxNy43LjUJU3VwcGxlbWVudGFyeSBzZXJ2aWNlIGNvZGVzCisKK01BUC1TUy1Db2RlIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLVNTLUNvZGUgKDE1KSB2ZXJzaW9uMTEgKDExKX0KKworREVGSU5JVElPTlMKKworOjo9CisKK0JFR0lOCisKK1NTLUNvZGUgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisJLS0gVGhpcyB0eXBlIGlzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBjb2RlIGlkZW50aWZ5aW5nIGEgc2luZ2xlCisJLS0gc3VwcGxlbWVudGFyeSBzZXJ2aWNlLCBhIGdyb3VwIG9mIHN1cHBsZW1lbnRhcnkgc2VydmljZXMsIG9yCisJLS0gYWxsIHN1cHBsZW1lbnRhcnkgc2VydmljZXMuIFRoZSBzZXJ2aWNlcyBhbmQgYWJicmV2aWF0aW9ucworCS0tIHVzZWQgYXJlIGRlZmluZWQgaW4gVFMgM0dQUCBUUyAyMi4wMDQgWzVdLiBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzCisJLS0gZGVmaW5lZCBhcyBmb2xsb3dzOgorCS0tCisJLS0gYml0cyA4NzY1NDMyMTogZ3JvdXAgKGJpdHMgODc2NSksIGFuZCBzcGVjaWZpYyBzZXJ2aWNlCisJLS0gKGJpdHMgNDMyMSkKKworYWxsU1MJCQlTUy1Db2RlIDo6PSAnMDAwMDAwMDAnQgorCS0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlCisJLS0gYWxsIFNTCisKK2FsbExpbmVJZGVudGlmaWNhdGlvblNTCVNTLUNvZGUgOjo9ICcwMDAxMDAwMCdCCisJLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UKKwktLSBhbGwgbGluZSBpZGVudGlmaWNhdGlvbiBTUworY2xpcAkJCQlTUy1Db2RlIDo6PSAnMDAwMTAwMDEnQgorCS0tIGNhbGxpbmcgbGluZSBpZGVudGlmaWNhdGlvbiBwcmVzZW50YXRpb24KK2NsaXIJCQkJU1MtQ29kZSA6Oj0gJzAwMDEwMDEwJ0IKKwktLSBjYWxsaW5nIGxpbmUgaWRlbnRpZmljYXRpb24gcmVzdHJpY3Rpb24KK2NvbHAJCQkJU1MtQ29kZSA6Oj0gJzAwMDEwMDExJ0IKKwktLSBjb25uZWN0ZWQgbGluZSBpZGVudGlmaWNhdGlvbiBwcmVzZW50YXRpb24KK2NvbHIJCQkJU1MtQ29kZSA6Oj0gJzAwMDEwMTAwJ0IKKwktLSBjb25uZWN0ZWQgbGluZSBpZGVudGlmaWNhdGlvbiByZXN0cmljdGlvbgorbWNpCQkJCVNTLUNvZGUgOjo9ICcwMDAxMDEwMSdCCisJLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UKKwktLSBtYWxpY2lvdXMgY2FsbCBpZGVudGlmaWNhdGlvbgorCithbGxOYW1lSWRlbnRpZmljYXRpb25TUwlTUy1Db2RlIDo6PSAnMDAwMTEwMDAnQgorCS0tIGFsbCBuYW1lIGlkZW50aWZpY2F0aW9uIFNTCitjbmFwCQkJCVNTLUNvZGUgOjo9ICcwMDAxMTAwMSdCCisJLS0gY2FsbGluZyBuYW1lIHByZXNlbnRhdGlvbgorCisJLS0gU1MtQ29kZXMgJzAwMDExMDEwJ0IgdG8gJzAwMDExMTExJ0IgYXJlIHJlc2VydmVkIGZvciBmdXR1cmUgCisJLS0gTmFtZUlkZW50aWZpY2F0aW9uIFN1cHBsZW1lbnRhcnkgU2VydmljZSB1c2UuCisKK2FsbEZvcndhcmRpbmdTUwlTUy1Db2RlIDo6PSAnMDAxMDAwMDAnQgorCS0tIGFsbCBmb3J3YXJkaW5nIFNTCitjZnUJCQkJU1MtQ29kZSA6Oj0gJzAwMTAwMDAxJ0IKKwktLSBjYWxsIGZvcndhcmRpbmcgdW5jb25kaXRpb25hbAorYWxsQ29uZEZvcndhcmRpbmdTUwlTUy1Db2RlIDo6PSAnMDAxMDEwMDAnQgorCS0tIGFsbCBjb25kaXRpb25hbCBmb3J3YXJkaW5nIFNTCitjZmIJCQkJU1MtQ29kZSA6Oj0gJzAwMTAxMDAxJ0IKKwktLSBjYWxsIGZvcndhcmRpbmcgb24gbW9iaWxlIHN1YnNjcmliZXIgYnVzeQorY2ZucnkJCQlTUy1Db2RlIDo6PSAnMDAxMDEwMTAnQgorCS0tIGNhbGwgZm9yd2FyZGluZyBvbiBubyByZXBseQorY2ZucmMJCQlTUy1Db2RlIDo6PSAnMDAxMDEwMTEnQgorCS0tIGNhbGwgZm9yd2FyZGluZyBvbiBtb2JpbGUgc3Vic2NyaWJlciBub3QgcmVhY2hhYmxlIAorY2QJCQkJU1MtQ29kZSA6Oj0gJzAwMTAwMTAwJ0IKKwktLSBjYWxsIGRlZmxlY3Rpb24KKworYWxsQ2FsbE9mZmVyaW5nU1MJU1MtQ29kZSA6Oj0gJzAwMTEwMDAwJ0IKKwktLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZQorCS0tIGFsbCBjYWxsIG9mZmVyaW5nIFNTIGluY2x1ZGVzIGFsc28gYWxsIGZvcndhcmRpbmcgU1MKK2VjdAkJCQlTUy1Db2RlIDo6PSAnMDAxMTAwMDEnQgorCQktLSBleHBsaWNpdCBjYWxsIHRyYW5zZmVyCittYWgJCQkJU1MtQ29kZSA6Oj0gJzAwMTEwMDEwJ0IKKwktLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZQorCS0tIG1vYmlsZSBhY2Nlc3MgaHVudGluZworCithbGxDYWxsQ29tcGxldGlvblNTCVNTLUNvZGUgOjo9ICcwMTAwMDAwMCdCCisJLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UKKwktLSBhbGwgQ2FsbCBjb21wbGV0aW9uIFNTCitjdwkJCQlTUy1Db2RlIDo6PSAnMDEwMDAwMDEnQgorCS0tIGNhbGwgd2FpdGluZworaG9sZAkJCQlTUy1Db2RlIDo6PSAnMDEwMDAwMTAnQgorCS0tIGNhbGwgaG9sZAorY2Nicy1BCQkJU1MtQ29kZSA6Oj0gJzAxMDAwMDExJ0IKKwktLSBjb21wbGV0aW9uIG9mIGNhbGwgdG8gYnVzeSBzdWJzY3JpYmVycywgb3JpZ2luYXRpbmcgc2lkZQorCS0tIHRoaXMgU1MtQ29kZSBpcyB1c2VkIG9ubHkgaW4gSW5zZXJ0U3Vic2NyaWJlckRhdGEsIERlbGV0ZVN1YnNjcmliZXJEYXRhIAorCS0tIGFuZCBJbnRlcnJvZ2F0ZVNTCitjY2JzLUIJCQlTUy1Db2RlIDo6PSAnMDEwMDAxMDAnQgorCS0tIGNvbXBsZXRpb24gb2YgY2FsbCB0byBidXN5IHN1YnNjcmliZXJzLCBkZXN0aW5hdGlvbiBzaWRlCisJLS0gdGhpcyBTUy1Db2RlIGlzIHVzZWQgb25seSBpbiBJbnNlcnRTdWJzY3JpYmVyRGF0YSBhbmQgRGVsZXRlU3Vic2NyaWJlckRhdGEKK21jCQkJCVNTLUNvZGUgOjo9ICcwMTAwMDEwMSdCCisJLS0gbXVsdGljYWxsCisKK2FsbE11bHRpUGFydHlTUwlTUy1Db2RlIDo6PSAnMDEwMTAwMDAnQgorCS0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlCisJLS0gYWxsIG11bHRpcGFydHkgU1MKK211bHRpUFRZCQkJU1MtQ29kZSA6Oj0gJzAxMDEwMDAxJ0IKKwktLSBtdWx0aXBhcnR5CisKK2FsbENvbW11bml0eU9mSW50ZXJlc3QtU1MJU1MtQ29kZSA6Oj0gJzAxMTAwMDAwJ0IKKwktLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZQorCS0tIGFsbCBjb21tdW5pdHkgb2YgaW50ZXJlc3QgU1MKK2N1ZwkJCQlTUy1Db2RlIDo6PSAnMDExMDAwMDEnQgorCS0tIGNsb3NlZCB1c2VyIGdyb3VwCisKK2FsbENoYXJnaW5nU1MJCVNTLUNvZGUgOjo9ICcwMTExMDAwMCdCCisJLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UKKwktLSBhbGwgY2hhcmdpbmcgU1MKK2FvY2kJCQkJU1MtQ29kZSA6Oj0gJzAxMTEwMDAxJ0IKKwktLSBhZHZpY2Ugb2YgY2hhcmdlIGluZm9ybWF0aW9uCithb2NjCQkJCVNTLUNvZGUgOjo9ICcwMTExMDAxMCdCCisJLS0gYWR2aWNlIG9mIGNoYXJnZSBjaGFyZ2luZworCithbGxBZGRpdGlvbmFsSW5mb1RyYW5zZmVyU1MJU1MtQ29kZSA6Oj0gJzEwMDAwMDAwJ0IKKwktLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZQorCS0tIGFsbCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRyYW5zZmVyIFNTCit1dXMxCQkJCVNTLUNvZGUgOjo9ICcxMDAwMDAwMSdCCisJLS0gVVVTMSB1c2VyLXRvLXVzZXIgc2lnbmFsbGluZyAKK3V1czIJCQkJU1MtQ29kZSA6Oj0gJzEwMDAwMDEwJ0IKKwktLSBVVVMyIHVzZXItdG8tdXNlciBzaWduYWxsaW5nCit1dXMzCQkJCVNTLUNvZGUgOjo9ICcxMDAwMDAxMSdCCisJLS0gVVVTMyB1c2VyLXRvLXVzZXIgc2lnbmFsbGluZworCithbGxCYXJyaW5nU1MJCVNTLUNvZGUgOjo9ICcxMDAxMDAwMCdCCisJLS0gYWxsIGJhcnJpbmcgU1MKK2JhcnJpbmdPZk91dGdvaW5nQ2FsbHMJU1MtQ29kZSA6Oj0gJzEwMDEwMDAxJ0IKKwktLSBiYXJyaW5nIG9mIG91dGdvaW5nIGNhbGxzCitiYW9jCQkJCVNTLUNvZGUgOjo9ICcxMDAxMDAxMCdCCisJLS0gYmFycmluZyBvZiBhbGwgb3V0Z29pbmcgY2FsbHMKK2JvaWMJCQkJU1MtQ29kZSA6Oj0gJzEwMDEwMDExJ0IKKwktLSBiYXJyaW5nIG9mIG91dGdvaW5nIGludGVybmF0aW9uYWwgY2FsbHMKK2JvaWNFeEhDCQkJU1MtQ29kZSA6Oj0gJzEwMDEwMTAwJ0IKKwktLSBiYXJyaW5nIG9mIG91dGdvaW5nIGludGVybmF0aW9uYWwgY2FsbHMgZXhjZXB0IHRob3NlIGRpcmVjdGVkCisJLS0gdG8gdGhlIGhvbWUgUExNTiBDb3VudHJ5CitiYXJyaW5nT2ZJbmNvbWluZ0NhbGxzCVNTLUNvZGUgOjo9ICcxMDAxMTAwMSdCCisJLS0gYmFycmluZyBvZiBpbmNvbWluZyBjYWxscworYmFpYwkJCQlTUy1Db2RlIDo6PSAnMTAwMTEwMTAnQgorCS0tIGJhcnJpbmcgb2YgYWxsIGluY29taW5nIGNhbGxzCitiaWNSb2FtCQkJU1MtQ29kZSA6Oj0gJzEwMDExMDExJ0IKKwktLSBiYXJyaW5nIG9mIGluY29taW5nIGNhbGxzIHdoZW4gcm9hbWluZyBvdXRzaWRlIGhvbWUgUExNTgorCS0tIENvdW50cnkKKworYWxsUExNTi1zcGVjaWZpY1NTCVNTLUNvZGUgOjo9ICcxMTExMDAwMCdCCitwbG1uLXNwZWNpZmljU1MtMQlTUy1Db2RlIDo6PSAnMTExMTAwMDEnQgorcGxtbi1zcGVjaWZpY1NTLTIJU1MtQ29kZSA6Oj0gJzExMTEwMDEwJ0IKK3BsbW4tc3BlY2lmaWNTUy0zCVNTLUNvZGUgOjo9ICcxMTExMDAxMSdCCitwbG1uLXNwZWNpZmljU1MtNAlTUy1Db2RlIDo6PSAnMTExMTAxMDAnQgorcGxtbi1zcGVjaWZpY1NTLTUJU1MtQ29kZSA6Oj0gJzExMTEwMTAxJ0IKK3BsbW4tc3BlY2lmaWNTUy02CVNTLUNvZGUgOjo9ICcxMTExMDExMCdCCitwbG1uLXNwZWNpZmljU1MtNwlTUy1Db2RlIDo6PSAnMTExMTAxMTEnQgorcGxtbi1zcGVjaWZpY1NTLTgJU1MtQ29kZSA6Oj0gJzExMTExMDAwJ0IKK3BsbW4tc3BlY2lmaWNTUy05CVNTLUNvZGUgOjo9ICcxMTExMTAwMSdCCitwbG1uLXNwZWNpZmljU1MtQQlTUy1Db2RlIDo6PSAnMTExMTEwMTAnQgorcGxtbi1zcGVjaWZpY1NTLUIJU1MtQ29kZSA6Oj0gJzExMTExMDExJ0IKK3BsbW4tc3BlY2lmaWNTUy1DCVNTLUNvZGUgOjo9ICcxMTExMTEwMCdCCitwbG1uLXNwZWNpZmljU1MtRAlTUy1Db2RlIDo6PSAnMTExMTExMDEnQgorcGxtbi1zcGVjaWZpY1NTLUUJU1MtQ29kZSA6Oj0gJzExMTExMTEwJ0IKK3BsbW4tc3BlY2lmaWNTUy1GCVNTLUNvZGUgOjo9ICcxMTExMTExMSdCCisKK2FsbENhbGxQcmlvcml0eVNTCVNTLUNvZGUgOjo9ICcxMDEwMDAwMCdCCisJLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UKKwktLSBhbGwgY2FsbCBwcmlvcml0eSBTUworZW1scHAJCQlTUy1Db2RlIDo6PSAnMTAxMDAwMDEnQgorCS0tIGVuaGFuY2VkIE11bHRpbGV2ZWwgUHJlY2VkZW5jZSBQcmUtZW1wdGlvbiAoRU1MUFApIHNlcnZpY2UKKworYWxsTENTUHJpdmFjeUV4Y2VwdGlvbglTUy1Db2RlIDo6PSAnMTAxMTAwMDAnQgorCS0tIGFsbCBMQ1MgUHJpdmFjeSBFeGNlcHRpb24gQ2xhc3NlcwordW5pdmVyc2FsCQkJU1MtQ29kZSA6Oj0gJzEwMTEwMDAxJ0IKKwktLSBhbGxvdyBsb2NhdGlvbiBieSBhbnkgTENTIGNsaWVudAorY2FsbFNlc3Npb25SZWxhdGVkCVNTLUNvZGUgOjo9ICcxMDExMDAxMCdCCisJLS0gYWxsb3cgbG9jYXRpb24gYnkgYW55IHZhbHVlIGFkZGVkIExDUyBjbGllbnQgdG8gd2hpY2ggYSBjYWxsL3Nlc3Npb24gCisJLS0gaXMgZXN0YWJsaXNoZWQgZnJvbSB0aGUgdGFyZ2V0IE1TCitjYWxsU2Vzc2lvblVucmVsYXRlZAlTUy1Db2RlIDo6PSAnMTAxMTAwMTEnQgorCS0tIGFsbG93IGxvY2F0aW9uIGJ5IGRlc2lnbmF0ZWQgZXh0ZXJuYWwgdmFsdWUgYWRkZWQgTENTIGNsaWVudHMKK3BsbW5vcGVyYXRvcgkJU1MtQ29kZSA6Oj0gJzEwMTEwMTAwJ0IKKwktLSBhbGxvdyBsb2NhdGlvbiBieSBkZXNpZ25hdGVkIFBMTU4gb3BlcmF0b3IgTENTIGNsaWVudHMgCitzZXJ2aWNlVHlwZQkJU1MtQ29kZSA6Oj0gJzEwMTEwMTAxJ0IKKwktLSBhbGxvdyBsb2NhdGlvbiBieSBMQ1MgY2xpZW50cyBvZiBhIGRlc2lnbmF0ZWQgTENTIHNlcnZpY2UgdHlwZQorCithbGxNT0xSLVNTCQlTUy1Db2RlIDo6PSAnMTEwMDAwMDAnQgorCS0tIGFsbCBNb2JpbGUgT3JpZ2luYXRpbmcgTG9jYXRpb24gUmVxdWVzdCBDbGFzc2VzCitiYXNpY1NlbGZMb2NhdGlvbglTUy1Db2RlIDo6PSAnMTEwMDAwMDEnQgorCS0tIGFsbG93IGFuIE1TIHRvIHJlcXVlc3QgaXRzIG93biBsb2NhdGlvbgorYXV0b25vbW91c1NlbGZMb2NhdGlvbglTUy1Db2RlIDo6PSAnMTEwMDAwMTAnQgorCS0tIGFsbG93IGFuIE1TIHRvIHBlcmZvcm0gc2VsZiBsb2NhdGlvbiB3aXRob3V0IGludGVyYWN0aW9uCisJLS0gd2l0aCB0aGUgUExNTiBmb3IgYSBwcmVkZXRlcm1pbmVkIHBlcmlvZCBvZiB0aW1lCit0cmFuc2ZlclRvVGhpcmRQYXJ0eQlTUy1Db2RlIDo6PSAnMTEwMDAwMTEnQgorCS0tIGFsbG93IGFuIE1TIHRvIHJlcXVlc3QgdHJhbnNmZXIgb2YgaXRzIGxvY2F0aW9uIHRvIGFub3RoZXIgTENTIGNsaWVudAorCitFTkQKKwpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtU1MtRGF0YVR5cGVzLmFzbiBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLVNTLURhdGFUeXBlcy5hc24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUzZjdmMAotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLVNTLURhdGFUeXBlcy5hc24KQEAgLTAsMCArMSwzNDIgQEAKKy0tICRJZDogTUFQLVNTLURhdGFUeXBlcy5hc24gMjgxNDkgMjAwOS0wNC0yNSAxNzo0NTozNFogZXR4cmFiICQKKy0tIDNHUFAgVFMgMjkuMDAyIFY4LjkuMCAoMjAwOS0wNCkgIAorLS0gMTcuNy40CVN1cHBsZW1lbnRhcnkgc2VydmljZSBkYXRhIHR5cGVzCisgCitNQVAtU1MtRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLVNTLURhdGFUeXBlcyAoMTQpIHZlcnNpb24xMSAoMTEpfQorCitERUZJTklUSU9OUworCitJTVBMSUNJVCBUQUdTCisKKzo6PQorCitCRUdJTgorCitFWFBPUlRTCisJUmVnaXN0ZXJTUy1BcmcsCisJU1MtSW5mbywKKwlTUy1TdGF0dXMsCisJU1MtU3Vic2NyaXB0aW9uT3B0aW9uLAorCVNTLUZvckJTLUNvZGUsCisJSW50ZXJyb2dhdGVTUy1SZXMsCisJVVNTRC1BcmcsCisJVVNTRC1SZXMsIAorCVVTU0QtRGF0YUNvZGluZ1NjaGVtZSwKKwlVU1NELVN0cmluZywKKwlQYXNzd29yZCwKKwlHdWlkYW5jZUluZm8sCisJU1MtTGlzdCwKKwlTUy1JbmZvTGlzdCwKKwlPdmVycmlkZUNhdGVnb3J5LAorCUNsaVJlc3RyaWN0aW9uT3B0aW9uLAorCU5vUmVwbHlDb25kaXRpb25UaW1lLAorCUZvcndhcmRpbmdPcHRpb25zLAorCW1heE51bU9mU1MsCisJU1MtRGF0YSwKKwlTUy1JbnZvY2F0aW9uTm90aWZpY2F0aW9uQXJnLAorCVNTLUludm9jYXRpb25Ob3RpZmljYXRpb25SZXMsCisJQ0NCUy1GZWF0dXJlLAorCVJlZ2lzdGVyQ0MtRW50cnlBcmcsCisJUmVnaXN0ZXJDQy1FbnRyeVJlcywKKwlFcmFzZUNDLUVudHJ5QXJnLAorCUVyYXNlQ0MtRW50cnlSZXMKKzsKKworSU1QT1JUUworCUFkZHJlc3NTdHJpbmcsCisJSVNETi1BZGRyZXNzU3RyaW5nLAorCUlTRE4tU3ViYWRkcmVzc1N0cmluZywKKwlGVE4tQWRkcmVzc1N0cmluZywKKwlJTVNJLAorCUJhc2ljU2VydmljZUNvZGUsCisJQWxlcnRpbmdQYXR0ZXJuLAorCUVNTFBQLVByaW9yaXR5LCAKKwlNYXhNQy1CZWFyZXJzLAorCU1DLUJlYXJlcnMsCisJRXh0ZXJuYWxTaWduYWxJbmZvCitGUk9NIE1BUC1Db21tb25EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtQ29tbW9uRGF0YVR5cGVzICgxOCkgdmVyc2lvbjExICgxMSl9CisKKwlFeHRlbnNpb25Db250YWluZXIKK0ZST00gTUFQLUV4dGVuc2lvbkRhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1FeHRlbnNpb25EYXRhVHlwZXMgKDIxKSB2ZXJzaW9uMTEgKDExKX0KKworCVNTLUNvZGUKK0ZST00gTUFQLVNTLUNvZGUgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtU1MtQ29kZSAoMTUpIHZlcnNpb24xMSAoMTEpfQorOworCisKK1JlZ2lzdGVyU1MtQXJnIDo6PSBTRVFVRU5DRSB7CisJc3MtQ29kZQkJU1MtQ29kZSwKKwliYXNpY1NlcnZpY2UJQmFzaWNTZXJ2aWNlQ29kZQlPUFRJT05BTCwKKwlmb3J3YXJkZWRUb051bWJlcglbNF0gQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlmb3J3YXJkZWRUb1N1YmFkZHJlc3MJWzZdIElTRE4tU3ViYWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlub1JlcGx5Q29uZGl0aW9uVGltZQlbNV0gTm9SZXBseUNvbmRpdGlvblRpbWUJT1BUSU9OQUwsCisJLi4uLAorCWRlZmF1bHRQcmlvcml0eQlbN10gRU1MUFAtUHJpb3JpdHkJT1BUSU9OQUwsCisJbmJyVXNlcgkJWzhdIE1DLUJlYXJlcnMJT1BUSU9OQUwsCisJbG9uZ0ZUTi1TdXBwb3J0ZWQJWzldCU5VTEwJCU9QVElPTkFMIH0KKworTm9SZXBseUNvbmRpdGlvblRpbWUgOjo9IElOVEVHRVIgKDUuLjMwKQorCitTUy1JbmZvIDo6PSBDSE9JQ0UgeworCWZvcndhcmRpbmdJbmZvCVswXSBGb3J3YXJkaW5nSW5mbywKKwljYWxsQmFycmluZ0luZm8JWzFdIENhbGxCYXJyaW5nSW5mbywKKwlzcy1EYXRhCQlbM10gU1MtRGF0YX0KKworRm9yd2FyZGluZ0luZm8gOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlTUy1Db2RlCQlPUFRJT05BTCwKKwlmb3J3YXJkaW5nRmVhdHVyZUxpc3QJRm9yd2FyZGluZ0ZlYXR1cmVMaXN0LAorCS4uLn0KKworRm9yd2FyZGluZ0ZlYXR1cmVMaXN0IDo6PSAKKwlTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkJhc2ljU2VydmljZUdyb3VwcykgT0YKKwkJCQlGb3J3YXJkaW5nRmVhdHVyZQorCitGb3J3YXJkaW5nRmVhdHVyZSA6Oj0gU0VRVUVOQ0UgeworCWJhc2ljU2VydmljZQlCYXNpY1NlcnZpY2VDb2RlCU9QVElPTkFMLAorCXNzLVN0YXR1cwkJWzRdIFNTLVN0YXR1cwlPUFRJT05BTCwKKwlmb3J3YXJkZWRUb051bWJlcglbNV0gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCWZvcndhcmRlZFRvU3ViYWRkcmVzcwlbOF0gSVNETi1TdWJhZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCWZvcndhcmRpbmdPcHRpb25zCVs2XSBGb3J3YXJkaW5nT3B0aW9ucwlPUFRJT05BTCwKKwlub1JlcGx5Q29uZGl0aW9uVGltZQlbN10gTm9SZXBseUNvbmRpdGlvblRpbWUJT1BUSU9OQUwsCisJLi4uLAorCWxvbmdGb3J3YXJkZWRUb051bWJlcglbOV0gRlROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwgfQorCitTUy1TdGF0dXMgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisKKwktLSBiaXRzIDg3NjU6IDAwMDAgKHVudXNlZCkKKwktLSBiaXRzIDQzMjE6IFVzZWQgdG8gY29udmV5IHRoZSAiUCBiaXQiLCJSIGJpdCIsIkEgYml0IiBhbmQgIlEgYml0IiwKKwktLQkJICAgIHJlcHJlc2VudGluZyBzdXBwbGVtZW50YXJ5IHNlcnZpY2Ugc3RhdGUgaW5mb3JtYXRpb24KKwktLQkJICAgIGFzIGRlZmluZWQgaW4gVFMgM0dQUCBUUyAyMy4wMTEgWzIyXQorCisJLS0gYml0IDQ6ICJRIGJpdCIKKworCS0tIGJpdCAzOiAiUCBiaXQiCisKKwktLSBiaXQgMjogIlIgYml0IgorCisJLS0gYml0IDE6ICJBIGJpdCIKKworRm9yd2FyZGluZ09wdGlvbnMgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisKKwktLSBiaXQgODogbm90aWZpY2F0aW9uIHRvIGZvcndhcmRpbmcgcGFydHkKKwktLQkwICBubyBub3RpZmljYXRpb24KKwktLQkxICBub3RpZmljYXRpb24KKworCS0tIGJpdCA3OiByZWRpcmVjdGluZyBwcmVzZW50YXRpb24KKwktLQkwIG5vIHByZXNlbnRhdGlvbiAgCisJLS0JMSAgcHJlc2VudGF0aW9uCisKKwktLSBiaXQgNjogbm90aWZpY2F0aW9uIHRvIGNhbGxpbmcgcGFydHkKKwktLQkwICBubyBub3RpZmljYXRpb24KKwktLQkxICBub3RpZmljYXRpb24KKworCS0tIGJpdCA1OiAwICh1bnVzZWQpCisKKwktLSBiaXRzIDQzOiBmb3J3YXJkaW5nIHJlYXNvbgorCS0tCTAwICBtcyBub3QgcmVhY2hhYmxlCisJLS0JMDEgIG1zIGJ1c3kKKwktLQkxMCAgbm8gcmVwbHkKKwktLQkxMSAgdW5jb25kaXRpb25hbCB3aGVuIHVzZWQgaW4gYSBTUkkgUmVzdWx0LCAKKwktLQkgICAgb3IgY2FsbCBkZWZsZWN0aW9uIHdoZW4gdXNlZCBpbiBhIFJDSCBBcmd1bWVudAorCS0tIGJpdHMgMjE6IDAwICh1bnVzZWQpCisKK0NhbGxCYXJyaW5nSW5mbyA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVNTLUNvZGUJCU9QVElPTkFMLAorCWNhbGxCYXJyaW5nRmVhdHVyZUxpc3QJQ2FsbEJhcnJpbmdGZWF0dXJlTGlzdCwKKwkuLi59CisKK0NhbGxCYXJyaW5nRmVhdHVyZUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mQmFzaWNTZXJ2aWNlR3JvdXBzKSBPRgorCQkJCUNhbGxCYXJyaW5nRmVhdHVyZQorCitDYWxsQmFycmluZ0ZlYXR1cmUgOjo9IFNFUVVFTkNFIHsKKwliYXNpY1NlcnZpY2UJQmFzaWNTZXJ2aWNlQ29kZQlPUFRJT05BTCwKKwlzcy1TdGF0dXMJWzRdIFNTLVN0YXR1cwlPUFRJT05BTCwKKwkuLi59CisKK1NTLURhdGEgOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlTUy1Db2RlCQlPUFRJT05BTCwKKwlzcy1TdGF0dXMJCVs0XSBTUy1TdGF0dXMJT1BUSU9OQUwsCisJc3MtU3Vic2NyaXB0aW9uT3B0aW9uCVNTLVN1YnNjcmlwdGlvbk9wdGlvbglPUFRJT05BTCwKKwliYXNpY1NlcnZpY2VHcm91cExpc3QJQmFzaWNTZXJ2aWNlR3JvdXBMaXN0CU9QVElPTkFMLAorCS4uLiwKKwlkZWZhdWx0UHJpb3JpdHkJRU1MUFAtUHJpb3JpdHkJT1BUSU9OQUwsCisJbmJyVXNlcgkJWzVdIE1DLUJlYXJlcnMJT1BUSU9OQUwKKwl9CisKK1NTLVN1YnNjcmlwdGlvbk9wdGlvbiA6Oj0gQ0hPSUNFIHsKKwljbGlSZXN0cmljdGlvbk9wdGlvbglbMl0gQ2xpUmVzdHJpY3Rpb25PcHRpb24sCisJb3ZlcnJpZGVDYXRlZ29yeQlbMV0gT3ZlcnJpZGVDYXRlZ29yeX0KKworQ2xpUmVzdHJpY3Rpb25PcHRpb24gOjo9IEVOVU1FUkFURUQgeworCXBlcm1hbmVudCAgKDApLAorCXRlbXBvcmFyeURlZmF1bHRSZXN0cmljdGVkICAoMSksCisJdGVtcG9yYXJ5RGVmYXVsdEFsbG93ZWQgICgyKX0KKworT3ZlcnJpZGVDYXRlZ29yeSA6Oj0gRU5VTUVSQVRFRCB7CisJb3ZlcnJpZGVFbmFibGVkICAoMCksCisJb3ZlcnJpZGVEaXNhYmxlZCAgKDEpfQorCitTUy1Gb3JCUy1Db2RlIDo6PSBTRVFVRU5DRSB7CisJc3MtQ29kZQkJU1MtQ29kZSwKKwliYXNpY1NlcnZpY2UJQmFzaWNTZXJ2aWNlQ29kZQlPUFRJT05BTCwKKwkuLi4sCisJbG9uZ0ZUTi1TdXBwb3J0ZWQJWzRdCU5VTEwJCU9QVElPTkFMIH0KKworR2VuZXJpY1NlcnZpY2VJbmZvIDo6PSBTRVFVRU5DRSB7CisJc3MtU3RhdHVzCVNTLVN0YXR1cywKKwljbGlSZXN0cmljdGlvbk9wdGlvbglDbGlSZXN0cmljdGlvbk9wdGlvbglPUFRJT05BTCwKKwkuLi4sCisJbWF4aW11bUVudGl0bGVkUHJpb3JpdHkJWzBdIEVNTFBQLVByaW9yaXR5CU9QVElPTkFMLAorCWRlZmF1bHRQcmlvcml0eQlbMV0gRU1MUFAtUHJpb3JpdHkJT1BUSU9OQUwsCisJY2Nicy1GZWF0dXJlTGlzdAlbMl0gQ0NCUy1GZWF0dXJlTGlzdAlPUFRJT05BTCwKKwluYnJTQgkJWzNdIE1heE1DLUJlYXJlcnMJT1BUSU9OQUwsCisJbmJyVXNlcgkJWzRdIE1DLUJlYXJlcnMJT1BUSU9OQUwsCisJbmJyU04JCVs1XSBNQy1CZWFyZXJzCU9QVElPTkFMIH0KKworQ0NCUy1GZWF0dXJlTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZDQ0JTLVJlcXVlc3RzKSBPRgorCQkJCUNDQlMtRmVhdHVyZQorCittYXhOdW1PZkNDQlMtUmVxdWVzdHMgIElOVEVHRVIgOjo9IDUKKworQ0NCUy1GZWF0dXJlIDo6PSBTRVFVRU5DRSB7CisJY2Nicy1JbmRleAlbMF0gQ0NCUy1JbmRleAlPUFRJT05BTCwKKwliLXN1YnNjcmliZXJOdW1iZXIJWzFdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwliLXN1YnNjcmliZXJTdWJhZGRyZXNzCVsyXSBJU0ROLVN1YmFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJYmFzaWNTZXJ2aWNlR3JvdXAJWzNdIEJhc2ljU2VydmljZUNvZGUJT1BUSU9OQUwsCisJLi4ufQorCitDQ0JTLUluZGV4ICA6Oj0gSU5URUdFUiAoMS4ubWF4TnVtT2ZDQ0JTLVJlcXVlc3RzKQorCitJbnRlcnJvZ2F0ZVNTLVJlcyA6Oj0gQ0hPSUNFIHsKKwlzcy1TdGF0dXMJCVswXSBTUy1TdGF0dXMsCisJYmFzaWNTZXJ2aWNlR3JvdXBMaXN0CVsyXSBCYXNpY1NlcnZpY2VHcm91cExpc3QsCisJZm9yd2FyZGluZ0ZlYXR1cmVMaXN0CVszXSBGb3J3YXJkaW5nRmVhdHVyZUxpc3QsCisJZ2VuZXJpY1NlcnZpY2VJbmZvCVs0XQlHZW5lcmljU2VydmljZUluZm8gfQorCitVU1NELUFyZyA6Oj0gU0VRVUVOQ0UgeworCXVzc2QtRGF0YUNvZGluZ1NjaGVtZQlVU1NELURhdGFDb2RpbmdTY2hlbWUsCisJdXNzZC1TdHJpbmcJVVNTRC1TdHJpbmcsCisJLi4uICwKKwlhbGVydGluZ1BhdHRlcm4JQWxlcnRpbmdQYXR0ZXJuCU9QVElPTkFMLAorCW1zaXNkbgkJWzBdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCB9CisKK1VTU0QtUmVzIDo6PSBTRVFVRU5DRSB7CisJdXNzZC1EYXRhQ29kaW5nU2NoZW1lCVVTU0QtRGF0YUNvZGluZ1NjaGVtZSwKKwl1c3NkLVN0cmluZwlVU1NELVN0cmluZywKKwkuLi59CisKK1VTU0QtRGF0YUNvZGluZ1NjaGVtZSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBUaGUgc3RydWN0dXJlIG9mIHRoZSBVU1NELURhdGFDb2RpbmdTY2hlbWUgaXMgZGVmaW5lZCBieQorCS0tIHRoZSBDZWxsIEJyb2FkY2FzdCBEYXRhIENvZGluZyBTY2hlbWUgYXMgZGVzY3JpYmVkIGluCisJLS0gVFMgM0dQUCBUUyAyMy4wMzggWzI1XQorCitVU1NELVN0cmluZyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi5tYXhVU1NELVN0cmluZ0xlbmd0aCkpCisJLS0gVGhlIHN0cnVjdHVyZSBvZiB0aGUgY29udGVudHMgb2YgdGhlIFVTU0QtU3RyaW5nIGlzIGRlcGVuZGVudAorCS0tIG9uIHRoZSBVU1NELURhdGFDb2RpbmdTY2hlbWUgYXMgZGVzY3JpYmVkIGluIFRTIDNHUFAgVFMgMjMuMDM4IFsyNV0uCisKK21heFVTU0QtU3RyaW5nTGVuZ3RoICBJTlRFR0VSIDo6PSAxNjAKKworUGFzc3dvcmQgOjo9IE51bWVyaWNTdHJpbmcKKwkoRlJPTSAoIjAifCIxInwiMiJ8IjMifCI0InwiNSJ8IjYifCI3InwiOCJ8IjkiKSkKKwkoU0laRSAoNCkpCisKK0d1aWRhbmNlSW5mbyA6Oj0gRU5VTUVSQVRFRCB7CisJZW50ZXJQVyAgKDApLAorCWVudGVyTmV3UFcgICgxKSwKKwllbnRlck5ld1BXLUFnYWluICAoMil9CisJLS0gSG93IHRoaXMgaW5mb3JtYXRpb24gaXMgcmVhbGx5IGRlbGl2ZXJlZCB0byB0aGUgc3Vic2NyaWJlcgorCS0tIChkaXNwbGF5LCBhbm5vdW5jZW1lbnQsIC4uLikgaXMgbm90IHBhcnQgb2YgdGhpcworCS0tIHNwZWNpZmljYXRpb24uCisKK1NTLUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mU1MpIE9GCisJCQkJU1MtQ29kZQorCittYXhOdW1PZlNTICBJTlRFR0VSIDo6PSAzMAorCitTUy1JbmZvTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZTUykgT0YKKwkJCQlTUy1JbmZvCisKK0Jhc2ljU2VydmljZUdyb3VwTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZCYXNpY1NlcnZpY2VHcm91cHMpIE9GCisJCQkJQmFzaWNTZXJ2aWNlQ29kZQorCittYXhOdW1PZkJhc2ljU2VydmljZUdyb3VwcyAgSU5URUdFUiA6Oj0gMTMKKworU1MtSW52b2NhdGlvbk5vdGlmaWNhdGlvbkFyZyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQlbMF0gSU1TSSwKKwltc2lzZG4JCVsxXSBJU0ROLUFkZHJlc3NTdHJpbmcsCisJc3MtRXZlbnQJCVsyXSBTUy1Db2RlLAorCS0tIFRoZSBmb2xsb3dpbmcgU1MtQ29kZSB2YWx1ZXMgYXJlIGFsbG93ZWQgOgorCS0tIGVjdAkJU1MtQ29kZSA6Oj0gJzAwMTEwMDAxJ0IKKwktLSBtdWx0aVBUWQlTUy1Db2RlIDo6PSAnMDEwMTAwMDEnQgorCS0tIGNkCQlTUy1Db2RlIDo6PSAnMDAxMDAxMDAnQgorCS0tIGNjYnMJCVNTLUNvZGUgOjo9ICcwMTAwMDEwMCdCCisJc3MtRXZlbnRTcGVjaWZpY2F0aW9uCVszXSBTUy1FdmVudFNwZWNpZmljYXRpb24JT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs0XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWItc3Vic2NyaWJlck51bWJlcglbNV0JSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCWNjYnMtUmVxdWVzdFN0YXRlCVs2XQlDQ0JTLVJlcXVlc3RTdGF0ZQlPUFRJT05BTAorCX0KKworQ0NCUy1SZXF1ZXN0U3RhdGUgOjo9IEVOVU1FUkFURUQgeworCXJlcXVlc3QgIAkoMCksCisJcmVjYWxsICAJKDEpLAorCWFjdGl2ZSAgCSgyKSwKKwljb21wbGV0ZWQJKDMpLAorCXN1c3BlbmRlZAkoNCksCisJZnJvemVuCSg1KSwKKwlkZWxldGVkCSg2KQorCX0KKworU1MtSW52b2NhdGlvbk5vdGlmaWNhdGlvblJlcyA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uCisJfQorCitTUy1FdmVudFNwZWNpZmljYXRpb24gOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heEV2ZW50U3BlY2lmaWNhdGlvbikgT0YKKwkJCQlBZGRyZXNzU3RyaW5nCisKK21heEV2ZW50U3BlY2lmaWNhdGlvbiAgSU5URUdFUiA6Oj0gMgorCitSZWdpc3RlckNDLUVudHJ5QXJnIDo6PSBTRVFVRU5DRSB7CisJc3MtQ29kZQkJWzBdCVNTLUNvZGUsCisJY2Nicy1EYXRhCQlbMV0JQ0NCUy1EYXRhCU9QVElPTkFMLAorCS4uLn0KKworQ0NCUy1EYXRhIDo6PSBTRVFVRU5DRSB7CisJY2Nicy1GZWF0dXJlCVswXQlDQ0JTLUZlYXR1cmUsCisJdHJhbnNsYXRlZEItTnVtYmVyCVsxXQlJU0ROLUFkZHJlc3NTdHJpbmcsCisJc2VydmljZUluZGljYXRvcglbMl0JU2VydmljZUluZGljYXRvcglPUFRJT05BTCwKKwljYWxsSW5mbwkJWzNdCUV4dGVybmFsU2lnbmFsSW5mbywKKwluZXR3b3JrU2lnbmFsSW5mbwlbNF0JRXh0ZXJuYWxTaWduYWxJbmZvLAorCS4uLn0KKworU2VydmljZUluZGljYXRvciA6Oj0gQklUIFNUUklORyB7CisJY2xpci1pbnZva2VkICgwKSwKKwljYW1lbC1pbnZva2VkICgxKX0gKFNJWkUoMi4uMzIpKSAKKwktLSBleGNlcHRpb24gaGFuZGxpbmc6CisJLS0gYml0cyAyIHRvIDMxIHNoYWxsIGJlIGlnbm9yZWQgaWYgcmVjZWl2ZWQgYW5kIG5vdCB1bmRlcnN0b29kCisKK1JlZ2lzdGVyQ0MtRW50cnlSZXMgOjo9IFNFUVVFTkNFIHsKKwljY2JzLUZlYXR1cmUJWzBdIENDQlMtRmVhdHVyZQlPUFRJT05BTCwKKwkuLi59CisKK0VyYXNlQ0MtRW50cnlBcmcgOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlbMF0JU1MtQ29kZSwKKwljY2JzLUluZGV4CVsxXQlDQ0JTLUluZGV4CU9QVElPTkFMLAorCS4uLn0KKworRXJhc2VDQy1FbnRyeVJlcyA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVswXQlTUy1Db2RlLAorCXNzLVN0YXR1cwkJWzFdIFNTLVN0YXR1cwlPUFRJT05BTCwKKwkuLi59CisKK0VORAorCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1UUy1Db2RlLmFzbiBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLVRTLUNvZGUuYXNuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYzAwYmYKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1UUy1Db2RlLmFzbgpAQCAtMCwwICsxLDkyIEBACistLSAkSWQ6IE1BUC1UUy1Db2RlLmFzbiAyODE0OSAyMDA5LTA0LTI1IDE3OjQ1OjM0WiBldHhyYWIgJAorLS0gM0dQUCBUUyAyOS4wMDIgVjguOS4wICgyMDA5LTA0KSAKKy0tIDE3LjcuOQlUZWxlc2VydmljZSBDb2RlcworIAorTUFQLVRTLUNvZGUgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtVFMtQ29kZSAoMTkpIHZlcnNpb24xMSAoMTEpfQorCitERUZJTklUSU9OUworCis6Oj0KKworQkVHSU4KKworVGVsZXNlcnZpY2VDb2RlIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCS0tIFRoaXMgdHlwZSBpcyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgY29kZSBpZGVudGlmeWluZyBhIHNpbmdsZQorCS0tIHRlbGVzZXJ2aWNlLCBhIGdyb3VwIG9mIHRlbGVzZXJ2aWNlcywgb3IgYWxsIHRlbGVzZXJ2aWNlcy4gVGhlCisJLS0gc2VydmljZXMgYXJlIGRlZmluZWQgaW4gVFMgR1NNIDIyLjAwMyBbNF0uCisJLS0gVGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6CisKKwktLSBiaXRzIDg3NjU0MzIxOiBncm91cCAoYml0cyA4NzY1KSBhbmQgc3BlY2lmaWMgc2VydmljZQorCS0tIChiaXRzIDQzMjEpCisKK0V4dC1UZWxlc2VydmljZUNvZGUgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4uNSkpCisJLS0gVGhpcyB0eXBlIGlzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBjb2RlIGlkZW50aWZ5aW5nIGEgc2luZ2xlCisJLS0gdGVsZXNlcnZpY2UsIGEgZ3JvdXAgb2YgdGVsZXNlcnZpY2VzLCBvciBhbGwgdGVsZXNlcnZpY2VzLiBUaGUKKwktLSBzZXJ2aWNlcyBhcmUgZGVmaW5lZCBpbiBUUyBHU00gMjIuMDAzIFs0XS4KKwktLSBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlZmluZWQgYXMgZm9sbG93czoKKworCS0tIE9DVEVUIDE6CisJLS0gYml0cyA4NzY1NDMyMTogZ3JvdXAgKGJpdHMgODc2NSkgYW5kIHNwZWNpZmljIHNlcnZpY2UKKwktLSAoYml0cyA0MzIxKQorCisJLS0gT0NURVRTIDItNTogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuIElmIHJlY2VpdmVkIHRoZQorICAgIC0tIEV4dC1UZWxlc2VydmljZUNvZGUgc2hhbGwgYmUKKyAJLS0gdHJlYXRlZCBhY2NvcmRpbmcgdG8gdGhlIGV4Y2VwdGlvbiBoYW5kbGluZyBkZWZpbmVkIGZvciB0aGUKKwktLSBvcGVyYXRpb24gdGhhdCB1c2VzIHRoaXMgdHlwZS4KKworCS0tIEV4dC1UZWxlc2VydmljZUNvZGUgaW5jbHVkZXMgYWxsIHZhbHVlcyBkZWZpbmVkIGZvciBUZWxlc2VydmljZUNvZGUuCisKK2FsbFRlbGVzZXJ2aWNlcwlUZWxlc2VydmljZUNvZGUgOjo9ICcwMDAwMDAwMCdCCisKK2FsbFNwZWVjaFRyYW5zbWlzc2lvblNlcnZpY2VzCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzAwMDEwMDAwJ0IKK3RlbGVwaG9ueQkJCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzAwMDEwMDAxJ0IKK2VtZXJnZW5jeUNhbGxzCQlUZWxlc2VydmljZUNvZGUgOjo9ICcwMDAxMDAxMCdCCisKK2FsbFNob3J0TWVzc2FnZVNlcnZpY2VzCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzAwMTAwMDAwJ0IKK3Nob3J0TWVzc2FnZU1ULVBQCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzAwMTAwMDAxJ0IKK3Nob3J0TWVzc2FnZU1PLVBQCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzAwMTAwMDEwJ0IKKworYWxsRmFjc2ltaWxlVHJhbnNtaXNzaW9uU2VydmljZXMJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMDExMDAwMDAnQgorZmFjc2ltaWxlR3JvdXAzQW5kQWx0ZXJTcGVlY2gJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMDExMDAwMDEnQgorYXV0b21hdGljRmFjc2ltaWxlR3JvdXAzCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzAxMTAwMDEwJ0IKK2ZhY3NpbWlsZUdyb3VwNAlUZWxlc2VydmljZUNvZGUgOjo9ICcwMTEwMDAxMSdCCisKKy0tIFRoZSBmb2xsb3dpbmcgbm9uLWhpZXJhcmNoaWNhbCBDb21wb3VuZCBUZWxlc2VydmljZSBHcm91cHMKKy0tIGFyZSBkZWZpbmVkIGluIFRTIDNHUFAgVFMgMjIuMDMwOgorYWxsRGF0YVRlbGVzZXJ2aWNlcwlUZWxlc2VydmljZUNvZGUgOjo9ICcwMTExMDAwMCdCCisJLS0gY292ZXJzIFRlbGVzZXJ2aWNlIEdyb3VwcyAnYWxsRmFjc2ltaWxlVHJhbnNtaXNzaW9uU2VydmljZXMnCisJLS0gYW5kICdhbGxTaG9ydE1lc3NhZ2VTZXJ2aWNlcycKK2FsbFRlbGVzZXJ2aWNlcy1FeGVwdFNNUwlUZWxlc2VydmljZUNvZGUgOjo9ICcxMDAwMDAwMCdCCisJLS0gY292ZXJzIFRlbGVzZXJ2aWNlIEdyb3VwcyAnYWxsU3BlZWNoVHJhbnNtaXNzaW9uU2VydmljZXMnIGFuZAorCS0tICdhbGxGYWNzaW1pbGVUcmFuc21pc3Npb25TZXJ2aWNlcycKKy0tCistLSBDb21wb3VuZCBUZWxlc2VydmljZSBHcm91cCBDb2RlcyBhcmUgb25seSB1c2VkIGluIGNhbGwKKy0tIGluZGVwZW5kZW50IHN1cHBsZW1lbnRhcnkgc2VydmljZSBvcGVyYXRpb25zLCBpLmUuIHRoZXkKKy0tIGFyZSBub3QgdXNlZCBpbiBJbnNlcnRTdWJzY3JpYmVyRGF0YSBvciBpbgorLS0gRGVsZXRlU3Vic2NyaWJlckRhdGEgbWVzc2FnZXMuCisKK2FsbFZvaWNlR3JvdXBDYWxsU2VydmljZXMJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMTAwMTAwMDAnQgordm9pY2VHcm91cENhbGwJCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzEwMDEwMDAxJ0IKK3ZvaWNlQnJvYWRjYXN0Q2FsbAlUZWxlc2VydmljZUNvZGUgOjo9ICcxMDAxMDAxMCdCCisKK2FsbFBMTU4tc3BlY2lmaWNUUwlUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMDAwMCdCCitwbG1uLXNwZWNpZmljVFMtMQlUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMDAwMSdCCitwbG1uLXNwZWNpZmljVFMtMglUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMDAxMCdCCitwbG1uLXNwZWNpZmljVFMtMwlUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMDAxMSdCCitwbG1uLXNwZWNpZmljVFMtNAlUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMDEwMCdCCitwbG1uLXNwZWNpZmljVFMtNQlUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMDEwMSdCCitwbG1uLXNwZWNpZmljVFMtNglUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMDExMCdCCitwbG1uLXNwZWNpZmljVFMtNwlUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMDExMSdCCitwbG1uLXNwZWNpZmljVFMtOAlUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMTAwMCdCCitwbG1uLXNwZWNpZmljVFMtOQlUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMTAwMSdCCitwbG1uLXNwZWNpZmljVFMtQQlUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMTAxMCdCCitwbG1uLXNwZWNpZmljVFMtQglUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMTAxMSdCCitwbG1uLXNwZWNpZmljVFMtQwlUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMTEwMCdCCitwbG1uLXNwZWNpZmljVFMtRAlUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMTEwMSdCCitwbG1uLXNwZWNpZmljVFMtRQlUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMTExMCdCCitwbG1uLXNwZWNpZmljVFMtRglUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMTExMSdCCisKK0VORAorCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xL1JSTFAtQ29tcG9uZW50cy5hc24gYi9ycmxwLWVwaGVtZXJpcy9hc24xL1JSTFAtQ29tcG9uZW50cy5hc24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JhZGU2YQotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2FzbjEvUlJMUC1Db21wb25lbnRzLmFzbgpAQCAtMCwwICsxLDE0ODggQEAKKy0tIFJSTFAtQ29tcG9uZW50cy5hc24KKy0tICRJZCQKKy0tIFRha2VuIGZyb20gM0dQUCBUUyA0NC4wMzEgVjcuNC4wICgyMDA3LTAzKQorLS0gaHR0cDovL3d3dy4zZ3BwLm9yZy9mdHAvU3BlY3MvYXJjaGl2ZS80NF9zZXJpZXMvNDQuMDMxLzQ0MDMxLTc0MC56aXAvNDQwMzEtNzQwLmRvYworLS0KKy0tIDQgQ29tcG9uZW50cworLS0gNSBFbGVtZW50cyBvZiBDb21wb25lbnRzCistLQorCitSUkxQLUNvbXBvbmVudHMKKy0tIHsgUlJMUC1Db21wb25lbnRzIH0KKworREVGSU5JVElPTlMgQVVUT01BVElDIFRBR1MgOjo9CisKK0JFR0lOCisKK0lNUE9SVFMKKwlFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24sIFZlbG9jaXR5RXN0aW1hdGUKK0ZST00KKwlNQVAtTENTLURhdGFUeXBlcyB7CisJaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKwlnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUxDUy1EYXRhVHlwZXMgKDI1KSB2ZXJzaW9uMTEgKDExKX0KKworCUV4dGVuc2lvbkNvbnRhaW5lcgorRlJPTSBNQVAtRXh0ZW5zaW9uRGF0YVR5cGVzIHsKKwlpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorCWdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtRXh0ZW5zaW9uRGF0YVR5cGVzICgyMSkgdmVyc2lvbjExICgxMSl9Cis7CisKKworLS0gQWRkIGhlcmUgb3RoZXIgQVNOLjEgZGVmaW5pdGlvbnMgcHJlc2VudGVkIGJlbG93CistLSBpbiBjaGFwdGVycyA0IGFuZCA1LgorCistLSBNZWFzdXJlbWVudCBQb3NpdGlvbiByZXF1ZXN0IGNvbXBvbmVudAorTXNyUG9zaXRpb24tUmVxIDo6PSBTRVFVRU5DRSB7CisJcG9zaXRpb25JbnN0cnVjdAkJUG9zaXRpb25JbnN0cnVjdCwKKwlyZWZlcmVuY2VBc3Npc3REYXRhCQlSZWZlcmVuY2VBc3Npc3REYXRhCQlPUFRJT05BTCwKKwltc3JBc3Npc3REYXRhCQkJTXNyQXNzaXN0RGF0YQkJCU9QVElPTkFMLAorCXN5c3RlbUluZm9Bc3Npc3REYXRhCVN5c3RlbUluZm9Bc3Npc3REYXRhCU9QVElPTkFMLAorCWdwcy1Bc3Npc3REYXRhCQkJR1BTLUFzc2lzdERhdGEJCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJCUV4dGVuc2lvbkNvbnRhaW5lcgkJT1BUSU9OQUwsCisJLi4uLAorCS0tIFJlbGVhc2UgOTggZXh0ZW5zaW9uIGVsZW1lbnQKK3JlbDk4LU1zclBvc2l0aW9uLVJlcS1leHRlbnNpb24JCQlSZWw5OC1Nc3JQb3NpdGlvbi1SZXEtRXh0ZW5zaW9uCQkJT1BUSU9OQUwsCQorCS0tIFJlbGVhc2UgNSBleHRlbnNpb24gZWxlbWVudAorcmVsNS1Nc3JQb3NpdGlvbi1SZXEtZXh0ZW5zaW9uCQkJUmVsNS1Nc3JQb3NpdGlvbi1SZXEtRXh0ZW5zaW9uCQkJT1BUSU9OQUwsCisJLS0gUmVsZWFzZSA3IGV4dGVuc2lvbiBlbGVtZW50CityZWw3LU1zclBvc2l0aW9uLVJlcS1leHRlbnNpb24JCQlSZWw3LU1zclBvc2l0aW9uLVJlcS1FeHRlbnNpb24JCQlPUFRJT05BTAorfQorCistLSBNZWFzdXJlbWVudCBQb3NpdGlvbiByZXNwb25zZSBjb21wb25lbnQKK01zclBvc2l0aW9uLVJzcCA6Oj0gU0VRVUVOQ0UgeworCW11bHRpcGxlU2V0cwkJCU11bHRpcGxlU2V0cwkJCU9QVElPTkFMLAorCXJlZmVyZW5jZUlkZW50aXR5CQlSZWZlcmVuY2VJZGVudGl0eQkJT1BUSU9OQUwsCisJb3RkLU1lYXN1cmVJbmZvCQkJT1RELU1lYXN1cmVJbmZvCQkJT1BUSU9OQUwsCisJbG9jYXRpb25JbmZvCQkJTG9jYXRpb25JbmZvCQkJT1BUSU9OQUwsCisJZ3BzLU1lYXN1cmVJbmZvCQkJR1BTLU1lYXN1cmVJbmZvCQkJT1BUSU9OQUwsCisJbG9jYXRpb25FcnJvcgkJCUxvY2F0aW9uRXJyb3IJCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJCUV4dGVuc2lvbkNvbnRhaW5lcgkJT1BUSU9OQUwsCisJLi4uLAkKKwktLSBSZWxlYXNlIGV4dGVuc2lvbiBoZXJlCisJcmVsLTk4LU1zclBvc2l0aW9uLVJzcC1FeHRlbnNpb24JCQorCQkJCQkJCVJlbC05OC1Nc3JQb3NpdGlvbi1Sc3AtRXh0ZW5zaW9uCQlPUFRJT05BTCwKKwlyZWwtNS1Nc3JQb3NpdGlvbi1Sc3AtRXh0ZW5zaW9uCisJCQkJCQkJUmVsLTUtTXNyUG9zaXRpb24tUnNwLUV4dGVuc2lvbgkJT1BUSU9OQUwsCisJLS0gcmVsLTUtTXNyUG9zaXRpb24tUnNwLUV4dGVuc2lvbiBhbmQgb3RoZXIgcG9zc2libGUgZnV0dXJlIGV4dGVuc2lvbnMKKwktLSBhcmUgdGhlIG9ubHkgaW5mb3JtYXRpb24gZWxlbWVudHMgdGhhdCBtYXkgYmUgaW5jbHVkZWQgaW4gdGhlIDJuZAorCS0tIE1zclBvc2l0aW9uLVJzcCBjb21wb25lbnQgd2hlbiBSUkxQIHBzZXVkby1zZWdtZW50YXRpb24gaXMgdXNlZAorCXJlbC03LU1zclBvc2l0aW9uLVJzcC1FeHRlbnNpb24KKwkJCQkJCQlSZWwtNy1Nc3JQb3NpdGlvbi1Sc3AtRXh0ZW5zaW9uCQlPUFRJT05BTAorfQorCistLSBBc3Npc3RhbmNlIERhdGEgY29tcG9uZW50CitBc3Npc3RhbmNlRGF0YSA6Oj0gU0VRVUVOQ0UgeworCXJlZmVyZW5jZUFzc2lzdERhdGEJUmVmZXJlbmNlQXNzaXN0RGF0YQkJCU9QVElPTkFMLAorCW1zckFzc2lzdERhdGEJCQlNc3JBc3Npc3REYXRhCQkJT1BUSU9OQUwsCisJc3lzdGVtSW5mb0Fzc2lzdERhdGEJU3lzdGVtSW5mb0Fzc2lzdERhdGEJT1BUSU9OQUwsCisJZ3BzLUFzc2lzdERhdGEJCQlHUFMtQXNzaXN0RGF0YQkJCU9QVElPTkFMLAkKKwltb3JlQXNzRGF0YVRvQmVTZW50CQlNb3JlQXNzRGF0YVRvQmVTZW50CQlPUFRJT05BTCwJLS0gSWYgbm90IHByZXNlbnQsIGludGVycHJldCBhcyBvbmx5CisJCQkJCQkJCQkJCQkJCQkJLS0gQXNzaXN0YW5jZSBEYXRhIGNvbXBvbmVudCB1c2VkIHRvCisJCQkJCQkJCQkJCQkJCQkJLS0gZGVsaXZlciBlbnRpcmUgc2V0IG9mIGFzc2lzdGFuY2UKKwkJCQkJCQkJCQkJCQkJCQktLSBkYXRhLgorCWV4dGVuc2lvbkNvbnRhaW5lcgkJRXh0ZW5zaW9uQ29udGFpbmVyCQlPUFRJT05BTCwKKwkuLi4sCisJLS0gUmVsZWFzZSBleHRlbnNpb24gaGVyZQorCXJlbDk4LUFzc2lzdGFuY2VEYXRhLUV4dGVuc2lvbglSZWw5OC1Bc3Npc3RhbmNlRGF0YS1FeHRlbnNpb24JT1BUSU9OQUwsCisJcmVsNS1Bc3Npc3RhbmNlRGF0YS1FeHRlbnNpb24JUmVsNS1Bc3Npc3RhbmNlRGF0YS1FeHRlbnNpb24JT1BUSU9OQUwsCisgcmVsNy1Bc3Npc3RhbmNlRGF0YS1FeHRlbnNpb24gUmVsNy1Bc3Npc3RhbmNlRGF0YS1FeHRlbnNpb24gT1BUSU9OQUwJCit9CisKKy0tIFByb3RvY29sIEVycm9yIGNvbXBvbmVudAorUHJvdG9jb2xFcnJvciA6Oj0gU0VRVUVOQ0UgeworCWVycm9yQ2F1c2UJCQkJRXJyb3JDb2RlcywJCisJZXh0ZW5zaW9uQ29udGFpbmVyCQlFeHRlbnNpb25Db250YWluZXIJCU9QVElPTkFMLAorCS4uLiwKKwktLSBSZWxlYXNlIGV4dGVuc2lvbnMgaGVyZQorCXJlbC01LVByb3RvY29sRXJyb3ItRXh0ZW5zaW9uIFJlbC01LVByb3RvY29sRXJyb3ItRXh0ZW5zaW9uCQlPUFRJT05BTAorfQorCistLSBQb3NpdGlvbiBpbnN0cnVjdGlvbnMKK1Bvc2l0aW9uSW5zdHJ1Y3QgOjo9IFNFUVVFTkNFIHsKKwktLSBNZXRob2QgdHlwZQorCW1ldGhvZFR5cGUJCQkJTWV0aG9kVHlwZSwJCisJcG9zaXRpb25NZXRob2QJCQlQb3NpdGlvbk1ldGhvZCwKKwltZWFzdXJlUmVzcG9uc2VUaW1lCQlNZWFzdXJlUmVzcG9uc2VUaW1lLAkJCisJdXNlTXVsdGlwbGVTZXRzCQkJVXNlTXVsdGlwbGVTZXRzLAkJCisJZW52aXJvbm1lbnRDaGFyYWN0ZXIJRW52aXJvbm1lbnRDaGFyYWN0ZXIJT1BUSU9OQUwJCit9CisKKy0tCitNZXRob2RUeXBlIDo6PSBDSE9JQ0UgeworCW1zQXNzaXN0ZWQJCUFjY3VyYWN5T3B0LAktLSBhY2N1cmFjeSBpcyBvcHRpb25hbAorCW1zQmFzZWQJCQlBY2N1cmFjeSwJCS0tIGFjY3VyYWN5IGlzIG1hbmRhdG9yeQorCW1zQmFzZWRQcmVmCQlBY2N1cmFjeSwJCS0tIGFjY3VyYWN5IGlzIG1hbmRhdG9yeQorCW1zQXNzaXN0ZWRQcmVmCUFjY3VyYWN5IAkJLS0gYWNjdXJhY3kgaXMgbWFuZGF0b3J5Cit9CisKKy0tIEFjY3VyYWN5IG9mIHRoZSBsb2NhdGlvbiBlc3RpbWF0aW9uCitBY2N1cmFjeU9wdCA6Oj0gU0VRVUVOQ0UgeworCWFjY3VyYWN5CQlBY2N1cmFjeQlPUFRJT05BTAorfQorCistLSBUaGUgdmFsdWVzIG9mIHRoaXMgZmllbGQgYXJlIGRlZmluZWQgaW4gM0dQUCBUUyAyMy4wMzIgKFVuY2VydGFpbnR5IGNvZGUpCitBY2N1cmFjeSA6Oj0gSU5URUdFUiAoMC4uMTI3KQorCisKKy0tIFBvc2l0aW9uIE1ldGhvZAorUG9zaXRpb25NZXRob2QgOjo9IEVOVU1FUkFURUQgeworCWVvdGQgKDApLAorCWdwcyAoMSksCisJZ3BzT3JFT1REICgyKQorfQorCistLSBNZWFzdXJlbWVudCByZXF1ZXN0IHJlc3BvbnNlIHRpbWUKK01lYXN1cmVSZXNwb25zZVRpbWUgOjo9IElOVEVHRVIgKDAuLjcpCisKKy0tIHVzZU11bHRpcGxlIFNldHMsIEZGUyEKK1VzZU11bHRpcGxlU2V0cyA6Oj0gRU5VTUVSQVRFRCB7CisJbXVsdGlwbGVTZXRzICgwKSwJCS0tIG11bHRpcGxlIHNldHMgYXJlIGFsbG93ZWQKKwlvbmVTZXQgKDEpCQkJCS0tIHNlbmRpbmcgb2YgbXVsdGlwbGUgaXMgbm90IGFsbG93ZWQKK30KKworLS0gRW52aXJvbm1lbnQgY2hhcmFjdGVyaXphdGlvbgorRW52aXJvbm1lbnRDaGFyYWN0ZXIgOjo9IEVOVU1FUkFURUQgeworCWJhZEFyZWEgKDApLAkJLS0gYmFkIHVyYmFuIG9yIHN1YnVyYmFuLCBoZWF2eSBtdWx0aXBhdGggYW5kIE5MT1MKKwlub3RCYWRBcmVhICgxKSwJCS0tIGxpZ2h0IG11bHRpcGF0aCBhbmQgTkxPUworCW1peGVkQXJlYSAoMiksCQktLSBub3QgZGVmaW5lZCBvciBtaXhlZCBlbnZpcm9ubWVudAorCS4uLgorfQorCistLSBFLU9URCByZWZlcmVuY2UgQlRTIGZvciBBc3NpdGFuY2UgZGF0YSBJRQorUmVmZXJlbmNlQXNzaXN0RGF0YSA6Oj0gU0VRVUVOQ0UgeworCWJjY2hDYXJyaWVyCQlCQ0NIQ2FycmllciwJCQkJCQktLSBCQ0NIIGNhcnJpZXIKKwlic2ljCQkJQlNJQywJCQkJCQkJCS0tIEJTSUMKKwl0aW1lU2xvdFNjaGVtZQlUaW1lU2xvdFNjaGVtZSwgCQkJCQktLSBUaW1lc2xvdCBzY2hlbWUKKwlidHNQb3NpdGlvbgkJQlRTUG9zaXRpb24JCQlPUFRJT05BTAorfQorCistLSBlbGxpcHNvaWQgcG9pbnQgYW5kCistLSBlbGxpcHNvaWQgcG9pbnQgd2l0aCBhbHRpdHVkZSBhbmQgdW5jZXJ0YWludHkgZWxsaXBzb2lkIHNoYXBlcyBhcmUgc3VwcG9ydGVkCitCVFNQb3NpdGlvbiA6Oj0gRXh0LUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uCisKKy0tIFJGIGNoYW5uZWwgbnVtYmVyIG9mIEJDQ0gKK0JDQ0hDYXJyaWVyIDo6PSBJTlRFR0VSICgwLi4xMDIzKQorCistLSBCYXNlIHN0YXRpb24gSWRlbnRpdHkgQ29kZQorQlNJQyA6Oj0gSU5URUdFUiAoMC4uNjMpCisKKy0tIFRpbWVzbG90IHNjaGVtZQorVGltZVNsb3RTY2hlbWUgOjo9IEVOVU1FUkFURUQgeworCWVxdWFsTGVuZ3RoICgwKSwKKwl2YXJpb3VzTGVuZ3RoICgxKQorfQorCistLSBUaW1lIHNsb3QgKG1vZHVsbykKK01vZHVsb1RpbWVTbG90IDo6PSBJTlRFR0VSICgwLi4zKQorCistLSBFLU9URCBtZWFzdXJlbWVudCBhc3Npc3RhbmNlIGRhdGEgSUUKKy0tIFRoZSB0b3RhbCBudW1iZXIgb2YgbmVpZ2hib3JzIGluIHRoaXMgZWxlbWVudCAoTXNyQXNzaXN0RGF0YSkKKy0tIGFuZCBpbiBTeXN0ZW1JbmZvQXNzaXN0RGF0YSBlbGVtZW50IChwcmVzZW50ZWQgbmVpZ2hib3JzCistLSBjYW4gYmUgYXQgYSBtYXhpbXVtIDE1ISkKK01zckFzc2lzdERhdGEgOjo9IFNFUVVFTkNFIHsKKwkgbXNyQXNzaXN0TGlzdCBTZXFPZk1zckFzc2lzdEJUUworfQorU2VxT2ZNc3JBc3Npc3RCVFMgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjE1KSkgT0YgTXNyQXNzaXN0QlRTCisKK01zckFzc2lzdEJUUyA6Oj0gU0VRVUVOQ0UgeworCWJjY2hDYXJyaWVyCQkJQkNDSENhcnJpZXIsCQktLSBCQ0NIIGNhcnJpZXIKKwlic2ljCQkJCUJTSUMsCQkJCS0tIEJTSUMKKwltdWx0aUZyYW1lT2Zmc2V0CU11bHRpRnJhbWVPZmZzZXQsIAktLSBtdWx0aWZyYW1lIG9mZnNldAorCXRpbWVTbG90U2NoZW1lCQlUaW1lU2xvdFNjaGVtZSwJCS0tIFRpbWVzbG90IHNjaGVtZQorCXJvdWdoUlRECQkJUm91Z2hSVEQsCQkJLS0gcm91Z2ggUlREIHZhbHVlCisKKwktLSBMb2NhdGlvbiBDYWxjdWxhdGlvbiBBc3Npc3RhbmNlIGRhdGEgaXMgbW92ZWQgaGVyZQorCWNhbGNBc3Npc3RhbmNlQlRTCUNhbGNBc3Npc3RhbmNlQlRTCU9QVElPTkFMCit9CisKKy0tIE11bHRpZnJhbWUgb2Zmc2V0CitNdWx0aUZyYW1lT2Zmc2V0IDo6PSBJTlRFR0VSICgwLi41MSkKKy0tIFRoZSBNdWx0aWZyYW1lIE9mZnNldCB2YWx1ZSA1MSBzaGFsbCBub3QgYmUgZW5jb2RlZCBieSB0aGUgdHJhbnNtaXR0aW5nIGVudGl0eSBhbmQKKy0tIHNoYWxsIGJlIHRyZWF0ZWQgYnkgdGhlIHJlY2VpdmluZyBlbnRpdHkgYXMgMC4KKworLS0gUm91Z2ggUlREIHZhbHVlIGJldHdlZW4gb25lIGJhc2Ugc3RhdGlvbiBhbmQgcmVmZXJlbmNlIEJUUworUm91Z2hSVEQgOjo9IElOVEVHRVIgKDAuLjEyNTApCistLSBUaGUgUm91Z2hSVEQgdmFsdWUgMTI1MCBzaGFsbCBub3QgYmUgZW5jb2RlZCBieSB0aGUgdHJhbnNtaXR0aW5nIGVudGl0eSBhbmQgc2hhbGwKKy0tIGJlIHRyZWF0ZWQgYnkgdGhlIHJlY2VpdmluZyBlbnRpdHkgYXMgMC4KKworLS0gRS1PVEQgTWVhc3VyZW1lbnQgYXNzaXN0YW5jZSBkYXRhIGZvciBzeXN0ZW0gaW5mb3JtYXRpb24gTGlzdCBJRQorLS0gVGhlIHRvdGFsIG51bWJlciBvZiBiYXNlIHN0YXRpb25zIGluIHRoaXMgZWxlbWVudCAoU3lzdGVtSW5mb0Fzc2lzdERhdGEKKy0tIHByZXNlbnRlZCBuZWlnaGJvcnMpIGFuZCBpbiBNc3JBc3Npc3REYXRhIGVsZW1lbnQgY2FuIGJlIGF0IGEgbWF4aW11bSAxNS4KK1N5c3RlbUluZm9Bc3Npc3REYXRhIDo6PSBTRVFVRU5DRSB7CisJc3lzdGVtSW5mb0Fzc2lzdExpc3QgCVNlcU9mU3lzdGVtSW5mb0Fzc2lzdEJUUworfQorU2VxT2ZTeXN0ZW1JbmZvQXNzaXN0QlRTOjo9IFNFUVVFTkNFIChTSVpFKDEuLjMyKSkgT0YgU3lzdGVtSW5mb0Fzc2lzdEJUUworCistLSB3aGV0aGVyIG4udGggaXMgcHJlc2VudCBvciBub3QgPworU3lzdGVtSW5mb0Fzc2lzdEJUUyA6Oj0gQ0hPSUNFIHsKKwlub3RQcmVzZW50CQlOVUxMLAorCXByZXNlbnQJCQlBc3Npc3RCVFNEYXRhCit9CisKKy0tIEFjdHVhbCBhc3Npc3RhbmNlIGRhdGEgZm9yIHN5c3RlbSBpbmZvcm1hdGlvbiBiYXNlIHN0YXRpb24KK0Fzc2lzdEJUU0RhdGEgOjo9IFNFUVVFTkNFIHsKKwlic2ljCQkJCUJTSUMsCQkJCS0tIEJTSUMKKwltdWx0aUZyYW1lT2Zmc2V0CU11bHRpRnJhbWVPZmZzZXQsCS0tIG11bHRpZnJhbWUgb2Zmc2V0CisJdGltZVNsb3RTY2hlbWUJCVRpbWVTbG90U2NoZW1lLAkJLS0gVGltZXNsb3Qgc2NoZW1lCisJcm91Z2hSVEQJCQlSb3VnaFJURCwJCQktLSByb3VnaCBSVEQgdmFsdWUKKworCS0tIExvY2F0aW9uIENhbGN1bGF0aW9uIEFzc2lzdGFuY2UgZGF0YQorCWNhbGNBc3Npc3RhbmNlQlRTCUNhbGNBc3Npc3RhbmNlQlRTCU9QVElPTkFMCit9CisKKy0tIEUtT1REIExvY2F0aW9uIGNhbGN1bGF0aW9uIGFzc2lzdGFuY2UgZGF0YSwKKy0tIENhbGNBc3Npc3RhbmNlQlRTIGVsZW1lbnQgaXMgb3B0aW9uYWwgbm90IHN1YmZpZWxkcworQ2FsY0Fzc2lzdGFuY2VCVFMgOjo9IFNFUVVFTkNFIHsKKwlmaW5lUlRECQkJCUZpbmVSVEQsCQktLSBmaW5lIFJURCB2YWx1ZSBiZXR3ZWVuIGJhc2Ugc3RhdGlvbnMKKwlyZWZlcmVuY2VXR1M4NAkJUmVmZXJlbmNlV0dTODQJLS0gcmVmZXJlbmNlIGNvb3JkaW5hdGVzCit9CisKKy0tIENvb3JkaW5hdGVzIG9mIG5laWdoYm91ciBCVFMsIFdHUy04NCBlbGxpcHNvaWQKK1JlZmVyZW5jZVdHUzg0IDo6PSBTRVFVRU5DRSB7CisJcmVsYXRpdmVOb3J0aAlSZWxEaXN0YW5jZSwJCQkJLS0gcmVsYXRpdmUgZGlzdGFuY2UgKHNvdXRoIG5lZ2F0aXZlKQorCXJlbGF0aXZlRWFzdAlSZWxEaXN0YW5jZSwJCQkJLS0gcmVsYXRpdmUgZGlzdGFuY2UgKHdlc3QgbmVnYXRpdmUpCisJLS0gUmVsYXRpdmUgQWx0aXR1ZGUgaXMgbm90IGFsd2F5cyBrbm93bgorCXJlbGF0aXZlQWx0CQlSZWxhdGl2ZUFsdAkJT1BUSU9OQUwJLS0gcmVsYXRpdmUgYWx0aXR1ZGUKK30KKworLS0gRmluZSBSVEQgdmFsdWUgYmV0d2VlbiB0aGlzIEJUUyBhbmQgdGhlIHJlZmVyZW5jZSBCVFMJCitGaW5lUlREIDo6PSBJTlRFR0VSICgwLi4yNTUpCisKKy0tIFJlbGF0aXZlIG5vcnRoL2Vhc3QgZGlzdGFuY2UKK1JlbERpc3RhbmNlIDo6PSBJTlRFR0VSICgtMjAwMDAwLi4yMDAwMDApCisKKy0tIFJlbGF0aXZlIGFsdGl0dWRlCitSZWxhdGl2ZUFsdCA6Oj0gSU5URUdFUiAoLTQwMDAuLjQwMDApCisKKy0tIE1lYXN1cmUgcG9zaXRpb24gcmVzcG9uc2UgSUVzCistLSBSZWZlcmVuY2UgSWRlbnRpdHkKKy0tIE11bHRpcGxlIHNldHMKK011bHRpcGxlU2V0cyA6Oj0gU0VRVUVOQ0UgeworCS0tIG51bWJlciBvZiByZWZlcmVuY2Ugc2V0cworCW5ick9mU2V0cwkJCUlOVEVHRVIgKDIuLjMpLAkJCisKKwktLSBUaGlzIGZpZWxkIGFjdHVhbGx5IHRlbGxzIHRoZSBudW1iZXIgb2YgcmVmZXJlbmNlIEJUU3MKKwluYnJPZlJlZmVyZW5jZUJUU3MJSU5URUdFUiAoMS4uMyksCisKKwktLSBUaGlzIGZpZWxkIGlzIGNvbmRpdGlvbmFsIGFuZCBpbmNsdWRlZCBvcHRpb25hbGx5IG9ubHkgaWYKKwktLSBuYnJPZlNldHMgaXMgMyBhbmQgbnVtYmVyIG9mIHJlZmVyZW5jZSBCVFNzIGlzIDIuCisJcmVmZXJlbmNlUmVsYXRpb24JCVJlZmVyZW5jZVJlbGF0aW9uCQlPUFRJT05BTAorfQorCistLSBSZWxhdGlvbiBiZXR3ZWVuIHJlZmVuY2UgQlRTcyBhbmQgc2V0cworUmVmZXJlbmNlUmVsYXRpb24gOjo9IEVOVU1FUkFURUQgeworCXNlY29uZEJUU1RoaXJkU2V0ICgwKSwJLS0gMXN0IEJUUyByZWxhdGVkIHRvIDFzdCBhbmQgMm5kIHNldHMKKwlzZWNvbmRCVFNTZWNvbmRTZXQgKDEpLAktLSAxc3QgQlRTIHJlbGF0ZWQgdG8gMXN0IGFuZCAzcmQgc2V0cworCWZpcnN0QlRTRmlyc3RTZXQgKDIpCS0tIDFzdCBCVFMgcmVsYXRlZCB0byAxc3Qgc2V0Cit9CisKKy0tIFJlZmVyZW5jZSBCVFMgSWRlbnRpdHksIHRoaXMgZWxlbWVudCBjb250YWlucyBudW1iZXIgb2YKKy0tIEJUU3MgdG9sZCBuYnJPZlJlZmVyZW5jZUJUU3MgZmllbGQgaW4gTXVsdGlwbGUgc2V0cyBlbGVtZW50KQorUmVmZXJlbmNlSWRlbnRpdHkgOjo9IFNFUVVFTkNFIHsKKwktLSBSZWZlcmVuY2UgQlRTIGxpc3QKKwlyZWZCVFNMaXN0CQlTZXFPZlJlZmVyZW5jZUlkZW50aXR5VHlwZQorfQorU2VxT2ZSZWZlcmVuY2VJZGVudGl0eVR5cGUgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjMpKSBPRiBSZWZlcmVuY2VJZGVudGl0eVR5cGUKKworLS0gQ2VsbCBpZGVudGl0eQorUmVmZXJlbmNlSWRlbnRpdHlUeXBlIDo6PSBDSE9JQ0UgeworCWJzaWNBbmRDYXJyaWVyCUJTSUNBbmRDYXJyaWVyLAkJLS0gQlNJQyBhbmQgQ2FycmllcgorCWNpCQkJCUNlbGxJRCwJCQkJLS0gQ2VsbCBJRCwgTEFDIG5vdCBuZWVkZWQKKwlyZXF1ZXN0SW5kZXgJUmVxdWVzdEluZGV4LAkJLS0gSW5kZXggdG8gUmVxdWVzdGVkIE5laWdoYm9yIExpc3QKKwlzeXN0ZW1JbmZvSW5kZXgJU3lzdGVtSW5mb0luZGV4LAktLSBJbmRleCB0byBTeXN0ZW0gaW5mbyBsaXN0LCB0aGlzIHR5cGUgb2YgcmVmLiBpZGVudGl0eQorCQkJCQkJCQkJCS0tIHNoYWxsIG5vdCBiZSB1c2VkIGJ5IHRoZSBNUyB1bmxlc3MgaXQgaGFzIHJlY2VpdmVkCisJCQkJCQkJCQkJLS0gdGhlIFN5c3RlbUluZm9Bc3Npc3REYXRhIGZyb20gdGhlIFNNTEMgZm9yIHRoaXMgY2VsbC4KKwljaUFuZExBQwkJQ2VsbElEQW5kTEFDCQktLSBDSSBhbmQgTEFDCit9CisKK0JTSUNBbmRDYXJyaWVyIDo6PSBTRVFVRU5DRSB7CisJY2FycmllcglCQ0NIQ2FycmllciwKKwlic2ljCQlCU0lDCit9CisKK1JlcXVlc3RJbmRleCA6Oj0gSU5URUdFUiAoMS4uMTYpCisKK1N5c3RlbUluZm9JbmRleCA6Oj0gSU5URUdFUiAoMS4uMzIpCisKK0NlbGxJREFuZExBQyA6Oj0gU0VRVUVOQ0UgeworCXJlZmVyZW5jZUxBQwlMQUNJRCwJCQkJLS0gTG9jYXRpb24gYXJlYSBjb2RlCisJcmVmZXJlbmNlQ0kJCUNlbGxJRAkJCQktLSBDZWxsIGlkZW50aXR5Cit9CitDZWxsSUQgOjo9IElOVEVHRVIgKDAuLjY1NTM1KQorTEFDSUQgOjo9IElOVEVHRVIgKDAuLjY1NTM1KQorCistLSBPVEQtTWVhc3VyZUluZm8KK09URC1NZWFzdXJlSW5mbyA6Oj0gU0VRVUVOQ0UgeworCS0tIE1lYXN1cmVtZW50IGluZm8gZWxlbWVudHMsIE9URC1Nc3JFbGVtZW50IGlzIHJlcGVhdGVkIG51bWJlciBvZiB0aW1lcworCS0tIHRvbGQgaW4gbmJyT2ZSZWZlcmVuY2VCVFNzIGluIE11bHRpcGxlU2V0cywgZGVmYXVsdCB2YWx1ZSBpcyAxCisJb3RkTXNyRmlyc3RTZXRzCQlPVEQtTXNyRWxlbWVudEZpcnN0LAorCisJLS0gaWYgbW9yZSB0aGFuIG9uZSBzZXRzIGFyZSBwcmVzZW50IHRoaXMgZWxlbWVudCBpcyByZXBlYXRlZAorCS0tIE51bWJlck9mU2V0cyAtIDEgKC0xID0gZmlyc3Qgc2V0KQorCW90ZE1zclJlc3RTZXRzCQlTZXFPZk9URC1Nc3JFbGVtZW50UmVzdAkJT1BUSU9OQUwKK30KKworU2VxT2ZPVEQtTXNyRWxlbWVudFJlc3QgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjIpKSBPRiBPVEQtTXNyRWxlbWVudFJlc3QKKworLS0gT1REIG1lYXN1cmVudCBpbmZvcm1hdGlvbiBmb3IgMSBzZXQKK09URC1Nc3JFbGVtZW50Rmlyc3QgOjo9IFNFUVVFTkNFIHsKKwlyZWZGcmFtZU51bWJlcgkJCUlOVEVHRVIgKDAuLjQyNDMxKSwgCQkJCS0tIEZyYW1lIG51bWJlciBtb2R1bG8gNDI0MzIKKwlyZWZlcmVuY2VUaW1lU2xvdAkJTW9kdWxvVGltZVNsb3QsCisJdG9hTWVhc3VyZW1lbnRzT2ZSZWYJVE9BLU1lYXN1cmVtZW50c09mUmVmCU9QVElPTkFMLAorCXN0ZFJlc29sdXRpb24JCQlTdGRSZXNvbHV0aW9uLAorCXRhQ29ycmVjdGlvbgkJCUlOVEVHRVIgKDAuLjk2MCkJCU9QVElPTkFMLAktLSBUQSBjb3JyZWN0aW9uCisKKwktLSBtZWFzdXJlZCBuZWlnaGJvcnMgaW4gT1REIG1lYXN1cmVtZW50cworCW90ZC1GaXJzdFNldE1zcnMgCQlTZXFPZk9URC1GaXJzdFNldE1zcnMgCU9QVElPTkFMCit9CitTZXFPZk9URC1GaXJzdFNldE1zcnMgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjEwKSkgT0YgT1RELUZpcnN0U2V0TXNycworCistLSBPVEQgbWVhc3VyZW50IGluZm9ybWF0aW9uIDIgYW5kIDMgc2V0cyBpZiBleGlzdAorT1RELU1zckVsZW1lbnRSZXN0IDo6PSBTRVFVRU5DRSB7CisJcmVmRnJhbWVOdW1iZXIJCQlJTlRFR0VSICgwLi40MjQzMSksIAkJCQkJLS0gRnJhbWUgbnVtYmVyIG1vZHVsbyA0MjQzMgorCXJlZmVyZW5jZVRpbWVTbG90CQlNb2R1bG9UaW1lU2xvdCwKKwl0b2FNZWFzdXJlbWVudHNPZlJlZglUT0EtTWVhc3VyZW1lbnRzT2ZSZWYJCU9QVElPTkFMLAorCXN0ZFJlc29sdXRpb24JCQlTdGRSZXNvbHV0aW9uLAorCXRhQ29ycmVjdGlvbgkJCUlOVEVHRVIgKDAuLjk2MCkJCQlPUFRJT05BTCwJLS0gVEEgY29ycmVjdGlvbgorCisJLS0gbWVhc3VyZWQgbmVpZ2hib3JzIGluIE9URCBtZWFzdXJlbWVudHMKKwlvdGQtTXNyc09mT3RoZXJTZXRzIAlTZXFPZk9URC1Nc3JzT2ZPdGhlclNldHMJT1BUSU9OQUwKK30KK1NlcU9mT1RELU1zcnNPZk90aGVyU2V0cyA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMTApKSBPRiBPVEQtTXNyc09mT3RoZXJTZXRzCisKKy0tIFN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgVE9BIG1lYXN1cmVtZW50cyBmcm9tIHRoZSByZWZlcmVuY2UgQlRTCitUT0EtTWVhc3VyZW1lbnRzT2ZSZWYgOjo9IFNFUVVFTkNFIHsKKwlyZWZRdWFsaXR5CQkJUmVmUXVhbGl0eSwKKwludW1PZk1lYXN1cmVtZW50cwlOdW1PZk1lYXN1cmVtZW50cworfQorCitSZWZRdWFsaXR5IDo6PSBJTlRFR0VSICgwLi4zMSkJCQktLSBTdCBEZXYgb2YgVE9BIG9mIHJlZmVyZW5jZSBhcyBkZWZpbmVkIGluIGFubmV4CitOdW1PZk1lYXN1cmVtZW50cyA6Oj0gSU5URUdFUiAoMC4uNykJLS0gTm8uIG9mIG1lYXN1cmVtZW50cyBmb3IgUmVmUXVhbGl0eSBhcyBkZWZpbmVkIGluIGFubmV4CitTdGRSZXNvbHV0aW9uIDo6PSBJTlRFR0VSICgwLi4zKQkJLS0gVmFsdWVzIG9mIHJlc29sdXRpb24gYXJlIGRlZmluZWQgaW4gYW5uZXgKKworT1RELUZpcnN0U2V0TXNycyA6Oj0gT1RELU1lYXN1cmVtZW50V2l0aElECisKKy0tIE5laWdoYm91ciBpbmZvIGluIE9URCBtZWFzdXJlbWVudHMgMC0xMCB0aW1lcyBpbiBURCBtZWFzdXJlbWVudCBpbmZvCitPVEQtTXNyc09mT3RoZXJTZXRzIDo6PSBDSE9JQ0UgeworCWlkZW50aXR5Tm90UHJlc2VudAlPVEQtTWVhc3VyZW1lbnQsCQorCWlkZW50aXR5UHJlc2VudAkJT1RELU1lYXN1cmVtZW50V2l0aElECit9CisKKy0tIEZvciB0aGlzIE9URCBtZWFzdXJlbWVudCBpZGVudGl0eSBpcyBzYW1lIGFzIHRoZSBpZGVudGl0eSBvZiBCVFMKKy0tIGluIHRoZSBmaXJzdCBzZXQgd2l0aCBzYW1lIHNlcXVlbmNlIG51bWJlcgorT1RELU1lYXN1cmVtZW50IDo6PSBTRVFVRU5DRSB7CisJbmJvclRpbWVTbG90CU1vZHVsb1RpbWVTbG90LAorCWVvdGRRdWFsaXR5CQlFT1REUXVhbGl0eSwKKwlvdGRWYWx1ZQkJT1REVmFsdWUKK30KKworLS0gVGhpcyBtZWFzdXJlbWVudCBjb250YWlucyB0aGUgQlRTIGlkZW50aXR5IGFuZCBtZWFzdXJlbWVudAorT1RELU1lYXN1cmVtZW50V2l0aElEIDo6PVNFUVVFTkNFIHsKKwluZWlnaGJvcklkZW50aXR5CU5laWdoYm9ySWRlbnRpdHksCisJbmJvclRpbWVTbG90CQlNb2R1bG9UaW1lU2xvdCwKKwllb3RkUXVhbGl0eQkJCUVPVERRdWFsaXR5LAorCW90ZFZhbHVlCQkJT1REVmFsdWUKK30KKworRU9URFF1YWxpdHkgOjo9IFNFUVVFTkNFIHsKKwluYnJPZk1lYXN1cmVtZW50cwlJTlRFR0VSCSgwLi43KSwKKwlzdGRPZkVPVEQJCQlJTlRFR0VSICgwLi4zMSkKK30KKworTmVpZ2hib3JJZGVudGl0eSA6Oj0gQ0hPSUNFIHsKKwlic2ljQW5kQ2FycmllcgkJQlNJQ0FuZENhcnJpZXIsCQktLSBCU0lDIGFuZCBDYXJyaWVyCisJY2kJCQkJCUNlbGxJRCwJCQkJLS0gQ2VsbCBJRCwgTEFDIG5vdCBuZWVkZWQKKwltdWx0aUZyYW1lQ2FycmllcglNdWx0aUZyYW1lQ2FycmllciwgCS0tIE11bHRpRnJhbWVPZmZlc3QgYW5kIEJTSUMKKwlyZXF1ZXN0SW5kZXgJCVJlcXVlc3RJbmRleCwJCS0tIEluZGV4IHRvIFJlcXVlc3RlZCBOZWlnaGJvciBMaXN0CisJc3lzdGVtSW5mb0luZGV4CQlTeXN0ZW1JbmZvSW5kZXgsCS0tIEluZGV4IHRvIFN5c3RlbSBpbmZvIGxpc3QsIHRoaXMgdHlwZSBvZiBuZWlnaGJvdXIKKwkJCQkJCQkJCQkJLS0gaWRlbnRpdHkgc2hhbGwgbm90IGJlIHVzZWQgYnkgdGhlIE1TIHVubGVzcyBpdCBoYXMKKwkJCQkJCQkJCQkJLS0gcmVjZWl2ZWQgdGhlIFN5c3RlbUluZm9Bc3Npc3REYXRhIGZyb20gdGhlIFNNTEMgZm9yCisJCQkJCQkJCQkJCS0tIHRoaXMgY2VsbC4KKwljaUFuZExBQwkJCUNlbGxJREFuZExBQwkJLS0gQ0kgYW5kIExBQworfQorCistLSBNdWx0aWZyYW1lIGFuZCBjYXJyaWVyCitNdWx0aUZyYW1lQ2FycmllciA6Oj0gU0VRVUVOQ0UgeworCWJjY2hDYXJyaWVyCQkJQkNDSENhcnJpZXIsCisJbXVsdGlGcmFtZU9mZnNldAlNdWx0aUZyYW1lT2Zmc2V0Cit9CisKKy0tIE9URCBtZWFzdXJlbWVudCB2YWx1ZSBmb3IgbmVpZ2hib3VyCitPVERWYWx1ZSA6Oj0gSU5URUdFUiAoMC4uMzk5OTkpCisKKy0tIExvY2F0aW9uIGluZm9ybWF0aW9uIElFCitMb2NhdGlvbkluZm8gOjo9IFNFUVVFTkNFIHsKKwlyZWZGcmFtZQkJSU5URUdFUiAoMC4uNjU1MzUpLAkJCS0tIFJlZmVyZW5jZSBGcmFtZSBudW1iZXIKKwktLSBJZiByZWZGcmFtZSBpcyB3aXRoaW4gKDQyNDMyLi42NTUzNSksIGl0IHNoYWxsIGJlIGlnbm9yZWQgYnkgdGhlIHJlY2VpdmVyCisJLS0gaW4gdGhhdCBjYXNlIHRoZSBNUyBzaG91bGQgcHJvdmlkZSBHUFMgVE9XIGlmIGF2YWlsYWJsZQorCWdwc1RPVwkJCUlOVEVHRVIgKDAuLjE0Mzk5OTk5KQlPUFRJT05BTCwJLS0gR1BTIFRPVworCWZpeFR5cGUJCQlGaXhUeXBlLAorCS0tIE5vdGUgdGhhdCBhcHBsaWNhYmxlIHJhbmdlIGZvciByZWZGcmFtZSBpcyAwIC0gNDI0MzEKKwktLSBQb3NzaWJsZSBzaGFwZXMgY2FycmllZCBpbiBwb3NFc3RpbWF0ZSBhcmUKKwktLSBlbGxpcHNvaWQgcG9pbnQsCisJLS0gZWxsaXBzb2lkIHBvaW50IHdpdGggdW5jZXJ0YWludHkgY2lyY2xlCisJLS0gZWxsaXBzb2lkIHBvaW50IHdpdGggdW5jZXJ0YWludHkgZWxsaXBzZQorCS0tIGVsbGlwc29pZCBwb2ludCB3aXRoIGFsdGl0dWRlIGFuZCB1bmNlcnRhaW50eSBlbGxpcHNvaWQKKwlwb3NFc3RpbWF0ZQkJRXh0LUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uCit9CisKK0ZpeFR5cGUgOjo9IElOVEVHRVIgeworCXR3b0RGaXggKDApLAorCXRocmVlREZpeCAoMSkKK30gKDAuLjEpCisKKy0tIEdQUy1NZWFzdXJlbWVudCBpbmZvcm1hdGlvbgorR1BTLU1lYXN1cmVJbmZvIDo6PSBTRVFVRU5DRSB7CisJLS0gTWVhc3VyZW1lbnQgaW5mbyBlbGVtZW50cworCS0tIHVzZXIgaGFzIHRvIG1ha2Ugc3VyZSB0aGF0IGluIHRoaXMgZWxlbWVudCBpcyBudW1iZXIgb2YgZWxlbWVudHMKKwktLSBkZWZpbmVkIGluIHJlZmVyZW5jZSBCVFMgaWRlbnRpdHkKKwlncHNNc3JTZXRMaXN0CVNlcU9mR1BTLU1zclNldEVsZW1lbnQJCit9CitTZXFPZkdQUy1Nc3JTZXRFbGVtZW50IDo6PSBTRVFVRU5DRSAoU0laRSgxLi4zKSkgT0YgR1BTLU1zclNldEVsZW1lbnQKKworLS0gT1REIG1lYXN1cmVudCBpbmZvcm1hdGlvbiAxLTMgdGltZXMgaW4gbWVzc2FnZQorR1BTLU1zclNldEVsZW1lbnQgOjo9IFNFUVVFTkNFIHsKKwlyZWZGcmFtZQkJSU5URUdFUiAoMC4uNjU1MzUpCU9QVElPTkFMLCAJLS0gUmVmZXJlbmNlIEZyYW1lIG51bWJlcgorCWdwc1RPVwkJCUdQU1RPVzI0YiwJCQkJCQktLSBHUFMgVE9XCisJLS0gTm90ZSB0aGF0IGFwcGxpY2FibGUgcmFuZ2UgZm9yIHJlZkZyYW1lIGlzIDAgLSA0MjQzMQorCistLU5fU0FUIGNhbiBiZSByZWFkIGZyb20gbnVtYmVyIG9mIGVsZW1lbnRzIG9mIGdwcy1tc3JMaXN0CisKKwlncHMtbXNyTGlzdAkJU2VxT2ZHUFMtTXNyRWxlbWVudAorfQorCistLSAyNCBiaXQgcHJlc2VudGF0aW9uIGZvciBHUFNUT1cKK0dQU1RPVzI0YiA6Oj0gSU5URUdFUiAoMC4uMTQzOTk5OTkpCisKKy0tIG1lYXN1cmVkIGVsZW1lbnRzIGluIG1lYXN1cmVtZW50IHBhcmFtZXRlcnMgZmllbGQKK1NlcU9mR1BTLU1zckVsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjE2KSkgT0YgR1BTLU1zckVsZW1lbnQKKworR1BTLU1zckVsZW1lbnQgOjo9IFNFUVVFTkNFIHsKKwlzYXRlbGxpdGVJRAkJU2F0ZWxsaXRlSUQsCQkJCS0tIFNhdGVsbGl0ZSBpZGVudGlmaWVyCisJY05vCQkJCUlOVEVHRVIgKDAuLjYzKSwJCQktLSBjYXJyaWVyIG5vaXNlIHJhdGlvCisJZG9wcGxlcgkJCUlOVEVHRVIgKC0zMjc2OC4uMzI3NjcpLCAJLS0gZG9wcGxlciwgbXVsbHRpcGx5IGJ5IDAuMgorCXdob2xlQ2hpcHMJCUlOVEVHRVIgKDAuLjEwMjIpLAkJCS0tIHdob2xlIHZhbHVlIG9mIHRoZSBjb2RlIHBoYXNlIG1lYXN1cmVtZW50CisJZnJhY0NoaXBzCQlJTlRFR0VSICgwLi4xMDI0KSwJCQktLSBmcmFjdGlvbmFsIHZhbHVlIG9mIHRoZSBjb2RlIHBoYXNlIG1lYXN1cmVtZW50CisJCQkJCQkJCQkJCS0tIGEgdmFsdWUgb2YgMTAyNCBzaGFsbCBub3QgYmUgZW5jb2RlZCBieSB0aGUgc2VuZGVyCisJCQkJCQkJCQkJCS0tIHRoZSByZWNlaXZlciBzaGFsbCBjb25zaWRlciBhIHZhbHVlIG9mIDEwMjQgdG8gYmUKKwkJCQkJCQkJCQkJLS0gaW52YWxpZCBkYXRhCisJbXBhdGhJbmRpYwkJTXBhdGhJbmRpYywJCQkJCS0tIG11bHRpcGF0aCBpbmRpY2F0b3IKKwlwc2V1UmFuZ2VSTVNFcnIJSU5URUdFUiAoMC4uNjMpCQkJCS0tIGluZGV4CQkKK30KKworLS0gTXVsdGlwYXRoIGluZGljYXRvcgorTXBhdGhJbmRpYyA6Oj0gRU5VTUVSQVRFRCB7CisJbm90TWVhc3VyZWQgKDApLAorCWxvdyAoMSksCisJbWVkaXVtICgyKSwKKwloaWdoICgzKQorfQorCistLSBMb2NhdGlvbiBlcnJvciBJRQorTG9jYXRpb25FcnJvciA6Oj0gU0VRVUVOQ0UgeworCWxvY0Vycm9yUmVhc29uCQkJCUxvY0Vycm9yUmVhc29uLAorCWFkZGl0aW9uYWxBc3Npc3RhbmNlRGF0YQlBZGRpdGlvbmFsQXNzaXN0YW5jZURhdGEJT1BUSU9OQUwsCisJLi4uCit9CisKK0xvY0Vycm9yUmVhc29uIDo6PSBFTlVNRVJBVEVEIHsKKwl1bkRlZmluZWQgKDApLAkKKwlub3RFbm91Z2hCVFNzICgxKSwKKwlub3RFbm91Z2hTYXRzICgyKSwKKwllb3RkTG9jQ2FsQXNzRGF0YU1pc3NpbmcgKDMpLAorCWVvdGRBc3NEYXRhTWlzc2luZyAoNCksCisJZ3BzTG9jQ2FsQXNzRGF0YU1pc3NpbmcgKDUpLAorCWdwc0Fzc0RhdGFNaXNzaW5nICg2KSwKKwltZXRob2ROb3RTdXBwb3J0ZWQgKDcpLAorCW5vdFByb2Nlc3NlZCAoOCksCisJcmVmQlRTRm9yR1BTTm90U2VydmluZ0JUUyAoOSksCisJcmVmQlRTRm9yRU9URE5vdFNlcnZpbmdCVFMgKDEwKSwKKwkuLi4sCisJbm90RW5vdWdoR0FOU1NTYXRzICgxMSksCQorIGdhbnNzQXNzRGF0YU1pc3NpbmcgKDEyKSwKKwlyZWZCVFNGb3JHQU5TU05vdFNlcnZpbmdCVFMgKDEzKQorfQorCistLSBleGNlcHRpb24gaGFuZGxpbmc6CistLSBhbiB1bnJlY29nbml6ZWQgdmFsdWUgc2hhbGwgYmUgdHJlYXRlZCB0aGUgc2FtZSBhcyB2YWx1ZSAwCisKKworLS0gZGVmaW5lcyBhZGRpdGlvbmFsIGFzc2lzdGFuY2UgZGF0YSBuZWVkZWQgZm9yIGFueSBuZXcgbG9jYXRpb24gYXR0ZW1wdAorLS0gTVMgc2hhbGwgcmV0YWluIGFueSBhc3Npc3RhbmNlIGRhdGEgYWxyZWFkeSByZWNlaXZlZAorQWRkaXRpb25hbEFzc2lzdGFuY2VEYXRhIDo6PSBTRVFVRU5DRSB7CisJZ3BzQXNzaXN0YW5jZURhdGEJCUdQU0Fzc2lzdGFuY2VEYXRhCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJCUV4dGVuc2lvbkNvbnRhaW5lcgkJT1BUSU9OQUwsCisJLi4uLAorCWdhbnNzQXNzaXN0YW5jZURhdGEgR0FOU1NBc3Npc3RhbmNlRGF0YSBPUFRJT05BTAorfQorCitHUFNBc3Npc3RhbmNlRGF0YSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi5tYXhHUFNBc3Npc3RhbmNlRGF0YSkpCistLSBHUFNBc3Npc3RhbmNlRGF0YSBoYXMgaWRlbnRpY2FsIHN0cnVjdHVyZSBhbmQgZW5jb2RpbmcgdG8gb2N0ZXRzIDMgdG8gbiBvZiB0aGUKKy0tIEdQUyBBc3Npc3RhbmNlIERhdGEgSUUgaW4gM0dQUCBUUyA0OS4wMzEKKworbWF4R1BTQXNzaXN0YW5jZURhdGEJSU5URUdFUiA6Oj0gNDAKKworR0FOU1NBc3Npc3RhbmNlRGF0YSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi5tYXhHQU5TU0Fzc2lzdGFuY2VEYXRhKSkKKy0tIEdBTlNTQXNzaXN0YW5jZURhdGEgaGFzIGlkZW50aWNhbCBzdHJ1Y3R1cmUgYW5kIGVuY29kaW5nIHRvIG9jdGV0cyAzIHRvIG4gb2YgdGhlCistLSBHQU5TUyBBc3Npc3RhbmNlIERhdGEgSUUgaW4gM0dQUCBUUyA0OS4wMzEKKworbWF4R0FOU1NBc3Npc3RhbmNlRGF0YQlJTlRFR0VSIDo6PSA0MAorCisKKy0tIFByb3RvY29sIEVycm9yIENhdXNlcworRXJyb3JDb2RlcyA6Oj0gRU5VTUVSQVRFRCB7CisJdW5EZWZpbmVkICgwKSwKK21pc3NpbmdDb21wb25ldCAoMSksCQkJCitpbmNvcnJlY3REYXRhICgyKSwJCQkKK21pc3NpbmdJRW9yQ29tcG9uZW50RWxlbWVudCAoMyksCQkKK21lc3NhZ2VUb29TaG9ydCAoNCksCQkJCit1bmtub3dSZWZlcmVuY2VOdW1iZXIgKDUpLAkJCisuLi4KK30KKworLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0gYW4gdW5yZWNvZ25pemVkIHZhbHVlIHNoYWxsIGJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgdmFsdWUgMAorCistLSBHUFMgYXNzaXN0YW5jZSBkYXRhIElFCitHUFMtQXNzaXN0RGF0YSA6Oj0gU0VRVUVOQ0UgeworCWNvbnRyb2xIZWFkZXIJCUNvbnRyb2xIZWFkZXIKK30KKworLS0gTW9yZSBBc3Npc3RhbmNlIERhdGEgVG8gQmUgU2VudCBJRQorLS0gTW9yZSBBc3Npc3RhbmNlIERhdGEgQ29tcG9uZW50cyBPbiB0aGUgV2F5IGluZGljYXRpb24gZm9yIGRlbGl2ZXJ5IG9mIGFuIGVudGlyZSBzZXQgb2YgYXNzaXN0YW5jZQorLS0gZGF0YSBpbiBtdWx0aXBsZSBBc3Npc3RhbmNlIERhdGEgY29tcG9uZW50cy4KKworTW9yZUFzc0RhdGFUb0JlU2VudCA6Oj0gRU5VTUVSQVRFRCB7CisJbm9Nb3JlTWVzc2FnZXMgKDApLAkJCS0tIFRoaXMgaXMgdGhlIG9ubHkgb3IgbGFzdCBBc3Npc3RhbmNlIERhdGEgbWVzc2FnZSB1c2VkIHRvIGRlbGl2ZXIKKwkJCQkJCQkJLS0gdGhlIGVudGlyZSBzZXQgb2YgYXNzaXN0YW5jZSBkYXRhLgorCW1vcmVNZXNzYWdlc09uVGhlV2F5ICgxKQktLSBUaGUgU01MQyB3aWxsIHNlbmQgbW9yZSBBc3Npc3RhbmNlIERhdGEgbWVzc2FnZXMgb3IgYSBmaW5hbCBSUkxQCisJCQkJCQkJCS0tIE1lYXN1cmUgUG9zaXRpb24gUmVxdWVzdCBtZXNzYWdlIHRvIGRlbGl2ZXIgdGhlCisJCQkJCQkJCS0tIHRoZSBlbnRpcmUgc2V0IG9mIGFzc2lzdGFuY2UgZGF0YS4KK30KKworLS0gQ29udHJvbCBoZWFkZXIgb2YgdGhlIEdQUyBhc3Npc3RhbmNlIGRhdGEKK0NvbnRyb2xIZWFkZXIgOjo9IFNFUVVFTkNFIHsKKworCS0tIEZpZWxkIHR5cGUgUHJlc2VudCBpbmZvcm1hdGlvbgorCXJlZmVyZW5jZVRpbWUJCVJlZmVyZW5jZVRpbWUJCU9QVElPTkFMLAorCXJlZkxvY2F0aW9uCQkJUmVmTG9jYXRpb24JCQlPUFRJT05BTCwKKwlkZ3BzQ29ycmVjdGlvbnMJCURHUFNDb3JyZWN0aW9ucwkJT1BUSU9OQUwsCisJbmF2aWdhdGlvbk1vZGVsCQlOYXZpZ2F0aW9uTW9kZWwJCU9QVElPTkFMLAorCWlvbm9zcGhlcmljTW9kZWwJCUlvbm9zcGhlcmljTW9kZWwJCU9QVElPTkFMLAorCXV0Y01vZGVsCQkJVVRDTW9kZWwJCQlPUFRJT05BTCwKKwlhbG1hbmFjCQkJQWxtYW5hYwkJCU9QVElPTkFMLAorCWFjcXVpc0Fzc2lzdAkJQWNxdWlzQXNzaXN0CQlPUFRJT05BTCwKKwlyZWFsVGltZUludGVncml0eSBTZXFPZi1CYWRTYXRlbGxpdGVTZXQgT1BUSU9OQUwKK30KKworUmVmZXJlbmNlVGltZSA6Oj0gU0VRVUVOQ0UgeworCWdwc1RpbWUJCQkJR1BTVGltZSwKKwlnc21UaW1lCQkJCUdTTVRpbWUJCQkJT1BUSU9OQUwsCisJZ3BzVG93QXNzaXN0CQlHUFNUT1dBc3Npc3QJCU9QVElPTkFMCit9CisKKy0tIEdQUyBUaW1lIGluY2x1ZGVzIHdlZWsgbnVtYmVyIGFuZCB0aW1lLW9mLXdlZWsgKFRPVykKK0dQU1RpbWUgOjo9IFNFUVVFTkNFIHsKKwlncHNUT1cyM2IJCQlHUFNUT1cyM2IsCisJZ3BzV2VlawkJCQlHUFNXZWVrCit9CisKKy0tIEdQU1RPVywgcmFuZ2UgMC02MDQ3OTkuOTIsIHJlc29sdXRpb24gMC4wOCBzZWMsIDIzLWJpdCBwcmVzZW50YXRpb24KK0dQU1RPVzIzYiA6Oj0gSU5URUdFUiAoMC4uNzU1OTk5OSkKKworLS0gR1BTIHdlZWsgbnVtYmVyCitHUFNXZWVrIDo6PSBJTlRFR0VSICgwLi4xMDIzKQorCistLSBHUFNUT1dBc3Npc3QgY29uc2lzdHMgb2YgVExNIG1lc3NhZ2UsIEFudGktc3Bvb2YgZmxhZywgQWxlcnQgZmxhZywgYW5kIDIgcmVzZXJ2ZWQgYml0cyBpbiBUTE0gV29yZAorLS0gZm9yIGVhY2ggdmlzaWJsZSBzYXRlbGxpdGUuCistLSBOX1NBVCBjYW4gYmUgcmVhZCBmcm9tIG51bWJlciBvZiBlbGVtZW50cyBpbiBHUFNUT1dBc3Npc3QKK0dQU1RPV0Fzc2lzdCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMTIpKSBPRiBHUFNUT1dBc3Npc3RFbGVtZW50CisKK0dQU1RPV0Fzc2lzdEVsZW1lbnQgOjo9IFNFUVVFTkNFIHsKKwlzYXRlbGxpdGVJRAkJCVNhdGVsbGl0ZUlELAorCXRsbVdvcmQJCQkJVExNV29yZCwKKwlhbnRpU3Bvb2YJCQlBbnRpU3Bvb2ZGbGFnLAorCWFsZXJ0CQkJCUFsZXJ0RmxhZywKKwl0bG1Sc3ZkQml0cwkJCVRMTVJlc2VydmVkQml0cworfQorCistLSBUTE0gV29yZCwgMTQgYml0cworVExNV29yZCA6Oj0gSU5URUdFUiAoMC4uMTYzODMpCisKKy0tIEFudGktU3Bvb2YgZmxhZworQW50aVNwb29mRmxhZyA6Oj0gSU5URUdFUiAoMC4uMSkKKworLS0gQWxlcnQgZmxhZworQWxlcnRGbGFnIDo6PSBJTlRFR0VSICgwLi4xKQorCistLSBSZXNlcnZlZCBiaXRzIGluIFRMTSB3b3JkLCBNU0Igb2NjdXJzIGVhcmxpZXIgaW4gVExNIFdvcmQgdHJhbnNtaXR0ZWQgYnkgc2F0ZWxsaXRlCitUTE1SZXNlcnZlZEJpdHMgOjo9IElOVEVHRVIgKDAuLjMpCisKK0dTTVRpbWUgOjo9IFNFUVVFTkNFIHsKKwliY2NoQ2FycmllcgkJQkNDSENhcnJpZXIsCS0tIEJDQ0ggY2FycmllcgorCWJzaWMJCQlCU0lDLAkJCS0tIEJTSUMKKwlmcmFtZU51bWJlcgkJRnJhbWVOdW1iZXIsCisJdGltZVNsb3QJCVRpbWVTbG90LAorCWJpdE51bWJlcgkJQml0TnVtYmVyCit9CisKKy0tIEZyYW1lIG51bWJlcgorRnJhbWVOdW1iZXIgOjo9IElOVEVHRVIgKDAuLjIwOTcxNTEpCisKKy0tIFRpbWUgc2xvdCBudW1iZXIKK1RpbWVTbG90IDo6PSBJTlRFR0VSICgwLi43KQorCistLSBCaXQgbnVtYmVyCitCaXROdW1iZXIgOjo9IElOVEVHRVIgKDAuLjE1NikKKworCistLSBSZWZlcmVuY2UgTG9jYXRpb24gSUUKK1JlZkxvY2F0aW9uIDo6PSBTRVFVRU5DRSB7CisJdGhyZWVETG9jYXRpb24JCQlFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24KK30KKworLS0gREdQUyBDb3JyZWN0aW9ucyBJRQorREdQU0NvcnJlY3Rpb25zIDo6PSBTRVFVRU5DRSB7CisKKwlncHNUT1cJCUlOVEVHRVIgKDAuLjYwNDc5OSksCS0tIERHUFMgcmVmZXJlbmNlIHRpbWUKKwlzdGF0dXMJCUlOVEVHRVIgKDAuLjcpLAorCS0tIE5fU0FUIGNhbiBiZSByZWFkIGZyb20gbnVtYmVyIG9mIGVsZW1lbnRzIG9mIHNhdExpc3QKKwlzYXRMaXN0CQlTZXFPZlNhdEVsZW1lbnQgCQorfQorU2VxT2ZTYXRFbGVtZW50IDo6PSBTRVFVRU5DRSAoU0laRSAoMS4uMTYpKSBPRiBTYXRFbGVtZW50CisKKy0tIG51bWJlciBvZiBjb3JyZWN0aW9uIGZvciBzYXRlbGxpdGVzCitTYXRFbGVtZW50IDo6PSBTRVFVRU5DRSB7CisJc2F0ZWxsaXRlSUQJCVNhdGVsbGl0ZUlELAorCisKKy0tLSBTZXF1ZW5jZSBudW1iZXIgZm9yIGVwaGVtZXJpcworCWlvZGUgCQkJSU5URUdFUiAoMC4uMjM5KSwKKwktLSBVc2VyIERpZmZlcmVudGlhbCBSYW5nZSBFcnJvcgorCXVkcmUJCQlJTlRFR0VSICgwLi4zKSwJCQorCisJLS0gUHNldWRvIFJhbmdlIENvcnJlY3Rpb24sIHJhbmdlIGlzCisJLS0gLTY1NS4wNCAtICs2NTUuMDQsCisJcHNldWRvUmFuZ2VDb3IJSU5URUdFUiAoLTIwNDcuLjIwNDcpLCAJCisKKwktLSBQc2V1ZG8gUmFuZ2UgUmF0ZSBDb3JyZWN0aW9uLCByYW5nZSBpcworCS0tIC00LjA2NCAtICs0LjA2NCwKKwlyYW5nZVJhdGVDb3IJSU5URUdFUiAoLTEyNy4uMTI3KSwKKworLS0gRGVsdGEgUHNldWRvIFJhbmdlIENvcnJlY3Rpb24gMiAJCisJZGVsdGFQc2V1ZG9SYW5nZUNvcjIgCUlOVEVHRVIgKC0xMjcuLjEyNyksCS0tIFRoaXMgSUUgc2hhbGwgYmUgaWdub3JlZCBieSB0aGUgcmVjZWl2ZXIgYW5kCisJCQkJCQkJCQkJCQkJLS0gc2V0IHRvIHplcm8gYnkgdGhlIHNlbmRlcgorCS0tIERlbHRhIFBzZXVkbyBSYW5nZSBDb3JyZWN0aW9uIDIJCisJZGVsdGFSYW5nZVJhdGVDb3IyCQlJTlRFR0VSICgtNy4uNyksCQktLSBUaGlzIElFIHNoYWxsIGJlIGlnbm9yZWQgYnkgdGhlIHJlY2VpdmVyIGFuZAorCQkJCQkJCQkJCQkJCS0tIHNldCB0byB6ZXJvIGJ5IHRoZSBzZW5kZXIKKwktLSBEZWx0YSBQc2V1ZG8gUmFuZ2UgQ29ycmVjdGlvbiAzCisJZGVsdGFQc2V1ZG9SYW5nZUNvcjMgCUlOVEVHRVIgKC0xMjcuLjEyNyksCS0tIFRoaXMgSUUgc2hhbGwgYmUgaWdub3JlZCBieSB0aGUgcmVjZWl2ZXIgYW5kCisJCQkJCQkJCQkJCQkJLS0gc2V0IHRvIHplcm8gYnkgdGhlIHNlbmRlcgorCS0tIERlbHRhIFBzZXVkbyBSYW5nZSBDb3JyZWN0aW9uIDMKKwlkZWx0YVJhbmdlUmF0ZUNvcjMJCUlOVEVHRVIgKC03Li43KQkJCS0tIFRoaXMgSUUgc2hhbGwgYmUgaWdub3JlZCBieSB0aGUgcmVjZWl2ZXIgYW5kCisJCQkJCQkJCQkJCQkJLS0gc2V0IHRvIHplcm8gYnkgdGhlIHNlbmRlcgorfQorCitTYXRlbGxpdGVJRCA6Oj0gSU5URUdFUiAoMC4uNjMpCS0tIGlkZW50aWZpZXMgc2F0ZWxsaXRlCisKKy0tIE5hdmlnYXRpb24gTW9kZWwgSUUKK05hdmlnYXRpb25Nb2RlbCA6Oj0gU0VRVUVOQ0UgeworCW5hdk1vZGVsTGlzdAlTZXFPZk5hdk1vZGVsRWxlbWVudAkKK30KKworLS0gbmF2aWdhdGlvbiBtb2RlbCBzYXRlbGxpdGUgbGlzdAorU2VxT2ZOYXZNb2RlbEVsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjE2KSkgT0YgTmF2TW9kZWxFbGVtZW50CisKK05hdk1vZGVsRWxlbWVudCA6Oj0gU0VRVUVOQ0UgeworCXNhdGVsbGl0ZUlECQlTYXRlbGxpdGVJRCwJCQkKKwlzYXRTdGF0dXMJCVNhdFN0YXR1cwkJLS0gc2F0ZWxsaXRlIHN0YXR1cworfQorCistLSB0aGUgU3RhdHVzIG9mIHRoZSBuYXZpZ2F0aW9uIG1vZGVsCitTYXRTdGF0dXMgOjo9IENIT0lDRSB7CisJLS0gTmV3IHNhdGVsbGl0ZSwgbmV3IE5hdmlnYXRpb24gTW9kZWwKKwluZXdTYXRlbGxpdGVBbmRNb2RlbFVDCVVuY29tcHJlc3NlZEVwaGVtZXJpcywKKworCS0tIEV4aXN0aW5nIHNhdGVsbGl0ZSwgRXhpc3RpbmcgTmF2aWdhdGlvbiBNb2RlbAorCW9sZFNhdGVsbGl0ZUFuZE1vZGVsCU5VTEwsCisKKwktLSBFeGlzdGluZyBzYXRlbGxpdGUsIG5ldyBOYXZpZ2F0aW9uIE1vZGVsCisJbmV3TmF2aU1vZGVsVUMJCQlVbmNvbXByZXNzZWRFcGhlbWVyaXMsCisJLi4uCit9CisKKy0tIFVuY29tcHJlc3NlZCBzYXRlbGxpdGUgZW1oZW1lcmlzIGFuZCBjbG9jayBjb3JyZWN0aW9ucworVW5jb21wcmVzc2VkRXBoZW1lcmlzIDo6PSBTRVFVRU5DRSB7CisJZXBoZW1Db2RlT25MMglJTlRFR0VSICgwLi4zKSwKKwllcGhlbVVSQQkJSU5URUdFUiAoMC4uMTUpLAorCWVwaGVtU1ZoZWFsdGgJSU5URUdFUiAoMC4uNjMpLAorCWVwaGVtSU9EQwkJSU5URUdFUgkoMC4uMTAyMyksCisJZXBoZW1MMlBmbGFnCUlOVEVHRVIgKDAuLjEpLAorCWVwaGVtU0YxUnN2ZAlFcGhlbWVyaXNTdWJmcmFtZTFSZXNlcnZlZCwKKwllcGhlbVRnZAkJSU5URUdFUiAoLTEyOC4uMTI3KSwKKwllcGhlbVRvYwkJSU5URUdFUiAoMC4uMzc3OTkpLAorCWVwaGVtQUYyCQlJTlRFR0VSICgtMTI4Li4xMjcpLAorCWVwaGVtQUYxCQlJTlRFR0VSICgtMzI3NjguLjMyNzY3KSwKKwllcGhlbUFGMAkJSU5URUdFUiAoLTIwOTcxNTIuLjIwOTcxNTEpLAorCWVwaGVtQ3JzCQlJTlRFR0VSICgtMzI3NjguLjMyNzY3KSwKKwllcGhlbURlbHRhTgkJSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCisJZXBoZW1NMAkJCUlOVEVHRVIgKC0yMTQ3NDgzNjQ4Li4yMTQ3NDgzNjQ3KSwKKwllcGhlbUN1YwkJSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCisJZXBoZW1FCQkJSU5URUdFUiAoMC4uNDI5NDk2NzI5NSksCisJZXBoZW1DdXMJCUlOVEVHRVIgKC0zMjc2OC4uMzI3NjcpLAorCWVwaGVtQVBvd2VySGFsZglJTlRFR0VSICgwLi40Mjk0OTY3Mjk1KSwKKwllcGhlbVRvZQkJSU5URUdFUiAoMC4uMzc3OTkpLAorCWVwaGVtRml0RmxhZwlJTlRFR0VSICgwLi4xKSwKKwllcGhlbUFPREEJCUlOVEVHRVIgKDAuLjMxKSwKKwllcGhlbUNpYwkJSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCisJZXBoZW1PbWVnYUEwCUlOVEVHRVIgKC0yMTQ3NDgzNjQ4Li4yMTQ3NDgzNjQ3KSwKKwllcGhlbUNpcwkJSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCisJZXBoZW1JMAkJCUlOVEVHRVIgKC0yMTQ3NDgzNjQ4Li4yMTQ3NDgzNjQ3KSwKKwllcGhlbUNyYwkJSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCisJZXBoZW1XCQkJSU5URUdFUiAoLTIxNDc0ODM2NDguLjIxNDc0ODM2NDcpLAorCWVwaGVtT21lZ2FBRG90CUlOVEVHRVIgKC04Mzg4NjA4Li44Mzg4NjA3KSwKKwllcGhlbUlEb3QJCUlOVEVHRVIgKC04MTkyLi44MTkxKQorfQorCistLSBSZXNlcnZlZCBiaXRzIGluIHN1YmZyYW1lIDEgb2YgbmF2aWdhdGlvbiBtZXNzYWdlCitFcGhlbWVyaXNTdWJmcmFtZTFSZXNlcnZlZCA6Oj0gU0VRVUVOQ0UgeworCXJlc2VydmVkMQkJSU5URUdFUiAoMC4uODM4ODYwNyksCS0tIDIzLWJpdCBmaWVsZAorCXJlc2VydmVkMgkJSU5URUdFUiAoMC4uMTY3NzcyMTUpLAktLSAyNC1iaXQgZmllbGQKKwlyZXNlcnZlZDMJCUlOVEVHRVIgKDAuLjE2Nzc3MjE1KSwJLS0gMjQtYml0IGZpZWxkCisJcmVzZXJ2ZWQ0CQlJTlRFR0VSICgwLi42NTUzNSkJCS0tIDE2LWJpdCBmaWVsZAorfQorCistLSBJb25vc3BoZXJpYyBNb2RlbCBJRQorSW9ub3NwaGVyaWNNb2RlbCA6Oj0gU0VRVUVOQ0UgeworCWFsZmEwCQkJSU5URUdFUiAoLTEyOC4uMTI3KSwKKwlhbGZhMQkJCUlOVEVHRVIgKC0xMjguLjEyNyksCisJYWxmYTIJCQlJTlRFR0VSICgtMTI4Li4xMjcpLAorCWFsZmEzCQkJSU5URUdFUiAoLTEyOC4uMTI3KSwKKwliZXRhMAkJCUlOVEVHRVIgKC0xMjguLjEyNyksCisJYmV0YTEJCQlJTlRFR0VSICgtMTI4Li4xMjcpLAorCWJldGEyCQkJSU5URUdFUiAoLTEyOC4uMTI3KSwKKwliZXRhMwkJCUlOVEVHRVIgKC0xMjguLjEyNykKK30KKworLS0gVW5pdmVyc2FsIFRpbWUgQ29vcmRpbmF0ZSBNb2RlbAorVVRDTW9kZWwgOjo9IFNFUVVFTkNFIHsKKwl1dGNBMQkJCUlOVEVHRVIgKC04Mzg4NjA4Li44Mzg4NjA3KSwKKwl1dGNBMAkJCUlOVEVHRVIgKC0yMTQ3NDgzNjQ4Li4yMTQ3NDgzNjQ3KSwKKwl1dGNUb3QJCQlJTlRFR0VSICgwLi4yNTUpLAorCXV0Y1dOdAkJCUlOVEVHRVIgKDAuLjI1NSksCisJdXRjRGVsdGFUbHMJCUlOVEVHRVIgKC0xMjguLjEyNyksCisJdXRjV05sc2YJCUlOVEVHRVIgKDAuLjI1NSksCisJdXRjRE4JCQlJTlRFR0VSICgtMTI4Li4xMjcpLAorCXV0Y0RlbHRhVGxzZglJTlRFR0VSICgtMTI4Li4xMjcpCit9CisKKy0tIEFsbWFuYWMsIExvbmcgdGVybSBtb2RlbAorLS0gTk9URTogVGhlc2UgYXJlIHBhcmFtZXRlcnMgYXJlIHN1YnNldCBvZiB0aGUgZXBoZW1lcmlzCistLSBOT1RFOiBCdXQgd2l0aCByZWR1Y2VkIHJlc29sdXRpb24gYW5kIGFjY3VyYWN5CitBbG1hbmFjIDo6PSBTRVFVRU5DRSB7CisJYWxhbWFuYWNXTmEJCUlOVEVHRVIgKDAuLjI1NSksCS0tIE9uY2UgcGVyIG1lc3NhZ2UKKworCS0tIG5hdmlnYXRpb24gbW9kZWwgc2F0ZWxsaXRlIGxpc3QuCisJLS0gVGhlIHNpemUgb2YgYWxtYW5hY0xpc3QgaXMgYWN0dWFsbHkgTnVtc19TYXRzX1RvdGFsIGZpZWxkCisJYWxtYW5hY0xpc3QJCVNlcU9mQWxtYW5hY0VsZW1lbnQJCQorfQorU2VxT2ZBbG1hbmFjRWxlbWVudCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uNjQpKSBPRiBBbG1hbmFjRWxlbWVudAorCistLSBBbG1hbmFjIGluZm8gb25jZSBwZXIgc2F0ZWxsaXRlCitBbG1hbmFjRWxlbWVudCA6Oj0gU0VRVUVOQ0UgeworCXNhdGVsbGl0ZUlECQkJU2F0ZWxsaXRlSUQsCisJYWxtYW5hY0UJCQlJTlRFR0VSICgwLi42NTUzNSksCisJYWxhbWFuYWNUb2EJCQlJTlRFR0VSICgwLi4yNTUpLAorCWFsbWFuYWNLc2lpCQkJSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCisJYWxtYW5hY09tZWdhRG90CQlJTlRFR0VSICgtMzI3NjguLjMyNzY3KSwKKwlhbG1hbmFjU1ZoZWFsdGgJCUlOVEVHRVIgKDAuLjI1NSksCisJYWxtYW5hY0FQb3dlckhhbGYJSU5URUdFUiAoMC4uMTY3NzcyMTUpLAorCWFsbWFuYWNPbWVnYTAJCUlOVEVHRVIgKC04Mzg4NjA4Li44Mzg4NjA3KSwKKwlhbG1hbmFjVwkJCUlOVEVHRVIgKC04Mzg4NjA4Li44Mzg4NjA3KSwKKwlhbG1hbmFjTTAJCQlJTlRFR0VSICgtODM4ODYwOC4uODM4ODYwNyksCisJYWxtYW5hY0FGMAkJCUlOVEVHRVIgKC0xMDI0Li4xMDIzKSwKKwlhbG1hbmFjQUYxCQkJSU5URUdFUiAoLTEwMjQuLjEwMjMpCit9CisKKy0tIEFjcXVpc2l0aW9uIEFzc2lzdGFuY2UKK0FjcXVpc0Fzc2lzdCA6Oj0gU0VRVUVOQ0UgeworCisJLS0gTnVtYmVyIG9mIFNhdGVsbGl0ZXMgY2FuIGJlIHJlYWQgZnJvbSBhY3F1aXN0TGlzdAorCXRpbWVSZWxhdGlvbglUaW1lUmVsYXRpb24sCisKKwktLSBBY3F1aXNpdGlvbiBhc3Npc3RhbmNlIGxpc3QKKwktLSBUaGUgc2l6ZSBvZiBOdW1iZXIgb2YgU2F0ZWxsaXRlcyBpcyBhY3R1YWxseSBOdW1iZXIgb2YgU2F0ZWxsaXRlcyBmaWVsZAorCWFjcXVpc0xpc3QJCVNlcU9mQWNxdWlzRWxlbWVudAkJCit9CitTZXFPZkFjcXVpc0VsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjE2KSkgT0YgQWNxdWlzRWxlbWVudAorCistLSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gR1BTIHRpbWUgYW5kIGFpci1pbnRlcmZhY2UgdGltaW5nCitUaW1lUmVsYXRpb24gOjo9IFNFUVVFTkNFIHsKKwktLQorCWdwc1RPVwkJR1BTVE9XMjNiLAkJLS0gMjNiIHByZXNlbnRhdGlvbgorCWdzbVRpbWUJCUdTTVRpbWUJCU9QVElPTkFMCit9CisKKy0tIGRhdGEgb2NjdXJpbmcgcGVyIG51bWJlciBvZiBzYXRlbGxpdGVzCitBY3F1aXNFbGVtZW50IDo6PSBTRVFVRU5DRSB7CisJc3ZpZAkJCQkJU2F0ZWxsaXRlSUQsCisKKwktLSBEb3BwbGVyIDB0aCBvcmRlciB0ZXJtLAorCS0tIC01MTIwLjAgLSA1MTE3LjUgSHogKD0gLTIwNDggLSAyMDQ3IHdpdGggMi41IEh6IHJlc29sdXRpb24pCisJZG9wcGxlcjAJCQkJSU5URUdFUiAoLTIwNDguLjIwNDcpLAkKKwlhZGRpb25hbERvcHBsZXIJCQlBZGRpb25hbERvcHBsZXJGaWVsZHMJT1BUSU9OQUwsCisJY29kZVBoYXNlCQkJCUlOVEVHRVIgKDAuLjEwMjIpLAktLSBDb2RlIFBoYXNlCisJaW50Q29kZVBoYXNlCQkJSU5URUdFUiAoMC4uMTkpLAktLSBJbnRlZ2VyIENvZGUgUGhhc2UKKwlncHNCaXROdW1iZXIJCQlJTlRFR0VSICgwLi4zKSwgCS0tIEdQUyBiaXQgbnVtYmVyCisJY29kZVBoYXNlU2VhcmNoV2luZG93CUlOVEVHRVIgKDAuLjE1KSwJLS0gQ29kZSBQaGFzZSBTZWFyY2ggV2luZG93CisJYWRkaW9uYWxBbmdsZQkJCUFkZGlvbmFsQW5nbGVGaWVsZHMJCU9QVElPTkFMCit9CisKK0FkZGlvbmFsRG9wcGxlckZpZWxkcyA6Oj0gU0VRVUVOQ0UgeworCS0tIERvcHBsZXIgMXN0IG9yZGVyIHRlcm0sIC0xLjAgLSArMC41IEh6L3NlYworIC0tICg9IC00MiArICgwIHRvIDYzKSB3aXRoIDEvNDIgSHovc2VjLiByZXNvbHV0aW9uKQorCWRvcHBsZXIxCQkJCUlOVEVHRVIgKDAuLjYzKSwKKwlkb3BwbGVyVW5jZXJ0YWludHkJCUlOVEVHRVIgKDAuLjcpCisgLS0gYSBzZW5kZXIgc2hhbGwgbm90IGVuY29kZSBhbnkgRG9wcGxlclVuY2VydGFpbnR5IHZhbHVlIGluIHRoZSByYW5nZSA1IHRvIDcKKyAtLSBhIHJlY2VpdmVyIHNoYWxsIGlnbm9yZSBhbnkgdmFsdWUgYmV0d2VlbiA1IGFuZCA3LgorfQorCitBZGRpb25hbEFuZ2xlRmllbGRzCTo6PSBTRVFVRU5DRSB7CisJLS0gYXppbXV0aCBhbmdsZSwgMCAtIDM0OC43NSBkZWcgKD0gMCAtIDMxIHdpdGggMTEuMjUgZGVnIHJlc29sdXRpb24pCisJYXppbXV0aAkJCQkJSU5URUdFUiAoMC4uMzEpLAorCS0tIGVsZXZhdGlvbiBhbmdsZSwgMCAtIDc4Ljc1IGRlZyAoPSAwIC0gNyB3aXRoIDExLjI1IGRlZyByZXNvbHV0aW9uKQorCWVsZXZhdGlvbgkJCQlJTlRFR0VSICgwLi43KQorfQorCistLSBSZWFsLVRpbWUgSW50ZWdyaXR5CistLSBudW1iZXIgb2YgYmFkIHNhdGVsbGl0ZXMgY2FuIGJlIHJlYWQgZnJvbSB0aGlzIGVsZW1lbnQKK1NlcU9mLUJhZFNhdGVsbGl0ZVNldCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMTYpKSBPRiBTYXRlbGxpdGVJRAorCistLSBFeHRlbnNpb24gRWxlbWVudHMKKworLS0gUmVsZWFzZSA5OCBFeHRlbnNpb25zIGhlcmUKK1JlbDk4LU1zclBvc2l0aW9uLVJlcS1FeHRlbnNpb24gOjo9IFNFUVVFTkNFIHsKKwlyZWw5OC1FeHQtRXhwT1RECQkJUmVsOTgtRXh0LUV4cE9URAkJT1BUSU9OQUwsCS0tIEV4cGVjdGVkT1REIGV4dGVuc2lvbgorCS4uLiwgCisgZ3BzVGltZUFzc2lzdGFuY2VNZWFzdXJlbWVudFJlcXVlc3QgTlVMTCBPUFRJT05BTCwgCisgZ3BzUmVmZXJlbmNlVGltZVVuY2VydGFpbnR5IEdQU1JlZmVyZW5jZVRpbWVVbmNlcnRhaW50eSBPUFRJT05BTAorCistLSBGdXJ0aGVyIFI5OCBleHRlbnNpb25zIGhlcmUKK30KK1JlbDk4LUFzc2lzdGFuY2VEYXRhLUV4dGVuc2lvbiA6Oj0gU0VRVUVOQ0UgeworCXJlbDk4LUV4dC1FeHBPVEQJCQlSZWw5OC1FeHQtRXhwT1RECQlPUFRJT05BTCwJLS0gRXhwZWN0ZWRPVEQgZXh0ZW5zaW9uCisJLi4uLCAKKyBncHNUaW1lQXNzaXN0YW5jZU1lYXN1cmVtZW50UmVxdWVzdCBOVUxMIE9QVElPTkFMLAorIGdwc1JlZmVyZW5jZVRpbWVVbmNlcnRhaW50eSBHUFNSZWZlcmVuY2VUaW1lVW5jZXJ0YWludHkgT1BUSU9OQUwKKworLS0gRnVydGhlciBSOTggZXh0ZW5zaW9ucyBoZXJlCit9CisKKy0tIFJlbGVhc2UgOTggRXhwT1REIGV4dGVuc2lvbgorUmVsOTgtRXh0LUV4cE9URCA6Oj0gU0VRVUVOQ0UgeworLS0gSWYgTXNyQXNzaXN0QlRTIGlzIGluY2x1ZGVkIGluIG1lc3NhZ2UsIG1zckFzc2lzdERhdGEtUjk4LUV4cE9URCBzaGFsbCBiZSBpbmNsdWRlZC4KKwltc3JBc3Npc3REYXRhLVI5OC1FeHBPVEQJCQlNc3JBc3Npc3REYXRhLVI5OC1FeHBPVEQJCQlPUFRJT05BTCwKKworLS0gSWYgU3lzdGVtSW5mb0Fzc2lzdGFEYXRhIGlzIGluY2x1ZGVkIGluIG1lc3NhZ2UsIHN5c3RlbUluZm9Bc3Npc3REYXRhLVI5OC1FeHBPVEQgc2hhbGwgYmUKKy0tIGluY2x1ZGVkLgorCXN5c3RlbUluZm9Bc3Npc3REYXRhLVI5OC1FeHBPVEQJU3lzdGVtSW5mb0Fzc2lzdERhdGEtUjk4LUV4cE9URAlPUFRJT05BTAorfQorCistLSBNc3JBc3Npc3REYXRhIFI5OCBleHRlbnNpb24KK01zckFzc2lzdERhdGEtUjk4LUV4cE9URCA6Oj0gU0VRVUVOQ0UgeworCSBtc3JBc3Npc3RMaXN0LVI5OC1FeHBPVEQJCQkgU2VxT2ZNc3JBc3Npc3RCVFMtUjk4LUV4cE9URAorfQorCistLSBJbmRleGVzIGluIFNlcU9mTXNyQXNzaXN0QlRTLVI5OC1FeHBPVEQgcmVmZXIgdG8gU2VxT2ZNc3JBc3Npc3RCVFMKKy0tIElmIHRoZSBpbmRleCBleGNlZWRzIHRoZSBTZWdPZk1zckFzc2lzdEJUUyByYW5nZSBvciBpZiB0aGVyZSBpcyBvdGhlcgorLS0gaW5jb25zaXN0ZW5jaWVzIGJldHdlZW4gdGhlIEJUUyBpbmRpY2VzLCB0aGUgTVMgc2hhbGwgYXBwbHkgcHJvdG9jb2wKKy0tIGVycm9yIGNhdXNlIGluY29ycmVjdERhdGEKK1NlcU9mTXNyQXNzaXN0QlRTLVI5OC1FeHBPVEQgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjE1KSkgT0YgTXNyQXNzaXN0QlRTLVI5OC1FeHBPVEQKKworLS0gVGhpcyBlbGVtZW50IGNvbXBsZXRlcyBNc3JBc3Npc3RCVFMgSUUKK01zckFzc2lzdEJUUy1SOTgtRXhwT1REIDo6PSBTRVFVRU5DRSB7CisJZXhwZWN0ZWRPVEQJCQkJRXhwZWN0ZWRPVEQsCisJZXhwT1REVW5jZXJ0YWludHkJCUV4cE9URFVuY2VydGFpbnR5Cit9CisKKy0tIFN5c3RlbUluZm9Bc3Npc3REYXRhIFI5OCBleHRlbnNpb24KK1N5c3RlbUluZm9Bc3Npc3REYXRhLVI5OC1FeHBPVEQgOjo9IFNFUVVFTkNFIHsKKwlzeXN0ZW1JbmZvQXNzaXN0TGlzdFI5OC1FeHBPVEQgCVNlcU9mU3lzdGVtSW5mb0Fzc2lzdEJUUy1SOTgtRXhwT1RECit9CisKKy0tIFNlcU9mU3lzdGVtSW5mb0Fzc2lzdEJUUy1SOTgtRXhwT1REIGluZGV4IHJlZmVyIHRvIFNlcU9mU3lzdGVtSW5mb0Fzc2lzdEJUUworLS0gSWYgdGhlIGluZGV4IGV4Y2VlZHMgdGhlIFNlZ09mU3lzdGVtSW5mb0Fzc2lzdEJUUyByYW5nZSBvciBpZiB0aGVyZSBpcyBvdGhlcgorLS0gaW5jb25zaXN0ZW5jaWVzIGJldHdlZW4gdGhlIEJUUyBpbmRpY2VzLCB0aGUgTVMgc2hhbGwgYXBwbHkgcHJvdG9jb2wKKy0tIGVycm9yIGNhdXNlIGluY29ycmVjdERhdGEKK1NlcU9mU3lzdGVtSW5mb0Fzc2lzdEJUUy1SOTgtRXhwT1REIDo6PSBTRVFVRU5DRSAoU0laRSgxLi4zMikpIE9GIFN5c3RlbUluZm9Bc3Npc3RCVFMtUjk4LUV4cE9URAorCistLSB3aGV0aGVyIG4udGggaXMgcHJlc2VudCBvciBub3QgPworU3lzdGVtSW5mb0Fzc2lzdEJUUy1SOTgtRXhwT1REIDo6PSBDSE9JQ0UgeworCW5vdFByZXNlbnQJCU5VTEwsCisJcHJlc2VudAkJCUFzc2lzdEJUU0RhdGEtUjk4LUV4cE9URAorfQorCistLSBUaGlzIGVsZW1lbnQgY29tcGxldGVzIEFzc2lzdEJUU0RhdGEgSUUKK0Fzc2lzdEJUU0RhdGEtUjk4LUV4cE9URCA6Oj0gU0VRVUVOQ0UgeworCWV4cGVjdGVkT1RECQkJCUV4cGVjdGVkT1RELAorCWV4cE9URHVuY2VydGFpbnR5CQlFeHBPVERVbmNlcnRhaW50eQktLSBVbmNlcnRhaW50eSBvZiBleHBlY3RlZCBPVEQKK30KKworLS0gRXhwZWN0ZWQgT1REIHZhbHVlIGJldHdlZW4gbmJvciBiYXNlIHN0YXRpb24gYW5kIHJlZmVyZW5jZSBCVFMKKy0tIGF0IE1TJ3MgY3VycmVudCBlc3RpbWF0ZWQgbG9jYXRpb24uCitFeHBlY3RlZE9URCA6Oj0gSU5URUdFUiAoMC4uMTI1MCkKKy0tIFRoZSBFeHBlY3RlZE9URCB2YWx1ZSAxMjUwIHNoYWxsIG5vdCBiZSBlbmNvZGVkIGJ5IHRoZSB0cmFuc21pdHRpbmcgZW50aXR5IGFuZAorLS0gc2hhbGwgYmUgdHJlYXRlZCBieSB0aGUgcmVjZWl2aW5nIGVudGl0eSBhcyAwLgorLS0gVW5jZXJ0YWludHkgb2YgRXhwdGVjdGVkIE9URCBpbiBiaXRzCitFeHBPVERVbmNlcnRhaW50eSA6Oj0gSU5URUdFUigwLi43KQorCistLSBSZWxlYXNlIDk4IGV4dGVuc2lvbnMKKworR1BTUmVmZXJlbmNlVGltZVVuY2VydGFpbnR5IDo6PSBJTlRFR0VSICgwIC4uIDEyNykgLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAorCitHUFNUaW1lQXNzaXN0YW5jZU1lYXN1cmVtZW50cyA6Oj0gU0VRVUVOQ0UgeworIHJlZmVyZW5jZUZyYW1lTVNCIElOVEVHRVIgKDAgLi4gNjMpLCAtLSBNU0Igb2YgZnJhbWUgbnVtYmVyCisgZ3BzVG93U3VibXMgSU5URUdFUiAoMCAuLiA5OTk5KSBPUFRJT05BTCwgLS0gaW4gdW5pdHMgb2YgMTAwbnMsIGZvciBNUyBiYXNlZCBBR1BTCisgZGVsdGFUb3cgSU5URUdFUiAoMCAuLiAxMjcpIE9QVElPTkFMLCAtLSBmb3IgTVMgYXNzaXN0ZWQgQUdQUworIGdwc1JlZmVyZW5jZVRpbWVVbmNlcnRhaW50eSBHUFNSZWZlcmVuY2VUaW1lVW5jZXJ0YWludHkgT1BUSU9OQUwKK30KKworUmVsLTk4LU1zclBvc2l0aW9uLVJzcC1FeHRlbnNpb24gOjo9IFNFUVVFTkNFIHsKKworCS0tIEZpcnN0IGV4dGVuc2lvbiB0byBSZWxlYXNlIDk4CisJcmVsLTk4LUV4dC1NZWFzdXJlSW5mbwlTRVFVRU5DRSB7CisJCW90ZC1NZWFzdXJlSW5mby1SOTgtRXh0CU9URC1NZWFzdXJlSW5mby1SOTgtRXh0CQlPUFRJT05BTAorCX0sCisJLi4uLCAKKyB0aW1lQXNzaXN0YW5jZU1lYXN1cmVtZW50cyBHUFNUaW1lQXNzaXN0YW5jZU1lYXN1cmVtZW50cyBPUFRJT05BTCAKKyAtLSBGdXJ0aGVyIFI5OCBleHRlbnNpb25zIGhlcmUKK30KKworLS0gVGhpcyBpcyBhbiBhZGRpdGlvbiB0byBPVEQtTWVhc3VyZUluZm8gZWxlbWVudCBkZWZpbmVkIGluIG9yaWdpbmFsIG1lc3NhZ2UsCistLSBJZiBPVEQtTWVhc3VyZUluZm8gaXMgYWJzZW50LCBvciBpZiBvbmUgb3IgbW9yZSBPVEQtTXNyRWxlbWVudFJlc3QgYXJlIHByZXNlbnQKKy0tIE9URC1NZWFzdXJlSW5mby1SOTgtRXh0IHNoYWxsIGJlIGFic2VudC4KKy0tIE9URC1NZWFzdXJlSW5mby1SOTgtRXh0CitPVEQtTWVhc3VyZUluZm8tUjk4LUV4dCA6Oj0gU0VRVUVOQ0UgeworCS0tIE1lYXN1cmVtZW50IGluZm8gZWxlbWVudHMKKwlvdGRNc3JGaXJzdFNldHMtUjk4LUV4dAkJT1RELU1zckVsZW1lbnRGaXJzdC1SOTgtRXh0Cit9CisKKy0tIE9URCBtZWFzdXJlbWVudCBpbmZvcm1hdGlvbiBFeHQgZm9yIHRoZSBmaXJzdCBzZXQgb25seQorT1RELU1zckVsZW1lbnRGaXJzdC1SOTgtRXh0IDo6PSBTRVFVRU5DRSB7CisJLS0gYWRkaXRpb25hbCBtZWFzdXJlZCBuZWlnaGJvcnMgaW4gT1REIG1lYXN1cmVtZW50cworCW90ZC1GaXJzdFNldE1zcnMtUjk4LUV4dCAJU2VxT2ZPVEQtRmlyc3RTZXRNc3JzLVI5OC1FeHQgCU9QVElPTkFMCit9CitTZXFPZk9URC1GaXJzdFNldE1zcnMtUjk4LUV4dCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uNSkpIE9GIE9URC1GaXJzdFNldE1zcnMKKworUmVsLTUtTXNyUG9zaXRpb24tUnNwLUV4dGVuc2lvbiA6Oj0gU0VRVUVOQ0UgeworCisJZXh0ZW5kZWQtcmVmZXJlbmNlCUV4dGVuZGVkLXJlZmVyZW5jZSAJT1BUSU9OQUwsCisJLS0gVGhlIGV4dGVuZGVkLXJlZmVyZW5jZSBzaGFsbCBiZSBpbmNsdWRlZCBieSB0aGUgTVMgaWYgYW5kIG9ubHkgaWYgcHJldmlvdXNseQorCS0tIHJlY2VpdmVkIGZyb20gdGhlIFNNTEMgaW4gYSBNZWFzdXJlIFBvc2l0aW9uIFJlcXVlc3QuIFdoZW4gaW5jbHVkZWQsIHRoZSB2YWx1ZSBzZW50CisJLS0gYnkgdGhlIE1TIHNoYWxsIGVxdWFsIHRoZSB2YWx1ZSByZWNlaXZlZCBmcm9tIHRoZSBTTUxDLgorCisJLS0gZXh0ZW5zaW9uIHRvIFJlbGVhc2UgNSwgZm9yIFJSTFAgcHNldWRvLXNlZ21lbnRhdGlvbiBoZXJlCisJb3RkLU1lYXN1cmVJbmZvLTUtRXh0CU9URC1NZWFzdXJlSW5mby01LUV4dAlPUFRJT05BTCwKKwl1bFBzZXVkb1NlZ0luZAkJCVVsUHNldWRvU2VnSW5kCQkJT1BUSU9OQUwsCS0tIEluY2x1ZGVkIHdoZW4gdXBsaW5rIFJSTFAKKwktLSBQc2V1ZG8tc2VnbWVudGF0aW9uIGlzIHVzZWQsIG5vdCBpbmNsdWRlZCB3aGVuIG5vIHVwbGluayBwc2V1ZG8tc2VnbWVudGF0aW9uIGlzIHVzZWQKKwkuLi4KKwkJCQkJLS0gUG9zc2libHkgbW9yZSBleHRlbnNpb25zIGZvciBSZWxlYXNlIDUgaGVyZSBsYXRlcgorfQorCitFeHRlbmRlZC1yZWZlcmVuY2UgOjo9IFNFUVVFTkNFIHsKKwlzbWxjLWNvZGUJCQlJTlRFR0VSICgwLi42MyksCisJdHJhbnNhY3Rpb24tSUQJCUlOVEVHRVIgKDAuLjI2MjE0MykKK30KKworT1RELU1lYXN1cmVJbmZvLTUtRXh0IDo6PSBTZXFPZk9URC1Nc3JFbGVtZW50UmVzdAorCS0tIGlmIG1vcmUgdGhhbiBvbmUgbWVhc3VyZW1lbnQgc2V0cyBhcmUgcHJlc2VudCB0aGlzIGVsZW1lbnQgaXMgcmVwZWF0ZWQKKwktLSBOdW1iZXJPZlNldHMgLSAxICgtMSA9IGZpcnN0IHNldCkgY29tYmluZWQgaW4gT1RELU1lYXN1cmVJbmZvLTUtRXh0IGFuZAorCS0tIE9URC1NZWFzdXJlSW5mbyAoZS5nLiBpZiBOdW1iZXJPZlNldHMgaXMgMywgdGhlbiBvbmUgb3RkTXNyUmVzdFNldHMgbWF5CisJLS0gYmUgc2VudCBpbiBPVEQtTWVhc3VyZUluZm8tNS1FeHQgYW5kIG9uZSBpbiBPVEQtTWVhc3VyZUluZm8pCisKKy0tIEZpcnN0IHBhcnQgb2YgVXBsaW5rIFJSTFAgUHNldWRvLXNlZ21lbnRhdGlvbiBpbmRpY2F0aW9uLCBwb3NzaWJseSBtb3JlIG1heSBiZSBkZWZpbmVkCistLSBpbiB0aGUgZnV0dXJlIGZvciBzZWdtZW50YXRpb24gd2l0aCBtb3JlIHRoYW4gdHdvIHNlZ21lbnRzLgorVWxQc2V1ZG9TZWdJbmQgOjo9IEVOVU1FUkFURUQgeworCWZpcnN0T2ZNYW55ICgwKSwKKwlzZWNvbmRPZk1hbnkoMSkKK30KKworUmVsNS1Nc3JQb3NpdGlvbi1SZXEtRXh0ZW5zaW9uIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5kZWQtcmVmZXJlbmNlCQkJRXh0ZW5kZWQtcmVmZXJlbmNlLAorCS4uLgorCS0tIFBvc3NpYmx5IG1vcmUgZXh0ZW5zaW9ucyBmb3IgUmVsZWFzZSA1IGhlcmUgbGF0ZXIKK30KKworUmVsNS1Bc3Npc3RhbmNlRGF0YS1FeHRlbnNpb24gOjo9IFNFUVVFTkNFIHsKKwlleHRlbmRlZC1yZWZlcmVuY2UJCQlFeHRlbmRlZC1yZWZlcmVuY2UsCisJLi4uCisKKy0tIFBvc3NpYmx5IG1vcmUgZXh0ZW5zaW9ucyBmb3IgUmVsZWFzZSA1IGhlcmUgbGF0ZXIKK30KKworUmVsLTUtUHJvdG9jb2xFcnJvci1FeHRlbnNpb246Oj0gU0VRVUVOQ0UgeworCWV4dGVuZGVkLXJlZmVyZW5jZQkJCUV4dGVuZGVkLXJlZmVyZW5jZSAJT1BUSU9OQUwsCisJLS0gVGhlIGV4dGVuZGVkLXJlZmVyZW5jZSBzaGFsbCBiZSBpbmNsdWRlZCBieSB0aGUgTVMgaWYgYW5kIG9ubHkgaWYgcHJldmlvdXNseQorCS0tIHJlY2VpdmVkIGZyb20gdGhlIFNNTEMuCisJLS0gV2hlbiBpbmNsdWRlZCwgdGhlIHZhbHVlIHNlbnQgYnkgdGhlIE1TIHNoYWxsIGVxdWFsIHRoZSB2YWx1ZSByZWNlaXZlZCBmcm9tIHRoZSBTTUxDLgorCS4uLgorCisJLS0gUG9zc2libHkgbW9yZSBleHRlbnNpb25zIGZvciBSZWxlYXNlIDUgaGVyZSBsYXRlcgorfQorCistLSBSZWxlYXNlIDcgRXh0ZW5zaW9ucyBoZXJlCisKK1JlbDctTXNyUG9zaXRpb24tUmVxLUV4dGVuc2lvbiA6Oj0gU0VRVUVOQ0UgewordmVsb2NpdHlSZXF1ZXN0ZWQJCSBOVUxMCQkgT1BUSU9OQUwsCisgZ2Fuc3NQb3NpdGlvbk1ldGhvZCBHQU5TU1Bvc2l0aW9uaW5nTWV0aG9kIE9QVElPTkFMLAorIGdhbnNzLUFzc2lzdERhdGEgR0FOU1MtQXNzaXN0RGF0YSBPUFRJT05BTCwKKyBnYW5zc0NhcnJpZXJQaGFzZU1lYXN1cmVtZW50UmVxdWVzdCBOVUxMIE9QVElPTkFMLAorIGdhbnNzVE9ER1NNVGltZUFzc29jaWF0aW9uTWVhc3VyZW1lbnRSZXF1ZXN0IE5VTEwgT1BUSU9OQUwsCityZXF1aXJlZFJlc3BvbnNlVGltZQlSZXF1aXJlZFJlc3BvbnNlVGltZQlPUFRJT05BTCwKKwkuLi4KKwktLSBGdXJ0aGVyIFJlbGVhc2UgNyBleHRlbnRpb25zIGhlcmUKK30KKworLS0gYWRkaXRpb25hbCBzYXRlbGxpdGUgc3lzdGVtcyBtYXkgYmUgYWRkZWQgaW4gZnV0dXJlIHZlcnNpb25zIG9mIHRoZSBwcm90b2NvbAorR0FOU1NQb3NpdGlvbmluZ01ldGhvZCA6Oj0gQklUIFNUUklORyB7CisJZ3BzICgwKSwKKwlnYWxpbGVvICgxKX0gKFNJWkUgKDIuLjE2KSkKKworR0FOU1MtQXNzaXN0RGF0YSA6Oj0gU0VRVUVOQ0UgeworCWdhbnNzLWNvbnRyb2xIZWFkZXIJR0FOU1MtQ29udHJvbEhlYWRlcgorfQorCitHQU5TUy1Db250cm9sSGVhZGVyIDo6PSBTRVFVRU5DRSB7CisgZ2Fuc3NDb21tb25Bc3Npc3REYXRhIEdBTlNTQ29tbW9uQXNzaXN0RGF0YSBPUFRJT05BTCwKKyBnYW5zc0dlbmVyaWNBc3Npc3REYXRhTGlzdCBTZXFPZkdBTlNTR2VuZXJpY0Fzc2lzdERhdGFFbGVtZW50IE9QVElPTkFMCit9CisKKy0tIEdBTlNTIENvbW1vbiBBc3Npc3RhbmNlIERhdGEgRWxlbWVudHMKK0dBTlNTQ29tbW9uQXNzaXN0RGF0YSA6Oj0gU0VRVUVOQ0UgeworCWdhbnNzUmVmZXJlbmNlVGltZQkJIEdBTlNTUmVmZXJlbmNlVGltZQkJIE9QVElPTkFMLAorCWdhbnNzUmVmTG9jYXRpb24JCQlHQU5TU1JlZkxvY2F0aW9uCQkgT1BUSU9OQUwsCisJZ2Fuc3NJb25vc3BoZXJpY01vZGVsCQlHQU5TU0lvbm9zcGhlcmljTW9kZWwJIE9QVElPTkFMLAorCS4uLgorfQorCistLSBMaXN0IG9mIEdBTlNTIEdlbmVyaWMgQXNzaXN0YW5jZSBEYXRhIEVsZW1lbnRzLCB1cCB0byA4IEdBTlNTCitTZXFPZkdBTlNTR2VuZXJpY0Fzc2lzdERhdGFFbGVtZW50IDo6PSBTRVFVRU5DRSAoU0laRSAoMS4uOCkpIE9GIEdBTlNTR2VuZXJpY0Fzc2lzdERhdGFFbGVtZW50CisKKy0tIEdBTlNTIEdlbmVyaWMgQXNzaXN0YW5jZSBEYXRhIEVsZW1lbnRzCitHQU5TU0dlbmVyaWNBc3Npc3REYXRhRWxlbWVudCA6Oj0gU0VRVUVOQ0UgeworIGdhbnNzSUQgSU5URUdFUiAoMC4uNykgT1BUSU9OQUwsIC0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKKyBnYW5zc1RpbWVNb2RlbCBTZXFPZkdBTlNTVGltZU1vZGVsIE9QVElPTkFMLAorCWdhbnNzRGlmZkNvcnJlY3Rpb25zCQkgR0FOU1NEaWZmQ29ycmVjdGlvbnMJIE9QVElPTkFMLAorCWdhbnNzTmF2aWdhdGlvbk1vZGVsCQkgR0FOU1NOYXZNb2RlbCBPUFRJT05BTCwKKwlnYW5zc1JlYWxUaW1lSW50ZWdyaXR5CSBHQU5TU1JlYWxUaW1lSW50ZWdyaXR5CSBPUFRJT05BTCwKKwlnYW5zc0RhdGFCaXRBc3Npc3QJCQkgR0FOU1NEYXRhQml0QXNzaXN0CQkgT1BUSU9OQUwsCisJZ2Fuc3NSZWZNZWFzdXJlbWVudEFzc2lzdAkgR0FOU1NSZWZNZWFzdXJlbWVudEFzc2lzdCBPUFRJT05BTCwKKyBnYW5zc0FsbWFuYWNNb2RlbCBHQU5TU0FsbWFuYWNNb2RlbCBPUFRJT05BTCwKKyBnYW5zc1VUQ01vZGVsIEdBTlNTVVRDTW9kZWwgT1BUSU9OQUwsCisJLi4uCit9CisKKy0tIEdBTlNTIENPTU1PTiBBU1NJU1RBTkNFIERBVEEgRUxFTUVOVFMKKworLS0gR0FOU1MgUmVmZXJlbmNlIFRpbWUgSUUKK0dBTlNTUmVmZXJlbmNlVGltZSA6Oj0gU0VRVUVOQ0UgeworCWdhbnNzUmVmVGltZUluZm8JCQkgR0FOU1NSZWZUaW1lSW5mbywKKwlnYW5zc1RPRC1HU01UaW1lQXNzb2NpYXRpb24gR0FOU1NUT0QtR1NNVGltZUFzc29jaWF0aW9uIE9QVElPTkFMCit9CisKKy0tIEdBTlNTIFJlZmVyZW5jZSBUaW1lIGluY2x1ZGVzIEdBTlNTIFRPRCwgR0FOU1MgRGF5LCB1bmNlcnRhaW50eQorR0FOU1NSZWZUaW1lSW5mbyA6Oj0gU0VRVUVOQ0UgeworCWdhbnNzRGF5CQkJIElOVEVHRVIoMCAuLiA4MTkxKSBPUFRJT05BTCwKKyBnYW5zc1RPRCBHQU5TU1RPRCwKKwlnYW5zc1RPRFVuY2VydGFpbnR5CSBHQU5TU1RPRFVuY2VydGFpbnR5IE9QVElPTkFMLAorIGdhbnNzVGltZUlEIElOVEVHRVIgKDAgLi4gNykgT1BUSU9OQUwKK30KKworLS0gR0FOU1MgVE9EIGludGVnZXIgc2Vjb25kcworR0FOU1NUT0QgOjo9IElOVEVHRVIgKDAgLi4gODYzOTkpCisKKy0tIEdBTlNTIFRPRCB1bmNlcnRhaW50eQorR0FOU1NUT0RVbmNlcnRhaW50eSA6Oj0gSU5URUdFUiAoMCAuLiAxMjcpIC0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKKworLS0gR0FOU1MgVE9ELUdTTSBUaW1lIGFzc29jaWF0aW9uIAorR0FOU1NUT0QtR1NNVGltZUFzc29jaWF0aW9uIDo6PSBTRVFVRU5DRSB7CisJYmNjaENhcnJpZXIJCUJDQ0hDYXJyaWVyLAktLSBCQ0NIIGNhcnJpZXIKKwlic2ljCQkJQlNJQywJCQktLSBCU0lDCisJZnJhbWVOdW1iZXIJCUZyYW1lTnVtYmVyLAorCXRpbWVTbG90CQlUaW1lU2xvdCwKKwliaXROdW1iZXIJCUJpdE51bWJlciwKKyBmcmFtZURyaWZ0IEZyYW1lRHJpZnQgT1BUSU9OQUwKK30KKworLS0gRnJhbWUgZHJpZnQKK0ZyYW1lRHJpZnQgOjo9IElOVEVHRVIoLTY0IC4uIDYzKQorCistLSBHQU5TUyBSZWZlcmVuY2UgTG9jYXRpb24gSUUKK0dBTlNTUmVmTG9jYXRpb24gOjo9IFNFUVVFTkNFIHsKKwl0aHJlZURMb2NhdGlvbgkJCUV4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbgorfQorCistLSBHQU5TUyBJb25vc3BoZXJpYyBNb2RlbCBJRQorLS0gR0FOU1MgSW9ub3NwaGVyaWMgTW9kZWwgY29uc2lzdHMgb2YgTmVRdWljayBtb2RlbCBwYXJhbWV0ZXJzIGFuZCBzdG9ybSBmbGFncworCitHQU5TU0lvbm9zcGhlcmljTW9kZWwgOjo9IFNFUVVFTkNFIHsKKyBnYW5zc0lvbm9Nb2RlbCBHQU5TU0lvbm9zcGhlcmVNb2RlbCwKKyBnYW5zc0lvbm9TdG9ybUZsYWdzIEdBTlNTSW9ub1N0b3JtRmxhZ3MgT1BUSU9OQUwsCisgLi4uCit9CisKKy0tIEdBTlNTIGlvbm9zcGhlcmUgbW9kZWwuIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXggCitHQU5TU0lvbm9zcGhlcmVNb2RlbCA6Oj0gU0VRVUVOQ0UgeworIGFpMCBJTlRFR0VSICgwIC4uIDQwOTUpLAorIGFpMSBJTlRFR0VSICgwIC4uIDQwOTUpLAorIGFpMiBJTlRFR0VSICgwIC4uIDQwOTUpCit9CisKKy0tIEdBTlNTIGlvbm9zcGhlcmUgc3Rvcm0gZmxhZ3MKK0dBTlNTSW9ub1N0b3JtRmxhZ3MgOjo9IFNFUVVFTkNFIHsKKwlpb25vU3Rvcm1GbGFnMQlJTlRFR0VSICgwIC4uIDEpLAorCWlvbm9TdG9ybUZsYWcyCUlOVEVHRVIgKDAgLi4gMSksCisJaW9ub1N0b3JtRmxhZzMJSU5URUdFUiAoMCAuLiAxKSwKKwlpb25vU3Rvcm1GbGFnNAlJTlRFR0VSICgwIC4uIDEpLAorCWlvbm9TdG9ybUZsYWc1CUlOVEVHRVIgKDAgLi4gMSkKK30KKworLS0gR0FOU1MgR0VORVJJQyBBU1NJU1RBTkNFIERBVEEgRUxFTUVOVFMKKworLS0gR0FOU1MgVGltZSBNb2RlbCBJRSBjb25zaXN0cyBvZiB0aW1lIG9mZnNldCBhbmQgZmlyc3QgYW5kIHNlY29uZCBvcmRlciBwYXJhbWV0ZXJzIHRvIHJlbGF0ZSBHTlNTCistLSBzcGVjaWZpYyBzeXN0ZW0gdGltZSB0byBzZWxlY3RlZCB0aW1lIHJlZmVyZW5jZQorU2VxT2ZHQU5TU1RpbWVNb2RlbCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uNykpIE9GIEdBTlNTVGltZU1vZGVsRWxlbWVudAorCitHQU5TU1RpbWVNb2RlbEVsZW1lbnQgOjo9IFNFUVVFTkNFIHsKKwlnYW5zc1RpbWVNb2RlbFJlZlRpbWUJCUlOVEVHRVIoMCAuLiA2NTUzNSksCisJdEEwCQkgVEEwLAorCXRBMQkJIFRBMSBPUFRJT05BTCwKKwl0QTIJCSBUQTIgT1BUSU9OQUwsCisgZ25zc1RPSUQgSU5URUdFUiAoMCAuLiA3KSwKKyB3ZWVrTnVtYmVyIElOVEVHRVIgKDAgLi4gODE5MSkgT1BUSU9OQUwgCit9CisKKy0tIEdBTlNTIHRpbWUgbW9kZWwgcGFyYW1ldGVyIEEwCitUQTAgOjo9IElOVEVHRVIgKC0yMTQ3NDgzNjQ4IC4uIDIxNDc0ODM2NDcpCisKKy0tIEdBTlNTIHRpbWUgbW9kZWwgcGFyYW1ldGVyIEExCitUQTEgOjo9IElOVEVHRVIgKC04Mzg4NjA4IC4uIDgzODg2MDcpCisKKy0tIEdBTlNTIHRpbWUgbW9kZWwgcGFyYW1ldGVyIEEyCitUQTIgOjo9IElOVEVHRVIgKC02NCAuLiA2MykKKworLS0gREdBTlNTIENvcnJlY3Rpb25zIElFCitHQU5TU0RpZmZDb3JyZWN0aW9ucyA6Oj0gU0VRVUVOQ0UgeworCWRnYW5zc1JlZlRpbWUJCUlOVEVHRVIgKDAgLi4gMTE5KSwJIC0tIERHQU5TUyByZWZlcmVuY2UgdGltZQorCisJLS0gTl9TR05fVFlQRSBjYW4gYmUgcmVhZCBmcm9tIG51bWJlciBvZiBlbGVtZW50cyBvZiBzZ25UeXBlTGlzdAorCXNnblR5cGVMaXN0CQkgU2VxT2ZTZ25UeXBlRWxlbWVudAorfQorCitTZXFPZlNnblR5cGVFbGVtZW50IDo6PSBTRVFVRU5DRSAoU0laRSAoMS4uMykpIE9GIFNnblR5cGVFbGVtZW50IC0tIG1heCB0aHJlZSBzaWduYWxzIHBlciBHTlNTCisKKy0tIERHQU5TUyBzaWduYWwgdHlwZSBlbGVtZW50LCBvbmNlIHBlciBHTlNTIHNpZ25hbCB0eXBlIGluY2x1ZGVkIGluIERHQU5TUworU2duVHlwZUVsZW1lbnQgOjo9IFNFUVVFTkNFIHsKKwlnYW5zc1NpZ25hbElECQkgR0FOU1NTaWduYWxJRCBPUFRJT05BTCwgLS0gc2lnbmFsIHR5cGUgaWRlbnRpdHkKKyBnYW5zc1N0YXR1c0hlYWx0aCBJTlRFR0VSICgwIC4uIDcpLAorCS0tIE5fU0dOIGNhbiBiZSByZWFkIGZyb20gbnVtYmVyIG9mIGVsZW1lbnRzIG9mIGRnYW5zc1Nnbkxpc3QKKyBkZ2Fuc3NTZ25MaXN0IFNlcU9mREdBTlNTU2duRWxlbWVudAorfQorCitHQU5TU1NpZ25hbElEIDo6PSBJTlRFR0VSICgwIC4uIDMpCS0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKK1NlcU9mREdBTlNTU2duRWxlbWVudCA6Oj0gU0VRVUVOQ0UgKFNJWkUgKDEuLjE2KSkgT0YgREdBTlNTU2duRWxlbWVudAorCistLSBudW1iZXIgb2YgY29ycmVjdGlvbiBmb3Igc2lnbmFscworREdBTlNTU2duRWxlbWVudCA6Oj0gU0VRVUVOQ0UgeworCXN2SUQJCSBTVklELCAtLSBTYXRlbGxpdGUgaWRlbnRpdHkKKworLS0tIFNlcXVlbmNlIG51bWJlciBmb3IgR0FOU1MgTmF2aWdhdGlvbiBNb2RlbCB0aGF0IG1hdGNoZXMgdGhlIERHQU5TUyBjb3JyZWN0aW9uIHNldAorCWlvZCAJCQlJTlRFR0VSICgwIC4uIDEwMjMpLAorCisJLS0gVXNlciBEaWZmZXJlbnRpYWwgUmFuZ2UgRXJyb3IKKwl1ZHJlCQkJSU5URUdFUiAoMC4uMyksCQkKKworCS0tIFBzZXVkbyBSYW5nZSBDb3JyZWN0aW9uLCByYW5nZSBpcworCS0tIC02NTUuMDQgLSArNjU1LjA0LAorCXBzZXVkb1JhbmdlQ29yCUlOVEVHRVIgKC0yMDQ3Li4yMDQ3KSwgCQorCisJLS0gUHNldWRvIFJhbmdlIFJhdGUgQ29ycmVjdGlvbiwgcmFuZ2UgaXMKKwktLSAtNC4wNjQgLSArNC4wNjQsCisJcmFuZ2VSYXRlQ29yCUlOVEVHRVIgKC0xMjcuLjEyNykKK30KKworU1ZJRCA6Oj0gSU5URUdFUiAoMCAuLiA2MykJLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAorCistLSBHQU5TUyBOYXZpZ2F0aW9uIE1vZGVsIElFCitHQU5TU05hdk1vZGVsIDo6PSBTRVFVRU5DRSB7Cisgbm9uQnJvYWRjYXN0SW5kRmxhZyBJTlRFR0VSICgwIC4uIDEpLAorIHRvZU1TQiBJTlRFR0VSICgwIC4uIDMxKSBPUFRJT05BTCwgLS0gNSBNU0Igb2YgdG9lIGFuZCB0b2MgCisgZU1TQiBJTlRFR0VSICgwIC4uIDEyNykgT1BUSU9OQUwsCisgc3FydEFNQlMgSU5URUdFUiAoMCAuLiA2MykgT1BUSU9OQUwsCisJZ2Fuc3NTYXRlbGxpdGVMaXN0IFNlcU9mR0FOU1NTYXRlbGxpdGVFbGVtZW50Cit9CisKK1NlcU9mR0FOU1NTYXRlbGxpdGVFbGVtZW50IDo6PSBTRVFVRU5DRSAoU0laRSgxLi4zMikpIE9GIEdBTlNTU2F0ZWxsaXRlRWxlbWVudAorCitHQU5TU1NhdGVsbGl0ZUVsZW1lbnQgOjo9IFNFUVVFTkNFIHsKKwlzdklEIFNWSUQsCisgc3ZIZWFsdGggSU5URUdFUiAoLTcgLi4gMTMpLCAtLSBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4CisgaW9kIElOVEVHRVIgKDAgLi4gMTAyMyksIC0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKKyBnYW5zc0Nsb2NrTW9kZWwgR0FOU1NDbG9ja01vZGVsLCAKKyBnYW5zc09yYml0TW9kZWwgR0FOU1NPcmJpdE1vZGVsLCAKKyAuLi4KK30KKworLS0gR0FOU1Mgb3JiaXQgbW9kZWwgZm9yIHRoZSBHTlNTIHNhdGVsbGl0ZSBhY2NvcmRpbmcgdG8gdGhlIGNob2ljZQorR0FOU1NPcmJpdE1vZGVsIDo6PSBDSE9JQ0UgeworCWtlcGxlcmlhblNldAkgTmF2TW9kZWwtS2VwbGVyaWFuU2V0LAkKKyAuLi4KK30KKworLS0gTmF2aWdhdGlvbiBtb2RlbCBpbiBLZXBsZXJpYW4gcGFyYW1ldGVycworTmF2TW9kZWwtS2VwbGVyaWFuU2V0IDo6PSBTRVFVRU5DRSB7Cisga2VwbGVyVG9lTFNCIElOVEVHRVIgKDAgLi4gNTExKSwgLS0gOUxTQiBhcmUgZ2l2ZW4gaW4gR0FOU1NOYXZpZ2F0aW9uTW9kZWwKKwlrZXBsZXJXCQkJIElOVEVHRVIgKC0yMTQ3NDgzNjQ4Li4yMTQ3NDgzNjQ3KSwKKwlrZXBsZXJEZWx0YU4JIElOVEVHRVIgKC0zMjc2OC4uMzI3NjcpLAorCWtlcGxlck0wCQkgSU5URUdFUiAoLTIxNDc0ODM2NDguLjIxNDc0ODM2NDcpLAorCWtlcGxlck9tZWdhRG90CSBJTlRFR0VSICgtODM4ODYwOC4uODM4ODYwNyksCisJa2VwbGVyRUxTQiAJIElOVEVHRVIgKDAuLjMzNTU0NDMxKSwKKwlrZXBsZXJJRG90CQkgSU5URUdFUiAoLTgxOTIuLjgxOTEpLAorCWtlcGxlckFQb3dlckhhbGZMU0IgSU5URUdFUiAoMC4uIDY3MTA4ODYzKSwKKwlrZXBsZXJJMAkJIElOVEVHRVIgKC0yMTQ3NDgzNjQ4Li4yMTQ3NDgzNjQ3KSwKKwlrZXBsZXJPbWVnYTAgSU5URUdFUiAoLTIxNDc0ODM2NDguLjIxNDc0ODM2NDcpLAorCWtlcGxlckNycwkJIElOVEVHRVIgKC0zMjc2OC4uMzI3NjcpLAorCWtlcGxlckNpcwkJIElOVEVHRVIgKC0zMjc2OC4uMzI3NjcpLAorCWtlcGxlckN1cwkJIElOVEVHRVIgKC0zMjc2OC4uMzI3NjcpLAorCWtlcGxlckNyYwkJIElOVEVHRVIgKC0zMjc2OC4uMzI3NjcpLAorCWtlcGxlckNpYwkJIElOVEVHRVIgKC0zMjc2OC4uMzI3NjcpLAorCWtlcGxlckN1YwkJIElOVEVHRVIgKC0zMjc2OC4uMzI3NjcpCit9CisKKy0tIEdBTlNTIGNsb2NrIG1vZGVsIGZvciB0aGUgR05TUyBzYXRlbGxpdGUgYWNjb3JkaW5nIHRvIHRoZSBjaG9pY2UKK0dBTlNTQ2xvY2tNb2RlbCA6Oj0gQ0hPSUNFIHsKKwlzdGFuZGFyZENsb2NrTW9kZWxMaXN0CSBTZXFPZlN0YW5kYXJkQ2xvY2tNb2RlbEVsZW1lbnQsCQorIC4uLgorfQorCitTZXFPZlN0YW5kYXJkQ2xvY2tNb2RlbEVsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjIpKSBPRiBTdGFuZGFyZENsb2NrTW9kZWxFbGVtZW50CisKK1N0YW5kYXJkQ2xvY2tNb2RlbEVsZW1lbnQgOjo9IFNFUVVFTkNFIHsKKyBzdGFuQ2xvY2tUb2NMU0IgSU5URUdFUiAoMCAuLiA1MTEpLCAtLSA5TFNCIG9mIHRpbWUgb2YgY2xvY2sKKyBzdGFuQ2xvY2tBRjIgSU5URUdFUiAoLTIwNDggLi4gMjA0NyksIAorIHN0YW5DbG9ja0FGMSBJTlRFR0VSICgtMTMxMDcyIC4uIDEzMTA3MSksIAorIHN0YW5DbG9ja0FGMCBJTlRFR0VSICgtMTM0MjE3NzI4IC4uIDEzNDIxNzcyNyksCisgc3RhbkNsb2NrVGdkIElOVEVHRVIgKC01MTIgLi4gNTExKSBPUFRJT05BTCwKKyBzdGFuTW9kZWxJRCBJTlRFR0VSICgwIC4uIDEpIE9QVElPTkFMLAorIC4uLgorfSAKKworLS0gR0FOU1MgUmVhbC1UaW1lIEludGVncml0eSBJRQorR0FOU1NSZWFsVGltZUludGVncml0eSA6Oj0gU0VRVUVOQ0UgeworIC0tIGxpc3Qgb2YgYmFkIHNpZ25hbHMKKyAtLSBOQlMgY2FuIGJlIHJlYWQgZnJvbSBudW1iZXIgb2YgZWxlbWVudHMgaW4gU2VxT2YtQmFkU2lnbmFsU2V0CisgZ2Fuc3NCYWRTaWduYWxMaXN0IFNlcU9mQmFkU2lnbmFsRWxlbWVudAorfQorCitTZXFPZkJhZFNpZ25hbEVsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjE2KSkgT0YgQmFkU2lnbmFsRWxlbWVudAorCitCYWRTaWduYWxFbGVtZW50IDo6PSBTRVFVRU5DRSB7CisgYmFkU1ZJRCBTVklELCAtLSBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4CisgYmFkU2lnbmFsSUQgSU5URUdFUiAoMCAuLiAzKSBPUFRJT05BTCAtLSBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4Cit9CisKKworLS0gR0FOU1MgRGF0YSBCaXQgQXNzaXN0YW5jZSBJRQorR0FOU1NEYXRhQml0QXNzaXN0IDo6PSBTRVFVRU5DRSB7CisgZ2Fuc3NUT0QgSU5URUdFUiAoMCAuLiA1OSksCisgc3ZJRCBTVklELAorIGdhbnNzRGF0YVR5cGVJRCBJTlRFR0VSICgwIC4uIDIpLCAtLSBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4CisgLS0gbGlzdCBvZiBuYXZpZ2F0aW9uIGRhdGEgYml0cworIC0tIE5fQklUIGNhbiBiZSByZWFkIGZyb20gbnVtYmVyIG9mIGVsZW1lbnRzIGluIFNlcU9mLURhdGFCaXRzCisgZ2Fuc3NEYXRhQml0cyBTZXFPZi1HQU5TU0RhdGFCaXRzCit9CisKK1NlcU9mLUdBTlNTRGF0YUJpdHMgOjo9IFNFUVVFTkNFIChTSVpFKDEgLi4gMTAyNCkpIE9GIEdBTlNTRGF0YUJpdAorR0FOU1NEYXRhQml0IDo6PSBJTlRFR0VSKDAgLi4gMSkKKworLS0gR0FOU1MgUmVmZXJlbmNlIE1lYXN1cmVtZW50IEFzc2lzdGFuY2UgSUUKKy0tIENvZGUgYW5kIERvcHBsZXIgYXNzaXN0YW5jZSBmcm9tIHRoZSBuZXR3b3JrLiAKK0dBTlNTUmVmTWVhc3VyZW1lbnRBc3Npc3QgOjo9IFNFUVVFTkNFIHsKKyBnYW5zc1NpZ25hbElEIElOVEVHRVIgKDAgLi4gMykgT1BUSU9OQUwsIC0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKKyBnYW5zc1JlZk1lYXNBc3NpdExpc3QgU2VxT2ZHQU5TU1JlZk1lYXN1cmVtZW50RWxlbWVudAorfQorCitTZXFPZkdBTlNTUmVmTWVhc3VyZW1lbnRFbGVtZW50IDo6PSBTRVFVRU5DRSAoU0laRSgxIC4uIDE2KSkgT0YgR0FOU1NSZWZNZWFzdXJlbWVudEVsZW1lbnQKKworR0FOU1NSZWZNZWFzdXJlbWVudEVsZW1lbnQgOjo9IFNFUVVFTkNFIHsKKyBzdklEIFNWSUQsCisJLS0gRG9wcGxlciAwdGggb3JkZXIgdGVybSwKKwktLSAtMTAyNCBtL3MgdG8gMTAyMy41IG0vcyB3aXRoIDAuNSBtL3MgcmVzb2x1dGlvbikKKwlkb3BwbGVyMAkJCQlJTlRFR0VSICgtMjA0OCAuLiAyMDQ3KSwJLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAorCWFkZGl0aW9uYWxEb3BwbGVyCQlBZGRpdGlvbmFsRG9wcGxlckZpZWxkcwkgT1BUSU9OQUwsCisJY29kZVBoYXNlCQkJCUlOVEVHRVIgKDAgLi4gMTAyMiksCSAtLSBDb2RlIFBoYXNlIGluIG1zCisJaW50Q29kZVBoYXNlCQkJSU5URUdFUiAoMCAuLiAxMjcpLAkgLS0gSW50ZWdlciBDb2RlIFBoYXNlIGluIG1zCisJY29kZVBoYXNlU2VhcmNoV2luZG93CUlOVEVHRVIgKDAgLi4gMzEpLAkgLS0gQ29kZSBQaGFzZSBTZWFyY2ggV2luZG93LCBzZWUgQW5uZXgKKwlhZGRpdGlvbmFsQW5nbGUJCQlBZGRpb25hbEFuZ2xlRmllbGRzCQkgT1BUSU9OQUwsCisgLi4uCit9CisKK0FkZGl0aW9uYWxEb3BwbGVyRmllbGRzIDo6PSBTRVFVRU5DRSB7CisJLS0gRG9wcGxlciAxc3Qgb3JkZXIgdGVybSwgLTAuMiAtICswLjEgbS9zMgorCWRvcHBsZXIxCQkJCUlOVEVHRVIgKDAuLjYzKSwKKwlkb3BwbGVyVW5jZXJ0YWludHkJCUlOVEVHRVIgKDAuLjQpCit9CisKKy0tIEdBTlNTIEFsbWFuYWMgTW9kZWwgSUUKK0dBTlNTQWxtYW5hY01vZGVsIDo6PSBTRVFVRU5DRSB7Cisgd2Vla051bWJlciBJTlRFR0VSICgwIC4uIDI1NSksCisgc3ZJRE1hc2sgU1ZJRE1BU0ssCisgdG9hIElOVEVHRVIgKDAgLi4gMjU1KSBPUFRJT05BTCwKKyBpb2RhIElOVEVHRVIgKDAgLi4gMykgT1BUSU9OQUwsCisgZ2Fuc3NBbG1hbmFjTGlzdCBTZXFPZkdBTlNTQWxtYW5hY0VsZW1lbnQKK30KKworLS0gU1YgSUQgTWFzaywgTFNCIGZvciBJRCAxIGFuZCBNU0IgZm9yIElEIDM2CitTVklETUFTSyA6Oj0gQklUIFNUUklORyAoU0laRSAoMS4uMzYpKQorCitTZXFPZkdBTlNTQWxtYW5hY0VsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFKDEgLi4gMzYpKSBPRiBHQU5TU0FsbWFuYWNFbGVtZW50CisKKy0tIEdBTlNTIEFsbWFuYWMgTW9kZWwgCitHQU5TU0FsbWFuYWNFbGVtZW50IDo6PSBDSE9JQ0UgeworCWtlcGxlcmlhbkFsbWFuYWNTZXQJIEFsbWFuYWMtS2VwbGVyaWFuU2V0LAkKKyAuLi4KK30KKworLS0gQWxtYW5hYyBwYXJhbWV0ZXJzIGFjY29yZGluZyB0byBLZXBsZXJpYW4gcGFyYW1ldGVycworQWxtYW5hYy1LZXBsZXJpYW5TZXQgOjo9IFNFUVVFTkNFIHsKKyAJa2VwQWxtYW5hY0UJCQkgSU5URUdFUiAoMCAuLiAyMDQ3KSwKKwlrZXBBbG1hbmFjRGVsdGFJCQlJTlRFR0VSICgtMTAyNCAuLiAxMDIzKSwKKwlrZXBBbG1hbmFjT21lZ2FEb3QJCUlOVEVHRVIgKC0xMDI0IC4uIDEwMjMpLAorIGtlcFNWSGVhbHRoIElOVEVHRVIgKDAgLi4gMTUpLCAtLSBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4CisJa2VwQWxtYW5hY0FQb3dlckhhbGYJSU5URUdFUiAoLTY1NTM2IC4uIDY1NTM1KSwKKwlrZXBBbG1hbmFjT21lZ2EwCQlJTlRFR0VSICgtMzI3NjggLi4gMzI3NjcpLAorCWtlcEFsbWFuYWNXCQkJIElOVEVHRVIgKC0zMjc2OCAuLiAzMjc2NyksCisJa2VwQWxtYW5hY00wCQkJSU5URUdFUiAoLTMyNzY4IC4uIDMyNzY3KSwKKwlrZXBBbG1hbmFjQUYwCQkJSU5URUdFUiAoLTgxOTIgLi4gODE5MSksCisJa2VwQWxtYW5hY0FGMQkJCUlOVEVHRVIgKC0xMDI0Li4xMDIzKQorfQorCistLSBHQU5TUyBVbml2ZXJzYWwgVGltZSBDb29yZGluYXRlIE1vZGVsCitHQU5TU1VUQ01vZGVsIDo6PSBTRVFVRU5DRSB7CisJZ2Fuc3NVdGNBMQkJCUlOVEVHRVIgKC04Mzg4NjA4Li44Mzg4NjA3KSwKKwlnYW5zc1V0Y0EwCQkJSU5URUdFUiAoLTIxNDc0ODM2NDguLjIxNDc0ODM2NDcpLAorCWdhbnNzVXRjVG90CQkJSU5URUdFUiAoMC4uMjU1KSwKKwlnYW5zc1V0Y1dOdAkJCUlOVEVHRVIgKDAuLjI1NSksCisJZ2Fuc3NVdGNEZWx0YVRscwlJTlRFR0VSICgtMTI4Li4xMjcpLAorCWdhbnNzVXRjV05sc2YJCUlOVEVHRVIgKDAuLjI1NSksCisJZ2Fuc3NVdGNETgkJCUlOVEVHRVIgKC0xMjguLjEyNyksCisJZ2Fuc3NVdGNEZWx0YVRsc2YJSU5URUdFUiAoLTEyOC4uMTI3KQorfQorCistLVJlcXVpcmVkIE1lYXN1cmVtZW50IFJlcXVlc3QgUmVzcG9uc2UgVGltZSwgcmFuZ2UgaXMgMSB0byAxMjggc2Vjb25kcy4gCitSZXF1aXJlZFJlc3BvbnNlVGltZSA6Oj0gSU5URUdFUiAgKDEuLjEyOCkKKworUmVsLTctTXNyUG9zaXRpb24tUnNwLUV4dGVuc2lvbiA6Oj0gU0VRVUVOQ0UgeworCisJdmVsRXN0aW1hdGUgCVZlbG9jaXR5RXN0aW1hdGUgT1BUSU9OQUwsCisgLS0gSG9yaXpvbnRhbCBWZWxvY2l0eQorIC0tIEhvcml6b250YWwgd2l0aCBWZXJ0aWNhbCBWZWxvY2l0eQorIC0tIEhvcml6b250YWwgVmVsb2NpdHkgd2l0aCBVbmNlcnRhaW50eQorIC0tIEhvcml6b250YWwgd2l0aCBWZXJ0aWNhbCBWZWxvY2l0eSBhbmQgVW5jZXJ0YWludHkKKyBnYW5zc0xvY2F0aW9uSW5mbyBHQU5TU0xvY2F0aW9uSW5mbyBPUFRJT05BTCwKKyBnYW5zc01lYXN1cmVJbmZvIEdBTlNTTWVhc3VyZUluZm8gT1BUSU9OQUwsCisJLi4uCistLSBGdXJ0aGVyIFJlbGVhc2UgNyBleHRlbnNpb25zIGhlcmUKK30KKworLS0gR0FOU1MgTG9jYXRpb24gSW5mb3JtYXRpb24gY29udGFpbnMgbG9jYXRpb24gZXN0aW1hdGUsIHRpbWUgc3RhbXAgd2l0aCB1bmNlcnRhaW50eSAKKy0tIGFuZCBvcHRpb25hbGx5IFJlZmVyZW5jZSBGcmFtZSBmaWVsZAorR0FOU1NMb2NhdGlvbkluZm8gOjo9IFNFUVVFTkNFIHsKKyByZWZlcmVuY2VGcmFtZSBSZWZlcmVuY2VGcmFtZSBPUFRJT05BTCwgLS0gUmVmZXJlbmNlIEZyYW1lIE51bWJlcgorIGdhbnNzVE9EbSBHQU5TU1RPRG0gT1BUSU9OQUwsIC0tIEdOU1MgVE9EIG1vZHVsbworIGdhbnNzVE9ERnJhYyBJTlRFR0VSICgwIC4uIDE2Mzg0KSBPUFRJT05BTCwgLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAorCWdhbnNzVE9EVW5jZXJ0YWludHkgR0FOU1NUT0RVbmNlcnRhaW50eSBPUFRJT05BTCwgLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAorIGdhbnNzVGltZUlEIElOVEVHRVIgKDAgLi4gMykgT1BUSU9OQUwsIC0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKKwlmaXhUeXBlCQkJIEZpeFR5cGUsCisgcG9zRGF0YSBQb3NpdGlvbkRhdGEsCisgc3RhdGlvbmFyeUluZGljYXRpb24gSU5URUdFUigwIC4uIDEpIE9QVElPTkFMLCAtLSAnMCcgaWYgbW92aW5nIG9yIG1vdGlvbiBub3Qga25vd24gCisJLS0gUG9zc2libGUgc2hhcGVzIGNhcnJpZWQgaW4gcG9zRXN0aW1hdGUgYXJlCisJLS0gZWxsaXBzb2lkIHBvaW50LAorCS0tIGVsbGlwc29pZCBwb2ludCB3aXRoIHVuY2VydGFpbnR5IGNpcmNsZQorCS0tIGVsbGlwc29pZCBwb2ludCB3aXRoIHVuY2VydGFpbnR5IGVsbGlwc2UKKwktLSBlbGxpcHNvaWQgcG9pbnQgd2l0aCBhbHRpdHVkZSBhbmQgdW5jZXJ0YWludHkgZWxsaXBzb2lkCisJcG9zRXN0aW1hdGUJCSBFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24sCisgLi4uCit9CisKK1Bvc2l0aW9uRGF0YSA6Oj0gQklUIFNUUklORyB7CisgZS1vdGQoMCksCisJZ3BzICgxKSwKKwlnYWxpbGVvICgyKSB9IChTSVpFICgzLi4xNikpCisKKworLS0gR0FOU1MgVE9EIG1vZHVsbyAxIGhvdXIKK0dBTlNTVE9EbSA6Oj0gSU5URUdFUiAoMCAuLiAzNTk5OTk5KQorCitSZWZlcmVuY2VGcmFtZSA6Oj0gU0VRVUVOQ0UgeworIHJlZmVyZW5jZUZOIElOVEVHRVIgKDAgLi4gNjU1MzUpLAorCS0tIE5vdGUgdGhhdCBhcHBsaWNhYmxlIHJhbmdlIGZvciByZWZlcmVuY2VGTiBpcyAwIC0gNDI0MzEKKyByZWZlcmVuY2VGTk1TQiBJTlRFR0VSICgwIC4uIDYzKSBPUFRJT05BTCAtLSBNU0Igb2YgUmVmZXJlbmNlIEZyYW1lIE51bWJlcgorfQorCisKKworLS0gR0FOU1MgTWVhc3VyZW1lbnQgSW5mb3JtYXRpb24gCitHQU5TU01lYXN1cmVJbmZvIDo6PSBTRVFVRU5DRSB7CisJLS0gTWVhc3VyZW1lbnQgaW5mbyBlbGVtZW50cworCS0tIHVzZXIgaGFzIHRvIG1ha2Ugc3VyZSB0aGF0IGluIHRoaXMgZWxlbWVudCBpcyBudW1iZXIgb2YgZWxlbWVudHMKKwktLSBkZWZpbmVkIGluIHJlZmVyZW5jZSBCVFMgaWRlbnRpdHkKKyBnYW5zc01zclNldExpc3QgU2VxT2ZHQU5TUy1Nc3JTZXRFbGVtZW50Cit9CitTZXFPZkdBTlNTLU1zclNldEVsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjMpKSBPRiBHQU5TUy1Nc3JTZXRFbGVtZW50CisKKy0tIEdBTlNTIG1lYXN1cmVtZW50IGluZm9ybWF0aW9uIDEtMyB0aW1lcyBpbiBhIG1lc3NhZ2UKK0dBTlNTLU1zclNldEVsZW1lbnQgOjo9IFNFUVVFTkNFIHsKKyByZWZlcmVuY2VGcmFtZSBSZWZlcmVuY2VGcmFtZSBPUFRJT05BTCwgLS0gUmVmZXJlbmNlIEZyYW1lIE51bWJlcgorIGdhbnNzVE9EbSBHQU5TU1RPRG0gT1BUSU9OQUwsIC0tIEdBTlNTIFRPRCBtb2R1bG8KKyBkZWx0YUdOQVNTVE9EIElOVEVHRVIgKDAgLi4gMTI3KSBPUFRJT05BTCwKKwlnYW5zc1RPRFVuY2VydGFpbnR5IEdBTlNTVE9EVW5jZXJ0YWludHkgT1BUSU9OQUwsIC0tIENvZGluZyBhY2NvcmluZyB0byBBbm5leAorCisgLS1OX1NHTl9UWVBFIGNhbiBiZSByZWFkIGZyb20gbnVtYmVyIG9mIGVsZW1lbnRzIG9mIFNlcU9mR0FOU1MtU2duVHlwZUVsZW1lbnQKKyBnYW5zcy1TZ25UeXBlTGlzdCBTZXFPZkdBTlNTLVNnblR5cGVFbGVtZW50Cit9CisKKy0tIE1lYXN1cmVtZW50cyBjYW4gYmUgcmV0dXJuZWQgdXAgdG8gNiBkaWZmZXJlbnQgc2lnbmFsIHR5cGVzIAorU2VxT2ZHQU5TUy1TZ25UeXBlRWxlbWVudCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uNikpIE9GIEdBTlNTLVNnblR5cGVFbGVtZW50CisKK0dBTlNTLVNnblR5cGVFbGVtZW50IDo6PSBTRVFVRU5DRSB7CisJZ2Fuc3NTaWduYWxJRAkJSU5URUdFUiAoMCAuLiAxNSksIC0tIENvZGluZyBhY2Nyb2RpbmcgdG8gQW5uZXgKKyAtLU5fU0dOIGNhbiBiZSByZWFkIGZyb20gbnVtYmVyIG9mIGVsZW1lbnRzIG9mIFNlcU9mR0FOU1MtU2duRWxlbWVudAorIGdhbnNzLVNnbkxpc3QgU2VxT2ZHQU5TUy1TZ25FbGVtZW50Cit9CisKKy0tIE1lYXN1cmVtZW50cyBjYW4gYmUgcmV0dXJuZWQgdXAgdG8gMTYgcGVyIHNpZ25hbCB0eXBlcyAKK1NlcU9mR0FOU1MtU2duRWxlbWVudCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMTYpKSBPRiBHQU5TUy1TZ25FbGVtZW50CisKKworR0FOU1MtU2duRWxlbWVudCA6Oj0gU0VRVUVOQ0UgeworIHN2SUQgU1ZJRCwKKyBjTm8gSU5URUdFUiAoMCAuLiA2MyksCisgbXBhdGhEZXQgTXBhdGhJbmRpYywgLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAorIGNhcnJpZXJRdWFsaXR5SW5kIElOVEVHRVIgKDAgLi4gMykgT1BUSU9OQUwsIC0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKKyBjb2RlUGhhc2UgSU5URUdFUiAoMCAuLiAyMDk3MTUxKSwKKyBpbnRlZ2VyQ29kZVBoYXNlIElOVEVHRVIgKDAgLi4gNjMpIE9QVElPTkFMLAorIGNvZGVQaGFzZVJNU0Vycm9yIElOVEVHRVIgKDAuLjYzKSwgLS0gQ29kaW5nIGFjY29yaW5nIHRvIEFubmV4CisgZG9wcGxlciBJTlRFR0VSICgtMzI3NjggLi4gMzI3NjcpIE9QVElPTkFMLAorIGFkciBJTlRFR0VSICgwIC4uIDMzNTU0NDMxKSBPUFRJT05BTAorfQorCitSZWw3LUFzc2lzdGFuY2VEYXRhLUV4dGVuc2lvbiA6Oj0gU0VRVUVOQ0UgeworIGdhbnNzLUFzc2lzdERhdGEgR0FOU1MtQXNzaXN0RGF0YSBPUFRJT05BTCwKKyBnYW5zc0NhcnJpZXJQaGFzZU1lYXN1cmVtZW50UmVxdWVzdCBOVUxMIE9QVElPTkFMLAorIGdhbnNzVE9ER1NNVGltZUFzc29jaWF0aW9uTWVhc3VyZW1lbnRSZXF1ZXN0IE5VTEwgT1BUSU9OQUwsCisJLi4uCistLSBQb3NzaWJseSBtb3JlIGV4dGVuc2lvbnMgZm9yIFJlbGVhc2UgNyBoZXJlCit9CisKK0VORApkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvYXNuMS9SUkxQLU1lc3NhZ2VzLmFzbiBiL3JybHAtZXBoZW1lcmlzL2FzbjEvUlJMUC1NZXNzYWdlcy5hc24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkxNDBlMgotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2FzbjEvUlJMUC1NZXNzYWdlcy5hc24KQEAgLTAsMCArMSwzOCBAQAorLS0gUlJMUC1NZXNzYWdlcy5hc24KKy0tICRJZCQKKy0tIFRha2VuIGZyb20gM0dQUCBUUyA0NC4wMzEgVjcuNC4wICgyMDA3LTAzKQorLS0gaHR0cDovL3d3dy4zZ3BwLm9yZy9mdHAvU3BlY3MvYXJjaGl2ZS80NF9zZXJpZXMvNDQuMDMxLzQ0MDMxLTc0MC56aXAvNDQwMzEtNzQwLmRvYworLS0KKy0tIDMuMSBHZW5lcmFsIEZvcm1hdCBvZiBSUkxQIE1lc3NhZ2UKKy0tCisKK1JSTFAtTWVzc2FnZXMKKy0tIHsgUlJMUC1tZXNzYWdlcyB9CisKK0RFRklOSVRJT05TIEFVVE9NQVRJQyBUQUdTIDo6PQorCitCRUdJTgorCitJTVBPUlRTCisJTXNyUG9zaXRpb24tUmVxLCBNc3JQb3NpdGlvbi1Sc3AsIEFzc2lzdGFuY2VEYXRhLAorCVByb3RvY29sRXJyb3IKK0ZST00KKwlSUkxQLUNvbXBvbmVudHMgCS0tIHsgUlJMUC1Db21wb25lbnRzIH0KKzsKKworUERVIDo6PSBTRVFVRU5DRSB7CisJcmVmZXJlbmNlTnVtYmVyCQkJSU5URUdFUiAoMC4uNyksCisJY29tcG9uZW50CQkJCVJSTFAtQ29tcG9uZW50Cit9CisKK1JSTFAtQ29tcG9uZW50IDo6PSBDSE9JQ0UgeworCW1zclBvc2l0aW9uUmVxCQkJTXNyUG9zaXRpb24tUmVxLAorCW1zclBvc2l0aW9uUnNwCQkJTXNyUG9zaXRpb24tUnNwLAorCWFzc2lzdGFuY2VEYXRhCQkJQXNzaXN0YW5jZURhdGEsCisJYXNzaXN0YW5jZURhdGFBY2sJCU5VTEwsCisJcHJvdG9jb2xFcnJvcgkJCVByb3RvY29sRXJyb3IsCisJLi4uCisKK30KKworRU5ECmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xL3BhdGNoLXJybHAtY29tcG9uZW50cy5kaWZmIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9wYXRjaC1ycmxwLWNvbXBvbmVudHMuZGlmZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWU1NWFlCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9wYXRjaC1ycmxwLWNvbXBvbmVudHMuZGlmZgpAQCAtMCwwICsxLDM2IEBACistLS0gUlJMUC1Db21wb25lbnRzLmFzbgkyMDA5LTEwLTI2IDIyOjEwOjQ0LjAwMDAwMDAwMCArMDEwMAorKysrIFJSTFAtQ29tcG9uZW50cy5hc24JMjAwOS0xMC0yNiAyMjoxMDo0NC4wMDAwMDAwMDAgKzAxMDAKK0BAIC0xOCwxNiArMTgsMTYgQEAKKyAJRXh0LUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uLCBWZWxvY2l0eUVzdGltYXRlCisgRlJPTQorIAlNQVAtTENTLURhdGFUeXBlcyB7CistCWNjaXR0IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCistCWdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtTENTLURhdGFUeXBlcyAoMjUpIHZlcnNpb241ICg1KX0KKysJaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKysJZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1MQ1MtRGF0YVR5cGVzICgyNSkgdmVyc2lvbjExICgxMSl9CisgCisgCUV4dGVuc2lvbkNvbnRhaW5lcgorIEZST00gTUFQLUV4dGVuc2lvbkRhdGFUeXBlcyB7CistCWNjaXR0IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCistCWdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtRXh0ZW5zaW9uRGF0YVR5cGVzICgyMSkgdmVyc2lvbjQgKDQpfQorKwlpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorKwlnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUV4dGVuc2lvbkRhdGFUeXBlcyAoMjEpIHZlcnNpb24xMSAoMTEpfQorIDsKKyAKKyAtLSBBZGQgaGVyZSBvdGhlciBBU04uMSBkZWZpbml0aW9ucyBwcmVzZW50ZWQgYmVsb3cKKyAtLSBpbiBjaGFwdGVycyA0IGFuZCA1LgorIAorQEAgLTMwNSwxMSArMzA1LDExIEBACisgU3lzdGVtSW5mb0luZGV4IDo6PSBJTlRFR0VSICgxLi4zMikKKyAKKyBDZWxsSURBbmRMQUMgOjo9IFNFUVVFTkNFIHsKKy0JcmVmZXJlbmNlTEFDCUxBQywJCQkJLS0gTG9jYXRpb24gYXJlYSBjb2RlCisrCXJlZmVyZW5jZUxBQwlMQUNJRCwJCQkJLS0gTG9jYXRpb24gYXJlYSBjb2RlCisgCXJlZmVyZW5jZUNJCQlDZWxsSUQJCQkJLS0gQ2VsbCBpZGVudGl0eQorIH0KKyBDZWxsSUQgOjo9IElOVEVHRVIgKDAuLjY1NTM1KQorLUxBQyA6Oj0gSU5URUdFUiAoMC4uNjU1MzUpCisrTEFDSUQgOjo9IElOVEVHRVIgKDAuLjY1NTM1KQorIAorIC0tIE9URC1NZWFzdXJlSW5mbworIE9URC1NZWFzdXJlSW5mbyA6Oj0gU0VRVUVOQ0UgewpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvYXNuMWNfcGF0Y2hlcy8wMF9hZGRfZW51bWVyYXRlZF92ZXJib3NlLmRpZmYgYi9ycmxwLWVwaGVtZXJpcy9hc24xY19wYXRjaGVzLzAwX2FkZF9lbnVtZXJhdGVkX3ZlcmJvc2UuZGlmZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGMyMmEzCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvYXNuMWNfcGF0Y2hlcy8wMF9hZGRfZW51bWVyYXRlZF92ZXJib3NlLmRpZmYKQEAgLTAsMCArMSw1NiBAQAorSW5kZXg6IHNrZWxldG9ucy9OYXRpdmVFbnVtZXJhdGVkLmMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLSBza2VsZXRvbnMvTmF0aXZlRW51bWVyYXRlZC5jCShyZXZpc2lvbiAxNDA3KQorKysrIHNrZWxldG9ucy9OYXRpdmVFbnVtZXJhdGVkLmMJKHdvcmtpbmcgY29weSkKK0BAIC0yMiw3ICsyMiw3IEBACisgCSJFTlVNRVJBVEVEIiwJCQkvKiBUaGUgQVNOLjEgdHlwZSBpcyBzdGlsbCBFTlVNRVJBVEVEICovCisgCSJFTlVNRVJBVEVEIiwKKyAJTmF0aXZlSW50ZWdlcl9mcmVlLAorLQlOYXRpdmVJbnRlZ2VyX3ByaW50LAorKwlOYXRpdmVFbnVtZXJhdGVkX3ByaW50LAorIAlhc25fZ2VuZXJpY19ub19jb25zdHJhaW50LAorIAlOYXRpdmVJbnRlZ2VyX2RlY29kZV9iZXIsCisgCU5hdGl2ZUludGVnZXJfZW5jb2RlX2RlciwKK0BAIC0yMDUsMyArMjA1LDMwIEBACisgCV9BU05fRU5DT0RFRF9PSyhlcik7CisgfQorIAorK2ludAorK05hdGl2ZUVudW1lcmF0ZWRfcHJpbnQoYXNuX1RZUEVfZGVzY3JpcHRvcl90ICp0ZCwgY29uc3Qgdm9pZCAqc3B0ciwgaW50IGlsZXZlbCwKKysJYXNuX2FwcF9jb25zdW1lX2J5dGVzX2YgKmNiLCB2b2lkICphcHBfa2V5KSB7CisrCWFzbl9JTlRFR0VSX3NwZWNpZmljc190ICpzcGVjcz0oYXNuX0lOVEVHRVJfc3BlY2lmaWNzX3QgKil0ZC0+c3BlY2lmaWNzOworKwljb25zdCBsb25nICpuYXRpdmUgPSAoY29uc3QgbG9uZyAqKXNwdHI7CisrCWNoYXIgc2NyYXRjaFsyNTZdOworKwlpbnQgcmV0OworKworKwkodm9pZCl0ZDsJLyogVW51c2VkIGFyZ3VtZW50ICovCisrCSh2b2lkKWlsZXZlbDsJLyogVW51c2VkIGFyZ3VtZW50ICovCisrCisrCWlmKG5hdGl2ZSkgeworKwkJY29uc3QgYXNuX0lOVEVHRVJfZW51bV9tYXBfdCAqbWFwID0gSU5URUdFUl9tYXBfdmFsdWUyZW51bShzcGVjcywgKm5hdGl2ZSk7CisrCQlpZiAobWFwICYmIG1hcC0+ZW51bV9sZW4gJiYgbWFwLT5lbnVtX25hbWUpIHsKKysJCQlyZXQgPSBzbnByaW50ZihzY3JhdGNoLCBzaXplb2Yoc2NyYXRjaCksCisrCQkJCSIlcyIsIG1hcC0+ZW51bV9uYW1lKTsKKysJCX0gZWxzZSB7CisrCQkJcmV0ID0gc25wcmludGYoc2NyYXRjaCwgc2l6ZW9mKHNjcmF0Y2gpLAorKwkJCQkoc3BlY3MgJiYgc3BlY3MtPmZpZWxkX3Vuc2lnbmVkKQorKwkJCQk/ICIlbHUiIDogIiVsZCIsICpuYXRpdmUpOworKwkJfQorKwkJYXNzZXJ0KHJldCA+IDAgJiYgKHNpemVfdClyZXQgPCBzaXplb2Yoc2NyYXRjaCkpOworKwkJcmV0dXJuIChjYihzY3JhdGNoLCByZXQsIGFwcF9rZXkpIDwgMCkgPyAtMSA6IDA7CisrCX0gZWxzZSB7CisrCQlyZXR1cm4gKGNiKCI8YWJzZW50PiIsIDgsIGFwcF9rZXkpIDwgMCkgPyAtMSA6IDA7CisrCX0KKyt9CitJbmRleDogc2tlbGV0b25zL05hdGl2ZUVudW1lcmF0ZWQuaAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tIHNrZWxldG9ucy9OYXRpdmVFbnVtZXJhdGVkLmgJKHJldmlzaW9uIDE0MDcpCisrKysgc2tlbGV0b25zL05hdGl2ZUVudW1lcmF0ZWQuaAkod29ya2luZyBjb3B5KQorQEAgLTI0LDYgKzI0LDcgQEAKKyB4ZXJfdHlwZV9lbmNvZGVyX2YgTmF0aXZlRW51bWVyYXRlZF9lbmNvZGVfeGVyOworIHBlcl90eXBlX2RlY29kZXJfZiBOYXRpdmVFbnVtZXJhdGVkX2RlY29kZV91cGVyOworIHBlcl90eXBlX2VuY29kZXJfZiBOYXRpdmVFbnVtZXJhdGVkX2VuY29kZV91cGVyOworK2Fzbl9zdHJ1Y3RfcHJpbnRfZiBOYXRpdmVFbnVtZXJhdGVkX3ByaW50OworIAorICNpZmRlZiBfX2NwbHVzcGx1cworIH0KZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2FzbjFjX3BhdGNoZXMvMDFfZml4X3Blcl9lbmNvZGluZ19kaWV0ZXIuZGlmZiBiL3JybHAtZXBoZW1lcmlzL2FzbjFjX3BhdGNoZXMvMDFfZml4X3Blcl9lbmNvZGluZ19kaWV0ZXIuZGlmZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDljMjAxCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvYXNuMWNfcGF0Y2hlcy8wMV9maXhfcGVyX2VuY29kaW5nX2RpZXRlci5kaWZmCkBAIC0wLDAgKzEsMTcgQEAKK0luZGV4OiBza2VsZXRvbnMvcGVyX3N1cHBvcnQuYworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tIHNrZWxldG9ucy9wZXJfc3VwcG9ydC5jCShyZXZpc2lvbiAxNDA3KQorKysrIHNrZWxldG9ucy9wZXJfc3VwcG9ydC5jCSh3b3JraW5nIGNvcHkpCitAQCAtMzM2LDcgKzMzNiwxMiBAQAorIAkJYnVmWzNdID0gYml0czsKKyAJZWxzZSB7CisgCQlBU05fREVCVUcoIi0+W1BFUiBvdXQgc3BsaXQgJWRdIiwgb2JpdHMpOworKyNpZiAxIC8vIERpZXRlcgorKwkJcG8tPm5ib2ZmIC09IG9iaXRzOyAvLyB1bmRvIGluY3JlbWVudGF0aW9uIGZyb20gYSBmZXcgbGluZXMgYWJvdmUKKysJCXBlcl9wdXRfZmV3X2JpdHMocG8sIGJpdHMgPj4gKG9iaXRzIC0gMjQpLCAyNCk7IC8vIHNoaWZ0IGFjY29yZGluZyB0byB0aGUgcmVzdCBvZiB0aGUgYml0cyAKKysjZWxzZQkJCisgCQlwZXJfcHV0X2Zld19iaXRzKHBvLCBiaXRzID4+IDgsIDI0KTsKKysjZW5kaWYKKyAJCXBlcl9wdXRfZmV3X2JpdHMocG8sIGJpdHMsIG9iaXRzIC0gMjQpOworIAkJQVNOX0RFQlVHKCI8LVtQRVIgb3V0IHNwbGl0ICVkXSIsIG9iaXRzKTsKKyAJfQpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvZGF0YS51YnggYi9ycmxwLWVwaGVtZXJpcy9kYXRhLnVieApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2NkZGRjCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvZGF0YS51YngKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvZ2V0LXRlc3QtZGF0YS5zaCBiL3JybHAtZXBoZW1lcmlzL2dldC10ZXN0LWRhdGEuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTY5ZjQzYwotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2dldC10ZXN0LWRhdGEuc2gKQEAgLTAsMCArMSwxNyBAQAorIyEvYmluL3NoCisKK0RFVj0kMQorT1VURj0kMgorCisjIENoYW5nZSBtb2RlCitlY2hvIC1lbiAiXCRQVUJYLDQxLDEsMDAwMSwwMDAxLDk2MDAsMCoxNFxyXG4iID4gJHtERVZ9CisKKyMgV2FpdCBhIGxpdHRsZQorc2xlZXAgMgorCisjIFN0YXJ0IGR1bXAKK2VjaG8gLWVuICJceGI1XHg2Mlx4MDFceDAyXHgwMFx4MDBceDAzXHgwYSIgfCBcCisJc29jYXQgLXQ1ICR7REVWfSxiOTYwMCxyYXcsY2xvY2FsPTEsZWNobz0wIC0gPiAke09VVEZ9CitlY2hvIC1lbiAiXHhiNVx4NjJceDBiXHgxMFx4MDBceDAwXHgxYlx4NWMiIHwgXAorCXNvY2F0IC10MTAgJHtERVZ9LGI5NjAwLHJhdyxjbG9jYWw9MSxlY2hvPTAgLSA+PiAke09VVEZ9CisKZGlmZiAtLWdpdCBhL0NPUFlJTkcgYi9ycmxwLWVwaGVtZXJpcy9ncGwtMi4wLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIENPUFlJTkcKY29weSB0byBycmxwLWVwaGVtZXJpcy9ncGwtMi4wLnR4dApkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvZ3BsLTMuMC50eHQgYi9ycmxwLWVwaGVtZXJpcy9ncGwtMy4wLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGE5ZWQwCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvZ3BsLTMuMC50eHQKQEAgLTAsMCArMSw2NzQgQEAKKyAgICAgICAgICAgICAgICAgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKyAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAzLCAyOSBKdW5lIDIwMDcKKworIENvcHlyaWdodCAoQykgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gPGh0dHA6Ly9mc2Yub3JnLz4KKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKKyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWFtYmxlCisKKyAgVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGEgZnJlZSwgY29weWxlZnQgbGljZW5zZSBmb3IKK3NvZnR3YXJlIGFuZCBvdGhlciBraW5kcyBvZiB3b3Jrcy4KKworICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYW5kIG90aGVyIHByYWN0aWNhbCB3b3JrcyBhcmUgZGVzaWduZWQKK3RvIHRha2UgYXdheSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSB0aGUgd29ya3MuICBCeSBjb250cmFzdCwKK3RoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvCitzaGFyZSBhbmQgY2hhbmdlIGFsbCB2ZXJzaW9ucyBvZiBhIHByb2dyYW0tLXRvIG1ha2Ugc3VyZSBpdCByZW1haW5zIGZyZWUKK3NvZnR3YXJlIGZvciBhbGwgaXRzIHVzZXJzLiAgV2UsIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHVzZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3N0IG9mIG91ciBzb2Z0d2FyZTsgaXQgYXBwbGllcyBhbHNvIHRvCithbnkgb3RoZXIgd29yayByZWxlYXNlZCB0aGlzIHdheSBieSBpdHMgYXV0aG9ycy4gIFlvdSBjYW4gYXBwbHkgaXQgdG8KK3lvdXIgcHJvZ3JhbXMsIHRvby4KKworICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90CitwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91CitoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCit0aGVtIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0IGlmIHlvdQord2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdCBpbiBuZXcKK2ZyZWUgcHJvZ3JhbXMsIGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgorCisgIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gcHJldmVudCBvdGhlcnMgZnJvbSBkZW55aW5nIHlvdQordGhlc2UgcmlnaHRzIG9yIGFza2luZyB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuICBUaGVyZWZvcmUsIHlvdSBoYXZlCitjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYKK3lvdSBtb2RpZnkgaXQ6IHJlc3BvbnNpYmlsaXRpZXMgdG8gcmVzcGVjdCB0aGUgZnJlZWRvbSBvZiBvdGhlcnMuCisKKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlcgorZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgcGFzcyBvbiB0byB0aGUgcmVjaXBpZW50cyB0aGUgc2FtZQorZnJlZWRvbXMgdGhhdCB5b3UgcmVjZWl2ZWQuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUKK29yIGNhbiBnZXQgdGhlIHNvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5Citrbm93IHRoZWlyIHJpZ2h0cy4KKworICBEZXZlbG9wZXJzIHRoYXQgdXNlIHRoZSBHTlUgR1BMIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6CisoMSkgYXNzZXJ0IGNvcHlyaWdodCBvbiB0aGUgc29mdHdhcmUsIGFuZCAoMikgb2ZmZXIgeW91IHRoaXMgTGljZW5zZQorZ2l2aW5nIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSBpdC4KKworICBGb3IgdGhlIGRldmVsb3BlcnMnIGFuZCBhdXRob3JzJyBwcm90ZWN0aW9uLCB0aGUgR1BMIGNsZWFybHkgZXhwbGFpbnMKK3RoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZSBzb2Z0d2FyZS4gIEZvciBib3RoIHVzZXJzJyBhbmQKK2F1dGhvcnMnIHNha2UsIHRoZSBHUEwgcmVxdWlyZXMgdGhhdCBtb2RpZmllZCB2ZXJzaW9ucyBiZSBtYXJrZWQgYXMKK2NoYW5nZWQsIHNvIHRoYXQgdGhlaXIgcHJvYmxlbXMgd2lsbCBub3QgYmUgYXR0cmlidXRlZCBlcnJvbmVvdXNseSB0bworYXV0aG9ycyBvZiBwcmV2aW91cyB2ZXJzaW9ucy4KKworICBTb21lIGRldmljZXMgYXJlIGRlc2lnbmVkIHRvIGRlbnkgdXNlcnMgYWNjZXNzIHRvIGluc3RhbGwgb3IgcnVuCittb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgc29mdHdhcmUgaW5zaWRlIHRoZW0sIGFsdGhvdWdoIHRoZSBtYW51ZmFjdHVyZXIKK2NhbiBkbyBzby4gIFRoaXMgaXMgZnVuZGFtZW50YWxseSBpbmNvbXBhdGlibGUgd2l0aCB0aGUgYWltIG9mCitwcm90ZWN0aW5nIHVzZXJzJyBmcmVlZG9tIHRvIGNoYW5nZSB0aGUgc29mdHdhcmUuICBUaGUgc3lzdGVtYXRpYworcGF0dGVybiBvZiBzdWNoIGFidXNlIG9jY3VycyBpbiB0aGUgYXJlYSBvZiBwcm9kdWN0cyBmb3IgaW5kaXZpZHVhbHMgdG8KK3VzZSwgd2hpY2ggaXMgcHJlY2lzZWx5IHdoZXJlIGl0IGlzIG1vc3QgdW5hY2NlcHRhYmxlLiAgVGhlcmVmb3JlLCB3ZQoraGF2ZSBkZXNpZ25lZCB0aGlzIHZlcnNpb24gb2YgdGhlIEdQTCB0byBwcm9oaWJpdCB0aGUgcHJhY3RpY2UgZm9yIHRob3NlCitwcm9kdWN0cy4gIElmIHN1Y2ggcHJvYmxlbXMgYXJpc2Ugc3Vic3RhbnRpYWxseSBpbiBvdGhlciBkb21haW5zLCB3ZQorc3RhbmQgcmVhZHkgdG8gZXh0ZW5kIHRoaXMgcHJvdmlzaW9uIHRvIHRob3NlIGRvbWFpbnMgaW4gZnV0dXJlIHZlcnNpb25zCitvZiB0aGUgR1BMLCBhcyBuZWVkZWQgdG8gcHJvdGVjdCB0aGUgZnJlZWRvbSBvZiB1c2Vycy4KKworICBGaW5hbGx5LCBldmVyeSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZSBwYXRlbnRzLgorU3RhdGVzIHNob3VsZCBub3QgYWxsb3cgcGF0ZW50cyB0byByZXN0cmljdCBkZXZlbG9wbWVudCBhbmQgdXNlIG9mCitzb2Z0d2FyZSBvbiBnZW5lcmFsLXB1cnBvc2UgY29tcHV0ZXJzLCBidXQgaW4gdGhvc2UgdGhhdCBkbywgd2Ugd2lzaCB0bworYXZvaWQgdGhlIHNwZWNpYWwgZGFuZ2VyIHRoYXQgcGF0ZW50cyBhcHBsaWVkIHRvIGEgZnJlZSBwcm9ncmFtIGNvdWxkCittYWtlIGl0IGVmZmVjdGl2ZWx5IHByb3ByaWV0YXJ5LiAgVG8gcHJldmVudCB0aGlzLCB0aGUgR1BMIGFzc3VyZXMgdGhhdAorcGF0ZW50cyBjYW5ub3QgYmUgdXNlZCB0byByZW5kZXIgdGhlIHByb2dyYW0gbm9uLWZyZWUuCisKKyAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKK21vZGlmaWNhdGlvbiBmb2xsb3cuCisKKyAgICAgICAgICAgICAgICAgICAgICAgVEVSTVMgQU5EIENPTkRJVElPTlMKKworICAwLiBEZWZpbml0aW9ucy4KKworICAiVGhpcyBMaWNlbnNlIiByZWZlcnMgdG8gdmVyc2lvbiAzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKworICAiQ29weXJpZ2h0IiBhbHNvIG1lYW5zIGNvcHlyaWdodC1saWtlIGxhd3MgdGhhdCBhcHBseSB0byBvdGhlciBraW5kcyBvZgord29ya3MsIHN1Y2ggYXMgc2VtaWNvbmR1Y3RvciBtYXNrcy4KKworICAiVGhlIFByb2dyYW0iIHJlZmVycyB0byBhbnkgY29weXJpZ2h0YWJsZSB3b3JrIGxpY2Vuc2VkIHVuZGVyIHRoaXMKK0xpY2Vuc2UuICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4gICJMaWNlbnNlZXMiIGFuZAorInJlY2lwaWVudHMiIG1heSBiZSBpbmRpdmlkdWFscyBvciBvcmdhbml6YXRpb25zLgorCisgIFRvICJtb2RpZnkiIGEgd29yayBtZWFucyB0byBjb3B5IGZyb20gb3IgYWRhcHQgYWxsIG9yIHBhcnQgb2YgdGhlIHdvcmsKK2luIGEgZmFzaGlvbiByZXF1aXJpbmcgY29weXJpZ2h0IHBlcm1pc3Npb24sIG90aGVyIHRoYW4gdGhlIG1ha2luZyBvZiBhbgorZXhhY3QgY29weS4gIFRoZSByZXN1bHRpbmcgd29yayBpcyBjYWxsZWQgYSAibW9kaWZpZWQgdmVyc2lvbiIgb2YgdGhlCitlYXJsaWVyIHdvcmsgb3IgYSB3b3JrICJiYXNlZCBvbiIgdGhlIGVhcmxpZXIgd29yay4KKworICBBICJjb3ZlcmVkIHdvcmsiIG1lYW5zIGVpdGhlciB0aGUgdW5tb2RpZmllZCBQcm9ncmFtIG9yIGEgd29yayBiYXNlZAorb24gdGhlIFByb2dyYW0uCisKKyAgVG8gInByb3BhZ2F0ZSIgYSB3b3JrIG1lYW5zIHRvIGRvIGFueXRoaW5nIHdpdGggaXQgdGhhdCwgd2l0aG91dAorcGVybWlzc2lvbiwgd291bGQgbWFrZSB5b3UgZGlyZWN0bHkgb3Igc2Vjb25kYXJpbHkgbGlhYmxlIGZvcgoraW5mcmluZ2VtZW50IHVuZGVyIGFwcGxpY2FibGUgY29weXJpZ2h0IGxhdywgZXhjZXB0IGV4ZWN1dGluZyBpdCBvbiBhCitjb21wdXRlciBvciBtb2RpZnlpbmcgYSBwcml2YXRlIGNvcHkuICBQcm9wYWdhdGlvbiBpbmNsdWRlcyBjb3B5aW5nLAorZGlzdHJpYnV0aW9uICh3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uKSwgbWFraW5nIGF2YWlsYWJsZSB0byB0aGUKK3B1YmxpYywgYW5kIGluIHNvbWUgY291bnRyaWVzIG90aGVyIGFjdGl2aXRpZXMgYXMgd2VsbC4KKworICBUbyAiY29udmV5IiBhIHdvcmsgbWVhbnMgYW55IGtpbmQgb2YgcHJvcGFnYXRpb24gdGhhdCBlbmFibGVzIG90aGVyCitwYXJ0aWVzIHRvIG1ha2Ugb3IgcmVjZWl2ZSBjb3BpZXMuICBNZXJlIGludGVyYWN0aW9uIHdpdGggYSB1c2VyIHRocm91Z2gKK2EgY29tcHV0ZXIgbmV0d29yaywgd2l0aCBubyB0cmFuc2ZlciBvZiBhIGNvcHksIGlzIG5vdCBjb252ZXlpbmcuCisKKyAgQW4gaW50ZXJhY3RpdmUgdXNlciBpbnRlcmZhY2UgZGlzcGxheXMgIkFwcHJvcHJpYXRlIExlZ2FsIE5vdGljZXMiCit0byB0aGUgZXh0ZW50IHRoYXQgaXQgaW5jbHVkZXMgYSBjb252ZW5pZW50IGFuZCBwcm9taW5lbnRseSB2aXNpYmxlCitmZWF0dXJlIHRoYXQgKDEpIGRpc3BsYXlzIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UsIGFuZCAoMikKK3RlbGxzIHRoZSB1c2VyIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoZSB3b3JrIChleGNlcHQgdG8gdGhlCitleHRlbnQgdGhhdCB3YXJyYW50aWVzIGFyZSBwcm92aWRlZCksIHRoYXQgbGljZW5zZWVzIG1heSBjb252ZXkgdGhlCit3b3JrIHVuZGVyIHRoaXMgTGljZW5zZSwgYW5kIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzIExpY2Vuc2UuICBJZgordGhlIGludGVyZmFjZSBwcmVzZW50cyBhIGxpc3Qgb2YgdXNlciBjb21tYW5kcyBvciBvcHRpb25zLCBzdWNoIGFzIGEKK21lbnUsIGEgcHJvbWluZW50IGl0ZW0gaW4gdGhlIGxpc3QgbWVldHMgdGhpcyBjcml0ZXJpb24uCisKKyAgMS4gU291cmNlIENvZGUuCisKKyAgVGhlICJzb3VyY2UgY29kZSIgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsKK2ZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gICJPYmplY3QgY29kZSIgbWVhbnMgYW55IG5vbi1zb3VyY2UKK2Zvcm0gb2YgYSB3b3JrLgorCisgIEEgIlN0YW5kYXJkIEludGVyZmFjZSIgbWVhbnMgYW4gaW50ZXJmYWNlIHRoYXQgZWl0aGVyIGlzIGFuIG9mZmljaWFsCitzdGFuZGFyZCBkZWZpbmVkIGJ5IGEgcmVjb2duaXplZCBzdGFuZGFyZHMgYm9keSwgb3IsIGluIHRoZSBjYXNlIG9mCitpbnRlcmZhY2VzIHNwZWNpZmllZCBmb3IgYSBwYXJ0aWN1bGFyIHByb2dyYW1taW5nIGxhbmd1YWdlLCBvbmUgdGhhdAoraXMgd2lkZWx5IHVzZWQgYW1vbmcgZGV2ZWxvcGVycyB3b3JraW5nIGluIHRoYXQgbGFuZ3VhZ2UuCisKKyAgVGhlICJTeXN0ZW0gTGlicmFyaWVzIiBvZiBhbiBleGVjdXRhYmxlIHdvcmsgaW5jbHVkZSBhbnl0aGluZywgb3RoZXIKK3RoYW4gdGhlIHdvcmsgYXMgYSB3aG9sZSwgdGhhdCAoYSkgaXMgaW5jbHVkZWQgaW4gdGhlIG5vcm1hbCBmb3JtIG9mCitwYWNrYWdpbmcgYSBNYWpvciBDb21wb25lbnQsIGJ1dCB3aGljaCBpcyBub3QgcGFydCBvZiB0aGF0IE1ham9yCitDb21wb25lbnQsIGFuZCAoYikgc2VydmVzIG9ubHkgdG8gZW5hYmxlIHVzZSBvZiB0aGUgd29yayB3aXRoIHRoYXQKK01ham9yIENvbXBvbmVudCwgb3IgdG8gaW1wbGVtZW50IGEgU3RhbmRhcmQgSW50ZXJmYWNlIGZvciB3aGljaCBhbgoraW1wbGVtZW50YXRpb24gaXMgYXZhaWxhYmxlIHRvIHRoZSBwdWJsaWMgaW4gc291cmNlIGNvZGUgZm9ybS4gIEEKKyJNYWpvciBDb21wb25lbnQiLCBpbiB0aGlzIGNvbnRleHQsIG1lYW5zIGEgbWFqb3IgZXNzZW50aWFsIGNvbXBvbmVudAorKGtlcm5lbCwgd2luZG93IHN5c3RlbSwgYW5kIHNvIG9uKSBvZiB0aGUgc3BlY2lmaWMgb3BlcmF0aW5nIHN5c3RlbQorKGlmIGFueSkgb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgd29yayBydW5zLCBvciBhIGNvbXBpbGVyIHVzZWQgdG8KK3Byb2R1Y2UgdGhlIHdvcmssIG9yIGFuIG9iamVjdCBjb2RlIGludGVycHJldGVyIHVzZWQgdG8gcnVuIGl0LgorCisgIFRoZSAiQ29ycmVzcG9uZGluZyBTb3VyY2UiIGZvciBhIHdvcmsgaW4gb2JqZWN0IGNvZGUgZm9ybSBtZWFucyBhbGwKK3RoZSBzb3VyY2UgY29kZSBuZWVkZWQgdG8gZ2VuZXJhdGUsIGluc3RhbGwsIGFuZCAoZm9yIGFuIGV4ZWN1dGFibGUKK3dvcmspIHJ1biB0aGUgb2JqZWN0IGNvZGUgYW5kIHRvIG1vZGlmeSB0aGUgd29yaywgaW5jbHVkaW5nIHNjcmlwdHMgdG8KK2NvbnRyb2wgdGhvc2UgYWN0aXZpdGllcy4gIEhvd2V2ZXIsIGl0IGRvZXMgbm90IGluY2x1ZGUgdGhlIHdvcmsncworU3lzdGVtIExpYnJhcmllcywgb3IgZ2VuZXJhbC1wdXJwb3NlIHRvb2xzIG9yIGdlbmVyYWxseSBhdmFpbGFibGUgZnJlZQorcHJvZ3JhbXMgd2hpY2ggYXJlIHVzZWQgdW5tb2RpZmllZCBpbiBwZXJmb3JtaW5nIHRob3NlIGFjdGl2aXRpZXMgYnV0Cit3aGljaCBhcmUgbm90IHBhcnQgb2YgdGhlIHdvcmsuICBGb3IgZXhhbXBsZSwgQ29ycmVzcG9uZGluZyBTb3VyY2UKK2luY2x1ZGVzIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBzb3VyY2UgZmlsZXMgZm9yCit0aGUgd29yaywgYW5kIHRoZSBzb3VyY2UgY29kZSBmb3Igc2hhcmVkIGxpYnJhcmllcyBhbmQgZHluYW1pY2FsbHkKK2xpbmtlZCBzdWJwcm9ncmFtcyB0aGF0IHRoZSB3b3JrIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byByZXF1aXJlLAorc3VjaCBhcyBieSBpbnRpbWF0ZSBkYXRhIGNvbW11bmljYXRpb24gb3IgY29udHJvbCBmbG93IGJldHdlZW4gdGhvc2UKK3N1YnByb2dyYW1zIGFuZCBvdGhlciBwYXJ0cyBvZiB0aGUgd29yay4KKworICBUaGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgbmVlZCBub3QgaW5jbHVkZSBhbnl0aGluZyB0aGF0IHVzZXJzCitjYW4gcmVnZW5lcmF0ZSBhdXRvbWF0aWNhbGx5IGZyb20gb3RoZXIgcGFydHMgb2YgdGhlIENvcnJlc3BvbmRpbmcKK1NvdXJjZS4KKworICBUaGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgZm9yIGEgd29yayBpbiBzb3VyY2UgY29kZSBmb3JtIGlzIHRoYXQKK3NhbWUgd29yay4KKworICAyLiBCYXNpYyBQZXJtaXNzaW9ucy4KKworICBBbGwgcmlnaHRzIGdyYW50ZWQgdW5kZXIgdGhpcyBMaWNlbnNlIGFyZSBncmFudGVkIGZvciB0aGUgdGVybSBvZgorY29weXJpZ2h0IG9uIHRoZSBQcm9ncmFtLCBhbmQgYXJlIGlycmV2b2NhYmxlIHByb3ZpZGVkIHRoZSBzdGF0ZWQKK2NvbmRpdGlvbnMgYXJlIG1ldC4gIFRoaXMgTGljZW5zZSBleHBsaWNpdGx5IGFmZmlybXMgeW91ciB1bmxpbWl0ZWQKK3Blcm1pc3Npb24gdG8gcnVuIHRoZSB1bm1vZGlmaWVkIFByb2dyYW0uICBUaGUgb3V0cHV0IGZyb20gcnVubmluZyBhCitjb3ZlcmVkIHdvcmsgaXMgY292ZXJlZCBieSB0aGlzIExpY2Vuc2Ugb25seSBpZiB0aGUgb3V0cHV0LCBnaXZlbiBpdHMKK2NvbnRlbnQsIGNvbnN0aXR1dGVzIGEgY292ZXJlZCB3b3JrLiAgVGhpcyBMaWNlbnNlIGFja25vd2xlZGdlcyB5b3VyCityaWdodHMgb2YgZmFpciB1c2Ugb3Igb3RoZXIgZXF1aXZhbGVudCwgYXMgcHJvdmlkZWQgYnkgY29weXJpZ2h0IGxhdy4KKworICBZb3UgbWF5IG1ha2UsIHJ1biBhbmQgcHJvcGFnYXRlIGNvdmVyZWQgd29ya3MgdGhhdCB5b3UgZG8gbm90Citjb252ZXksIHdpdGhvdXQgY29uZGl0aW9ucyBzbyBsb25nIGFzIHlvdXIgbGljZW5zZSBvdGhlcndpc2UgcmVtYWlucworaW4gZm9yY2UuICBZb3UgbWF5IGNvbnZleSBjb3ZlcmVkIHdvcmtzIHRvIG90aGVycyBmb3IgdGhlIHNvbGUgcHVycG9zZQorb2YgaGF2aW5nIHRoZW0gbWFrZSBtb2RpZmljYXRpb25zIGV4Y2x1c2l2ZWx5IGZvciB5b3UsIG9yIHByb3ZpZGUgeW91Cit3aXRoIGZhY2lsaXRpZXMgZm9yIHJ1bm5pbmcgdGhvc2Ugd29ya3MsIHByb3ZpZGVkIHRoYXQgeW91IGNvbXBseSB3aXRoCit0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIGluIGNvbnZleWluZyBhbGwgbWF0ZXJpYWwgZm9yIHdoaWNoIHlvdSBkbworbm90IGNvbnRyb2wgY29weXJpZ2h0LiAgVGhvc2UgdGh1cyBtYWtpbmcgb3IgcnVubmluZyB0aGUgY292ZXJlZCB3b3JrcworZm9yIHlvdSBtdXN0IGRvIHNvIGV4Y2x1c2l2ZWx5IG9uIHlvdXIgYmVoYWxmLCB1bmRlciB5b3VyIGRpcmVjdGlvbgorYW5kIGNvbnRyb2wsIG9uIHRlcm1zIHRoYXQgcHJvaGliaXQgdGhlbSBmcm9tIG1ha2luZyBhbnkgY29waWVzIG9mCit5b3VyIGNvcHlyaWdodGVkIG1hdGVyaWFsIG91dHNpZGUgdGhlaXIgcmVsYXRpb25zaGlwIHdpdGggeW91LgorCisgIENvbnZleWluZyB1bmRlciBhbnkgb3RoZXIgY2lyY3Vtc3RhbmNlcyBpcyBwZXJtaXR0ZWQgc29sZWx5IHVuZGVyCit0aGUgY29uZGl0aW9ucyBzdGF0ZWQgYmVsb3cuICBTdWJsaWNlbnNpbmcgaXMgbm90IGFsbG93ZWQ7IHNlY3Rpb24gMTAKK21ha2VzIGl0IHVubmVjZXNzYXJ5LgorCisgIDMuIFByb3RlY3RpbmcgVXNlcnMnIExlZ2FsIFJpZ2h0cyBGcm9tIEFudGktQ2lyY3VtdmVudGlvbiBMYXcuCisKKyAgTm8gY292ZXJlZCB3b3JrIHNoYWxsIGJlIGRlZW1lZCBwYXJ0IG9mIGFuIGVmZmVjdGl2ZSB0ZWNobm9sb2dpY2FsCittZWFzdXJlIHVuZGVyIGFueSBhcHBsaWNhYmxlIGxhdyBmdWxmaWxsaW5nIG9ibGlnYXRpb25zIHVuZGVyIGFydGljbGUKKzExIG9mIHRoZSBXSVBPIGNvcHlyaWdodCB0cmVhdHkgYWRvcHRlZCBvbiAyMCBEZWNlbWJlciAxOTk2LCBvcgorc2ltaWxhciBsYXdzIHByb2hpYml0aW5nIG9yIHJlc3RyaWN0aW5nIGNpcmN1bXZlbnRpb24gb2Ygc3VjaAorbWVhc3VyZXMuCisKKyAgV2hlbiB5b3UgY29udmV5IGEgY292ZXJlZCB3b3JrLCB5b3Ugd2FpdmUgYW55IGxlZ2FsIHBvd2VyIHRvIGZvcmJpZAorY2lyY3VtdmVudGlvbiBvZiB0ZWNobm9sb2dpY2FsIG1lYXN1cmVzIHRvIHRoZSBleHRlbnQgc3VjaCBjaXJjdW12ZW50aW9uCitpcyBlZmZlY3RlZCBieSBleGVyY2lzaW5nIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2Ugd2l0aCByZXNwZWN0IHRvCit0aGUgY292ZXJlZCB3b3JrLCBhbmQgeW91IGRpc2NsYWltIGFueSBpbnRlbnRpb24gdG8gbGltaXQgb3BlcmF0aW9uIG9yCittb2RpZmljYXRpb24gb2YgdGhlIHdvcmsgYXMgYSBtZWFucyBvZiBlbmZvcmNpbmcsIGFnYWluc3QgdGhlIHdvcmsncwordXNlcnMsIHlvdXIgb3IgdGhpcmQgcGFydGllcycgbGVnYWwgcmlnaHRzIHRvIGZvcmJpZCBjaXJjdW12ZW50aW9uIG9mCit0ZWNobm9sb2dpY2FsIG1lYXN1cmVzLgorCisgIDQuIENvbnZleWluZyBWZXJiYXRpbSBDb3BpZXMuCisKKyAgWW91IG1heSBjb252ZXkgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3Mgc291cmNlIGNvZGUgYXMgeW91CityZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdSBjb25zcGljdW91c2x5IGFuZAorYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlOwora2VlcCBpbnRhY3QgYWxsIG5vdGljZXMgc3RhdGluZyB0aGF0IHRoaXMgTGljZW5zZSBhbmQgYW55Citub24tcGVybWlzc2l2ZSB0ZXJtcyBhZGRlZCBpbiBhY2NvcmQgd2l0aCBzZWN0aW9uIDcgYXBwbHkgdG8gdGhlIGNvZGU7CitrZWVwIGludGFjdCBhbGwgbm90aWNlcyBvZiB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7IGFuZCBnaXZlIGFsbAorcmVjaXBpZW50cyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIFByb2dyYW0uCisKKyAgWW91IG1heSBjaGFyZ2UgYW55IHByaWNlIG9yIG5vIHByaWNlIGZvciBlYWNoIGNvcHkgdGhhdCB5b3UgY29udmV5LAorYW5kIHlvdSBtYXkgb2ZmZXIgc3VwcG9ydCBvciB3YXJyYW50eSBwcm90ZWN0aW9uIGZvciBhIGZlZS4KKworICA1LiBDb252ZXlpbmcgTW9kaWZpZWQgU291cmNlIFZlcnNpb25zLgorCisgIFlvdSBtYXkgY29udmV5IGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgb3IgdGhlIG1vZGlmaWNhdGlvbnMgdG8KK3Byb2R1Y2UgaXQgZnJvbSB0aGUgUHJvZ3JhbSwgaW4gdGhlIGZvcm0gb2Ygc291cmNlIGNvZGUgdW5kZXIgdGhlCit0ZXJtcyBvZiBzZWN0aW9uIDQsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKKworICAgIGEpIFRoZSB3b3JrIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBtb2RpZmllZAorICAgIGl0LCBhbmQgZ2l2aW5nIGEgcmVsZXZhbnQgZGF0ZS4KKworICAgIGIpIFRoZSB3b3JrIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IGl0IGlzCisgICAgcmVsZWFzZWQgdW5kZXIgdGhpcyBMaWNlbnNlIGFuZCBhbnkgY29uZGl0aW9ucyBhZGRlZCB1bmRlciBzZWN0aW9uCisgICAgNy4gIFRoaXMgcmVxdWlyZW1lbnQgbW9kaWZpZXMgdGhlIHJlcXVpcmVtZW50IGluIHNlY3Rpb24gNCB0bworICAgICJrZWVwIGludGFjdCBhbGwgbm90aWNlcyIuCisKKyAgICBjKSBZb3UgbXVzdCBsaWNlbnNlIHRoZSBlbnRpcmUgd29yaywgYXMgYSB3aG9sZSwgdW5kZXIgdGhpcworICAgIExpY2Vuc2UgdG8gYW55b25lIHdobyBjb21lcyBpbnRvIHBvc3Nlc3Npb24gb2YgYSBjb3B5LiAgVGhpcworICAgIExpY2Vuc2Ugd2lsbCB0aGVyZWZvcmUgYXBwbHksIGFsb25nIHdpdGggYW55IGFwcGxpY2FibGUgc2VjdGlvbiA3CisgICAgYWRkaXRpb25hbCB0ZXJtcywgdG8gdGhlIHdob2xlIG9mIHRoZSB3b3JrLCBhbmQgYWxsIGl0cyBwYXJ0cywKKyAgICByZWdhcmRsZXNzIG9mIGhvdyB0aGV5IGFyZSBwYWNrYWdlZC4gIFRoaXMgTGljZW5zZSBnaXZlcyBubworICAgIHBlcm1pc3Npb24gdG8gbGljZW5zZSB0aGUgd29yayBpbiBhbnkgb3RoZXIgd2F5LCBidXQgaXQgZG9lcyBub3QKKyAgICBpbnZhbGlkYXRlIHN1Y2ggcGVybWlzc2lvbiBpZiB5b3UgaGF2ZSBzZXBhcmF0ZWx5IHJlY2VpdmVkIGl0LgorCisgICAgZCkgSWYgdGhlIHdvcmsgaGFzIGludGVyYWN0aXZlIHVzZXIgaW50ZXJmYWNlcywgZWFjaCBtdXN0IGRpc3BsYXkKKyAgICBBcHByb3ByaWF0ZSBMZWdhbCBOb3RpY2VzOyBob3dldmVyLCBpZiB0aGUgUHJvZ3JhbSBoYXMgaW50ZXJhY3RpdmUKKyAgICBpbnRlcmZhY2VzIHRoYXQgZG8gbm90IGRpc3BsYXkgQXBwcm9wcmlhdGUgTGVnYWwgTm90aWNlcywgeW91cgorICAgIHdvcmsgbmVlZCBub3QgbWFrZSB0aGVtIGRvIHNvLgorCisgIEEgY29tcGlsYXRpb24gb2YgYSBjb3ZlcmVkIHdvcmsgd2l0aCBvdGhlciBzZXBhcmF0ZSBhbmQgaW5kZXBlbmRlbnQKK3dvcmtzLCB3aGljaCBhcmUgbm90IGJ5IHRoZWlyIG5hdHVyZSBleHRlbnNpb25zIG9mIHRoZSBjb3ZlcmVkIHdvcmssCithbmQgd2hpY2ggYXJlIG5vdCBjb21iaW5lZCB3aXRoIGl0IHN1Y2ggYXMgdG8gZm9ybSBhIGxhcmdlciBwcm9ncmFtLAoraW4gb3Igb24gYSB2b2x1bWUgb2YgYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0sIGlzIGNhbGxlZCBhbgorImFnZ3JlZ2F0ZSIgaWYgdGhlIGNvbXBpbGF0aW9uIGFuZCBpdHMgcmVzdWx0aW5nIGNvcHlyaWdodCBhcmUgbm90Cit1c2VkIHRvIGxpbWl0IHRoZSBhY2Nlc3Mgb3IgbGVnYWwgcmlnaHRzIG9mIHRoZSBjb21waWxhdGlvbidzIHVzZXJzCitiZXlvbmQgd2hhdCB0aGUgaW5kaXZpZHVhbCB3b3JrcyBwZXJtaXQuICBJbmNsdXNpb24gb2YgYSBjb3ZlcmVkIHdvcmsKK2luIGFuIGFnZ3JlZ2F0ZSBkb2VzIG5vdCBjYXVzZSB0aGlzIExpY2Vuc2UgdG8gYXBwbHkgdG8gdGhlIG90aGVyCitwYXJ0cyBvZiB0aGUgYWdncmVnYXRlLgorCisgIDYuIENvbnZleWluZyBOb24tU291cmNlIEZvcm1zLgorCisgIFlvdSBtYXkgY29udmV5IGEgY292ZXJlZCB3b3JrIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgdGhlIHRlcm1zCitvZiBzZWN0aW9ucyA0IGFuZCA1LCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGNvbnZleSB0aGUKK21hY2hpbmUtcmVhZGFibGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSwKK2luIG9uZSBvZiB0aGVzZSB3YXlzOgorCisgICAgYSkgQ29udmV5IHRoZSBvYmplY3QgY29kZSBpbiwgb3IgZW1ib2RpZWQgaW4sIGEgcGh5c2ljYWwgcHJvZHVjdAorICAgIChpbmNsdWRpbmcgYSBwaHlzaWNhbCBkaXN0cmlidXRpb24gbWVkaXVtKSwgYWNjb21wYW5pZWQgYnkgdGhlCisgICAgQ29ycmVzcG9uZGluZyBTb3VyY2UgZml4ZWQgb24gYSBkdXJhYmxlIHBoeXNpY2FsIG1lZGl1bQorICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlLgorCisgICAgYikgQ29udmV5IHRoZSBvYmplY3QgY29kZSBpbiwgb3IgZW1ib2RpZWQgaW4sIGEgcGh5c2ljYWwgcHJvZHVjdAorICAgIChpbmNsdWRpbmcgYSBwaHlzaWNhbCBkaXN0cmlidXRpb24gbWVkaXVtKSwgYWNjb21wYW5pZWQgYnkgYQorICAgIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZSB5ZWFycyBhbmQgdmFsaWQgZm9yIGFzCisgICAgbG9uZyBhcyB5b3Ugb2ZmZXIgc3BhcmUgcGFydHMgb3IgY3VzdG9tZXIgc3VwcG9ydCBmb3IgdGhhdCBwcm9kdWN0CisgICAgbW9kZWwsIHRvIGdpdmUgYW55b25lIHdobyBwb3NzZXNzZXMgdGhlIG9iamVjdCBjb2RlIGVpdGhlciAoMSkgYQorICAgIGNvcHkgb2YgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlIGZvciBhbGwgdGhlIHNvZnR3YXJlIGluIHRoZQorICAgIHByb2R1Y3QgdGhhdCBpcyBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZSwgb24gYSBkdXJhYmxlIHBoeXNpY2FsCisgICAgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlLCBmb3IgYSBwcmljZSBubworICAgIG1vcmUgdGhhbiB5b3VyIHJlYXNvbmFibGUgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgdGhpcworICAgIGNvbnZleWluZyBvZiBzb3VyY2UsIG9yICgyKSBhY2Nlc3MgdG8gY29weSB0aGUKKyAgICBDb3JyZXNwb25kaW5nIFNvdXJjZSBmcm9tIGEgbmV0d29yayBzZXJ2ZXIgYXQgbm8gY2hhcmdlLgorCisgICAgYykgQ29udmV5IGluZGl2aWR1YWwgY29waWVzIG9mIHRoZSBvYmplY3QgY29kZSB3aXRoIGEgY29weSBvZiB0aGUKKyAgICB3cml0dGVuIG9mZmVyIHRvIHByb3ZpZGUgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlLiAgVGhpcworICAgIGFsdGVybmF0aXZlIGlzIGFsbG93ZWQgb25seSBvY2Nhc2lvbmFsbHkgYW5kIG5vbmNvbW1lcmNpYWxseSwgYW5kCisgICAgb25seSBpZiB5b3UgcmVjZWl2ZWQgdGhlIG9iamVjdCBjb2RlIHdpdGggc3VjaCBhbiBvZmZlciwgaW4gYWNjb3JkCisgICAgd2l0aCBzdWJzZWN0aW9uIDZiLgorCisgICAgZCkgQ29udmV5IHRoZSBvYmplY3QgY29kZSBieSBvZmZlcmluZyBhY2Nlc3MgZnJvbSBhIGRlc2lnbmF0ZWQKKyAgICBwbGFjZSAoZ3JhdGlzIG9yIGZvciBhIGNoYXJnZSksIGFuZCBvZmZlciBlcXVpdmFsZW50IGFjY2VzcyB0byB0aGUKKyAgICBDb3JyZXNwb25kaW5nIFNvdXJjZSBpbiB0aGUgc2FtZSB3YXkgdGhyb3VnaCB0aGUgc2FtZSBwbGFjZSBhdCBubworICAgIGZ1cnRoZXIgY2hhcmdlLiAgWW91IG5lZWQgbm90IHJlcXVpcmUgcmVjaXBpZW50cyB0byBjb3B5IHRoZQorICAgIENvcnJlc3BvbmRpbmcgU291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLiAgSWYgdGhlIHBsYWNlIHRvCisgICAgY29weSB0aGUgb2JqZWN0IGNvZGUgaXMgYSBuZXR3b3JrIHNlcnZlciwgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlCisgICAgbWF5IGJlIG9uIGEgZGlmZmVyZW50IHNlcnZlciAob3BlcmF0ZWQgYnkgeW91IG9yIGEgdGhpcmQgcGFydHkpCisgICAgdGhhdCBzdXBwb3J0cyBlcXVpdmFsZW50IGNvcHlpbmcgZmFjaWxpdGllcywgcHJvdmlkZWQgeW91IG1haW50YWluCisgICAgY2xlYXIgZGlyZWN0aW9ucyBuZXh0IHRvIHRoZSBvYmplY3QgY29kZSBzYXlpbmcgd2hlcmUgdG8gZmluZCB0aGUKKyAgICBDb3JyZXNwb25kaW5nIFNvdXJjZS4gIFJlZ2FyZGxlc3Mgb2Ygd2hhdCBzZXJ2ZXIgaG9zdHMgdGhlCisgICAgQ29ycmVzcG9uZGluZyBTb3VyY2UsIHlvdSByZW1haW4gb2JsaWdhdGVkIHRvIGVuc3VyZSB0aGF0IGl0IGlzCisgICAgYXZhaWxhYmxlIGZvciBhcyBsb25nIGFzIG5lZWRlZCB0byBzYXRpc2Z5IHRoZXNlIHJlcXVpcmVtZW50cy4KKworICAgIGUpIENvbnZleSB0aGUgb2JqZWN0IGNvZGUgdXNpbmcgcGVlci10by1wZWVyIHRyYW5zbWlzc2lvbiwgcHJvdmlkZWQKKyAgICB5b3UgaW5mb3JtIG90aGVyIHBlZXJzIHdoZXJlIHRoZSBvYmplY3QgY29kZSBhbmQgQ29ycmVzcG9uZGluZworICAgIFNvdXJjZSBvZiB0aGUgd29yayBhcmUgYmVpbmcgb2ZmZXJlZCB0byB0aGUgZ2VuZXJhbCBwdWJsaWMgYXQgbm8KKyAgICBjaGFyZ2UgdW5kZXIgc3Vic2VjdGlvbiA2ZC4KKworICBBIHNlcGFyYWJsZSBwb3J0aW9uIG9mIHRoZSBvYmplY3QgY29kZSwgd2hvc2Ugc291cmNlIGNvZGUgaXMgZXhjbHVkZWQKK2Zyb20gdGhlIENvcnJlc3BvbmRpbmcgU291cmNlIGFzIGEgU3lzdGVtIExpYnJhcnksIG5lZWQgbm90IGJlCitpbmNsdWRlZCBpbiBjb252ZXlpbmcgdGhlIG9iamVjdCBjb2RlIHdvcmsuCisKKyAgQSAiVXNlciBQcm9kdWN0IiBpcyBlaXRoZXIgKDEpIGEgImNvbnN1bWVyIHByb2R1Y3QiLCB3aGljaCBtZWFucyBhbnkKK3RhbmdpYmxlIHBlcnNvbmFsIHByb3BlcnR5IHdoaWNoIGlzIG5vcm1hbGx5IHVzZWQgZm9yIHBlcnNvbmFsLCBmYW1pbHksCitvciBob3VzZWhvbGQgcHVycG9zZXMsIG9yICgyKSBhbnl0aGluZyBkZXNpZ25lZCBvciBzb2xkIGZvciBpbmNvcnBvcmF0aW9uCitpbnRvIGEgZHdlbGxpbmcuICBJbiBkZXRlcm1pbmluZyB3aGV0aGVyIGEgcHJvZHVjdCBpcyBhIGNvbnN1bWVyIHByb2R1Y3QsCitkb3VidGZ1bCBjYXNlcyBzaGFsbCBiZSByZXNvbHZlZCBpbiBmYXZvciBvZiBjb3ZlcmFnZS4gIEZvciBhIHBhcnRpY3VsYXIKK3Byb2R1Y3QgcmVjZWl2ZWQgYnkgYSBwYXJ0aWN1bGFyIHVzZXIsICJub3JtYWxseSB1c2VkIiByZWZlcnMgdG8gYQordHlwaWNhbCBvciBjb21tb24gdXNlIG9mIHRoYXQgY2xhc3Mgb2YgcHJvZHVjdCwgcmVnYXJkbGVzcyBvZiB0aGUgc3RhdHVzCitvZiB0aGUgcGFydGljdWxhciB1c2VyIG9yIG9mIHRoZSB3YXkgaW4gd2hpY2ggdGhlIHBhcnRpY3VsYXIgdXNlcgorYWN0dWFsbHkgdXNlcywgb3IgZXhwZWN0cyBvciBpcyBleHBlY3RlZCB0byB1c2UsIHRoZSBwcm9kdWN0LiAgQSBwcm9kdWN0CitpcyBhIGNvbnN1bWVyIHByb2R1Y3QgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBwcm9kdWN0IGhhcyBzdWJzdGFudGlhbAorY29tbWVyY2lhbCwgaW5kdXN0cmlhbCBvciBub24tY29uc3VtZXIgdXNlcywgdW5sZXNzIHN1Y2ggdXNlcyByZXByZXNlbnQKK3RoZSBvbmx5IHNpZ25pZmljYW50IG1vZGUgb2YgdXNlIG9mIHRoZSBwcm9kdWN0LgorCisgICJJbnN0YWxsYXRpb24gSW5mb3JtYXRpb24iIGZvciBhIFVzZXIgUHJvZHVjdCBtZWFucyBhbnkgbWV0aG9kcywKK3Byb2NlZHVyZXMsIGF1dGhvcml6YXRpb24ga2V5cywgb3Igb3RoZXIgaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gaW5zdGFsbAorYW5kIGV4ZWN1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgYSBjb3ZlcmVkIHdvcmsgaW4gdGhhdCBVc2VyIFByb2R1Y3QgZnJvbQorYSBtb2RpZmllZCB2ZXJzaW9uIG9mIGl0cyBDb3JyZXNwb25kaW5nIFNvdXJjZS4gIFRoZSBpbmZvcm1hdGlvbiBtdXN0CitzdWZmaWNlIHRvIGVuc3VyZSB0aGF0IHRoZSBjb250aW51ZWQgZnVuY3Rpb25pbmcgb2YgdGhlIG1vZGlmaWVkIG9iamVjdAorY29kZSBpcyBpbiBubyBjYXNlIHByZXZlbnRlZCBvciBpbnRlcmZlcmVkIHdpdGggc29sZWx5IGJlY2F1c2UKK21vZGlmaWNhdGlvbiBoYXMgYmVlbiBtYWRlLgorCisgIElmIHlvdSBjb252ZXkgYW4gb2JqZWN0IGNvZGUgd29yayB1bmRlciB0aGlzIHNlY3Rpb24gaW4sIG9yIHdpdGgsIG9yCitzcGVjaWZpY2FsbHkgZm9yIHVzZSBpbiwgYSBVc2VyIFByb2R1Y3QsIGFuZCB0aGUgY29udmV5aW5nIG9jY3VycyBhcworcGFydCBvZiBhIHRyYW5zYWN0aW9uIGluIHdoaWNoIHRoZSByaWdodCBvZiBwb3NzZXNzaW9uIGFuZCB1c2Ugb2YgdGhlCitVc2VyIFByb2R1Y3QgaXMgdHJhbnNmZXJyZWQgdG8gdGhlIHJlY2lwaWVudCBpbiBwZXJwZXR1aXR5IG9yIGZvciBhCitmaXhlZCB0ZXJtIChyZWdhcmRsZXNzIG9mIGhvdyB0aGUgdHJhbnNhY3Rpb24gaXMgY2hhcmFjdGVyaXplZCksIHRoZQorQ29ycmVzcG9uZGluZyBTb3VyY2UgY29udmV5ZWQgdW5kZXIgdGhpcyBzZWN0aW9uIG11c3QgYmUgYWNjb21wYW5pZWQKK2J5IHRoZSBJbnN0YWxsYXRpb24gSW5mb3JtYXRpb24uICBCdXQgdGhpcyByZXF1aXJlbWVudCBkb2VzIG5vdCBhcHBseQoraWYgbmVpdGhlciB5b3Ugbm9yIGFueSB0aGlyZCBwYXJ0eSByZXRhaW5zIHRoZSBhYmlsaXR5IHRvIGluc3RhbGwKK21vZGlmaWVkIG9iamVjdCBjb2RlIG9uIHRoZSBVc2VyIFByb2R1Y3QgKGZvciBleGFtcGxlLCB0aGUgd29yayBoYXMKK2JlZW4gaW5zdGFsbGVkIGluIFJPTSkuCisKKyAgVGhlIHJlcXVpcmVtZW50IHRvIHByb3ZpZGUgSW5zdGFsbGF0aW9uIEluZm9ybWF0aW9uIGRvZXMgbm90IGluY2x1ZGUgYQorcmVxdWlyZW1lbnQgdG8gY29udGludWUgdG8gcHJvdmlkZSBzdXBwb3J0IHNlcnZpY2UsIHdhcnJhbnR5LCBvciB1cGRhdGVzCitmb3IgYSB3b3JrIHRoYXQgaGFzIGJlZW4gbW9kaWZpZWQgb3IgaW5zdGFsbGVkIGJ5IHRoZSByZWNpcGllbnQsIG9yIGZvcgordGhlIFVzZXIgUHJvZHVjdCBpbiB3aGljaCBpdCBoYXMgYmVlbiBtb2RpZmllZCBvciBpbnN0YWxsZWQuICBBY2Nlc3MgdG8gYQorbmV0d29yayBtYXkgYmUgZGVuaWVkIHdoZW4gdGhlIG1vZGlmaWNhdGlvbiBpdHNlbGYgbWF0ZXJpYWxseSBhbmQKK2FkdmVyc2VseSBhZmZlY3RzIHRoZSBvcGVyYXRpb24gb2YgdGhlIG5ldHdvcmsgb3IgdmlvbGF0ZXMgdGhlIHJ1bGVzIGFuZAorcHJvdG9jb2xzIGZvciBjb21tdW5pY2F0aW9uIGFjcm9zcyB0aGUgbmV0d29yay4KKworICBDb3JyZXNwb25kaW5nIFNvdXJjZSBjb252ZXllZCwgYW5kIEluc3RhbGxhdGlvbiBJbmZvcm1hdGlvbiBwcm92aWRlZCwKK2luIGFjY29yZCB3aXRoIHRoaXMgc2VjdGlvbiBtdXN0IGJlIGluIGEgZm9ybWF0IHRoYXQgaXMgcHVibGljbHkKK2RvY3VtZW50ZWQgKGFuZCB3aXRoIGFuIGltcGxlbWVudGF0aW9uIGF2YWlsYWJsZSB0byB0aGUgcHVibGljIGluCitzb3VyY2UgY29kZSBmb3JtKSwgYW5kIG11c3QgcmVxdWlyZSBubyBzcGVjaWFsIHBhc3N3b3JkIG9yIGtleSBmb3IKK3VucGFja2luZywgcmVhZGluZyBvciBjb3B5aW5nLgorCisgIDcuIEFkZGl0aW9uYWwgVGVybXMuCisKKyAgIkFkZGl0aW9uYWwgcGVybWlzc2lvbnMiIGFyZSB0ZXJtcyB0aGF0IHN1cHBsZW1lbnQgdGhlIHRlcm1zIG9mIHRoaXMKK0xpY2Vuc2UgYnkgbWFraW5nIGV4Y2VwdGlvbnMgZnJvbSBvbmUgb3IgbW9yZSBvZiBpdHMgY29uZGl0aW9ucy4KK0FkZGl0aW9uYWwgcGVybWlzc2lvbnMgdGhhdCBhcmUgYXBwbGljYWJsZSB0byB0aGUgZW50aXJlIFByb2dyYW0gc2hhbGwKK2JlIHRyZWF0ZWQgYXMgdGhvdWdoIHRoZXkgd2VyZSBpbmNsdWRlZCBpbiB0aGlzIExpY2Vuc2UsIHRvIHRoZSBleHRlbnQKK3RoYXQgdGhleSBhcmUgdmFsaWQgdW5kZXIgYXBwbGljYWJsZSBsYXcuICBJZiBhZGRpdGlvbmFsIHBlcm1pc3Npb25zCithcHBseSBvbmx5IHRvIHBhcnQgb2YgdGhlIFByb2dyYW0sIHRoYXQgcGFydCBtYXkgYmUgdXNlZCBzZXBhcmF0ZWx5Cit1bmRlciB0aG9zZSBwZXJtaXNzaW9ucywgYnV0IHRoZSBlbnRpcmUgUHJvZ3JhbSByZW1haW5zIGdvdmVybmVkIGJ5Cit0aGlzIExpY2Vuc2Ugd2l0aG91dCByZWdhcmQgdG8gdGhlIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMuCisKKyAgV2hlbiB5b3UgY29udmV5IGEgY29weSBvZiBhIGNvdmVyZWQgd29yaywgeW91IG1heSBhdCB5b3VyIG9wdGlvbgorcmVtb3ZlIGFueSBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIGZyb20gdGhhdCBjb3B5LCBvciBmcm9tIGFueSBwYXJ0IG9mCitpdC4gIChBZGRpdGlvbmFsIHBlcm1pc3Npb25zIG1heSBiZSB3cml0dGVuIHRvIHJlcXVpcmUgdGhlaXIgb3duCityZW1vdmFsIGluIGNlcnRhaW4gY2FzZXMgd2hlbiB5b3UgbW9kaWZ5IHRoZSB3b3JrLikgIFlvdSBtYXkgcGxhY2UKK2FkZGl0aW9uYWwgcGVybWlzc2lvbnMgb24gbWF0ZXJpYWwsIGFkZGVkIGJ5IHlvdSB0byBhIGNvdmVyZWQgd29yaywKK2ZvciB3aGljaCB5b3UgaGF2ZSBvciBjYW4gZ2l2ZSBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgcGVybWlzc2lvbi4KKworICBOb3R3aXRoc3RhbmRpbmcgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UsIGZvciBtYXRlcmlhbCB5b3UKK2FkZCB0byBhIGNvdmVyZWQgd29yaywgeW91IG1heSAoaWYgYXV0aG9yaXplZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YKK3RoYXQgbWF0ZXJpYWwpIHN1cHBsZW1lbnQgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSB3aXRoIHRlcm1zOgorCisgICAgYSkgRGlzY2xhaW1pbmcgd2FycmFudHkgb3IgbGltaXRpbmcgbGlhYmlsaXR5IGRpZmZlcmVudGx5IGZyb20gdGhlCisgICAgdGVybXMgb2Ygc2VjdGlvbnMgMTUgYW5kIDE2IG9mIHRoaXMgTGljZW5zZTsgb3IKKworICAgIGIpIFJlcXVpcmluZyBwcmVzZXJ2YXRpb24gb2Ygc3BlY2lmaWVkIHJlYXNvbmFibGUgbGVnYWwgbm90aWNlcyBvcgorICAgIGF1dGhvciBhdHRyaWJ1dGlvbnMgaW4gdGhhdCBtYXRlcmlhbCBvciBpbiB0aGUgQXBwcm9wcmlhdGUgTGVnYWwKKyAgICBOb3RpY2VzIGRpc3BsYXllZCBieSB3b3JrcyBjb250YWluaW5nIGl0OyBvcgorCisgICAgYykgUHJvaGliaXRpbmcgbWlzcmVwcmVzZW50YXRpb24gb2YgdGhlIG9yaWdpbiBvZiB0aGF0IG1hdGVyaWFsLCBvcgorICAgIHJlcXVpcmluZyB0aGF0IG1vZGlmaWVkIHZlcnNpb25zIG9mIHN1Y2ggbWF0ZXJpYWwgYmUgbWFya2VkIGluCisgICAgcmVhc29uYWJsZSB3YXlzIGFzIGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbCB2ZXJzaW9uOyBvcgorCisgICAgZCkgTGltaXRpbmcgdGhlIHVzZSBmb3IgcHVibGljaXR5IHB1cnBvc2VzIG9mIG5hbWVzIG9mIGxpY2Vuc29ycyBvcgorICAgIGF1dGhvcnMgb2YgdGhlIG1hdGVyaWFsOyBvcgorCisgICAgZSkgRGVjbGluaW5nIHRvIGdyYW50IHJpZ2h0cyB1bmRlciB0cmFkZW1hcmsgbGF3IGZvciB1c2Ugb2Ygc29tZQorICAgIHRyYWRlIG5hbWVzLCB0cmFkZW1hcmtzLCBvciBzZXJ2aWNlIG1hcmtzOyBvcgorCisgICAgZikgUmVxdWlyaW5nIGluZGVtbmlmaWNhdGlvbiBvZiBsaWNlbnNvcnMgYW5kIGF1dGhvcnMgb2YgdGhhdAorICAgIG1hdGVyaWFsIGJ5IGFueW9uZSB3aG8gY29udmV5cyB0aGUgbWF0ZXJpYWwgKG9yIG1vZGlmaWVkIHZlcnNpb25zIG9mCisgICAgaXQpIHdpdGggY29udHJhY3R1YWwgYXNzdW1wdGlvbnMgb2YgbGlhYmlsaXR5IHRvIHRoZSByZWNpcGllbnQsIGZvcgorICAgIGFueSBsaWFiaWxpdHkgdGhhdCB0aGVzZSBjb250cmFjdHVhbCBhc3N1bXB0aW9ucyBkaXJlY3RseSBpbXBvc2Ugb24KKyAgICB0aG9zZSBsaWNlbnNvcnMgYW5kIGF1dGhvcnMuCisKKyAgQWxsIG90aGVyIG5vbi1wZXJtaXNzaXZlIGFkZGl0aW9uYWwgdGVybXMgYXJlIGNvbnNpZGVyZWQgImZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyIgd2l0aGluIHRoZSBtZWFuaW5nIG9mIHNlY3Rpb24gMTAuICBJZiB0aGUgUHJvZ3JhbSBhcyB5b3UKK3JlY2VpdmVkIGl0LCBvciBhbnkgcGFydCBvZiBpdCwgY29udGFpbnMgYSBub3RpY2Ugc3RhdGluZyB0aGF0IGl0IGlzCitnb3Zlcm5lZCBieSB0aGlzIExpY2Vuc2UgYWxvbmcgd2l0aCBhIHRlcm0gdGhhdCBpcyBhIGZ1cnRoZXIKK3Jlc3RyaWN0aW9uLCB5b3UgbWF5IHJlbW92ZSB0aGF0IHRlcm0uICBJZiBhIGxpY2Vuc2UgZG9jdW1lbnQgY29udGFpbnMKK2EgZnVydGhlciByZXN0cmljdGlvbiBidXQgcGVybWl0cyByZWxpY2Vuc2luZyBvciBjb252ZXlpbmcgdW5kZXIgdGhpcworTGljZW5zZSwgeW91IG1heSBhZGQgdG8gYSBjb3ZlcmVkIHdvcmsgbWF0ZXJpYWwgZ292ZXJuZWQgYnkgdGhlIHRlcm1zCitvZiB0aGF0IGxpY2Vuc2UgZG9jdW1lbnQsIHByb3ZpZGVkIHRoYXQgdGhlIGZ1cnRoZXIgcmVzdHJpY3Rpb24gZG9lcworbm90IHN1cnZpdmUgc3VjaCByZWxpY2Vuc2luZyBvciBjb252ZXlpbmcuCisKKyAgSWYgeW91IGFkZCB0ZXJtcyB0byBhIGNvdmVyZWQgd29yayBpbiBhY2NvcmQgd2l0aCB0aGlzIHNlY3Rpb24sIHlvdQorbXVzdCBwbGFjZSwgaW4gdGhlIHJlbGV2YW50IHNvdXJjZSBmaWxlcywgYSBzdGF0ZW1lbnQgb2YgdGhlCithZGRpdGlvbmFsIHRlcm1zIHRoYXQgYXBwbHkgdG8gdGhvc2UgZmlsZXMsIG9yIGEgbm90aWNlIGluZGljYXRpbmcKK3doZXJlIHRvIGZpbmQgdGhlIGFwcGxpY2FibGUgdGVybXMuCisKKyAgQWRkaXRpb25hbCB0ZXJtcywgcGVybWlzc2l2ZSBvciBub24tcGVybWlzc2l2ZSwgbWF5IGJlIHN0YXRlZCBpbiB0aGUKK2Zvcm0gb2YgYSBzZXBhcmF0ZWx5IHdyaXR0ZW4gbGljZW5zZSwgb3Igc3RhdGVkIGFzIGV4Y2VwdGlvbnM7Cit0aGUgYWJvdmUgcmVxdWlyZW1lbnRzIGFwcGx5IGVpdGhlciB3YXkuCisKKyAgOC4gVGVybWluYXRpb24uCisKKyAgWW91IG1heSBub3QgcHJvcGFnYXRlIG9yIG1vZGlmeSBhIGNvdmVyZWQgd29yayBleGNlcHQgYXMgZXhwcmVzc2x5Citwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdCBvdGhlcndpc2UgdG8gcHJvcGFnYXRlIG9yCittb2RpZnkgaXQgaXMgdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIKK3RoaXMgTGljZW5zZSAoaW5jbHVkaW5nIGFueSBwYXRlbnQgbGljZW5zZXMgZ3JhbnRlZCB1bmRlciB0aGUgdGhpcmQKK3BhcmFncmFwaCBvZiBzZWN0aW9uIDExKS4KKworICBIb3dldmVyLCBpZiB5b3UgY2Vhc2UgYWxsIHZpb2xhdGlvbiBvZiB0aGlzIExpY2Vuc2UsIHRoZW4geW91cgorbGljZW5zZSBmcm9tIGEgcGFydGljdWxhciBjb3B5cmlnaHQgaG9sZGVyIGlzIHJlaW5zdGF0ZWQgKGEpCitwcm92aXNpb25hbGx5LCB1bmxlc3MgYW5kIHVudGlsIHRoZSBjb3B5cmlnaHQgaG9sZGVyIGV4cGxpY2l0bHkgYW5kCitmaW5hbGx5IHRlcm1pbmF0ZXMgeW91ciBsaWNlbnNlLCBhbmQgKGIpIHBlcm1hbmVudGx5LCBpZiB0aGUgY29weXJpZ2h0Citob2xkZXIgZmFpbHMgdG8gbm90aWZ5IHlvdSBvZiB0aGUgdmlvbGF0aW9uIGJ5IHNvbWUgcmVhc29uYWJsZSBtZWFucworcHJpb3IgdG8gNjAgZGF5cyBhZnRlciB0aGUgY2Vzc2F0aW9uLgorCisgIE1vcmVvdmVyLCB5b3VyIGxpY2Vuc2UgZnJvbSBhIHBhcnRpY3VsYXIgY29weXJpZ2h0IGhvbGRlciBpcworcmVpbnN0YXRlZCBwZXJtYW5lbnRseSBpZiB0aGUgY29weXJpZ2h0IGhvbGRlciBub3RpZmllcyB5b3Ugb2YgdGhlCit2aW9sYXRpb24gYnkgc29tZSByZWFzb25hYmxlIG1lYW5zLCB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHlvdSBoYXZlCityZWNlaXZlZCBub3RpY2Ugb2YgdmlvbGF0aW9uIG9mIHRoaXMgTGljZW5zZSAoZm9yIGFueSB3b3JrKSBmcm9tIHRoYXQKK2NvcHlyaWdodCBob2xkZXIsIGFuZCB5b3UgY3VyZSB0aGUgdmlvbGF0aW9uIHByaW9yIHRvIDMwIGRheXMgYWZ0ZXIKK3lvdXIgcmVjZWlwdCBvZiB0aGUgbm90aWNlLgorCisgIFRlcm1pbmF0aW9uIG9mIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgc2VjdGlvbiBkb2VzIG5vdCB0ZXJtaW5hdGUgdGhlCitsaWNlbnNlcyBvZiBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcyBvciByaWdodHMgZnJvbSB5b3UgdW5kZXIKK3RoaXMgTGljZW5zZS4gIElmIHlvdXIgcmlnaHRzIGhhdmUgYmVlbiB0ZXJtaW5hdGVkIGFuZCBub3QgcGVybWFuZW50bHkKK3JlaW5zdGF0ZWQsIHlvdSBkbyBub3QgcXVhbGlmeSB0byByZWNlaXZlIG5ldyBsaWNlbnNlcyBmb3IgdGhlIHNhbWUKK21hdGVyaWFsIHVuZGVyIHNlY3Rpb24gMTAuCisKKyAgOS4gQWNjZXB0YW5jZSBOb3QgUmVxdWlyZWQgZm9yIEhhdmluZyBDb3BpZXMuCisKKyAgWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSBpbiBvcmRlciB0byByZWNlaXZlIG9yCitydW4gYSBjb3B5IG9mIHRoZSBQcm9ncmFtLiAgQW5jaWxsYXJ5IHByb3BhZ2F0aW9uIG9mIGEgY292ZXJlZCB3b3JrCitvY2N1cnJpbmcgc29sZWx5IGFzIGEgY29uc2VxdWVuY2Ugb2YgdXNpbmcgcGVlci10by1wZWVyIHRyYW5zbWlzc2lvbgordG8gcmVjZWl2ZSBhIGNvcHkgbGlrZXdpc2UgZG9lcyBub3QgcmVxdWlyZSBhY2NlcHRhbmNlLiAgSG93ZXZlciwKK25vdGhpbmcgb3RoZXIgdGhhbiB0aGlzIExpY2Vuc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIHByb3BhZ2F0ZSBvcgorbW9kaWZ5IGFueSBjb3ZlcmVkIHdvcmsuICBUaGVzZSBhY3Rpb25zIGluZnJpbmdlIGNvcHlyaWdodCBpZiB5b3UgZG8KK25vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieSBtb2RpZnlpbmcgb3IgcHJvcGFnYXRpbmcgYQorY292ZXJlZCB3b3JrLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzby4KKworICAxMC4gQXV0b21hdGljIExpY2Vuc2luZyBvZiBEb3duc3RyZWFtIFJlY2lwaWVudHMuCisKKyAgRWFjaCB0aW1lIHlvdSBjb252ZXkgYSBjb3ZlcmVkIHdvcmssIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseQorcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlIG9yaWdpbmFsIGxpY2Vuc29ycywgdG8gcnVuLCBtb2RpZnkgYW5kCitwcm9wYWdhdGUgdGhhdCB3b3JrLCBzdWJqZWN0IHRvIHRoaXMgTGljZW5zZS4gIFlvdSBhcmUgbm90IHJlc3BvbnNpYmxlCitmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB3aXRoIHRoaXMgTGljZW5zZS4KKworICBBbiAiZW50aXR5IHRyYW5zYWN0aW9uIiBpcyBhIHRyYW5zYWN0aW9uIHRyYW5zZmVycmluZyBjb250cm9sIG9mIGFuCitvcmdhbml6YXRpb24sIG9yIHN1YnN0YW50aWFsbHkgYWxsIGFzc2V0cyBvZiBvbmUsIG9yIHN1YmRpdmlkaW5nIGFuCitvcmdhbml6YXRpb24sIG9yIG1lcmdpbmcgb3JnYW5pemF0aW9ucy4gIElmIHByb3BhZ2F0aW9uIG9mIGEgY292ZXJlZAord29yayByZXN1bHRzIGZyb20gYW4gZW50aXR5IHRyYW5zYWN0aW9uLCBlYWNoIHBhcnR5IHRvIHRoYXQKK3RyYW5zYWN0aW9uIHdobyByZWNlaXZlcyBhIGNvcHkgb2YgdGhlIHdvcmsgYWxzbyByZWNlaXZlcyB3aGF0ZXZlcgorbGljZW5zZXMgdG8gdGhlIHdvcmsgdGhlIHBhcnR5J3MgcHJlZGVjZXNzb3IgaW4gaW50ZXJlc3QgaGFkIG9yIGNvdWxkCitnaXZlIHVuZGVyIHRoZSBwcmV2aW91cyBwYXJhZ3JhcGgsIHBsdXMgYSByaWdodCB0byBwb3NzZXNzaW9uIG9mIHRoZQorQ29ycmVzcG9uZGluZyBTb3VyY2Ugb2YgdGhlIHdvcmsgZnJvbSB0aGUgcHJlZGVjZXNzb3IgaW4gaW50ZXJlc3QsIGlmCit0aGUgcHJlZGVjZXNzb3IgaGFzIGl0IG9yIGNhbiBnZXQgaXQgd2l0aCByZWFzb25hYmxlIGVmZm9ydHMuCisKKyAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyIHJlc3RyaWN0aW9ucyBvbiB0aGUgZXhlcmNpc2Ugb2YgdGhlCityaWdodHMgZ3JhbnRlZCBvciBhZmZpcm1lZCB1bmRlciB0aGlzIExpY2Vuc2UuICBGb3IgZXhhbXBsZSwgeW91IG1heQorbm90IGltcG9zZSBhIGxpY2Vuc2UgZmVlLCByb3lhbHR5LCBvciBvdGhlciBjaGFyZ2UgZm9yIGV4ZXJjaXNlIG9mCityaWdodHMgZ3JhbnRlZCB1bmRlciB0aGlzIExpY2Vuc2UsIGFuZCB5b3UgbWF5IG5vdCBpbml0aWF0ZSBsaXRpZ2F0aW9uCisoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdAorYW55IHBhdGVudCBjbGFpbSBpcyBpbmZyaW5nZWQgYnkgbWFraW5nLCB1c2luZywgc2VsbGluZywgb2ZmZXJpbmcgZm9yCitzYWxlLCBvciBpbXBvcnRpbmcgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24gb2YgaXQuCisKKyAgMTEuIFBhdGVudHMuCisKKyAgQSAiY29udHJpYnV0b3IiIGlzIGEgY29weXJpZ2h0IGhvbGRlciB3aG8gYXV0aG9yaXplcyB1c2UgdW5kZXIgdGhpcworTGljZW5zZSBvZiB0aGUgUHJvZ3JhbSBvciBhIHdvcmsgb24gd2hpY2ggdGhlIFByb2dyYW0gaXMgYmFzZWQuICBUaGUKK3dvcmsgdGh1cyBsaWNlbnNlZCBpcyBjYWxsZWQgdGhlIGNvbnRyaWJ1dG9yJ3MgImNvbnRyaWJ1dG9yIHZlcnNpb24iLgorCisgIEEgY29udHJpYnV0b3IncyAiZXNzZW50aWFsIHBhdGVudCBjbGFpbXMiIGFyZSBhbGwgcGF0ZW50IGNsYWltcworb3duZWQgb3IgY29udHJvbGxlZCBieSB0aGUgY29udHJpYnV0b3IsIHdoZXRoZXIgYWxyZWFkeSBhY3F1aXJlZCBvcgoraGVyZWFmdGVyIGFjcXVpcmVkLCB0aGF0IHdvdWxkIGJlIGluZnJpbmdlZCBieSBzb21lIG1hbm5lciwgcGVybWl0dGVkCitieSB0aGlzIExpY2Vuc2UsIG9mIG1ha2luZywgdXNpbmcsIG9yIHNlbGxpbmcgaXRzIGNvbnRyaWJ1dG9yIHZlcnNpb24sCitidXQgZG8gbm90IGluY2x1ZGUgY2xhaW1zIHRoYXQgd291bGQgYmUgaW5mcmluZ2VkIG9ubHkgYXMgYQorY29uc2VxdWVuY2Ugb2YgZnVydGhlciBtb2RpZmljYXRpb24gb2YgdGhlIGNvbnRyaWJ1dG9yIHZlcnNpb24uICBGb3IKK3B1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgImNvbnRyb2wiIGluY2x1ZGVzIHRoZSByaWdodCB0byBncmFudAorcGF0ZW50IHN1YmxpY2Vuc2VzIGluIGEgbWFubmVyIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVxdWlyZW1lbnRzIG9mCit0aGlzIExpY2Vuc2UuCisKKyAgRWFjaCBjb250cmlidXRvciBncmFudHMgeW91IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUKK3BhdGVudCBsaWNlbnNlIHVuZGVyIHRoZSBjb250cmlidXRvcidzIGVzc2VudGlhbCBwYXRlbnQgY2xhaW1zLCB0bworbWFrZSwgdXNlLCBzZWxsLCBvZmZlciBmb3Igc2FsZSwgaW1wb3J0IGFuZCBvdGhlcndpc2UgcnVuLCBtb2RpZnkgYW5kCitwcm9wYWdhdGUgdGhlIGNvbnRlbnRzIG9mIGl0cyBjb250cmlidXRvciB2ZXJzaW9uLgorCisgIEluIHRoZSBmb2xsb3dpbmcgdGhyZWUgcGFyYWdyYXBocywgYSAicGF0ZW50IGxpY2Vuc2UiIGlzIGFueSBleHByZXNzCithZ3JlZW1lbnQgb3IgY29tbWl0bWVudCwgaG93ZXZlciBkZW5vbWluYXRlZCwgbm90IHRvIGVuZm9yY2UgYSBwYXRlbnQKKyhzdWNoIGFzIGFuIGV4cHJlc3MgcGVybWlzc2lvbiB0byBwcmFjdGljZSBhIHBhdGVudCBvciBjb3ZlbmFudCBub3QgdG8KK3N1ZSBmb3IgcGF0ZW50IGluZnJpbmdlbWVudCkuICBUbyAiZ3JhbnQiIHN1Y2ggYSBwYXRlbnQgbGljZW5zZSB0byBhCitwYXJ0eSBtZWFucyB0byBtYWtlIHN1Y2ggYW4gYWdyZWVtZW50IG9yIGNvbW1pdG1lbnQgbm90IHRvIGVuZm9yY2UgYQorcGF0ZW50IGFnYWluc3QgdGhlIHBhcnR5LgorCisgIElmIHlvdSBjb252ZXkgYSBjb3ZlcmVkIHdvcmssIGtub3dpbmdseSByZWx5aW5nIG9uIGEgcGF0ZW50IGxpY2Vuc2UsCithbmQgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlIG9mIHRoZSB3b3JrIGlzIG5vdCBhdmFpbGFibGUgZm9yIGFueW9uZQordG8gY29weSwgZnJlZSBvZiBjaGFyZ2UgYW5kIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UsIHRocm91Z2ggYQorcHVibGljbHkgYXZhaWxhYmxlIG5ldHdvcmsgc2VydmVyIG9yIG90aGVyIHJlYWRpbHkgYWNjZXNzaWJsZSBtZWFucywKK3RoZW4geW91IG11c3QgZWl0aGVyICgxKSBjYXVzZSB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgdG8gYmUgc28KK2F2YWlsYWJsZSwgb3IgKDIpIGFycmFuZ2UgdG8gZGVwcml2ZSB5b3Vyc2VsZiBvZiB0aGUgYmVuZWZpdCBvZiB0aGUKK3BhdGVudCBsaWNlbnNlIGZvciB0aGlzIHBhcnRpY3VsYXIgd29yaywgb3IgKDMpIGFycmFuZ2UsIGluIGEgbWFubmVyCitjb25zaXN0ZW50IHdpdGggdGhlIHJlcXVpcmVtZW50cyBvZiB0aGlzIExpY2Vuc2UsIHRvIGV4dGVuZCB0aGUgcGF0ZW50CitsaWNlbnNlIHRvIGRvd25zdHJlYW0gcmVjaXBpZW50cy4gICJLbm93aW5nbHkgcmVseWluZyIgbWVhbnMgeW91IGhhdmUKK2FjdHVhbCBrbm93bGVkZ2UgdGhhdCwgYnV0IGZvciB0aGUgcGF0ZW50IGxpY2Vuc2UsIHlvdXIgY29udmV5aW5nIHRoZQorY292ZXJlZCB3b3JrIGluIGEgY291bnRyeSwgb3IgeW91ciByZWNpcGllbnQncyB1c2Ugb2YgdGhlIGNvdmVyZWQgd29yaworaW4gYSBjb3VudHJ5LCB3b3VsZCBpbmZyaW5nZSBvbmUgb3IgbW9yZSBpZGVudGlmaWFibGUgcGF0ZW50cyBpbiB0aGF0Citjb3VudHJ5IHRoYXQgeW91IGhhdmUgcmVhc29uIHRvIGJlbGlldmUgYXJlIHZhbGlkLgorCisgIElmLCBwdXJzdWFudCB0byBvciBpbiBjb25uZWN0aW9uIHdpdGggYSBzaW5nbGUgdHJhbnNhY3Rpb24gb3IKK2FycmFuZ2VtZW50LCB5b3UgY29udmV5LCBvciBwcm9wYWdhdGUgYnkgcHJvY3VyaW5nIGNvbnZleWFuY2Ugb2YsIGEKK2NvdmVyZWQgd29yaywgYW5kIGdyYW50IGEgcGF0ZW50IGxpY2Vuc2UgdG8gc29tZSBvZiB0aGUgcGFydGllcworcmVjZWl2aW5nIHRoZSBjb3ZlcmVkIHdvcmsgYXV0aG9yaXppbmcgdGhlbSB0byB1c2UsIHByb3BhZ2F0ZSwgbW9kaWZ5CitvciBjb252ZXkgYSBzcGVjaWZpYyBjb3B5IG9mIHRoZSBjb3ZlcmVkIHdvcmssIHRoZW4gdGhlIHBhdGVudCBsaWNlbnNlCit5b3UgZ3JhbnQgaXMgYXV0b21hdGljYWxseSBleHRlbmRlZCB0byBhbGwgcmVjaXBpZW50cyBvZiB0aGUgY292ZXJlZAord29yayBhbmQgd29ya3MgYmFzZWQgb24gaXQuCisKKyAgQSBwYXRlbnQgbGljZW5zZSBpcyAiZGlzY3JpbWluYXRvcnkiIGlmIGl0IGRvZXMgbm90IGluY2x1ZGUgd2l0aGluCit0aGUgc2NvcGUgb2YgaXRzIGNvdmVyYWdlLCBwcm9oaWJpdHMgdGhlIGV4ZXJjaXNlIG9mLCBvciBpcworY29uZGl0aW9uZWQgb24gdGhlIG5vbi1leGVyY2lzZSBvZiBvbmUgb3IgbW9yZSBvZiB0aGUgcmlnaHRzIHRoYXQgYXJlCitzcGVjaWZpY2FsbHkgZ3JhbnRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBZb3UgbWF5IG5vdCBjb252ZXkgYSBjb3ZlcmVkCit3b3JrIGlmIHlvdSBhcmUgYSBwYXJ0eSB0byBhbiBhcnJhbmdlbWVudCB3aXRoIGEgdGhpcmQgcGFydHkgdGhhdCBpcworaW4gdGhlIGJ1c2luZXNzIG9mIGRpc3RyaWJ1dGluZyBzb2Z0d2FyZSwgdW5kZXIgd2hpY2ggeW91IG1ha2UgcGF5bWVudAordG8gdGhlIHRoaXJkIHBhcnR5IGJhc2VkIG9uIHRoZSBleHRlbnQgb2YgeW91ciBhY3Rpdml0eSBvZiBjb252ZXlpbmcKK3RoZSB3b3JrLCBhbmQgdW5kZXIgd2hpY2ggdGhlIHRoaXJkIHBhcnR5IGdyYW50cywgdG8gYW55IG9mIHRoZQorcGFydGllcyB3aG8gd291bGQgcmVjZWl2ZSB0aGUgY292ZXJlZCB3b3JrIGZyb20geW91LCBhIGRpc2NyaW1pbmF0b3J5CitwYXRlbnQgbGljZW5zZSAoYSkgaW4gY29ubmVjdGlvbiB3aXRoIGNvcGllcyBvZiB0aGUgY292ZXJlZCB3b3JrCitjb252ZXllZCBieSB5b3UgKG9yIGNvcGllcyBtYWRlIGZyb20gdGhvc2UgY29waWVzKSwgb3IgKGIpIHByaW1hcmlseQorZm9yIGFuZCBpbiBjb25uZWN0aW9uIHdpdGggc3BlY2lmaWMgcHJvZHVjdHMgb3IgY29tcGlsYXRpb25zIHRoYXQKK2NvbnRhaW4gdGhlIGNvdmVyZWQgd29yaywgdW5sZXNzIHlvdSBlbnRlcmVkIGludG8gdGhhdCBhcnJhbmdlbWVudCwKK29yIHRoYXQgcGF0ZW50IGxpY2Vuc2Ugd2FzIGdyYW50ZWQsIHByaW9yIHRvIDI4IE1hcmNoIDIwMDcuCisKKyAgTm90aGluZyBpbiB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgY29uc3RydWVkIGFzIGV4Y2x1ZGluZyBvciBsaW1pdGluZworYW55IGltcGxpZWQgbGljZW5zZSBvciBvdGhlciBkZWZlbnNlcyB0byBpbmZyaW5nZW1lbnQgdGhhdCBtYXkKK290aGVyd2lzZSBiZSBhdmFpbGFibGUgdG8geW91IHVuZGVyIGFwcGxpY2FibGUgcGF0ZW50IGxhdy4KKworICAxMi4gTm8gU3VycmVuZGVyIG9mIE90aGVycycgRnJlZWRvbS4KKworICBJZiBjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCitvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CitleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdCBjb252ZXkgYQorY292ZXJlZCB3b3JrIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91IG1heQorbm90IGNvbnZleSBpdCBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgeW91IGFncmVlIHRvIHRlcm1zIHRoYXQgb2JsaWdhdGUgeW91Cit0byBjb2xsZWN0IGEgcm95YWx0eSBmb3IgZnVydGhlciBjb252ZXlpbmcgZnJvbSB0aG9zZSB0byB3aG9tIHlvdSBjb252ZXkKK3RoZSBQcm9ncmFtLCB0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCB0aG9zZSB0ZXJtcyBhbmQgdGhpcworTGljZW5zZSB3b3VsZCBiZSB0byByZWZyYWluIGVudGlyZWx5IGZyb20gY29udmV5aW5nIHRoZSBQcm9ncmFtLgorCisgIDEzLiBVc2Ugd2l0aCB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorCisgIE5vdHdpdGhzdGFuZGluZyBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSwgeW91IGhhdmUKK3Blcm1pc3Npb24gdG8gbGluayBvciBjb21iaW5lIGFueSBjb3ZlcmVkIHdvcmsgd2l0aCBhIHdvcmsgbGljZW5zZWQKK3VuZGVyIHZlcnNpb24gMyBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGludG8gYSBzaW5nbGUKK2NvbWJpbmVkIHdvcmssIGFuZCB0byBjb252ZXkgdGhlIHJlc3VsdGluZyB3b3JrLiAgVGhlIHRlcm1zIG9mIHRoaXMKK0xpY2Vuc2Ugd2lsbCBjb250aW51ZSB0byBhcHBseSB0byB0aGUgcGFydCB3aGljaCBpcyB0aGUgY292ZXJlZCB3b3JrLAorYnV0IHRoZSBzcGVjaWFsIHJlcXVpcmVtZW50cyBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorc2VjdGlvbiAxMywgY29uY2VybmluZyBpbnRlcmFjdGlvbiB0aHJvdWdoIGEgbmV0d29yayB3aWxsIGFwcGx5IHRvIHRoZQorY29tYmluYXRpb24gYXMgc3VjaC4KKworICAxNC4gUmV2aXNlZCBWZXJzaW9ucyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMgb2YKK3RoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKK2JlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bworYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCisKKyAgRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUKK1Byb2dyYW0gc3BlY2lmaWVzIHRoYXQgYSBjZXJ0YWluIG51bWJlcmVkIHZlcnNpb24gb2YgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSAib3IgYW55IGxhdGVyIHZlcnNpb24iIGFwcGxpZXMgdG8gaXQsIHlvdSBoYXZlIHRoZQorb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgbnVtYmVyZWQKK3ZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkCitieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgIElmIHRoZSBQcm9ncmFtIHNwZWNpZmllcyB0aGF0IGEgcHJveHkgY2FuIGRlY2lkZSB3aGljaCBmdXR1cmUKK3ZlcnNpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdXNlZCwgdGhhdCBwcm94eSdzCitwdWJsaWMgc3RhdGVtZW50IG9mIGFjY2VwdGFuY2Ugb2YgYSB2ZXJzaW9uIHBlcm1hbmVudGx5IGF1dGhvcml6ZXMgeW91Cit0byBjaG9vc2UgdGhhdCB2ZXJzaW9uIGZvciB0aGUgUHJvZ3JhbS4KKworICBMYXRlciBsaWNlbnNlIHZlcnNpb25zIG1heSBnaXZlIHlvdSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudAorcGVybWlzc2lvbnMuICBIb3dldmVyLCBubyBhZGRpdGlvbmFsIG9ibGlnYXRpb25zIGFyZSBpbXBvc2VkIG9uIGFueQorYXV0aG9yIG9yIGNvcHlyaWdodCBob2xkZXIgYXMgYSByZXN1bHQgb2YgeW91ciBjaG9vc2luZyB0byBmb2xsb3cgYQorbGF0ZXIgdmVyc2lvbi4KKworICAxNS4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4KKworICBUSEVSRSBJUyBOTyBXQVJSQU5UWSBGT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZCitBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOIE9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUCitIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTIFBST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZCitPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKK1RIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKK1BVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNCitJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUgUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YKK0FMTCBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4KKworICAxNi4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuCisKKyAgSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCitXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1PRElGSUVTIEFORC9PUiBDT05WRVlTCitUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkKK0dFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRQorVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRgorREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQKK1BBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgUFJPR1JBTVMpLAorRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorU1VDSCBEQU1BR0VTLgorCisgIDE3LiBJbnRlcnByZXRhdGlvbiBvZiBTZWN0aW9ucyAxNSBhbmQgMTYuCisKKyAgSWYgdGhlIGRpc2NsYWltZXIgb2Ygd2FycmFudHkgYW5kIGxpbWl0YXRpb24gb2YgbGlhYmlsaXR5IHByb3ZpZGVkCithYm92ZSBjYW5ub3QgYmUgZ2l2ZW4gbG9jYWwgbGVnYWwgZWZmZWN0IGFjY29yZGluZyB0byB0aGVpciB0ZXJtcywKK3Jldmlld2luZyBjb3VydHMgc2hhbGwgYXBwbHkgbG9jYWwgbGF3IHRoYXQgbW9zdCBjbG9zZWx5IGFwcHJveGltYXRlcworYW4gYWJzb2x1dGUgd2FpdmVyIG9mIGFsbCBjaXZpbCBsaWFiaWxpdHkgaW4gY29ubmVjdGlvbiB3aXRoIHRoZQorUHJvZ3JhbSwgdW5sZXNzIGEgd2FycmFudHkgb3IgYXNzdW1wdGlvbiBvZiBsaWFiaWxpdHkgYWNjb21wYW5pZXMgYQorY29weSBvZiB0aGUgUHJvZ3JhbSBpbiByZXR1cm4gZm9yIGEgZmVlLgorCisgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKworICAgICAgICAgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCisKKyAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAorZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCisKKyAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKK3RvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKK3N0YXRlIHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QKK3RoZSAiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgorCisgICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KKyAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCitBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KKworICBJZiB0aGUgcHJvZ3JhbSBkb2VzIHRlcm1pbmFsIGludGVyYWN0aW9uLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0Citub3RpY2UgbGlrZSB0aGlzIHdoZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6CisKKyAgICA8cHJvZ3JhbT4gIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+CisgICAgVGhpcyBwcm9ncmFtIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSBgc2hvdyB3Jy4KKyAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0CisgICAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxzLgorCitUaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUKK3BhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB5b3VyIHByb2dyYW0ncyBjb21tYW5kcworbWlnaHQgYmUgZGlmZmVyZW50OyBmb3IgYSBHVUkgaW50ZXJmYWNlLCB5b3Ugd291bGQgdXNlIGFuICJhYm91dCBib3giLgorCisgIFlvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciBzY2hvb2wsCitpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYgbmVjZXNzYXJ5LgorRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcywgYW5kIGhvdyB0byBhcHBseSBhbmQgZm9sbG93IHRoZSBHTlUgR1BMLCBzZWUKKzxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworICBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtCitpbnRvIHByb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UKK21heSBjb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aAordGhlIGxpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExlc3NlciBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4gIEJ1dCBmaXJzdCwgcGxlYXNlIHJlYWQKKzxodHRwOi8vd3d3LmdudS5vcmcvcGhpbG9zb3BoeS93aHktbm90LWxncGwuaHRtbD4uCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9ncHMuYyBiL3JybHAtZXBoZW1lcmlzL2dwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMzU3NDgKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9ncHMuYwpAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIGdwcy5jCisgKgorICogQSBmZXcgdXRpbGl0eSBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIGxvdyBsZXZlbCBHUFMgZGF0YQorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgIFN5bHZhaW4gTXVuYXV0IDx0bnRAMjQ2dE50LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJncHMuaCIKKworCisjZGVmaW5lIEdFVF9GSUVMRF9VKHcsIG5iLCBwb3MpICgoKHcpID4+IChwb3MpKSAmICgoMTw8KG5iKSktMSkpCisjZGVmaW5lIEdFVF9GSUVMRF9TKHcsIG5iLCBwb3MpICgoKGludCkoKHcpIDw8ICgzMi0obmIpLShwb3MpKSkpID4+ICgzMi0obmIpKSkKKworLyoKKyAqIFVucGFja3MgR1BTIFN1YmZyYW1lIDEsMiwzIHBheWxvYWRzICgzICogOCB3b3JkcykKKyAqCisgKiBOb3RlOiBlcGgtPnN2X2lkIGlzIG5vdCBmaWxsZWQgaGVyZSBzaW5jZSBub3QgcHJlc2VudCBpbiB0aG9zZSBzdWJmcmFtZXMKKyAqCisgKiAobm8gcGFyaXR5IGJpdCBjaGVja2luZyBpcyBkb25lLCBvbmx5IHRoZSBsb3dlciAyNCBiaXRzIG9mIGVhY2ggd29yZAorICogIGFyZSB1c2VkKQorICovCitpbnQKK2dwc191bnBhY2tfc2YxMjModWludDMyX3QgKnNmLCBzdHJ1Y3QgZ3BzX2VwaGVtZXJpc19zdiAqZXBoKQoreworCXVpbnQzMl90ICpzZjEgPSAmc2ZbMF07CisJdWludDMyX3QgKnNmMiA9ICZzZls4XTsKKwl1aW50MzJfdCAqc2YzID0gJnNmWzE2XTsKKworCWludCBpb2RlMSwgaW9kZTI7CisKKwllcGgtPndlZWtfbm8JPSBHRVRfRklFTERfVShzZjFbMF0sIDEwLCAxNCk7CisJZXBoLT5jb2RlX29uX2wyCT0gR0VUX0ZJRUxEX1Uoc2YxWzBdLCAgMiwgMTIpOworCWVwaC0+c3ZfdXJhCT0gR0VUX0ZJRUxEX1Uoc2YxWzBdLCAgNCwgIDgpOworCWVwaC0+c3ZfaGVhbHRoCT0gR0VUX0ZJRUxEX1Uoc2YxWzBdLCAgNiwgIDIpOworCWVwaC0+bDJfcF9mbGFnCT0gR0VUX0ZJRUxEX1Uoc2YxWzFdLCAgMSwgMjMpOworCWVwaC0+dF9nZAk9IEdFVF9GSUVMRF9TKHNmMVs0XSwgIDgsICAwKTsKKwllcGgtPmlvZGMJPSAoR0VUX0ZJRUxEX1Uoc2YxWzBdLCAgMiwgIDApIDw8IDgpIHwgXAorCSAgICAgICAgICAgICAgICAgICBHRVRfRklFTERfVShzZjFbNV0sICA4LCAxNik7CisJZXBoLT50X29jCT0gR0VUX0ZJRUxEX1Uoc2YxWzVdLCAxNiwgIDApOworCWVwaC0+YV9mMgk9IEdFVF9GSUVMRF9TKHNmMVs2XSwgIDgsIDE2KTsKKwllcGgtPmFfZjEJPSBHRVRfRklFTERfUyhzZjFbNl0sIDE2LCAgMCk7CisJZXBoLT5hX2YwCT0gR0VUX0ZJRUxEX1Moc2YxWzddLCAyMiwgIDIpOworCisJaW9kZTEJCT0gR0VUX0ZJRUxEX1Uoc2YyWzBdLCAgOCwgMTYpOworCWVwaC0+Y19ycwk9IEdFVF9GSUVMRF9TKHNmMlswXSwgMTYsICAwKTsKKwllcGgtPmRlbHRhX24JPSBHRVRfRklFTERfUyhzZjJbMV0sIDE2LCAgOCk7CisJZXBoLT5tXzAJPSAoR0VUX0ZJRUxEX1Moc2YyWzFdLCAgOCwgIDApIDw8IDI0KSB8IFwKKwkgICAgICAgICAgICAgICAgICAgR0VUX0ZJRUxEX1Uoc2YyWzJdLCAyNCwgIDApOworCWVwaC0+Y191Ywk9IEdFVF9GSUVMRF9TKHNmMlszXSwgMTYsICA4KTsKKwllcGgtPmUJCT0gKEdFVF9GSUVMRF9VKHNmMlszXSwgIDgsICAwKSA8PCAyNCkgfCBcCisJICAgICAgICAgICAgICAgICAgIEdFVF9GSUVMRF9VKHNmMls0XSwgMjQsICAwKTsKKwllcGgtPmNfdXMJPSBHRVRfRklFTERfUyhzZjJbNV0sIDE2LCAgOCk7CisJZXBoLT5hX3Bvd2hhbGYJPSAoR0VUX0ZJRUxEX1Uoc2YyWzVdLCAgOCwgIDApIDw8IDI0KSB8IFwKKwkgICAgICAgICAgICAgICAgICAgR0VUX0ZJRUxEX1Uoc2YyWzZdLCAyNCwgIDApOworCWVwaC0+dF9vZQk9IEdFVF9GSUVMRF9VKHNmMls3XSwgMTYsICA4KTsKKwllcGgtPmZpdF9mbGFnCT0gR0VUX0ZJRUxEX1Uoc2YyWzddLCAgMSwgIDcpOworCisJZXBoLT5jX2ljCT0gR0VUX0ZJRUxEX1Moc2YzWzBdLCAxNiwgIDgpOworCWVwaC0+b21lZ2FfMAk9IChHRVRfRklFTERfUyhzZjNbMF0sICA4LCAgMCkgPDwgMjQpIHwgXAorCSAgICAgICAgICAgICAgICAgICBHRVRfRklFTERfVShzZjNbMV0sIDI0LCAgMCk7CisJZXBoLT5jX2lzCT0gR0VUX0ZJRUxEX1Moc2YzWzJdLCAxNiwgIDgpOworCWVwaC0+aV8wCT0gKEdFVF9GSUVMRF9TKHNmM1syXSwgIDgsICAwKSA8PCAyNCkgfCBcCisJICAgICAgICAgICAgICAgICAgIEdFVF9GSUVMRF9VKHNmM1szXSwgMjQsICAwKTsKKwllcGgtPmNfcmMJPSBHRVRfRklFTERfUyhzZjNbNF0sIDE2LCAgOCk7CisJZXBoLT53CQk9IChHRVRfRklFTERfUyhzZjNbNF0sICA4LCAgMCkgPDwgMjQpIHwgXAorCSAgICAgICAgICAgICAgICAgICBHRVRfRklFTERfVShzZjNbNV0sIDI0LCAgMCk7CisJZXBoLT5vbWVnYV9kb3QJPSBHRVRfRklFTERfUyhzZjNbNl0sIDI0LCAgMCk7CisJaW9kZTIJCT0gR0VUX0ZJRUxEX1Uoc2YzWzddLCAgOCwgMTYpOworCWVwaC0+aWRvdAk9IEdFVF9GSUVMRF9TKHNmM1s3XSwgMTQsICAyKTsKKworCWVwaC0+X3JzdmQxCT0gR0VUX0ZJRUxEX1Uoc2YxWzFdLCAyMywgIDApOworCWVwaC0+X3JzdmQyCT0gR0VUX0ZJRUxEX1Uoc2YxWzJdLCAyNCwgIDApOworCWVwaC0+X3JzdmQzCT0gR0VUX0ZJRUxEX1Uoc2YxWzNdLCAyNCwgIDApOworCWVwaC0+X3JzdmQ0CT0gR0VUX0ZJRUxEX1Uoc2YxWzRdLCAxNiwgIDgpOworCWVwaC0+YW9kbwk9IEdFVF9GSUVMRF9VKHNmMls3XSwgIDUsICAyKTsKKworCS8qIENoZWNrICYgY3Jvc3MtdmFsaWRhdGUgaW9kY1s3OjBdLCBpb2RlMSwgaW9kZTIgKi8KKwlpZiAoKGlvZGUxICE9IGlvZGUyKSB8fCAoaW9kZTEgIT0gKGVwaC0+aW9kYyAmIDB4ZmYpKSkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFVucGFja3MgR1BTIFN1YmZyYW1lIDQgb3IgNSBBbG1hbmFjIHBhZ2VzIHBheWxvYWQgKDggd29yZHMpCisgKgorICogKG5vIHBhcml0eSBiaXQgY2hlY2tpbmcgaXMgZG9uZSwgb25seSB0aGUgbG93ZXIgMjQgYml0cyBvZiBlYWNoIHdvcmQKKyAqICBhcmUgdXNlZCkKKyAqLworaW50CitncHNfdW5wYWNrX3NmNDVfYWxtYW5hYyh1aW50MzJfdCAqc2YsIHN0cnVjdCBncHNfYWxtYW5hY19zdiAqYWxtKQoreworCWFsbS0+c3ZfaWQgICAgICA9IEdFVF9GSUVMRF9VKHNmWzBdLCAgNiwgMTYpOworCisJYWxtLT5lCQk9IEdFVF9GSUVMRF9VKHNmWzBdLCAxNiwgIDApOworCWFsbS0+dF9vYQk9IEdFVF9GSUVMRF9VKHNmWzFdLCAgOCwgMTYpOworCWFsbS0+a3NpaQk9IEdFVF9GSUVMRF9TKHNmWzFdLCAxNiwgIDApOworCWFsbS0+b21lZ2FfZG90CT0gR0VUX0ZJRUxEX1Moc2ZbMl0sIDE2LCAgOCk7CisJYWxtLT5zdl9oZWFsdGgJPSBHRVRfRklFTERfVShzZlsyXSwgIDgsICAwKTsKKwlhbG0tPmFfcG93aGFsZgk9IEdFVF9GSUVMRF9VKHNmWzNdLCAyNCwgIDApOworCWFsbS0+b21lZ2FfMAk9IEdFVF9GSUVMRF9TKHNmWzRdLCAyNCwgIDApOworCWFsbS0+dwkJPSBHRVRfRklFTERfUyhzZls1XSwgMjQsICAwKTsKKwlhbG0tPm1fMAk9IEdFVF9GSUVMRF9TKHNmWzZdLCAyNCwgIDApOworCWFsbS0+YV9mMAk9IChHRVRfRklFTERfUyhzZls3XSwgOCwgMTYpIDw8IDMpIHwgXAorCSAgICAgICAgICAgICAgICAgICBHRVRfRklFTERfVShzZls3XSwgMywgIDIpOworCWFsbS0+YV9mMQk9IEdFVF9GSUVMRF9TKHNmWzddLCAxMSwgIDUpOworCisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2dwcy5oIGIvcnJscC1lcGhlbWVyaXMvZ3BzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQxYjlkNwotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2dwcy5oCkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogZ3BzLmgKKyAqCisgKiBIZWFkZXIgdG8gZGVhbCB3aXRoIGxvdyBsZXZlbCBHUFMgZGF0YQorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgIFN5bHZhaW4gTXVuYXV0IDx0bnRAMjQ2dE50LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgX19HUFNfSF9fCisjZGVmaW5lIF9fR1BTX0hfXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworCisjZGVmaW5lIE1BWF9TVgk2NAorCisKKy8qIElvbm9zcGVyaWMgbW9kZWwgZGF0YSAqLworc3RydWN0IGdwc19pb25vc3BoZXJlX21vZGVsIHsKKwkJCS8qICNiaXRzICBTY2FsZSBmYWN0b3IgIEVmZmVjdGl2ZSAgVW5pdHMgICAgICAgICAgICAqLworCQkJLyogICAgICAgICAgIChMU0IpICAgICAgIHJhbmdlICAgICAgICAgICAgICAgICAgICAgICovCisKKwlpbnQgYWxwaGFfMDsJLyogcyA4ICAgICAgIDJeLTMwICAgICAgICAgICAgICAgICBzZWNvbmRzICAgICAgICAgICovCisJaW50IGFscGhhXzE7CS8qIHMgOCAgICAgICAyXi0yNyAgICAgICAgICAgICAgICAgcyAvIHNlbWktY2lyY2xlcyAqLworCWludCBhbHBoYV8yOwkvKiBzIDggICAgICAgMl4tMjQgICAgICAgICAgICAgICAgIHMgLyAoc2VtaS1jaXJjbGVzKV4yICovCisJaW50IGFscGhhXzM7CS8qIHMgOCAgICAgICAyXi0yNCAgICAgICAgICAgICAgICAgcyAvIChzZW1pLWNpcmNsZXMpXjMgKi8KKwlpbnQgYmV0YV8wOwkvKiBzIDggICAgICAgMl4xMSAgICAgICAgICAgICAgICAgIHNlY29uZHMgICAgICAgICAgKi8KKwlpbnQgYmV0YV8xOwkvKiBzIDggICAgICAgMl4xNCAgICAgICAgICAgICAgICAgIHMgLyBzZW1pLWNpcmNsZXMgKi8KKwlpbnQgYmV0YV8yOwkvKiBzIDggICAgICAgMl4xNiAgICAgICAgICAgICAgICAgIHMgLyAoc2VtaS1jaXJjbGVzKV4yICovCisJaW50IGJldGFfMzsJLyogcyA4ICAgICAgIDJeMTYgICAgICAgICAgICAgICAgICBzIC8gKHNlbWktY2lyY2xlcyleMyAqLworfTsKKworCisvKiBVVEMgbW9kZWwgZGF0YSAqLworc3RydWN0IGdwc191dGNfbW9kZWwgeworCQkJLyogI2JpdHMgIFNjYWxlIGZhY3RvciAgRWZmZWN0aXZlICBVbml0cyAgICAgICAgICAgICovCisJCQkvKiAgICAgICAgICAgKExTQikgICAgICAgcmFuZ2UgICAgICAgICAgICAgICAgICAgICAgKi8KKworCWludCBhMDsJCS8qIHMgMzIgICAgICAyXi0zMCAgICAgICAgICAgICAgICAgc2Vjb25kcyAgICAgICAgICAqLworCWludCBhMTsJCS8qIHMgMjQgICAgICAyXi01MCAgICAgICAgICAgICAgICAgc2Vjb25kcyAvIHNlY29uZHMgKi8KKwlpbnQgZGVsdGFfdF9sczsJLyogcyAgOCAgICAgIDEgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzICAgICAgICAgICovCisJaW50IHRfb3Q7CS8qIHUgIDggICAgICAyXjEyICAgICAgIDYwMiwxMTIgICAgc2Vjb25kcyAgICAgICAgICAqLworCWludCB3bl90OwkvKiB1ICA4ICAgICAgMSAgICAgICAgICAgICAgICAgICAgIHdlZWtzICAgICAgICAgICAgKi8KKwlpbnQgd25fbHNmOwkvKiB1ICA4ICAgICAgMSAgICAgICAgICAgICAgICAgICAgIHdlZWtzICAgICAgICAgICAgKi8KKwlpbnQgZG47CQkvKiB1ICA4ICAgICAgMSAgICAgICAgICAgICAgICA3ICAgIGRheXMgICAgICAgICAgICAgKi8KKwlpbnQgZGVsdGFfdF9sc2Y7LyogcyAgOCAgICAgIDEgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzICAgICAgICAgICovCit9OworCisKKy8qIEFsbWFuYWNoIGRhdGEgKi8KK3N0cnVjdCBncHNfYWxtYW5hY19zdiB7CisJaW50IHN2X2lkOworCWludCBzdl9oZWFsdGg7CisKKwkJCS8qICNiaXRzICBTY2FsZSBmYWN0b3IgIEVmZmVjdGl2ZSAgVW5pdHMgICAgICAgICAgICAqLworCQkJLyogICAgICAgICAgIChMU0IpICAgICAgIHJhbmdlICAgICAgICAgICAgICAgICAgICAgICovCisKKwlpbnQgZTsJCS8qIHUgMTYgICAgICAyXi0yMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCWludCB0X29hOwkvKiB1ICA4ICAgICAgMl4xMiAgICAgICA2MDIsMTEyICAgIHNlY29uZHMgICAgICAgICAgKi8KKwlpbnQga3NpaTsJLyogcyAxNiAgICAgIDJeLTE5ICAgICAgICAgICAgICAgICBzZW1pLWNpcmNsZXMgICAgICovCisJaW50IG9tZWdhX2RvdDsJLyogcyAxNiAgICAgIDJeLTM4ICAgICAgICAgICAgICAgICBzZW1pLWNpcmNsZXMgLyBzICovCisJaW50IGFfcG93aGFsZjsJLyogdSAyNCAgICAgIDJeLTExICAgICAgICAgICAgICAgICBtZXRlcnMgICAgICAgICAgICovCisJaW50IG9tZWdhXzA7CS8qIHMgMjQgICAgICAyXi0yMyAgICAgICAgICAgICAgICAgc2VtaS1jaXJjbGVzICAgICAqLworCWludCB3OwkJLyogcyAyNCAgICAgIDJeLTIzICAgICAgICAgICAgICAgICBzZW1pLWNpcmNsZXMgICAgICovCisJaW50IG1fMDsJLyogcyAyNCAgICAgIDJeLTIzICAgICAgICAgICAgICAgICBzZW1pLWNpcmNsZXMgICAgICovCisJaW50IGFfZjA7CS8qIHMgMTEgICAgICAyXi0yMCAgICAgICAgICAgICAgICAgc2Vjb25kcyAgICAgICAgICAqLworCWludCBhX2YxOwkvKiBzIDExICAgICAgMl4tMzggICAgICAgICAgICAgICAgIHNlY29uZHMgLyBzZWNvbmRzICovCit9OworCitzdHJ1Y3QgZ3BzX2FsbWFuYWMgeworCWludCB3bmE7CisJaW50IG5fc3Y7CisJc3RydWN0IGdwc19hbG1hbmFjX3N2IHN2c1tNQVhfU1ZdOworfTsKKworCisvKiBFcGhlbWVyaXMgZGF0YSAqLworc3RydWN0IGdwc19lcGhlbWVyaXNfc3YgeworCWludCBzdl9pZDsKKworCQkJLyogI2JpdHMgIFNjYWxlIGZhY3RvciAgRWZmZWN0aXZlICBVbml0cyAgICAgICAgICAgICovCisJCQkvKiAgICAgICAgICAgKExTQikgICAgICAgcmFuZ2UgICAgICAgICAgICAgICAgICAgICAgKi8KKworCWludCBjb2RlX29uX2wyOwkvKiB1ICAyICAgICAgMSAgICAgICAgICAgICAgICAgICAgIC8gICAgICAgICAgICAgICAgKi8KKwlpbnQgd2Vla19ubzsJLyogdSAxMCAgICAgIDEgICAgICAgICAgICAgICAgICAgICB3ZWVrICAgICAgICAgICAgICovCisJaW50IGwyX3BfZmxhZzsJLyogdSAgMSAgICAgIDEgICAgICAgICAgICAgICAgICAgICAvICAgICAgICAgICAgICAgICovCisJaW50IHN2X3VyYTsJLyogdSAgNCAgICAgIC8gICAgICAgICAgICAgICAgICAgICAvICAgICAgICAgICAgICAgICovCisJaW50IHN2X2hlYWx0aDsJLyogdSAgNiAgICAgIC8gICAgICAgICAgICAgICAgICAgICAvICAgICAgICAgICAgICAgICovCisJaW50IHRfZ2Q7CS8qIHMgIDggICAgICAyXi0zMSAgICAgICAgICAgICAgICAgc2Vjb25kcyAgICAgICAgICAqLworCWludCBpb2RjOwkvKiB1IDEwICAgICAgLyAgICAgICAgICAgICAgICAgICAgIC8gICAgICAgICAgICAgICAgKi8KKwlpbnQgdF9vYzsJLyogdSAxNiAgICAgIDJeNCAgICAgICAgNjA0LDc4NCAgICBzZWNvbmRzICAgICAgICAgICovCisJaW50IGFfZjI7CS8qIHMgIDggICAgICAyXi01NSAgICAgICAgICAgICAgICAgc2VjIC8gc2VjXjIgICAgICAqLworCWludCBhX2YxOwkvKiBzIDE2ICAgICAgMl4tNDMgICAgICAgICAgICAgICAgIHNlYyAvIHNlYyAgICAgICAgKi8KKwlpbnQgYV9mMDsJLyogcyAyMiAgICAgIDJeLTMxICAgICAgICAgICAgICAgICBzZWNvbmRzICAgICAgICAgICovCisKKwlpbnQgY19yczsJLyogcyAxNiAgICAgIDJeLTUgICAgICAgICAgICAgICAgICBtZXRlcnMgICAgICAgICAgICovCisJaW50IGRlbHRhX247CS8qIHMgMTYgICAgICAyXi00MyAgICAgICAgICAgICAgICAgc2VtaS1jaXJjbGVzIC8gcyAqLworCWludCBtXzA7CS8qIHMgMzIgICAgICAyXi0zMSAgICAgICAgICAgICAgICAgc2VtaS1jaXJjbGVzICAgICAqLworCWludCBjX3VjOwkvKiBzIDE2ICAgICAgMl4tMjkgICAgICAgICAgICAgICAgIHJhZGlhbnMgICAgICAgICAgKi8KKwl1bnNpZ25lZCBpbnQgZTsJLyogdSAzMiAgICAgIDJeLTMzICAgICAgMC4wMyAgICAgICAvICAgICAgICAgICAgICAgICovCisJaW50IGNfdXM7CS8qIHMgMTYgICAgICAyXi0yOSAgICAgICAgICAgICAgICAgcmFkaWFucyAgICAgICAgICAqLworCXVuc2lnbmVkIGludCBhX3Bvd2hhbGY7IC8qIHUgMzIgIDJeLTE5ICAgICAgICAgICAgIG1ldGVyc14oMS8yKSAgICAgKi8KKwlpbnQgdF9vZTsJLyogdSAxNiAgICAgIDJeNCAgICAgICAgNjA0LDc4NCAgICBzZWNvbmRzICAgICAgICAgICovCisJaW50IGZpdF9mbGFnOwkvKiB1ICAxICAgICAgLyAgICAgICAgICAgICAgICAgICAgIC8gICAgICAgICAgICAgICAgKi8KKworCWludCBjX2ljOwkvKiBzIDE2ICAgICAgMl4tMjkgICAgICAgICAgICAgICAgIHJhZGlhbnMgICAgICAgICAgKi8KKwlpbnQgb21lZ2FfMDsJLyogcyAzMiAgICAgIDJeLTMxICAgICAgICAgICAgICAgICBzZW1pLWNpcmNsZXMgICAgICovCisJaW50IGNfaXM7CS8qIHMgMTYgICAgICAyXi0yOSAgICAgICAgICAgICAgICAgcmFkaWFucyAgICAgICAgICAqLworCWludCBpXzA7CS8qIHMgMzIgICAgICAyXi0zMSAgICAgICAgICAgICAgICAgc2VtaS1jaXJjbGVzICAgICAqLworCWludCBjX3JjOwkvKiBzIDE2ICAgICAgMl4tNSAgICAgICAgICAgICAgICAgIG1ldGVycyAgICAgICAgICAgKi8KKwlpbnQgdzsJCS8qIHMgMzIgICAgICAyXi0zMSAgICAgICAgICAgICAgICAgc2VtaS1jaXJjbGVzICAgICAqLworCWludCBvbWVnYV9kb3Q7CS8qIHMgMjQgICAgICAyXi00MyAgICAgICAgICAgICAgICAgc2VtaS1jaXJjbGVzIC8gcyAqLworCWludCBpZG90OwkvKiBzIDE0ICAgICAgMl4tNDMgICAgICAgICAgICAgICAgIHNlbWktY2lyY2xlcyAvIHMgKi8KKworCWludCBfcnN2ZDE7CS8qIDIzIGJpdHMgKi8KKwlpbnQgX3JzdmQyOwkvKiAyNCBiaXRzICovCisJaW50IF9yc3ZkMzsJLyogMjQgYml0cyAqLworCWludCBfcnN2ZDQ7CS8qIDE2IGJpdHMgKi8KKwlpbnQgYW9kbzsJLyogOCBiaXRzICBOb3Qgc3VyZSBpdCBuZWVkcyB0byBiZSBoZXJlIC4uLiAqLworfTsKKworc3RydWN0IGdwc19lcGhlbWVyaXMgeworCWludCBuX3N2OworCXN0cnVjdCBncHNfZXBoZW1lcmlzX3N2IHN2c1tNQVhfU1ZdOworfTsKKworCisvKiBSZWZlcmVuY2UgcG9zaXRpb24gKi8KK3N0cnVjdCBncHNfcmVmX3BvcyB7CS8qIFdTRzg0IGVsbGlwc29pZCAqLworCWRvdWJsZSBsYXRpdHVkZTsJLyogZGVnICovCisJZG91YmxlIGxvbmdpdHVkZTsJLyogZGVnICovCisJZG91YmxlIGFsdGl0dWRlOwkvKiBtIGFib3ZlIGVsbGlwc29pZCAqLworfTsKKworCisvKiBSZWZlcmVuY2UgdGltZSAqLworc3RydWN0IGdwc19yZWZfdGltZSB7CisJaW50IHduOwkJCS8qIEdQUyB3ZWVrIG51bWJlciAqLworCWRvdWJsZSB0b3c7CQkvKiBpbiBzZWNvbmRzICovCit9OworCisKKy8qIEFsbCBhc3Npc3QgZGF0YSAqLworI2RlZmluZSBHUFNfRklFTERfSU9OT1NQSEVSRQkoMTw8MCkKKyNkZWZpbmUgR1BTX0ZJRUxEX1VUQwkJKDE8PDEpCisjZGVmaW5lIEdQU19GSUVMRF9BTE1BTkFDCSgxPDwyKQorI2RlZmluZSBHUFNfRklFTERfRVBIRU1FUklTCSgxPDwzKQorI2RlZmluZSBHUFNfRklFTERfUkVGUE9TCSgxPDw0KQorI2RlZmluZSBHUFNfRklFTERfUkVGVElNRQkoMTw8NSkKKworc3RydWN0IGdwc19hc3Npc3RfZGF0YSB7CisJaW50IGZpZWxkczsKKwlzdHJ1Y3QgZ3BzX2lvbm9zcGhlcmVfbW9kZWwJaW9ub3NwaGVyZTsKKwlzdHJ1Y3QgZ3BzX3V0Y19tb2RlbAkJdXRjOworCXN0cnVjdCBncHNfYWxtYW5hYwkJYWxtYW5hYzsKKwlzdHJ1Y3QgZ3BzX2VwaGVtZXJpcwkJZXBoZW1lcmlzOworCXN0cnVjdCBncHNfcmVmX3BvcwkJcmVmX3BvczsKKwlzdHJ1Y3QgZ3BzX3JlZl90aW1lCQlyZWZfdGltZTsKK307CisKKworLyogR1BTIFN1YmZyYW1lIHV0aWxpdHkgbWV0aG9kcyAoc2VlIGdwcy5jIGZvciBkZXRhaWxzKSAqLworaW50IGdwc191bnBhY2tfc2YxMjModWludDMyX3QgKnNmLCBzdHJ1Y3QgZ3BzX2VwaGVtZXJpc19zdiAqZXBoKTsKK2ludCBncHNfdW5wYWNrX3NmNDVfYWxtYW5hYyh1aW50MzJfdCAqc2YsIHN0cnVjdCBncHNfYWxtYW5hY19zdiAqYWxtKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19HUFNfSF9fICovCisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL21haW4uYyBiL3JybHAtZXBoZW1lcmlzL21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjAyNWEyCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvbWFpbi5jCkBAIC0wLDAgKzEsOTkgQEAKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSAiZ3BzLmgiCisjaW5jbHVkZSAidWJ4LmgiCisjaW5jbHVkZSAidWJ4LXBhcnNlLmgiCisjaW5jbHVkZSAicnJscC5oIgorCitzdGF0aWMgaW50Citkb191YnhfcmVhZChzdHJ1Y3QgZ3BzX2Fzc2lzdF9kYXRhICpncHMsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCWludCBydiwgZmQsIGk7CisJc3RydWN0IHN0YXQgc3Q7CisJdm9pZCAqYnVmOworCisJLyogTG9hZCBmaWxlICovCisJZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIC0xOworCisJcnYgPSBmc3RhdChmZCwgJnN0KTsKKwlpZiAocnYgPCAwKSB7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWJ1ZiA9IG1hbGxvYyhzdC5zdF9zaXplKTsKKwlpZiAoIWJ1ZikgeworCQljbG9zZShmZCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlydiA9IHJlYWQoZmQsIGJ1Ziwgc3Quc3Rfc2l6ZSk7CisJaWYgKHJ2ICE9IHN0LnN0X3NpemUpIHsKKwkJZnJlZShidWYpOworCQljbG9zZShmZCk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBQYXJzZSBlYWNoIG1lc3NhZ2UgKi8KKwlmb3IgKGk9MDsgaTxzdC5zdF9zaXplOykgeworCQlpbnQgcnY7CisJCXJ2ID0gdWJ4X21zZ19kaXNwYXRjaCh1YnhfcGFyc2VfZHQsIGJ1ZiArIGksIHN0LnN0X3NpemUgLSBpLCBncHMpOworCQlpZiAocnYgPCAwKQorCQkJaSsrOwkvKiBJbnZhbGlkIG1lc3NhZ2U6IHRyeSBvbmUgYnl0ZSBsYXRlciAqLworCQllbHNlCisJCQlpICs9IHJ2OworCX0KKworCS8qIERvbmUgKi8KKwlmcmVlKGJ1Zik7CisJY2xvc2UoZmQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2RvX3JybHAoc3RydWN0IGdwc19hc3Npc3RfZGF0YSAqZ3BzKQoreworCXN0cnVjdCBycmxwX2Fzc2lzdF9yZXEgYXI7CisJdm9pZCAqcGR1c1s2NF07CisJaW50IGxlbls2NF07CisJaW50IGksIHJ2OworCisJY2hhciAqdGVzdCA9ICJceDI4XHgwMFx4ODBceDEwXHgwMVx4MzJceDAwXHgxOVx4NEZceDA3XHgxNVx4MDQiOworCisJcnJscF9kZWNvZGVfYXNzaXN0YW5jZV9yZXF1ZXN0KCZhciwgdGVzdCwgMTIpOworCXByaW50ZigiJTA4eCAlMDE2bGx4XG4iLCBhci5yZXFfZWxlbXMsIChsb25nIGxvbmcgdW5zaWduZWQpIGFyLmVwaF9zdnMpOworCisJYXIucmVxX2VsZW1zID0gLTE7CisJYXIuZXBoX3N2cyA9IC0xTEw7CisJcnYgPSBycmxwX2dwc19hc3Npc3RfcGR1cyhncHMsICZhciwgcGR1cywgbGVuLCA2NCk7CisJcHJpbnRmKCIlZFxuIiwgcnYpOworCWZvciAoaT0wOyBpPHJ2OyBpKyspIHsKKwkJcHJpbnRmKCIlcCAlZFxuIiwgcGR1c1tpXSwgbGVuW2ldKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJc3RydWN0IGdwc19hc3Npc3RfZGF0YSBncHM7CisJaW50IHJ2OworCisJbWVtc2V0KCZncHMsIDB4MDAsIHNpemVvZihncHMpKTsKKworCXJ2ID0gZG9fdWJ4X3JlYWQoJmdwcywgImRhdGEudWJ4Iik7CisJCisJcnYgPSBkb19ycmxwKCZncHMpOworCisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL3JybHAuYyBiL3JybHAtZXBoZW1lcmlzL3JybHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjBjM2FiCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvcnJscC5jCkBAIC0wLDAgKzEsNjQ4IEBACisvKgorICogcnJscC5jCisgKgorICogUlJMUCBpbXBsZW1lbnRhdGlvbgorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgIFN5bHZhaW4gTXVuYXV0IDx0bnRAMjQ2dE50LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAiZ3BzLmgiCisjaW5jbHVkZSAicnJscC5oIgorCisjaW5jbHVkZSA8UERVLmg+CisjaW5jbHVkZSA8R1BTLUFzc2lzdERhdGEuaD4KKyNpbmNsdWRlIDxOYXZpZ2F0aW9uTW9kZWwuaD4KKyNpbmNsdWRlIDxJb25vc3BoZXJpY01vZGVsLmg+CisjaW5jbHVkZSA8VVRDTW9kZWwuaD4KKyNpbmNsdWRlIDxBbG1hbmFjLmg+CisjaW5jbHVkZSA8UmVmTG9jYXRpb24uaD4KKyNpbmNsdWRlIDxSZWZlcmVuY2VUaW1lLmg+CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBSUkxQIEFzc2lzdGFuY2UgcmVxdWVzdCBkZWNvZGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXt7eyAqLworLyogRGVjb2RlIGFuZCB2YWxpZGF0ZSB0aGUgYXNzaXN0YW5jZSBkYXRhIHJlcXVlc3QgbWVzc2FnZXMuCisgKiBTZWUgc2VjdGlvbiAxMC4xMCBvZgorICogIC4gRVRTSSBUUyAxNDkgMDMxIFY4LjEuMCAoMjAwOS0wMSkKKyAqICAuIDNHUFAgVFMgNDkuMDMxIHZlcnNpb24gOC4xLjAgUmVsZWFzZSA4CisgKi8KKworLyogUGFja2VkIHN0cnVjdHVyZSBmcm9tIDQ5LjAzMSBzcGVjIChSR0EgPSBSZXF1ZXN0IEdQUyBBc3Npc3RhbmNlKSAqLworCisjZGVmaW5lIFJSTFBfUkdBMF9BTE1BTkFDCSgxPDwwKQorI2RlZmluZSBSUkxQX1JHQTBfVVRDX01PREVMCSgxPDwxKQorI2RlZmluZSBSUkxQX1JHQTBfSU9OT19NT0RFTAkoMTw8MikKKyNkZWZpbmUgUlJMUF9SR0EwX05BVl9NT0RFTAkoMTw8MykKKyNkZWZpbmUgUlJMUF9SR0EwX0RHUFMJCSgxPDw0KQorI2RlZmluZSBSUkxQX1JHQTBfUkVGX0xPQwkoMTw8NSkKKyNkZWZpbmUgUlJMUF9SR0EwX1JFRl9USU1FCSgxPDw2KQorI2RlZmluZSBSUkxQX1JHQTBfQUNRX0FTU0lTVAkoMTw8NykKKworI2RlZmluZSBSUkxQX1JHQTFfUkVBTFRJTUVfSU5UCSgxPDwwKQorI2RlZmluZSBSUkxQX1JHQTFfRVBIX0VYVAkoMTw8MSkKKyNkZWZpbmUgUlJMUF9SR0ExX0VQSF9FWFRfQ0hFQ0sJKDE8PDIpCisKK3N0cnVjdCBycmxwX3JnYV9oZHIgeworCXVpbnQ4X3QgaXRlbXMwOworCXVpbnQ4X3QgaXRlbXMxOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHJybHBfcmdhX2VwaF9zdiB7CisJdWludDhfdCBzdl9pZDsJCS8qIFs3OjZdIHJlc2VydmVkLCBbNTowXSBzdl9pZCAqLworCXVpbnQ4X3QgaW9kZTsJCS8qIGxhdGVzdCBlcGggaW4gdGhlIE1TIG1lbW9yeSBpbiBob3VycyAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHJybHBfcmdhX2VwaCB7CisJdWludDhfdCB3bl9oaTsJCS8qIFs3OjZdID0gd25bOTo4XSAqLworCXVpbnQ4X3Qgd25fbG87CQkvKiB3bls3OjBdICovCisJdWludDhfdCB0b2U7CQkvKiBsYXRlc3QgZXBoIGluIHRoZSBNUyBtZW1vcnkgaW4gaG91cnMgKi8KKwl1aW50OF90IG5zYXRfdG10b2U7CS8qIFs3OjRdIG5zdGF0LCBbMzowXSBULVRvZSBsaW1pdCAqLworCXN0cnVjdCBycmxwX3JnYV9lcGhfc3Ygc3ZzWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHJybHBfcmdhX2VwaF9leHQgeworCXVpbnQ4X3QgdmFsaWRpdHk7CS8qIGluIDQgaG91cnMgdW5pdHMgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBycmxwX3JnYV9lcGhfZXh0X2NoZWNrIHsKKwkJLyogd2Vla3MgYXJlIGluIGdwcyB3ZWVrIG1vZHVsbyA0ICovCisJdWludDhfdCB3bl9iZWdpbl9lbmQ7CS8qIFs3OjRdIGJlZ2luLCBbMzowXSBlbmQgKi8KKwl1aW50OF90IHRvd19iZWdpbjsKKwl1aW50OF90IHRvd19lbmQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKKy8qIFBhcnNpbmcgZnVuY3Rpb24gKi8KKworaW50CitycmxwX2RlY29kZV9hc3Npc3RhbmNlX3JlcXVlc3QoCisJc3RydWN0IHJybHBfYXNzaXN0X3JlcSAqYXIsCisJdm9pZCAqcmVxLCBpbnQgcmVxX2xlbikKK3sKKwlzdHJ1Y3QgcnJscF9yZ2FfaGRyICpoZHIgPSBOVUxMOworCXN0cnVjdCBycmxwX3JnYV9lcGggKmVwaCA9IE5VTEw7CisJc3RydWN0IHJybHBfcmdhX2VwaF9leHQgKmVwaF9leHQgPSBOVUxMOworCXN0cnVjdCBycmxwX3JnYV9lcGhfZXh0X2NoZWNrICplcGhfZXh0X2NoZWNrID0gTlVMTDsKKwlpbnQgcCA9IDA7CisKKwkvKiBSZXNldCAqLworCWFyLT5yZXFfZWxlbXMgPSAwOworCWFyLT5lcGhfc3ZzID0gMDsKKworCS8qIFBhcnNlIG1lc3NhZ2UgKi8KKwloZHIgPSByZXE7CisJcCArPSBzaXplb2Yoc3RydWN0IHJybHBfcmdhX2hkcik7CisJaWYgKHAgPiByZXFfbGVuKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoaGRyLT5pdGVtczAgJiBSUkxQX1JHQTBfTkFWX01PREVMKSB7CisJCWVwaCA9IHJlcSArIHA7CisJCXAgKz0gc2l6ZW9mKHN0cnVjdCBycmxwX3JnYV9lcGgpOworCQlpZiAocCA+IHJlcV9sZW4pCisJCQlyZXR1cm4gLTE7CisJCXAgKz0gKGVwaC0+bnNhdF90bXRvZSA+PiA0KSAqIHNpemVvZihzdHJ1Y3QgcnJscF9yZ2FfZXBoX3N2KTsKKwkJaWYgKHAgPiByZXFfbGVuKQorCQkJcmV0dXJuIC0xOworCX0KKworCWlmIChoZHItPml0ZW1zMSAmIFJSTFBfUkdBMV9FUEhfRVhUKSB7CisJCWVwaF9leHQgPSByZXEgKyBwOworCQlwICs9IHNpemVvZihzdHJ1Y3QgcnJscF9yZ2FfZXBoX2V4dCk7CisJCWlmIChwID4gcmVxX2xlbikKKwkJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoaGRyLT5pdGVtczEgJiBSUkxQX1JHQTFfRVBIX0VYVF9DSEVDSykgeworCQllcGhfZXh0X2NoZWNrID0gcmVxICsgcDsKKwkJcCArPSBzaXplb2Yoc3RydWN0IHJybHBfcmdhX2VwaF9leHRfY2hlY2spOworCQlpZiAocCA+IHJlcV9sZW4pCisJCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHAgIT0gcmVxX2xlbikKKwkJcmV0dXJuIC0yOyAvKiBub3QgYWxsIGJ5dGVzIGNvbnN1bWVkID8/PyAqLworCisJLyogUHJpbnQgYSB3YXJuaW5nIGZvciB1bnN1cHBvcnRlZCByZXF1ZXN0cyAqLworCWlmICgoZXBoX2V4dCAhPSBOVUxMKSB8fAorCSAgICAoZXBoX2V4dF9jaGVjayAhPSBOVUxMKSB8fAorCSAgICAoaGRyLT5pdGVtczAgJiAoUlJMUF9SR0EwX0RHUFMgfCBSUkxQX1JHQTBfQUNRX0FTU0lTVCkpIHx8CisJICAgIChoZHItPml0ZW1zMSAmIFJSTFBfUkdBMV9SRUFMVElNRV9JTlQpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiW3ddIFVuc3VwcG9ydGVkIGFzc2lzdGFuY2UgZGF0YSByZXF1ZXN0ZWQsIGlnbm9yZWQgLi4uXG4iKTsKKwl9CisKKwkvKiBDb3B5IHRoZSByZXF1ZXN0ICovCisJaWYgKGhkci0+aXRlbXMwICYgUlJMUF9SR0EwX0FMTUFOQUMpCisJCWFyLT5yZXFfZWxlbXMgfD0gUlJMUF9BUl9BTE1BTkFDOworCisJaWYgKGhkci0+aXRlbXMwICYgUlJMUF9SR0EwX1VUQ19NT0RFTCkKKwkJYXItPnJlcV9lbGVtcyB8PSBSUkxQX0FSX1VUQ19NT0RFTDsKKworCWlmIChoZHItPml0ZW1zMCAmIFJSTFBfUkdBMF9JT05PX01PREVMKQorCQlhci0+cmVxX2VsZW1zIHw9IFJSTFBfQVJfSU9OT19NT0RFTDsKKworCWlmIChoZHItPml0ZW1zMCAmIFJSTFBfUkdBMF9SRUZfTE9DKQorCQlhci0+cmVxX2VsZW1zIHw9IFJSTFBfQVJfUkVGX0xPQzsKKworCWlmIChoZHItPml0ZW1zMCAmIFJSTFBfUkdBMF9SRUZfVElNRSkKKwkJYXItPnJlcV9lbGVtcyB8PSBSUkxQX0FSX1JFRl9USU1FOworCisJaWYgKGhkci0+aXRlbXMwICYgUlJMUF9SR0EwX05BVl9NT0RFTCkgeworCQlpbnQgaSwgbl9zdnMgPSBlcGgtPm5zYXRfdG10b2UgPj4gNDsKKwkJYXItPnJlcV9lbGVtcyB8PSBSUkxQX0FSX0VQSEVNRVJJUzsKKwkJZm9yIChpPTA7IGk8bl9zdnM7IGkrKykKKwkJCWFyLT5lcGhfc3ZzIHw9ICgxVUxMIDw8IChlcGgtPnN2c1tpXS5zdl9pZCAtIDEpKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogfX19ICovCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBSUkxQIGVsZW1lbnRzIGZpbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXt7eyAqLworCisJLyogSGVscGVycyAqLworCitzdGF0aWMgdm9pZAorX3RzXzIzXzAzMl9zdG9yZV9sYXRpdHVkZShkb3VibGUgbGF0LCB1aW50OF90ICpiKQoreworCXVpbnQzMl90IHg7CisJeCA9ICh1aW50MzJfdCkgZmxvb3IoZmFicyhsYXQvOTAuMCkgKiAoKGRvdWJsZSkoMTw8MjMpKSk7CisJaWYgKHggPj0gKDE8PDIzKSkKKwkJeCA9ICgxPDwyMykgLSAxOworCWlmIChsYXQgPCAwLjApCisJCXggfD0gKDE8PDIzKTsKKwliWzBdID0gKHggPj4gMTYpICYgMHhmZjsKKwliWzFdID0gKHggPj4gIDgpICYgMHhmZjsKKwliWzJdID0gIHggICAgICAgICYgMHhmZjsKK30KKworc3RhdGljIHZvaWQKK190c18yM18wMzJfc3RvcmVfbG9uZ2l0dWRlKGRvdWJsZSBsb24sIHVpbnQ4X3QgKmIpCit7CisJaW50MzJfdCB4OworCXggPSBmbG9vcigobG9uLzM2MC4wKSAqICgoZG91YmxlKSgxPDwyNCkpKTsKKwlpZiAoeCA+PSAoMTw8MjMpKQorCQl4ID0gMHgwMDdmZmZmZjsKKwllbHNlIGlmICh4IDwgLSgxPDwyMykpCisJCXggPSAweDAwODAwMDAwOworCWJbMF0gPSAoeCA+PiAxNikgJiAweGZmOworCWJbMV0gPSAoeCA+PiAgOCkgJiAweGZmOworCWJbMl0gPSAgeCAgICAgICAgJiAweGZmOworfQorCitzdGF0aWMgdm9pZAorX3RzXzIzXzAzMl9zdG9yZV9hbHRpdHVkZShkb3VibGUgYWx0LCB1aW50OF90ICpiKQoreworCWludCBhbHRfaSA9IChpbnQpZmFicyhhbHQpOworCWJbMF0gPSAoKGFsdF9pID4+IDgpICYgMHg3ZikgfCAoYWx0PDAuMCA/IDB4ODAgOiAweDAwKTsKKwliWzFdID0gYWx0X2kgJiAweGZmOworfQorCisKKwkvKiBGaWxsIG1ldGhvZHMgKi8KKworc3RhdGljIHZvaWQKK19ycmxwX2ZpbGxfbmF2aWdhdGlvbl9tb2RlbF9lbGVtZW50KAorCXN0cnVjdCBOYXZNb2RlbEVsZW1lbnQgKnJybHBfbm1lLAorCXN0cnVjdCBncHNfZXBoZW1lcmlzX3N2ICpncHNfZXBoX3N2KQoreworCXN0cnVjdCBVbmNvbXByZXNzZWRFcGhlbWVyaXMgKnJybHBfZXBoOworCisJcnJscF9ubWUtPnNhdFN0YXR1cy5wcmVzZW50ID0gU2F0U3RhdHVzX1BSX25ld1NhdGVsbGl0ZUFuZE1vZGVsVUM7CisJcnJscF9ubWUtPnNhdGVsbGl0ZUlEID0gZ3BzX2VwaF9zdi0+c3ZfaWQ7CisKKwlycmxwX2VwaCA9ICZycmxwX25tZS0+c2F0U3RhdHVzLmNob2ljZS5uZXdTYXRlbGxpdGVBbmRNb2RlbFVDOworCisJcnJscF9lcGgtPmVwaGVtQ29kZU9uTDIgICA9IGdwc19lcGhfc3YtPmNvZGVfb25fbDI7CisJcnJscF9lcGgtPmVwaGVtVVJBICAgICAgICA9IGdwc19lcGhfc3YtPnN2X3VyYTsKKwlycmxwX2VwaC0+ZXBoZW1TVmhlYWx0aCAgID0gZ3BzX2VwaF9zdi0+c3ZfaGVhbHRoOworCXJybHBfZXBoLT5lcGhlbUlPREMgICAgICAgPSBncHNfZXBoX3N2LT5pb2RjOworCXJybHBfZXBoLT5lcGhlbUwyUGZsYWcgICAgPSBncHNfZXBoX3N2LT5sMl9wX2ZsYWc7CisJcnJscF9lcGgtPmVwaGVtVGdkICAgICAgICA9IGdwc19lcGhfc3YtPnRfZ2Q7CisJcnJscF9lcGgtPmVwaGVtVG9jICAgICAgICA9IGdwc19lcGhfc3YtPnRfb2M7CisJcnJscF9lcGgtPmVwaGVtQUYyICAgICAgICA9IGdwc19lcGhfc3YtPmFfZjI7CisJcnJscF9lcGgtPmVwaGVtQUYxICAgICAgICA9IGdwc19lcGhfc3YtPmFfZjE7CisJcnJscF9lcGgtPmVwaGVtQUYwICAgICAgICA9IGdwc19lcGhfc3YtPmFfZjA7CisJcnJscF9lcGgtPmVwaGVtQ3JzICAgICAgICA9IGdwc19lcGhfc3YtPmNfcnM7CisJcnJscF9lcGgtPmVwaGVtRGVsdGFOICAgICA9IGdwc19lcGhfc3YtPmRlbHRhX247CisJcnJscF9lcGgtPmVwaGVtTTAgICAgICAgICA9IGdwc19lcGhfc3YtPm1fMDsKKwlycmxwX2VwaC0+ZXBoZW1DdWMgICAgICAgID0gZ3BzX2VwaF9zdi0+Y191YzsKKwlycmxwX2VwaC0+ZXBoZW1FICAgICAgICAgID0gZ3BzX2VwaF9zdi0+ZTsKKwlycmxwX2VwaC0+ZXBoZW1DdXMgICAgICAgID0gZ3BzX2VwaF9zdi0+Y191czsKKwlycmxwX2VwaC0+ZXBoZW1BUG93ZXJIYWxmID0gZ3BzX2VwaF9zdi0+YV9wb3doYWxmOworCXJybHBfZXBoLT5lcGhlbVRvZSAgICAgICAgPSBncHNfZXBoX3N2LT50X29lOworCXJybHBfZXBoLT5lcGhlbUZpdEZsYWcgICAgPSBncHNfZXBoX3N2LT5maXRfZmxhZzsKKwlycmxwX2VwaC0+ZXBoZW1BT0RBICAgICAgID0gZ3BzX2VwaF9zdi0+YW9kbzsKKwlycmxwX2VwaC0+ZXBoZW1DaWMgICAgICAgID0gZ3BzX2VwaF9zdi0+Y19pYzsKKwlycmxwX2VwaC0+ZXBoZW1PbWVnYUEwICAgID0gZ3BzX2VwaF9zdi0+b21lZ2FfMDsKKwlycmxwX2VwaC0+ZXBoZW1DaXMgICAgICAgID0gZ3BzX2VwaF9zdi0+Y19pczsKKwlycmxwX2VwaC0+ZXBoZW1JMCAgICAgICAgID0gZ3BzX2VwaF9zdi0+aV8wOworCXJybHBfZXBoLT5lcGhlbUNyYyAgICAgICAgPSBncHNfZXBoX3N2LT5jX3JjOworCXJybHBfZXBoLT5lcGhlbVcgICAgICAgICAgPSBncHNfZXBoX3N2LT53OworCXJybHBfZXBoLT5lcGhlbU9tZWdhQURvdCAgPSBncHNfZXBoX3N2LT5vbWVnYV9kb3Q7CisJcnJscF9lcGgtPmVwaGVtSURvdCAgICAgICA9IGdwc19lcGhfc3YtPmlkb3Q7CisKKwlycmxwX2VwaC0+ZXBoZW1TRjFSc3ZkLnJlc2VydmVkMSA9IGdwc19lcGhfc3YtPl9yc3ZkMTsKKwlycmxwX2VwaC0+ZXBoZW1TRjFSc3ZkLnJlc2VydmVkMiA9IGdwc19lcGhfc3YtPl9yc3ZkMjsKKwlycmxwX2VwaC0+ZXBoZW1TRjFSc3ZkLnJlc2VydmVkMyA9IGdwc19lcGhfc3YtPl9yc3ZkMzsKKwlycmxwX2VwaC0+ZXBoZW1TRjFSc3ZkLnJlc2VydmVkNCA9IGdwc19lcGhfc3YtPl9yc3ZkNDsKK30KKworc3RhdGljIHZvaWQKK19ycmxwX2ZpbGxfYWxtYW5hY19lbGVtZW50KAorCXN0cnVjdCBBbG1hbmFjRWxlbWVudCAqcnJscF9hZSwKKwlzdHJ1Y3QgZ3BzX2FsbWFuYWNfc3YgKmdwc19hbG1fc3YpCit7CisJcnJscF9hZS0+c2F0ZWxsaXRlSUQgPSBncHNfYWxtX3N2LT5zdl9pZDsKKworCXJybHBfYWUtPmFsbWFuYWNFICAgICAgICAgID0gZ3BzX2FsbV9zdi0+ZTsKKwlycmxwX2FlLT5hbGFtYW5hY1RvYSAgICAgICA9IGdwc19hbG1fc3YtPnRfb2E7CisJcnJscF9hZS0+YWxtYW5hY0tzaWkgICAgICAgPSBncHNfYWxtX3N2LT5rc2lpOworCXJybHBfYWUtPmFsbWFuYWNPbWVnYURvdCAgID0gZ3BzX2FsbV9zdi0+b21lZ2FfZG90OworCXJybHBfYWUtPmFsbWFuYWNTVmhlYWx0aCAgID0gZ3BzX2FsbV9zdi0+c3ZfaGVhbHRoOworCXJybHBfYWUtPmFsbWFuYWNBUG93ZXJIYWxmID0gZ3BzX2FsbV9zdi0+YV9wb3doYWxmOworCXJybHBfYWUtPmFsbWFuYWNPbWVnYTAgICAgID0gZ3BzX2FsbV9zdi0+b21lZ2FfMDsKKwlycmxwX2FlLT5hbG1hbmFjVyAgICAgICAgICA9IGdwc19hbG1fc3YtPnc7CisJcnJscF9hZS0+YWxtYW5hY00wICAgICAgICAgPSBncHNfYWxtX3N2LT5tXzA7CisJcnJscF9hZS0+YWxtYW5hY0FGMCAgICAgICAgPSBncHNfYWxtX3N2LT5hX2YwOworCXJybHBfYWUtPmFsbWFuYWNBRjEgICAgICAgID0gZ3BzX2FsbV9zdi0+YV9mMTsKKworfQorCitzdGF0aWMgdm9pZAorX3JybHBfZmlsbF9pb25vc3BoZXJpY19tb2RlbCgKKwlzdHJ1Y3QgSW9ub3NwaGVyaWNNb2RlbCAqcnJscF9pb25vLAorCXN0cnVjdCBncHNfaW9ub3NwaGVyZV9tb2RlbCAqZ3BzX2lvbm8pCit7CisJcnJscF9pb25vLT5hbGZhMCA9IGdwc19pb25vLT5hbHBoYV8wOworCXJybHBfaW9uby0+YWxmYTEgPSBncHNfaW9uby0+YWxwaGFfMTsKKwlycmxwX2lvbm8tPmFsZmEyID0gZ3BzX2lvbm8tPmFscGhhXzI7CisJcnJscF9pb25vLT5hbGZhMyA9IGdwc19pb25vLT5hbHBoYV8zOworCXJybHBfaW9uby0+YmV0YTAgPSBncHNfaW9uby0+YmV0YV8wOworCXJybHBfaW9uby0+YmV0YTEgPSBncHNfaW9uby0+YmV0YV8xOworCXJybHBfaW9uby0+YmV0YTIgPSBncHNfaW9uby0+YmV0YV8yOworCXJybHBfaW9uby0+YmV0YTMgPSBncHNfaW9uby0+YmV0YV8zOworfQorCitzdGF0aWMgdm9pZAorX3JybHBfZmlsbF91dGNfbW9kZWwoCisJc3RydWN0IFVUQ01vZGVsICpycmxwX3V0YywKKwlzdHJ1Y3QgZ3BzX3V0Y19tb2RlbCAqZ3BzX3V0YykKK3sKKwlycmxwX3V0Yy0+dXRjQTEgICAgICAgID0gZ3BzX3V0Yy0+YTE7CisJcnJscF91dGMtPnV0Y0EwICAgICAgICA9IGdwc191dGMtPmEwOworCXJybHBfdXRjLT51dGNUb3QgICAgICAgPSBncHNfdXRjLT50X290OworCXJybHBfdXRjLT51dGNXTnQgICAgICAgPSBncHNfdXRjLT53bl90ICYgMHhmZjsKKwlycmxwX3V0Yy0+dXRjRGVsdGFUbHMgID0gZ3BzX3V0Yy0+ZGVsdGFfdF9sczsKKwlycmxwX3V0Yy0+dXRjV05sc2YgICAgID0gZ3BzX3V0Yy0+d25fbHNmICYgMHhmZjsKKwlycmxwX3V0Yy0+dXRjRE4gICAgICAgID0gZ3BzX3V0Yy0+ZG47CisJcnJscF91dGMtPnV0Y0RlbHRhVGxzZiA9IGdwc191dGMtPmRlbHRhX3RfbHNmOworfQorCisvKiB9fX0gKi8KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIFJSTFAgQXNzaXN0YW5jZSBQRFUgR2VuZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0te3t7ICovCisKK3N0cnVjdCBQRFUgKgorX3JybHBfY3JlYXRlX2dwc19hc3Npc3RfcGR1KGludCByZWZudW0sIHN0cnVjdCBHUFNfQXNzaXN0RGF0YSAqKm9fZ3BzX2FkKQoreworCXN0cnVjdCBQRFUgKnBkdTsKKwlzdHJ1Y3QgR1BTX0Fzc2lzdERhdGEgKmdwc19hZDsKKworCXBkdSA9IGNhbGxvYygxLCBzaXplb2YoKnBkdSkpOworCWlmICghcGR1KQorCQlyZXR1cm4gTlVMTDsKKworCWdwc19hZCA9IGNhbGxvYygxLCBzaXplb2YoKmdwc19hZCkpOworCWlmICghZ3BzX2FkKSB7CisJCWZyZWUocGR1KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKG9fZ3BzX2FkKQorCQkqb19ncHNfYWQgPSBncHNfYWQ7CisKKwlwZHUtPnJlZmVyZW5jZU51bWJlciA9IHJlZm51bTsKKwlwZHUtPmNvbXBvbmVudC5wcmVzZW50ID0gUlJMUF9Db21wb25lbnRfUFJfYXNzaXN0YW5jZURhdGE7CisJcGR1LT5jb21wb25lbnQuY2hvaWNlLmFzc2lzdGFuY2VEYXRhLmdwc19Bc3Npc3REYXRhID0gZ3BzX2FkOworCisJcmV0dXJuIHBkdTsKK30KKworc3RhdGljIGludAorX3JybHBfYWRkX2lvbm9zcGhlcmljX21vZGVsKAorCXN0cnVjdCBHUFNfQXNzaXN0RGF0YSAqcnJscF9ncHNfYWQsCisJc3RydWN0IGdwc19hc3Npc3RfZGF0YSAqZ3BzX2FkKQoreworCXN0cnVjdCBJb25vc3BoZXJpY01vZGVsICpycmxwX2lvbm87CisKKwlpZiAoIShncHNfYWQtPmZpZWxkcyAmIEdQU19GSUVMRF9JT05PU1BIRVJFKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlycmxwX2lvbm8gPSBjYWxsb2MoMSwgc2l6ZW9mKCpycmxwX2lvbm8pKTsKKwlpZiAoIXJybHBfaW9ubykKKwkJcmV0dXJuIC1FTk9NRU07CisJcnJscF9ncHNfYWQtPmNvbnRyb2xIZWFkZXIuaW9ub3NwaGVyaWNNb2RlbCA9IHJybHBfaW9ubzsKKworCV9ycmxwX2ZpbGxfaW9ub3NwaGVyaWNfbW9kZWwocnJscF9pb25vLCAmZ3BzX2FkLT5pb25vc3BoZXJlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitfcnJscF9hZGRfdXRjX21vZGVsKAorCXN0cnVjdCBHUFNfQXNzaXN0RGF0YSAqcnJscF9ncHNfYWQsCisJc3RydWN0IGdwc19hc3Npc3RfZGF0YSAqZ3BzX2FkKQoreworCXN0cnVjdCBVVENNb2RlbCAqcnJscF91dGM7CisKKwlpZiAoIShncHNfYWQtPmZpZWxkcyAmIEdQU19GSUVMRF9VVEMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJybHBfdXRjID0gY2FsbG9jKDEsIHNpemVvZigqcnJscF91dGMpKTsKKwlpZiAoIXJybHBfdXRjKQorCQlyZXR1cm4gLUVOT01FTTsKKwlycmxwX2dwc19hZC0+Y29udHJvbEhlYWRlci51dGNNb2RlbCA9IHJybHBfdXRjOworCisJX3JybHBfZmlsbF91dGNfbW9kZWwocnJscF91dGMsICZncHNfYWQtPnV0Yyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorX3JybHBfYWRkX3JlZmVyZW5jZV9sb2NhdGlvbigKKwlzdHJ1Y3QgR1BTX0Fzc2lzdERhdGEgKnJybHBfZ3BzX2FkLAorCXN0cnVjdCBncHNfYXNzaXN0X2RhdGEgKmdwc19hZCkKK3sKKwlzdHJ1Y3QgUmVmTG9jYXRpb24gKnJybHBfcmVmbG9jOworCXVpbnQ4X3QgKmI7CisKKwlpZiAoIShncHNfYWQtPmZpZWxkcyAmIEdQU19GSUVMRF9SRUZQT1MpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJybHBfcmVmbG9jID0gY2FsbG9jKDEsIHNpemVvZigqcnJscF9yZWZsb2MpKTsKKwlpZiAoIXJybHBfcmVmbG9jKQorCQlyZXR1cm4gLUVOT01FTTsKKwlycmxwX2dwc19hZC0+Y29udHJvbEhlYWRlci5yZWZMb2NhdGlvbiA9IHJybHBfcmVmbG9jOworCisJYiA9IG1hbGxvYyg5KTsKKworCWJbMF0gPSAweDgwOyAvKiBFbGxpcHNvaWQgUG9pbnQgd2l0aCBhbHRpdHVkZSAqLworCV90c18yM18wMzJfc3RvcmVfbGF0aXR1ZGUoZ3BzX2FkLT5yZWZfcG9zLmxhdGl0dWRlLCAmYlsxXSk7CisJX3RzXzIzXzAzMl9zdG9yZV9sb25naXR1ZGUoZ3BzX2FkLT5yZWZfcG9zLmxvbmdpdHVkZSwgJmJbNF0pOworCV90c18yM18wMzJfc3RvcmVfYWx0aXR1ZGUoZ3BzX2FkLT5yZWZfcG9zLmFsdGl0dWRlLCAmYls3XSk7CisKKwlycmxwX3JlZmxvYy0+dGhyZWVETG9jYXRpb24uYnVmID0gYjsKKwlycmxwX3JlZmxvYy0+dGhyZWVETG9jYXRpb24uc2l6ZSA9IDk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorX3JybHBfYWRkX3JlZmVyZW5jZV90aW1lKAorCXN0cnVjdCBHUFNfQXNzaXN0RGF0YSAqcnJscF9ncHNfYWQsCisJc3RydWN0IGdwc19hc3Npc3RfZGF0YSAqZ3BzX2FkKQoreworCXN0cnVjdCBSZWZlcmVuY2VUaW1lICpycmxwX3JlZnRpbWU7CisKKwlpZiAoIShncHNfYWQtPmZpZWxkcyAmIEdQU19GSUVMRF9SRUZUSU1FKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlycmxwX3JlZnRpbWUgPSBjYWxsb2MoMSwgc2l6ZW9mKCpycmxwX3JlZnRpbWUpKTsKKwlpZiAoIXJybHBfcmVmdGltZSkKKwkJcmV0dXJuIC1FTk9NRU07CisJcnJscF9ncHNfYWQtPmNvbnRyb2xIZWFkZXIucmVmZXJlbmNlVGltZSA9IHJybHBfcmVmdGltZTsKKworCXJybHBfcmVmdGltZS0+Z3BzVGltZS5ncHNXZWVrICAgPSBncHNfYWQtPnJlZl90aW1lLnduICYgMHgzZmY7IC8qIDEwYiAqLworCXJybHBfcmVmdGltZS0+Z3BzVGltZS5ncHNUT1cyM2IgPQorCQkoKGludClmbG9vcihncHNfYWQtPnJlZl90aW1lLnRvdyAvIDAuMDgpKSAmIDB4N2ZmZmZmOyAgLyogMjNiICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorX3JybHBfYWRkX2FsbWFuYWMoCisJc3RydWN0IEdQU19Bc3Npc3REYXRhICpycmxwX2dwc19hZCwKKwlzdHJ1Y3QgZ3BzX2Fzc2lzdF9kYXRhICpncHNfYWQsIGludCAqc3RhcnQsIGludCBjb3VudCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgQWxtYW5hYyAqcnJscF9hbG07CisJc3RydWN0IGdwc19hbG1hbmFjICpncHNfYWxtID0gJmdwc19hZC0+YWxtYW5hYzsKKworCWlmICghKGdwc19hZC0+ZmllbGRzICYgR1BTX0ZJRUxEX0FMTUFOQUMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJybHBfYWxtID0gY2FsbG9jKDEsIHNpemVvZigqcnJscF9hbG0pKTsKKwlpZiAoIXJybHBfYWxtKQorCQlyZXR1cm4gLUVOT01FTTsKKwlycmxwX2dwc19hZC0+Y29udHJvbEhlYWRlci5hbG1hbmFjID0gcnJscF9hbG07CisKKwlycmxwX2FsbS0+YWxhbWFuYWNXTmEgPSBncHNfYWxtLT53bmE7CisJaWYgKGNvdW50ID09IC0xKQorCQljb3VudCA9IGdwc19hbG0tPm5fc3YgLSAqc3RhcnQ7CisJZm9yIChpPSpzdGFydDsgKGk8KnN0YXJ0K2NvdW50KSAmJiAoaTxncHNfYWxtLT5uX3N2KTsgaSsrKSB7CisJCXN0cnVjdCBBbG1hbmFjRWxlbWVudCAqYWU7CisJCWFlID0gY2FsbG9jKDEsIHNpemVvZigqYWUpKTsKKwkJaWYgKCFhZSkKKwkJCXJldHVybiAtRU5PTUVNOworCQlfcnJscF9maWxsX2FsbWFuYWNfZWxlbWVudChhZSwgJmdwc19hbG0tPnN2c1tpXSk7CisJCUFTTl9TRVFVRU5DRV9BREQoJnJybHBfYWxtLT5hbG1hbmFjTGlzdC5saXN0LCBhZSk7CisJfQorCisJKnN0YXJ0ID0gaTsKKworCXJldHVybiBpIDwgZ3BzX2FsbS0+bl9zdjsKK30KKworc3RhdGljIGludAorX3JybHBfYWRkX2VwaGVtZXJpcygKKwlzdHJ1Y3QgR1BTX0Fzc2lzdERhdGEgKnJybHBfZ3BzX2FkLAorCXN0cnVjdCBncHNfYXNzaXN0X2RhdGEgKmdwc19hZCwgaW50ICpzdGFydCwgaW50IGNvdW50LCB1aW50NjRfdCBtYXNrKQoreworCWludCBpLCBqOworCXN0cnVjdCBOYXZpZ2F0aW9uTW9kZWwgKnJybHBfbmF2OworCXN0cnVjdCBncHNfZXBoZW1lcmlzICpncHNfZXBoID0gJmdwc19hZC0+ZXBoZW1lcmlzOworCisJaWYgKCEoZ3BzX2FkLT5maWVsZHMgJiBHUFNfRklFTERfRVBIRU1FUklTKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlycmxwX25hdiA9IGNhbGxvYygxLCBzaXplb2YoKnJybHBfbmF2KSk7CisJaWYgKCFycmxwX25hdikKKwkJcmV0dXJuIC1FTk9NRU07CisJcnJscF9ncHNfYWQtPmNvbnRyb2xIZWFkZXIubmF2aWdhdGlvbk1vZGVsID0gcnJscF9uYXY7CisKKwlpZiAoY291bnQgPT0gLTEpCisJCWNvdW50ID0gZ3BzX2VwaC0+bl9zdiAtICpzdGFydDsKKwlmb3IgKGk9KnN0YXJ0LGo9MDsgKGo8Y291bnQpICYmIChpPGdwc19lcGgtPm5fc3YpOyBpKyspIHsKKwkJaWYgKCEobWFzayAmICgxVUxMPDwoZ3BzX2VwaC0+c3ZzW2ldLnN2X2lkLTEpKSkpCisJCQljb250aW51ZTsKKwkJc3RydWN0IE5hdk1vZGVsRWxlbWVudCAqbm1lOworCQlubWUgPSBjYWxsb2MoMSwgc2l6ZW9mKCpubWUpKTsKKwkJaWYgKCFubWUpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJX3JybHBfZmlsbF9uYXZpZ2F0aW9uX21vZGVsX2VsZW1lbnQobm1lLCAmZ3BzX2VwaC0+c3ZzW2ldKTsKKwkJQVNOX1NFUVVFTkNFX0FERCgmcnJscF9uYXYtPm5hdk1vZGVsTGlzdC5saXN0LCBubWUpOworCQlqKys7CisJfQorCisJKnN0YXJ0ID0gaTsKKworCXJldHVybiBpIDwgZ3BzX2VwaC0+bl9zdjsKK30KKworCisjZGVmaW5lIE1BWF9QRFVTIDY0CisKK2ludAorcnJscF9ncHNfYXNzaXN0X3BkdXMoCisJc3RydWN0IGdwc19hc3Npc3RfZGF0YSAqZ3BzX2FkLCBzdHJ1Y3QgcnJscF9hc3Npc3RfcmVxICpyZXEsCisJdm9pZCAqKm9fcGR1LCBpbnQgKm9fbGVuLCBpbnQgb19tYXhfcGR1cykKK3sKKwlzdHJ1Y3QgUERVICpsc3RfcGR1W01BWF9QRFVTXTsKKwlpbnQgbHN0X2NudCA9IDA7CisKKwlzdHJ1Y3QgUERVICpycmxwX3BkdSA9IE5VTEw7CisJc3RydWN0IEdQU19Bc3Npc3REYXRhICpycmxwX2dwc19hZCA9IE5VTEw7CisJdWludDMyX3QgcmUgPSByZXEtPnJlcV9lbGVtczsKKwlpbnQgaSwgcnYgPSAwOworCisJLyogSW9ub3NwaGVyaWNNb2RlbCwgVVRDTW9kZWwsIFJlZkxvY2F0aW9uLCBSZWZlcmVuY2VUaW1lICovCisJaWYgKHJlICYgKFJSTFBfQVJfSU9OT19NT0RFTCB8CisJICAgICAgICAgIFJSTFBfQVJfVVRDX01PREVMIHwKKwkgICAgICAgICAgUlJMUF9BUl9SRUZfVElNRSB8CisJICAgICAgICAgIFJSTFBfQVJfUkVGX0xPQykpCisJeworCQlpbnQgcGR1X2hhc19kYXRhID0gMDsKKworCQlycmxwX3BkdSA9IF9ycmxwX2NyZWF0ZV9ncHNfYXNzaXN0X3BkdSgxLCAmcnJscF9ncHNfYWQpOworCQlpZiAoIXJybHBfcGR1KSB7CisJCQlydiA9IC1FTk9NRU07CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJaWYgKHJlICYgUlJMUF9BUl9JT05PX01PREVMKQorCQkJaWYgKCFfcnJscF9hZGRfaW9ub3NwaGVyaWNfbW9kZWwocnJscF9ncHNfYWQsIGdwc19hZCkpCisJCQkJcGR1X2hhc19kYXRhID0gMTsKKworCQlpZiAocmUgJiBSUkxQX0FSX1VUQ19NT0RFTCkKKwkJCWlmICghX3JybHBfYWRkX3V0Y19tb2RlbChycmxwX2dwc19hZCwgZ3BzX2FkKSkKKwkJCQlwZHVfaGFzX2RhdGEgPSAxOworCisJCWlmIChyZSAmIFJSTFBfQVJfUkVGX1RJTUUpCisJCQlpZiAoIV9ycmxwX2FkZF9yZWZlcmVuY2VfdGltZShycmxwX2dwc19hZCwgZ3BzX2FkKSkKKwkJCQlwZHVfaGFzX2RhdGEgPSAxOworCisJCWlmIChyZSAmIFJSTFBfQVJfUkVGX0xPQykKKwkJCWlmICghX3JybHBfYWRkX3JlZmVyZW5jZV9sb2NhdGlvbihycmxwX2dwc19hZCwgZ3BzX2FkKSkKKwkJCQlwZHVfaGFzX2RhdGEgPSAxOworCisJCWlmIChwZHVfaGFzX2RhdGEpIHsKKwkJCWxzdF9wZHVbbHN0X2NudCsrXSA9IHJybHBfcGR1OworCQkJcnJscF9wZHUgPSBOVUxMOworCQl9CisJfQorCisJLyogQWxtYW5hYyAqLworCWlmIChyZSAmIFJSTFBfQVJfQUxNQU5BQykgeworCQlpID0gMDsKKwkJZG8geworCQkJaWYgKCEoZ3BzX2FkLT5maWVsZHMgJiBHUFNfRklFTERfQUxNQU5BQykpCisJCQkJYnJlYWs7CisKKwkJCWlmICghcnJscF9wZHUpIHsKKwkJCQlycmxwX3BkdSA9IF9ycmxwX2NyZWF0ZV9ncHNfYXNzaXN0X3BkdSgxLCAmcnJscF9ncHNfYWQpOworCQkJCWlmICghcnJscF9wZHUpIHsKKwkJCQkJcnYgPSAtRU5PTUVNOworCQkJCQlnb3RvIGVycm9yOworCQkJCX0KKwkJCX0KKworCQkJcnYgPSBfcnJscF9hZGRfYWxtYW5hYyhycmxwX2dwc19hZCwgZ3BzX2FkLCAmaSwgMTApOworCQkJaWYgKHJ2IDwgMCkKKwkJCQlnb3RvIGVycm9yOworCisJCQlsc3RfcGR1W2xzdF9jbnQrK10gPSBycmxwX3BkdTsKKwkJCXJybHBfcGR1ID0gTlVMTDsKKwkJfSB3aGlsZSAocnYpOworCX0KKworCS8qIEVwaGVtZXJpcyAqLworCWlmIChyZSAmIFJSTFBfQVJfRVBIRU1FUklTKSB7CisJCWkgPSAwOworCQlkbyB7CisJCQlpZiAoIShncHNfYWQtPmZpZWxkcyAmIEdQU19GSUVMRF9FUEhFTUVSSVMpKQorCQkJCWJyZWFrOworCisJCQlpZiAoIXJybHBfcGR1KSB7CisJCQkJcnJscF9wZHUgPSBfcnJscF9jcmVhdGVfZ3BzX2Fzc2lzdF9wZHUoMSwgJnJybHBfZ3BzX2FkKTsKKwkJCQlpZiAoIXJybHBfcGR1KSB7CisJCQkJCXJ2ID0gLUVOT01FTTsKKwkJCQkJZ290byBlcnJvcjsKKwkJCQl9CisJCQl9CisKKwkJCXJ2ID0gX3JybHBfYWRkX2VwaGVtZXJpcyhycmxwX2dwc19hZCwgZ3BzX2FkLCAmaSwgMiwgcmVxLT5lcGhfc3ZzKTsKKworCQkJbHN0X3BkdVtsc3RfY250KytdID0gcnJscF9wZHU7CisJCQlycmxwX3BkdSA9IE5VTEw7CisKKwkJfSB3aGlsZSAocnYpOworCX0KKworCS8qIFNlcmlhbGl6ZSAmIFJlbGVhc2UgYWxsIFBEVXMgKi8KKwlmb3IgKGk9MDsgaTxsc3RfY250ICYmIGk8b19tYXhfcGR1czsgaSsrKSB7CisJCS8qIFBzZXVkbyBzZWdtZW50YXRpb24gZmxhZ3MgKi8KKwkJTW9yZUFzc0RhdGFUb0JlU2VudF90ICptYWQgPSBjYWxsb2MoMSwgc2l6ZW9mKCptYWQpKTsKKwkJKm1hZCA9IChpID09IChsc3RfY250LTEpKSA/CisJCQkJTW9yZUFzc0RhdGFUb0JlU2VudF9ub01vcmVNZXNzYWdlcyA6CisJCQkJTW9yZUFzc0RhdGFUb0JlU2VudF9tb3JlTWVzc2FnZXNPblRoZVdheTsKKwkJbHN0X3BkdVtpXS0+Y29tcG9uZW50LmNob2ljZS5hc3Npc3RhbmNlRGF0YS5tb3JlQXNzRGF0YVRvQmVTZW50ID0gbWFkOworCisJCS8qIFNlcmlhbGl6YXRpb24gKi8KKwkJLy8gYXNuX2ZwcmludChzdGRvdXQsICZhc25fREVGX1BEVSwgbHN0X3BkdVtpXSk7CisJCXJ2ID0gdXBlcl9lbmNvZGVfdG9fbmV3X2J1ZmZlcigmYXNuX0RFRl9QRFUsIE5VTEwsIGxzdF9wZHVbaV0sICZvX3BkdVtpXSk7CisJCWlmIChydiA8IDApCisJCQlnb3RvIGVycm9yOworCQlvX2xlbltpXSA9IHJ2OworCX0KKworCXJ2ID0gbHN0X2NudDsKKworCS8qIFJlbGVhc2UgQVNOLjEgb2JqZWN0cyAqLworZXJyb3I6CisJaWYgKHJybHBfcGR1KQorCQlhc25fREVGX1BEVS5mcmVlX3N0cnVjdCgmYXNuX0RFRl9QRFUsICh2b2lkKilycmxwX3BkdSwgMCk7CisKKwlmb3IgKGk9MDsgaTxsc3RfY250OyBpKyspCisJCWFzbl9ERUZfUERVLmZyZWVfc3RydWN0KCZhc25fREVGX1BEVSwgbHN0X3BkdVtpXSwgMCk7CisKKwlyZXR1cm4gcnY7Cit9CisKKy8qIH19fSAqLworCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9ycmxwLmggYi9ycmxwLWVwaGVtZXJpcy9ycmxwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVlNDM0NAotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL3JybHAuaApAQCAtMCwwICsxLDY0IEBACisvKgorICogcnJscC5oCisgKgorICogUlJMUCBIZWFkZXIKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5ICBTeWx2YWluIE11bmF1dCA8dG50QDI0NnROdC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIF9fUlJMUF9IX18KKyNkZWZpbmUgX19SUkxQX0hfXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJncHMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qIE91ciBpbnRlcm5hbCBzaW1wbGlmaWVkIHN0cnVjdHVyZSBmb3IgcmVxdWVzdHMgKi8KKworI2RlZmluZSBSUkxQX0FSX1JFRl9MT0MJCSgxPDwwKQorI2RlZmluZSBSUkxQX0FSX1JFRl9USU1FCSgxPDwxKQorI2RlZmluZSBSUkxQX0FSX1VUQ19NT0RFTAkoMTw8MikKKyNkZWZpbmUgUlJMUF9BUl9JT05PX01PREVMCSgxPDwzKQorI2RlZmluZSBSUkxQX0FSX0FMTUFOQUMJCSgxPDw0KQorI2RlZmluZSBSUkxQX0FSX0VQSEVNRVJJUwkoMTw8NSkKKworc3RydWN0IHJybHBfYXNzaXN0X3JlcSB7CisJdWludDMyX3QgcmVxX2VsZW1zOworCXVpbnQ2NF90IGVwaF9zdnM7Cit9OworCisKKy8qIE1ldGhvZHMgKi8KK2ludCBycmxwX2RlY29kZV9hc3Npc3RhbmNlX3JlcXVlc3Qoc3RydWN0IHJybHBfYXNzaXN0X3JlcSAqYXIsCisJdm9pZCAqcmVxLCBpbnQgcmVxX2xlbik7CisKK2ludCBycmxwX2dwc19hc3Npc3RfcGR1cygKKwlzdHJ1Y3QgZ3BzX2Fzc2lzdF9kYXRhICpncHNfYWQsIHN0cnVjdCBycmxwX2Fzc2lzdF9yZXEgKnJlcSwKKwl2b2lkICoqb19wZHUsIGludCAqb19sZW4sIGludCBvX21heF9wZHVzKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19SUkxQX0hfXyAqLworCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy91YngtcGFyc2UuYyBiL3JybHAtZXBoZW1lcmlzL3VieC1wYXJzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZDBmNzAKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy91YngtcGFyc2UuYwpAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqIHVieC1wYXJzZS5jCisgKgorICogSW1wbGVtZW50YXRpb24gb2YgcGFyc2luZyBjb2RlIGNvbnZlcnRpbmcgVUJYIG1lc3NhZ2VzIHRvIEdQUyBhc3Npc3QKKyAqIGRhdGEKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5ICBTeWx2YWluIE11bmF1dCA8dG50QDI0NnROdC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImdwcy5oIgorI2luY2x1ZGUgInVieC5oIgorI2luY2x1ZGUgInVieC1wYXJzZS5oIgorCisKKy8qIEhlbHBlcnMgKi8KKworc3RhdGljIGludAorZmxvYXRfdG9fZml4ZWRwb2ludChmbG9hdCBmLCBpbnQgc2YpCit7CisJaWYgKHNmIDwgMCkgeworCQl3aGlsZSAoc2YrKyA8IDApCisJCQlmICo9IDIuMGY7CisJfSBlbHNlIHsKKwkJd2hpbGUgKHNmLS0gPiAwKQorCQkJZiAqPSAwLjVmOworCX0KKworCXJldHVybiAoaW50KWY7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Citkb3VibGVfdG9fZml4ZWRwb2ludChkb3VibGUgZCwgaW50IHNmKQoreworCWlmIChzZiA8IDApIHsKKwkJd2hpbGUgKHNmKysgPCAwKQorCQkJZCAqPSAyLjA7CisJfSBlbHNlIHsKKwkJd2hpbGUgKHNmLS0gPiAwKQorCQkJZCAqPSAwLjU7CisJfQorCisJcmV0dXJuIChpbnQpZDsKK30KKworCisvKiBVQlggbWVzc2FnZSBwYXJzaW5nIHRvIGZpbGwgZ3BzIGFzc2lzdCBkYXRhICovCisKK3N0YXRpYyB2b2lkCitfdWJ4X21zZ19wYXJzZV9uYXZfcG9zbGxoKHN0cnVjdCB1YnhfaGRyICpoZHIsIHZvaWQgKnBsLCBpbnQgcGxfbGVuLCB2b2lkICp1ZCkKK3sKKwlzdHJ1Y3QgdWJ4X25hdl9wb3NsbGggKm5hdl9wb3NsbGggPSBwbDsKKwlzdHJ1Y3QgZ3BzX2Fzc2lzdF9kYXRhICpncHMgPSB1ZDsKKworCS8vcHJpbnRmKCJbLl0gTkFWX1BPU0xMSFxuIik7CisKKwlncHMtPmZpZWxkcyB8PSBHUFNfRklFTERfUkVGUE9TOworCisJZ3BzLT5yZWZfcG9zLmxhdGl0dWRlICA9IChkb3VibGUpKG5hdl9wb3NsbGgtPmxhdCkgKiAxZS03OworCWdwcy0+cmVmX3Bvcy5sb25naXR1ZGUgPSAoZG91YmxlKShuYXZfcG9zbGxoLT5sb24pICogMWUtNzsKKwlncHMtPnJlZl9wb3MuYWx0aXR1ZGUgID0gKGRvdWJsZSkobmF2X3Bvc2xsaC0+aGVpZ2h0KSAqIDFlLTM7Cit9CisKK3N0YXRpYyB2b2lkCitfdWJ4X21zZ19wYXJzZV9haWRfaW5pKHN0cnVjdCB1YnhfaGRyICpoZHIsIHZvaWQgKnBsLCBpbnQgcGxfbGVuLCB2b2lkICp1ZCkKK3sKKwlzdHJ1Y3QgdWJ4X2FpZF9pbmkgKmFpZF9pbmkgPSBwbDsKKwlzdHJ1Y3QgZ3BzX2Fzc2lzdF9kYXRhICpncHMgPSB1ZDsKKworCS8vcHJpbnRmKCJbLl0gQUlEX0lOSVxuIik7CisKKwkvKiBFeHRyYWN0IGluZm8gZm9yICJSZWZlcmVuY2UgVGltZSIgKi8KKwlncHMtPmZpZWxkcyB8PSBHUFNfRklFTERfUkVGVElNRTsKKworCWdwcy0+cmVmX3RpbWUud24gPSBhaWRfaW5pLT53bjsKKwlncHMtPnJlZl90aW1lLnRvdyA9IChkb3VibGUpYWlkX2luaS0+dG93ICogMWUtMzsKKworCS8vIEZJWE1FOiBXZSBjb3VsZCBleHRyYWN0IHJlZiBwb3NpdGlvbiBhcyB3ZWxsIGJ1dCB3ZSBuZWVkIGl0IGluCisJLy8gICAgICAgIFdHUzg0IGdlb2RldGljIGNvb3JkaW5hdGVzIGFuZCBpdCdzIHByb3ZpZGVkIGFzIGVjZWYsIHNvCisJLy8gICAgICAgIHdlIG5lZWQgYSBsb3Qgb2YgbWF0aCAuLi4KK30KKworc3RhdGljIHZvaWQKK191YnhfbXNnX3BhcnNlX2FpZF9odWkoc3RydWN0IHVieF9oZHIgKmhkciwgdm9pZCAqcGwsIGludCBwbF9sZW4sIHZvaWQgKnVkKQoreworCXN0cnVjdCB1YnhfYWlkX2h1aSAqYWlkX2h1aSA9IHBsOworCXN0cnVjdCBncHNfYXNzaXN0X2RhdGEgKmdwcyA9IHVkOworCisJLy9wcmludGYoIlsuXSBBSURfSFVJXG4iKTsKKworCWlmIChhaWRfaHVpLT5mbGFncyAmIDB4MikgeyAvKiBVVEMgcGFyYW1ldGVycyB2YWxpZCAqLworCQlzdHJ1Y3QgZ3BzX3V0Y19tb2RlbCAqdXRjID0gJmdwcy0+dXRjOworCisJCWdwcy0+ZmllbGRzIHw9IEdQU19GSUVMRF9VVEM7CisKKwkJdXRjLT5hMCAgICAgICAgICA9IGRvdWJsZV90b19maXhlZHBvaW50KGFpZF9odWktPnV0Y19hMCwgLTMwKTsKKwkJdXRjLT5hMSAgICAgICAgICA9IGRvdWJsZV90b19maXhlZHBvaW50KGFpZF9odWktPnV0Y19hMSwgLTUwKTsKKwkJdXRjLT5kZWx0YV90X2xzICA9IGFpZF9odWktPnV0Y19sczsKKwkJdXRjLT50X290ICAgICAgICA9IGFpZF9odWktPnV0Y190b3QgPj4gMTI7CisJCXV0Yy0+d25fdCAgICAgICAgPSBhaWRfaHVpLT51dGNfd250OworCQl1dGMtPnduX2xzZiAgICAgID0gYWlkX2h1aS0+dXRjX3duZjsKKwkJdXRjLT5kbiAgICAgICAgICA9IGFpZF9odWktPnV0Y19kbjsKKwkJdXRjLT5kZWx0YV90X2xzZiA9IGFpZF9odWktPnV0Y19sc2Y7CisJfQorCisJaWYgKGFpZF9odWktPmZsYWdzICYgMHgwNCkgeyAvKiBLbG9idWNoYXIgcGFyYW1ldGVycyB2YWxpZCAqLworCQlzdHJ1Y3QgZ3BzX2lvbm9zcGhlcmVfbW9kZWwgKmlvbm8gPSAmZ3BzLT5pb25vc3BoZXJlOworCisJCWdwcy0+ZmllbGRzIHw9IEdQU19GSUVMRF9JT05PU1BIRVJFOworCisJCWlvbm8tPmFscGhhXzAgPSBmbG9hdF90b19maXhlZHBvaW50KGFpZF9odWktPmtsb2JfYTAsIC0zMCk7CisJCWlvbm8tPmFscGhhXzEgPSBmbG9hdF90b19maXhlZHBvaW50KGFpZF9odWktPmtsb2JfYTEsIC0yNyk7CisJCWlvbm8tPmFscGhhXzIgPSBmbG9hdF90b19maXhlZHBvaW50KGFpZF9odWktPmtsb2JfYTIsIC0yNCk7CisJCWlvbm8tPmFscGhhXzMgPSBmbG9hdF90b19maXhlZHBvaW50KGFpZF9odWktPmtsb2JfYTMsIC0yNCk7CisJCWlvbm8tPmJldGFfMCA9IGZsb2F0X3RvX2ZpeGVkcG9pbnQoYWlkX2h1aS0+a2xvYl9iMCwgMTEpOworCQlpb25vLT5iZXRhXzEgPSBmbG9hdF90b19maXhlZHBvaW50KGFpZF9odWktPmtsb2JfYjEsIDE0KTsKKwkJaW9uby0+YmV0YV8yID0gZmxvYXRfdG9fZml4ZWRwb2ludChhaWRfaHVpLT5rbG9iX2IyLCAxNik7CisJCWlvbm8tPmJldGFfMyA9IGZsb2F0X3RvX2ZpeGVkcG9pbnQoYWlkX2h1aS0+a2xvYl9iMywgMTYpOworCX0KK30KKworc3RhdGljIHZvaWQKK191YnhfbXNnX3BhcnNlX2FpZF9hbG0oc3RydWN0IHVieF9oZHIgKmhkciwgdm9pZCAqcGwsIGludCBwbF9sZW4sIHZvaWQgKnVkKQoreworCXN0cnVjdCB1YnhfYWlkX2FsbSAqYWlkX2FsbSA9IHBsOworCXN0cnVjdCBncHNfYXNzaXN0X2RhdGEgKmdwcyA9IHVkOworCisJLy9wcmludGYoIlsuXSBBSURfQUxNICVkIC0gJWRcbiIsIGFpZF9hbG0tPnN2X2lkLCBhaWRfYWxtLT5ncHNfd2Vlayk7CisKKwlpZiAoYWlkX2FsbS0+Z3BzX3dlZWspIHsKKwkJZ3BzLT5maWVsZHMgfD0gR1BTX0ZJRUxEX0FMTUFOQUM7CisJCWdwcy0+YWxtYW5hYy53bmEgPSBhaWRfYWxtLT5ncHNfd2VlayAmIDB4ZmY7CisJCWdwc191bnBhY2tfc2Y0NV9hbG1hbmFjKGFpZF9hbG0tPmFsbV93b3JkcywgJmdwcy0+YWxtYW5hYy5zdnNbZ3BzLT5hbG1hbmFjLm5fc3YrK10pOworCX0KK30KKworc3RhdGljIHZvaWQKK191YnhfbXNnX3BhcnNlX2FpZF9lcGgoc3RydWN0IHVieF9oZHIgKmhkciwgdm9pZCAqcGwsIGludCBwbF9sZW4sIHZvaWQgKnVkKQoreworCXN0cnVjdCB1YnhfYWlkX2VwaCAqYWlkX2VwaCA9IHBsOworCXN0cnVjdCBncHNfYXNzaXN0X2RhdGEgKmdwcyA9IHVkOworCisJLy9wcmludGYoIlsuXSBBSURfRVBIICVkIC0gJXNcbiIsIGFpZF9lcGgtPnN2X2lkLCBhaWRfZXBoLT5wcmVzZW50ID8gInByZXNlbnQiIDogIm5vdCBwcmVzZW50Iik7CisKKwlpZiAoYWlkX2VwaC0+cHJlc2VudCkgeworCQlpbnQgaSA9IGdwcy0+ZXBoZW1lcmlzLm5fc3YrKzsKKwkJZ3BzLT5maWVsZHMgfD0gR1BTX0ZJRUxEX0VQSEVNRVJJUzsKKwkJZ3BzLT5lcGhlbWVyaXMuc3ZzW2ldLnN2X2lkID0gYWlkX2VwaC0+c3ZfaWQ7CisJCWdwc191bnBhY2tfc2YxMjMoYWlkX2VwaC0+ZXBoX3dvcmRzLCAmZ3BzLT5lcGhlbWVyaXMuc3ZzW2ldKTsKKwl9Cit9CisKKworLyogRGlzcGF0Y2ggdGFibGUgKi8KK3N0cnVjdCB1YnhfZGlzcGF0Y2hfZW50cnkgdWJ4X3BhcnNlX2R0W10gPSB7CisJVUJYX0RJU1BBVENIKE5BViwgUE9TTExILCBfdWJ4X21zZ19wYXJzZV9uYXZfcG9zbGxoKSwKKwlVQlhfRElTUEFUQ0goQUlELCBJTkksIF91YnhfbXNnX3BhcnNlX2FpZF9pbmkpLAorCVVCWF9ESVNQQVRDSChBSUQsIEhVSSwgX3VieF9tc2dfcGFyc2VfYWlkX2h1aSksCisJVUJYX0RJU1BBVENIKEFJRCwgQUxNLCBfdWJ4X21zZ19wYXJzZV9haWRfYWxtKSwKKwlVQlhfRElTUEFUQ0goQUlELCBFUEgsIF91YnhfbXNnX3BhcnNlX2FpZF9lcGgpLAorfTsKKwpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvdWJ4LXBhcnNlLmggYi9ycmxwLWVwaGVtZXJpcy91YngtcGFyc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjE0NzVkCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvdWJ4LXBhcnNlLmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIHVieC1wYXJzZS5oCisgKgorICogSGVhZGVyIGZvciBwYXJzaW5nIGNvZGUgY29udmVydGluZyBVQlggbWVzc2FnZXMgdG8gR1BTIGFzc2lzdCBkYXRhCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSAgU3lsdmFpbiBNdW5hdXQgPHRudEAyNDZ0TnQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBfX1VCWF9QQVJTRV9IX18KKyNkZWZpbmUgX19VQlhfUEFSU0VfSF9fCisKKworI2luY2x1ZGUgImdwcy5oIgorI2luY2x1ZGUgInVieC5oIgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKiBEaXNwYXRjaCB0YWJsZSAqLworZXh0ZXJuIHN0cnVjdCB1YnhfZGlzcGF0Y2hfZW50cnkgdWJ4X3BhcnNlX2R0W107CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fVUJYX1BBUlNFX0hfXyAqLworCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy91YnguYyBiL3JybHAtZXBoZW1lcmlzL3VieC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZGQxZjAKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy91YnguYwpAQCAtMCwwICsxLDgxIEBACisvKgorICogdWJ4LmMKKyAqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBnZW5lcmljIFVCWCBoZWxwZXJzCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSAgU3lsdmFpbiBNdW5hdXQgPHRudEAyNDZ0TnQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJ1YnguaCIKKworCitzdGF0aWMgdm9pZAordWJ4X2NoZWNrc3VtKHVpbnQ4X3QgKmRhdGEsIGludCBsZW4sIHVpbnQ4X3QgKmNrc3VtKQoreworCWludCBpOworCXVpbnQ4X3QgY2swID0gMCwgY2sxID0gMDsKKwlmb3IgKGk9MDsgaTxsZW47IGkrKykgeworCQljazAgKz0gZGF0YVtpXTsKKwkJY2sxICs9IGNrMDsKKwl9CisJY2tzdW1bMF0gPSBjazA7CisJY2tzdW1bMV0gPSBjazE7Cit9CisKKworc3RhdGljIHVieF9tc2dfaGFuZGxlcl90Cit1YnhfZmluZF9oYW5kbGVyKHN0cnVjdCB1YnhfZGlzcGF0Y2hfZW50cnkgKmR0LCB1aW50OF90IG1zZ19jbGFzcywgdWludDhfdCBtc2dfaWQpCit7CisJd2hpbGUgKGR0LT5oYW5kbGVyKSB7CisJCWlmICgoZHQtPm1zZ19jbGFzcyA9PSBtc2dfY2xhc3MpICYmIChkdC0+bXNnX2lkID09IG1zZ19pZCkpCisJCQlyZXR1cm4gZHQtPmhhbmRsZXI7CisJCWR0Kys7CisJfQorCXJldHVybiBOVUxMOworfQorCisKK2ludAordWJ4X21zZ19kaXNwYXRjaChzdHJ1Y3QgdWJ4X2Rpc3BhdGNoX2VudHJ5ICpkdCwKKyAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLCBpbnQgbGVuLCB2b2lkICp1c2VyZGF0YSkKK3sKKwlzdHJ1Y3QgdWJ4X2hkciAqaGRyID0gbXNnOworCXVpbnQ4X3QgY2tzdW1bMl0sICpja3N1bV9wdHI7CisJdWJ4X21zZ19oYW5kbGVyX3QgaDsKKworCWlmICgoaGRyLT5zeW5jWzBdICE9IFVCWF9TWU5DMCkgfHwgKGhkci0+c3luY1sxXSAhPSBVQlhfU1lOQzEpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiWyFdIEludmFsaWQgc3luYyBieXRlc1xuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwl1YnhfY2hlY2tzdW0obXNnICsgMiwgc2l6ZW9mKHN0cnVjdCB1YnhfaGRyKSArIGhkci0+cGF5bG9hZF9sZW4gLSAyLCBja3N1bSk7CisJY2tzdW1fcHRyID0gbXNnICsgKHNpemVvZihzdHJ1Y3QgdWJ4X2hkcikgKyBoZHItPnBheWxvYWRfbGVuKTsKKwlpZiAoKGNrc3VtX3B0clswXSAhPSBja3N1bVswXSkgfHwgKGNrc3VtX3B0clsxXSAhPSBja3N1bVsxXSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJbIV0gSW52YWxpZCBjaGVja3N1bVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwloID0gdWJ4X2ZpbmRfaGFuZGxlcihkdCwgaGRyLT5tc2dfY2xhc3MsIGhkci0+bXNnX2lkKTsKKwlpZiAoaCkKKwkJaChoZHIsIG1zZyArIHNpemVvZihzdHJ1Y3QgdWJ4X2hkciksIGhkci0+cGF5bG9hZF9sZW4sIHVzZXJkYXRhKTsKKworCXJldHVybiBzaXplb2Yoc3RydWN0IHVieF9oZHIpICsgaGRyLT5wYXlsb2FkX2xlbiArIDI7Cit9CisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL3VieC5oIGIvcnJscC1lcGhlbWVyaXMvdWJ4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI2NDM4NgotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL3VieC5oCkBAIC0wLDAgKzEsMjMyIEBACisvKgorICogdWJ4LmgKKyAqCisgKiBIZWFkZXIgZm9yIFVCWCByZWxhdGVkIHN0dWZmCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSAgU3lsdmFpbiBNdW5hdXQgPHRudEAyNDZ0TnQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBfX1VCWF9IX18KKyNkZWZpbmUgX19VQlhfSF9fCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKiBDb25zdGFudHMgdXNlZCBpbiBVQlggKi8KKworCS8qIFN5bmMgYnl0ZXMgKHR3byBmaXJzdCBieXRlcyBvZiBlYWNoIG1lc3NhZ2UpICovCisjZGVmaW5lIFVCWF9TWU5DMAkJMHhiNQorI2RlZmluZSBVQlhfU1lOQzEJCTB4NjIKKworCS8qIFVCWCBtZXNzYWdlcyBjbGFzc2VzICovCisjZGVmaW5lIFVCWF9DTEFTU19OQVYJCTB4MDEKKyNkZWZpbmUgVUJYX0NMQVNTX1JYTQkJMHgwMgorI2RlZmluZSBVQlhfQ0xBU1NfSU5GCQkweDA0CisjZGVmaW5lIFVCWF9DTEFTU19BQ0sJCTB4MDUKKyNkZWZpbmUgVUJYX0NMQVNTX0NGRwkJMHgwNgorI2RlZmluZSBVQlhfQ0xBU1NfVVBECQkweDA5CisjZGVmaW5lIFVCWF9DTEFTU19NT04JCTB4MGEKKyNkZWZpbmUgVUJYX0NMQVNTX0FJRAkJMHgwYgorI2RlZmluZSBVQlhfQ0xBU1NfVElNCQkweDBkCisKKwkvKiBVQlggbWVzc2FnZXMgdHlwZSBJRCAoYnkgY2xhc3MpICovCisjZGVmaW5lIFVCWF9OQVZfUE9TRUNFRgkJMHgwMQorI2RlZmluZSBVQlhfTkFWX1BPU0xMSAkJMHgwMgorI2RlZmluZSBVQlhfTkFWX1NUQVRVUwkJMHgwMworI2RlZmluZSBVQlhfTkFWX0RPUAkJMHgwNAorI2RlZmluZSBVQlhfTkFWX1NPTAkJMHgwNgorI2RlZmluZSBVQlhfTkFWX1BPU1VUTQkJMHgwOAorI2RlZmluZSBVQlhfTkFWX1ZFTEVDRUYJCTB4MTEKKyNkZWZpbmUgVUJYX05BVl9WRUxORUQJCTB4MTIKKyNkZWZpbmUgVUJYX05BVl9USU1FR1BTCQkweDIwCisjZGVmaW5lIFVCWF9OQVZfVElNRVVUQwkJMHgyMQorI2RlZmluZSBVQlhfTkFWX0NMT0NLCQkweDIyCisjZGVmaW5lIFVCWF9OQVZfU1ZJTkZPCQkweDMwCisjZGVmaW5lIFVCWF9OQVZfREdQUwkJMHgzMQorI2RlZmluZSBVQlhfTkFWX1NCQVMJCTB4MzIKKyNkZWZpbmUgVUJYX05BVl9FS0ZTVEFUVVMJMHg0MAorCisjZGVmaW5lIFVCWF9SWE1fUkFXCQkweDEwCisjZGVmaW5lIFVCWF9SWE1fU0ZSQgkJMHgxMQorI2RlZmluZSBVQlhfUlhNX1NWU0kJCTB4MjAKKyNkZWZpbmUgVUJYX1JYTV9TVlNJX0dQUwkweDIwCisjZGVmaW5lIFVCWF9SWE1fQUxNCQkweDMwCisjZGVmaW5lIFVCWF9SWE1fRVBICQkweDMxCisjZGVmaW5lIFVCWF9SWE1fUE9TUkVRCQkweDQwCisKKyNkZWZpbmUgVUJYX0lORl9FUlJPUgkJMHgwMAorI2RlZmluZSBVQlhfSU5GX1dBUk5JTkcJCTB4MDEKKyNkZWZpbmUgVUJYX0lORl9OT1RJQ0UJCTB4MDIKKyNkZWZpbmUgVUJYX0lORl9URVNUCQkweDAzCisjZGVmaW5lIFVCWF9JTkZfREVCVUcJCTB4MDQKKyNkZWZpbmUgVUJYX0lORl9VU0VSCQkweDA3CisKKyNkZWZpbmUgVUJYX0FDS19OQUsJCTB4MDAKKyNkZWZpbmUgVUJYX0FDS19BQ0sJCTB4MDEKKworI2RlZmluZSBVQlhfQ0ZHX1BSVAkJMHgwMAorI2RlZmluZSBVQlhfQ0ZHX1VTQgkJMHgxYgorI2RlZmluZSBVQlhfQ0ZHX01TRwkJMHgwMQorI2RlZmluZSBVQlhfQ0ZHX05NRUEJCTB4MTcKKyNkZWZpbmUgVUJYX0NGR19SQVRFCQkweDA4CisjZGVmaW5lIFVCWF9DRkdfQ0ZHCQkweDA5CisjZGVmaW5lIFVCWF9DRkdfVFAJCTB4MDcKKyNkZWZpbmUgVUJYX0NGR19OQVYyCQkweDFhCisjZGVmaW5lIFVCWF9DRkdfREFUCQkweDA2CisjZGVmaW5lIFVCWF9DRkdfSU5GCQkweDAyCisjZGVmaW5lIFVCWF9DRkdfUlNUCQkweDA0CisjZGVmaW5lIFVCWF9DRkdfUlhNCQkweDExCisjZGVmaW5lIFVCWF9DRkdfQU5UCQkweDEzCisjZGVmaW5lIFVCWF9DRkdfRlhOCQkweDBlCisjZGVmaW5lIFVCWF9DRkdfU0JBUwkJMHgxNgorI2RlZmluZSBVQlhfQ0ZHX0xJQwkJMHg4MAorI2RlZmluZSBVQlhfQ0ZHX1RNCQkweDEwCisjZGVmaW5lIFVCWF9DRkdfVE0yCQkweDE5CisjZGVmaW5lIFVCWF9DRkdfVE1PREUJCTB4MWQKKyNkZWZpbmUgVUJYX0NGR19FS0YJCTB4MTIKKworI2RlZmluZSBVQlhfVVBEX0RPV05MCQkweDAxCisjZGVmaW5lIFVCWF9VUERfVVBMT0FECQkweDAyCisjZGVmaW5lIFVCWF9VUERfRVhFQwkJMHgwMworI2RlZmluZSBVQlhfVVBEX01FTUNQWQkJMHgwNAorCisjZGVmaW5lIFVCWF9NT05fU0NIRAkJMHgwMQorI2RlZmluZSBVQlhfTU9OX0lPCQkweDAyCisjZGVmaW5lIFVCWF9NT05fSVBDCQkweDAzCisjZGVmaW5lIFVCWF9NT05fVkVSCQkweDA0CisjZGVmaW5lIFVCWF9NT05fRVhDRVBUCQkweDA1CisjZGVmaW5lIFVCWF9NT05fTVNHUFAJCTB4MDYKKyNkZWZpbmUgVUJYX01PTl9SWEJVRgkJMHgwNworI2RlZmluZSBVQlhfTU9OX1RYQlVGCQkweDA4CisjZGVmaW5lIFVCWF9NT05fSFcJCTB4MDkKKyNkZWZpbmUgVUJYX01PTl9VU0IJCTB4MGEKKworI2RlZmluZSBVQlhfQUlEX1JFUQkJMHgwMAorI2RlZmluZSBVQlhfQUlEX0lOSQkJMHgwMQorI2RlZmluZSBVQlhfQUlEX0hVSQkJMHgwMgorI2RlZmluZSBVQlhfQUlEX0RBVEEJCTB4MTAKKyNkZWZpbmUgVUJYX0FJRF9BTE0JCTB4MzAKKyNkZWZpbmUgVUJYX0FJRF9FUEgJCTB4MzEKKworI2RlZmluZSBVQlhfVElNX1RQCQkweDAxCisjZGVmaW5lIFVCWF9USU1fVE0JCTB4MDIKKyNkZWZpbmUgVUJYX1RJTV9UTTIJCTB4MDMKKyNkZWZpbmUgVUJYX1RJTV9TVklOCQkweDA0CisKKworLyogSGVhZGVyICovCitzdHJ1Y3QgdWJ4X2hkciB7CisgICAgICAgIHVpbnQ4X3QgIHN5bmNbMl07CisgICAgICAgIHVpbnQ4X3QgIG1zZ19jbGFzczsKKyAgICAgICAgdWludDhfdCAgbXNnX2lkOworICAgICAgICB1aW50MTZfdCBwYXlsb2FkX2xlbjsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworLyogUGF5bG9hZCBmb3JtYXRzIChzb21lIG9mIHRoZW0pICovCitzdHJ1Y3QgdWJ4X25hdl9wb3NsbGggeworCXVpbnQzMl90IGl0b3c7CisJaW50MzJfdCAgbG9uOwkvKiBzY2FsaW5nIDFlLTcgKi8KKwlpbnQzMl90ICBsYXQ7CS8qIHNjYWxpbmcgMWUtNyAqLworCWludDMyX3QgIGhlaWdodDsvKiBtbSAqLworCWludDMyX3QgIGhzbDsJLyogbW0gKi8KKwl1aW50MzJfdCBoYWNjOwkvKiBtbSAqLworCXVpbnQzMl90IHZhY2M7CS8qIG1tICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgdWJ4X2FpZF9pbmkgeworCWludDMyX3QgIHg7CisJaW50MzJfdCAgeTsKKwlpbnQzMl90ICB6OworCXVpbnQzMl90IHBvc2FjYzsKKwl1aW50MTZfdCB0bV9jZmc7CisJdWludDE2X3Qgd247CisJdWludDMyX3QgdG93OworCWludDMyX3QgIHRvd19uczsKKwl1aW50MzJfdCB0YWNjX21zOworCXVpbnQzMl90IHRhY2NfbnM7CisJaW50MzJfdCAgY2xrZDsKKwl1aW50MzJfdCBjbGtkYWNjOworCXVpbnQzMl90IGZsYWdzOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHVieF9haWRfaHVpIHsKKwl1aW50MzJfdCBoZWFsdGg7CisJZG91YmxlICAgdXRjX2ExOworCWRvdWJsZSAgIHV0Y19hMDsKKwlpbnQzMl90ICB1dGNfdG90OworCWludDE2X3QgIHV0Y193bnQ7CisJaW50MTZfdCAgdXRjX2xzOworCWludDE2X3QgIHV0Y193bmY7CisJaW50MTZfdCAgdXRjX2RuOworCWludDE2X3QgIHV0Y19sc2Y7CisJaW50MTZfdCAgdXRjX3NwYXJlOworCWZsb2F0ICAgIGtsb2JfYTA7CisJZmxvYXQgICAga2xvYl9hMTsKKwlmbG9hdCAgICBrbG9iX2EyOworCWZsb2F0ICAgIGtsb2JfYTM7CisJZmxvYXQgICAga2xvYl9iMDsKKwlmbG9hdCAgICBrbG9iX2IxOworCWZsb2F0ICAgIGtsb2JfYjI7CisJZmxvYXQgICAga2xvYl9iMzsKKwl1aW50MzJfdCBmbGFnczsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCB1YnhfYWlkX2FsbSB7CisJdWludDMyX3Qgc3ZfaWQ7CisJdWludDMyX3QgZ3BzX3dlZWs7CisJdWludDMyX3QgYWxtX3dvcmRzWzhdOwkvKiBQcmVzZW50IG9ubHkgaWYgJ2dwc193ZWVrJyAhPSAwICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgdWJ4X2FpZF9lcGggeworCXVpbnQzMl90IHN2X2lkOworCXVpbnQzMl90IHByZXNlbnQ7CisJdWludDMyX3QgZXBoX3dvcmRzWzI0XTsJLyogUHJlc2VudCBvbmx5IGlmICdwcmVzZW50JyAhPSAwICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKKy8qIE1lc3NhZ2UgaGFuZGxlciAqLwordHlwZWRlZiB2b2lkICgqdWJ4X21zZ19oYW5kbGVyX3QpKAorCXN0cnVjdCB1YnhfaGRyICpoZHIsIHZvaWQgKnBheWxvYWQsIGludCBwYXlsb2FkX2xlbiwgdm9pZCAqdXNlcmRhdGEpOworCitzdHJ1Y3QgdWJ4X2Rpc3BhdGNoX2VudHJ5IHsKKwl1aW50OF90IG1zZ19jbGFzczsKKwl1aW50OF90IG1zZ19pZDsKKwl1YnhfbXNnX2hhbmRsZXJfdCBoYW5kbGVyOworfTsKKworI2RlZmluZSBVQlhfRElTUEFUQ0goa2xzLGlkLGhkbCkgewkJXAorCS5tc2dfY2xhc3MgPSBVQlhfQ0xBU1NfICMjIGtscyAsCVwKKwkubXNnX2lkID0gVUJYXyAjIyBrbHMgIyMgXyAjIyBpZCwJXAorCS5oYW5kbGVyID0gKGhkbCksCQkJXAorfQorCisKKy8qIE1ldGhvZHMgKi8KK2ludCB1YnhfbXNnX2Rpc3BhdGNoKHN0cnVjdCB1YnhfZGlzcGF0Y2hfZW50cnkgKmR0LAorICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLCBpbnQgbGVuLCB2b2lkICp1c2VyZGF0YSk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fVUJYX0hfXyAqLworCmRpZmYgLS1naXQgYS93aXJlc2hhcmsvYWJpc19vbWwucGF0Y2ggYi93aXJlc2hhcmsvYWJpc19vbWwucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYwNmI0ZAotLS0gL2Rldi9udWxsCisrKyBiL3dpcmVzaGFyay9hYmlzX29tbC5wYXRjaApAQCAtMCwwICsxLDIxOTIgQEAKK0luZGV4OiB3aXJlc2hhcmsvZXBhbi9kaXNzZWN0b3JzL01ha2VmaWxlLmNvbW1vbgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tIHdpcmVzaGFyay5vcmlnL2VwYW4vZGlzc2VjdG9ycy9NYWtlZmlsZS5jb21tb24KKysrKyB3aXJlc2hhcmsvZXBhbi9kaXNzZWN0b3JzL01ha2VmaWxlLmNvbW1vbgorQEAgLTQ3NCw2ICs0NzQsNyBAQAorIAlwYWNrZXQtZ3NtX2FfZ20uYwkJXAorIAlwYWNrZXQtZ3NtX2FfcnAuYwkJXAorIAlwYWNrZXQtZ3NtX2FfcnIuYwlcCisrCXBhY2tldC1nc21fYWJpc19vbWwuYwlcCisgCXBhY2tldC1nc21faXBhLmMJXAorIAlwYWNrZXQtZ3NtX2Jzc2xhcC5jCQlcCisgCXBhY2tldC1nc21fYnNzbWFwX2xlLmMJXAorZGlmZiAtLWdpdCBhL2VwYW4vZGlzc2VjdG9ycy9wYWNrZXQtZ3NtX2FiaXNfb21sLmMgYi9lcGFuL2Rpc3NlY3RvcnMvcGFja2V0LWdzbV9hYmlzX29tbC5jCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMmRlOWRjYQorLS0tIC9kZXYvbnVsbAorKysrIGIvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1nc21fYWJpc19vbWwuYworQEAgLTAsMCArMSwxMzgyIEBACisrLyogcGFja2V0LWFiaXNfb21sLmMKKysgKiBSb3V0aW5lcyBmb3IgcGFja2V0IGRpc3NlY3Rpb24gb2YgR1NNIEEtYmlzIG92ZXIgSVAgKDNHUFAgVFMgMTIuMjEpCisrICogQ29weXJpZ2h0IDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKysgKiBDb3B5cmlnaHQgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisrICogYmFzZWQgb24gQS1iaXMgT01MIGNvZGUgaW4gT3BlbkJTQworKyAqCisrICogJElkJAorKyAqCisrICogV2lyZXNoYXJrIC0gTmV0d29yayB0cmFmZmljIGFuYWx5emVyCisrICogQnkgR2VyYWxkIENvbWJzIDxnZXJhbGRAd2lyZXNoYXJrLm9yZz4KKysgKiBDb3B5cmlnaHQgMTk5OCBHZXJhbGQgQ29tYnMKKysgKgorKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKysgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisrICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisrICoKKysgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKysgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKysgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKyAqCisrICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKysgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisrICovCisrCisrI2lmZGVmIEhBVkVfQ09ORklHX0gKKysjIGluY2x1ZGUgImNvbmZpZy5oIgorKyNlbmRpZgorKworKyNpbmNsdWRlIDxnbGliLmg+CisrCisrI2luY2x1ZGUgPGVwYW4vcGFja2V0Lmg+CisrI2luY2x1ZGUgPGVwYW4vZW1lbS5oPgorKyNpbmNsdWRlIDxlcGFuL2xhcGRfc2FwaS5oPgorKyNpbmNsdWRlIDxlcGFuL3ByZWZzLmg+CisrCisrI2luY2x1ZGUgInBhY2tldC1nc21fYWJpc19vbWwuaCIKKysjaW5jbHVkZSAicGFja2V0LWdzbV9hX2NvbW1vbi5oIgorKworKy8qIGluaXRpYWxpemUgdGhlIHByb3RvY29sIGFuZCByZWdpc3RlcmVkIGZpZWxkcyAqLworK3N0YXRpYyBpbnQgcHJvdG9fYWJpc19vbWwgPSAtMTsKKysKKysvKiBPTUwgaGVhZGVyICovCisrc3RhdGljIGludCBoZl9vbWxfbXNnX2Rpc2MgPSAtMTsKKytzdGF0aWMgaW50IGhmX29tbF9wbGFjZW1lbnQgPSAtMTsKKytzdGF0aWMgaW50IGhmX29tbF9zZXF1ZW5jZSA9IC0xOworK3N0YXRpYyBpbnQgaGZfb21sX2xlbmd0aCA9IC0xOworKy8qIEZPTSBoZWFkZXIgKi8KKytzdGF0aWMgaW50IGhmX29tbF9mb21fbXNndHlwZSA9IC0xOworK3N0YXRpYyBpbnQgaGZfb21sX2ZvbV9vYmpjbGFzcyA9IC0xOworK3N0YXRpYyBpbnQgaGZfb21sX2ZvbV9pbnN0X2J0cyA9IC0xOworK3N0YXRpYyBpbnQgaGZfb21sX2ZvbV9pbnN0X3RyeCA9IC0xOworK3N0YXRpYyBpbnQgaGZfb21sX2ZvbV9pbnN0X3RzID0gLTE7Cisrc3RhdGljIGludCBoZl9vbWxfZm9tX2F0dHJfdGFnID0gLTE7Cisrc3RhdGljIGludCBoZl9vbWxfZm9tX2F0dHJfbGVuID0gLTE7Cisrc3RhdGljIGludCBoZl9vbWxfZm9tX2F0dHJfdmFsID0gLTE7CisrLyogRk9NIGF0dHJpYnV0ZXMgKi8KKytzdGF0aWMgaW50IGhmX2F0dHJfYWRtX3N0YXRlID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2FyZmNuID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX29wZXJfc3RhdGUgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfYXZhaWxfc3RhdGUgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfZXZlbnRfdHlwZSA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9zZXZlcml0eSA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9iY2NoX2FyZmNuID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2JzaWMgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfdGVzdF9ubyA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl90c2MgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfdGVpID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2FjaF9idHNwID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2FjaF90c2xvdCA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9hY2hfc3Nsb3QgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfZ3NtX3RpbWUgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfY2hhbl9jb21iID0gLTE7CisrLyogSXBhY2Nlc3MgKi8KKytzdGF0aWMgaW50IGhmX29tbF9pcGFfdHJlc19hdHRyX3RhZyA9IC0xOworK3N0YXRpYyBpbnQgaGZfb21sX2lwYV90cmVzX2F0dHJfbGVuID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV90ZXN0X3JlcyA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdHJfcnhsZXYgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3RyX2JfcnhsZXYgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3RyX2FyZmNuID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV90cl9mX3F1YWwgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3RyX2ZfZXJyID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV90cl9yeHF1YWwgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3RyX2ZyYW1lX29mZnMgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3RyX2ZyYW1lbnJfb2ZmcyA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdHJfYnNpYyA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdHJfY2VsbF9pZCA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdHJfc2kyID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV90cl9zaTJiaXMgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3RyX3NpMnRlciA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdHJfY2hhbl9kZXNjID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV9yc2xfaXAgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3JzbF9wb3J0ID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV9wcmltX29tbF9pcCA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfcHJpbV9vbWxfcG9ydCA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfbG9jYXRpb25fbmFtZSA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdW5pdF9pZCA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdW5pdF9uYW1lID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV9udl9mbGFncyA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfbnZfbWFzayA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfbnNsX3Nwb3J0ID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV9uc2xfZGFkZHIgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX25zbF9kcG9ydCA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfbnNlaSA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfbnN2Y2kgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX2J2Y2kgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3JhYyA9IC0xOworKworKy8qIGluaXRpYWxpemUgdGhlIHN1YnRyZWUgcG9pbnRlcnMgKi8KKytzdGF0aWMgaW50IGV0dF9vbWwgPSAtMTsKKytzdGF0aWMgaW50IGV0dF9vbWxfZm9tID0gLTE7Cisrc3RhdGljIGludCBldHRfb21sX2ZvbV9hdHQgPSAtMTsKKysKKysvKiBEZWNvZGUgdGhpbmdzIGFzIG5hbm9CVFMgdHJhY2VzICovCisrc3RhdGljIGdib29sZWFuIGdsb2JhbF9vbWxfdXNlX25hbm9fYnRzID0gRkFMU0U7CisrCisrc3RhdGljIHByb3RvX3RyZWUgKnRvcF90cmVlOworKworKy8qIFRTIDEyLjIxIENoYXB0ZXIgOC4xIC8gVFMgMDguNTkgKi8KKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIG9tbF9tc2dfZGlzY192YWxzW10gPSB7CisrCXsgQUJJU19PTV9NRElTQ19GT00sCSJGb3JtYXR0ZWQgTyZNIiB9LAorKwl7IEFCSVNfT01fTURJU0NfTU1JLAkiTU1JIFRyYW5zZmVyIiB9LAorKwl7IEFCSVNfT01fTURJU0NfVFJBVSwJIlRSQVUgTyZNIiB9LAorKwl7IEFCSVNfT01fTURJU0NfTUFOVUYsCSJNYW51ZmFjdHVyZXIgc3BlY2lmaWMiIH0sCisrfTsKKysKKysvKiBUUyAxMi4yMSBDaGFwdGVyIDguMS4xICovCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyBvbWxfcGxhY2VtZW50X3ZhbHNbXSA9IHsKKysJeyBBQklTX09NX1BMQUNFTUVOVF9PTkxZLAkiT25seSIgfSwKKysJeyBBQklTX09NX1BMQUNFTUVOVF9GSVJTVCwJIkZpcnN0IiB9LAorKwl7IEFCSVNfT01fUExBQ0VNRU5UX01JRERMRSwJIk1pZGRsZSIgfSwKKysJeyBBQklTX09NX1BMQUNFTUVOVF9MQVNULAkiTGFzdCIgfSwKKyt9OworKworKy8qIFRTIDEyLjIxIENoYXB0ZXIgOS4yICovCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyBvbWxfZm9tX21zZ3R5cGVfdmFsc1tdID0geworKwl7IE5NX01UX0xPQURfSU5JVCwJCSJTb2Z0d2FyZSBMb2FkIEluaXQiIH0sCisrCXsgTk1fTVRfTE9BRF9JTklUX0FDSywJCSJTb2Z0d2FyZSBMb2FkIEluaXQgQUNLIiB9LAorKwl7IE5NX01UX0xPQURfSU5JVF9OQUNLLAkJIlNvZnR3YXJlIExvYWQgSW5pdCBOQUNLIiB9LAorKwl7IE5NX01UX0xPQURfU0VHLAkJIlNvZnR3YXJlIExvYWQgU2VnbWVudCIgfSwKKysJeyBOTV9NVF9MT0FEX1NFR19BQ0ssCQkiU29mdHdhcmUgTG9hZCBTZWdtZW50IEFDSyIgfSwKKysJeyBOTV9NVF9MT0FEX0VORCwJCSJTb2Z0d2FyZSBMb2FkIEVuZCIgfSwKKysJeyBOTV9NVF9MT0FEX0VORF9BQ0ssCQkiU29mdHdhcmUgTG9hZCBFbmQgQUNLIiB9LAorKwl7IE5NX01UX0xPQURfRU5EX05BQ0ssCQkiU29mdHdhcmUgTG9hZCBFbmQgTkFDSyIgfSwKKysJeyBOTV9NVF9TV19BQ1RfUkVRLAkJIlNvZnR3YXJlIEFjdGl2YXRlIFJlcXVlc3QiIH0sCisrCXsgTk1fTVRfU1dfQUNUX1JFUV9BQ0ssCQkiU29mdHdhcmUgQWN0aXZhdGUgUmVxdWVzdCBBQ0siIH0sCisrCXsgTk1fTVRfU1dfQUNUX1JFUV9OQUNLLAkiU29mdHdhcmUgQWN0aXZhdGUgUmVxdWVzdCBOQUNLIiB9LAorKwl7IE5NX01UX0FDVElWQVRFX1NXLAkJIkFjdGl2YXRlIFNvZnR3YXJlIiB9LAorKwl7IE5NX01UX0FDVElWQVRFX1NXX0FDSywJIkFjdGl2YXRlIFNvZnR3YXJlIEFDSyIgfSwKKysJeyBOTV9NVF9BQ1RJVkFURV9TV19OQUNLLAkiQWN0aXZhdGUgU29mdHdhcmUgTkFDSyIgfSwKKysJeyBOTV9NVF9TV19BQ1RJVkFURURfUkVQLAkiU29mdHdhcmUgQWN0aXZhdGVkIFJlcG9ydCIgfSwKKysJeyBOTV9NVF9FU1RBQkxJU0hfVEVJLAkJIkVzdGFibGlzaCBURUkiIH0sCisrCXsgTk1fTVRfRVNUQUJMSVNIX1RFSV9BQ0ssCSJFc3RhYmxpc2ggVEVJIEFDSyIgfSwKKysJeyBOTV9NVF9FU1RBQkxJU0hfVEVJX05BQ0ssCSJFc3RhYmxpc2ggVEVJIE5BQ0siIH0sCisrCXsgTk1fTVRfQ09OTl9URVJSX1NJR04sCQkiQ29ubmVjdCBUZXJyZXN0cmlhbCBTaWduYWxsaW5nIiB9LAorKwl7IE5NX01UX0NPTk5fVEVSUl9TSUdOX0FDSywJIkNvbm5lY3QgVGVycmVzdHJpYWwgU2lnbmFsbGluZyBBQ0siIH0sCisrCXsgTk1fTVRfQ09OTl9URVJSX1NJR05fTkFDSywJIkNvbm5lY3QgVGVycmVzdHJpYWwgU2lnbmFsbGluZyBOQUNLIiB9LAorKwl7IE5NX01UX0RJU0NfVEVSUl9TSUdOLAkJIkRpc2Nvbm5lY3QgVGVycmVzdHJpYWwgU2lnbmFsbGluZyIgfSwKKysJeyBOTV9NVF9ESVNDX1RFUlJfU0lHTl9BQ0ssCSJEaXNjb25uZWN0IFRlcnJlc3RyaWFsIFNpZ25hbGxpbmcgQUNLIiB9LAorKwl7IE5NX01UX0RJU0NfVEVSUl9TSUdOX05BQ0ssCSJEaXNjb25uZWN0IFRlcnJlc3RyaWFsIFNpZ25hbGxpbmcgTkFDSyIgfSwKKysJeyBOTV9NVF9DT05OX1RFUlJfVFJBRiwJCSJDb25uZWN0IFRlcnJlc3RyaWFsIFRyYWZmaWMiIH0sCisrCXsgTk1fTVRfQ09OTl9URVJSX1RSQUZfQUNLLAkiQ29ubmVjdCBUZXJyZXN0cmlhbCBUcmFmZmljIEFDSyIgfSwKKysJeyBOTV9NVF9DT05OX1RFUlJfVFJBRl9OQUNLLAkiQ29ubmVjdCBUZXJyZXN0cmlhbCBUcmFmZmljIE5BQ0siIH0sCisrCXsgTk1fTVRfRElTQ19URVJSX1RSQUYsCQkiRGlzY29ubmVjdCBUZXJyZXN0cmlhbCBUcmFmZmljIiB9LAorKwl7IE5NX01UX0RJU0NfVEVSUl9UUkFGX0FDSywJIkRpc2Nvbm5lY3QgVGVycmVzdHJpYWwgVHJhZmZpYyBBQ0siIH0sCisrCXsgTk1fTVRfRElTQ19URVJSX1RSQUZfTkFDSywJIkRpc2Nvbm5lY3QgVGVycmVzdHJpYWwgVHJhZmZpYyBOQUNLIiB9LAorKwl7IE5NX01UX0NPTk5fTURST1BfTElOSywJIkNvbm5lY3QgTXVsdGktRHJvcCBMaW5rIiB9LAorKwl7IE5NX01UX0NPTk5fTURST1BfTElOS19BQ0ssCSJDb25uZWN0IE11bHRpLURyb3AgTGluayBBQ0siIH0sCisrCXsgTk1fTVRfQ09OTl9NRFJPUF9MSU5LX05BQ0ssCSJDb25uZWN0IE11bHRpLURyb3AgTGluayBOQUNLIiB9LAorKwl7IE5NX01UX0RJU0NfTURST1BfTElOSywJIkRpc2Nvbm5lY3QgTXVsdGktRHJvcCBMaW5rIiB9LAorKwl7IE5NX01UX0RJU0NfTURST1BfTElOS19BQ0ssCSJEaXNjb25uZWN0IE11bHRpLURyb3AgTGluayBBQ0siIH0sCisrCXsgTk1fTVRfRElTQ19NRFJPUF9MSU5LX05BQ0ssCSJEaXNjb25uZWN0IE11bHRpLURyb3AgTGluayBOQUNLIiB9LAorKwl7IE5NX01UX1NFVF9CVFNfQVRUUiwJCSJTZXQgQlRTIEF0dHJpYnV0ZXMiIH0sCisrCXsgTk1fTVRfU0VUX0JUU19BVFRSX0FDSywJIlNldCBCVFMgQXR0cmlidXRlcyBBQ0siIH0sCisrCXsgTk1fTVRfU0VUX0JUU19BVFRSX05BQ0ssCSJTZXQgQlRTIEF0dHJpYnV0ZXMgTkFDSyIgfSwKKysJeyBOTV9NVF9TRVRfUkFESU9fQVRUUiwJCSJTZXQgUmFkaW8gQ2FycmllciBBdHRyaWJ1dGVzIiB9LAorKwl7IE5NX01UX1NFVF9SQURJT19BVFRSX0FDSywJIlNldCBSYWRpbyBDYXJyaWVyIEF0dHJpYnV0ZXMgQUNLIiB9LAorKwl7IE5NX01UX1NFVF9SQURJT19BVFRSX05BQ0ssCSJTZXQgUmFkaW8gQ2FycmllciBBdHRyaWJ1dGVzIE5BQ0siIH0sCisrCXsgTk1fTVRfU0VUX0NIQU5fQVRUUiwJCSJTZXQgQ2hhbm5lbCBBdHRyaWJ1dGVzIiB9LAorKwl7IE5NX01UX1NFVF9DSEFOX0FUVFJfQUNLLAkiU2V0IENoYW5uZWwgQXR0cmlidXRlcyBBQ0siIH0sCisrCXsgTk1fTVRfU0VUX0NIQU5fQVRUUl9OQUNLLAkiU2V0IENoYW5uZWwgQXR0cmlidXRlcyBOQUNLIiB9LAorKwl7IE5NX01UX1BFUkZfVEVTVCwJCSJQZXJmb3JtIFRlc3QiIH0sCisrCXsgTk1fTVRfUEVSRl9URVNUX0FDSywJCSJQZXJmb3JtIFRlc3QgQUNLIiB9LAorKwl7IE5NX01UX1BFUkZfVEVTVF9OQUNLLAkJIlBlcmZvcm0gVGVzdCBOQUNLIiB9LAorKwl7IE5NX01UX1RFU1RfUkVQLAkJIlRlc3QgUmVwb3J0IiB9LAorKwl7IE5NX01UX1NFTkRfVEVTVF9SRVAsCQkiU2VuZCBUZXN0IFJlcG9ydCIgfSwKKysJeyBOTV9NVF9TRU5EX1RFU1RfUkVQX0FDSywJIlNlbmQgVGVzdCBSZXBvcnQgQUNLIiB9LAorKwl7IE5NX01UX1NFTkRfVEVTVF9SRVBfTkFDSywJIlNlbmQgVGVzdCBSZXBvcnQgTkFDSyIgfSwKKysJeyBOTV9NVF9TVE9QX1RFU1QsCQkiU3RvcCBUZXN0IiB9LAorKwl7IE5NX01UX1NUT1BfVEVTVF9BQ0ssCQkiU3RvcCBUZXN0IEFDSyIgfSwKKysJeyBOTV9NVF9TVE9QX1RFU1RfTkFDSywJCSJTdG9wIFRlc3QgTkFDSyIgfSwKKysJeyBOTV9NVF9TVEFURUNIR19FVkVOVF9SRVAsCSJTdGF0ZSBDaGFuZ2VkIEV2ZW50IFJlcG9ydCIgfSwKKysJeyBOTV9NVF9GQUlMVVJFX0VWRU5UX1JFUCwJIkZhaWx1cmUgRXZlbnQgUmVwb3J0IiB9LAorKwl7IE5NX01UX1NUT1BfRVZFTlRfUkVQLAkJIlN0b3AgU2VuZGluZyBFdmVudCBSZXBvcnRzIiB9LAorKwl7IE5NX01UX1NUT1BfRVZFTlRfUkVQX0FDSywJIlN0b3AgU2VuZGluZyBFdmVudCBSZXBvcnRzIEFDSyIgfSwKKysJeyBOTV9NVF9TVE9QX0VWRU5UX1JFUF9OQUNLLAkiU3RvcCBTZW5kaW5nIEV2ZW50IFJlcG9ydHMgTkFDSyIgfSwKKysJeyBOTV9NVF9SRVNUX0VWRU5UX1JFUCwJCSJSZXN0YXJ0IFNlbmRpbmcgRXZlbnQgUmVwb3J0cyIgfSwKKysJeyBOTV9NVF9SRVNUX0VWRU5UX1JFUF9BQ0ssCSJSZXN0YXJ0IFNlbmRpbmcgRXZlbnQgUmVwb3J0cyBBQ0siIH0sCisrCXsgTk1fTVRfUkVTVF9FVkVOVF9SRVBfTkFDSywJIlJlc3RhcnQgU2VuZGluZyBFdmVudCBSZXBvcnRzIE5BQ0siIH0sCisrCXsgTk1fTVRfQ0hHX0FETV9TVEFURSwJCSJDaGFuZ2UgQWRtaW5pc3RyYXRpdmUgU3RhdGUiIH0sCisrCXsgTk1fTVRfQ0hHX0FETV9TVEFURV9BQ0ssCSJDaGFuZ2UgQWRtaW5pc3RyYXRpdmUgU3RhdGUgQUNLIiB9LAorKwl7IE5NX01UX0NIR19BRE1fU1RBVEVfTkFDSywJIkNoYW5nZSBBZG1pbmlzdHJhdGl2ZSBTdGF0ZSBOQUNLIiB9LAorKwl7IE5NX01UX0NIR19BRE1fU1RBVEVfUkVRLAkiQ2hhbmdlIEFkbWluaXN0cmF0aXZlIFN0YXRlIFJlcXVlc3QiIH0sCisrCXsgTk1fTVRfQ0hHX0FETV9TVEFURV9SRVFfQUNLLAkiQ2hhbmdlIEFkbWluaXN0cmF0aXZlIFN0YXRlIFJlcXVlc3QgQUNLIiB9LAorKwl7IE5NX01UX0NIR19BRE1fU1RBVEVfUkVRX05BQ0ssCSJDaGFuZ2UgQWRtaW5pc3RyYXRpdmUgU3RhdGUgUmVxdWVzdCBOQUNLIiB9LAorKwl7IE5NX01UX1JFUF9PVVRTVF9BTEFSTVMsCSJSZXBvcnQgT3V0c3RhbmRpbmcgQWxhcm1zIiB9LAorKwl7IE5NX01UX1JFUF9PVVRTVF9BTEFSTVNfQUNLLAkiUmVwb3J0IE91dHN0YW5kaW5nIEFsYXJtcyBBQ0siIH0sCisrCXsgTk1fTVRfUkVQX09VVFNUX0FMQVJNU19OQUNLLAkiUmVwb3J0IE91dHN0YW5kaW5nIEFsYXJtcyBOQUNLIiB9LAorKwl7IE5NX01UX0NIQU5HRU9WRVIsCQkiQ2hhbmdlb3ZlciIgfSwKKysJeyBOTV9NVF9DSEFOR0VPVkVSX0FDSywJCSJDaGFuZ2VvdmVyIEFDSyIgfSwKKysJeyBOTV9NVF9DSEFOR0VPVkVSX05BQ0ssCSJDaGFuZ2VvdmVyIE5BQ0siIH0sCisrCXsgTk1fTVRfT1BTVEFSVCwJCSJPcHN0YXJ0IiB9LAorKwl7IE5NX01UX09QU1RBUlRfQUNLLAkJIk9wc3RhcnQgQUNLIiB9LAorKwl7IE5NX01UX09QU1RBUlRfTkFDSywJCSJPcHN0YXJ0IE5BQ0siIH0sCisrCXsgTk1fTVRfUkVJTklULAkJCSJSZWluaXRpYWxpemUiIH0sCisrCXsgTk1fTVRfUkVJTklUX0FDSywJCSJSZWluaXRpYWxpemUgQUNLIiB9LAorKwl7IE5NX01UX1JFSU5JVF9OQUNLLAkJIlJlaW5pdGlhbGl6ZSBOQUNLIiB9LAorKwl7IE5NX01UX1NFVF9TSVRFX09VVCwJCSJTZXQgU2l0ZSBPdXRwdXRzIiB9LAorKwl7IE5NX01UX1NFVF9TSVRFX09VVF9BQ0ssCSJTZXQgU2l0ZSBPdXRwdXRzIEFDSyIgfSwKKysJeyBOTV9NVF9TRVRfU0lURV9PVVRfTkFDSywJIlNldCBTaXRlIE91dHB1dHMgTkFDSyIgfSwKKysJeyBOTV9NVF9DSEdfSFdfQ09ORiwJCSJDaGFuZ2UgSFcgQ29uZmlndXJhdGlvbiIgfSwKKysJeyBOTV9NVF9DSEdfSFdfQ09ORl9BQ0ssCSJDaGFuZ2UgSFcgQ29uZmlndXJhdGlvbiBBQ0siIH0sCisrCXsgTk1fTVRfQ0hHX0hXX0NPTkZfTkFDSywJIkNoYW5nZSBIVyBDb25maWd1cmF0aW9uIE5BQ0siIH0sCisrCXsgTk1fTVRfTUVBU19SRVNfUkVRLAkJIk1lYXN1cmVtZW50IFJlc3VsdCBSZXF1ZXN0IiB9LAorKwl7IE5NX01UX01FQVNfUkVTX1JFU1AsCQkiTWVhc3VyZW1lbnQgUmVzdWx0IFJlc3BvbnNlIiB9LAorKwl7IE5NX01UX1NUT1BfTUVBUywJCSJTdG9wIE1lYXN1cmVtZW50IiB9LAorKwl7IE5NX01UX1NUQVJUX01FQVMsCQkiU3RhcnQgTWVhc3VyZW1lbnQiIH0sCisrCXsgTk1fTVRfR0VUX0FUVFIsCQkiR2V0IEF0dHJpYnV0ZXMiIH0sCisrCXsgTk1fTVRfR0VUX0FUVFJfUkVTUCwJCSJHZXQgQXR0cmlidXRlcyBSZXNwb25zZSIgfSwKKysJeyBOTV9NVF9HRVRfQVRUUl9OQUNLLAkJIkdldCBBdHRyaWJ1dGVzIE5BQ0siIH0sCisrCXsgTk1fTVRfU0VUX0FMQVJNX1RIUkVTLAkiU2V0IEFsYXJtIFRocmVzaG9sZCIgfSwKKysJeyBOTV9NVF9TRVRfQUxBUk1fVEhSRVNfQUNLLAkiU2V0IEFsYXJtIFRocmVzaG9sZCBBQ0siIH0sCisrCXsgTk1fTVRfU0VUX0FMQVJNX1RIUkVTX05BQ0ssCSJTZXQgQWxhcm0gVGhyZXNob2xkIE5BQ0siIH0sCisrCS8qIHByb3ByaWV0YXJ5LCBub3QgaW4gdGhlIHN0YW5kYXJkICovCisrCXsgTk1fTVRfSVBBQ0NfUkVTVEFSVCwJCSJJUEEgUmVzdGFydCIgfSwKKysJeyBOTV9NVF9JUEFDQ19SRVNUQVJUX0FDSywJIklQQSBSZXN0YXJ0IEFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19SU0xfQ09OTkVDVCwJIklQQSBSU0wgQ29ubmVjdCIgfSwKKysJeyBOTV9NVF9JUEFDQ19SU0xfQ09OTkVDVF9BQ0ssCSJJUEEgUlNMIENvbm5lY3QgQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX1JTTF9DT05ORUNUX05BQ0ssCSJJUEEgUlNMIENvbm5lY3QgTkFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19SU0xfRElTQ09OTkVDVCwJIklQQSBSU0wgRGlzY29ubmVjdCIgfSwKKysJeyBOTV9NVF9JUEFDQ19SU0xfRElTQ09OTkVDVF9BQ0ssICJJUEEgUlNMIERpc2Nvbm5lY3QgQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX1JTTF9ESVNDT05ORUNUX05BQ0ssICJJUEEgUlNMIERpc2Nvbm5lY3QgTkFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19DT05OX1RSQUYsCSJJUEEgQ29ubmVjdCBUcmFmZmljIiB9LAorKwl7IE5NX01UX0lQQUNDX0NPTk5fVFJBRl9BQ0ssCSJJUEEgQ29ubmVjdCBUcmFmZmljIEFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19DT05OX1RSQUZfTkFDSywJIklQQSBDb25uZWN0IFRyYWZmaWMgTkFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19ESVNDX1RSQUYsCSJJUEEgRGlzY29ubmVjdCBUcmFmZmljIiB9LAorKwl7IE5NX01UX0lQQUNDX0RJU0NfVFJBRl9BQ0ssCSJJUEEgRGlzY29ubmVjdCBUcmFmZmljIEFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19ESVNDX1RSQUZfTkFDSywJIklQQSBEaXNjb25uZWN0IFRyYWZmaWMgTkFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19ERUZfQk9PVF9TVywJIklQQSBEZWZhdWx0IEJvb3QgU29mdHdhcmUiIH0sCisrCXsgTk1fTVRfSVBBQ0NfREVGX0JPT1RfU1dfQUNLLAkiSVBBIERlZmF1bHQgQm9vdCBTb2Z0d2FyZSBBQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfREVGX0JPT1RfU1dfTkFDSywJIklQQSBEZWZhdWx0IEJvb3QgU29mdHdhcmUgTkFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19TRVRfTlZBVFRSLAkiSVBBIFNldCBOVlJBTSBBdHRyaWJ1dGVzIiB9LAorKwl7IE5NX01UX0lQQUNDX1NFVF9OVkFUVFJfQUNLLAkiSVBBIFNldCBOVlJBTSBBdHRyaWJ1dGVzIEFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19TRVRfTlZBVFRSX05BQ0ssCSJJUEEgU2V0IE5WUkFNIEF0dHJpYnV0ZXMgTkFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19HRVRfTlZBVFRSLAkiSVBBIEdldCBOVlJBTSBBdHRyaWJ1dGVzIiB9LAorKwl7IE5NX01UX0lQQUNDX0dFVF9OVkFUVFJfQUNLLAkiSVBBIEdldCBOVlJBTSBBdHRyaWJ1dGVzIEFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19HRVRfTlZBVFRSX05BQ0ssCSJJUEEgR2V0IE5WUkFNIEF0dHJpYnV0ZXMgTkFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19TRVRfQVRUUiwJCSJJUEEgU2V0IEF0dHJpYnV0ZXMiIH0sCisrCXsgTk1fTVRfSVBBQ0NfU0VUX0FUVFJfQUNLLAkiSVBBIFNldCBBdHRyaWJ1dGVzIEFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19TRVRfQVRUUl9OQUNLLAkiSVBBIFNldCBBdHRyaWJ1dGVzIE5BQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfQVRUUl9DSEdfRVZULAkiSVBBIEF0dHJpYnV0ZSBDaGFuZ2UgRXZlbnQiIH0sCisrCXsgTk1fTVRfSVBBQ0NfU1dfREVBQ1QsCQkiSVBBIFNvZnR3YXJlIERlYWN0aXZhdGUiIH0sCisrCXsgTk1fTVRfSVBBQ0NfU1dfREVBQ1RfQUNLLAkiSVBBIFNvZnR3YXJlIERlYWN0aXZhdGUgQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX1NXX0RFQUNUX05BQ0ssCSJJUEEgU29mdHdhcmUgRGVhY3RpdmF0ZSBOQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX01FQVNfUkVTX1JFUV9OQUNLLCJJUEEgTWVhc3VyZW1lbnQgUmVzdWx0IFJlcXVlc3QgTkFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19TVEFSVF9NRUFTX05BQ0ssCSJJUEEgU3RhcnQgTWVhc3VyZW1lbnQgTkFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19TVE9QX01FQVNfTkFDSywJIklQQSBTdG9wIE1lYXN1cmVtZW50IE5BQ0siIH0sCisrCXsgTk1fTVRfQlMxMV9SRVNFVF9SRVNPVVJDRSwJIlNJRSBSZXNldCBSZXNvdXJjZSIgfSwKKysJeyBOTV9NVF9CUzExX0JFR0lOX0RCX1RYLAkiU0lFIEJlZ2luIERhdGFiYXNlIFRyYW5zbWlzc2lvbiIgfSwKKysJeyBOTV9NVF9CUzExX0JFR0lOX0RCX1RYX0FDSywJIlNJRSBCZWdpbiBEYXRhYmFzZSBUcmFuc21pc3Npb24gQUNLIiB9LAorKwl7IE5NX01UX0JTMTFfQkVHSU5fREJfVFhfTkFDSywJIlNJRSBCZWdpbiBEYXRhYmFzZSBUcmFuc21pc3Npb24gTkFDSyIgfSwKKysJeyBOTV9NVF9CUzExX0VORF9EQl9UWCwJCSJTSUUgRW5kIERhdGFiYXNlIFRyYW5zbWlzc2lvbiIgfSwKKysJeyBOTV9NVF9CUzExX0VORF9EQl9UWF9BQ0ssCSJTSUUgRW5kIERhdGFiYXNlIFRyYW5zbWlzc2lvbiBBQ0siIH0sCisrCXsgTk1fTVRfQlMxMV9FTkRfREJfVFhfTkFDSywJIlNJRSBFbmQgRGF0YWJhc2UgVHJhbnNtaXNzaW9uIE5BQ0siIH0sCisrCXsgTk1fTVRfQlMxMV9DUkVBVEVfT0JKLAkiU0lFIENyZWF0ZSBPYmplY3QiIH0sCisrCXsgTk1fTVRfQlMxMV9DUkVBVEVfT0JKX0FDSywJIlNJRSBDcmVhdGUgT2JqZWN0IEFDSyIgfSwKKysJeyBOTV9NVF9CUzExX0NSRUFURV9PQkpfTkFDSywJIlNJRSBDcmVhdGUgT2JqZWN0IE5BQ0siIH0sCisrCXsgTk1fTVRfQlMxMV9ERUxFVEVfT0JKLAkiU0lFIERlbGV0ZSBPYmplY3QiIH0sCisrCXsgTk1fTVRfQlMxMV9ERUxFVEVfT0JKX0FDSywJIlNJRSBEZWxldGUgT2JqZWN0IEFDSyIgfSwKKysJeyBOTV9NVF9CUzExX0RFTEVURV9PQkpfTkFDSywJIlNJRSBEZWxldGUgT2JqZWN0IE5BQ0siIH0sCisrCXsgTk1fTVRfQlMxMV9HRVRfU1RBVEUsCQkiU0lFIEdldCBTdGF0ZSIgfSwKKysJeyBOTV9NVF9CUzExX0dFVF9TVEFURV9BQ0ssCSJTSUUgR2V0IFN0YXRlIEFDSyIgfSwKKysJeyBOTV9NVF9CUzExX0xNVF9MT0dPTiwJCSJTSUUgTE1UIExvZ29uIiB9LAorKwl7IE5NX01UX0JTMTFfTE1UX0xPR09OX0FDSywJIlNJRSBMTVQgTG9nb24gQUNLIiB9LAorKwl7IE5NX01UX0JTMTFfUkVTVEFSVCwJCSJTSUUgUmVzdGFydCIgfSwKKysJeyBOTV9NVF9CUzExX1JFU1RBUlRfQUNLLAkiU0lFIFJlc3RhcnQgQUNLIiB9LAorKwl7IE5NX01UX0JTMTFfRElTQ09OTkVDVCwJIlNJRSBEaXNjb25uZWN0IEJUUyIgfSwKKysJeyBOTV9NVF9CUzExX0RJU0NPTk5FQ1RfQUNLLAkiU0lFIERpc2Nvbm5lY3QgQlRTIEFDSyIgfSwKKysJeyBOTV9NVF9CUzExX0xNVF9MT0dPRkYsCSJTSUUgTE1UIExvZ29mZiIgfSwKKysJeyBOTV9NVF9CUzExX0xNVF9MT0dPRkZfQUNLLAkiU0lFIExNVCBMb2dvZmYgQUNLIiB9LAorKwl7IE5NX01UX0JTMTFfUkVDT05ORUNULAkJIlNJRSBSZWNvbm5lY3QgQlRTIiB9LAorKwl7IE5NX01UX0JTMTFfUkVDT05ORUNUX0FDSywJIlNJRSBSZWNvbm5lY3QgQlRTIEFDSyIgfSwKKyt9OworKworKy8qIFRTIDEyLjIxIFNlY3Rpb24gOS4yOiBPYmplY3QgQ2xhc3MgKi8KKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIG9tbF9mb21fb2JqY2xhc3NfdmFsc1tdID0geworKwl7IE5NX09DX1NJVEVfTUFOQUdFUiwJCSJCVFMgU2l0ZSBNYW5hZ2VyIiB9LAorKwl7IE5NX09DX0JUUywJCQkiQlRTIiB9LAorKwl7IE5NX09DX1JBRElPX0NBUlJJRVIsCQkiUmFkaW8gQ2FycmllciIgfSwKKysJeyBOTV9PQ19DSEFOTkVMLAkJIlJhZGlvIENoYW5uZWwiIH0sCisrCXsgTk1fT0NfQkFTRUJfVFJBTlNDLAkJIkJhc2ViYW5kIFRyYW5zY2VpdmVyIiB9LAorKwkvKiBwcm9wcmlldGFyeSwgdmVuZG9yIHNwZWNpZmljICovCisrCXsgTk1fT0NfQlMxMV9BREpDLAkJIlNJRSBBZGphY2VuZCBDaGFubmVsIiB9LAorKwl7IE5NX09DX0JTMTFfSEFORE9WRVIsCQkiU0lFIEhhbmRvdmVyIiB9LAorKwl7IE5NX09DX0JTMTFfUFdSX0NUUkwsCQkiU0lFIFBvd2VyIENvbnRyb2wiIH0sCisrCXsgTk1fT0NfQlMxMV9CVFNFLAkJIlNJRSBCVFNFIiB9LAorKwl7IE5NX09DX0JTMTFfUkFDSywJCSJTSUUgUmFjayIgfSwKKysJeyBOTV9PQ19CUzExLAkJCSJTSUUgU2llbWVuc0hXIiB9LAorKwl7IE5NX09DX0JTMTFfVEVTVCwJCSJTSUUgVGVzdCIgfSwKKysJeyBOTV9PQ19CUzExX0VOVkFCVFNFLAkJIlNJRSBFbnZhQlRTRSIgfSwKKysJeyBOTV9PQ19CUzExX0JQT1JULAkJIlNJRSBCUG9ydCIgfSwKKysJeyBOTV9PQ19HUFJTX05TRSwJCSJHUFJTIE5TRSIgfSwKKysJeyBOTV9PQ19HUFJTX0NFTEwsCQkiR1BSUyBDZWxsIiB9LAorKwl7IE5NX09DX0dQUlNfTlNWQzAsCQkiR1BSUyBOU1ZDMCIgfSwKKysJeyBOTV9PQ19HUFJTX05TVkMxLAkJIkdQUlMgTlNWQzEiIH0sCisrCXsgTk1fT0NfTlVMTCwJCQkiTlVMTCIgfSwKKyt9OworKworKy8qIFRTIDEyLjIxIFNlY3Rpb24gOS40OiBBdHRyaWJ1dGVzICovCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyBvbWxfZm9tX2F0dHJfdmFsc1tdID0geworKwl7IE5NX0FUVF9BQklTX0NIQU5ORUwsCQkiQS1iaXMgQ2hhbm5lbCIgfSwKKysJeyBOTV9BVFRfQUREX0lORk8sCQkiQWRkaXRpb25hbCBJbmZvcm1hdGlvbiIgfSwKKysJeyBOTV9BVFRfQUREX1RFWFQsCQkiQWRkaXRpb25hbCBUZXh0IiB9LAorKwl7IE5NX0FUVF9BRE1fU1RBVEUsCQkiQWRtaW5pc3RyYXRpdmUgU3RhdGUiIH0sCisrCXsgTk1fQVRUX0FSRkNOX0xJU1QsCQkiQVJGQ04gTGlzdCIgfSwKKysJeyBOTV9BVFRfQVVUT05fUkVQT1JULAkJIkF1dG9ub21vdXNseSBSZXBvcnQiIH0sCisrCXsgTk1fQVRUX0FWQUlMX1NUQVRVUywJCSJBdmFpbGFiaWxpdHkgU3RhdHVzIiB9LAorKwl7IE5NX0FUVF9CQ0NIX0FSRkNOLAkJIkJDQ0ggQVJGQ04iIH0sCisrCXsgTk1fQVRUX0JTSUMsCQkJIkJTSUMiIH0sCisrCXsgTk1fQVRUX0JUU19BSVJfVElNRVIsCQkiQlRTIEFpciBUaW1lciIgfSwKKysJeyBOTV9BVFRfQ0NDSF9MX0lfUCwJCSJDQ0NIIExvYWQgSW5kaWNhdGlvbiBQZXJpb2QiIH0sCisrCXsgTk1fQVRUX0NDQ0hfTF9ULAkJIkNDQ0ggTG9hZCBUaHJlc2hvbGQiIH0sCisrCXsgTk1fQVRUX0NIQU5fQ09NQiwJCSJDaGFubmVsIENvbWJpbmF0aW9uIiB9LAorKwl7IE5NX0FUVF9DT05OX0ZBSUxfQ1JJVCwJIkNvbm5lY3Rpb24gRmFpbCBDcml0ZXJpb24iIH0sCisrCXsgTk1fQVRUX0RFU1QsCQkJIkRlc3RpbmF0aW9uIiB9LAorKwl7IE5NX0FUVF9FVkVOVF9UWVBFLAkJIkV2ZW50IFR5cGUiIH0sCisrCXsgTk1fQVRUX0ZJTEVfSUQsCQkiRmlsZSBJRCIgfSwKKysJeyBOTV9BVFRfRklMRV9WRVJTSU9OLAkJIkZpbGUgVmVyc2lvbiIgfSwKKysJeyBOTV9BVFRfR1NNX1RJTUUsCQkiR1NNIFRpbWUiIH0sCisrCXsgTk1fQVRUX0hTTiwJCQkiSFNOIiB9LAorKwl7IE5NX0FUVF9IV19DT05GSUcsCQkiSFcgQ29uZmlndXJhdGlvbiIgfSwKKysJeyBOTV9BVFRfSFdfREVTQywJCSJIVyBEZXNjcmlwdGlvbiIgfSwKKysJeyBOTV9BVFRfSU5UQVZFX1BBUkFNLAkJIkludGF2ZSBQYXJhbWV0ZXIiIH0sCisrCXsgTk1fQVRUX0lOVEVSRl9CT1VORCwJCSJJbnRlcmZlcmVuY2UgQm91bmRhcmllcyIgfSwKKysJeyBOTV9BVFRfTElTVF9SRVFfQVRUUiwJCSJMaXN0IG9mIHJlcXVpcmVkIEF0dHJpYnV0ZXMiIH0sCisrCXsgTk1fQVRUX01BSU8sCQkJIk1BSU8iIH0sCisrCXsgTk1fQVRUX01BTlVGX1NUQVRFLAkJIk1hbnVmYWN0dXJlciBEZXBlbmRlbnQgU3RhdGUiIH0sCisrCXsgTk1fQVRUX01BTlVGX1RIUkVTSCwJCSJNYW51ZmFjdHVyZXIgRGVwZW5kZW50IFRocmVzaG9sZHMiIH0sCisrCXsgTk1fQVRUX01BTlVGX0lELAkJIk1hbnVmYWN0dXJlciBJZCIgfSwKKysJeyBOTV9BVFRfTUFYX1RBLAkJIk1heGltdW0gVGltaW5nIEFkdmFuY2UiIH0sCisrCXsgTk1fQVRUX01EUk9QX0xJTkssCQkiTXVsdGktZHJvcCBCU0MgTGluayIgfSwKKysJeyBOTV9BVFRfTURST1BfTkVYVCwJCSJNdWx0aS1kcm9wIG5leHQgQlRTIExpbmsiIH0sCisrCXsgTk1fQVRUX05BQ0tfQ0FVU0VTLAkJIk5BQ0sgQ2F1c2VzIiB9LAorKwl7IE5NX0FUVF9OWTEsCQkJIk55MSIgfSwKKysJeyBOTV9BVFRfT1BFUl9TVEFURSwJCSJPcGVyYXRpb25hbCBTdGF0ZSIgfSwKKysJeyBOTV9BVFRfT1ZFUkxfUEVSSU9ELAkJIk92ZXJsb2FkIFBlcmlvZCIgfSwKKysJeyBOTV9BVFRfUEhZU19DT05GLAkJIlBoeXNpY2FsIENvbmZpZyIgfSwKKysJeyBOTV9BVFRfUE9XRVJfQ0xBU1MsCQkiUG93ZXIgQ2xhc3MiIH0sCisrCXsgTk1fQVRUX1BPV0VSX1RIUkVTSCwJCSJQb3dlciBPdXRwdXQgVGhyZXNob2xkcyIgfSwKKysJeyBOTV9BVFRfUFJPQl9DQVVTRSwJCSJQcm9iYWJsZSBDYXVzZSIgfSwKKysJeyBOTV9BVFRfUkFDSF9CX1RIUkVTSCwJCSJSQUNIIEJ1c3kgVGhyZXNob2xkIiB9LAorKwl7IE5NX0FUVF9MREFWR19TTE9UUywJCSJSQUNIIExvYWQgQXZlcmFnaW5nIFNsb3RzIiB9LAorKwl7IE5NX0FUVF9SQURfU1VCQywJCSJSYWRpbyBTdWIgQ2hhbm5lbCIgfSwKKysJeyBOTV9BVFRfUkZfTUFYUE9XUl9SLAkJIlJGIE1heCBQb3dlciBSZWR1Y3Rpb24iIH0sCisrCXsgTk1fQVRUX1NJVEVfSU5QVVRTLAkJIlNpdGUgSW5wdXRzIiB9LAorKwl7IE5NX0FUVF9TSVRFX09VVFBVVFMsCQkiU2l0ZSBPdXRwdXRzIiB9LAorKwl7IE5NX0FUVF9TT1VSQ0UsCQkiU291cmNlIiB9LAorKwl7IE5NX0FUVF9TUEVDX1BST0IsCQkiU3BlY2lmaWMgUHJvYmxlbXMiIH0sCisrCXsgTk1fQVRUX1NUQVJUX1RJTUUsCQkiU3RhcnRpbmcgVGltZSIgfSwKKysJeyBOTV9BVFRfVDIwMCwJCQkiVDIwMCIgfSwKKysJeyBOTV9BVFRfVEVJLAkJCSJURUkiIH0sCisrCXsgTk1fQVRUX1RFU1RfRFVSLAkJIlRlc3QgRHVyYXRpb24iIH0sCisrCXsgTk1fQVRUX1RFU1RfTk8sCQkiVGVzdCBObyIgfSwKKysJeyBOTV9BVFRfVEVTVF9SRVBPUlQsCQkiVGVzdCBSZXBvcnQgSW5mbyIgfSwKKysJeyBOTV9BVFRfVlNXUl9USFJFU0gsCQkiVlNXUiBUaHJlc2hvbGRzICIgfSwKKysJeyBOTV9BVFRfV0lORE9XX1NJWkUsCQkiV2luZG93IFNpemUiIH0sCisrCXsgTk1fQVRUX0JTMTFfUlNTSV9PRkZTLAkiU0lFIFJTU0kgT2Zmc2V0IiB9LAorKwl7IE5NX0FUVF9CUzExX1RYUFdSLAkJIlNJRSBUWCBQb3dlciIgfSwKKysJeyBOTV9BVFRfQlMxMV9ESVZFUlNJVFksCSJTSUUgRGl2ZXJzaXR5IiB9LAorKwl7IE5NX0FUVF9UU0MsCQkJIlRyYWluaW5nIFNlcXVlbmNlIENvZGUiIH0sCisrCXsgTk1fQVRUX1NXX0NPTkZJRywJCSJTVyBDb25maWd1cmF0aW9uIiB9LAorKwl7IE5NX0FUVF9TV19ERVNDUiwJCSJTVyBEZXNjcmlwdGlvbiIgfSwKKysJeyBOTV9BVFRfU0VWRVJJVFksCQkiUGVyY2VpdmVkIFNldmVyaXR5IiB9LAorKwl7IE5NX0FUVF9HRVRfQVJJLAkJIkdldCBBUkkiIH0sCisrCXsgTk1fQVRUX0hXX0NPTkZfQ0hHLAkJIkhXIENvbmZpZ3VyYXRpb24gQ2hhbmdlIiB9LAorKwl7IE5NX0FUVF9PVVRTVF9BTEFSTSwJCSJPdXRzdGFuZGluZyBBbGFybSIgfSwKKysJeyBOTV9BVFRfRklMRV9EQVRBLAkJIkZpbGUgRGF0YSIgfSwKKysJeyBOTV9BVFRfTUVBU19SRVMsCQkiTWVhc3VyZW1lbnQgUmVzdWx0IiB9LAorKwl7IE5NX0FUVF9NRUFTX1RZUEUsCQkiTWVhc3VyZW1lbnQgVHlwZSIgfSwKKysJeyBOTV9BVFRfQlMxMV9FU05fRldfQ09ERV9OTywJIlNJRSBFU04gRlcgQ29kZSBOdW1iZXIiIH0sCisrCXsgTk1fQVRUX0JTMTFfRVNOX0hXX0NPREVfTk8sCSJTSUUgRVNOIEhXIENvZGUgTnVtYmVyIiB9LAorKwl7IE5NX0FUVF9CUzExX0VTTl9QQ0JfU0VSSUFMLAkiU0lFIEVTTiBQQ0IgU2VyaWFsIE51bWJlciIgfSwKKysJeyBOTV9BVFRfQlMxMV9FWENFU1NJVkVfRElTVEFOQ0UsICJTSUUgRXhjZXNzaXZlIERpc3RhbmNlIiB9LAorKwl7IE5NX0FUVF9CUzExX0FMTF9URVNUX0NBVEcsCSJTSUUgQWxsIFRlc3QgQ2F0ZWdvcmllcyIgfSwKKysJeyBOTV9BVFRfQlMxMV9CVFNMU19IT1BQSU5HLAkiU0lFIEJUUyBMUyBIb3BwaW5nIiB9LAorKwl7IE5NX0FUVF9CUzExX0NFTExfQUxMT0NfTlIsCSJTSUUgQ2VsbCBBbGxvY2F0aW9uIE51bWJlciIgfSwKKysJeyBOTV9BVFRfQlMxMV9DRUxMX0dMT0JBTF9JRCwJIlNJRSBDZWxsIEdsb2JhbCBJRCIgfSwKKysJeyBOTV9BVFRfQlMxMV9FTkFfSU5URVJGX0NMQVNTLAkiU0lFIEVuYWJsZSBJbnRlcmZlcmVuY2UgQ2xhc3MiIH0sCisrCS8qIEZJWE1FICovCisrCXsgTk1fQVRUX0JTMTFfRU5BX01TX1BXUl9DVFJMLAkiU0lFIEVuYWJsZSBNUyBQb3dlciBDb250cm9sIiB9LAorKwl7IE5NX0FUVF9CUzExX0VOQV9QV1JfQkRHVF9ITywJIlNJRSBFbmFibGUgUG93ZXIgQnVkZ2V0IEhPIiB9LAorKwl7IE5NX0FUVF9CUzExX0VOQV9SWExFVl9ITywJIlNJRSBFbmFibGUgUnhMZXZlbCBITyIgfSwKKysJeyBOTV9BVFRfQlMxMV9FTkFfUlhRVUFMX0hPLAkiU0lFIEVuYWJsZSBSeFF1YWwgSE8iIH0sCisrCXsgTk1fQVRUX0JTMTFfRkFDQ0hfUVVBTCwJIlNJRSBGQUNDSCBRdWFsaXR5IiB9LAorKwl7IE5NX0FUVF9JUEFDQ19EU1RfSVAsCQkiSVBBIERlc3RpbmF0aW9uIElQIEFkZHJlc3MiIH0sCisrCXsgTk1fQVRUX0lQQUNDX0RTVF9JUF9QT1JULAkiSVBBIERlc3Rpb25hdGlvbiBJUCBQb3J0IiB9LAorKwl7IE5NX0FUVF9JUEFDQ19TU1JDLAkJIklQQSBSVFAgU1NSQyIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfUlRQX1BBWUxEX1RZUEUsCSJJUEEgUlRQIFBheWxvYWQgVHlwZSIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfQkFTRUJfSUQsCSJJUEEgQmFzZWJhbmQgSWRlbnRpZmllciIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfU1RSRUFNX0lELAkiSVBBIFN0cmVhbSBJZGVudGlmaWVyIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19OVl9GTEFHUywJIklQQSBOVlJBTSBGbGFncyIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfRlJFUV9DVFJMLAkiSVBBIEZyZXF1ZW5jeSBDb250cm9sIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19QUklNX09NTF9DRkcsCSJJUEEgUHJpbWFyeSBPTUwgQ29uZmlnIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19TRUNfT01MX0NGRywJIklQQSBTZWNvbmRhcnkgT01MIENvbmZpZyIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfSVBfSUZfQ0ZHLAkiSVBBIElQIEludGVyZmFjZSBDb25maWciIH0sCisrCXsgTk1fQVRUX0lQQUNDX0lQX0dXX0NGRywJIklQQSBJUCBHYXRld2F5IENvbmZpZyIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfSU5fU0VSVl9USU1FLAkiSVBBIEluIFNlcnZpY2UgVGltZSIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfVFJYX0JUU19BU1MsCSJJUEEgVFJYIEJUUyBBc3NpZ25tZW50IiB9LAorKwl7IE5NX0FUVF9JUEFDQ19MT0NBVElPTiwJIklQQSBCVFMgTG9jYXRpb24gTmFtZSIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfUEFHSU5HX0NGRywJIklQQSBQYWdpbmcgQ29uZmlndXJhdGlvbiIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfRklMRV9EQVRBLAkiSVBBIEZpbGUgRGF0YSIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfVU5JVF9JRCwJCSJJUEEgVW5pdCBJRCIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfUEFSRU5UX1VOSVRfSUQsCSJJUEEgUGFyZW50IFVuaXQgSUQiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1VOSVRfTkFNRSwJIklQQSBVbml0IE5hbWUiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1NOTVBfQ0ZHLAkiSVBBIFNOTVAgQ29uZmlnIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19QUklNX09NTF9DRkdfTElTVCwgIklQQSBQcmltYXJ5IE9NTCBDb25maWcgTGlzdCIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfUFJJTV9PTUxfRkJfVE9VVCwiSVBBIFByaW1hcnkgT01MIEZhbGxiYWNrIFRpbWVvdXQiIH0sCisrCXsgTk1fQVRUX0lQQUNDX0NVUl9TV19DRkcsCSJJUEEgQ3VycmVudCBTb2Z0d2FyZSBDb25maWciIH0sCisrCXsgTk1fQVRUX0lQQUNDX1RJTUlOR19CVVMsCSJJUEEgVGltaW5nIEJ1cyIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfQ0dJLAkJIklQQSBDR0kiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1JBQywJCSJJUEEgUkFDIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19PQkpfVkVSU0lPTiwJIklQQSBPYmplY3QgVmVyc2lvbiIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfR1BSU19QQUdJTkdfQ0ZHLAkiSVBBIEdQUlMgUGFnaW5nIENvbmZpZ3VyYXRpb24iIH0sCisrCXsgTk1fQVRUX0lQQUNDX05TRUksCQkiSVBBIE5TRUkiIH0sCisrCXsgTk1fQVRUX0lQQUNDX0JWQ0ksCQkiSVBBIEJWQ0kiIH0sCisrCXsgTk1fQVRUX0lQQUNDX05TVkNJLAkJIklQQSBOU1ZDSSIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfTlNfQ0ZHLAkJIklQQSBOUyBDb25maWd1cmF0aW9uIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19CU1NHUF9DRkcsCSJJUEEgQlNTR1AgQ29uZmlndXJhdGlvbiIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfTlNfTElOS19DRkcsCSJJUEEgTlMgTGluayBDb25maWd1cmF0aW9uIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19STENfQ0ZHLAkJIklQQSBSTEMgQ29uZmlndXJhdGlvbiIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfQUxNX1RIUkVTSF9MSVNULAkiSVBBIEFsYXJtIFRocmVzaG9sZCBMaXN0IiB9LAorKwl7IE5NX0FUVF9JUEFDQ19NT05JVF9WQUxfTElTVCwJIklQQSBNb25pdG9yZWQgVmFsdWUgTGlzdCIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfVElCX0NPTlRST0wsCSJJUEEgVGltaW5nIEludGVyZmFjZSBCdXMgQ29udHJvbCIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfU1VQUF9GRUFUVVJFUywJIklQQSBTdXBwb3J0ZWQgRmVhdHVyZXMiIH0sCisrCXsgTk1fQVRUX0lQQUNDX0NPRElOR19TQ0hFTUVTLAkiSVBBIENvZGluZyBTY2hlbWVzIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19STENfQ0ZHXzIsCSJJUEEgUkxDIENvbmZpZ3VyYXRpb24gMiIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfSEVBUlRCX1RPVVQsCSJJUEEgSGVhcnRiZWF0IFRpbWVvdXQiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1VQVElNRSwJCSJJUEEgVXB0aW1lIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19STENfQ0ZHXzMsCSJJUEEgUkxDIENvbmZpZ3VyYXRpb24gMyIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfU1NMX0NGRywJCSJJUEEgU1NMIENvbmZpZ3VyYXRpb24iIH0sCisrCXsgTk1fQVRUX0lQQUNDX1NFQ19QT1NTSUJMRSwJIklQQSBTZWN1cml0eSBQb3NzaWJsZSIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfSU1MX1NTTF9TVEFURSwJIklQQSBJTUwgU1NMIFN0YXRlIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19SRVZPQ19EQVRFLAkiSVBBIFJldm9jYXRpb24gRGF0ZSIgfSwKKysJLyogRklYTUU6IE1vcmUgU0lFICovCisrfTsKKysKKysvKiBTZWN0aW9uIDkuNC40OiBBZG1pbmlzdHJhdGl2ZSBTdGF0ZSAqLworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgb21sX2FkbV9zdGF0ZV92YWxzW10gPSB7CisrCXsgTk1fU1RBVEVfTE9DS0VELAkJIkxvY2tlZCIgfSwKKysJeyBOTV9TVEFURV9VTkxPQ0tFRCwJCSJVbmxvY2tlZCIgfSwKKysJeyBOTV9TVEFURV9TSFVURE9XTiwJCSJTaHV0ZG93biIgfSwKKysJeyBOTV9TVEFURV9OVUxMLAkJIk51bGwiIH0sCisrfTsKKysKKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIG9tbF9vcGVyX3N0YXRlX3ZhbHNbXSA9IHsKKysJeyAxLAkiRGlzYWJsZWQiIH0sCisrCXsgMiwJIkVuYWJsZWQiIH0sCisrCXsgMHhmZiwJIk5VTEwiIH0sCisrfTsKKysKKysvKiBTZWN0aW9uIDkuNC43IEF2YWlsYWJpbGl0eSBTdGF0dXMgKi8KKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIG9tbF9hdmFpbF9zdGF0ZV92YWxzW10gPSB7CisrCXsgMCwJIkluIHRlc3QiIH0sCisrCXsgMSwJIkZhaWxlZCIgfSwKKysJeyAyLAkiUG93ZXIgb2ZmIiB9LAorKwl7IDMsCSJPZmYgbGluZSIgfSwKKysJeyA1LAkiRGVwZW5kZW5jeSIgfSwKKysJeyA2LAkiRGVncmFkZWQiIH0sCisrCXsgNywgCSJOb3QgaW5zdGFsbGVkIiB9LAorKwl7IDB4ZmYsCSJPSyIgfSwKKyt9OworKworKy8qIFNlY3Rpb24gOS40LjEzOiBDaGFubmVsIENvbWJpbmF0aW9uICovCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyBvbWxfY2hhbl9jb21iX3ZhbHNbXSA9IHsKKysJeyBOTV9DSEFOQ19UQ0hGdWxsLAkJIlRDSC9GIiB9LAorKwl7IE5NX0NIQU5DX1RDSEhhbGYsCQkiVENIL0giIH0sCisrCXsgTk1fQ0hBTkNfVENISGFsZjIsCQkiVENIL0ggMiIgfSwKKysJeyBOTV9DSEFOQ19TRENDSCwJCSJTRENDSCIgfSwKKysJeyBOTV9DSEFOQ19tYWluQkNDSCwJCSJNYWluIEJDQ0giIH0sCisrCXsgTk1fQ0hBTkNfQkNDSENvbWIsCQkiQ29tYmluZWQgQkNDSCIgfSwKKysJeyBOTV9DSEFOQ19CQ0NILAkJIkJDQ0giIH0sCisrCXsgTk1fQ0hBTkNfQkNDSF9DQkNILAkJIkJDQ0grQ0JDSCIgfSwKKysJeyBOTV9DSEFOQ19TRENDSF9DQkNILAkJIlNEQ0NIK0NCQ0giIH0sCisrfTsKKysKKysvKiBTZWN0aW9uIDkuNC4xNjogRXZlbnQgVHlwZSAqLworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgb21sX2V2ZW50X3R5cGVfdmFsc1tdID0geworKwl7IE5NX0VWVF9DT01NX0ZBSUwsCQkiQ29tbXVuaWNhdGlvbiBGYWlsdXJlIiB9LAorKwl7IE5NX0VWVF9RT1NfRkFJTCwJCSJRb1MgRmFpbHVyZSIgfSwKKysJeyBOTV9FVlRfUFJPQ19GQUlMLAkJIlByb2Nlc3NvciBGYWlsdXJlIiB9LAorKwl7IE5NX0VWVF9FUVVJUF9GQUlMLAkJIkVxdWlwbWVudCBGYWlsdXJlIiB9LAorKwl7IE5NX0VWVF9FTlZfRkFJTCwJCSJFbnZpcm9ubWVudCBGYWlsdXJlIiB9LAorK307CisrCisrLyogU2VjdGlvbiA5LjQuNjM6IFBlcmNlaXZlZCBTZXZlcml0eSAqLworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgb21sX3NldmVyaXR5X3ZhbHNbXSA9IHsKKysJeyBOTV9TRVZFUl9DRUFTRUQsCQkiQ2Vhc2VkIiB9LAorKwl7IE5NX1NFVkVSX0NSSVRJQ0FMLAkJIkNyaXRpY2FsIiB9LAorKwl7IE5NX1NFVkVSX01BSk9SLAkJIk1ham9yIiB9LAorKwl7IE5NX1NFVkVSX01JTk9SLAkJIk1pbm9yIiB9LAorKwl7IE5NX1NFVkVSX1dBUk5JTkcsCQkiV2FybmluZyIgfSwKKysJeyBOTV9TRVZFUl9JTkRFVEVSTUlOQVRFLAkiSW5kZXRlcm1pbmF0ZSIgfSwKKyt9OworKworKy8qIFNlY3Rpb24gOS40LjM2OiBOQUNLIENhdXNlcyAqLworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgb21sX25hY2tfY2F1c2VbXSA9IHsKKysJeyBOTV9OQUNLX0lOQ09SUl9TVFJVQ1QsCSJJbmNvcnJlY3QgbWVzc2FnZSBzdHJ1Y3R1cmUiIH0sCisrCXsgTk1fTkFDS19NU0dUWVBFX0lOVkFMLAkiSW52YWxpZCBtZXNzYWdlIHR5cGUgdmFsdWUiIH0sCisrCXsgTk1fTkFDS19PQkpDTEFTU19JTlZBTCwJIkludmFsaWQgT2JqZWN0IGNsYXNzIHZhbHVlIiB9LAorKwl7IE5NX05BQ0tfT0JKQ0xBU1NfTk9UU1VQUCwJIk9iamVjdCBDbGFzcyBub3Qgc3VwcG9ydGVkIiB9LAorKwl7IE5NX05BQ0tfQlRTTlJfVU5LTiwJCSJCVFMgTnVtYmVyIHVua25vd24iIH0sCisrCXsgTk1fTkFDS19UUlhOUl9VTktOLAkJIlRSWCBOdW1iZXIgdW5rbm93biIgfSwKKysJeyBOTV9OQUNLX09CSklOU1RfVU5LTiwJCSJPYmplY3QgSW5zdGFuY2UgdW5rbm93biIgfSwKKysJeyBOTV9OQUNLX0FUVFJJRF9JTlZBTCwJCSJJbnZhbGlkIEF0dHJpYnV0ZSBJRCB2YWx1ZSIgfSwKKysJeyBOTV9OQUNLX0FUVFJJRF9OT1RTVVBQLAkiQXR0cmlidXRlIElEIG5vdCBzdXBwb3J0ZWQiIH0sCisrCXsgTk1fTkFDS19QQVJBTV9SQU5HRSwJCSJQYXJhbWV0ZXIgdmFsdWUgb3V0IG9mIHJhbmdlIiB9LAorKwl7IE5NX05BQ0tfQVRUUkxJU1RfSU5DT05TSVNURU5ULCAiSW5jb25zaXN0ZW5jeSBpbiBBdHRyaWJ1dGUgbGlzdCIgfSwKKysJeyBOTV9OQUNLX1NQRUNfSU1QTF9OT1RTVVBQLAkiU3BlY2lmaWVkIEltcGxlbWVudGF0aW9uIG5vdCBzdXBwb3J0ZWQiIH0sCisrCXsgTk1fTkFDS19DQU5UX1BFUkZPUk0sCQkiTWVzc2FnZSBjYW5ub3QgYmUgcGVyZm9ybWVkIiB9LAorKwl7IE5NX05BQ0tfUkVTX05PVElNUEwsCQkiUmVzb3VyY2Ugbm90IGltcGxlbWVudGVkIiB9LAorKwl7IE5NX05BQ0tfUkVTX05PVEFWQUlMLAkJIlJlc291cmNlIG5vdCBhdmFpbGFibGUiIH0sCisrCXsgTk1fTkFDS19GUkVRX05PVEFWQUlMLAkiRnJlcXVlbmN5IG5vdCBhdmFpbGFibGUiIH0sCisrCXsgTk1fTkFDS19URVNUX05PVFNVUFAsCQkiVGVzdCBub3Qgc3VwcG9ydGVkIiB9LAorKwl7IE5NX05BQ0tfQ0FQQUNJVFlfUkVTVFIsCSJDYXBhY2l0eSByZXN0cmljdGlvbnMiIH0sCisrCXsgTk1fTkFDS19QSFlTQ0ZHX05PVFBFUkZPUk0sCSJQaHlzIGNvbmZpZyBjYW5ub3QgYmUgcGVyZm9ybWVkIiB9LAorKwl7IE5NX05BQ0tfVEVTVF9OT1RJTklULAkJIlRlc3Qgbm90IGluaXRpYXRlZCIgfSwKKysJeyBOTV9OQUNLX1BIWVNDRkdfTk9UUkVTVE9SRSwJIlBoeXMgY29uZmlnIGNhbm5vdCBiZSByZXN0b3JlZCIgfSwKKysJeyBOTV9OQUNLX1RFU1RfTk9TVUNILAkJIk5vIHN1Y2ggVGVzdCIgfSwKKysJeyBOTV9OQUNLX1RFU1RfTk9TVE9QLAkJIlRlc3QgY2Fubm90IGJlIHN0b3BwZWQiIH0sCisrCXsgTk1fTkFDS19NU0dJTkNPTlNJU1RfUEhZU0NGRywJIk1lc3NhZ2UgaW5jb25zaXN0ZW4gd2l0aCBwaHlzaWNhbCBjb25maWciIH0sCisrCXsgTk1fTkFDS19GSUxFX0lOQ09NUExFVEUsCSJDb21wbGV0ZSBmaWxlIG5vdCByZWNlaXZlZCIgfSwKKysJeyBOTV9OQUNLX0ZJTEVfTk9UQVZBSUwsCSJGaWxlIG5vdCBhdmFpbGFibGUgYXQgZGVzdGluYXRpb24iIH0sCisrCXsgTk1fTkFDS19GSUxFX05PVEFDVElWQVRFLAkiRmlsZSBjYW5ub3QgYmUgYWN0aXZhdGVkIiB9LAorKwl7IE5NX05BQ0tfUkVRX05PVF9HUkFOVCwJIlJlcXVlc3Qgbm90IGdyYW50ZWQiIH0sCisrCXsgTk1fTkFDS19XQUlULAkJCSJXYWl0IiB9LAorKwl7IE5NX05BQ0tfTk9USF9SRVBPUlRfRVhJU1QsCSJOb3RoaW5nIHJlcG9ydGFibGUgZXhpc3RpbmciIH0sCisrCXsgTk1fTkFDS19NRUFTX05PVFNVUFAsCQkiTWVhc3VyZW1lbnQgbm90IHN1cHBvcnRlZCIgfSwKKysJeyBOTV9OQUNLX01FQVNfTk9UU1RBUlQsCSJNZWFzdXJlbWVudCBub3Qgc3RhcnRlZCIgfSwKKysJeyAweGZmLAkJCQkiTlVMTCIgfSwKKyt9OworKworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgb21sX3Rlc3Rfbm9fdmFsc1tdID0geworKwl7IE5NX0lQQUNDX1RFU1ROT19STE9PUF9BTlQsCSJSYWRpbyBMb29wIHRlc3QgdmlhIGFudGVubmEiIH0sCisrCXsgTk1fSVBBQ0NfVEVTVE5PX1JMT09QX1hDVlIsCSJSYWRpbyBMb29wIHRlc3QgdmlhIHRyYW5zY2VpdmVyIiB9LAorKwl7IE5NX0lQQUNDX1RFU1ROT19GVU5DX09CSiwJIkJUUyBGdW5jdGlvbmFsIG9iamVjdCBzZWxmIHRlc3QiIH0sCisrCXsgTk1fSVBBQ0NfVEVTVE5PX0NIQU5fVVNBR0UsCSJDaGFubmVsIFVzYWdlIiB9LAorKwl7IE5NX0lQQUNDX1RFU1ROT19CQ0NIX0NIQU5fVVNBR0UsICJCQ0NIIENoYW5uZWwgVXNhZ2UiIH0sCisrCXsgTk1fSVBBQ0NfVEVTVE5PX0ZSRVFfU1lOQywJIkZyZXF1ZW5jeSBTeW5jaHJvbml6YXRpb24iIH0sCisrCXsgTk1fSVBBQ0NfVEVTVE5PX0JDQ0hfSU5GTywJIkJDQ0ggSW5mb3JtYXRpb24iIH0sCisrCXsgTk1fSVBBQ0NfVEVTVE5PX1RYX0JFQUNPTiwJIlRyYW5zbWl0IEJlYWNvbiIgfSwKKysJeyBOTV9JUEFDQ19URVNUTk9fU1lTSU5GT19NT05JVE9SLCAiU3lzSW5mbyBNb25pdG9yIiB9LAorKwl7IE5NX0lQQUNDX1RFU1ROT19CQ0NDSF9NT05JVE9SLCAiQkNDSCAmIENDQ0ggTW9uaXRvciIgfSwKKyt9OworKworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgaXBhY2NfdGVzdF9yZXNfdmFsc1tdID0geworKwl7IE5NX0lQQUNDX1RFU1RSRVNfU1VDQ0VTUywJIlN1Y2Nlc3MiIH0sCisrCXsgTk1fSVBBQ0NfVEVTVFJFU19USU1FT1VULAkiVGltZW91dCIgfSwKKysJeyBOTV9JUEFDQ19URVNUUkVTX05PX0NIQU5TLAkiTm8gc3VpdGFibGUgY2hhbm5lbHMgYXZhaWxhYmxlIiB9LAorKwl7IE5NX0lQQUNDX1RFU1RSRVNfUEFSVElBTCwJIlBhcnRpYWwiIH0sCisrCXsgTk1fSVBBQ0NfVEVTVFJFU19TVE9QUEVELAkiU3RvcHBlZCIgfSwKKyt9OworKworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgaXBhY2NfdGVzdHJlc19pZV92YWxzW10gPSB7CisrCXsgTk1fSVBBQ0NfVFJfSUVfRlJFUV9FUlJfTElTVCwJIkZyZXF1ZW5jeSBFcnJvciBMaXN0IiB9LAorKwl7IE5NX0lQQUNDX1RSX0lFX0NIQU5fVVNBR0UsCSJDaGFubmVsIFVzYWdlIiB9LAorKwl7IE5NX0lQQUNDX1RSX0lFX0JDQ0hfSU5GTywJIkJDQ0ggSW5mb3JtYXRpb24iIH0sCisrCXsgTk1fSVBBQ0NfVFJfSUVfUkVTVUxUX0RFVEFJTFMsIlJlc3VsdCBEZXRhaWxzIiB9LAorKwl7IE5NX0lQQUNDX1RSX0lFX0ZSRVFfRVJSLAkiRnJlcXVlbmN5IEVycm9yIiB9LAorK307CisrCisrLyogUGFyc2UgdGhlIGlwLmFjY2VzcyBzcGVjaWZpYyBCQ0NIIEluZm9ybWF0aW9uIElFIGVtYmVkZGVkIGludG8gdGhlIFRlc3QKKysgKiBSZXBvcnQgSUUgKi8KKytzdGF0aWMgZ2ludAorK2lwYWNjX3RyX2llX2JjY2godHZidWZmX3QgKnR2YiwgcHJvdG9fdHJlZSAqYXR0X3RyZWUsIGludCBvZmZzZXQpCisreworKwlndWludDE2IGJpbmZvX3R5cGUsIHRtcDsKKysKKysJYmluZm9fdHlwZSA9IHR2Yl9nZXRfbnRvaHModHZiLCBvZmZzZXQpOworKwlvZmZzZXQgKz0gMjsKKysKKysJdG1wID0gdHZiX2dldF9udG9ocyh0dmIsIG9mZnNldCk7CisrCisrCS8qIEZJWE1FOiB0aGVyZSBhcmUgc3RpbGwgc29tZSBidWdzIHJlbWFpbmluZyBoZXJlICovCisrCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3RyX2FyZmNuLAorKwkJCSAgICB0dmIsIG9mZnNldCwgMiwgVFJVRSk7CisrCisrCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3RyX2ZfcXVhbCwKKysJCQkgICAgdHZiLCBvZmZzZXQsIDIsIFRSVUUpOworKwlvZmZzZXQgKz0gMjsKKysKKysJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdHJfYl9yeGxldiwKKysJCQkgICAgdHZiLCBvZmZzZXQrKywgMSwgVFJVRSk7CisrCisrCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3RyX3J4cXVhbCwKKysJCQkgICAgdHZiLCBvZmZzZXQrKywgMSwgVFJVRSk7CisrCisrCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3RyX2ZfZXJyLAorKwkJCSAgICB0dmIsIG9mZnNldCwgMiwgVFJVRSk7CisrCW9mZnNldCArPSAyOworKworKwlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2lwYV90cl9mcmFtZV9vZmZzLAorKwkJCSAgICB0dmIsIG9mZnNldCwgMiwgVFJVRSk7CisrCW9mZnNldCArPSAyOworKwlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2lwYV90cl9mcmFtZW5yX29mZnMsCisrCQkJICAgIHR2Yiwgb2Zmc2V0LCA0LCBUUlVFKTsKKysJb2Zmc2V0ICs9IDQ7CisrCisrCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3RyX2JzaWMsCisrCQkJICAgIHR2Yiwgb2Zmc2V0KyssIDEsIFRSVUUpOworKworKwlkZV9sYWkodHZiLCBhdHRfdHJlZSwgb2Zmc2V0LCA1LCBOVUxMLCAwKTsKKysJb2Zmc2V0ICs9IDU7CisrCisrCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3RyX2NlbGxfaWQsCisrCQkJICAgIHR2Yiwgb2Zmc2V0LCAyLCBUUlVFKTsKKysJb2Zmc2V0ICs9IDI7CisrCisrCWlmIChiaW5mb190eXBlICYgMHg4MDAwKSB7CisrCQkvKiBTeXN0ZW0gSW5mb3JtYXRpb24gMiAqLworKwkJLyogRklYTUU6IFBhcnNlIDA0LjE4IE5laWdoYm91ciBDZWxsIERlc2NyaXB0aW9uICovCisrCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2lwYV90cl9zaTIsCisrCQkJCSAgICB0dmIsIG9mZnNldCwgMTYsIFRSVUUpOworKwkJb2Zmc2V0ICs9IDE2OworKwl9CisrCWlmIChiaW5mb190eXBlICYgMHgwMDAxKSB7CisrCQkvKiBTeXN0ZW0gSW5mb3JtYXRpb24gMmJpcyAqLworKwkJLyogRklYTUU6IFBhcnNlIDA0LjE4IE5laWdoYm91ciBDZWxsIERlc2NyaXB0aW9uICovCisrCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2lwYV90cl9zaTJiaXMsCisrCQkJCSAgICB0dmIsIG9mZnNldCwgMTYsIFRSVUUpOworKwkJb2Zmc2V0ICs9IDE2OworKwl9CisrCWlmIChiaW5mb190eXBlICYgMHgwMDAyKSB7CisrCQkvKiBTeXN0ZW0gSW5mb3JtYXRpb24gMnRlciAqLworKwkJLyogRklYTUU6IFBhcnNlIDA0LjE4IE5laWdoYm91ciBDZWxsIERlc2NyaXB0aW9uICovCisrCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2lwYV90cl9zaTJ0ZXIsCisrCQkJCSAgICB0dmIsIG9mZnNldCwgMTYsIFRSVUUpOworKwkJb2Zmc2V0ICs9IDE2OworKwl9CisrCWlmIChiaW5mb190eXBlICYgMHgwMDA0KSB7CisrCQkvKiBGSVhNRTogUGFyc2UgMDQuMTggQ2VsbCBDaGFubmVsIERlc2NyaXB0aW9uICovCisrCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2lwYV90cl9jaGFuX2Rlc2MsCisrCQkJCSAgICB0dmIsIG9mZnNldCwgMTYsIFRSVUUpOworKwkJb2Zmc2V0ICs9IDE2OworKwl9CisrCisrCXJldHVybiBvZmZzZXQ7CisrfQorKworKy8qIFBhcnNlIHRoZSBpcC5hY2Nlc3Mgc3BlY2lmaWMgQ2hhbm5lbCBVc2FnZSBJRSBlbWJlZGRlZCBpbnRvIHRoZSBUZXN0CisrICogUmVwb3J0IElFICovCisrc3RhdGljIGdpbnQKKytpcGFjY190cl9pZV9jaGFuX3VzYWdlKHR2YnVmZl90ICp0dmIsIHByb3RvX3RyZWUgKmF0dF90cmVlLCBpbnQgb2Zmc2V0KQorK3sKKysJd2hpbGUgKHR2Yl9yZXBvcnRlZF9sZW5ndGhfcmVtYWluaW5nKHR2Yiwgb2Zmc2V0KSAhPSAwKSB7CisrCQlndWludDE2IHJlc3VsdCA9IHR2Yl9nZXRfbnRvaHModHZiLCBvZmZzZXQpOworKwkJcHJvdG9fdHJlZV9hZGRfdWludChhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdHJfYXJmY24sCisrCQkJCSAgICB0dmIsIG9mZnNldCwgMiwgcmVzdWx0KTsKKysJCXByb3RvX3RyZWVfYWRkX3VpbnQoYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3RyX3J4bGV2LAorKwkJCQkgICAgdHZiLCBvZmZzZXQsIDIsIHJlc3VsdCk7CisrCQlvZmZzZXQgKz0gMjsKKysJfQorKwlyZXR1cm4gb2Zmc2V0OworK30KKysKKysvKiBQYXJzZSB0aGUgaXAuYWNjZXNzIHNwZWNpZmljIGZvcm1hdCBvZiB0aGUgc3RhbmRhcmQgdGVzdCByZXBvcnQgSUUgKi8KKytzdGF0aWMgZ2ludAorK2Rpc3NlY3RfaXBhY2NfdGVzdF9yZXAocHJvdG9fdHJlZSAqdHJlZSwgdHZidWZmX3QgKnR2YikKKyt7CisrCWdpbnQgb2Zmc2V0ID0gMDsKKysKKysJcHJvdG9fdHJlZV9hZGRfaXRlbSh0cmVlLCBoZl9hdHRyX2lwYV90ZXN0X3JlcywgdHZiLCBvZmZzZXQrKywKKysJCQkgICAgMSwgRkFMU0UpOworKworKwl3aGlsZSAodHZiX3JlcG9ydGVkX2xlbmd0aF9yZW1haW5pbmcodHZiLCBvZmZzZXQpICE9IDApIHsKKysJCWd1aW50OCBpZSA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KTsKKysJCWd1aW50MTYgbGVuID0gdHZiX2dldF9udG9ocyh0dmIsIG9mZnNldCsxKTsKKysJCXByb3RvX2l0ZW0gKnRpOworKwkJcHJvdG9fdHJlZSAqYXR0X3RyZWU7CisrCisrCQl0aSA9IHByb3RvX3RyZWVfYWRkX2l0ZW0odHJlZSwgaGZfb21sX2lwYV90cmVzX2F0dHJfdGFnLCB0dmIsCisrCQkJCQkgb2Zmc2V0KyssIDEsIEZBTFNFKTsKKysJCWF0dF90cmVlID0gcHJvdG9faXRlbV9hZGRfc3VidHJlZSh0aSwgZXR0X29tbF9mb21fYXR0KTsKKysJCXByb3RvX3RyZWVfYWRkX3VpbnQoYXR0X3RyZWUsIGhmX29tbF9pcGFfdHJlc19hdHRyX2xlbiwgdHZiLAorKwkJCQkgICAgb2Zmc2V0LCAyLCBsZW4pOworKwkJb2Zmc2V0ICs9IDI7CisrCisrCQlzd2l0Y2ggKGllKSB7CisrCQljYXNlIE5NX0lQQUNDX1RSX0lFX0NIQU5fVVNBR0U6CisrCQkJb2Zmc2V0ID0gaXBhY2NfdHJfaWVfY2hhbl91c2FnZSh0dmIsCisrCQkJCQkJIAlhdHRfdHJlZSwgb2Zmc2V0KTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fSVBBQ0NfVFJfSUVfQkNDSF9JTkZPOgorKwkJCW9mZnNldCA9IGlwYWNjX3RyX2llX2JjY2godHZiLAorKwkJCQkJCSAgYXR0X3RyZWUsIG9mZnNldCk7CisrCQkJYnJlYWs7CisrCQlkZWZhdWx0OgorKwkJCWJyZWFrOworKwkJfQorKwl9CisrCXJldHVybiBvZmZzZXQ7CisrfQorKworKy8qIERpc3NlY3QgT01MIEZPTSBBdHRyaWJ1dGVzIGFmdGVyIE9NTCArIEZPTSBoZWFkZXIgKi8KKytzdGF0aWMgZ2ludAorK2Rpc3NlY3Rfb21sX2F0dHJzKHR2YnVmZl90ICp0dmIsIGludCBiYXNlX29mZnMsIHBhY2tldF9pbmZvICpwaW5mbywKKysJCSAgcHJvdG9fdHJlZSAqdHJlZSkKKyt7CisrCWludCBvZmZzZXQgPSBiYXNlX29mZnM7CisrCisrCXdoaWxlICh0dmJfcmVwb3J0ZWRfbGVuZ3RoX3JlbWFpbmluZyh0dmIsIG9mZnNldCkgIT0gMCkgeworKwkJZ3VpbnQgaTsKKysJCWd1aW50OCB0YWcsIHZhbDg7CisrCQlndWludDE2IHZhbDE2OworKwkJZ3VpbnQzMiB2YWwzMjsKKysJCXVuc2lnbmVkIGludCBsZW4sIGxlbl9sZW4sIGhsZW47CisrCQljb25zdCBzdHJ1Y3QgdGx2X2RlZiAqdGRlZjsKKysJCXByb3RvX2l0ZW0gKnRpOworKwkJcHJvdG9fdHJlZSAqYXR0X3RyZWU7CisrCQl0dmJ1ZmZfdCAqc3ViX3R2YjsKKysKKysJCXRhZyA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KTsKKysJCXRkZWYgPSAmbm1fYXR0X3RsdmRlZi5kZWZbdGFnXTsKKysKKysJCXN3aXRjaCAodGRlZi0+dHlwZSkgeworKwkJY2FzZSBUTFZfVFlQRV9GSVhFRDoKKysJCQlobGVuID0gMTsKKysJCQlsZW5fbGVuID0gMDsKKysJCQlsZW4gPSB0ZGVmLT5maXhlZF9sZW47CisrCQkJYnJlYWs7CisrCQljYXNlIFRMVl9UWVBFX1Q6CisrCQkJaGxlbiA9IDE7CisrCQkJbGVuX2xlbiA9IDA7CisrCQkJbGVuID0gMDsKKysJCQlicmVhazsKKysJCWNhc2UgVExWX1RZUEVfVFY6CisrCQkJaGxlbiA9IDE7CisrCQkJbGVuX2xlbiA9IDA7CisrCQkJbGVuID0gMTsKKysJCQlicmVhazsKKysJCWNhc2UgVExWX1RZUEVfVExWOgorKwkJCWhsZW4gPSAyOworKwkJCWxlbl9sZW4gPSAxOworKwkJCWxlbiA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KzEpOworKwkJCWJyZWFrOworKwkJY2FzZSBUTFZfVFlQRV9UTDE2VjoKKysJCQlobGVuID0gMzsKKysJCQlsZW5fbGVuID0gMjsKKysJCQlsZW4gPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCsxKSA8PCA4IHwKKysJCQkJCQl0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCsyKTsKKysJCQlicmVhazsKKysJCWRlZmF1bHQ6CisrCQkJaGxlbiA9IGxlbl9sZW4gPSBsZW4gPSAwOworKwkJCURJU1NFQ1RPUl9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKysJCQlicmVhazsKKysJCX0KKysKKysJCXRpID0gcHJvdG9fdHJlZV9hZGRfaXRlbSh0cmVlLCBoZl9vbWxfZm9tX2F0dHJfdGFnLCB0dmIsCisrCQkJCQkgb2Zmc2V0LCAxLCBGQUxTRSk7CisrCQlhdHRfdHJlZSA9IHByb3RvX2l0ZW1fYWRkX3N1YnRyZWUodGksIGV0dF9vbWxfZm9tX2F0dCk7CisrCQlwcm90b190cmVlX2FkZF91aW50KGF0dF90cmVlLCBoZl9vbWxfZm9tX2F0dHJfbGVuLCB0dmIsCisrCQkJCSAgICBvZmZzZXQrMSwgbGVuX2xlbiwgbGVuKTsKKysJCW9mZnNldCArPSBobGVuOworKworKwkJc3ViX3R2YiA9IHR2Yl9uZXdfc3Vic2V0KHR2Yiwgb2Zmc2V0LCBsZW4sIGxlbik7CisrCisrCQlzd2l0Y2ggKHRhZykgeworKwkJLyogcGFyc2Ugb25seSB0aGUgbW9zdCBjb21tb24gSUUgZm9yIG5vdyAqLworKwkJY2FzZSBOTV9BVFRfQUJJU19DSEFOTkVMOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfYWNoX2J0c3AsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIDEsIFRSVUUpOworKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfYWNoX3RzbG90LCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0KzEsIDEsIFRSVUUpOworKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfYWNoX3NzbG90LCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0KzIsIDEsIFRSVUUpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfQURNX1NUQVRFOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfYWRtX3N0YXRlLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIEZBTFNFKTsKKysJCQl2YWw4ID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQpOworKwkJCWNvbF9hcHBlbmRfZnN0cihwaW5mby0+Y2luZm8sIENPTF9JTkZPLCAiJXMgIiwKKysJCQkJCXZhbF90b19zdHIodmFsOCwgb21sX2FkbV9zdGF0ZV92YWxzLAorKwkJCQkJCSAgICIlMDJ4IikpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfQVJGQ05fTElTVDoKKysJCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDIpIHsKKysJCQkJdmFsMTYgPSB0dmJfZ2V0X250b2hzKHR2Yiwgb2Zmc2V0ICsgaSk7CisrCQkJCXByb3RvX3RyZWVfYWRkX3VpbnQoYXR0X3RyZWUsIGhmX2F0dHJfYXJmY24sCisrCQkJCQkJICAgIHR2Yiwgb2Zmc2V0ICsgaSwgMiwgdmFsMTYpOworKwkJCX0KKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0FWQUlMX1NUQVRVUzoKKysJCQkvKiBBdmFpbGFiaWxpdHkgc3RhdHVzIGNhbiBoYXZlIGxlbmd0aCAwICovCisrCQkJaWYgKGxlbikgeworKwkJCQl2YWw4ID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQpOworKwkJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLAorKwkJCQkJCSAgICBoZl9hdHRyX2F2YWlsX3N0YXRlLCB0dmIsCisrCQkJCQkgICAgCSAgICBvZmZzZXQsIGxlbiwgRkFMU0UpOworKwkJCX0gZWxzZQorKwkJCQl2YWw4ID0gMHhmZjsKKysJCQljb2xfYXBwZW5kX2ZzdHIocGluZm8tPmNpbmZvLCBDT0xfSU5GTywgIiVzICIsCisrCQkJCQl2YWxfdG9fc3RyKHZhbDgsIG9tbF9hdmFpbF9zdGF0ZV92YWxzLAorKwkJCQkJCSAgICIlMDJ4IikpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfQkNDSF9BUkZDTjoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2JjY2hfYXJmY24sIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgVFJVRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9CU0lDOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfYnNpYywgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBUUlVFKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0NIQU5fQ09NQjoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2NoYW5fY29tYiwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBUUlVFKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0VWRU5UX1RZUEU6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9ldmVudF90eXBlLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIFRSVUUpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfR1NNX1RJTUU6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9nc21fdGltZSwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBUUlVFKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX09QRVJfU1RBVEU6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9vcGVyX3N0YXRlLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIEZBTFNFKTsKKysJCQl2YWw4ID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQpOworKwkJCWNvbF9hcHBlbmRfZnN0cihwaW5mby0+Y2luZm8sIENPTF9JTkZPLCAiJXMgIiwKKysJCQkJCXZhbF90b19zdHIodmFsOCwgb21sX29wZXJfc3RhdGVfdmFscywKKysJCQkJCQkgICAiJTAyeCIpKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX1RFSToKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX3RlaSwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBUUlVFKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX1RTQzoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX3RzYywgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBUUlVFKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX1NFVkVSSVRZOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfc2V2ZXJpdHksIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgVFJVRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9URVNUX1JFUE9SVDoKKysJCQlkaXNzZWN0X2lwYWNjX3Rlc3RfcmVwKGF0dF90cmVlLCBzdWJfdHZiKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX1RFU1RfTk86CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl90ZXN0X25vLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIFRSVUUpOworKwkJCXZhbDggPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCk7CisrCQkJY29sX2FwcGVuZF9mc3RyKHBpbmZvLT5jaW5mbywgQ09MX0lORk8sICIlcyAiLAorKwkJCQkJdmFsX3RvX3N0cih2YWw4LCBvbWxfdGVzdF9ub192YWxzLAorKwkJCQkJCSAgICIlMDJ4IikpOworKwkJCWJyZWFrOworKworKwkJLyogcHJvcHJpZXRhcnkgaXAuYWNjZXNzIGV4dGVuc2lvbnMgKi8KKysJCWNhc2UgTk1fQVRUX0lQQUNDX0RTVF9JUDoKKysJCQl2YWwzMiA9IHR2Yl9nZXRfbnRvaGwodHZiLCBvZmZzZXQpOworKwkJCXByb3RvX3RyZWVfYWRkX2lwdjQoYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3JzbF9pcCwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCB2YWwzMik7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9JUEFDQ19EU1RfSVBfUE9SVDoKKysJCQl2YWwxNiA9IHR2Yl9nZXRfbnRvaHModHZiLCBvZmZzZXQpOworKwkJCXByb3RvX3RyZWVfYWRkX3VpbnQoYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3JzbF9wb3J0LCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIHZhbDE2KTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0lQQUNDX0xPQ0FUSU9OOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX2xvY2F0aW9uX25hbWUsCisrCQkJCQkgICAgdHZiLCBvZmZzZXQsIGxlbiwgVFJVRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9JUEFDQ19VTklUX0lEOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3VuaXRfaWQsCisrCQkJCQkgICAgdHZiLCBvZmZzZXQsIGxlbiwgVFJVRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9JUEFDQ19VTklUX05BTUU6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdW5pdF9uYW1lLAorKwkJCQkJICAgIHR2Yiwgb2Zmc2V0LCBsZW4sIFRSVUUpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfSVBBQ0NfUFJJTV9PTUxfQ0ZHX0xJU1Q6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfcHJpbV9vbWxfaXAsCisrCQkJCQkgICAgdHZiLCBvZmZzZXQrMSwgNCwgVFJVRSk7CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfcHJpbV9vbWxfcG9ydCwKKysJCQkJCSAgICB0dmIsIG9mZnNldCsxKzQsIDIsIFRSVUUpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfSVBBQ0NfTlZfRkxBR1M6CisrCQkJeworKwkJCQlndWludCBmbGFncywgbWFzazsKKysJCQkJZmxhZ3MgPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCk7CisrCQkJCW1hc2sgPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCsxKTsKKysJCQkJZmxhZ3MgfD0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQrMikgPDwgODsKKysJCQkJbWFzayB8PSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCszKSA8PCA4OworKwkJCQlwcm90b190cmVlX2FkZF91aW50KGF0dF90cmVlLCBoZl9hdHRyX2lwYV9udl9mbGFncywKKysJCQkJCQkgICAgdHZiLCBvZmZzZXQsIDMsIGZsYWdzKTsKKysJCQkJcHJvdG9fdHJlZV9hZGRfdWludChhdHRfdHJlZSwgaGZfYXR0cl9pcGFfbnZfbWFzaywKKysJCQkJCQkgICAgdHZiLCBvZmZzZXQrMSwgMywgbWFzayk7CisrCQkJfQorKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfSVBBQ0NfUkFDOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3JhYywKKysJCQkJCSAgICB0dmIsIG9mZnNldCwgMSwgVFJVRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9JUEFDQ19OU0VJOgorKwkJCXZhbDE2ID0gdHZiX2dldF9udG9ocyh0dmIsIG9mZnNldCk7CisrCQkJcHJvdG9fdHJlZV9hZGRfdWludChhdHRfdHJlZSwgaGZfYXR0cl9pcGFfbnNlaSwKKysJCQkJCSAgIHR2Yiwgb2Zmc2V0LCAyLCB2YWwxNik7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9JUEFDQ19OU1ZDSToKKysJCQl2YWwxNiA9IHR2Yl9nZXRfbnRvaHModHZiLCBvZmZzZXQpOworKwkJCXByb3RvX3RyZWVfYWRkX3VpbnQoYXR0X3RyZWUsIGhmX2F0dHJfaXBhX25zdmNpLAorKwkJCQkJICAgdHZiLCBvZmZzZXQsIDIsIHZhbDE2KTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0lQQUNDX0JWQ0k6CisrCQkJdmFsMTYgPSB0dmJfZ2V0X250b2hzKHR2Yiwgb2Zmc2V0KTsKKysJCQlwcm90b190cmVlX2FkZF91aW50KGF0dF90cmVlLCBoZl9hdHRyX2lwYV9idmNpLAorKwkJCQkJICAgdHZiLCBvZmZzZXQsIDIsIHZhbDE2KTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0lQQUNDX05TX0xJTktfQ0ZHOgorKwkJCXZhbDE2ID0gdHZiX2dldF9udG9ocyh0dmIsIG9mZnNldCk7CisrCQkJcHJvdG9fdHJlZV9hZGRfdWludChhdHRfdHJlZSwgaGZfYXR0cl9pcGFfbnNsX3Nwb3J0LAorKwkJCQkJICAgdHZiLCBvZmZzZXQsIDIsIHZhbDE2KTsKKysJCQl2YWwzMiA9IHR2Yl9nZXRfaXB2NCh0dmIsIG9mZnNldCsyKTsKKysJCQlwcm90b190cmVlX2FkZF9pcHY0KGF0dF90cmVlLCBoZl9hdHRyX2lwYV9uc2xfZGFkZHIsCisrCQkJCQkgICB0dmIsIG9mZnNldCsyLCA0LCB2YWwzMik7CisrCQkJdmFsMTYgPSB0dmJfZ2V0X250b2hzKHR2Yiwgb2Zmc2V0KzYpOworKwkJCXByb3RvX3RyZWVfYWRkX3VpbnQoYXR0X3RyZWUsIGhmX2F0dHJfaXBhX25zbF9kcG9ydCwKKysJCQkJCSAgIHR2Yiwgb2Zmc2V0KzYsIDIsIHZhbDE2KTsKKysJCQlicmVhazsKKysJCWRlZmF1bHQ6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfb21sX2ZvbV9hdHRyX3ZhbCwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBGQUxTRSk7CisrCQl9CisrCQlvZmZzZXQgKz0gbGVuOworKwl9CisrCXJldHVybiBvZmZzZXQ7CisrfQorKworK3N0YXRpYyBpbnQKKytkaXNzZWN0X29tbF9mb20odHZidWZmX3QgKnR2YiwgcGFja2V0X2luZm8gKnBpbmZvLCBwcm90b190cmVlICp0cmVlLAorKwkJaW50IG9mZnNldCwgcHJvdG9faXRlbSAqdG9wX3RpKQorK3sKKysJZ3VpbnQ4IG1zZ190eXBlLCBvYmpfY2xhc3MsIGJ0c19uciwgdHJ4X25yLCB0c19ucjsKKysJcHJvdG9faXRlbSAqdGk7CisrCXByb3RvX3RyZWUgKmZvbV90cmVlOworKworKwltc2dfdHlwZSA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KTsKKysJb2JqX2NsYXNzID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQrMSk7CisrCWJ0c19uciA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KzIpOworKwl0cnhfbnIgPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCszKTsKKysJdHNfbnIgPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCs0KTsKKysJcHJvdG9faXRlbV9hcHBlbmRfdGV4dCh0b3BfdGksICIsICVzKCUwMngsJTAyeCwlMDJ4KSAlcyAiLAorKwkJCXZhbF90b19zdHIob2JqX2NsYXNzLCBvbWxfZm9tX29iamNsYXNzX3ZhbHMsICIlMDJ4IiksCisrCQkJYnRzX25yLCB0cnhfbnIsIHRzX25yLAorKwkJCXZhbF90b19zdHIobXNnX3R5cGUsIG9tbF9mb21fbXNndHlwZV92YWxzLAorKwkJCQkgICAidW5rbm93biAweCV4IikpOworKwljb2xfYXBwZW5kX2ZzdHIocGluZm8tPmNpbmZvLCBDT0xfSU5GTywgIiVzKCUwMngsJTAyeCwlMDJ4KSAlcyAiLAorKwkJCXZhbF90b19zdHIob2JqX2NsYXNzLCBvbWxfZm9tX29iamNsYXNzX3ZhbHMsICIlMDJ4IiksCisrCQkJYnRzX25yLCB0cnhfbnIsIHRzX25yLAorKwkJCXZhbF90b19zdHIobXNnX3R5cGUsIG9tbF9mb21fbXNndHlwZV92YWxzLAorKwkJCQkgICAidW5rbm93biAweCV4IikpOworKwl0aSA9IHByb3RvX3RyZWVfYWRkX2l0ZW0odHJlZSwgaGZfb21sX2ZvbV9tc2d0eXBlLCB0dmIsIG9mZnNldCsrLCAxLCBGQUxTRSk7CisrCWZvbV90cmVlID0gcHJvdG9faXRlbV9hZGRfc3VidHJlZSh0aSwgZXR0X29tbF9mb20pOworKwlwcm90b190cmVlX2FkZF9pdGVtKGZvbV90cmVlLCBoZl9vbWxfZm9tX29iamNsYXNzLCB0dmIsIG9mZnNldCsrLCAxLCBGQUxTRSk7CisrCXByb3RvX3RyZWVfYWRkX2l0ZW0oZm9tX3RyZWUsIGhmX29tbF9mb21faW5zdF9idHMsIHR2Yiwgb2Zmc2V0KyssIDEsIEZBTFNFKTsKKysJcHJvdG9fdHJlZV9hZGRfaXRlbShmb21fdHJlZSwgaGZfb21sX2ZvbV9pbnN0X3RyeCwgdHZiLCBvZmZzZXQrKywgMSwgRkFMU0UpOworKwlwcm90b190cmVlX2FkZF9pdGVtKGZvbV90cmVlLCBoZl9vbWxfZm9tX2luc3RfdHMsIHR2Yiwgb2Zmc2V0KyssIDEsIEZBTFNFKTsKKysKKysKKysJLyogZGlzc2VjdCB0aGUgVExWIG9iamVjdHMgaW4gdGhlIG1lc3NhZ2UgYm9keSAqLworKwlvZmZzZXQgPSBkaXNzZWN0X29tbF9hdHRycyh0dmIsIG9mZnNldCwgcGluZm8sIGZvbV90cmVlKTsKKysKKysJcmV0dXJuIG9mZnNldDsKKyt9CisrCisrc3RhdGljIGNvbnN0IGd1aW50OCBpcGFjY2Vzc19tYWdpY1tdID0gImNvbS5pcGFjY2VzcyI7CisrCisrc3RhdGljIGludAorK2Rpc3NlY3Rfb21sX21hbnVmKHR2YnVmZl90ICp0dmIsIHBhY2tldF9pbmZvICpwaW5mbywgcHJvdG9fdHJlZSAqdHJlZSwKKysJCSAgaW50IG9mZnNldCwgcHJvdG9faXRlbSAqdG9wX3RpKQorK3sKKysJaWYgKHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KSAhPSAweDBkIHx8CisrCSAgICB0dmJfbWVtZXFsKHR2Yiwgb2Zmc2V0KzEsIGlwYWNjZXNzX21hZ2ljLCBzaXplb2YoaXBhY2Nlc3NfbWFnaWMpKSkKKysJCXJldHVybiBvZmZzZXQ7CisrCisrCW9mZnNldCArPSBzaXplb2YoaXBhY2Nlc3NfbWFnaWMpICsgMTsKKysKKysJcmV0dXJuIGRpc3NlY3Rfb21sX2ZvbSh0dmIsIHBpbmZvLCB0cmVlLCBvZmZzZXQsIHRvcF90aSk7CisrfQorKworK3N0YXRpYyB2b2lkCisrZGlzc2VjdF9hYmlzX29tbCh0dmJ1ZmZfdCAqdHZiLCBwYWNrZXRfaW5mbyAqcGluZm8sIHByb3RvX3RyZWUgKnRyZWUpCisreworKwlwcm90b19pdGVtICp0aTsKKysJcHJvdG9fdHJlZSAqb21sX3RyZWU7CisrCisrCWludCBvZmZzZXQgPSAwOworKworKwljb2xfc2V0X3N0cihwaW5mby0+Y2luZm8sIENPTF9QUk9UT0NPTCwgIk9NTCIpOworKworKwl0b3BfdHJlZSA9IHRyZWU7CisrCWlmICh0cmVlKSB7CisrCQl1X2ludDhfdCBtc2dfZGlzYyA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KTsKKysKKysJCXRpID0gcHJvdG9fdHJlZV9hZGRfaXRlbSh0cmVlLCBwcm90b19hYmlzX29tbCwgdHZiLCAwLCAtMSwgRkFMU0UpOworKwkJb21sX3RyZWUgPSBwcm90b19pdGVtX2FkZF9zdWJ0cmVlKHRpLCBldHRfb21sKTsKKysKKysJCXByb3RvX3RyZWVfYWRkX2l0ZW0ob21sX3RyZWUsIGhmX29tbF9tc2dfZGlzYywgdHZiLCBvZmZzZXQrKywKKysJCQkJICAgIDEsIFRSVUUpOworKwkJcHJvdG9fdHJlZV9hZGRfaXRlbShvbWxfdHJlZSwgaGZfb21sX3BsYWNlbWVudCwgdHZiLCBvZmZzZXQrKywKKysJCQkJICAgIDEsIFRSVUUpOworKwkJcHJvdG9fdHJlZV9hZGRfaXRlbShvbWxfdHJlZSwgaGZfb21sX3NlcXVlbmNlLCB0dmIsIG9mZnNldCsrLAorKwkJCQkgICAgMSwgVFJVRSk7CisrCQlwcm90b190cmVlX2FkZF9pdGVtKG9tbF90cmVlLCBoZl9vbWxfbGVuZ3RoLCB0dmIsIG9mZnNldCsrLAorKwkJCQkgICAgMSwgVFJVRSk7CisrCisrCQlzd2l0Y2ggKG1zZ19kaXNjKSB7CisrCQljYXNlIEFCSVNfT01fTURJU0NfRk9NOgorKwkJCW9mZnNldCA9IGRpc3NlY3Rfb21sX2ZvbSh0dmIsIHBpbmZvLCBvbWxfdHJlZSwKKysJCQkJCQkgb2Zmc2V0LCB0aSk7CisrCQkJYnJlYWs7CisrCQljYXNlIEFCSVNfT01fTURJU0NfTUFOVUY6CisrCQkJb2Zmc2V0ID0gZGlzc2VjdF9vbWxfbWFudWYodHZiLCBwaW5mbywgb21sX3RyZWUsCQkJCQkJCSAgICAgICBvZmZzZXQsIHRpKTsKKysJCQlicmVhazsKKysJCWNhc2UgQUJJU19PTV9NRElTQ19NTUk6CisrCQljYXNlIEFCSVNfT01fTURJU0NfVFJBVToKKysJCWRlZmF1bHQ6CisrCQkJYnJlYWs7CisrCQl9CisrCX0KKyt9CisrCisrdm9pZAorK3Byb3RvX3JlZ19oYW5kb2ZmX2FiaXNfb21sKHZvaWQpOworKworK3ZvaWQKKytwcm90b19yZWdpc3Rlcl9hYmlzX29tbCh2b2lkKQorK3sKKysJc3RhdGljIGhmX3JlZ2lzdGVyX2luZm8gaGZbXSA9IHsKKysJCXsgJmhmX29tbF9tc2dfZGlzYywKKysJCQl7ICJNZXNzYWdlIERpc2NyaW1pbmF0b3IiLCAib21sLm1zZ19kc2MiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBWQUxTKG9tbF9tc2dfZGlzY192YWxzKSwgMCwKKysJCQkgICJHU00gMTIuMjEgTWVzc2FnZSBEaXNjcmltaW5hdG9yIiwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX29tbF9wbGFjZW1lbnQsCisrCQkJeyAiUGxhY2VtZW50IEluZGljYXRvciIsICJvbWwucGxhY2VtZW50IiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhvbWxfcGxhY2VtZW50X3ZhbHMpLCAwLAorKwkJCSAgIkdTTSAxMi4yMSBQbGFjZW1lbnQgSW5kaWNhdG9yIiwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX29tbF9zZXF1ZW5jZSwKKysJCQl7ICJTZXF1ZW5jZSBOdW1iZXIiLCAib21sLnNlcXVlbmNlIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgTlVMTCwgMCwKKysJCQkgICJTZXF1ZW5jZSBOdW1iZXIgKGlmIG11bHRpLXBhcnQgbXNnKSIsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9vbWxfbGVuZ3RoLAorKwkJCXsgIkxlbmd0aCBJbmRpY2F0b3IiLCAib21sLmxlbmd0aCIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9ERUMsIE5VTEwsIDAsCisrCQkJICAiVG90YWwgbGVuZ3RoIG9mIHBheWxvYWQiLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfb21sX2ZvbV9tc2d0eXBlLAorKwkJCXsgIkZPTSBNZXNzYWdlIFR5cGUiLCAib21sLmZvbS5tc2dfdHlwZSIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIFZBTFMob21sX2ZvbV9tc2d0eXBlX3ZhbHMpLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX29tbF9mb21fb2JqY2xhc3MsCisrCQkJeyAiRk9NIE9iamVjdCBDbGFzcyIsICJvbWwuZm9tLm9ial9jbGFzcyIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIFZBTFMob21sX2ZvbV9vYmpjbGFzc192YWxzKSwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9vbWxfZm9tX2luc3RfYnRzLAorKwkJCXsgIkZPTSBPYmplY3QgSW5zdGFuY2UgQlRTIiwgIm9tbC5mb20ub2JqX2luc3QuYnRzIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0RFQywgTlVMTCwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9vbWxfZm9tX2luc3RfdHJ4LAorKwkJCXsgIkZPTSBPYmplY3QgSW5zdGFuY2UgVFJYIiwgIm9tbC5mb20ub2JqX2luc3QudHJ4IiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0RFQywgTlVMTCwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9vbWxfZm9tX2luc3RfdHMsCisrCQkJeyAiRk9NIE9iamVjdCBJbnN0YW5jZSBUUyIsICJvbWwuZm9tLm9ial9pbnN0LnRzIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0RFQywgTlVMTCwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9vbWxfZm9tX2F0dHJfdGFnLAorKwkJCXsgIkZPTSBBdHRyaWJ1dGUgSUQiLCAib21sLmZvbS5hdHRyX2lkIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhvbWxfZm9tX2F0dHJfdmFscyksIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfb21sX2ZvbV9hdHRyX2xlbiwKKysJCQl7ICJGT00gQXR0cmlidXRlIExlbmd0aCIsICJvbWwuZm9tLmF0dHJfbGVuIiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfb21sX2ZvbV9hdHRyX3ZhbCwKKysJCQl7ICJGT00gQXR0cmlidXRlIFZhbHVlIiwgIm9tbC5mb20uYXR0cl92YWwiLAorKwkJCSAgRlRfQllURVMsIEJBU0VfTk9ORSwgTlVMTCwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCisrCisrCisrCQkvKiBPTUwgQXR0cmlidXRlcyAqLworKwkJeyAmaGZfYXR0cl9hZG1fc3RhdGUsCisrCQkJeyAiQWRtaW5pc3RyYXRpdmUgU3RhdGUiLCAib21sLmZvbS5hdHRyLmFkbV9zdGF0ZSIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIFZBTFMob21sX2FkbV9zdGF0ZV92YWxzKSwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2FyZmNuLAorKwkJCXsgIkFSRkNOIiwgIm9tbC5mb20uYXR0ci5hcmZjbiIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9vcGVyX3N0YXRlLAorKwkJCXsgIk9wZXJhdGlvbmFsIFN0YXRlIiwgIm9tbC5mb20uYXR0ci5vcGVyX3N0YXRlIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhvbWxfb3Blcl9zdGF0ZV92YWxzKSwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2F2YWlsX3N0YXRlLAorKwkJCXsgIkF2YWlsYWJpbGl0eSBTdGF0dXMiLCAib21sLmZvbS5hdHRyLmF2YWlsX3N0YXRlIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhvbWxfYXZhaWxfc3RhdGVfdmFscyksIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9ldmVudF90eXBlLAorKwkJCXsgIkV2ZW50IFR5cGUiLCAib21sLmZvbS5hdHRyLmV2ZW50X3R5cGUiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBWQUxTKG9tbF9ldmVudF90eXBlX3ZhbHMpLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfc2V2ZXJpdHksCisrCQkJeyAiU2V2ZXJpdHkiLCAib21sLmZvbS5hdHRyLnNldmVyaXR5IiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhvbWxfc2V2ZXJpdHlfdmFscyksIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9iY2NoX2FyZmNuLAorKwkJCXsgIkJDQ0ggQVJGQ04iLCAib21sLmZvbS5hdHRyLmJjY2hfYXJmY24iLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0RFQywgTlVMTCwgMCwKKysJCQkgICJBUkZDTiBvZiB0aGUgQkNDSCIsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2JzaWMsCisrCQkJeyAiQlNJQyIsICJvbWwuZm9tLmF0dHIuYnNpYyIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfSEVYLCBOVUxMLCAwLAorKwkJCSAgIkJhc2UgU3RhdGlvbiBJZGVudGl0eSBDZG9lIiwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfdGVzdF9ubywKKysJCQl7ICJUZXN0IE51bWJlciIsICJvbWwuZm9tLmF0dHIudGVzdF9ubyIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIFZBTFMob21sX3Rlc3Rfbm9fdmFscyksIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl90c2MsCisrCQkJeyAiVFNDIiwgIm9tbC5mb20uYXR0ci50c2MiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBOVUxMLCAwLAorKwkJCSAgIlRyYWluaW5nIFNlcXVlbmNlIENvZGUiLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl90ZWksCisrCQkJeyAiVEVJIiwgIm9tbC5mb20uYXR0ci50ZWkiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfREVDLCBOVUxMLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfYWNoX2J0c3AsCisrCQkJeyAiQlRTIEUxIFBvcnQiLCAib21sLmZvbS5hdHRyLmFiaXNfY2guYnRzX3BvcnQiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfREVDLCBOVUxMLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfYWNoX3RzbG90LAorKwkJCXsgIkUxIFRpbWVzbG90IiwgIm9tbC5mb20uYXR0ci5hYmlzX2NoLnRpbWVzbG90IiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0RFQywgTlVMTCwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2FjaF9zc2xvdCwKKysJCQl7ICJFMSBTdWJzbG90IiwgIm9tbC5mb20uYXR0ci5hYmlzX2NoLnN1YnNsb3QiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfREVDLCBOVUxMLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfZ3NtX3RpbWUsCisrCQkJeyAiR1NNIFRpbWUiLCAib21sLmZvbS5hdHRyLmdzbV90aW1lIiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDAsCisrCQkJICAiR1NNIFRpbWUiLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9jaGFuX2NvbWIsCisrCQkJeyAiQ2hhbm5lbCBDb21iaW5hdGlvbiIsICJvbWwuZm9tLmF0dHIuY2hhbl9jb21iIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhvbWxfY2hhbl9jb21iX3ZhbHMpLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCS8qIElQIEFjY2VzcyAqLworKwkJeyAmaGZfb21sX2lwYV90cmVzX2F0dHJfdGFnLAorKwkJCXsgIklQQSBUZXN0IFJlc3VsdCBFbWJlZGRlZCBJRSIsCisrCQkJCQkJIm9tbC5mb20udGVzdHJlcC5pcGFfdGFnIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhpcGFjY190ZXN0cmVzX2llX3ZhbHMpLCAwLAorKwkJCSAgIkluZm9ybWF0aW9uIEVsZW1lbnQgZW1iZWRkZWQgaW50byB0aGUgVGVzdCBSZXN1bHQgIgorKwkJCSAgIm9mIGlwLmFjY2VzcyBCVFMiLCBIRklMTCB9LAorKwkJfSwKKysJCXsgJmhmX29tbF9pcGFfdHJlc19hdHRyX2xlbiwKKysJCQl7ICJJUEEgVGVzdCBSZXN1bHQgRW1iZWRkZWQgSUUgTGVuZ3RoIiwKKysJCQkJCQkib21sLmZvbS50ZXN0cmVwLmlwYV9sZW4iLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0RFQywgTlVMTCwgMCwKKysJCQkgICJMZW5ndGggb2YgaXAuYWNjZXNzIFRlc3QgUmVzdWx0IEVtYmVkZGVkIElFIiwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3Rlc3RfcmVzLAorKwkJCXsgIklQQSBUZXN0IFJlc3VsdCIsICJvbWwuZm9tLnRlc3RyZXAucmVzdWx0IiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0RFQywgVkFMUyhpcGFjY190ZXN0X3Jlc192YWxzKSwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV90cl9yeGxldiwKKysJCQl7ICJSeCBMZXZlbCIsICJvbWwuZm9tLnRlc3RyZXAuaXBhX3J4bGV2IiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDB4ZmMwMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3RyX2JfcnhsZXYsCisrCQkJeyAiUnggTGV2ZWwiLCAib21sLmZvbS50ZXN0cmVwLmlwYV9yeGxldl9iIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0RFQywgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3RyX2FyZmNuLAorKwkJCXsgIkFSRkNOIiwgIm9tbC5mb20udGVzdHJlcC5pcGFfYXJmY24iLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0RFQywgTlVMTCwgMHgwM2ZmLCAiQVJGQ04iLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdHJfZl9xdWFsLAorKwkJCXsgIkZyZXF1ZW5jeSBRdWFsaXR5IiwgIm9tbC5mb20udGVzdHJlcC5pcGEuZnJlcV9xdWFsIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0RFQywgTlVMTCwgMHhmYywgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3RyX2ZfZXJyLAorKwkJCXsgIkZyZXF1ZW5jeSBFcnJvciIsICJvbWwuZm9tLnRlc3RyZXAuaXBhLmZyZXFfZXJyIiwKKysJCQkgIEZUX0lOVDE2LCBCQVNFX0RFQywgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3RyX3J4cXVhbCwKKysJCQl7ICJSeCBRdWFsaXR5IiwgIm9tbC5mb20udGVzdHJlcC5pcGEucnhfcXVhbCIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9ERUMsIE5VTEwsIDB4NywgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3RyX2ZyYW1lX29mZnMsCisrCQkJeyAiRnJhbWUgT2Zmc2V0IiwgIm9tbC5mb20udGVzdHJlcC5pcGEuZnJhbWVfb2Zmc2V0IiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV90cl9mcmFtZW5yX29mZnMsCisrCQkJeyAiRnJhbWUgTnVtYmVyIE9mZnNldCIsCisrCQkJCQkib21sLmZvbS50ZXN0cmVwLmlwYS5mcmFtZW5yX29mZnNldCIsCisrCQkJICBGVF9VSU5UMzIsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdHJfYnNpYywKKysJCQl7ICJCU0lDIiwgIm9tbC5mb20udGVzdHJlcC5pcGEuYnNpYyIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9ERUMsIE5VTEwsIDB4M2YsCisrCQkJICAiQmFzZSBTdGF0aW9uIElkZW50aXR5IENvZGUiLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdHJfY2VsbF9pZCwKKysJCQl7ICJDZWxsIElEIiwgIm9tbC5mb20udGVzdHJlcC5pcGEuY2VsbF9pZCIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfSEVYLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfcnNsX2lwLAorKwkJCXsgIkJTQyBSU0wgSVAgQWRkcmVzcyIsICJvbWwuZm9tLmF0dHIuaXBhLnJzbF9pcCIsCisrCQkJICBGVF9JUHY0LCBCQVNFX05PTkUsIE5VTEwsIDAsCisrCQkJICAiSVAgQWRkcmVzcyB0byB3aGljaCB0aGUgQlRTIGVzdGFibGlzaGVzICIKKysJCQkgICJ0aGUgUlNMIGxpbmsiLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfcnNsX3BvcnQsCisrCQkJeyAiQlNDIFJTTCBUQ1AgUG9ydCIsICJvbWwuZm9tLmF0dHIuaXBhLnJzbF9wb3J0IiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDAsCisrCQkJICAiUG9ydCBudW1iZXIgdG8gd2hpY2ggdGhlIEJTVCBlc3RhYmxpc2hlcyAiCisrCQkJICAidGhlIFJTTCBsaW5rIiwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3ByaW1fb21sX2lwLAorKwkJCXsgIlByaW1hcnkgT01MIElQIEFkZHJlc3MiLAorKwkJCQkJIm9tbC5mb20uYXR0ci5pcGEucHJpbV9vbWxfaXAiLAorKwkJCSAgRlRfSVB2NCwgQkFTRV9OT05FLCBOVUxMLCAwLAorKwkJCSAgIklQIEFkZHJlc3Mgb2YgdGhlIEJTQyBmb3IgdGhlIHByaW1hcnkgT01MIGxpbmsiLAorKwkJCSAgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3ByaW1fb21sX3BvcnQsCisrCQkJeyAiUHJpbWFyeSBPTUwgVENQIFBvcnQiLAorKwkJCQkJIm9tbC5mb20uYXR0ci5pcGEucHJpbV9vbWxfcG9ydCIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAwLAorKwkJCSAgIlRDUCBQb3J0IG9mIHRoZSBCU0MgZm9yIHRoZSBwcmltYXJseSBPTUwgbGluayIsCisrCQkJICBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfbG9jYXRpb25fbmFtZSwKKysJCQl7ICJMb2NhdGlvbiBOYW1lIiwgIm9tbC5mb20uYXR0ci5pcGEubG9jX25hbWUiLAorKwkJCSAgRlRfU1RSSU5HLCBCQVNFX05PTkUsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV91bml0X25hbWUsCisrCQkJeyAiVW5pdCBOYW1lIiwgIm9tbC5mb20uYXR0ci5pcGEudW5pdF9uYW1lIiwKKysJCQkgIEZUX1NUUklORywgQkFTRV9OT05FLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdW5pdF9pZCwKKysJCQl7ICJVbml0IElEIiwgIm9tbC5mb20uYXR0ci5pcGEudW5pdF9pZCIsCisrCQkJICBGVF9TVFJJTkcsIEJBU0VfTk9ORSwgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX252X2ZsYWdzLAorKwkJCXsgIk5WUkFNIENvbmZpZyBGbGFncyIsICJvbWwuZm9tLmF0dHIuaXBhLm52X2ZsYWdzIiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9IRVgsIE5VTEwsIDB4ZmZmZiwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX252X21hc2ssCisrCQkJeyAiTlZSQU0gQ29uZmlnIE1hc2siLCAib21sLmZvbS5hdHRyLmlwYS5udl9tYXNrIiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9IRVgsIE5VTEwsIDB4ZmZmZiwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3RyX3NpMiwKKysJCQl7ICJTeXN0ZW0gSW5mb3JtYXRpb24gMiIsICJvbWwuZm9tLmF0dHIuaXBhLnNpMiIsCisrCQkJICBGVF9CWVRFUywgQkFTRV9OT05FLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdHJfc2kyYmlzLAorKwkJCXsgIlN5c3RlbSBJbmZvcm1hdGlvbiAyYmlzIiwgIm9tbC5mb20uYXR0ci5pcGEuc2kyYmlzIiwKKysJCQkgIEZUX0JZVEVTLCBCQVNFX05PTkUsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV90cl9zaTJ0ZXIsCisrCQkJeyAiU3lzdGVtIEluZm9ybWF0aW9uIDJ0ZXIiLCAib21sLmZvbS5hdHRyLmlwYS5zaTJ0ZXIiLAorKwkJCSAgRlRfQllURVMsIEJBU0VfTk9ORSwgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3RyX2NoYW5fZGVzYywKKysJCQl7ICJDZWxsIENoYW5uZWwgRGVzY3JpcHRpb24iLAorKwkJCQkJCSJvbWwuZm9tLmF0dHIuaXBhLmNoYW5fZGVzYyIsCisrCQkJICBGVF9CWVRFUywgQkFTRV9OT05FLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfbnNsX3Nwb3J0LAorKwkJCXsgIk5TIExpbmsgSVAgU291cmNlIFBvcnQiLAorKwkJCQkJCSJvbWwuZm9tLmF0dHIuaXBhLm5zbF9zcG9ydCIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfbnNsX2RhZGRyLAorKwkJCXsgIk5TIExpbmsgSVAgRGVzdGluYXRpb24gQWRkciIsCisrCQkJCQkJIm9tbC5mb20uYXR0ci5pcGEubnNsX2RhZGRyIiwKKysJCQkgIEZUX0lQdjQsIEJBU0VfTk9ORSwgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX25zbF9kcG9ydCwKKysJCQl7ICJOUyBMaW5rIElQIERlc3RpbmF0aW9uIFBvcnQiLAorKwkJCQkJCSJvbWwuZm9tLmF0dHIuaXBhLm5zbF9kcG9ydCIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfbnNlaSwKKysJCQl7ICJOU0VJIiwgIm9tbC5mb20uYXR0ci5pcGEubnNlaSIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfbnN2Y2ksCisrCQkJeyAiTlNWQ0kiLCAib21sLmZvbS5hdHRyLmlwYS5uc3ZjaSIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfYnZjaSwKKysJCQl7ICJCVkNJIiwgIm9tbC5mb20uYXR0ci5pcGEuYnZjaSIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfcmFjLAorKwkJCXsgIlJBQyIsICJvbWwuZm9tLmF0dHIuaXBhLnJhYyIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIE5VTEwsIDAsCisrCQkJICAiUm91dGluZyBBcmVhIENvZGUiLCBIRklMTCB9CisrCQl9LAorKwl9OworKwlzdGF0aWMgZ2ludCAqZXR0W10gPSB7CisrCQkmZXR0X29tbCwKKysJCSZldHRfb21sX2ZvbSwKKysJCSZldHRfb21sX2ZvbV9hdHQsCisrCX07CisrCisrCW1vZHVsZV90ICpvbWxfbW9kdWxlOworKworKwlwcm90b19hYmlzX29tbCA9IHByb3RvX3JlZ2lzdGVyX3Byb3RvY29sKCJHU00gQS1iaXMgT01MIiwgIk9NTCIsCisrCQkJCQkJICJnc21fYWJpc19vbWwiKTsKKysKKysJcHJvdG9fcmVnaXN0ZXJfZmllbGRfYXJyYXkocHJvdG9fYWJpc19vbWwsIGhmLCBhcnJheV9sZW5ndGgoaGYpKTsKKysKKysJcHJvdG9fcmVnaXN0ZXJfc3VidHJlZV9hcnJheShldHQsIGFycmF5X2xlbmd0aChldHQpKTsKKysKKysJcmVnaXN0ZXJfZGlzc2VjdG9yKCJnc21fYWJpc19vbWwiLCBkaXNzZWN0X2FiaXNfb21sLCBwcm90b19hYmlzX29tbCk7CisrCisrCisrCW9tbF9tb2R1bGUgPSBwcmVmc19yZWdpc3Rlcl9wcm90b2NvbChwcm90b19hYmlzX29tbCwgcHJvdG9fcmVnX2hhbmRvZmZfYWJpc19vbWwpOworKwlwcmVmc19yZWdpc3Rlcl9ib29sX3ByZWZlcmVuY2Uob21sX21vZHVsZSwgInVzZV9pcGFjY2Vzc19vbWwiLAorKwkJICAgICJVc2UgbmFub0JUUyBkZWZpbml0aW9ucyIsCisrCQkgICAgIlVzZSBpcGFjY2VzcyBuYW5vQlRTIHNwZWNpZmljIGRlZmluaXRpb25zIGZvciBPTUwiLAorKwkJICAgICZnbG9iYWxfb21sX3VzZV9uYW5vX2J0cyk7CisrfQorKworK3ZvaWQKKytwcm90b19yZWdfaGFuZG9mZl9hYmlzX29tbCh2b2lkKQorK3sKKysJZGlzc2VjdG9yX2hhbmRsZV90IGFiaXNfb21sX2hhbmRsZTsKKysKKysJYWJpc19vbWxfaGFuZGxlID0gY3JlYXRlX2Rpc3NlY3Rvcl9oYW5kbGUoZGlzc2VjdF9hYmlzX29tbCwgcHJvdG9fYWJpc19vbWwpOworKwlkaXNzZWN0b3JfYWRkKCJsYXBkLmdzbS5zYXBpIiwgTEFQRF9HU01fU0FQSV9PTV9QUk9DLCBhYmlzX29tbF9oYW5kbGUpOworK30KK0luZGV4OiB3aXJlc2hhcmsvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1nc21fYWJpc19vbWwuaAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tIC9kZXYvbnVsbAorKysrIHdpcmVzaGFyay9lcGFuL2Rpc3NlY3RvcnMvcGFja2V0LWdzbV9hYmlzX29tbC5oCitAQCAtMCwwICsxLDc4NiBAQAorKy8qIEdTTSBOZXR3b3JrIE1hbmFnZW1lbnQgbWVzc2FnZXMgb24gdGhlIEEtYmlzIGludGVyZmFjZQorKyAqIDNHUFAgVFMgMTIuMjEgdmVyc2lvbiA4LjAuMCBSZWxlYXNlIDE5OTkgLyBFVFNJIFRTIDEwMCA2MjMgVjguMC4wICovCisrCisrLyogKEMpIDIwMDgtMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKysgKgorKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisrICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKysgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisrICoKKysgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKysgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKysgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKyAqCisrICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKysgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisrICoKKysgKi8KKysKKysjaWZuZGVmIF9fUEFDS0VUX0FCSVNfT01MX0hfXworKyNkZWZpbmUgX19QQUNLRVRfQUJJU19PTUxfSF9fCisrCisrI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorKworKy8qIEZyb20gb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvYWJpc19ubS5oICovCisrCisrLyogZ2VuZXJpYyBoZWFkZXIgaW4gZnJvbnQgb2YgZXZlcnkgT01MIG1lc3NhZ2UgYWNjb3JkaW5nIHRvIFRTIDA4LjU5ICovCisrc3RydWN0IGFiaXNfb21faGRyIHsKKysJZ3VpbnQ4CW1kaXNjOworKwlndWludDgJcGxhY2VtZW50OworKwlndWludDgJc2VxdWVuY2U7CisrCWd1aW50OAlsZW5ndGg7CisrCWd1aW50OAlkYXRhWzBdOworK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworKworKyNkZWZpbmUgQUJJU19PTV9NRElTQ19GT00JCTB4ODAKKysjZGVmaW5lIEFCSVNfT01fTURJU0NfTU1JCQkweDQwCisrI2RlZmluZSBBQklTX09NX01ESVNDX1RSQVUJCTB4MjAKKysjZGVmaW5lIEFCSVNfT01fTURJU0NfTUFOVUYJCTB4MTAKKysjZGVmaW5lIEFCSVNfT01fUExBQ0VNRU5UX09OTFkJCTB4ODAKKysjZGVmaW5lIEFCSVNfT01fUExBQ0VNRU5UX0ZJUlNUIAkweDQwCisrI2RlZmluZSBBQklTX09NX1BMQUNFTUVOVF9NSURETEUJMHgyMAorKyNkZWZpbmUgQUJJU19PTV9QTEFDRU1FTlRfTEFTVAkJMHgxMAorKworK3N0cnVjdCBhYmlzX29tX29ial9pbnN0IHsKKysJZ3VpbnQ4CWJ0c19ucjsKKysJZ3VpbnQ4CXRyeF9ucjsKKysJZ3VpbnQ4CXRzX25yOworK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworKworK3N0cnVjdCBhYmlzX29tX2ZvbV9oZHIgeworKwlndWludDgJbXNnX3R5cGU7CisrCWd1aW50OAlvYmpfY2xhc3M7CisrCXN0cnVjdCBhYmlzX29tX29ial9pbnN0CW9ial9pbnN0OworKwlndWludDgJZGF0YVswXTsKKyt9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKysKKysjZGVmaW5lIEFCSVNfT01fRk9NX0hEUl9TSVpFCShzaXplb2Yoc3RydWN0IGFiaXNfb21faGRyKSArIHNpemVvZihzdHJ1Y3QgYWJpc19vbV9mb21faGRyKSkKKysKKysvKiBTZWN0aW9uIDkuMTogTWVzc2FnZSBUeXBlcyAqLworK2VudW0gYWJpc19ubV9tc2d0eXBlIHsKKysJLyogU1cgRG93bmxvYWQgTWFuYWdlbWVudCBNZXNzYWdlcyAqLworKwlOTV9NVF9MT0FEX0lOSVQJCQk9IDB4MDEsCisrCU5NX01UX0xPQURfSU5JVF9BQ0ssCisrCU5NX01UX0xPQURfSU5JVF9OQUNLLAorKwlOTV9NVF9MT0FEX1NFRywKKysJTk1fTVRfTE9BRF9TRUdfQUNLLAorKwlOTV9NVF9MT0FEX0FCT1JULAorKwlOTV9NVF9MT0FEX0VORCwKKysJTk1fTVRfTE9BRF9FTkRfQUNLLAorKwlOTV9NVF9MT0FEX0VORF9OQUNLLAorKwlOTV9NVF9TV19BQ1RfUkVRLAkJLyogQlRTLT5CU0MgKi8KKysJTk1fTVRfU1dfQUNUX1JFUV9BQ0ssCisrCU5NX01UX1NXX0FDVF9SRVFfTkFDSywKKysJTk1fTVRfQUNUSVZBVEVfU1csCQkvKiBCU0MtPkJUUyAqLworKwlOTV9NVF9BQ1RJVkFURV9TV19BQ0ssCisrCU5NX01UX0FDVElWQVRFX1NXX05BQ0ssCisrCU5NX01UX1NXX0FDVElWQVRFRF9SRVAsCQkvKiAweDEwICovCisrCS8qIEEtYmlzIEludGVyZmFjZSBNYW5hZ2VtZW50IE1lc3NhZ2VzICovCisrCU5NX01UX0VTVEFCTElTSF9URUkJCT0gMHgyMSwKKysJTk1fTVRfRVNUQUJMSVNIX1RFSV9BQ0ssCisrCU5NX01UX0VTVEFCTElTSF9URUlfTkFDSywKKysJTk1fTVRfQ09OTl9URVJSX1NJR04sCisrCU5NX01UX0NPTk5fVEVSUl9TSUdOX0FDSywKKysJTk1fTVRfQ09OTl9URVJSX1NJR05fTkFDSywKKysJTk1fTVRfRElTQ19URVJSX1NJR04sCisrCU5NX01UX0RJU0NfVEVSUl9TSUdOX0FDSywKKysJTk1fTVRfRElTQ19URVJSX1NJR05fTkFDSywKKysJTk1fTVRfQ09OTl9URVJSX1RSQUYsCisrCU5NX01UX0NPTk5fVEVSUl9UUkFGX0FDSywKKysJTk1fTVRfQ09OTl9URVJSX1RSQUZfTkFDSywKKysJTk1fTVRfRElTQ19URVJSX1RSQUYsCisrCU5NX01UX0RJU0NfVEVSUl9UUkFGX0FDSywKKysJTk1fTVRfRElTQ19URVJSX1RSQUZfTkFDSywKKysJLyogVHJhbnNtaXNzaW9uIE1hbmFnZW1lbnQgTWVzc2FnZXMgKi8KKysJTk1fTVRfQ09OTl9NRFJPUF9MSU5LCQk9IDB4MzEsCisrCU5NX01UX0NPTk5fTURST1BfTElOS19BQ0ssCisrCU5NX01UX0NPTk5fTURST1BfTElOS19OQUNLLAorKwlOTV9NVF9ESVNDX01EUk9QX0xJTkssCisrCU5NX01UX0RJU0NfTURST1BfTElOS19BQ0ssCisrCU5NX01UX0RJU0NfTURST1BfTElOS19OQUNLLAorKwkvKiBBaXIgSW50ZXJmYWNlIE1hbmFnZW1lbnQgTWVzc2FnZXMgKi8KKysJTk1fTVRfU0VUX0JUU19BVFRSCQk9IDB4NDEsCisrCU5NX01UX1NFVF9CVFNfQVRUUl9BQ0ssCisrCU5NX01UX1NFVF9CVFNfQVRUUl9OQUNLLAorKwlOTV9NVF9TRVRfUkFESU9fQVRUUiwKKysJTk1fTVRfU0VUX1JBRElPX0FUVFJfQUNLLAorKwlOTV9NVF9TRVRfUkFESU9fQVRUUl9OQUNLLAorKwlOTV9NVF9TRVRfQ0hBTl9BVFRSLAorKwlOTV9NVF9TRVRfQ0hBTl9BVFRSX0FDSywKKysJTk1fTVRfU0VUX0NIQU5fQVRUUl9OQUNLLAorKwkvKiBUZXN0IE1hbmFnZW1lbnQgTWVzc2FnZXMgKi8KKysJTk1fTVRfUEVSRl9URVNUCQkJPSAweDUxLAorKwlOTV9NVF9QRVJGX1RFU1RfQUNLLAorKwlOTV9NVF9QRVJGX1RFU1RfTkFDSywKKysJTk1fTVRfVEVTVF9SRVAsCisrCU5NX01UX1NFTkRfVEVTVF9SRVAsCisrCU5NX01UX1NFTkRfVEVTVF9SRVBfQUNLLAorKwlOTV9NVF9TRU5EX1RFU1RfUkVQX05BQ0ssCisrCU5NX01UX1NUT1BfVEVTVCwKKysJTk1fTVRfU1RPUF9URVNUX0FDSywKKysJTk1fTVRfU1RPUF9URVNUX05BQ0ssCisrCS8qIFN0YXRlIE1hbmFnZW1lbnQgYW5kIEV2ZW50IFJlcG9ydCBNZXNzYWdlcyAqLworKwlOTV9NVF9TVEFURUNIR19FVkVOVF9SRVAJPSAweDYxLAorKwlOTV9NVF9GQUlMVVJFX0VWRU5UX1JFUCwKKysJTk1fTVRfU1RPUF9FVkVOVF9SRVAsCisrCU5NX01UX1NUT1BfRVZFTlRfUkVQX0FDSywKKysJTk1fTVRfU1RPUF9FVkVOVF9SRVBfTkFDSywKKysJTk1fTVRfUkVTVF9FVkVOVF9SRVAsCisrCU5NX01UX1JFU1RfRVZFTlRfUkVQX0FDSywKKysJTk1fTVRfUkVTVF9FVkVOVF9SRVBfTkFDSywKKysJTk1fTVRfQ0hHX0FETV9TVEFURSwKKysJTk1fTVRfQ0hHX0FETV9TVEFURV9BQ0ssCisrCU5NX01UX0NIR19BRE1fU1RBVEVfTkFDSywKKysJTk1fTVRfQ0hHX0FETV9TVEFURV9SRVEsCisrCU5NX01UX0NIR19BRE1fU1RBVEVfUkVRX0FDSywKKysJTk1fTVRfQ0hHX0FETV9TVEFURV9SRVFfTkFDSywKKysJTk1fTVRfUkVQX09VVFNUX0FMQVJNUwkJPSAweDkzLAorKwlOTV9NVF9SRVBfT1VUU1RfQUxBUk1TX0FDSywKKysJTk1fTVRfUkVQX09VVFNUX0FMQVJNU19OQUNLLAorKwkvKiBFcXVpcG1lbnQgTWFuYWdlbWVudCBNZXNzYWdlcyAqLworKwlOTV9NVF9DSEFOR0VPVkVSCQk9IDB4NzEsCisrCU5NX01UX0NIQU5HRU9WRVJfQUNLLAorKwlOTV9NVF9DSEFOR0VPVkVSX05BQ0ssCisrCU5NX01UX09QU1RBUlQsCisrCU5NX01UX09QU1RBUlRfQUNLLAorKwlOTV9NVF9PUFNUQVJUX05BQ0ssCisrCU5NX01UX1JFSU5JVCwKKysJTk1fTVRfUkVJTklUX0FDSywKKysJTk1fTVRfUkVJTklUX05BQ0ssCisrCU5NX01UX1NFVF9TSVRFX09VVCwJCS8qIEJTMTE6IGdldCBhbGFybSA/IT8gKi8KKysJTk1fTVRfU0VUX1NJVEVfT1VUX0FDSywKKysJTk1fTVRfU0VUX1NJVEVfT1VUX05BQ0ssCisrCU5NX01UX0NIR19IV19DT05GCQk9IDB4OTAsCisrCU5NX01UX0NIR19IV19DT05GX0FDSywKKysJTk1fTVRfQ0hHX0hXX0NPTkZfTkFDSywKKysJLyogTWVhc3VyZW1lbnQgTWFuYWdlbWVudCBNZXNzYWdlcyAqLworKwlOTV9NVF9NRUFTX1JFU19SRVEJCT0gMHg4YSwKKysJTk1fTVRfTUVBU19SRVNfUkVTUCwKKysJTk1fTVRfU1RPUF9NRUFTLAorKwlOTV9NVF9TVEFSVF9NRUFTLAorKwkvKiBPdGhlciBNZXNzYWdlcyAqLworKwlOTV9NVF9HRVRfQVRUUgkJCT0gMHg4MSwKKysJTk1fTVRfR0VUX0FUVFJfUkVTUCwKKysJTk1fTVRfR0VUX0FUVFJfTkFDSywKKysJTk1fTVRfU0VUX0FMQVJNX1RIUkVTLAorKwlOTV9NVF9TRVRfQUxBUk1fVEhSRVNfQUNLLAorKwlOTV9NVF9TRVRfQUxBUk1fVEhSRVNfTkFDSywKKysKKysJTk1fTVRfSVBBQ0NfUkVTVEFSVAkJPSAweDg3LAorKwlOTV9NVF9JUEFDQ19SRVNUQVJUX0FDSywKKyt9OworKworK2VudW0gYWJpc19ubV9tc2d0eXBlX2JzMTEgeworKwlOTV9NVF9CUzExX1JFU0VUX1JFU09VUkNFCT0gMHg3NCwKKysKKysJTk1fTVRfQlMxMV9CRUdJTl9EQl9UWAkJPSAweGEzLAorKwlOTV9NVF9CUzExX0JFR0lOX0RCX1RYX0FDSywKKysJTk1fTVRfQlMxMV9CRUdJTl9EQl9UWF9OQUNLLAorKwlOTV9NVF9CUzExX0VORF9EQl9UWAkJPSAweGE2LAorKwlOTV9NVF9CUzExX0VORF9EQl9UWF9BQ0ssCisrCU5NX01UX0JTMTFfRU5EX0RCX1RYX05BQ0ssCisrCU5NX01UX0JTMTFfQ1JFQVRFX09CSgkJPSAweGE5LAorKwlOTV9NVF9CUzExX0NSRUFURV9PQkpfQUNLLAorKwlOTV9NVF9CUzExX0NSRUFURV9PQkpfTkFDSywKKysJTk1fTVRfQlMxMV9ERUxFVEVfT0JKCQk9IDB4YWMsCisrCU5NX01UX0JTMTFfREVMRVRFX09CSl9BQ0ssCisrCU5NX01UX0JTMTFfREVMRVRFX09CSl9OQUNLLAorKworKwlOTV9NVF9CUzExX1NFVF9BVFRSCQk9IDB4ZDAsCisrCU5NX01UX0JTMTFfU0VUX0FUVFJfQUNLLAorKwlOTV9NVF9CUzExX1NFVF9BVFRSX05BQ0ssCisrCU5NX01UX0JTMTFfTE1UX1NFU1NJT04JCT0gMHhkYywKKysKKysJTk1fTVRfQlMxMV9HRVRfU1RBVEUJCT0gMHhlMywKKysJTk1fTVRfQlMxMV9HRVRfU1RBVEVfQUNLLAorKwlOTV9NVF9CUzExX0xNVF9MT0dPTgkJPSAweGU1LAorKwlOTV9NVF9CUzExX0xNVF9MT0dPTl9BQ0ssCisrCU5NX01UX0JTMTFfUkVTVEFSVAkJPSAweGU3LAorKwlOTV9NVF9CUzExX1JFU1RBUlRfQUNLLAorKwlOTV9NVF9CUzExX0RJU0NPTk5FQ1QJCT0gMHhlOSwKKysJTk1fTVRfQlMxMV9ESVNDT05ORUNUX0FDSywKKysJTk1fTVRfQlMxMV9MTVRfTE9HT0ZGCQk9IDB4ZWMsCisrCU5NX01UX0JTMTFfTE1UX0xPR09GRl9BQ0ssCisrCU5NX01UX0JTMTFfUkVDT05ORUNUCQk9IDB4ZjEsCisrCU5NX01UX0JTMTFfUkVDT05ORUNUX0FDSywKKyt9OworKworK2VudW0gYWJpc19ubV9tc2d0eXBlX2lwYWNjIHsKKysJTk1fTVRfSVBBQ0NfUlNMX0NPTk5FQ1QJCT0gMHhlMCwKKysJTk1fTVRfSVBBQ0NfUlNMX0NPTk5FQ1RfQUNLLAorKwlOTV9NVF9JUEFDQ19SU0xfQ09OTkVDVF9OQUNLLAorKwlOTV9NVF9JUEFDQ19SU0xfRElTQ09OTkVDVAk9IDB4ZTMsCisrCU5NX01UX0lQQUNDX1JTTF9ESVNDT05ORUNUX0FDSywKKysJTk1fTVRfSVBBQ0NfUlNMX0RJU0NPTk5FQ1RfTkFDSywKKysJTk1fTVRfSVBBQ0NfQ09OTl9UUkFGCQk9IDB4ZTYsCisrCU5NX01UX0lQQUNDX0NPTk5fVFJBRl9BQ0ssCisrCU5NX01UX0lQQUNDX0NPTk5fVFJBRl9OQUNLLAorKwlOTV9NVF9JUEFDQ19ESVNDX1RSQUYJCT0gMHhlOSwKKysJTk1fTVRfSVBBQ0NfRElTQ19UUkFGX0FDSywKKysJTk1fTVRfSVBBQ0NfRElTQ19UUkFGX05BQ0ssCisrCU5NX01UX0lQQUNDX0RFRl9CT09UX1NXCQk9IDB4ZWMsCisrCU5NX01UX0lQQUNDX0RFRl9CT09UX1NXX0FDSywKKysJTk1fTVRfSVBBQ0NfREVGX0JPT1RfU1dfTkFDSywKKysJTk1fTVRfSVBBQ0NfU0VUX05WQVRUUgkJPSAweGVmLAorKwlOTV9NVF9JUEFDQ19TRVRfTlZBVFRSX0FDSywKKysJTk1fTVRfSVBBQ0NfU0VUX05WQVRUUl9OQUNLLAorKwlOTV9NVF9JUEFDQ19HRVRfTlZBVFRSCQk9IDB4ZjIsCisrCU5NX01UX0lQQUNDX0dFVF9OVkFUVFJfQUNLLAorKwlOTV9NVF9JUEFDQ19HRVRfTlZBVFRSX05BQ0ssCisrCU5NX01UX0lQQUNDX1NFVF9BVFRSCQk9IDB4ZjUsCisrCU5NX01UX0lQQUNDX1NFVF9BVFRSX0FDSywKKysJTk1fTVRfSVBBQ0NfU0VUX0FUVFJfTkFDSywKKysJTk1fTVRfSVBBQ0NfQVRUUl9DSEdfRVZUCT0gMHhmOCwKKysJTk1fTVRfSVBBQ0NfU1dfREVBQ1QJCT0gMHhmOSwKKysJTk1fTVRfSVBBQ0NfU1dfREVBQ1RfQUNLLAorKwlOTV9NVF9JUEFDQ19TV19ERUFDVF9OQUNLLAorKwlOTV9NVF9JUEFDQ19NRUFTX1JFU19SRVFfTkFDSwk9IDB4ZmMsCisrCU5NX01UX0lQQUNDX1NUQVJUX01FQVNfTkFDSywKKysJTk1fTVRfSVBBQ0NfU1RPUF9NRUFTX05BQ0ssCisrfTsKKysKKytlbnVtIGFiaXNfbm1fYnMxMV9jZWxsX2FsbG9jIHsKKysJTk1fQlMxMV9DQU5SX0dTTQk9IDB4MDAsCisrCU5NX0JTMTFfQ0FOUl9EQ1MxODAwCT0gMHgwMSwKKyt9OworKworKy8qIFNlY3Rpb24gOS4yOiBPYmplY3QgQ2xhc3MgKi8KKytlbnVtIGFiaXNfbm1fb2JqX2NsYXNzIHsKKysJTk1fT0NfU0lURV9NQU5BR0VSCQk9IDB4MDAsCisrCU5NX09DX0JUUywKKysJTk1fT0NfUkFESU9fQ0FSUklFUiwKKysJTk1fT0NfQ0hBTk5FTCwKKysJTk1fT0NfQkFTRUJfVFJBTlNDLAorKwkvKiBSRlU6IDA1LUZFICovCisrCU5NX09DX0JTMTFfQURKQwkJCT0gMHhhMCwKKysJTk1fT0NfQlMxMV9IQU5ET1ZFUgkJPSAweGExLAorKwlOTV9PQ19CUzExX1BXUl9DVFJMCQk9IDB4YTIsCisrCU5NX09DX0JTMTFfQlRTRQkJCT0gMHhhMywJCS8qIExNVD8gKi8KKysJTk1fT0NfQlMxMV9SQUNLCQkJPSAweGE0LAorKwlOTV9PQ19CUzExCQkJPSAweGE1LAkJLyogMDE6IEFMQ08gKi8KKysJTk1fT0NfQlMxMV9URVNUCQkJPSAweGE2LAorKwlOTV9PQ19CUzExX0VOVkFCVFNFCQk9IDB4YTgsCisrCU5NX09DX0JTMTFfQlBPUlQJCT0gMHhhOSwKKysKKysJTk1fT0NfR1BSU19OU0UJCQk9IDB4ZjAsCisrCU5NX09DX0dQUlNfQ0VMTAkJCT0gMHhmMSwKKysJTk1fT0NfR1BSU19OU1ZDMAkJPSAweGYyLAorKwlOTV9PQ19HUFJTX05TVkMxCQk9IDB4ZjMsCisrCisrCU5NX09DX05VTEwJCQk9IDB4ZmYsCisrfTsKKysKKysvKiBTZWN0aW9uIDkuNDogQXR0cmlidXRlcyAqLworK2VudW0gYWJpc19ubV9hdHRyIHsKKysJTk1fQVRUX0FCSVNfQ0hBTk5FTAk9IDB4MDEsCisrCU5NX0FUVF9BRERfSU5GTywKKysJTk1fQVRUX0FERF9URVhULAorKwlOTV9BVFRfQURNX1NUQVRFLAorKwlOTV9BVFRfQVJGQ05fTElTVCwKKysJTk1fQVRUX0FVVE9OX1JFUE9SVCwKKysJTk1fQVRUX0FWQUlMX1NUQVRVUywKKysJTk1fQVRUX0JDQ0hfQVJGQ04sCisrCU5NX0FUVF9CU0lDLAorKwlOTV9BVFRfQlRTX0FJUl9USU1FUiwKKysJTk1fQVRUX0NDQ0hfTF9JX1AsCisrCU5NX0FUVF9DQ0NIX0xfVCwKKysJTk1fQVRUX0NIQU5fQ09NQiwKKysJTk1fQVRUX0NPTk5fRkFJTF9DUklULAorKwlOTV9BVFRfREVTVCwKKysJLyogcmVzICovCisrCU5NX0FUVF9FVkVOVF9UWVBFCT0gMHgxMSwgLyogQlMxMTogZmlsZSBkYXRhID8hPyAqLworKwlOTV9BVFRfRklMRV9JRCwKKysJTk1fQVRUX0ZJTEVfVkVSU0lPTiwKKysJTk1fQVRUX0dTTV9USU1FLAorKwlOTV9BVFRfSFNOLAorKwlOTV9BVFRfSFdfQ09ORklHLAorKwlOTV9BVFRfSFdfREVTQywKKysJTk1fQVRUX0lOVEFWRV9QQVJBTSwKKysJTk1fQVRUX0lOVEVSRl9CT1VORCwKKysJTk1fQVRUX0xJU1RfUkVRX0FUVFIsCisrCU5NX0FUVF9NQUlPLAorKwlOTV9BVFRfTUFOVUZfU1RBVEUsCisrCU5NX0FUVF9NQU5VRl9USFJFU0gsCisrCU5NX0FUVF9NQU5VRl9JRCwKKysJTk1fQVRUX01BWF9UQSwKKysJTk1fQVRUX01EUk9QX0xJTkssCS8qIDB4MjAgKi8KKysJTk1fQVRUX01EUk9QX05FWFQsCisrCU5NX0FUVF9OQUNLX0NBVVNFUywKKysJTk1fQVRUX05ZMSwKKysJTk1fQVRUX09QRVJfU1RBVEUsCisrCU5NX0FUVF9PVkVSTF9QRVJJT0QsCisrCU5NX0FUVF9QSFlTX0NPTkYsCisrCU5NX0FUVF9QT1dFUl9DTEFTUywKKysJTk1fQVRUX1BPV0VSX1RIUkVTSCwKKysJTk1fQVRUX1BST0JfQ0FVU0UsCisrCU5NX0FUVF9SQUNIX0JfVEhSRVNILAorKwlOTV9BVFRfTERBVkdfU0xPVFMsCisrCU5NX0FUVF9SQURfU1VCQywKKysJTk1fQVRUX1JGX01BWFBPV1JfUiwKKysJTk1fQVRUX1NJVEVfSU5QVVRTLAorKwlOTV9BVFRfU0lURV9PVVRQVVRTLAorKwlOTV9BVFRfU09VUkNFLAkJLyogMHgzMCAqLworKwlOTV9BVFRfU1BFQ19QUk9CLAorKwlOTV9BVFRfU1RBUlRfVElNRSwKKysJTk1fQVRUX1QyMDAsCisrCU5NX0FUVF9URUksCisrCU5NX0FUVF9URVNUX0RVUiwKKysJTk1fQVRUX1RFU1RfTk8sCisrCU5NX0FUVF9URVNUX1JFUE9SVCwKKysJTk1fQVRUX1ZTV1JfVEhSRVNILAorKwlOTV9BVFRfV0lORE9XX1NJWkUsCisrCS8qIFJlcyAgKi8KKysJTk1fQVRUX0JTMTFfUlNTSV9PRkZTCT0gMHgzZCwKKysJTk1fQVRUX0JTMTFfVFhQV1IJPSAweDNlLAorKwlOTV9BVFRfQlMxMV9ESVZFUlNJVFkJPSAweDNmLAorKwkvKiBSZXMgICovCisrCU5NX0FUVF9UU0MJCT0gMHg0MCwKKysJTk1fQVRUX1NXX0NPTkZJRywKKysJTk1fQVRUX1NXX0RFU0NSLAorKwlOTV9BVFRfU0VWRVJJVFksCisrCU5NX0FUVF9HRVRfQVJJLAorKwlOTV9BVFRfSFdfQ09ORl9DSEcsCisrCU5NX0FUVF9PVVRTVF9BTEFSTSwKKysJTk1fQVRUX0ZJTEVfREFUQSwKKysJTk1fQVRUX01FQVNfUkVTLAorKwlOTV9BVFRfTUVBU19UWVBFLAorKworKwlOTV9BVFRfQlMxMV9FU05fRldfQ09ERV9OTwk9IDB4NGMsCisrCU5NX0FUVF9CUzExX0VTTl9IV19DT0RFX05PCT0gMHg0ZiwKKysKKysJTk1fQVRUX0JTMTFfRVNOX1BDQl9TRVJJQUwJPSAweDU1LAorKwlOTV9BVFRfQlMxMV9FWENFU1NJVkVfRElTVEFOQ0UJPSAweDU4LAorKworKwlOTV9BVFRfQlMxMV9BTExfVEVTVF9DQVRHCT0gMHg2MCwKKysJTk1fQVRUX0JTMTFfQlRTTFNfSE9QUElORywKKysJTk1fQVRUX0JTMTFfQ0VMTF9BTExPQ19OUiwKKysJTk1fQVRUX0JTMTFfQ0VMTF9HTE9CQUxfSUQsCisrCU5NX0FUVF9CUzExX0VOQV9JTlRFUkZfQ0xBU1MJPSAweDY2LAorKwlOTV9BVFRfQlMxMV9FTkFfSU5UX0lOVEVDX0hBTkRPCT0gMHg2NywKKysJTk1fQVRUX0JTMTFfRU5BX0lOVF9JTlRSQ19IQU5ETwk9IDB4NjgsCisrCU5NX0FUVF9CUzExX0VOQV9NU19QV1JfQ1RSTAk9IDB4NjksCisrCU5NX0FUVF9CUzExX0VOQV9QV1JfQkRHVF9ITwk9IDB4NmEsCisrCU5NX0FUVF9CUzExX0VOQV9QV1JfQ1RSTF9STEZXCT0gMHg2YiwKKysJTk1fQVRUX0JTMTFfRU5BX1JYTEVWX0hPCT0gMHg2YywKKysJTk1fQVRUX0JTMTFfRU5BX1JYUVVBTF9ITwk9IDB4NmQsCisrCU5NX0FUVF9CUzExX0ZBQ0NIX1FVQUwJCT0gMHg2ZSwKKysKKysJTk1fQVRUX0lQQUNDX0RTVF9JUAkJPSAweDgwLAorKwlOTV9BVFRfSVBBQ0NfRFNUX0lQX1BPUlQJPSAweDgxLAorKwlOTV9BVFRfSVBBQ0NfU1NSQwkJPSAweDgyLAkJLyogUlRQIFN5bmMgU291cmNlICovCisrCU5NX0FUVF9JUEFDQ19SVFBfUEFZTERfVFlQRQk9IDB4ODMsCisrCU5NX0FUVF9JUEFDQ19CQVNFQl9JRAkJPSAweDg0LAorKwlOTV9BVFRfSVBBQ0NfU1RSRUFNX0lECQk9IDB4ODUsCisrCU5NX0FUVF9JUEFDQ19OVl9GTEFHUwkJPSAweDg2LAorKwlOTV9BVFRfSVBBQ0NfRlJFUV9DVFJMCQk9IDB4ODcsCisrCU5NX0FUVF9JUEFDQ19QUklNX09NTF9DRkcJPSAweDg4LAorKwlOTV9BVFRfSVBBQ0NfU0VDX09NTF9DRkcJPSAweDg5LAorKwlOTV9BVFRfSVBBQ0NfSVBfSUZfQ0ZHCQk9IDB4OGEsCQkvKiBJUCBpbnRlcmZhY2UgKi8KKysJTk1fQVRUX0lQQUNDX0lQX0dXX0NGRwkJPSAweDhiLAkJLyogSVAgZ2F0ZXdheSAqLworKwlOTV9BVFRfSVBBQ0NfSU5fU0VSVl9USU1FCT0gMHg4YywKKysJTk1fQVRUX0lQQUNDX1RSWF9CVFNfQVNTCT0gMHg4ZCwKKysJTk1fQVRUX0lQQUNDX0xPQ0FUSU9OCQk9IDB4OGUsCQkvKiBzdHJpbmcgZGVzY3JpYmluZyBsb2NhdGlvbiAqLworKwlOTV9BVFRfSVBBQ0NfUEFHSU5HX0NGRwkJPSAweDhmLAorKwlOTV9BVFRfSVBBQ0NfRklMRV9EQVRBCQk9IDB4OTAsCisrCU5NX0FUVF9JUEFDQ19VTklUX0lECQk9IDB4OTEsCQkvKiBTaXRlL0JUUy9UUlggKi8KKysJTk1fQVRUX0lQQUNDX1BBUkVOVF9VTklUX0lECT0gMHg5MiwKKysJTk1fQVRUX0lQQUNDX1VOSVRfTkFNRQkJPSAweDkzLAkJLyogZGVmYXVsdDogbmJ0cy08bWFjLWFzLXN0cmluZz4gKi8KKysJTk1fQVRUX0lQQUNDX1NOTVBfQ0ZHCQk9IDB4OTQsCisrCU5NX0FUVF9JUEFDQ19QUklNX09NTF9DRkdfTElTVAk9IDB4OTUsCisrCU5NX0FUVF9JUEFDQ19QUklNX09NTF9GQl9UT1VUCT0gMHg5NiwJCS8qIGZhbGxiYWNrIHRpbWVvdXQgKi8KKysJTk1fQVRUX0lQQUNDX0NVUl9TV19DRkcJCT0gMHg5NywKKysJTk1fQVRUX0lQQUNDX1RJTUlOR19CVVMJCT0gMHg5OCwKKysJTk1fQVRUX0lQQUNDX0NHSQkJPSAweDk5LAkJLyogQ2VsbCBHbG9iYWwgSUQgKi8KKysJTk1fQVRUX0lQQUNDX1JBQwkJPSAweDlhLAorKwlOTV9BVFRfSVBBQ0NfT0JKX1ZFUlNJT04JPSAweDliLAorKwlOTV9BVFRfSVBBQ0NfR1BSU19QQUdJTkdfQ0ZHCT0gMHg5YywKKysJTk1fQVRUX0lQQUNDX05TRUkJCT0gMHg5ZCwKKysJTk1fQVRUX0lQQUNDX0JWQ0kJCT0gMHg5ZSwKKysJTk1fQVRUX0lQQUNDX05TVkNJCQk9IDB4OWYsCisrCU5NX0FUVF9JUEFDQ19OU19DRkcJCT0gMHhhMCwKKysJTk1fQVRUX0lQQUNDX0JTU0dQX0NGRwkJPSAweGExLAorKwlOTV9BVFRfSVBBQ0NfTlNfTElOS19DRkcJPSAweGEyLAorKwlOTV9BVFRfSVBBQ0NfUkxDX0NGRwkJPSAweGEzLAorKwlOTV9BVFRfSVBBQ0NfQUxNX1RIUkVTSF9MSVNUCT0gMHhhNCwKKysJTk1fQVRUX0lQQUNDX01PTklUX1ZBTF9MSVNUCT0gMHhhNSwKKysJTk1fQVRUX0lQQUNDX1RJQl9DT05UUk9MCT0gMHhhNiwKKysJTk1fQVRUX0lQQUNDX1NVUFBfRkVBVFVSRVMJPSAweGE3LAorKwlOTV9BVFRfSVBBQ0NfQ09ESU5HX1NDSEVNRVMJPSAweGE4LAorKwlOTV9BVFRfSVBBQ0NfUkxDX0NGR18yCQk9IDB4YTksCisrCU5NX0FUVF9JUEFDQ19IRUFSVEJfVE9VVAk9IDB4YWEsCisrCU5NX0FUVF9JUEFDQ19VUFRJTUUJCT0gMHhhYiwKKysJTk1fQVRUX0lQQUNDX1JMQ19DRkdfMwkJPSAweGFjLAorKwlOTV9BVFRfSVBBQ0NfU1NMX0NGRwkJPSAweGFkLAorKwlOTV9BVFRfSVBBQ0NfU0VDX1BPU1NJQkxFCT0gMHhhZSwKKysJTk1fQVRUX0lQQUNDX0lNTF9TU0xfU1RBVEUJPSAweGFmLAorKwlOTV9BVFRfSVBBQ0NfUkVWT0NfREFURQkJPSAweGIwLAorKworKworKwlOTV9BVFRfQlMxMV9SRl9SRVNfSU5EX1BFUgk9IDB4OGYsCisrCisrCU5NX0FUVF9CUzExX1JYX0xFVl9NSU5fQ0VMTAk9IDB4OTAsCisrCU5NX0FUVF9CUzExX0FCSVNfRVhUX1RJTUUJPSAweDkxLAorKwlOTV9BVFRfQlMxMV9USU1FUl9IT19SRVFVRVNUCT0gMHg5MiwKKysJTk1fQVRUX0JTMTFfVElNRVJfTkNFTEwJCT0gMHg5MywKKysJTk1fQVRUX0JTMTFfVFNZTkMJCT0gMHg5NCwKKysJTk1fQVRUX0JTMTFfVFRSQVUJCT0gMHg5NSwKKysJTk1fQVRUX0JTMTFfRU1SR19DRkdfTUVNQkVSCT0gMHg5YiwKKysJTk1fQVRUX0JTMTFfVFJYX0FSRUEJCT0gMHg5ZiwKKysKKysJTk1fQVRUX0JTMTFfQkNDSF9SRUNPTkYJCT0gMHhkNywKKysJTk1fQVRUX0JTMTFfQklUX0VSUl9USEVTSAk9IDB4YTAsCisrCU5NX0FUVF9CUzExX0JPT1RfU1dfVkVSUwk9IDB4YTEsCisrCU5NX0FUVF9CUzExX0NDTEtfQUNDVVJBQ1kJPSAweGEzLAorKwlOTV9BVFRfQlMxMV9DQ0xLX1RZUEUJCT0gMHhhNCwKKysJTk1fQVRUX0JTMTFfSU5QX0lNUEVEQU5DRQk9IDB4YWEsCisrCU5NX0FUVF9CUzExX0wxX1BST1RfVFlQRQk9IDB4YWIsCisrCU5NX0FUVF9CUzExX0xJTkVfQ0ZHCQk9IDB4YWMsCisrCU5NX0FUVF9CUzExX0xJX1BPUlRfMQkJPSAweGFkLAorKwlOTV9BVFRfQlMxMV9MSV9QT1JUXzIJCT0gMHhhZSwKKysKKysJTk1fQVRUX0JTMTFfTDFfUkVNX0FMTV9UWVBFCT0gMHhiMCwKKysJTk1fQVRUX0JTMTFfU1dfTE9BRF9JTlRFTkRFRAk9IDB4YmIsCisrCU5NX0FUVF9CUzExX1NXX0xPQURfU0FGRVRZCT0gMHhiYywKKysJTk1fQVRUX0JTMTFfU1dfTE9BRF9TVE9SRUQJPSAweGJkLAorKworKwlOTV9BVFRfQlMxMV9WRU5ET1JfTkFNRQkJPSAweGMxLAorKwlOTV9BVFRfQlMxMV9IT1BQSU5HX01PREUJPSAweGM1LAorKwlOTV9BVFRfQlMxMV9MTVRfTE9HT05fU0VTU0lPTgk9IDB4YzYsCisrCU5NX0FUVF9CUzExX0xNVF9MT0dJTl9USU1FCT0gMHhjNywKKysJTk1fQVRUX0JTMTFfTE1UX1VTRVJfQUNDX0xFVgk9IDB4YzgsCisrCU5NX0FUVF9CUzExX0xNVF9VU0VSX05BTUUJPSAweGM5LAorKworKwlOTV9BVFRfQlMxMV9MMV9DT05UUk9MX1RTCT0gMHhkOCwKKysJTk1fQVRUX0JTMTFfUkFESU9fTUVBU19HUkFOCT0gMHhkYywJLyogaW4gU0FDQ0ggbXVsdGlmcmFtZXMgKi8KKysJTk1fQVRUX0JTMTFfUkFESU9fTUVBU19SRVAJPSAweGRkLAorKworKwlOTV9BVFRfQlMxMV9TSF9MQVBEX0lOVF9USU1FUgk9IDB4ZTgsCisrCisrCU5NX0FUVF9CUzExX0JUU19TVEFURQkJPSAweGYwLAorKwlOTV9BVFRfQlMxMV9FMV9TVEFURQkJPSAweGYxLAorKwlOTV9BVFRfQlMxMV9QTEwJCQk9IDB4ZjIsCisrCU5NX0FUVF9CUzExX1JYX09GRlNFVAkJPSAweGYzLAorKwlOTV9BVFRfQlMxMV9BTlRfVFlQRQkJPSAweGY0LAorKwlOTV9BVFRfQlMxMV9QTExfTU9ERQkJPSAweGZjLAorKwlOTV9BVFRfQlMxMV9QQVNTV09SRAkJPSAweGZkLAorK307CisrI2RlZmluZSBOTV9BVFRfQlMxMV9GSUxFX0RBVEEJTk1fQVRUX0VWRU5UX1RZUEUKKysKKysvKiBTZWN0aW9uIDkuNC40OiBBZG1pbmlzdHJhdGl2ZSBTdGF0ZSAqLworK2VudW0gYWJpc19ubV9hZG1fc3RhdGUgeworKwlOTV9TVEFURV9MT0NLRUQJCT0gMHgwMSwKKysJTk1fU1RBVEVfVU5MT0NLRUQJPSAweDAyLAorKwlOTV9TVEFURV9TSFVURE9XTgk9IDB4MDMsCisrCU5NX1NUQVRFX05VTEwJCT0gMHhmZiwKKyt9OworKworKy8qIFNlY3Rpb24gOS40LjEzOiBDaGFubmVsIENvbWJpbmF0aW9uICovCisrZW51bSBhYmlzX25tX2NoYW5fY29tYiB7CisrCU5NX0NIQU5DX1RDSEZ1bGwJPSAweDAwLAorKwlOTV9DSEFOQ19UQ0hIYWxmCT0gMHgwMSwKKysJTk1fQ0hBTkNfVENISGFsZjIJPSAweDAyLAorKwlOTV9DSEFOQ19TRENDSAkJPSAweDAzLAorKwlOTV9DSEFOQ19tYWluQkNDSAk9IDB4MDQsCisrCU5NX0NIQU5DX0JDQ0hDb21iCT0gMHgwNSwKKysJTk1fQ0hBTkNfQkNDSAkJPSAweDA2LAorKwlOTV9DSEFOQ19CQ0NIX0NCQ0gJPSAweDA3LAorKwlOTV9DSEFOQ19TRENDSF9DQkNICT0gMHgwOCwKKyt9OworKworKy8qIFNlY3Rpb24gOS40LjE2OiBFdmVudCBUeXBlICovCisrZW51bSBhYmlzX25tX2V2ZW50X3R5cGUgeworKwlOTV9FVlRfQ09NTV9GQUlMCT0gMHgwMCwKKysJTk1fRVZUX1FPU19GQUlMCQk9IDB4MDEsCisrCU5NX0VWVF9QUk9DX0ZBSUwJPSAweDAyLAorKwlOTV9FVlRfRVFVSVBfRkFJTAk9IDB4MDMsCisrCU5NX0VWVF9FTlZfRkFJTAkJPSAweDA0LAorK307CisrCisrLyogU2VjdGlvbjogOS40LjYzOiBQZXJjZWl2ZWQgU2V2ZXJpdHkgKi8KKytlbnVtIGFiaXNfbm1fc2V2ZXJpdHkgeworKwlOTV9TRVZFUl9DRUFTRUQJCT0gMHgwMCwKKysJTk1fU0VWRVJfQ1JJVElDQUwJPSAweDAxLAorKwlOTV9TRVZFUl9NQUpPUgkJPSAweDAyLAorKwlOTV9TRVZFUl9NSU5PUgkJPSAweDAzLAorKwlOTV9TRVZFUl9XQVJOSU5HCT0gMHgwNCwKKysJTk1fU0VWRVJfSU5ERVRFUk1JTkFURQk9IDB4MDUsCisrfTsKKysKKysvKiBTZWN0aW9uIDkuNC40MzogUHJvYmFibGUgQ2F1c2UgVHlwZSAqLworK2VudW0gYWJpc19ubV9wY2F1c2VfdHlwZSB7CisrCU5NX1BDQVVTRV9UX1g3MjEJPSAweDAxLAorKwlOTV9QQ0FVU0VfVF9HU00JCT0gMHgwMiwKKysJTk1fUENBVVNFX1RfTUFOVUYJPSAweDAzLAorK307CisrCisrLyogU2VjdGlvbiA5LjQuMzY6IE5BQ0sgQ2F1c2VzICovCisrZW51bSBhYmlzX25tX25hY2tfY2F1c2UgeworKwkvKiBHZW5lcmFsIE5hY2sgQ2F1c2VzICovCisrCU5NX05BQ0tfSU5DT1JSX1NUUlVDVAkJPSAweDAxLAorKwlOTV9OQUNLX01TR1RZUEVfSU5WQUwJCT0gMHgwMiwKKysJTk1fTkFDS19PQkpDTEFTU19JTlZBTAkJPSAweDA1LAorKwlOTV9OQUNLX09CSkNMQVNTX05PVFNVUFAJPSAweDA2LAorKwlOTV9OQUNLX0JUU05SX1VOS04JCT0gMHgwNywKKysJTk1fTkFDS19UUlhOUl9VTktOCQk9IDB4MDgsCisrCU5NX05BQ0tfT0JKSU5TVF9VTktOCQk9IDB4MDksCisrCU5NX05BQ0tfQVRUUklEX0lOVkFMCQk9IDB4MGMsCisrCU5NX05BQ0tfQVRUUklEX05PVFNVUFAJCT0gMHgwZCwKKysJTk1fTkFDS19QQVJBTV9SQU5HRQkJPSAweDBlLAorKwlOTV9OQUNLX0FUVFJMSVNUX0lOQ09OU0lTVEVOVAk9IDB4MGYsCisrCU5NX05BQ0tfU1BFQ19JTVBMX05PVFNVUFAJPSAweDEwLAorKwlOTV9OQUNLX0NBTlRfUEVSRk9STQkJPSAweDExLAorKwkvKiBTcGVjaWZpYyBOYWNrIENhdXNlcyAqLworKwlOTV9OQUNLX1JFU19OT1RJTVBMCQk9IDB4MTksCisrCU5NX05BQ0tfUkVTX05PVEFWQUlMCQk9IDB4MWEsCisrCU5NX05BQ0tfRlJFUV9OT1RBVkFJTAkJPSAweDFiLAorKwlOTV9OQUNLX1RFU1RfTk9UU1VQUAkJPSAweDFjLAorKwlOTV9OQUNLX0NBUEFDSVRZX1JFU1RSCQk9IDB4MWQsCisrCU5NX05BQ0tfUEhZU0NGR19OT1RQRVJGT1JNCT0gMHgxZSwKKysJTk1fTkFDS19URVNUX05PVElOSVQJCT0gMHgxZiwKKysJTk1fTkFDS19QSFlTQ0ZHX05PVFJFU1RPUkUJPSAweDIwLAorKwlOTV9OQUNLX1RFU1RfTk9TVUNICQk9IDB4MjEsCisrCU5NX05BQ0tfVEVTVF9OT1NUT1AJCT0gMHgyMiwKKysJTk1fTkFDS19NU0dJTkNPTlNJU1RfUEhZU0NGRwk9IDB4MjMsCisrCU5NX05BQ0tfRklMRV9JTkNPTVBMRVRFCQk9IDB4MjUsCisrCU5NX05BQ0tfRklMRV9OT1RBVkFJTAkJPSAweDI2LAorKwlOTV9OQUNLX0ZJTEVfTk9UQUNUSVZBVEUJPSAweDI3LAorKwlOTV9OQUNLX1JFUV9OT1RfR1JBTlQJCT0gMHgyOCwKKysJTk1fTkFDS19XQUlUCQkJPSAweDI5LAorKwlOTV9OQUNLX05PVEhfUkVQT1JUX0VYSVNUCT0gMHgyYSwKKysJTk1fTkFDS19NRUFTX05PVFNVUFAJCT0gMHgyYiwKKysJTk1fTkFDS19NRUFTX05PVFNUQVJUCQk9IDB4MmMsCisrfTsKKysKKysvKiBTZWN0aW9uIDkuNC4xICovCisrc3RydWN0IGFiaXNfbm1fY2hhbm5lbCB7CisrCWd1aW50OAlhdHRyaWI7CisrCWd1aW50OAlidHNfcG9ydDsKKysJZ3VpbnQ4CXRpbWVzbG90OworKwlndWludDgJc3Vic2xvdDsKKyt9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKysKKysvKiBTaWVtZW5zIEJTLTExIHNwZWNpZmljIG9iamVjdHMgaW4gdGhlIFNpZW5lbXNIVyAoMHhBNSkgb2JqZWN0IGNsYXNzICovCisrZW51bSBhYmlzX2JzMTFfb2JqdHlwZSB7CisrCUJTMTFfT0JKX0FMQ08JCT0gMHgwMSwKKysJQlMxMV9PQkpfQkJTSUcJCT0gMHgwMiwJLyogb2JqX2NsYXNzOiAwLDEgKi8KKysJQlMxMV9PQkpfVFJYMQkJPSAweDAzLAkvKiBvbmx5IERFQUNUSVZBVEUgVFJYMSAqLworKwlCUzExX09CSl9DQ0xLCQk9IDB4MDQsCisrCUJTMTFfT0JKX0dQU1UJCT0gMHgwNiwKKysJQlMxMV9PQkpfTEkJCT0gMHgwNywKKysJQlMxMV9PQkpfUEEJCT0gMHgwOSwJLyogb2JqX2NsYXNzOiAwLCAxKi8KKyt9OworKworK2VudW0gYWJpc19iczExX3RyeF9wb3dlciB7CisrCUJTMTFfVFJYX1BPV0VSX0dTTV8yVwk9IDB4MDYsCisrCUJTMTFfVFJYX1BPV0VSX0dTTV8yNTBtVz0gMHgwNywKKysJQlMxMV9UUlhfUE9XRVJfR1NNXzgwbVcJPSAweDA4LAorKwlCUzExX1RSWF9QT1dFUl9HU01fMzBtVwk9IDB4MDksCisrCUJTMTFfVFJYX1BPV0VSX0RDU18zVwk9IDB4MGEsCisrCUJTMTFfVFJYX1BPV0VSX0RDU18xVzYJPSAweDBiLAorKwlCUzExX1RSWF9QT1dFUl9EQ1NfNTAwbVc9IDB4MGMsCisrCUJTMTFfVFJYX1BPV0VSX0RDU18xNjBtVz0gMHgwZCwKKyt9OworKworK2VudW0gYWJpc19iczExX2xpX3BsbF9tb2RlIHsKKysJQlMxMV9MSV9QTExfTE9DS0VECT0gMiwKKysJQlMxMV9MSV9QTExfU1RBTkRBTE9ORQk9IDMsCisrfTsKKysKKytlbnVtIGFiaXNfYnMxMV9waGFzZSB7CisrCUJTMTFfU1RBVEVfU09GVFdBUkVfUlFECQk9IDB4MDEsCisrCUJTMTFfU1RBVEVfTE9BRF9TTVVfSU5URU5ERUQJPSAweDExLAorKwlCUzExX1NUQVRFX0xPQURfU01VX1NBRkVUWQk9IDB4MjEsCisrCUJTMTFfU1RBVEVfTE9BRF9GQUlMRUQJCT0gMHgzMSwKKysJQlMxMV9TVEFURV9MT0FEX0RJQUdOT1NUSUMJPSAweDQxLAorKwlCUzExX1NUQVRFX1dBUk1fVVAJCT0gMHg1MSwKKysJQlMxMV9TVEFURV9XQVJNX1VQXzIJCT0gMHg1MiwKKysJQlMxMV9TVEFURV9XQUlUX01JTl9DRkcJCT0gMHg2MiwKKysJQlMxMV9TVEFURV9NQUlOVEVOQU5DRQkJPSAweDcyLAorKwlCUzExX1NUQVRFX0xPQURfTUJDQ1UJCT0gMHg5MiwKKysJQlMxMV9TVEFURV9XQUlUX01JTl9DRkdfMgk9IDB4QTIsCisrCUJTMTFfU1RBVEVfTk9STUFMCQk9IDB4MDMsCisrCUJTMTFfU1RBVEVfQUJJU19MT0FECQk9IDB4MTMsCisrfTsKKysKKysvKiBGcm9tIG9wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3Rsdi5oICovCisrZW51bSB0bHZfdHlwZSB7CisrCVRMVl9UWVBFX0ZJWEVELAorKwlUTFZfVFlQRV9ULAorKwlUTFZfVFlQRV9UViwKKysJVExWX1RZUEVfVExWLAorKwlUTFZfVFlQRV9UTDE2ViwKKyt9OworKworK3N0cnVjdCB0bHZfZGVmIHsKKysJZW51bSB0bHZfdHlwZSB0eXBlOworKwl1X2ludDhfdCBmaXhlZF9sZW47CisrfTsKKysKKytzdHJ1Y3QgdGx2X2RlZmluaXRpb24geworKwlzdHJ1Y3QgdGx2X2RlZiBkZWZbMHhmZl07CisrfTsKKysKKytlbnVtIGFiaXNfbm1faXBhY2NfdGVzdF9ubyB7CisrCU5NX0lQQUNDX1RFU1ROT19STE9PUF9BTlQJPSAweDAxLAorKwlOTV9JUEFDQ19URVNUTk9fUkxPT1BfWENWUgk9IDB4MDIsCisrCU5NX0lQQUNDX1RFU1ROT19GVU5DX09CSgk9IDB4MDMsCisrCU5NX0lQQUNDX1RFU1ROT19DSEFOX1VTQUdFCT0gMHg0MCwKKysJTk1fSVBBQ0NfVEVTVE5PX0JDQ0hfQ0hBTl9VU0FHRQk9IDB4NDEsCisrCU5NX0lQQUNDX1RFU1ROT19GUkVRX1NZTkMJPSAweDQyLAorKwlOTV9JUEFDQ19URVNUTk9fQkNDSF9JTkZPCT0gMHg0MywKKysJTk1fSVBBQ0NfVEVTVE5PX1RYX0JFQUNPTgk9IDB4NDQsCisrCU5NX0lQQUNDX1RFU1ROT19TWVNJTkZPX01PTklUT1IJPSAweDQ1LAorKwlOTV9JUEFDQ19URVNUTk9fQkNDQ0hfTU9OSVRPUgk9IDB4NDYsCisrfTsKKysKKysvKiBmaXJzdCBieXRlIGFmdGVyIGxlbmd0aCBpbnNpZGUgTk1fQVRUX1RFU1RfUkVQT1JUICovCisrZW51bSBhYmlzX25tX2lwYWNjX3Rlc3RfcmVzIHsKKysJTk1fSVBBQ0NfVEVTVFJFU19TVUNDRVNTCT0gMCwKKysJTk1fSVBBQ0NfVEVTVFJFU19USU1FT1VUCT0gMSwKKysJTk1fSVBBQ0NfVEVTVFJFU19OT19DSEFOUwk9IDIsCisrCU5NX0lQQUNDX1RFU1RSRVNfUEFSVElBTAk9IDMsCisrCU5NX0lQQUNDX1RFU1RSRVNfU1RPUFBFRAk9IDQsCisrfTsKKysKKysvKiBpbnRlcm5hbCBJRSBpbnNpZGUgTk1fQVRUX1RFU1RfUkVQT1JUICovCisrZW51bSBhYmlzX25tX2lwYWNjX3Rlc3RyZXNfaWUgeworKwlOTV9JUEFDQ19UUl9JRV9GUkVRX0VSUl9MSVNUCT0gMywKKysJTk1fSVBBQ0NfVFJfSUVfQ0hBTl9VU0FHRQk9IDQsCisrCU5NX0lQQUNDX1RSX0lFX0JDQ0hfSU5GTwk9IDYsCisrCU5NX0lQQUNDX1RSX0lFX1JFU1VMVF9ERVRBSUxTCT0gOCwKKysJTk1fSVBBQ0NfVFJfSUVfRlJFUV9FUlIJCT0gMTgsCisrfTsKKysKKysvKiBGcm9tIG9wZW5ic2Mvc3JjL2FiaXNfbm0uYyAqLworK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdGx2X2RlZmluaXRpb24gbm1fYXR0X3RsdmRlZiA9IHsKKysJLmRlZiA9IHsKKysJCVtOTV9BVFRfQUJJU19DSEFOTkVMXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAzIH0sCisrCQlbTk1fQVRUX0FERF9JTkZPXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0FERF9URVhUXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0FETV9TVEFURV0gPQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9BUkZDTl9MSVNUXT0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfQVVUT05fUkVQT1JUXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0FWQUlMX1NUQVRVU10gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9CQ0NIX0FSRkNOXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrCQlbTk1fQVRUX0JTSUNdID0JCQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0JUU19BSVJfVElNRVJdID0JeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9DQ0NIX0xfSV9QXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0NDQ0hfTF9UXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0NIQU5fQ09NQl0gPQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9DT05OX0ZBSUxfQ1JJVF0gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0RFU1RdID0JCQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0VWRU5UX1RZUEVdID0JCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfRklMRV9JRF0gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9GSUxFX1ZFUlNJT05dID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfR1NNX1RJTUVdID0JCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtOTV9BVFRfSFNOXSA9CQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9IV19DT05GSUddID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCS8vQlMxMSBbTk1fQVRUX0hXX0RFU0NdID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSFdfREVTQ10gPQkJeyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtOTV9BVFRfSU5UQVZFX1BBUkFNXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0lOVEVSRl9CT1VORF0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgNiB9LAorKwkJW05NX0FUVF9MSVNUX1JFUV9BVFRSXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfTUFJT10gPQkJCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfTUFOVUZfU1RBVEVdID0JCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfTUFOVUZfVEhSRVNIXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX01BTlVGX0lEXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX01BWF9UQV0gPQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9NRFJPUF9MSU5LXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrCQlbTk1fQVRUX01EUk9QX05FWFRdID0JCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtOTV9BVFRfTkFDS19DQVVTRVNdID0JCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfTlkxXSA9CQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9PUEVSX1NUQVRFXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX09WRVJMX1BFUklPRF0gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9QSFlTX0NPTkZdID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfUE9XRVJfQ0xBU1NdID0JCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfUE9XRVJfVEhSRVNIXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAzIH0sCisrCQlbTk1fQVRUX1BST0JfQ0FVU0VdID0JCXsgVExWX1RZUEVfRklYRUQsIDMgfSwKKysJCVtOTV9BVFRfUkFDSF9CX1RIUkVTSF0gPQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0xEQVZHX1NMT1RTXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrCQlbTk1fQVRUX1JBRF9TVUJDXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX1JGX01BWFBPV1JfUl0gPQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9TSVRFX0lOUFVUU10gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9TSVRFX09VVFBVVFNdID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfU09VUkNFXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX1NQRUNfUFJPQl0gPQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9TVEFSVF9USU1FXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrCQlbTk1fQVRUX1QyMDBdID0JCQl7IFRMVl9UWVBFX0ZJWEVELCA3IH0sCisrCQlbTk1fQVRUX1RFSV0gPQkJCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfVEVTVF9EVVJdID0JCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtOTV9BVFRfVEVTVF9OT10gPQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9URVNUX1JFUE9SVF0gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9WU1dSX1RIUkVTSF0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW05NX0FUVF9XSU5ET1dfU0laRV0gPSAJCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfVFNDXSA9CQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9TV19DT05GSUddID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfU0VWRVJJVFldID0gCQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0dFVF9BUkldID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSFdfQ09ORl9DSEddID0gCQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX09VVFNUX0FMQVJNXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0ZJTEVfREFUQV0gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9NRUFTX1JFU10gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKyNpZiAwCisrCQkvKiBCUzExIHNwZWNpZmljcyAqLworKwkJW05NX0FUVF9CUzExX0VTTl9GV19DT0RFX05PXSA9CXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfRVNOX0hXX0NPREVfTk9dID0JeyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9FU05fUENCX1NFUklBTF0gPQl7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW05NX0FUVF9CUzExX0JPT1RfU1dfVkVSU10gPQl7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJWzB4ZDVdID0JCQl7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJWzB4YThdID0JCQl7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW05NX0FUVF9CUzExX1BBU1NXT1JEXSA9CXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfVFhQV1JdID0JCXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfUlNTSV9PRkZTXSA9CXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfTElORV9DRkddID0gCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9MMV9QUk9UX1RZUEVdID0JeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9CUzExX0JJVF9FUlJfVEhFU0hdID0JeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW05NX0FUVF9CUzExX0RJVkVSU0lUWV0gPQl7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW05NX0FUVF9CUzExX0xNVF9MT0dPTl9TRVNTSU9OXT17IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW05NX0FUVF9CUzExX0xNVF9MT0dJTl9USU1FXSA9CXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfTE1UX1VTRVJfQUNDX0xFVl0gPXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfTE1UX1VTRVJfTkFNRV0gPQl7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW05NX0FUVF9CUzExX0JUU19TVEFURV0JPQl7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW05NX0FUVF9CUzExX0UxX1NUQVRFXQk9CXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfUExMX01PREVdCT0JeyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9QTExdCT0JeyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9DQ0xLX0FDQ1VSQUNZXSA9CXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9DQ0xLX1RZUEVdID0JeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJWzB4OTVdID0JCQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrI2VuZGlmCisrCQkvKiBpcC5hY2Nlc3Mgc3BlY2lmaWNzICovCisrCQlbTk1fQVRUX0lQQUNDX0RTVF9JUF0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgNCB9LAorKwkJW05NX0FUVF9JUEFDQ19EU1RfSVBfUE9SVF0gPQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrCQlbTk1fQVRUX0lQQUNDX1BSSU1fT01MX0NGR10gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX05WX0ZMQUdTXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfRlJFUV9DVFJMXSA9CXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtOTV9BVFRfSVBBQ0NfU0VDX09NTF9DRkddID0JeyBUTFZfVFlQRV9GSVhFRCwgNiB9LAorKwkJW05NX0FUVF9JUEFDQ19JUF9JRl9DRkddID0JeyBUTFZfVFlQRV9GSVhFRCwgOCB9LAorKwkJW05NX0FUVF9JUEFDQ19JUF9HV19DRkddID0JeyBUTFZfVFlQRV9GSVhFRCwgMTIgfSwKKysJCVtOTV9BVFRfSVBBQ0NfTE9DQVRJT05dID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19VTklUX0lEXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfVU5JVF9OQU1FXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfU05NUF9DRkddID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19BTE1fVEhSRVNIX0xJU1RdPSB7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX0NVUl9TV19DRkddID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19TVFJFQU1fSURdID0JeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19SQUNdID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfT0JKX1ZFUlNJT05dID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19HUFJTX1BBR0lOR19DRkddID17IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX05TRUldID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfQlZDSV0gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19OU1ZDSV0gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19OU19DRkddID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfQlNTR1BfQ0ZHXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfTlNfTElOS19DRkddID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19STENfQ0ZHXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfU1VQUF9GRUFUVVJFU10gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX0NPRElOR19TQ0hFTUVTXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfUkxDX0NGR18yXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfUkxDX0NGR18zXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfRklMRV9EQVRBXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJfSwKKyt9OworKworKyNlbmRpZiAvKiBfTk1fSCAqLwpkaWZmIC0tZ2l0IGEvd2lyZXNoYXJrL2x1Y2VudC1obmIucGF0Y2ggYi93aXJlc2hhcmsvbHVjZW50LWhuYi5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Yzg1MTk1Ci0tLSAvZGV2L251bGwKKysrIGIvd2lyZXNoYXJrL2x1Y2VudC1obmIucGF0Y2gKQEAgLTAsMCArMSwxMjAgQEAKK0luZGV4OiB3aXJlc2hhcmsvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1sdWNlbnRfaG5iLmMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLSAvZGV2L251bGwKKysrKyB3aXJlc2hhcmsvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1sdWNlbnRfaG5iLmMKK0BAIC0wLDAgKzEsMTAzIEBACisrLyogcGFja2V0LWx1Y2VudF9obmIuYworKyAqIFJvdXRpbmVzIGZvciBwYWNrZXQgZGlzc2VjdGlvbiBvZiBBbGNhdGVsL0x1Y2VudCBIb21lTm9kZUIKKysgKiBDb3B5cmlnaHQgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorKyAqCisrICogVGhpcyBwcm90b2NvbCBkZWNvZGVyIGlzIGJhc2VkIGVudGlyZWx5IG9uIHJldmVyc2UgZW5naW5lZXJpbmcsIGkuZS4KKysgKiBvbiBlZHVjYXRlZCBndWVzc2VzLgorKyAqCisrICogJElkOiBwYWNrZXQtbHVjZW50X2huYi5jIDI5MjU0IDIwMDktMDctMzEgMTk6MTk6MjVaIGdlcmFsZCAkCisrICoKKysgKiBXaXJlc2hhcmsgLSBOZXR3b3JrIHRyYWZmaWMgYW5hbHl6ZXIKKysgKiBCeSBHZXJhbGQgQ29tYnMgPGdlcmFsZEB3aXJlc2hhcmsub3JnPgorKyAqIENvcHlyaWdodCAxOTk4IEdlcmFsZCBDb21icworKyAqCisrICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisrICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKysgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKysgKgorKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisrICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisrICoKKysgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisrICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKysgKi8KKysKKysjaWZkZWYgSEFWRV9DT05GSUdfSAorKyMgaW5jbHVkZSAiY29uZmlnLmgiCisrI2VuZGlmCisrCisrI2RlZmluZSBMSE5CX1NDVFBfUFBJX01NCTEKKysjZGVmaW5lIExITkJfU0NUUF9QUElfR01NCTYKKysKKysjZGVmaW5lIExITkJfU0NUUF9QT1JUCQk2MDA1CisrCisrI2luY2x1ZGUgPGdsaWIuaD4KKysKKysjaW5jbHVkZSA8ZXBhbi9wYWNrZXQuaD4KKysKKysvKiBJbml0aWFsaXplIHRoZSBwcm90b2NvbCBhbmQgcmVnaXN0ZXJlZCBmaWVsZHMgKi8KKytzdGF0aWMgaW50IHByb3RvX2xobmIgPSAtMTsKKysKKytzdGF0aWMgaW50IGhmX2xobmJfbGVuZ3RoID0gLTE7CisrCisrLyogSW5pdGlhbGl6ZSB0aGUgc3VidHJlZSBwb2ludGVycyAqLworK3N0YXRpYyBnaW50IGV0dF9saG5iID0gLTE7CisrCisrc3RhdGljIGRpc3NlY3Rvcl9oYW5kbGVfdCByYW5hcF9oYW5kbGU7CisrCisrLyogQ29kZSB0byBhY3R1YWxseSBkaXNzZWN0IHRoZSBwYWNrZXRzICovCisrc3RhdGljIHZvaWQKKytkaXNzZWN0X2xobmIodHZidWZmX3QgKnR2YiwgcGFja2V0X2luZm8gKnBpbmZvLCBwcm90b190cmVlICp0cmVlKQorK3sKKysKKysJaW50IG9mZnNldCA9IDA7CisrCXVfaW50MTZfdCBsZW47CisrCXR2YnVmZl90ICpuZXh0X3R2YjsKKysKKysJY29sX3NldF9zdHIocGluZm8tPmNpbmZvLCBDT0xfUFJPVE9DT0wsICJMSE5CIik7CisrCWNvbF9jbGVhcihwaW5mby0+Y2luZm8sIENPTF9JTkZPKTsKKysKKysJcHJvdG9fdHJlZV9hZGRfaXRlbSh0cmVlLCBoZl9saG5iX2xlbmd0aCwgdHZiLCBvZmZzZXQrMiwgMiwgRkFMU0UpOworKwlsZW4gPSB0dmJfZ2V0X250b2hzKHR2Yiwgb2Zmc2V0KzIpOworKwluZXh0X3R2YiA9IHR2Yl9uZXdfc3Vic2V0KHR2Yiwgb2Zmc2V0KzIrNiwgbGVuLTQsIC0xKTsKKysKKysJY2FsbF9kaXNzZWN0b3IocmFuYXBfaGFuZGxlLCBuZXh0X3R2YiwgcGluZm8sIHRyZWUpOworK30KKysKKyt2b2lkIHByb3RvX3JlZ2lzdGVyX2x1Y2VudF9obmIodm9pZCkKKyt7CisrCXN0YXRpYyBoZl9yZWdpc3Rlcl9pbmZvIGhmW10gPSB7CisrCQl7JmhmX2xobmJfbGVuZ3RoLAorKwkJIHsiTGVuZ3RoIiwgImxobmIubGVuIiwKKysJCSAgRlRfVUlOVDE2LCBCQVNFX0RFQywgTlVMTCwgMHgwLCBOVUxMLCBIRklMTH0KKysJCSB9LAorKwl9OworKworKwlzdGF0aWMgZ2ludCAqZXR0W10gPSB7CisrCQkmZXR0X2xobmIsCisrCX07CisrCisrCXByb3RvX2xobmIgPQorKwkgICAgcHJvdG9fcmVnaXN0ZXJfcHJvdG9jb2woIkFsY2F0ZWwvTHVjZW50IEhvbWVOb2RlQiIsCisrCQkJCSAgICAiTHVjZW50IEhOQiIsICJsaG5iIik7CisrCisrCXByb3RvX3JlZ2lzdGVyX2ZpZWxkX2FycmF5KHByb3RvX2xobmIsIGhmLCBhcnJheV9sZW5ndGgoaGYpKTsKKysJcHJvdG9fcmVnaXN0ZXJfc3VidHJlZV9hcnJheShldHQsIGFycmF5X2xlbmd0aChldHQpKTsKKyt9CisrCisrdm9pZCBwcm90b19yZWdfaGFuZG9mZl9sdWNlbnRfaG5iKHZvaWQpCisreworKwlkaXNzZWN0b3JfaGFuZGxlX3QgbGhuYl9oYW5kbGU7CisrCisrCXJhbmFwX2hhbmRsZSA9IGZpbmRfZGlzc2VjdG9yKCJyYW5hcCIpOworKworKwlsaG5iX2hhbmRsZSA9IGNyZWF0ZV9kaXNzZWN0b3JfaGFuZGxlKGRpc3NlY3RfbGhuYiwgcHJvdG9fbGhuYik7CisrCisrCWRpc3NlY3Rvcl9hZGQoInNjdHAucHBpIiwgTEhOQl9TQ1RQX1BQSV9NTSwgbGhuYl9oYW5kbGUpOworKwlkaXNzZWN0b3JfYWRkKCJzY3RwLnBwaSIsIExITkJfU0NUUF9QUElfR01NLCBsaG5iX2hhbmRsZSk7CisrCWRpc3NlY3Rvcl9hZGQoInNjdHAucG9ydCIsIExITkJfU0NUUF9QT1JULCBsaG5iX2hhbmRsZSk7CisrfQorSW5kZXg6IHdpcmVzaGFyay9lcGFuL2Rpc3NlY3RvcnMvTWFrZWZpbGUuY29tbW9uCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLS0gd2lyZXNoYXJrLm9yaWcvZXBhbi9kaXNzZWN0b3JzL01ha2VmaWxlLmNvbW1vbgorKysrIHdpcmVzaGFyay9lcGFuL2Rpc3NlY3RvcnMvTWFrZWZpbGUuY29tbW9uCitAQCAtNjA1LDYgKzYwNSw3IEBACisgCXBhY2tldC1sb29wLmMJCVwKKyAJcGFja2V0LWxwZC5jCQlcCisgCXBhY2tldC1sc2MuYwkJXAorKwlwYWNrZXQtbHVjZW50X2huYi5jCVwKKyAJcGFja2V0LWx3YXBwLmMJCVwKKyAJcGFja2V0LWx3cmVzLmMJCVwKKyAJcGFja2V0LW0ycGEuYwkJXApkaWZmIC0tZ2l0IGEvd2lyZXNoYXJrL3JzbC1pcGFjY2Vzcy5wYXRjaCBiL3dpcmVzaGFyay9yc2wtaXBhY2Nlc3MucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZjMDljNQotLS0gL2Rldi9udWxsCisrKyBiL3dpcmVzaGFyay9yc2wtaXBhY2Nlc3MucGF0Y2gKQEAgLTAsMCArMSw2NTIgQEAKK0luZGV4OiB3aXJlc2hhcmsvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1yc2wuYworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tIHdpcmVzaGFyay5vcmlnL2VwYW4vZGlzc2VjdG9ycy9wYWNrZXQtcnNsLmMJMjAwOS0xMC0yMSAyMzowMzo0MS4wMDAwMDAwMDAgKzAyMDAKKysrKyB3aXJlc2hhcmsvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1yc2wuYwkyMDA5LTEwLTIyIDEwOjAyOjUxLjAwMDAwMDAwMCArMDIwMAorQEAgLTIsNiArMiw3IEBACisgICogUm91dGluZXMgZm9yIFJhZGlvIFNpZ25hbGxpbmcgTGluayAoUlNMKSBkaXNzZWN0aW9uLgorICAqCisgICogQ29weXJpZ2h0IDIwMDcsIEFuZGVycyBCcm9tYW4gPGFuZGVycy5icm9tYW5AZXJpY3Nzb24uY29tPgorKyAqIENvcHlyaWdodCAyMDA5LCBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICAqCisgICogJElkOiBwYWNrZXQtcnNsLmMgMjk5NDQgMjAwOS0wOS0xNiAxMzozOTozN1ogbW9ycmlzcyAkCisgICoKK0BAIC00NCw2ICs0NSw4IEBACisgI2luY2x1ZGUgPGVwYW4vbGFwZF9zYXBpLmg+CisgCisgI2luY2x1ZGUgInBhY2tldC1nc21fYV9jb21tb24uaCIKKysjaW5jbHVkZSAicGFja2V0LXJ0cC5oIgorKyNpbmNsdWRlICJwYWNrZXQtcnRjcC5oIgorIAorIC8qIEluaXRpYWxpemUgdGhlIHByb3RvY29sIGFuZCByZWdpc3RlcmVkIGZpZWxkcyAqLworIHN0YXRpYyBpbnQgcHJvdG9fcnNsCQk9IC0xOworQEAgLTExNyw2ICsxMjAsMjQgQEAKKyBzdGF0aWMgaW50IGhmX3JzbF9ydGQJCQkJPSAtMTsKKyBzdGF0aWMgaW50IGhmX3JzbF9kZWxheV9pbmQJCQk9IC0xOworIHN0YXRpYyBpbnQgaGZfcnNsX3RmbwkJCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX3NwZWVjaF9tb2RlX3MJCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX3NwZWVjaF9tb2RlX20JCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX2Nvbm5fc3RhdAkJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfY29ubl9pZAkJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfcnRwX3BheWxvYWQJCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX3J0cF9jc2RfZm10X2QJCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX3J0cF9jc2RfZm10X2lyCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX2xvY2FsX3BvcnQJCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX3JlbW90ZV9wb3J0CQkJPSAtMTsKKytzdGF0aWMgaW50IGhmX3JzbF9sb2NhbF9pcAkJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfcmVtb3RlX2lwCQkJPSAtMTsKKytzdGF0aWMgaW50IGhmX3JzbF9jc3RhdF90eF9wa3RzCQkJPSAtMTsKKytzdGF0aWMgaW50IGhmX3JzbF9jc3RhdF90eF9vY3RzCQkJPSAtMTsKKytzdGF0aWMgaW50IGhmX3JzbF9jc3RhdF9yeF9wa3RzCQkJPSAtMTsKKytzdGF0aWMgaW50IGhmX3JzbF9jc3RhdF9yeF9vY3RzCQkJPSAtMTsKKytzdGF0aWMgaW50IGhmX3JzbF9jc3RhdF9sb3N0X3BrdHMJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfY3N0YXRfaWFfaml0dGVyCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX2NzdGF0X2F2Z190eF9kbHkJCT0gLTE7CisgCisgLyogSW5pdGlhbGl6ZSB0aGUgc3VidHJlZSBwb2ludGVycyAqLworIHN0YXRpYyBpbnQgZXR0X3JzbCA9IC0xOworQEAgLTE3NCw2ICsxOTUsMTUgQEAKKyBzdGF0aWMgaW50IGV0dF9pZV9tZWFzX3Jlc19ubyA9IC0xOworIHN0YXRpYyBpbnQgZXR0X2llX21lc3NhZ2VfaWQgPSAtMTsKKyBzdGF0aWMgaW50IGV0dF9pZV9zeXNfaW5mb190eXBlID0gLTE7Cisrc3RhdGljIGludCBldHRfaWVfc3BlZWNoX21vZGUgPSAtMTsKKytzdGF0aWMgaW50IGV0dF9pZV9jb25uX3N0YXQgPSAtMTsKKytzdGF0aWMgaW50IGV0dF9pZV9jb25uX2lkID0gLTE7Cisrc3RhdGljIGludCBldHRfaWVfcmVtb3RlX2lwID0gLTE7Cisrc3RhdGljIGludCBldHRfaWVfcmVtb3RlX3BvcnQgPSAtMTsKKytzdGF0aWMgaW50IGV0dF9pZV9sb2NhbF9wb3J0ID0gLTE7Cisrc3RhdGljIGludCBldHRfaWVfbG9jYWxfaXAgPSAtMTsKKytzdGF0aWMgaW50IGV0dF9pZV9ydHBfcGF5bG9hZCA9IC0xOworKworIAorIHByb3RvX3RyZWUgKnRvcF90cmVlOworIGRpc3NlY3Rvcl9oYW5kbGVfdCBnc21fYV9jY2NoX2hhbmRsZTsKK0BAIC0yMDksOCArMjM5LDExIEBACisgCXsgIDB4MDYsCQkiQ29tbW9uIENoYW5uZWwgTWFuYWdlbWVudCBtZXNzYWdlcyIgfSwKKyAJeyAgMHgwOCwJCSJUUlggTWFuYWdlbWVudCBtZXNzYWdlcyIgfSwKKyAJeyAgMHgxNiwJCSJMb2NhdGlvbiBTZXJ2aWNlcyBtZXNzYWdlcyIgfSwKKysJeyAgMHgzZiwJCSJpcC5hY2Nlc3MgVmVuZG9yIFNwZWNpZmljIG1lc3NhZ2VzIiB9LAorIAl7IDAsCQkJTlVMTCB9CisgfTsKKysjZGVmaW5lIFJTTF9NU0dESVNDX0lQQUNDRVNTCTB4M2YKKysKKyAvKgorICAqIDkuMiBNRVNTQUdFIFRZUEUKKyAgKi8KK0BAIC0yNzcsNiArMzEwLDQ5IEBACisgCS8qIAkwIDEgLSAtIC0gLSAtIC0gTG9jYXRpb24gU2VydmljZXMgbWVzc2FnZXM6ICovCisgI2RlZmluZSBSU0xfTVNHX0xPQ19JTkYJCQkJCTY1CS8qIDguNy4xICovCisgCisrLyogVmVuZG9yLVNwZWNpZmljIG1lc3NhZ2VzIG9mIGlwLmFjY2VzcyBuYW5vQlRTLiBUaGVyZSBpcyBubyBwdWJsaWMgZG9jdW1lbnRhdGlvbgorKyAqIGFib3V0IHRob3NlIGV4dGVuc2lvbnMsIGFsbCBpbmZvcm1hdGlvbiBpbiB0aGlzIGRpc3NlY3RvciBpcyBiYXNlZCBvbiBsYXdmdWwKKysgKiBwcm90b2NvbCByZXZlcnNlIGVuZ2luZXJpbmcgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4gKi8KKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX01FQVNfUFBfREVGCTB4NjAKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX0hPX0NBTkRfSU5RCTB4NjEKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX0hPX0NBTkRfUkVTUAkweDYyCisrCisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19QRENIX0FDVAkweDQ4CisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19QRENIX0FDVF9BQ0sJMHg0OQorKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfUERDSF9BQ1RfTkFDSwkweDRhCisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19QRENIX0RFQUNUCTB4NGIKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfREVBQ1RfQUNLIDB4NGMKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfREVBQ1RfTkFDSyAweDRkCisrCisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19CSU5ECQkweDcwCisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19CSU5EX0FDSwkweDcxCisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19CSU5EX05BQ0sJMHg3MgorKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfQ09OTkVDVAkweDczCisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19DT05ORUNUX0FDSwkweDc0CisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19DT05ORUNUX05BQ0sJMHg3NQorKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfRElTQ19JTkQJMHg3NgorKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfRElTQwkJMHg3NworKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfRElTQ19BQ0sJMHg3OAorKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfRElTQ19OQUNLCTB4NzkKKysKKysjZGVmaW5lIFJTTF9JRV9JUEFDX1NSVFBfQ09ORklHCQkweGUwCisrI2RlZmluZSBSU0xfSUVfSVBBQ19QUk9YWV9VRFAJCTB4ZTEKKysjZGVmaW5lIFJTTF9JRV9JUEFDX0JTQ01QTF9UT1VUCQkweGUyCisrI2RlZmluZSBSU0xfSUVfSVBBQ19SRU1PVEVfSVAJCTB4ZjAKKysjZGVmaW5lIFJTTF9JRV9JUEFDX1JFTU9URV9QT1JUCQkweGYxCisrI2RlZmluZSBSU0xfSUVfSVBBQ19SVFBfUEFZTE9BRAkJMHhmMgorKyNkZWZpbmUgUlNMX0lFX0lQQUNfTE9DQUxfUE9SVAkJMHhmMworKyNkZWZpbmUgUlNMX0lFX0lQQUNfU1BFRUNIX01PREUJCTB4ZjQKKysjZGVmaW5lIFJTTF9JRV9JUEFDX0xPQ0FMX0lQCQkweGY1CisrI2RlZmluZSBSU0xfSUVfSVBBQ19DT05OX1NUQVQJCTB4ZjYKKysjZGVmaW5lIFJTTF9JRV9JUEFDX0hPX0NfUEFSTVMJCTB4ZjcKKysjZGVmaW5lIFJTTF9JRV9JUEFDX0NPTk5fSUQJCTB4ZjgKKysjZGVmaW5lIFJTTF9JRV9JUEFDX1JUUF9DU0RfRk1UCQkweGY5CisrI2RlZmluZSBSU0xfSUVfSVBBQ19SVFBfSklUX0JVRgkJMHhmYQorKyNkZWZpbmUgUlNMX0lFX0lQQUNfUlRQX0NPTVBSCQkweGZiCisrI2RlZmluZSBSU0xfSUVfSVBBQ19SVFBfUEFZTE9BRDIJMHhmYworKyNkZWZpbmUgUlNMX0lFX0lQQUNfUlRQX01QTEVYCQkweGZkCisrI2RlZmluZSBSU0xfSUVfSVBBQ19SVFBfTVBMRVhfSUQJMHhmZQorIAorIHN0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgcnNsX21zZ190eXBlX3ZhbHNbXSA9IHsKKyAJICAvKiAJMCAwIDAgMCAtIC0gLSAtIFJhZGlvIExpbmsgTGF5ZXIgTWFuYWdlbWVudCBtZXNzYWdlczogKi8KK0BAIC0zMzksNiArNDE1LDI2IEBACisgCXsgIDB4M2YsCSJURk8gTU9EaWZpY2F0aW9uIFJFUXVlc3QiIH0sCQkJCQkvKiA4LjQuMzEgKi8KKyAJLyogCTAgMSAtIC0gLSAtIC0gLSBMb2NhdGlvbiBTZXJ2aWNlcyBtZXNzYWdlczogKi8KKyAJeyAgMHg0MSwJIkxvY2F0aW9uIEluZm9ybWF0aW9uIiB9LAkJCQkJCS8qIDguNy4xICovCisrCS8qIGlwLmFjY2VzcyAqLworKwl7ICAweDQ4LAkiaXAuYWNjZXNzIFBEQ0ggQUNUSVZBVElPTiIgfSwKKysJeyAgMHg0OSwJImlwLmFjY2VzcyBQRENIIEFDVElWQVRJT04gQUNLIiB9LAorKwl7ICAweDRhLAkiaXAuYWNjZXNzIFBEQ0ggQUNUSVZBVElPTiBOQUNLIiB9LAorKwl7ICAweDRiLAkiaXAuYWNjZXNzIFBEQ0ggREVBQ1RJVkFUSU9OIiB9LAorKwl7ICAweDRjLAkiaXAuYWNjZXNzIFBEQ0ggREVBQ1RJVkFUSU9OIEFDSyIgfSwKKysJeyAgMHg0ZCwJImlwLmFjY2VzcyBQRENIIERFQUNUSVZBVElPTiBOQUNLIiB9LAorKwl7ICAweDYwLAkiaXAuYWNjZXNzIE1FQVN1cmVtZW50IFBSRVBST0Nlc3NpbmcgRGVGYXVMVCIgfSwKKysJeyAgMHg2MSwJImlwLmFjY2VzcyBIQU5ET292ZXIgQ0FORGlkYXRlIEVOUXVpcnkiIH0sCisrCXsgIDB4NjIsCSJpcC5hY2Nlc3MgSEFORE9vdmVyIENBTkRpZGF0ZSBSRVNQb25zZSIgfSwKKysJeyAgMHg3MCwJImlwLmFjY2VzcyBDUkNYIiB9LAorKwl7ICAweDcxLAkiaXAuYWNjZXNzIENSQ1ggQUNLIiB9LAorKwl7ICAweDcyLAkiaXAuYWNjZXNzIENSQ1ggTkFDSyIgfSwKKysJeyAgMHg3MywJImlwLmFjY2VzcyBNRENYIiB9LAorKwl7ICAweDc0LAkiaXAuYWNjZXNzIE1EQ1ggQUNLIiB9LAorKwl7ICAweDc1LAkiaXAuYWNjZXNzIE1EQ1ggTkFDSyIgfSwKKysJeyAgMHg3NiwJImlwLmFjY2VzcyBETENYIElORGljYXRpb24iIH0sCisrCXsgIDB4NzcsCSJpcC5hY2Nlc3MgRExDWCIgfSwKKysJeyAgMHg3OCwJImlwLmFjY2VzcyBETENYIEFDSyIgfSwKKysJeyAgMHg3OSwJImlwLmFjY2VzcyBETENYIE5BQ0siIH0sCisgCXsgMCwJCU5VTEwgfQorIH07CisgCitAQCAtMzcyLDEwICs0NjgsMTAgQEAgc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyByc2xfbXNnX3R5cGVfdmFsc1tdID0geworICNkZWZpbmUgUlNMX0lFX01FU1NBR0VfSUQJCTI4CisgCisgI2RlZmluZSBSU0xfSUVfU1lTX0lORk9fVFlQRQkzMAorLQorLQorLQorLQorKyNkZWZpbmUgUlNMX0lFX01TX1BPV0VSX1BBUkFNCQkzMQorKyNkZWZpbmUgUlNMX0lFX0JTX1BPV0VSX1BBUkFNCQkzMgorKyNkZWZpbmUgUlNMX0lFX1BSRVBST0NfUEFSQU0JCTMzCisrI2RlZmluZSBSU0xfSUVfUFJFUFJPQ19NRUFTCQkzNAorICNkZWZpbmUgUlNMX0lFX0ZVTExfSU1NX0FTU19JTkYJCQkzNQorICNkZWZpbmUgUlNMX0lFX1NNU0NCX0lORgkJCQkzNgorICNkZWZpbmUgUlNMX0lFX0ZVTExfTVNfVElNSU5HX09GRlNFVAkzNworQEAgLTQ3OCw2ICs1NzQsMjQgQEAKKyAJCQlOb3QgdXNlZAorIAorIAkqLworKwl7IDB4ZTAsCQkiU1JUUCBDb25maWd1cmF0aW9uIiB9LAorKwl7IDB4ZTEsCQkiQlNDIFByb3h5IFVEUCBQb3J0IiB9LAorKwl7IDB4ZTIsCQkiQlNDIE11bHRpcGxleCBUaW1lb3V0IiB9LAorKwl7IDB4ZjAsCQkiUmVtb3RlIElQIEFkZHJlc3MiIH0sCisrCXsgMHhmMSwJCSJSZW1vdGUgUlRQIFBvcnQiIH0sCisrCXsgMHhmMiwJCSJSVFAgUGF5bG9hZCBUeXBlIiB9LAorKwl7IDB4ZjMsCQkiTG9jYWwgUlRQIFBvcnQiIH0sCisrCXsgMHhmNCwJCSJTcGVlY2ggTW9kZSIgfSwKKysJeyAweGY1LAkJIkxvY2FsIElQIEFkZHJlc3MiIH0sCisrCXsgMHhmNiwJCSJDb25uZWN0aW9uIFN0YXRpc3RpY3MiIH0sCisrCXsgMHhmNywJCSJIYW5kb3ZlciBDIFBhcmFtZXRlcnMiIH0sCisrCXsgMHhmOCwJCSJDb25uZWN0aW9uIElkZW50aWZpZXIiIH0sCisrCXsgMHhmOSwJCSJSVFAgQ1NEIEZvcm1hdCIgfSwKKysJeyAweGZhLAkJIlJUUCBKaXR0ZXIgQnVmZmVyIiB9LAorKwl7IDB4ZmIsCQkiUlRQIENvbXByZXNzaW9uIiB9LAorKwl7IDB4ZmMsCQkiUlRQIFBheWxvYWQgVHlwZSAyIiB9LAorKwl7IDB4ZmQsCQkiUlRQIE11bHRpcGxleCIgfSwKKysJeyAweGZlLAkJIlJUUCBNdWx0aXBsZXggSWRlbnRpZmllciIgfSwKKyAJeyAwLAkJCU5VTEwgfQorIH07CisgCitAQCAtNTE0LDYgKzYyOCw5NiBAQAorIAl7IDAsCQkJTlVMTCB9CisgfTsKKyAKKysvKiBGcm9tIG9wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3Rsdi5oICovCisrZW51bSB0bHZfdHlwZSB7CisrCVRMVl9UWVBFX0ZJWEVELAorKwlUTFZfVFlQRV9ULAorKwlUTFZfVFlQRV9UViwKKysJVExWX1RZUEVfVExWLAorKwlUTFZfVFlQRV9UTDE2ViwKKyt9OworKworK3N0cnVjdCB0bHZfZGVmIHsKKysJZW51bSB0bHZfdHlwZSB0eXBlOworKwl1X2ludDhfdCBmaXhlZF9sZW47CisrfTsKKysKKytzdHJ1Y3QgdGx2X2RlZmluaXRpb24geworKwlzdHJ1Y3QgdGx2X2RlZiBkZWZbMHhmZl07CisrfTsKKysKKytzdGF0aWMgY29uc3Qgc3RydWN0IHRsdl9kZWZpbml0aW9uIHJzbF9hdHRfdGx2ZGVmID0geworKwkuZGVmID0geworKwkJW1JTTF9JRV9DSF9OT10JCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfTElOS19JRF0JCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9BQ1RfVFlQRV0JCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9CU19QT1ddCQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX0NIX0lEXQkJCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfQ0hfTU9ERV0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfRU5DX0lORl0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfRlJBTUVfTk9dCQk9IHsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtSU0xfSUVfSE9fUkVGXQkJCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9MMV9JTkZdCQkJPSB7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrCQlbUlNMX0lFX0wzX0lORl0JCQk9IHsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtSU0xfSUVfTVNfSURdCQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9NU19QT1ddCQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX1BBR0lOR19HUlBdCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfUEFHSU5HX0xPQURdCQk9IHsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtSU0xfSUVfUEhZX0NUWF0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfQUNDRVNTX0RFTEFZXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX1JBQ0hfTE9BRF0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfUkVRX1JFRl0JCT0geyBUTFZfVFlQRV9GSVhFRCwgMyB9LAorKwkJW1JTTF9JRV9SRUxfTU9ERV0JCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9SRVNPVVJDRV9JTkZdCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX1JMTV9DQVVTRV0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfU1RBUlRJTkdfVElNRV0JCT0geyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW1JTTF9JRV9USU1JTkdfQURWXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX1VQTElOS19NRUFTXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9DQVVTRV0JCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX01FQVNfUkVTX05PXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX01FU1NBR0VfSURdCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfU1lTX0lORk9fVFlQRV0JCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9NU19QT1dFUl9QQVJBTV0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfQlNfUE9XRVJfUEFSQU1dCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX1BSRVBST0NfUEFSQU1dCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX1BSRVBST0NfTUVBU10JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCS8vW1JTTF9JRV9JTU1fQVNTX0lORk9dCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQkvL1tSU0xfSUVfU01TQ0JfSU5GT10JCT0geyBUTFZfVFlQRV9GSVhFRCwgMjMgfSwKKysJCS8vW1JTTF9JRV9NU19USU1JTkdfT0ZGU0VUXQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfRVJSX01TR10JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfRlVMTF9CQ0NIX0lORl0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfQ0hfTkVFREVEXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX0NCX0NNRF9UWVBFXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX1NNU0NCX01FU1NdCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX0ZVTExfSU1NX0FTU19JTkZdCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCS8vW1JTTF9JRV9TQUNDSF9JTkZPXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9DQkNIX0xPQURfSU5GXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX1NNU0NCX0NIX0lORF0JCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9HUlBfQ0FMTF9SRUZdCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX0NIX0RFU0NdCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX05DSF9EUlhfSU5GXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9DTURfSU5EXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9FTUxQUF9QUklPXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX1VJQ10JCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX01BSU5fQ0hfUkVGXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX01VTFRJUkFURV9DT05GXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9NVUxUSVJBVEVfQ05UUkxdCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9TVVBfQ09ERUNfVFlQRVNdCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfQ09ERUNfQ09ORl0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfUlREXQkJCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9URk9fU1RBVFVTXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX0xMUF9BUERVXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9JUEFDX1JFTU9URV9JUF0JCT0geyBUTFZfVFlQRV9GSVhFRCwgNCB9LAorKwkJW1JTTF9JRV9JUEFDX1JFTU9URV9QT1JUXQk9IHsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtSU0xfSUVfSVBBQ19MT0NBTF9JUF0JCT0geyBUTFZfVFlQRV9GSVhFRCwgNCB9LAorKwkJW1JTTF9JRV9JUEFDX0NPTk5fU1RBVF0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfSVBBQ19MT0NBTF9QT1JUXQk9IHsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtSU0xfSUVfSVBBQ19TUEVFQ0hfTU9ERV0JPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX0lQQUNfQ09OTl9JRF0JCT0geyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW1JTTF9JRV9JUEFDX1JUUF9QQVlMT0FEMl0JPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCX0sCisrfTsKKysKKyAvKiA5LjMuMSBDaGFubmVsIG51bWJlcgkJCTkuMy4xCU0gVFYgMiAqLworIHN0YXRpYyBpbnQKKyBkaXNzZWN0X3JzbF9pZV9jaF9ubyh0dmJ1ZmZfdCAqdHZiLCBwYWNrZXRfaW5mbyAqcGluZm8gX1VfLCBwcm90b190cmVlICp0cmVlLCBpbnQgb2Zmc2V0LCBnYm9vbGVhbiBpc19tYW5kYXRvcnkpCitAQCAtMjA0NCw3ICsyMjQ4LDYgQEAKKyAJcHJvdG9faXRlbV9zZXRfbGVuKHRpLCBsZW5ndGgrMik7CisgCisgCXByb3RvX3RyZWVfYWRkX2l0ZW0oaWVfdHJlZSwgaGZfcnNsX2llX2xlbmd0aCwgdHZiLCBvZmZzZXQsIDEsIEZBTFNFKTsKKy0Jb2Zmc2V0Kys7CisgCisgCS8qIFJlY2VpdmVkIE1lc3NhZ2UgKi8KKyAJb2Zmc2V0ID0gZGlzc2N0X3JzbF9tc2codHZiLCBwaW5mbywgaWVfdHJlZSwgb2Zmc2V0KTsKK0BAIC0yOTA5LDEyICszMTEyLDE4MyBAQAorIH0KKyAKKyBzdGF0aWMgaW50CisrZGlzc2N0X3JzbF9pcGFjY2Vzc19tc2codHZidWZmX3QgKnR2YiwgcGFja2V0X2luZm8gKnBpbmZvLCBwcm90b190cmVlICp0cmVlLAkJCQkgICAgaW50IG9mZnNldCkKKyt7CisrCWd1aW50OCBtc2dfdHlwZTsKKysJZ3VpbnQzMiBsb2NhbF9hZGRyID0gMDsKKysJZ3VpbnQxNiBsb2NhbF9wb3J0ID0gMDsKKysJYWRkcmVzcyBzcmNfYWRkcjsKKysKKysJbXNnX3R5cGUgPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCkmMHg3ZjsKKysJb2Zmc2V0Kys7CisrCisrI2lmIDAKKysJc3dpdGNoIChtc2dfdHlwZSkgeworKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX0JJTkQ6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfQklORF9BQ0s6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfQklORF9OQUNLOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX0NPTk5FQ1Q6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfQ09OTkVDVF9BQ0s6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfQ09OTkVDVF9OQUNLOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX0RJU0NfSU5EOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX0RJU0M6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfRElTQ19BQ0s6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfRElTQ19OQUNLOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfQUNUOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfQUNUX0FDSzoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19QRENIX0FDVF9OQUNLOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfREVBQ1Q6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfUERDSF9ERUFDVF9BQ0s6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfUERDSF9ERUFDVF9OQUNLOgorKwkJLyogQ2hhbm5lbCBudW1iZXIJCQk5LjMuMQlNIFRWIDIJCSovCisrCQlvZmZzZXQgPSBkaXNzZWN0X3JzbF9pZV9jaF9ubyh0dmIsIHBpbmZvLCB0cmVlLCBvZmZzZXQsIFRSVUUpOworKwkJYnJlYWs7CisrCX0KKysjZW5kaWYKKysJLyogcGFyc2UgVExWIGF0dHJpYnV0ZXMgKi8KKysJd2hpbGUgKHR2Yl9yZXBvcnRlZF9sZW5ndGhfcmVtYWluaW5nKHR2Yiwgb2Zmc2V0KSAhPSAwKSB7CisrCQlndWludDggdGFnOworKwkJdW5zaWduZWQgaW50IGxlbiwgaGxlbiwgbGVuX2xlbjsKKysJCWNvbnN0IHN0cnVjdCB0bHZfZGVmICp0ZGVmOworKwkJcHJvdG9faXRlbSAqdGk7CisrCQlwcm90b190cmVlICppZV90cmVlOworKworKwkJdGFnID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQpOworKwkJdGRlZiA9ICZyc2xfYXR0X3RsdmRlZi5kZWZbdGFnXTsKKysKKysJCXN3aXRjaCAodGRlZi0+dHlwZSkgeworKwkJY2FzZSBUTFZfVFlQRV9GSVhFRDoKKysJCQlobGVuID0gMTsKKysJCQlsZW5fbGVuID0gMDsKKysJCQlsZW4gPSB0ZGVmLT5maXhlZF9sZW47CisrCQkJYnJlYWs7CisrCQljYXNlIFRMVl9UWVBFX1Q6CisrCQkJaGxlbiA9IDE7CisrCQkJbGVuX2xlbiA9IDA7CisrCQkJbGVuID0gMDsKKysJCQlicmVhazsKKysJCWNhc2UgVExWX1RZUEVfVFY6CisrCQkJaGxlbiA9IDE7CisrCQkJbGVuX2xlbiA9IDA7CisrCQkJbGVuID0gMTsKKysJCQlicmVhazsKKysJCWNhc2UgVExWX1RZUEVfVExWOgorKwkJCWhsZW4gPSAyOworKwkJCWxlbl9sZW4gPSAxOworKwkJCWxlbiA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KzEpOworKwkJCWJyZWFrOworKwkJY2FzZSBUTFZfVFlQRV9UTDE2VjoKKysJCQlobGVuID0gMzsKKysJCQlsZW5fbGVuID0gMjsKKysJCQlsZW4gPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCsxKSA8PCA4IHwKKysJCQkJCXR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KzIpOworKwkJCWJyZWFrOworKwkJZGVmYXVsdDoKKysJCQlobGVuID0gbGVuX2xlbiA9IGxlbiA9IDA7CisrCQkJRElTU0VDVE9SX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworKwkJCWJyZWFrOworKwkJfQorKworKwkJdGkgPSBwcm90b190cmVlX2FkZF9pdGVtKHRyZWUsIGhmX3JzbF9pZV9pZCwgdHZiLCBvZmZzZXQsIDEsIEZBTFNFKTsKKysJCWllX3RyZWUgPSBwcm90b19pdGVtX2FkZF9zdWJ0cmVlKHRpLCBldHRfaWVfbG9jYWxfcG9ydCk7CisrCQlvZmZzZXQgKz0gaGxlbjsKKysKKysJCXN3aXRjaCAodGFnKSB7CisrCQljYXNlIFJTTF9JRV9DSF9OTzoKKysJCQlkaXNzZWN0X3JzbF9pZV9jaF9ubyh0dmIsIHBpbmZvLCBpZV90cmVlLCBvZmZzZXQsIEZBTFNFKTsKKysJCQlicmVhazsKKysJCWNhc2UgUlNMX0lFX0ZSQU1FX05POgorKwkJCWRpc3NlY3RfcnNsX2llX2ZyYW1lX25vKHR2YiwgcGluZm8sIGllX3RyZWUsIG9mZnNldCwgRkFMU0UpOworKwkJCWJyZWFrOworKwkJY2FzZSBSU0xfSUVfTVNfUE9XOgorKwkJCWRpc3NlY3RfcnNsX2llX21zX3Bvdyh0dmIsIHBpbmZvLCBpZV90cmVlLCBvZmZzZXQsIEZBTFNFKTsKKysJCQlicmVhazsKKysJCWNhc2UgUlNMX0lFX0lQQUNfUkVNT1RFX0lQOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oaWVfdHJlZSwgaGZfcnNsX3JlbW90ZV9pcCwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBGQUxTRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIFJTTF9JRV9JUEFDX1JFTU9URV9QT1JUOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oaWVfdHJlZSwgaGZfcnNsX3JlbW90ZV9wb3J0LCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIEZBTFNFKTsKKysJCQlicmVhazsKKysJCWNhc2UgUlNMX0lFX0lQQUNfTE9DQUxfSVA6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfbG9jYWxfaXAsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgRkFMU0UpOworKwkJCWxvY2FsX2FkZHIgPSB0dmJfZ2V0X2lwdjQodHZiLCBvZmZzZXQpOworKwkJCWJyZWFrOworKwkJY2FzZSBSU0xfSUVfSVBBQ19MT0NBTF9QT1JUOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oaWVfdHJlZSwgaGZfcnNsX2xvY2FsX3BvcnQsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgRkFMU0UpOworKwkJCWxvY2FsX3BvcnQgPSB0dmJfZ2V0X250b2hzKHR2Yiwgb2Zmc2V0KTsKKysJCQlicmVhazsKKysJCWNhc2UgUlNMX0lFX0lQQUNfU1BFRUNIX01PREU6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfc3BlZWNoX21vZGVfcywgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBGQUxTRSk7CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfc3BlZWNoX21vZGVfbSwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBGQUxTRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIFJTTF9JRV9JUEFDX1JUUF9QQVlMT0FEOgorKwkJY2FzZSBSU0xfSUVfSVBBQ19SVFBfUEFZTE9BRDI6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfcnRwX3BheWxvYWQsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgRkFMU0UpOworKwkJCWJyZWFrOworKwkJY2FzZSBSU0xfSUVfSVBBQ19SVFBfQ1NEX0ZNVDoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9ydHBfY3NkX2ZtdF9kLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIEZBTFNFKTsKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9ydHBfY3NkX2ZtdF9pciwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBGQUxTRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIFJTTF9JRV9JUEFDX0NPTk5fSUQ6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfY29ubl9pZCwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBGQUxTRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIFJTTF9JRV9JUEFDX0NPTk5fU1RBVDoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9jc3RhdF90eF9wa3RzLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCA0LCBGQUxTRSk7CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfY3N0YXRfdHhfb2N0cywgdHZiLAorKwkJCQkJICAgIG9mZnNldCs0LCA0LCBGQUxTRSk7CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfY3N0YXRfcnhfcGt0cywgdHZiLAorKwkJCQkJICAgIG9mZnNldCs4LCA0LCBGQUxTRSk7CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfY3N0YXRfcnhfb2N0cywgdHZiLAorKwkJCQkJICAgIG9mZnNldCsxMiwgNCwgRkFMU0UpOworKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oaWVfdHJlZSwgaGZfcnNsX2NzdGF0X2xvc3RfcGt0cywgdHZiLAorKwkJCQkJICAgIG9mZnNldCsxNiwgNCwgRkFMU0UpOworKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oaWVfdHJlZSwgaGZfcnNsX2NzdGF0X2lhX2ppdHRlciwgdHZiLAorKwkJCQkJICAgIG9mZnNldCsyMCwgNCwgRkFMU0UpOworKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oaWVfdHJlZSwgaGZfcnNsX2NzdGF0X2F2Z190eF9kbHksIHR2YiwKKysJCQkJCSAgICBvZmZzZXQrMjQsIDQsIEZBTFNFKTsKKysJCQlicmVhazsKKysJCX0KKysJCW9mZnNldCArPSBsZW47CisrCX0KKysKKysJc3dpdGNoIChtc2dfdHlwZSkgeworKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX0JJTkRfQUNLOgorKwkJLyogTm90aWZ5IHRoZSBSVFAgYW5kIFJUQ1AgZGlzc2VjdG9ycyBhYm91dCBhIG5ldyBSVFAgc3RyZWFtICovCisrCQlzcmNfYWRkci50eXBlID0gQVRfSVB2NDsKKysJCXNyY19hZGRyLmxlbiA9IDQ7CisrCQlzcmNfYWRkci5kYXRhID0gKGd1aW50OCAqKSZsb2NhbF9hZGRyOworKwkJcnRwX2FkZF9hZGRyZXNzKHBpbmZvLCAmc3JjX2FkZHIsIGxvY2FsX3BvcnQsIDAsCisrCQkJCSJHU00gQS1iaXMvSVAiLCBwaW5mby0+ZmQtPm51bSwgMCwgTlVMTCk7CisrCQlydGNwX2FkZF9hZGRyZXNzKHBpbmZvLCAmc3JjX2FkZHIsIGxvY2FsX3BvcnQrMSwgMCwKKysJCQkJICJHU00gQS1iaXMvSVAiLCBwaW5mby0+ZmQtPm51bSk7CisrCQlicmVhazsKKysJfQorKwlyZXR1cm4gb2Zmc2V0OworK30KKysKKytzdGF0aWMgaW50CisgZGlzc2N0X3JzbF9tc2codHZidWZmX3QgKnR2YiwgcGFja2V0X2luZm8gKnBpbmZvLCBwcm90b190cmVlICp0cmVlLCBpbnQgb2Zmc2V0KQorIHsKKy0JZ3VpbnQ4CW1zZ190eXBlOworKwlndWludDgJbXNnX2Rpc2MsIG1zZ190eXBlOworIAorKwltc2dfZGlzYyA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KyspID4+IDE7CisgCW1zZ190eXBlID0gdHZiX2dldF9ndWludDgodHZiLG9mZnNldCkmMHg3ZjsKKyAJcHJvdG9fdHJlZV9hZGRfaXRlbSh0cmVlLCBoZl9yc2xfbXNnX3R5cGUsIHR2Yiwgb2Zmc2V0LCAxLCBGQUxTRSk7CisrCisrCWlmIChtc2dfZGlzYyA9PSBSU0xfTVNHRElTQ19JUEFDQ0VTUykgeworKwkJb2Zmc2V0ID0gZGlzc2N0X3JzbF9pcGFjY2Vzc19tc2codHZiLCBwaW5mbywgdHJlZSwgb2Zmc2V0KTsKKysJCXJldHVybiBvZmZzZXQ7CisrCX0KKyAJb2Zmc2V0Kys7CisgCisgCXN3aXRjaCAobXNnX3R5cGUpeworQEAgLTM0ODIsNiArMzg1NiwxOCBAQAorIAkJLyogTExQIEFQRFUgOS4zLjU4IE0gTFYgMi1OICovCisgCQlvZmZzZXQgPSBkaXNzZWN0X3JzbF9pZV9sbHBfYXBkdSh0dmIsIHBpbmZvLCB0cmVlLCBvZmZzZXQsIFRSVUUpOworIAkJYnJlYWs7CisrCS8qIHRoZSBmb2xsb3dpbmcgbWVzc2FnZXMgYXJlIGlwLmFjY2VzcyBzcGVjaWZpYyBidXQgc2VudCB3aXRob3V0CisrCSAqIGlwLmFjY2VzcyBtZW1zc2FnZSBkaXNjcmltaW5hdG9yICovCisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfTUVBU19QUF9ERUY6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfSE9fQ0FORF9JTlE6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfSE9fQ0FORF9SRVNQOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfQUNUOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfQUNUX0FDSzoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19QRENIX0FDVF9OQUNLOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfREVBQ1Q6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfUERDSF9ERUFDVF9BQ0s6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfUERDSF9ERUFDVF9OQUNLOgorKwkJb2Zmc2V0ID0gZGlzc2N0X3JzbF9pcGFjY2Vzc19tc2codHZiLCBwaW5mbywgdHJlZSwgb2Zmc2V0LTEpOworIAlkZWZhdWx0OgorIAkJYnJlYWs7CisgCX0KK0BAIC0zNDg5LDYgKzM4NzUsNDAgQEAKKyAJcmV0dXJuIG9mZnNldDsKKyAKKyB9CisrCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyByc2xfaXBhY2Nfc3BtX3NfdmFsc1tdID0geworKwl7IDAsCSJHU00gRlIgY29kZWMgKEdTTSB0eXBlIDEsIEZTKSIgfSwKKysJeyAxLAkiR1NNIEVGUiBjb2RlYyAoR1NNIHR5cGUgMiwgRlMpIiB9LAorKwl7IDIsIAkiR1NNIEFNUi9GUiBjb2RlYyAoR1NNIHR5cGUgMywgRlMpIiB9LAorKwl7IDMsCSJHU00gSFIgY29kZWMgKEdTTSB0eXBlIDEsIEhTKSIgfSwKKysJeyA1LAkiR1NNIEFNUi9IUiBjb2RlYyAoR1NNIHR5cGUgMywgSFMpIiB9LAorKwl7IDB4ZiwJIkFzIHNwZWNpZmllZCBieSBSVFAgUGF5bG9hZCBUeXBlIElFIiB9LAorKwl7IDAsCU5VTEwgfQorK307CisrCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyByc2xfaXBhY2Nfc3BtX21fdmFsc1tdID0geworKwl7IDAsCSJTZW5kIGFuZCBSZWNlaXZlIiB9LAorKwl7IDEsCSJSZWNlaXZlIE9ubHkiIH0sCisrCXsgMiwJIlNlbmQgT25seSIgfSwKKysJeyAwLCAJTlVMTCB9CisrfTsKKysKKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIHJzbF9pcGFjY19ydHBfY3NkX2ZtdF9kX3ZhbHNbXSA9IHsKKysJeyAwLAkiRXh0ZXJuYWwgVFJBVSBmb3JtYXQiIH0sCisrCXsgMSwJIk5vbi1UUkFVIFBhY2tlZCBmb3JtYXQiIH0sCisrCXsgMiwJIlRSQVUgd2l0aGluIHRoZSBCVFMiIH0sCisrCXsgMywJIklXRi1GcmVlIEJUUy1CVFMgRGF0YSIgfSwKKysJeyAwLCAJTlVMTCB9CisrfTsKKysKKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIHJzbF9pcGFjY19ydHBfY3NkX2ZtdF9pcl92YWxzW10gPSB7CisrCXsgMCwJIjhrYi9zIiB9LAorKwl7IDEsCSIxNmtiL3MiIH0sCisrCXsgMiwJIjMya2IvcyIgfSwKKysJeyAzLAkiNjRrYi9zIiB9LAorKwl7IDAsCU5VTEwgfQorK307CisrCisgc3RhdGljIHZvaWQKKyBkaXNzZWN0X3JzbCh0dmJ1ZmZfdCAqdHZiLCBwYWNrZXRfaW5mbyAqcGluZm8sIHByb3RvX3RyZWUgKnRyZWUpCisgeworQEAgLTM1MTYsNyArMzkzNiw2IEBACisgCQkvKiA5LjEgTWVzc2FnZSBkaXNjcmltaW5hdG9yICovCisgCQlwcm90b190cmVlX2FkZF9pdGVtKHJzbF90cmVlLCBoZl9yc2xfbXNnX2RzYywgdHZiLCBvZmZzZXQsIDEsIEZBTFNFKTsKKyAJCXByb3RvX3RyZWVfYWRkX2l0ZW0ocnNsX3RyZWUsIGhmX3JzbF9UX2JpdCwgdHZiLCBvZmZzZXQsIDEsIEZBTFNFKTsKKy0JCW9mZnNldCsrOworIAorIAkJb2Zmc2V0ID0gZGlzc2N0X3JzbF9tc2codHZiLCBwaW5mbywgcnNsX3RyZWUsIG9mZnNldCk7CisgCitAQCAtMzg4Niw2ICs0MzA1LDg2IEBACisgCQkJRlRfVUlOVDgsIEJBU0VfREVDLCBWQUxTKHJzbF9lbWxwcF9wcmlvX3ZhbHMpLCAweDAzLAorIAkJCU5VTEwsIEhGSUxMIH0KKyAJCX0sCisrCQl7ICZoZl9yc2xfc3BlZWNoX21vZGVfcywKKysJCQl7ICJpcC5hY2Nlc3MgU3BlZWNoIE1vZGUgUyIsICJyc2wuaXBhY2Muc3BlZWNoX21vZGVfcyIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIFZBTFMocnNsX2lwYWNjX3NwbV9zX3ZhbHMpLAorKwkJCSAgMHhmLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfcnNsX3NwZWVjaF9tb2RlX20sCisrCQkJeyAiaXAuYWNjZXNzIFNwZWVjaCBNb2RlIE0iLCAicnNsLmlwYWNjLnNwZWVjaF9tb2RlX20iLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBWQUxTKHJzbF9pcGFjY19zcG1fbV92YWxzKSwKKysJCQkgIDB4ZjAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9yc2xfY29ubl9zdGF0LAorKwkJCXsgImlwLmFjY2VzcyBDb25uZWN0aW9uIFN0YXRpc3RpY3MiLCJyc2wuaXBhY2MuY29ubl9zdGF0IiwKKysJCQkgIEZUX0JZVEVTLCBCQVNFX05PTkUsIE5VTEwsIDB4MCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX3JzbF9jb25uX2lkLAorKwkJCXsgImlwLmFjY2VzcyBDb25uZWN0aW9uIElEIiwJInJzbC5pcGFjYy5jb25uX2lkIiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDB4MCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX3JzbF9ydHBfcGF5bG9hZCwKKysJCQl7ICJpcC5hY2Nlc3MgUlRQIFBheWxvYWQgVHlwZSIsCSJyc2wuaXBhY2MucnRwX3BheWxvYWQiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfREVDLCBOVUxMLCAweDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9yc2xfcnRwX2NzZF9mbXRfZCwKKysJCQl7ICJpcC5hY2Nlc3MgUlRQIENTRCBGb3JtYXQgRCIsICJyc2wuaXBhY2MucnRwX2NzZF9mbXRfZCIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIFZBTFMocnNsX2lwYWNjX3J0cF9jc2RfZm10X2RfdmFscyksCisrCQkJICAweDBmLCBOVUxMLCBIRklMTCB9LAorKwkJfSwKKysJCXsgJmhmX3JzbF9ydHBfY3NkX2ZtdF9pciwKKysJCQl7ICJpcC5hY2Nlc3MgUlRQIENTRCBGb3JtYXQgSVIiLCAicnNsLmlwYWNjLnJ0cF9jc2RfZm10X2lyIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhyc2xfaXBhY2NfcnRwX2NzZF9mbXRfaXJfdmFscyksCisrCQkJICAweGYwLCBOVUxMLCBIRklMTCB9LAorKwkJfSwKKysJCXsgJmhmX3JzbF9sb2NhbF9wb3J0LAorKwkJCXsgImlwLmFjY2VzcyBMb2NhbCBSVFAgUG9ydCIsCSJyc2wuaXBhY2MubG9jYWxfcG9ydCIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAweDAsCisrCQkJICAiaXAuYWNjZXNzIExvY2FsIFJUUCBQb3J0IiwgSEZJTEwgfSwKKysJCX0sCisrCQl7ICZoZl9yc2xfcmVtb3RlX3BvcnQsCisrCQkJeyAiaXAuYWNjZXNzIFJlbW90ZSBSVFAgUG9ydCIsCSJyc2wuaXBhY2MucmVtb3RlX3BvcnQiLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0RFQywgTlVMTCwgMHgwLAorKwkJCSAgImlwLmFjY2VzcyBSZW1vdGUgUlRQIFBvcnQiLCBIRklMTCB9LAorKwkJfSwKKysJCXsgJmhmX3JzbF9sb2NhbF9pcCwKKysJCQl7ICJpcC5hY2Nlc3MgTG9jYWwgSVAgQWRkcmVzcyIsCSJyc2wuaXBhY2MubG9jYWxfaXAiLAorKwkJCSAgRlRfSVB2NCwgQkFTRV9OT05FLCBOVUxMLCAweDAsCisrCQkJICAiaXAuYWNjZXNzIExvY2FsIElQIEFkZHJlc3MiLCBIRklMTCB9LAorKwkJfSwKKysJCXsgJmhmX3JzbF9yZW1vdGVfaXAsCisrCQkJeyAiaXAuYWNjZXNzIFJlbW90ZSBJUCBBZGRyZXNzIiwgInJzbC5pcGFjYy5yZW1vdGVfaXAiLAorKwkJCSAgRlRfSVB2NCwgQkFTRV9OT05FLCBOVUxMLCAweDAsCisrCQkJICAiaXAuYWNjZXNzIFJlbW90ZSBJUCBBZGRyZXNzIiwgSEZJTEwgfSwKKysJCX0sCisrCQl7ICZoZl9yc2xfY3N0YXRfdHhfcGt0cywKKysJCQl7ICJQYWNrZXRzIFNlbnQiLCAicnNsLmlwYWNjLmNzdGF0LnR4X3BrdHMiLAorKwkJCSAgRlRfVUlOVDMyLCBCQVNFX0RFQywgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX3JzbF9jc3RhdF90eF9vY3RzLAorKwkJCXsgIk9jdGV0cyBTZW50IiwgInJzbC5pcGFjYy5jc3RhdC50eF9vY3RldHMiLAorKwkJCSAgRlRfVUlOVDMyLCBCQVNFX0RFQywgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX3JzbF9jc3RhdF9yeF9wa3RzLAorKwkJCXsgIlBhY2tldHMgUmVjZWl2ZWQiLCAicnNsLmlwYWNjLmNzdGF0LnJ4X3BrdHMiLAorKwkJCSAgRlRfVUlOVDMyLCBCQVNFX0RFQywgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX3JzbF9jc3RhdF9yeF9vY3RzLAorKwkJCXsgIk9jdGV0cyBSZWNlaXZlZCIsICJyc2wuaXBhY2MuY3N0YXQucnhfb2N0ZXRzIiwKKysJCQkgIEZUX1VJTlQzMiwgQkFTRV9ERUMsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9yc2xfY3N0YXRfbG9zdF9wa3RzLAorKwkJCXsgIlBhY2tldHMgTG9zdCIsICJyc2wuaXBhY2MuY3N0YXQubG9zdF9wa3RzIiwKKysJCQkgIEZUX1VJTlQzMiwgQkFTRV9ERUMsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9yc2xfY3N0YXRfaWFfaml0dGVyLAorKwkJCXsgIkludGVyLWFycml2YWwgSml0dGVyIiwgInJzbC5pcGFjYy5jc3RhdC5pYV9qaXR0ZXIiLAorKwkJCSAgRlRfVUlOVDMyLCBCQVNFX0RFQywgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX3JzbF9jc3RhdF9hdmdfdHhfZGx5LAorKwkJCXsgIkF2ZXJhZ2UgVHggRGVsYXkiLCAicnNsLmlwYWNjLmNzdGF0LmF2Z190eF9kZWxheSIsCisrCQkJICBGVF9VSU5UMzIsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorIAl9OworIAlzdGF0aWMgZ2ludCAqZXR0W10gPSB7CisgCQkmZXR0X3JzbCwKK0BAIC0zOTQzLDYgKzQ0NDIsMTQgQEAKKyAJCSZldHRfaWVfbWVhc19yZXNfbm8sCisgCQkmZXR0X2llX21lc3NhZ2VfaWQsCisgCQkmZXR0X2llX3N5c19pbmZvX3R5cGUsCisrCQkmZXR0X2llX3NwZWVjaF9tb2RlLAorKwkJJmV0dF9pZV9jb25uX3N0YXQsCisrCQkmZXR0X2llX2Nvbm5faWQsCisrCQkmZXR0X2llX3JlbW90ZV9pcCwKKysJCSZldHRfaWVfcmVtb3RlX3BvcnQsCisrCQkmZXR0X2llX2xvY2FsX3BvcnQsCisrCQkmZXR0X2llX2xvY2FsX2lwLAorKwkJJmV0dF9pZV9ydHBfcGF5bG9hZCwKKyAJfTsKKyAKKyAJLyogUmVnaXN0ZXIgdGhlIHByb3RvY29sIG5hbWUgYW5kIGRlc2NyaXB0aW9uICovCmRpZmYgLS1naXQgYS93aXJlc2hhcmsvcnNsLXN5c3RlbV9pbmZvLnBhdGNoIGIvd2lyZXNoYXJrL3JzbC1zeXN0ZW1faW5mby5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTQ1YzY1Ci0tLSAvZGV2L251bGwKKysrIGIvd2lyZXNoYXJrL3JzbC1zeXN0ZW1faW5mby5wYXRjaApAQCAtMCwwICsxLDEzIEBACitJbmRleDogd2lyZXNoYXJrL2VwYW4vZGlzc2VjdG9ycy9wYWNrZXQtcnNsLmMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLSB3aXJlc2hhcmsub3JpZy9lcGFuL2Rpc3NlY3RvcnMvcGFja2V0LXJzbC5jCisrKysgd2lyZXNoYXJrL2VwYW4vZGlzc2VjdG9ycy9wYWNrZXQtcnNsLmMKK0BAIC0yMjkxLDcgKzIyOTEsNyBAQAorIAorIAlwcm90b190cmVlX2FkZF90ZXh0KGllX3RyZWUsIHR2YixvZmZzZXQsbGVuZ3RoLCJMYXllciAzIG1lc3NhZ2UiKTsKKyAJbmV4dF90dmIgPSB0dmJfbmV3X3N1YnNldCh0dmIsIG9mZnNldCwgbGVuZ3RoLCBsZW5ndGgpOworLQkvKiBjYWxsX2Rpc3NlY3Rvcihnc21fYV9kdGFwX2hhbmRsZSwgbmV4dF90dmIsIHBpbmZvLCB0b3BfdHJlZSk7Ki8KKysJY2FsbF9kaXNzZWN0b3IoZ3NtX2FfY2NjaF9oYW5kbGUsIG5leHRfdHZiLCBwaW5mbywgdG9wX3RyZWUpOworIAorIAlvZmZzZXQgPSBvZmZzZXQgKyBsZW5ndGg7CisgCg==