ZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lczEzNzEuYyBiL3NvdW5kL29zcy9lczEzNzEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTBmZGRhCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2VzMTM3MS5jCkBAIC0wLDAgKzEsMzA5NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogICAgICBlczEzNzEuYyAgLS0gIENyZWF0aXZlIEVuc29uaXEgRVMxMzcxLgorICoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDEsIDIwMDMgIFRob21hcyBTYWlsZXIgKHQuc2FpbGVyQGFsdW1uaS5ldGh6LmNoKQorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiBTcGVjaWFsIHRoYW5rcyB0byBFbnNvbmlxCisgKgorICogIFN1cHBvcnRlZCBkZXZpY2VzOgorICogIC9kZXYvZHNwICAgIHN0YW5kYXJkIC9kZXYvZHNwIGRldmljZSwgKG1vc3RseSkgT1NTIGNvbXBhdGlibGUKKyAqICAvZGV2L21peGVyICBzdGFuZGFyZCAvZGV2L21peGVyIGRldmljZSwgKG1vc3RseSkgT1NTIGNvbXBhdGlibGUKKyAqICAvZGV2L2RzcDEgICBhZGRpdGlvbmFsIERBQywgbGlrZSAvZGV2L2RzcCwgYnV0IG91dHB1dHMgdG8gbWl4ZXIgIlNZTlRIIiBzZXR0aW5nCisgKiAgL2Rldi9taWRpICAgc2ltcGxlIE1JREkgVUFSVCBpbnRlcmZhY2UsIG5vIGlvY3RsCisgKgorICogIE5PVEU6IHRoZSBjYXJkIGRvZXMgbm90IGhhdmUgYW55IEZNL1dhdmV0YWJsZSBzeW50aGVzaXplciwgaXQgaXMgc3VwcG9zZWQKKyAqICB0byBiZSBkb25lIGluIHNvZnR3YXJlLiBUaGF0IGlzIHdoYXQgL2Rldi9kYWMgaXMgZm9yLiBCeSBub3cgKFEyIDE5OTgpCisgKiAgdGhlcmUgYXJlIHNldmVyYWwgTUlESSB0byBQQ00gKFdBVikgcGFja2FnZXMsIG9uZSBvZiB0aGVtIGlzIHRpbWlkaXR5LgorICoKKyAqICBSZXZpc2lvbiBoaXN0b3J5CisgKiAgICAwNC4wNi4xOTk4ICAgMC4xICAgSW5pdGlhbCByZWxlYXNlCisgKiAgICAgICAgICAgICAgICAgICAgICAgTWl4ZXIgc3R1ZmYgc2hvdWxkIGJlIG92ZXJoYXVsZWQ7IGVzcGVjaWFsbHkgb3B0aW9uYWwgQUM5NyBtaXhlciBiaXRzCisgKiAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIGRldGVjdGVkLiBUaGlzIHJlc3VsdHMgaW4gc3RyYW5nZSBiZWhhdmlvdXIgb2Ygc29tZSBtaXhlcgorICogICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLCBsaWtlIG1hc3RlciB2b2x1bWUgYW5kIG1pYy4KKyAqICAgIDA4LjA2LjE5OTggICAwLjIgICBGaXJzdCByZWxlYXNlIHVzaW5nIEFsYW4gQ294JyBzb3VuZGNvcmUgaW5zdGVhZCBvZiBtaXNjZGV2aWNlCisgKiAgICAwMy4wOC4xOTk4ICAgMC4zICAgRG8gbm90IGluY2x1ZGUgbW9kdmVyc2lvbnMuaAorICogICAgICAgICAgICAgICAgICAgICAgIE5vdyBtaXhlciBiZWhhdmlvdXIgY2FuIGJhc2ljYWxseSBiZSBzZWxlY3RlZCBiZXR3ZWVuCisgKiAgICAgICAgICAgICAgICAgICAgICAgIk9TUyBkb2N1bWVudGVkIiBhbmQgIk9TUyBhY3R1YWwiIGJlaGF2aW91cgorICogICAgMzEuMDguMTk5OCAgIDAuNCAgIEZpeCByZWFscGxheWVyIHByb2JsZW1zIC0gZGFjLmNvdW50IGlzc3VlcworICogICAgMjcuMTAuMTk5OCAgIDAuNSAgIEZpeCBqb3lzdGljayBzdXBwb3J0CisgKiAgICAgICAgICAgICAgICAgICAgICAgLS0gT2xpdmVyIE5ldWt1bSAoYzE4OEBvcmcuY2hlbWllLnVuaS1tdWVuY2hlbi5kZSkKKyAqICAgIDEwLjEyLjE5OTggICAwLjYgICBGaXggZHJhaW5fZGFjIHRyeWluZyB0byB3YWl0IG9uIG5vdCB5ZXQgaW5pdGlhbGl6ZWQgRE1BCisgKiAgICAyMy4xMi4xOTk4ICAgMC43ICAgRml4IGEgZmV3IGZfZmlsZSAmIEZNT0RFXyBidWdzCisgKiAgICAgICAgICAgICAgICAgICAgICAgRG9uJ3Qgd2FrZSB1cCBhcHAgdW50aWwgdGhlcmUgYXJlIGZyYWdzaXplIGJ5dGVzIHRvIHJlYWQvd3JpdGUKKyAqICAgIDA2LjAxLjE5OTkgICAwLjggICByZW1vdmUgdGhlIHNpbGx5IFNBX0lOVEVSUlVQVCBmbGFnLgorICogICAgICAgICAgICAgICAgICAgICAgIGhvcGVmdWxseSBraWxsZWQgdGhlIGVnY3Mgc2VjdGlvbiB0eXBlIGNvbmZsaWN0CisgKiAgICAxMi4wMy4xOTk5ICAgMC45ICAgY2luZm8uYmxvY2tzIHNob3VsZCBiZSByZXNldCBhZnRlciBHRVR4UFRSIGlvY3RsLgorICogICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydGVkIGJ5IEpvaGFuIE1hZXMgPGpvbWFAdGVsaW5kdXMuYmU+CisgKiAgICAyMi4wMy4xOTk5ICAgMC4xMCAgcmV0dXJuIEVBR0FJTiBpbnN0ZWFkIG9mIEVCVVNZIHdoZW4gT19OT05CTE9DSworICogICAgICAgICAgICAgICAgICAgICAgIHJlYWQvd3JpdGUgY2Fubm90IGJlIGV4ZWN1dGVkCisgKiAgICAwNy4wNC4xOTk5ICAgMC4xMSAgaW1wbGVtZW50ZWQgdGhlIGZvbGxvd2luZyBpb2N0bCdzOiBTT1VORF9QQ01fUkVBRF9SQVRFLCAKKyAqICAgICAgICAgICAgICAgICAgICAgICBTT1VORF9QQ01fUkVBRF9DSEFOTkVMUywgU09VTkRfUENNX1JFQURfQklUUzsgCisgKiAgICAgICAgICAgICAgICAgICAgICAgQWxwaGEgZml4ZXMgcmVwb3J0ZWQgYnkgUGV0ZXIgSm9uZXMgPHBqb25lc0ByZWRoYXQuY29tPgorICogICAgICAgICAgICAgICAgICAgICAgIEFub3RoZXIgQWxwaGEgZml4ICh3YWl0X3NyY19yZWFkeSBpbiBpbml0IHJvdXRpbmUpCisgKiAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZWQgYnkgIkl2YW4gTi4gS29rc2hheXNreSIgPGlua0BqdXJhc3NpYy5wYXJrLm1zdS5ydT4KKyAqICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBqb3lzdGljayBhZGRyZXNzIGhhbmRsaW5nIG1pZ2h0IHN0aWxsIGJlIHdyb25nIG9uIGFyY2hzCisgKiAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIgdGhhbiBpMzg2CisgKiAgICAxNS4wNi4xOTk5ICAgMC4xMiAgRml4IGJhZCBhbGxvY2F0aW9uIGJ1Zy4KKyAqICAgICAgICAgICAgICAgICAgICAgICBUaGFua3MgdG8gRGV0aSBGbGllZ2wgPGZsaWVnbEBpbi50dW0uZGU+CisgKiAgICAyOC4wNi4xOTk5ICAgMC4xMyAgQWRkIHBjaV9zZXRfbWFzdGVyCisgKiAgICAwMy4wOC4xOTk5ICAgMC4xNCAgYWRhcHQgdG8gTGludXMnIG5ldyBfX3NldHVwL19faW5pdGNhbGwKKyAqICAgICAgICAgICAgICAgICAgICAgICBhZGRlZCBrZXJuZWwgY29tbWFuZCBsaW5lIG9wdGlvbiAiZXMxMzcxPWpveXN0aWNrYWRkciIKKyAqICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVkIENPTkZJR19TT1VORF9FUzEzNzFfSk9ZUE9SVF9CT09UIGtsdWRnZQorICogICAgMTAuMDguMTk5OSAgIDAuMTUgIChSZSlhZGRlZCBTL1BESUYgbW9kdWxlIG9wdGlvbiBmb3IgY2FyZHMgcmV2aXNpb24gPj0gNC4KKyAqICAgICAgICAgICAgICAgICAgICAgICBJbml0aWFsIHZlcnNpb24gYnkgRGF2ZSBQbGF0dCA8ZHBsYXR0QHNudWxidWcubXR2aWV3LmNhLnVzPi4KKyAqICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVfaW5pdC9fX3NldHVwIGZpeGVzCisgKiAgICAwOC4xNi4xOTk5ICAgMC4xNiAgSm9lIENvdGVsbGVzZSA8am9lY0BlbnNvbmlxLmNvbT4KKyAqICAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBkZXRlY3Rpb24gZm9yIEVTMTM3MSByZXZpc2lvbiBJRCBzbyB0aGF0IHdlIGNhbgorICogICAgICAgICAgICAgICAgICAgICAgIGRldGVjdCB0aGUgRVMxMzczIGFuZCBsYXRlciBwYXJ0cy4KKyAqICAgICAgICAgICAgICAgICAgICAgICBhZGRlZCBBQzk3ICNkZWZpbmVzIGZvciByZWFkYWJpbGl0eQorICogICAgICAgICAgICAgICAgICAgICAgIGFkZGVkIGEgL3Byb2MgZmlsZSBzeXN0ZW0gZm9yIGR1bXBpbmcgaGFyZHdhcmUgc3RhdGUKKyAqICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkIFNSQyBhbmQgQ09ERUMgdy9yIGZ1bmN0aW9ucyB0byBhY2NvbW1vZGF0ZSBidWdzCisgKiAgICAgICAgICAgICAgICAgICAgICAgaW4gc29tZSB2ZXJzaW9ucyBvZiB0aGUgRVMxMzd4IGNoaXBzLgorICogICAgMzEuMDguMTk5OSAgIDAuMTcgIGFkZCBzcGluX2xvY2tfaW5pdAorICogICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VkIGN1cnJlbnQtPnN0YXRlID0geCB3aXRoIHNldF9jdXJyZW50X3N0YXRlKHgpCisgKiAgICAwMy4wOS4xOTk5ICAgMC4xOCAgY2hhbmdlIHJlYWQgc2VtYW50aWNzIGZvciBNSURJIHRvIG1hdGNoCisgKiAgICAgICAgICAgICAgICAgICAgICAgT1NTIG1vcmUgY2xvc2VseTsgcmVtb3ZlIHBvc3NpYmxlIHdha2V1cCByYWNlCisgKiAgICAyMS4xMC4xOTk5ICAgMC4xOSAgUm91bmQgc2FtcGxpbmcgcmF0ZXMsIHJlcXVlc3RlZCBieQorICogICAgICAgICAgICAgICAgICAgICAgIEthc2FtYXRzdSBLZW5pY2hpIDx0Mjl3MDI2N0BpcC5tZWRpYS5reW90by11LmFjLmpwPgorICogICAgMjcuMTAuMTk5OSAgIDAuMjAgIEFkZGVkIFNpZ21hVGVsIDNEIGVuaGFuY2VtZW50IHN0cmluZworICogICAgICAgICAgICAgICAgICAgICAgIENvZGVjIElEIHByaW50aW5nIGNoYW5nZXMKKyAqICAgIDI4LjEwLjE5OTkgICAwLjIxICBNb3JlIHdhaXRxdWV1ZSByYWNlcyBmaXhlZAorICogICAgICAgICAgICAgICAgICAgICAgIEpvZSBDb3RlbGxlc2UgPGpvZWNAZW5zb25pcS5jb20+CisgKiAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlZCBQQ0kgZGV0ZWN0aW9uIHJvdXRpbmUgc28gd2UgY2FuIG1vcmUgZWFzaWx5CisgKiAgICAgICAgICAgICAgICAgICAgICAgZGV0ZWN0IEVTMTM3eCBjaGlwIGFuZCBkZXJpdmF0aXZlcy4KKyAqICAgIDA1LjAxLjIwMDAgICAwLjIyICBTaG91bGQgbm93IHdvcmsgd2l0aCByZXY3IGJvYXJkczsgcGF0Y2ggYnkKKyAqICAgICAgICAgICAgICAgICAgICAgICBFcmljIExlbWFyLCBlbGVtYXJAY3Mud2FzaGluZ3Rvbi5lZHUKKyAqICAgIDA4LjAxLjIwMDAgICAwLjIzICBQcmV2ZW50IHNvbWUgaW9jdGwncyBmcm9tIHJldHVybmluZyBiYWQgY291bnQgdmFsdWVzIG9uIHVuZGVycnVuL292ZXJydW47CisgKiAgICAgICAgICAgICAgICAgICAgICAgVGltIEphbmlrJ3MgQlNFIChCZWRldmlsbGVkIFNvdW5kIEVuZ2luZSkgZm91bmQgdGhpcworICogICAgMDcuMDIuMjAwMCAgIDAuMjQgIFVzZSBwY2lfYWxsb2NfY29uc2lzdGVudCBhbmQgcGNpX3JlZ2lzdGVyX2RyaXZlcgorICogICAgMDcuMDIuMjAwMCAgIDAuMjUgIFVzZSBhYzk3X2NvZGVjCisgKiAgICAwMS4wMy4yMDAwICAgMC4yNiAgU1BESUYgcGF0Y2ggYnkgTWlrYWVsIEJvdWlsbG90IDxtaWthZWwuYm91aWxsb3RAYmlnZm9vdC5jb20+CisgKiAgICAgICAgICAgICAgICAgICAgICAgVXNlIHBjaV9tb2R1bGVfaW5pdAorICogICAgMjEuMTEuMjAwMCAgIDAuMjcgIEluaXRpYWxpemUgZG1hIGJ1ZmZlcnMgaW4gcG9sbCwgb3RoZXJ3aXNlIHBvbGwgbWF5IHJldHVybiBhIGJvZ3VzIG1hc2sKKyAqICAgIDEyLjEyLjIwMDAgICAwLjI4ICBNb3JlIGRtYSBidWZmZXIgaW5pdGlhbGl6YXRpb25zLCBwYXRjaCBmcm9tCisgKiAgICAgICAgICAgICAgICAgICAgICAgVGplZXJkIE11bGRlciA8dGplZXJkLm11bGRlckBmdWppdHN1LXNpZW1lbnMuY29tPgorICogICAgMDUuMDEuMjAwMSAgIDAuMjkgIEhvcGVmdWxseSB1cGRhdGVzIHdpbGwgbm90IGJlIHJlcXVpcmVkIGFueW1vcmUgd2hlbiBDcmVhdGl2ZSBidW1wcworICogICAgICAgICAgICAgICAgICAgICAgIHRoZSBDVDU4ODAgcmV2aXNpb24uCisgKiAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGVkIGJ5IFN0ZXBoYW4gTfxsbGVyIDxzbXVlbGxlckBjaHJvbm94LmRlPgorICogICAgMzEuMDEuMjAwMSAgIDAuMzAgIFJlZ2lzdGVyL1VucmVnaXN0ZXIgZ2FtZXBvcnQKKyAqICAgICAgICAgICAgICAgICAgICAgICBGaXggU0VUVFJJR0dFUiBub24gT1NTIEFQSSBjb25mb3JtaXR5CisgKiAgICAxNC4wNy4yMDAxICAgMC4zMSAgQWRkIGxpc3Qgb2YgbGFwdG9wcyBuZWVkaW5nIGFtcGxpZmllciBjb250cm9sCisgKiAgICAwMy4wMS4yMDAzICAgMC4zMiAgb3Blbl9tb2RlIGZpeGVzIGZyb20gR2VvcmcgQWNoZXIgPGFjaGVyQGluLnR1bS5kZT4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc291bmQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2FjOTdfY29kZWMuaD4KKyNpbmNsdWRlIDxsaW51eC9nYW1lcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyN1bmRlZiBPU1NfRE9DVU1FTlRFRF9NSVhFUl9TRU1BTlRJQ1MKKyNkZWZpbmUgRVMxMzcxX0RFQlVHCisjZGVmaW5lIERCRyh4KSB7fQorLyojZGVmaW5lIERCRyh4KSB7eH0qLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBQQ0lfVkVORE9SX0lEX0VOU09OSVEKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9FTlNPTklRICAgICAgICAweDEyNzQgICAgCisjZW5kaWYKKworI2lmbmRlZiBQQ0lfVkVORE9SX0lEX0VDVElWQQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0VDVElWQSAgICAgICAgIDB4MTEwMgorI2VuZGlmCisKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9FTlNPTklRX0VTMTM3MQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0VOU09OSVFfRVMxMzcxIDB4MTM3MQorI2VuZGlmCisKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9FTlNPTklRX0NUNTg4MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0VOU09OSVFfQ1Q1ODgwIDB4NTg4MAorI2VuZGlmCisKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9FQ1RJVkFfRVYxOTM4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRUNUSVZBX0VWMTkzOCAweDg5MzgKKyNlbmRpZgorCisvKiBFUzEzNzEgY2hpcCBJRCAqLworLyogVGhpcyBpcyBhIGxpdHRsZSBjb25mdXNpbmcgYmVjYXVzZSBhbGwgRVMxMzcxIGNvbXBhdGlibGUgY2hpcHMgaGF2ZSB0aGUKKyAgIHNhbWUgREVWSUNFX0lELCB0aGUgb25seSB0aGluZyBkaWZmZXJlbnRpYXRpbmcgdGhlbSBpcyB0aGUgUkVWX0lEIGZpZWxkLgorICAgVGhpcyBpcyBvbmx5IHNpZ25pZmljYW50IGlmIHlvdSB3YW50IHRvIGVuYWJsZSBmZWF0dXJlcyBvbiB0aGUgbGF0ZXIgcGFydHMuCisgICBZZXMsIEkga25vdyBpdCdzIHN0dXBpZCBhbmQgd2h5IGRpZG4ndCB3ZSB1c2UgdGhlIHN1YiBJRHM/CisqLworI2RlZmluZSBFUzEzNzFSRVZfRVMxMzczX0EgIDB4MDQKKyNkZWZpbmUgRVMxMzcxUkVWX0VTMTM3M19CICAweDA2CisjZGVmaW5lIEVTMTM3MVJFVl9DVDU4ODBfQSAgMHgwNworI2RlZmluZSBDVDU4ODBSRVZfQ1Q1ODgwX0MgIDB4MDIKKyNkZWZpbmUgQ1Q1ODgwUkVWX0NUNTg4MF9EICAweDAzCisjZGVmaW5lIEVTMTM3MVJFVl9FUzEzNzFfQiAgMHgwOQorI2RlZmluZSBFVjE5MzhSRVZfRVYxOTM4X0EgIDB4MDAKKyNkZWZpbmUgRVMxMzcxUkVWX0VTMTM3M184ICAweDA4CisKKyNkZWZpbmUgRVMxMzcxX01BR0lDICAoKFBDSV9WRU5ET1JfSURfRU5TT05JUTw8MTYpfFBDSV9ERVZJQ0VfSURfRU5TT05JUV9FUzEzNzEpCisKKyNkZWZpbmUgRVMxMzcxX0VYVEVOVCAgICAgICAgICAgICAweDQwCisjZGVmaW5lIEpPWV9FWFRFTlQgICAgICAgICAgICAgICAgOAorCisjZGVmaW5lIEVTMTM3MV9SRUdfQ09OVFJPTCAgICAgICAgMHgwMAorI2RlZmluZSBFUzEzNzFfUkVHX1NUQVRVUyAgICAgICAgIDB4MDQgLyogb24gdGhlIDU4ODAgaXQgaXMgY29udHJvbC9zdGF0dXMgKi8KKyNkZWZpbmUgRVMxMzcxX1JFR19VQVJUX0RBVEEgICAgICAweDA4CisjZGVmaW5lIEVTMTM3MV9SRUdfVUFSVF9TVEFUVVMgICAgMHgwOQorI2RlZmluZSBFUzEzNzFfUkVHX1VBUlRfQ09OVFJPTCAgIDB4MDkKKyNkZWZpbmUgRVMxMzcxX1JFR19VQVJUX1RFU1QgICAgICAweDBhCisjZGVmaW5lIEVTMTM3MV9SRUdfTUVNUEFHRSAgICAgICAgMHgwYworI2RlZmluZSBFUzEzNzFfUkVHX1NSQ09OViAgICAgICAgIDB4MTAKKyNkZWZpbmUgRVMxMzcxX1JFR19DT0RFQyAgICAgICAgICAweDE0CisjZGVmaW5lIEVTMTM3MV9SRUdfTEVHQUNZICAgICAgICAgMHgxOAorI2RlZmluZSBFUzEzNzFfUkVHX1NFUklBTF9DT05UUk9MIDB4MjAKKyNkZWZpbmUgRVMxMzcxX1JFR19EQUMxX1NDT1VOVCAgICAweDI0CisjZGVmaW5lIEVTMTM3MV9SRUdfREFDMl9TQ09VTlQgICAgMHgyOAorI2RlZmluZSBFUzEzNzFfUkVHX0FEQ19TQ09VTlQgICAgIDB4MmMKKworI2RlZmluZSBFUzEzNzFfUkVHX0RBQzFfRlJBTUVBRFIgIDB4YzMwCisjZGVmaW5lIEVTMTM3MV9SRUdfREFDMV9GUkFNRUNOVCAgMHhjMzQKKyNkZWZpbmUgRVMxMzcxX1JFR19EQUMyX0ZSQU1FQURSICAweGMzOAorI2RlZmluZSBFUzEzNzFfUkVHX0RBQzJfRlJBTUVDTlQgIDB4YzNjCisjZGVmaW5lIEVTMTM3MV9SRUdfQURDX0ZSQU1FQURSICAgMHhkMzAKKyNkZWZpbmUgRVMxMzcxX1JFR19BRENfRlJBTUVDTlQgICAweGQzNAorCisjZGVmaW5lIEVTMTM3MV9GTVRfVThfTU9OTyAgICAgMAorI2RlZmluZSBFUzEzNzFfRk1UX1U4X1NURVJFTyAgIDEKKyNkZWZpbmUgRVMxMzcxX0ZNVF9TMTZfTU9OTyAgICAyCisjZGVmaW5lIEVTMTM3MV9GTVRfUzE2X1NURVJFTyAgMworI2RlZmluZSBFUzEzNzFfRk1UX1NURVJFTyAgICAgIDEKKyNkZWZpbmUgRVMxMzcxX0ZNVF9TMTYgICAgICAgICAyCisjZGVmaW5lIEVTMTM3MV9GTVRfTUFTSyAgICAgICAgMworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2FtcGxlX3NpemVbXSA9IHsgMSwgMiwgMiwgNCB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNhbXBsZV9zaGlmdFtdID0geyAwLCAxLCAxLCAyIH07CisKKyNkZWZpbmUgQ1RSTF9SRUNFTl9CICAgIDB4MDgwMDAwMDAgIC8qIDEgPSBkb24ndCBtaXggYW5hbG9nIGluIHRvIGRpZ2l0YWwgb3V0ICovCisjZGVmaW5lIENUUkxfU1BESUZFTl9CICAweDA0MDAwMDAwCisjZGVmaW5lIENUUkxfSk9ZX1NISUZUICAyNAorI2RlZmluZSBDVFJMX0pPWV9NQVNLICAgMworI2RlZmluZSBDVFJMX0pPWV8yMDAgICAgMHgwMDAwMDAwMCAgLyogam95c3RpY2sgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIENUUkxfSk9ZXzIwOCAgICAweDAxMDAwMDAwCisjZGVmaW5lIENUUkxfSk9ZXzIxMCAgICAweDAyMDAwMDAwCisjZGVmaW5lIENUUkxfSk9ZXzIxOCAgICAweDAzMDAwMDAwCisjZGVmaW5lIENUUkxfR1BJT19JTjAgICAweDAwMTAwMDAwICAvKiBnZW5lcmFsIHB1cnBvc2UgaW5wdXRzL291dHB1dHMgKi8KKyNkZWZpbmUgQ1RSTF9HUElPX0lOMSAgIDB4MDAyMDAwMDAKKyNkZWZpbmUgQ1RSTF9HUElPX0lOMiAgIDB4MDA0MDAwMDAKKyNkZWZpbmUgQ1RSTF9HUElPX0lOMyAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgQ1RSTF9HUElPX09VVDAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgQ1RSTF9HUElPX09VVDEgIDB4MDAwMjAwMDAKKyNkZWZpbmUgQ1RSTF9HUElPX09VVDIgIDB4MDAwNDAwMDAKKyNkZWZpbmUgQ1RSTF9HUElPX09VVDMgIDB4MDAwODAwMDAKKyNkZWZpbmUgQ1RSTF9NU0ZNVFNFTCAgIDB4MDAwMDgwMDAgIC8qIE1QRUcgc2VyaWFsIGRhdGEgZm10OiAwID0gU29ueSwgMSA9IEkyUyAqLworI2RlZmluZSBDVFJMX1NZTkNSRVMgICAgMHgwMDAwNDAwMCAgLyogQUM5NyB3YXJtIHJlc2V0ICovCisjZGVmaW5lIENUUkxfQURDU1RPUCAgICAweDAwMDAyMDAwICAvKiBzdG9wIEFEQyB0cmFuc2ZlcnMgKi8KKyNkZWZpbmUgQ1RSTF9QV1JfSU5UUk0gIDB4MDAwMDEwMDAgIC8qIDEgPSBwb3dlciBsZXZlbCBpbnRzIGVuYWJsZWQgKi8KKyNkZWZpbmUgQ1RSTF9NX0NCICAgICAgIDB4MDAwMDA4MDAgIC8qIHJlY29yZGluZyBzb3VyY2U6IDAgPSBBREMsIDEgPSBNUEVHICovCisjZGVmaW5lIENUUkxfQ0NCX0lOVFJNICAweDAwMDAwNDAwICAvKiAxID0gQ0NCICJ2b2ljZSIgaW50cyBlbmFibGVkICovCisjZGVmaW5lIENUUkxfUERMRVYwICAgICAweDAwMDAwMDAwICAvKiBwb3dlciBkb3duIGxldmVsICovCisjZGVmaW5lIENUUkxfUERMRVYxICAgICAweDAwMDAwMTAwCisjZGVmaW5lIENUUkxfUERMRVYyICAgICAweDAwMDAwMjAwCisjZGVmaW5lIENUUkxfUERMRVYzICAgICAweDAwMDAwMzAwCisjZGVmaW5lIENUUkxfQlJFUSAgICAgICAweDAwMDAwMDgwICAvKiAxID0gdGVzdCBtb2RlIChpbnRlcm5hbCBtZW0gdGVzdCkgKi8KKyNkZWZpbmUgQ1RSTF9EQUMxX0VOICAgIDB4MDAwMDAwNDAgIC8qIGVuYWJsZSBEQUMxICovCisjZGVmaW5lIENUUkxfREFDMl9FTiAgICAweDAwMDAwMDIwICAvKiBlbmFibGUgREFDMiAqLworI2RlZmluZSBDVFJMX0FEQ19FTiAgICAgMHgwMDAwMDAxMCAgLyogZW5hYmxlIEFEQyAqLworI2RlZmluZSBDVFJMX1VBUlRfRU4gICAgMHgwMDAwMDAwOCAgLyogZW5hYmxlIE1JREkgdWFydCAqLworI2RlZmluZSBDVFJMX0pZU1RLX0VOICAgMHgwMDAwMDAwNCAgLyogZW5hYmxlIEpveXN0aWNrIHBvcnQgKi8KKyNkZWZpbmUgQ1RSTF9YVEFMQ0xLRElTIDB4MDAwMDAwMDIgIC8qIDEgPSBkaXNhYmxlIGNyeXN0YWwgY2xvY2sgaW5wdXQgKi8KKyNkZWZpbmUgQ1RSTF9QQ0lDTEtESVMgIDB4MDAwMDAwMDEgIC8qIDEgPSBkaXNhYmxlIFBDSSBjbG9jayBkaXN0cmlidXRpb24gKi8KKworCisjZGVmaW5lIFNUQVRfSU5UUiAgICAgICAweDgwMDAwMDAwICAvKiB3aXJlZCBvciBvZiBhbGwgaW50ZXJydXB0IGJpdHMgKi8KKyNkZWZpbmUgQ1NUQVRfNTg4MF9BQzk3X1JTVCAweDIwMDAwMDAwIC8qIENUNTg4MCBSZXNldCBiaXQgKi8KKyNkZWZpbmUgU1RBVF9FTl9TUERJRiAgIDB4MDAwNDAwMDAgIC8qIGVuYWJsZSBTL1BESUYgY2lyY3VpdHJ5ICovCisjZGVmaW5lIFNUQVRfVFNfU1BESUYgICAweDAwMDIwMDAwICAvKiB0ZXN0IFMvUERJRiBjaXJjdWl0cnkgKi8KKyNkZWZpbmUgU1RBVF9URVNUTU9ERSAgIDB4MDAwMTAwMDAgIC8qIHRlc3QgQVNJQyAqLworI2RlZmluZSBTVEFUX1NZTkNfRVJSICAgMHgwMDAwMDEwMCAgLyogMSA9IGNvZGVjIHN5bmMgZXJyb3IgKi8KKyNkZWZpbmUgU1RBVF9WQyAgICAgICAgIDB4MDAwMDAwYzAgIC8qIENDQiBpbnQgc291cmNlLCAwPURBQzEsIDE9REFDMiwgMj1BREMsIDM9dW5kZWYgKi8KKyNkZWZpbmUgU1RBVF9TSF9WQyAgICAgIDYKKyNkZWZpbmUgU1RBVF9NUFdSICAgICAgIDB4MDAwMDAwMjAgIC8qIHBvd2VyIGxldmVsIGludGVycnVwdCAqLworI2RlZmluZSBTVEFUX01DQ0IgICAgICAgMHgwMDAwMDAxMCAgLyogQ0NCIGludCBwZW5kaW5nICovCisjZGVmaW5lIFNUQVRfVUFSVCAgICAgICAweDAwMDAwMDA4ICAvKiBVQVJUIGludCBwZW5kaW5nICovCisjZGVmaW5lIFNUQVRfREFDMSAgICAgICAweDAwMDAwMDA0ICAvKiBEQUMxIGludCBwZW5kaW5nICovCisjZGVmaW5lIFNUQVRfREFDMiAgICAgICAweDAwMDAwMDAyICAvKiBEQUMyIGludCBwZW5kaW5nICovCisjZGVmaW5lIFNUQVRfQURDICAgICAgICAweDAwMDAwMDAxICAvKiBBREMgaW50IHBlbmRpbmcgKi8KKworI2RlZmluZSBVU1RBVF9SWElOVCAgICAgMHg4MCAgICAgICAgLyogVUFSVCByeCBpbnQgcGVuZGluZyAqLworI2RlZmluZSBVU1RBVF9UWElOVCAgICAgMHgwNCAgICAgICAgLyogVUFSVCB0eCBpbnQgcGVuZGluZyAqLworI2RlZmluZSBVU1RBVF9UWFJEWSAgICAgMHgwMiAgICAgICAgLyogVUFSVCB0eCByZWFkeSAqLworI2RlZmluZSBVU1RBVF9SWFJEWSAgICAgMHgwMSAgICAgICAgLyogVUFSVCByeCByZWFkeSAqLworCisjZGVmaW5lIFVDVFJMX1JYSU5URU4gICAweDgwICAgICAgICAvKiAxID0gZW5hYmxlIFJYIGludHMgKi8KKyNkZWZpbmUgVUNUUkxfVFhJTlRFTiAgIDB4NjAgICAgICAgIC8qIFRYIGludCBlbmFibGUgZmllbGQgbWFzayAqLworI2RlZmluZSBVQ1RSTF9FTkFfVFhJTlQgMHgyMCAgICAgICAgLyogZW5hYmxlIFRYIGludCAqLworI2RlZmluZSBVQ1RSTF9DTlRSTCAgICAgMHgwMyAgICAgICAgLyogY29udHJvbCBmaWVsZCAqLworI2RlZmluZSBVQ1RSTF9DTlRSTF9TV1IgMHgwMyAgICAgICAgLyogc29mdHdhcmUgcmVzZXQgY29tbWFuZCAqLworCisvKiBzYW1wbGUgcmF0ZSBjb252ZXJ0ZXIgKi8KKyNkZWZpbmUgU1JDX09LU1RBVEUgICAgICAgIDEKKworI2RlZmluZSBTUkNfUkFNQUREUl9NQVNLICAgMHhmZTAwMDAwMAorI2RlZmluZSBTUkNfUkFNQUREUl9TSElGVCAgMjUKKyNkZWZpbmUgU1JDX0RBQzFGUkVFWkUgICAgICgxVUwgPDwgMjEpCisjZGVmaW5lIFNSQ19EQUMyRlJFRVpFICAgICAgKDFVTCA8PCAyMCkKKyNkZWZpbmUgU1JDX0FEQ0ZSRUVaRSAgICAgICgxVUwgPDwgMTkpCisKKworI2RlZmluZSBTUkNfV0UgICAgICAgICAgICAgMHgwMTAwMDAwMCAgLyogcmVhZC93cml0ZSBjb250cm9sIGZvciBTUkMgUkFNICovCisjZGVmaW5lIFNSQ19CVVNZICAgICAgICAgICAweDAwODAwMDAwICAvKiBTUkMgYnVzeSAqLworI2RlZmluZSBTUkNfRElTICAgICAgICAgICAgMHgwMDQwMDAwMCAgLyogMSA9IGRpc2FibGUgU1JDICovCisjZGVmaW5lIFNSQ19EREFDMSAgICAgICAgICAweDAwMjAwMDAwICAvKiAxID0gZGlzYWJsZSBhY2N1bSB1cGRhdGUgZm9yIERBQzEgKi8KKyNkZWZpbmUgU1JDX0REQUMyICAgICAgICAgIDB4MDAxMDAwMDAgIC8qIDEgPSBkaXNhYmxlIGFjY3VtIHVwZGF0ZSBmb3IgREFDMiAqLworI2RlZmluZSBTUkNfREFEQyAgICAgICAgICAgMHgwMDA4MDAwMCAgLyogMSA9IGRpc2FibGUgYWNjdW0gdXBkYXRlIGZvciBBREMyICovCisjZGVmaW5lIFNSQ19DVExNQVNLICAgICAgICAweDAwNzgwMDAwCisjZGVmaW5lIFNSQ19SQU1EQVRBX01BU0sgICAweDAwMDBmZmZmCisjZGVmaW5lIFNSQ19SQU1EQVRBX1NISUZUICAwCisKKyNkZWZpbmUgU1JDUkVHX0FEQyAgICAgIDB4NzgKKyNkZWZpbmUgU1JDUkVHX0RBQzEgICAgIDB4NzAKKyNkZWZpbmUgU1JDUkVHX0RBQzIgICAgIDB4NzQKKyNkZWZpbmUgU1JDUkVHX1ZPTF9BREMgIDB4NmMKKyNkZWZpbmUgU1JDUkVHX1ZPTF9EQUMxIDB4N2MKKyNkZWZpbmUgU1JDUkVHX1ZPTF9EQUMyIDB4N2UKKworI2RlZmluZSBTUkNSRUdfVFJVTkNfTiAgICAgMHgwMAorI2RlZmluZSBTUkNSRUdfSU5UX1JFR1MgICAgMHgwMQorI2RlZmluZSBTUkNSRUdfQUNDVU1fRlJBQyAgMHgwMgorI2RlZmluZSBTUkNSRUdfVkZSRVFfRlJBQyAgMHgwMworCisjZGVmaW5lIENPREVDX1BJUkQgICAgICAgIDB4MDA4MDAwMDAgIC8qIDAgPSB3cml0ZSBBQzk3IHJlZ2lzdGVyICovCisjZGVmaW5lIENPREVDX1BJQUREX01BU0sgIDB4MDA3ZjAwMDAKKyNkZWZpbmUgQ09ERUNfUElBRERfU0hJRlQgMTYKKyNkZWZpbmUgQ09ERUNfUElEQVRfTUFTSyAgMHgwMDAwZmZmZgorI2RlZmluZSBDT0RFQ19QSURBVF9TSElGVCAwCisKKyNkZWZpbmUgQ09ERUNfUkRZICAgICAgICAgMHg4MDAwMDAwMCAgLyogQUM5NyByZWFkIGRhdGEgdmFsaWQgKi8KKyNkZWZpbmUgQ09ERUNfV0lQICAgICAgICAgMHg0MDAwMDAwMCAgLyogQUM5NyB3cml0ZSBpbiBwcm9ncmVzcyAqLworI2RlZmluZSBDT0RFQ19QT1JEICAgICAgICAweDAwODAwMDAwICAvKiAwID0gd3JpdGUgQUM5NyByZWdpc3RlciAqLworI2RlZmluZSBDT0RFQ19QT0FERF9NQVNLICAweDAwN2YwMDAwCisjZGVmaW5lIENPREVDX1BPQUREX1NISUZUIDE2CisjZGVmaW5lIENPREVDX1BPREFUX01BU0sgIDB4MDAwMGZmZmYKKyNkZWZpbmUgQ09ERUNfUE9EQVRfU0hJRlQgMAorCisKKyNkZWZpbmUgTEVHQUNZX0pGQVNUICAgICAgMHg4MDAwMDAwMCAgLyogZmFzdCBqb3lzdGljayB0aW1pbmcgKi8KKyNkZWZpbmUgTEVHQUNZX0ZJUlEgICAgICAgMHgwMTAwMDAwMCAgLyogZm9yY2UgSVJRICovCisKKyNkZWZpbmUgU0NUUkxfREFDVEVTVCAgICAgMHgwMDQwMDAwMCAgLyogMSA9IERBQyB0ZXN0LCB0ZXN0IHZlY3RvciBnZW5lcmF0aW9uIHB1cnBvc2VzICovCisjZGVmaW5lIFNDVFJMX1AyRU5ESU5DICAgIDB4MDAzODAwMDAgIC8qICAqLworI2RlZmluZSBTQ1RSTF9TSF9QMkVORElOQyAxOQorI2RlZmluZSBTQ1RSTF9QMlNUSU5DICAgICAweDAwMDcwMDAwICAvKiAgKi8KKyNkZWZpbmUgU0NUUkxfU0hfUDJTVElOQyAgMTYKKyNkZWZpbmUgU0NUUkxfUjFMT09QU0VMICAgMHgwMDAwODAwMCAgLyogMCA9IGxvb3AgbW9kZSAqLworI2RlZmluZSBTQ1RSTF9QMkxPT1BTRUwgICAweDAwMDA0MDAwICAvKiAwID0gbG9vcCBtb2RlICovCisjZGVmaW5lIFNDVFJMX1AxTE9PUFNFTCAgIDB4MDAwMDIwMDAgIC8qIDAgPSBsb29wIG1vZGUgKi8KKyNkZWZpbmUgU0NUUkxfUDJQQVVTRSAgICAgMHgwMDAwMTAwMCAgLyogMSA9IHBhdXNlIG1vZGUgKi8KKyNkZWZpbmUgU0NUUkxfUDFQQVVTRSAgICAgMHgwMDAwMDgwMCAgLyogMSA9IHBhdXNlIG1vZGUgKi8KKyNkZWZpbmUgU0NUUkxfUjFJTlRFTiAgICAgMHgwMDAwMDQwMCAgLyogZW5hYmxlIGludGVycnVwdCAqLworI2RlZmluZSBTQ1RSTF9QMklOVEVOICAgICAweDAwMDAwMjAwICAvKiBlbmFibGUgaW50ZXJydXB0ICovCisjZGVmaW5lIFNDVFJMX1AxSU5URU4gICAgIDB4MDAwMDAxMDAgIC8qIGVuYWJsZSBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgU0NUUkxfUDFTQ1RSTEQgICAgMHgwMDAwMDA4MCAgLyogcmVsb2FkIHNhbXBsZSBjb3VudCByZWdpc3RlciBmb3IgREFDMSAqLworI2RlZmluZSBTQ1RSTF9QMkRBQ1NFTiAgICAweDAwMDAwMDQwICAvKiAxID0gREFDMiBwbGF5IGJhY2sgbGFzdCBzYW1wbGUgd2hlbiBkaXNhYmxlZCAqLworI2RlZmluZSBTQ1RSTF9SMVNFQiAgICAgICAweDAwMDAwMDIwICAvKiAxID0gMTZiaXQgKi8KKyNkZWZpbmUgU0NUUkxfUjFTTUIgICAgICAgMHgwMDAwMDAxMCAgLyogMSA9IHN0ZXJlbyAqLworI2RlZmluZSBTQ1RSTF9SMUZNVCAgICAgICAweDAwMDAwMDMwICAvKiBmb3JtYXQgbWFzayAqLworI2RlZmluZSBTQ1RSTF9TSF9SMUZNVCAgICA0CisjZGVmaW5lIFNDVFJMX1AyU0VCICAgICAgIDB4MDAwMDAwMDggIC8qIDEgPSAxNmJpdCAqLworI2RlZmluZSBTQ1RSTF9QMlNNQiAgICAgICAweDAwMDAwMDA0ICAvKiAxID0gc3RlcmVvICovCisjZGVmaW5lIFNDVFJMX1AyRk1UICAgICAgIDB4MDAwMDAwMGMgIC8qIGZvcm1hdCBtYXNrICovCisjZGVmaW5lIFNDVFJMX1NIX1AyRk1UICAgIDIKKyNkZWZpbmUgU0NUUkxfUDFTRUIgICAgICAgMHgwMDAwMDAwMiAgLyogMSA9IDE2Yml0ICovCisjZGVmaW5lIFNDVFJMX1AxU01CICAgICAgIDB4MDAwMDAwMDEgIC8qIDEgPSBzdGVyZW8gKi8KKyNkZWZpbmUgU0NUUkxfUDFGTVQgICAgICAgMHgwMDAwMDAwMyAgLyogZm9ybWF0IG1hc2sgKi8KKyNkZWZpbmUgU0NUUkxfU0hfUDFGTVQgICAgMAorCisKKy8qIG1pc2Mgc3R1ZmYgKi8KKyNkZWZpbmUgUE9MTF9DT1VOVCAgIDB4MTAwMAorI2RlZmluZSBGTU9ERV9EQUMgICAgICAgICA0ICAgICAgICAgICAvKiBzbGlnaHQgbWlzdXNlIG9mIG1vZGVfdCAqLworCisvKiBNSURJIGJ1ZmZlciBzaXplcyAqLworCisjZGVmaW5lIE1JRElJTkJVRiAgMjU2CisjZGVmaW5lIE1JRElPVVRCVUYgMjU2CisKKyNkZWZpbmUgRk1PREVfTUlESV9TSElGVCAzCisjZGVmaW5lIEZNT0RFX01JRElfUkVBRCAgKEZNT0RFX1JFQUQgPDwgRk1PREVfTUlESV9TSElGVCkKKyNkZWZpbmUgRk1PREVfTUlESV9XUklURSAoRk1PREVfV1JJVEUgPDwgRk1PREVfTUlESV9TSElGVCkKKworI2RlZmluZSBFUzEzNzFfTU9EVUxFX05BTUUgImVzMTM3MSIKKyNkZWZpbmUgUEZYIEVTMTM3MV9NT0RVTEVfTkFNRSAiOiAiCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgZXMxMzcxX3N0YXRlIHsKKwkvKiBtYWdpYyAqLworCXVuc2lnbmVkIGludCBtYWdpYzsKKworCS8qIGxpc3Qgb2YgZXMxMzcxIGRldmljZXMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGRldnM7CisKKwkvKiB0aGUgY29ycmVzcG9uZGluZyBwY2lfZGV2IHN0cnVjdHVyZSAqLworCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisKKwkvKiBzb3VuZGNvcmUgc3R1ZmYgKi8KKwlpbnQgZGV2X2F1ZGlvOworCWludCBkZXZfZGFjOworCWludCBkZXZfbWlkaTsKKwkKKwkvKiBoYXJkd2FyZSByZXNvdXJjZXMgKi8KKwl1bnNpZ25lZCBsb25nIGlvOyAvKiBsb25nIGZvciBTUEFSQyAqLworCXVuc2lnbmVkIGludCBpcnE7CisKKwkvKiBQQ0kgSUQncyAqLworCXUxNiB2ZW5kb3I7CisJdTE2IGRldmljZTsKKyAgICAgICAgdTggcmV2OyAvKiB0aGUgY2hpcCByZXZpc2lvbiAqLworCisJLyogb3B0aW9ucyAqLworCWludCBzcGRpZl92b2x1bWU7IC8qIFMvUERJRiBvdXRwdXQgaXMgZW5hYmxlZCBpZiAhPSAtMSAqLworCisjaWZkZWYgRVMxMzcxX0RFQlVHCisgICAgICAgIC8qIGRlYnVnIC9wcm9jIGVudHJ5ICovCisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwczsKKyNlbmRpZiAvKiBFUzEzNzFfREVCVUcgKi8KKworCXN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYzsKKworCS8qIHdhdmUgc3R1ZmYgKi8KKwl1bnNpZ25lZCBjdHJsOworCXVuc2lnbmVkIHNjdHJsOworCXVuc2lnbmVkIGRhYzFyYXRlLCBkYWMycmF0ZSwgYWRjcmF0ZTsKKworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3Qgc2VtYXBob3JlIG9wZW5fc2VtOworCW1vZGVfdCBvcGVuX21vZGU7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgb3Blbl93YWl0OworCisJc3RydWN0IGRtYWJ1ZiB7CisJCXZvaWQgKnJhd2J1ZjsKKwkJZG1hX2FkZHJfdCBkbWFhZGRyOworCQl1bnNpZ25lZCBidWZvcmRlcjsKKwkJdW5zaWduZWQgbnVtZnJhZzsKKwkJdW5zaWduZWQgZnJhZ3NoaWZ0OworCQl1bnNpZ25lZCBod3B0ciwgc3dwdHI7CisJCXVuc2lnbmVkIHRvdGFsX2J5dGVzOworCQlpbnQgY291bnQ7CisJCXVuc2lnbmVkIGVycm9yOyAvKiBvdmVyL3VuZGVycnVuICovCisJCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7CisJCS8qIHJlZHVuZGFudCwgYnV0IG1ha2VzIGNhbGN1bGF0aW9ucyBlYXNpZXIgKi8KKwkJdW5zaWduZWQgZnJhZ3NpemU7CisJCXVuc2lnbmVkIGRtYXNpemU7CisJCXVuc2lnbmVkIGZyYWdzYW1wbGVzOworCQkvKiBPU1Mgc3R1ZmYgKi8KKwkJdW5zaWduZWQgbWFwcGVkOjE7CisJCXVuc2lnbmVkIHJlYWR5OjE7CisJCXVuc2lnbmVkIGVuZGNsZWFyZWQ6MTsKKwkJdW5zaWduZWQgZW5hYmxlZDoxOworCQl1bnNpZ25lZCBvc3NmcmFnc2hpZnQ7CisJCWludCBvc3NtYXhmcmFnczsKKwkJdW5zaWduZWQgc3ViZGl2aXNpb247CisJfSBkbWFfZGFjMSwgZG1hX2RhYzIsIGRtYV9hZGM7CisKKwkvKiBtaWRpIHN0dWZmICovCisJc3RydWN0IHsKKwkJdW5zaWduZWQgaXJkLCBpd3IsIGljbnQ7CisJCXVuc2lnbmVkIG9yZCwgb3dyLCBvY250OworCQl3YWl0X3F1ZXVlX2hlYWRfdCBpd2FpdDsKKwkJd2FpdF9xdWV1ZV9oZWFkX3Qgb3dhaXQ7CisJCXVuc2lnbmVkIGNoYXIgaWJ1ZltNSURJSU5CVUZdOworCQl1bnNpZ25lZCBjaGFyIG9idWZbTUlESU9VVEJVRl07CisJfSBtaWRpOworCisJc3RydWN0IGdhbWVwb3J0ICpnYW1lcG9ydDsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHNlbTsKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgTElTVF9IRUFEKGRldnMpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsZDIodW5zaWduZWQgaW50IHgpCit7CisJdW5zaWduZWQgciA9IDA7CisJCisJaWYgKHggPj0gMHgxMDAwMCkgeworCQl4ID4+PSAxNjsKKwkJciArPSAxNjsKKwl9CisJaWYgKHggPj0gMHgxMDApIHsKKwkJeCA+Pj0gODsKKwkJciArPSA4OworCX0KKwlpZiAoeCA+PSAweDEwKSB7CisJCXggPj49IDQ7CisJCXIgKz0gNDsKKwl9CisJaWYgKHggPj0gNCkgeworCQl4ID4+PSAyOworCQlyICs9IDI7CisJfQorCWlmICh4ID49IDIpCisJCXIrKzsKKwlyZXR1cm4gcjsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB1bnNpZ25lZCB3YWl0X3NyY19yZWFkeShzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzKQoreworCXVuc2lnbmVkIGludCB0LCByOworCisJZm9yICh0ID0gMDsgdCA8IFBPTExfQ09VTlQ7IHQrKykgeworCQlpZiAoISgociA9IGlubChzLT5pbyArIEVTMTM3MV9SRUdfU1JDT05WKSkgJiBTUkNfQlVTWSkpCisJCQlyZXR1cm4gcjsKKwkJdWRlbGF5KDEpOworCX0KKwlwcmludGsoS0VSTl9ERUJVRyBQRlggInNhbXBsZSByYXRlIGNvbnZlcnRlciB0aW1lb3V0IHIgPSAweCUwOHhcbiIsIHIpOworCXJldHVybiByOworfQorCitzdGF0aWMgdW5zaWduZWQgc3JjX3JlYWQoc3RydWN0IGVzMTM3MV9zdGF0ZSAqcywgdW5zaWduZWQgcmVnKQoreworICAgICAgICB1bnNpZ25lZCBpbnQgdGVtcCxpLG9yaWc7CisKKyAgICAgICAgLyogd2FpdCBmb3IgcmVhZHkgKi8KKyAgICAgICAgdGVtcCA9IHdhaXRfc3JjX3JlYWR5IChzKTsKKworICAgICAgICAvKiB3ZSBjYW4gb25seSBhY2Nlc3MgdGhlIFNSQyBhdCBjZXJ0YWluIHRpbWVzLCBtYWtlIHN1cmUKKyAgICAgICAgICAgd2UncmUgYWxsb3dlZCB0byBiZWZvcmUgd2UgcmVhZCAqLworICAgICAgICAgICAKKyAgICAgICAgb3JpZyA9IHRlbXA7CisgICAgICAgIC8qIGV4cG9zZSB0aGUgU1JDIHN0YXRlIGJpdHMgKi8KKyAgICAgICAgb3V0bCAoICh0ZW1wICYgU1JDX0NUTE1BU0spIHwgKHJlZyA8PCBTUkNfUkFNQUREUl9TSElGVCkgfCAweDEwMDAwVUwsCisgICAgICAgICAgICAgICBzLT5pbyArIEVTMTM3MV9SRUdfU1JDT05WKTsKKworICAgICAgICAvKiBub3csIHdhaXQgZm9yIGJ1c3kgYW5kIHRoZSBjb3JyZWN0IHRpbWUgdG8gcmVhZCAqLworICAgICAgICB0ZW1wID0gd2FpdF9zcmNfcmVhZHkgKHMpOworCisgICAgICAgIGlmICggKHRlbXAgJiAweDAwODcwMDAwVUwgKSAhPSAoIFNSQ19PS1NUQVRFIDw8IDE2ICkpeworICAgICAgICAgICAgICAgIC8qIHdhaXQgZm9yIHRoZSByaWdodCBzdGF0ZSAqLworICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPFBPTExfQ09VTlQ7IGkrKyl7CisgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gaW5sIChzLT5pbyArIEVTMTM3MV9SRUdfU1JDT05WKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHRlbXAgJiAweDAwODcwMDAwVUwgKSA9PSAoIFNSQ19PS1NUQVRFIDw8IDE2ICkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIGhpZGUgdGhlIHN0YXRlIGJpdHMgKi8KKyAgICAgICAgb3V0bCAoKG9yaWcgJiBTUkNfQ1RMTUFTSykgfCAocmVnIDw8IFNSQ19SQU1BRERSX1NISUZUKSwgcy0+aW8gKyBFUzEzNzFfUkVHX1NSQ09OVik7CisgICAgICAgIHJldHVybiB0ZW1wOworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgCit9CisKK3N0YXRpYyB2b2lkIHNyY193cml0ZShzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzLCB1bnNpZ25lZCByZWcsIHVuc2lnbmVkIGRhdGEpCit7CisgICAgICAKKwl1bnNpZ25lZCBpbnQgcjsKKworCXIgPSB3YWl0X3NyY19yZWFkeShzKSAmIChTUkNfRElTIHwgU1JDX0REQUMxIHwgU1JDX0REQUMyIHwgU1JDX0RBREMpOworCXIgfD0gKHJlZyA8PCBTUkNfUkFNQUREUl9TSElGVCkgJiBTUkNfUkFNQUREUl9NQVNLOworCXIgfD0gKGRhdGEgPDwgU1JDX1JBTURBVEFfU0hJRlQpICYgU1JDX1JBTURBVEFfTUFTSzsKKwlvdXRsKHIgfCBTUkNfV0UsIHMtPmlvICsgRVMxMzcxX1JFR19TUkNPTlYpOworCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBtb3N0IG9mIHRoZSBmb2xsb3dpbmcgaGVyZSBpcyBibGFjayBtYWdpYyAqLworc3RhdGljIHZvaWQgc2V0X2FkY19yYXRlKHN0cnVjdCBlczEzNzFfc3RhdGUgKnMsIHVuc2lnbmVkIHJhdGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgbiwgdHJ1bmNtLCBmcmVxOworCisJaWYgKHJhdGUgPiA0ODAwMCkKKwkJcmF0ZSA9IDQ4MDAwOworCWlmIChyYXRlIDwgNDAwMCkKKwkJcmF0ZSA9IDQwMDA7CisJbiA9IHJhdGUgLyAzMDAwOworCWlmICgoMSA8PCBuKSAmICgoMSA8PCAxNSkgfCAoMSA8PCAxMykgfCAoMSA8PCAxMSkgfCAoMSA8PCA5KSkpCisJCW4tLTsKKwl0cnVuY20gPSAoMjEgKiBuIC0gMSkgfCAxOworICAgICAgICBmcmVxID0gKCg0ODAwMFVMIDw8IDE1KSAvIHJhdGUpICogbjsKKwlzLT5hZGNyYXRlID0gKDQ4MDAwVUwgPDwgMTUpIC8gKGZyZXEgLyBuKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCWlmIChyYXRlID49IDI0MDAwKSB7CisJCWlmICh0cnVuY20gPiAyMzkpCisJCQl0cnVuY20gPSAyMzk7CisJCXNyY193cml0ZShzLCBTUkNSRUdfQURDK1NSQ1JFR19UUlVOQ19OLCAKKwkJCSAgKCgoMjM5IC0gdHJ1bmNtKSA+PiAxKSA8PCA5KSB8IChuIDw8IDQpKTsKKwl9IGVsc2UgeworCQlpZiAodHJ1bmNtID4gMTE5KQorCQkJdHJ1bmNtID0gMTE5OworCQlzcmNfd3JpdGUocywgU1JDUkVHX0FEQytTUkNSRUdfVFJVTkNfTiwgCisJCQkgIDB4ODAwMCB8ICgoKDExOSAtIHRydW5jbSkgPj4gMSkgPDwgOSkgfCAobiA8PCA0KSk7CisJfQkJCisJc3JjX3dyaXRlKHMsIFNSQ1JFR19BREMrU1JDUkVHX0lOVF9SRUdTLCAKKwkJICAoc3JjX3JlYWQocywgU1JDUkVHX0FEQytTUkNSRUdfSU5UX1JFR1MpICYgMHgwMGZmKSB8CisJCSAgKChmcmVxID4+IDUpICYgMHhmYzAwKSk7CisJc3JjX3dyaXRlKHMsIFNSQ1JFR19BREMrU1JDUkVHX1ZGUkVRX0ZSQUMsIGZyZXEgJiAweDdmZmYpOworCXNyY193cml0ZShzLCBTUkNSRUdfVk9MX0FEQywgbiA8PCA4KTsKKwlzcmNfd3JpdGUocywgU1JDUkVHX1ZPTF9BREMrMSwgbiA8PCA4KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CisKKworc3RhdGljIHZvaWQgc2V0X2RhYzFfcmF0ZShzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzLCB1bnNpZ25lZCByYXRlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGZyZXEsIHI7CisKKwlpZiAocmF0ZSA+IDQ4MDAwKQorCQlyYXRlID0gNDgwMDA7CisJaWYgKHJhdGUgPCA0MDAwKQorCQlyYXRlID0gNDAwMDsKKyAgICAgICAgZnJlcSA9ICgocmF0ZSA8PCAxNSkgKyAxNTAwKSAvIDMwMDA7CisJcy0+ZGFjMXJhdGUgPSAoZnJlcSAqIDMwMDAgKyAxNjM4NCkgPj4gMTU7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlyID0gKHdhaXRfc3JjX3JlYWR5KHMpICYgKFNSQ19ESVMgfCBTUkNfRERBQzIgfCBTUkNfREFEQykpIHwgU1JDX0REQUMxOworCW91dGwociwgcy0+aW8gKyBFUzEzNzFfUkVHX1NSQ09OVik7CisJc3JjX3dyaXRlKHMsIFNSQ1JFR19EQUMxK1NSQ1JFR19JTlRfUkVHUywgCisJCSAgKHNyY19yZWFkKHMsIFNSQ1JFR19EQUMxK1NSQ1JFR19JTlRfUkVHUykgJiAweDAwZmYpIHwKKwkJICAoKGZyZXEgPj4gNSkgJiAweGZjMDApKTsKKwlzcmNfd3JpdGUocywgU1JDUkVHX0RBQzErU1JDUkVHX1ZGUkVRX0ZSQUMsIGZyZXEgJiAweDdmZmYpOworCXIgPSAod2FpdF9zcmNfcmVhZHkocykgJiAoU1JDX0RJUyB8IFNSQ19EREFDMiB8IFNSQ19EQURDKSk7CisJb3V0bChyLCBzLT5pbyArIEVTMTM3MV9SRUdfU1JDT05WKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9kYWMyX3JhdGUoc3RydWN0IGVzMTM3MV9zdGF0ZSAqcywgdW5zaWduZWQgcmF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBmcmVxLCByOworCisJaWYgKHJhdGUgPiA0ODAwMCkKKwkJcmF0ZSA9IDQ4MDAwOworCWlmIChyYXRlIDwgNDAwMCkKKwkJcmF0ZSA9IDQwMDA7CisgICAgICAgIGZyZXEgPSAoKHJhdGUgPDwgMTUpICsgMTUwMCkgLyAzMDAwOworCXMtPmRhYzJyYXRlID0gKGZyZXEgKiAzMDAwICsgMTYzODQpID4+IDE1OworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJciA9ICh3YWl0X3NyY19yZWFkeShzKSAmIChTUkNfRElTIHwgU1JDX0REQUMxIHwgU1JDX0RBREMpKSB8IFNSQ19EREFDMjsKKwlvdXRsKHIsIHMtPmlvICsgRVMxMzcxX1JFR19TUkNPTlYpOworCXNyY193cml0ZShzLCBTUkNSRUdfREFDMitTUkNSRUdfSU5UX1JFR1MsIAorCQkgIChzcmNfcmVhZChzLCBTUkNSRUdfREFDMitTUkNSRUdfSU5UX1JFR1MpICYgMHgwMGZmKSB8CisJCSAgKChmcmVxID4+IDUpICYgMHhmYzAwKSk7CisJc3JjX3dyaXRlKHMsIFNSQ1JFR19EQUMyK1NSQ1JFR19WRlJFUV9GUkFDLCBmcmVxICYgMHg3ZmZmKTsKKwlyID0gKHdhaXRfc3JjX3JlYWR5KHMpICYgKFNSQ19ESVMgfCBTUkNfRERBQzEgfCBTUkNfREFEQykpOworCW91dGwociwgcy0+aW8gKyBFUzEzNzFfUkVHX1NSQ09OVik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgX19kZXZpbml0IHNyY19pbml0KHN0cnVjdCBlczEzNzFfc3RhdGUgKnMpCit7CisgICAgICAgIHVuc2lnbmVkIGludCBpOworCisgICAgICAgIC8qIGJlZm9yZSB3ZSBlbmFibGUgb3IgZGlzYWJsZSB0aGUgU1JDIHdlIG5lZWQKKyAgICAgICAgICAgdG8gd2FpdCBmb3IgaXQgdG8gYmVjb21lIHJlYWR5ICovCisgICAgICAgIHdhaXRfc3JjX3JlYWR5KHMpOworCisgICAgICAgIG91dGwoU1JDX0RJUywgcy0+aW8gKyBFUzEzNzFfUkVHX1NSQ09OVik7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDB4ODA7IGkrKykKKyAgICAgICAgICAgICAgICBzcmNfd3JpdGUocywgaSwgMCk7CisKKyAgICAgICAgc3JjX3dyaXRlKHMsIFNSQ1JFR19EQUMxK1NSQ1JFR19UUlVOQ19OLCAxNiA8PCA0KTsKKyAgICAgICAgc3JjX3dyaXRlKHMsIFNSQ1JFR19EQUMxK1NSQ1JFR19JTlRfUkVHUywgMTYgPDwgMTApOworICAgICAgICBzcmNfd3JpdGUocywgU1JDUkVHX0RBQzIrU1JDUkVHX1RSVU5DX04sIDE2IDw8IDQpOworICAgICAgICBzcmNfd3JpdGUocywgU1JDUkVHX0RBQzIrU1JDUkVHX0lOVF9SRUdTLCAxNiA8PCAxMCk7CisgICAgICAgIHNyY193cml0ZShzLCBTUkNSRUdfVk9MX0FEQywgMSA8PCAxMik7CisgICAgICAgIHNyY193cml0ZShzLCBTUkNSRUdfVk9MX0FEQysxLCAxIDw8IDEyKTsKKyAgICAgICAgc3JjX3dyaXRlKHMsIFNSQ1JFR19WT0xfREFDMSwgMSA8PCAxMik7CisgICAgICAgIHNyY193cml0ZShzLCBTUkNSRUdfVk9MX0RBQzErMSwgMSA8PCAxMik7CisgICAgICAgIHNyY193cml0ZShzLCBTUkNSRUdfVk9MX0RBQzIsIDEgPDwgMTIpOworICAgICAgICBzcmNfd3JpdGUocywgU1JDUkVHX1ZPTF9EQUMyKzEsIDEgPDwgMTIpOworICAgICAgICBzZXRfYWRjX3JhdGUocywgMjIwNTApOworICAgICAgICBzZXRfZGFjMV9yYXRlKHMsIDIyMDUwKTsKKyAgICAgICAgc2V0X2RhYzJfcmF0ZShzLCAyMjA1MCk7CisKKyAgICAgICAgLyogV0FSTklORzoKKyAgICAgICAgICogZW5hYmxpbmcgdGhlIHNhbXBsZSByYXRlIGNvbnZlcnRlciB3aXRob3V0IHByb3Blcmx5IHByb2dyYW1taW5nCisgICAgICAgICAqIGl0cyBwYXJhbWV0ZXJzIGNhdXNlcyB0aGUgY2hpcCB0byBsb2NrIHVwICh0aGUgU1JDIGJ1c3kgYml0IHdpbGwKKyAgICAgICAgICogYmUgc3R1Y2sgaGlnaCwgYW5kIEkndmUgZm91bmQgbm8gd2F5IHRvIHJlY3RpZnkgdGhpcyBvdGhlciB0aGFuCisgICAgICAgICAqIHBvd2VyIGN5Y2xlKQorICAgICAgICAgKi8KKyAgICAgICAgd2FpdF9zcmNfcmVhZHkocyk7CisgICAgICAgIG91dGwoMCwgcy0+aW8rRVMxMzcxX1JFR19TUkNPTlYpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgd3Jjb2RlYyhzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIHU4IGFkZHIsIHUxNiBkYXRhKQoreworCXN0cnVjdCBlczEzNzFfc3RhdGUgKnMgPSAoc3RydWN0IGVzMTM3MV9zdGF0ZSAqKWNvZGVjLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCB0LCB4OworICAgICAgICAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCWZvciAodCA9IDA7IHQgPCBQT0xMX0NPVU5UOyB0KyspCisJCWlmICghKGlubChzLT5pbytFUzEzNzFfUkVHX0NPREVDKSAmIENPREVDX1dJUCkpCisJCQlicmVhazsKKworICAgICAgICAvKiBzYXZlIHRoZSBjdXJyZW50IHN0YXRlIGZvciBsYXRlciAqLworICAgICAgICB4ID0gd2FpdF9zcmNfcmVhZHkocyk7CisKKyAgICAgICAgLyogZW5hYmxlIFNSQyBzdGF0ZSBkYXRhIGluIFNSQyBtdXggKi8KKwlvdXRsKCh4ICYgKFNSQ19ESVMgfCBTUkNfRERBQzEgfCBTUkNfRERBQzIgfCBTUkNfREFEQykpIHwgMHgwMDAxMDAwMCwKKwkgICAgIHMtPmlvK0VTMTM3MV9SRUdfU1JDT05WKTsKKworICAgICAgICAvKiB3YWl0IGZvciBub3QgYnVzeSAoc3RhdGUgMCkgZmlyc3QgdG8gYXZvaWQKKyAgICAgICAgICAgdHJhbnNpdGlvbiBzdGF0ZXMgKi8KKyAgICAgICAgZm9yICh0PTA7IHQ8UE9MTF9DT1VOVDsgdCsrKXsKKyAgICAgICAgICAgICAgICBpZigoaW5sKHMtPmlvK0VTMTM3MV9SRUdfU1JDT05WKSAmIDB4MDA4NzAwMDApID09MCApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHVkZWxheSgxKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLyogd2FpdCBmb3IgYSBTQUZFIHRpbWUgdG8gd3JpdGUgYWRkci9kYXRhIGFuZCB0aGVuIGRvIGl0LCBkYW1taXQgKi8KKyAgICAgICAgZm9yICh0PTA7IHQ8UE9MTF9DT1VOVDsgdCsrKXsKKyAgICAgICAgICAgICAgICBpZigoaW5sKHMtPmlvK0VTMTM3MV9SRUdfU1JDT05WKSAmIDB4MDA4NzAwMDApID09MHgwMDAxMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgdWRlbGF5KDEpOworICAgICAgICB9CisKKwlvdXRsKCgoYWRkciA8PCBDT0RFQ19QT0FERF9TSElGVCkgJiBDT0RFQ19QT0FERF9NQVNLKSB8CisJICAgICAoKGRhdGEgPDwgQ09ERUNfUE9EQVRfU0hJRlQpICYgQ09ERUNfUE9EQVRfTUFTSyksIHMtPmlvK0VTMTM3MV9SRUdfQ09ERUMpOworCisJLyogcmVzdG9yZSBTUkMgcmVnICovCisJd2FpdF9zcmNfcmVhZHkocyk7CisJb3V0bCh4LCBzLT5pbytFUzEzNzFfUkVHX1NSQ09OVik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdTE2IHJkY29kZWMoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjLCB1OCBhZGRyKQoreworCXN0cnVjdCBlczEzNzFfc3RhdGUgKnMgPSAoc3RydWN0IGVzMTM3MV9zdGF0ZSAqKWNvZGVjLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCB0LCB4OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkKKyAgICAgICAgLyogd2FpdCBmb3IgV0lQIHRvIGdvIGF3YXkgKi8KKwlmb3IgKHQgPSAwOyB0IDwgMHgxMDAwOyB0KyspCisJCWlmICghKGlubChzLT5pbytFUzEzNzFfUkVHX0NPREVDKSAmIENPREVDX1dJUCkpCisJCQlicmVhazsKKworCS8qIHNhdmUgdGhlIGN1cnJlbnQgc3RhdGUgZm9yIGxhdGVyICovCisJeCA9ICh3YWl0X3NyY19yZWFkeShzKSAmIChTUkNfRElTIHwgU1JDX0REQUMxIHwgU1JDX0REQUMyIHwgU1JDX0RBREMpKTsKKworCS8qIGVuYWJsZSBTUkMgc3RhdGUgZGF0YSBpbiBTUkMgbXV4ICovCisJb3V0bCggeCB8IDB4MDAwMTAwMDAsCisgICAgICAgICAgICAgIHMtPmlvK0VTMTM3MV9SRUdfU1JDT05WKTsKKworICAgICAgICAvKiB3YWl0IGZvciBub3QgYnVzeSAoc3RhdGUgMCkgZmlyc3QgdG8gYXZvaWQKKyAgICAgICAgICAgdHJhbnNpdGlvbiBzdGF0ZXMgKi8KKyAgICAgICAgZm9yICh0PTA7IHQ8UE9MTF9DT1VOVDsgdCsrKXsKKyAgICAgICAgICAgICAgICBpZigoaW5sKHMtPmlvK0VTMTM3MV9SRUdfU1JDT05WKSAmIDB4MDA4NzAwMDApID09MCApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHVkZWxheSgxKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLyogd2FpdCBmb3IgYSBTQUZFIHRpbWUgdG8gd3JpdGUgYWRkci9kYXRhIGFuZCB0aGVuIGRvIGl0LCBkYW1taXQgKi8KKyAgICAgICAgZm9yICh0PTA7IHQ8UE9MTF9DT1VOVDsgdCsrKXsKKyAgICAgICAgICAgICAgICBpZigoaW5sKHMtPmlvK0VTMTM3MV9SRUdfU1JDT05WKSAmIDB4MDA4NzAwMDApID09MHgwMDAxMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgdWRlbGF5KDEpOworICAgICAgICB9CisKKwlvdXRsKCgoYWRkciA8PCBDT0RFQ19QT0FERF9TSElGVCkgJiBDT0RFQ19QT0FERF9NQVNLKSB8IENPREVDX1BPUkQsIHMtPmlvK0VTMTM3MV9SRUdfQ09ERUMpOworCS8qIHJlc3RvcmUgU1JDIHJlZyAqLworCXdhaXRfc3JjX3JlYWR5KHMpOworCW91dGwoeCwgcy0+aW8rRVMxMzcxX1JFR19TUkNPTlYpOworCisgICAgICAgIC8qIHdhaXQgZm9yIFdJUCBhZ2FpbiAqLworCWZvciAodCA9IDA7IHQgPCAweDEwMDA7IHQrKykKKwkJaWYgKCEoaW5sKHMtPmlvK0VTMTM3MV9SRUdfQ09ERUMpICYgQ09ERUNfV0lQKSkKKwkJCWJyZWFrOworICAgICAgICAKKwkvKiBub3cgd2FpdCBmb3IgdGhlIHN0aW5raW4nIGRhdGEgKFJEWSkgKi8KKwlmb3IgKHQgPSAwOyB0IDwgUE9MTF9DT1VOVDsgdCsrKQorCQlpZiAoKHggPSBpbmwocy0+aW8rRVMxMzcxX1JFR19DT0RFQykpICYgQ09ERUNfUkRZKQorCQkJYnJlYWs7CisgICAgICAgIAorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gKCh4ICYgQ09ERUNfUElEQVRfTUFTSykgPj4gQ09ERUNfUElEQVRfU0hJRlQpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGlubGluZSB2b2lkIHN0b3BfYWRjKHN0cnVjdCBlczEzNzFfc3RhdGUgKnMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJcy0+Y3RybCAmPSB+Q1RSTF9BRENfRU47CisJb3V0bChzLT5jdHJsLCBzLT5pbytFUzEzNzFfUkVHX0NPTlRST0wpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKK30JCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdG9wX2RhYzEoc3RydWN0IGVzMTM3MV9zdGF0ZSAqcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlzLT5jdHJsICY9IH5DVFJMX0RBQzFfRU47CisJb3V0bChzLT5jdHJsLCBzLT5pbytFUzEzNzFfUkVHX0NPTlRST0wpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKK30JCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdG9wX2RhYzIoc3RydWN0IGVzMTM3MV9zdGF0ZSAqcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlzLT5jdHJsICY9IH5DVFJMX0RBQzJfRU47CisJb3V0bChzLT5jdHJsLCBzLT5pbytFUzEzNzFfUkVHX0NPTlRST0wpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKK30JCisKK3N0YXRpYyB2b2lkIHN0YXJ0X2RhYzEoc3RydWN0IGVzMTM3MV9zdGF0ZSAqcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGZyYWdyZW1haW4sIGZzaGlmdDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJaWYgKCEocy0+Y3RybCAmIENUUkxfREFDMV9FTikgJiYgKHMtPmRtYV9kYWMxLm1hcHBlZCB8fCBzLT5kbWFfZGFjMS5jb3VudCA+IDApCisJICAgICYmIHMtPmRtYV9kYWMxLnJlYWR5KSB7CisJCXMtPmN0cmwgfD0gQ1RSTF9EQUMxX0VOOworCQlzLT5zY3RybCA9IChzLT5zY3RybCAmIH4oU0NUUkxfUDFMT09QU0VMIHwgU0NUUkxfUDFQQVVTRSB8IFNDVFJMX1AxU0NUUkxEKSkgfCBTQ1RSTF9QMUlOVEVOOworCQlvdXRsKHMtPnNjdHJsLCBzLT5pbytFUzEzNzFfUkVHX1NFUklBTF9DT05UUk9MKTsKKwkJZnJhZ3JlbWFpbiA9ICgoLSBzLT5kbWFfZGFjMS5od3B0cikgJiAocy0+ZG1hX2RhYzEuZnJhZ3NpemUtMSkpOworCQlmc2hpZnQgPSBzYW1wbGVfc2hpZnRbKHMtPnNjdHJsICYgU0NUUkxfUDFGTVQpID4+IFNDVFJMX1NIX1AxRk1UXTsKKwkJaWYgKGZyYWdyZW1haW4gPCAyKmZzaGlmdCkKKwkJCWZyYWdyZW1haW4gPSBzLT5kbWFfZGFjMS5mcmFnc2l6ZTsKKwkJb3V0bCgoZnJhZ3JlbWFpbiA+PiBmc2hpZnQpIC0gMSwgcy0+aW8rRVMxMzcxX1JFR19EQUMxX1NDT1VOVCk7CisJCW91dGwocy0+Y3RybCwgcy0+aW8rRVMxMzcxX1JFR19DT05UUk9MKTsKKwkJb3V0bCgocy0+ZG1hX2RhYzEuZnJhZ3NpemUgPj4gZnNoaWZ0KSAtIDEsIHMtPmlvK0VTMTM3MV9SRUdfREFDMV9TQ09VTlQpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CQorCitzdGF0aWMgdm9pZCBzdGFydF9kYWMyKHN0cnVjdCBlczEzNzFfc3RhdGUgKnMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBmcmFncmVtYWluLCBmc2hpZnQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCWlmICghKHMtPmN0cmwgJiBDVFJMX0RBQzJfRU4pICYmIChzLT5kbWFfZGFjMi5tYXBwZWQgfHwgcy0+ZG1hX2RhYzIuY291bnQgPiAwKQorCSAgICAmJiBzLT5kbWFfZGFjMi5yZWFkeSkgeworCQlzLT5jdHJsIHw9IENUUkxfREFDMl9FTjsKKwkJcy0+c2N0cmwgPSAocy0+c2N0cmwgJiB+KFNDVFJMX1AyTE9PUFNFTCB8IFNDVFJMX1AyUEFVU0UgfCBTQ1RSTF9QMkRBQ1NFTiB8IAorCQkJCQkgU0NUUkxfUDJFTkRJTkMgfCBTQ1RSTF9QMlNUSU5DKSkgfCBTQ1RSTF9QMklOVEVOIHwKKwkJCSgoKHMtPnNjdHJsICYgU0NUUkxfUDJGTVQpID8gMiA6IDEpIDw8IFNDVFJMX1NIX1AyRU5ESU5DKSB8IAorCQkJKDAgPDwgU0NUUkxfU0hfUDJTVElOQyk7CisJCW91dGwocy0+c2N0cmwsIHMtPmlvK0VTMTM3MV9SRUdfU0VSSUFMX0NPTlRST0wpOworCQlmcmFncmVtYWluID0gKCgtIHMtPmRtYV9kYWMyLmh3cHRyKSAmIChzLT5kbWFfZGFjMi5mcmFnc2l6ZS0xKSk7CisJCWZzaGlmdCA9IHNhbXBsZV9zaGlmdFsocy0+c2N0cmwgJiBTQ1RSTF9QMkZNVCkgPj4gU0NUUkxfU0hfUDJGTVRdOworCQlpZiAoZnJhZ3JlbWFpbiA8IDIqZnNoaWZ0KQorCQkJZnJhZ3JlbWFpbiA9IHMtPmRtYV9kYWMyLmZyYWdzaXplOworCQlvdXRsKChmcmFncmVtYWluID4+IGZzaGlmdCkgLSAxLCBzLT5pbytFUzEzNzFfUkVHX0RBQzJfU0NPVU5UKTsKKwkJb3V0bChzLT5jdHJsLCBzLT5pbytFUzEzNzFfUkVHX0NPTlRST0wpOworCQlvdXRsKChzLT5kbWFfZGFjMi5mcmFnc2l6ZSA+PiBmc2hpZnQpIC0gMSwgcy0+aW8rRVMxMzcxX1JFR19EQUMyX1NDT1VOVCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKK30JCisKK3N0YXRpYyB2b2lkIHN0YXJ0X2FkYyhzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgZnJhZ3JlbWFpbiwgZnNoaWZ0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlpZiAoIShzLT5jdHJsICYgQ1RSTF9BRENfRU4pICYmIChzLT5kbWFfYWRjLm1hcHBlZCB8fCBzLT5kbWFfYWRjLmNvdW50IDwgKHNpZ25lZCkocy0+ZG1hX2FkYy5kbWFzaXplIC0gMipzLT5kbWFfYWRjLmZyYWdzaXplKSkKKwkgICAgJiYgcy0+ZG1hX2FkYy5yZWFkeSkgeworCQlzLT5jdHJsIHw9IENUUkxfQURDX0VOOworCQlzLT5zY3RybCA9IChzLT5zY3RybCAmIH5TQ1RSTF9SMUxPT1BTRUwpIHwgU0NUUkxfUjFJTlRFTjsKKwkJb3V0bChzLT5zY3RybCwgcy0+aW8rRVMxMzcxX1JFR19TRVJJQUxfQ09OVFJPTCk7CisJCWZyYWdyZW1haW4gPSAoKC0gcy0+ZG1hX2FkYy5od3B0cikgJiAocy0+ZG1hX2FkYy5mcmFnc2l6ZS0xKSk7CisJCWZzaGlmdCA9IHNhbXBsZV9zaGlmdFsocy0+c2N0cmwgJiBTQ1RSTF9SMUZNVCkgPj4gU0NUUkxfU0hfUjFGTVRdOworCQlpZiAoZnJhZ3JlbWFpbiA8IDIqZnNoaWZ0KQorCQkJZnJhZ3JlbWFpbiA9IHMtPmRtYV9hZGMuZnJhZ3NpemU7CisJCW91dGwoKGZyYWdyZW1haW4gPj4gZnNoaWZ0KSAtIDEsIHMtPmlvK0VTMTM3MV9SRUdfQURDX1NDT1VOVCk7CisJCW91dGwocy0+Y3RybCwgcy0+aW8rRVMxMzcxX1JFR19DT05UUk9MKTsKKwkJb3V0bCgocy0+ZG1hX2FkYy5mcmFnc2l6ZSA+PiBmc2hpZnQpIC0gMSwgcy0+aW8rRVMxMzcxX1JFR19BRENfU0NPVU5UKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworfQkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgRE1BQlVGX0RFRkFVTFRPUkRFUiAoMTctUEFHRV9TSElGVCkKKyNkZWZpbmUgRE1BQlVGX01JTk9SREVSIDEKKworCitzdGF0aWMgaW5saW5lIHZvaWQgZGVhbGxvY19kbWFidWYoc3RydWN0IGVzMTM3MV9zdGF0ZSAqcywgc3RydWN0IGRtYWJ1ZiAqZGIpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2UsICpwZW5kOworCisJaWYgKGRiLT5yYXdidWYpIHsKKwkJLyogdW5kbyBtYXJraW5nIHRoZSBwYWdlcyBhcyByZXNlcnZlZCAqLworCQlwZW5kID0gdmlydF90b19wYWdlKGRiLT5yYXdidWYgKyAoUEFHRV9TSVpFIDw8IGRiLT5idWZvcmRlcikgLSAxKTsKKwkJZm9yIChwYWdlID0gdmlydF90b19wYWdlKGRiLT5yYXdidWYpOyBwYWdlIDw9IHBlbmQ7IHBhZ2UrKykKKwkJCUNsZWFyUGFnZVJlc2VydmVkKHBhZ2UpOworCQlwY2lfZnJlZV9jb25zaXN0ZW50KHMtPmRldiwgUEFHRV9TSVpFIDw8IGRiLT5idWZvcmRlciwgZGItPnJhd2J1ZiwgZGItPmRtYWFkZHIpOworCX0KKwlkYi0+cmF3YnVmID0gTlVMTDsKKwlkYi0+bWFwcGVkID0gZGItPnJlYWR5ID0gMDsKK30KKworc3RhdGljIGludCBwcm9nX2RtYWJ1ZihzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzLCBzdHJ1Y3QgZG1hYnVmICpkYiwgdW5zaWduZWQgcmF0ZSwgdW5zaWduZWQgZm10LCB1bnNpZ25lZCByZWcpCit7CisJaW50IG9yZGVyOworCXVuc2lnbmVkIGJ5dGVwZXJzZWM7CisJdW5zaWduZWQgYnVmczsKKwlzdHJ1Y3QgcGFnZSAqcGFnZSwgKnBlbmQ7CisKKwlkYi0+aHdwdHIgPSBkYi0+c3dwdHIgPSBkYi0+dG90YWxfYnl0ZXMgPSBkYi0+Y291bnQgPSBkYi0+ZXJyb3IgPSBkYi0+ZW5kY2xlYXJlZCA9IDA7CisJaWYgKCFkYi0+cmF3YnVmKSB7CisJCWRiLT5yZWFkeSA9IGRiLT5tYXBwZWQgPSAwOworCQlmb3IgKG9yZGVyID0gRE1BQlVGX0RFRkFVTFRPUkRFUjsgb3JkZXIgPj0gRE1BQlVGX01JTk9SREVSOyBvcmRlci0tKQorCQkJaWYgKChkYi0+cmF3YnVmID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocy0+ZGV2LCBQQUdFX1NJWkUgPDwgb3JkZXIsICZkYi0+ZG1hYWRkcikpKQorCQkJCWJyZWFrOworCQlpZiAoIWRiLT5yYXdidWYpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJZGItPmJ1Zm9yZGVyID0gb3JkZXI7CisJCS8qIG5vdyBtYXJrIHRoZSBwYWdlcyBhcyByZXNlcnZlZDsgb3RoZXJ3aXNlIHJlbWFwX3Bmbl9yYW5nZSBkb2Vzbid0IGRvIHdoYXQgd2Ugd2FudCAqLworCQlwZW5kID0gdmlydF90b19wYWdlKGRiLT5yYXdidWYgKyAoUEFHRV9TSVpFIDw8IGRiLT5idWZvcmRlcikgLSAxKTsKKwkJZm9yIChwYWdlID0gdmlydF90b19wYWdlKGRiLT5yYXdidWYpOyBwYWdlIDw9IHBlbmQ7IHBhZ2UrKykKKwkJCVNldFBhZ2VSZXNlcnZlZChwYWdlKTsKKwl9CisJZm10ICY9IEVTMTM3MV9GTVRfTUFTSzsKKwlieXRlcGVyc2VjID0gcmF0ZSA8PCBzYW1wbGVfc2hpZnRbZm10XTsKKwlidWZzID0gUEFHRV9TSVpFIDw8IGRiLT5idWZvcmRlcjsKKwlpZiAoZGItPm9zc2ZyYWdzaGlmdCkgeworCQlpZiAoKDEwMDAgPDwgZGItPm9zc2ZyYWdzaGlmdCkgPCBieXRlcGVyc2VjKQorCQkJZGItPmZyYWdzaGlmdCA9IGxkMihieXRlcGVyc2VjLzEwMDApOworCQllbHNlCisJCQlkYi0+ZnJhZ3NoaWZ0ID0gZGItPm9zc2ZyYWdzaGlmdDsKKwl9IGVsc2UgeworCQlkYi0+ZnJhZ3NoaWZ0ID0gbGQyKGJ5dGVwZXJzZWMvMTAwLyhkYi0+c3ViZGl2aXNpb24gPyBkYi0+c3ViZGl2aXNpb24gOiAxKSk7CisJCWlmIChkYi0+ZnJhZ3NoaWZ0IDwgMykKKwkJCWRiLT5mcmFnc2hpZnQgPSAzOworCX0KKwlkYi0+bnVtZnJhZyA9IGJ1ZnMgPj4gZGItPmZyYWdzaGlmdDsKKwl3aGlsZSAoZGItPm51bWZyYWcgPCA0ICYmIGRiLT5mcmFnc2hpZnQgPiAzKSB7CisJCWRiLT5mcmFnc2hpZnQtLTsKKwkJZGItPm51bWZyYWcgPSBidWZzID4+IGRiLT5mcmFnc2hpZnQ7CisJfQorCWRiLT5mcmFnc2l6ZSA9IDEgPDwgZGItPmZyYWdzaGlmdDsKKwlpZiAoZGItPm9zc21heGZyYWdzID49IDQgJiYgZGItPm9zc21heGZyYWdzIDwgZGItPm51bWZyYWcpCisJCWRiLT5udW1mcmFnID0gZGItPm9zc21heGZyYWdzOworCWRiLT5mcmFnc2FtcGxlcyA9IGRiLT5mcmFnc2l6ZSA+PiBzYW1wbGVfc2hpZnRbZm10XTsKKwlkYi0+ZG1hc2l6ZSA9IGRiLT5udW1mcmFnIDw8IGRiLT5mcmFnc2hpZnQ7CisJbWVtc2V0KGRiLT5yYXdidWYsIChmbXQgJiBFUzEzNzFfRk1UX1MxNikgPyAwIDogMHg4MCwgZGItPmRtYXNpemUpOworCW91dGwoKHJlZyA+PiA4KSAmIDE1LCBzLT5pbytFUzEzNzFfUkVHX01FTVBBR0UpOworCW91dGwoZGItPmRtYWFkZHIsIHMtPmlvKyhyZWcgJiAweGZmKSk7CisJb3V0bCgoZGItPmRtYXNpemUgPj4gMiktMSwgcy0+aW8rKChyZWcgKyA0KSAmIDB4ZmYpKTsKKwlkYi0+ZW5hYmxlZCA9IDE7CisJZGItPnJlYWR5ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHJvZ19kbWFidWZfYWRjKHN0cnVjdCBlczEzNzFfc3RhdGUgKnMpCit7CisJc3RvcF9hZGMocyk7CisJcmV0dXJuIHByb2dfZG1hYnVmKHMsICZzLT5kbWFfYWRjLCBzLT5hZGNyYXRlLCAocy0+c2N0cmwgPj4gU0NUUkxfU0hfUjFGTVQpICYgRVMxMzcxX0ZNVF9NQVNLLCAKKwkJCSAgIEVTMTM3MV9SRUdfQURDX0ZSQU1FQURSKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHJvZ19kbWFidWZfZGFjMihzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzKQoreworCXN0b3BfZGFjMihzKTsKKwlyZXR1cm4gcHJvZ19kbWFidWYocywgJnMtPmRtYV9kYWMyLCBzLT5kYWMycmF0ZSwgKHMtPnNjdHJsID4+IFNDVFJMX1NIX1AyRk1UKSAmIEVTMTM3MV9GTVRfTUFTSywgCisJCQkgICBFUzEzNzFfUkVHX0RBQzJfRlJBTUVBRFIpOworfQorCitzdGF0aWMgaW5saW5lIGludCBwcm9nX2RtYWJ1Zl9kYWMxKHN0cnVjdCBlczEzNzFfc3RhdGUgKnMpCit7CisJc3RvcF9kYWMxKHMpOworCXJldHVybiBwcm9nX2RtYWJ1ZihzLCAmcy0+ZG1hX2RhYzEsIHMtPmRhYzFyYXRlLCAocy0+c2N0cmwgPj4gU0NUUkxfU0hfUDFGTVQpICYgRVMxMzcxX0ZNVF9NQVNLLAorCQkJICAgRVMxMzcxX1JFR19EQUMxX0ZSQU1FQURSKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBnZXRfaHdwdHIoc3RydWN0IGVzMTM3MV9zdGF0ZSAqcywgc3RydWN0IGRtYWJ1ZiAqZGIsIHVuc2lnbmVkIHJlZykKK3sKKwl1bnNpZ25lZCBod3B0ciwgZGlmZjsKKworCW91dGwoKHJlZyA+PiA4KSAmIDE1LCBzLT5pbytFUzEzNzFfUkVHX01FTVBBR0UpOworCWh3cHRyID0gKGlubChzLT5pbysocmVnICYgMHhmZikpID4+IDE0KSAmIDB4M2ZmZmM7CisJZGlmZiA9IChkYi0+ZG1hc2l6ZSArIGh3cHRyIC0gZGItPmh3cHRyKSAlIGRiLT5kbWFzaXplOworCWRiLT5od3B0ciA9IGh3cHRyOworCXJldHVybiBkaWZmOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfYWR2YW5jZSh2b2lkICpidWYsIHVuc2lnbmVkIGJzaXplLCB1bnNpZ25lZCBicHRyLCB1bnNpZ25lZCBsZW4sIHVuc2lnbmVkIGNoYXIgYykKK3sKKwlpZiAoYnB0ciArIGxlbiA+IGJzaXplKSB7CisJCXVuc2lnbmVkIHggPSBic2l6ZSAtIGJwdHI7CisJCW1lbXNldCgoKGNoYXIgKilidWYpICsgYnB0ciwgYywgeCk7CisJCWJwdHIgPSAwOworCQlsZW4gLT0geDsKKwl9CisJbWVtc2V0KCgoY2hhciAqKWJ1ZikgKyBicHRyLCBjLCBsZW4pOworfQorCisvKiBjYWxsIHdpdGggc3BpbmxvY2sgaGVsZCEgKi8KK3N0YXRpYyB2b2lkIGVzMTM3MV91cGRhdGVfcHRyKHN0cnVjdCBlczEzNzFfc3RhdGUgKnMpCit7CisJaW50IGRpZmY7CisKKwkvKiB1cGRhdGUgQURDIHBvaW50ZXIgKi8KKwlpZiAocy0+Y3RybCAmIENUUkxfQURDX0VOKSB7CisJCWRpZmYgPSBnZXRfaHdwdHIocywgJnMtPmRtYV9hZGMsIEVTMTM3MV9SRUdfQURDX0ZSQU1FQ05UKTsKKwkJcy0+ZG1hX2FkYy50b3RhbF9ieXRlcyArPSBkaWZmOworCQlzLT5kbWFfYWRjLmNvdW50ICs9IGRpZmY7CisJCWlmIChzLT5kbWFfYWRjLmNvdW50ID49IChzaWduZWQpcy0+ZG1hX2FkYy5mcmFnc2l6ZSkgCisJCQl3YWtlX3VwKCZzLT5kbWFfYWRjLndhaXQpOworCQlpZiAoIXMtPmRtYV9hZGMubWFwcGVkKSB7CisJCQlpZiAocy0+ZG1hX2FkYy5jb3VudCA+IChzaWduZWQpKHMtPmRtYV9hZGMuZG1hc2l6ZSAtICgoMyAqIHMtPmRtYV9hZGMuZnJhZ3NpemUpID4+IDEpKSkgeworCQkJCXMtPmN0cmwgJj0gfkNUUkxfQURDX0VOOworCQkJCW91dGwocy0+Y3RybCwgcy0+aW8rRVMxMzcxX1JFR19DT05UUk9MKTsKKwkJCQlzLT5kbWFfYWRjLmVycm9yKys7CisJCQl9CisJCX0KKwl9CisJLyogdXBkYXRlIERBQzEgcG9pbnRlciAqLworCWlmIChzLT5jdHJsICYgQ1RSTF9EQUMxX0VOKSB7CisJCWRpZmYgPSBnZXRfaHdwdHIocywgJnMtPmRtYV9kYWMxLCBFUzEzNzFfUkVHX0RBQzFfRlJBTUVDTlQpOworCQlzLT5kbWFfZGFjMS50b3RhbF9ieXRlcyArPSBkaWZmOworCQlpZiAocy0+ZG1hX2RhYzEubWFwcGVkKSB7CisJCQlzLT5kbWFfZGFjMS5jb3VudCArPSBkaWZmOworCQkJaWYgKHMtPmRtYV9kYWMxLmNvdW50ID49IChzaWduZWQpcy0+ZG1hX2RhYzEuZnJhZ3NpemUpCisJCQkJd2FrZV91cCgmcy0+ZG1hX2RhYzEud2FpdCk7CisJCX0gZWxzZSB7CisJCQlzLT5kbWFfZGFjMS5jb3VudCAtPSBkaWZmOworCQkJaWYgKHMtPmRtYV9kYWMxLmNvdW50IDw9IDApIHsKKwkJCQlzLT5jdHJsICY9IH5DVFJMX0RBQzFfRU47CisJCQkJb3V0bChzLT5jdHJsLCBzLT5pbytFUzEzNzFfUkVHX0NPTlRST0wpOworCQkJCXMtPmRtYV9kYWMxLmVycm9yKys7CisJCQl9IGVsc2UgaWYgKHMtPmRtYV9kYWMxLmNvdW50IDw9IChzaWduZWQpcy0+ZG1hX2RhYzEuZnJhZ3NpemUgJiYgIXMtPmRtYV9kYWMxLmVuZGNsZWFyZWQpIHsKKwkJCQljbGVhcl9hZHZhbmNlKHMtPmRtYV9kYWMxLnJhd2J1Ziwgcy0+ZG1hX2RhYzEuZG1hc2l6ZSwgcy0+ZG1hX2RhYzEuc3dwdHIsIAorCQkJCQkgICAgICBzLT5kbWFfZGFjMS5mcmFnc2l6ZSwgKHMtPnNjdHJsICYgU0NUUkxfUDFTRUIpID8gMCA6IDB4ODApOworCQkJCXMtPmRtYV9kYWMxLmVuZGNsZWFyZWQgPSAxOworCQkJfQorCQkJaWYgKHMtPmRtYV9kYWMxLmNvdW50ICsgKHNpZ25lZClzLT5kbWFfZGFjMS5mcmFnc2l6ZSA8PSAoc2lnbmVkKXMtPmRtYV9kYWMxLmRtYXNpemUpCisJCQkJd2FrZV91cCgmcy0+ZG1hX2RhYzEud2FpdCk7CisJCX0KKwl9CisJLyogdXBkYXRlIERBQzIgcG9pbnRlciAqLworCWlmIChzLT5jdHJsICYgQ1RSTF9EQUMyX0VOKSB7CisJCWRpZmYgPSBnZXRfaHdwdHIocywgJnMtPmRtYV9kYWMyLCBFUzEzNzFfUkVHX0RBQzJfRlJBTUVDTlQpOworCQlzLT5kbWFfZGFjMi50b3RhbF9ieXRlcyArPSBkaWZmOworCQlpZiAocy0+ZG1hX2RhYzIubWFwcGVkKSB7CisJCQlzLT5kbWFfZGFjMi5jb3VudCArPSBkaWZmOworCQkJaWYgKHMtPmRtYV9kYWMyLmNvdW50ID49IChzaWduZWQpcy0+ZG1hX2RhYzIuZnJhZ3NpemUpCisJCQkJd2FrZV91cCgmcy0+ZG1hX2RhYzIud2FpdCk7CisJCX0gZWxzZSB7CisJCQlzLT5kbWFfZGFjMi5jb3VudCAtPSBkaWZmOworCQkJaWYgKHMtPmRtYV9kYWMyLmNvdW50IDw9IDApIHsKKwkJCQlzLT5jdHJsICY9IH5DVFJMX0RBQzJfRU47CisJCQkJb3V0bChzLT5jdHJsLCBzLT5pbytFUzEzNzFfUkVHX0NPTlRST0wpOworCQkJCXMtPmRtYV9kYWMyLmVycm9yKys7CisJCQl9IGVsc2UgaWYgKHMtPmRtYV9kYWMyLmNvdW50IDw9IChzaWduZWQpcy0+ZG1hX2RhYzIuZnJhZ3NpemUgJiYgIXMtPmRtYV9kYWMyLmVuZGNsZWFyZWQpIHsKKwkJCQljbGVhcl9hZHZhbmNlKHMtPmRtYV9kYWMyLnJhd2J1Ziwgcy0+ZG1hX2RhYzIuZG1hc2l6ZSwgcy0+ZG1hX2RhYzIuc3dwdHIsIAorCQkJCQkgICAgICBzLT5kbWFfZGFjMi5mcmFnc2l6ZSwgKHMtPnNjdHJsICYgU0NUUkxfUDJTRUIpID8gMCA6IDB4ODApOworCQkJCXMtPmRtYV9kYWMyLmVuZGNsZWFyZWQgPSAxOworCQkJfQorCQkJaWYgKHMtPmRtYV9kYWMyLmNvdW50ICsgKHNpZ25lZClzLT5kbWFfZGFjMi5mcmFnc2l6ZSA8PSAoc2lnbmVkKXMtPmRtYV9kYWMyLmRtYXNpemUpCisJCQkJd2FrZV91cCgmcy0+ZG1hX2RhYzIud2FpdCk7CisJCX0KKwl9Cit9CisKKy8qIGhvbGQgc3BpbmxvY2sgZm9yIHRoZSBmb2xsb3dpbmchICovCitzdGF0aWMgdm9pZCBlczEzNzFfaGFuZGxlX21pZGkoc3RydWN0IGVzMTM3MV9zdGF0ZSAqcykKK3sKKwl1bnNpZ25lZCBjaGFyIGNoOworCWludCB3YWtlOworCisJaWYgKCEocy0+Y3RybCAmIENUUkxfVUFSVF9FTikpCisJCXJldHVybjsKKwl3YWtlID0gMDsKKwl3aGlsZSAoaW5iKHMtPmlvK0VTMTM3MV9SRUdfVUFSVF9TVEFUVVMpICYgVVNUQVRfUlhSRFkpIHsKKwkJY2ggPSBpbmIocy0+aW8rRVMxMzcxX1JFR19VQVJUX0RBVEEpOworCQlpZiAocy0+bWlkaS5pY250IDwgTUlESUlOQlVGKSB7CisJCQlzLT5taWRpLmlidWZbcy0+bWlkaS5pd3JdID0gY2g7CisJCQlzLT5taWRpLml3ciA9IChzLT5taWRpLml3ciArIDEpICUgTUlESUlOQlVGOworCQkJcy0+bWlkaS5pY250Kys7CisJCX0KKwkJd2FrZSA9IDE7CisJfQorCWlmICh3YWtlKQorCQl3YWtlX3VwKCZzLT5taWRpLml3YWl0KTsKKwl3YWtlID0gMDsKKwl3aGlsZSAoKGluYihzLT5pbytFUzEzNzFfUkVHX1VBUlRfU1RBVFVTKSAmIFVTVEFUX1RYUkRZKSAmJiBzLT5taWRpLm9jbnQgPiAwKSB7CisJCW91dGIocy0+bWlkaS5vYnVmW3MtPm1pZGkub3JkXSwgcy0+aW8rRVMxMzcxX1JFR19VQVJUX0RBVEEpOworCQlzLT5taWRpLm9yZCA9IChzLT5taWRpLm9yZCArIDEpICUgTUlESU9VVEJVRjsKKwkJcy0+bWlkaS5vY250LS07CisJCWlmIChzLT5taWRpLm9jbnQgPCBNSURJT1VUQlVGLTE2KQorCQkJd2FrZSA9IDE7CisJfQorCWlmICh3YWtlKQorCQl3YWtlX3VwKCZzLT5taWRpLm93YWl0KTsKKwlvdXRiKChzLT5taWRpLm9jbnQgPiAwKSA/IFVDVFJMX1JYSU5URU4gfCBVQ1RSTF9FTkFfVFhJTlQgOiBVQ1RSTF9SWElOVEVOLCBzLT5pbytFUzEzNzFfUkVHX1VBUlRfQ09OVFJPTCk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBlczEzNzFfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisgICAgICAgIHN0cnVjdCBlczEzNzFfc3RhdGUgKnMgPSAoc3RydWN0IGVzMTM3MV9zdGF0ZSAqKWRldl9pZDsKKwl1bnNpZ25lZCBpbnQgaW50c3JjLCBzY3RsOworCQorCS8qIGZhc3RwYXRoIG91dCwgdG8gZWFzZSBpbnRlcnJ1cHQgc2hhcmluZyAqLworCWludHNyYyA9IGlubChzLT5pbytFUzEzNzFfUkVHX1NUQVRVUyk7CisJaWYgKCEoaW50c3JjICYgMHg4MDAwMDAwMCkpCisJCXJldHVybiBJUlFfTk9ORTsKKwlzcGluX2xvY2soJnMtPmxvY2spOworCS8qIGNsZWFyIGF1ZGlvIGludGVycnVwdHMgZmlyc3QgKi8KKwlzY3RsID0gcy0+c2N0cmw7CisJaWYgKGludHNyYyAmIFNUQVRfQURDKQorCQlzY3RsICY9IH5TQ1RSTF9SMUlOVEVOOworCWlmIChpbnRzcmMgJiBTVEFUX0RBQzEpCisJCXNjdGwgJj0gflNDVFJMX1AxSU5URU47CisJaWYgKGludHNyYyAmIFNUQVRfREFDMikKKwkJc2N0bCAmPSB+U0NUUkxfUDJJTlRFTjsKKwlvdXRsKHNjdGwsIHMtPmlvK0VTMTM3MV9SRUdfU0VSSUFMX0NPTlRST0wpOworCW91dGwocy0+c2N0cmwsIHMtPmlvK0VTMTM3MV9SRUdfU0VSSUFMX0NPTlRST0wpOworCWVzMTM3MV91cGRhdGVfcHRyKHMpOworCWVzMTM3MV9oYW5kbGVfbWlkaShzKTsKKwlzcGluX3VubG9jaygmcy0+bG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGNvbnN0IGNoYXIgaW52YWxpZF9tYWdpY1tdID0gS0VSTl9DUklUIFBGWCAiaW52YWxpZCBtYWdpYyB2YWx1ZVxuIjsKKworI2RlZmluZSBWQUxJREFURV9TVEFURShzKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlpZiAoIShzKSB8fCAocyktPm1hZ2ljICE9IEVTMTM3MV9NQUdJQykgeyBcCisJCXByaW50ayhpbnZhbGlkX21hZ2ljKTsgICAgICAgICAgICBcCisJCXJldHVybiAtRU5YSU87ICAgICAgICAgICAgICAgICAgICBcCisJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIENvbnZlcnNpb24gdGFibGUgZm9yIFMvUERJRiBQQ00gdm9sdW1lIGVtdWxhdGlvbiB0aHJvdWdoIHRoZSBTUkMgKi8KKy8qIGRCLWxpbmVhciB0YWJsZSBvZiBEQUMgdm9sIHZhbHVlczsgLTBkQiB0byAtNDYuNWRCIHdpdGggbXV0ZSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IERBQ1ZvbFRhYmxlWzEwMV0gPQoreworCTB4MTAwMCwgMHgwZjJhLCAweDBlNjAsIDB4MGRhMCwgMHgwY2VhLCAweDBjM2UsIDB4MGI5YSwgMHgwYWZmLAorCTB4MGE2ZCwgMHgwOWUxLCAweDA5NWUsIDB4MDhlMSwgMHgwODZhLCAweDA3ZmEsIDB4MDc4ZiwgMHgwNzJhLAorCTB4MDZjYiwgMHgwNjcwLCAweDA2MWEsIDB4MDVjOSwgMHgwNTdiLCAweDA1MzIsIDB4MDRlZCwgMHgwNGFiLAorCTB4MDQ2ZCwgMHgwNDMyLCAweDAzZmEsIDB4MDNjNSwgMHgwMzkyLCAweDAzNjMsIDB4MDMzNSwgMHgwMzBiLAorCTB4MDJlMiwgMHgwMmJjLCAweDAyOTcsIDB4MDI3NSwgMHgwMjU0LCAweDAyMzUsIDB4MDIxNywgMHgwMWZiLAorCTB4MDFlMSwgMHgwMWM4LCAweDAxYjAsIDB4MDE5OSwgMHgwMTg0LCAweDAxNzAsIDB4MDE1ZCwgMHgwMTRiLAorCTB4MDEzOSwgMHgwMTI5LCAweDAxMTksIDB4MDEwYiwgMHgwMGZkLCAweDAwZjAsIDB4MDBlMywgMHgwMGQ3LAorCTB4MDBjYywgMHgwMGMxLCAweDAwYjcsIDB4MDBhZSwgMHgwMGE1LCAweDAwOWMsIDB4MDA5NCwgMHgwMDhjLAorCTB4MDA4NSwgMHgwMDdlLCAweDAwNzcsIDB4MDA3MSwgMHgwMDZiLCAweDAwNjYsIDB4MDA2MCwgMHgwMDViLAorCTB4MDA1NywgMHgwMDUyLCAweDAwNGUsIDB4MDA0YSwgMHgwMDQ2LCAweDAwNDIsIDB4MDAzZiwgMHgwMDNjLAorCTB4MDAzOCwgMHgwMDM2LCAweDAwMzMsIDB4MDAzMCwgMHgwMDJlLCAweDAwMmIsIDB4MDAyOSwgMHgwMDI3LAorCTB4MDAyNSwgMHgwMDIzLCAweDAwMjEsIDB4MDAxZiwgMHgwMDFlLCAweDAwMWMsIDB4MDAxYiwgMHgwMDE5LAorCTB4MDAxOCwgMHgwMDE3LCAweDAwMTYsIDB4MDAxNCwgMHgwMDAwCit9OworCisvKgorICogd2hlbiB3ZSBhcmUgaW4gUy9QRElGIG1vZGUsIHdlIHdhbnQgdG8gZGlzYWJsZSBhbnkgYW5hbG9nIG91dHB1dCBzbworICogd2UgZmlsdGVyIHRoZSBtaXhlciBpb2N0bHMgCisgKi8KK3N0YXRpYyBpbnQgbWl4ZGV2X2lvY3RsKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGVzMTM3MV9zdGF0ZSAqcyA9IChzdHJ1Y3QgZXMxMzcxX3N0YXRlICopY29kZWMtPnByaXZhdGVfZGF0YTsKKwlpbnQgdmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGxlZnQsIHJpZ2h0OworCisJVkFMSURBVEVfU1RBVEUocyk7CisJLyogZmlsdGVyIG1peGVyIGlvY3RscyB0byBjYXRjaCBQQ00gYW5kIE1BU1RFUiB2b2x1bWUgd2hlbiBpbiBTL1BESUYgbW9kZSAqLworCWlmIChzLT5zcGRpZl92b2x1bWUgPT0gLTEpCisJCXJldHVybiBjb2RlYy0+bWl4ZXJfaW9jdGwoY29kZWMsIGNtZCwgYXJnKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfVk9MVU1FOgorCQlyZXR1cm4gMDsKKworCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfUENNOiAgIC8qIHVzZSBTUkMgZm9yIFBDTSB2b2x1bWUgKi8KKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCBfX3VzZXIgKilhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJpZ2h0ID0gKCh2YWwgPj4gOCkgICYgMHhmZik7CisJCWxlZnQgPSAodmFsICAmIDB4ZmYpOworCQlpZiAocmlnaHQgPiAxMDApCisJCQlyaWdodCA9IDEwMDsKKwkJaWYgKGxlZnQgPiAxMDApCisJCQlsZWZ0ID0gMTAwOworCQlzLT5zcGRpZl92b2x1bWUgPSAocmlnaHQgPDwgOCkgfCBsZWZ0OworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlzcmNfd3JpdGUocywgU1JDUkVHX1ZPTF9EQUMyLCBEQUNWb2xUYWJsZVsxMDAgLSBsZWZ0XSk7CisJCXNyY193cml0ZShzLCBTUkNSRUdfVk9MX0RBQzIrMSwgREFDVm9sVGFibGVbMTAwIC0gcmlnaHRdKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMDsKKwkKKwljYXNlIFNPVU5EX01JWEVSX1JFQURfUENNOgorCQlyZXR1cm4gcHV0X3VzZXIocy0+c3BkaWZfdm9sdW1lLCAoaW50IF9fdXNlciAqKWFyZyk7CisJfQorCXJldHVybiBjb2RlYy0+bWl4ZXJfaW9jdGwoY29kZWMsIGNtZCwgYXJnKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBBQzk3IE1peGVyIFJlZ2lzdGVyIHRvIENvbm5lY3Rpb25zIG1hcHBpbmcgb2YgdGhlIENvbmNlcnQgOTcgYm9hcmQKKyAqCisgKiBBQzk3X01BU1RFUl9WT0xfU1RFUkVPICAgTGluZSBPdXQKKyAqIEFDOTdfTUFTVEVSX1ZPTF9NT05PICAgICBUQUQgT3V0cHV0CisgKiBBQzk3X1BDQkVFUF9WT0wgICAgICAgICAgbm9uZQorICogQUM5N19QSE9ORV9WT0wgICAgICAgICAgIFRBRCBJbnB1dCAobW9ubykKKyAqIEFDOTdfTUlDX1ZPTCAgICAgICAgICAgICBNSUMgSW5wdXQgKG1vbm8pCisgKiBBQzk3X0xJTkVJTl9WT0wgICAgICAgICAgTGluZSBJbnB1dCAoc3RlcmVvKQorICogQUM5N19DRF9WT0wgICAgICAgICAgICAgIENEIElucHV0IChzdGVyZW8pCisgKiBBQzk3X1ZJREVPX1ZPTCAgICAgICAgICAgbm9uZQorICogQUM5N19BVVhfVk9MICAgICAgICAgICAgIEF1eCBJbnB1dCAoc3RlcmVvKQorICogQUM5N19QQ01PVVRfVk9MICAgICAgICAgIFdhdmUgT3V0cHV0IChzdGVyZW8pCisgKi8KKworc3RhdGljIGludCBlczEzNzFfb3Blbl9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCXN0cnVjdCBlczEzNzFfc3RhdGUgKnM7CisKKwlmb3IgKGxpc3QgPSBkZXZzLm5leHQ7IDsgbGlzdCA9IGxpc3QtPm5leHQpIHsKKwkJaWYgKGxpc3QgPT0gJmRldnMpCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJcyA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IGVzMTM3MV9zdGF0ZSwgZGV2cyk7CisJCWlmIChzLT5jb2RlYy0+ZGV2X21peGVyID09IG1pbm9yKQorCQkJYnJlYWs7CisJfQorICAgICAgIAlWQUxJREFURV9TVEFURShzKTsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBzOworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludCBlczEzNzFfcmVsZWFzZV9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGVzMTM3MV9zdGF0ZSAqcyA9IChzdHJ1Y3QgZXMxMzcxX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCQorCVZBTElEQVRFX1NUQVRFKHMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVzMTM3MV9pb2N0bF9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBlczEzNzFfc3RhdGUgKnMgPSAoc3RydWN0IGVzMTM3MV9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMgPSBzLT5jb2RlYzsKKworCXJldHVybiBtaXhkZXZfaW9jdGwoY29kZWMsIGNtZCwgYXJnKTsKK30KKworc3RhdGljIC8qY29uc3QqLyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGVzMTM3MV9taXhlcl9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkuaW9jdGwJCT0gZXMxMzcxX2lvY3RsX21peGRldiwKKwkub3BlbgkJPSBlczEzNzFfb3Blbl9taXhkZXYsCisJLnJlbGVhc2UJPSBlczEzNzFfcmVsZWFzZV9taXhkZXYsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBkcmFpbl9kYWMxKHN0cnVjdCBlczEzNzFfc3RhdGUgKnMsIGludCBub25ibG9jaykKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjb3VudCwgdG1vOworCQorCWlmIChzLT5kbWFfZGFjMS5tYXBwZWQgfHwgIXMtPmRtYV9kYWMxLnJlYWR5KQorCQlyZXR1cm4gMDsKKyAgICAgICAgYWRkX3dhaXRfcXVldWUoJnMtPmRtYV9kYWMxLndhaXQsICZ3YWl0KTsKKyAgICAgICAgZm9yICg7OykgeworCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisgICAgICAgICAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgPSBzLT5kbWFfZGFjMS5jb3VudDsKKyAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjb3VudCA8PSAwKQorCQkJYnJlYWs7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGlmIChub25ibG9jaykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlX3dhaXRfcXVldWUoJnMtPmRtYV9kYWMxLndhaXQsICZ3YWl0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVCVVNZOworICAgICAgICAgICAgICAgIH0KKwkJdG1vID0gMyAqIEhaICogKGNvdW50ICsgcy0+ZG1hX2RhYzEuZnJhZ3NpemUpIC8gMiAvIHMtPmRhYzFyYXRlOworCQl0bW8gPj49IHNhbXBsZV9zaGlmdFsocy0+c2N0cmwgJiBTQ1RSTF9QMUZNVCkgPj4gU0NUUkxfU0hfUDFGTVRdOworCQlpZiAoIXNjaGVkdWxlX3RpbWVvdXQodG1vICsgMSkpCisJCQlEQkcocHJpbnRrKEtFUk5fREVCVUcgUEZYICJkYWMxIGRtYSB0aW1lZCBvdXQ/P1xuIik7KQorICAgICAgICB9CisgICAgICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZzLT5kbWFfZGFjMS53YWl0LCAmd2FpdCk7CisgICAgICAgIHNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisgICAgICAgIGlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVSRVNUQVJUU1lTOworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkcmFpbl9kYWMyKHN0cnVjdCBlczEzNzFfc3RhdGUgKnMsIGludCBub25ibG9jaykKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjb3VudCwgdG1vOworCisJaWYgKHMtPmRtYV9kYWMyLm1hcHBlZCB8fCAhcy0+ZG1hX2RhYzIucmVhZHkpCisJCXJldHVybiAwOworICAgICAgICBhZGRfd2FpdF9xdWV1ZSgmcy0+ZG1hX2RhYzIud2FpdCwgJndhaXQpOworICAgICAgICBmb3IgKDs7KSB7CisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworICAgICAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNvdW50ID0gcy0+ZG1hX2RhYzIuY291bnQ7CisgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY291bnQgPD0gMCkKKwkJCWJyZWFrOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBpZiAobm9uYmxvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZzLT5kbWFfZGFjMi53YWl0LCAmd2FpdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKKyAgICAgICAgICAgICAgICB9CisJCXRtbyA9IDMgKiBIWiAqIChjb3VudCArIHMtPmRtYV9kYWMyLmZyYWdzaXplKSAvIDIgLyBzLT5kYWMycmF0ZTsKKwkJdG1vID4+PSBzYW1wbGVfc2hpZnRbKHMtPnNjdHJsICYgU0NUUkxfUDJGTVQpID4+IFNDVFJMX1NIX1AyRk1UXTsKKwkJaWYgKCFzY2hlZHVsZV90aW1lb3V0KHRtbyArIDEpKQorCQkJREJHKHByaW50ayhLRVJOX0RFQlVHIFBGWCAiZGFjMiBkbWEgdGltZWQgb3V0Pz9cbiIpOykKKyAgICAgICAgfQorICAgICAgICByZW1vdmVfd2FpdF9xdWV1ZSgmcy0+ZG1hX2RhYzIud2FpdCwgJndhaXQpOworICAgICAgICBzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworICAgICAgICBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FUkVTVEFSVFNZUzsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3NpemVfdCBlczEzNzFfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGVzMTM3MV9zdGF0ZSAqcyA9IChzdHJ1Y3QgZXMxMzcxX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXNzaXplX3QgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIHN3cHRyOworCWludCBjbnQ7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlpZiAocy0+ZG1hX2FkYy5tYXBwZWQpCisJCXJldHVybiAtRU5YSU87CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJZG93bigmcy0+c2VtKTsKKwlpZiAoIXMtPmRtYV9hZGMucmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmX2FkYyhzKSkpCisJCWdvdG8gb3V0MjsKKwkKKwlhZGRfd2FpdF9xdWV1ZSgmcy0+ZG1hX2FkYy53YWl0LCAmd2FpdCk7CisJd2hpbGUgKGNvdW50ID4gMCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlzd3B0ciA9IHMtPmRtYV9hZGMuc3dwdHI7CisJCWNudCA9IHMtPmRtYV9hZGMuZG1hc2l6ZS1zd3B0cjsKKwkJaWYgKHMtPmRtYV9hZGMuY291bnQgPCBjbnQpCisJCQljbnQgPSBzLT5kbWFfYWRjLmNvdW50OworCQlpZiAoY250IDw9IDApCisJCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNudCA+IGNvdW50KQorCQkJY250ID0gY291bnQ7CisJCWlmIChjbnQgPD0gMCkgeworCQkJaWYgKHMtPmRtYV9hZGMuZW5hYmxlZCkKKwkJCQlzdGFydF9hZGMocyk7CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0gLUVBR0FJTjsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCXVwKCZzLT5zZW0pOworCQkJc2NoZWR1bGUoKTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisJCQkJZ290byBvdXQyOworCQkJfQorCQkJZG93bigmcy0+c2VtKTsKKwkJCWlmIChzLT5kbWFfYWRjLm1hcHBlZCkKKwkJCXsKKwkJCQlyZXQgPSAtRU5YSU87CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgcy0+ZG1hX2FkYy5yYXdidWYgKyBzd3B0ciwgY250KSkgeworCQkJaWYgKCFyZXQpCisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OworCQl9CisJCXN3cHRyID0gKHN3cHRyICsgY250KSAlIHMtPmRtYV9hZGMuZG1hc2l6ZTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcy0+ZG1hX2FkYy5zd3B0ciA9IHN3cHRyOworCQlzLT5kbWFfYWRjLmNvdW50IC09IGNudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQljb3VudCAtPSBjbnQ7CisJCWJ1ZmZlciArPSBjbnQ7CisJCXJldCArPSBjbnQ7CisJCWlmIChzLT5kbWFfYWRjLmVuYWJsZWQpCisJCQlzdGFydF9hZGMocyk7CisJfQorb3V0OgorCXVwKCZzLT5zZW0pOworb3V0MjoKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmcy0+ZG1hX2FkYy53YWl0LCAmd2FpdCk7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBlczEzNzFfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBlczEzNzFfc3RhdGUgKnMgPSAoc3RydWN0IGVzMTM3MV9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzc2l6ZV90IHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIHN3cHRyOworCWludCBjbnQ7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlpZiAocy0+ZG1hX2RhYzIubWFwcGVkKQorCQlyZXR1cm4gLUVOWElPOworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJZG93bigmcy0+c2VtKTsJCisJaWYgKCFzLT5kbWFfZGFjMi5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWZfZGFjMihzKSkpCisJCWdvdG8gb3V0MzsKKwlyZXQgPSAwOworCWFkZF93YWl0X3F1ZXVlKCZzLT5kbWFfZGFjMi53YWl0LCAmd2FpdCk7CisJd2hpbGUgKGNvdW50ID4gMCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAocy0+ZG1hX2RhYzIuY291bnQgPCAwKSB7CisJCQlzLT5kbWFfZGFjMi5jb3VudCA9IDA7CisJCQlzLT5kbWFfZGFjMi5zd3B0ciA9IHMtPmRtYV9kYWMyLmh3cHRyOworCQl9CisJCXN3cHRyID0gcy0+ZG1hX2RhYzIuc3dwdHI7CisJCWNudCA9IHMtPmRtYV9kYWMyLmRtYXNpemUtc3dwdHI7CisJCWlmIChzLT5kbWFfZGFjMi5jb3VudCArIGNudCA+IHMtPmRtYV9kYWMyLmRtYXNpemUpCisJCQljbnQgPSBzLT5kbWFfZGFjMi5kbWFzaXplIC0gcy0+ZG1hX2RhYzIuY291bnQ7CisJCWlmIChjbnQgPD0gMCkKKwkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY250ID4gY291bnQpCisJCQljbnQgPSBjb3VudDsKKwkJaWYgKGNudCA8PSAwKSB7CisJCQlpZiAocy0+ZG1hX2RhYzIuZW5hYmxlZCkKKwkJCQlzdGFydF9kYWMyKHMpOworCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQkJaWYgKCFyZXQpCisJCQkJCXJldCA9IC1FQUdBSU47CisJCQkJZ290byBvdXQ7CisJCQl9CQorCQkJdXAoJnMtPnNlbSk7CisJCQlzY2hlZHVsZSgpOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJaWYgKCFyZXQpCisJCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCQlnb3RvIG91dDI7CisJCQl9CisJCQlkb3duKCZzLT5zZW0pOworCQkJaWYgKHMtPmRtYV9kYWMyLm1hcHBlZCkKKwkJCXsKKwkJCQlyZXQgPSAtRU5YSU87CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoY29weV9mcm9tX3VzZXIocy0+ZG1hX2RhYzIucmF3YnVmICsgc3dwdHIsIGJ1ZmZlciwgY250KSkgeworCQkJaWYgKCFyZXQpCisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OworCQl9CisJCXN3cHRyID0gKHN3cHRyICsgY250KSAlIHMtPmRtYV9kYWMyLmRtYXNpemU7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCXMtPmRtYV9kYWMyLnN3cHRyID0gc3dwdHI7CisJCXMtPmRtYV9kYWMyLmNvdW50ICs9IGNudDsKKwkJcy0+ZG1hX2RhYzIuZW5kY2xlYXJlZCA9IDA7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgLT0gY250OworCQlidWZmZXIgKz0gY250OworCQlyZXQgKz0gY250OworCQlpZiAocy0+ZG1hX2RhYzIuZW5hYmxlZCkKKwkJCXN0YXJ0X2RhYzIocyk7CisJfQorb3V0OgorCXVwKCZzLT5zZW0pOworb3V0MjoKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmcy0+ZG1hX2RhYzIud2FpdCwgJndhaXQpOworb3V0MzoJCisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBObyBrZXJuZWwgbG9jayAtIHdlIGhhdmUgb3VyIG93biBzcGlubG9jayAqLworc3RhdGljIHVuc2lnbmVkIGludCBlczEzNzFfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQoreworCXN0cnVjdCBlczEzNzFfc3RhdGUgKnMgPSAoc3RydWN0IGVzMTM3MV9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlpZiAoIXMtPmRtYV9kYWMyLnJlYWR5ICYmIHByb2dfZG1hYnVmX2RhYzIocykpCisJCQlyZXR1cm4gMDsKKwkJcG9sbF93YWl0KGZpbGUsICZzLT5kbWFfZGFjMi53YWl0LCB3YWl0KTsKKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJaWYgKCFzLT5kbWFfYWRjLnJlYWR5ICYmIHByb2dfZG1hYnVmX2FkYyhzKSkKKwkJCXJldHVybiAwOworCQlwb2xsX3dhaXQoZmlsZSwgJnMtPmRtYV9hZGMud2FpdCwgd2FpdCk7CisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJZXMxMzcxX3VwZGF0ZV9wdHIocyk7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCWlmIChzLT5kbWFfYWRjLmNvdW50ID49IChzaWduZWQpcy0+ZG1hX2FkYy5mcmFnc2l6ZSkKKwkJCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlpZiAocy0+ZG1hX2RhYzIubWFwcGVkKSB7CisJCQlpZiAocy0+ZG1hX2RhYzIuY291bnQgPj0gKHNpZ25lZClzLT5kbWFfZGFjMi5mcmFnc2l6ZSkgCisJCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwkJfSBlbHNlIHsKKwkJCWlmICgoc2lnbmVkKXMtPmRtYV9kYWMyLmRtYXNpemUgPj0gcy0+ZG1hX2RhYzIuY291bnQgKyAoc2lnbmVkKXMtPmRtYV9kYWMyLmZyYWdzaXplKQorCQkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgaW50IGVzMTM3MV9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzID0gKHN0cnVjdCBlczEzNzFfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRtYWJ1ZiAqZGI7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyBzaXplOworCisJVkFMSURBVEVfU1RBVEUocyk7CisJbG9ja19rZXJuZWwoKTsKKwlkb3duKCZzLT5zZW0pOworCQorCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpIHsKKwkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1Zl9kYWMyKHMpKSAhPSAwKSB7CisJCQlnb3RvIG91dDsKKwkJfQorCQlkYiA9ICZzLT5kbWFfZGFjMjsKKwl9IGVsc2UgaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9SRUFEKSB7CisJCWlmICgocmV0ID0gcHJvZ19kbWFidWZfYWRjKHMpKSAhPSAwKSB7CisJCQlnb3RvIG91dDsKKwkJfQorCQlkYiA9ICZzLT5kbWFfYWRjOworCX0gZWxzZSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwlpZiAodm1hLT52bV9wZ29mZiAhPSAwKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwlzaXplID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OworCWlmIChzaXplID4gKFBBR0VfU0laRSA8PCBkYi0+YnVmb3JkZXIpKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwlpZiAocmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwKKwkJCQl2aXJ0X3RvX3BoeXMoZGItPnJhd2J1ZikgPj4gUEFHRV9TSElGVCwKKwkJCQlzaXplLCB2bWEtPnZtX3BhZ2VfcHJvdCkpIHsKKwkJcmV0ID0gLUVBR0FJTjsKKwkJZ290byBvdXQ7CisJfQorCWRiLT5tYXBwZWQgPSAxOworb3V0OgorCXVwKCZzLT5zZW0pOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGVzMTM3MV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGVzMTM3MV9zdGF0ZSAqcyA9IChzdHJ1Y3QgZXMxMzcxX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgICAgIGF1ZGlvX2J1Zl9pbmZvIGFiaW5mbzsKKyAgICAgICAgY291bnRfaW5mbyBjaW5mbzsKKwlpbnQgY291bnQ7CisJaW50IHZhbCwgbWFwcGVkLCByZXQ7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IF9fdXNlciAqcCA9IGFyZ3A7CisKKwlWQUxJREFURV9TVEFURShzKTsKKyAgICAgICAgbWFwcGVkID0gKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYgcy0+ZG1hX2RhYzIubWFwcGVkKSB8fAorCQkoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpICYmIHMtPmRtYV9hZGMubWFwcGVkKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgT1NTX0dFVFZFUlNJT046CisJCXJldHVybiBwdXRfdXNlcihTT1VORF9WRVJTSU9OLCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9TWU5DOgorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCQlyZXR1cm4gZHJhaW5fZGFjMihzLCAwLypmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyovKTsKKwkJcmV0dXJuIDA7CisJCQorCWNhc2UgU05EQ1RMX0RTUF9TRVREVVBMRVg6CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVENBUFM6CisJCXJldHVybiBwdXRfdXNlcihEU1BfQ0FQX0RVUExFWCB8IERTUF9DQVBfUkVBTFRJTUUgfCBEU1BfQ0FQX1RSSUdHRVIgfCBEU1BfQ0FQX01NQVAsIHApOworCQkKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1JFU0VUOgorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCXN0b3BfZGFjMihzKTsKKwkJCXN5bmNocm9uaXplX2lycShzLT5pcnEpOworCQkJcy0+ZG1hX2RhYzIuc3dwdHIgPSBzLT5kbWFfZGFjMi5od3B0ciA9IHMtPmRtYV9kYWMyLmNvdW50ID0gcy0+ZG1hX2RhYzIudG90YWxfYnl0ZXMgPSAwOworCQl9CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlzdG9wX2FkYyhzKTsKKwkJCXN5bmNocm9uaXplX2lycShzLT5pcnEpOworCQkJcy0+ZG1hX2FkYy5zd3B0ciA9IHMtPmRtYV9hZGMuaHdwdHIgPSBzLT5kbWFfYWRjLmNvdW50ID0gcy0+ZG1hX2FkYy50b3RhbF9ieXRlcyA9IDA7CisJCX0KKwkJcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NQRUVEOgorICAgICAgICAgICAgICAgIGlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgPj0gMCkgeworCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCQlzdG9wX2FkYyhzKTsKKwkJCQlzLT5kbWFfYWRjLnJlYWR5ID0gMDsKKwkJCQlzZXRfYWRjX3JhdGUocywgdmFsKTsKKwkJCX0KKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJCXN0b3BfZGFjMihzKTsKKwkJCQlzLT5kbWFfZGFjMi5yZWFkeSA9IDA7CisJCQkJc2V0X2RhYzJfcmF0ZShzLCB2YWwpOworCQkJfQorCQl9CisJCXJldHVybiBwdXRfdXNlcigoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgPyBzLT5hZGNyYXRlIDogcy0+ZGFjMnJhdGUsIHApOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TVEVSRU86CisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlzdG9wX2FkYyhzKTsKKwkJCXMtPmRtYV9hZGMucmVhZHkgPSAwOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCWlmICh2YWwpCisJCQkJcy0+c2N0cmwgfD0gU0NUUkxfUjFTTUI7CisJCQllbHNlCisJCQkJcy0+c2N0cmwgJj0gflNDVFJMX1IxU01COworCQkJb3V0bChzLT5zY3RybCwgcy0+aW8rRVMxMzcxX1JFR19TRVJJQUxfQ09OVFJPTCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlzdG9wX2RhYzIocyk7CisJCQlzLT5kbWFfZGFjMi5yZWFkeSA9IDA7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQkJaWYgKHZhbCkKKwkJCQlzLT5zY3RybCB8PSBTQ1RSTF9QMlNNQjsKKwkJCWVsc2UKKwkJCQlzLT5zY3RybCAmPSB+U0NUUkxfUDJTTUI7CisJCQlvdXRsKHMtPnNjdHJsLCBzLT5pbytFUzEzNzFfUkVHX1NFUklBTF9DT05UUk9MKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgICAgICAgICB9CisJCXJldHVybiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9DSEFOTkVMUzoKKyAgICAgICAgICAgICAgICBpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsICE9IDApIHsKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQkJc3RvcF9hZGMocyk7CisJCQkJcy0+ZG1hX2FkYy5yZWFkeSA9IDA7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCQlpZiAodmFsID49IDIpCisJCQkJCXMtPnNjdHJsIHw9IFNDVFJMX1IxU01COworCQkJCWVsc2UKKwkJCQkJcy0+c2N0cmwgJj0gflNDVFJMX1IxU01COworCQkJCW91dGwocy0+c2N0cmwsIHMtPmlvK0VTMTM3MV9SRUdfU0VSSUFMX0NPTlRST0wpOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCX0KKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJCXN0b3BfZGFjMihzKTsKKwkJCQlzLT5kbWFfZGFjMi5yZWFkeSA9IDA7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCQlpZiAodmFsID49IDIpCisJCQkJCXMtPnNjdHJsIHw9IFNDVFJMX1AyU01COworCQkJCWVsc2UKKwkJCQkJcy0+c2N0cmwgJj0gflNDVFJMX1AyU01COworCQkJCW91dGwocy0+c2N0cmwsIHMtPmlvK0VTMTM3MV9SRUdfU0VSSUFMX0NPTlRST0wpOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIoKHMtPnNjdHJsICYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSA/IFNDVFJMX1IxU01CIDogU0NUUkxfUDJTTUIpKSA/IDIgOiAxLCBwKTsKKwkJCisJY2FzZSBTTkRDVExfRFNQX0dFVEZNVFM6IC8qIFJldHVybnMgYSBtYXNrICovCisgICAgICAgICAgICAgICAgcmV0dXJuIHB1dF91c2VyKEFGTVRfUzE2X0xFfEFGTVRfVTgsIHApOworCQkKKwljYXNlIFNORENUTF9EU1BfU0VURk1UOiAvKiBTZWxlY3RzIE9ORSBmbXQqLworCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsICE9IEFGTVRfUVVFUlkpIHsKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQkJc3RvcF9hZGMocyk7CisJCQkJcy0+ZG1hX2FkYy5yZWFkeSA9IDA7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCQlpZiAodmFsID09IEFGTVRfUzE2X0xFKQorCQkJCQlzLT5zY3RybCB8PSBTQ1RSTF9SMVNFQjsKKwkJCQllbHNlCisJCQkJCXMtPnNjdHJsICY9IH5TQ1RSTF9SMVNFQjsKKwkJCQlvdXRsKHMtPnNjdHJsLCBzLT5pbytFUzEzNzFfUkVHX1NFUklBTF9DT05UUk9MKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCQl9CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCQlzdG9wX2RhYzIocyk7CisJCQkJcy0+ZG1hX2RhYzIucmVhZHkgPSAwOworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCQkJaWYgKHZhbCA9PSBBRk1UX1MxNl9MRSkKKwkJCQkJcy0+c2N0cmwgfD0gU0NUUkxfUDJTRUI7CisJCQkJZWxzZQorCQkJCQlzLT5zY3RybCAmPSB+U0NUUkxfUDJTRUI7CisJCQkJb3V0bChzLT5zY3RybCwgcy0+aW8rRVMxMzcxX1JFR19TRVJJQUxfQ09OVFJPTCk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQkJfQorCQl9CisJCXJldHVybiBwdXRfdXNlcigocy0+c2N0cmwgJiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID8gU0NUUkxfUjFTRUIgOiBTQ1RSTF9QMlNFQikpID8gCisJCQkJQUZNVF9TMTZfTEUgOiBBRk1UX1U4LCBwKTsKKwkJCisJY2FzZSBTTkRDVExfRFNQX1BPU1Q6CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVFRSSUdHRVI6CisJCXZhbCA9IDA7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEICYmIHMtPmN0cmwgJiBDVFJMX0FEQ19FTikgCisJCQl2YWwgfD0gUENNX0VOQUJMRV9JTlBVVDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFICYmIHMtPmN0cmwgJiBDVFJMX0RBQzJfRU4pIAorCQkJdmFsIHw9IFBDTV9FTkFCTEVfT1VUUFVUOworCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKwkJCisJY2FzZSBTTkRDVExfRFNQX1NFVFRSSUdHRVI6CisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlpZiAodmFsICYgUENNX0VOQUJMRV9JTlBVVCkgeworCQkJCWlmICghcy0+ZG1hX2FkYy5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWZfYWRjKHMpKSkKKwkJCQkJcmV0dXJuIHJldDsKKwkJCQlzLT5kbWFfYWRjLmVuYWJsZWQgPSAxOworCQkJCXN0YXJ0X2FkYyhzKTsKKwkJCX0gZWxzZSB7CisJCQkJcy0+ZG1hX2FkYy5lbmFibGVkID0gMDsKKwkJCQlzdG9wX2FkYyhzKTsKKwkJCX0KKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCWlmICh2YWwgJiBQQ01fRU5BQkxFX09VVFBVVCkgeworCQkJCWlmICghcy0+ZG1hX2RhYzIucmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmX2RhYzIocykpKQorCQkJCQlyZXR1cm4gcmV0OworCQkJCXMtPmRtYV9kYWMyLmVuYWJsZWQgPSAxOworCQkJCXN0YXJ0X2RhYzIocyk7CisJCQl9IGVsc2UgeworCQkJCXMtPmRtYV9kYWMyLmVuYWJsZWQgPSAwOworCQkJCXN0b3BfZGFjMihzKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRPU1BBQ0U6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoIXMtPmRtYV9kYWMyLnJlYWR5ICYmICh2YWwgPSBwcm9nX2RtYWJ1Zl9kYWMyKHMpKSAhPSAwKQorCQkJcmV0dXJuIHZhbDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJZXMxMzcxX3VwZGF0ZV9wdHIocyk7CisJCWFiaW5mby5mcmFnc2l6ZSA9IHMtPmRtYV9kYWMyLmZyYWdzaXplOworCQljb3VudCA9IHMtPmRtYV9kYWMyLmNvdW50OworCQlpZiAoY291bnQgPCAwKQorCQkJY291bnQgPSAwOworICAgICAgICAgICAgICAgIGFiaW5mby5ieXRlcyA9IHMtPmRtYV9kYWMyLmRtYXNpemUgLSBjb3VudDsKKyAgICAgICAgICAgICAgICBhYmluZm8uZnJhZ3N0b3RhbCA9IHMtPmRtYV9kYWMyLm51bWZyYWc7CisgICAgICAgICAgICAgICAgYWJpbmZvLmZyYWdtZW50cyA9IGFiaW5mby5ieXRlcyA+PiBzLT5kbWFfZGFjMi5mcmFnc2hpZnQ7ICAgICAgCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmYWJpbmZvLCBzaXplb2YoYWJpbmZvKSkgPyAtRUZBVUxUIDogMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRJU1BBQ0U6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICghcy0+ZG1hX2FkYy5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWZfYWRjKHMpKSAhPSAwKQorCQkJcmV0dXJuIHZhbDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJZXMxMzcxX3VwZGF0ZV9wdHIocyk7CisJCWFiaW5mby5mcmFnc2l6ZSA9IHMtPmRtYV9hZGMuZnJhZ3NpemU7CisJCWNvdW50ID0gcy0+ZG1hX2FkYy5jb3VudDsKKwkJaWYgKGNvdW50IDwgMCkKKwkJCWNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBhYmluZm8uYnl0ZXMgPSBjb3VudDsKKyAgICAgICAgICAgICAgICBhYmluZm8uZnJhZ3N0b3RhbCA9IHMtPmRtYV9hZGMubnVtZnJhZzsKKyAgICAgICAgICAgICAgICBhYmluZm8uZnJhZ21lbnRzID0gYWJpbmZvLmJ5dGVzID4+IHMtPmRtYV9hZGMuZnJhZ3NoaWZ0OyAgICAgIAorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJmFiaW5mbywgc2l6ZW9mKGFiaW5mbykpID8gLUVGQVVMVCA6IDA7CisJCQorICAgICAgICBjYXNlIFNORENUTF9EU1BfTk9OQkxPQ0s6CisgICAgICAgICAgICAgICAgZmlsZS0+Zl9mbGFncyB8PSBPX05PTkJMT0NLOworICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRPREVMQVk6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoIXMtPmRtYV9kYWMyLnJlYWR5ICYmICh2YWwgPSBwcm9nX2RtYWJ1Zl9kYWMyKHMpKSAhPSAwKQorCQkJcmV0dXJuIHZhbDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJZXMxMzcxX3VwZGF0ZV9wdHIocyk7CisgICAgICAgICAgICAgICAgY291bnQgPSBzLT5kbWFfZGFjMi5jb3VudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY291bnQgPCAwKQorCQkJY291bnQgPSAwOworCQlyZXR1cm4gcHV0X3VzZXIoY291bnQsIHApOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRJUFRSOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoIXMtPmRtYV9hZGMucmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmX2FkYyhzKSkgIT0gMCkKKwkJCXJldHVybiB2YWw7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWVzMTM3MV91cGRhdGVfcHRyKHMpOworICAgICAgICAgICAgICAgIGNpbmZvLmJ5dGVzID0gcy0+ZG1hX2FkYy50b3RhbF9ieXRlczsKKwkJY291bnQgPSBzLT5kbWFfYWRjLmNvdW50OworCQlpZiAoY291bnQgPCAwKQorCQkJY291bnQgPSAwOworICAgICAgICAgICAgICAgIGNpbmZvLmJsb2NrcyA9IGNvdW50ID4+IHMtPmRtYV9hZGMuZnJhZ3NoaWZ0OworICAgICAgICAgICAgICAgIGNpbmZvLnB0ciA9IHMtPmRtYV9hZGMuaHdwdHI7CisJCWlmIChzLT5kbWFfYWRjLm1hcHBlZCkKKwkJCXMtPmRtYV9hZGMuY291bnQgJj0gcy0+ZG1hX2FkYy5mcmFnc2l6ZS0xOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmNpbmZvLCBzaXplb2YoY2luZm8pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUT1BUUjoKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICghcy0+ZG1hX2RhYzIucmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmX2RhYzIocykpICE9IDApCisJCQlyZXR1cm4gdmFsOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQllczEzNzFfdXBkYXRlX3B0cihzKTsKKyAgICAgICAgICAgICAgICBjaW5mby5ieXRlcyA9IHMtPmRtYV9kYWMyLnRvdGFsX2J5dGVzOworCQljb3VudCA9IHMtPmRtYV9kYWMyLmNvdW50OworCQlpZiAoY291bnQgPCAwKQorCQkJY291bnQgPSAwOworICAgICAgICAgICAgICAgIGNpbmZvLmJsb2NrcyA9IGNvdW50ID4+IHMtPmRtYV9kYWMyLmZyYWdzaGlmdDsKKyAgICAgICAgICAgICAgICBjaW5mby5wdHIgPSBzLT5kbWFfZGFjMi5od3B0cjsKKwkJaWYgKHMtPmRtYV9kYWMyLm1hcHBlZCkKKwkJCXMtPmRtYV9kYWMyLmNvdW50ICY9IHMtPmRtYV9kYWMyLmZyYWdzaXplLTE7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmY2luZm8sIHNpemVvZihjaW5mbykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRCTEtTSVpFOgorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCWlmICgodmFsID0gcHJvZ19kbWFidWZfZGFjMihzKSkpCisJCQkJcmV0dXJuIHZhbDsKKwkJCXJldHVybiBwdXRfdXNlcihzLT5kbWFfZGFjMi5mcmFnc2l6ZSwgcCk7CisJCX0KKwkJaWYgKCh2YWwgPSBwcm9nX2RtYWJ1Zl9hZGMocykpKQorCQkJcmV0dXJuIHZhbDsKKwkJcmV0dXJuIHB1dF91c2VyKHMtPmRtYV9hZGMuZnJhZ3NpemUsIHApOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TRVRGUkFHTUVOVDoKKyAgICAgICAgICAgICAgICBpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJcy0+ZG1hX2FkYy5vc3NmcmFnc2hpZnQgPSB2YWwgJiAweGZmZmY7CisJCQlzLT5kbWFfYWRjLm9zc21heGZyYWdzID0gKHZhbCA+PiAxNikgJiAweGZmZmY7CisJCQlpZiAocy0+ZG1hX2FkYy5vc3NmcmFnc2hpZnQgPCA0KQorCQkJCXMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0ID0gNDsKKwkJCWlmIChzLT5kbWFfYWRjLm9zc2ZyYWdzaGlmdCA+IDE1KQorCQkJCXMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0ID0gMTU7CisJCQlpZiAocy0+ZG1hX2FkYy5vc3NtYXhmcmFncyA8IDQpCisJCQkJcy0+ZG1hX2FkYy5vc3NtYXhmcmFncyA9IDQ7CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlzLT5kbWFfZGFjMi5vc3NmcmFnc2hpZnQgPSB2YWwgJiAweGZmZmY7CisJCQlzLT5kbWFfZGFjMi5vc3NtYXhmcmFncyA9ICh2YWwgPj4gMTYpICYgMHhmZmZmOworCQkJaWYgKHMtPmRtYV9kYWMyLm9zc2ZyYWdzaGlmdCA8IDQpCisJCQkJcy0+ZG1hX2RhYzIub3NzZnJhZ3NoaWZ0ID0gNDsKKwkJCWlmIChzLT5kbWFfZGFjMi5vc3NmcmFnc2hpZnQgPiAxNSkKKwkJCQlzLT5kbWFfZGFjMi5vc3NmcmFnc2hpZnQgPSAxNTsKKwkJCWlmIChzLT5kbWFfZGFjMi5vc3NtYXhmcmFncyA8IDQpCisJCQkJcy0+ZG1hX2RhYzIub3NzbWF4ZnJhZ3MgPSA0OworCQl9CisJCXJldHVybiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TVUJESVZJREU6CisJCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCAmJiBzLT5kbWFfYWRjLnN1YmRpdmlzaW9uKSB8fAorCQkgICAgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFICYmIHMtPmRtYV9kYWMyLnN1YmRpdmlzaW9uKSkKKwkJCXJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIGlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgIT0gMSAmJiB2YWwgIT0gMiAmJiB2YWwgIT0gNCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJCXMtPmRtYV9hZGMuc3ViZGl2aXNpb24gPSB2YWw7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJCXMtPmRtYV9kYWMyLnN1YmRpdmlzaW9uID0gdmFsOworCQlyZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNPVU5EX1BDTV9SRUFEX1JBVEU6CisJCXJldHVybiBwdXRfdXNlcigoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgPyBzLT5hZGNyYXRlIDogcy0+ZGFjMnJhdGUsIHApOworCisgICAgICAgIGNhc2UgU09VTkRfUENNX1JFQURfQ0hBTk5FTFM6CisJCXJldHVybiBwdXRfdXNlcigocy0+c2N0cmwgJiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID8gU0NUUkxfUjFTTUIgOiBTQ1RSTF9QMlNNQikpID8gMiA6IDEsIHApOworCQkKKyAgICAgICAgY2FzZSBTT1VORF9QQ01fUkVBRF9CSVRTOgorCQlyZXR1cm4gcHV0X3VzZXIoKHMtPnNjdHJsICYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSA/IFNDVFJMX1IxU0VCIDogU0NUUkxfUDJTRUIpKSA/IDE2IDogOCwgcCk7CisKKyAgICAgICAgY2FzZSBTT1VORF9QQ01fV1JJVEVfRklMVEVSOgorICAgICAgICBjYXNlIFNORENUTF9EU1BfU0VUU1lOQ1JPOgorICAgICAgICBjYXNlIFNPVU5EX1BDTV9SRUFEX0ZJTFRFUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKwkJCisJfQorCXJldHVybiBtaXhkZXZfaW9jdGwocy0+Y29kZWMsIGNtZCwgYXJnKTsKK30KKworc3RhdGljIGludCBlczEzNzFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwlzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzOworCisJZm9yIChsaXN0ID0gZGV2cy5uZXh0OyA7IGxpc3QgPSBsaXN0LT5uZXh0KSB7CisJCWlmIChsaXN0ID09ICZkZXZzKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCXMgPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBlczEzNzFfc3RhdGUsIGRldnMpOworCQlpZiAoISgocy0+ZGV2X2F1ZGlvIF4gbWlub3IpICYgfjB4ZikpCisJCQlicmVhazsKKwl9CisgICAgICAgCVZBTElEQVRFX1NUQVRFKHMpOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IHM7CisJLyogd2FpdCBmb3IgZGV2aWNlIHRvIGJlY29tZSBmcmVlICovCisJZG93bigmcy0+b3Blbl9zZW0pOworCXdoaWxlIChzLT5vcGVuX21vZGUgJiBmaWxlLT5mX21vZGUpIHsKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQl1cCgmcy0+b3Blbl9zZW0pOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQlhZGRfd2FpdF9xdWV1ZSgmcy0+b3Blbl93YWl0LCAmd2FpdCk7CisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJdXAoJnMtPm9wZW5fc2VtKTsKKwkJc2NoZWR1bGUoKTsKKwkJcmVtb3ZlX3dhaXRfcXVldWUoJnMtPm9wZW5fd2FpdCwgJndhaXQpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQlkb3duKCZzLT5vcGVuX3NlbSk7CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCXMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0ID0gcy0+ZG1hX2FkYy5vc3NtYXhmcmFncyA9IHMtPmRtYV9hZGMuc3ViZGl2aXNpb24gPSAwOworCQlzLT5kbWFfYWRjLmVuYWJsZWQgPSAxOworCQlzZXRfYWRjX3JhdGUocywgODAwMCk7CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlzLT5kbWFfZGFjMi5vc3NmcmFnc2hpZnQgPSBzLT5kbWFfZGFjMi5vc3NtYXhmcmFncyA9IHMtPmRtYV9kYWMyLnN1YmRpdmlzaW9uID0gMDsKKwkJcy0+ZG1hX2RhYzIuZW5hYmxlZCA9IDE7CisJCXNldF9kYWMyX3JhdGUocywgODAwMCk7CisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJcy0+c2N0cmwgJj0gflNDVFJMX1IxRk1UOworCQlpZiAoKG1pbm9yICYgMHhmKSA9PSBTTkRfREVWX0RTUDE2KQorCQkJcy0+c2N0cmwgfD0gRVMxMzcxX0ZNVF9TMTZfTU9OTyA8PCBTQ1RSTF9TSF9SMUZNVDsKKwkJZWxzZQorCQkJcy0+c2N0cmwgfD0gRVMxMzcxX0ZNVF9VOF9NT05PIDw8IFNDVFJMX1NIX1IxRk1UOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJcy0+c2N0cmwgJj0gflNDVFJMX1AyRk1UOworCQlpZiAoKG1pbm9yICYgMHhmKSA9PSBTTkRfREVWX0RTUDE2KQorCQkJcy0+c2N0cmwgfD0gRVMxMzcxX0ZNVF9TMTZfTU9OTyA8PCBTQ1RSTF9TSF9QMkZNVDsKKwkJZWxzZQorCQkJcy0+c2N0cmwgfD0gRVMxMzcxX0ZNVF9VOF9NT05PIDw8IFNDVFJMX1NIX1AyRk1UOworCX0KKwlvdXRsKHMtPnNjdHJsLCBzLT5pbytFUzEzNzFfUkVHX1NFUklBTF9DT05UUk9MKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJcy0+b3Blbl9tb2RlIHw9IGZpbGUtPmZfbW9kZSAmIChGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUpOworCXVwKCZzLT5vcGVuX3NlbSk7CisJaW5pdF9NVVRFWCgmcy0+c2VtKTsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgZXMxMzcxX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGVzMTM3MV9zdGF0ZSAqcyA9IChzdHJ1Y3QgZXMxMzcxX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJVkFMSURBVEVfU1RBVEUocyk7CisJbG9ja19rZXJuZWwoKTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCWRyYWluX2RhYzIocywgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCWRvd24oJnMtPm9wZW5fc2VtKTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJc3RvcF9kYWMyKHMpOworCQlkZWFsbG9jX2RtYWJ1ZihzLCAmcy0+ZG1hX2RhYzIpOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlzdG9wX2FkYyhzKTsKKwkJZGVhbGxvY19kbWFidWYocywgJnMtPmRtYV9hZGMpOworCX0KKwlzLT5vcGVuX21vZGUgJj0gfihmaWxlLT5mX21vZGUgJiAoRk1PREVfUkVBRHxGTU9ERV9XUklURSkpOworCXVwKCZzLT5vcGVuX3NlbSk7CisJd2FrZV91cCgmcy0+b3Blbl93YWl0KTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyAvKmNvbnN0Ki8gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBlczEzNzFfYXVkaW9fZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLnJlYWQJCT0gZXMxMzcxX3JlYWQsCisJLndyaXRlCQk9IGVzMTM3MV93cml0ZSwKKwkucG9sbAkJPSBlczEzNzFfcG9sbCwKKwkuaW9jdGwJCT0gZXMxMzcxX2lvY3RsLAorCS5tbWFwCQk9IGVzMTM3MV9tbWFwLAorCS5vcGVuCQk9IGVzMTM3MV9vcGVuLAorCS5yZWxlYXNlCT0gZXMxMzcxX3JlbGVhc2UsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHNzaXplX3QgZXMxMzcxX3dyaXRlX2RhYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGVzMTM3MV9zdGF0ZSAqcyA9IChzdHJ1Y3QgZXMxMzcxX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXNzaXplX3QgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIHN3cHRyOworCWludCBjbnQ7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlpZiAocy0+ZG1hX2RhYzEubWFwcGVkKQorCQlyZXR1cm4gLUVOWElPOworCWlmICghcy0+ZG1hX2RhYzEucmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmX2RhYzEocykpKQorCQlyZXR1cm4gcmV0OworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJYWRkX3dhaXRfcXVldWUoJnMtPmRtYV9kYWMxLndhaXQsICZ3YWl0KTsKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChzLT5kbWFfZGFjMS5jb3VudCA8IDApIHsKKwkJCXMtPmRtYV9kYWMxLmNvdW50ID0gMDsKKwkJCXMtPmRtYV9kYWMxLnN3cHRyID0gcy0+ZG1hX2RhYzEuaHdwdHI7CisJCX0KKwkJc3dwdHIgPSBzLT5kbWFfZGFjMS5zd3B0cjsKKwkJY250ID0gcy0+ZG1hX2RhYzEuZG1hc2l6ZS1zd3B0cjsKKwkJaWYgKHMtPmRtYV9kYWMxLmNvdW50ICsgY250ID4gcy0+ZG1hX2RhYzEuZG1hc2l6ZSkKKwkJCWNudCA9IHMtPmRtYV9kYWMxLmRtYXNpemUgLSBzLT5kbWFfZGFjMS5jb3VudDsKKwkJaWYgKGNudCA8PSAwKQorCQkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjbnQgPiBjb3VudCkKKwkJCWNudCA9IGNvdW50OworCQlpZiAoY250IDw9IDApIHsKKwkJCWlmIChzLT5kbWFfZGFjMS5lbmFibGVkKQorCQkJCXN0YXJ0X2RhYzEocyk7CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0gLUVBR0FJTjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNjaGVkdWxlKCk7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJCWJyZWFrOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJaWYgKGNvcHlfZnJvbV91c2VyKHMtPmRtYV9kYWMxLnJhd2J1ZiArIHN3cHRyLCBidWZmZXIsIGNudCkpIHsKKwkJCWlmICghcmV0KQorCQkJCXJldCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlzd3B0ciA9IChzd3B0ciArIGNudCkgJSBzLT5kbWFfZGFjMS5kbWFzaXplOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlzLT5kbWFfZGFjMS5zd3B0ciA9IHN3cHRyOworCQlzLT5kbWFfZGFjMS5jb3VudCArPSBjbnQ7CisJCXMtPmRtYV9kYWMxLmVuZGNsZWFyZWQgPSAwOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNvdW50IC09IGNudDsKKwkJYnVmZmVyICs9IGNudDsKKwkJcmV0ICs9IGNudDsKKwkJaWYgKHMtPmRtYV9kYWMxLmVuYWJsZWQpCisJCQlzdGFydF9kYWMxKHMpOworCX0KKwlyZW1vdmVfd2FpdF9xdWV1ZSgmcy0+ZG1hX2RhYzEud2FpdCwgJndhaXQpOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmV0dXJuIHJldDsKK30KKworLyogTm8ga2VybmVsIGxvY2sgLSB3ZSBoYXZlIG91ciBvd24gc3BpbmxvY2sgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZXMxMzcxX3BvbGxfZGFjKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisJc3RydWN0IGVzMTM3MV9zdGF0ZSAqcyA9IChzdHJ1Y3QgZXMxMzcxX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IG1hc2sgPSAwOworCisJVkFMSURBVEVfU1RBVEUocyk7CisJaWYgKCFzLT5kbWFfZGFjMS5yZWFkeSAmJiBwcm9nX2RtYWJ1Zl9kYWMxKHMpKQorCQlyZXR1cm4gMDsKKwlwb2xsX3dhaXQoZmlsZSwgJnMtPmRtYV9kYWMxLndhaXQsIHdhaXQpOworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJZXMxMzcxX3VwZGF0ZV9wdHIocyk7CisJaWYgKHMtPmRtYV9kYWMxLm1hcHBlZCkgeworCQlpZiAocy0+ZG1hX2RhYzEuY291bnQgPj0gKHNpZ25lZClzLT5kbWFfZGFjMS5mcmFnc2l6ZSkKKwkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJfSBlbHNlIHsKKwkJaWYgKChzaWduZWQpcy0+ZG1hX2RhYzEuZG1hc2l6ZSA+PSBzLT5kbWFfZGFjMS5jb3VudCArIChzaWduZWQpcy0+ZG1hX2RhYzEuZnJhZ3NpemUpCisJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIG1hc2s7Cit9CisKK3N0YXRpYyBpbnQgZXMxMzcxX21tYXBfZGFjKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzID0gKHN0cnVjdCBlczEzNzFfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlpZiAoISh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlsb2NrX2tlcm5lbCgpOworCWlmICgocmV0ID0gcHJvZ19kbWFidWZfZGFjMShzKSkgIT0gMCkKKwkJZ290byBvdXQ7CisJcmV0ID0gLUVJTlZBTDsKKwlpZiAodm1hLT52bV9wZ29mZiAhPSAwKQorCQlnb3RvIG91dDsKKwlzaXplID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OworCWlmIChzaXplID4gKFBBR0VfU0laRSA8PCBzLT5kbWFfZGFjMS5idWZvcmRlcikpCisJCWdvdG8gb3V0OworCXJldCA9IC1FQUdBSU47CisJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCisJCQl2aXJ0X3RvX3BoeXMocy0+ZG1hX2RhYzEucmF3YnVmKSA+PiBQQUdFX1NISUZULAorCQkJc2l6ZSwgdm1hLT52bV9wYWdlX3Byb3QpKQorCQlnb3RvIG91dDsKKwlzLT5kbWFfZGFjMS5tYXBwZWQgPSAxOworCXJldCA9IDA7CitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZXMxMzcxX2lvY3RsX2RhYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGVzMTM3MV9zdGF0ZSAqcyA9IChzdHJ1Y3QgZXMxMzcxX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgICAgIGF1ZGlvX2J1Zl9pbmZvIGFiaW5mbzsKKyAgICAgICAgY291bnRfaW5mbyBjaW5mbzsKKwlpbnQgY291bnQ7CisJaW50IHZhbCwgcmV0OworCWludCBfX3VzZXIgKnAgPSAoaW50IF9fdXNlciAqKWFyZzsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBPU1NfR0VUVkVSU0lPTjoKKwkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX1ZFUlNJT04sIHApOworCisJY2FzZSBTTkRDVExfRFNQX1NZTkM6CisJCXJldHVybiBkcmFpbl9kYWMxKHMsIDAvKmZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKi8pOworCQkKKwljYXNlIFNORENUTF9EU1BfU0VURFVQTEVYOgorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRDQVBTOgorCQlyZXR1cm4gcHV0X3VzZXIoRFNQX0NBUF9SRUFMVElNRSB8IERTUF9DQVBfVFJJR0dFUiB8IERTUF9DQVBfTU1BUCwgcCk7CisJCQorICAgICAgICBjYXNlIFNORENUTF9EU1BfUkVTRVQ6CisJCXN0b3BfZGFjMShzKTsKKwkJc3luY2hyb25pemVfaXJxKHMtPmlycSk7CisJCXMtPmRtYV9kYWMxLnN3cHRyID0gcy0+ZG1hX2RhYzEuaHdwdHIgPSBzLT5kbWFfZGFjMS5jb3VudCA9IHMtPmRtYV9kYWMxLnRvdGFsX2J5dGVzID0gMDsKKwkJcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NQRUVEOgorICAgICAgICAgICAgICAgIGlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgPj0gMCkgeworCQkJc3RvcF9kYWMxKHMpOworCQkJcy0+ZG1hX2RhYzEucmVhZHkgPSAwOworCQkJc2V0X2RhYzFfcmF0ZShzLCB2YWwpOworCQl9CisJCXJldHVybiBwdXRfdXNlcihzLT5kYWMxcmF0ZSwgcCk7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NURVJFTzoKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJc3RvcF9kYWMxKHMpOworCQlzLT5kbWFfZGFjMS5yZWFkeSA9IDA7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmICh2YWwpCisJCQlzLT5zY3RybCB8PSBTQ1RSTF9QMVNNQjsKKwkJZWxzZQorCQkJcy0+c2N0cmwgJj0gflNDVFJMX1AxU01COworCQlvdXRsKHMtPnNjdHJsLCBzLT5pbytFUzEzNzFfUkVHX1NFUklBTF9DT05UUk9MKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfQ0hBTk5FTFM6CisgICAgICAgICAgICAgICAgaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCAhPSAwKSB7CisJCQlzdG9wX2RhYzEocyk7CisJCQlzLT5kbWFfZGFjMS5yZWFkeSA9IDA7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQkJaWYgKHZhbCA+PSAyKQorCQkJCXMtPnNjdHJsIHw9IFNDVFJMX1AxU01COworCQkJZWxzZQorCQkJCXMtPnNjdHJsICY9IH5TQ1RSTF9QMVNNQjsKKwkJCW91dGwocy0+c2N0cmwsIHMtPmlvK0VTMTM3MV9SRUdfU0VSSUFMX0NPTlRST0wpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQl9CisJCXJldHVybiBwdXRfdXNlcigocy0+c2N0cmwgJiBTQ1RSTF9QMVNNQikgPyAyIDogMSwgcCk7CisJCQorICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VURk1UUzogLyogUmV0dXJucyBhIG1hc2sgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gcHV0X3VzZXIoQUZNVF9TMTZfTEV8QUZNVF9VOCwgcCk7CisJCQorICAgICAgICBjYXNlIFNORENUTF9EU1BfU0VURk1UOiAvKiBTZWxlY3RzIE9ORSBmbXQqLworCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsICE9IEFGTVRfUVVFUlkpIHsKKwkJCXN0b3BfZGFjMShzKTsKKwkJCXMtPmRtYV9kYWMxLnJlYWR5ID0gMDsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCQlpZiAodmFsID09IEFGTVRfUzE2X0xFKQorCQkJCXMtPnNjdHJsIHw9IFNDVFJMX1AxU0VCOworCQkJZWxzZQorCQkJCXMtPnNjdHJsICY9IH5TQ1RSTF9QMVNFQjsKKwkJCW91dGwocy0+c2N0cmwsIHMtPmlvK0VTMTM3MV9SRUdfU0VSSUFMX0NPTlRST0wpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQl9CisJCXJldHVybiBwdXRfdXNlcigocy0+c2N0cmwgJiBTQ1RSTF9QMVNFQikgPyBBRk1UX1MxNl9MRSA6IEFGTVRfVTgsIHApOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9QT1NUOgorICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRUUklHR0VSOgorCQlyZXR1cm4gcHV0X3VzZXIoKHMtPmN0cmwgJiBDVFJMX0RBQzFfRU4pID8gUENNX0VOQUJMRV9PVVRQVVQgOiAwLCBwKTsKKwkJCQkJCQorCWNhc2UgU05EQ1RMX0RTUF9TRVRUUklHR0VSOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsICYgUENNX0VOQUJMRV9PVVRQVVQpIHsKKwkJCWlmICghcy0+ZG1hX2RhYzEucmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmX2RhYzEocykpKQorCQkJCXJldHVybiByZXQ7CisJCQlzLT5kbWFfZGFjMS5lbmFibGVkID0gMTsKKwkJCXN0YXJ0X2RhYzEocyk7CisJCX0gZWxzZSB7CisJCQlzLT5kbWFfZGFjMS5lbmFibGVkID0gMDsKKwkJCXN0b3BfZGFjMShzKTsKKwkJfQorCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRPU1BBQ0U6CisJCWlmICghcy0+ZG1hX2RhYzEucmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmX2RhYzEocykpICE9IDApCisJCQlyZXR1cm4gdmFsOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQllczEzNzFfdXBkYXRlX3B0cihzKTsKKwkJYWJpbmZvLmZyYWdzaXplID0gcy0+ZG1hX2RhYzEuZnJhZ3NpemU7CisJCWNvdW50ID0gcy0+ZG1hX2RhYzEuY291bnQ7CisJCWlmIChjb3VudCA8IDApCisJCQljb3VudCA9IDA7CisgICAgICAgICAgICAgICAgYWJpbmZvLmJ5dGVzID0gcy0+ZG1hX2RhYzEuZG1hc2l6ZSAtIGNvdW50OworICAgICAgICAgICAgICAgIGFiaW5mby5mcmFnc3RvdGFsID0gcy0+ZG1hX2RhYzEubnVtZnJhZzsKKyAgICAgICAgICAgICAgICBhYmluZm8uZnJhZ21lbnRzID0gYWJpbmZvLmJ5dGVzID4+IHMtPmRtYV9kYWMxLmZyYWdzaGlmdDsgICAgICAKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmFiaW5mbywgc2l6ZW9mKGFiaW5mbykpID8gLUVGQVVMVCA6IDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX05PTkJMT0NLOgorICAgICAgICAgICAgICAgIGZpbGUtPmZfZmxhZ3MgfD0gT19OT05CTE9DSzsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUT0RFTEFZOgorCQlpZiAoIXMtPmRtYV9kYWMxLnJlYWR5ICYmICh2YWwgPSBwcm9nX2RtYWJ1Zl9kYWMxKHMpKSAhPSAwKQorCQkJcmV0dXJuIHZhbDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJZXMxMzcxX3VwZGF0ZV9wdHIocyk7CisgICAgICAgICAgICAgICAgY291bnQgPSBzLT5kbWFfZGFjMS5jb3VudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY291bnQgPCAwKQorCQkJY291bnQgPSAwOworCQlyZXR1cm4gcHV0X3VzZXIoY291bnQsIHApOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRPUFRSOgorCQlpZiAoIXMtPmRtYV9kYWMxLnJlYWR5ICYmICh2YWwgPSBwcm9nX2RtYWJ1Zl9kYWMxKHMpKSAhPSAwKQorCQkJcmV0dXJuIHZhbDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJZXMxMzcxX3VwZGF0ZV9wdHIocyk7CisgICAgICAgICAgICAgICAgY2luZm8uYnl0ZXMgPSBzLT5kbWFfZGFjMS50b3RhbF9ieXRlczsKKwkJY291bnQgPSBzLT5kbWFfZGFjMS5jb3VudDsKKwkJaWYgKGNvdW50IDwgMCkKKwkJCWNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBjaW5mby5ibG9ja3MgPSBjb3VudCA+PiBzLT5kbWFfZGFjMS5mcmFnc2hpZnQ7CisgICAgICAgICAgICAgICAgY2luZm8ucHRyID0gcy0+ZG1hX2RhYzEuaHdwdHI7CisJCWlmIChzLT5kbWFfZGFjMS5tYXBwZWQpCisJCQlzLT5kbWFfZGFjMS5jb3VudCAmPSBzLT5kbWFfZGFjMS5mcmFnc2l6ZS0xOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmY2luZm8sIHNpemVvZihjaW5mbykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRCTEtTSVpFOgorCQlpZiAoKHZhbCA9IHByb2dfZG1hYnVmX2RhYzEocykpKQorCQkJcmV0dXJuIHZhbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gcHV0X3VzZXIocy0+ZG1hX2RhYzEuZnJhZ3NpemUsIHApOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TRVRGUkFHTUVOVDoKKyAgICAgICAgICAgICAgICBpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlzLT5kbWFfZGFjMS5vc3NmcmFnc2hpZnQgPSB2YWwgJiAweGZmZmY7CisJCXMtPmRtYV9kYWMxLm9zc21heGZyYWdzID0gKHZhbCA+PiAxNikgJiAweGZmZmY7CisJCWlmIChzLT5kbWFfZGFjMS5vc3NmcmFnc2hpZnQgPCA0KQorCQkJcy0+ZG1hX2RhYzEub3NzZnJhZ3NoaWZ0ID0gNDsKKwkJaWYgKHMtPmRtYV9kYWMxLm9zc2ZyYWdzaGlmdCA+IDE1KQorCQkJcy0+ZG1hX2RhYzEub3NzZnJhZ3NoaWZ0ID0gMTU7CisJCWlmIChzLT5kbWFfZGFjMS5vc3NtYXhmcmFncyA8IDQpCisJCQlzLT5kbWFfZGFjMS5vc3NtYXhmcmFncyA9IDQ7CisJCXJldHVybiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TVUJESVZJREU6CisJCWlmIChzLT5kbWFfZGFjMS5zdWJkaXZpc2lvbikKKwkJCXJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIGlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgIT0gMSAmJiB2YWwgIT0gMiAmJiB2YWwgIT0gNCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlzLT5kbWFfZGFjMS5zdWJkaXZpc2lvbiA9IHZhbDsKKwkJcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTT1VORF9QQ01fUkVBRF9SQVRFOgorCQlyZXR1cm4gcHV0X3VzZXIocy0+ZGFjMXJhdGUsIHApOworCisgICAgICAgIGNhc2UgU09VTkRfUENNX1JFQURfQ0hBTk5FTFM6CisJCXJldHVybiBwdXRfdXNlcigocy0+c2N0cmwgJiBTQ1RSTF9QMVNNQikgPyAyIDogMSwgcCk7CisKKyAgICAgICAgY2FzZSBTT1VORF9QQ01fUkVBRF9CSVRTOgorCQlyZXR1cm4gcHV0X3VzZXIoKHMtPnNjdHJsICYgU0NUUkxfUDFTRUIpID8gMTYgOiA4LCBwKTsKKworICAgICAgICBjYXNlIFNPVU5EX1BDTV9XUklURV9GSUxURVI6CisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TRVRTWU5DUk86CisgICAgICAgIGNhc2UgU09VTkRfUENNX1JFQURfRklMVEVSOgorICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCQkKKwl9CisJcmV0dXJuIG1peGRldl9pb2N0bChzLT5jb2RlYywgY21kLCBhcmcpOworfQorCitzdGF0aWMgaW50IGVzMTM3MV9vcGVuX2RhYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwlzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzOworCisJZm9yIChsaXN0ID0gZGV2cy5uZXh0OyA7IGxpc3QgPSBsaXN0LT5uZXh0KSB7CisJCWlmIChsaXN0ID09ICZkZXZzKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCXMgPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBlczEzNzFfc3RhdGUsIGRldnMpOworCQlpZiAoISgocy0+ZGV2X2RhYyBeIG1pbm9yKSAmIH4weGYpKQorCQkJYnJlYWs7CisJfQorICAgICAgIAlWQUxJREFURV9TVEFURShzKTsKKyAgICAgICAJLyogd2UgYWxsb3cgb3BlbmluZyB3aXRoIE9fUkRXUiwgbW9zdCBwcm9ncmFtcyBkbyBpdCBhbHRob3VnaCB0aGV5IHdpbGwgb25seSB3cml0ZSAqLworI2lmIDAKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJcmV0dXJuIC1FUEVSTTsKKyNlbmRpZgorCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisgICAgICAgCWZpbGUtPnByaXZhdGVfZGF0YSA9IHM7CisJLyogd2FpdCBmb3IgZGV2aWNlIHRvIGJlY29tZSBmcmVlICovCisJZG93bigmcy0+b3Blbl9zZW0pOworCXdoaWxlIChzLT5vcGVuX21vZGUgJiBGTU9ERV9EQUMpIHsKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQl1cCgmcy0+b3Blbl9zZW0pOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQlhZGRfd2FpdF9xdWV1ZSgmcy0+b3Blbl93YWl0LCAmd2FpdCk7CisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJdXAoJnMtPm9wZW5fc2VtKTsKKwkJc2NoZWR1bGUoKTsKKwkJcmVtb3ZlX3dhaXRfcXVldWUoJnMtPm9wZW5fd2FpdCwgJndhaXQpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQlkb3duKCZzLT5vcGVuX3NlbSk7CisJfQorCXMtPmRtYV9kYWMxLm9zc2ZyYWdzaGlmdCA9IHMtPmRtYV9kYWMxLm9zc21heGZyYWdzID0gcy0+ZG1hX2RhYzEuc3ViZGl2aXNpb24gPSAwOworCXMtPmRtYV9kYWMxLmVuYWJsZWQgPSAxOworCXNldF9kYWMxX3JhdGUocywgODAwMCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlzLT5zY3RybCAmPSB+U0NUUkxfUDFGTVQ7CisJaWYgKChtaW5vciAmIDB4ZikgPT0gU05EX0RFVl9EU1AxNikKKwkJcy0+c2N0cmwgfD0gRVMxMzcxX0ZNVF9TMTZfTU9OTyA8PCBTQ1RSTF9TSF9QMUZNVDsKKwllbHNlCisJCXMtPnNjdHJsIHw9IEVTMTM3MV9GTVRfVThfTU9OTyA8PCBTQ1RSTF9TSF9QMUZNVDsKKwlvdXRsKHMtPnNjdHJsLCBzLT5pbytFUzEzNzFfUkVHX1NFUklBTF9DT05UUk9MKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJcy0+b3Blbl9tb2RlIHw9IEZNT0RFX0RBQzsKKwl1cCgmcy0+b3Blbl9zZW0pOworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludCBlczEzNzFfcmVsZWFzZV9kYWMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGVzMTM3MV9zdGF0ZSAqcyA9IChzdHJ1Y3QgZXMxMzcxX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJVkFMSURBVEVfU1RBVEUocyk7CisJbG9ja19rZXJuZWwoKTsKKwlkcmFpbl9kYWMxKHMsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKwlkb3duKCZzLT5vcGVuX3NlbSk7CisJc3RvcF9kYWMxKHMpOworCWRlYWxsb2NfZG1hYnVmKHMsICZzLT5kbWFfZGFjMSk7CisJcy0+b3Blbl9tb2RlICY9IH5GTU9ERV9EQUM7CisJdXAoJnMtPm9wZW5fc2VtKTsKKwl3YWtlX3VwKCZzLT5vcGVuX3dhaXQpOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIC8qY29uc3QqLyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGVzMTM3MV9kYWNfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLndyaXRlCQk9IGVzMTM3MV93cml0ZV9kYWMsCisJLnBvbGwJCT0gZXMxMzcxX3BvbGxfZGFjLAorCS5pb2N0bAkJPSBlczEzNzFfaW9jdGxfZGFjLAorCS5tbWFwCQk9IGVzMTM3MV9tbWFwX2RhYywKKwkub3BlbgkJPSBlczEzNzFfb3Blbl9kYWMsCisJLnJlbGVhc2UJPSBlczEzNzFfcmVsZWFzZV9kYWMsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHNzaXplX3QgZXMxMzcxX21pZGlfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGVzMTM3MV9zdGF0ZSAqcyA9IChzdHJ1Y3QgZXMxMzcxX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXNzaXplX3QgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgcHRyOworCWludCBjbnQ7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1ZmZlciwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoY291bnQgPT0gMCkKKwkJcmV0dXJuIDA7CisJcmV0ID0gMDsKKyAgICAgICAgYWRkX3dhaXRfcXVldWUoJnMtPm1pZGkuaXdhaXQsICZ3YWl0KTsKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCXB0ciA9IHMtPm1pZGkuaXJkOworCQljbnQgPSBNSURJSU5CVUYgLSBwdHI7CisJCWlmIChzLT5taWRpLmljbnQgPCBjbnQpCisJCQljbnQgPSBzLT5taWRpLmljbnQ7CisJCWlmIChjbnQgPD0gMCkKKwkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY250ID4gY291bnQpCisJCQljbnQgPSBjb3VudDsKKwkJaWYgKGNudCA8PSAwKSB7CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0gLUVBR0FJTjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNjaGVkdWxlKCk7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJCWJyZWFrOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIHMtPm1pZGkuaWJ1ZiArIHB0ciwgY250KSkgeworCQkJaWYgKCFyZXQpCisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCXB0ciA9IChwdHIgKyBjbnQpICUgTUlESUlOQlVGOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlzLT5taWRpLmlyZCA9IHB0cjsKKwkJcy0+bWlkaS5pY250IC09IGNudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQljb3VudCAtPSBjbnQ7CisJCWJ1ZmZlciArPSBjbnQ7CisJCXJldCArPSBjbnQ7CisJCWJyZWFrOworCX0KKwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJnMtPm1pZGkuaXdhaXQsICZ3YWl0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBlczEzNzFfbWlkaV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGVzMTM3MV9zdGF0ZSAqcyA9IChzdHJ1Y3QgZXMxMzcxX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXNzaXplX3QgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgcHRyOworCWludCBjbnQ7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChjb3VudCA9PSAwKQorCQlyZXR1cm4gMDsKKwlyZXQgPSAwOworICAgICAgICBhZGRfd2FpdF9xdWV1ZSgmcy0+bWlkaS5vd2FpdCwgJndhaXQpOworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcHRyID0gcy0+bWlkaS5vd3I7CisJCWNudCA9IE1JRElPVVRCVUYgLSBwdHI7CisJCWlmIChzLT5taWRpLm9jbnQgKyBjbnQgPiBNSURJT1VUQlVGKQorCQkJY250ID0gTUlESU9VVEJVRiAtIHMtPm1pZGkub2NudDsKKwkJaWYgKGNudCA8PSAwKSB7CisJCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQllczEzNzFfaGFuZGxlX21pZGkocyk7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY250ID4gY291bnQpCisJCQljbnQgPSBjb3VudDsKKwkJaWYgKGNudCA8PSAwKSB7CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0gLUVBR0FJTjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNjaGVkdWxlKCk7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJCWJyZWFrOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJaWYgKGNvcHlfZnJvbV91c2VyKHMtPm1pZGkub2J1ZiArIHB0ciwgYnVmZmVyLCBjbnQpKSB7CisJCQlpZiAoIXJldCkKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJcHRyID0gKHB0ciArIGNudCkgJSBNSURJT1VUQlVGOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlzLT5taWRpLm93ciA9IHB0cjsKKwkJcy0+bWlkaS5vY250ICs9IGNudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQljb3VudCAtPSBjbnQ7CisJCWJ1ZmZlciArPSBjbnQ7CisJCXJldCArPSBjbnQ7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWVzMTM3MV9oYW5kbGVfbWlkaShzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCX0KKwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJnMtPm1pZGkub3dhaXQsICZ3YWl0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBObyBrZXJuZWwgbG9jayAtIHdlIGhhdmUgb3VyIG93biBzcGlubG9jayAqLworc3RhdGljIHVuc2lnbmVkIGludCBlczEzNzFfbWlkaV9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisJc3RydWN0IGVzMTM3MV9zdGF0ZSAqcyA9IChzdHJ1Y3QgZXMxMzcxX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IG1hc2sgPSAwOworCisJVkFMSURBVEVfU1RBVEUocyk7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQlwb2xsX3dhaXQoZmlsZSwgJnMtPm1pZGkub3dhaXQsIHdhaXQpOworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQlwb2xsX3dhaXQoZmlsZSwgJnMtPm1pZGkuaXdhaXQsIHdhaXQpOworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJaWYgKHMtPm1pZGkuaWNudCA+IDApCisJCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlpZiAocy0+bWlkaS5vY250IDwgTUlESU9VVEJVRikKKwkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gbWFzazsKK30KKworc3RhdGljIGludCBlczEzNzFfbWlkaV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCXN0cnVjdCBlczEzNzFfc3RhdGUgKnM7CisKKwlmb3IgKGxpc3QgPSBkZXZzLm5leHQ7IDsgbGlzdCA9IGxpc3QtPm5leHQpIHsKKwkJaWYgKGxpc3QgPT0gJmRldnMpCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJcyA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IGVzMTM3MV9zdGF0ZSwgZGV2cyk7CisJCWlmIChzLT5kZXZfbWlkaSA9PSBtaW5vcikKKwkJCWJyZWFrOworCX0KKyAgICAgICAJVkFMSURBVEVfU1RBVEUocyk7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gczsKKwkvKiB3YWl0IGZvciBkZXZpY2UgdG8gYmVjb21lIGZyZWUgKi8KKwlkb3duKCZzLT5vcGVuX3NlbSk7CisJd2hpbGUgKHMtPm9wZW5fbW9kZSAmIChmaWxlLT5mX21vZGUgPDwgRk1PREVfTUlESV9TSElGVCkpIHsKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQl1cCgmcy0+b3Blbl9zZW0pOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQlhZGRfd2FpdF9xdWV1ZSgmcy0+b3Blbl93YWl0LCAmd2FpdCk7CisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJdXAoJnMtPm9wZW5fc2VtKTsKKwkJc2NoZWR1bGUoKTsKKwkJcmVtb3ZlX3dhaXRfcXVldWUoJnMtPm9wZW5fd2FpdCwgJndhaXQpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQlkb3duKCZzLT5vcGVuX3NlbSk7CisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJaWYgKCEocy0+b3Blbl9tb2RlICYgKEZNT0RFX01JRElfUkVBRCB8IEZNT0RFX01JRElfV1JJVEUpKSkgeworCQlzLT5taWRpLmlyZCA9IHMtPm1pZGkuaXdyID0gcy0+bWlkaS5pY250ID0gMDsKKwkJcy0+bWlkaS5vcmQgPSBzLT5taWRpLm93ciA9IHMtPm1pZGkub2NudCA9IDA7CisJCW91dGIoVUNUUkxfQ05UUkxfU1dSLCBzLT5pbytFUzEzNzFfUkVHX1VBUlRfQ09OVFJPTCk7CisJCW91dGIoMCwgcy0+aW8rRVMxMzcxX1JFR19VQVJUX0NPTlRST0wpOworCQlvdXRiKDAsIHMtPmlvK0VTMTM3MV9SRUdfVUFSVF9URVNUKTsKKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJcy0+bWlkaS5pcmQgPSBzLT5taWRpLml3ciA9IHMtPm1pZGkuaWNudCA9IDA7CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlzLT5taWRpLm9yZCA9IHMtPm1pZGkub3dyID0gcy0+bWlkaS5vY250ID0gMDsKKwl9CisJcy0+Y3RybCB8PSBDVFJMX1VBUlRfRU47CisJb3V0bChzLT5jdHJsLCBzLT5pbytFUzEzNzFfUkVHX0NPTlRST0wpOworCWVzMTM3MV9oYW5kbGVfbWlkaShzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJcy0+b3Blbl9tb2RlIHw9IChmaWxlLT5mX21vZGUgPDwgRk1PREVfTUlESV9TSElGVCkgJiAoRk1PREVfTUlESV9SRUFEIHwgRk1PREVfTUlESV9XUklURSk7CisJdXAoJnMtPm9wZW5fc2VtKTsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgZXMxMzcxX21pZGlfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzID0gKHN0cnVjdCBlczEzNzFfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBjb3VudCwgdG1vOworCisJVkFMSURBVEVfU1RBVEUocyk7CisJbG9ja19rZXJuZWwoKTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJYWRkX3dhaXRfcXVldWUoJnMtPm1pZGkub3dhaXQsICZ3YWl0KTsKKwkJZm9yICg7OykgeworCQkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCWNvdW50ID0gcy0+bWlkaS5vY250OworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQkJaWYgKGNvdW50IDw9IDApCisJCQkJYnJlYWs7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQkJYnJlYWs7CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCQkJYnJlYWs7CisJCQl0bW8gPSAoY291bnQgKiBIWikgLyAzMTAwOworCQkJaWYgKCFzY2hlZHVsZV90aW1lb3V0KHRtbyA/IDogMSkgJiYgdG1vKQorCQkJCXByaW50ayhLRVJOX0RFQlVHIFBGWCAibWlkaSB0aW1lZCBvdXQ/P1xuIik7CisJCX0KKwkJcmVtb3ZlX3dhaXRfcXVldWUoJnMtPm1pZGkub3dhaXQsICZ3YWl0KTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwl9CisJZG93bigmcy0+b3Blbl9zZW0pOworCXMtPm9wZW5fbW9kZSAmPSB+KChmaWxlLT5mX21vZGUgPDwgRk1PREVfTUlESV9TSElGVCkgJiAoRk1PREVfTUlESV9SRUFEfEZNT0RFX01JRElfV1JJVEUpKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCWlmICghKHMtPm9wZW5fbW9kZSAmIChGTU9ERV9NSURJX1JFQUQgfCBGTU9ERV9NSURJX1dSSVRFKSkpIHsKKwkJcy0+Y3RybCAmPSB+Q1RSTF9VQVJUX0VOOworCQlvdXRsKHMtPmN0cmwsIHMtPmlvK0VTMTM3MV9SRUdfQ09OVFJPTCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwl1cCgmcy0+b3Blbl9zZW0pOworCXdha2VfdXAoJnMtPm9wZW5fd2FpdCk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgLypjb25zdCovIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZXMxMzcxX21pZGlfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLnJlYWQJCT0gZXMxMzcxX21pZGlfcmVhZCwKKwkud3JpdGUJCT0gZXMxMzcxX21pZGlfd3JpdGUsCisJLnBvbGwJCT0gZXMxMzcxX21pZGlfcG9sbCwKKwkub3BlbgkJPSBlczEzNzFfbWlkaV9vcGVuLAorCS5yZWxlYXNlCT0gZXMxMzcxX21pZGlfcmVsZWFzZSwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcywgd2UnbGwgY3JlYXRlIGEgcHJvYyBkZXZpY2UgdGhhdCBkdW1wcyB0aGUKKyAqIENPREVDIGNoaXBzdGF0ZQorICovCisKKyNpZmRlZiBFUzEzNzFfREVCVUcKK3N0YXRpYyBpbnQgcHJvY19lczEzNzFfZHVtcCAoY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IGZwb3MsIGludCBsZW5ndGgsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBlczEzNzFfc3RhdGUgKnM7CisgICAgICAgIGludCBjbnQsIGxlbiA9IDA7CisKKwlpZiAobGlzdF9lbXB0eSgmZGV2cykpCisJCXJldHVybiAwOworCXMgPSBsaXN0X2VudHJ5KGRldnMubmV4dCwgc3RydWN0IGVzMTM3MV9zdGF0ZSwgZGV2cyk7CisgICAgICAgIC8qIHByaW50IG91dCBoZWFkZXIgKi8KKyAgICAgICAgbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiXHRcdENyZWF0aXZlIEVTMTM3eCBEZWJ1ZyBEdW1wLW8tbWF0aWNcbiIpOworCisgICAgICAgIC8qIHByaW50IG91dCBDT0RFQyBzdGF0ZSAqLworICAgICAgICBsZW4gKz0gc3ByaW50ZiAoYnVmICsgbGVuLCAiQUM5NyBDT0RFQyBzdGF0ZVxuIik7CisJZm9yIChjbnQ9MDsgY250IDw9IDB4N2U7IGNudCA9IGNudCArMikKKyAgICAgICAgICAgICAgICBsZW4rPSBzcHJpbnRmIChidWYgKyBsZW4sICJyZWc6MHglMDJ4ICB2YWw6MHglMDR4XG4iLCBjbnQsIHJkY29kZWMocy0+Y29kZWMsIGNudCkpOworCisgICAgICAgIGlmIChmcG9zID49bGVuKXsKKyAgICAgICAgICAgICAgICAqc3RhcnQgPSBidWY7CisgICAgICAgICAgICAgICAgKmVvZiA9MTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICAqc3RhcnQgPSBidWYgKyBmcG9zOworICAgICAgICBpZiAoKGxlbiAtPSBmcG9zKSA+IGxlbmd0aCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbGVuZ3RoOworICAgICAgICAqZW9mID0xOworICAgICAgICByZXR1cm4gbGVuOworCit9CisjZW5kaWYgLyogRVMxMzcxX0RFQlVHICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBtYXhpbXVtIG51bWJlciBvZiBkZXZpY2VzOyBvbmx5IHVzZWQgZm9yIGNvbW1hbmQgbGluZSBwYXJhbXMgKi8KKyNkZWZpbmUgTlJfREVWSUNFIDUKKworc3RhdGljIGludCBzcGRpZltOUl9ERVZJQ0VdOworc3RhdGljIGludCBub21peFtOUl9ERVZJQ0VdOworc3RhdGljIGludCBhbXBsaWZpZXJbTlJfREVWSUNFXTsKKworc3RhdGljIHVuc2lnbmVkIGludCBkZXZpbmRleDsKKworbW9kdWxlX3BhcmFtX2FycmF5KHNwZGlmLCBib29sLCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0Moc3BkaWYsICJpZiAxIHRoZSBvdXRwdXQgaXMgaW4gUy9QRElGIGRpZ2l0YWwgbW9kZSIpOworbW9kdWxlX3BhcmFtX2FycmF5KG5vbWl4LCBib29sLCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mobm9taXgsICJpZiAxIG5vIGFuYWxvZyBhdWRpbyBpcyBtaXhlZCB0byB0aGUgZGlnaXRhbCBvdXRwdXQiKTsKK21vZHVsZV9wYXJhbV9hcnJheShhbXBsaWZpZXIsIGJvb2wsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhhbXBsaWZpZXIsICJTZXQgdG8gMSBpZiB0aGUgbWFjaGluZSBuZWVkcyB0aGUgYW1wIGNvbnRyb2wgZW5hYmxpbmcgKG1hbnkgbGFwdG9wcykiKTsKKworTU9EVUxFX0FVVEhPUigiVGhvbWFzIE0uIFNhaWxlciwgc2FpbGVyQGlmZS5lZS5ldGh6LmNoLCBoYjlqbnhAaGI5dy5jaGUuZXUiKTsKK01PRFVMRV9ERVNDUklQVElPTigiRVMxMzcxIEF1ZGlvUENJOTcgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgaW5pdHZvbCB7CisJaW50IG1peGNoOworCWludCB2b2w7Cit9IGluaXR2b2xbXSBfX2RldmluaXRkYXRhID0geworCXsgU09VTkRfTUlYRVJfV1JJVEVfTElORSwgMHg0MDQwIH0sCisJeyBTT1VORF9NSVhFUl9XUklURV9DRCwgMHg0MDQwIH0sCisJeyBNSVhFUl9XUklURShTT1VORF9NSVhFUl9WSURFTyksIDB4NDA0MCB9LAorCXsgU09VTkRfTUlYRVJfV1JJVEVfTElORTEsIDB4NDA0MCB9LAorCXsgU09VTkRfTUlYRVJfV1JJVEVfUENNLCAweDQwNDAgfSwKKwl7IFNPVU5EX01JWEVSX1dSSVRFX1ZPTFVNRSwgMHg0MDQwIH0sCisJeyBNSVhFUl9XUklURShTT1VORF9NSVhFUl9QSE9ORU9VVCksIDB4NDA0MCB9LAorCXsgU09VTkRfTUlYRVJfV1JJVEVfT0dBSU4sIDB4NDA0MCB9LAorCXsgTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfUEhPTkVJTiksIDB4NDA0MCB9LAorCXsgU09VTkRfTUlYRVJfV1JJVEVfU1BFQUtFUiwgMHg0MDQwIH0sCisJeyBTT1VORF9NSVhFUl9XUklURV9NSUMsIDB4NDA0MCB9LAorCXsgU09VTkRfTUlYRVJfV1JJVEVfUkVDTEVWLCAweDQwNDAgfSwKKwl7IFNPVU5EX01JWEVSX1dSSVRFX0lHQUlOLCAweDQwNDAgfQorfTsKKworc3RhdGljIHN0cnVjdAoreworCXNob3J0IHN2aWQsIHNkaWQ7Cit9IGFtcGxpZmllcl9uZWVkZWRbXSA9IAoreworCXsgMHgxMDdCLCAweDIxNTAgfSwJCS8qIEdhdGV3YXkgU29sbyAyMTUwICovCisJeyAweDEzQkQsIDB4MTAwQyB9LAkJLyogTWViaXVzIFBDLU1KMTAwViAqLworCXsgMHgxMTAyLCAweDU5MzggfSwJCS8qIFRhcmdhIFh0ZW5kZXIgMzAwICovCisJeyAweDExMDIsIDB4ODkzOCB9LAkJLyogSVBDIG5vdGVib29rICovCisJeyBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lEIH0KK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGVzMTM3MV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpaWQpCit7CisJc3RydWN0IGVzMTM3MV9zdGF0ZSAqczsKKwlzdHJ1Y3QgZ2FtZXBvcnQgKmdwOworCW1tX3NlZ21lbnRfdCBmczsKKwlpbnQgaSwgZ3BpbywgdmFsLCByZXMgPSAtMTsKKwlpbnQgaWR4OworCXVuc2lnbmVkIGxvbmcgdG1vOworCXNpZ25lZCBsb25nIHRtbzI7CisJdW5zaWduZWQgaW50IGNzc3I7CisKKwlpZiAoKHJlcz1wY2lfZW5hYmxlX2RldmljZShwY2lkZXYpKSkKKwkJcmV0dXJuIHJlczsKKworCWlmICghKHBjaV9yZXNvdXJjZV9mbGFncyhwY2lkZXYsIDApICYgSU9SRVNPVVJDRV9JTykpCisJCXJldHVybiAtRU5PREVWOworCWlmIChwY2lkZXYtPmlycSA9PSAwKSAKKwkJcmV0dXJuIC1FTk9ERVY7CisJaSA9IHBjaV9zZXRfZG1hX21hc2socGNpZGV2LCAweGZmZmZmZmZmKTsKKwlpZiAoaSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJlczEzNzE6IGFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IDMyYml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iKTsKKwkJcmV0dXJuIGk7CisJfQorCWlmICghKHMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZXMxMzcxX3N0YXRlKSwgR0ZQX0tFUk5FTCkpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJvdXQgb2YgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChzLCAwLCBzaXplb2Yoc3RydWN0IGVzMTM3MV9zdGF0ZSkpOworCQorCXMtPmNvZGVjID0gYWM5N19hbGxvY19jb2RlYygpOworCWlmKHMtPmNvZGVjID09IE5VTEwpCisJCWdvdG8gZXJyX2NvZGVjOworCQkKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5kbWFfYWRjLndhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnMtPmRtYV9kYWMxLndhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnMtPmRtYV9kYWMyLndhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnMtPm9wZW5fd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+bWlkaS5pd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+bWlkaS5vd2FpdCk7CisJaW5pdF9NVVRFWCgmcy0+b3Blbl9zZW0pOworCXNwaW5fbG9ja19pbml0KCZzLT5sb2NrKTsKKwlzLT5tYWdpYyA9IEVTMTM3MV9NQUdJQzsKKwlzLT5kZXYgPSBwY2lkZXY7CisJcy0+aW8gPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpZGV2LCAwKTsKKwlzLT5pcnEgPSBwY2lkZXYtPmlycTsKKwlzLT52ZW5kb3IgPSBwY2lkZXYtPnZlbmRvcjsKKwlzLT5kZXZpY2UgPSBwY2lkZXYtPmRldmljZTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lkZXYsIFBDSV9SRVZJU0lPTl9JRCwgJnMtPnJldik7CisJcy0+Y29kZWMtPnByaXZhdGVfZGF0YSA9IHM7CisJcy0+Y29kZWMtPmlkID0gMDsKKwlzLT5jb2RlYy0+Y29kZWNfcmVhZCA9IHJkY29kZWM7CisJcy0+Y29kZWMtPmNvZGVjX3dyaXRlID0gd3Jjb2RlYzsKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiZm91bmQgY2hpcCwgdmVuZG9yIGlkIDB4JTA0eCBkZXZpY2UgaWQgMHglMDR4IHJldmlzaW9uIDB4JTAyeFxuIiwKKwkgICAgICAgcy0+dmVuZG9yLCBzLT5kZXZpY2UsIHMtPnJldik7CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihzLT5pbywgRVMxMzcxX0VYVEVOVCwgImVzMTM3MSIpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImlvIHBvcnRzICUjbHgtJSNseCBpbiB1c2VcbiIsIHMtPmlvLCBzLT5pbytFUzEzNzFfRVhURU5ULTEpOworCQlyZXMgPSAtRUJVU1k7CisJCWdvdG8gZXJyX3JlZ2lvbjsKKwl9CisJaWYgKChyZXM9cmVxdWVzdF9pcnEocy0+aXJxLCBlczEzNzFfaW50ZXJydXB0LCBTQV9TSElSUSwgImVzMTM3MSIscykpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImlycSAldSBpbiB1c2VcbiIsIHMtPmlycSk7CisJCWdvdG8gZXJyX2lycTsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyBQRlggImZvdW5kIGVzMTM3MSByZXYgJWQgYXQgaW8gJSNseCBpcnEgJXVcbiIsCisJICAgICAgIHMtPnJldiwgcy0+aW8sIHMtPmlycSk7CisJLyogcmVnaXN0ZXIgZGV2aWNlcyAqLworCWlmICgocmVzPShzLT5kZXZfYXVkaW8gPSByZWdpc3Rlcl9zb3VuZF9kc3AoJmVzMTM3MV9hdWRpb19mb3BzLC0xKSkpPDApCisJCWdvdG8gZXJyX2RldjE7CisJaWYgKChyZXM9KHMtPmNvZGVjLT5kZXZfbWl4ZXIgPSByZWdpc3Rlcl9zb3VuZF9taXhlcigmZXMxMzcxX21peGVyX2ZvcHMsIC0xKSkpIDwgMCkKKwkJZ290byBlcnJfZGV2MjsKKwlpZiAoKHJlcz0ocy0+ZGV2X2RhYyA9IHJlZ2lzdGVyX3NvdW5kX2RzcCgmZXMxMzcxX2RhY19mb3BzLCAtMSkpKSA8IDApCisJCWdvdG8gZXJyX2RldjM7CisJaWYgKChyZXM9KHMtPmRldl9taWRpID0gcmVnaXN0ZXJfc291bmRfbWlkaSgmZXMxMzcxX21pZGlfZm9wcywgLTEpKSk8MCApCisJCWdvdG8gZXJyX2RldjQ7CisjaWZkZWYgRVMxMzcxX0RFQlVHCisJLyogaW5pdGlhbGl6ZSB0aGUgZGVidWcgcHJvYyBkZXZpY2UgKi8KKwlzLT5wcyA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoImVzMTM3MSIsMCxOVUxMLHByb2NfZXMxMzcxX2R1bXAsTlVMTCk7CisjZW5kaWYgLyogRVMxMzcxX0RFQlVHICovCisJCisJLyogaW5pdGlhbGl6ZSBjb2RlYyByZWdpc3RlcnMgKi8KKwlzLT5jdHJsID0gMDsKKworCS8qIENoZWNrIGFtcGxpZmllciByZXF1aXJlbWVudHMgKi8KKwkKKwlpZiAoYW1wbGlmaWVyW2RldmluZGV4XSkKKwkJcy0+Y3RybCB8PSBDVFJMX0dQSU9fT1VUMDsKKwllbHNlIGZvcihpZHggPSAwOyBhbXBsaWZpZXJfbmVlZGVkW2lkeF0uc3ZpZCAhPSBQQ0lfQU5ZX0lEOyBpZHgrKykKKwl7CisJCWlmKHBjaWRldi0+c3Vic3lzdGVtX3ZlbmRvciA9PSBhbXBsaWZpZXJfbmVlZGVkW2lkeF0uc3ZpZCAmJgorCQkgICBwY2lkZXYtPnN1YnN5c3RlbV9kZXZpY2UgPT0gYW1wbGlmaWVyX25lZWRlZFtpZHhdLnNkaWQpCisJCXsKKyAgICAgICAgICAgICAgICAgICAgCXMtPmN0cmwgfD0gQ1RSTF9HUElPX09VVDA7ICAgLyogdHVybiBpbnRlcm5hbCBhbXBsaWZpZXIgb24gKi8KKyAgICAgICAgICAgICAgICAgICAgCXByaW50ayhLRVJOX0lORk8gUEZYICJFbmFibGluZyBpbnRlcm5hbCBhbXBsaWZpZXIuXG4iKTsKKwkJfQorCX0KKworCWZvciAoZ3BpbyA9IDB4MjE4OyBncGlvID49IDB4MjAwOyBncGlvIC09IDB4MDgpCisJCWlmIChyZXF1ZXN0X3JlZ2lvbihncGlvLCBKT1lfRVhURU5ULCAiZXMxMzcxIikpCisJCQlicmVhazsKKworCWlmIChncGlvIDwgMHgyMDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAibm8gZnJlZSBqb3lzdGljayBhZGRyZXNzIGZvdW5kXG4iKTsKKwl9IGVsc2UgaWYgKCEocy0+Z2FtZXBvcnQgPSBncCA9IGdhbWVwb3J0X2FsbG9jYXRlX3BvcnQoKSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY2FuIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGdhbWVwb3J0XG4iKTsKKwkJcmVsZWFzZV9yZWdpb24oZ3BpbywgSk9ZX0VYVEVOVCk7CisJfSBlbHNlIHsKKwkJZ2FtZXBvcnRfc2V0X25hbWUoZ3AsICJFU1MxMzcxIEdhbWVwb3J0Iik7CisJCWdhbWVwb3J0X3NldF9waHlzKGdwLCAiaXNhJTA0eC9nYW1lcG9ydDAiLCBncGlvKTsKKwkJZ3AtPmRldi5wYXJlbnQgPSAmcy0+ZGV2LT5kZXY7CisJCWdwLT5pbyA9IGdwaW87CisJCXMtPmN0cmwgfD0gQ1RSTF9KWVNUS19FTiB8ICgoKGdwaW8gPj4gMykgJiBDVFJMX0pPWV9NQVNLKSA8PCBDVFJMX0pPWV9TSElGVCk7CisJfQorCisJcy0+c2N0cmwgPSAwOworCWNzc3IgPSAwOworCXMtPnNwZGlmX3ZvbHVtZSA9IC0xOworCS8qIGNoZWNrIHRvIHNlZSBpZiBzL3BkaWYgbW9kZSBpcyBiZWluZyByZXF1ZXN0ZWQgKi8KKwlpZiAoc3BkaWZbZGV2aW5kZXhdKSB7CisJCWlmIChzLT5yZXYgPj0gNCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggImVuYWJsaW5nIFMvUERJRiBvdXRwdXRcbiIpOworCQkJcy0+c3BkaWZfdm9sdW1lID0gMDsKKwkJCWNzc3IgfD0gU1RBVF9FTl9TUERJRjsKKwkJCXMtPmN0cmwgfD0gQ1RSTF9TUERJRkVOX0I7CisJCQlpZiAobm9taXhbZGV2aW5kZXhdKSAvKiBkb24ndCBtaXggYW5hbG9nIGlucHV0cyB0byBzL3BkaWYgb3V0cHV0ICovCisJCQkJcy0+Y3RybCB8PSBDVFJMX1JFQ0VOX0I7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJyZXZpc2lvbiAlZCBkb2VzIG5vdCBzdXBwb3J0IFMvUERJRlxuIiwgcy0+cmV2KTsKKwkJfQorCX0KKwkvKiBpbml0aWFsaXplIHRoZSBjaGlwcyAqLworCW91dGwocy0+Y3RybCwgcy0+aW8rRVMxMzcxX1JFR19DT05UUk9MKTsKKwlvdXRsKHMtPnNjdHJsLCBzLT5pbytFUzEzNzFfUkVHX1NFUklBTF9DT05UUk9MKTsKKwlvdXRsKExFR0FDWV9KRkFTVCwgcy0+aW8rRVMxMzcxX1JFR19MRUdBQ1kpOworCXBjaV9zZXRfbWFzdGVyKHBjaWRldik7ICAvKiBlbmFibGUgYnVzIG1hc3RlcmluZyAqLworCS8qIGlmIHdlIGFyZSBhIDU4ODAgdHVybiBvbiB0aGUgQUM5NyAqLworCWlmIChzLT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9FTlNPTklRICYmCisJICAgICgocy0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfRU5TT05JUV9DVDU4ODAgJiYgcy0+cmV2ID49IENUNTg4MFJFVl9DVDU4ODBfQykgfHwgCisJICAgICAocy0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfRU5TT05JUV9FUzEzNzEgJiYgcy0+cmV2ID09IEVTMTM3MVJFVl9DVDU4ODBfQSkgfHwgCisJICAgICAocy0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfRU5TT05JUV9FUzEzNzEgJiYgcy0+cmV2ID09IEVTMTM3MVJFVl9FUzEzNzNfOCkpKSB7IAorCQljc3NyIHw9IENTVEFUXzU4ODBfQUM5N19SU1Q7CisJCW91dGwoY3Nzciwgcy0+aW8rRVMxMzcxX1JFR19TVEFUVVMpOworCQkvKiBuZWVkIHRvIGRlbGF5IGFyb3VuZCAyMG1zKGJsZWVjaCkgdG8gZ2l2ZQorCQkgICBzb21lIENPREVDcyBlbm91Z2ggdGltZSB0byB3YWtldXAgKi8KKwkJdG1vID0gamlmZmllcyArIChIWiAvIDUwKSArIDE7CisJCWZvciAoOzspIHsKKwkJCXRtbzIgPSB0bW8gLSBqaWZmaWVzOworCQkJaWYgKHRtbzIgPD0gMCkKKwkJCQlicmVhazsKKwkJCXNjaGVkdWxlX3RpbWVvdXQodG1vMik7CisJCX0KKwl9CisJLyogQUM5NyB3YXJtIHJlc2V0IHRvIHN0YXJ0IHRoZSBiaXRjbGsgKi8KKwlvdXRsKHMtPmN0cmwgfCBDVFJMX1NZTkNSRVMsIHMtPmlvK0VTMTM3MV9SRUdfQ09OVFJPTCk7CisJdWRlbGF5KDIpOworCW91dGwocy0+Y3RybCwgcy0+aW8rRVMxMzcxX1JFR19DT05UUk9MKTsKKwkvKiBpbml0IHRoZSBzYW1wbGUgcmF0ZSBjb252ZXJ0ZXIgKi8KKwlzcmNfaW5pdChzKTsKKwkvKiBjb2RlYyBpbml0ICovCisJaWYgKCFhYzk3X3Byb2JlX2NvZGVjKHMtPmNvZGVjKSkgeworCQlyZXMgPSAtRU5PREVWOworCQlnb3RvIGVycl9ncDsKKwl9CisJLyogc2V0IGRlZmF1bHQgdmFsdWVzICovCisKKwlmcyA9IGdldF9mcygpOworCXNldF9mcyhLRVJORUxfRFMpOworCXZhbCA9IFNPVU5EX01BU0tfTElORTsKKwltaXhkZXZfaW9jdGwocy0+Y29kZWMsIFNPVU5EX01JWEVSX1dSSVRFX1JFQ1NSQywgKHVuc2lnbmVkIGxvbmcpJnZhbCk7CisJZm9yIChpID0gMDsgaSA8IHNpemVvZihpbml0dm9sKS9zaXplb2YoaW5pdHZvbFswXSk7IGkrKykgeworCQl2YWwgPSBpbml0dm9sW2ldLnZvbDsKKwkJbWl4ZGV2X2lvY3RsKHMtPmNvZGVjLCBpbml0dm9sW2ldLm1peGNoLCAodW5zaWduZWQgbG9uZykmdmFsKTsKKwl9CisJLyogbXV0ZSBtYXN0ZXIgYW5kIFBDTSB3aGVuIGluIFMvUERJRiBtb2RlICovCisJaWYgKHMtPnNwZGlmX3ZvbHVtZSAhPSAtMSkgeworCQl2YWwgPSAweDAwMDA7CisJCXMtPmNvZGVjLT5taXhlcl9pb2N0bChzLT5jb2RlYywgU09VTkRfTUlYRVJfV1JJVEVfVk9MVU1FLCAodW5zaWduZWQgbG9uZykmdmFsKTsKKwkJcy0+Y29kZWMtPm1peGVyX2lvY3RsKHMtPmNvZGVjLCBTT1VORF9NSVhFUl9XUklURV9QQ00sICh1bnNpZ25lZCBsb25nKSZ2YWwpOworCX0KKwlzZXRfZnMoZnMpOworCS8qIHR1cm4gb24gUy9QRElGIG91dHB1dCBkcml2ZXIgaWYgcmVxdWVzdGVkICovCisJb3V0bChjc3NyLCBzLT5pbytFUzEzNzFfUkVHX1NUQVRVUyk7CisKKwkvKiByZWdpc3RlciBnYW1lcG9ydCAqLworCWlmIChzLT5nYW1lcG9ydCkKKwkJZ2FtZXBvcnRfcmVnaXN0ZXJfcG9ydChzLT5nYW1lcG9ydCk7CisKKwkvKiBzdG9yZSBpdCBpbiB0aGUgZHJpdmVyIGZpZWxkICovCisJcGNpX3NldF9kcnZkYXRhKHBjaWRldiwgcyk7CisJLyogcHV0IGl0IGludG8gZHJpdmVyIGxpc3QgKi8KKwlsaXN0X2FkZF90YWlsKCZzLT5kZXZzLCAmZGV2cyk7CisJLyogaW5jcmVtZW50IGRldmluZGV4ICovCisJaWYgKGRldmluZGV4IDwgTlJfREVWSUNFLTEpCisJCWRldmluZGV4Kys7CisgICAgICAgCXJldHVybiAwOworCisgZXJyX2dwOgorCWlmIChzLT5nYW1lcG9ydCkgeworCQlyZWxlYXNlX3JlZ2lvbihzLT5nYW1lcG9ydC0+aW8sIEpPWV9FWFRFTlQpOworCQlnYW1lcG9ydF9mcmVlX3BvcnQocy0+Z2FtZXBvcnQpOworCX0KKyNpZmRlZiBFUzEzNzFfREVCVUcKKwlpZiAocy0+cHMpCisJCXJlbW92ZV9wcm9jX2VudHJ5KCJlczEzNzEiLCBOVUxMKTsKKyNlbmRpZgorCXVucmVnaXN0ZXJfc291bmRfbWlkaShzLT5kZXZfbWlkaSk7CisgZXJyX2RldjQ6CisJdW5yZWdpc3Rlcl9zb3VuZF9kc3Aocy0+ZGV2X2RhYyk7CisgZXJyX2RldjM6CisJdW5yZWdpc3Rlcl9zb3VuZF9taXhlcihzLT5jb2RlYy0+ZGV2X21peGVyKTsKKyBlcnJfZGV2MjoKKwl1bnJlZ2lzdGVyX3NvdW5kX2RzcChzLT5kZXZfYXVkaW8pOworIGVycl9kZXYxOgorCXByaW50ayhLRVJOX0VSUiBQRlggImNhbm5vdCByZWdpc3RlciBtaXNjIGRldmljZVxuIik7CisJZnJlZV9pcnEocy0+aXJxLCBzKTsKKyBlcnJfaXJxOgorCXJlbGVhc2VfcmVnaW9uKHMtPmlvLCBFUzEzNzFfRVhURU5UKTsKKyBlcnJfcmVnaW9uOgorIGVycl9jb2RlYzoKKwlhYzk3X3JlbGVhc2VfY29kZWMocy0+Y29kZWMpOworCWtmcmVlKHMpOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBlczEzNzFfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJc3RydWN0IGVzMTM3MV9zdGF0ZSAqcyA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKCFzKQorCQlyZXR1cm47CisJbGlzdF9kZWwoJnMtPmRldnMpOworI2lmZGVmIEVTMTM3MV9ERUJVRworCWlmIChzLT5wcykKKwkJcmVtb3ZlX3Byb2NfZW50cnkoImVzMTM3MSIsIE5VTEwpOworI2VuZGlmIC8qIEVTMTM3MV9ERUJVRyAqLworCW91dGwoMCwgcy0+aW8rRVMxMzcxX1JFR19DT05UUk9MKTsgLyogc3dpdGNoIGV2ZXJ5dGhpbmcgb2ZmICovCisJb3V0bCgwLCBzLT5pbytFUzEzNzFfUkVHX1NFUklBTF9DT05UUk9MKTsgLyogY2xlYXIgc2VyaWFsIGludGVycnVwdHMgKi8KKwlzeW5jaHJvbml6ZV9pcnEocy0+aXJxKTsKKwlmcmVlX2lycShzLT5pcnEsIHMpOworCWlmIChzLT5nYW1lcG9ydCkgeworCQlpbnQgZ3BpbyA9IHMtPmdhbWVwb3J0LT5pbzsKKwkJZ2FtZXBvcnRfdW5yZWdpc3Rlcl9wb3J0KHMtPmdhbWVwb3J0KTsKKwkJcmVsZWFzZV9yZWdpb24oZ3BpbywgSk9ZX0VYVEVOVCk7CisJfQorCXJlbGVhc2VfcmVnaW9uKHMtPmlvLCBFUzEzNzFfRVhURU5UKTsKKwl1bnJlZ2lzdGVyX3NvdW5kX2RzcChzLT5kZXZfYXVkaW8pOworCXVucmVnaXN0ZXJfc291bmRfbWl4ZXIocy0+Y29kZWMtPmRldl9taXhlcik7CisJdW5yZWdpc3Rlcl9zb3VuZF9kc3Aocy0+ZGV2X2RhYyk7CisJdW5yZWdpc3Rlcl9zb3VuZF9taWRpKHMtPmRldl9taWRpKTsKKwlhYzk3X3JlbGVhc2VfY29kZWMocy0+Y29kZWMpOworCWtmcmVlKHMpOworCXBjaV9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgaWRfdGFibGVbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfRU5TT05JUSwgUENJX0RFVklDRV9JRF9FTlNPTklRX0VTMTM3MSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCB9LAorCXsgUENJX1ZFTkRPUl9JRF9FTlNPTklRLCBQQ0lfREVWSUNFX0lEX0VOU09OSVFfQ1Q1ODgwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwIH0sCisJeyBQQ0lfVkVORE9SX0lEX0VDVElWQSwgUENJX0RFVklDRV9JRF9FQ1RJVkFfRVYxOTM4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwIH0sCisJeyAwLCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZXMxMzcxX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiZXMxMzcxIiwKKwkuaWRfdGFibGUJPSBpZF90YWJsZSwKKwkucHJvYmUJCT0gZXMxMzcxX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZXMxMzcxX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2VzMTM3MSh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gUEZYICJ2ZXJzaW9uIHYwLjMyIHRpbWUgIiBfX1RJTUVfXyAiICIgX19EQVRFX18gIlxuIik7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmZXMxMzcxX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX2VzMTM3MSh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gUEZYICJ1bmxvYWRpbmdcbiIpOworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZXMxMzcxX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGluaXRfZXMxMzcxKTsKK21vZHVsZV9leGl0KGNsZWFudXBfZXMxMzcxKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgTU9EVUxFCisKKy8qIGZvcm1hdCBpczogZXMxMzcxPVtzcGRpZixbbm9taXgsW2FtcGxpZmllcl1dXSAqLworCitzdGF0aWMgaW50IF9faW5pdCBlczEzNzFfc2V0dXAoY2hhciAqc3RyKQoreworCXN0YXRpYyB1bnNpZ25lZCBfX2luaXRkYXRhIG5yX2RldiA9IDA7CisKKwlpZiAobnJfZGV2ID49IE5SX0RFVklDRSkKKwkJcmV0dXJuIDA7CisKKwkodm9pZCkKKyAgICAgICAgKChnZXRfb3B0aW9uKCZzdHIsICZzcGRpZltucl9kZXZdKSA9PSAyKQorICAgICAgICAgJiYgKGdldF9vcHRpb24oJnN0ciwgJm5vbWl4W25yX2Rldl0pID09IDIpCisgICAgICAgICAmJiAoZ2V0X29wdGlvbigmc3RyLCAmYW1wbGlmaWVyW25yX2Rldl0pKSk7CisKKwlucl9kZXYrKzsKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgiZXMxMzcxPSIsIGVzMTM3MV9zZXR1cCk7CisKKyNlbmRpZiAvKiBNT0RVTEUgKi8K